跳到內容

它寫入什麼

Straw Boss 把狀態放在 state 目錄的檔案裡(先是 sb server 自己的檔案),以及 Herdr 在 pane、分頁和工作區上的 token。清單列出每個檔案或 token,以及誰寫入它。

細節
  • sb server 的檔案(server.json、server.lock、start-error.json、server.log、server.sock),在狀態資料夾裡,或對另一個 Herdr 的 slot 是在 servers/<hash>/ 裡,以及它的 intercom 身分 sb-server-<8 hex>(sb server)。

  • Herdr pane token sb_duty(主智慧體的種類:coordinator、integrator 或 standing;其他每個角色是 null,關閉時清除),與 sb_role(main、member 或 tower;塔台分頁在建立後也立即被標記;為請求而開的分頁建立時帶有環境變數 STRAW_BOSS_ROLE=main,這讓它的 pi 自己升任)及工作區 token tower(塔台的 intercom session id)一起寫入,兩者每 4 分鐘更新一次,TTL 為 10 分鐘,新的 Herdr server 接管時立即再寫一次(見新的 Herdr server),並在關閉時清除(只有那個 pane 的塔台 quit 時,會接著關閉它自己的分頁)。

  • Herdr pane token sb_opened_by(發送者的 intercom session id,在塔台為請求開啟的 pane 上;隊友的裝置是 link:<device id>,塔台當成自己的主智慧體開啟的整合員是 integ:<project>;由它的主智慧體更新並在關閉時清除,所以開啟數量的限制只計存活的已開啟主智慧體)與 sb_open_main(開啟者設的一次性標記,由第一個據此自己升任的 pi 消耗)。

  • 在塔台的常駐 pane 上,Herdr 的 pane.report_agent 與 pane.release_agent(來源 straw-boss、智慧體 tower、idle、以狀態作為訊息,沒有 resume 指令或 session),在塔台 prompt 於那裡執行期間,以及打進 pane 閒置 shell 的那個 prompt 的指令(常駐 pane)。

  • Pane token sb_order(排序 key)、sb_mark(角色標籤),在子智慧體上還有 sb_indent(樹的分支)與 sb_name(子智慧體的名稱),在火車上還有緊接 sb_role 的 sb_step(它目前的步驟),以及 session 啟動的子智慧體各 pane 上的子智慧體那些 token,更新、TTL 與接管時重寫都相同;它們供給側邊欄的網檢視與下面的選用列(見側邊欄網檢視)。

  • 狀態資料夾裡的 roles/<hash>.json,每個塔台、主智慧體或列車依 pi session 檔案一筆記錄:它的角色、pane、分頁與工作區,讓 Herdr 還原時把角色還回去;紀錄只是主張,塔台與列車要由 Herdr 列出的分頁來證明(見 Herdr 還原)。

  • 一個 pi session 項目 straw-boss(tower),讓在塔台分頁裡接回的塔台保留它的角色,以及主智慧體每次種類變更的 { duty, dutyFrom, dutyWhy, dutyAt }(還原時以最後一個為準)。成員不為它們的角色寫任何項目:每個 session 在啟動時加入,所以 0.4.0 存下的項目(asked、joined)會被忽略。其他項目帶有 nudged(被要求回報的子智慧體執行),或 closing、unclosed、resumed、continued 與 gaveUp(被還原的子智慧體執行:已關閉、發現其實仍然開著、已交給啟動者去接回、被告知它的輪次被截斷,或已放棄),以及帶 terminal 的 seen(執行中子程序的 pane 所在的終端機)(見 Herdr 還原帶回的單純子智慧體)。

  • 設定團隊時:<pi agent dir>/straw-boss/link/ 底下的檔案,以及 intercom 頻道 straw-boss/link(不具擁有者資格),由 sb server 與每個塔台註冊(連線持有者)。

  • 控制頻道 straw-boss/control(不具擁有者資格,所以沒有擁有者):由每個塔台與塔台開啟的主智慧體註冊,用於 close-main 的請求與它的答案(關閉開啟的主智慧體)。

  • 它透過 intercom 送出的每則訊息(boss_broadcast、call_tower、tower_send、提醒、交給開啟的主智慧體的請求)都帶有一個訊息 id,其中含有目前行程的 nonce:pi-intercom 拒絕一個已見過、來自某個 session 卻帶不同內容的 id,而重啟的 pi 保留它的 session id。

  • 每個已加入的 session 或塔台,對 Herdr 的 socket 有一條 events.subscribe 連線,它不帶任何有興趣的事件,只讀它的關閉(見新的 Herdr server)。

  • 塔台另外多保有一條 events.subscribe 連線來監看主工作區(workspace.created、closed、moved、reordered),不論有沒有 UI;它像上面那條一樣重新連線,並隨 session 關閉(塔台之間的交談)。

  • 有 UI 的塔台為它的儀表板再多保有一條 events.subscribe 連線(pane、分頁與工作區的變動,見塔台儀表板);它像上面那條一樣重新連線,並隨儀表板關閉。

  • 遠端存取開啟期間,一個 tailscale serve 項目(HTTPS 8443,代理到 GUI server 的遠端監聽),在它關閉或 server 停止時移除;paired.json(裝置配對時所用的身分、是否要開遠端,以及已配對的裝置,以 cookie 雜湊配上名稱、配對、最後看到與到期時間)在每次變更時寫入,只有在沒有東西要保留時才刪除:沒有裝置且不要遠端(遠端關閉之後的最後一次解除配對,或遠端關閉且沒有裝置),或沒有記住的身分。

    單單關閉遠端會保留裝置;在要遠端時解除最後一個裝置的配對會保留這個意願;不同的 Tailscale 身分開啟遠端會丟掉裝置;停止、接管、/reload 與 session 的結束都從不動它;過期的裝置在下次使用時,或讀檔時被丟棄。

  • Wi-Fi 存取被要求或曾被使用時:lan.json(意願、連接埠、裝置被允許時所用的 GUI token 的 SHA-256,以及被允許的裝置,以 cookie 雜湊配上名稱與時間;模式 600;只有在它沒有裝置、不要 Wi-Fi 存取且連接埠是預設的 8445 時才移除)、lan-ca.json(憑證與它的私鑰,模式 600,僅限擁有者,在 macOS 上不進 Time Machine;由 lan reset 取代,絕不由接回製作),以及 lan-ca-files/(公開的 .mobileconfig 與 .crt,按需寫入並隨憑證一起移除),在主 slot 的狀態資料夾裡;以及 server.log 裡絕不含代碼、cookie、token 或金鑰的 lan-* 行。

    在 Windows 上,兩個機密檔案放在資料夾的擁有者加 SYSTEM ACL 之下,而 lan-ca.json 在回讀清單上。次要 slot 一個都不寫。

  • 每個分頁一個 intercom 擴充頻道,straw-boss/tab/<hex of the tab id>,由每個已加入的 session 與塔台註冊;頻道的擁有者(第一個加入的)只記錄主智慧體,而它並不因此就是主智慧體。超過 24 字元的分頁 id 會被拒絕。

  • 狀態資料夾裡的 trust/<uuid>.json、<uuid>.answer.json 與 <uuid>.result.json(一個 700 的資料夾,檔案 600,每個都以 rename 寫入):尚未加入網的 pi 的專案信任問題、server 的答案,以及哪一方回答了(專案信任)。詢問的 pi 在它被決定或結束時移除它的請求與答案;server 移除行程已不在的請求、2 分鐘後的結果,以及任何寫到一半的東西。gui.json 帶有 trust: 1:sb server 讀取它們。

  • 對話頻道 straw-boss/gui/<sha256 prefix of the server's session id>:只由 sb server 以具擁有者資格註冊(它的 intercom id 是 gui.json 的 ownerSession),並在 gui.json 指名一個行程存活的 server 期間,由每個 session(包含子智慧體)加入;每個 session 從啟動起每 2 秒檢查一次 gui.json。除了對話框之外,它還帶著 session 的文件清單(pi-herdr-doc-review 的 id、路徑、顯示名稱、理由、修訂版;橋接在啟動時再向擁有者要一次清單,所以重新載入的 session 會列出開著的內容)與寄給單一文件、每個答案 id 一次的表單答案,以及按鍵板的編輯器檢查:server 問 session 的橋接 Enter 會送出什麼,而橋接以一個類別回答(空的、文字、另一個 slash 或 ! 指令,或不明)與至多一個會結束或取代 session 的指令名稱,絕不是草稿,而且只回給 gui.json 現在指名、行程存活的 server。

塔台分頁只用無線電塔字形(U+F043B)當標籤,它的 Herdr 智慧體名為小寫的 tower-<workspace id>(Herdr 的智慧體名稱在每個 server 裡是唯一的)。