ci: Version Packages#968
Open
github-actions[bot] wants to merge 1 commit into
Open
Conversation
github-actions
Bot
force-pushed
the
changeset-release/main
branch
4 times, most recently
from
July 22, 2026 11:42
e85628c to
ea2c961
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
July 22, 2026 14:32
ea2c961 to
9c1e3ad
Compare
|
Thanks for the work on this release. Is there an approx publication window for the package versions in this PR? |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@tanstack/ai@0.43.0
Minor Changes
#970
3301398- Adopt the AG-UI interrupt lifecycle for tool approvals, generic responses, andclient-tool execution, with typed bound resolvers, atomic batches, and
structured errors. Interrupts run ephemerally by resuming from the full client
message history in a fresh child run — no persistence required.
This changes native approval and client-tool streams from legacy custom events
to snapshot-plus-
RUN_FINISHEDinterrupt outcomes. DeprecatedpendingInterrupts,addToolApprovalResponse, rawresumeInterrupts, andlegacy event readers remain as limited compatibility surfaces for migration;
addToolResultremains supported.#970
3301398- Make interrupt ownership explicit rather than assumed.An AG-UI
Interruptis a shared envelope — a workflow engine's durableapproval or another agent framework's pause can arrive on the same stream. What
makes a pause resumable through
chat()is the binding this package attachesunder
tanstack:interruptBinding.kind: 'unbound'withcanResolve: false, instead of being given asynthesized binding and rendered as resolvable generic interrupts. Resolving
those produced an answer submitted against a run with nothing pending, which
failed as
unknown-interruptonly after the user had filled in the form.Unbound items never block submission of the interrupts that are yours.
INTERRUPT_BINDING_VERSION). Readersreject a version they don't recognise rather than duck-typing its fields. A
binding written before the field existed is still read.
INTERRUPT_BINDING_METADATA_KEY,withInterruptBinding()andreadInterruptBinding()are exported, so anything producing an interrupt thispackage must later resume attaches the binding through a supported API
instead of copying the metadata key.
Interrupt.reasonisfree-form AG-UI text another producer can also use, so it is now a display
hint only and never decides ownership.
export *. Theunimplemented durable-recovery contract (
InterruptRecoveryStateV1,InterruptRecoveryQuery, the never-calledloadInterruptStateadapter hook,and the
persistence-required/atomic-commit-unsupported/recovery-unavailableerror codes) is removed rather than published.#970
3301398- Interrupts: the application owns wire-schema validation, and the hashingdependency is gone.
The library no longer transforms a generic interrupt's wire JSON Schema into a
validator or validates the resolved value against it, on either the client or
the server. Whatever you pass to
resolveInterrupt(client) or send in theresumebatch (server) flows through as-is. Validate it yourself if you need totrust it, e.g. with
z.fromJSONSchema(interrupt.responseSchema).safeParse(value)on the client and your own check on the server. Validation of a tool's
code-authored Standard Schema (
approvalSchema/inputSchema) is unchanged.This drops the
ajvandajv-formatsdependencies. Interrupt binding hashes andresolution fingerprints now use a small bundled SHA-256 instead of
@noble/hashes, so that dependency is gone too. The wire hash shape(
sha256:<hex>) is unchanged.#955
7c7aa09- Resumable streams: reconnect to an in-flight SSE or NDJSON response withoutre-running the provider.
toServerSentEventsResponseandtoHttpResponseboth accept adurability: { adapter, batch }option. The adapter (StreamDurability)records every chunk to an ordered log before delivery and tags each event with
an opaque, adapter-owned offset — an SSE
id:line, or theidof an NDJSON{ id, chunk }envelope (NDJSON has no native event-id). A reconnect(
Last-Event-ID) or an explicit?offsetread replays strictly after thatoffset from the log — the lazy provider stream is never iterated on resume.
Producers terminalize the log on cancellation and failure (
RUN_ERRORappendclose()) and on completion when the source stream emits its own terminalevent (
chat()always does), so readers are never parked on a dead run.Two adapters ship:
memoryStream(request)in@tanstack/ai(process-local,for development and tests) and the new
@tanstack/ai-durable-streampackage,a Durable Streams protocol adapter for production backends.
For the
GEThandler that a reload or a second tab reconnects to,resumeServerSentEventsResponse({ adapter })andresumeHttpResponse({ adapter })replay a run straight from the durability log. They need no producer stream and
return a 400 when the request carries no resume offset.
On the client, all four HTTP adapters are now resumable —
fetchServerSentEvents,fetchHttpStream,xhrServerSentEvents, andxhrHttpStream. Each tracks theper-event offset, auto-reconnects with
Last-Event-ID, de-duplicates thereplayed prefix, and exposes
joinRun(runId)to attach to an in-flight orfinished run from the start (read-only GET with
offset=-1). Untagged streamsbehave exactly as before. A durable run that ends with no terminal event and no
forward progress now throws
DurableStreamIncompleteErrorinstead of hanging.Reconnection and durability are bounded so failures surface rather than hang or
loop:
memoryStreamevicts completed logs after a grace window (unbounded growthis gone); resuming an expired/unknown run throws, and a from-start join to a
run that never produces fails after
MemoryStreamOptions.firstChunkDeadlineMs.reconnect: { maxAttempts, delayMs }— athrottle plus a ceiling on CONSECUTIVE no-progress reconnects (default 5;
forward progress resets it) that fails with the new
StreamReconnectLimitErrorinstead of reconnecting endlessly, without penalizing a healthy long-lived run.
durableStreamacceptsreconnect: { maxReadFailures, delayMs }to bound itsread-retry loop, and
serveris now optional whenfetchis provided (e.g. aCloudflare service binding).
toServerSentEventsResponseacceptsdebugto record durability terminal /close failures server-side, where a replaying joiner cannot observe them.
#980
4ce7600- Add a sharedScopeidentity type to@tanstack/ai.Scopeis the single identity/isolation vocabulary for the subsystems thatpersist or recall per-conversation data —
@tanstack/ai-persistenceand@tanstack/ai-memory. Rather than each subsystem inventing its own notion of"whose data is this?", both import one type:
threadIdis the one conversation key across the codebase (matchingChatMiddlewareContext.threadId, withconversationIdalready deprecated infavor of it) — subsystems must not introduce a second name (
sessionId, …) forthe same concept. Every field is an isolation boundary and must be derived
server-side from trusted session state, never from client input.
This is additive: nothing consumes
Scopeyet. It lands ahead of thepersistence and memory PRs so both build on one settled, unambiguous identity
contract instead of diverging.
@tanstack/ai-angular@0.4.0
Minor Changes
#970
3301398- Adopt the AG-UI interrupt lifecycle for tool approvals, generic responses, andclient-tool execution, with typed bound resolvers, atomic batches, and
structured errors. Interrupts run ephemerally by resuming from the full client
message history in a fresh child run — no persistence required.
This changes native approval and client-tool streams from legacy custom events
to snapshot-plus-
RUN_FINISHEDinterrupt outcomes. DeprecatedpendingInterrupts,addToolApprovalResponse, rawresumeInterrupts, andlegacy event readers remain as limited compatibility surfaces for migration;
addToolResultremains supported.Patch Changes
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/ai-client@0.23.0
Minor Changes
#970
3301398- Adopt the AG-UI interrupt lifecycle for tool approvals, generic responses, andclient-tool execution, with typed bound resolvers, atomic batches, and
structured errors. Interrupts run ephemerally by resuming from the full client
message history in a fresh child run — no persistence required.
This changes native approval and client-tool streams from legacy custom events
to snapshot-plus-
RUN_FINISHEDinterrupt outcomes. DeprecatedpendingInterrupts,addToolApprovalResponse, rawresumeInterrupts, andlegacy event readers remain as limited compatibility surfaces for migration;
addToolResultremains supported.#970
3301398- Make interrupt ownership explicit rather than assumed.An AG-UI
Interruptis a shared envelope — a workflow engine's durableapproval or another agent framework's pause can arrive on the same stream. What
makes a pause resumable through
chat()is the binding this package attachesunder
tanstack:interruptBinding.kind: 'unbound'withcanResolve: false, instead of being given asynthesized binding and rendered as resolvable generic interrupts. Resolving
those produced an answer submitted against a run with nothing pending, which
failed as
unknown-interruptonly after the user had filled in the form.Unbound items never block submission of the interrupts that are yours.
INTERRUPT_BINDING_VERSION). Readersreject a version they don't recognise rather than duck-typing its fields. A
binding written before the field existed is still read.
INTERRUPT_BINDING_METADATA_KEY,withInterruptBinding()andreadInterruptBinding()are exported, so anything producing an interrupt thispackage must later resume attaches the binding through a supported API
instead of copying the metadata key.
Interrupt.reasonisfree-form AG-UI text another producer can also use, so it is now a display
hint only and never decides ownership.
export *. Theunimplemented durable-recovery contract (
InterruptRecoveryStateV1,InterruptRecoveryQuery, the never-calledloadInterruptStateadapter hook,and the
persistence-required/atomic-commit-unsupported/recovery-unavailableerror codes) is removed rather than published.#970
3301398- Interrupts: the application owns wire-schema validation, and the hashingdependency is gone.
The library no longer transforms a generic interrupt's wire JSON Schema into a
validator or validates the resolved value against it, on either the client or
the server. Whatever you pass to
resolveInterrupt(client) or send in theresumebatch (server) flows through as-is. Validate it yourself if you need totrust it, e.g. with
z.fromJSONSchema(interrupt.responseSchema).safeParse(value)on the client and your own check on the server. Validation of a tool's
code-authored Standard Schema (
approvalSchema/inputSchema) is unchanged.This drops the
ajvandajv-formatsdependencies. Interrupt binding hashes andresolution fingerprints now use a small bundled SHA-256 instead of
@noble/hashes, so that dependency is gone too. The wire hash shape(
sha256:<hex>) is unchanged.#955
7c7aa09- Resumable streams: reconnect to an in-flight SSE or NDJSON response withoutre-running the provider.
toServerSentEventsResponseandtoHttpResponseboth accept adurability: { adapter, batch }option. The adapter (StreamDurability)records every chunk to an ordered log before delivery and tags each event with
an opaque, adapter-owned offset — an SSE
id:line, or theidof an NDJSON{ id, chunk }envelope (NDJSON has no native event-id). A reconnect(
Last-Event-ID) or an explicit?offsetread replays strictly after thatoffset from the log — the lazy provider stream is never iterated on resume.
Producers terminalize the log on cancellation and failure (
RUN_ERRORappendclose()) and on completion when the source stream emits its own terminalevent (
chat()always does), so readers are never parked on a dead run.Two adapters ship:
memoryStream(request)in@tanstack/ai(process-local,for development and tests) and the new
@tanstack/ai-durable-streampackage,a Durable Streams protocol adapter for production backends.
For the
GEThandler that a reload or a second tab reconnects to,resumeServerSentEventsResponse({ adapter })andresumeHttpResponse({ adapter })replay a run straight from the durability log. They need no producer stream and
return a 400 when the request carries no resume offset.
On the client, all four HTTP adapters are now resumable —
fetchServerSentEvents,fetchHttpStream,xhrServerSentEvents, andxhrHttpStream. Each tracks theper-event offset, auto-reconnects with
Last-Event-ID, de-duplicates thereplayed prefix, and exposes
joinRun(runId)to attach to an in-flight orfinished run from the start (read-only GET with
offset=-1). Untagged streamsbehave exactly as before. A durable run that ends with no terminal event and no
forward progress now throws
DurableStreamIncompleteErrorinstead of hanging.Reconnection and durability are bounded so failures surface rather than hang or
loop:
memoryStreamevicts completed logs after a grace window (unbounded growthis gone); resuming an expired/unknown run throws, and a from-start join to a
run that never produces fails after
MemoryStreamOptions.firstChunkDeadlineMs.reconnect: { maxAttempts, delayMs }— athrottle plus a ceiling on CONSECUTIVE no-progress reconnects (default 5;
forward progress resets it) that fails with the new
StreamReconnectLimitErrorinstead of reconnecting endlessly, without penalizing a healthy long-lived run.
durableStreamacceptsreconnect: { maxReadFailures, delayMs }to bound itsread-retry loop, and
serveris now optional whenfetchis provided (e.g. aCloudflare service binding).
toServerSentEventsResponseacceptsdebugto record durability terminal /close failures server-side, where a replaying joiner cannot observe them.
Patch Changes
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/ai-durable-stream@0.1.0
Minor Changes
#955
7c7aa09- Resumable streams: reconnect to an in-flight SSE or NDJSON response withoutre-running the provider.
toServerSentEventsResponseandtoHttpResponseboth accept adurability: { adapter, batch }option. The adapter (StreamDurability)records every chunk to an ordered log before delivery and tags each event with
an opaque, adapter-owned offset — an SSE
id:line, or theidof an NDJSON{ id, chunk }envelope (NDJSON has no native event-id). A reconnect(
Last-Event-ID) or an explicit?offsetread replays strictly after thatoffset from the log — the lazy provider stream is never iterated on resume.
Producers terminalize the log on cancellation and failure (
RUN_ERRORappendclose()) and on completion when the source stream emits its own terminalevent (
chat()always does), so readers are never parked on a dead run.Two adapters ship:
memoryStream(request)in@tanstack/ai(process-local,for development and tests) and the new
@tanstack/ai-durable-streampackage,a Durable Streams protocol adapter for production backends.
For the
GEThandler that a reload or a second tab reconnects to,resumeServerSentEventsResponse({ adapter })andresumeHttpResponse({ adapter })replay a run straight from the durability log. They need no producer stream and
return a 400 when the request carries no resume offset.
On the client, all four HTTP adapters are now resumable —
fetchServerSentEvents,fetchHttpStream,xhrServerSentEvents, andxhrHttpStream. Each tracks theper-event offset, auto-reconnects with
Last-Event-ID, de-duplicates thereplayed prefix, and exposes
joinRun(runId)to attach to an in-flight orfinished run from the start (read-only GET with
offset=-1). Untagged streamsbehave exactly as before. A durable run that ends with no terminal event and no
forward progress now throws
DurableStreamIncompleteErrorinstead of hanging.Reconnection and durability are bounded so failures surface rather than hang or
loop:
memoryStreamevicts completed logs after a grace window (unbounded growthis gone); resuming an expired/unknown run throws, and a from-start join to a
run that never produces fails after
MemoryStreamOptions.firstChunkDeadlineMs.reconnect: { maxAttempts, delayMs }— athrottle plus a ceiling on CONSECUTIVE no-progress reconnects (default 5;
forward progress resets it) that fails with the new
StreamReconnectLimitErrorinstead of reconnecting endlessly, without penalizing a healthy long-lived run.
durableStreamacceptsreconnect: { maxReadFailures, delayMs }to bound itsread-retry loop, and
serveris now optional whenfetchis provided (e.g. aCloudflare service binding).
toServerSentEventsResponseacceptsdebugto record durability terminal /close failures server-side, where a replaying joiner cannot observe them.
Patch Changes
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/ai-preact@0.12.0
Minor Changes
#970
3301398- Adopt the AG-UI interrupt lifecycle for tool approvals, generic responses, andclient-tool execution, with typed bound resolvers, atomic batches, and
structured errors. Interrupts run ephemerally by resuming from the full client
message history in a fresh child run — no persistence required.
This changes native approval and client-tool streams from legacy custom events
to snapshot-plus-
RUN_FINISHEDinterrupt outcomes. DeprecatedpendingInterrupts,addToolApprovalResponse, rawresumeInterrupts, andlegacy event readers remain as limited compatibility surfaces for migration;
addToolResultremains supported.Patch Changes
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/ai-react@0.19.0
Minor Changes
#970
3301398- Adopt the AG-UI interrupt lifecycle for tool approvals, generic responses, andclient-tool execution, with typed bound resolvers, atomic batches, and
structured errors. Interrupts run ephemerally by resuming from the full client
message history in a fresh child run — no persistence required.
This changes native approval and client-tool streams from legacy custom events
to snapshot-plus-
RUN_FINISHEDinterrupt outcomes. DeprecatedpendingInterrupts,addToolApprovalResponse, rawresumeInterrupts, andlegacy event readers remain as limited compatibility surfaces for migration;
addToolResultremains supported.Patch Changes
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/ai-solid@0.16.0
Minor Changes
#970
3301398- Adopt the AG-UI interrupt lifecycle for tool approvals, generic responses, andclient-tool execution, with typed bound resolvers, atomic batches, and
structured errors. Interrupts run ephemerally by resuming from the full client
message history in a fresh child run — no persistence required.
This changes native approval and client-tool streams from legacy custom events
to snapshot-plus-
RUN_FINISHEDinterrupt outcomes. DeprecatedpendingInterrupts,addToolApprovalResponse, rawresumeInterrupts, andlegacy event readers remain as limited compatibility surfaces for migration;
addToolResultremains supported.Patch Changes
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/ai-svelte@0.16.0
Minor Changes
#970
3301398- Adopt the AG-UI interrupt lifecycle for tool approvals, generic responses, andclient-tool execution, with typed bound resolvers, atomic batches, and
structured errors. Interrupts run ephemerally by resuming from the full client
message history in a fresh child run — no persistence required.
This changes native approval and client-tool streams from legacy custom events
to snapshot-plus-
RUN_FINISHEDinterrupt outcomes. DeprecatedpendingInterrupts,addToolApprovalResponse, rawresumeInterrupts, andlegacy event readers remain as limited compatibility surfaces for migration;
addToolResultremains supported.Patch Changes
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/ai-vue@0.16.0
Minor Changes
#970
3301398- Adopt the AG-UI interrupt lifecycle for tool approvals, generic responses, andclient-tool execution, with typed bound resolvers, atomic batches, and
structured errors. Interrupts run ephemerally by resuming from the full client
message history in a fresh child run — no persistence required.
This changes native approval and client-tool streams from legacy custom events
to snapshot-plus-
RUN_FINISHEDinterrupt outcomes. DeprecatedpendingInterrupts,addToolApprovalResponse, rawresumeInterrupts, andlegacy event readers remain as limited compatibility surfaces for migration;
addToolResultremains supported.Patch Changes
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/ai-acp@0.2.4
Patch Changes
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/ai-anthropic@0.16.4
Patch Changes
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/ai-bedrock@0.1.5
Patch Changes
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/ai-claude-code@0.2.4
Patch Changes
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/ai-code-mode@0.3.9
Patch Changes
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/ai-code-mode-skills@0.3.12
Patch Changes
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/ai-codex@0.2.4
Patch Changes
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/ai-devtools-core@0.4.25
Patch Changes
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/ai-elevenlabs@0.2.35
Patch Changes
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/ai-fal@0.9.13
Patch Changes
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/ai-gemini@0.20.2
Patch Changes
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/ai-grok@0.14.10
Patch Changes
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/ai-grok-build@0.2.4
Patch Changes
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/ai-groq@0.5.4
Patch Changes
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/ai-isolate-cloudflare@0.2.39
Patch Changes
@tanstack/ai-isolate-node@0.1.48
Patch Changes
@tanstack/ai-isolate-quickjs@0.1.48
Patch Changes
@tanstack/ai-mcp@0.2.6
Patch Changes
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/ai-mistral@0.2.4
Patch Changes
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/ai-ollama@0.8.17
Patch Changes
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/ai-openai@0.17.2
Patch Changes
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/ai-opencode@0.2.4
Patch Changes
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/ai-openrouter@0.15.11
Patch Changes
#888
50d7a7d- Update model metadata from OpenRouter APIUpdated dependencies [
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/ai-react-ui@0.8.16
Patch Changes
3301398,3301398,3301398,7c7aa09]:@tanstack/ai-sandbox@0.2.5
Patch Changes
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/ai-sandbox-cloudflare@0.2.5
Patch Changes
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/ai-solid-ui@0.7.15
Patch Changes
3301398,3301398,3301398,7c7aa09]:@tanstack/ai-vue-ui@0.2.35
Patch Changes
3301398]:@tanstack/openai-base@0.9.10
Patch Changes
3301398,3301398,3301398,7c7aa09,4ce7600]:@tanstack/preact-ai-devtools@0.1.68
Patch Changes
@tanstack/react-ai-devtools@0.2.68
Patch Changes
@tanstack/solid-ai-devtools@0.2.68
Patch Changes
ag-ui@0.0.3
Patch Changes
3301398,3301398,3301398,7c7aa09]: