7.1 KiB
Eve Dashboard
Objective
Use EveCanvas as a native operator dashboard substrate: Mimir, StreamPixels, and other local/Yggdrasil-routed apps can publish retained dashboard trees while Eve renders the control surface locally and sends edit intents back. Eve does not own final composition or run remote UI code.
Authority Map
- Owner: each dashboard provider owns its accepted state and command handling. The Starfire broker owns provider discovery/routing. EveCanvas owns native rendering, hit-testing, and touch affordances.
- Inputs: Eve sends
select,move,scale,rotate,toggle-visibility,reset-transform, andopen-providercommands over/eve/deck. - Outputs: providers send
dashboard-statesnapshots with provider id, title, nodes, health, visibility, dimensions, transform, selected node, and LUT preset. Provider catalogs are exposed at/eve/deck/providers. - CultUI-shaped surface: providers may also send
surface, a retained composition tree for Eve clients.nodesremains the semantic compatibility projection;surface.rootowns composed layout primitives such as workspaces, rails, panes, cards, avatars, text, metrics, lists, and command ids. - Derived state: Eve's UIKit panels are local render projections of Mimir state/provider state.
- Forbidden writers: Eve gestures do not mutate program layout directly; they request changes and then re-render the accepted snapshot. Remote apps do not ship arbitrary JavaScript or native code into Eve.
- Cut line: no camera-stream fanout to Eve for the dashboard. Source previews may be added later as thumbnails/proxies, but dashboard control must not require Starfire to render every camera feed for the iPad.
- CultMesh line: dashboard manifests and states now have typed
mimir.eve_dashboard_manifest.v1andmimir.eve_dashboard_state.v1document shapes. The live iPad lane remains WebSocket/TCP because it is the proven transport and works over SSH tunnels; CultMesh should mirror compact state where the local mesh substrate is available.
Runtime
Start the dashboard server:
dotnet run --project .\src\Mimir.EveDashboard\Mimir.EveDashboard.csproj -- --port 8795
EveCanvas connects to:
ws://192.168.1.66:8795/eve/deck
Periwinkle's Android Eve client uses the binary CultMesh lane:
ws://192.168.1.66:8795/eve/deck/cultmesh
The compatibility endpoint remains:
ws://192.168.1.66:8795/eve/dashboard
Broker inspection endpoints:
http://192.168.1.66:8795/health
http://192.168.1.66:8795/eve/deck/manifest
http://192.168.1.66:8795/eve/deck/providers
ws://192.168.1.66:8795/eve/deck/{providerId}
Extra providers can be registered at launch:
dotnet run --project .\src\Mimir.EveDashboard\Mimir.EveDashboard.csproj -- `
--port 8795 `
--voidbot-swarm-state "E:\Projects\VoidBot\.voidbot\status\swarm-state.json" `
--provider "app.id|App Title|ws://127.0.0.1:14000/eve/deck"
Current State
Mimir.EveDashboard now runs as a small native dashboard broker. It includes:
eve.dashboard.broker: the switchboard rendered as provider cards.mimir.live.stats: compact live telemetry surface for RMS bars, sync confidence, runtime buffers, actuator commands, and Periwinkle/EVE device observation streams. It recomputes state from Mimir's telemetry and observation ledgers and is broadcast once per second to connected clients.mimir.stream.layout: the existing Mimir source-layout fixture provider.voidbot.swarm: the native VoidBot tab. It reads the existingswarm-state.jsonprojection from VoidBot, publishes avatar image URLs on identity nodes, and lets Eve render the CTB rail, selected Face status panel, state tree, and detail pane as native UIKit. It is read-only in this cut; scheduler mutations still belong to VoidBot's heartbeat controls.yggdrasil.streampixels.edge: the first Yggdrasil/StreamPixels service dashboard placeholder for the TCP/SSH-routed live edge.
The stream-layout provider still serves fixture scene nodes for the first native
control proof. It accepts transform/visibility commands, mutates the provider
state, increments the state version, and broadcasts the new snapshot. The next
cut is replacing fixture state with live MimirPresentationControlState and
MimirSceneEditorState snapshots.
The live-stats provider is read-only. Its authority is the runtime telemetry
surface: mimir-spectrum, mimir-sync-state, mimir-sync-report,
mimir-video-buffer, mimir-audio-actuator-command, and the normalized
CultMesh observation ledger from Mimir.EveSensorReceiver. If a signal is
absent, the surface says so; it does not fabricate confidence.
Verification
The command smoke connected to /eve/dashboard, received state version 1,
sent:
{"type":"move","nodeId":"eve-camera","x":0.25,"y":-0.25}
and received state version 2 with eve-camera moved to that transform. During
the same smoke, EveCanvas connected from 192.168.1.72 and remained running.
The first device screenshot proved the dashboard rendered on Eve, but also showed the legacy debug overlay occluding the hierarchy panel. EveCanvas hides that overlay while dashboard mode is active; dashboard status remains in the native dashboard footer.
The broker smoke on 2026-05-31 verified:
/healthreports active provider, client count, transport, and typed CultMesh dashboard document name./eve/deck/providersreturns the built-in provider manifests.- WebSocket
/eve/decksends the switchboard snapshot. - WebSocket
/eve/deck/cultmeshsends the same provider state asmimir.eve_dashboard_state.v1MessagePack and acceptsmimir.eve_dashboard_command.v1MessagePack command documents. open-providerswitches tomimir.stream.layoutand broadcasts that provider state.open-providerswitches tovoidbot.swarm, which emits VoidBot's swarm status, CTB rail with avatar URLs, agent cards, and selected Face state detail from the existing VoidBot swarm snapshot.
Surface Composition Contract
dashboard-state.surface is the new distributed UI layer. It is intentionally
closer to CultUI than to the old flat dashboard node list:
surface.schema: versioned wire contract, currentlycultmesh.eve_surface.v0.surface.root: retained element tree. Elements havekind, optionalrole, text, asset refs/URIs, provider command ids, layout hints, style variants, metrics, and children.surface.assets: cacheable media references such as avatar images.bindNodeId: optional bridge back to the compatibilitynodesprojection.commandId: provider-owned intent id. Eve clients invoke commands; providers accept or reject and publish the next snapshot.
The old nodes array is no longer expected to carry complete UI composition.
It is a compatibility/debug/data surface. Clients that understand surface
should render the composed tree first and use nodes only for selection,
state-path binding, and fallback.
The binary CultMesh state document mirrors this ownership: field 7 carries the
optional surface tree. Older clients can stop at the node projection; current
Eve clients should prefer surface.root whenever it is present.