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
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.>@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
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 doesrun
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
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 historyOther8
Track selectors that read through a forwarding client when its target changes.
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.>@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
>@assistant-ui/react-devtools@1.2.25preserve the selected Activity run when older events leave the DevTools log1 change
Fixes1
>@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
>@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
>@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
>@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
>@assistant-ui/react-pi@0.0.32load custom models from the configured Pi agent directory when listing and selecting models.3 changes
Fixes3
>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
preserve provider metadata on text and reasoning parts decoded from UI message streams.
>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
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
>13 maintenance releasesdependency updates and chores
>@assistant-ui/generative-ui@0.0.6assistant-stream@0.3.531 change
Other1
assistant-stream@0.3.53
>@assistant-ui/react-a2a@0.2.47@assistant-ui/core@0.3.301 change
Other1
@assistant-ui/core@0.3.30
>@assistant-ui/react-ag-ui@0.0.71add an opt-in joinStrategy to keep one assistant message per AG-UI run1 change
>@assistant-ui/react-ai-sdk@1.4.19@assistant-ui/ai-sdk@0.0.141 change
Other1
@assistant-ui/ai-sdk@0.0.14
>@assistant-ui/react-generative-ui@0.1.5@assistant-ui/generative-ui@0.0.61 change
Other1
@assistant-ui/generative-ui@0.0.6
>@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
>@assistant-ui/react-ink-markdown@0.0.51@assistant-ui/core@0.3.301 change
Other1
@assistant-ui/core@0.3.30
>@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
>@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.
>@assistant-ui/tap@0.9.24Add an optional root error handler for scheduled tap flushes.1 change
>@assistant-ui/vue@0.0.5Remove internal test-only warning reset helpers while preserving development warning deduplication.3 changes
Other3
>create-assistant-ui@0.0.88assistant-ui@0.0.1251 change
Other1
assistant-ui@0.0.125
>generative-frame@0.0.7@assistant-ui/vue@0.0.51 change
Other1
@assistant-ui/vue@0.0.5
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
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.Persist user messages to external history as runs start so resumed streams retain their prompt.
>@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
Fixes7
core
core
Other11
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 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.>@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
generative-ui
Chores1
>@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
Fixes2
Other4
Handle sparse MCP Apps message content without scanning array holes.
>@assistant-ui/react-ag-ui@0.0.70preserve AG-UI message metadata in snapshots4 changes
>@assistant-ui/react-ink@0.0.51complete OSC 99 notifications so terminals display each alert independently.1 change
Fixes1
>@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 changesOther1
Refresh existing fenced code blocks when their renderer overrides change.
>@assistant-ui/react-mcp@0.1.23preserve custom server additions when revisiting a storage scope before its initial load finishes.1 change
Fixes1
>@assistant-ui/react-native@0.1.48run callback ref cleanup when thread lists unmount or their refs change1 change
Fixes1
>@assistant-ui/react-pi@0.0.31settle projected message status after failed or cancelled sends and stream errors1 change
Fixes1
>@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.>@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
>assistant-stream@0.3.52preserve incomplete status for server-aborted UI-message responses and discard buffered unfinished tool input.3 changes
>assistant-ui@0.0.124preserve local bindings and type imports when migrating legacy AI SDK imports6 changes
Fixes6
>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
generative-frame
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.Fixes27
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.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.generative-frame
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.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.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
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.
>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
>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
>@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.>@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
>@assistant-ui/react-generative-ui@0.1.4@assistant-ui/generative-ui@0.0.51 change
Other1
@assistant-ui/generative-ui@0.0.5
>@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
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.>@assistant-ui/react-ink-markdown@0.0.50@assistant-ui/core@0.3.291 change
Other1
@assistant-ui/core@0.3.29
>@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
>@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 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.>@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.
>create-assistant-ui@0.0.87assistant-ui@0.0.1241 change
Other1
assistant-ui@0.0.124
>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
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
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
core
core
keep a rating on an off-branch message after switching branches in an external-store runtime
core
core
core
keep a submitted rating visible when the host refreshes its messages
Other4
Preserve imported descendants through messages-array synchronization.
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.
>@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
Fixes5
generative-ui
remount a node renderer when its type changes
generative-ui
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 entitiesgenerative-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.
>@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
>@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
>@assistant-ui/react-data-stream@0.12.37preserve tool-result pairing for followed pending calls when including message IDs.1 change
Fixes1
>@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
react-google-adk
react-google-adk
send attachment names to ADK and restore them when a session loads
react-google-adk
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.
>@assistant-ui/react-ink@0.0.50apply controlled input replacements and clears after batched typing1 change
>@assistant-ui/react-langgraph@0.14.35restore chained operations and plain sends that fail before their first chunk3 changes
Fixes1
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.
>@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
react-markdown
preserve repeated list and quote prefixes for display math
react-markdown
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
Other1
Keep multiline display math inside same-line nested list items.
>@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
>@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
>assistant-stream@0.3.51publish resumable producer errors without waiting for source cancellation.2 changes
>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
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.Other1
>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
>@assistant-ui/react-ink-markdown@0.0.49@assistant-ui/core@0.3.281 change
Other1
@assistant-ui/core@0.3.28
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
core
Other1
A thread created while a replacement thread list loads now gets its automatic title once the list lands.
>@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
>@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
>@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>@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 spanreact-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 listPerformance1
>@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
>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
>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
>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
>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
>@assistant-ui/react-ag-ui@0.0.68@assistant-ui/core@0.3.271 change
Other1
@assistant-ui/core@0.3.27
>@assistant-ui/react-generative-ui@0.1.2@assistant-ui/generative-ui@0.0.31 change
Other1
@assistant-ui/generative-ui@0.0.3
>@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
>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
>create-assistant-ui@0.0.86assistant-ui@0.0.1231 change
Other1
assistant-ui@0.0.123
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
Other1
Block typing, attachments, sends, and message editing while a thread is disabled.
>@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
Fixes4
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 noneOther1
Avoid development warnings for property collisions within the shipped generative UI vocabulary.
>@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 declaresOther2
Guard the composer input example against IME confirmation Enter.
Block typing, attachments, sends, and message editing while a thread is disabled.
>@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
>assistant-cloud@0.2.7reject stale run streaming auth headers1 change
Fixes1
cloud
reject stale run streaming auth headers
>generative-frame@0.0.3accept Standard Schema optional result members with undefined1 change
Fixes1
generative-frame
accept Standard Schema optional result members with undefined
>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
>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.
>@assistant-ui/react-a2a@0.2.43@assistant-ui/generative-ui@0.0.21 change
Other1
@assistant-ui/generative-ui@0.0.2
>@assistant-ui/react-ag-ui@0.0.67@assistant-ui/generative-ui@0.0.21 change
Other1
@assistant-ui/generative-ui@0.0.2
>@assistant-ui/react-generative-ui@0.1.1@assistant-ui/generative-ui@0.0.21 change
Other1
@assistant-ui/generative-ui@0.0.2
>@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.
>@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
>@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
>@assistant-ui/variants@0.0.1Publish @assistant-ui/variants to npm.1 change
>@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.
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
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
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
Other4
Document request cancellation in AI SDK examples.
>@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
Fixes65
core
retry a failed interactable save on the next requested save or
flush and clear its error once any later snapshot saves itcore
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
retain a new thread's first title source through runtime restarts and retry automatic title generation after a detach
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
core
stop dictation and speech when a thread runtime is disposed or superseded, as a realtime voice session already is
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 rendercore
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 callcore
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
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 timeoutsend 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
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
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.
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
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 rejectioncore
core
core
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 inmerge 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 getItemByIdswitch 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 threadstart 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 runtimeopen 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 anotherstop 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
core
a message appended right before a
sendCommand call reaches the assistant transport server ahead of that command when no client tool is executingcore
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 onCancelcore
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 commitscore
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 runningcore
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 retriedcore
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 oneRefactors4
core
Chores4
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.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.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.
preserve later thread switches when a replacement list load settles
Clear tool invocation state when restarting a failed stream pipeline.
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.
>@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
>@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
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
Refactors1
Other2
>@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
>@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
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 timeoutOther8
Avoid React 18 server-render warnings from layout effects while keeping client layout timing.
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>@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
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.Refactors3
Other1
>@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
Fixes2
react-ag-ui
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
Other6
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.
>@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
>@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
Refactors1
Other2
>@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
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
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
Other3
Wait for initial history to load before sending new turns.
restore the answer a reload replaced when its checkpoint lookup fails
>@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
Fixes2
Other2
Pass Pressable state to ActionBar Copy and feedback render-function children.
Disable composer inputs when the thread or input state is disabled.
>@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
Fixes4
react-langchain
skip null tool call entries when cancelling pending tool calls on send, instead of throwing before the new message is submitted
Other2
>@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
Fixes5
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
Other3
>@assistant-ui/react-markdown@0.14.20export memoizeMarkdownComponents as a stable API, keeping unstablememoizeMarkdownComponents as a deprecated alias6 changes
Features1
Fixes1
Other3
fix
escapeCurrencyDollars, normalizeMathDelimiters, rewriteLatexBracketDelimiters and rewriteCustomMathTags rewriting text inside indented code blocks.avoid serializing unchanged Markdown nodes during streaming comparisons.
>@assistant-ui/react-mcp@0.1.22reject a live OAuth authorization URL that is not https or loopback http, matching stored discovery7 changes
>@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
Fixes4
react-native
Other2
Pass Pressable state to ActionBar Copy and feedback render-function children.
Disable composer inputs when the thread or input state is disabled.
>@assistant-ui/react-opencode@0.2.29reconcile pending interactions without restoring settled requests after reconnect6 changes
>@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
preserve behavior on the advertised React 18 peer range
Refactors2
>@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 unknownOther2
>@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
Performance1
Other7
Forward
ExternalThread model-context changes through thread.modelContextUpdate.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 Sveltepause thread bottom-follow when a message disclosure expands
>@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>@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
Other3
Prevent Safari's IME confirmation Enter from sending messages in Lexical and Vue composers.
Clarify that
ThreadPrimitiveMessages keys rows by message id but does not expose them to an outer TransitionGroup for individual transitions.>@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
>assistant-cloud@0.2.6add explicit browser authentication invalidation for session changes3 changes
Fixes2
>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
Fixes9
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 wirea 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.
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
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.>assistant-ui@0.0.122write only the assistant-ui server into Cursor, Windsurf and Claude Desktop MCP configs3 changes
>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>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 failsChores1
>10 maintenance releasesdependency updates and chores
>@assistant-ui/mcp-docs-server@0.3.4update dependencies2 changes
Other1
support @modelcontextprotocol/server 2.3
>@assistant-ui/next@0.0.25@assistant-ui/x-generative-compiler@0.0.211 change
Other1
@assistant-ui/x-generative-compiler@0.0.21
>@assistant-ui/react-ai-sdk@1.4.17@assistant-ui/ai-sdk@0.0.121 change
Other1
@assistant-ui/ai-sdk@0.0.12
>@assistant-ui/react-devtools@1.2.24share one registry subscription and one projection per change across in-process devtools subscribers1 change
Other1
>@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
>@assistant-ui/react-lexical@0.2.17Prevent Safari's IME confirmation Enter from sending messages in Lexical and Vue composers.2 changes
Other2
>@assistant-ui/react-o11y@0.0.47update dependencies2 changes
>@assistant-ui/vite@0.0.21@assistant-ui/x-generative-compiler@0.0.211 change
Other1
@assistant-ui/x-generative-compiler@0.0.21
>create-assistant-ui@0.0.85assistant-ui@0.0.1221 change
Other1
assistant-ui@0.0.122
>heat-graph@0.0.24update dependencies1 change
Oct 6, 2026
62 releases
>@assistant-ui/ai-sdk@0.0.11avoid repeated toolkit parameter schema conversion3 changes
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 themForward MCP Apps metadata from AI SDK tool metadata while keeping server routing controlled by provider metadata.
>@assistant-ui/core@0.3.24support message-scoped converter metadata invalidation14 changes
Fixes5
core
release realtime voice listeners when a session ends on its own
core
keep the selected branch when a local run continues an existing answer
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 thema 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 propreasoning 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 timinga 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 workeda 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
>@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
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
Other4
>@assistant-ui/react@0.15.25allow visible component action settle delays to be configured9 changes
Features2
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 thema 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 propreasoning 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 timinga 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>@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
Other1
>@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
>@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 itOther1
>@assistant-ui/react-ag-ui@0.0.65convert deeply nested tool calls without overflowing the stack3 changes
Other2
>@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 afterwardskeep a resumed answer complete when Stop is pressed after the resume stream delivered it but before the stream closes
>@assistant-ui/react-data-stream@0.12.35preserve assistant-generated files in subsequent model history1 change
>@assistant-ui/react-google-adk@0.0.35preserve run configuration when ADK tool results resume a turn1 change
>@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
Other1
Mark unfinished assistant messages as cancelled when an ADK run is stopped, including finalized tool-call and long-running tool messages.
>@assistant-ui/react-langchain@0.0.35support message-scoped converter metadata invalidation1 change
>@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>@assistant-ui/react-langgraph@0.14.33support message-scoped converter metadata invalidation2 changes
>@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 rejectsskip 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>@assistant-ui/react-opencode@0.2.28preserve OpenCode interactions with prototype-named identifiers3 changes
Other2
>@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
>@assistant-ui/react-pi@0.0.28preserve live runs while loading cold thread history2 changes
Fixes2
>assistant-stream@0.3.48preserve assistant-generated files in subsequent model history3 changes
Fixes2
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>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.>safe-content-frame@0.0.33clean up cancelled and pre-load failed sandbox frame renders1 change
>40 maintenance releasesdependency updates and chores
>@assistant-ui/agent-launcher@0.1.17update dependencies1 change
>@assistant-ui/ai-sdk@0.0.10update dependencies2 changes
>@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
>@assistant-ui/eve@0.0.21update dependencies1 change
>@assistant-ui/mcp-docs-server@0.3.3update dependencies1 change
>@assistant-ui/metro@0.0.16update dependencies1 change
>@assistant-ui/next@0.0.24update dependencies1 change
>@assistant-ui/react-ai-sdk@1.4.16@assistant-ui/ai-sdk@0.0.111 change
Other1
@assistant-ui/ai-sdk@0.0.11
>@assistant-ui/react-ai-sdk@1.4.15update dependencies1 change
>@assistant-ui/react-data-stream@0.12.34update dependencies1 change
>@assistant-ui/react-devtools@1.2.23update dependencies1 change
>@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
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
>@assistant-ui/react-generative-ui@0.0.23update dependencies3 changes
Other2
submit edited DatePicker times in the browser's normalized form, so .500 goes out as .5 whichever spelling the browser reports
>@assistant-ui/react-hook-form@0.12.36update dependencies1 change
>@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 themadd
MessagePrimitive.Quote, so a message sent with a composer quote can show what it replied toreasoning 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 timinga 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>@assistant-ui/react-ink@0.0.47update dependencies2 changes
>@assistant-ui/react-ink-markdown@0.0.47@assistant-ui/core@0.3.241 change
Other1
@assistant-ui/core@0.3.24
>@assistant-ui/react-ink-markdown@0.0.46update dependencies1 change
>@assistant-ui/react-lexical@0.2.16update dependencies1 change
>@assistant-ui/react-markdown@0.14.19update dependencies1 change
>@assistant-ui/react-mcp@0.1.21update dependencies1 change
>@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 thema 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 propadd
MessagePrimitive.Quote, so a message sent with a composer quote can show what it replied toreasoning 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 timinga 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>@assistant-ui/react-native@0.1.45update dependencies2 changes
>@assistant-ui/react-o11y@0.0.46update dependencies1 change
>@assistant-ui/react-pi@0.0.27update dependencies2 changes
>@assistant-ui/react-streamdown@0.3.19update dependencies2 changes
>@assistant-ui/react-syntax-highlighter@0.14.7update dependencies1 change
>@assistant-ui/store@0.3.17update dependencies1 change
>@assistant-ui/tap@0.9.21update dependencies2 changes
>@assistant-ui/vite@0.0.20update dependencies1 change
>@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>@assistant-ui/x-buildutils@0.0.30update dependencies1 change
>@assistant-ui/x-generative-compiler@0.0.20update dependencies1 change
>assistant-cloud@0.2.5update dependencies1 change
>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
>assistant-ui@0.0.120update dependencies1 change
>create-assistant-ui@0.0.84assistant-ui@0.0.1211 change
Other1
assistant-ui@0.0.121
>create-assistant-ui@0.0.83update dependencies1 change
>heat-graph@0.0.23update dependencies1 change
>safe-content-frame@0.0.32update dependencies1 change
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
ai-sdk
deliver a host tool approval answer when an earlier stored tool part is
approval-requested without an approval objectai-sdk
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 updateOther1
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.>@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 falseFixes29
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.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 completedkeep an empty file part filename through cloud history, as image parts and attachments already do
core
ignore an interactable setState for an id that is not registered, so a later load still restores its stored value
core
keep the message queue draining when a subscriber cancels while a queued message is being dispatched
>@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 refusedFixes1
>@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
>@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
>@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
Other1
Editing a message now creates a sibling branch and keeps the original turn reachable instead of deleting it.
>@assistant-ui/react-devtools@1.2.22show conversation lists that contain only archived threads2 changes
>@assistant-ui/react-generative-ui@0.0.22map a2ui sliders onto the slider vocabulary26 changes
Features8
Fixes17
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 warnsupdate 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
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 valuethe 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 warningOther1
Resolve Slack action
$field references from named controls in the submitted state.values.>@assistant-ui/react-google-adk@0.0.33preserve activity message text during ADK conversion3 changes
Fixes3
>@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 falseFixes1
>@assistant-ui/react-langgraph@0.14.31reload LangGraph threads with the latest committed load callback4 changes
Fixes4
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>@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
>@assistant-ui/react-pi@0.0.26finish controller cleanup when event unsubscription throws2 changes
>@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
>@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
>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
>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 completedremove runtime import cycles from development bundles
>assistant-ui@0.0.119assistant-ui agent installs the skills commit whose cloud skill no longer shows files.pdfToImages2 changes
Fixes2
>heat-graph@0.0.22render heat-graph's contexts through .Provider so Root works on React 181 change
>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
>@assistant-ui/react-ink-markdown@0.0.45@assistant-ui/store@0.3.161 change
Other1
@assistant-ui/store@0.3.16
>@assistant-ui/react-markdown@0.14.18preserve currency and math delimiters inside html blocks during preprocessing.1 change
Other1
>@assistant-ui/react-streamdown@0.3.18preserve currency and math delimiters inside html blocks during preprocessing.3 changes
Other3
>create-assistant-ui@0.0.82assistant-ui@0.0.1191 change
Other1
assistant-ui@0.0.119