--- title: Agent Inbox --- ```js import {API, apiFetch, pollDelay, waitForVisible} from "./components/config.js"; ``` ```js // Live poll: messages list const inboxState = (async function*() { let failures = 0; while (true) { let messages = [], ok = false; try { const resp = await apiFetch("/messages/?limit=100"); ok = resp.ok; if (ok) messages = await resp.json(); } catch {} failures = ok ? 0 : failures + 1; yield {messages, ok, ts: new Date()}; await waitForVisible(pollDelay({ok, failures})); } })(); ``` ```js const messages = inboxState.messages ?? []; const _ok = inboxState.ok ?? false; const _ts = inboxState.ts; const unread = messages.filter(m => !m.read_at && !m.archived_at); const read = messages.filter(m => m.read_at && !m.archived_at); const archived = messages.filter(m => m.archived_at); // Group unread by agent for KPI const agentCounts = {}; for (const m of unread) { agentCounts[m.to_agent] = (agentCounts[m.to_agent] ?? 0) + 1; } const topAgents = Object.entries(agentCounts).sort((a, b) => b[1] - a[1]).slice(0, 4); ``` # Agent Inbox ```js import {injectTocTop} from "./components/toc-sidebar.js"; import {withDocHelp} from "./components/doc-overlay.js"; const _kpiBox = html`
make api`}
${m.body}
No unread messages.
`); } else { display(html`No read messages.
`); } else { display(html`No archived messages.
`); } else { display(html`