跳到內容

塔台儀表板

有 TUI 的塔台 session 會在編輯器上方顯示一個監控小工具。它是唯讀的:不取得焦點、不跳出提示,而且只在 session 持有塔台角色時才顯示(讓出角色的塔台、無頭塔台和主智慧體都不會顯示)。它的第一行說明這個 pane 是什麼,也就是主智慧體彼此用 call_tower 聯絡的頻道;GUI 伺服器有回應時,還會給出 straw net GUI 的連結(否則要用 /boss gui 開啟)。

╭─ ? 󰐻 Alpha ─────────────────────────────────────────────────────────────╮
│ Control tower: main agents talk here (call_tower). │
│ GUI http://127.0.0.1:52662/<token>/ │
│ │
│ this net │
│ ├─ tab api-main │
│ │ ├─ ○  api-main main │
│ │ │ └─ ⠸ [sub] psb-sleeper subagent bash │
│ │ └─ ○  docs-member member │
│ └─ tab other │
│ └─ ?  ops-main main waiting on a question │
│ other towers │
│ ✓ 󰐻 Beta tower │
╰──────────────────────────────────────────────────────────────────────────╯
細節
  • This net(本網)的細節:在這個工作區加入的 session,依分頁列出(先是主智慧體,再是成員),每個都帶著它啟動的子智慧體,以及這個工作區的子工作區。沒有加入的 session 不會列出,其他工作區裡的任何東西也不會。

  • Other towers(其他塔台):有主塔台時先列主塔台(head tower,附狀態),接著每個有存活塔台的工作區各一行(工作區與狀態)。沒有任何工作區塔台帶有主塔台標籤。

  • 每一列都帶有 Herdr 側邊欄顯示的角色標記(見側邊欄的網檢視),使用寬度為一欄的 Nerd Font 字符:塔台和標題用無線電塔(U+F043B),有種類的主智慧體或被派出的子智慧體用它種類的字符(見下方的 sb_mark),不知道種類的主智慧體用 Font Awesome 的星形(U+F005),成員用人形(U+F007),沒有種類的子智慧體用 [sub]。分頁和子工作區沒有標記。它們的顏色是 pi 佈景主題的角色,所以會跟著目前的佈景主題變:塔台是 warning,主智慧體種類的字符(和星形)是 accent,人形是 success,全部粗體,子智慧體種類的字符和 [sub] 是 dim。種類欄仍是角色的字詞。

  • 每種狀態一個字符、一個佈景主題顏色:執行中是強調色的旋轉符號,等待問題回覆是 ?(warning),指揮中是粗體標題色的 ◈(閒置的 session,但它的子智慧體正在工作或等待),閒置是暗色的 ○,完成是 ✓(success),失敗是 ✗(error)。顏色來自目前的 pi 佈景主題。標題上的標記顯示這個網裡最緊急的狀態。

  • 旋轉符號以每秒 1 格運轉,而且只在有東西正在工作、且塔台的分頁在畫面上時才轉(也就是 Herdr 焦點工作區的作用中分頁):每一格都會重繪塔台的整個 TUI,在每秒 8 格時,只要網裡有東西在工作,每個閒置的塔台都會吃掉 5–13% 的 CPU。資料在 Herdr 回報變動時重新讀取:儀表板訂閱 Herdr 的 pane.*(建立、關閉、更新、移動、結束、偵測到智慧體)、tab.*(建立、關閉、改名、移動、取得焦點)和 workspace.*(建立、更新、中繼資料更新、改名、移動、重新排序、關閉、取得焦點)事件,一連串事件合併成第一個事件之後 0.5 秒的一次讀取。

    pi-intercom 的上線、加入或離開事件會立刻重新讀取。任兩次讀取的間隔不會短於 0.5 秒,在間隔內或讀取進行中收到的請求,會在讀取結束後再讀,而不是被丟掉。每 30 秒一次輪詢是保底:它補抓漏掉的事件,以及沒有事件會告知的資料(子智慧體的活動檔,裡面記著它正在執行的工具);事件串流重新連線時,也會在同樣的 0.5 秒後重新讀取,所以漏掉事件造成的畫面錯誤不會超過這段時間。關閉或失去塔台角色時,會移除小工具、訂閱和所有計時器。

資料的來源:pi-intercom 的 listSessions()(狀態 idle、thinking、tool:<name>,以及每個 session 的 Herdr 位置)、Herdr 的 pane 清單(sb_role token、Herdr 的智慧體狀態,其中 blocked 表示等待問題回覆,以及 pi session 檔)和工作區清單(工作區狀態、tower token、linked-worktree 欄位),這些由一次 session.snapshot 請求一併回答(snapshot 的 panes 與 workspaces 就是 herdr pane list 與 herdr workspace list 印出的內容)。子智慧體透過 pi-herdr-agents 自己的目錄配置連到它的父層:父層的 session 檔指出它的 artifacts 目錄,那裡的 subagent-activity/<child id>.json 記錄每個子層的活動,子層的 pane session 檔則包含子層 id。

所以子智慧體不論在哪裡執行,都歸在啟動它的 session 底下,而且絕不算作它所在的工作區或分頁的網成員。每個子層的 pane 是掃過一遍 pane 找到的(它們的 session 檔名以子層 id 建立索引),這兩個目錄只在時間戳改變時才重新列出(最近兩秒內有變動的目錄一律重新列出),啟動腳本只在內容改變時才重新讀取。

各種清單(pane list、workspace list、tab list --workspace)是對 Herdr socket 的請求(pane.list、workspace.list、tab.list),不是另外啟動的 herdr 指令;回覆與 CLI 的相同,所以每個讀取者都一樣。每一個寫入(report-metadata、tab create、agent start、關閉等)仍然執行 CLI。清單失敗時,會以 Herdr 自己的錯誤拒絕,不會退回 CLI。只讀取的請求(各種清單、pane.current、pane.get、pane.read、pane.process_info、pane.layout、session.snapshot)逾時或連線在回答前關閉時,會在 250 ms 後再問一次;會改變東西的請求只送一次。儀表板和瀏覽器檢視從同一個 session.snapshot 一併讀取 panes 與 workspaces。瀏覽器檢視的輪詢(有頁面在監聽時每 2 秒一次)仍然是輪詢:它的網還包含只有 session 檔和 intercom 才知道的內容(單位在等什麼、它的佇列、它的對話框),這些沒有任何 Herdr 事件會告知。