Qué se muestra
- El estado de trabajo actual del agente se muestra 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.
- Un elemento raíz “Contexto” abre un submenú con sesiones recientes en lugar de expandirlas en el menú raíz.
- Un bloque “Nodos” en el menú raíz enumera solo dispositivos emparejados (desde
node.list), no entradas de cliente/presencia. - Una sección raíz “Uso” aparece debajo de Contexto cuando hay instantáneas de uso del proveedor disponibles, seguida de detalles de costo cuando están disponibles.
Modelo de estado
- Fuente:
WorkActivityStore(apps/macos/Sources/OpenClaw/WorkActivityStore.swift). - Los eventos llegan como
ControlAgentEventcon unrunId; el controlador (ControlChannel.routeWorkActivity) leesessionKeyde la carga útil del evento y usa"main"de forma predeterminada si está ausente. - Prioridad: la sesión principal (
sessionKey == "main"de forma predeterminada) siempre gana. Si la principal está activa, su estado se muestra de inmediato. Si la principal está inactiva, se muestra en su lugar la sesión no principal activa más recientemente. El almacén no cambia a mitad de la actividad; solo cambia cuando la sesión actual queda inactiva o la principal se activa. - Tipos de actividad:
job: ejecución de comandos de alto nivel (state: started|streaming|done|error|...).tool:phase: start|resultconname,meta/argsopcionales.
Enumeración IconState (Swift)
idleworkingMain(ActivityKind)workingOther(ActivityKind)overridden(ActivityKind)(sobrescritura de depuración)
ActivityKind -> símbolo de insignia
ActivityKind envuelve un ToolKind (bash, read, write, edit, attach, other) o un job directo. Cada uno se asigna a una insignia de SF Symbol dibujada sobre el icono de la criatura (IconState.badgeSymbolName):
| Tipo | Símbolo |
|---|---|
bash | chevron.left.slash.chevron.right |
read | doc |
write | pencil |
edit | pencil.tip |
attach | paperclip |
other / job | gearshape.fill |
Asignación visual
idle: criatura normal, sin insignia.workingMain: insignia con símbolo, tinte completo (prominencia.primary), animación de pata “trabajando”.workingOther: insignia con símbolo, tinte atenuado (prominencia.secondary), sin correteo.overridden: usa el símbolo/tinte elegido independientemente de la actividad real.
Submenú Contexto
- El menú raíz muestra una fila “Contexto” con un conteo/estado de sesiones; abre un submenú (
MenuSessionsInjector). - El encabezado del submenú muestra el conteo de sesiones activas de las últimas 24 horas.
- Cada fila de sesión conserva su barra de tokens, antigüedad, vista previa, alternancia de pensamiento/detallado, restablecimiento, compactación y acciones de eliminación.
- Los mensajes de carga, desconexión y error de carga de sesión se muestran dentro del submenú Contexto.
- Las secciones de uso y costo permanecen en el nivel raíz debajo de Contexto para que sigan siendo visibles de un vistazo sin abrir el submenú.
Texto de la fila de estado (menú)
- Mientras hay trabajo activo:
<Session role> · <activity label>("\(roleLabel) · \(activity.label)"enMenuContentView), donde la etiqueta de rol esMainuOther. - Cuando está inactivo: vuelve al resumen de salud.
Ingesta de eventos
- Fuente: eventos
agentdel canal de control, enrutados porControlChannel.routeWorkActivity(from:). - Campos analizados:
stream: "job"condata.statepara inicio/detención.stream: "tool"condata.phase,data.name,data.meta/data.argsopcionales.
- Las etiquetas de herramientas provienen de
ToolDisplayRegistry.resolve(name:args:meta:); los nombres sin resolver recurren al nombre bruto de la herramienta.
Sobrescritura de depuración
- Ajustes > Depuración > selector “Sobrescritura de icono”:
System (auto)(predeterminado)Working: main/Working: other(por tipo de herramienta: bash, read, write, edit, other)Idle
- Almacenado bajo la clave
UserDefaultsopenclaw.iconOverride; asignado aIconState.overridden.
Lista de comprobación de pruebas
- Activar trabajo de la sesión principal: el icono cambia de inmediato y la fila de estado muestra la etiqueta principal.
- Activar trabajo de una sesión no principal mientras la principal está inactiva: el icono/estado muestra la sesión no principal; permanece estable hasta que termina.
- Iniciar la principal mientras otra sesión está activa: el icono cambia a la principal al instante.
- Ráfagas rápidas de herramientas: la insignia no parpadea (ventana de gracia de 2 s antes de borrar una herramienta finalizada,
WorkActivityStore.toolResultGrace). - La fila de salud reaparece cuando todas las sesiones están inactivas.