#375 set `z-index: 35` on the agent page's tail pill so it'd float above the fixed composer (z-index 30). The fix only landed because nothing else in `.agent-main` created a stacking context. But the pill is anchored inside `.terminal-wrap`, which carries `backdrop-filter: blur(...) saturate(...)` for the frost effect — and `backdrop-filter` CREATES A STACKING CONTEXT. The pill's z-index 35 was trapped inside that context and never got to compete with the composer's z-index 30 in the root stacking context, so the operator still saw the badge clipped under the input box. Same root cause on the flow page — `.flow-main .terminal-wrap` inherits the same backdrop-filter rule. Fix: anchor the pill in `.agent-main` / `.flow-main` instead of `log.parentElement` (= `.terminal-wrap`). Both ancestors are `position: absolute` with `overflow: hidden` but NO backdrop-filter or other stacking-context creators, so the pill's z-index reaches the root and properly floats above the composer. Geometry unchanged — `.agent-main` / `.flow-main` and the `.terminal-wrap` they contain both `inset: 0` the same area, so the pill's `bottom: calc(--composer-h + 0.6em)` lands at the same y. Also added `.flow-main .tail-pill { z-index: 35 }` (the flow page was missing the per-page z-index bump that the agent page already had). `pillAnchor` is an existing opt in @hive/shared/terminal.js (the default is `log.parentElement`); both consumers now set it explicitly. |
||
|---|---|---|
| .. | ||
| packages | ||
| .gitignore | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
hyperhive frontend
npm workspaces project for the hyperhive browser-facing assets:
packages/shared/— shared modules used by both surfaces (terminal pane, Catppuccin palette + body typography).packages/dashboard/— the hive-c0re dashboard SPA.packages/agent/— the per-container web UI (default agent page, stats, screen).
Build
npm install # one-off; uses the checked-in package-lock.json
npm run build # builds every workspace into packages/*/dist/
The Rust binaries serve packages/dashboard/dist/ and
packages/agent/dist/ via tower_http::ServeDir at runtime; the
build derivation is wired up in nix/modules/frontend.nix. Per-agent
additions are layered on top of the default agent dist via the
hyperhive.frontend.extraFiles option in agent.nix.
Why npm + esbuild
- Hermetic: dependencies vendored via the checked-in lockfile;
buildNpmPackagein nix uses it as the source-of-truth so the output is reproducible without network access at build time. - esbuild: vanilla-JS bundler, no framework runtime overhead.
Each workspace's
build.mjsis ~30 lines. - Single-PR migration: see issue #273 for the design proposal and the four-commit shape (npm scaffold → nix derivations → container plumbing → Rust cutover).