跳到內容

工具

Straw Boss 給智慧體一組工具(boss_*、tower_*、call_tower、board_*),也給老闆 /boss 斜線指令。哪個 session 可以呼叫哪個工具,取決於它的角色。表格列出每個工具適用於誰、做什麼,再列出每個 /boss 指令。

細節
工具 誰可以用 做什麼
boss_promote 已加入且不是塔台的 session 成為這個分頁的主智慧體;分頁已有存活的主智慧體時會被拒絕。
boss_status 已加入的 session 與塔台 每個分頁的主智慧體、這個工作區的塔台、主塔台,以及其他塔台。
boss_open_main 僅塔台 在塔台的工作區開一個新分頁,以新的 pi 作為它的主智慧體,交給它一個沒有任何 session 擁有的請求,每個請求一次(見開啟主智慧體)。帶 role: "train" 時開啟火車;在 sb server 的執行裡帶 role: "integrator" 時,把車廂單送給專案唯一的整合員,沒有在跑的就開一個,當成塔台自己的主智慧體。
boss_close_main 僅塔台 要求這個塔台開啟的主智慧體(依 intercom 名稱或 session id)像 /boss close 那樣 quit。對老闆開啟的主智慧體、另一個工作區的主智慧體、Herdr 回報在工作中的,以及正在進行一輪、有排隊訊息、有對話框、有 monitor 或有子智慧體在跑的,都會被拒絕(見關閉開啟的主智慧體)。
tower_list 僅塔台 每個工作區的塔台,沒有塔台時則是它的主智慧體或成員:reach、狀態、主塔台與自己的標記,以及每個分頁的主智慧體與成員的名稱(見塔台之間的交談)。
tower_send 僅塔台 在標頭之下送一則訊息給另一個塔台(工作區 id 或完整標籤,預設是其他每個塔台);帶 device 時,經 Straw Link 送到隊友電腦的塔台(連線持有者);沒有塔台的工作區透過它的主智慧體觸及,否則透過它的成員。reply 說明是否期望答案。在主塔台的執行裡它只接受 workspace 與 message(它會開啟那個工作區的塔台),而在工作區塔台的執行裡,head: true 加 inReplyTo(請求 id)回答主塔台(主塔台)。在塔台 run裡,for(工作區裡一個還活著的主智慧體;搭配 device 和 reply)把裝置的答案送給那個主智慧體(省略時,server 取為這件事呼叫塔台的那一個主智慧體;塔台為誰送),而在隊友 run 裡,inReplyTo(請求 id)回答對主智慧體的請求(隊友 run)。

