Skip to content

chore(web)(deps): bump the web-dependencies group across 1 directory with 16 updates - #1237

Open
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/npm_and_yarn/web/web-dependencies-8e83bfb2ab
Open

dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/npm_and_yarn/web/web-dependencies-8e83bfb2ab

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Sep 9, 2026

Copy link
Copy Markdown
Contributor

Bumps the web-dependencies group with 16 updates in the /web directory:

Package From To
@tanstack/ai 0.21.3 0.46.0
@tanstack/ai-anthropic 0.10.3 0.16.7
@tanstack/ai-client 0.11.8 0.24.0
@tanstack/ai-gemini 0.10.10 0.24.1
@tanstack/ai-openai 0.10.5 0.20.0
@tanstack/ai-react 0.11.8 0.20.0
@tanstack/devtools-event-client 0.4.4 0.5.0
@tanstack/devtools-vite 0.7.2 0.8.4
@tanstack/match-sorter-utils 8.19.4 9.1.2
@tanstack/react-query 5.100.14 5.101.4
@tanstack/react-router 1.170.8 1.170.31
@tanstack/react-table 8.21.3 9.1.2
docx-preview 0.3.7 0.4.0
katex 0.17.0 0.18.4
@testing-library/jest-dom 6.10.0 7.0.1
@types/qrcode 1.5.5 1.5.6

Updates @tanstack/ai from 0.21.3 to 0.46.0

Release notes

Sourced from @​tanstack/ai's releases.

@​tanstack/ai-client@​0.31.0

Minor Changes

  • #1309 21775ee - Add @tanstack/ai-cloudflare: a Cloudflare adapter for Workers AI chat, summarization, embeddings, image generation, text-to-speech, and transcription over the env.AI binding or the REST API, with AI Gateway routing (gateway option and cloudflareGateway() helper for other providers). @tanstack/ai learns the cloudflare max-tokens key for summarize, lets defineByokProvider declare companion credentials with with, and adds getByokKeys(request, { name: provider }) to @tanstack/ai/byok/server. @tanstack/ai-client's defineByok takes providers: a send for a provider with companions (Cloudflare token plus account id) carries every x-byok-* header and prompts for each missing value.

  • #1302 82ced0f - Add the registerWebMCPTools registrar to @tanstack/ai-client. Each framework package adds a lifecycle wrapper through useWebMCPTools, createWebMCPTools, or injectWebMCPTools.

Patch Changes

@​tanstack/ai-client@​0.30.0

Minor Changes

  • #1252 a4ab03e - Add typed headless createChatUI() adapters on @tanstack/ai-react/ui, @tanstack/ai-solid/ui, @tanstack/ai-vue/ui, and @tanstack/ai-svelte/ui. Chat options control the types of message parts, tools, structured output, and interrupts. toolsComponents requires a component for every tool name, and interruptsComponents.generic one for every registered interrupt id. InterruptProps pins a tool approval or a registered generic interrupt. Old Chat orchestration stays importable and deprecated until 1.0.

@​tanstack/ai-gemini@​0.29.1

Patch Changes

@​tanstack/ai-gemini@​0.29.0

Minor Changes

  • #1312 5305d32 - Accept baseURL and defaultHeaders on every adapter's client config so one gateway config (Cloudflare AI Gateway, Vercel AI Gateway, a corporate proxy) can be spread into any adapter. The vendor-specific names (httpOptions, serverURL, host, baseUrl, headers) keep working. Bedrock's Converse adapter now applies defaultHeaders too.

Patch Changes

@​tanstack/ai-gemini@​0.28.0

Minor Changes

  • #1301 307b7ec - Add Gemini 3.8 Flash (gemini-3.8-flash) with multimodal input, thinking, structured output, caching, built-in tools, and agentic video understanding.

    Limit its thinking levels to low, medium, and high in both the standard and Interactions adapters.

Patch Changes

@​tanstack/ai-gemini@​0.27.0

Minor Changes

  • #1294 4964221 - Add agentic video understanding to the Gemini text adapter.

... (truncated)

Changelog

Sourced from @​tanstack/ai's changelog.

0.46.0

