選單列狀態邏輯
顯示內容
- 在選單列圖示及選單第一行狀態列中呈現目前的代理程式工作狀態。
- 工作進行中時隱藏健康狀態;所有工作階段閒置後恢復顯示。
- 選單中的「Nodes」區塊只列出裝置(透過
node.list已配對的節點),不包含 client/presence 項目。 - 當供應商用量快照可用時,Context 下方會顯示「Usage」區段。
狀態模型
- 工作階段:事件帶有
runId(每次執行)以及 payload 中的sessionKey。「main」工作階段的 key 為main;若無,則退回至最近更新的工作階段。 - 優先順序:main 永遠優先。main 處於活動狀態時立即顯示其狀態。main 閒置時,顯示最近活動的非 main 工作階段。活動中不會來回切換;只有在目前工作階段進入閒置或 main 變為活動時才會切換。
- 活動類型:
job:高階命令執行(state: started|streaming|done|error)。tool:phase: start|result搭配toolName及meta/args。
IconState 列舉(Swift)
idleworkingMain(ActivityKind)workingOther(ActivityKind)overridden(ActivityKind)(除錯覆蓋)
ActivityKind → 圖示
exec→ 💻read→ 📄write→ ✍️edit→ 📝attach→ 📎- 預設 → 🛠️
視覺對應
idle:正常小動物。workingMain:帶圖示徽章、完整色調、腿部「工作」動畫。workingOther:帶圖示徽章、淡化色調、無快跑動畫。overridden:無論活動狀態如何,使用所選的圖示/色調。
狀態列文字(選單)
- 工作進行中:
<Session role> · <activity label>- 範例:
Main · exec: pnpm test、Other · read: apps/macos/Sources/OpenClaw/AppState.swift。
- 範例:
- 閒置時:退回至健康狀態摘要。
事件接收
- 來源:control channel
agent事件(ControlChannel.handleAgentEvent)。 - 解析欄位:
stream: "job"搭配data.state用於啟動/停止。stream: "tool"搭配data.phase、name、選用的meta/args。
- 標籤:
exec:args.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 寬限)。
- 所有工作階段閒置後健康狀態列重新出現。