Lógica de estado de la barra de menús
Qué se muestra
- Mostramos el estado actual de trabajo del agente en el icono de la barra de menús y en la primera fila de estado del menú.
- El estado de salud se oculta mientras hay trabajo activo; vuelve cuando todas las sesiones están inactivas.
- El bloque “Nodes” del menú enumera solo dispositivos (nodes emparejados mediante
node.list), no entradas de cliente/presencia. - Aparece una sección “Usage” en Context cuando hay disponibles instantáneas de uso del proveedor.
Modelo de estado
- Sesiones: los eventos llegan con
runId(por ejecución) mássessionKeyen la carga útil. La sesión “main” es la clavemain; si falta, recurrimos a la sesión actualizada más recientemente. - Prioridad: main siempre gana. Si main está activa, su estado se muestra inmediatamente. Si main está inactiva, se muestra la sesión no principal activa más reciente. No cambiamos constantemente a mitad de actividad; solo cambiamos cuando la sesión actual pasa a inactiva o main se activa.
- Tipos de actividad:
job: ejecución de comandos de alto nivel (state: started|streaming|done|error).tool:phase: start|resultcontoolNameymeta/args.
Enumeración IconState (Swift)
idleworkingMain(ActivityKind)workingOther(ActivityKind)overridden(ActivityKind)(anulación de depuración)
ActivityKind → glifo
exec→ 💻read→ 📄write→ ✍️edit→ 📝attach→ 📎- predeterminado → 🛠️
Asignación visual
idle: criatura normal.workingMain: insignia con glifo, tinte completo, animación de pata “working”.workingOther: insignia con glifo, tinte atenuado, sin desplazamiento.overridden: usa el glifo/tinte elegido independientemente de la actividad.
Texto de la fila de estado (menú)
- Mientras hay trabajo activo:
<Session role> · <activity label>- Ejemplos:
Main · exec: pnpm test,Other · read: apps/macos/Sources/OpenClaw/AppState.swift.
- Ejemplos:
- Cuando está inactiva: vuelve al resumen de salud.
Ingesta de eventos
- Origen: eventos
agentdel canal de control (ControlChannel.handleAgentEvent). - Campos analizados:
stream: "job"condata.statepara inicio/parada.stream: "tool"condata.phase,name,meta/argsopcionales.
- Etiquetas:
exec: primera línea deargs.command.read/write: ruta abreviada.edit: ruta más tipo de cambio inferido a partir demeta/conteos de diff.- respaldo: nombre de la herramienta.
Anulación de depuración
- Configuración ▸ Depuración ▸ selector “Icon override”:
System (auto)(predeterminado)Working: main(por tipo de herramienta)Working: other(por tipo de herramienta)Idle
- Se almacena mediante
@AppStorage("iconOverride"); se asigna aIconState.overridden.
Lista de comprobación de pruebas
- Activa un job de sesión principal: verifica que el icono cambie inmediatamente y que la fila de estado muestre la etiqueta principal.
- Activa un job de sesión no principal mientras main está inactiva: icono/estado muestran la no principal; se mantienen estables hasta que termina.
- Inicia main mientras otra está activa: el icono cambia a main al instante.
- Ráfagas rápidas de herramientas: asegúrate de que la insignia no parpadee (gracia TTL en resultados de herramientas).
- La fila de salud reaparece una vez que todas las sesiones están inactivas.