Lógica de estados en la Menu Bar
Seguro que te ha pasado: lanzas un proceso en segundo plano y pierdes el rastro de lo que está haciendo. No saber si el agent está procesando datos, escribiendo código o simplemente esperando puede romper tu flujo de trabajo. Necesitas una forma clara de ver qué ocurre sin interrumpir lo que estás haciendo en la pantalla principal.
Esta guía te explica cómo el sistema gestiona la prioridad de las sesiones y qué significan los cambios visuales que ves en la Menu Bar.
Requisitos previos
Sección titulada «Requisitos previos»- Acceso a la lista de dispositivos mediante
node.list(paired nodes). - Eventos de
agentdelControlChannelpara la ingesta de datos. - Snapshots de uso del provider para la sección “Usage”.
- Acceso a los ajustes de Debug para pruebas de
IconState.
Inicio rápido
Sección titulada «Inicio rápido»Sigue estos pasos para entender cómo se procesa y muestra la actividad del agent en menos de 5 minutos.
1. Entender la prioridad de sesiones
Sección titulada «1. Entender la prioridad de sesiones»El sistema utiliza runId y sessionKey para identificar el trabajo. La sesión con la clave main siempre tiene prioridad absoluta.
- Si
mainestá activa, verás su estado inmediatamente. - Si
mainestá idle, se muestra la sesión “non-main” activa más reciente. - El sistema no cambia de icono durante una actividad; solo hace el switch cuando la sesión actual termina o cuando
mainse activa.
2. Identificar el ActivityKind
Sección titulada «2. Identificar el ActivityKind»Cada tarea tiene un glyph asociado en la Menu Bar. Aquí tienes el mapeo que utiliza el sistema:
exec-> 💻 (ejecución de comandos)read-> 📄 (lectura de archivos)write-> ✍️ (escritura de datos)edit-> 📝 (edición de código)attach-> 📎 (adjuntar archivos)- Por defecto -> 🛠️
3. Implementación del IconState
Sección titulada «3. Implementación del IconState»Si trabajas con el código en Swift, el estado del icono se define mediante este enum:
enum IconState { case idle case workingMain(ActivityKind) case workingOther(ActivityKind) case overridden(ActivityKind) // Para debug override}4. Ingesta de eventos
Sección titulada «4. Ingesta de eventos»Los datos se reciben a través de ControlChannel.handleAgentEvent. El sistema parsea dos tipos de streams:
job: Monitorizadata.state(started, streaming, done, error).tool: Monitorizadata.phase(start, result) y extrae etiquetas como el comando ejecutado o la ruta del archivo.
Solución de problemas
Sección titulada «Solución de problemas»- El icono parpadea en ráfagas rápidas de herramientas: Esto se evita mediante un TTL grace en los resultados de las herramientas. Si notas flickering, verifica que los eventos de
phase: resultno estén llegando de forma desincronizada. - No aparece el estado de salud (health status): El estado de salud se oculta automáticamente mientras hay trabajo activo. Volverá a aparecer en la primera fila del menú cuando todas las sesiones estén en idle.
- El icono no cambia al iniciar una sesión secundaria: Comprueba si la sesión
mainsigue activa. La sesiónmainsiempre bloquea la visualización de otras sesiones hasta que termina su tarea. - Los nodos no aparecen en el menú: La sección “Nodes” solo lista dispositivos vinculados mediante
node.list, no entradas de presencia o clientes genéricos.
Próximos pasos
Sección titulada «Próximos pasos»OpenClaw Expert
Sigues atascado?
Si esta pagina no resolvio tu caso, pregunta a OpenClaw Expert para pasos concretos.