From d8d589ccb2afd99bfe89f1c68a6846e0d863e26b Mon Sep 17 00:00:00 2001 From: iris Date: Thu, 18 Jun 2026 09:39:34 +0200 Subject: [PATCH 1/2] dashboard(matrix-accounts): populate agent picker from state containers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The agent dropdown read a non-existent `agents` field on /api/state, so it always rendered empty ("— no agents —"). The endpoint exposes the live roster under `containers` (each entry an object with `.name`). Read that instead; the existing string-or-object map keeps it robust. --- frontend/packages/dashboard/src/matrix-accounts.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/packages/dashboard/src/matrix-accounts.js b/frontend/packages/dashboard/src/matrix-accounts.js index a71a2dd9..e180b12d 100644 --- a/frontend/packages/dashboard/src/matrix-accounts.js +++ b/frontend/packages/dashboard/src/matrix-accounts.js @@ -31,7 +31,10 @@ async function loadState() { if (!resp.ok) return; const s = await resp.json(); renderServerWarnings(s.server_warnings); - agents = (s.agents || []) + // `/api/state` exposes the live roster under `containers` (each entry an + // object carrying `.name`); there is no top-level `agents` field, so the + // picker stays compatible with both string + object shapes defensively. + agents = (s.containers || []) .map((a) => (typeof a === 'string' ? a : a && a.name)) .filter(Boolean) .sort(); From 6a7c0bcad851d164264b0875bd5239a9d1b4b9c1 Mon Sep 17 00:00:00 2001 From: iris Date: Thu, 18 Jun 2026 10:03:45 +0200 Subject: [PATCH 2/2] docs(web-ui): matrix-accounts picker reads state.containers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The M4TR1X ACC0UNTS section said the agent picker is populated from `state.agents`, which never existed on /api/state — the same stale field the code read. Sync the doc to the live roster field. --- docs/web-ui/dashboard.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/web-ui/dashboard.md b/docs/web-ui/dashboard.md index d73131d9..9ce7fe58 100644 --- a/docs/web-ui/dashboard.md +++ b/docs/web-ui/dashboard.md @@ -214,7 +214,7 @@ title). Its own esbuild bundle (`matrix-accounts.js`); no SSE — it reads `/api/state` once for the agent picker and otherwise works off two purpose-built endpoints. -An agent picker (populated from `state.agents`) drives a list of that +An agent picker (populated from `state.containers`, the live roster) drives a list of that agent's configured accounts — name, homeserver, and a token-status dot — read from `GET /api/matrix-accounts?agent=` → `{ accounts: [ { name, homeserver, token_present } ] }`. The status