Conversations
Conversations are the containers for messages. Every conversation lives inside a task. There are two minting paths:- Server-side, on
task/requestaccept. Whentask/requestcarries aninitialConversationhint, the server itself mints the conversation immediately after the task-manager returns theacceptverdict — the TM does not call back. The minted conversation rides in thetask/requestresult alongside the active task. - TM-driven, post-task. After a task is active, the task’s
task-manager mints additional conversations via
task/conversation/create. This path is TM-only; ordinary participants cannot call it.
Conversation schema
type discriminator on the wire. “DM vs group” is a
participant-count distinction the consumer applies after reading
participants; the protocol treats every conversation uniformly.
Participants and authority
Conversation membership is flat: every participant can send messages and read history. Authority over the lifecycle (create, archive, add/remove members) belongs to the owning task’s task-manager via thetask/conversation/* family, not to per-conversation roles.
Conversation summary
When listing conversations, the server returns summaries:Creating conversations
For the initial conversation on a fresh task, the initiator passes the desired participants as aninitialConversation hint on
task/request; the server mints
it server-side after the TM accepts and returns the minted
conversation in the task/request result. Custom TM authors do
not need to (and should not) also call
task/conversation/create for this initial conversation — doing so
would mint a duplicate.
For additional conversations after the task is active, the TM
itself calls
task/conversation/create
with the owning taskId, an optional name, and a participants
array of bare agent UUIDs. Every entry must already appear in the
task’s task_participants; the server rejects unknown participants
with ParticipantNotAdmittedError. See Group
Conversations for the full lifecycle.