Fleet page: drop the aggregate totals row and bar skeletons — cards carry identity, liveness, and runtime summary; hardware detail stays one click down. Stream descriptors (origin/label) now ride FrameEvents into the fleet view, so the orchestrator renders as a full-width amber-framed module pinned above the grid. Cards are real links; roster rows are keyboard-operable. Fleet Control: /view/reconciler folds into /view/demo-control as one control bench — ghost-segment ready/desired counter, generation digit, unified node rows (reconciler stage + pid + state + kill), activity feeds demoted to a collapsed tail. The standalone reconciler page is retired; its API stays live to feed the merge. Visual world (both themes, nav toggle, persisted, prefers-color-scheme default): dark = Bloomberg night housing (black ground, navy panels, amber data register); light = Atom One Light. 2px corners, monospace data, outline chips for states, cyan as the only interactive voice, ghost-eight segments for counters, blink reserved for unresolved states, depressing controls, reduced-motion collapse. |
||
|---|---|---|
| .. | ||
| src | ||
| .gitignore | ||
| AGENTS.md | ||
| Cargo.lock | ||
| Cargo.toml | ||
| README.md | ||
dashboard
Read-only HTML/SSE dashboard over incoming telemetry frames.
The crate owns the Axum server, bounded raw frame window, and view registry. Component crates can keep their own view implementations beside their code and register them through DashboardHandle::register_view. The built-in control-plane view is hosted here because worker/actor/message processing is universal to swactor programs.
The control-plane page fuses machine stats and actor stats per node stream: node cards (CPU/GPU/net + actor rollup) → per-node actor roster → per-actor dossier (identity, message diet, sampled message history). The Rust type name is the actor's display name; the address is the unique key. Stale streams (silent beyond the liveness window) render in a separate collapsed pool, superseded life generations are evicted immediately, and the stale pool is hard-capped.
Routes
GET /— fleet control plane (home; same page as/view/fleet)GET /events— raw incoming frames as SSEGET /api/frames— recent raw frame windowGET /api/views— registered view metadataGET /view/telemetry/live— generic live explorer over retained and incoming telemetry framesGET /api/view/telemetry/live— bounded per-stream/channel explorer snapshotGET /view/fleet— fused control-plane page (machine + actors per node)GET /api/view/fleet— live/stale pools with per-node machine and roster snapshotGET /api/view/fleet/detail?stream=<node#life>&actor=<addr>— bounded per-actor dossier detail (diet, history, sampled receipts)
Every page carries the unified top navbar, built from the view registry at serve time — pages include a <!--swactor:nav--> placeholder and the server substitutes the links, so app-registered views appear automatically.
All state is derived from observed frames. The dashboard sends no control signals back to producers.