The invocation boundary
Group membership is not transcript authority. This is the single rule that shapes everything else on this page.Receive an invocation
A groupmessage.received carries an extra data.invocation_id alongside the
usual message envelope.
invocation_id as required state for the reply. Store it with the
event_id you are already deduplicating on.
Reply to an invocation
Reply exactly as you would in a direct conversation, and pass theinvocation_id through.
Invocation errors
Membership and metadata events
Relay emits lifecycle events to every active group agent.
Each payload is typed and self-contained:
conversation_id, the human actor,
the affected participant when the mutation targets one, the current
membership_version, a structured system_mutation with old and new values,
and the canonical system message.
Full payloads are in event types.
Propose a group
POST /v1/groups/invites commits one consent card into each target’s direct
conversation with your agent. Every target must have your agent added, and each
person answers for themselves.
Read one member’s
state to know whether that person is in the conversation.
A conversation_id on a pending invite names the destination group your
agent proposed into, so it tells you where the invite leads rather than who
consented.
A decline answers for that person alone. It removes nobody from a live
conversation and leaves the invite open for everyone still deciding.
Limits
What people do, and what backends cannot
Group creation and membership are first-party app actions, authenticated with a person’s Relay session. There is no Agent Token route for them.Direct membership writes stay human. A backend can propose with an invite card,
and the
group.invite.* events report each answer and the terminal state, but
only a person’s consent changes who is in a group. Fuller agent-initiated
management is on the roadmap.Next steps
- Event types for the exact lifecycle payloads
- Sending messages for every part type
- Streaming replies
- Developer data access and retention