docs(web-ui/dashboard): document K3PT ST4T3 stale perms + active model badge

Two undocumented features from recent commits:

feat(core) 6ab0757cc6: K3PT ST4T3 now has two
sub-sections — tombstones (existing) and a new 'stale permission entries'
list showing agents with capability/tool-group JSON entries but no live
container. Lazy-loaded, auto-refreshes on capabilities_changed +
tool_groups_changed; each entry has a 'clear perms' button.

feat(dash) 4375ab6246: container rows show an
active model badge (blue) when the container is running and the harness has
persisted a model name in harness/hyperhive-model. Stale values suppressed
for stopped containers.
This commit is contained in:
iris 2026-07-02 12:22:03 +02:00
commit b63c6c543d
2 changed files with 52 additions and 8 deletions

View file

@ -94,6 +94,13 @@ through. Three flex columns:
`model_changed` events so it stays accurate when the model is `model_changed` events so it stays accurate when the model is
changed from another session. Clicking the already-active model changed from another session. Clicking the already-active model
closes the menu without an extra POST. closes the menu without an extra POST.
A second separator + **effort quick-picker** section labelled
`effort` appears when the backend declares effort levels in
`state.available_efforts`. One button per level (e.g. `medium`,
`high`, `xhigh`); clicking POSTs `/api/effort` (same endpoint as
the `/effort <level>` slash command). The active level's button is
highlighted; `renderEffortChip` keeps the picker in sync with
`StateSnapshot.effort` from the cold-load snapshot.
The popover's display rules are scoped to `:not([hidden])` so the The popover's display rules are scoped to `:not([hidden])` so the
`[hidden]` HTML attribute's UA `display: none` isn't overridden by `[hidden]` HTML attribute's UA `display: none` isn't overridden by
the author CSS's `display: flex` — the popover stays hidden until the author CSS's `display: flex` — the popover stays hidden until
@ -152,10 +159,14 @@ messages for this agent are acked, the harness won't receive
wake-prompts for them. A `{ marked: N }` pill surfaces the count. wake-prompts for them. A `{ marked: N }` pill surfaces the count.
After the drain the inbox list empties on reload (the filter is After the drain the inbox list empties on reload (the filter is
`acked_at IS NULL`, so drained messages disappear). Loose-ends flyout: questions, `acked_at IS NULL`, so drained messages disappear). Loose-ends flyout: questions,
approvals, and reminders pending against this agent (`GET /api/loose-ends`); approvals, reminders, pending inbox messages, and unread matrix
notifications pending against this agent (`GET /api/loose-ends`);
question rows carry an inline answer form that POSTs cross-origin to question rows carry an inline answer form that POSTs cross-origin to
the core dashboard's `POST /api/answer-question/{id}` so the operator answers the core dashboard's `POST /api/answer-question/{id}` so the operator answers
*as operator* (see `docs/boundary.md`). Tasks flyout: in-flight bash *as operator* (see `docs/boundary.md`). Pending inbox messages (`✉ inbox
— N pending message(s)`) and unread matrix rooms appear informational
only (not cancellable from the flyout — drain with `recv` / `mark_read`
in-turn). Tasks flyout: in-flight bash
tasks (`GET /api/bash-tasks`); each row shows status (`▶ running` / tasks (`GET /api/bash-tasks`); each row shows status (`▶ running` /
`◷ queued`), the task id, elapsed time, and a truncated one-line `◷ queued`), the task id, elapsed time, and a truncated one-line
command preview. Read-only — kill/inspect lives in the harness, not command preview. Read-only — kill/inspect lives in the harness, not
@ -251,6 +262,10 @@ Slash commands today:
Takes effect on the next turn; persisted to Takes effect on the next turn; persisted to
`/state/hyperhive-model` so the override survives harness `/state/hyperhive-model` so the override survives harness
restart / rebuild. restart / rebuild.
- `/effort <level>``POST /api/effort` setting the claude effort
level (`medium` / `high` / `xhigh`). Takes effect on the next
turn. The overflow menu surfaces an effort picker that calls the
same endpoint; both stay in sync via `StateSnapshot.effort`.
- `/new-session``POST /api/new-session` (confirms first). - `/new-session``POST /api/new-session` (confirms first).
Arms a one-shot on the Bus; next turn runs without Arms a one-shot on the Bus; next turn runs without
`--continue`, dropping the resume session entirely. `--continue`, dropping the resume session entirely.
@ -320,8 +335,9 @@ shaped).
- `GET /api/state` — cold-load snapshot (`StateSnapshot`) consumed by - `GET /api/state` — cold-load snapshot (`StateSnapshot`) consumed by
`app.js` on page load and while `status === 'needs_login_in_progress'`. `app.js` on page load and while `status === 'needs_login_in_progress'`.
Includes `turn_state`, `context_window_tokens`, `qualified_label`, Includes `turn_state`, `context_window_tokens`, `qualified_label`,
`available_models`, `available_efforts`, `links`, and other fields described inline `available_models`, `effort`, `available_efforts`, `links`, and
throughout this document. All subsequent state updates arrive via SSE. other fields described inline throughout this document. All
subsequent state updates arrive via SSE.
- `GET /api/dashboard-state` — lean snapshot of agent-owned fields - `GET /api/dashboard-state` — lean snapshot of agent-owned fields
fetched once per running agent by the dashboard's container row to fetched once per running agent by the dashboard's container row to
get fresh values without relying on hive-c0re's periodic file-reads. get fresh values without relying on hive-c0re's periodic file-reads.

View file

@ -193,10 +193,20 @@ so the queue's per-row re-render (rows rebuild as the `step` advances)
never tears down the open stream; it hides when nothing is building and never tears down the open stream; it hides when nothing is building and
each row keeps its `logs →` link out to the full L0GS history. each row keeps its `logs →` link out to the full L0GS history.
**K3PT ST4T3** — destroyed-but-state-kept tombstones (size + **K3PT ST4T3** — two sub-sections on one pane:
age + claude-creds badge). Two actions: `⊕ R3V1V3` (queues a
Spawn approval; existing state is reused), `PURG3` (wipes *Tombstones*: destroyed-but-state-kept agents (size + age +
state + applied dirs; `POST /api/purge-tombstone/{name}`). claude-creds badge). Two actions: `⊕ R3V1V3` (queues a Spawn
approval; existing state is reused), `PURG3` (wipes state + applied
dirs; `POST /api/purge-tombstone/{name}`).
*Stale permission entries*: agents with explicit capability or
tool-group JSON entries but no live container — typically renamed or
deleted agents whose entries persisted in `capabilities.json` /
`tool-groups.json`. Lazy-loaded on first K3PT ST4T3 tab activation;
auto-refreshes on `capabilities_changed` + `tool_groups_changed` SSE
events. Each ghost agent gets a `✕ clear perms` button
(`DELETE /api/permissions/{name}`).
**C0NT41N3R L04D** — live CPU + memory per agent container, read **C0NT41N3R L04D** — live CPU + memory per agent container, read
straight from cgroup v2 on the host (`cpu.stat`, `memory.current`, straight from cgroup v2 on the host (`cpu.stat`, `memory.current`,
@ -781,6 +791,11 @@ fetch entirely.
`opRunning` flag (driving the `pending-running` row class + `opRunning` flag (driving the `pending-running` row class +
spinner) is true when (1) is set OR (2) is in `running` state; spinner) is true when (1) is set OR (2) is in `running` state;
queued entries leave `opRunning` false. queued entries leave `opRunning` false.
An **active model badge** (`model · <name>`, blue) appears when the
container is running and the harness has persisted a model name
(`harness/hyperhive-model`). Read by hive-c0re's `ContainerView`
(`read_active_model`); absent until the agent has completed at least
one turn and stale values are suppressed for stopped containers.
A `ctx · Nk` chip showing the agent's last-turn context size, A `ctx · Nk` chip showing the agent's last-turn context size,
populated from `DashboardState.ctx_tokens` (absent until the populated from `DashboardState.ctx_tokens` (absent until the
agent has completed at least one turn). The chip colour (green / agent has completed at least one turn). The chip colour (green /
@ -1309,6 +1324,19 @@ payload):
tool-group assignments. Emitted from the rebuild-queue worker after tool-group assignments. Emitted from the rebuild-queue worker after
a `PermChange` / ToolGroups entry commits the JSON file. Same a `PermChange` / ToolGroups entry commits the JSON file. Same
shape as `GET /api/tool-groups`; P3RM1SS10NS tab subscribes. shape as `GET /api/tool-groups`; P3RM1SS10NS tab subscribes.
- `tombstones_changed` (seq, tombstones: `Vec<TombstoneView>`) —
full snapshot of destroyed-but-state-kept agents. Emitted on
destroy, purge, and revive. C0R3 K3PT ST4T3 tab subscribes.
- `meta_inputs_changed` (seq, inputs: `Vec<MetaInput>`) — full
snapshot of `meta/flake.lock` inputs. BU1LDS M3T4 1NPUTS tab
subscribes; same shape as `GET /api/meta-inputs`.
- `meta_update_running` (running: bool) — emitted when a
`nix flake update` ripple starts or completes. BU1LDS M3T4 1NPUTS
tab uses this to show/hide the "⏳ meta-update running" banner.
- `audit_entry_added` (flattened `AuditEntry` fields: id, ts_unix,
agent, action, target, outcome, detail) — a single new audit-log
row. L0GS AUDIT sub-tab live-prepends the row and bumps the
"latest N of M" count, de-duped by id against the cold fetch.
`/api/state` is **only fetched on cold-load and on the few `/api/state` is **only fetched on cold-load and on the few
forms that mutate non-event-derived state** (PURG3 + forms that mutate non-event-derived state** (PURG3 +