hyperhive/frontend/packages/dashboard/src/core.html
iris be8d97ded7 feat(dashboard): add standalone C0R3 page (system tab → its own page)
Carves the dashboard's SYST3M tab content out into a standalone page at
/core.html, reached from the H0M3 hub, with a createTabStrip sub-tab
strip (default = Rebuild Queue): rebuild queue, meta inputs, kept state,
container load. Same minimal-chrome standalone-page pattern as
/logs.html (← home back-link + sub-tab nav).

This is the additive first step: the new page is its own esbuild bundle
that cold-loads /api/state and subscribes to /dashboard/stream for the
same live rebuild_queue_changed / meta_inputs_changed / meta_update_running
/ tombstones_changed events the dashboard uses. The four section
renderers are ported from tabs.js; the dashboard's SYST3M tab is left in
place and untouched, so this PR cannot regress the existing dashboard.
Removing the now-duplicate SYST3M tab + de-duplicating the renderers
(into a shared module) + splitting the shared section CSS out of
dashboard.css is the deliberate follow-up.

core.css imports dashboard.css wholesale (transitional) so the ported
sections render identically; dashboard.css does not import common.css so
nothing double-loads. build.mjs gains core.js / core.css / core.html
entries; no Rust change (hive-c0re serves dist/ via ServeDir, and the
/dashboard/stream + /dashboard/history routes are registered ahead of
the fallback).

Page name "C0R3" is a placeholder pending the operator's pick — trivially
renamed (the /core.html URL + the C0R3 label).
2026-06-10 19:51:06 +02:00

92 lines
4.5 KiB
HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>hyperhive // C0R3</title>
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="stylesheet" href="/static/colors.css">
<link rel="stylesheet" href="/static/theme.css">
<link rel="stylesheet" href="/static/common.css">
<link rel="stylesheet" href="/static/core.css">
</head>
<body class="core-shell">
<!-- C0R3: the host/coordinator surface. Standalone page (served at
/core.html) carved out of the dashboard's old SYST3M tab so the
dashboard tab strip stays lean. Same minimal chrome as
/logs.html — a `← home` back-link to the H0M3 hub + a
createTabStrip sub-tab nav. Default sub-tab is the rebuild queue
(the thing the operator actually watches). The section <div> ids
(rebuild-queue-section, meta-inputs-section, tombstones-section,
container-load-section) match what core.js's renderers target,
which are the same renderers the dashboard SYST3M tab used. -->
<header class="page-header">
<a class="page-back" href="/">← home</a>
<nav class="hive-tabbar core-tabbar" id="core-tabbar" role="tablist">
<a class="hive-tab" id="core-tab-rebuild" href="#rebuild" role="tab"
aria-controls="core-pane-rebuild" data-tab="rebuild">
<span class="core-tab-label">R3BU1LD QU3U3</span>
<span class="tab-count" id="core-tab-count-rebuild" hidden></span>
</a>
<a class="hive-tab" id="core-tab-meta" href="#meta" role="tab"
aria-controls="core-pane-meta" data-tab="meta">
<span class="core-tab-label">M3T4 1NPUTS</span>
</a>
<a class="hive-tab" id="core-tab-kept" href="#kept" role="tab"
aria-controls="core-pane-kept" data-tab="kept">
<span class="core-tab-label">K3PT ST4T3</span>
</a>
<a class="hive-tab" id="core-tab-load" href="#load" role="tab"
aria-controls="core-pane-load" data-tab="load">
<span class="core-tab-label">C0NT41N3R L04D</span>
</a>
</nav>
</header>
<main class="core-main">
<!-- R3BU1LD QU3U3: pending + running rebuilds, meta-updates, and
first-spawns. Driven by /api/state.rebuild_queue cold-load +
live `rebuild_queue_changed` over /dashboard/stream. Default tab. -->
<section class="core-pane" id="core-pane-rebuild" data-tab-pane="rebuild"
role="tabpanel" aria-labelledby="core-tab-rebuild">
<p class="meta">pending + running rebuilds, meta-updates, and first-spawns. one runs at a time; meta-update cascades nest under their parent. dedup: re-enqueueing a still-queued op collapses into the existing entry.</p>
<div id="rebuild-queue-section">
<p class="meta">loading…</p>
</div>
</section>
<!-- M3T4 1NPUTS: select inputs to nix flake update in /meta/. -->
<section class="core-pane" id="core-pane-meta" data-tab-pane="meta"
role="tabpanel" aria-labelledby="core-tab-meta">
<p class="meta">select inputs to <code>nix flake update</code> in <code>/meta/</code>. selected agents rebuild in sequence after the lock bump; manager learns each outcome via the usual <code>rebuilt</code> system event.</p>
<div id="meta-inputs-section">
<p class="meta">loading…</p>
</div>
</section>
<!-- K3PT ST4T3: tombstoned-agent kept state. -->
<section class="core-pane" id="core-pane-kept" data-tab-pane="kept"
role="tabpanel" aria-labelledby="core-tab-kept">
<p class="meta">kept state from previously tombstoned agents — recreating an agent with the same name reuses it.</p>
<div id="tombstones-section">
<p class="meta">loading…</p>
</div>
</section>
<!-- C0NT41N3R L04D: live cpu + memory per agent container, from
cgroup v2 on the host. Polled only while this sub-tab is active. -->
<section class="core-pane" id="core-pane-load" data-tab-pane="load"
role="tabpanel" aria-labelledby="core-tab-load">
<p class="meta">live cpu + memory per agent container, from cgroup v2 on the host. cpu is % of total host capacity (all cores), sampled over ~200ms each refresh; polled every 5s while this tab is open. network is omitted on purpose — agents share the host netns, so there is no per-container counter (see <code>docs/network.md</code>).</p>
<div id="container-load-section">
<p class="meta">loading…</p>
</div>
</section>
</main>
<script type="module" src="/static/core.js" defer></script>
</body>
</html>