显示内容
- 当前代理工作状态会显示在菜单栏图标中以及菜单的第一行状态中。
- 当工作处于活动状态时,健康状态会被隐藏;当所有会话都处于空闲状态后,它会恢复显示。
- 根级“Context”项会打开一个子菜单,其中显示最近的会话,而不是在根菜单中展开它们。
- 根菜单中的“Nodes”区块只列出已配对的设备(来自
node.list),不包含客户端/存在状态条目。 - 当提供程序使用情况快照可用时,根菜单中会在 Context 下方显示根级“Usage”部分;若有成本详情,则其后显示成本详情。
- 当有两个或更多 Gateway 可用时,第一行状态会包含主 Gateway 的名称,并且根级“Gateways”部分会列出每个 Gateway 及其健康状态和主标记。选择某一行可打开或聚焦该 Gateway 的仪表盘;按住 Option 可为符合条件的已保存 Gateway 显示“设为主 Gateway…”
- Quick Chat 会打开浮动的主会话撰写器;其当前全局快捷键会显示在该项旁边。
状态模型
- 来源:
WorkActivityStore(apps/macos/Sources/OpenClaw/WorkActivityStore.swift)。 - 事件作为带有
runId的ControlAgentEvent到达;处理器(ControlChannel.routeWorkActivity)从事件负载中读取sessionKey,如果没有则默认使用"main"。 - 优先级:主会话(默认
sessionKey == "main")始终优先。如果主会话处于活动状态,会立即显示其状态。如果主会话处于空闲状态,则改为显示最近活跃的非主会话。存储不会在活动过程中切换;它只会在当前会话变为空闲或主会话变为活动时切换。 - 活动类型:
job:高层命令执行(state: started|streaming|done|error|...)。tool:phase: start|result,包含name,以及可选的meta/args。
IconState 枚举(Swift)
idleworkingMain(ActivityKind)workingOther(ActivityKind)overridden(ActivityKind)(调试覆盖)
ActivityKind -> 徽标符号
ActivityKind 封装了一个 ToolKind(bash、read、write、edit、attach、other)或一个裸 job。每种都会映射为绘制在小动物图标上的一个 SF Symbol 徽标(IconState.badgeSymbolName):
视觉映射
idle:普通小动物,无徽标。workingMain:带符号的徽标,完整色调(.primaryprominence),腿部“工作中”动画。workingOther:带符号的徽标,弱化色调(.secondaryprominence),不奔跑。overridden:无论真实活动如何,都使用所选符号/色调。
Context 子菜单
- 根菜单显示一行“Context”,带有会话数量/状态;点击后会打开一个子菜单(
MenuSessionsInjector)。 - 子菜单标题显示过去 24 小时内的活跃会话数量。
- 每个会话行都保留其 token 条、时长、预览、thinking/verbose 切换、重置、压缩和删除操作。
- 加载中、断开连接以及会话加载错误消息会显示在 Context 子菜单内。
- Usage 和 cost 部分仍然保留在 Context 下方的根级别,这样无需打开子菜单也能一眼查看。
状态行文本(菜单)
- 当有两个或更多网关时,连接标签会附加主网关的目录显示名称,例如
OpenClaw Active — Mac Studio。 - 在工作进行时:
<Session role> · <activity label>(在MenuContentView中为"\(roleLabel) · \(activity.label)"),其中角色标签为Main或Other。 - 在空闲时:回退为健康摘要。
事件接入
- 来源: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:);无法解析的名称将回退为原始工具名。
调试覆盖
- 设置 > 调试 > “图标覆盖” 选择器:
系统(自动)(默认)工作中:main/工作中:other(按工具类型:bash、read、write、edit、other)空闲
- 存储在
UserDefaults键openclaw.iconOverride下;映射到IconState.overridden。
测试清单
- 触发主会话任务:图标立即切换,状态行显示主标签。
- 在主会话空闲时触发非主会话任务:图标/状态显示非主会话;在其完成前保持稳定。
- 当另一个会话处于活动状态时启动主会话:图标会立即切换到主会话。
- 快速工具突发:徽标不会闪烁(在清除已完成工具前有 2 秒宽限窗口,
WorkActivityStore.toolResultGrace)。 - 当所有会话都空闲后,健康状态行会重新出现。