Thin intake clients that stream interaction evidence from spatial-computing sources into Bevia. Clients capture evidence only — Bevia performs all reconstruction and understanding downstream (Sensor / Brain doctrine: these are sensors; the engine is the brain).
Two clients live here:
| Client | Source | Run |
|---|---|---|
| Mentra capture | Mentra-glasses transcription + spatial context (scaffold; mock streams included) | npm run dev |
| ShipMemory poller | A ShipMemory/Auki bridge (Shipmemory-auki) — assets' ContextCards + session history | npm run shipmemory |
Polls a ShipMemory bridge read-only over its published protocol
(GET /card, GET /session/:asset_id/transcript, ?key= auth) and lands:
- each asset's ContextCard (the authored "should") as a single-turn
capture on thread
card:<asset_id>, re-emitted only when its content hash changes; - each session (the observed "did") as one conversation capture per
(asset, session)— roles mapped to speakers (user→operator,assistant→ai), event-time timestamps preserved, opaque tool-dispatcher entries landed verbatim as JSON text (captured, never dropped, never interpreted here); - an ADR-0228 location on every capture:
{ provider: 'posemesh', domain_id, anchor_id: <asset_id>, label }.
The live Oneshot loop is untouched — this client only reads. Sessions that grew overwrite their own deterministic file; the engine's content dedup absorbs replays, so losing the state file is always safe.
SINK=drop(default): writes*.bevia-capture.jsoninto a folder the Bevia desktop app watches. The file's content IS the/intake/capturebody (ADR-0227 path 2) — zero auth, fully local-to-local.SINK=post: POSTs the same body toBEVIA_INTAKE_URLwith a bearer token, for a paired-LAN or cloud engine.
cp .env.example .env # fill SHIPMEMORY_BRIDGE_URL + SHIPMEMORY_API_KEY
npm install
npm run shipmemory # continuous; ONCE=1 for a single passPoint DROP_DIR at a folder your Bevia desktop app watches and the map
starts forming from the bridge's history on the first pass. The bridge
keeps at most ~500 entries per asset (a ring buffer); the poller warns
(tick.ring_buffer_gap) if history is falling off faster than it polls.
npm run check-bridge -- --base http://localhost:8080 --key YOURKEYRead-only conformance check for bridge operators: it hits the same two
endpoints the poller reads and reports what will land cleanly and what
won't — rejected key vs. unreachable, cards without ids (skipped),
entries without created_at (event time lost), sessions without ids
(blurred), ring-buffer coverage, and whether history is append-only
(safe for watermark polling). Exit 0 = READY. Run it on the bridge
side; no Bevia engine needed.
The original scaffold: chunked transcription + spatial context batching
with buffering and a dry-run mode. See src/ (capture/, transcription/,
spatial/, buffer/, upload/). Mock streams let it run with no hardware.