| Filename | Latest commit message | Latest commit date |
|---|---|---|
Firefox kills "idle" SharedWorkers under memory pressure with no native signal to the client. The page's port silently becomes a no-op and events stop flowing — observable symptom: mara's "dashboard never refreshes; F5 fixes it" (because F5 creates a fresh page that creates a fresh worker). The worker now pings every connected port every 30s. The client tracks last-activity-from-worker on every message arrival (incl. pings, since those carry no URL — bumped before the URL filter in the route handler). A visibility-gated watchdog polls every 15s; if the page is visible AND has active subs AND hasn't heard from the worker in >90s, it presumes the worker dead, logs a console warning, and re-subscribes on a fresh port. Three pings missed before we act, so a normal tab-throttle blip doesn't false-positive. The fresh-port re-subscribe re-uses the bfcache-restore code path (same shape: drop stale listeners, getSharedPort → new SharedWorker, re-attach each route + repost subscribe). Recovery is per-tab — when one tab's watchdog fires and brings up a new worker, other tabs that share the named worker pick it up on their own watchdog cycle. Falls back gracefully on environments without SharedWorker (the existing direct-EventSource path is untouched) and is invisible on the healthy path — pings are 30s apart, no UI surface. |
||
| .. | ||
| 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).