Watch
0
0
Fork
You've already forked hyperhive
0

docs: the hive dashboard and agent page shrink to overviews

The hive dashboard and the per-agent page lose their control-by-control UI
description and endpoint tables from the handbook. The full text moves to
4-implementation/web-ui/dashboard.md and agent-page.md, and the handbook pages
keep what an operator needs to find and use them. Code comments that named the
old sections point at the new pages.
This commit is contained in:
iris 2026-11-11 00:09:45 +01:00
commit 2acde41e54
10 changed files with 1028 additions and 955 deletions

View file

@ -16,7 +16,7 @@
/* ─── full-screen layout overrides ─────────────────────────────────
The agent page mounts a full-viewport terminal under a fixed
frosted-glass header. See docs/2-handbook/agents/web-page.md::Per-agent
frosted-glass header. See docs/4-implementation/web-ui/agent-page.md::Per-agent
page for the layer / pill / side-panel structure; rules below
override the in-page defaults from @hive/shared. */
@ -184,7 +184,7 @@ h3 {
}
.agent-icon {
/* Square identity anchor — explicit 5em sizing + align-self.
See docs/2-handbook/agents/web-page.md::Per-agent page (Agent icon) for the
See docs/4-implementation/web-ui/agent-page.md::Per-agent page (Agent icon) for the
intrinsic-dim-pushes-parent-flex-open + sticks-to-top
rationale. */
width: 5em;
@ -594,7 +594,7 @@ pre.diff {
/* Tail pill (↓ N new): z-index bumped above the floating chrome so the
pill sits on the top layer instead of being clipped by it. (Pill is anchored in
`.agent-main` rather than `.terminal-wrap` — see
docs/2-handbook/agents/web-page.md::Per-agent page Terminal-wrap paragraph for the
docs/4-implementation/web-ui/agent-page.md::Per-agent page Terminal-wrap paragraph for the
backdrop-filter stacking-context rationale.) */
.agent-main .tail-pill {
bottom: 0.6em;

View file

@ -50,7 +50,7 @@ export interface HeaderProps {
* a variable pill count) grows to fit badges+pills together, keeping
* the header a stable height even on widescreen. Meta-nav
* (`<MetaNav>`) lives here too, as a fixed-size trigger, not an
* inline link list in the title row (docs/2-handbook/agents/web-page.md). */
* inline link list in the title row (docs/4-implementation/web-ui/agent-page.md). */
pills?: ComponentChildren;
}

View file

@ -19,7 +19,7 @@
<body class="agent-shell">
<!-- The Preact rewrite owns everything below — header, terminal,
side panel. See main.tsx/Root.tsx for the component
tree; docs/2-handbook/agents/web-page.md for the design. -->
tree; docs/4-implementation/web-ui/agent-page.md for the design. -->
<div id="preact-root"></div>
<script type="module" src="static/main.js" defer></script>

View file

@ -36,7 +36,7 @@
<script>
// Minimal RFB-over-WebSocket renderer. Connects to `screen/ws` on
// the same host; the harness relays raw RFB bytes to the VNC server
// running inside the container. See docs/2-handbook/agents/web-page.md (GET /screen)
// running inside the container. See docs/4-implementation/web-ui/agent-page.md (GET /screen)
// for the design rationale + canvas-sizing implementation notes.
(function () {
@ -61,7 +61,7 @@
});
// --- Fit-to-window toggle ---
// See docs/2-handbook/agents/web-page.md::Per-agent endpoints (GET /screen) for the
// See docs/4-implementation/web-ui/agent-page.md::Per-agent endpoints (GET /screen) for the
// localStorage persistence + canvas-intrinsic-resolution +
// pointer-rescale model.
let fitMode = localStorage.getItem("screen-fit") !== "off";
@ -105,7 +105,7 @@
// Sends an RFB SetDesktopSize request so the VNC server (weston)
// changes its actual output resolution to match the browser
// viewport — sharper than fit-mode's CSS downscale. Gated on the
// server's ExtendedDesktopSize advert; see docs/2-handbook/agents/web-page.md::Per-agent
// server's ExtendedDesktopSize advert; see docs/4-implementation/web-ui/agent-page.md::Per-agent
// endpoints (GET /screen).
let extDesktopSupported = false;
let screenId = 1; // captured from the server's ExtendedDesktopSize advert

View file

@ -34,7 +34,7 @@ export interface AgentState {
// in the agent page header (stats/screen + any
// `services.hyperhive.agent.dashboardLinks` extras). `agent_links()` on the backend
// is the single source of truth for what links an agent exposes; see
// docs/2-handbook/agents/web-page.md::Header for the kind → URL resolution table.
// docs/4-implementation/web-ui/agent-page.md::Header for the kind → URL resolution table.
export interface AgentLink {
url: string;
icon: string;

View file

@ -1,7 +1,7 @@
// 4G3NTS (containers) domain — extracted from tabs.js.
// Agent topology, container-row rendering, selection bar, and all
// live-update apply handlers for container-state, transient, and
// job-queue-rollup ops. See docs/2-handbook/hives/dashboard.md::Container row for the
// job-queue-rollup ops. See docs/4-implementation/web-ui/dashboard.md::Container row for the
// rendering contract.
import { $, form, fmtAgeSecs } from "./common.js";
@ -26,14 +26,14 @@ const containerRowCache = new Map();
// by agent name -> Map<transient_kind, since_unix>: an agent can hold
// several pills at once (every *running* node naming the agent lights
// one now, not just a curated "worth surfacing" subset — see
// docs/2-handbook/hives/dashboard.md::Container row), keyed the same way the backend's
// docs/4-implementation/web-ui/dashboard.md::Container row), keyed the same way the backend's
// own tombstone map is, `(agent, label)`, so a clear only removes the
// specific pill it names rather than guessing. `since_unix` is
// wall-clock so the elapsed-seconds badge ticks without polling.
const transientsState = new Map();
// In-memory set of selected agent logical names backing the sticky
// #selection-bar. See docs/2-handbook/hives/dashboard.md::Selection bar for the
// #selection-bar. See docs/4-implementation/web-ui/dashboard.md::Selection bar for the
// interaction model (icon-click toggle, Esc/clear button drop,
// tab-gated visibility).
const selectionState = new Set();
@ -214,7 +214,7 @@ function derivePortConflicts(containers) {
}
// ─── container ordering ──────────────────────────────────────────────────────
// Flat alphabetical sort — see docs/2-handbook/hives/dashboard.md::C0NTAINERS.
// Flat alphabetical sort — see docs/4-implementation/web-ui/dashboard.md::C0NTAINERS.
function sortedContainerRows(containers) {
// Close any open context menu before replacing the DOM tree — the
@ -272,7 +272,7 @@ function buildContainerLi(c, opts) {
// Agent icon: 5em square wrapper with an absolutely-positioned
// <img> + fire-and-forget load with /favicon.svg fallback. The
// wrapper doubles as the selection toggle (click / keyboard).
// See docs/2-handbook/hives/dashboard.md::Container row for the layout + load-strategy
// See docs/4-implementation/web-ui/dashboard.md::Container row for the layout + load-strategy
// rationale.
const iconImg = el("img", { class: "container-icon-img", alt: "" });
const icon = el(
@ -436,7 +436,7 @@ function buildContainerLi(c, opts) {
// dashboard-state fetch above.
if (pending.length) {
// One badge per pill — an agent can carry several transients at
// once now (see docs/2-handbook/hives/dashboard.md::Container row), each rendered
// once now (see docs/4-implementation/web-ui/dashboard.md::Container row), each rendered
// independently rather than collapsed into one label.
for (const label of pending) {
head.append(
@ -506,7 +506,7 @@ function buildContainerLi(c, opts) {
// Per-card action buttons (R3ST4RT / ST0P / ST4RT / R3BU1LD /
// DESTR0Y / PURG3) live on the selection bar, not here — see
// docs/2-handbook/hives/dashboard.md::Selection bar. The contextual `needs update ↻`
// docs/4-implementation/web-ui/dashboard.md::Selection bar. The contextual `needs update ↻`
// chip in the head row stays — it's a state-hint, not an
// action button.
@ -577,7 +577,7 @@ export function renderContainers(s) {
// TCP fallback — the gateway proxies the prefix to the per-agent
// harness (unix-domain via `agent-sockets.json`, or a computed TCP
// loopback port while the socket marker is absent). See
// `docs/2-handbook/hives/dashboard.md::Container row` + `docs/4-implementation/networking/gateway.md::Vhost map`.
// `docs/4-implementation/web-ui/dashboard.md::Container row` + `docs/4-implementation/networking/gateway.md::Vhost map`.
const gatewayLinks = !!(s && s.gateway_enabled);
const ul = existingUl ?? el("ul", { class: "containers" });
const rows = sortedContainerRows(containers);
@ -597,7 +597,7 @@ export function renderContainers(s) {
// full stop (mara, on review: "remove the per agent pending stuff -
// only show what is running"; rendered one badge per pill — mara,
// earlier: "show all running nodes that name the agent"). See
// docs/2-handbook/hives/dashboard.md::Container row.
// docs/4-implementation/web-ui/dashboard.md::Container row.
const transientKindsMap = transientsState.get(c.name);
// Sorted for stable badge order across renders — Map iteration
// order is insertion order, which shifts as pills clear/re-add.
@ -663,7 +663,7 @@ export function renderContainers(s) {
// ─── selection bar ───────────────────────────────────────────────────────────
// Sticky-bottom strip; visible when >=1 agent selected on the 4G3NTS
// tab. See docs/2-handbook/hives/dashboard.md::Selection bar for the interaction model
// tab. See docs/4-implementation/web-ui/dashboard.md::Selection bar for the interaction model
// and the per-action availability rules (disabled-with-tooltip for
// actions that don't apply to the full selection). Actions POST per
// agent in a loop (endpoints are individually idempotent /

View file

@ -225,7 +225,7 @@ code {
}
/* M0V3 affordance (selection bar) — mauve reads as "structural
change" rather than the destructive red / amber chrome of
destroy / rebuild. See docs/2-handbook/hives/dashboard.md::Selection bar. */
destroy / rebuild. See docs/4-implementation/web-ui/dashboard.md::Selection bar. */
.btn-move {
color: var(--purple);
border-color: var(--purple);

View file

@ -12,7 +12,7 @@
/* ─── tabbed dashboard chrome ──────────────────────────────────────
Top-of-page sticky header with banner + tab strip. SSE stays
alive across tab switches. See docs/2-handbook/hives/dashboard.md::Chrome header + Tab strip for the
alive across tab switches. See docs/4-implementation/web-ui/dashboard.md::Chrome header + Tab strip for the
routing model. */
body.dashboard-shell {

View file

@ -165,7 +165,7 @@
<!-- Selection action bar. Sticky-bottom strip that slides into
view when one or more agent cards is selected (click the icon
to toggle). See docs/2-handbook/hives/dashboard.md::Selection bar for the bulk
to toggle). See docs/4-implementation/web-ui/dashboard.md::Selection bar for the bulk
action gating + clear semantics. -->
<div
id="selection-bar"

View file

@ -31,7 +31,7 @@ import { el } from "../dom.js";
import { attachShadowCss } from "../shadow-css.js";
import sidePanelCss from "./hive-side-panel.css";
// See docs/2-handbook/agents/web-page.md::Side panel for the hit-strip + pointer-capture +
// See docs/4-implementation/web-ui/agent-page.md::Side panel for the hit-strip + pointer-capture +
// localStorage persistence model; CSS clamps the stored value to min
// 320px / max 96vw and out-of-range stored values are dropped silently.
// Shared by both packages deliberately — see module header.