---
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 <name>`).

## 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/<id>/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 <name> <args>`, `/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 <cmd>` (si capability permite), `/device fs ls <path>`, `/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.
