菜单栏状态逻辑

菜单栏状态逻辑

适用范围

在以下情况使用此页面:

  • 调整 mac 菜单 UI 或状态逻辑

显示内容

  • 我们在菜单栏图标和菜单的第一状态行中显示当前智能体工作状态。
  • 工作活动时隐藏健康状态;所有会话空闲时返回健康状态。
  • 菜单中的"节点"块仅列出设备(通过 node.list 配对的节点),不包括客户端/在线条目。
  • 当提供商使用快照可用时,上下文下会显示"使用情况"部分。

状态模型

  • 会话:事件带有 runId(每次运行)加上负载中的 sessionKey 到达。“main"会话是键 main;如果不存在,我们回退到最近更新的会话。
  • 优先级:main 始终获胜。如果 main 活动,立即显示其状态。如果 main 空闲,显示最近活动的非 main 会话。我们不会在活动中间翻来覆去;仅在当前会话空闲或 main 变为活动时切换。
  • 活动类型:
    • job:高级命令执行(state: started|streaming|done|error)。
    • tool:带有 toolNamemeta/argsphase: start|result

IconState 枚举(Swift)

  • idle
  • workingMain(ActivityKind)
  • workingOther(ActivityKind)
  • overridden(ActivityKind)(调试覆盖)

ActivityKind → 图形

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

视觉映射

  • idle:普通小生物。
  • workingMain:带有图形的徽章,完整色调,腿部"工作"动画。
  • workingOther:带有图形的徽章,静音色调,无急跑。
  • overridden:无论活动如何都使用所选的图形/色调。

状态行文本(菜单)

  • 工作活动时:<会话角色> · <活动标签>
    • 示例:Main · exec: pnpm testOther · read: apps/macos/Sources/Clawdbot/AppState.swift
  • 空闲时:回退到健康摘要。

事件摄取

  • 来源:控制通道 agent 事件(ControlChannel.handleAgentEvent)。
  • 解析字段:
    • stream: "job" 带有用于开始/停止的 data.state
    • stream: "tool" 带有 data.phasename、可选的 meta/args
  • 标签:
    • execargs.command 的第一行。
    • read/write:缩短的路径。
    • edit:路径加上从 meta/diff 计数推断的更改类型。
    • 回退:工具名称。

调试覆盖

  • 设置 ▸ 调试 ▸ “图标覆盖"选择器:
    • 系统(自动)(默认)
    • 工作中:main(每种工具类型)
    • 工作中:other(每种工具类型)
    • 空闲
  • 通过 @AppStorage("iconOverride") 存储;映射到 IconState.overridden

测试检查清单

  • 触发 main 会话作业:验证图标立即切换且状态行显示 main 标签。
  • main 空闲时触发非 main 会话作业:图标/状态显示非 main;保持稳定直到完成。
  • 其他活动时启动 main:图标立即翻转到 main。
  • 快速工具突发:确保徽章不闪烁(工具结果的 TTL 宽限期)。
  • 所有会话空闲后健康行重新出现。