payload:unknown// typically an object; can be any JSON value.
// Per-type schemas are documented per event below.
}
sequence is allocated by the sidecar via an atomic counter; consumers
(api subscriber, browser tail) dedup on (session_id, sequence) because the
counter resets to 0 if the sidecar restarts mid-session.
Durable copy of events, when useJetstreamPublish=true (Wave 3 of rfcs/jetstream-migration.md).
x1.session.{id}.presence
api → sidecar
Liveness pokes; sidecar POSTs /keepalive on the agent.
x1.provider.{domain}.*
sidecar → provider
Request/reply for graph/vector/messaging/calendar/docs/email/files.
x1.provider.preview.provision
api → preview provider
x1.image.build
api/api-internal → in-process image-builder
Workspace image build trigger.
x1.audit.>
provider → api
Provider-side audit publishes.
x1.orchestration.>
api → orchestrator children
Reserved per NATS ACL; in flight.
There is nox1.session.{id}.proxy.* or x1.session.{id}.lifecycle.* family today; the credential-proxy uses HTTP between agent and sidecar, and lifecycle events ride the events subject as type: session.started/completed/failed.
Posted once by the agent on boot. See packages/agent/src/run.ts:367.
session.completed
{ ... }
Posted once at clean shutdown. The session summary is computed by the api summarizer and stored in sessions.summary — it is not carried in the event payload.
The previous draft of this page documented permission.request/permission.grant events with challenge_id/approval_token fields. Those do not exist in v1 — the agent emits agent.permission_request, the user grants/denies via the api’s HTTP grant routes (/api/workspaces/:slug/grants), and a synthetic user.message re-wakes the agent.