docs: dashboard event channel, hive-fr0nt crate, mutation events, seq dedupe
This commit is contained in:
parent
62784d4933
commit
d8d393da6d
3 changed files with 167 additions and 30 deletions
65
CLAUDE.md
65
CLAUDE.md
|
|
@ -19,8 +19,19 @@ hive-c0re/ host daemon + CLI (one binary, subcommand-dispatched)
|
|||
src/client.rs admin-socket client
|
||||
src/manager_server.rs manager-privileged socket (ManagerRequest)
|
||||
src/agent_server.rs per-sub-agent socket listener (long-poll Recv)
|
||||
src/broker.rs sqlite Message store + broadcast channel for SSE +
|
||||
hourly vacuum of delivered>30d
|
||||
src/broker.rs sqlite Message store + intra-process broadcast
|
||||
channel (`MessageEvent`) for `recv_blocking` +
|
||||
the dashboard forwarder; hourly vacuum of
|
||||
delivered>30d
|
||||
src/dashboard_events.rs unified wire-facing event channel feeding
|
||||
`/dashboard/stream`. Carries broker `Sent` /
|
||||
`Delivered` (mirrored by the forwarder task
|
||||
in main.rs) + mutation events
|
||||
(`ApprovalAdded` / `ApprovalResolved`,
|
||||
`QuestionAdded` / `QuestionResolved`,
|
||||
`TransientSet` / `TransientCleared`). Each
|
||||
frame carries a monotonic per-process `seq`
|
||||
clients use to dedupe against snapshot reads.
|
||||
src/approvals.rs sqlite Approval queue + kinds
|
||||
src/operator_questions.rs sqlite question queue backing `ask` /
|
||||
`answer` (both operator + agent-to-agent)
|
||||
|
|
@ -49,9 +60,26 @@ hive-c0re/ host daemon + CLI (one binary, subcommand-dispatched)
|
|||
(idempotent, marker-guarded phase 4)
|
||||
src/dashboard.rs axum HTTP: static shell + /api/state JSON + actions
|
||||
+ journald viewer + bind-with-retry (SO_REUSEADDR)
|
||||
+ deployed_sha chip per container
|
||||
+ deployed_sha chip per container +
|
||||
/dashboard/{stream,history} subscribing to the
|
||||
unified DashboardEvent channel
|
||||
assets/ index.html, dashboard.css, app.js (include_str!)
|
||||
|
||||
hive-fr0nt/ shared frontend-assets crate (browser only).
|
||||
src/lib.rs pub const BASE_CSS / TERMINAL_CSS / TERMINAL_JS
|
||||
re-exports; both binaries `include_str!` them
|
||||
and prepend to their per-page serving routes.
|
||||
assets/base.css Catppuccin palette + body typography (one source
|
||||
of truth, no per-page redeclaration).
|
||||
assets/terminal.css `.terminal-wrap` + `.live` + `.tail-pill` +
|
||||
`.row` / `details.row` styling for both
|
||||
pages' lit log panes.
|
||||
assets/terminal.js `window.HiveTerminal.create(opts)`: scroll-
|
||||
sticky log + "↓ N new" pill + history
|
||||
backfill + SSE subscribe-buffer-snapshot-
|
||||
dedupe dance. Pages register a kind→renderer
|
||||
map; the terminal owns the lifecycle.
|
||||
|
||||
hive-ag3nt/ in-container harness crate; produces TWO binaries
|
||||
src/lib.rs re-exports + DEFAULT_SOCKET, DEFAULT_WEB_PORT
|
||||
src/client.rs generic JSON-line request/response over unix socket
|
||||
|
|
@ -165,6 +193,37 @@ Prune freely.
|
|||
domain tooling — the agent flake's `inputs` block pulls
|
||||
the external flake, `agent.nix` references it via
|
||||
`flakeInputs.<name>.packages.${pkgs.system}.default`.
|
||||
- **Just landed:** dashboard event refactor. New `hive-fr0nt`
|
||||
workspace crate hosts shared frontend assets (palette + terminal
|
||||
CSS + `window.HiveTerminal.create` JS) so both the dashboard and
|
||||
the per-agent web UI render their live panes through the same
|
||||
code; the dashboard's `#msgflow` now feels like the agent's
|
||||
terminal (sticky-bottom + pill + lit chrome). New unified
|
||||
`DashboardEvent` channel on `Coordinator` (replaces the
|
||||
broker-only `/messages/stream`); a background forwarder mirrors
|
||||
broker traffic onto it as `Sent` / `Delivered` variants, and
|
||||
the mutation-event variants
|
||||
(`ApprovalAdded` / `ApprovalResolved`, `QuestionAdded` /
|
||||
`QuestionResolved`, `TransientSet` / `TransientCleared`) cover
|
||||
every in-process state change the dashboard cares about. Each
|
||||
frame carries a monotonic per-process `seq`; snapshot endpoints
|
||||
return their seq alongside the state, and the terminal's
|
||||
open-buffer-then-fetch-history dance drops any buffered frame
|
||||
with `seq <= history_seq` so an event landing between subscribe
|
||||
and history-fetch is neither shown twice nor lost. Operator
|
||||
inbox + approvals + questions + transients are now derived
|
||||
client-side from the event stream (cold-loaded from
|
||||
`/api/state` for first paint, mutated live from SSE
|
||||
thereafter); `/op-send` + per-agent `/send` return 200 instead
|
||||
of 303-and-refetch. Container-list events still pending —
|
||||
`ContainerView` is sourced from external `nixos-container list`,
|
||||
so the 5s `/api/state` poll continues to drive the containers
|
||||
section. Approval diffs are now raw unified-diff text on the
|
||||
wire (per-line classification happens in JS) so they fit in
|
||||
SSE payloads without HTML escaping. Bug fix: `LiveEvent::Note`
|
||||
was a newtype variant that serde silently failed to serialize
|
||||
— converted to `Note { text: String }` (wire shape matches what
|
||||
the JS already read).
|
||||
- **Just landed:** `ask_operator` → `ask` rename + optional
|
||||
`to: <agent>` param for agent-to-agent structured Q&A.
|
||||
Recipient defaults to the operator (dashboard); peer
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue