Appearance
Conversations
A conversation in Chat is a sequence of messages between the user and a target actor. Every conversation is anchored to one target and one session ID.
Picking a target
Three ways:
- From the sidebar. The default targets list shows agents, recent conversations, and pinned mounts.
- From a deep link.
?mount=<canonical-mount>selects a target on page load. - From a slash command.
/retarget <mount>switches the active target inline (the slash list is inChatApp.ts:131-146).
The active target appears in chat-header. Its mount and componentClass are visible there. If the target is system.agents itself, you're talking to the cognitive runtime directly. If the target is a different actor (e.g., system.config), you're asking system.agents about that actor — Chat sends a snapshotTree describing the target along with the prompt.
Sending a message
Type into chat-input. Press Enter to submit, Shift-Enter for newline. Submission:
- Disables the input.
- Adds the user message to the transcript.
- Sends
$prompttosystem.agents(or toLocalConversationServicein standalone-local mode). - Receives ACK; transitions to "streaming" state.
- As
$activityframes arrive, renders thinking/tokens/tool-calls inline. - On
done, completes the message and re-enables input.
If no $activity frames arrive within a couple of seconds, Chat probes its dependencies (system.agents $ping, system.inference status.get) and surfaces "Dependency Unavailable" if they fail. See Operations: troubleshooting.
Sessions
Every conversation has a session ID, assigned by system.agents on the first prompt. After that, all subsequent prompts in the same conversation include sessionId in the payload, so system.agents can look up the transcript and continue.
Sessions appear in the sidebar (SessionPanel). Clicking a session resumes it: Chat reads session_state.read({ sessionId, key: 'transcript' }) and replays the messages into the transcript.
/clear (slash command) starts a new session — the next prompt creates a fresh session ID.
Retargeting
The /retarget <mount> command (or the retarget action in the sidebar) switches the active target. Effects:
- A new session is started.
- The transcript clears.
- New session list is fetched, scoped to the new target's
targetKey.
Retargeting is enabled by config.features.retargeting (default true).
Cancellation
The IChatConversationService.cancel({ requestId }) op fires $cancel to the prompt target. Chat exposes cancel as a button when the conversation is streaming. The actor handler is responsible for honoring the cancel — Chat just dispatches it.
Exporting
ChatExportService produces three formats:
- Markdown (
.md) - JSON (
.json) - Print-ready HTML (browser print dialog)
Trigger via /export, the sidebar export button, or chat-app.send-message with the export-chat action. Available formats are gated by config.app.enable*Export and config.features.exports.
What you cannot do today
- Branch a session. Resuming continues; there is no fork. (Per
ChatApp.ts:1452-1456.) - Switch providers mid-session. The provider is whatever
system.inferenceresolves to at prompt time. - Edit a sent message. The transcript is append-only.
See also
Source:
projects/matrix-3/packages/chat/src/ChatApp.ts:131-146(slash commands),:1207-1216(clear),:1450-1460(resume semantics),src/app/services/ChatExportService.ts.