Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
86165f07c8 | ||
|
|
33be854c50 | ||
|
|
30c2d94f13 | ||
|
|
4769d7ce5a |
4 changed files with 30 additions and 21 deletions
20
CLAUDE.md
20
CLAUDE.md
|
|
@ -27,13 +27,19 @@ hive-c0re/ host daemon + sibling operator CLI (lib + 2 bins)
|
|||
vacuum tasks.
|
||||
src/bin/hivectl.rs `hivectl` binary: operator-facing host CLI
|
||||
for ad-hoc administration that doesn't go
|
||||
through the broker. v0 verbs: `forge
|
||||
create-user <name>`, `matrix create-user
|
||||
<name>` — wrap the same idempotent
|
||||
`forge::ensure_user_for` /
|
||||
`matrix::ensure_user_for` flows c0re runs
|
||||
in its boot sweeps, callable manually for
|
||||
recovery / debug.
|
||||
through the broker. Verbs: `forge
|
||||
create-user <name>` / `matrix create-user
|
||||
<name>` — manual entry points to the same
|
||||
idempotent provisioning flows c0re runs at
|
||||
boot; `gateway create-user|delete-user|
|
||||
list-users` — BCrypt htpasswd management for
|
||||
gateway HTTP Basic auth; `agents list|kill|
|
||||
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/client.rs admin-socket client
|
||||
src/manager_server.rs manager-privileged socket (ManagerRequest)
|
||||
|
|
|
|||
|
|
@ -156,7 +156,7 @@ as same-origin `/agent/<name>/…` URLs instead of the legacy direct
|
|||
`services.hyperhive.gateway.enable = true`. Three render sites
|
||||
flip together: the primary agent-name link, the favicon fetch
|
||||
(`<url>/icon`), and the nav-strip `container`-kind links from
|
||||
`/api/agent/<name>/links`. `forge`-kind nav-strip links still
|
||||
`DashboardState.links` (`GET /api/dashboard-state`). `forge`-kind nav-strip links still
|
||||
resolve against `http://<host>:3000` (separate sub-domain transition
|
||||
tracked by `forge.behindGateway`); `external`-kind links are
|
||||
already absolute. See `docs/web-ui/dashboard.md::Container row` for the
|
||||
|
|
|
|||
|
|
@ -27,8 +27,12 @@ through. Three flex columns:
|
|||
`⬡ forge` (profile) + `↳ config` (agent-configs mirror) when the
|
||||
agent has a forge account; any `hyperhive.dashboardLinks` extras
|
||||
(`kind = External`). A `↑ dashboard` link is prepended by the JS
|
||||
so the host dashboard is one click away. `GET /api/agent/{name}/links`
|
||||
is the single source of truth. Each `NavLink.kind` resolves
|
||||
so the host dashboard is one click away. Links come from
|
||||
`StateSnapshot.links` (served by `GET /api/state`); the same set
|
||||
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
|
||||
(the agent page is itself container-local); `Forge` →
|
||||
`http://<host>:3000<url>`; `External` → already absolute.
|
||||
|
|
|
|||
|
|
@ -416,12 +416,11 @@ struct StateSnapshot {
|
|||
/// Cumulative token usage across the most recent turn's inferences
|
||||
/// (cost signal). `null` until the first turn finishes.
|
||||
cost_usage: Option<crate::events::TokenUsage>,
|
||||
/// Navigation links for this agent page. The same list feeds the
|
||||
/// dashboard card's icon-only nav strip via hive-c0re's
|
||||
/// `GET /api/agent/{name}/links` same-origin passthrough proxy
|
||||
/// — single source of truth, no CORS. Per-agent page also reads
|
||||
/// this directly. See [`docs/web-ui/dashboard.md::Container row`] for the
|
||||
/// frontend resolver + which links appear in which conditions.
|
||||
/// Navigation links for this agent page. Also served via
|
||||
/// `DashboardState.links` (`GET /api/dashboard-state`) for the
|
||||
/// dashboard card's icon strip. Both are produced by `agent_links()`
|
||||
/// — single source of truth. See [`docs/web-ui/dashboard.md::Container row`]
|
||||
/// for the frontend resolver + which links appear in which conditions.
|
||||
links: Vec<AgentLink>,
|
||||
/// Public URL of the forge served by hive-gateway (e.g.
|
||||
/// `"https://forge.pr1ma.darkest.space"`). Sourced from
|
||||
|
|
@ -439,11 +438,11 @@ struct StateSnapshot {
|
|||
swarm_name: Option<String>,
|
||||
}
|
||||
|
||||
/// One navigation link in the agent page header row. Same JSON
|
||||
/// shape feeds the dashboard's icon-only nav strip via the host's
|
||||
/// `GET /api/agent/{name}/links` passthrough proxy, so the agent
|
||||
/// backend is the single source of truth for what links an agent
|
||||
/// exposes.
|
||||
/// One navigation link in the agent page header row. The same JSON
|
||||
/// shape appears in both `StateSnapshot.links` (`GET /api/state`,
|
||||
/// per-agent page) and `DashboardState.links` (`GET /api/dashboard-state`,
|
||||
/// dashboard card icon strip). `agent_links()` is the single source
|
||||
/// of truth for what links an agent exposes.
|
||||
#[derive(Serialize)]
|
||||
struct AgentLink {
|
||||
/// `kind = Container | Forge` → path; `kind = External` → full URL.
|
||||
|
|
|
|||
Loading…
Reference in a new issue