Release history.

Every package release from the assistant-ui monorepo, grouped by day.

Oct 19, 2026

24 releases

>@assistant-ui/ai-sdk@0.0.14preserve AI SDK history messages listed before their parents by sharing core's parent-first ordering helper. Keep the selected head and sibling branches while continuing to skip malformed messages and orphaned descendants.3 changes

Fixes2

preserve AI SDK history messages listed before their parents by sharing core's parent-first ordering helper. Keep the selected head and sibling branches while continuing to skip malformed messages and orphaned descendants.
keep streams resumable when tool output or custom data contains a nested finish type. Clear the checkpoint only after a complete SSE event identifies itself as a finish event.

Other1

Add an opt-in canResume flag for interrupted runs. An adapter that keeps an exact checkpoint sets canResume, and resumeRun resumes it; concurrent resumes share one attempt. canResume is optional on thread state, so existing custom thread clients remain compatible. The AI SDK runtime offers it only while resumable storage holds a pending stream, and the server must replay the interrupted message with its original ID.
view on github
>@assistant-ui/core@0.3.30ModelContext takes maxSystemLength to cap the merged system prompt, trimming the lowest-priority parts first, or mergeSystem to combine the prioritized SystemParts yourself21 changes

Features4

ModelContext takes maxSystemLength to cap the merged system prompt, trimming the lowest-priority parts first, or mergeSystem to combine the prioritized SystemParts yourself
add the internal thread list runtime core that runs on a RemoteThreadList client, and let RemoteThreadListHookInstanceManager publish hosted thread runtimes during commit
add the internal RemoteThreadList seams that useRemoteThreadListRuntime needs to run on the store client. a plain RemoteThreadList now aborts a thread's pending send when that thread is deleted, detached or dropped by an adapter-replacing reload, as InMemoryThreadList and useRemoteThreadListRuntime already do, and logs a failed automatic title the way useRemoteThreadListRuntime does
run useRemoteThreadListRuntime on the RemoteThreadList store client unless the adapter it mounts with sets unstable_Provider, so both thread list paths share one implementation. a runtime that mounts without unstable_Provider serves later adapters through unstable_useAdapters and warns in development when one only has unstable_Provider. The thread list still lives as long as the returned runtime. After a failed first load, a controlled threadId change no longer reloads the list; call reload to retry. RemoteThreadListThreadListRuntimeCore is deprecated for direct use.

Fixes7

preserve AI SDK history messages listed before their parents by sharing core's parent-first ordering helper. Keep the selected head and sibling branches while continuing to skip malformed messages and orphaned descendants.
preserve mention labels and IDs containing directive delimiters without changing existing bracket-form directives.
isolate adapter hooks so swapping thread list adapters preserves the hosted runtime's hook order
restore unsent drafts using the latest attachment cleanup state.
keep a controlled new-thread request selected when the previous draft initializes during the switch
send mutations for each remote thread to its adapter in call order
core
re-read the server title after a failed title write-back instead of leaving the list on a title the server never received

Refactors2

createLocalStorageAdapter (and so createFileStorageAdapter in @assistant-ui/react-ink) no longer sets unstable_Provider, which only wrapped the adapters its unstable_useAdapters already returns, so useRemoteThreadListRuntime runs it on the RemoteThreadList store client like the cloud adapter. a useRemoteThreadListRuntime that mounts with it now ignores unstable_Provider on any later adapter, so give that adapter unstable_useAdapters to keep its per-thread history
add the internal per-thread hosts that run a useRemoteThreadListRuntime runtime hook inside a RemoteThreadList client

Other8

Track selectors that read through a forwarding client when its target changes.
Add a Resume control for interrupted runs. useComposerResume from @assistant-ui/core/react and ComposerPrimitive.Resume resume a run whose adapter reports canResume; the control is disabled while the draft is not empty or the thread is busy.
Add an opt-in canResume flag for interrupted runs. An adapter that keeps an exact checkpoint sets canResume, and resumeRun resumes it; concurrent resumes share one attempt. canResume is optional on thread state, so existing custom thread clients remain compatible. The AI SDK runtime offers it only while resumable storage holds a pending stream, and the server must replay the interrupted message with its original ID.
useAuiState and aui.composer.getState now see composer text as soon as setText returns, so an input that keeps its own state, such as react-mentions, no longer moves the caret to the end.
adapters may omit unarchive; archived threads then open without unarchiving and explicit unarchive rejects. the OpenCode adapter omits it because OpenCode cannot unarchive a session.
Pass draft thread custom metadata to remote thread initialization.
Wait for a replacement thread runtime to attach before a thread switch settles. A switch still pending when the thread list is destroyed now rejects with a silent ThreadListDestroyedError, and a switch whose replacement runtime fails to mount rejects with the mount error.
retry automatic title generation after a thread's first run ends if it still has no title, including threads created outside the runtime.
view on github
>@assistant-ui/react@0.15.30ModelContext takes maxSystemLength to cap the merged system prompt, trimming the lowest-priority parts first, or mergeSystem to combine the prioritized SystemParts yourself5 changes

Features1

ModelContext takes maxSystemLength to cap the merged system prompt, trimming the lowest-priority parts first, or mergeSystem to combine the prioritized SystemParts yourself

Fixes1

call a directive trigger's onInserted under the Lexical composer once the directive is in the composer text; onDirectiveSelect now fires at the same point

Other3

Add a Resume control for interrupted runs. useComposerResume from @assistant-ui/core/react and ComposerPrimitive.Resume resume a run whose adapter reports canResume; the control is disabled while the draft is not empty or the thread is busy.
useAuiState and aui.composer.getState now see composer text as soon as setText returns, so an input that keeps its own state, such as react-mentions, no longer moves the caret to the end.
run the thread viewport on the shared auto-scroll controller, so a viewport footer's height counts toward the bottom of the thread
view on github
>@assistant-ui/react-devtools@1.2.25preserve the selected Activity run when older events leave the DevTools log1 change

Fixes1

preserve the selected Activity run when older events leave the DevTools log
view on github
>@assistant-ui/react-ink@0.0.52ModelContext takes maxSystemLength to cap the merged system prompt, trimming the lowest-priority parts first, or mergeSystem to combine the prioritized SystemParts yourself2 changes

Features1

ModelContext takes maxSystemLength to cap the merged system prompt, trimming the lowest-priority parts first, or mergeSystem to combine the prioritized SystemParts yourself

Other1

adapters may omit unarchive; archived threads then open without unarchiving and explicit unarchive rejects. the OpenCode adapter omits it because OpenCode cannot unarchive a session.
view on github
>@assistant-ui/react-lexical@0.2.19call a directive trigger's onInserted under the Lexical composer once the directive is in the composer text; onDirectiveSelect now fires at the same point1 change

Fixes1

call a directive trigger's onInserted under the Lexical composer once the directive is in the composer text; onDirectiveSelect now fires at the same point
view on github
>@assistant-ui/react-mcp@0.1.24keep registered MCP tool names within provider limits while preserving their original server and tool routing.1 change

Fixes1

keep registered MCP tool names within provider limits while preserving their original server and tool routing.
view on github
>@assistant-ui/react-native@0.1.49ModelContext takes maxSystemLength to cap the merged system prompt, trimming the lowest-priority parts first, or mergeSystem to combine the prioritized SystemParts yourself3 changes

Features2

ModelContext takes maxSystemLength to cap the merged system prompt, trimming the lowest-priority parts first, or mergeSystem to combine the prioritized SystemParts yourself
react-native
add asChild to the composer's Send, Cancel, AddAttachment, and QuoteDismiss primitives, so a UI kit button can be the press target instead of being nested inside the primitive's Pressable

Fixes1

keep an inverted ThreadPrimitive.RowsFlatList still while a reply streams when its newest row renders nothing, slide a message that lands at the bottom into view instead of snapping it there, and stop following new rows when autoScroll is false
view on github
>@assistant-ui/react-pi@0.0.32load custom models from the configured Pi agent directory when listing and selecting models.3 changes

Fixes3

load custom models from the configured Pi agent directory when listing and selecting models.
provide a working theme for Pi extensions in the Node host so formatting status text does not fail thread initialization
use the configured Pi agent directory when creating, listing, and reopening saved sessions.
view on github
>assistant-stream@0.3.53release Redis producer lease bookkeeping when finalization finds an expired or superseded stream, preserving newer leases and legacy ownership fences.4 changes

Fixes4

release Redis producer lease bookkeeping when finalization finds an expired or superseded stream, preserving newer leases and legacy ownership fences.
prevent idle resumable stream readers from repeatedly waking and emitting timer overflow warnings when retention exceeds the platform timer limit.
preserve provider metadata on text and reasoning parts decoded from UI message streams.
preserve text and reasoning block identity when decoding interleaved UI message streams.
view on github
>assistant-ui@0.0.125report tw-shimmer, safe-content-frame, tailwindcss and the provider SDKs installed adapters peer on in assistant-ui info3 changes

Features2

cli
report tw-shimmer, safe-content-frame, tailwindcss and the provider SDKs installed adapters peer on in assistant-ui info
run every assistant-ui cloud subcommand other than login, logout and setup on Assistant Cloud. The CLI sends the command line with the saved login to the cloud management server and prints its answer, so cloud help, cloud whoami and cloud projects list come from the server and new commands need no CLI release.

Fixes1

preserve disabled message branch and hover filters when upgrading to AuiIf
view on github
>13 maintenance releasesdependency updates and chores
>@assistant-ui/generative-ui@0.0.6assistant-stream@0.3.531 change

Other1

assistant-stream@0.3.53
view on github
>@assistant-ui/react-a2a@0.2.47@assistant-ui/core@0.3.301 change

Other1

@assistant-ui/core@0.3.30
view on github
>@assistant-ui/react-ag-ui@0.0.71add an opt-in joinStrategy to keep one assistant message per AG-UI run1 change

Other1

add an opt-in joinStrategy to keep one assistant message per AG-UI run
view on github
>@assistant-ui/react-ai-sdk@1.4.19@assistant-ui/ai-sdk@0.0.141 change

Other1

@assistant-ui/ai-sdk@0.0.14
view on github
>@assistant-ui/react-generative-ui@0.1.5@assistant-ui/generative-ui@0.0.61 change

Other1

@assistant-ui/generative-ui@0.0.6
view on github
>@assistant-ui/react-google-adk@0.0.40adapters may omit unarchive; archived threads then open without unarchiving and explicit unarchive rejects. the OpenCode adapter omits it because OpenCode cannot unarchive a session.1 change

Other1

adapters may omit unarchive; archived threads then open without unarchiving and explicit unarchive rejects. the OpenCode adapter omits it because OpenCode cannot unarchive a session.
view on github
>@assistant-ui/react-ink-markdown@0.0.51@assistant-ui/core@0.3.301 change

Other1

@assistant-ui/core@0.3.30
view on github
>@assistant-ui/react-opencode@0.2.32adapters may omit unarchive; archived threads then open without unarchiving and explicit unarchive rejects. the OpenCode adapter omits it because OpenCode cannot unarchive a session.1 change

Other1

adapters may omit unarchive; archived threads then open without unarchiving and explicit unarchive rejects. the OpenCode adapter omits it because OpenCode cannot unarchive a session.
view on github
>@assistant-ui/store@0.3.22Track selectors that read through a forwarding client when its target changes.5 changes

Other5

Track selectors that read through a forwarding client when its target changes.
useAuiState and aui.composer.getState now see composer text as soon as setText returns, so an input that keeps its own state, such as react-mentions, no longer moves the caret to the end.
Notify child handles after their derived scopes catch up with parent changes.
preserve reading position when earlier messages load and support held follow and content inset updates
Keep Vue and Svelte viewport footer insets in the shared store controller.
view on github
>@assistant-ui/tap@0.9.24Add an optional root error handler for scheduled tap flushes.1 change

Other1

Add an optional root error handler for scheduled tap flushes.
view on github
>@assistant-ui/vue@0.0.5Remove internal test-only warning reset helpers while preserving development warning deduplication.3 changes

Other3

Remove internal test-only warning reset helpers while preserving development warning deduplication.
Notify child handles after their derived scopes catch up with parent changes.
Keep Vue and Svelte viewport footer insets in the shared store controller.
view on github
>create-assistant-ui@0.0.88assistant-ui@0.0.1251 change

Other1

assistant-ui@0.0.125
view on github
>generative-frame@0.0.7@assistant-ui/vue@0.0.51 change

Other1

@assistant-ui/vue@0.0.5
view on github

Oct 15, 2026

27 releases

>@assistant-ui/ai-sdk@0.0.13import loaded history beneath live messages instead of dropping it when a resumed stream or send wins the initial load race5 changes

Fixes2

import loaded history beneath live messages instead of dropping it when a resumed stream or send wins the initial load race
keep cancelled tool output from auto-sending

Other3

Add unstable_enableMessageQueue to the AI SDK runtimes. Messages sent during a run wait in composer.queue; steered messages run first after the current request and its client tools finish. Failed queued sends remain available for retry, and the runtime error hook exposes the failure.
Keep a deleted message out of external history when a run starts or settles while its deletion is still pending.
Persist user messages to external history as runs start so resumed streams retain their prompt.
view on github
>@assistant-ui/core@0.3.29report a failed thread switch, such as a URL-controlled threadId whose fetch rejects, as switchError on the threads state, and retry a controlled switch when the browser comes back online or the tab becomes visible19 changes

Features1

report a failed thread switch, such as a URL-controlled threadId whose fetch rejects, as switchError on the threads state, and retry a controlled switch when the browser comes back online or the tab becomes visible

Fixes7

keep copy feedback when unrelated assistant scopes change
prevent dictation from starting on a disabled thread
settle pending deletes after reloads, branch switches, and edits
report a still-initializing thread through onThreadIdChange once its remote id settles, instead of as undefined
core
make an automatic title wait for an explicit title generation in flight and run only if that produced no title, so the thread list and the server end on the same title
core
show the automatic title the server already saved when an explicit title generation fails or returns no title, and settle overlapping automatic titles on the newest one
keep text sending available when voice setup ends synchronously

Other11

assistant-cloud is a dependency of @assistant-ui/core instead of an optional peer, so @assistant-ui/core/react loads in Node and Vitest without installing it separately.
Project legacy audio parts as file parts with an audio/<format> media type when building a queued message's item, instead of dropping them.
A message an external-store host drops from the middle of its messages array is removed from the thread, with its feedback, instead of staying behind as a sibling branch.
Discard late client tool calls from cancelled external-store runs using host-provided run ids.
Clear frame tools and pending calls when the iframe document changes or reloads.
Keep external-store history copies up to date when an existing user message's attachments are added, removed, or changed.
Percent-decode base64 data URL payloads before forwarding them to model adapters, so escaped padding and alphabet characters are sent as bare base64.
Selecting the thread that is already displayed no longer cancels an in-flight controlled switch in the RemoteThreadList client.
Selecting the thread that is already displayed no longer cancels a pending thread switch in useRemoteThreadListRuntime.
A tool-call part carries responseDeliveryStatus: "queued" while the runtime holds its reply and has not sent it. The ADK runtime sets it on interrupt replies and tool answers held for the next turn, and LangGraph sets it on buffered tool replies, so the tool UI no longer shows them as sent.
A base64 data URL whose payload is percent-encoded is sent to providers with the decoded payload, even when its media type already matches.
view on github
>@assistant-ui/generative-ui@0.0.5specToUISpec from the new React-free @assistant-ui/generative-ui/spec/tree converts a generative-frame spec into the tree the Slack and Teams converters and generativeUIToJSX take, so a spec mode answer can go to Slack and Teams. event bindings become $action, bound controls get a name, and an action param that reads a bound control's state becomes a $field reference to it.6 changes

Features1

specToUISpec from the new React-free @assistant-ui/generative-ui/spec/tree converts a generative-frame spec into the tree the Slack and Teams converters and generativeUIToJSX take, so a spec mode answer can go to Slack and Teams. event bindings become $action, bound controls get a name, and an action param that reads a bound control's state becomes a $field reference to it.

Fixes4

generative-ui
name a React Native list row made only of a Table from its cells, and export useListViewItemText from the React Native @assistant-ui/generative-ui/spec build so a custom component's text names the row too
generative-ui
name a React Native list row in tree order when its text mounts late, such as a sibling that a visible condition shows again or a Timeline time that clears and returns
Badges stay readable inside a tinted Card on React Native: default and info Badges use an opaque theme pair there, and tone text in Badges and Fact chips mixes 55% tone with the ink instead of 60%, which keeps it above 4.5:1 on a dark tint.
generative-ui
keep a streamed child's state when its _key arrives after its _type, in the present and prompt_user tools and A2UI surfaces

