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