選單列狀態邏輯

顯示內容

  • 在選單列圖示及選單第一行狀態列中呈現目前的代理程式工作狀態。
  • 工作進行中時隱藏健康狀態;所有工作階段閒置後恢復顯示。
  • 選單中的「Nodes」區塊只列出裝置(透過 node.list 已配對的節點),不包含 client/presence 項目。
  • 當供應商用量快照可用時,Context 下方會顯示「Usage」區段。

狀態模型

  • 工作階段:事件帶有 runId(每次執行)以及 payload 中的 sessionKey。「main」工作階段的 key 為 main;若無,則退回至最近更新的工作階段。
  • 優先順序:main 永遠優先。main 處於活動狀態時立即顯示其狀態。main 閒置時,顯示最近活動的非 main 工作階段。活動中不會來回切換;只有在目前工作階段進入閒置或 main 變為活動時才會切換。
  • 活動類型:
    • job:高階命令執行(state: started|streaming|done|error)。
    • toolphase: start|result 搭配 toolNamemeta/args

IconState 列舉(Swift)

  • idle
  • workingMain(ActivityKind)
  • workingOther(ActivityKind)
  • overridden(ActivityKind)(除錯覆蓋)

ActivityKind → 圖示

  • exec → 💻
  • read → 📄
  • write → ✍️
  • edit → 📝
  • attach → 📎
  • 預設 → 🛠️

視覺對應

  • idle:正常小動物。
  • workingMain:帶圖示徽章、完整色調、腿部「工作」動畫。
  • workingOther:帶圖示徽章、淡化色調、無快跑動畫。
  • overridden:無論活動狀態如何,使用所選的圖示/色調。

狀態列文字(選單)

  • 工作進行中:<Session role> · <activity label>
    • 範例:Main · exec: pnpm testOther · read: apps/macos/Sources/OpenClaw/AppState.swift
  • 閒置時:退回至健康狀態摘要。

事件接收

  • 來源:control channel agent 事件(ControlChannel.handleAgentEvent)。
  • 解析欄位:
    • stream: "job" 搭配 data.state 用於啟動/停止。
    • stream: "tool" 搭配 data.phasename、選用的 meta/args
  • 標籤:
    • execargs.command 的第一行。
    • read/write:縮短的路徑。
    • edit:路徑加上從 meta/diff 計數推斷的變更類型。
    • 退回值:工具名稱。

除錯覆蓋

  • Settings ▸ Debug ▸「Icon override」選擇器:
    • System (auto)(預設)
    • Working: main(依工具類型)
    • Working: other(依工具類型)
    • Idle
  • 透過 @AppStorage("iconOverride") 儲存;對應至 IconState.overridden

測試檢查清單

  • 觸發 main 工作階段的 job:確認圖示立即切換且狀態列顯示 main 標籤。
  • main 閒置時觸發非 main 工作階段的 job:圖示/狀態顯示非 main;完成前保持穩定。
  • 其他工作階段活動中啟動 main:圖示立即切換至 main。
  • 快速連續的 tool 觸發:確保徽章不會閃爍(tool 結果有 TTL 寬限)。
  • 所有工作階段閒置後健康狀態列重新出現。