| tower_reply | 僅塔台 run(不含主塔台) | 以塔台的標頭,用 intercom 名稱或 session id 回答一個本機 session(主智慧體或成員)。reply 說明是否等待答案;basis 在自動模式下指出對 blocked 的 call_tower 的回答依據什麼;forward 是車廂單的路徑(合併火車)。 | | tower_done | 僅塔台 run | 以一份給下一次執行的交接筆記結束這次執行:每行一項,1 到 1,200 個字元。wakeAfter(5 到 240 分鐘)要求一次後續執行,只限本機 run。老闆在執行裡時,執行不會結束(執行中的老闆)。 | | board_read | 僅塔台 | 工作看板:這台電腦上,以及透過 Straw Link 在隊友電腦上,每個主智慧體的一行目前工作與檢查清單,以 JSON 形式(見工作看板)。 | | board_set | 已加入且不是塔台的 session(只有分頁的主智慧體可以寫) | 覆寫主智慧體自己的看板項目(它會依 todo 清單與名稱自己填):now 與最多 8 個檢查清單項目,或 auto: true 交還給它;回答會說明它去了哪裡。 | | link_request | 受管電腦上的每個 session,以及本機塔台 run | 以一個理由請求一個 Straw Link 動作(create、invite、invite-unattended、join、trust、leave、remove、role、rotate)。老闆在一個顯示動作、每個引數、理由與這個 session 的對話框裡核准每一個;沒有任何東西會未經詢問就執行。在無人值守裝置上與遠端輪次裡會被拒絕。 | | call_tower | 已加入的 session 與塔台 | 在標頭之下送一則訊息給這個工作區的塔台,或依 id 或完整標籤送給另一個工作區的。沒有塔台在跑時會開啟塔台分頁。why(在 pi 裡必填:milestone、shared 或 blocked)寫進標頭。reply(預設 true)說明是否期望塔台回答。 | | boss_duty | 分頁的主智慧體(成員、火車、塔台與子智慧體會被拒絕或沒有這個工具) | 設定主智慧體的種類:coordinator、integrator(整合關閉時省略)或 standing,附一行理由(至多 200 字元)。對同一個種類、對在 train todo 還待處理或進行中時從 integrator 切換出去,以及在 Straw Link 遠端輪次裡,都會被拒絕。寫入種類項目、重新 brief(一次 steer)、發佈 sb_duty,並記到塔台的摘要裡。 | | boss_rename | 已加入的 session,不含塔台 | 把 session 的名稱(pi.setSessionName)設成描述它目前工作的短語,去除空白,至多 40 字元(分頁標籤放得下 16 個)。網與 GUI 依名稱顯示 session,而主智慧體用它來標示它的 Herdr 分頁(和 pi-auto-tab-name 一樣截成 16 字元,所以那個擴充在載入時,會把標籤當成自己的,並在壓縮之間把它當成選定的名稱保留)。主智慧體自己重新命名分頁,是因為 pi-auto-tab-name 不動別人標示過的分頁,例如老闆命名的分頁,或塔台帶著標籤開啟的分頁;成員不動它的主智慧體的分頁。主智慧體的 prompt 讓它在工作轉向另一個任務時呼叫這個。塔台沒有這樣的工具:網依它的名稱認出它。名稱若是塔台或列車分頁的標籤(塔台圖示、主塔台圖示、train <MMDDx>)會被拒絕:還原之後,證明角色的就是這個標籤。 | | boss_broadcast | 已加入的 session 與塔台 | 在標頭(指名每個收件者)之下,送一則訊息給某個範圍內的每個其他 session。tab、workspace 與 towers 只觸及加入網的 session(Herdr 裡幾乎每個 pi,不含子工作區的 session;towers 透過主智慧體觸及沒有塔台的工作區,否則透過它的成員);all 觸及這台機器上每個 pi session,不論有沒有加入(用於像是要去睡覺之類的通知)。預設 workspace。塔台對其他塔台用 tower_send。 | | boss_server | Herdr 裡每個有畫面且已加入的 session | sb server 的 status(它關著時也可以)、logs,或附理由的 restart(見 sb server)。遠端輪次裡不可用。 | | tower_memory | 僅本機塔台 run | 保存比執行活得更久的東西:長期指示或決定,須是執行取走的某則老闆訊息的逐字引用(server 會檢查),撤銷一條用同樣的證明,以及塔台自己的等待事項(add、resolve、drop;給老闆的等待事項是一張有欄位的卡片,見塔台記憶)。隊友 run 會被拒絕。見塔台記憶。 |

