代理协同工作
Bromure 里的代理可以协同工作。一个代理可以把一段有明确范围的工作交给一个新的代理。它也可以向一个已经在运行的会话——在同一台机器上或在另一台上——询问它所知道或能做的事。你可以自己提示这件事(“问 @payments 要 webhook 的结构”),代理也可以自行决定这么做。
两个代理从不直接交谈。每一条消息都经过 Bromure 主机,主机会:
- 只让每个会话看到它有参与的对话
- 筛查每一条消息是否有提示注入
- 把每一条消息记录在安全时间线中
- 复制随消息在机器之间往来的任何文件
本章用“机器”来指设置编辑器所称的工作区。
委派与请求
有两种交流方式:
| 委派 | 请求 | |
|---|---|---|
| 谁做这份工作 | 为此而启动的一个新会话 | 一个已经存在的会话,以 @昵称指名 |
| 在哪里 | 默认在从委派者文件夹分出的 git 工作树中,位于它自己的分支上。当那个文件夹不是仓库时,就在同一个文件夹中运行;当委派到另一台机器时,则在自己的文件夹中运行。 | 那个会话原本运行的地方 |
| 如何开始 | 带着委派者的标题、任务说明、“完成”的定义(契约),以及不应离开的路径 | 在对方的提示行上以一行通知呈现 |
| 如何结束 | 被委派者交付。委派者用 close_delegation 接受或拒绝,或是取消。被委派者的会话随后被归档,它的分支则留着让你合并或丢弃。 | 对方的 deliver 就是回复。它那一侧不会有任何东西被启动或结束。 |
被委派者在侧边栏中嵌套于委派者之下,就像分支会话一样。委派到另一台机器时,若该机器已关机就会被启动。这是安静进行的,不会抢走你正在看的聊天。
消息如何送到代理
代理接收消息有三种情形:
- 正在等待: 若代理阻塞在
wait或ask,它会立刻收到消息。 - 空闲: 若它的提示行空闲,主机会在那里输入一行通知,告诉它去调用
read_inbox。 - 忙碌: 若它正在一轮之中,或画面上有对话框,通知会等到提示行空出来。
几分钟后仍未读的通知会再发一次,最多三次。若收件方的代理已结束,消息会把它恢复。例如,对一个已结束的被委派者进行方向修正,会把它带回原来的位置。
主机还欠某个会话什么,会存在消息本身上,因此能在应用重新启动后留存。
@昵称
昵称是你和其他代理称呼某个会话的方式。在会话的右键菜单或其标题栏的 ⋯ 菜单中用**昵称…**设置一个。
面板会说明:“其他代理如何找到“会话”:它们用 request(to: "@名称") 向它请求,而你可以在任何输入区写 @名称。可用字母、数字、点、连字符与下划线。”它会预览结果(“将会是 @payments”)。点击设置,或用清空移除它。
昵称在这台 Mac 上是唯一的。选了已被使用的昵称会被拒绝(“@payments 已经是“Payments API 重构”了。”)。昵称会显示在侧边栏、标题栏与房间格子中会话标题的旁边,你也可以在侧边栏搜索它。
@ 面板
在聊天的输入区或新建会话界面输入 @,就会得到一个可指名的会话面板:
- 它会列出除了当前这个以外的所有会话。
- 有昵称的会话照原样显示。没有昵称的,会显示它将会取得的昵称(由标题衍生),并标注新名称。选了其中一个,就会当场把那个昵称给那个会话,所以你刚输入的 @名称 是代理能解析的名称。
- 名称的命中排在标题的命中之前,有名称的会话排在没有名称的之前。
- ↑ 与 ↓ 移动,Tab 或 ⏎ 完成,Esc 关闭。
在消息中写“@名称”本身不会送出任何东西。它只是告诉你的代理你指的是哪一个对象,代理接着会用 request 去向它请求。
bromure-delegation 工具
每个代理会话都会取得 bromure-delegation MCP 服务器(vsock 端口 5835)。主机是以其工具转接层所在的终端窗口来辨识调用方的会话,绝不是靠代理自己声称的身份。
| 工具 | 谁使用 | 作用 |
|---|---|---|
delegate | 委派者 | 启动一个被委派者:标题、任务说明、契约、范围、代理(默认与自己相同)、worktree 真/假、可选的另一个 workspace,以及要一起发送的文件。 |
request | 请求者 | 以 @nick(或会话 id)向对方请求,文件可选。它会等待回复:默认 50 秒,最多 600 秒。 |
list_peers | 任何一方 | 列出它能触及的会话,附昵称、标题、机器、代理与状态,以及它可以委派进去的机器。 |
list_delegations | 任何一方 | 列出它的委派与请求,从任一端看,附状态与最后一句话。 |
read_inbox | 任何一方 | 取走等着它的消息,最旧的在前。 |
wait | 任何一方 | 阻塞直到有消息到来:默认 50 秒,最多 600 秒。 |
ask | 被委派者/对方 | 向请求它的一方提出一个阻塞式问题,并等待答案。 |
report | 被委派者 | 发出一条进度说明。它绝不会中断委派者。 |
deliver | 被委派者/对方 | 交付工作(改了什么、如何验证、还有什么未解决),或回复一个请求。可以把文件送回去。 |
answer | 委派者 | 回答被委派者或对方的问题。 |
steer | 委派者 | 发出后续指示或方向修正,文件可选。 |
close_delegation | 委派者 | 把已交付的委派以接受或拒绝结案,并附上说明。 |
cancel | 委派者 | 在被委派者交付前停止它,或撤回一个请求。 |
worktree_create、worktree_status、worktree_merge | 任何一方 | 从它自己的文件夹开始分支会话、追踪它们,并请你合并其中一个。见分支与审查。 |
信任与问题
代理被告知,是你设置它们一起工作的。来自另一个代理的请求、任务说明、答复或方向修正,都应当作是你要求的来处理,不必回头向你确认。主机的提示注入筛查仍然一律适用。
问题会沿着工作来的路径回去,所以你只需待在一个窗口里:
- 需要做决定的被委派者或对方,会用
ask触及请求它的那一方。它绝不会问自己的用户。 - 提出请求的那个代理,若自己的对话里就能解决,就自行回答。
- 若不能,它就把问题原话转给你,并说明是谁在问,然后用
answer把你的回复送回去。
上限
| 上限 | 值 |
|---|---|
| 委派的嵌套层数(被委派者再往下委派) | 3 层 |
| 每个会话未结束的委派与请求 | 8 个 |
wait、ask 与 request 的超时 | 默认 50 秒,最多 600 秒 |
| 每条消息的文件数 | 20 个(更多请发一个文件夹或压缩包;文件夹会以 tarball 形式传送) |
| 一条消息文件的总大小 | 4 GB(会先与接收方的可用磁盘空间核对) |
对已归档会话的请求会被拒绝,直到你把那个会话带回来。
文件与收件箱
机器之间不共用任何文件系统,所以消息中提到的文件会由主机复制。它们会落在收件机器的 ~/.bromure/inbox/<id>/,而且在收件方读到提及它们的那条消息之前就已就位。
路径是相对于发件方的文件夹解析的,~ 是发件方的家目录。同一台机器上的两个会话之间,复制是在本机完成的。
筛查与审计
每一份任务说明、请求、问题、答复、报告、交付与方向修正,在被转发之前都会由设备上的提示注入检测器扫描。
- 触发检测器的消息会被扣留。它仍会留在记录中,标注为已阻止。发件方会被告知原因、看到有问题的片段,并被要求用直白的说法重写。
- 每一条消息,无论转发或扣留,都是安全时间线中代理委派引擎下的一行,判定为已转发或已扣留——提示注入。在已注册的安装上,这些行也会送到组织的审计记录。见企业。
委派面板
当一个会话委派或请求了某件事,它的输入区上方就会出现一个委派面板。标头会计算委派的数量,以及任何等待中的问题与交付(“1 个问题”、“2 项交付”)。箭头可折叠它。
每一行显示:
- 对方会话的头像与标题(点击可打开被委派者的会话,若是请求则为打开对方的会话)
- 请求会带一个请求标签
- 状态:正在启动、工作中、提出了问题、已交付、已接受、已拒绝、已取消或失败
- 当对方会话在另一台机器上运行时,显示那台机器的名称
- 它的分支
- 最后交换的一句话,例如“被委派者已交付:…”
当被委派者或对方提出问题时,那一行会显示问题,并附一个替代理回答…字段与发送。“你的代理也可以回答它——这会改为送出你的答复。”在那里回答可省去绕经你的代理的往返。
在另一端,被委派者或对方自己的聊天中会出现一条横带,说明它是在回应谁。横带写着“由 会话 委派”或“来自 会话 的请求”,并附状态与一个显示委派者(或显示请求者)链接。
没有交付就结束的被委派者,会让它的委派失败,并通知委派者。已结束的委派(已接受、已拒绝、已取消或失败)会归档被委派者的会话。它在已归档折叠区中仍可阅读。
跨机器,以及跨 Mac
- 在这台 Mac 的机器之间: 默认情况下,任何机器里的代理都能触及其他每一台机器,既能委派进去,也能向它的会话请求。要限制某台机器,请打开它的设置、通用窗格、访问范围区段,然后关掉每个工作区:每一台其他机器都会出现一个开关,它的代理只能触及你打开的那些(若全部关闭,就只有自己机器上的会话)。这个规则是单向的:另一台机器的代理能不能反过来触及,是在那台机器上设置的。被限制的机器也不再提供它所镜像的远程 Mac 的会话(见下一点)。
- 跨 Mac: 当这台 Mac 在胖客户端窗口中镜像一台远程 Bromure 时,仍设为每个工作区的机器里的代理,也可以用 @昵称向那台服务器上的会话发出请求。请求会经由镜像的通道传送,文件也一起。在委派面板中,那一行会写出它送往的主机。这在“从这台 Mac 到它所镜像的服务器”的方向上有效,反方向则不然。
- 镜像中的委派是只读的。 胖客户端窗口会显示服务器会话的委派面板,但你无法从那里回答问题。