Skip to content

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 a snapshotTree describing system.config along with the prompt. system.agents uses 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.agents along 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.inference resolves 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.agents config).

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).