指令 效果
/boss 接手成為這個分頁的主智慧體,即使它已經有一個。
/boss status 顯示 boss_status。
/boss tower 沒有塔台在跑時開啟這個工作區的塔台,然後聚焦它的分頁。
/boss tower -w <workspace|head> [--answers W3] <command|message> 另一個工作區的塔台,或主塔台:寫入會先詢問並指名它;見另一個塔台、主塔台,以及回答等待事項。
/boss send <name|key> [--after] <text>, /boss stop <name|key> 以老闆的身分寫給一個 session,或在其中按 Esc;見 /boss send 與 /boss stop。
/boss answer, /boss answer <name|key> [<choice number | text> | --cancel] 列出其他 session 正在等的對話框,或透過頁面的路由回答其中一個;機密會被列出但從不回答;見 /boss answer。
/boss head [status|retry|parked|deliver <id>|drop <id>|leave|new|close|[--answers W3] <message>] 從任何有畫面的 pi session 與主塔台交談:訊息以老闆自己的名義送出,單獨的 /boss head 會建立主塔台工作區並聚焦它的分頁,而 status、retry、parked、deliver、drop、leave、new 與 close 對應 /boss tower 的(主塔台)。
/boss memory [-w workspace] [list|confirm P1|reject P1|add standing|decision <text>|edit S1 <text>|delete D1|resolve W1 [outcome]] 讀取並更改塔台的記憶,並回答塔台的提案;GUI 的記憶面板是同一個操作。見塔台記憶。
/boss gui 在瀏覽器裡開啟整個網(任何 session;不加入任何東西)。它詢問 sb server,server 關著時會啟動,並印出 URL。/boss gui stop 從任何 session 停止 GUI,它會一直停著,直到下一次 /boss gui 或 cli.mjs up(/boss stash 與 /boss close all 不會啟動它)。/boss gui rotate(經確認之後)給 GUI 新的 token 與 CSRF 機密,並讓每支手機解除配對,包含 Wi-Fi 的;Wi-Fi 憑證保留。
/boss gui lan, /boss gui lan off, /boss gui lan reset 不經 Tailscale,從同一個 Wi-Fi 上的手機連到 GUI(Wi-Fi 存取)。lan 顯示風險並在第一次執行時製作這台電腦的憑證(在你回答 y 之後),開啟 Wi-Fi 存取,並開啟一個帶有憑證步驟與配對 QR 的畫面;你打它顯示的數字來允許每支新手機。lan off 關閉監聽並忘掉這個意願;已配對的手機仍保持配對。lan reset 詢問是要更新憑證並保留配對,還是製作新的並讓每個 Wi-Fi 裝置解除配對。
/boss gui view, /boss gui view auto|standard|geek|zen|raven 顯示或設定 GUI 的預設檢視(控制 socket 上的 gui-view,保存在 gui-prefs.json)。zen 是一次一個等待中的項目,之後留一個 session 作伴;設為自動的裝置跟隨它,自己選了檢視的裝置保留它的選擇。見瀏覽器檢視裡的檢視:自動、標準、極客、禪。只有這個指令能設它:沒有任何頁面可以,已配對的手機也不行。
/boss server [stop|restart [--downgrade] [reason]] 顯示 sb server,並在它關著時啟動它;刻意停止它;重啟它。見 sb server。
/boss close all 讓這個基地的塔台、主智慧體與成員 quit 並關閉它,否則什麼都不做;見收起與接回。
/boss close <name|key>, /boss close all <workspace> 在 pi 裡經確認後,讓另一個單位、小隊或基地 quit,做法是向 sb server 的 GUI post close/unit、close/tab 或 close/all {workspace}(頁面的 Quit 所 post 的)。只限老闆親自打:這個指令在塔台 run或隊友 run 裡會被拒絕,也沒有任何工具能觸及它。
/boss stash [name] 把這個基地以 name(預設是工作區標籤)收起並關閉它;見收起與接回。
/boss stash [name] --workspace <label|id> 經確認後把另一個基地收起(close/stash {workspace, name})。
/boss dismiss [all|<name>] 隱藏已完成的子智慧體(dismiss {all} 或 {key})。
/boss open base <dir> [label], open member [dir], open main <dir> [prompt] 頁面的 + 基地、+ 成員、+ 主智慧體(open/base、open/member、open/main,帶著和頁面一樣的 deploy id 一起 post;src/bosspaths.ts)。資料夾依 session 的 cwd 解析;沒有資料夾的成員是這個 session 分頁的 {workspace, tab},有資料夾的是 {workspace, dir}。開啟請求在途中時,指令輪詢 open/progress;進度裡的 trust 依每個 id 與摘要用 session 的 select 問一次,並以 trust/answer {id, digest, choice, answerId} 回答(沒有 pi 畫面:留給 GUI 或終端機)。失敗會寫出 step 與 reason;沉默的 server 會說這個單位仍可能開啟。prompt 搭乘頁面送出的同一個內容,所以已配對裝置第一則訊息的閘門相同(open 路由、BOSS_LOCAL);遠端輸入框的 /boss open <kind> <dir> <text> 也在任何深度被測試,因為新的 pane 會從這台電腦執行 <text>(control.ts 裡的 localOnlyText)。失敗像頁面一樣指出步驟(Create the base、Open a tab、Split a pane、Start the agent、…),而沒有資料夾的成員以它的基地的標籤來稱呼。trust 問題的 select 隨開啟結束(它的 signal)。
/boss link [status], link decide <id> approve|refuse 讀取 link/state 取得團隊與 joinRequests,並以 link/decide 下判決。id 是請求的雜湊,或四個以上字元的唯一開頭。核准會先在 pi 裡詢問:受管請求透過它的詞組集合的 select({id, pick};「none of these」是 {id, approve: false}),無人值守的透過 confirm({id, approve: true});拒絕不經詢問直接送出 {id, approve: false}。link decide 在 BOSS_LOCAL 裡,因為路由拒絕已配對的裝置(REMOTE_LINK 只有 state 與 confirm-answer);link 與 open 不在。詞組集合的 select 與無人值守的 confirm 都以 hereOnly 詢問(每個選項,src/intercept.ts 的 hereOnlyOpts()):ctx.ui 的包裝仍會轉送恰好一個工具呼叫在跑時開啟的對話框,但已配對的裝置看得到它,卻無法回答它。其他 BOSS_LOCAL 指令(gui rotate、gui unpair all、server stop 與 restart)的確認以同樣方式是 hereOnly,而這些畫面各自在期間持有 pane 的覆蓋標記(src/heremark.ts),所以已配對裝置的按鍵板只對它送 Escape;close 與 stash --workspace 仍可從已配對的裝置回答,如同頁面讓它關閉與收起。
/boss link confirms, link confirm <id> allow|deny, link asks, link answer <id> <number | text>, link invite show|cancel <hash>, link join cancel, link leave <team> [--force], link create <relay> <dir>, link join <invite | @file>, link invite <team> [unattended <device id>], link trust <device> <level>, link role <team> <device> admin|member, link remove <team> <device>, link rotate <team> 原本只有頁面能做的 Straw Link 操作,post 到 link/confirm-answer、link/dialog-answer、link/invite-text、link/invite-cancel、link/join-cancel、link/leave、link/create、link/join-start、link/join-project、link/invite、link/trust、link/role、link/remove 與 link/rotate;細節、hereOnly 確認,以及 relay token 與邀請文字如何不進入逐字記錄,都在GUI 裡的團隊設定的 In pi 底下。全部都在 BOSS_LINK_LOCAL 裡。
/boss link units [box], link stop <box> <main | handle start> [--interrupt] [reason] 讀取 link/state 取得盒子的 units 與 mains,並以 link/unit-stop {team, device, handle, mode, reason} 做停止,在一個指名盒子、主智慧體、它的派工者與模式的 hereOnly 確認之後。主智慧體依名稱(不分大小寫)或它的 handle 開頭,在盒子最新的狀態列所列的主智慧體之中找出;理由至多 200 位元組。隊友寫的東西,其中的控制字元與雙向字元會以跳脫形式顯示。
/boss gui devices, /boss gui unpair <id|all> 列出已配對的裝置(remote/devices)並解除其中一個或全部的配對(remote/unpair、remote/unpair-all;全部要經確認);位址不變。
/boss server logs [n] server 記錄的最後 n 行(至多 200),如同 boss_server logs。
/boss pop [name] 再次開啟一個收起的基地(任何 session;沒有名稱時,是唯一的收起項目,或從清單裡挑一個)。