Chores1

generative-ui
declare the actions the shipped Vue test helper's catalogs bind, so their handlers run
view on github
>@assistant-ui/react@0.15.29add OpenAIRealtimeVoiceAdapter for direct browser voice sessions with streamed transcripts, typed input, mute controls, and cancellable WebRTC setup.7 changes

Features1

add OpenAIRealtimeVoiceAdapter for direct browser voice sessions with streamed transcripts, typed input, mute controls, and cancellable WebRTC setup.

Fixes2

preserve pending attachment selections when unrelated assistant scopes change
ignore an attachment picker's selection after the active thread changes, keeping files out of the replacement conversation.

Other4

A run that starts while focus is in a field outside the thread no longer moves focus into the composer, and a composer that already has focus keeps its selection.
Clear frame tools and pending calls when the iframe document changes or reloads.
useAssistantFrameHost disposes the host when its iframe is removed from the page, so the frame's tools leave the model context and its pending calls reject right away, and it serves a new iframe mounted into the same ref.
Handle sparse MCP Apps message content without scanning array holes.
view on github
>@assistant-ui/react-ag-ui@0.0.70preserve AG-UI message metadata in snapshots4 changes

Fixes2

preserve AG-UI message metadata in snapshots
install the AG-UI client version the runtime uses in the README example

Other2

Add getRunContext to include host context entries in each AG-UI run input.
Stop after a run has finished with an interrupt keeps the interrupt answerable instead of marking the message cancelled.
view on github
>@assistant-ui/react-ink@0.0.51complete OSC 99 notifications so terminals display each alert independently.1 change

Fixes1

complete OSC 99 notifications so terminals display each alert independently.
view on github
>@assistant-ui/react-markdown@0.14.23refresh fenced code blocks when components.pre or components.code changes2 changes

Fixes1

refresh fenced code blocks when components.pre or components.code changes

Other1

Refresh existing fenced code blocks when their renderer overrides change.
view on github
>@assistant-ui/react-mcp@0.1.23preserve custom server additions when revisiting a storage scope before its initial load finishes.1 change

Fixes1

preserve custom server additions when revisiting a storage scope before its initial load finishes.
view on github
>@assistant-ui/react-native@0.1.48run callback ref cleanup when thread lists unmount or their refs change1 change

Fixes1

run callback ref cleanup when thread lists unmount or their refs change
view on github
>@assistant-ui/react-pi@0.0.31settle projected message status after failed or cancelled sends and stream errors1 change

Fixes1

settle projected message status after failed or cancelled sends and stream errors
view on github
>@assistant-ui/store@0.3.21a client accessor called through call, apply or bind resolves its client like a direct call, so an optional call such as clientRef.current?.threads?. no longer throws b.call is not a function once a bundler lowers optional chaining (Vite 6's default build target does). Scope methods named call, apply, or bind are rejected by type validation because those names are reserved for invoking the accessor.1 change

Fixes1

a client accessor called through call, apply or bind resolves its client like a direct call, so an optional call such as clientRef.current?.threads?. no longer throws _b.call is not a function once a bundler lowers optional chaining (Vite 6's default build target does). Scope methods named call, apply, or bind are rejected by type validation because those names are reserved for invoking the accessor.
view on github
>@assistant-ui/vue@0.0.4ignore an attachment picker's selection after the active thread changes, so a late file no longer lands in another thread1 change

Fixes1

vue
ignore an attachment picker's selection after the active thread changes, so a late file no longer lands in another thread
view on github
>assistant-stream@0.3.52preserve incomplete status for server-aborted UI-message responses and discard buffered unfinished tool input.3 changes

Fixes1

preserve incomplete status for server-aborted UI-message responses and discard buffered unfinished tool input.

Other2

Preserve legacy MP3 and WAV audio parts as files when converting messages and attachments for data-stream requests.
Preserve explicit model content on settled tool results and send its text and media in data-stream requests.
view on github
>assistant-ui@0.0.124preserve local bindings and type imports when migrating legacy AI SDK imports6 changes

Fixes6

preserve local bindings and type imports when migrating legacy AI SDK imports
preserve unrelated strings such as constructor and toString when migrating event names during upgrades.
cli
preserve import aliases and type kinds during the v0.8 UI package split
fail upgrades when a required dependency installation fails
preserve runtime import bindings when migrating conditional primitives to AuiIf
preserve unrelated bindings when migrating ContentPart imports and MessagePrimitive.Content
view on github
>generative-frame@0.0.6resolveSpec(spec, { state }) resolves a spec into the element tree the renderer draws for one state, with conditions, repeat, and expressions applied and action params resolved, for targets that cannot run a renderer.36 changes

Features8

resolveSpec(spec, { state }) resolves a spec into the element tree the renderer draws for one state, with conditions, repeat, and expressions applied and action params resolved, for targets that cannot run a renderer.
generative-frame
mount earlier tool results under /tools in backend execution with the spec toolkit's toolResults option, once the server adds the exported SPEC_TOOL_RESULTS_RULE to its render_spec and spec guidance
the spec guidance now teaches how to compose an answer (the takeaway first, a Card for each module, key figures side by side, and a Map, Timeline, Steps, Table, or Image where the content calls for one), naming only the components a catalog has and only uses their slots and events allow, and no longer caps a spec at about 30 elements. render_spec's description carries these rules and the app's customRules, and createSpecTools takes customRules, so the rules hold even when a model never loads the spec module.
specs gain the built-in action copyText ({ text }), validated in every catalog, documented when catalog.prompt({ hostApi: { clipboard: true } }) says the host handles it, and reserved in defineCatalog. The assistant-ui spec toolkits for the web and for Vue write it to the clipboard with navigator.clipboard.writeText, only from an event a component emits, never from watch, and a copy that does not happen fails, so an action after it in the list, such as a confirmation, does not run. The React Native build leaves it out of the guidance unless an app passes handlers.copyText and specPrompt.hostApi.clipboard.
while a spec streams, elements that have not arrived take no space and one pending placeholder, three dots that pulse in turn, follows the spec instead of a gray bar for every missing element, and the render_spec container carries data-gf-streaming so styles can ease elements in as they arrive.
createSpecToolkit from the new generative-frame/spec/assistant-ui/vue entry renders render_spec calls in an @assistant-ui/vue thread with Vue components, deriving the same thread state as the React toolkit: earlier calls with the same title, earlier tool results under /tools in frontend execution, saved state, and what a UI shares with the model. @assistant-ui/vue and @assistant-ui/core are optional peers of that entry.
validateSpec reports unfilled-placeholder for a plain string that holds a ${/path}, ${$item…}, or ${$index} placeholder, or that is only an expression key such as "$calc", since both render as written, and the spec guidance says that only $template and $calc fill placeholders and that an expression can sit at any depth inside a prop, so a model that writes "${/guests} × 450 g" or a "$calc" table cell fixes it in the repair round.
generative-frame
let a widget ask the host to copy text with genframe.copyText(text) or navigator.clipboard.writeText(text), which reaches the new onCopyText handler; without one, copying fails in the widget

Fixes27

a repeat over the / pointer, the empty-string state key, now gives its items //0, //1, and so on, so $bindItem writes there instead of to numeric keys of the whole state.
readThemeTokens follows the page's --font-sans, or the body's computed font family when the page declares none, with the default system sans-serif stack, and a --font-mono the page declares with the default monospace stack, so on a page whose font stack names only web fonts with no generic fallback, such as a next/font family, a widget renders in a system face of the same kind instead of the browser's serif default; a stack that ends in a generic family keeps it.
a spec state write through an array records that array's path, so replaying it after the model state drops the array, through seed or restored interactions, recreates the array instead of collapsing appends into a - object key.
the assistant-ui spec toolkits fail a sendMessage that a watch dispatches or whose text is empty, as copyText does, so an action list stops there instead of confirming a message that was never sent.
an action list in a spec stops at the first action that fails, so a setState that confirms a host action runs only when that action succeeded. The failure is still reported to onError.
a render_spec call that patches an earlier spec with the same title now renders on that spec when it mounts before its title has streamed in. The base follows the title, and the stream starts over when the title brings a new one.
replace two-way bound array items without inserting duplicates, preserving replacements across state reseeding and saved interactions in React, React Native, and Vue.
an element whose component threw renders again once the element changes, in the React and Vue spec renderers, so a value it rejected while the spec was still streaming, such as an Image src bound to a state path cut short at /tools, no longer leaves its placeholder after the path completes.
validateSpec accepts an empty children or slot list on a component without that slot, since it adds nothing, so a repair that empties the list fixes the error instead of repeating it.
preserve inline spec prose when a CRLF newline is split across stream chunks.
report malformed spec document patches without discarding the last valid spec or crashing repair feedback.
generative-frame
warn with missing-tool-result from render_spec when a spec shows a /tools path the stored tool results do not have, so a model that read the value from output the thread does not store writes it into the spec instead of showing a blank
a render_spec call whose spec argument streams in with a root before its elements no longer crashes the renderer, in the assistant-ui spec toolkits for the web, React Native, and Vue, which now give such a spec an empty elements object until its elements arrive, and a later patches call with the same title builds on it.
a prop the catalog declares as a string, number, or boolean no longer receives a resolved object or array, in the React and Vue spec renderers, so a state path cut short at /tools while the spec streams no longer crashes a Vue mount; the element waits as pending while the spec streams and shows the invalid-props placeholder afterward.
clear removed model state while retaining user writes in spec renderers and toolkit calls.
defineCatalog rejects a host action named setState, as it does the other built-in action names, instead of letting the built-in shadow it in validation and guidance while a handler replaced it at runtime.
preserve root JSON Pointers in two-way state bindings across React, Vue, and React Native.
preserve spec child state and focus when siblings are inserted, removed, or reordered.
useSpecStream's reset now restarts a followed source from the current initial in React and Vue, so a render_spec call whose title completes after its patches renders them onto the earlier spec with that title at once.
while a spec streams, an element whose props are invalid keeps its last valid render, or takes no space before it has one, and an unknown type or a component that throws takes no space; each placeholder shows only if the problem remains once streaming ends, so a value cut short by the stream no longer flashes an error box.
within one message, a render_spec call that a later call with the same title patches renders nothing and stops sharing its choices with the model, and model context subscribers hear when it stops, so a spec the model repairs shows once instead of once per call, in the assistant-ui spec toolkits for the web, React Native, and Vue. A later call counts once its whole top-level title has arrived, regardless of JSON escaping, so a title still streaming or a nested title prop never hides an earlier spec by matching it for a moment.
validateSpec reports a state that is not an object with the new invalid-state issue code, so render_spec asks the model to fix a complete spec whose state is a string, an array, or null.
hide spec elements while their visibility condition has an unrecognized object shape, including nested negation, logical groups, and conditional branches.
track replacement, added, and removed spec watches without missing their next state change or changing React effect dependency counts.
read_me's description and the widget instructions ask for it before the first show_widget call instead of the first widget, render_spec's description points at the spec guidance in the system prompt and at the spec module of read_me only when the system prompt has none, the widget guidance's module index asks only for modules the instructions do not already include, with preload the instructions name the preloaded modules and tell the model not to load them again, and with render_spec they say that a spec answer needs none of the built-in widget modules, so a model with the spec guidance preloaded skips the redundant read_me round trip before render_spec.
generative-frame
remove a replacement frame that a newer replace supersedes or the widget disposes while it renders, so it cannot keep reaching host handlers
within one message, a widget that a later show_widget with the same title replaces, or that a later complete edit_widget changes, no longer stays on screen next to its replacement, while an edit that is still streaming or fails leaves the widget in place; earlier messages keep their own widgets, and a superseded call's pending render report resolves at once.

Other1

Handle sparse MCP Apps message content without scanning array holes.
view on github
>tw-shimmer@0.4.14redraw shimmer text when its content changes in Chrome, so a text shimmer whose box keeps its size (a block that fills its container, or a fixed-width inline-block) no longer garbles the new text1 change

Fixes1

redraw shimmer text when its content changes in Chrome, so a text shimmer whose box keeps its size (a block that fills its container, or a fixed-width inline-block) no longer garbles the new text
view on github
>11 maintenance releasesdependency updates and chores
>@assistant-ui/react-a2a@0.2.46@assistant-ui/core@0.3.291 change

Other1

@assistant-ui/core@0.3.29
view on github
>@assistant-ui/react-ai-sdk@1.4.18Add unstableenableMessageQueue to the AI SDK runtimes. Messages sent during a run wait in composer.queue; steered messages run first after the current request and its client tools finish. Failed queued sends remain available for retry, and the runtime error hook exposes the failure.1 change

Other1

Add unstable_enableMessageQueue to the AI SDK runtimes. Messages sent during a run wait in composer.queue; steered messages run first after the current request and its client tools finish. Failed queued sends remain available for retry, and the runtime error hook exposes the failure.
view on github
>@assistant-ui/react-data-stream@0.12.38Preserve explicit model content on settled tool results and send its text and media in data-stream requests.1 change

Other1

Preserve explicit model content on settled tool results and send its text and media in data-stream requests.
view on github
>@assistant-ui/react-generative-ui@0.1.4@assistant-ui/generative-ui@0.0.51 change

Other1

@assistant-ui/generative-ui@0.0.5
view on github
>@assistant-ui/react-google-adk@0.0.39Stopping an edit or reload, or superseding it with a new send, before its run produces its first event restores the turn it truncated, as a failure before the first event already does.4 changes

Other4

Stopping an edit or reload, or superseding it with a new send, before its run produces its first event restores the turn it truncated, as a failure before the first event already does.
A new turn split into one request per producing run is sent in order and stops at a failure or Stop: unsent tool replies stay held for the next turn and the typed message goes back to the composer.
A message keeps the same id while it streams, across continuation runs, and after the session reloads. Assistant message ids follow the ADK invocation, so assistant messages loaded from an existing session get new ids once. A user message keeps the id it was sent with when the server stores the run's custom metadata.
A tool-call part carries responseDeliveryStatus: "queued" while the runtime holds its reply and has not sent it. The ADK runtime sets it on interrupt replies and tool answers held for the next turn, and LangGraph sets it on buffered tool replies, so the tool UI no longer shows them as sent.
view on github
>@assistant-ui/react-ink-markdown@0.0.50@assistant-ui/core@0.3.291 change

Other1

@assistant-ui/core@0.3.29
view on github
>@assistant-ui/react-langchain@0.0.37A tool call that arrives without an id is shown as failed once its message is final, and no result is ever submitted under an id the provider did not issue.1 change

Other1

A tool call that arrives without an id is shown as failed once its message is final, and no result is ever submitted under an id the provider did not issue.
view on github
>@assistant-ui/react-langgraph@0.14.36A tool call that arrives without an id is shown as failed once its message is final, and no result is ever submitted under an id the provider did not issue.2 changes

Other2

A tool call that arrives without an id is shown as failed once its message is final, and no result is ever submitted under an id the provider did not issue.
A tool-call part carries responseDeliveryStatus: "queued" while the runtime holds its reply and has not sent it. The ADK runtime sets it on interrupt replies and tool answers held for the next turn, and LangGraph sets it on buffered tool replies, so the tool UI no longer shows them as sent.
view on github
>@assistant-ui/react-lexical@0.2.18Reset Lexical undo and redo history when the active composer changes threads.1 change

Other1

Reset Lexical undo and redo history when the active composer changes threads.
view on github
>create-assistant-ui@0.0.87assistant-ui@0.0.1241 change

Other1

assistant-ui@0.0.124
view on github
>heat-graph@0.0.25An omitted end no longer reads the clock during render: the server render and hydration end the graph at the latest data date, and it moves to today right after mount.2 changes

Other2

An omitted end no longer reads the clock during render: the server render and hydration end the graph at the latest data date, and it moves to today right after mount.
HeatGraph.Tooltip now throws when rendered outside HeatGraph.Root, matching the other parts
view on github

Oct 13, 2026

15 releases

>@assistant-ui/core@0.3.28leave an interactable that is still on its initialState out of persistence saves and exportState, so a changed initialState reaches users who never edited it18 changes

Fixes14

core
leave an interactable that is still on its initialState out of persistence saves and exportState, so a changed initialState reaches users who never edited it
run layout effects through useIsomorphicLayoutEffect so React 18 server renders stop warning, while Ink keeps its layout phase
core
skip a client tool whose call first appears after its turn was cancelled
core
preserve runtime routing when a queued item is edited
cancelling an idle external-store thread no longer takes its last user message back into the composer, and a message sent right after a stop that took the unanswered message back is no longer lost; if a host re-adds the stopped message from a captured snapshot, its draft is removed from the composer
core
hand running tool executions to a runtime remounted over the same message repository
core
keep the messages below an imported head instead of deleting them
core
a message deleted through an external store's onDelete while an earlier reply regenerates stays deleted when the old reply's branch is restored
core
keep a thread created in the page when a replacement adapter lists it
core
keep a rating on an off-branch message after switching branches in an external-store runtime
core
a queued external store message is dispatched under the thread tail and metadata of the runtime that queued it when several runtimes share one message queue
core
retry the cleanup of a file removed from a sending message when its removal fails and the message still goes out
keep a stopped user message in the host when its run restarts
core
keep a submitted rating visible when the host refreshes its messages

Other4

Preserve imported descendants through messages-array synchronization.
Keep a local runtime thread running, with Stop available, while its run streams on a branch you switched away from.
Keep retained tool actions bound to their original message and tool call.
Keep tool interaction recorders bound to the thread, message, and tool call that created them.
view on github
>@assistant-ui/generative-ui@0.0.4render a card as a panel on react native, keep a pixel-sized image at its size in a row, and tell the model a card is a module, with key figures in a row and image urls taken from tool results9 changes

Features3

render a card as a panel on react native, keep a pixel-sized image at its size in a row, and tell the model a card is a module, with key figures in a row and image urls taken from tool results
add Diagram and Map to the vocabulary, which render their Mermaid source and a list of linked places until a host draws them
add Tabs, Steps, Timeline, and Citation to the vocabulary, and a progress checklist mode to CheckboxGroup

Fixes5

generative-ui
remount a node renderer when its type changes
generative-ui
keep nested controls in pressable native list rows reachable with VoiceOver and TalkBack
accept numeric text in tabs, steps, timeline, and citations, and leave an empty citation source out of slack messages
generative-ui
escape model text before it reaches slack mrkdwn, so <!channel>, <@user> and <url|label> in model output render as plain text; caps count the escaped length and fromSlackBlocks decodes the entities
generative-ui
allow numeric text props in generative UI and convert them to text in Slack and Teams output. A numeric 0 now renders in Alert, Card, and Select text, native Checkbox and Switch labels are announced, and the Teams converter now ignores built-in property names such as constructor in Text.size and Alert.tone.

Other1

Improve native Fact and Badge text contrast across themes.
view on github
>@assistant-ui/react-a2a@0.2.45ignore the first SSE field when a stream starts with two byte order marks, as required by the event stream spec1 change

Fixes1

ignore the first SSE field when a stream starts with two byte order marks, as required by the event stream spec
view on github
>@assistant-ui/react-ag-ui@0.0.69run layout effects through useIsomorphicLayoutEffect so React 18 server renders stop warning, while Ink keeps its layout phase1 change

Fixes1

run layout effects through useIsomorphicLayoutEffect so React 18 server renders stop warning, while Ink keeps its layout phase
view on github
>@assistant-ui/react-data-stream@0.12.37preserve tool-result pairing for followed pending calls when including message IDs.1 change

Fixes1

preserve tool-result pairing for followed pending calls when including message IDs.
view on github
>@assistant-ui/react-google-adk@0.0.38ignore the first SSE field when a stream starts with two byte order marks, as required by the event stream spec9 changes

Fixes8

ignore the first SSE field when a stream starts with two byte order marks, as required by the event stream spec
react-google-adk
remove the optimistic user message when its request fails before the first event
react-google-adk
keep a held reply when a chained edit fails before its first event
react-google-adk
hold HITL replies and addToolResult answers until no run is active, including unrelated runs; answered confirmations and auth requests leave useAdkToolConfirmations and useAdkAuthRequests while held
react-google-adk
send attachment names to ADK and restore them when a session loads
react-google-adk
restore the right thread when a chained or same-tick edit, reload or resend fails before its first event
react-google-adk
keep tool-result batches scoped to their producing run
react-google-adk
restore the thread when an edit or reload fails before its first event or Stop interrupts its checkpoint lookup

Other1

Preserve queued ADK sends and keep each config group's tool results with its run.
view on github
>@assistant-ui/react-ink@0.0.50apply controlled input replacements and clears after batched typing1 change

Fixes1

apply controlled input replacements and clears after batched typing
view on github
>@assistant-ui/react-langgraph@0.14.35restore chained operations and plain sends that fail before their first chunk3 changes

Fixes1

react-langgraph
restore chained operations and plain sends that fail before their first chunk

Other2

Remove optimistic messages when a stream fails before its first event.
Restore the original thread state when an edit or reload fails before its first event.
view on github
>@assistant-ui/react-markdown@0.14.22keep multiline display math in nested blockquotes and list items, preserve math after an opener-line >, and keep prose after a closing \] or [/math] inside its quoted list item8 changes

Fixes6

react-markdown
keep multiline display math in nested blockquotes and list items, preserve math after an opener-line >, and keep prose after a closing \] or [/math] inside its quoted list item
react-markdown
preserve repeated list and quote prefixes for display math
react-markdown
keep a second display opened on a closer's line inside its quoted list item
react-markdown
keep multiline display math inside marker-only list items
react-markdown
keep a math tag display opened on a bracket closer's line inside its quoted list item
react-markdown
avoid quadratic scans on long tilde runs and display bodies

