0.6.2
The second cohort from the weekly maintenance sweep, and the first one whose headline is a bug we shipped rather than a peer that moved. One wrong mapping is corrected, four upstream signals get a lossless home, and the @openai/agents peer ceiling opens so installing the latest no longer warns. The wire vocabulary is untouched — AGJSON_VERSION stays 1.0.0-draft.3.
Fixed: a failed OpenAI response could close as a successful turn
@silverprotocol/openai-agents declared the response.completed event’s status as "completed" | "incomplete". The wire is wider than that: openai-node types ResponseStatus as completed, failed, in_progress, cancelled, queued or incomplete, and a response.completed event carries a whole Response object, status included. A response that reported status: "failed" or "cancelled" therefore fell past every error branch and closed the turn as turn.done with outcome: {type: "success"}.
From 0.6.2 an unsuccessful terminal status closes as turn.error, carrying the status as the error code. The branch sits last, so refusal, content_filter and response.incomplete keep their exact prior precedence and output; a response.completed with an absent or "completed" status is byte-identical to 0.6.1. One refinement beyond the literal fix: if a producer sends the self-contradictory combination of status: "incomplete" and an incomplete_details.reason, the sharper reason wins, so code reads the same as it would have from a correctly-labelled response.incomplete.
This is worth an explicit check if you persist turn outcomes. @openai/agents 0.17.1 began rejecting unsuccessful terminal states upstream, but it forwards the raw event to normalizers before it throws — so on 0.6.1 and earlier the success close was already emitted by the time the run aborted. Rows written by an older version cannot be repaired from the AgJSON alone; the status only survives in the provider-raw payload.
Four upstream signals that no longer fall on the floor
narration_block_indexes(Claude Agent SDK 0.3.272) names which of a frame’s content blocks are user-facing narration rather than private reasoning — the progress updates Anthropic’sthinking.display: "updates"mode returns between tool calls. Without it a client cannot tell a thinking block meant to be shown from one usually hidden, so it rides the block’sproviderMetadataverbatim. It appears in no SDK type declaration; only a live capture surfaced it.resume_reason(0.3.268) says why a turn is the automatic re-run of one a worker restart interrupted. On such a re-runuser_message_uuidnames the interrupted turn’s prompt, so without this a consumer cannot distinguish the re-run’s first reply from the original attempt’s. It joinsuser_message_uuidanduser_message_uuidsas the third leg of one turn-binding family, on the same channels under the same once-per-message rule.resultIndex(fromresult_index, 0.3.268) is the delivery sequence of a result within a run. A result whose write fails still consumes its number, so a gap in the sequence is how you detect a result that was lost in transit. It ridesext.anthropic.result-metabesidequeuedTurnCount.localCommand(fromlocal_command, 0.3.268) marks a turn that ran a slash command without entering the model loop. Its presence is the signal — it is the only thing separating that from an empty turn. Note the value is coarse by design upstream: every user, project or third-party command reportscustom, and every MCP command reportsmcp.
@openai/agents 0.18.0’s new toolSearchAgentName is carried on the tool lifecycle alongside the existing executionStatus. All five are additive: absent, every stream is byte-identical to 0.6.1.
Errored Vercel turns now report the tokens they burned
ai 7.0.94 made streamText enforce toolChoice, closing a violating run as finish{finishReason: "error"} with totalUsage populated. The facet’s error close discarded that usage even though AgTurnError has a usage slot the OpenAI facet already fills. It now forwards it through the same mapper the success close uses. Absent usage stays absent.
@openai/agents 0.18.0 is in range
The declared peer range moves from >=0.2.0 <0.18 to >=0.2.0 <0.19, so installing the current @openai/agents beside this facet no longer produces an npm peer warning. The typed streaming surface is unchanged across the whole 0.17.0 → 0.18.0 span: identical event and result declarations, identical stream-event and protocol-item inventories. 0.18.0’s headline changes — Docker file APIs moving inside the container, sandbox file-I/O protection, image-generation actions — are all off the path this facet normalizes.
Peer sweep and security
@anthropic-ai/claude-agent-sdk0.3.261 → 0.3.272 (nine published versions). TheSDKAssistantMessageErrorunion widened to includeverification_requiredandcloud_credential_error; both are non-retriable, which is what the facet already reported, now recorded deliberately rather than by omission. All six Claude seeds were re-captured.ai7.0.100 with@ai-sdk/openai4.0.66 and@ai-sdk/mcp2.0.49;@google/genai2.22.0 with@google/adkunchanged at 2.0.0. Both Vercel and both OpenAI seeds re-captured.- adm-zip 0.6.1. A medium-severity advisory (CVE-2026-76845) covers every published version through 0.6.0: archive extraction followed symlinks in the destination, allowing writes outside it. 0.6.1 adds the guard and fixes six further issues. It reaches this workspace only as a transitive of
@google/adk’s skills loader and is not a runtime dependency of any published@silverprotocolpackage, so no consumer was exposed through us — but the floor is now pinned so it cannot regress.
Also
The site’s spec badge had been serving 1.0.0-draft.1 since 0.5.0 — two revisions stale — because the shields URL escapes the hyphen and no search for the plain string ever matched it. The version is now generated from the SDK’s AGJSON_VERSION and checked by the same gate that guards the compatibility tables, as is the machine-readable peer list in llms.txt.
The compatibility tables on each npm page carry the dated evidence.