Compare commits

..
4 changed files with 21 additions and 30 deletions

View file

@ -27,19 +27,13 @@ hive-c0re/ host daemon + sibling operator CLI (lib + 2 bins)
vacuum tasks. vacuum tasks.
src/bin/hivectl.rs `hivectl` binary: operator-facing host CLI src/bin/hivectl.rs `hivectl` binary: operator-facing host CLI
for ad-hoc administration that doesn't go for ad-hoc administration that doesn't go
through the broker. Verbs: `forge through the broker. v0 verbs: `forge
create-user <name>` / `matrix create-user create-user <name>`, `matrix create-user
<name>` — manual entry points to the same <name>` — wrap the same idempotent
idempotent provisioning flows c0re runs at `forge::ensure_user_for` /
boot; `gateway create-user|delete-user| `matrix::ensure_user_for` flows c0re runs
list-users` — BCrypt htpasswd management for in its boot sweeps, callable manually for
gateway HTTP Basic auth; `agents list|kill| recovery / debug.
restart|restart-all` — container management
without the broker; `choom <name> [--fresh]`
— exec into `machinectl shell h-<name>`
running `claude --continue` (or fresh) so
the operator can drop into the agent's live
Claude session interactively.
src/server.rs host admin socket (HostRequest → dispatch) src/server.rs host admin socket (HostRequest → dispatch)
src/client.rs admin-socket client src/client.rs admin-socket client
src/manager_server.rs manager-privileged socket (ManagerRequest) src/manager_server.rs manager-privileged socket (ManagerRequest)

View file

@ -156,7 +156,7 @@ as same-origin `/agent/<name>/…` URLs instead of the legacy direct
`services.hyperhive.gateway.enable = true`. Three render sites `services.hyperhive.gateway.enable = true`. Three render sites
flip together: the primary agent-name link, the favicon fetch flip together: the primary agent-name link, the favicon fetch
(`<url>/icon`), and the nav-strip `container`-kind links from (`<url>/icon`), and the nav-strip `container`-kind links from
`DashboardState.links` (`GET /api/dashboard-state`). `forge`-kind nav-strip links still `/api/agent/<name>/links`. `forge`-kind nav-strip links still
resolve against `http://<host>:3000` (separate sub-domain transition resolve against `http://<host>:3000` (separate sub-domain transition
tracked by `forge.behindGateway`); `external`-kind links are tracked by `forge.behindGateway`); `external`-kind links are
already absolute. See `docs/web-ui/dashboard.md::Container row` for the already absolute. See `docs/web-ui/dashboard.md::Container row` for the

View file

@ -27,12 +27,8 @@ through. Three flex columns:
`⬡ forge` (profile) + `↳ config` (agent-configs mirror) when the `⬡ forge` (profile) + `↳ config` (agent-configs mirror) when the
agent has a forge account; any `hyperhive.dashboardLinks` extras agent has a forge account; any `hyperhive.dashboardLinks` extras
(`kind = External`). A `↑ dashboard` link is prepended by the JS (`kind = External`). A `↑ dashboard` link is prepended by the JS
so the host dashboard is one click away. Links come from so the host dashboard is one click away. `GET /api/agent/{name}/links`
`StateSnapshot.links` (served by `GET /api/state`); the same set is the single source of truth. Each `NavLink.kind` resolves
also appears in `DashboardState.links` (`GET /api/dashboard-state`)
for the dashboard card's icon strip. Both are produced by
`agent_links()` in hive-ag3nt — the single source of truth.
Each `NavLink.kind` resolves
differently in the frontend: `Container` → same-origin path differently in the frontend: `Container` → same-origin path
(the agent page is itself container-local); `Forge` (the agent page is itself container-local); `Forge`
`http://<host>:3000<url>`; `External` → already absolute. `http://<host>:3000<url>`; `External` → already absolute.

View file

@ -416,11 +416,12 @@ struct StateSnapshot {
/// Cumulative token usage across the most recent turn's inferences /// Cumulative token usage across the most recent turn's inferences
/// (cost signal). `null` until the first turn finishes. /// (cost signal). `null` until the first turn finishes.
cost_usage: Option<crate::events::TokenUsage>, cost_usage: Option<crate::events::TokenUsage>,
/// Navigation links for this agent page. Also served via /// Navigation links for this agent page. The same list feeds the
/// `DashboardState.links` (`GET /api/dashboard-state`) for the /// dashboard card's icon-only nav strip via hive-c0re's
/// dashboard card's icon strip. Both are produced by `agent_links()` /// `GET /api/agent/{name}/links` same-origin passthrough proxy
/// — single source of truth. See [`docs/web-ui/dashboard.md::Container row`] /// — single source of truth, no CORS. Per-agent page also reads
/// for the frontend resolver + which links appear in which conditions. /// this directly. See [`docs/web-ui/dashboard.md::Container row`] for the
/// frontend resolver + which links appear in which conditions.
links: Vec<AgentLink>, links: Vec<AgentLink>,
/// Public URL of the forge served by hive-gateway (e.g. /// Public URL of the forge served by hive-gateway (e.g.
/// `"https://forge.pr1ma.darkest.space"`). Sourced from /// `"https://forge.pr1ma.darkest.space"`). Sourced from
@ -438,11 +439,11 @@ struct StateSnapshot {
swarm_name: Option<String>, swarm_name: Option<String>,
} }
/// One navigation link in the agent page header row. The same JSON /// One navigation link in the agent page header row. Same JSON
/// shape appears in both `StateSnapshot.links` (`GET /api/state`, /// shape feeds the dashboard's icon-only nav strip via the host's
/// per-agent page) and `DashboardState.links` (`GET /api/dashboard-state`, /// `GET /api/agent/{name}/links` passthrough proxy, so the agent
/// dashboard card icon strip). `agent_links()` is the single source /// backend is the single source of truth for what links an agent
/// of truth for what links an agent exposes. /// exposes.
#[derive(Serialize)] #[derive(Serialize)]
struct AgentLink { struct AgentLink {
/// `kind = Container | Forge` → path; `kind = External` → full URL. /// `kind = Container | Forge` → path; `kind = External` → full URL.