菜单栏状态逻辑
适用范围
在以下情况使用此页面:
- 调整 mac 菜单 UI 或状态逻辑
显示内容
- 我们在菜单栏图标和菜单的第一状态行中显示当前智能体工作状态。
- 工作活动时隐藏健康状态;所有会话空闲时返回健康状态。
- 菜单中的"节点"块仅列出设备(通过
node.list配对的节点),不包括客户端/在线条目。 - 当提供商使用快照可用时,上下文下会显示"使用情况"部分。
状态模型
- 会话:事件带有
runId(每次运行)加上负载中的sessionKey到达。“main"会话是键main;如果不存在,我们回退到最近更新的会话。 - 优先级:main 始终获胜。如果 main 活动,立即显示其状态。如果 main 空闲,显示最近活动的非 main 会话。我们不会在活动中间翻来覆去;仅在当前会话空闲或 main 变为活动时切换。
- 活动类型:
job:高级命令执行(state: started|streaming|done|error)。tool:带有toolName和meta/args的phase: start|result。
IconState 枚举(Swift)
idleworkingMain(ActivityKind)workingOther(ActivityKind)overridden(ActivityKind)(调试覆盖)
ActivityKind → 图形
exec→ 💻read→ 📄write→ ✍️edit→ 📝attach→ 📎- default → 🛠️
视觉映射
idle:普通小生物。workingMain:带有图形的徽章,完整色调,腿部"工作"动画。workingOther:带有图形的徽章,静音色调,无急跑。overridden:无论活动如何都使用所选的图形/色调。
状态行文本(菜单)
- 工作活动时:
<会话角色> · <活动标签>- 示例:
Main · exec: pnpm test,Other · read: apps/macos/Sources/Clawdbot/AppState.swift。
- 示例:
- 空闲时:回退到健康摘要。
事件摄取
- 来源:控制通道
agent事件(ControlChannel.handleAgentEvent)。 - 解析字段:
stream: "job"带有用于开始/停止的data.state。stream: "tool"带有data.phase、name、可选的meta/args。
- 标签:
exec:args.command的第一行。read/write:缩短的路径。edit:路径加上从meta/diff 计数推断的更改类型。- 回退:工具名称。
调试覆盖
- 设置 ▸ 调试 ▸ “图标覆盖"选择器:
系统(自动)(默认)工作中:main(每种工具类型)工作中:other(每种工具类型)空闲
- 通过
@AppStorage("iconOverride")存储;映射到IconState.overridden。
测试检查清单
- 触发 main 会话作业:验证图标立即切换且状态行显示 main 标签。
- main 空闲时触发非 main 会话作业:图标/状态显示非 main;保持稳定直到完成。
- 其他活动时启动 main:图标立即翻转到 main。
- 快速工具突发:确保徽章不闪烁(工具结果的 TTL 宽限期)。
- 所有会话空闲后健康行重新出现。