Conversations
Conversations are the containers for messages. Every conversation lives inside a task. There are two minting paths:- Server-side, on
agent/task/requestaccept. Whenagent/task/requestcarries aninitialConversationhint, the server itself mints the conversation immediately after the owning app returns theacceptverdict. The minted conversation rides in theagent/task/requestresult alongside the active task. - App-driven, post-task. After a task is active, the owning app
mints additional conversations via
app/conversation/create. This path is app-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 app via theapp/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
agent/task/request; the server mints
it server-side after the owning app accepts and returns the minted
conversation in the agent/task/request result. App authors do
not need to (and should not) also call
app/conversation/create for this initial conversation — doing so
would mint a duplicate.
For additional conversations after the task is active, the app
itself calls
app/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.