Performance1

react-markdown
keep preprocessing linear for lines with many triple-backtick or tilde runs

Other1

Keep multiline display math inside same-line nested list items.
view on github
>@assistant-ui/react-pi@0.0.30ignore the first SSE field when a stream starts with two byte order marks, as required by the event stream spec2 changes

Fixes2

ignore the first SSE field when a stream starts with two byte order marks, as required by the event stream spec
react-pi
stop a run the server promotes from the queue while Stop clears it
view on github
>@assistant-ui/store@0.3.20run layout effects through useIsomorphicLayoutEffect so React 18 server renders stop warning, while Ink keeps its layout phase1 change

Fixes1

run layout effects through useIsomorphicLayoutEffect so React 18 server renders stop warning, while Ink keeps its layout phase
view on github
>assistant-stream@0.3.51publish resumable producer errors without waiting for source cancellation.2 changes

Fixes1

publish resumable producer errors without waiting for source cancellation.

Other1

consume only one leading UTF-8 BOM when decoding SSE streams, so a second BOM does not turn an unknown field into event data.
view on github
>generative-frame@0.0.5with renderspec among the tools, buildWidgetInstructions and useWidgetInstructions tell the model when to answer in markdown, with a spec, or with a widget5 changes

Features4

with render_spec among the tools, buildWidgetInstructions and useWidgetInstructions tell the model when to answer in markdown, with a spec, or with a widget
a rendered UI can tell the model what the user chose. Specs gain the built-in actions sendMessage and updateModelContext (validated in every catalog, documented when catalog.prompt({ hostApi }) says the host handles them, and reserved in defineCatalog), widget guidance documents genframe.updateModelContext behind hostApi.modelContext, and the assistant-ui toolkits handle both: what a UI shares goes into the system prompt of later requests, marked as data and capped at 4,000 characters, and is saved with the call's state so it survives a reload. sendMessage runs only from a user's event, never from watch, which action handlers can now tell apart through kind on their second argument.
add $calc formulas to spec expressions, so a spec can compute totals, quantities that follow an input, and formatted values from its state. Formulas are parsed by a bounded interpreter (no eval), give null instead of throwing, and validateSpec reports one that does not parse as invalid-formula. The spec guidance and the format rules now describe them, and a pointer into an array reads only the array's own items.
keep a widget's genframe.setState value across reloads in the assistant-ui toolkit, and seed a frame's state with initialState

Other1

Require explicit fontStyleOrigins and fontOrigins options for external font providers such as Google Fonts. An empty CDN allowlist now blocks external stylesheets and font files unless their resource origins are configured.
view on github
>2 maintenance releasesdependency updates and chores
>@assistant-ui/react-generative-ui@0.1.3@assistant-ui/generative-ui@0.0.41 change

Other1

@assistant-ui/generative-ui@0.0.4
view on github
>@assistant-ui/react-ink-markdown@0.0.49@assistant-ui/core@0.3.281 change

Other1

@assistant-ui/core@0.3.28
view on github

Oct 12, 2026

15 releases

>@assistant-ui/core@0.3.27clear the adapter-change gate before a failed replacement thread list load reports isLoading: false, so a thread action started from that notification is not rejected4 changes

Fixes3

core
clear the adapter-change gate before a failed replacement thread list load reports isLoading: false, so a thread action started from that notification is not rejected
core
keep unstable_useInteractableState readers updating once the React Compiler optimizes the interactables resource
core
drop the previous adapter's threads when a replacement thread list response cannot be applied, keeping threads created under the replacement

Other1

A thread created while a replacement thread list loads now gets its automatic title once the list lands.
view on github
>@assistant-ui/generative-ui@0.0.3draw the spec vocabulary with React Native components, where @assistant-ui/generative-ui/spec resolves to a React Native build through the react-native condition with react-native as an optional peer, and export defaultGenerativeUILibrary from @assistant-ui/generative-ui/spec10 changes

Features3

draw the spec vocabulary with React Native components, where @assistant-ui/generative-ui/spec resolves to a React Native build through the react-native condition with react-native as an optional peer, and export defaultGenerativeUILibrary from @assistant-ui/generative-ui/spec
let a library entry declare its spec mode events and slots, and give spec components $slots and a $bindings setter for each prop bound to state
add @assistant-ui/generative-ui/vue, the vocabulary as Vue components for generative-frame's Vue spec renderer, with vue as an optional peer

Fixes5

submit an asForm card through its own action in the Slack and Teams converters when its confirm footer has none
keep a library component named __proto__ in toSpecCatalog, render an Icon with an unknown size at the medium size, and page a Carousel where Element.scrollBy is missing
generative-ui
give a React or Vue ListViewItem row action its own button instead of wrapping nested controls in role="button"
generative-ui
declare the number values Text, Caption, Fact and Badge already render, and keep them in the Slack and Teams converters
keep a present call editable on React 18 instead of locking it as an answered prompt

Refactors1

keep each vocabulary component's description and schema, the spec catalog shapes, and the render helpers in React-free modules, so renderers for other frameworks can share them

Chores1

generative-ui
compare the shipped Vue test helper's markup without React 18's empty input value
view on github
>@assistant-ui/react@0.15.28render an inert composer's inert attribute on React 18, so the cancel focus loop skips it as it does on React 191 change

Fixes1

react
render an inert composer's inert attribute on React 18, so the cancel focus loop skips it as it does on React 19
view on github
>@assistant-ui/react-google-adk@0.0.37send the answers to one run's long-running tool calls in one request once that run ends, instead of letting a later answer abort an earlier one; answers still held when the run is cancelled or the thread reloads are dropped, and onError and onCustomEvent now also fire for snakecase events2 changes

Fixes2

react-google-adk
send the answers to one run's long-running tool calls in one request once that run ends, instead of letting a later answer abort an earlier one; answers still held when the run is cancelled or the thread reloads are dropped, and onError and onCustomEvent now also fire for snake_case events
react-google-adk
send messages, tool answers and HITL replies made in the same tick in one request, or in order when their configs differ, instead of letting the later send abort the earlier one before its request leaves
view on github
>@assistant-ui/react-markdown@0.14.21normalizeMathDelimiters also keeps a $$ fence opened on a list item's marker line inside that item when a formula line starts with + or -, when the item sits in a blockquote, and when the body holds a code span4 changes

Fixes3

react-markdown
normalizeMathDelimiters also keeps a $$ fence opened on a list item's marker line inside that item when a formula line starts with + or -, when the item sits in a blockquote, and when the body holds a code span
react-markdown
normalizeMathDelimiters keeps a $$ fence opened on a list item's marker line, and the paragraph after it, inside that item instead of letting the body fall out of the list
react-markdown
keep display math inside a quoted list item, rewrite a \[...\] display whose body holds a code span, and stop reading a list marker line inside an open $$ block as an opener

Performance1

react-markdown
stop rescanning to the paragraph end for every inline code span while preprocessing
view on github
>@assistant-ui/tap@0.9.23read the React version from React's default export, so bundles that alias react to the standalone shim (the Svelte and Vue builds) no longer fail on a missing version export1 change

Fixes1

tap
read the React version from React's default export, so bundles that alias react to the standalone shim (the Svelte and Vue builds) no longer fail on a missing version export
view on github
>assistant-stream@0.3.50emit step-finish, message-finish and error chunks after the part chunks written before them, so the data stream keeps a tool call's args1 change

Fixes1

assistant-stream
emit step-finish, message-finish and error chunks after the part chunks written before them, so the data stream keeps a tool call's args
view on github
>generative-frame@0.0.4add unsafeShimDomain to load the shim from a self-hosted domain, and opaqueOrigin in generative-frame to render widgets in a null-origin sandbox without a shim7 changes

Features5

add unsafeShimDomain to load the shim from a self-hosted domain, and opaqueOrigin in generative-frame to render widgets in a null-origin sandbox without a shim
render spec mode on React Native, where generative-frame/spec/react and generative-frame/spec/assistant-ui resolve to React Native builds through the react-native condition, with react-native and @assistant-ui/react-native as optional peers
keep what the user changes in a rendered spec across reloads in the assistant-ui toolkit, on the web and on React Native, and let a spec state store list and restore its writes
let assistant-ui specs read earlier tool results from state expressions
add generative-frame/spec/vue, a Vue renderer for spec mode, with vue as an optional peer

Fixes2

generative-frame
pass an MCP Apps widget's ui/initialize params to a new onInitialized handler, including the display modes it declares
validate a patch-only render_spec call after a reload against the spec rendered from the thread
view on github
>safe-content-frame@0.0.34add unsafeShimDomain to load the shim from a self-hosted domain, and opaqueOrigin in generative-frame to render widgets in a null-origin sandbox without a shim1 change

Features1

add unsafeShimDomain to load the shim from a self-hosted domain, and opaqueOrigin in generative-frame to render widgets in a null-origin sandbox without a shim
view on github
>6 maintenance releasesdependency updates and chores
>@assistant-ui/react-a2a@0.2.44@assistant-ui/core@0.3.271 change

Other1

@assistant-ui/core@0.3.27
view on github
>@assistant-ui/react-ag-ui@0.0.68@assistant-ui/core@0.3.271 change

Other1

@assistant-ui/core@0.3.27
view on github
>@assistant-ui/react-generative-ui@0.1.2@assistant-ui/generative-ui@0.0.31 change

Other1

@assistant-ui/generative-ui@0.0.3
view on github
>@assistant-ui/react-opencode@0.2.31Keep a thread's list title in sync when its OpenCode session is retitled while the thread list loads, such as after the runtime receives a new client.1 change

Other1

Keep a thread's list title in sync when its OpenCode session is retitled while the thread list loads, such as after the runtime receives a new client.
view on github
>assistant-ui@0.0.123the agent skill the CLI installs now comes from the skills commit that teaches @assistant-ui/generative-ui and the type, key and action keys present models write1 change

Other1

the agent skill the CLI installs now comes from the skills commit that teaches @assistant-ui/generative-ui and the _type, _key and _action keys present models write
view on github
>create-assistant-ui@0.0.86assistant-ui@0.0.1231 change

Other1

assistant-ui@0.0.123
view on github

Oct 10, 2026

16 releases

>@assistant-ui/core@0.3.26preserve initial messages after an empty history load and persist them before the first new message3 changes

Fixes2

core
preserve initial messages after an empty history load and persist them before the first new message
core
treat each attachment add as a single attachment

Other1

Block typing, attachments, sends, and message editing while a thread is disabled.
view on github
>@assistant-ui/generative-ui@0.0.2add the ./spec entry with toSpecCatalog, which builds generative-frame spec mode's catalog and React components from a generative UI library; it needs generative-frame installed6 changes

Features1

generative-ui
add the ./spec entry with toSpecCatalog, which builds generative-frame spec mode's catalog and React components from a generative UI library; it needs generative-frame installed

Fixes4

generative-ui
prefix console warnings with the package's own name instead of @assistant-ui/react-generative-ui
generative-ui
name the present schema's reserved keys _type, _key, and _action so Anthropic models accept the tool. Models are told the root node needs _type too, a complete root without a type renders the children it wraps, trees in either spelling render, and development builds warn about prop names Anthropic rejects.
generative-ui
offer every distinct schema of a shared present prop and drop a value for it that only another component's schema accepts
generative-ui
submit an asForm card through its own _action when its confirm footer has none

Other1

Avoid development warnings for property collisions within the shipped generative UI vocabulary.
view on github
>@assistant-ui/react@0.15.27pass an MCP App's ui/initialize params to onInitialized as McpAppInitializeParams, including the display modes the app declares3 changes

Fixes1

