Skip to main content

显示内容

  • 当前代理工作状态会显示在菜单栏图标中以及菜单的第一行状态中。
  • 当工作处于活动状态时,健康状态会被隐藏;当所有会话都处于空闲状态后,它会恢复显示。
  • 根级“Context”项会打开一个子菜单,其中显示最近的会话,而不是在根菜单中展开它们。
  • 根菜单中的“Nodes”区块只列出已配对的设备(来自 node.list),不包含客户端/存在状态条目。
  • 当提供程序使用情况快照可用时,根菜单中会在 Context 下方显示根级“Usage”部分;若有成本详情,则其后显示成本详情。
  • 当有两个或更多 Gateway 可用时,第一行状态会包含主 Gateway 的名称,并且根级“Gateways”部分会列出每个 Gateway 及其健康状态和主标记。选择某一行可打开或聚焦该 Gateway 的仪表盘;按住 Option 可为符合条件的已保存 Gateway 显示“设为主 Gateway…”
  • Quick Chat 会打开浮动的主会话撰写器;其当前全局快捷键会显示在该项旁边。
单 Gateway 配置会保持现有菜单不变。当有两个或更多 Gateway 时,应用的主 Gateways 菜单还会按目录顺序分配 Command-1 到 Command-9。其勾选标记会跟随最前面的仪表盘窗口,选择某个项目会在原窗口中切换到该窗口,或者在没有仪表盘窗口时打开所选的 Gateway。

状态模型

  • 来源:WorkActivityStoreapps/macos/Sources/OpenClaw/WorkActivityStore.swift)。
  • 事件作为带有 runIdControlAgentEvent 到达;处理器(ControlChannel.routeWorkActivity)从事件负载中读取 sessionKey,如果没有则默认使用 "main"
  • 优先级:主会话(默认 sessionKey == "main")始终优先。如果主会话处于活动状态,会立即显示其状态。如果主会话处于空闲状态,则改为显示最近活跃的非主会话。存储不会在活动过程中切换;它只会在当前会话变为空闲或主会话变为活动时切换。
  • 活动类型:
    • job:高层命令执行(state: started|streaming|done|error|...)。
    • toolphase: start|result,包含 name,以及可选的 meta/args

IconState 枚举(Swift)

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

ActivityKind -> 徽标符号

ActivityKind 封装了一个 ToolKindbashreadwriteeditattachother)或一个裸 job。每种都会映射为绘制在小动物图标上的一个 SF Symbol 徽标(IconState.badgeSymbolName):

视觉映射

  • idle:普通小动物,无徽标。
  • workingMain:带符号的徽标,完整色调(.primary prominence),腿部“工作中”动画。
  • workingOther:带符号的徽标,弱化色调(.secondary prominence),不奔跑。
  • overridden:无论真实活动如何,都使用所选符号/色调。

Context 子菜单

  • 根菜单显示一行“Context”,带有会话数量/状态;点击后会打开一个子菜单(MenuSessionsInjector)。
  • 子菜单标题显示过去 24 小时内的活跃会话数量。
  • 每个会话行都保留其 token 条、时长、预览、thinking/verbose 切换、重置、压缩和删除操作。
  • 加载中、断开连接以及会话加载错误消息会显示在 Context 子菜单内。
  • Usage 和 cost 部分仍然保留在 Context 下方的根级别,这样无需打开子菜单也能一眼查看。

状态行文本(菜单)

  • 当有两个或更多网关时,连接标签会附加主网关的目录显示名称,例如 OpenClaw Active — Mac Studio
  • 在工作进行时:<Session role> · <activity label>(在 MenuContentView 中为 "\(roleLabel) · \(activity.label)"),其中角色标签为 MainOther
  • 在空闲时:回退为健康摘要。

事件接入

  • 来源:control-channel 的 agent 事件,通过 ControlChannel.routeWorkActivity(from:) 路由。
  • 解析字段:
    • stream: "job",使用 data.state 表示开始/停止。
    • stream: "tool",使用 data.phasedata.name,以及可选的 data.meta/data.args
  • 工具标签来自 ToolDisplayRegistry.resolve(name:args:meta:);无法解析的名称将回退为原始工具名。

调试覆盖

  • 设置 > 调试 > “图标覆盖” 选择器:
    • 系统(自动)(默认)
    • 工作中:main / 工作中:other(按工具类型:bash、read、write、edit、other)
    • 空闲
  • 存储在 UserDefaultsopenclaw.iconOverride 下;映射到 IconState.overridden

测试清单

  • 触发主会话任务:图标立即切换,状态行显示主标签。
  • 在主会话空闲时触发非主会话任务:图标/状态显示非主会话;在其完成前保持稳定。
  • 当另一个会话处于活动状态时启动主会话:图标会立即切换到主会话。
  • 快速工具突发:徽标不会闪烁(在清除已完成工具前有 2 秒宽限窗口,WorkActivityStore.toolResultGrace)。
  • 当所有会话都空闲后,健康状态行会重新出现。

相关