0.10.0

AgJSON draft.7: an ADK pause closes at the invocation's end, on every host

A minor release that ships spec revision 1.0.0-draft.7 (AGJSON_VERSION). It’s a fix: a Google ADK pause that more of the same invocation follows no longer parks the fold, whether or not the host sends the completion event. This lands the bare-host fix the 0.9.0 note said would come in the next minor. No field’s meaning changes.

Google ADK

  • A paused turn closes at the invocation’s end, on every host. A credential or input request doesn’t have to end an ADK invocation. More of that invocation can follow the pause: the model runs again after a usage-only report (including through ADK’s SSE streaming path), an after-agent callback adds content, or a SequentialAgent root moves to its next sub-agent. That output belongs to the paused turn. The paused close is now the turn’s last event: from push() on the host-completion event when you use hostCompletion, otherwise from flush(). Before, a host without hostCompletion got the paused close at the pause, the later output landed after it, and the fold parked. The 0.9.0 note listed this as a known limit.
  • What a host sees differs from 0.9.0 in three ways:
    • Without hostCompletion, the paused turn.done now arrives from flush(), after the invocation’s other events, instead of at the pause. Only the terminal moves: each hitl.ask arrives where it did. A host may act on a live hitl.ask before the terminal; the paused record in turn.done stays the durable declaration.
    • The paused turn’s usage covers the invocation’s later rounds.
    • A turn that holds an ask when the stream ends, with no pause signal seen, still closes as turn.abort (stream-truncated), never as paused.
  • Correction to the 0.9.0 note. It said ADK ends the invocation at a tool confirmation. That holds for the pausing agent’s own run, but a confirmation in a SequentialAgent sub-agent that isn’t the last one is still followed by the next sub-agent’s output in the same invocation. So the rule above covers every pause kind, confirmations included.
  • Still host-completion-only: two shapes of a completed, not paused, run. Without hostCompletion, a SequentialAgent root outside ADK’s Workflow plane, or an after-agent callback that appends content after a success close, lands after the in-band terminal and parks the reducer.
  • Every recorded stream serializes byte-identically. Only the engine fixtures whose invocation outlives the pause change: they now fold clean without the completion event.
  • Known limit, unchanged: under ADK’s SSE streaming mode, ADK’s closing usage report repeats the call’s usage, so a turn’s summed usage can count that call twice. Because a paused turn now sums the invocation’s later rounds on every host, this can show on a paused turn too.

Spec: AgJSON 1.0.0-draft.7

  • The ADK paused close moves to the invocation’s end (§8.0 item 26): from push() on the host-completion event, otherwise from flush(). INV-FLUSH (2) now releases a turn whose pause was signalled as paused at flush, and a turn with no pause signal still closes as a truncation. INV-TURN, §8.0 “Ids across invokes”, item 12 and §10 items 25 and 40 read accordingly. §7 says a host may act on a live hitl.ask before the turn’s terminal.
  • Every recorded cassette serializes byte-identically. Six engine fixtures that parked on hosts without the completion event now fold, and a paused turn’s usage covers the invocation’s later rounds.
  • This is a defect fix: a fold that parked now closes, and no field’s meaning changes.

draft.6 envelopes remain accepted (same major, §12).

@silverprotocol/core

  • AGJSON_VERSION is 1.0.0-draft.7.
  • The producer API is marked @beta in the type declarations. That covers StreamAssembler and its field types, AssemblerCheckpoint, withAtomicPush with its options and error constants, and the JSON-safety helpers. The wire vocabulary and the consumer API stay unmarked, including Normalizer and ToolOutcome. Nothing changes at runtime.

Wire version

1.0.0-draft.7. Replaying the 77 recorded streams through the 0.9.0 and 0.10.0 packages, output is byte-identical for every one: Claude Agent SDK 30 of 30, Google ADK 24 of 24 (with and without the host-completion event), OpenAI Agents SDK 15 of 15 and Vercel AI SDK 8 of 8. No recorded stream has a pause its invocation outlives. The other framework packages change only their READMEs’ wire-version line, and @silverprotocol/richtext is unchanged apart from its version.

npm’s provenance for the 0.10.0 packages names typescript-sdk commit 4fd5a02a, one commit after the v0.10.0 tag, which changes only a repository check script outside every package; the package contents are identical.