react
pass an MCP App's ui/initialize params to onInitialized as McpAppInitializeParams, including the display modes the app declares

Other2

Guard the composer input example against IME confirmation Enter.
Block typing, attachments, sends, and message editing while a thread is disabled.
view on github
>@assistant-ui/store@0.3.19cancel a queued bottom scroll on wheel and touch, matching React1 change

Fixes1

store
cancel a queued bottom scroll on wheel and touch, matching React
view on github
>assistant-cloud@0.2.7reject stale run streaming auth headers1 change

Fixes1

cloud
reject stale run streaming auth headers
view on github
>generative-frame@0.0.3accept Standard Schema optional result members with undefined1 change

Fixes1

generative-frame
accept Standard Schema optional result members with undefined
view on github
>setup-agent@0.0.5add contextual assistant entry-point questions with validated options and stable selection answers, treat selected product names as starting goals for setup discovery, let installation steps name products outside the starting list, and keep the existing CLI exports and legacy session behavior2 changes

Features1

setup-agent
add contextual assistant entry-point questions with validated options and stable selection answers, treat selected product names as starting goals for setup discovery, let installation steps name products outside the starting list, and keep the existing CLI exports and legacy session behavior

Fixes1

setup-agent
checkout/cancel takes an optional checkout id, and the host ignores a cancel that names another checkout than the current one
view on github
>9 maintenance releasesdependency updates and chores
>@assistant-ui/eve@0.0.24Keep user file parts out of message content so a sent file renders once, as its attachment, instead of twice.1 change

Other1

Keep user file parts out of message content so a sent file renders once, as its attachment, instead of twice.
view on github
>@assistant-ui/react-a2a@0.2.43@assistant-ui/generative-ui@0.0.21 change

Other1

@assistant-ui/generative-ui@0.0.2
view on github
>@assistant-ui/react-ag-ui@0.0.67@assistant-ui/generative-ui@0.0.21 change

Other1

@assistant-ui/generative-ui@0.0.2
view on github
>@assistant-ui/react-generative-ui@0.1.1@assistant-ui/generative-ui@0.0.21 change

Other1

@assistant-ui/generative-ui@0.0.2
view on github
>@assistant-ui/react-opencode@0.2.30Stop calling OpenCode's session compaction endpoint to title threads, and update a thread's list title when OpenCode titles the session.1 change

Other1

Stop calling OpenCode's session compaction endpoint to title threads, and update a thread's list title when OpenCode titles the session.
view on github
>@assistant-ui/variants@0.0.3Ship the /variants agent skill at skills/variants/SKILL.md, so it always matches the installed version.1 change

Other1

Ship the /variants agent skill at skills/variants/SKILL.md, so it always matches the installed version.
view on github
>@assistant-ui/variants@0.0.2Keep outlines on regions that move, let the sidebar resize and animate open and closed, toggle the canvas from its button, show the shortcut with Mac symbols on Apple platforms, and tint the switcher warm.1 change

Other1

Keep outlines on regions that move, let the sidebar resize and animate open and closed, toggle the canvas from its button, show the shortcut with Mac symbols on Apple platforms, and tint the switcher warm.
view on github
>@assistant-ui/variants@0.0.1Publish @assistant-ui/variants to npm.1 change

Other1

Publish @assistant-ui/variants to npm.
view on github
>@assistant-ui/vue@0.0.3Block typing, attachments, sends, and message editing while a thread is disabled.1 change

Other1

Block typing, attachments, sends, and message editing while a thread is disabled.
view on github

Oct 9, 2026

39 releases

>@assistant-ui/ai-sdk@0.0.12mark every experimental API @deprecated Experimental since <date>, so editors strike it through as experimental rather than scheduled for removal; @typescript-eslint/no-deprecated reports these APIs too15 changes

Features2

mark every experimental API @deprecated Experimental since <date>, so editors strike it through as experimental rather than scheduled for removal; @typescript-eslint/no-deprecated reports these APIs too
add assistant-stream/ai-sdk with frontendTools

Fixes8

preserve cancelled messages when an AI SDK runtime remounts over the same chat
a UIMessage with a null or untyped part, a system message with several text parts or none, a file part without a url, or a text or dynamic-tool part missing its text or toolName no longer crashes the thread, stops messages from sending, or renders undefined values
isolate Cloud attachment URLs and message mappings by account or workspace scope.
report history as loading while a deferred load runs after a thread's remote id arrives
preserve live messages when history resolves after a send starts
reloading or editing an assistant response that joins several AI SDK messages no longer sends or keeps any part of the old response, including with joinStrategy: "none"
follow generated suggestion adapter replacements without restarting inline adapters
route immediate sends through replacement chat transports

Chores1

update dependencies

Other4

Reload Cloud threads when AISDKThreads changes Cloud client or workspace scope. Preserve a new controlled thread selection requested with the replacement adapter without overriding a later manual switch. Unchanged selections from the previous scope still reset.
move the AI SDK tool history codec out of useExternalHistory into its own module
Document request cancellation in AI SDK examples.
Expose argsStatus from useToolArgsStatus to distinguish incomplete argument objects from completed arguments while a tool is still running.
view on github
>@assistant-ui/core@0.3.25mark every experimental API @deprecated Experimental since <date>, so editors strike it through as experimental rather than scheduled for removal; @typescript-eslint/no-deprecated reports these APIs too92 changes

Features1

mark every experimental API @deprecated Experimental since <date>, so editors strike it through as experimental rather than scheduled for removal; @typescript-eslint/no-deprecated reports these APIs too

Fixes65

core
retry a failed interactable save on the next requested save or flush and clear its error once any later snapshot saves it
core
wait for in-flight saves to an interactables persistence adapter before loading it again
core
retry the current controlled thread after a failed delete restores it
core
retire thread runtimes when the runtime hook changes
core
stop applying an assistant transport run's snapshots once it is cancelled, even when its response body had fully arrived
core
retain interactable edits when persistence saves fail or time out
restore and pause queued messages when an asynchronous dispatch fails before its run starts.
retain a new thread's first title source through runtime restarts and retry automatic title generation after a detach
ignore attempts to switch an in-memory thread list to an unknown thread id
isolate Cloud attachment URLs and message mappings by account or workspace scope.
core
keep uploading the attachments of a message being sent when the composer's draft attachments are cleared
core
keep an attachment removed while its message was being sent out of the composer when the send fails, and keep one whose removal failed in the composer with the reason
keep external-store messages with missing fields from crashing the thread or showing "undefined" reasoning text
avoid starting suggestion requests after a local runtime detaches while preserving cancelled answer persistence.
core
stop dictation and speech when a thread runtime is disposed or superseded, as a realtime voice session already is
editing a message that carries a quote keeps the quote, so the edited message still shows it and still sends it to the model
fetch and encode URL-based image attachments before sending them to Pi; inaccessible or invalid URLs now fail the send
core
when a stop does not move the last user message back into the composer, the external store runtime's cancel resync no longer overwrites a host update it has not received yet (a message sent right after stopping); it also no longer writes back a stopped message the composer already holds, and it keeps the running placeholder of a run that started before the resync
stop a message deleted through onDelete from coming back as a branch when a frontend tool finishes before the host's next render
core
stop an external store reload from dispatching when Stop lands while client tool executions abort
core
an external store runtime recomputes its messages when client tools stop running, so no reply stays marked running after unstable_notifySessionReset or a conversation swap during a tool call
core
an external store send that waited for thread initialization is delivered when the host drops or replaces its message queue in the meantime, instead of being lost
core
a queued external store send is dispatched after its own thread's last message when another runtime shares the queue, as React StrictMode's second runtime instance does in development
core
drop the phantom default thread item from the external-store thread list
editing a message in ExternalThread keeps its image, file and other non-text parts, as the default edit composer already does, instead of sending only the text
AssistantFrameProvider.dispose now tells the parent it is gone, so AssistantFrameHost rejects tool calls still waiting on the frame right away instead of after the 30 s timeout
send the update that withdraws a frame's last cross-origin provider to the parent's origin, so the parent drops its tools instead of waiting out the 30 s call timeout
isolate LocalRuntime thread state across history scope changes
show a pending save, and its failure, on an interactable that unmounts and mounts again while the save is in flight
core
let a persistence load replace the detached state of an interactable that unmounted before the load resolved without a local edit
core
keep a tool-created interactable's unsent edit with the thread it was made in when switching threads
core
let a mounted thread keep initializing after a reload unlists it in useRemoteThreadListRuntime
core
keep the local message queue to one send at a time when a regenerate, a cancel or a follow-up run overlaps a queued send, or the queue is turned on during a run or while a message waits to be sent, and keep it sending after a cancel while a queued send waits to start. Once a regenerate replaces a cancelled run whose model adapter ignores the abort, the queue now moves on when the regenerate ends instead of waiting for the cancelled run as well.
support withFormat in the local storage history adapter so useChatRuntime persists AI SDK messages with createLocalStorageAdapter
retry local storage thread deletion across adapter reloads
core
keep every saved branch when a thread is exported while a placeholder message is its head
a send with no text no longer adds an empty user message when its only attachment is removed while the attachment is being prepared
let cancellation interrupt asynchronous request preparation, keep later resolver failures out of onError, and reuse the shared abort-race behavior in the A2A and Google ADK adapters
parse base64 data URLs without a media type across core converters, Google ADK, A2A, and AG-UI, defaulting them to application/octet-stream and keeping text/plain for media-less percent-encoded data URLs. Outgoing base64 URL envelopes without a type are stamped with the same default so downstream adapters do not receive an empty media type. Media-less image URLs continue to use image sniffing before reaching AG-UI.
preserve behavior on the advertised React 18 peer range
core
call adapter.remove once for a composer attachment whose removal is still pending. Removing it again does nothing, and reset and clearAttachments skip it. If that removal then fails, only the removeAttachment caller sees the rejection
core
keep a thread seeded with initialMessages local until its first send or run, so a remote thread list no longer creates an empty remote thread and requests its title on mount
follow generated suggestion adapter replacements without restarting inline adapters
core
keep a new thread's automatic title in the store client's thread list when its body remounts during the first initialize
core
reject item actions on a thread the store client's thread list no longer shows, matching useRemoteThreadListRuntime
bound retained input in shared line and SSE decoders, with configurable line and event limits across streaming clients
stop a delete, archive, unarchive, rename or custom metadata update still running on the previous thread list adapter from changing the new adapter's thread with the same id
keep a thread created and deleted in this session deleted when a thread list response served before the deletion arrives afterwards
keep a thread off the main slot when detach, archive or delete is called in the tick a switch to it lands, instead of stopping, archiving or deleting the thread the user is now in
merge a deep-linked thread's fetched metadata as an optimistic update, so an archive or delete that fails afterwards rolls back, a thread that initialized or was archived or deleted while the fetch was in flight keeps its current state as long as its slot id still resolves, and one remote thread never gets two slots
core
stop useRemoteThreadListRuntime listing threads a reload no longer returns: they leave threadItems and list item actions reject them, as in the RemoteThreadList client, while a hidden thread whose runtime is still mounted stays readable through getItemById
switch away from the main thread when an archive or delete aimed at its listed duplicate lands on it once initialize merges the two, instead of leaving the runtime on a deleted or archived thread
start the main thread's runtime when a switch or initialize selects a thread that was detached while it was in flight, instead of leaving the main thread with no runtime
open the controlled threadId once the thread list loads it when its first switch failed, instead of staying on a new thread while the prop names another
stop thread title generation from calling the adapter for a thread whose deletion already completed
keep a successful rename as the thread title when an overlapping later rename fails during title generation
core
do not run a frontend tool whose turn is cancelled, reloaded or replaced in the same tick its run settles
render MCP Apps through ToolUIDisplay on Parts, grouped, native, and ink
core
a message appended right before a sendCommand call reaches the assistant transport server ahead of that command when no client tool is executing
core
cancelRun ends an assistant transport run that failed while its onError callback is still pending, instead of leaving the run active until that callback settles, and reports the commands queued meanwhile to onCancel
core
cancelRun ends a resumed assistant transport run whose replay is waiting for a render that has not committed (for example while the UI around the runtime is suspended), instead of leaving the run active until that render commits
core
an assistant transport command sent right after cancelRun is sent in a follow-up run instead of being reported to onCancel; onCancel reports only the work pending when the cancel happened, including for a run cancelled before it started or while its onError callback was running
core
keep a file whose removal failed while it was still uploading in the composer when the send fails. A still-uploading file removed from the message being sent now stays in composer.submission.attachments, with its last status, until adapter.remove answers, instead of disappearing once the uploads settle. A file in the message being sent is removed at most once while its removal is pending: removing it again does nothing, and reset skips it. If that removal then fails, only the removeAttachment caller sees the rejection. A removal that has already failed is still retried
core
keep one live voice session when a thread subscriber or an external store's onVoiceTranscript reconnects voice mid-transition, and leave a user transcript or typed message from the replaced session out of the new one
reset voice volume when a realtime session ends on its own

Refactors4

core
move cloud run telemetry decoding out of the thread history adapter
fence late run work with one RunLeases primitive instead of per-adapter counters
core
move the dictation session out of BaseComposerRuntimeCore into its own controller
core
move the voice session lifecycle out of BaseThreadRuntimeCore into its own controller

Chores4

update dependencies
maintenance update with no changes to runtime behavior.
maintenance update with no changes to runtime behavior.
maintenance update with no changes to runtime behavior.

Other18

ignore the deferred cancel resync once the thread is reset
thread.import on an external store without an onImport handler now throws instead of changing the runtime repository without updating the store. To load a branch tree, pass it as messageRepository or implement onImport to write imported messages back to your store.
Reload Cloud threads when AISDKThreads changes Cloud client or workspace scope. Preserve a new controlled thread selection requested with the replacement adapter without overriding a later manual switch. Unchanged selections from the previous scope still reset.
assistant transport hooks used outside useAssistantTransportRuntime now throw the shared wrong-runtime error ("The current thread is not backed by the useAssistantTransportRuntime runtime.") instead of their own message, as the adapter runtimes do
keep completed thread-list updates, such as a deletion, applied when a reload starts from their final state notification
Forward ExternalThread model-context changes through thread.modelContextUpdate.
return the registered model context from ExternalThread's getModelContext instead of an empty one
Preserve the no-argument mutation methods on InMemoryThreadListAdapter while retaining thread metadata updates when arguments are provided.
Keep deleted local drafts hidden during remote thread-list adapter replacement.
keep a stale draft initialization from promoting after a replacement adapter list lands
Respect the runtime send policy for send-enabled suggestion triggers.
share the remote thread list's page merge between the store client and the legacy runtime core
preserve later thread switches when a replacement list load settles
Clear tool invocation state when restarting a failed stream pipeline.
keep the stored order of sibling branches when a thread session loads a message stored before its parent
Keep in-memory thread list entries available across reloads.
Keep local-storage thread deletion successful once metadata is removed even if history cleanup fails, preventing the client from restoring a thread whose later messages cannot be saved. Log cleanup failures and retry stale-history cleanup before reinitializing the same thread ID.
Expose argsStatus from useToolArgsStatus to distinguish incomplete argument objects from completed arguments while a tool is still running.
view on github
>@assistant-ui/eve@0.0.23declare the real media type on attachments crossing the eve converter instead of image/ and unknown/unknown3 changes

Fixes2

