@ -29,7 +29,7 @@ from the dashboard tab strip.
H0M3, C0R3, BU1LDS, CR3D3NTIALS, ST4TS), injected at the top
H0M3, C0R3, BU1LDS, CR3D3NTIALS, ST4TS), injected at the top
of `<body>` by `renderServerWarnings` in `common.js` . Driven by
of `<body>` by `renderServerWarnings` in `common.js` . Driven by
`state.server_warnings` — a list of `{ kind, level, message }` — and
`state.server_warnings` — a list of `{ kind, level, message }` — and
coloured by `level` (`warn` amber / `crit` red). The backend owns the
coloured by `level` (`warn` amber / `crit` red). hive-c0re owns the
threshold + message, so adding a new system warning needs no frontend
threshold + message, so adding a new system warning needs no frontend
change. Warnings are a push-based registry (`hive-c0re` 's
change. Warnings are a push-based registry (`hive-c0re` 's
`warnings.rs` ): any subsystem raises/clears its own entry via an RAII
`warnings.rs` ): any subsystem raises/clears its own entry via an RAII
@ -145,7 +145,7 @@ and that artifact set survives `lifecycle::destroy`. An agent
part-way through a spawn is byte-identical on disk to a tombstone, and
part-way through a spawn is byte-identical on disk to a tombstone, and
the pane lists both. The pane carries a standing warning to that effect, and
the pane lists both. The pane carries a standing warning to that effect, and
the row badge says `offline` rather than `destroyed` — the absence of a
the row badge says `offline` rather than `destroyed` — the absence of a
container is all the backend can actually prove. Fixing it properly
container is all hive-c0re can actually prove. Fixing it properly
needs a recorded destroy: * * #3020 **, deferred to the swarm-controller /
needs a recorded destroy: * * #3020 **, deferred to the swarm-controller /
snapshot-storage rework where the problem changes shape.
snapshot-storage rework where the problem changes shape.
@ -232,7 +232,7 @@ own domain concept (the component knows nothing about that endpoint).
**Rows carry no source chip, kind label, timing, or build-log
**Rows carry no source chip, kind label, timing, or build-log
deep-link** — the generic graph wire doesn't carry those fields, and
deep-link** — the generic graph wire doesn't carry those fields, and
rows deliberately present exactly what the endpoint provides rather
rows deliberately present exactly what the endpoint provides rather
than reconstructing chrome the backend no longer sends. Settled entries
than reconstructing chrome hive-c0re no longer sends. Settled entries
render their **full step tree ** , not just a bare summary — the wire
render their **full step tree ** , not just a bare summary — the wire
doesn't filter `Done` nodes out.
doesn't filter `Done` nodes out.
@ -340,7 +340,7 @@ The status dot renders these states:
The container-down cross-reference (`/api/state` ) takes precedence over
The container-down cross-reference (`/api/state` ) takes precedence over
the age check. `as_of_unix` is tooltipped ("live as of N ago") throughout
the age check. `as_of_unix` is tooltipped ("live as of N ago") throughout
so freshness is always legible. When `live` is absent (an older backend
so freshness is always legible. When `live` is absent (an older hive-c0re
without the snapshot) the dot falls back to a token-present rendering.
without the snapshot) the dot falls back to a token-present rendering.
The provision form (account name, homeserver, login method) posts
The provision form (account name, homeserver, login method) posts
@ -407,8 +407,8 @@ deliberate non-goal of this tab — tracked separately.
Per-agent permission configuration. Two sections, each rendered as a
Per-agent permission configuration. Two sections, each rendered as a
column-driven checkbox matrix: rows are agents, columns are the
column-driven checkbox matrix: rows are agents, columns are the
permission names fetched from the backend . The column list is
permission names fetched from hive-c0re . The column list is
authoritative — adding a new tool-group or capability to the backend
authoritative — adding a new tool-group or capability to hive-c0re
requires no UI change; the new column appears automatically.
requires no UI change; the new column appears automatically.
The snapshot carries `agents` (the full manageable roster — live
The snapshot carries `agents` (the full manageable roster — live
@ -483,7 +483,7 @@ across *both* matrices and POSTs one batch to `POST /api/permissions` as
includes only the perm-types that actually changed for each agent (an
includes only the perm-types that actually changed for each agent (an
omitted field leaves that file untouched; an included array fully
omitted field leaves that file untouched; an included array fully
replaces it).
replaces it).
The backend coalesces an agent's capabilities + tool-groups into a
hive-c0re coalesces an agent's capabilities + tool-groups into a
single rebuild, so changing both for one agent is one rebuild, not two.
single rebuild, so changing both for one agent is one rebuild, not two.
The batch is atomic: it validates every change first and on any error
The batch is atomic: it validates every change first and on any error
rejects the whole POST (`{error}` , nothing applied); a clean 200 (`ok` )
rejects the whole POST (`{error}` , nothing applied); a clean 200 (`ok` )
@ -554,7 +554,7 @@ all-zero = one-shot), description). Select `+ ` to POST to
carry-state preserves partially typed inputs across re-renders. The tab pill shows the count of active
carry-state preserves partially typed inputs across re-renders. The tab pill shows the count of active
schedules (at least one live target not yet cancelled).
schedules (at least one live target not yet cancelled).
Refreshed on tab activation and after each submit/cancel. Backed by
Refreshed on tab activation and after each submit/cancel. Backed by
`GET /api/schedules` . No backend changes for the table layout
`GET /api/schedules` . No hive-c0re changes for the table layout
— it renders entirely from existing `schedulesState` +
— it renders entirely from existing `schedulesState` +
`containersState` .
`containersState` .
@ -767,14 +767,14 @@ fetch entirely.
**Line 1** — agent name (link → new tab), m1nd/ag3nt chip, an
**Line 1** — agent name (link → new tab), m1nd/ag3nt chip, an
**icon-only nav strip** plus live agent-owned state, all populated
**icon-only nav strip** plus live agent-owned state, all populated
async from a single `GET /api/dashboard-state` call to the agent's
async from a single `GET /api/dashboard-state` call to the agent's
own backend . The response (`DashboardState` ) carries: `links` (nav
own hive-agent . The response (`DashboardState` ) carries: `links` (nav
strip entries — `📊 stats` , `🖥 screen` when GUI is enabled, `⬡ forge
strip entries — `📊 stats` , `🖥 screen` when GUI is enabled, `⬡ forge
profile`, ` ↳ agent-configs mirror`, plus any agent-declared
profile`, ` ↳ agent-configs mirror`, plus any agent-declared
`dashboardLinks` extras), `status_text` / `status_set_at` (agent
`dashboardLinks` extras), `status_text` / `status_set_at` (agent
self-reported status — the `(set N ago)` chip carries a `data-set-at`
self-reported status — the `(set N ago)` chip carries a `data-set-at`
stamp and ticks every 30s to stay fresh across the long-lived keyed row
stamp and ticks every 30s to stay fresh across the long-lived keyed row
cache), `rate_limited` , `ctx_tokens` / `context_window_tokens`
cache), `rate_limited` , `ctx_tokens` / `context_window_tokens`
(context-window badge data). The agent backend is the single source
(context-window badge data). hive-agent is the single source
of truth for all of these. The dashboard resolves each `AgentLink.kind`
of truth for all of these. The dashboard resolves each `AgentLink.kind`
against a per-agent base URL depending on whether hive-gateway is in
against a per-agent base URL depending on whether hive-gateway is in
front (`StateSnapshot.gateway_enabled` , sourced from the
front (`StateSnapshot.gateway_enabled` , sourced from the
@ -819,7 +819,7 @@ stopped deliberately. Both states read `running: false`; `failed` is
the orthogonal fact (a fifth one alongside `paused` /`needs_update` /
the orthogonal fact (a fifth one alongside `paused` /`needs_update` /
`needs_login` , same "independent flags, no state machine" shape —
`needs_login` , same "independent flags, no state machine" shape —
see `ContainerView` 's own doc comment) that tells them apart. An
see `ContainerView` 's own doc comment) that tells them apart. An
older backend without the field serves `failed: undefined` , which
older hive-c0re without the field serves `failed: undefined` , which
reads falsy — degrades cleanly to the single `not running` badge.
reads falsy — degrades cleanly to the single `not running` badge.
When the container is running, status badges follow — `⊘ rate
When the container is running, status badges follow — `⊘ rate
@ -854,7 +854,7 @@ life). Two consequences for anything rendering it:
particular no longer exists, because no node kind is unique to a
particular no longer exists, because no node kind is unique to a
restart.
restart.
- It's **not ** exclusively operator-initiated, and **not ** limited
- It's **not ** exclusively operator-initiated, and **not ** limited
to rebuild-shaped work — `running_transients()` on the backend is
to rebuild-shaped work — `running_transients()` in hive-c0re is
a status-only test (any `Running` node whose payload names a
a status-only test (any `Running` node whose payload names a
non-empty agent lights a pill), so work the operator never
non-empty agent lights a pill), so work the operator never
triggered (a meta-update cascade, a crash-recover rebuild, a
triggered (a meta-update cascade, a crash-recover rebuild, a
@ -961,7 +961,7 @@ bulk) carries a `stop gracefully — let the agent finish its turn
and flush state before the container stops` checkbox. When ticked,
and flush state before the container stops` checkbox. When ticked,
the action POSTs `/api/kill/<name>?graceful=true` (the bulk path
the action POSTs `/api/kill/<name>?graceful=true` (the bulk path
appends the flag per-agent); unticked is the instant hard stop
appends the flag per-agent); unticked is the instant hard stop
(`/api/kill/<name>` with no query). The backend enqueues a
(`/api/kill/<name>` with no query). hive-c0re enqueues a
`Signal` → `Drain` job-queue node pair (`NodeKind::Signal` /
`Signal` → `Drain` job-queue node pair (`NodeKind::Signal` /
`NodeKind::Drain` ): `Signal` sets the graceful-stop fence and kicks
`NodeKind::Drain` ): `Signal` sets the graceful-stop fence and kicks
the harness so it runs one stop-checkpoint turn (so the agent can
the harness so it runs one stop-checkpoint turn (so the agent can
@ -1025,14 +1025,14 @@ frosted-mauve bar slides up from the bottom of the viewport
- `DESTR0Y` / `PURG3` — always available
- `DESTR0Y` / `PURG3` — always available
- `⇡ M0V3 → ROOT` — promote selected agents to top-level
- `⇡ M0V3 → ROOT` — promote selected agents to top-level
(parent = null); disabled when all selected are already at root.
(parent = null); disabled when all selected are already at root.
Backend `topology::set_parent` refuses moves it can't satisfy
hive-c0re's `topology::set_parent` refuses moves it can't satisfy
(for example a move that would create a cycle) and the refusal surfaces
(for example a move that would create a cycle) and the refusal surfaces
in the failure roll-up.
in the failure roll-up.
- `⇢ M0V3 → [select]` — inline picker available for any
- `⇢ M0V3 → [select]` — inline picker available for any
selection size. The dropdown lists every container that isn't IN
selection size. The dropdown lists every container that isn't IN
the selection itself nor a descendant of any selected agent
the selection itself nor a descendant of any selected agent
(client-side BFS cycle prevention across the whole batch; the
(client-side BFS cycle prevention across the whole batch; the
backend re-checks per-agent). On submit:
hive-c0re re-checks per-agent). On submit:
- **single agent ** → `POST /api/topology/set-parent`
- **single agent ** → `POST /api/topology/set-parent`
(form-encoded `child=<name>&new_parent=<target>` )
(form-encoded `child=<name>&new_parent=<target>` )
- **multiple agents ** → `POST /api/topology/set-parent-bulk`
- **multiple agents ** → `POST /api/topology/set-parent-bulk`