Identity
Users are identified by a stableusername (lowercase alphanumeric, dots, hyphens, 1–64 chars). Multiple transport identities can map to a single username, so the same person on Slack and Telegram resolves to one user.
Platform IDs follow the format transport:platform_id:
Roles
Theadmin role is built-in and hardcoded. It grants access to all agents and admin-only tools like manage_users. Defining admin in the config roles block is a validation error.
Custom roles are defined in operator.yaml and map to agent access:
Auth Flow
On every inbound message:- Resolve
platform_idtousername - Resolve
usernametoroles - Resolve
rolesto allowed agents - If the user is unknown or not allowed for the target agent, reject
settings.reject_response:
| Value | Behavior |
|---|---|
"ignore" | Silently drop the message (default) |
"announce" | Reply with a rejection message |
operator user add.
Auth applies to transport messages only — jobs bypass auth entirely.
Memory Scoping
User memories are keyed byusername, not platform ID. This means memories persist across transports — talk on Slack, memories available on Telegram.
Managing Users
CLI:manage_users tool (admin-only).
Role-Gated Tools
Some tools require a specific role to execute. Currentlymanage_users requires admin. The tool stays visible to the LLM but execution is blocked for unauthorized users.