Agents reach the operator over matrix now (#5115). A `send` to `operator` is refused, by the broker and by the MCP allow-list check, with an error that names the matrix MCP tools. The dashboard's Y3R C4LL tab goes with it: the operator inbox, `GET /api/operator-inbox`, `Broker::unread_for_recipient`, and the browser notifications that only ever fired on operator-bound messages. The harness no longer posts turn failures and plugin-install failures to the operator inbox. Both are already logged at warn; a new Grafana rule, `hh-agent-turn-failed`, fires per agent on the harness's `turn failed` line. Dashboard-to-agent messaging (op-send, the agent web UI's message box, mark-all-read for agent inboxes) is unchanged. Decisions per mara on #5115: q1 a, q2 a plus a grafana alert, q3 keep dashboard-to-agent messaging and leave swarm-level code alone.
25 lines
1.2 KiB
JavaScript
25 lines
1.2 KiB
JavaScript
// Shared dashboard state — the one piece of cross-domain state in the
|
|
// dashboard SPA: the live agent roster.
|
|
//
|
|
// The roster is read by nearly every tab (the container tree, the
|
|
// capabilities + tool-group matrices, the schedule target-chips, the
|
|
// container-load poll, and the selection bar), so
|
|
// it lives here as a single source of truth that each domain module
|
|
// imports rather than threading through call signatures. Everything
|
|
// else in the dashboard is domain-local and lives with its own module.
|
|
//
|
|
// `containersState` is keyed by `ContainerView.name` so a lifecycle
|
|
// form's POST → 200 → matching SSE event can flip a single row without
|
|
// a full snapshot refetch. Mutated in place (`set` / `delete` / `clear`)
|
|
// by the container apply-handlers; consumers read it by reference, so
|
|
// the imported binding always reflects the latest roster.
|
|
|
|
export const containersState = new Map();
|
|
|
|
// Replace the whole roster from a fresh `/api/state` snapshot. Called by
|
|
// the entry's `refreshState` on cold load and after async-form submits;
|
|
// live single-row updates go through the container apply-handlers.
|
|
export function syncContainersFromSnapshot(s) {
|
|
containersState.clear();
|
|
for (const c of s.containers || []) containersState.set(c.name, c);
|
|
}
|