Minor Changes

  • #896 41a5d18 - Add a self-describing billed field to TokenUsage so billed quantities carry the unit they are counted in (#816). usage.billed is { quantity, unit } with a BillingUnit union ('seconds', 'units', 'images', 'tokens', ... open-ended). The deprecated unitsBilled / durationSeconds counts are still populated for backward compatibility. The fal adapters report { quantity, unit: 'units' }, Grok video { quantity, unit: 'seconds' }, the OpenAI/Grok/BytePlus duration-billed transcription paths { quantity, unit: 'seconds' }, BytePlus Seedream images { quantity, unit: 'images' }, BytePlus Seedance video { quantity, unit: 'tokens' }, and Cohere/OpenRouter rerank { quantity, unit: 'units' } (search units). Persistence sums billed when both reports use the same unit. otelMiddleware emits the pair as tanstack.ai.usage.billed_quantity / tanstack.ai.usage.billed_unit span attributes.

  • #969 ecd12a4 - WebSocket transport: a full-duplex, resumable third transport alongside SSE and NDJSON, reusing the same delivery-durability seam.

    On the server, @tanstack/ai adds toWebSocketStream(socket, request, { onRun, durability, batch, heartbeatMs, idleTimeoutMs, debug }) — a portable core that pumps a conversation over an already-accepted WHATWG WebSocketLike server socket (Node via ws, Bun, etc.), and toWebSocketResponse(request, { onRun, … }), a thin wrapper that upgrades via WebSocketPair and returns a 101 Response on Cloudflare Workers/Durable Objects (it throws elsewhere, pointing you at toWebSocketStream). Because one socket outlives many chat() turns (client-tool resubmits, follow-up user messages), you pass an onRun(ctx) => AsyncIterable<StreamChunk> factory instead of a prebuilt stream — the helper calls it per inbound RunAgentInput frame. The socket is conversation-scoped: it stays open across turns and closes on client close or the idle timeout (which never fires while a turn is still streaming), with a periodic { type: 'ping' } heartbeat. An { type: 'abort', runId } control frame aborts only that turn, leaving the socket open. A turn that fails is surfaced to the client as a live RUN_ERROR frame, mirroring the HTTP transports. Durability is keyed per turn and reuses the existing durableStreamSource, so server→client frames carry the same { id, chunk } envelope as NDJSON. resumeWebSocketStream(socket, { adapter }) and resumeWebSocketResponse({ adapter }) replay a run read-only from the durability log (no model call).

    On the client, webSocket(url, options) (in @tanstack/ai-client, re-exported from @tanstack/ai-react, -solid, -vue, -svelte, and -angular) is a full-duplex subscribe + send connection adapter for useChat. send() writes a RunAgentInput frame; subscribe() yields inbound chunks, ignores heartbeats, unwraps durable envelopes, and auto-reconnects a dropped durable run by reopening with ?runId=&offset= (browsers can't set a Last-Event-ID handshake header, so the offset rides in the URL). The reconnect bookkeeping (offset de-dupe, no-progress ceiling → StreamReconnectLimitError) is shared with the HTTP adapters via the new createReconnectTracker, and a fatal drop surfaces to the consumer (StreamReadError / StreamReconnectLimitError) instead of hanging. Aborting a run (stop() in useChat) sends the { type: 'abort', runId } frame so the server cancels the turn instead of generating to completion, and joinRun() opens its own replay socket so a rejoin never collides with the live conversation socket.

Patch Changes

  • #1147 4599019 - Preserve reasoning in server chat message history and interrupt snapshots.

  • #932 3eda66c - Classify Anthropic, Gemini, and OpenAI native tools with stable runtime discriminators so ordinary functions can use the same public names without selecting provider-native behavior. Native tools must come from the adapter factory (webSearchTool(), googleSearchTool(), and the rest). A reserved name alone does not select a native converter. chat() throws DuplicateToolNameError when a factory tool and a custom function share the same public name.

... (truncated)

Commits

Updates @tanstack/ai-anthropic from 0.10.3 to 0.16.7

Changelog

Sourced from @​tanstack/ai-anthropic's changelog.

0.16.7

Patch Changes

  • #932 3eda66c - Classify Anthropic, Gemini, and OpenAI native tools with stable runtime discriminators so ordinary functions can use the same public names without selecting provider-native behavior. Native tools must come from the adapter factory (webSearchTool(), googleSearchTool(), and the rest). A reserved name alone does not select a native converter. chat() throws DuplicateToolNameError when a factory tool and a custom function share the same public name.

    Previously the converters picked provider-native behavior by tool.name. Tool names are public application identifiers, so a plain function called web_search, google_search, or code_execution was routed into a native converter: it lost its inputSchema and was sent as a provider-only payload (and on Anthropic could also flip on code_execution / skills beta headers). Native tools are now identified by adapter-owned metadata, which converters strip before building the wire payload, so provider API versions stay confined to the wire converters.

    Also preserves Anthropic webSearchTool options (max_uses, allowed_domains, blocked_domains, user_location, cache_control) on the wire payload.

    Also fixes googleSearchTool({ searchTypes: … }) being silently dropped on the experimental geminiTextInteractions() adapter. The Interactions converter read a snake_case search_types array, but the public factory takes the Generate Content shape (GoogleSearch.searchTypes: { webSearch?, imageSearch? }), so the field never matched and every request fell back to the provider default of web-search-only. The camelCase config is now translated to the Interactions wire list.

  • Updated dependencies [41a5d18, 4599019, 3eda66c, ecd12a4]:

    • @​tanstack/ai@​0.46.0

0.16.6

Patch Changes

0.16.5

Patch Changes

  • #1062 ad62202 - Forward top-level cache_control from modelOptions in the Anthropic text adapter.

    Anthropic's Messages API accepts cache_control as a request-level parameter (it auto-places the cache breakpoint on the last cacheable block), but the adapter's modelOptions allowlist omitted it, so any value passed was silently stripped and logged as a dropped key. Per-block caching via systemPrompts[].metadata.cache_control is unchanged.

  • #1071 ea9c077 - fix: publish internal dependency ranges as ^x.y.z instead of exact pins

    Internal dependencies on other TanStack AI packages used workspace:* in dependencies and peerDependencies. pnpm rewrites that to an exact version at publish time, so a released package asked for e.g. @tanstack/ai-utils@0.4.0 rather than ^0.4.0.

    Two consequences for consumers:

    • Duplicate copies. An exact pin cannot dedupe. Installing a newer @tanstack/ai alongside a package pinned to the previous patch produced two copies in the tree, which breaks instanceof checks and module-level state, and inflates bundles.
    • Unsatisfiable peers. An exactly pinned peerDependency conflicts the moment the internal package ships its next patch, forcing consumers into overrides or --legacy-peer-deps.

... (truncated)

Commits

Updates @tanstack/ai-client from 0.11.8 to 0.24.0

Changelog

Sourced from @​tanstack/ai-client's changelog.

0.24.0

Minor Changes

  • #969 ecd12a4 - WebSocket transport: a full-duplex, resumable third transport alongside SSE and NDJSON, reusing the same delivery-durability seam.

    On the server, @tanstack/ai adds toWebSocketStream(socket, request, { onRun, durability, batch, heartbeatMs, idleTimeoutMs, debug }) — a portable core that pumps a conversation over an already-accepted WHATWG WebSocketLike server socket (Node via ws, Bun, etc.), and toWebSocketResponse(request, { onRun, … }), a thin wrapper that upgrades via WebSocketPair and returns a 101 Response on Cloudflare Workers/Durable Objects (it throws elsewhere, pointing you at toWebSocketStream). Because one socket outlives many chat() turns (client-tool resubmits, follow-up user messages), you pass an onRun(ctx) => AsyncIterable<StreamChunk> factory instead of a prebuilt stream — the helper calls it per inbound RunAgentInput frame. The socket is conversation-scoped: it stays open across turns and closes on client close or the idle timeout (which never fires while a turn is still streaming), with a periodic { type: 'ping' } heartbeat. An { type: 'abort', runId } control frame aborts only that turn, leaving the socket open. A turn that fails is surfaced to the client as a live RUN_ERROR frame, mirroring the HTTP transports. Durability is keyed per turn and reuses the existing durableStreamSource, so server→client frames carry the same { id, chunk } envelope as NDJSON. resumeWebSocketStream(socket, { adapter }) and resumeWebSocketResponse({ adapter }) replay a run read-only from the durability log (no model call).

    On the client, webSocket(url, options) (in @tanstack/ai-client, re-exported from @tanstack/ai-react, -solid, -vue, -svelte, and -angular) is a full-duplex subscribe + send connection adapter for useChat. send() writes a RunAgentInput frame; subscribe() yields inbound chunks, ignores heartbeats, unwraps durable envelopes, and auto-reconnects a dropped durable run by reopening with ?runId=&offset= (browsers can't set a Last-Event-ID handshake header, so the offset rides in the URL). The reconnect bookkeeping (offset de-dupe, no-progress ceiling → StreamReconnectLimitError) is shared with the HTTP adapters via the new createReconnectTracker, and a fatal drop surfaces to the consumer (StreamReadError / StreamReconnectLimitError) instead of hanging. Aborting a run (stop() in useChat) sends the { type: 'abort', runId } frame so the server cancels the turn instead of generating to completion, and joinRun() opens its own replay socket so a rejoin never collides with the live conversation socket.

Patch Changes

  • #1154 f6b9d89 - Mint omitted threadId after the view mounts, not during render. DevTools binds the hook row to threadId. Persistence that is on (true or a storage adapter) requires a threadId at compile time, and throws at runtime if it is missing. Chat and generation clients no longer accept a separate id option. Use threadId.

  • Updated dependencies [41a5d18, 4599019, 3eda66c, ecd12a4]:

    • @​tanstack/ai-event-client@​0.9.0
    • @​tanstack/ai@​0.46.0

... (truncated)

Commits
  • 25a9908 ci: Version Packages (#1152)
  • f6b9d89 fix(ai-client): use threadId as the only client identity (#1154)
  • ecd12a4 feat: WebSocket transport — full-duplex resumable streams (#969)
  • 5701bf5 docs: regenerate API documentation (#1141)
  • b2b1c43 ci: Version Packages (#1118)
  • f492bc9 fix(ai-client): preserve client-tool continuation ownership (#1122)
  • d45f976 chore(deps): update build & test tooling (#1124)
  • e02b661 ci: Version Packages (#1059)
  • ea9c077 fix: publish internal dependency ranges as ^x.y.z instead of exact pins (#1071)
  • a8bf8bc fix(ai-client): correlate synthesized resume terminals to request run (#1053)
  • Additional commits viewable in compare view

Updates @tanstack/ai-gemini from 0.10.10 to 0.24.1

Changelog

Sourced from @​tanstack/ai-gemini's changelog.

0.24.1

Patch Changes

  • #932 3eda66c - Classify Anthropic, Gemini, and OpenAI native tools with stable runtime discriminators so ordinary functions can use the same public names without selecting provider-native behavior. Native tools must come from the adapter factory (webSearchTool(), googleSearchTool(), and the rest). A reserved name alone does not select a native converter. chat() throws DuplicateToolNameError when a factory tool and a custom function share the same public name.

    Previously the converters picked provider-native behavior by tool.name. Tool names are public application identifiers, so a plain function called web_search, google_search, or code_execution was routed into a native converter: it lost its inputSchema and was sent as a provider-only payload (and on Anthropic could also flip on code_execution / skills beta headers). Native tools are now identified by adapter-owned metadata, which converters strip before building the wire payload, so provider API versions stay confined to the wire converters.

    Also preserves Anthropic webSearchTool options (max_uses, allowed_domains, blocked_domains, user_location, cache_control) on the wire payload.

    Also fixes googleSearchTool({ searchTypes: … }) being silently dropped on the experimental geminiTextInteractions() adapter. The Interactions converter read a snake_case search_types array, but the public factory takes the Generate Content shape (GoogleSearch.searchTypes: { webSearch?, imageSearch? }), so the field never matched and every request fell back to the provider default of web-search-only. The camelCase config is now translated to the Interactions wire list.

  • Updated dependencies [41a5d18, 4599019, 3eda66c, ecd12a4]:

    • @​tanstack/ai@​0.46.0

0.24.0

Minor Changes

  • #1104 a8454a7 - Add the GA Gemini native image model ids and give each native image model its own size type.

    gemini-3.1-flash-image-preview and gemini-3-pro-image-preview were shut down on 2026-06-25 and now 404. Their GA replacements — gemini-3.1-flash-image and gemini-3-pro-image — are now the primary ids. The -preview ids remain in the model union as aliases so existing code keeps compiling; gemini-2.5-flash-image stays fully supported ahead of its 2026-10-02 shutdown.

    Sizes were a single flat union ({8 ratios}_{1K|2K|4K}) applied to every native model. Google documents four different sets, so each model now maps to its own:

    model aspect ratios resolutions
    gemini-3.1-flash-image (+ -preview) 14 512 1K 2K 4K
    gemini-3.1-flash-lite-image 14 1K
    gemini-3-pro-image (+ -preview) 10 1K 2K 4K
    gemini-2.5-flash-image 10 none — bare ratio, e.g. '16:9'

    4:5 and 5:4 are now accepted on every native model (Google lists them for all four; the old union omitted them). 9:21 is deliberately still rejected — it exists on Vertex/Cloud only and the Gemini API rejects it.

    Runtime behaviour changes in two places. The rest of the change is types-only, but these two are real wire-format deltas:

    • parseNativeImageSize() now accepts a bare aspect ratio. Previously '16:9' failed to parse, so the adapter omitted imageConfig entirely and the model picked its own aspect ratio; it now parses to { aspectRatio: '16:9' } and the adapter sends imageConfig.aspectRatio = '16:9'. A JavaScript caller — or a TypeScript caller whose size is computed at runtime and widened to string — that already passed a bare ratio will get a differently-framed image after upgrading, with no compile or runtime error.
    • Migrating a gemini-2.5-flash-image call from '16:9_1K' to the now-required bare '16:9' drops imageSize from the generateContent request. That is intended: Google publishes no image_size value or default for this model, so the adapter no longer guesses a tier the API never documented.

    BREAKING (types only): size combinations the selected model never supported no longer compile. No model id was removed.

    • gemini-3.1-flash-lite-image: 2K and 4K are rejected (the model only emits 1K). Use '<ratio>_1K'.
    • gemini-3-pro-image / gemini-3-pro-image-preview: the extreme banner ratios 1:4 4:1 1:8 8:1 are rejected (Gemini 3.1 Flash Image only), as is the 512 tier.
    • gemini-2.5-flash-image: any _1K / _2K / _4K suffix is rejected — pass the bare ratio ('16:9', not '16:9_1K') — as are the four extreme banner ratios.
    • GeminiNativeImageSize is now the union of the per-model types rather than one flat template literal. It was not previously reachable from the package entry point, so this is a new export rather than a changed one.

    New type exports, so the per-model narrowing is nameable and not just inferred at the call site: GeminiImageModelSizeByName, GeminiStandardImageAspectRatio, GeminiExtendedImageAspectRatio, Gemini31FlashImageSize, Gemini31FlashLiteImageSize, Gemini3ProImageSize, Gemini25FlashImageSize, GeminiNativeImageSize.

    Two caveats worth knowing before you rely on this.

    • No in-editor deprecation warning on the dead -preview ids. The @deprecated tags live on module-private model-metadata consts, and GeminiImageModels is projected out of a const array ((typeof GEMINI_IMAGE_MODELS)[number]), which collapses to bare string literals — JSDoc does not survive that projection. So geminiImage('gemini-3-pro-image-preview') still compiles cleanly with no strikethrough and no hint, and fails only at request time. Grep your codebase for -image-preview rather than expecting the compiler to flag it.
    • gemini-3.1-flash-lite-image's four extreme ratios (1:4 4:1 1:8 8:1) are partially inferred. Unlike the other three native models, Flash Lite has no per-model ratio table on the Gemini API guide. The 14-value set rests on the Cloud model page's explicit enumeration plus ai.google.dev's bare "a discrete set of 14 aspect ratios" assertion; the only Gemini-API enumeration for this model is a 10-item bullet prefixed "New aspect ratios", read here as a what's-new list rather than an exhaustive set. If the API rejects those four in practice, this type over-accepts and should narrow to the 10-ratio set.

... (truncated)

Commits

Updates @tanstack/ai-openai from 0.10.5 to 0.20.0

Changelog

Sourced from @​tanstack/ai-openai's changelog.

0.20.0

Minor Changes

  • #896 41a5d18 - Add a self-describing billed field to TokenUsage so billed quantities carry the unit they are counted in (#816). usage.billed is { quantity, unit } with a BillingUnit union ('seconds', 'units', 'images', 'tokens', ... open-ended). The deprecated unitsBilled / durationSeconds counts are still populated for backward compatibility. The fal adapters report { quantity, unit: 'units' }, Grok video { quantity, unit: 'seconds' }, the OpenAI/Grok/BytePlus duration-billed transcription paths { quantity, unit: 'seconds' }, BytePlus Seedream images { quantity, unit: 'images' }, BytePlus Seedance video { quantity, unit: 'tokens' }, and Cohere/OpenRouter rerank { quantity, unit: 'units' } (search units). Persistence sums billed when both reports use the same unit. otelMiddleware emits the pair as tanstack.ai.usage.billed_quantity / tanstack.ai.usage.billed_unit span attributes.

Patch Changes

  • #932 3eda66c - Classify Anthropic, Gemini, and OpenAI native tools with stable runtime discriminators so ordinary functions can use the same public names without selecting provider-native behavior. Native tools must come from the adapter factory (webSearchTool(), googleSearchTool(), and the rest). A reserved name alone does not select a native converter. chat() throws DuplicateToolNameError when a factory tool and a custom function share the same public name.

    Previously the converters picked provider-native behavior by tool.name. Tool names are public application identifiers, so a plain function called web_search, google_search, or code_execution was routed into a native converter: it lost its inputSchema and was sent as a provider-only payload (and on Anthropic could also flip on code_execution / skills beta headers). Native tools are now identified by adapter-owned metadata, which converters strip before building the wire payload, so provider API versions stay confined to the wire converters.

    Also preserves Anthropic webSearchTool options (max_uses, allowed_domains, blocked_domains, user_location, cache_control) on the wire payload.

    Also fixes googleSearchTool({ searchTypes: … }) being silently dropped on the experimental geminiTextInteractions() adapter. The Interactions converter read a snake_case search_types array, but the public factory takes the Generate Content shape (GoogleSearch.searchTypes: { webSearch?, imageSearch? }), so the field never matched and every request fell back to the provider default of web-search-only. The camelCase config is now translated to the Interactions wire list.

  • Updated dependencies [41a5d18, 4599019, 3eda66c, ecd12a4]:

    • @​tanstack/ai@​0.46.0
    • @​tanstack/openai-base@​0.9.15

0.19.1

Patch Changes

0.19.0

Minor Changes

  • #926 ee07854 - Add a multimodal embed() activity. A single primitive covers one input or a batch — input accepts a string, a text part, an image part, or a fused text+image item written as a nested Array<ContentPart> ([textPart, imagePart], the same shape chat messages use), one vector per item, with the accepted item types narrowed per model at compile time. Top-level dimensions requests Matryoshka output sizes where supported. Results carry embeddings: [{ vector, index }] plus usage when the provider reports it, and embed() participates in generation middleware, debug logging, OTel (gen_ai.operation.name: embeddings), and devtools events like every other activity.

    Provider adapters: openaiEmbedding (text-embedding-3-small/large), geminiEmbedding (gemini-embedding-001), mistralEmbedding (mistral-embed, codestral-embed), ollamaEmbedding (nomic-embed-text and any local model), bedrockEmbedding (Titan Text V2, Titan Multimodal G1 with fused text+image, Cohere Embed v3 on Bedrock), and @tanstack/ai-cohere's cohereEmbedding (embed-v4.0, multimodal text+image with required inputType).

Patch Changes

  • #1071 ea9c077 - fix: publish internal dependency ranges as ^x.y.z instead of exact pins

    Internal dependencies on other TanStack AI packages used workspace:* in dependencies and peerDependencies. pnpm rewrites that to an exact version at publish time, so a released package asked for e.g. @tanstack/ai-utils@0.4.0 rather than ^0.4.0.

    Two consequences for consumers:

    • Duplicate copies. An exact pin cannot dedupe. Installing a newer @tanstack/ai alongside a package pinned to the previous patch produced two

... (truncated)

Commits

Updates @tanstack/ai-react from 0.11.8 to 0.20.0

Changelog

Sourced from @​tanstack/ai-react's changelog.

0.20.0

Minor Changes

  • #969 ecd12a4 - WebSocket transport: a full-duplex, resumable third transport alongside SSE and NDJSON, reusing the same delivery-durability seam.

    On the server, @tanstack/ai adds toWebSocketStream(socket, request, { onRun, durability, batch, heartbeatMs, idleTimeoutMs, debug }) — a portable core that pumps a conversation over an already-accepted WHATWG WebSocketLike server socket (Node via ws, Bun, etc.), and toWebSocketResponse(request, { onRun, … }), a thin wrapper that upgrades via WebSocketPair and returns a 101 Response on Cloudflare Workers/Durable Objects (it throws elsewhere, pointing you at toWebSocketStream). Because one socket outlives many chat() turns (client-tool resubmits, follow-up user messages), you pass an onRun(ctx) => AsyncIterable<StreamChunk> factory instead of a prebuilt stream — the helper calls it per inbound RunAgentInput frame. The socket is conversation-scoped: it stays open across turns and closes on client close or the idle timeout (which never fires while a turn is still streaming), with a periodic { type: 'ping' } heartbeat. An { type: 'abort', runId } control frame aborts only that turn, leaving the socket open. A turn that fails is surfaced to the client as a live RUN_ERROR frame, mirroring the HTTP transports. Durability is keyed per turn and reuses the existing durableStreamSource, so server→client frames carry the same { id, chunk } envelope as NDJSON. resumeWebSocketStream(socket, { adapter }) and resumeWebSocketResponse({ adapter }) replay a run read-only from the durability log (no model call).

    On the client, webSocket(url, options) (in @tanstack/ai-client, re-exported from @tanstack/ai-react, -solid, -vue, -svelte, and -angular) is a full-duplex subscribe + send connection adapter for useChat. send() writes a RunAgentInput frame; subscribe() yields inbound chunks, ignores heartbeats, unwraps durable envelopes, and auto-reconnects a dropped durable run by reopening with ?runId=&offset= (browsers can't set a Last-Event-ID handshake header, so the offset rides in the URL). The reconnect bookkeeping (offset de-dupe, no-progress ceiling → StreamReconnectLimitError) is shared with the HTTP adapters via the new createReconnectTracker, and a fatal drop surfaces to the consumer (StreamReadError / StreamReconnectLimitError) instead of hanging. Aborting a run (stop() in useChat) sends the { type: 'abort', runId } frame so the server cancels the turn instead of generating to completion, and joinRun() opens its own replay socket so a rejoin never collides with the live conversation socket.

Patch Changes

  • #1154 f6b9d89 - Mint omitted threadId after the view mounts, not during render. DevTools binds the hook row to threadId. Persistence that is on (true or a storage adapter) requires a threadId at compile time, and throws at runtime if it is missing. Chat and generation clients no longer accept a separate id option. Use threadId.

  • Updated dependencies [41a5d18, 4599019, f6b9d89, 3eda66c, ecd12a4]:

    • @​tanstack/ai@​0.46.0
    • @​tanstack/ai-client@​0.24.0

... (truncated)

Commits

Updates @tanstack/devtools-event-client from 0.4.4 to 0.5.0

Release notes

Sourced from @​tanstack/devtools-event-client's releases.

@​tanstack/devtools-event-client@​0.5.0

Minor Changes

  • #471 b1ac893 - The root export of @tanstack/devtools-event-client now resolves to a no-op outside development (process.env.NODE_ENV !== 'development'), so the real EventClient is tree-shaken out of production bundles by default.

    If you want devtools events to keep working in production, import the real client from the new @tanstack/devtools-event-client/production subpath, which always ships the real implementation. The public API is identical between the two imports.

Comm...

Description has been truncated

…with 16 updates

Bumps the web-dependencies group with 16 updates in the /web directory:

| Package | From | To |
| --- | --- | --- |
| [@tanstack/ai](https://github.com/TanStack/ai/tree/HEAD/packages/ai) | `0.21.3` | `0.46.0` |
| [@tanstack/ai-anthropic](https://github.com/TanStack/ai/tree/HEAD/packages/ai-anthropic) | `0.10.3` | `0.16.7` |
| [@tanstack/ai-client](https://github.com/TanStack/ai/tree/HEAD/packages/ai-client) | `0.11.8` | `0.24.0` |
| [@tanstack/ai-gemini](https://github.com/TanStack/ai/tree/HEAD/packages/ai-gemini) | `0.10.10` | `0.24.1` |
| [@tanstack/ai-openai](https://github.com/TanStack/ai/tree/HEAD/packages/ai-openai) | `0.10.5` | `0.20.0` |
| [@tanstack/ai-react](https://github.com/TanStack/ai/tree/HEAD/packages/ai-react) | `0.11.8` | `0.20.0` |
| [@tanstack/devtools-event-client](https://github.com/TanStack/devtools/tree/HEAD/packages/devtools-event-client) | `0.4.4` | `0.5.0` |
| [@tanstack/devtools-vite](https://github.com/TanStack/devtools/tree/HEAD/packages/devtools-vite) | `0.7.2` | `0.8.4` |
| [@tanstack/match-sorter-utils](https://github.com/TanStack/table/tree/HEAD/packages/match-sorter-utils) | `8.19.4` | `9.1.2` |
| [@tanstack/react-query](https://github.com/TanStack/query/tree/HEAD/packages/react-query) | `5.100.14` | `5.101.4` |
| [@tanstack/react-router](https://github.com/TanStack/router/tree/HEAD/packages/react-router) | `1.170.8` | `1.170.31` |
| [@tanstack/react-table](https://github.com/TanStack/table/tree/HEAD/packages/react-table) | `8.21.3` | `9.1.2` |
| [docx-preview](https://github.com/VolodymyrBaydalka/docxjs) | `0.3.7` | `0.4.0` |
| [katex](https://github.com/KaTeX/KaTeX) | `0.17.0` | `0.18.4` |
| [@testing-library/jest-dom](https://github.com/testing-library/jest-dom) | `6.10.0` | `7.0.1` |
| [@types/qrcode](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/qrcode) | `1.5.5` | `1.5.6` |



Updates `@tanstack/ai` from 0.21.3 to 0.46.0
- [Release notes](https://github.com/TanStack/ai/releases)
- [Changelog](https://github.com/TanStack/ai/blob/main/packages/ai/CHANGELOG.md)
- [Commits](https://github.com/TanStack/ai/commits/@tanstack/ai@0.46.0/packages/ai)

Updates `@tanstack/ai-anthropic` from 0.10.3 to 0.16.7
- [Release notes](https://github.com/TanStack/ai/releases)
- [Changelog](https://github.com/TanStack/ai/blob/main/packages/ai-anthropic/CHANGELOG.md)
- [Commits](https://github.com/TanStack/ai/commits/@tanstack/ai-anthropic@0.16.7/packages/ai-anthropic)

Updates `@tanstack/ai-client` from 0.11.8 to 0.24.0
- [Release notes](https://github.com/TanStack/ai/releases)
- [Changelog](https://github.com/TanStack/ai/blob/main/packages/ai-client/CHANGELOG.md)
- [Commits](https://github.com/TanStack/ai/commits/@tanstack/ai-client@0.24.0/packages/ai-client)

Updates `@tanstack/ai-gemini` from 0.10.10 to 0.24.1
- [Release notes](https://github.com/TanStack/ai/releases)
- [Changelog](https://github.com/TanStack/ai/blob/main/packages/ai-gemini/CHANGELOG.md)
- [Commits](https://github.com/TanStack/ai/commits/@tanstack/ai-gemini@0.24.1/packages/ai-gemini)

Updates `@tanstack/ai-openai` from 0.10.5 to 0.20.0
- [Release notes](https://github.com/TanStack/ai/releases)
- [Changelog](https://github.com/TanStack/ai/blob/main/packages/ai-openai/CHANGELOG.md)
- [Commits](https://github.com/TanStack/ai/commits/@tanstack/ai-openai@0.20.0/packages/ai-openai)

Updates `@tanstack/ai-react` from 0.11.8 to 0.20.0
- [Release notes](https://github.com/TanStack/ai/releases)
- [Changelog](https://github.com/TanStack/ai/blob/main/packages/ai-react/CHANGELOG.md)
- [Commits](https://github.com/TanStack/ai/commits/@tanstack/ai-react@0.20.0/packages/ai-react)

Updates `@tanstack/devtools-event-client` from 0.4.4 to 0.5.0
- [Release notes](https://github.com/TanStack/devtools/releases)
- [Commits](https://github.com/TanStack/devtools/commits/@tanstack/devtools-event-client@0.5.0/packages/devtools-event-client)

Updates `@tanstack/devtools-vite` from 0.7.2 to 0.8.4
- [Release notes](https://github.com/TanStack/devtools/releases)
- [Changelog](https://github.com/TanStack/devtools/blob/main/packages/devtools-vite/CHANGELOG.md)
- [Commits](https://github.com/TanStack/devtools/commits/@tanstack/devtools-vite@0.8.4/packages/devtools-vite)

Updates `@tanstack/match-sorter-utils` from 8.19.4 to 9.1.2
- [Release notes](https://github.com/TanStack/table/releases)
- [Changelog](https://github.com/TanStack/table/blob/main/packages/match-sorter-utils/CHANGELOG.md)
- [Commits](https://github.com/TanStack/table/commits/@tanstack/match-sorter-utils@9.1.2/packages/match-sorter-utils)

Updates `@tanstack/react-query` from 5.100.14 to 5.101.4
- [Release notes](https://github.com/TanStack/query/releases)
- [Changelog](https://github.com/TanStack/query/blob/main/packages/react-query/CHANGELOG.md)
- [Commits](https://github.com/TanStack/query/commits/@tanstack/react-query@5.101.4/packages/react-query)

Updates `@tanstack/react-router` from 1.170.8 to 1.170.31
- [Release notes](https://github.com/TanStack/router/releases)
- [Changelog](https://github.com/TanStack/router/blob/main/packages/react-router/CHANGELOG.md)
- [Commits](https://github.com/TanStack/router/commits/@tanstack/react-router@1.170.31/packages/react-router)

Updates `@tanstack/react-table` from 8.21.3 to 9.1.2
- [Release notes](https://github.com/TanStack/table/releases)
- [Changelog](https://github.com/TanStack/table/blob/main/packages/react-table/CHANGELOG.md)
- [Commits](https://github.com/TanStack/table/commits/@tanstack/react-table@9.1.2/packages/react-table)

Updates `docx-preview` from 0.3.7 to 0.4.0
- [Release notes](https://github.com/VolodymyrBaydalka/docxjs/releases)
- [Commits](https://github.com/VolodymyrBaydalka/docxjs/commits/0.4.0)

Updates `katex` from 0.17.0 to 0.18.4
- [Release notes](https://github.com/KaTeX/KaTeX/releases)
- [Changelog](https://github.com/KaTeX/KaTeX/blob/main/CHANGELOG.md)
- [Commits](KaTeX/KaTeX@v0.17.0...v0.18.4)

Updates `@testing-library/jest-dom` from 6.10.0 to 7.0.1
- [Release notes](https://github.com/testing-library/jest-dom/releases)
- [Changelog](https://github.com/testing-library/jest-dom/blob/main/CHANGELOG.md)
- [Commits](testing-library/jest-dom@v6.10.0...v7.0.1)

Updates `@types/qrcode` from 1.5.5 to 1.5.6
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/qrcode)

---
updated-dependencies:
- dependency-name: "@tanstack/ai"
  dependency-version: 0.46.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: web-dependencies
- dependency-name: "@tanstack/ai-anthropic"
  dependency-version: 0.16.7
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: web-dependencies
- dependency-name: "@tanstack/ai-client"
  dependency-version: 0.24.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: web-dependencies
- dependency-name: "@tanstack/ai-gemini"
  dependency-version: 0.24.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: web-dependencies
- dependency-name: "@tanstack/ai-openai"
  dependency-version: 0.20.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: web-dependencies
- dependency-name: "@tanstack/ai-react"
  dependency-version: 0.20.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: web-dependencies
- dependency-name: "@tanstack/devtools-event-client"
  dependency-version: 0.5.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: web-dependencies
- dependency-name: "@tanstack/devtools-vite"
  dependency-version: 0.8.4
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: web-dependencies
- dependency-name: "@tanstack/match-sorter-utils"
  dependency-version: 9.1.2
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: web-dependencies
- dependency-name: "@tanstack/react-query"
  dependency-version: 5.101.4
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: web-dependencies
- dependency-name: "@tanstack/react-router"
  dependency-version: 1.170.31
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: web-dependencies
- dependency-name: "@tanstack/react-table"
  dependency-version: 9.1.2
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: web-dependencies
- dependency-name: docx-preview
  dependency-version: 0.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: web-dependencies
- dependency-name: katex
  dependency-version: 0.18.4
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: web-dependencies
- dependency-name: "@testing-library/jest-dom"
  dependency-version: 7.0.1
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: web-dependencies
- dependency-name: "@types/qrcode"
  dependency-version: 1.5.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: web-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file javascript Pull requests that update javascript code labels Sep 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file javascript Pull requests that update javascript code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants