0.6.6
A patch to @silverprotocol/core, @silverprotocol/openai-agents and @silverprotocol/google-adk. The wire vocabulary is untouched (AGJSON_VERSION stays 1.0.0-draft.3), no peer versions moved, and @silverprotocol/claude-agent-sdk, @silverprotocol/vercel-ai and @silverprotocol/richtext change only their version number.
Core: two reducer conformance fixes
- A late delta for a message the
Reducerhas already sealed no longer attaches to it. A text, reasoning, opaque-reasoning or tool-argument delta whose block belongs to a sealed message now setsneedsResync, as block-creating events already did (SPEC.md INV-MSG). A delta for a block the reducer has never seen behaves as before. If your stream delivers deltas aftermessage.end, you will now see a resync instead of a message that grew after it closed. - A final
tool.donethat follows a preliminary one (more: true) now keepstoolMetadataanddynamic. Until now only the first delivery carried them into the folded result.
OpenAI Agents SDK: reasoning as a first-class block
- Reasoning now folds as a first-class
reasoningblock. The Agents SDK reports a reasoning item only after the response completes, so until now it reached AgJSON only asext.openai.late-reasoning. The block now opens where the item appears on the wire, ahead of the function call it precedes, and is filled from the completed response: OpenAI re-encrypts a reasoning item at each stage, and only the final copy is valid to send back when you replay the conversation. message.start.modelis filled fromresponse.created, so the folded message records the model that answered.- A built-in tool call that OpenAI runs itself now carries
providerExecuted: trueontool.start, so a client that relays tool calls knows not to run it again. - An assistant message’s
phase(for example, commentary versus the final answer) now also ridestext.startinproviderMetadata, so it is known before the first delta.text.endcarries it as before.
Google ADK
- Streaming block ids no longer repeat within a turn. Each id is now a per-turn count for its kind, not the part’s position in its event, so two thinking events in one invoke no longer both open
reasoning:0. The first block of each kind keeps its old id. - A workflow’s pause closes its turn as paused. A nested model node’s final answer no longer closes the whole invocation turn, so a later request for input lands on an open turn instead of making the
Reducerresync. hitl.askfor an authentication pause fills the spec’sauthConfigfield: the scheme, and the authorization URL, token URL and scopes where ADK provides them.displayNameon inline data and file data is carried: as thefilenameof a file block, inproviderMetadataon image and audio blocks, and alongside a resource link.- Events that carry JSON
nullwhere the genai types say a field is optional (for example, session payloads serialized from Python) no longer throw or produce output the schema rejects. - Hardens how authentication objects from ADK are carried.
The compatibility tables on each npm page are unchanged.