代理程式協同工作
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 到它所鏡像的伺服器」的方向上有效,反方向則不然。
- 鏡像中的委派是唯讀的。 厚用戶端視窗會顯示伺服器工作階段的委派面板,但你無法從那裡回答問題。