Skip to content

v0.6.0

Choose a tag to compare

@github-actions github-actions released this 14 Sep 14:20
· 47 commits to main since this release
e9ce403

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.secret is 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 read invite.secret compiled
    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. listSessionDrawings pages 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}/feedback and
    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: cursor is 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/config family (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: title is an enum of the twenty HTTP reason phrases (422 is
    "Validation Error"), detail is required, code is the machine code.
  • ConversationEntry.message_id is 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; content is a string on v1. The session detail
    (Session.conversation_history) carries message_id too.
  • ConstitutionRule.advisory (true when no code path can raise the rule;
    on GET /governance/constitution and /governance/obligations/{agentId})
    and obligated_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.changelog names the eleven values the server writes.

Added — parameters and fields

  • GET /agents/{agentId}/versions: limit, cursor, fields=summary;
    with limit the answer carries cursor and has_more (the document's
    list convention). Without limit the answer is unchanged.
  • GET /governance/ledger: category, action (they filter now).
  • POST /admin/config/stripe/test success: active_key_matches (required)
    and warning — whether the billing manager serving checkout holds the
    key the panel stores; livemode is derived from the key prefix.
  • PUT /workspaces/{workspaceId}/files: If-Match / If-None-Match;
    the 412 is Error plus an optional current_etag (absent when the file
    does not exist).

Documented — what the wire always did

  • PUT /admin/config/stripe body: omit = unchanged, empty string = clear,
    a redacted read-back is ignored.
  • Billing return_url / success_url / cancel_url accept the app scheme
    (snaga://) beside same-origin URLs.
  • The public chat's 401 and 410 carry the bare fact
    "This conversation has expired."
  • message_id on 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.