跳到內容

掌握 Menu Bar 狀態邏輯:讓你的 Agent 動態一目瞭然

你是不是也遇過這種情況:開發了一個在背景執行的工具,但每次都要切換回終端機或主視窗,才知道它到底是在跑腳本、讀檔案,還是單純卡住了?這種資訊不透明的感覺真的很煩,開發者需要的是一種不用打斷工作流,就能秒懂工具狀態的方式。

這份文件會帶你了解我們如何透過 Menu Bar 的圖示與狀態列,精準呈現 Agent 的工作狀態。

  • 基礎的 Swift 開發環境
  • 可接收 ControlChannel.handleAgentEvent 的權限
  • 串接 node.list 的裝置權限

要在 Menu Bar 實作狀態顯示,你需要理解核心的 Session 邏輯與視覺對應關係。

Agent 同時處理多個任務時,狀態列會根據以下規則決定顯示內容:

  • Main Session 優先:只要 main session 在忙,圖示就會立即顯示它的狀態。
  • 最近活動原則:如果 main 閒置,則顯示最近一個有動作的 non-main session。
  • 穩定性:我們不會在任務執行中途隨意切換顯示對象,只有當目前 session 進入閒置,或 main 開始活動時才會切換。

根據不同的 ActivityKind,圖示會切換對應的 glyph:

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

在 Swift 中,我們使用 IconState enum 來管理四種主要狀態:

狀態視覺表現
idle正常的生物圖示 (Normal critter)
workingMain帶有 glyph 的標籤、全色調、腳部「工作中」動畫
workingOther帶有 glyph 的標籤、暗淡色調、無動畫
overridden強制使用選定的 glyph 與色調(除錯用)

所有狀態都來自 agent 事件。你需要解析 stream 欄位:

  • stream: "job":檢查 data.state(started, streaming, done, error)。
  • stream: "tool":檢查 data.phase(start, result),並提取 toolName 與參數。

如果工具執行速度極快,圖示可能會因為狀態切換太快而閃爍。 解決方案:在處理 tool results 時加入 TTL(存活時間)緩衝機制,避免狀態在短時間內反覆切換。

當 Agent 正在工作時,Health status 會自動隱藏。 解決方案:這是正常邏輯。只有當所有 session 都進入閒置(idle)狀態時,健康摘要才會重新出現在狀態列中。

如果你手動設定了圖示覆蓋,但圖示沒有變化。 解決方案:檢查 @AppStorage("iconOverride") 的儲存值,確認是否已映射到 IconState.overridden。

在發布前,請確保通過以下測試:

  • 觸發 main session 任務:確認圖示立即切換,且狀態列顯示 main 標籤。
  • 在 main 閒置時觸發其他 session:確認顯示 non-main 狀態且保持穩定直到結束。
  • 其他 session 執行時啟動 main:圖示必須立即切換到 main。
  • 快速工具呼叫:確保圖示不會閃爍。
  • 閒置驗證:確認所有任務結束後,健康狀態列會重新出現。

想要更快速地完成設定嗎?可以直接詢問 AI Setup Assistant。

OpenClaw

OpenClaw Expert

還是卡住了?

如果這篇文件沒有解決你的情境,直接問 OpenClaw Expert,拿到可執行步驟。