它寫入什麼
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 自己升任)及工作區 tokentower(塔台的 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 裡是唯一的)。