Shared across agents
Agents under the same owner hand their sessions into this one store, and extraction runs on the hub; everyone can query it, keep building on it, and pick up on another device.
The hub needs no agent of its own; every device runs one local node. The standby catches up in replication sequence row by row, and may take over only after the checks pass; takeover rotates the credential generation, so anything the old hub sends afterwards is rejected outright. Click the blocks below to see what each one actually holds on disk.
Thin lines are data flow; the small bright dots running along them are one unit of data in flight. Select a block and the inspector lays out its actual structure on disk.
The hub and the node are each one directory. The ledger never leaves the hub, keys never enter the model, and no backup hides a private key in plaintext — those three rules shape the whole operating posture.
| ├transcript.db | Raw transcript, append-only; one row per turn, never overwritten |
| ├memory.db | The memory body: 25 formal core tables + 7 side tables (schema v6): conclusion rows, entity rows, sources and audit |
| ├core.db | The agent's own encrypted notebook: one per agent, three encrypted tables for body / revisions / notes |
| ├keys/ | An independent key per core notebook (32 bytes), never exposed through agent tools |
| ├ledger.db | Ledger, quota, progress bookmark —never leaves the hub |
| ├backups/ | Raw transcript, memory and manifest — three pieces, the last 7 sets kept |
| ├hub.key | Hub private key; hub key export writes an encrypted archive |
| └secrets.enc | Secret box; the passphrase that opens it is stored separately and does not travel with backups |
| ├device.key | Node private key: the root of pairing and signing |
| ├replica/ | The read-only replica and search index downloaded in full; this half is read-only and never rewritten |
| ├pending.db | What accumulates locally while disconnected; local distillation batches after a full day offline are written here |
| ├dr/ | Hourly self-backup once detached from the hub (five full days offline); unconfirmed data is never deleted |
| └node-state.json | Synced, offline, self-hub — three states recorded here |
Readings carry no text and no paths — the ops surface only answers "is anything stuck", and moves no content.
The model sees only [e12] — a short handle. A handle is the number in front of a recall result; holding it gets that memory back. The full locator is left to the program. Each of the seven IDs has one job: which one is the real identity, which is only a serial for humans, and which exists only for machine-to-machine sync.
How to read it: the bar insha256(a | b) means "concatenate, then hash"; a trailing ? means the field is optional.
In one line: the model sees only handles, identity is the hash; the sequence is for humans, the replication sequence for machine sync.
Five write and pairing endpoints stay up; the four transcript reads go only to paired devices; the downstream snapshot appears at publish time. The less we expose, the more precisely we can say what it promises.
| Endpoint | Method | Notes |
|---|---|---|
| /v1/pair | post | Pair a device with a single-use code |
| /v1/challenge | post | Have the device sign, proving it is itself |
| /v1/ingest | post | Write a batch of events with a signature, rejecting duplicate submission |
| /v1/rows | post | Send back rows accumulated offline; the snapshot pull is allowed only once the hub answers 200 |
| /v1/state | get | Sync progress and hub state |
| /v1/snapshot/memory | get | Download the full memory snapshot (at publish time) |
| Transcript reads · paired devices only | ||
| /v1/transcript/sessions | get | The list of every visible session on the hub |
| /v1/transcript/session | get | Replay turn text by session, with paging |
| /v1/transcript/search | get | Search the hub's full-text index for the words as they were said |
| /v1/transcript/turn | get | Fetch the target turn and up to 10 turns either side by turn_uid |
Two more exist: the backup replication surface /v1/replicate* , and the endpoint read only during pairing /v1/identity; both are used only at takeover or pairing, not on the day-to-day device path.
The above is an illustrative call sequence; for real readings trust this machine's --help and index status instead.
Same device, same LAN, remote site — three ways to connect over the same pieces, with no second service deployed for "remote". It runs inside a trusted private network by default: for a remote site, pull both machines into one private network with a tunnel or mesh, and never expose the port to the public internet.
Runs with no remote at all: ingest, extraction and recall all happen here.
One LAN address in the device address book; the node tries them in order and goes with the first that connects.
Add one more entry to the address book; the last successful one goes first, so changing networks does not wait out a dead path.
The default is a trusted agent environment: paired devices on the same LAN count as insiders. World memory is shared; core stays per agent.
Agents under the same owner hand their sessions into this one store, and extraction runs on the hub; everyone can query it, keep building on it, and pick up on another device.
Each agent's encrypted notebook has its own key; core_* opens only to that one agent identity, and no other agent can reach it.
Raw text stays on the agent side and the hub; shared memory stores a turn_uid pointer, not the raw text. recollect_turn fetches that turn by pointer (up to 10 turns either side), recollect_session replays a session; both pass through the same visibility gate.
The edge asks the hub's four transcript routes first; only when the hub is unreachable does it read locally, marking the receipt with source=local + degraded — never pretending the hub had zero hits.
Default premise: paired devices on the same LAN are trusted — if it can pair in, it can read hub sessions, with no further split by owner. This LAN trust applies only to transcript reads; world memory and core keep their original gates. Do not pair in untrusted devices, and do not expose the hub to the public internet; for a remote site, use a tunnel or mesh to pull the machines into one private network.