显示内容
- 当前 Agent 工作状态会显示在菜单栏图标和菜单的第一行状态中。
- 工作处于活动状态时会隐藏健康状态;所有会话空闲后会恢复显示。
- 根级“上下文”项会打开一个包含最近会话的子菜单,而不是在根菜单中展开它们。
- 根菜单中的“节点”块只列出已配对的设备(来自
node.list),不列出客户端/在线状态条目。 - 当提供商用量快照可用时,根级“用量”部分会显示在上下文下方;如有可用成本详情,则随后显示。
状态模型
- 来源:
WorkActivityStore(apps/macos/Sources/OpenClaw/WorkActivityStore.swift)。 - 事件以带有
runId的ControlAgentEvent到达;处理器(ControlChannel.routeWorkActivity)从事件载荷读取sessionKey,如果缺失则默认为"main"。 - 优先级:主会话(默认
sessionKey == "main")始终优先。如果主会话处于活动状态,它的状态会立即显示。如果主会话空闲,则改为显示最近活动的非主会话。存储不会在活动中途切换;只有当前会话变为空闲或主会话变为活动状态时才会切换。 - 活动类型:
job:高级命令执行(state: started|streaming|done|error|...)。tool:带有name、可选meta/args的phase: start|result。
IconState 枚举(Swift)
idleworkingMain(ActivityKind)workingOther(ActivityKind)overridden(ActivityKind)(调试覆盖)
ActivityKind -> 徽章符号
ActivityKind 包装一个 ToolKind(bash、read、write、edit、attach、other)或一个裸 job。每种类型都会映射到绘制在小角色图标上的 SF Symbol 徽章(IconState.badgeSymbolName):
| 类型 | 符号 |
|---|---|
bash | chevron.left.slash.chevron.right |
read | doc |
write | pencil |
edit | pencil.tip |
attach | paperclip |
other / job | gearshape.fill |
视觉映射
idle:普通小角色,无徽章。workingMain:带符号的徽章,完整色调(.primary强调级别),腿部“工作中”动画。workingOther:带符号的徽章,弱化色调(.secondary强调级别),无快速移动。overridden:无论真实活动如何,都使用所选符号/色调。
上下文子菜单
- 根菜单显示一行“上下文”,带会话数量/状态;它会打开一个子菜单(
MenuSessionsInjector)。 - 子菜单标题显示过去 24 小时内的活动会话数量。
- 每个会话行都会保留其令牌条、时间、预览、思考/详细开关、重置、压缩和删除操作。
- 加载中、已断开连接和会话加载错误消息会在上下文子菜单内渲染。
- 用量和成本部分保持在上下文下方的根级,因此无需打开子菜单也能快速查看。
状态行文本(菜单)
- 工作处于活动状态时:
<Session role> · <activity label>(MenuContentView中的"\(roleLabel) · \(activity.label)"),其中角色标签为“主会话”或“其他”。 - 空闲时:回退到健康摘要。
事件摄取
- 来源:control-channel
agent事件,由ControlChannel.routeWorkActivity(from:)路由。 - 解析字段:
stream: "job",带有用于启动/停止的data.state。stream: "tool",带有data.phase、data.name、可选data.meta/data.args。
- 工具标签来自
ToolDisplayRegistry.resolve(name:args:meta:);无法解析的名称会回退为原始工具名称。
调试覆盖
- 设置 > 调试 > “图标覆盖”选择器:
System (auto)(默认)Working: main/Working: other(按工具类型:bash、read、write、edit、other)Idle
- 存储在
UserDefaults键openclaw.iconOverride下;映射到IconState.overridden。
测试清单
- 触发主会话任务:图标立即切换,状态行显示主会话标签。
- 主会话空闲时触发非主会话任务:图标/状态显示非主会话;保持稳定直到它完成。
- 另一个会话处于活动状态时启动主会话:图标立即切换到主会话。
- 快速工具突发:徽章不会闪烁(已完成工具清除前有 2 秒宽限窗口,
WorkActivityStore.toolResultGrace)。 - 所有会话空闲后,健康行会重新出现。