feat(dashboard): generic server-warnings banner on every page (#1518)

Per operator request: instead of a disk-specific alert, surface a generic
server-warnings banner at the very top of every page, so new system
warnings can be added backend-side with no frontend change.

- hive-c0re `host_stats`: `server_warnings() -> Vec<ServerWarning>`
  (`{ kind, level, message }`). The threshold logic lives server-side; the
  host disk-pressure check (a `statvfs` probe of `/nix`: ≥85% used → warn,
  ≥95% → crit) is the first and only producer today. No new deps (libc).
- `/api/state` carries `server_warnings` (replaces the disk-specific
  field). Empty when all clear.
- frontend: `renderServerWarnings` / `initServerWarnings` in `common.js`
  inject a sticky top-of-<body> banner and render the list, coloured by
  `level`. Wired on every page — dashboard (live, via refreshState),
  FL0W, L0GS, H0M3. No per-warning frontend code; adding a warning kind
  is a pure backend change.

cargo check/clippy/fmt + npm run build green. Closes #1518.
This commit is contained in:
iris 2026-06-08 19:55:04 +02:00 committed by mara
commit 5d0f3d060b
10 changed files with 241 additions and 6 deletions

View file

@ -25,6 +25,17 @@ from the dashboard tab strip.
S3TT1NGS have no count.
- **Banner-thin** (`░▒▓█▓▒░ HYPERHIVE / HIVE-C0RE / WE ARE THE WIRED ░▒▓█▓▒░`)
— sits below the tab strip.
- **Server-warnings banner** — a generic, sticky top-of-page strip shown
on **every** page (dashboard + the stand-alone FL0W / L0GS / H0M3
pages), injected at the top of `<body>` by `renderServerWarnings` in
`common.js`. Driven by `state.server_warnings` — a list of
`{ kind, level, message }` from hive-c0re's `host_stats::server_warnings`
— and coloured by `level` (`warn` amber / `crit` red). The backend owns
the threshold + message, so adding a new system warning needs no
frontend change. The only producer today is the host disk-pressure
check (a `statvfs` probe of `/nix`: ≥85% used → `warn`, ≥95% → `crit`,
e.g. `⚠ host nix store N% full (G GiB free) — garbage-collect …`).
Hidden when there are no warnings.
- **Browser tab title**`hive / c0re` by default; updated to
`<swarm> / <hive>` once `hive_name` / `swarm_name` arrive in the
state snapshot. When there are pending approvals or unanswered