1
Channel adapters
One connector per service (WhatsApp, Telegram, Discord, Signal, Slack, the terminal REPL, and others). Each adapter turns a raw inbound event into a normalized message and, crucially, stamps it with a stable sender identity — usually a phone number or platform user id.
2
The gateway
A single always-on process that binds every adapter together. It resolves senders to users, enforces access and quotas, manages concurrency, routes outbound replies, and writes the audit log. Multiuser mode lives here.
3
User resolver
A mapping from channel contact → internal user key. First contact triggers provisioning: the user is created, assigned a role, and asked to be granted access before they can drive an agent.
4
Per-user agent instances
A user's agent is created on demand from their own context and torn down when idle. Each turn is scoped to that instance, so one user's running task never bleeds into another's.
5
Namespaced memory
Histories, notes, and memory snapshots are stored under a per-user key (for example memory/u/<user>). What one user teaches the agent is invisible to every other user.
6
Skills, tools & MCP
Capabilities are attached per user, filtered by role. A user whose role allows it may invoke skills and Model Context Protocol tools; a restricted user sees only the safe subset.