/boss 與 boss_promote 在子工作區裡不可用。

flowchart TD
    s["/boss stash"] --> c{"每個 pi 都 idle 或 done、<br/>有 session 檔,<br/>而且沒有子智慧體?"}
    c -->|"否"| r["拒絕,並說明原因"]
    c -->|"是"| w["寫入 stash/name.json,<br/>關閉基地"]
    w --> p["/boss pop"]
    p --> o["開新工作區,每個 pi 用<br/>pi --session file 繼續"]

/boss stash 把整個基地收起,/boss pop 再把它打開(規格)。收起在 sb server 的 GUI 裡執行,/boss stash 要求它執行(不會開啟瀏覽器;刻意停止的 GUI 不會被啟動:指令會這樣說,而 /boss gui 會啟動它):只有 server 能詢問每個 session 的橋接。

細節

它先檢查,什麼都不關:Herdr 的檢視(每個 pi pane 都是塔台、主智慧體或成員,狀態是 idle 或 done 且有 session 檔案;基地或它的子工作區裡沒有子智慧體;沒有前景是 shell 以外東西的 shell;基地本身不是子工作區),以及每個 session 自己的,透過它橋接的 stash-check(沒有進行中的輪次、沒有排隊的訊息、沒有開啟的對話框、沒有執行中的 monitor)。三輪之內沒有回答的 session 算作拒絕,所以較舊的 pi-straw-boss 上的 session 絕不會被收起關閉。每個原因都列在一則拒絕裡。

然後它在狀態資料夾寫入 stash/<name>.json(標籤與資料夾,每個分頁依序、塔台的分頁排第一,每個 pane 的角色、session 檔案、名稱與資料夾),並像基地上的離開(Quit) 那樣關閉基地。做到一半就停的批次(某個智慧體拒絕或還活著)會刪除清單檔案,改為指名每個 session 的 pi --session 檔案,因為接回它會讓一個 session 檔案執行兩次。

/boss pop 開啟一個同樣標籤的新工作區,並以 pi --session <file> 接續每個 pi:先是塔台(它的 session 帶著它的塔台標記),然後每個分頁先是主智慧體(帶著一次性的 sb_open_main token,如同頁面開啟的主智慧體),然後是成員,各自在它的角色中等待最多 60 秒;shell 在它們的資料夾裡重新開啟。成功時,清單檔案移到 stash/popped/;失敗時新的工作區關閉,清單檔案留著等下一次嘗試。Monitor、待處理的 intercom 詢問與 pane 大小不會帶過去。

/boss close all(POST close/all {by})關閉提出要求的 session 的基地,不收起(而且像收起一樣,它不會啟動刻意停止的 server);其他基地、子工作區與網之外的工作區絕不會被動到。它使用收起的檢查,但不含只有接回才需要的(session 檔案、資料夾);任何拒絕都不關閉任何東西,並列出每個原因。然後基地像基地上的離開(Quit) 那樣關閉,每個 session 只在仍然可以被收起時才 quit。基地在關閉前會再勘查一次,而當 server 自己的 session 在其中時,那個 session(它的批次不詢問它)也會再檢查一次。

不在網上基地裡的 session 不會關閉任何東西;在 server 沒有回答時仍然活著的發起者,會被告知去檢查還有什麼是開著的。