--- id: "0153" title: "matrix-client-pc agent integration: paneles para rooms operados por agentes" status: pending priority: medium created: 2026-05-24 related_flows: ["0010", "0009"] related_issues: ["0152"] dependencies: ["0152"] tags: [matrix, agents, agents_and_robots, dashboard, sse, device_agent] --- ## Objetivo Integracion nativa con `agents_and_robots` + `agents_dashboard` + futuro `device_agent` (flow 0009 mesh). Detectar que un room esta operado por un agente Matrix conocido (via state event custom `m.agent.metadata`) y mostrar panel lateral con info del agente: uptime, ultima ejecucion, cola de tasks, last_error, boton restart, view logs en vivo (SSE). Atajos: enviar slash commands del agente (`/agent restart`, `/agent skill `). ## Tareas 1. Backend Go: - `MatrixService.GetAgentMetadata(roomID) -> *AgentMetadata` — lee state event `m.agent.metadata` que el agente publica al arrancar. - `MatrixService.SubscribeAgentLogs(agentID) -> chan LogLine` — SSE proxy al endpoint `agents_and_robots /api/agents//logs` ya existente (issue 0113). - Llamadas REST proxy a `agents_and_robots`: `RestartAgent(agentID)`, `ListSkills(agentID)`, `TriggerSkill(agentID, skill, args)`. 2. Frontend React: - Hook `useAgentMetadata(roomID)` — devuelve `null` si no es room de agente. - Componente `AgentPanel` (panel lateral colapsable, solo visible si hay agentMetadata): - Card con avatar, nombre, version, uptime, status (running/stopped/error). - Tabs: "Logs" (live SSE), "Skills" (lista de skills disponibles + boton trigger), "Config" (read-only del config.yaml del agente). - Boton restart con confirmacion. - Componente `LogStream` — termtinal-like log viewer con auto-scroll + filtro grep. - Slash commands custom: `/agent restart`, `/agent skill `, `/agent logs`. 3. Cuando flow 0009 (mesh) este vivo: - Detectar `device_agent` rooms (state event `m.device.metadata` con tipo `device_agent`). - Panel especifico `DevicePanel`: hostname, OS, kernel, IP mesh WG, capabilities firmadas, ultimo heartbeat. - Slash commands: `/device shell ` (si capability permite), `/device fs ls `, `/device camera capture`. 4. Tests: - `e2e/test_agent_panel_basic.sh` — entrar a room de `welcome-bot`, panel agente visible con info correcta. - `e2e/test_agent_logs_live.sh` — boton "view logs" stream logs en tiempo real (5s). - `e2e/test_agent_restart.sh` — restart desde panel + verificar agente vuelve online. ## Funciones del registry a crear - `matrix_agent_metadata_go_infra` — leer/publicar state event `m.agent.metadata`. - `agents_and_robots_client_go_infra` — wrapper REST + SSE del API de `agents_and_robots`. - `AgentPanel_ts_ui` — panel lateral Mantine con tabs. - `LogStream_ts_ui` — viewer logs SSE. - `DevicePanel_ts_ui` — panel device_agent (cuando flow 0009 vivo). ## Acceptance - [ ] Room operado por agente conocido muestra `AgentPanel` automatico. - [ ] Logs en vivo del agente aparecen en panel (SSE). - [ ] Restart desde panel funciona end-to-end. - [ ] Slash `/agent skill greet` ejecuta skill remota y respuesta llega como msg al room. - [ ] Room NO operado por agente: panel oculto (no clutter). ## Notas - State event `m.agent.metadata` format: `{ agent_id, version, capabilities[], owner, repo_url }`. Documentar en `projects/element_agents/docs/agent_metadata.md`. - SSE proxy: el cliente PC habla a `agents_and_robots` via su DNS publica (`agents.organic-machine.com`) con auth Bearer (token del usuario Matrix + scope `agent_panel`). - Permisos: solo el `owner` declarado en el agente puede ejecutar restart/trigger. Otros users del room solo leen. - Gotcha: si el agente se rebuilds y cambia `agent_id`, el state event queda obsoleto — necesita TTL o heartbeat.