declare the real media type on attachments crossing the eve converter instead of image/* and unknown/unknown
keep streaming Eve tool arguments incomplete until input is available

Other1

isolate lifecycle callbacks with core's shared invokeUserCallback
view on github
>@assistant-ui/generative-ui@0.0.1mark every experimental API @deprecated Experimental since <date>, so editors strike it through as experimental rather than scheduled for removal; @typescript-eslint/no-deprecated reports these APIs too10 changes

Features3

mark every experimental API @deprecated Experimental since <date>, so editors strike it through as experimental rather than scheduled for removal; @typescript-eslint/no-deprecated reports these APIs too
export resolveFieldReferences and hasFieldReference, so a custom component that dispatches its own $action can resolve { "$field": name } references against its own values. resolveFieldReferences now keeps a reference nested deeper than 64 levels as is, matching hasFieldReference.
initial release. the framework-neutral home of generative UI, previously published as @assistant-ui/react-generative-ui. the root entry is the React-free UI tree (formerly ./ir), ./react holds the React renderer and tools (formerly the root entry), and ./a2ui, ./slack, and ./teams keep their names.

Fixes4

read current input values for A2UI action bindings nested in objects and arrays.
resolve nested A2UI action paths without losing empty property names
enable Slack single-line input action events on Enter outside forms when the input declares an action, and decode passive single-line inputs from fromSlackBlocks without an $action.
generative-ui
ignore Safari's IME confirmation Enter in vocabulary inputs

Refactors1

generative-ui
keep the generic vocabulary independent of A2UI internals

Other2

build the A2UI present tool call in one place: surfaceToPresentToolCall in @assistant-ui/generative-ui/a2ui, used by the AG-UI and A2A adapters
decode A2UI JSON pointers through one shared decoder with explicit absolute and scope-relative entry points
view on github
>@assistant-ui/metro@0.0.17recognize JSONGenerativeUI imported from @assistant-ui/generative-ui/react, so "use generative" toolkits can depend on the framework-neutral package.1 change

Features1

recognize JSONGenerativeUI imported from @assistant-ui/generative-ui/react, so "use generative" toolkits can depend on the framework-neutral package.
view on github
>@assistant-ui/react@0.15.26mark every experimental API @deprecated Experimental since <date>, so editors strike it through as experimental rather than scheduled for removal; @typescript-eslint/no-deprecated reports these APIs too17 changes

Features1

mark every experimental API @deprecated Experimental since <date>, so editors strike it through as experimental rather than scheduled for removal; @typescript-eslint/no-deprecated reports these APIs too

Fixes7

show the selection toolbar after a window blur
react
recognize user scrolls coalesced with programmatic bottom scrolling
AssistantFrameProvider.dispose now tells the parent it is gone, so AssistantFrameHost rejects tool calls still waiting on the frame right away instead of after the 30 s timeout
enforce MCP App resource CSP metadata inside widget frames
show the scroll-to-bottom control after a wheel interrupts smooth scrolling
render MCP Apps through ToolUIDisplay on Parts, grouped, native, and ink
react
strike through the deprecated ComposerPrimitive.Unstable_TriggerPopover* aliases, whose notices sat above their export statements where TypeScript ignores them

Chores1

update dependencies

Other8

Restore focus to the thread composer after cancelling a message edit with Escape or keyboard/assistive-technology activation of the Cancel button. Pointer activation preserves the existing focus behavior.
Avoid React 18 server-render warnings from layout effects while keeping client layout timing.
render MessagePrimitive.Unstable_PartsGrouped leaves through core's part renderer instead of a copy
Show the selection toolbar when a selection ends at offset zero at the start of the next message without selecting its content.
Keep thread viewport event listeners stable across unrelated renders.
Keep thread viewport observers stable and preserve scheduled scroll behavior.
the thread viewport follows content that grows without a DOM change (an expanding collapsible, a loading image, an autosizing textarea) and updates isAtBottom so the scroll-to-bottom button shows; the React viewport now shares observeContentResize with Vue and Svelte
stop following the bottom of the thread viewport when the user expands a disclosure inside a message, so a card opened mid-stream stays in view
view on github
>@assistant-ui/react-a2a@0.2.42keep the run an onCancel callback starts when a send supersedes the active run9 changes

Fixes5

react-a2a
keep the run an onCancel callback starts when a send supersedes the active run
react-a2a
drop a send that onCancel starts while a thread switch is in progress
let cancellation interrupt asynchronous request preparation, keep later resolver failures out of onError, and reuse the shared abort-race behavior in the A2A and Google ADK adapters
parse base64 data URLs without a media type across core converters, Google ADK, A2A, and AG-UI, defaulting them to application/octet-stream and keeping text/plain for media-less percent-encoded data URLs. Outgoing base64 URL envelopes without a type are stamped with the same default so downstream adapters do not receive an empty media type. Media-less image URLs continue to use image sniffing before reaching AG-UI.
bound retained input in shared line and SSE decoders, with configurable line and event limits across streaming clients

Refactors3

react-a2a
subscribe to the thread core through useSyncExternalStore
convert A2UI surfaces through @assistant-ui/generative-ui/a2ui instead of the @assistant-ui/react-generative-ui re-export shell.
fence late run work with one RunLeases primitive instead of per-adapter counters

Other1

build the A2UI present tool call in one place: surfaceToPresentToolCall in @assistant-ui/generative-ui/a2ui, used by the AG-UI and A2A adapters
view on github
>@assistant-ui/react-ag-ui@0.0.66mark every experimental API @deprecated Experimental since <date>, so editors strike it through as experimental rather than scheduled for removal; @typescript-eslint/no-deprecated reports these APIs too11 changes

Features1

mark every experimental API @deprecated Experimental since <date>, so editors strike it through as experimental rather than scheduled for removal; @typescript-eslint/no-deprecated reports these APIs too

Fixes2

react-ag-ui
keep reasoning that streams after a tool result on the text message that follows it
parse base64 data URLs without a media type across core converters, Google ADK, A2A, and AG-UI, defaulting them to application/octet-stream and keeping text/plain for media-less percent-encoded data URLs. Outgoing base64 URL envelopes without a type are stamped with the same default so downstream adapters do not receive an empty media type. Media-less image URLs continue to use image sniffing before reaching AG-UI.

Refactors2

convert A2UI surfaces through @assistant-ui/generative-ui/a2ui instead of the @assistant-ui/react-generative-ui re-export shell.
react-ag-ui
subscribe through useSyncExternalStore and expose the deprecated interrupt methods through an explicit facade

Other6

build the A2UI present tool call in one place: surfaceToPresentToolCall in @assistant-ui/generative-ui/a2ui, used by the AG-UI and A2A adapters
cancel the active run and queued messages when switching threads, and start no run until the switch finishes
A MESSAGES_SNAPSHOT without reasoning or activity records now keeps the reasoning and activity parts already streamed for its messages instead of erasing them.
Wait for initial history to load before sending new turns.
Preserve nested subagent messages and streamed reasoning/activity across message snapshots.
Preserve prior answer branches when AG-UI regeneration snapshots echo a tool-call parent.
view on github
>@assistant-ui/react-data-stream@0.12.36mark every experimental API @deprecated Experimental since <date>, so editors strike it through as experimental rather than scheduled for removal; @typescript-eslint/no-deprecated reports these APIs too4 changes

Features1

mark every experimental API @deprecated Experimental since <date>, so editors strike it through as experimental rather than scheduled for removal; @typescript-eslint/no-deprecated reports these APIs too

Fixes2

let cancellation interrupt asynchronous request preparation, keep later resolver failures out of onError, and reuse the shared abort-race behavior in the A2A and Google ADK adapters
bound retained input in shared line and SSE decoders, with configurable line and event limits across streaming clients

Chores1

update dependencies
view on github
>@assistant-ui/react-generative-ui@0.1.0Minorexport resolveFieldReferences and hasFieldReference, so a custom component that dispatches its own $action can resolve { "$field": name } references against its own values. resolveFieldReferences now keeps a reference nested deeper than 64 levels as is, matching hasFieldReference.7 changes

Features1

export resolveFieldReferences and hasFieldReference, so a custom component that dispatches its own $action can resolve { "$field": name } references against its own values. resolveFieldReferences now keeps a reference nested deeper than 64 levels as is, matching hasFieldReference.

Fixes3

read current input values for A2UI action bindings nested in objects and arrays.
resolve nested A2UI action paths without losing empty property names
enable Slack single-line input action events on Enter outside forms when the input declares an action, and decode passive single-line inputs from fromSlackBlocks without an $action.

Refactors1

the package now re-exports @assistant-ui/generative-ui, starting the 0.1 line. all existing imports keep working unchanged; new code should depend on @assistant-ui/generative-ui directly.

Other2

build the A2UI present tool call in one place: surfaceToPresentToolCall in @assistant-ui/generative-ui/a2ui, used by the AG-UI and A2A adapters
decode A2UI JSON pointers through one shared decoder with explicit absolute and scope-relative entry points
view on github
>@assistant-ui/react-google-adk@0.0.36mark every experimental API @deprecated Experimental since <date>, so editors strike it through as experimental rather than scheduled for removal; @typescript-eslint/no-deprecated reports these APIs too13 changes

Features1

mark every experimental API @deprecated Experimental since <date>, so editors strike it through as experimental rather than scheduled for removal; @typescript-eslint/no-deprecated reports these APIs too

Fixes7

react-google-adk
stop the active run when a message is edited or reloaded, and show the edited message and report the thread running while the checkpoint is looked up; Stop during a reload's checkpoint lookup puts the previous answer back
keep client ADK requests from overriding server run controls and shared state, with resolveRunConfig and resolveStateDelta for validated opt-in values
preserve isolated ADK session identities through proxy routes and create missing runner sessions before their first run
isolate Cloud attachment URLs and message mappings by account or workspace scope.
let cancellation interrupt asynchronous request preparation, keep later resolver failures out of onError, and reuse the shared abort-race behavior in the A2A and Google ADK adapters
parse base64 data URLs without a media type across core converters, Google ADK, A2A, and AG-UI, defaulting them to application/octet-stream and keeping text/plain for media-less percent-encoded data URLs. Outgoing base64 URL envelopes without a type are stamped with the same default so downstream adapters do not receive an empty media type. Media-less image URLs continue to use image sniffing before reaching AG-UI.
bound retained input in shared line and SSE decoders, with configurable line and event limits across streaming clients

Refactors2

react-google-adk
hold staged messages in the thread controller
fence late run work with one RunLeases primitive instead of per-adapter counters

Other3

hold ADK thread state in one controller with a pure reducer instead of nine mirrored React states
Wait for initial history to load before sending new turns.
restore the answer a reload replaced when its checkpoint lookup fails
view on github
>@assistant-ui/react-ink@0.0.49mark every experimental API @deprecated Experimental since <date>, so editors strike it through as experimental rather than scheduled for removal; @typescript-eslint/no-deprecated reports these APIs too5 changes

Features1

mark every experimental API @deprecated Experimental since <date>, so editors strike it through as experimental rather than scheduled for removal; @typescript-eslint/no-deprecated reports these APIs too

Fixes2

render the thread list item title through each distribution's own text element
render MCP Apps through ToolUIDisplay on Parts, grouped, native, and ink

Other2

Pass Pressable state to ActionBar Copy and feedback render-function children.
Disable composer inputs when the thread or input state is disabled.
view on github
>@assistant-ui/react-langchain@0.0.36mark every experimental API @deprecated Experimental since <date>, so editors strike it through as experimental rather than scheduled for removal; @typescript-eslint/no-deprecated reports these APIs too7 changes

Features1

mark every experimental API @deprecated Experimental since <date>, so editors strike it through as experimental rather than scheduled for removal; @typescript-eslint/no-deprecated reports these APIs too

Fixes4

isolate Cloud attachment URLs and message mappings by account or workspace scope.
react-langchain
stop the active reply before an edit or reload looks up its checkpoint, and drop a lookup that a later edit, reload or stop superseded
skip null tool call entries when cancelling pending tool calls on send, instead of throwing before the new message is submitted
react-langchain
convert LangChain standard multimodal content blocks

Other2

move LangChain message staging into a thread controller with a pure reducer
share normalizeToolCallArgs through the langchain converter seam instead of a langgraph copy
view on github
>@assistant-ui/react-langgraph@0.14.34mark every experimental API @deprecated Experimental since <date>, so editors strike it through as experimental rather than scheduled for removal; @typescript-eslint/no-deprecated reports these APIs too10 changes

Features1

mark every experimental API @deprecated Experimental since <date>, so editors strike it through as experimental rather than scheduled for removal; @typescript-eslint/no-deprecated reports these APIs too

Fixes5

isolate Cloud attachment URLs and message mappings by account or workspace scope.
react-langchain
convert LangChain standard multimodal content blocks
react-langgraph
stop the active run when a message is edited or reloaded, keep the thread running while the checkpoint is looked up, show the edited message during the lookup, and restore the previous thread if Stop cancels an edit or reload before it is sent
react-langgraph
hold frontend tool results until the run that emitted their calls ends, so the graph resumes once with every result in call order
skip null and unnamed tool call entries instead of crashing the thread

Refactors1

react-langgraph
hold run ownership in a thread controller with a pure reducer

Other3

Ignore client tool results for calls already cancelled by a queued user turn.
share normalizeToolCallArgs through the langchain converter seam instead of a langgraph copy
Share resumable partial-JSON parsing across stream runtimes.
view on github
>@assistant-ui/react-markdown@0.14.20export memoizeMarkdownComponents as a stable API, keeping unstablememoizeMarkdownComponents as a deprecated alias6 changes

Features1

react-markdown
export memoizeMarkdownComponents as a stable API, keeping unstable_memoizeMarkdownComponents as a deprecated alias

Fixes1

a lone backtick no longer pairs with a code span in a later list item, heading or blockquote, so the preprocess helpers leave that code span's $ and \(...\) as written; headings, thematic breaks and HTML blocks inside nested list items are recognized the same way

Chores1

update dependencies

Other3

fix escapeCurrencyDollars, normalizeMathDelimiters, rewriteLatexBracketDelimiters and rewriteCustomMathTags rewriting text inside indented code blocks.
avoid serializing unchanged Markdown nodes during streaming comparisons.
serve the preprocess helpers from one source: @assistant-ui/react-markdown/preprocess is a new subpath, and @assistant-ui/react-streamdown re-exports the same functions instead of carrying a copy
view on github
>@assistant-ui/react-mcp@0.1.22reject a live OAuth authorization URL that is not https or loopback http, matching stored discovery7 changes

Fixes4

react-mcp
reject a live OAuth authorization URL that is not https or loopback http, matching stored discovery
store only HTTP(S) MCP OAuth authorization URLs
require HTTPS or loopback HTTP for authenticated MCP servers
generate MCP OAuth state with cryptographically secure randomness

Refactors1

react-mcp
move elicitation, custom server persistence and stored data normalization into their own modules

Chores1

update dependencies

Other1

surface the error and keep a custom server when clearing its auth state fails, instead of silently retrying the removal
view on github
>@assistant-ui/react-native@0.1.47mark every experimental API @deprecated Experimental since <date>, so editors strike it through as experimental rather than scheduled for removal; @typescript-eslint/no-deprecated reports these APIs too7 changes

Features1

mark every experimental API @deprecated Experimental since <date>, so editors strike it through as experimental rather than scheduled for removal; @typescript-eslint/no-deprecated reports these APIs too

Fixes4

react-native
render image message parts from MessagePrimitive.Parts
react-native
render image parts in MessageContent when no renderer is passed, matching MessageParts
render the thread list item title through each distribution's own text element
render MCP Apps through ToolUIDisplay on Parts, grouped, native, and ink

Other2

Pass Pressable state to ActionBar Copy and feedback render-function children.
Disable composer inputs when the thread or input state is disabled.
view on github
>@assistant-ui/react-opencode@0.2.29reconcile pending interactions without restoring settled requests after reconnect6 changes

Fixes3

reconcile pending interactions without restoring settled requests after reconnect
react-opencode
ignore failed cancel and revert requests once a newer run owns the thread
preserve behavior on the advertised React 18 peer range

Refactors2

fence late run work with one RunLeases primitive instead of per-adapter counters
react-opencode
move child session bookkeeping out of the thread controller

Chores1

update dependencies
view on github
>@assistant-ui/react-pi@0.0.29resubscribe a mounted thread on the next send after a decoder limit ends its event stream8 changes

Fixes5

react-pi
resubscribe a mounted thread on the next send after a decoder limit ends its event stream
fetch and encode URL-based image attachments before sending them to Pi; inaccessible or invalid URLs now fail the send
react-pi
cancel only the run that was active when Stop was pressed
preserve behavior on the advertised React 18 peer range
bound retained input in shared line and SSE decoders, with configurable line and event limits across streaming clients

Refactors2

fence late run work with one RunLeases primitive instead of per-adapter counters
react-pi
move the shared SSE stream cache out of the REST client

Other1

isolate lifecycle callbacks with core's shared invokeUserCallback
view on github
>@assistant-ui/react-streamdown@0.3.20type every PluginConfig slot with its streamdown plugin interface instead of unknown4 changes

Fixes1

type every PluginConfig slot with its streamdown plugin interface instead of unknown

Chores1

maintenance update with no changes to runtime behavior.

Other2

serve the preprocess helpers from one source: @assistant-ui/react-markdown/preprocess is a new subpath, and @assistant-ui/react-streamdown re-exports the same functions instead of carrying a copy
render StreamdownTextPrimitive through a single memoized body component
view on github
>@assistant-ui/store@0.3.18cancel a queued bottom scroll when Enter, Space or a navigation key is pressed outside text entry, matching React9 changes

Fixes1

store
cancel a queued bottom scroll when Enter, Space or a navigation key is pressed outside text entry, matching React

Performance1

store
wake only the selectors whose clients changed, so a token in a long thread no longer re-runs every message and part selector

Other7

Forward ExternalThread model-context changes through thread.modelContextUpdate.
return the registered model context from ExternalThread's getModelContext instead of an empty one
Keep thread viewport observers stable and preserve scheduled scroll behavior.
move the Vue thread viewport's auto scroll into a framework-neutral createThreadViewportAutoScroll in @assistant-ui/store/client
the thread viewport follows content that grows without a DOM change (an expanding collapsible, a loading image, an autosizing textarea) and updates isAtBottom so the scroll-to-bottom button shows; the React viewport now shares observeContentResize with Vue and Svelte
cancel a queued scroll to bottom when the user scrolls up in the shared thread viewport auto scroll, as a pointer gesture already does
pause thread bottom-follow when a message disclosure expands
view on github
>@assistant-ui/tap@0.9.22reuse a clean child registered without deps when its parent passes the same element3 changes

Fixes3

reuse a clean child registered without deps when its parent passes the same element
preserve behavior on the advertised React 18 peer range
tap
a flushTapSync runs only the tasks and notifications queued in its own flush, so an update dispatched before a flushTapSync to a root its callback does not update is no longer flushed by it and commits on the next scheduled flush; a mountOnSubscribe root subscribed from a listener no longer fails on another root's listener error, and a same-tick unsubscribe and resubscribe no longer remounts a lazy root when another root mounts in between
view on github
>@assistant-ui/vue@0.0.2mark every experimental API @deprecated Experimental since <date>, so editors strike it through as experimental rather than scheduled for removal; @typescript-eslint/no-deprecated reports these APIs too4 changes

Features1

mark every experimental API @deprecated Experimental since <date>, so editors strike it through as experimental rather than scheduled for removal; @typescript-eslint/no-deprecated reports these APIs too

Other3

Prevent Safari's IME confirmation Enter from sending messages in Lexical and Vue composers.
move the Vue thread viewport's auto scroll into a framework-neutral createThreadViewportAutoScroll in @assistant-ui/store/client
Clarify that ThreadPrimitiveMessages keys rows by message id but does not expose them to an outer TransitionGroup for individual transitions.
view on github
>@assistant-ui/x-generative-compiler@0.0.21recognize JSONGenerativeUI imported from @assistant-ui/generative-ui/react, so "use generative" toolkits can depend on the framework-neutral package.2 changes

Features1

recognize JSONGenerativeUI imported from @assistant-ui/generative-ui/react, so "use generative" toolkits can depend on the framework-neutral package.

Other1

keep unused classes whose static blocks, static initializers, computed keys, or extends expressions run code, and unused JSX whose attributes or children may run code, when pruning compiled output
view on github
>assistant-cloud@0.2.6add explicit browser authentication invalidation for session changes3 changes

Fixes2

add explicit browser authentication invalidation for session changes
cloud
normalize trailing slashes in the base URL the same way for auth requests and trace export

Refactors1

cloud
build request and run streaming headers in one place
view on github
>assistant-stream@0.3.49mark every experimental API @deprecated Experimental since <date>, so editors strike it through as experimental rather than scheduled for removal; @typescript-eslint/no-deprecated reports these APIs too16 changes

Features2

mark every experimental API @deprecated Experimental since <date>, so editors strike it through as experimental rather than scheduled for removal; @typescript-eslint/no-deprecated reports these APIs too
add assistant-stream/ai-sdk with frontendTools

Fixes9

cancel polyfilled stream iterators before their first read and forward the cancellation reason.
assistant-stream
keep the args of a complete tool call frame that follows a tool call start
reject malformed data-stream frame values at the parse boundary instead of crashing or coercing. Frames such as e:null or 0:123 that previously passed through now throw in strict mode and are dropped with a log in strict: false.
carry a tool result's messages across the data-stream wire
deliver tool-call finish chunks in the order the tool calls close
bound retained input in shared line and SSE decoders, with configurable line and event limits across streaming clients
a createAssistantStream callback that throws now ends its own open parts instead of leaving the response hanging. Text and reasoning parts get their part-finish; tool calls whose args were still streaming are cut off without a part-finish or args-finish chunk. Background writes to parts ended by the failure are ignored; writes after an explicit close retain strict-mode errors. Merged streams keep delivering their output until their producers finish. Already completed args and the legacy data-stream encoder's fatal-error handling are unchanged.
report asynchronous streamCall errors without blocking streamed arguments or waiting for callbacks that outlive the assistant stream
a tool call's streamed args now reach the stream before its result, so addToolCallPart({ args, response }) keeps its args over the data stream instead of arriving as {}

Refactors1

assistant-stream
share one option type between tool execution and its result stream

Chores1

update dependencies

Other3

preserve error code and severity on the data stream wire. an error that sets either now emits an object frame such as 3:{"error":"rate limited","code":"rate_limit"} that clients older than this release cannot read, so upgrade clients before servers that set them; an error without metadata stays a bare 3:"message" string, and the decoder reads both shapes.
Share resumable partial-JSON parsing across stream runtimes.
Expose argsStatus from useToolArgsStatus to distinguish incomplete argument objects from completed arguments while a tool is still running.
view on github
>assistant-ui@0.0.122write only the assistant-ui server into Cursor, Windsurf and Claude Desktop MCP configs3 changes

Fixes2

cli
write only the assistant-ui server into Cursor, Windsurf and Claude Desktop MCP configs
cli
accept comments and trailing commas in VS Code and Zed MCP configuration while preserving unrelated settings.

Other1

give the CLI's download, package manager, and file discovery helpers one home each
view on github
>generative-frame@0.0.2stream model-generated HTML and SVG widgets into Safe Content Frames with an MCP Apps-compatible host bridge, theme tokens, diagnostics, in-frame screenshots, per-id persistent storage, provider-agnostic widget tools, prompt guidance, and a repair loop; React bindings and an assistant-ui toolkit; and a declarative spec mode in separate entry points (generative-frame/spec, /spec/react, /spec/tools, /spec/assistant-ui) that never bundles the frame1 change

Features1

stream model-generated HTML and SVG widgets into Safe Content Frames with an MCP Apps-compatible host bridge, theme tokens, diagnostics, in-frame screenshots, per-id persistent storage, provider-agnostic widget tools, prompt guidance, and a repair loop; React bindings and an assistant-ui toolkit; and a declarative spec mode in separate entry points (generative-frame/spec, /spec/react, /spec/tools, /spec/assistant-ui) that never bundles the frame
view on github
>setup-agent@0.0.4keep a finished setup done when a late cancel arrives, create .env.local owner-only and open it before taking the one-time key, stop counting acknowledged follow-ups, refuse duplicate or :-containing option ids, restrict an existing .env.local to its owner, lock a preset to --only even with --choices, refuse duplicate variant ids, and dispose a client whose first connection fails3 changes

Fixes2

setup-agent
keep a finished setup done when a late cancel arrives, create .env.local owner-only and open it before taking the one-time key, stop counting acknowledged follow-ups, refuse duplicate or :-containing option ids, restrict an existing .env.local to its owner, lock a preset to --only even with --choices, refuse duplicate variant ids, and dispose a client whose first connection fails
setup-agent
validate environment variable names inside the exported dotenv helper and scope CLI secret retrieval to the current setup and model input

Chores1

setup-agent
move setup-agent into the assistant-ui workspace and keep its published CLI, host, and protocol entry points
view on github
>10 maintenance releasesdependency updates and chores
>@assistant-ui/mcp-docs-server@0.3.4update dependencies2 changes

Chores1

update dependencies

Other1

support @modelcontextprotocol/server 2.3
view on github
>@assistant-ui/next@0.0.25@assistant-ui/x-generative-compiler@0.0.211 change

Other1

@assistant-ui/x-generative-compiler@0.0.21
view on github
>@assistant-ui/react-ai-sdk@1.4.17@assistant-ui/ai-sdk@0.0.121 change

Other1

@assistant-ui/ai-sdk@0.0.12
view on github
>@assistant-ui/react-devtools@1.2.24share one registry subscription and one projection per change across in-process devtools subscribers1 change

Other1

share one registry subscription and one projection per change across in-process devtools subscribers
view on github
>@assistant-ui/react-ink-markdown@0.0.48support ink 8 stream types while keeping shared resize subscriptions1 change

Other1

support ink 8 stream types while keeping shared resize subscriptions
view on github
>@assistant-ui/react-lexical@0.2.17Prevent Safari's IME confirmation Enter from sending messages in Lexical and Vue composers.2 changes

Other2

Prevent Safari's IME confirmation Enter from sending messages in Lexical and Vue composers.
reuse the parsed composer text across the Lexical SyncPlugin's checks instead of reparsing it for each one
view on github
>@assistant-ui/react-o11y@0.0.47update dependencies2 changes

Chores1

update dependencies

Other1

stop rebuilding the span tree and re-creating unchanged spans when one span is collapsed or expanded
view on github
>@assistant-ui/vite@0.0.21@assistant-ui/x-generative-compiler@0.0.211 change

Other1

@assistant-ui/x-generative-compiler@0.0.21
view on github
>create-assistant-ui@0.0.85assistant-ui@0.0.1221 change

Other1

assistant-ui@0.0.122
view on github
>heat-graph@0.0.24update dependencies1 change

Chores1

update dependencies
view on github

Oct 6, 2026

62 releases

>@assistant-ui/ai-sdk@0.0.11avoid repeated toolkit parameter schema conversion3 changes

Fixes1

avoid repeated toolkit parameter schema conversion

Other2

a tool approval can ask several questions at once, or let one question take several answers: display: "questions" with approval.questions, answered through respondToApproval({ answers }) keyed by question id, validated before it reaches onRespondToToolApproval and recorded on approval.answers; the AI SDK converter reads questions and answers from the approval descriptor when a response handler is set, and the cloud format keeps them
Forward MCP Apps metadata from AI SDK tool metadata while keeping server routing controlled by provider metadata.
view on github
>@assistant-ui/core@0.3.24support message-scoped converter metadata invalidation14 changes

Features1

support message-scoped converter metadata invalidation

Fixes5

core
release realtime voice listeners when a session ends on its own
traverse deeply nested tool-call messages without overflowing the stack
core
keep the selected branch when a local run continues an existing answer
disable message speech actions when no speech adapter is configured
preserve OpenCode interactions with prototype-named identifiers

Other8

a tool approval can ask several questions at once, or let one question take several answers: display: "questions" with approval.questions, answered through respondToApproval({ answers }) keyed by question id, validated before it reaches onRespondToToolApproval and recorded on approval.answers; the AI SDK converter reads questions and answers from the approval descriptor when a response handler is set, and the cloud format keeps them
name local runtime initial messages from React's useId during a server render, so a Next.js cacheComponents prerender no longer reads Math.random; the browser keeps random ids
getSuggestionKeys moved to @assistant-ui/core/internal so React and Vue key suggestions the same way.
a thread can open on its latest page and load older messages on demand: the external store adapter takes hasEarlier and onLoadEarlier, the runtime surfaces them as thread.hasEarlier, thread.isLoadingEarlier and aui.thread.loadEarlier with one load in flight at a time, ThreadPrimitive.LoadEarlier loads the next page, ThreadPrimitive.Viewport keeps the visible messages in place when it lands above them, and the React Native ThreadPrimitive.MessagesFlatList pages through the runtime when it gets no history prop
reasoning parts carry an optional timing with their start and end times, typed as the new MessagePartTiming that ToolCallTiming now aliases, so a host can show how long its agent thought; the assistant-stream accumulator stamps it while reasoning streams, joined reasoning parts and the cloud format keep it, and a MessagePrimitive.GroupedParts group reports the span of its timed parts as timing
the composer trigger popover primitives and their adapter, item, category and directive formatter types get stable names; the Unstable_ names stay as deprecated aliases, and the trigger popover hooks stay unstable
a long thread can be virtualized per part instead of per message: createThreadRowsSelector flattens the thread for useAuiState into stable rows (a user message, each top-level part group of an assistant message, a turn end) that keep their identity while tokens stream, and ThreadPrimitive.Row renders one row with only the scopes it needs; a turn-end row carries the turn's start time and, once the turn completes, the latest end its messages record, so a turn footer can show how long the agent worked
a server rendered local runtime now names id-less initial messages and tool calls the same way while the browser hydrates, so data-message-id and selection quotes match the client's messages
view on github
>@assistant-ui/core@0.3.23the remaining runtime hooks keep their thread loads, runs, queued messages, subagent transcripts and event streams across a fast refresh or a StrictMode replay instead of tearing them down8 changes

Fixes3

the remaining runtime hooks keep their thread loads, runs, queued messages, subagent transcripts and event streams across a fast refresh or a StrictMode replay instead of tearing them down
core
resolve aui.threads.getLoadThreadsPromise, reload and loadMore once getState reports the result: the loaded list, or loadError when the initial load or reload fails. A failed loadMore request is logged and its promise still resolves. If the client can't commit within 100ms, as inside the act that completes the load in a test or under a Suspense boundary that hides the client, the promises resolve anyway. In tests, await them outside that act to read the loaded list.
core
end the voice session on hang up even when committing the unfinished reply throws; a synchronous voice commit failure is reported like a rejected one

Chores1

update dependencies

Other4

keep pending history writes from restoring deleted messages without delaying deletion
report a history write that fails in the background through a thread historyWriteError event instead of dropping it silently
name a remote thread list's first new thread from React's useId during a server render, so a Next.js cacheComponents prerender no longer reads Math.random; the browser keeps a random id
preserve message part state by host-supplied identity across renderers and store lookups, and carry part identity through cloud persistence; a part whose type changes at the same position now mounts fresh state.
view on github
>@assistant-ui/react@0.15.25allow visible component action settle delays to be configured9 changes

Features2

allow visible component action settle delays to be configured
support message-scoped converter metadata invalidation

Fixes1

clean up cancelled and pre-load failed sandbox frame renders

Other6

a tool approval can ask several questions at once, or let one question take several answers: display: "questions" with approval.questions, answered through respondToApproval({ answers }) keyed by question id, validated before it reaches onRespondToToolApproval and recorded on approval.answers; the AI SDK converter reads questions and answers from the approval descriptor when a response handler is set, and the cloud format keeps them
a thread can open on its latest page and load older messages on demand: the external store adapter takes hasEarlier and onLoadEarlier, the runtime surfaces them as thread.hasEarlier, thread.isLoadingEarlier and aui.thread.loadEarlier with one load in flight at a time, ThreadPrimitive.LoadEarlier loads the next page, ThreadPrimitive.Viewport keeps the visible messages in place when it lands above them, and the React Native ThreadPrimitive.MessagesFlatList pages through the runtime when it gets no history prop
streaming text, running tool durations, and message stall detection read no wall clock during render, so a cacheComponents prerender no longer fails on them.
reasoning parts carry an optional timing with their start and end times, typed as the new MessagePartTiming that ToolCallTiming now aliases, so a host can show how long its agent thought; the assistant-stream accumulator stamps it while reasoning streams, joined reasoning parts and the cloud format keep it, and a MessagePrimitive.GroupedParts group reports the span of its timed parts as timing
the composer trigger popover primitives and their adapter, item, category and directive formatter types get stable names; the Unstable_ names stay as deprecated aliases, and the trigger popover hooks stay unstable
a long thread can be virtualized per part instead of per message: createThreadRowsSelector flattens the thread for useAuiState into stable rows (a user message, each top-level part group of an assistant message, a turn end) that keep their identity while tokens stream, and ThreadPrimitive.Row renders one row with only the scopes it needs; a turn-end row carries the turn's start time and, once the turn completes, the latest end its messages record, so a turn footer can show how long the agent worked
view on github
>@assistant-ui/react@0.15.24ignore the Enter or Escape that ends an IME composition, so committing a conversion in Safari no longer sends the message, and cancelling one no longer cancels the run or stops read-aloud3 changes

Fixes1

react
ignore the Enter or Escape that ends an IME composition, so committing a conversion in Safari no longer sends the message, and cancelling one no longer cancels the run or stops read-aloud

Chores1

update dependencies

Other1

key message parts by their id when no other part of the same type in the message shares it, so a replaced or reordered part no longer keeps another part's component state
view on github
>@assistant-ui/react-a2a@0.2.41keep runs started by onCancel abortable during runtime detachment1 change

Fixes1

keep runs started by onCancel abortable during runtime detachment
view on github
>@assistant-ui/react-a2a@0.2.40a2aPartsToContent and a2aMessageToContent skip null part entries instead of throwing, a2aPartToContent returns an empty text part for a null part, and a part with a null text, url or raw is read as if the field were absent, the way A2AClient already normalizes it3 changes

Fixes1

a2aPartsToContent and a2aMessageToContent skip null part entries instead of throwing, a2aPartToContent returns an empty text part for a null part, and a part with a null text, url or raw is read as if the field were absent, the way A2AClient already normalizes it

Chores1

update dependencies

Other1

Notify task subscribers when an owned server cancellation response updates the task.
view on github
>@assistant-ui/react-ag-ui@0.0.65convert deeply nested tool calls without overflowing the stack3 changes

Fixes1

convert deeply nested tool calls without overflowing the stack

Other2

opencode and ag-ui reasoning parts, and opencode tool call parts, now carry the start and end times their sources record
Hold queued messages while sending is disabled.
view on github
>@assistant-ui/react-ag-ui@0.0.64report an HttpAgent network failure to onError once, and keep an answer that already finished complete when the connection drops afterwards4 changes

Fixes3

report an HttpAgent network failure to onError once, and keep an answer that already finished complete when the connection drops afterwards
keep a resumed answer complete when Stop is pressed after the resume stream delivered it but before the stream closes
the remaining runtime hooks keep their thread loads, runs, queued messages, subagent transcripts and event streams across a fast refresh or a StrictMode replay instead of tearing them down

Chores1

update dependencies
view on github
>@assistant-ui/react-data-stream@0.12.35preserve assistant-generated files in subsequent model history1 change

Fixes1

preserve assistant-generated files in subsequent model history
view on github
>@assistant-ui/react-google-adk@0.0.35preserve run configuration when ADK tool results resume a turn1 change

Fixes1

preserve run configuration when ADK tool results resume a turn
view on github
>@assistant-ui/react-google-adk@0.0.34skip ADK messages, tool calls, and media parts that are missing required fields instead of crashing the thread or rendering broken images and files5 changes

Fixes3

skip ADK messages, tool calls, and media parts that are missing required fields instead of crashing the thread or rendering broken images and files
skip null tool call entries when projecting approvals, collecting confirmation and credential requests, cancelling pending calls, and sending messages
the remaining runtime hooks keep their thread loads, runs, queued messages, subagent transcripts and event streams across a fast refresh or a StrictMode replay instead of tearing them down

Chores1

update dependencies

Other1

Mark unfinished assistant messages as cancelled when an ADK run is stopped, including finalized tool-call and long-running tool messages.
view on github
>@assistant-ui/react-langchain@0.0.35support message-scoped converter metadata invalidation1 change

Features1

support message-scoped converter metadata invalidation
view on github
>@assistant-ui/react-langchain@0.0.34skip a null or nameless LangChain tool call instead of crashing the thread4 changes

Fixes3

skip a null or nameless LangChain tool call instead of crashing the thread
stop sending a cancellation without a tool_call_id for a pending tool call that has no id, which the graph rejects
the remaining runtime hooks keep their thread loads, runs, queued messages, subagent transcripts and event streams across a fast refresh or a StrictMode replay instead of tearing them down

Chores1

update dependencies
view on github
>@assistant-ui/react-langgraph@0.14.33support message-scoped converter metadata invalidation2 changes

Features1

support message-scoped converter metadata invalidation

Fixes1

parse streamed LangGraph tool arguments incrementally instead of reparsing the complete prefix for every delta
view on github
>@assistant-ui/react-langgraph@0.14.32stop sending a cancellation without a toolcallid for a pending tool call that has no id, which the graph rejects4 changes

Fixes3

stop sending a cancellation without a tool_call_id for a pending tool call that has no id, which the graph rejects
skip a null entry in an AI message's tool_call_chunks instead of throwing and dropping the reply, both while a chunk streams and when the message is converted
the remaining runtime hooks keep their thread loads, runs, queued messages, subagent transcripts and event streams across a fast refresh or a StrictMode replay instead of tearing them down

Chores1

update dependencies
view on github
>@assistant-ui/react-opencode@0.2.28preserve OpenCode interactions with prototype-named identifiers3 changes

Fixes1

preserve OpenCode interactions with prototype-named identifiers

Other2

opencode and ag-ui reasoning parts, and opencode tool call parts, now carry the start and end times their sources record
opencode question requests render as approval questionnaires on their tool call, answered through the default tool fallback
view on github
>@assistant-ui/react-opencode@0.2.27the remaining runtime hooks keep their thread loads, runs, queued messages, subagent transcripts and event streams across a fast refresh or a StrictMode replay instead of tearing them down3 changes

Fixes1

the remaining runtime hooks keep their thread loads, runs, queued messages, subagent transcripts and event streams across a fast refresh or a StrictMode replay instead of tearing them down

Chores1

update dependencies

Other1

keep a loaded pi or opencode thread from loading again when its runtime hook's effects replay
view on github
>@assistant-ui/react-pi@0.0.28preserve live runs while loading cold thread history2 changes

Fixes2

react-pi
preserve live runs while loading cold thread history
project streaming transcript updates incrementally
view on github
>assistant-stream@0.3.48preserve assistant-generated files in subsequent model history3 changes

Fixes2

preserve assistant-generated files in subsequent model history
use attachment media types when converting images for models

Other1

reasoning parts carry an optional timing with their start and end times, typed as the new MessagePartTiming that ToolCallTiming now aliases, so a host can show how long its agent thought; the assistant-stream accumulator stamps it while reasoning streams, joined reasoning parts and the cloud format keep it, and a MessagePrimitive.GroupedParts group reports the span of its timed parts as timing
view on github
>assistant-stream@0.3.47toGenericMessages no longer throws on a message without content, an attachment without content, or a null part or attachment; it skips what is missing and converts the rest of the conversation.2 changes

Fixes1

toGenericMessages no longer throws on a message without content, an attachment without content, or a null part or attachment; it skips what is missing and converts the rest of the conversation.

Chores1

update dependencies
view on github
>safe-content-frame@0.0.33clean up cancelled and pre-load failed sandbox frame renders1 change

Fixes1

clean up cancelled and pre-load failed sandbox frame renders
view on github
>40 maintenance releasesdependency updates and chores
>@assistant-ui/agent-launcher@0.1.17update dependencies1 change

Chores1

update dependencies
view on github
>@assistant-ui/ai-sdk@0.0.10update dependencies2 changes

Chores1

update dependencies

Other1

forward data part ids from AI SDK messages in both directions.
view on github
>@assistant-ui/eve@0.0.22a failed eve turn now ends as an error carrying eve's failure code and message, and a cancelled one as cancelled, instead of the cancelled or complete status eve's reducer left them with1 change

Other1

a failed eve turn now ends as an error carrying eve's failure code and message, and a cancelled one as cancelled, instead of the cancelled or complete status eve's reducer left them with
view on github
>@assistant-ui/eve@0.0.21update dependencies1 change

Chores1

update dependencies
view on github
>@assistant-ui/mcp-docs-server@0.3.3update dependencies1 change

Chores1

update dependencies
view on github
>@assistant-ui/metro@0.0.16update dependencies1 change

Chores1

update dependencies
view on github
>@assistant-ui/next@0.0.24update dependencies1 change

Chores1

update dependencies
view on github
>@assistant-ui/react-ai-sdk@1.4.16@assistant-ui/ai-sdk@0.0.111 change

Other1

@assistant-ui/ai-sdk@0.0.11
view on github
>@assistant-ui/react-ai-sdk@1.4.15update dependencies1 change

Chores1

update dependencies
view on github
>@assistant-ui/react-data-stream@0.12.34update dependencies1 change

Chores1

update dependencies
view on github
>@assistant-ui/react-devtools@1.2.23update dependencies1 change

Chores1

update dependencies
view on github
>@assistant-ui/react-generative-ui@0.0.24a DatePicker with its own action dispatches it once per committed value: a pick from the native picker commits at once, and a typed value commits on blur or on Enter outside a form, instead of dispatching every intermediate value while typing2 changes

Other2

a DatePicker with its own action dispatches it once per committed value: a pick from the native picker commits at once, and a typed value commits on blur or on Enter outside a form, instead of dispatching every intermediate value while typing
keep a datetime DatePicker's value stable while a year is typed in a time zone whose historical offset has seconds, by submitting second precision when the offset needs it
view on github
>@assistant-ui/react-generative-ui@0.0.23update dependencies3 changes

Chores1

update dependencies

Other2

give DatePicker time and datetime modes on the web, Slack and Teams, and map a2ui DateTimeInput onto them; a datetime with an offset is an instant that shows in the viewer's zone where the client knows it and submits with its original offset
submit edited DatePicker times in the browser's normalized form, so .500 goes out as .5 whichever spelling the browser reports
view on github
>@assistant-ui/react-hook-form@0.12.36update dependencies1 change

Chores1

update dependencies
view on github
>@assistant-ui/react-ink@0.0.48a tool approval can ask several questions at once, or let one question take several answers: display: "questions" with approval.questions, answered through respondToApproval({ answers }) keyed by question id, validated before it reaches onRespondToToolApproval and recorded on approval.answers; the AI SDK converter reads questions and answers from the approval descriptor when a response handler is set, and the cloud format keeps them5 changes

Other5

a tool approval can ask several questions at once, or let one question take several answers: display: "questions" with approval.questions, answered through respondToApproval({ answers }) keyed by question id, validated before it reaches onRespondToToolApproval and recorded on approval.answers; the AI SDK converter reads questions and answers from the approval descriptor when a response handler is set, and the cloud format keeps them
add MessagePrimitive.Quote, so a message sent with a composer quote can show what it replied to
reasoning parts carry an optional timing with their start and end times, typed as the new MessagePartTiming that ToolCallTiming now aliases, so a host can show how long its agent thought; the assistant-stream accumulator stamps it while reasoning streams, joined reasoning parts and the cloud format keep it, and a MessagePrimitive.GroupedParts group reports the span of its timed parts as timing
the composer trigger popover primitives and their adapter, item, category and directive formatter types get stable names; the Unstable_ names stay as deprecated aliases, and the trigger popover hooks stay unstable
a long thread can be virtualized per part instead of per message: createThreadRowsSelector flattens the thread for useAuiState into stable rows (a user message, each top-level part group of an assistant message, a turn end) that keep their identity while tokens stream, and ThreadPrimitive.Row renders one row with only the scopes it needs; a turn-end row carries the turn's start time and, once the turn completes, the latest end its messages record, so a turn footer can show how long the agent worked
view on github
>@assistant-ui/react-ink@0.0.47update dependencies2 changes

Chores1

update dependencies

Other1

key message parts by their id when no other part of the same type in the message shares it, so a replaced or reordered part no longer keeps another part's component state
view on github
>@assistant-ui/react-ink-markdown@0.0.47@assistant-ui/core@0.3.241 change

Other1

@assistant-ui/core@0.3.24
view on github
>@assistant-ui/react-ink-markdown@0.0.46update dependencies1 change

Chores1

update dependencies
view on github
>@assistant-ui/react-lexical@0.2.16update dependencies1 change

Chores1

update dependencies
view on github
>@assistant-ui/react-markdown@0.14.19update dependencies1 change

Chores1

update dependencies
view on github
>@assistant-ui/react-mcp@0.1.21update dependencies1 change

Chores1

update dependencies
view on github
>@assistant-ui/react-native@0.1.46a tool approval can ask several questions at once, or let one question take several answers: display: "questions" with approval.questions, answered through respondToApproval({ answers }) keyed by question id, validated before it reaches onRespondToToolApproval and recorded on approval.answers; the AI SDK converter reads questions and answers from the approval descriptor when a response handler is set, and the cloud format keeps them7 changes

Other7

a tool approval can ask several questions at once, or let one question take several answers: display: "questions" with approval.questions, answered through respondToApproval({ answers }) keyed by question id, validated before it reaches onRespondToToolApproval and recorded on approval.answers; the AI SDK converter reads questions and answers from the approval descriptor when a response handler is set, and the cloud format keeps them
a thread can open on its latest page and load older messages on demand: the external store adapter takes hasEarlier and onLoadEarlier, the runtime surfaces them as thread.hasEarlier, thread.isLoadingEarlier and aui.thread.loadEarlier with one load in flight at a time, ThreadPrimitive.LoadEarlier loads the next page, ThreadPrimitive.Viewport keeps the visible messages in place when it lands above them, and the React Native ThreadPrimitive.MessagesFlatList pages through the runtime when it gets no history prop
add MessagePrimitive.Quote, so a message sent with a composer quote can show what it replied to
reasoning parts carry an optional timing with their start and end times, typed as the new MessagePartTiming that ToolCallTiming now aliases, so a host can show how long its agent thought; the assistant-stream accumulator stamps it while reasoning streams, joined reasoning parts and the cloud format keep it, and a MessagePrimitive.GroupedParts group reports the span of its timed parts as timing
react native threads can virtualize per row with ThreadPrimitive.RowsFlatList, which renders each row with ThreadPrimitive.Row, supports inverted and pages earlier messages
the composer trigger popover primitives and their adapter, item, category and directive formatter types get stable names; the Unstable_ names stay as deprecated aliases, and the trigger popover hooks stay unstable
a long thread can be virtualized per part instead of per message: createThreadRowsSelector flattens the thread for useAuiState into stable rows (a user message, each top-level part group of an assistant message, a turn end) that keep their identity while tokens stream, and ThreadPrimitive.Row renders one row with only the scopes it needs; a turn-end row carries the turn's start time and, once the turn completes, the latest end its messages record, so a turn footer can show how long the agent worked
view on github
>@assistant-ui/react-native@0.1.45update dependencies2 changes

Chores1

update dependencies

Other1

key message parts by their id when no other part of the same type in the message shares it, so a replaced or reordered part no longer keeps another part's component state
view on github
>@assistant-ui/react-o11y@0.0.46update dependencies1 change

Chores1

update dependencies
view on github
>@assistant-ui/react-pi@0.0.27update dependencies2 changes

Chores1

update dependencies

Other1

keep a loaded pi or opencode thread from loading again when its runtime hook's effects replay
view on github
>@assistant-ui/react-streamdown@0.3.19update dependencies2 changes

Chores1

update dependencies

Other1

require streamdown 2.7 and remend 1.4, and keep the tail-bounded remend repair in step with remend 1.4's code spans, so a comparison after an escaped backtick still gets escaped
view on github
>@assistant-ui/react-syntax-highlighter@0.14.7update dependencies1 change

Chores1

update dependencies
view on github
>@assistant-ui/store@0.3.17update dependencies1 change

Chores1

update dependencies
view on github
>@assistant-ui/tap@0.9.21update dependencies2 changes

Chores1

update dependencies

Other1

tap gains an internal refresh scope that recomputes memos and replays effects for hooks it wraps when its token changes
view on github
>@assistant-ui/vite@0.0.20update dependencies1 change

Chores1

update dependencies
view on github
>@assistant-ui/vue@0.0.1first public release of @assistant-ui/vue, the Vue binding for assistant-ui: AuiProvider, useAui, useAuiState, useAuiEvent, and headless primitives for threads, messages, composers, attachments, branches, suggestions, and thread lists, running the same AI SDK runtime as React through @assistant-ui/ai-sdk1 change

Other1

first public release of @assistant-ui/vue, the Vue binding for assistant-ui: AuiProvider, useAui, useAuiState, useAuiEvent, and headless primitives for threads, messages, composers, attachments, branches, suggestions, and thread lists, running the same AI SDK runtime as React through @assistant-ui/ai-sdk
view on github
>@assistant-ui/x-buildutils@0.0.30update dependencies1 change

Chores1

update dependencies
view on github
>@assistant-ui/x-generative-compiler@0.0.20update dependencies1 change

Chores1

update dependencies
view on github
>assistant-cloud@0.2.5update dependencies1 change

Chores1

update dependencies
view on github
>assistant-ui@0.0.121the agent skill the CLI installs now comes from the skills commit that routes cloud persistence to the cloud option of useChatRuntime instead of the removed cloud-ai-sdk hooks3 changes

Other3

the agent skill the CLI installs now comes from the skills commit that routes cloud persistence to the cloud option of useChatRuntime instead of the removed cloud-ai-sdk hooks
add browser sign-in and cloud setup commands that provision a shared multiplayer chat with hackathon access-code support.
add --setup-url to cloud login and setup so an active setup wizard can show device authorization while the CLI polls Accounts and keeps its credentials locally.
view on github
>assistant-ui@0.0.120update dependencies1 change

Chores1

update dependencies
view on github
>create-assistant-ui@0.0.84assistant-ui@0.0.1211 change

Other1

assistant-ui@0.0.121
view on github
>create-assistant-ui@0.0.83update dependencies1 change

Chores1

update dependencies
view on github
>heat-graph@0.0.23update dependencies1 change

Chores1

update dependencies
view on github
>safe-content-frame@0.0.32update dependencies1 change

Chores1

update dependencies
view on github

Oct 2, 2026

24 releases

>@assistant-ui/ai-sdk@0.0.9give chat thread events the thread list's id instead of a placeholder9 changes

Fixes7

give chat thread events the thread list's id instead of a placeholder
ai-sdk
deliver a host tool approval answer when an earlier stored tool part is approval-requested without an approval object
keep a host tool-approval answer with its chat across runtime remounts and settled tool results
ai-sdk
store a message paused on an unanswered tool approval, so a reload keeps the approval request.
persist successful host approval answers after switching owners
runtime hooks keep their clients, runs, streams, queued sends and pending history copies across a fast refresh or a StrictMode replay instead of rebuilding or tearing them down
cancel unanswered approvals once a later AI SDK message follows them, and store late tool results in their originating message without resuming the obsolete run. with cancelPendingToolCallsOnSend: false and onRespondToToolApproval, superseded approvals settle as cancelled. an idle joined message keeps its auto status when the last entry has an open tool call, and the last message keeps running during a run.

Performance1

streaming tool input that contains a long run of }, ] or " no longer stalls the thread on every update

Other1

Report automatic reconnect errors exposed through the AI SDK's Chat.error, invoke onResumeError, and clear only the failed checkpoint. A replacement checkpoint remains intact if the callback starts another run. Errors from a subsequent send or resume are not attributed to a completed reconnect.
view on github
>@assistant-ui/core@0.3.22RuntimeCapabilities.answerToolCall reports whether a thread can answer a waiting tool call by adding its result, resuming it, or responding to its approval. a readonly thread reports false, a local thread true, and an external store true once it sets onAddToolResult, onResumeToolCall, or onRespondToToolApproval, or runs tools itself through unstableenableToolInvocations; the react-ink ToolFallback shows a pending approval's prompt without its Allow and Deny controls where it is false31 changes

Features2

RuntimeCapabilities.answerToolCall reports whether a thread can answer a waiting tool call by adding its result, resuming it, or responding to its approval. a readonly thread reports false, a local thread true, and an external store true once it sets onAddToolResult, onResumeToolCall, or onRespondToToolApproval, or runs tools itself through unstable_enableToolInvocations; the react-ink ToolFallback shows a pending approval's prompt without its Allow and Deny controls where it is false
the cloud thread list's create receives the id of the thread being saved, so a runtime whose backend assigns its id on the first turn can wait for that turn, and upsert: true makes a retried create reuse the thread that already has the returned external id

Fixes29

a history adapter without update now stores a paused run once a later turn cancels it, and importing a thread accepts a message listed before its parent, so a turn sent after a pause reloads instead of failing with Parent message not found
core
log a failed ThreadRuntime.append or MessageRuntime.reload with console.error instead of letting it surface as an unhandled rejection. Neither call returns its task, so the rejection never reached a caller; a host that sends these failures to an error tracker should catch them inside its own runtime callbacks.
cancel pending suggestions when their adapter is removed
a message sent while a local run is paused ends the pause instead of stranding it: open approvals record resolution: "cancelled", the paused message settles as cancelled, and a result added to it later no longer resumes the run and drops the turns after it; toGenericMessages closes out the calls of an earlier or settled message as not completed
register the SDK that changes along with the cloud on the new cloud in useCloudThreadListAdapter.
the anonymous cloud client picks up NEXT_PUBLIC_ASSISTANT_BASE_URL in Next.js production builds made with Turbopack, where the browser fell back to an in-memory thread list
keep an empty file part filename through cloud history, as image parts and attachments already do
refresh original source messages when a converter reuses its output for new inputs.
extract base64 data from URLs that omit the media type, preserving explicit file-type hints and defaulting standalone parsing to text/plain.
never resume a pause that a follow-up ended, even after the follow-up is deleted
derive joined assistant message status from its latest assistant segment.
read a tool part's original messages when it contains a nested conversation.
preserve a tool call's nested conversation when its result omits a replacement transcript.
reserve a queued run before notifying subscribers so reentrant enqueues preserve FIFO order.
keep a turn a subscriber appends while a run or an append is still moving the head
stop reloading a running thread from notifying store subscribers during render.
keep a runtime host's threads, their in-flight runs, and its runtime object across a fast refresh.
store a message before a turn that follows it while its run is still open, store a completed message a tool result replaced, and load a history that holds a child without its parent
keep copy feedback scoped to the message that was copied
core
ignore an interactable setState for an id that is not registered, so a later load still restores its stored value
give each in-memory thread its own composer, and abandon a deleted thread's pending attachment send instead of dispatching it through that thread; an external-store core adopting a shared repository mid-run now reuses its live optimistic placeholder
a thread its thread list discards for good now abandons an attachment send it was still preparing, instead of dispatching it after the thread is gone.
core
keep the message queue draining when a subscriber cancels while a queued message is being dispatched
disconnect active voice sessions when their adapter is removed
runtime hooks keep their clients, runs, streams, queued sends and pending history copies across a fast refresh or a StrictMode replay instead of rebuilding or tearing them down
a voice session ends and a pending attachment send is abandoned when the component calling a useExternalStoreRuntime that no thread list hosts unmounts, or when a remounted AssistantRuntimeProvider replaces a thread list's runtime
emit threadListItem.switchedTo and switchedAway from the tap thread lists
preserve higher-priority model context settings when providers overlap
give assistant transport user messages a client id, so the settled message replaces the optimistic one and reaches the cloud copy
view on github
>@assistant-ui/eve@0.0.20useEveAgentRuntime accepts cloud: Assistant Cloud backs the thread list, and each cloud thread keeps the eve session its first turn creates as its external id, saved with upsert so a retried save cannot store a second thread. a resuming session now reports isLoading, and a message sent during the replay waits for it instead of being refused2 changes

Features1

useEveAgentRuntime accepts cloud: Assistant Cloud backs the thread list, and each cloud thread keeps the eve session its first turn creates as its external id, saved with upsert so a retried save cannot store a second thread. a resuming session now reports isLoading, and a message sent during the replay waits for it instead of being refused

Fixes1

runtime hooks keep their clients, runs, streams, queued sends and pending history copies across a fast refresh or a StrictMode replay instead of rebuilding or tearing them down
view on github
>@assistant-ui/react@0.15.23honor user={false}, assistant={false} and system={false} on MessagePrimitive.If, and migrate them to the matching AuiIf inequality4 changes

Fixes4

honor user={false}, assistant={false} and system={false} on MessagePrimitive.If, and migrate them to the matching AuiIf inequality
publish committed WebMCP tool implementations before layout effects
leave modified arrow keys available to application shortcuts while preserving ordinary thread-list focus navigation.
scope Escape speech cancellation to the targeted thread
view on github
>@assistant-ui/react-a2a@0.2.39runtime hooks keep their clients, runs, streams, queued sends and pending history copies across a fast refresh or a StrictMode replay instead of rebuilding or tearing them down1 change

Fixes1

runtime hooks keep their clients, runs, streams, queued sends and pending history copies across a fast refresh or a StrictMode replay instead of rebuilding or tearing them down
view on github
>@assistant-ui/react-ag-ui@0.0.63apply ACTIVITYDELTA to the activity part its snapshot created and log ignored step boundaries3 changes

Fixes2

apply ACTIVITY_DELTA to the activity part its snapshot created and log ignored step boundaries
runtime hooks keep their clients, runs, streams, queued sends and pending history copies across a fast refresh or a StrictMode replay instead of rebuilding or tearing them down

Other1

Editing a message now creates a sibling branch and keeps the original turn reachable instead of deleting it.
view on github
>@assistant-ui/react-devtools@1.2.22show conversation lists that contain only archived threads2 changes

Fixes2

show conversation lists that contain only archived threads
restart copy feedback timing after each successful copy
view on github
>@assistant-ui/react-generative-ui@0.0.22map a2ui sliders onto the slider vocabulary26 changes

Features8

map a2ui sliders onto the slider vocabulary
add a CheckboxGroup vocabulary component for picking any number of options; its $input is the array of checked values, a Form collects it the same way, Slack renders it as checkboxes, and Teams as a multi-select Input.ChoiceSet
answered prompt_user controls lock and restore submitted form values after a reload.
add carousel paging controls
support negative chart values, tooltips, and series colors
add sliders, checkbox switches, and option descriptions to generative UI.
format generative ui tables and fact deltas
add an undo window to generative UI buttons

Fixes17

resolve absolute A2UI bindings from the surface root inside templates.
carry an A2UI event's userMessage in the a2ui:action payload, with the text the user entered when it is bound to an input
the A2UI converter maps a ChoicePicker without a variant to RadioGroup like the spec default mutuallyExclusive, maps multipleSelection to CheckboxGroup with every selected value, and turns a functionCall button action into an a2ui:functionCall $action; an action it cannot read now warns
update A2UI surface bindings and function values while users edit bound inputs, preserve edits across unrelated agent updates, and send one current value for shared bindings without changing the public API
keep the a2ui renderer importable from next.js server code
expand A2UI template children written in the spec's { componentId, path } shape, and keep a Row or Column template in its own container instead of a list
A2UI inputs show their bound value and are named by the full binding pointer, and a button's context or functionCall args bound to an input send what the user entered; $action values accept { "$field": name } references resolved when the action fires, falling back to an optional fallback (the value the agent sent, for converted surfaces) where no control can be read, such as on Slack or in a component that dispatches $action itself, while decodeSubmitData resolves them from a Teams card's inputs; Input and Select take a defaultValue that the Slack and Teams converters map, and a control resets when a re-render changes its initial value
preserve obscured, numeric, temporal, and single choice input values in a2ui surfaces, and render password inputs masked on teams and as an omission note on slack
the A2UI reducer applies v0.9.1 operations the way it applies v0.9 ones instead of warning that the version is unsupported, so a surface from a v0.9.1 server renders
the A2UI converter maps a spec Button variant (primary to the primary button style, borderless to ghost) and a TextField longText variant (a multiline Input); an explicit buttonStyle still wins
the A2UI converter evaluates function call values (formatString with its ${...} expressions, formatNumber, formatCurrency, formatDate, pluralize, and, or, not), including inside an action's context and a functionCall's args, and resolves relative binding paths against the current template item; any other function in a value is skipped with a warning
preserve literal entities in string props and keys when escaping JSX.
render prompt controls while a tool is waiting for user input.
keep the vocabulary importable from react server components
isolate radio selections across generated cards while preserving logical field names in form submissions and action references.
preserve radio, checkbox, and select choices when options reorder or new options are inserted.
preserve JSON object text in Slack plain-text input actions instead of decoding it as button metadata.

Other1

Resolve Slack action $field references from named controls in the submitted state.values.
view on github
>@assistant-ui/react-google-adk@0.0.33preserve activity message text during ADK conversion3 changes

Fixes3

preserve activity message text during ADK conversion
report repeated agent transfers from separate runs
runtime hooks keep their clients, runs, streams, queued sends and pending history copies across a fast refresh or a StrictMode replay instead of rebuilding or tearing them down
view on github
>@assistant-ui/react-ink@0.0.46RuntimeCapabilities.answerToolCall reports whether a thread can answer a waiting tool call by adding its result, resuming it, or responding to its approval. a readonly thread reports false, a local thread true, and an external store true once it sets onAddToolResult, onResumeToolCall, or onRespondToToolApproval, or runs tools itself through unstableenableToolInvocations; the react-ink ToolFallback shows a pending approval's prompt without its Allow and Deny controls where it is false2 changes

Features1

RuntimeCapabilities.answerToolCall reports whether a thread can answer a waiting tool call by adding its result, resuming it, or responding to its approval. a readonly thread reports false, a local thread true, and an external store true once it sets onAddToolResult, onResumeToolCall, or onRespondToToolApproval, or runs tools itself through unstable_enableToolInvocations; the react-ink ToolFallback shows a pending approval's prompt without its Allow and Deny controls where it is false

Fixes1

preserve the multiline input cursor when Alt+Up or Alt+Down is used for application shortcuts.
view on github
>@assistant-ui/react-langgraph@0.14.31reload LangGraph threads with the latest committed load callback4 changes

Fixes4

reload LangGraph threads with the latest committed load callback
resume the graph after a frontend tool result when the same AI message also has a tool call without an id, which used to hold the result back forever
skip null tool_calls entries in the runtime's run bookkeeping, its pending tool call scan and appendLangChainChunk's message merging instead of throwing on them
runtime hooks keep their clients, runs, streams, queued sends and pending history copies across a fast refresh or a StrictMode replay instead of rebuilding or tearing them down
view on github
>@assistant-ui/react-opencode@0.2.26runtime hooks keep their clients, runs, streams, queued sends and pending history copies across a fast refresh or a StrictMode replay instead of rebuilding or tearing them down1 change

Fixes1

runtime hooks keep their clients, runs, streams, queued sends and pending history copies across a fast refresh or a StrictMode replay instead of rebuilding or tearing them down
view on github
>@assistant-ui/react-pi@0.0.26finish controller cleanup when event unsubscription throws2 changes

Fixes2

finish controller cleanup when event unsubscription throws
runtime hooks keep their clients, runs, streams, queued sends and pending history copies across a fast refresh or a StrictMode replay instead of rebuilding or tearing them down
view on github
>@assistant-ui/store@0.3.16deliver scoped events from remote thread clients4 changes

Fixes4

deliver scoped events from remote thread clients
remove runtime import cycles from development bundles
runtime hooks keep their clients, runs, streams, queued sends and pending history copies across a fast refresh or a StrictMode replay instead of rebuilding or tearing them down
run useInsertionEffect cleanups only when a resource is released for good, as React does, let createTapRoot.unmount release a mountOnSubscribe root instead of throwing, and have destroy release an assistant client's resources for good
view on github
>@assistant-ui/tap@0.9.20run useInsertionEffect cleanups only when a resource is released for good, as React does, let createTapRoot.unmount release a mountOnSubscribe root instead of throwing, and have destroy release an assistant client's resources for good1 change

Fixes1

run useInsertionEffect cleanups only when a resource is released for good, as React does, let createTapRoot.unmount release a mountOnSubscribe root instead of throwing, and have destroy release an assistant client's resources for good
view on github
>assistant-cloud@0.2.4mark files.pdfToImages deprecated, since Assistant Cloud has no /v1/files/pdf-to-images route and every call answers 4042 changes

Fixes2

mark files.pdfToImages deprecated, since Assistant Cloud has no /v1/files/pdf-to-images route and every call answers 404
threads.create accepts upsert, so a server can create or find the thread for an external_id without a cast
view on github
>assistant-stream@0.3.46a message sent while a local run is paused ends the pause instead of stranding it: open approvals record resolution: "cancelled", the paused message settles as cancelled, and a result added to it later no longer resumes the run and drops the turns after it; toGenericMessages closes out the calls of an earlier or settled message as not completed2 changes

Fixes2

a message sent while a local run is paused ends the pause instead of stranding it: open approvals record resolution: "cancelled", the paused message settles as cancelled, and a result added to it later no longer resumes the run and drops the turns after it; toGenericMessages closes out the calls of an earlier or settled message as not completed
remove runtime import cycles from development bundles
view on github
>assistant-ui@0.0.119assistant-ui agent installs the skills commit whose cloud skill no longer shows files.pdfToImages2 changes

Fixes2

assistant-ui agent installs the skills commit whose cloud skill no longer shows files.pdfToImages
honor user={false}, assistant={false} and system={false} on MessagePrimitive.If, and migrate them to the matching AuiIf inequality
view on github
>heat-graph@0.0.22render heat-graph's contexts through .Provider so Root works on React 181 change

Fixes1

render heat-graph's contexts through .Provider so Root works on React 18
view on github
>5 maintenance releasesdependency updates and chores
>@assistant-ui/react-ai-sdk@1.4.14@assistant-ui/ai-sdk@0.0.91 change

Other1

@assistant-ui/ai-sdk@0.0.9
view on github
>@assistant-ui/react-ink-markdown@0.0.45@assistant-ui/store@0.3.161 change

Other1

@assistant-ui/store@0.3.16
view on github
>@assistant-ui/react-markdown@0.14.18preserve currency and math delimiters inside html blocks during preprocessing.1 change

Other1

preserve currency and math delimiters inside html blocks during preprocessing.
view on github
>@assistant-ui/react-streamdown@0.3.18preserve currency and math delimiters inside html blocks during preprocessing.3 changes

Other3

preserve currency and math delimiters inside html blocks during preprocessing.
preserve raw html bodies inside list and blockquote containers during streaming repair.
keep comparison escapes within each line without splitting settled prose or slowing down on blank lines.
view on github
>create-assistant-ui@0.0.82assistant-ui@0.0.1191 change

Other1

assistant-ui@0.0.119
view on github