feat(dashboard): serve H0M3 at /, relocate dashboard to /dashboard.html (#1464)

Step 2 of the nav restructure: make the H0M3 menu hub the landing page
at / and move the dashboard SPA to /dashboard.html, with every surface
linking back to the hub.

Mechanism (frontend-only, no host-side change — confirmed against the
ServeDir route table): the dashboard's ServeDir fallback serves
index.html at / via append_index_html_on_directories, and there is no
SPA path-routing catch-all to break. The dashboard SPA is served as the
plain file dashboard.html so it never shadows the exact-match
/dashboard/stream + /dashboard/history SSE routes registered before the
fallback.

- Swap the HTML entry files: the H0M3 page becomes index.html (loads
  home.js → served at /), and the dashboard SPA becomes dashboard.html
  (loads tabs.js → served at /dashboard.html). build.mjs copies the new
  set; JS bundle names are unchanged (referenced by absolute /static/
  paths, independent of the HTML filename).
- H0M3 Dashboard tile now points at /dashboard.html.
- The dashboard gains a "← home" back-link in its chrome; flow.html and
  logs.html relabel their back-link from "← dashboard" to "← home"
  (href stays / — which is the hub now). Pages link to the hub, not to
  each other.
- Agent page (app.js + stats.js): the "↑ dashboard" link now targets
  /dashboard.html. The API base (rebuild / answer-question /
  mark-all-read POSTs) stays the origin root, unchanged.
- Comment-only: tabs.js / flow.js / common.js references to the
  dashboard's old index.html filename updated to dashboard.html.

Note for review: git renders the file swap as a deleted home.html + an
added dashboard.html + a heavily-modified index.html, because index.html
exists on both sides with swapped content. It's a content swap, not a
rewrite — the built dist/ is verified (index.html→home.js, dashboard.html
→tabs.js).

Deferred to a follow-up: removing the FL0W / L0GS / M4TR1X "→" page-links
from the dashboard tab strip (touches tabs.js gating/overflow), and the
shared reusable chrome component (a later step).
This commit is contained in:
iris 2026-06-07 20:49:33 +02:00 committed by mara
commit 8ddab401f9
12 changed files with 479 additions and 449 deletions

View file

@ -186,10 +186,13 @@ window.marked = marked;
if (!menu) return;
menu.replaceChildren();
// ↑ dashboard — host dashboard back-link.
// ↑ dashboard — host dashboard back-link. The dashboard SPA lives at
// `dashboard.html` (the `/` root now serves the H0M3 menu hub), so the
// link targets that file; `dashUrl` itself stays the API origin used
// for the rebuild / answer-question / mark-all-read POSTs below.
menu.append(el('a', {
class: 'overflow-item overflow-item-dashboard',
href: dashUrl,
href: dashUrl + 'dashboard.html',
target: '_blank',
rel: 'noopener',
role: 'menuitem',

View file

@ -403,12 +403,13 @@ window.Chart = Chart;
document.getElementById('title').textContent = '◆ ' + s.label + ' ◆';
const dl = document.getElementById('dashboard-link');
// When accessed via hive-gateway the page lives at `/agent/<name>/`
// on the same origin as the dashboard (`/`). Detect via path prefix
// on the same origin as the dashboard. Detect via path prefix
// rather than the direct port (which is unreachable or wrong scheme
// behind HTTPS TLS termination).
// behind HTTPS TLS termination). The dashboard SPA lives at
// `dashboard.html` — the `/` root now serves the H0M3 menu hub.
dl.href = window.location.pathname.startsWith('/agent/')
? window.location.origin + '/'
: 'http://' + window.location.hostname + ':' + s.dashboard_port + '/';
? window.location.origin + '/dashboard.html'
: 'http://' + window.location.hostname + ':' + s.dashboard_port + '/dashboard.html';
} catch (_) { /* non-fatal */ }
}