Memory
Identity-scoped, audited storage that survives a run. Backend-pluggable; the shipped reference adapters get out of the way once you have a real backend.
Identity-scoped, audited storage that survives a run. MemoryClient wraps any Memory backend (SessionMemory, FsMemory, your own Postgres / Redis / vector DB) with a capability check and audit events on every read and write.
from entorin.memory import FsMemory, MemoryClient
memory = MemoryClient(backend=FsMemory(Path("memory_root")), bus=bus)
prefs = await memory.get(ctx, "cross_run", "prefs") # memory.read
await memory.put(ctx, "cross_run", "prefs", {"theme": "dark"}) # memory.write
Scopes
Two tiers: session (alive for the run only) and cross_run (survives across runs, scoped per principal). Capabilities are memory.session and memory.cross_run. Per-key gates are out of scope — wrap your own Memory impl if you need them.
Reference adapters
SessionMemory— in-process dict, no persistenceFsMemory— JSON-per-key on the filesystem
Both exist to get out of your way: implement the four-method Memory protocol against your real backend and MemoryClient wraps it the same way.
What the control plane does not ship
Vector DB bindings, embedding pipelines, retention policies, GDPR delete cascades. Those live in your backend.