Appearance
Agents
User-facing language varies. In Matrix terms, an "agent" is the combination of:
- A target actor (any promptable mount).
- A session (state held by
system.agents). - An inference provider/model (resolved by
system.inference). - A memory scope and system prompt (declared by the target's
cognitiveState).
Chat does not have a separate "agent picker". The "agents" you see in the sidebar are usually pinned mounts (or recent conversations) that happen to be promptable.
Talking "to" an agent vs "about" a target
When the user asks Chat a question, the prompt always goes to system.agents (in remote-actor mode). The difference is whether system.agents is also the target of the conversation:
- Talking to system.agents directly. Target =
system.agents. The cognitive runtime answers as itself. - Talking about another actor. Target =
system.config(for example). Chat sends asnapshotTreedescribingsystem.configalong with the prompt.system.agentsuses the snapshot to give a model context to answer "what does this do".
The target is recorded as targetKey in the session record. $sessionList filters by targetKey so the sidebar shows only sessions for the active target.
Agent identity vs principal identity
Two identities flow through every prompt:
- principalId — the user asking. Comes from
IChatIdentityService. Used for ACLs, billing, session ownership. - callerMount / callerRealm — the actor that originated the prompt. For Chat that's
chat(or whatever mount the chat instance is at).
system.agents may use either to scope memory, sessions, or budgets. Chat's job is to fill them in correctly.
The promptable badge
A target is "promptable" if $introspect returns promptable: true. Chat's UI may disable the input or hide the agent target if a non-promptable mount is selected. The Director-side Sessions tab shows an explicit "not promptable" message in that case (TabSessions.ts:94).
promptable is a declarative field — actors set it on their class. There is no automatic detection; if you author an actor and want users to converse with it, declare promptable: true and an on$prompt handler.
What an agent does NOT mean in Chat
- It is not a separate process or container. The "agent" runs inside
system.agentsalong with all other sessions on that runtime. - It is not provider-bound. The same agent target can use different providers across sessions; the provider is whatever
system.inferenceresolves at the time of each prompt. - It is not Chat-owned. Chat does not configure the agent's system prompt, memory scope, or skills. Those live on the target actor (or in
system.agentsconfig).
Director's "promptable actor" surface
In Director's Explorer Mode, every promptable actor in the tree has a small "P" badge. Clicking it and opening the Chat tab routes through the same call chain documented here. From the user's point of view, "talking to a Director-selected actor" and "running Chat against a target" are the same operation.
See also
Source:
projects/matrix-3/packages/chat/src/ChatApp.ts(target/session handling),chat/src/contracts/IChatConversationService.ts(the single contract that defines the agent service).