Repository navigation
v0.6.0
spec/openapi.json is https://api.snaga.ai/api/v1/openapi.json normalised
by python3 -m json.tool, which is what scripts/update-spec.sh writes.
Earlier entries quoted a sha256 of the served bytes; this one does not,
because the vendored file is no longer those bytes. The identity that means
something is the canonical digest — sorted keys, no whitespace —
d281e0b33c55a670, which is exactly what check-spec-freshness.sh compares
and what the release refuses to proceed without. Build d19c367e
(uarp #456–#477). Against 0.5.24 (the last release published to any
registry): 709 → 723 operations (+14, none removed), 142 with a changed
shape; 271 → 352 schemas (+81, one member removed — see below), 31 with a
changed shape.
This tag is cut a second time. v0.6.0 was first tagged on 2026-09-12 from
a tree whose generated TypeScript did not compile (agents.ts had a string
cursor reaching a number parameter) and whose generator goldens still said
0.5.24; every job of the release run failed before its publish step, so
npm, crates.io, Maven Central and the SwiftPM mirror never saw it — 0.5.24
remained the latest everywhere. Nothing consumed the number, so the number
is reused rather than burned. The tag now points at a tree that compiles.
Removed — one field, and it is a breaking change
Invite.secretis gone from the schema (uarp #471). The accept token is
not something an administrator reading the invite list is given; only the
invitee's own link carries it. Code that readinvite.secretcompiled
against 0.5.24 and does not compile here — that is the whole of the
breakage in this release, and the reason to read the note before bumping.
Added — the Drawings surface (uarp #472, stage 1)
- Nine paths and twelve operations:
GET|POST /sessions/{sessionId}/drawings,
GET|DELETE /drawings/{drawingId},GET|POST /drawings/{drawingId}/ops,
GET /drawings/{drawingId}/render,
GET /drawings/{drawingId}/tiles/{layerId}/{tx}/{ty},
POST /drawings/{drawingId}/masks,GET /drawings/{drawingId}/masks/{maskId}
and its/content.listSessionDrawingspages on the list convention. - Eight schemas:
Drawing,DrawingLayer,DrawingOp,DrawingBrush,
DrawingMask,DrawingStrokePoint,DrawingSelectionShape,
DrawingJournalEntry.
Added — deletions the API grew
DELETE /sessions/{sessionId}/branches/{branchId}(uarp #472).DELETE /runs/{runId}/feedbackand
DELETE /sessions/{sessionId}/runs/{runId}/feedback(uarp #474, #477):
a reaction can be taken back, and the feedback reason now comes back on
the read rather than only on the write.
Changed — the versions cursor is an opaque string
GET /agents/{agentId}/versions:cursoris a string, in the request and
in the answer, where the first draft of this paging made it the version
number (uarp #471). Treat it as opaque and pass it back unchanged. No
published release ever carried the integer form — it existed only in the
0.6.0 tag that failed to publish — so for anyone upgrading from 0.5.24
this parameter is simply new.
Changed — typed responses (121 operations, 73 new schemas)
- Operations that decoded to a bare object now have a model: the whole
admin/configfamily (Auth, Guardrails, FeatureFlags, RateLimits,
Retention, SSE, WorkerPool, ToolSecurity, LlmAdapters, Logging,
CodeInterpreter, RunCommand, Stripe, Smtp…), admin audit, marketplace
reviews and subscriptions, company objectives and activity, workspace
trash, activity-stats, public states and agents, team-run messages.
Changed — types
Error:titleis an enum of the twenty HTTP reason phrases (422 is
"Validation Error"),detailis required,codeis the machine code.ConversationEntry.message_idis required — the derived id of every
transcript entry ({run_id},{run_id}-reply[-N],{run_id}-user-N,
{run_id}-tool-N,{run_id}-system-N), the canonical key for reactions,
bookmarks and annotations;contentis a string on v1. The session detail
(Session.conversation_history) carriesmessage_idtoo.ConstitutionRule.advisory(true when no code path can raise the rule;
onGET /governance/constitutionand/governance/obligations/{agentId})
andobligated_action.TenantOverview: nine members are optional —usage,cost,system,
runs.cost_24h_usd,fleet.top_by_cost,fleet.by_execution_mode,
fleet.bridge,fleet.head_agent_id,schedules.at_risk. v1 still
serves all nine; readers must tolerate absence.- Additive fields on
Agent,AgentUpdate,RunMetrics,Session,
Company,A2ATask,PublicSessionView,PublicAgentCard
(tenant_slug,tenant_name),PublicState,RunCheckpoint,
McpServer*;RunOutput.search_sources. AgentVersion.changelognames the eleven values the server writes.
Added — parameters and fields
GET /agents/{agentId}/versions:limit,cursor,fields=summary;
withlimitthe answer carriescursorandhas_more(the document's
list convention). Withoutlimitthe answer is unchanged.GET /governance/ledger:category,action(they filter now).POST /admin/config/stripe/testsuccess:active_key_matches(required)
andwarning— whether the billing manager serving checkout holds the
key the panel stores;livemodeis derived from the key prefix.PUT /workspaces/{workspaceId}/files:If-Match/If-None-Match;
the 412 isErrorplus an optionalcurrent_etag(absent when the file
does not exist).
Documented — what the wire always did
PUT /admin/config/stripebody: omit = unchanged, empty string = clear,
a redacted read-back is ignored.- Billing
return_url/success_url/cancel_urlaccept the app scheme
(snaga://) beside same-origin URLs. - The public chat's 401 and 410 carry the bare fact
"This conversation has expired." message_idon feedback, bookmarks and annotations is stored as sent; a
non-canonical one is counted, never refused.- Workspace move/copy/overwrite and what they do to
file_id.