docs/platforms/mac/menu-bar.md
node.list), not client/presence entries.runId (per-run) plus sessionKey in the payload. The “main” session is the key main; if absent, we fall back to the most recently updated session.job: high‑level command execution (state: started|streaming|done|error).tool: phase: start|result with toolName and meta/args.idleworkingMain(ActivityKind)workingOther(ActivityKind)overridden(ActivityKind) (debug override)exec → 💻read → 📄write → ✍️edit → 📝attach → 📎idle: normal critter.workingMain: badge with glyph, full tint, leg “working” animation.workingOther: badge with glyph, muted tint, no scurry.overridden: uses the chosen glyph/tint regardless of activity.<Session role> · <activity label>
Main · exec: pnpm test, Other · read: apps/macos/Sources/OpenClaw/AppState.swift.agent events (ControlChannel.handleAgentEvent).stream: "job" with data.state for start/stop.stream: "tool" with data.phase, name, optional meta/args.exec: first line of args.command.read/write: shortened path.edit: path plus inferred change kind from meta/diff counts.System (auto) (default)Working: main (per tool kind)Working: other (per tool kind)Idle@AppStorage("iconOverride"); mapped to IconState.overridden.