@assistant-ui/react#
0.15.30#
Patch Changes#
-
#9862
1a3359e- Add a Resume control for interrupted runs.useComposerResumefrom@assistant-ui/core/reactandComposerPrimitive.Resumeresume a run whose adapter reportscanResume; the control is disabled while the draft is not empty or the thread is busy. (@okisdev) -
#9789
479d267- fix: call a directive trigger'sonInsertedunder the Lexical composer once the directive is in the composer text;onDirectiveSelectnow fires at the same point (@bnb) -
#9776
32a1b79-useAuiStateandaui.composer.getState()now see composer text as soon assetTextreturns, so an input that keeps its own state, such as react-mentions, no longer moves the caret to the end. (@okisdev) -
#9891
545836d- feat:ModelContext()takesmaxSystemLengthto cap the merged system prompt, trimming the lowest-priority parts first, ormergeSystemto combine the prioritizedSystemParts yourself (@Yonom) -
#9865
727a02d- run the thread viewport on the shared auto-scroll controller, so a viewport footer's height counts toward the bottom of the thread (@okisdev) -
Updated dependencies [
69bf91a,ed0d969,1a3359e,2dc72a8,32869e0,6966821,118dedb,79e10db,32a1b79,d7fb0ee,545836d,e21ce83,ca0a1be,d420f42,9f673a3,ab3454d,e99250f,1808265,1960f3c,506aba9,2d17e77,45e3d22,a587b28,50fb79b,e6cace0,54e2e9b,be30245,727a02d,0c049eb]:- @assistant-ui/core@0.3.30
- @assistant-ui/store@0.3.22
- assistant-stream@0.3.53
- @assistant-ui/tap@0.9.24
0.15.29#
Patch Changes#
-
#9613
6e17b3a- fix: preserve pending attachment selections when unrelated assistant scopes change (@Kinfe123) -
#9602
c696c16- fix: ignore an attachment picker's selection after the active thread changes, keeping files out of the replacement conversation. (@Kinfe123) -
#9753
14eec8a- 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. (@okisdev) -
#9586
2eb0447- feat: add OpenAIRealtimeVoiceAdapter for direct browser voice sessions with streamed transcripts, typed input, mute controls, and cancellable WebRTC setup. (@Kinfe123) -
#9768
c71326f- Clear frame tools and pending calls when the iframe document changes or reloads. (@okisdev) -
#9747
b4558a5-useAssistantFrameHostdisposes 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. (@okisdev) -
#9252
1371e4f- Handle sparse MCP Apps message content without scanning array holes. (@rupic-app) -
Updated dependencies [
b78a043,fe13206,8289dd1,e09563a,b88d62d,5588bfb,d6e8a0c,fe7179d,c71326f,55d065c,61aaccf,43c9c7c,75abfbe,12dfc85,1091bbc,01225b9,d2f04ca,6537c5f,2217804,7ba7c54,cd5fd6c,5197671,04c5d36]:- @assistant-ui/core@0.3.29
- assistant-stream@0.3.52
- @assistant-ui/store@0.3.21
0.15.28#
Patch Changes#
- #9323
2be98de- fix(react): render an inert composer'sinertattribute on React 18, so the cancel focus loop skips it as it does on React 19 (@okisdev) - Updated dependencies [
c157aee,2c1963a,afb9ad2,efbf028,8b49f28,4e86339,28dc601]:- @assistant-ui/core@0.3.27
- safe-content-frame@0.0.34
- assistant-stream@0.3.50
- @assistant-ui/tap@0.9.23
0.15.27#
Patch Changes#
-
#9171
6528ee3- Guard the composer input example against IME confirmation Enter. (@rupic-app) -
#9166
b86d6cd- Block typing, attachments, sends, and message editing while a thread is disabled. (@rupic-app) -
#9247
664f2df- fix(react): pass an MCP App'sui/initializeparams toonInitializedasMcpAppInitializeParams, including the display modes the app declares (@rupic-app) -
Updated dependencies [
2c10bb1,16afd50,b86d6cd,96fd2a2,2b3e0d3]:- assistant-cloud@0.2.7
- @assistant-ui/core@0.3.26
- @assistant-ui/store@0.3.19
0.15.26#
Patch Changes#
-
#8483
7b7c782- 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. (@akim136) -
#8259
0f740cc- fix: show the selection toolbar after a window blur (@rupic-app) -
#8258
7530834- fix(react): recognize user scrolls coalesced with programmatic bottom scrolling (@rupic-app) -
#8777
658a1a3- Avoid React 18 server-render warnings from layout effects while keeping client layout timing. (@rupic-app) -
#9082
ae487aa- feat: mark every experimental API@deprecated Experimental since <date>, so editors strike it through as experimental rather than scheduled for removal;@typescript-eslint/no-deprecatedreports these APIs too (@okisdev) -
#8924
23a4677- fix:AssistantFrameProvider.dispose()now tells the parent it is gone, soAssistantFrameHostrejects tool calls still waiting on the frame right away instead of after the 30 s timeout (@kr1shna-exe) -
#8877
98f9ed7- renderMessagePrimitive.Unstable_PartsGroupedleaves through core's part renderer instead of a copy (@okisdev) -
#8482
051813b- Show the selection toolbar when a selection ends at offset zero at the start of the next message without selecting its content. (@akim136) -
#8859
8551135- Keep thread viewport event listeners stable across unrelated renders. (@rupic-app) -
#8577
73b3ea3- fix: enforce MCP App resource CSP metadata inside widget frames (@Kinfe123) -
#8811
6144fa3- fix: show the scroll-to-bottom control after a wheel interrupts smooth scrolling (@Kinfe123) -
#9003
116424f- Keep thread viewport observers stable and preserve scheduled scroll behavior. (@rupic-app) -
#7901
cb20f13- fix: render MCP Apps through ToolUIDisplay on Parts, grouped, native, and ink (@Kinfe123) -
#9082
ae487aa- fix(react): strike through the deprecatedComposerPrimitive.Unstable_TriggerPopover*aliases, whose notices sat above their export statements where TypeScript ignores them (@okisdev) -
#8903
df2ab0a- the thread viewport follows content that grows without a DOM change (an expanding collapsible, a loading image, an autosizing textarea) and updatesisAtBottomso the scroll-to-bottom button shows; the React viewport now sharesobserveContentResizewith Vue and Svelte (@kr1shna-exe) -
#8946
6de3446- 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 (@okisdev) -
Updated dependencies [
3ad209c,fc73a27,5a67c85,e45b97b,c2b93b1,9201447,7e78ca4,2e5432f,840ac3a,20f0e5b,14ceafa,3baba6f,7855706,d40092c,a32e7a8,1002313,606bc2d,7886e77,34fa2b6,d19b547,3926f8f,c5a635a,4fbf441,dc72a0e,be19872,40da737,2252059,2abd1e0,2ed2043,987ffe1,3ffa474,5bb65a3,836432d,93d04cb,ae487aa,59d42c1,ca4ec1f,184b083,8a21038,7321036,bf65f81,4d5070d,3ef6e7c,9125e30,4ac25b9,23a4677,7aa5bdd,afe32c6,01ac83d,30c2480,ef5a1e2,5a09ea3,b578c02,4709edf,820ab5f,63df0e4,2307752,5bd5de3,14ba56e,b03f90e,8c32dea,0a3ca24,f6d1489,b4b56fe,a6ca3f9,7f7d512,0d74a05,1cabbbd,9121416,429a26d,2356e80,194c0e2,fae89b1,708bf2c,4b44723,92e7ab1,a1caaa8,ee517fb,7842639,116424f,399621e,79867bd,f306b40,081a239,542d871,039d048,0967886,e7534a2,361d590,c04f09d,efb83eb,1cd8911,79e9a5a,9aff121,0d72f48,e79cdd4,01b5e06,06c3fef,41344cb,cebaed5,2a1a788,e8620c1,b9a5d38,3b7b337,cb20f13,1d550c0,9dfd037,ef87d70,4f2ad45,dc72a0e,df2ab0a,8831c76,2d37f82,2bc6e49,b257f49,7a3e496]:- @assistant-ui/store@0.3.18
- @assistant-ui/core@0.3.25
- assistant-cloud@0.2.6
- assistant-stream@0.3.49
- @assistant-ui/tap@0.9.22
0.15.25#
Patch Changes#
-
#8796
fd444e4- a tool approval can ask several questions at once, or let one question take several answers:display: "questions"withapproval.questions, answered throughrespondToApproval({ answers })keyed by question id, validated before it reachesonRespondToToolApprovaland recorded onapproval.answers; the AI SDK converter readsquestionsandanswersfrom the approval descriptor when a response handler is set, and the cloud format keeps them (@okisdev) -
#7212
9f40133- fix: clean up cancelled and pre-load failed sandbox frame renders (@Kinfe123) -
#7189
d2782af- feat: allow visible component action settle delays to be configured (@Kinfe123) -
#7155
5484ca4- feat: support message-scoped converter metadata invalidation (@Kinfe123) -
#8798
ec48da2- a thread can open on its latest page and load older messages on demand: the external store adapter takeshasEarlierandonLoadEarlier, the runtime surfaces them asthread.hasEarlier,thread.isLoadingEarlierandaui.thread.loadEarlier()with one load in flight at a time,ThreadPrimitive.LoadEarlierloads the next page,ThreadPrimitive.Viewportkeeps the visible messages in place when it lands above them, and the React NativeThreadPrimitive.MessagesFlatListpages through the runtime when it gets nohistoryprop (@okisdev) -
#8760
2e4d6a9- streaming text, running tool durations, and message stall detection read no wall clock during render, so a cacheComponents prerender no longer fails on them. (@okisdev) -
#8794
451a76c- reasoning parts carry an optionaltimingwith their start and end times, typed as the newMessagePartTimingthatToolCallTimingnow 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 aMessagePrimitive.GroupedPartsgroup reports the span of its timed parts astiming(@okisdev) -
#8795
1f77d04- the composer trigger popover primitives and their adapter, item, category and directive formatter types get stable names; theUnstable_names stay as deprecated aliases, and the trigger popover hooks stay unstable (@okisdev) -
#8799
aecb5eb- a long thread can be virtualized per part instead of per message:createThreadRowsSelectorflattens the thread foruseAuiStateinto stable rows (a user message, each top-level part group of an assistant message, a turn end) that keep their identity while tokens stream, andThreadPrimitive.Rowrenders 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 (@okisdev) -
Updated dependencies [
c883dc0,fd444e4,64277e2,9f40133,791d240,ed84b12,2bc1edb,0284a07,5484ca4,ec48da2,46133cd,3effee5,451a76c,16439da,1f77d04,aecb5eb,77a98c1]:- @assistant-ui/core@0.3.24
- assistant-stream@0.3.48
- safe-content-frame@0.0.33
0.15.24#
Patch Changes#
-
#8148
b400b75- fix(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 (@samdickson22) -
#8684
5b65868- 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 (@okisdev) -
Updated dependencies [
f7eae39,63233dc,241b5f1,5b65868,6b7df95,098c140,351b8cd,3ea546a,d33ad09,4290eac]:- @assistant-ui/core@0.3.23
- assistant-stream@0.3.47
- assistant-cloud@0.2.5
- safe-content-frame@0.0.32
- @assistant-ui/store@0.3.17
- @assistant-ui/tap@0.9.21
0.15.23#
Patch Changes#
-
#8082
3104efa- fix: honor user={false}, assistant={false} and system={false} on MessagePrimitive.If, and migrate them to the matching AuiIf inequality (@ShobhitPatra) -
#8394
c3a2646- fix: publish committed WebMCP tool implementations before layout effects (@Kinfe123) -
#8489
19eb2eb- fix: leave modified arrow keys available to application shortcuts while preserving ordinary thread-list focus navigation. (@Kinfe123) -
#8495
aaed14b- fix: scope Escape speech cancellation to the targeted thread (@Kinfe123) -
Updated dependencies [
2e066e2,f77dbea,98f3dbd,7a41e54,f054d07,b1a3211,ce5b7ed,d7d3d2e,bb6122a,cec9fd4,ac91c4c,f0a0488,c66cc10,c978a22,038cd9f,fa460c6,5df393f,9eba158,e72ac92,1e9493f,f6374de,cf19d4b,d7d3d2e,e79b815,1b49876,e971918,73c7de7,fda7946,a5208c1,2b6597a,e73db99,a4f6ce9,c980b36,fd28612,9946dc1,3e33ac2]:- @assistant-ui/store@0.3.16
- @assistant-ui/core@0.3.22
- assistant-stream@0.3.46
- assistant-cloud@0.2.4
- @assistant-ui/tap@0.9.20
0.15.22#
Patch Changes#
-
#8032
d096801- fix: type the assistant transport request body thatprepareSendCommandsRequestreceives; its fields are no longerunknownin@assistant-ui/react, andthreadIdis an optionalstring, absent when a resume has no remote id, instead ofstring | null(@rupic-app) -
#8342
aa0f338- feat:useAssistantTransportRuntimeacceptscloud: Assistant Cloud backs the thread list and every request carries the cloud thread id; withoutcloud,NEXT_PUBLIC_ASSISTANT_BASE_URLselects Assistant Cloud, as it does foruseLocalRuntime.adapters.history, which this runtime never read, is deprecated (@okisdev) -
#7731
455e2ac- fix: lock the current scroll container after reasoning content or its ancestor chain changes (@Kinfe123) -
#7730
af49e91- fix: prevent stale message hover updates after unmount (@Kinfe123) -
#7737
6cc0bee- fix: scope selection toolbars to their owning thread (@Kinfe123) -
#8339
967de5d- feat:CloudRendererHostdraws a stored conversation in the Assistant Cloud dashboard's As shown view with the app's own components; a read only thread now reports itself disabled, so its composer renders disabled, and ignores composer input instead of throwing (@okisdev) -
#8030
e8fac8d- feat: show a message with uploading attachments in the thread while it is being sent (@okisdev)MessagePrimitive.Attachmentsnow hands its render functionAttachmentrather thanCompleteAttachment, because the row of a message that is still being sent shows attachments that are still uploading. a render function that readsattachment.contentshould checkattachment.status.type === "complete"first. -
#7877
83f5354- fix: honor registered data-part fallbacks on native MessageContent and grouped parts (@Kinfe123) -
#7760
84e0cf4- fix: emit declarations from one TypeScript program so two builds of the same commit produce the same.d.ts(@okisdev)aui-buildnow emits the unbundled.d.tsoutput in one TypeScript pass over the whole package, so two builds of the same commit produce identical declarations; the per-module emit it replaced followed the bundler's load order and let union member order, alias visibility and import specifiers move between builds. Declarations import barrels as the source does and keepimport type; the exported types are unchanged. A/// <reference>directive that must reach the published declarations now carriespreserve="true"in the source. -
#7838
3d01501- fix: every distribution re-exports the same shared surface from@assistant-ui/core.@assistant-ui/react-inkgainsReadonlyThreadProvider,ToolCallMessagePartStatus,groupPartByType,GroupByContext,VoiceSessionState, the external store runtime (useExternalStoreRuntime,useExternalMessageConverter, their adapters and options), the message queue, the tool approval types, the generative UI renderer and the cloud thread list hooks;@assistant-ui/react-nativegainsVoiceSessionState, the cloud thread list hooks, the generative UI renderer and the runtime state and adapter types the web package already carried;@assistant-ui/reactgainsMessageRole,RunConfig,RuntimeCapabilities,RemoteThreadListOptions,ThreadsState,JoinStrategy,TitleGenerationAdapter,createSimpleTitleAdapterandChainOfThoughtPartByIndexProvider. (@okisdev) -
#7520
2171a8e- fix(react): attach the ExportMarkdown download anchor to the document so Firefox starts the download (@Kinfe123) -
#8010
1c86c4c- fix: prevent disabled attachment dropzones from navigating to dropped files. (@Kinfe123) -
#7733
e2f1306- fix: clear attachment drag state when the dropzone is disabled (@Kinfe123) -
#7897
16ef5b3- fix(react): stop a pending bottom scroll from hijacking keyboard-driven content growth (@Kinfe123) -
#7762
4928364- fix: resolve component registries by own keys only, so a component, tool or data part name that onlyObject.prototypehas (toString,constructor,__proto__) takes theFallbackorGenerativeUIRenderErrorpath instead of rendering the inherited built-in (@okisdev) -
#7725
258ad13- fix: expose feedback submission state to assistive technology (@rupic-app) -
#7981
0252c69- feat: name the runtime state typesThreadRuntimeState,MessageRuntimeState,ComposerRuntimeState,AttachmentRuntimeStateandThreadListItemRuntimeState(@okisdev)these are the states
ThreadRuntime,MessageRuntime,ComposerRuntime,AttachmentRuntimeandThreadListItemRuntimereturn fromgetState(), now exported by all three distributions;@assistant-ui/react-nativeand@assistant-ui/react-inkhad no name for them. in@assistant-ui/react,ThreadState,MessageState,ComposerState,AttachmentStateandThreadListItemStatestill name these runtime states but are deprecated: from 0.16 they name the store statesuseAuiStatereads, as they already do in@assistant-ui/react-nativeand@assistant-ui/react-ink. code that annotates a runtime'sgetState()result should move to the new names. -
#8149
1b1ff55- fix(react): keep the selection toolbar in sync after a right-click, so a context menu that swallows the mouseup no longer leaves it showing (and quoting) the previous selection (@samdickson22) -
#8065
2caacad- feat: a tool UI can record what the user did on its tool call withunstable_recordInteraction, kept on the part asunstable_interactionsand stored in cloud history; the answer to a human input request is recorded once the runtime accepts it, the local runtime persists records and keeps them out of model input, external stores receive them throughunstable_onRecordToolInteraction, and readonly threads ignore them (@okisdev) -
#7068
4b069f9- fix: Use successful Standard Schema output for tool execution and model output. Keep the original arguments for validation errors and stored tool calls. (@ephraimduncan) -
#7777
c51ba8f- feat(core): let typed text enter a connected voice session throughsendText(@okisdev)a
RealtimeVoiceAdapter.Session(and theVoiceSessionControlsreturned tocreateVoiceSession) can implementsendText(text). while a running session takes typed text,VoiceSessionState.canSendTextis true, the thread composer can send, andthread.appendwith a plain text user message hands the text to the session and commits it once as a typed turn (nometadata.modality) through the same path as a finalized transcript: the local runtime writes it to the repository and history, an external store receives it throughonVoiceTranscript. the session must not echo the typed text throughonTranscript. a session withoutsendTextkeeps rejecting typed sends as before. while a session is connected the send button and the Enter key followcanSendalone, so a reply being spoken no longer blocks them. the ai-sdk runtime keeps the message's own modality when it persists a voice session message, so a typed turn is no longer marked as spoken. -
#7716
3f4369b- fix: respond to touch and programmatic text selection changes (@Kinfe123) -
#6338
88143c2- fix: restore the pre-clamp viewport position after a layout-induced scroll clamp on WebKit (@Kinfe123) -
Updated dependencies [
b4f5153,aa83d87,d096801,9b902fa,aa0f338,d8394bc,63f3236,6b93933,eb034f6,5a8ff94,2e3fd9e,9f286dc,920422c,02043de,9cb7aa4,40ba7f0,967de5d,b649669,0ce62a8,5d33fca,92d16d7,a88fa97,96e11d9,3af3b61,e8fac8d,d403574,f71c285,0ad784f,bbd01b5,84e0cf4,fc3aa3e,9eafe31,d97af06,e0b7805,1c58865,9619b42,5496fce,f04c7f0,a4a2739,fdf5706,443b0a5,178e340,1afdc46,dea2462,c45ae5a,7face86,0a9ed7b,6407760,4bed51f,819c065,21f8bdf,8e1508a,e9c1ccd,4928364,5c5eb45,11f9648,c5b5d3a,7725cbd,777df32,dcd43fd,a486a13,0ee58d8,0252c69,75bd488,7260270,0cfd31e,c2e125e,1790780,662b607,f270950,84cdbb0,92e991a,534e11f,9da3697,e046327,2caacad,e525f14,c171588,a5c9c5a,4b069f9,d9e4086,89c0f55,c51ba8f,e6aa5df]:- @assistant-ui/core@0.3.21
- assistant-cloud@0.2.3
- assistant-stream@0.3.45
- @assistant-ui/store@0.3.15
- @assistant-ui/tap@0.9.19
0.15.21#
Patch Changes#
-
#7692
dbb1496- fix: resume bottom following when auto-scroll is enabled at runtime (@Kinfe123) -
#7518
d99c80e- fix: cancel the selection toolbar's pending animation frame on teardown and between selection events (@Kinfe123) -
Updated dependencies [
43b587d,5428610,562e495,ddb7201,69c3d0f,c046153,4788b61,99c9988,37a5a95,2caa1ce,bd77c46,e8cf372,4e08ba6,b7f9a96,50d65c0,11969a2,408d5f4,bc84250,f513bc7,b712ee8,e02bf06,5c55222,479d6a3,44248e0,70b633f]:- @assistant-ui/core@0.3.20
- assistant-stream@0.3.44
- assistant-cloud@0.2.2
- safe-content-frame@0.0.31
- @assistant-ui/store@0.3.14
- @assistant-ui/tap@0.9.18
0.15.20#
Patch Changes#
-
#7414
00cff0b- feat: add an opt-in cache toconvertExternalMessagesso a source message that has not changed keeps itsThreadMessageobject across calls (createExternalMessageConversionCache, exported asunstable_createExternalMessageConversionCachefrom react and react-native); react-langchain uses it for subagent transcripts, so a streamed token no longer rebuilds every message of the nested transcript (@rupic-app) -
#7185
2c22f5d- fix: settle pending frame tool calls when cancellation fails (@Kinfe123) -
#7359
75b3bd3- feat: derive thread.tasks from tool calls that carry nested conversations, with a task scope (@okisdev) -
#7213
cd42d1c- fix: keep notifying thread viewport scroll listeners after a listener fails (@Kinfe123) -
#7351
f6b7ba9- feat: mark voice transcript messages with metadata.modality (@okisdev) -
Updated dependencies [
628df88,ed77e95,00cff0b,b821506,79c2219,f0bbcec,c41d93a,4cc817d,4619335,4e5fde6,e54bf9a,e54bf9a,c083236,3cd7700,617bbf9,5fb3235,83ede73,49ee689,49ee689,a8e0ff7,050d915,d49ff90,e7bdef5,69cbf47,37bd676,be818db,ff1c692,b4b0081,6b29e7d,de6d6b7,f6f52cd,ab97a41,790217b,8530b17,063b9ec,063b9ec,2c22f5d,d7aa090,dacfcec,7af9101,63ae5b8,97bd4b3,c0d6150,275eeb9,e57c33f,e63d2e4,75b3bd3,f03be0c,06bdf1f,e533f6b,28691a5,3cfddfd,f6b7ba9]:- assistant-stream@0.3.43
- @assistant-ui/core@0.3.19
- assistant-cloud@0.2.1
0.15.19#
Patch Changes#
-
#6971
9247ae3- fix: honor message part text render elements with an explicit component. (@rupic-app) -
#6738
3c17a5f- fix: prevent queued live completion requests from starting after unmount (@Kinfe123) -
#7115
4767a92- feat: align the cloud SDK with Assistant Cloud 0.2 (@okisdev)- run reports now carry
provider,outcome_type(aborted,disconnected,length,content_filter),error_codeanderror,message_id,first_token_ms,duration_ms, afinish_reasonper step fromuseCloudChatandtrace_id, plusenvironment,releaseandtagsfrom thetelemetryconfig; onecreateRunReportbuilder inassistant-cloudassembles the body for the assistant-ui runtime and for@assistant-ui/cloud-ai-sdk, andprovider_typeandmetadatastay on the wire for older self hosted clouds assistant-cloud/telemetry(server side):createAssistantCloudTraceExporter,createAssistantCloudSpanProcessor,assistantCloudTraceMetadataandwithAssistantCloudTraceMetadatasend AI SDK GenAI spans toPOST /v1/tracesand hand the trace id to the browser, so a client report and its server spans merge into one run; the OpenTelemetry packages are optional peers of the subpath only- engagement events: sends, edits, stops, regenerates, copies, branch switches, suggestions, attachments, thread switches, speech, voice and shown errors are batched to
POST /v1/eventswithout any message content;telemetry.events: falseopts out cloud.scores.createfor custom scores, and message feedback throughuseCloudChat().feedbacknext to the assistant-uiFeedbackAdaptercloud.files.generatePresignedDownloadUrland the objectkeyon upload responsesCloudAPIError.codeanddetails, includingplan_limit_reachedon a 402@assistant-ui/corerequiresassistant-cloud@^0.2.0, and its store emits the composer, message and thread events the engagement reporter reads
- run reports now carry
-
#6987
b8c5e68- fix: compare arrays with indexed loops so sparse-array holes cannot read as equal; a sparse suggestions list now compacts to a dense one before it reaches the per-suggestion lookup (@Kinfe123) -
#6961
98010f1- fix: notify controlled and uncontrolled modal owners when a run opens a closed modal (@ephraimduncan) -
#6985
7a82c22- fix: keep parent IDs separate from ungrouped message parts (@ephraimduncan) -
#6843
24a288e- feat(cloud): claim anonymous threads into a signed-in workspace by exposing the browser's anonymous refresh token and moving its threads into an authenticated Assistant Cloud workspace after sign-in. (@okisdev) -
#6956
5e42b61- fix: ignore flat mention items when categories is an empty list (@ephraimduncan) -
#6911
0d09f05- Handle prototype-named tool and remote thread keys safely. (@rupic-app) -
#7014
03fe35b- fix: support WebMCP tool cancellation below AbortSignal.any's browser floor and with a non-native caller signal (@rupic-app) -
#7036
bb099f6- refactor: extract the render-element Slot composition into one helper (@okisdev) -
#6893
b0a03ce- fix: apply tool allowlist changes to mounted MCP app frames (@ephraimduncan) -
#7159
e7a2ad0- fix: reset message stall detection after equal-length content changes (@Kinfe123) -
#6888
34af371- fix: preserve the requested scroll behavior across nested viewport providers (@ephraimduncan) -
#6960
4b88b57- fix: render message part text inside the supplied render element. (@ephraimduncan) -
#6876
912f5c5- fix: reject quote selections that cross excluded content (@ephraimduncan) -
#7186
6a3e11b- fix: finish sandbox teardown after bridge cleanup errors (@Kinfe123) -
#6931
5febc06- refactor: adjust state during render where an effect only mirrored a prop (@okisdev)The composer trigger's keyboard and navigation resources, and the devtools panel and thread tab, reset their state during render instead of scheduling a second pass from an effect, so a prop change settles in one render. Effects that genuinely synchronize with an external system (a clock, a subscription catch-up, an async load, a registry write undone on unmount) keep their
setState. -
#7121
94c3fd5- fix: cancel WebMCP tools while asynchronous validation is pending (@Kinfe123) -
#7177
3257a47- fix: stop MCP App bridge messages after disposal (@Kinfe123) -
#6983
bb8249d- fix: forward every part renderer option throughMessagePrimitive.Parts, so data renderers surviveChainOfThought(@ephraimduncan) -
#6837
191bd97- fix(react): keep the page from shifting sideways when a collapsible opens (@okisdev)useScrollLockhides the scrollbar for the length of the animation and pads the scroll container to keep its width, but it measured the bar asoffsetWidth - clientWidthminus borders. A root element'soffsetWidthalready excludes the viewport scrollbar, so that reported zero whenever the scroll had propagated to the viewport, no padding was added, and every centered element jumped sideways as the collapsible opened and back as it closed. A root scroller now falls back to measuring againstinnerWidth, but only when the element formula reports nothing, so a body that scrolls in its own right is still padded by its own gutter. -
Updated dependencies [
a360dda,bf2cbbc,931b808,318e4da,57ce984,0ab9b12,3bcd6db,93d1526,0b1c5a1,7f6e012,4767a92,c9e03ef,71cc3ff,b8c5e68,24a288e,91689ab,a16b990,571cd7c,96f011a,f044254,a19db37,18c12e6,253c80d,0d09f05,e6158c8,623d5ff,ddb7503,73b24d5,71c5416,07eeb54,2c1e65e,d4fbb2a,a9efcfa,12c5447,6c85699,9b9d5e9,4802e15,071a879,0529e2d,27a3442,d777777,5630967,40f0978,ce22d18,928c580,9a882be,afac9e0,4cdcabb,73a1e76,5febc06,56f13b5,23d2865,08088b4,b505555,7ea4669,b2d12e7,01fdd4b,59a8251,a05828f,ef584ea,84b6ae2,6f0d7af,441168d,f756047,306bed1,1f80dd0]:- @assistant-ui/core@0.3.18
- @assistant-ui/tap@0.9.17
- safe-content-frame@0.0.30
- assistant-stream@0.3.42
- assistant-cloud@0.2.0
- @assistant-ui/store@0.3.13
0.15.18#
Patch Changes#
-
#6723
8cc962e- feat: let a tool approval request describe itself and report its outcome (@okisdev)an approval carries
prompt,display, andallowFreeform, so a renderer can tell a question from a permission gate without reading provider metadata, andToolApprovalResponsegains atextanswer that resolves the request as answered rather than approved.respondToToolApprovalnow returns a promise that rejects when the runtime could not record the response, instead of the external-store runtime logging the rejection away, so a refused response leaves the request retryable. -
#6762
39c99b5- fix(react): keep trigger callbacks commit-safe (@Kinfe123) -
#6640
79c1465- fix: load newly mounted MCP Apps through the committed host (@Kinfe123) -
#6580
dc2cab3- chore: drop a superseded internal hook and a dead plugin-registry variant (@okisdev) -
#6710
a83be6b- fix(react): accept spec-shaped MCP App messages (@rupic-app)the default
sendMessagehandler now reads the MCP Apps{ role, content }params and appends eachtextblock in order, alongside the existingstring,{ prompt },{ text }, and{ message }forms. rejections now also carry the spec'sisError: true, and the legacyokandreasonfields stay on the result so widgets already reading them keep working. -
#6706
6194f3e- fix(react): keep model-context mentions current and honor explicit tool categories without requiring custom categories (@Kinfe123) -
#6629
98b7213- feat: resolve MCP App renderer options per part (@okisdev)McpAppRendererserved every MCP app in a thread from one static options snapshot, so a host could not give one app its owndisplayModeand could not tell which app calledrequestDisplayMode. Renderer options now reach each part through the renderer store, and a newforPartresolver overrideshostContext,maxHeight,sandbox,hostInfo, and the fallbacks for a single part.handlersmerges per key instead, so adding a per-partrequestDisplayModekeeps the thread-wide handlers for that app. Host context changes are compared structurally before they are pushed over the bridge, so a resolver may rebuild its result on every render. -
#6586
9f08bdc- chore: reuse the shared viewport math and callback invoker (@okisdev) -
#6615
e7bcf83- fix: report a sandboxed frame that never finishes loading through onError, and re-export theShimLoadErrorandShimLoadErrorCodetypes it is reported with (@okisdev) -
#6714
0f3140d- refactor(react): extract a shared model-context snapshot hook for the mention adapter and the webmcp provider (@okisdev) -
#6540
99db167- feat: unstable_useWebMcpProvider, publishing frontend tools to a WebMCP-capable browser (@samdickson22) -
#6703
21cbb78- refactor: collapse the three trigger-item query predicates onto one shared helper (@Kinfe123) -
#6614
1b25b22- refactor: dispose WebMCP registrations through the abort signal alone (@okisdev) -
Updated dependencies [
8cc962e,2a31285,6083062,205acf5,740a573,65d449b,79283c5,9ec29e1,14fc938,3f7af8b,46fad14,5511057,dc2cab3,d75944b,99fd86e,6bd1570,7f7bd54,60ae973,9f08bdc,0fb5390,dc2cab3,f0d0aa2,1fa3e09,5972a5e,0f17ba5,152a35d,0c5c574,ddaac94,0c68179,250f69c,c22a3dc,aca6e30,5bdd416,6fdfc23,136bbf5,e53299b,69d8e1b,dabe8f2,8d128af,9f08bdc,e7bcf83,47a46db,8135d16,07fed43,fa9c0dc,fa9c0dc,4ca7de9,65d449b,49e727b,49e727b,d9eae73,d56a66a,96a2df8,8206d8f]:- @assistant-ui/core@0.3.17
- safe-content-frame@0.0.29
- assistant-stream@0.3.41
- assistant-cloud@0.1.43
- @assistant-ui/store@0.3.12
- @assistant-ui/tap@0.9.16
0.15.17#
Patch Changes#
-
#6404
6bb1c8b- fix: keep MCP App server routing scoped to committed renders (@Kinfe123) -
#6389
bac7cd6- fix: keep sandbox bridge options scoped to committed renders (@Kinfe123) -
#6335
1d2e68b- chore: drop unreachable legacy forwarding sources. (@okisdev) -
#6207
36edccb- feat: export createSuggestionAdapter and its option types from the distribution packages (@Kinfe123) -
#6458
465a7a6- fix: default assistant frame messaging to the current origin (@Kinfe123) -
#6370
16eb703- fix: keep committed MCP App host options active during interrupted renders (@Kinfe123) -
#6239
8aa3022- fix: expose MCP App renderer handlers (@rupic-app) -
#6406
95ed44d- fix: keep slash commands scoped to committed renders. search now matches the displayed label, so a command with no explicitlabelis matched on its/idfallback rather than only onidanddescription. (@Kinfe123) -
#6192
08611a0- chore: import Radix internals fromradix-ui/internaland drop the individual@radix-ui/*dependencies (@Yonom) -
#6390
13c5997- fix: keep live completion fetchers scoped to committed renders (@Kinfe123) -
#6284
1424afb- feat: allow trigger popovers to override query matching (@dawNotPoi) -
Updated dependencies [
c70c911,e0fa1e6,b2f148e,9dabbce,0f0ebb6,5a3e9f7,d24bcb2,7adf047,43d52ad,cdfc34d,8626c1f,4000eed,8217a6e,3fcf338,4802d23,c3fd2b3,231d148,7e03b66,1743d19,1263c1f,465a7a6,531f61a,5355528,e97f7c6,a6d2da5,6b797ca,bea47ed,dfaa94f,a4bc54a,546dae8,a06be56,96d4ddf,fd471e9,c8db434,bc55058,0221348,c415384,5bba723,0188899,ac7ec15,e96d3de,027f5e2,ebabca4,f96e22f,fc7f72f,bfc8bef,2cd5cbc,105af3e,4c3194a,0064d1e]:- @assistant-ui/core@0.3.16
- assistant-cloud@0.1.42
- assistant-stream@0.3.40
- safe-content-frame@0.0.28
- @assistant-ui/store@0.3.11
- @assistant-ui/tap@0.9.15
0.15.16#
Patch Changes#
-
#6136
f7bd2d9- fix: keep DevTools updates flowing when a subscriber throws (@Kinfe123) -
#6055
1f3eaa7- fix: contain SandboxHost render failures after teardown (@Kinfe123) -
#6110
48f95b1- chore: delete the deadensureBindinganduseRuntimeStateutilities (@samdickson22)src/context/react/utils/ensureBinding.tsand
src/context/react/utils/useRuntimeState.tsimported only each other. Nothing
else in the repo referenced them, neither appears in the package barrel or the
api-surface snapshot, and the"."-only exports map made them unreachable to
consumers.ensureBindingwas an external caller of__internal_bindMethods
that no longer had a caller of its own; the runtime classes bind themselves in
their constructors, so nothing changes at runtime. The public API surface is
unchanged and every other emitted file is byte-identical. -
#6156
9c65b51- deprecate leftover Primitive.If and Empty wrappers on react-native and react-ink, and point them at AuiIf (@okisdev)ThreadIf now reads
thread.isEmptyinstead ofmessages.length === 0, matching the loading-aware field already used by ThreadEmpty and AuiIf. First-party examples and docs samples that still called the leftover wrappers now useAuiIfdirectly. -
#6084
ca9e72c- fix: resync trigger popover cursor after selection (@rupic-app) -
#6054
59e9a08- fix: handle rejected asynchronous Markdown exports (@Kinfe123) -
#6098
b9b9dad- fix: drain unrevealed smooth text when a message completes before any frame (@rupic-app) -
#6061
75dfbe3- docs: document Escape-to-stop-speaking on ThreadPrimitive.Root (@samdickson22) -
Updated dependencies [
fa30915,b355aef,f7bd2d9,4947ef4,332f736,ef9254d,9c65b51,5845ba7,1b30bfd,365e763,d19921d,996aa57,21d6e87,cd247e5,f2b3ef8,1bf263b,19e52c4,06b04a7,a614b5e,07b51db,92e52bd]:- @assistant-ui/core@0.3.15
- @assistant-ui/tap@0.9.14
- assistant-stream@0.3.39
0.15.15#
Patch Changes#
-
#6071
c3fd447- feat: host assistant-cloud thread lists on AISDKThreads via RemoteThreadList (@okisdev)AISDKThreads({ cloud }) uses RemoteThreadList and remounts each thread like useChatRuntime. Cloud history withFormat resolves persistence per call so one adapter can serve many threads. useExternalHistory waits for threadListItem.remoteId instead of latching on the first empty paint.
-
#5872
f9529bf- feat: move useAssistantTransportRuntime into core/react (@okisdev) -
#5872
f9529bf- fix: persist data message parts in aui/v0 cloud history (@okisdev) -
#5839
24a1af7- fix: validate MCP App resource responses (@Kinfe123) -
#5817
dab7b7a- fix: dispose sandbox frames when bridge setup fails (@Kinfe123) -
#6005
4326079- feat: move useCloudThreadListRuntime into core/react and drop the unused react copy of the aui/v0 codec (@okisdev) -
#5952
3e2fa6e- fix: await assistant transport response callbacks and cancel unfinished responses when they fail (@Kinfe123) -
#5990
f439663- fix: keep bottom follow through a content-growth undershoot (@okisdev) -
#5891
a20c2ef- fix: refresh live completion results after their data source changes (@Kinfe123) -
#5406
f2c37ec- fix: keep MCP App error replies reliable when error callbacks throw (@Kinfe123) -
#5981
f28ffae- fix: isolate MCP App notification callback errors (@rupic-app) -
#5942
285392a- fix: isolate assistant transport lifecycle callback failures (@Kinfe123) -
#5959
9d920cc- fix: InMemoryThreadList restarts with a fresh thread when the last one is deleted, notifies the new onDelete callback, and applies deletes batch-safely; the export is now sourced from the core store entry (@okisdev) -
#5618
82e2bde- fix: top-anchor turn clears skip turns that are still valid (@Yonom) -
#6037
f5b39d4- feat: addRemoteThreadListAdapter.unstable_useAdaptersso theRemoteThreadListstore entry can load per-thread history without renderingunstable_Provider(@okisdev) -
#6020
26f40c1- feat: add aRemoteThreadListstore entry so anyAssistantClienthost can run a remote thread list from aRemoteThreadListAdapterand athreadfactory (@okisdev) -
#5992
adcfe01- fix: preserve bottom follow through viewport clicks and cancel stale auto-scroll frames (@rupic-app) -
#5499
5dff06c- fix: keep Escape-to-stop-speaking active when message action bars are hidden by moving the shortcut toThreadPrimitive.Root; custom compositions must mount the root to enable it (@Kinfe123) -
#6058
837ef1b- fix: render system messages safely when editing components are omitted (@rupic-app) -
#5914
0d2e23f- feat: newthreads.selectionChangedevent carryingthreadIdandpreviousThreadId; deprecatethreadListItem.switchedTo/switchedAwayin its favor. Un-deprecate the semantically meaningful events (thread.runStart,thread.runEnd,thread.initialize,composer.send,composer.attachmentAdd). (@Yonom)The new event fires in situations where the deprecated pair did not, so the selection-driven defaults (
scrollToBottomOnThreadSwitch,unstable_focusOnThreadSwitched) now engage there too:InMemoryThreadListemits on selection changes (it previously emitted no switch events at all),switchToNewThread()emits for the newly created thread, and runtimes that resolve a deep-linkedthreadId/initialThreadIdafter mount (useRemoteThreadListRuntime) emit when the deep link resolves, with the initial placeholder thread aspreviousThreadId. -
#5838
2a512eb- fix: handle synchronous live completion failures (@Kinfe123) -
#5631
7ea9de1- feat: runtime suggestions can carry a display title and label (@samdickson22)ThreadSuggestiongains optionaltitleandlabel, so an adapter can show a
short pill while still sending the fullprompt.useThreadSuggestionsnow
passes them through instead of hardcodingtitle: prompt, falling back to
title ?? promptandlabel ?? ""so prompt-only suggestions render exactly as
before.SuggestionConfigis unchanged; the change is additive. -
Updated dependencies [
99c5302,ac0c836,c3fd447,f9529bf,f9529bf,bd01e8b,05b94bd,cef671d,ef7f70d,4a2a76f,04e967c,39db2ff,0e91e27,c5bc8ed,a2a753b,2b0fec7,bec0753,4326079,3d68b16,98795aa,9d920cc,1b9c33d,d68918e,74dca03,87bf950,5a01343,0f6e9e9,f0d1d48,b80a6be,01580e3,ab7f49f,e8c53e9,53ae80f,5f4dee5,d79b87d,645c56b,61d29f4,2da61a3,0131fc7,a934d03,b6d7b2b,bc337af,dc6eb2f,ce57458,ab7ead9,067ef52,f44163f,e5bf0ef,a2ab997,fc9dd90,0e2a230,d800f8b,f5b39d4,26f40c1,f618ab6,d80e988,7f944be,f37f595,74dca03,1b9c33d,82e2bde,52df42d,6c9e7dd,837ef1b,5c092ef,2f3c638,8e77515,d9c355d,74dca03,a14b347,e999f5d,44d98d7,4320fc6,d4b8845,74dca03,a279301,d7322c0,8b0a836,20efa42,833fbe8,94a39ad,74dca03,74dca03,7748e15,72705c3,0d2e23f,4446d45,e8997d9,bfe47b6,ceb8c16,61d29f4,7ea9de1,72a6272,51886b2,3053195,44e574f,14c3b5a]:- @assistant-ui/tap@0.9.13
- @assistant-ui/core@0.3.14
- @assistant-ui/store@0.3.10
- assistant-cloud@0.1.41
- assistant-stream@0.3.38
0.15.14#
Patch Changes#
-
#5760
a4ac7dd- fix: release replay response readers after completion, cancellation, and errors (@Kinfe123) -
#5764
47b9256- fix: generate unique in-memory thread IDs (@Kinfe123) -
#5789
d3fece3- feat: give the composer its draft back when a send never reached the backend. a runtime that rejectsonNewwith the newMessageNotSentErrorrestores the text, quote, and attachments the composer cleared at dispatch time, as long as nothing has claimed the composer since. that guard and that outcome are the onescancelRunalready applies to a trailing user message, so whichever fires first keeps the composer, and of several drafts queued behind one turn only the most recent is still restorable. an edit composer closes at dispatch, so a rejected edit is not restored. (@okisdev) -
#5828
685a069- feat: wirethreads.reloadMainThread()through the tapExternalThreadpath via a newonRefetchThreadcallback, with therefetchThreadcapability derived from its presence (@okisdev) -
#5757
092585b- fix: derive the suggestions scope from the thread so runtime-provided suggestions render throughThreadPrimitive.Suggestions(#5529) (@okisdev) -
Updated dependencies [
a90db30,cfb5fab,65e03a6,d3fece3,4b75b8f,1e98bcf,82cbc15,e28a62d,8bba3aa,48af3c5,22fa20f,00a630a,417efee,1e1d52b,c98699d,685a069,f59d24b,092585b]:- @assistant-ui/core@0.3.13
- @assistant-ui/store@0.3.9
- assistant-cloud@0.1.40
- @assistant-ui/tap@0.9.12
0.15.13#
Patch Changes#
-
#5745
1df4327- refactor: move ExternalThread, SingleThreadList, and the Assistant augmentation namespace into @assistant-ui/core (@Yonom) -
Updated dependencies [
1df4327]:- @assistant-ui/core@0.3.12
0.15.12#
Patch Changes#
-
#5730
6c9560d- chore: drop dependencies that are never imported (@okisdev) -
Updated dependencies [
f551562,dc7b77d,0ae51a8,d1b7097,e319574]:- @assistant-ui/core@0.3.11
- assistant-stream@0.3.37
0.15.11#
Patch Changes#
-
#5722
7faf0fb- fix: ExternalThread edit composer reads editing state live, so a same-tick beginEdit + setText + send dispatches the edit; send before beginEdit and double beginEdit now throw (legacy runtime parity) (@Yonom) -
Updated dependencies [
94dc3e5,ab57969]:- assistant-stream@0.3.36
- assistant-cloud@0.1.39
- @assistant-ui/core@0.3.10
- safe-content-frame@0.0.27
- @assistant-ui/store@0.3.8
- @assistant-ui/tap@0.9.11
0.15.10#
Patch Changes#
-
#5720
ab9e765- fix: route sourceId-carrying edit sends to onEdit instead of the queue adapter, and fail fast on beginEdit without an edit handler (@Yonom) -
Updated dependencies [
ab9e765]:- @assistant-ui/core@0.3.9
0.15.9#
Patch Changes#
-
#5717
99d09c8- Edit composer send always emits: an unchanged edit re-sends the message on a new branch instead of silently closing the composer. (@Yonom) -
#5713
f105884- feat: feedback adapter support in ExternalThread (@Yonom) -
#5712
44f6a94- feat: speech synthesis adapter support in ExternalThread (@Yonom) -
#5702
7d0265e- fix: allow failed live completion searches to be retried (@Kinfe123) -
#5639
79253f2- feat: preserve app-authored reasoning summaries on message parts (@rupic-app) -
#5701
ca49427- fix: clear dropped assistant transport resume requests (@Kinfe123) -
Updated dependencies [
456b056,99d09c8,a88751d,79253f2,4e99deb,2af514c]:- assistant-stream@0.3.35
- @assistant-ui/core@0.3.8
- @assistant-ui/store@0.3.7
0.15.8#
Patch Changes#
- Republish of 0.15.6 (registry staged-version conflicts blocked 0.15.6 and 0.15.7; contents identical).
0.15.6#
Patch Changes#
-
#5664
3b0d778- fix: gate ComposerPrimitive.AttachmentDropzone on file drags and the attachments capability (@ShobhitPatra) -
#5666
366da2b- fix(react): route only thread-composer sends into the queue adapter (@Yonom) -
Updated dependencies [
bd4c0ad,4aa1b1d,bd4c0ad]:- @assistant-ui/core@0.3.7
- @assistant-ui/store@0.3.5
0.15.5#
Patch Changes#
-
#5476
02b9dc1- fix: allow callers to override the default type="button" on action button primitives (@ephraimduncan) -
#5564
31a427a- fix: hydrate assistant transport resumes from their retained initial state (@Kinfe123) -
#5415
271d85d- fix: AttachmentPrimitive.Thumb now renders custom children and supports asChild instead of always overriding them with the automatic label (@ephraimduncan) -
#5421
e7a696c- fix: AttachmentPrimitive.Thumb no longer renders a bare "." for extension-less filenames; falls back to the attachment type (@ephraimduncan) -
#5430
dcacd9b- feat: AuiProvider extends/config grammar.config={AuiConfig({...})}alone creates a top-level root client; nested providers must passextends— a client to extend, ornullto isolate (dev-enforced). An empty config creates a client extending theextendsclient;refexposes the resulting client. Theconfigprop only accepts configs built withAuiConfig(...)(branded type). AssistantRuntimeProvider gains an optionalconfigprop whose scopes are provided alongside the runtime scope. TheuseAui({...})extension overload and the AuiProvidervalueprop are deprecated;value={client}now exposes a client extending the given one (same scopes, new identity) rather than the exact instance.useAui({})with an empty scope object now mounts a rooted host (so the scope set can grow across renders) instead of a passthrough derived-only client.useAuiStatestate enumeration (Object.keys/spread) now includes scopes inherited from parent clients, matchingin-operator behavior. Clients derived from a hand-built parent (a plain object withsubscribe/on) forward scopedon(...)listeners to the parent'soninstead of throwing for scopes the parent does not expose. (@Yonom) -
#5416
c5b88f1- fix: ignore Escape during IME composition in ComposerPrimitiveInput so dismissing a composition candidate no longer cancels the composer (@ephraimduncan) -
#5420
129d0c1- fix: defer blob URL revocation in ActionBarPrimitive.ExportMarkdown so the download fetch can start before the URL is revoked (@ephraimduncan) -
#5585
1160d8b- fix: settle assistant transport runs when finish callbacks fail (@Kinfe123) -
#5418
cc85bf4- fix: compose SelectionToolbarRoot onMouseDown with composeEventHandlers so user handlers run before preventDefault (@ephraimduncan) -
#5650
34cec64- feat: two-lane, placement-aware message queue with steer-by-default mid-run sends (@Yonom)ExternalThreadQueueAdapteris reshaped:enqueue(message, { steer })splits into
enqueue(message)/steer(message),steer(queueItemId)becomes
move(queueItemId, { lane: "steer", insertAfter: null }),clear(reason)is dropped
(queue clear policy is now host-owned), andsteerItems/move/editand
QueueItemState.partsare required. -
Updated dependencies [
dcacd9b,d52928d,d8a59ad,e70da91,aac3a8c,aa302ee,aa302ee,71cf74e,34cec64]:- @assistant-ui/store@0.3.4
- @assistant-ui/core@0.3.6
- assistant-stream@0.3.34
- @assistant-ui/tap@0.9.10
0.15.4#
Patch Changes#
-
#5566
7528465- fix: skip add-message commands with no supported parts in assistant transport runtime (@Yonom) -
#5565
78943a3- feat: add opt-instrict: falsemode that reconciles malformed stream input instead of throwing (decoders, state accumulator); assistant-transport resume runs always decode leniently (@Yonom) -
Updated dependencies [
7f7f8a2,6c062f1,78943a3]:- @assistant-ui/core@0.3.5
- assistant-cloud@0.1.38
- assistant-stream@0.3.33
0.15.3#
Patch Changes#
-
#5432
8ca9930- fix: refresh MCP App resources when the host changes (@Kinfe123)Custom
McpAppsHostresources must now return a stable object identity (for
example, withuseMemo); an unstable host keeps the widget in
loadingFallbackand refetches on every re-render. -
#5447
8c99934- docs: deprecate Unstable_AudioMessagePart in favour of file parts (@okisdev)Audio belongs on a
filepart with anaudio/*mime type.fileis a member of both the user and assistant unions and carries a filename, neither of which the audio part can express. The payload form afilepart needs is still adapter specific; the message primitive docs enumerate it. The audio part and theUnstable_Audioslot stay honored everywhere they are accepted and will not gain fields. -
#5439
ece5a54- feat: sourceType opt-in on file message parts so attachment adapters can send url/id file references (@ShobhitPatra) -
#5542
55b2824- feat: exposethreadListItem.isRunningso a thread list row can show its own run (@okisdev)a thread list row had no supported way to tell whether its thread was running:
thread.isRunningdescribes the open thread, and the item state carried no run state at all, so a run continuing on a thread the user had switched away from was invisible.threadListItem.isRunningnow reports it, and stays true for a background run. runtimes that keep background threads alive answer it through the new optionalThreadListRuntimeCore.unstable_isThreadRunning; the rest report the open thread's run state, which they already track.InMemoryThreadListalso renames threads for real instead of dropping the new title. -
#5537
c868710- fix: keep a settled tool call distinguishable from an unfinished one, so a tool returning false, 0, "" or null no longer loses its result on the cloud round trip and no longer reads as never completed (@okisdev) -
#5522
f913c21- feat: addthreads.reloadMainThread()to refetch the open thread's remote state in place (@taoche) -
#5417
5bb2573- fix: suggestion trigger withsendno longer overwrites the composer draft while a run is in progress; on runtimes without queue support it now renders disabled mid-run, matchingComposerPrimitive.Send(@ephraimduncan) -
Updated dependencies [
b19c2f5,01140bd,8c99934,ece5a54,2fdff87,90b3003,4c313cf,55b2824,22b05a4,f913c21,c868710,011e275,da32fe0,f913c21,5bb2573,71231d3,5ececc1]:- @assistant-ui/core@0.3.4
- assistant-stream@0.3.32
- @assistant-ui/store@0.3.3
- safe-content-frame@0.0.26
0.15.2#
Patch Changes#
-
#5419
aa74b0d- fix: enumerate the attachment content fields the aui/v0 encoder persists so per-part status stays out of the stored shape (@okisdev) -
#5403
6e5c450- refactor: share the part status derivation with core (@okisdev) -
Updated dependencies [
aa74b0d,6e5c450,59ec21b,4fd698b,b8daa96]:- @assistant-ui/core@0.3.3
- @assistant-ui/tap@0.9.9
0.15.1#
Patch Changes#
-
#5304
1bbaa46- refactor: internal selectors read optional scopes vias.optional.partinstead of guarding onaui.part.source(@Yonom) -
Updated dependencies [
1bbaa46,3a762ed,9aac054,a8cd1c9]:- @assistant-ui/core@0.3.1
- @assistant-ui/store@0.3.1
- assistant-stream@0.3.30
0.15.0#
Minor Changes#
-
#5275
9a7e776- feat: property API for aui — nullary scope accessors are now properties (aui.thread.getState()instead ofaui.thread().getState()); calling them still works but is deprecated. Accessors keepsource/query/nameselection metadata as properties; these are reserved names for scope methods. An unavailable scope's accessor no longer throws at selection time:aui.threadalways succeeds and is always truthy,.sourceis null, and any other property read (or a call) throws — check availability viaaui.thread.source != null. Accessor identity is binding-keyed: stable across renders without structural change, new on structural change — memoization keyed on an accessor now invalidates exactly when its binding changes. (@Yonom) -
#5281
2f5d0d4- feat: drop APIs deprecated in v0.12/v0.14 — the legacy context hooks (useAssistantRuntime,useThreadRuntime,useThread,useMessageRuntime,useMessage,useComposerRuntime,useComposer,useMessagePartRuntime,useMessagePart,useAttachmentRuntime,useAttachment,useThreadListItemRuntime,useThreadListItem,useThreadList,useEditComposerand their attachment variants; useuseAui/useAuiState), the component-onlyToolsState.toolsmap (usetoolUIs), and the"mcp-app"group key ingroupPartByType(use"standalone-tool-call"). See the v0.15 migration guide. (@Yonom)
Patch Changes#
- Updated dependencies [
9a7e776,ae5f831,a196711,f78e579,dcc41bb,d72c2b6,2f5d0d4]:- @assistant-ui/store@0.3.0
- @assistant-ui/core@0.3.0
- assistant-stream@0.3.29
- @assistant-ui/tap@0.9.7
0.14.29#
Patch Changes#
-
#5241
c2b7a29- fix(assistant-transport): a follow-up run that finds an empty command queue no-ops instead of erroring "No commands to send" (@Yonom) -
#5238
cc763a5- fix: assistant-transport marks in-transit commands delivered when a run completes successfully without state chunks, instead of leaving them pending forever (@Yonom) -
#5242
72f65dc- fix(assistant-transport): onError reads the live in-transit commands at error time instead of a stale render snapshot (@Yonom) -
#5240
98ac314- fix: assistant-transport consumes parentId once per run; later unrelated runs no longer re-send the last append's parentId (@Yonom) -
#5249
525ab84- fix(assistant-transport): commands enqueued during a resume run are flushed in a follow-up run instead of starving in the queue (@Yonom) -
#5243
468a713- fix(assistant-transport): abort the in-flight run on unmount instead of leaking the fetch (@Yonom) -
#5219
3ca19cf- fix: stop logging attachment-add rejections to the console from ComposerPrimitive.AttachmentDropzone and ComposerPrimitive.Input; the rejection is already surfaced via the structured composer.attachmentAddError event, so the per-file console.error produced unopt-outable duplicate noise for apps handling the event (@rupic-app) -
#5208
a0ddc86- AdopterasableSyntaxOnly; public enums are nowas constobjects. (@Yonom) -
#5256
cee74f1- fix: ExternalThread validates the adapter accept string on every addAttachment entry point (@Yonom) -
#5237
cf839ff- feat: ExternalThread props for assistant-transport (isLoading, state, extras, onResume, onAddToolResult, onLoadExternalState, onResumeToolCall, attachmentAdapter; importExternalState); export ToolInvocationTracker from core internal; composer parentId, draft-restore, and part-status fixes (@Yonom) -
#5257
1a875ab- fix: ExternalThread clearAttachments/reset call adapter.remove for pending attachments (@Yonom) -
#5258
7ecf87a- fix: ExternalThread edit composers receive the attachmentAdapter (@Yonom) -
#5261
fedcb05- fix: ExternalThread merges a failed send back into the draft (text prepended, attachments and quote preserved) (@Yonom) -
#5259
b549575- fix: ExternalThread queue-adapter sends stamp the thread head as parentId (@Yonom) -
#5260
8988d44- fix: ExternalThread throws a capability error when an unset optional callback is invoked (@Yonom) -
#5116
396ea1f- fix(core): persist LocalRuntime runs paused for tool approval (@serhiizghama) -
#5227
2260850- fix: handle rejected file picker attachment additions (@Kinfe123) -
#5262
801781c- ExternalThread: dedupe duplicate message ids with a warning (last occurrence wins) instead of throwing on duplicate resource keys. (@Yonom) -
#5231
e1f27d8- fix(core): preserve thread-list position when switchToThread's on-demand fetch settles after a concurrent list() (@rupic-app) -
Updated dependencies [
f9c1b0f,235c17e,6225d6a,801781c,d4bdf2c,a0ddc86,cee74f1,cf839ff,396ea1f,e1f27d8,3e8f59e,8c97501,7e871ef,06f5266,d319637]:- assistant-stream@0.3.28
- @assistant-ui/core@0.2.23
- @assistant-ui/store@0.2.22
- @assistant-ui/tap@0.9.6
- assistant-cloud@0.1.37
- safe-content-frame@0.0.25
0.14.28#
Patch Changes#
-
#5059
fd83a3a- fix: prevent instant auto-scroll from interrupting active top-anchored runs (@Gujiassh) -
#5083
cbe5f4e- feat: focus composer input when clicking blank space in ComposerPrimitive.Root (@AVGVSTVS96) -
#5119
70347f0- fix: tolerate a transient part-type mismatch in the part hooks so a thread switch can't throw inside useSyncExternalStore and unmount the app (@rupic-app) -
#5168
69969f6- fix: keep controlled assistant-visible inputs in sync after edits (@Kinfe123) -
#5097
039b75f- fix: support attachments without relying on a global File constructor (@Kinfe123) -
#5133
3b50540- Warn against throwing from part selectors and keep React Ink part rendering stable during transient part-type mismatches. (@Gujiassh) -
#5085
9b99189- fix: preserve the top-anchor reserve between turns (@Gujiassh) -
Updated dependencies [
8630186,908ec91,0d0834d,3355098,3f90440,79034bb,7207b19,446a118,a081656,25a5be0,b17d392,7492368,20643e2,47562fd,ccebbf9,85d7c25,23a9925,7fde141,afacb10,af6c945,33924df,19cfdcd,044def8,039b75f,5e4dd9f,5da0d93,85d4976,5135400,fc6b4ad,121ee83,2b2587a,ca80153,e4ce1a2,f2f5e83,ec8ee6a,9a343db,666aaab,c1b1750,f263c9e,475fca3,8faad07,61518b9,ecd2280,83d7b42,5c54141,5412099,99da4af,1eb7275,c47bdf4,ba948d8,de54334,44aac58,9402648,4651ea5,2f69f68,390e417,2bc6798]:- assistant-stream@0.3.27
- @assistant-ui/core@0.2.22
- assistant-cloud@0.1.36
- safe-content-frame@0.0.24
- @assistant-ui/tap@0.9.5
- @assistant-ui/store@0.2.21
0.14.27#
Patch Changes#
-
#4818
b967668- feat: render prop support for AssistantModalPrimitive Trigger, Anchor, and Content (@okisdev) -
#4754
438ecd3- fix: preserve user attachments in Cloud history (@Kinfe123) -
#4701
7577c9a- feat: add compact mode to ComposerPrimitive.Root (@ephraimduncan) -
#4971
5dbbac4- refactor: host the shared JSON type guards in @assistant-ui/core/internal (@okisdev) -
#4723
7310d8d- fix: add MCP App host request error context (@Kinfe123) -
#4675
c814c9c- feat: support prefixed MCP toolkit tool names (@Kinfe123) -
#4665
6be3b67- feat: support disabled MCP toolkit entries (@Kinfe123) -
#4667
c590a21- feat: support disabled MCP toolkit tools (@Kinfe123) -
#4898
a84cf6d- feat: plumb an optional serverId through MCP Apps metadata and host calls for multi-MCP routing (@okisdev) -
#4806
9f99c46- feat: preserve providerMetadata on text, reasoning, and tool-call message parts (@DLOVRIC2)The AI SDK message converter already kept
providerMetadataon source parts but
dropped it on text, reasoning, and tool-call parts (where the AI SDK surfaces it
ascallProviderMetadata). Provider- or app-scoped metadata such as agent
attribution now survives the conversion to assistant-ui messages. -
#4863
0034c02- feat: support data-aui-quote-selectable="false" exclusions (@okisdev) -
#4710
f1c7833- feat: support opt-in quote regions for the selection toolbar (@Kinfe123) -
Updated dependencies [
43b8ce8,1e926b6,d6c7571,4d7a447,ca751f4,2aca5e0,908af6d,0ea628f,1b46551,7865f67,7cf5acc,7a85307,438ecd3,e4da8c5,5a34e8c,5dbbac4,d3bd0ed,84e8ddf,8282269,03ffe44,38bf104,19b2a00,77c7b26,026a7ae,160b0af,c814c9c,6be3b67,c590a21,0686f4e,a84cf6d,9f99c46,c2d2271,e3aba86,25f9eb2,84e8ddf,d03e5cf,e02b21b,7e28a72,ef81c86,5ade3a5,1f284ac,65ba32a,5325f09]:- assistant-stream@0.3.26
- @assistant-ui/core@0.2.21
- assistant-cloud@0.1.35
- safe-content-frame@0.0.23
- @assistant-ui/tap@0.9.4
- @assistant-ui/store@0.2.20
0.14.26#
Patch Changes#
-
#4627
266657d- Thread list accessibility improvements, focused on keyboard and focus handling: (@AVGVSTVS96)- Arrow-key navigation: Up/Down between items, Right to an item's "More" button
(mirrored in RTL); every item stays a Tab stop. - Continuous focus: opening and closing a menu keeps focus on the row, so the
focus-visible highlight never breaks. - New
sharedFocusGrouponThreadListItemMorePrimitive.Rootextends this to the
menu (Right opens, Left/Escape close and restore focus) and forces it non-modal;
without it, menus are unchanged.
- Arrow-key navigation: Up/Down between items, Right to an item's "More" button
-
Updated dependencies [
523e0b5,f833bc1]:- @assistant-ui/core@0.2.20
- assistant-stream@0.3.25
0.14.25#
Patch Changes#
-
#4562
942931d- fix: disable smooth text streaming under prefers-reduced-motion (@ephraimduncan) -
Updated dependencies [
a7b06f7]:- safe-content-frame@0.0.22
0.14.24#
Patch Changes#
-
#4543
d0987a3- external-store: addunstable_onBranchChangeadapter callback that fires on explicitswitchToBranch, emitting the canonical (persisted) head and visible message ids, deduped by head (@AVGVSTVS96) -
#4545
4550578- add unstable_useComposerInput headless bridge (value/setText/send/isDisabled/canSend) and unstable_useTriggerPopoverAriaProps for building a custom composer input without ComposerPrimitive.Input (@AVGVSTVS96) -
#4310
0c51b90- feat: addunstable_interactables API; restore and deprecate the previous interactables API (@AVGVSTVS96)The redesigned interactables API is now available as an additive
unstable_*surface for building editable, in-message UI while preserving the existing stable API for compatibility.unstable_useInteractable(name, config)registers an interactable and returns its state plus methods in one hook.- Each unstable interactable name gets one stable
update_{name}tool. When multiple instances share a name, the tool targets an instance byid. - Thread-scoped interactables rendered inside message parts expose
version, including the state for that message, whether it is the latest tool-driven version, andrestore(). - Added
unstable_interactableTool(...)for defining a creating tool and its in-message render UI together. - Added
unstable_useInteractableVersions(id, name)for version history UIs. - Persistence adapters can now provide
load()and be passed directly tounstable_Interactables({ persistence }).
The previous
useAssistantInteractable/useInteractableState/InteractablesAPI remains available unchanged and is marked deprecated. Existing apps do not need to migrate immediately.Migration notes for the unstable API:
- const id = useAssistantInteractable("taskBoard", config); - const [state, { setState }] = useInteractableState(id, initialState); + const [state, { id, setState }] = unstable_useInteractable("taskBoard", config);- Use
unstable_interactables: unstable_Interactables()when registering the unstable scope. unstable_useInteractableState(id)is intended for secondary readers and returnsundefineduntil the owner registers.- The unstable API uses per-name update tools (
update_{name}) with anidparameter instead of legacy per-instance tools (update_{name}_{id}). - A top-level
idfield instateSchemais reserved for instance addressing. Rename domain state fields toitemId,recordId, etc. if the model should edit them. - Model selection should be represented as ordinary state in the unstable API; the legacy
selectedregistration prop andsetSelectedmethod remain available on the deprecated stable API.
-
#4591
f582f09- feat: honor startRun false across staged-message-capable runtimes (@Yonom) -
#4542
4acd4c0- add unstable id-keyed thread message rendering APIs for virtualized and custom message lists.unstable_useThreadMessageIds()returns the thread's message ids (stable array identity across content-only updates), andThreadPrimitive.Unstable_MessageByIdrenders a single message by id with the same component surface asMessageByIndex. A missing or removed id rendersnullinstead of throwing. (@AVGVSTVS96) -
Updated dependencies [
ddc40b7,ea52de0,29c6fdb,d0987a3,cefcf27,0c51b90,3a8f685,ec6adf4,4acd4c0]:- @assistant-ui/core@0.2.19
- assistant-stream@0.3.24
- assistant-cloud@0.1.34
- @assistant-ui/store@0.2.19
- @assistant-ui/tap@0.9.3
0.14.23#
Patch Changes#
-
#4426
68dfbaa- chore: markgenerateIdandfromThreadMessageLikeas experimental (@okisdev)these two utilities became public in #4414. they now carry an
@deprecatedJSDoc noting the API is experimental and may change without notice, matching how the other unstable public utilities (e.g.bindExternalStoreMessage) are flagged. the distribution packages (@assistant-ui/react,@assistant-ui/react-native,@assistant-ui/react-ink) re-export them, so the annotation lands in their published types too. -
Updated dependencies [
68dfbaa,fe24ad6]:- @assistant-ui/core@0.2.18
0.14.22#
Patch Changes#
-
#4414
344f737- feat: exportfromThreadMessageLikeandgenerateIdfrom the public API (@okisdev)these two utilities were only reachable via
@assistant-ui/core/internal, so materializing aThreadMessageLikeinto aThreadMessage, or generating an id for a hand-built message, meant reaching into internals (the first-party ag-ui and a2a runtimes already did). they are now exported from@assistant-ui/core,@assistant-ui/react,@assistant-ui/react-native, and@assistant-ui/react-ink. also removes the now-redundant duplicate listing of both from the unstableINTERNALnamespace (the one in-repo consumer, the with-ffmpeg example, now uses the public export). -
#4419
3cef745- feat(react): addminCommitMstoSmoothOptionsto throttle committed reveal updates (@okisdev)useSmoothkeeps advancing the typewriter reveal every frame, but withminCommitMsthe visible text (and the downstream re-render and markdown re-parse it triggers) is committed at most once per interval. The final frame always commits, so no characters are lost. Defaults to0, which commits every frame and preserves the previous behavior. -
#4411
d76a922- feat: addunstable_useLiveCompletionAdapterfor async trigger completions (@okisdev)bridges an async completion source (a server search, a gateway RPC) into the synchronous
Unstable_TriggerAdapter.searchreturns cached items synchronously and schedules a debounced fetch with stale-request cancellation; when results land the adapter re-creates so the popover re-renders. also adds anisLoadingprop onComposerPrimitive.Unstable_TriggerPopover(surfaced on the popover scope) so async sources can render a loading state. -
Updated dependencies [
344f737,a2e21ee]:- @assistant-ui/core@0.2.17
0.14.21#
Patch Changes#
-
#4403
9f59d69- fix: prevent compiled context store hooks from skipping subscriptions (@Yonom) -
Updated dependencies [
8d3b0e8]:- @assistant-ui/tap@0.9.2
0.14.20#
Patch Changes#
-
#4392
4cc7eaa- chore: update peer and dependency ranges for @assistant-ui/tap 0.9 (@Yonom) -
Updated dependencies [
434bba5,bb38d08,4cc7eaa,4cc7eaa]:- assistant-stream@0.3.23
- @assistant-ui/core@0.2.16
- assistant-cloud@0.1.33
- @assistant-ui/tap@0.9.1
- @assistant-ui/store@0.2.18
0.14.19#
Patch Changes#
-
#4385
ae59baf- feat: precompile packages with React Compiler (@Yonom)- aui-build runs React Compiler over packages that depend on tap and remaps
react/compiler-runtimeto the tap shim subpath, so compiled hooks and components work both in React components and inside tap resource renders @assistant-ui/tap/react-shimexportsuseMemoCache(tap inside a resource render,React.__COMPILER_RUNTIME.cotherwise, with a React 18 polyfill); new@assistant-ui/tap/react-shim/compiler-runtimesubpath mirrorsreact/compiler-runtime'scexport- tap implements
useSyncExternalStoreand a no-opuseDebugValue;useSubscribablenow builds onuseSyncExternalStoreso its store reads stay visible to the compiler AssistantProviderBaseopts out via"use no memo"because the runtime receives options through an effect inside a re-rendered child element
- aui-build runs React Compiler over packages that depend on tap and remaps
-
#4378
4583ca7- feat: approval options vocabulary on tool approvals.ToolCallMessagePart.approvalgains request-suppliedoptions(machine-readable kinds allow-once / allow-always / reject-once / reject-always, open to_-prefixed custom kinds), a recordedoptionId, and a terminalresolution("cancelled" | "expired") for non-decision outcomes.respondToApprovaladditionally accepts{ optionId }, resolved in core against the option's kind; custom kinds require an explicitapproved.ExternalThreadgains anonRespondToToolApprovalcallback. The kit approval bar renders supplied options with an opt-in confirmation step showing the grants an option would persist. Persistence stays host-owned. (@okisdev) -
#4379
94cc028- feat: per-tool-call timing and stall detection.ToolCallMessagePartgains atimingfield ({ startedAt, completedAt? }in epoch ms), auto-populated by the assistant-stream accumulator at part start and result, and accepted onThreadMessageLikefor external-store hosts. NewuseToolCallElapsed()hook returns the call's elapsed milliseconds, ticking once per second while running;unstable_useMessageStallDetection({ thresholdMs })reports mid-run output stalls by watching a message content fingerprint. The kitToolFallbacktrigger renders the duration when timing is present. (@okisdev) -
Updated dependencies [
c207bcd,ae59baf,9f13fdb,4583ca7,94cc028]:- @assistant-ui/core@0.2.15
- @assistant-ui/tap@0.8.1
- @assistant-ui/store@0.2.17
- assistant-stream@0.3.22
0.14.18#
Patch Changes#
-
#4352
14aa2ac- feat:unstable_useComposerInputHistory(@okisdev)terminal-style input history for the thread composer: ArrowUp on an empty draft recalls previously sent user messages (newest first, derived live from thread state), ArrowDown steps back and finally restores the in-progress draft. spread the returned
{ onKeyDown }bundle ontoComposerPrimitive.Input. yields to open trigger popovers, IME composition, modifiers, selections, and consumer handlers that already prevented the event; inert on edit composers. -
#4340
ab8e5bc- fix: exclude reasoning parts from copied message text (@serhiizghama)getCopyTextfiltered parts with"text" in part, which also matchedreasoningparts (they carry atextfield), leaking the model's chain-of-thought into the clipboard. Both copy paths now delegate to the canonicalgetThreadMessageText, so copy returns onlytype: "text"content — consistent with the rest of the runtime. -
#4359
59d252f- feat: branch switching for the ExternalThread client (@okisdev)ExternalThreadaccepts an optionalbranchesadapter (ExternalThreadBranchAdapterin@assistant-ui/core, re-exported from@assistant-ui/react):getBranches(messageId)returns ordered sibling branch ids andswitchToBranch(branchId)makes a sibling visible by swapping themessagesarray. messages with more than one sibling get realbranchNumber/branchCount, which is what shows the branch picker;capabilities.switchToBranchis set for parity with the legacy external store. without the adapter, behavior is unchanged. -
#4329
2b96cb5- fix: emit the GroupedParts streaming indicator for empty running messages, so the assistant slot shows a loading affordance immediately after sending instead of staying blank (@okisdev) -
#4329
2b96cb5- fix: compensate scrollbar gutter in useScrollLock so collapsible animations don't shift centered content horizontally on classic scrollbars (@okisdev) -
#4350
42fd04f- feat: public, tunableuseSmooth(@okisdev)useSmoothand a newSmoothOptionstype are now exported from@assistant-ui/react(previously internal-only with a hard-coded reveal rate). thesmoothprop onMessagePartPrimitive.TextandMarkdownTextPrimitivewidens toboolean | SmoothOptions, withdrainMs(backlog drain target, default 250),maxCharIntervalMs(slowest reveal interval, default 5), andmaxCharsPerFrame(per-frame cap, default unlimited). the hook also now preserves the part type for reasoning parts instead of always returningtype: "text". react-markdown's@assistant-ui/reactpeer floor moves to the release that shipsSmoothOptions. -
#4325
5a4f20e- chore: update @assistant-ui/tap dependency ranges to ^0.7.0 (@Yonom) -
#4329
2b96cb5- fix: clear pending viewport bottom-scroll intent on pointer interaction, preventing collapsible expand/collapse from yanking the thread to the bottom (@okisdev) -
Updated dependencies [
ab8e5bc,59d252f,feecac3,3e58253,12b016b,3e58253,5a4f20e,f10b8ae,1fb5862]:- @assistant-ui/core@0.2.14
- @assistant-ui/store@0.2.16
- @assistant-ui/tap@0.7.1
0.14.17#
Patch Changes#
-
#4315
60ef0e9- feat: add runtime support for deleting messages (@Yonom) -
#4318
1b6a0d6- feat(tap): resources carry all hook arguments; elements are{ hook, args }(@Yonom)A
ResourceElementis now{ hook, args }(was{ type, props }): the underlying hook plus the full tuple of arguments to call it with. This lets a resource take multiple positional arguments, exactly like a hook, and makes hosting justhook(...args):const usePair = (a: number, b: string) => ({ a, b }); const Pair = resource(usePair); const element = Pair(1, "hi"); // { hook: usePair, args: [1, "hi"] }The single-object case is unchanged ergonomically (
Counter({ initialValue: 0 })still works; itsargsis just[{ initialValue: 0 }]), so existing resources and call sites are unaffected.resource()'s overloads collapse into one variadic signature, and thefnSymbol/callResourceFnindirection is gone (the element holds the hook directly;renderResourceFibercallsfiber.hook(...args)).Breaking (internal/advanced):
- The second type parameter of
Resource/ResourceElement/ContravariantResourcenow means the argument tupleA extends readonly unknown[]rather than a single payloadP. Explicit two-arg annotations must wrap the payload in a tuple (e.g.ResourceElement<R, [Props]>). - A resource's identity is now its hook. Reading
element.propsbecomeselement.args[0]; readingelement.typebecomeselement.hook.attachTransformScopesis now keyed by (and called with) the hook rather than the factory. useResource(element, deps)'s second arg is unchanged in behavior (renamedargsDeps).
- The second type parameter of
-
#4318
1b6a0d6- refactor: adopt the extracted-hook convention for resources (@Yonom)A resource body is a hook, so resources are now authored as a
use-prefixed hook
wrapped withresource():const useCounter = () => { ... }; const Counter = resource(useCounter);resource()turns a hook into a Resource;useResource(Counter(props))turns it
back into a hook call. Extracting the body to ause-prefixed hook lets React's
stock rules-of-hooks and exhaustive-deps lint resource bodies directly. No
public API or runtime behavior changes. -
Updated dependencies [
60ef0e9,1b6a0d6,1b6a0d6,1b6a0d6,1b6a0d6]:- @assistant-ui/core@0.2.13
- @assistant-ui/tap@0.6.2
- @assistant-ui/store@0.2.15
0.14.16#
Patch Changes#
- Updated dependencies:
- @assistant-ui/core@0.2.12
- @assistant-ui/tap@0.6.1
0.14.15#
Patch Changes#
-
#4260
19c5b5f- fix: make defineToolkit usable for plain runtime toolkits (@Yonom) -
#4246
dbdfb15- feat: message queuing for external-store, langgraph, and local runtimes (@okisdev)the composer can now stay usable while a run is in progress: a message sent during a run is held in
composer.queue(rendered viaComposerPrimitive.Queue/QueueItemPrimitive.*) and processed once the run settles. external-store adapters opt in by providing aqueueadapter (typically built with the newcreateMessageQueuehelper);useLangGraphRuntimeanduseLocalRuntimeopt in viaunstable_enableMessageQueue.ExternalThreadQueueAdapternow lives in@assistant-ui/core(still re-exported from@assistant-ui/react). -
#4249
ca191dc- feat: add externalTool for render-only generative toolkit entries (@Yonom) -
#4280
e7f1aa0- fix(mcp-apps): send the 2026-01-26 dialect on host→app messages so widgets built with@modelcontextprotocol/ext-appsinitialize and receive tool results (@okisdev)the bridge already normalized inbound
ui/*method names, but every outbound message (theui/initializeresult and the tool input/result/host context notifications) stayed in the pre-spec dialect. spec widgets zod-validate the initialize result and requirehostInfo+hostCapabilities, so they failed init; tool results were posted asnotifications/tools/call/result, a method the official SDK never listens for, so a patched widget still rendered empty. the bridge now additively dual-sends both dialects (the initialize result carrieshost/capabilitiesandhostInfo/hostCapabilities, echoes the app's requestedprotocolVersion, and each notification posts itsui/notifications/*counterpart with the spec param shapes). unknown methods and fields are ignored by either SDK, so legacy widgets are unaffected. -
#4256
44ff4bf- feat: rename hitlTool to humanTool while keeping deprecated compatibility aliases (@Yonom) -
#4298
72494e7- refactor: extract a shared sandbox host (SafeContentFrame lifecycle, the single cross-origin guarded message listener, auto-resize) and reuse it for the MCP app frame, with no behavior change (@okisdev) -
Updated dependencies [
2a84174,a0a0769,19c5b5f,dbdfb15,ca191dc,15878d8,44ff4bf,01cf957,01cf957,26a365b]:- @assistant-ui/core@0.2.11
- assistant-stream@0.3.21
- assistant-cloud@0.1.32
- safe-content-frame@0.0.21
- @assistant-ui/store@0.2.14
- @assistant-ui/tap@0.6.0
0.14.14#
Patch Changes#
-
#4212
5fe118d- feat: add MCP server support to generative toolkits (@Yonom) -
#4213
dcd5897- feat: add provider-executed tool support to generative toolkits (@Yonom) -
#4127
606c9d4- feat(assistant-transport): honourAui-Replay-Content-Lengthto split sync-server replay from live bytes (@Yonom)useAssistantTransportRuntimenow reads theAui-Replay-Content-Lengthresponse header on resume and gates the body at that byte boundary. The replay prefix is decoded whileisLoading: truehas rendered through React, then the reader pauses untilisLoading: falsehas rendered before releasing live bytes. Tool calls in the replayed portion are recorded as historical and skipstreamCall/execute, while tool calls that begin after the replay boundary fire normally. Responses without the header behave as today. -
#4208
0558db2- feat: addupdateCustomto thread list runtimes, adapters, and clients (@okisdev) -
#4214
69540af- feat: add renderText helpers for tool call status text (@Yonom) -
#4199
d9b3119- feat: adefineToolkitentry may now be an already-formedToolDefinition(carrying its owntype), not only an inline definition whosetypethe compiler infers. This is what lets a factory likenew JSONGenerativeUI({ library }).present()be used directly as a tool. (@Yonom)Renames the authoring types to match
defineToolkit:ToolkitDeclaration→ToolkitDefinition, and addsToolkitDefinitionEntry(the union of an inline tool definition and a pre-formedToolDefinition). The per-tool inline type is now an internalToolkitDefinitionInputand is no longer exported. -
#4236
ae54c55- feat: addstubTool()and experimentaluseAuiToolOverrides()for locally executed generative toolkit tools (@Yonom) -
#4235
7640b31- Deprecate component tool registration APIs in favor of toolkit registrations. (@Yonom) -
Updated dependencies [
cba2b42,4145caa,58f80e0,78ff336,5fe118d,dcd5897,0558db2,69540af,d9b3119,ae54c55,7640b31]:- assistant-stream@0.3.20
- @assistant-ui/core@0.2.10
- assistant-cloud@0.1.31
0.14.13#
Patch Changes#
-
#4176
27ae936- feat: add theToolkitDeclaration/ToolkitDeclarationDefinitiontypes for authoring a toolkit permissively (a backend tool may declaredescription/parameters/execute); the canonicalToolkitkeeps those fields erased. Author withdefineToolkit()from@assistant-ui/react, which the"use generative"compiler strips per build. (@Yonom) -
#4176
27ae936- feat: move thedefineToolkitandhitluse-generative markers from@assistant-ui/nextinto@assistant-ui/core/react, so they ship once from every distribution (@assistant-ui/react,@assistant-ui/react-native,@assistant-ui/react-ink) and stay portable across build targets. Import them from@assistant-ui/reactinstead of@assistant-ui/next; they remain no-op markers stripped at build time by a"use generative"compiler. (@Yonom) -
Updated dependencies [
27ae936,27ae936]:- assistant-stream@0.3.19
- @assistant-ui/core@0.2.9
0.14.12#
Patch Changes#
-
#4172
1315789- feat: add theToolkitDeclaration/ToolkitDeclarationDefinitiontypes for authoring a toolkit permissively (a backend tool may declaredescription/parameters/execute); the canonicalToolkitkeeps those fields erased. Author withdefineToolkit()from@assistant-ui/next, which the"use generative"compiler strips per build. (@Yonom) -
#4151
299d448- chore: drop stalebiome-ignorepragmas now that the repo lints with oxlint (@okisdev) -
#4136
4429aa3- centralize thread-level shared options forwarding across runtime wrapper hooks. follow-up to #4135. (@okisdev)new public exports from
@assistant-ui/core(re-exported from@assistant-ui/react):ExternalStoreSharedOptions, a typedPickoverExternalStoreAdaptercovering the four thread-level optional fields every wrapper forwards:isDisabled,isSendDisabled,unstable_capabilities,suggestions.pickExternalStoreSharedOptions(options), plucks those four fields from a wider options object. the body usessatisfies Required<...>so adding a key to the type without copying it in the function is a compile error rather than a silent missing-field bug.useExternalStoreSharedOptions(options)(from@assistant-ui/core/react), a memoized variant for wrappers that wrap their store inuseMemo. lets the wrapper list a single stablesharedreference as a dep instead of enumerating the four fields. samesatisfiesguard internally so the destructure stays in sync with the type.
internal: every runtime wrapper hook (
useChatRuntime,useAISDKRuntime,useLangGraphRuntime,useA2ARuntime,useAgUiRuntime,useAdkRuntime,useStreamRuntime,useOpenCodeRuntime) now uses these helpers instead of inlining the conditional spreads added in #4135. each wrapper sheds 20 to 40 lines of duplicated declarations and conditional spreads; future additions to the shared option set propagate through a single edit inpickExternalStoreSharedOptionsinstead of touching every wrapper. no user-facing behavior change. -
#4141
0b99959- fix(react): stop subtree mutations from snapping a scrolled-up viewport back to bottom; loosen at-bottom threshold for high-DPR displays (@vaniyokk)useThreadViewportAutoScrollhad two related bugs surfaced on Chrome macOS atdevicePixelRatio: 2:- subtree mutations snapped the viewport back to bottom after the user scrolled away.
scrollingToBottomBehaviorRefwas planted onthread.runStart/useOnScrollToBottom/ initialize / thread switch and only cleared inhandleScrolloncenewIsAtBottombecame true. while the ref stayed set, every non-style subtree mutation (a Radixdata-stateflip, a markdown re-render, an image lazy-load, an attribute toggle on a child) re-entereduseOnResizeContent's callback and calledscrollToBottom(scrollBehavior), locking the viewport to the bottom until reload. isAtBottomnever registered astrueon high-DPR displays.Math.abs(scrollHeight - scrollTop - clientHeight) < 1is strict-less-than, and Chrome macOS atdevicePixelRatio: 2clipsscrollTopone pixel short ofscrollHeight - clientHeight(Math.abs(1) < 1 === false), so the store never updated andScrollToBottomnever moved into its disabled state.
the fix combines two layers.
handleScrollnow trackslastScrollHeightalongsidelastScrollTopand releases the auto-stick intent when the user scrolls up with content size unchanged, ruling out content-driven scrollTop shifts. the resize callback also bails when neitherscrollHeightnorclientHeighthas changed since the last fire, so mutations that don't move layout never re-enter the snap path. at-bottom auto-follow during streaming is preserved (verified by appending a synthetic 600px child while scrolled to bottom; viewport follows to new bottom). the threshold becomes<= 1to absorb the 1px sub-pixel clip.closes #4140.
- subtree mutations snapped the viewport back to bottom after the user scrolled away.
-
#4160
e76611f- feat: addindicatorsupport toMessagePrimitive.GroupedParts. (@Yonom)Restores loading-state handling that was dropped from the grouped renderer.
GroupedPartsnow emits a synthetic{ part: { type: "indicator" } }render call you handle withcase "indicator"in yourswitch (part.type)— render a "thinking…" dot or any loading affordance.- The indicator is only ever emitted while the message is running, so its presence alone means "render loading UI here" — there's no
statusto branch on. - New
indicatorprop restricts which running states qualify:"never","empty"(no parts yet),"no-text"(default — last part isn'ttext/reasoning, e.g. the model ended on a tool call), or"always"(any running state).
- The indicator is only ever emitted while the message is running, so its presence alone means "render loading UI here" — there's no
-
#4162
eef724e- fix: drop phantom sibling messages when an external store swaps an optimistic message id mid-run (#4037). (@Yonom)Messages can now be flagged
metadata.isOptimistic. Optimistic messages are treated as ephemeral: they only ever live on the current head branch (the repository evicts off-branch optimistic messages whenever the head moves) and they are never written to persisted state (export()omits them). The AI SDK v6 adapter flags the streaming assistant message as optimistic, so when its client-generated id is replaced by a server-provided one mid-run, the stale placeholder no longer lingers as a phantom branch (e.g.BranchPickershowing2/2on a turn the user never branched). Unlike the reverted blanket id-diff (#4040), only explicitly-optimistic messages are affected, so legitimateonEdit/onReload/switchToBranchbranches are preserved. -
#4148
2d9595e- revert: roll back #4040 (drop phantom siblings on external-store id swap). the_lastSyncedMessageIdsdiff was deleting legitimate sibling branches created byonEdit/onReload/switchToBranch, causingBranchPickerto disappear on edits and reloads (#4131). this revert restores the additive sync behavior; the AI SDK v6 mid-stream id swap (#4037) regresses and will be addressed in the AI SDK adapter instead. (@okisdev) -
#4167
fcb6baf- feat: add adisplaypresentation hint to tools and a"standalone-tool-call"key togroupPartByType. (@Yonom)Tool UIs fall into three buckets: prompting the user (human-in-the-loop), informing the user (generative UI), and traces of what the model is doing (routine frontend/backend tool calls). The first two should be surfaced on their own; the last belongs folded into the chain-of-thought trace. The new
displayfield on a tool lets you place a tool in the right bucket without overloadingtype:const toolkit = { ask_user: { type: "human", render: AskUI }, // standalone (forced — can't opt out) search_web: { type: "frontend", render: SearchUI }, // inline trace (default) checkout: { type: "frontend", render: CheckoutUI, display: "standalone", // opt in }, } satisfies Toolkit;display?: "standalone" | "inline"is a client-only presentation hint (it never reaches the model). Defaults to"inline".humantools are always"standalone"and cannot opt out (the type only allows"standalone"). MCP-app tool calls and the built-in generative-UI tool are standalone too. Every other tool defaults to inline and opts in explicitly.groupPartByTypegains a synthetic"standalone-tool-call"key that matches all of the above.MessagePrimitive.GroupedPartspasses the live tool-UI registry to thegroupByfunction as a secondcontextargument ({ toolUIs }), and the helper reads it to resolve the registry-driven cases; MCP-app calls are detected from the part alone.- The
"mcp-app"key ongroupPartByTypeis deprecated in favor of"standalone-tool-call"(a superset). It still works for back-compat.
The shadcn
thread.tsxtemplate is updated to use"standalone-tool-call": []in place of"mcp-app": []. -
Updated dependencies [
1315789,299d448,4429aa3,e76611f,76f7d16,eef724e,2dec3ae,fcb6baf,c4d3eea,331f2f7]:- assistant-stream@0.3.18
- @assistant-ui/core@0.2.8
- @assistant-ui/store@0.2.13
- @assistant-ui/tap@0.5.14
- assistant-cloud@0.1.30
0.14.11#
Patch Changes#
- #4125
e639a11- chore: drop tracker-behaviour explainer comments left behind in satellite runtimes (@Yonom)
0.14.10#
Patch Changes#
-
#4118
a6e0653- feat(core): build a client-side tool-invocations pipeline directly intouseExternalStoreRuntime. Tool-call parts in messages now firestreamCall/executeautomatically for any external-store runtime that opts in. Opt in per-adapter viaunstable_enableToolInvocations: true(off by default — most external-store runtimes either run tools server-side or already wire their own client-side dispatch path; double-firing is the risk). The_store.isLoadingflag signals when initial history is loaded: snapshots observed whileisLoading === trueare treated as historical (no fire), matching the contract that callers likeimportExternalStatealready rely on. Six in-tree runtimes (useAssistantTransportRuntime,useAISDKRuntime,useLangGraphRuntime,useStreamRuntime,useAgUiRuntime,useAdkRuntime) are migrated to the embedded tracker; the standaloneuseToolInvocationsReact hook is removed. AddsExternalStoreAdapter.setToolStatusesso adapters can mirror the tracker's per-tool-call status into local React state for converter metadata. Auto-aborts in-flight tool calls on new turns (append()withstartRun,startRun()) so a tool that finishes after the user moves on can no longer feed a stale result into the next turn. (@Yonom) -
Updated dependencies [
7395092,a6e0653,cabfc71]:- @assistant-ui/core@0.2.7
- @assistant-ui/tap@0.5.13
0.14.9#
Patch Changes#
-
#4120
372d4f0- feat: simplifyMessagePrimitive.GroupedPartsAPI and addgroupPartByTypehelper. (@Yonom)- New
groupPartByType({ ... })helper builds agroupByfrom apart.type → group-key pathlookup. The map keys are typed againstPartState["type"](autocomplete + typo rejection), missing keys leave the part ungrouped, and the returned function carries an internal memo fingerprint so the tree survives unrelated re-renders even when reconstructed inline. - Special map key
"mcp-app"matches tool-call parts that point at an assistant-ui MCP app resource (ui://...). It takes precedence over the"tool-call"entry for those parts, so MCP apps can be routed separately (e.g. rendered outside a chain-of-thought wrapper). groupBysignature simplified from(part, index, parts) => string | string[] | null | undefinedto(part) => readonly \group-${string}`[] | null. The 2nd/3rd args were unused in practice. Arrays are required (no bare-string shorthand);nullis accepted as an alias for[]` to soften the migration.- Internal memoization now uses the helper's memo fingerprint when present, otherwise rebuilds the tree per render (O(n), cheap). The previous "pass a stable reference" advice is dropped — inline
groupByis fine. - Docs and examples updated to lead with
groupPartByType. ThegetMcpAppFromToolPartbranch inpackages/uiswitches to"mcp-app": []via the helper.
- New
-
#4107
32ae846- feat: surface AI SDK v6 tool approvals as a first-classrespondToApprovalprop on tool components. tool-call parts in theapproval-requestedstate now carrypart.approval = { id, isAutomatic? }; tool components callrespondToApproval({ approved, reason? })to ack the gate without threadingchatHelpersthrough application context. also fixes a transientrequires-actionflicker for theapproval-respondedstate and tightens the external-message converter so interrupt vs pending tool calls are distinguished by an actualinterrupt/approvalfield rather than byresult === undefined. (@okisdev) -
Updated dependencies [
372d4f0,d4f1db4,32ae846]:- @assistant-ui/core@0.2.6
- assistant-stream@0.3.17
0.14.8#
Patch Changes#
-
#4093
b02b701- feat(react):unstable_insertNewlineOnTouchEnteronComposerPrimitive.Input(@okisdev)When set, plain Enter on a touch-primary device — detected via the
(pointer: coarse) and (not (any-pointer: fine))media query — inserts a newline instead of submitting. Messages then dispatch only via the explicit Send button, matching the chat-input convention used by WhatsApp, Slack, Discord, iMessage, ChatGPT, and Claude.ai, and avoiding the consumer-side caret-aware re-insertion dance the previous workaround required.Orthogonal to
submitMode: only takes effect whensubmitModeresolves to"enter"(the default). A tablet paired with a hardware keyboard can still submit viasubmitMode="ctrlEnter"(Cmd/Ctrl+Enter), andsubmitMode="none"is unchanged.<ComposerPrimitive.Input placeholder="Ask anything..." unstable_insertNewlineOnTouchEnter />Stays
unstable_until we have enough field signal to flip the behavior on by default. -
#3967
0a0c306- feat(core, react): addMessagePrimitive.GenerativeUIprimitive (@samdickson22)A new first-class primitive for rendering agent-described React UI from a JSON
spec, with a consumer-provided component allowlist as the security boundary.The agent emits a new
generative-uimessage part containing a tree of
components by name;MessagePrimitive.GenerativeUIwalks the spec and resolves
each name against the registry you pass in. Unknown names throw a typed
GenerativeUIRenderError(or invoke the optionalFallback). Composes with
MessagePrimitive.Partsvia the newcomponents.generativeUIoption, and
supports streaming partial specs.<MessagePrimitive.Parts components={{ generativeUI: { components: { Card, Button } }, }} /> -
#4099
f2ec01c- feat(core, react): opt-out of auto-unarchive when switching threads (@adityamohta)switchToThread(andThreadListItemRuntime.switchTo) now accept an optional{ unarchive?: boolean }argument. The default remainstrue, preserving the existing behavior of auto-unarchiving an archived thread when it becomes the main thread. Passunarchive: falseto keep the thread archived after switching — useful when the UI lets users preview an archived conversation without restoring it.// existing behavior — archived thread becomes regular await threadList.switchToThread(threadId); // new — keep status as archived await threadList.switchToThread(threadId, { unarchive: false }); // same option on the item runtime await threadListItem.switchTo({ unarchive: false }); -
Updated dependencies [
13a12c4,0a0c306,6a0ecb2,e4634a5,325de4c,01244a5,f2ec01c,1e21076]:- assistant-stream@0.3.16
- @assistant-ui/core@0.2.5
- assistant-cloud@0.1.29
- safe-content-frame@0.0.20
- @assistant-ui/store@0.2.12
- @assistant-ui/tap@0.5.12
0.14.7#
Patch Changes#
-
#4073
44ac459- fix(react|useSmooth): render-phase resync of displayed text on part change (@Yonom)Drop one frame of stale text after a thread switch by resyncing
displayedTextin render when the part instance flips ortext
breaks its streaming-append continuity, instead of waiting for
the post-commit effect. -
Updated dependencies [
221d320]:- @assistant-ui/core@0.2.4
0.14.6#
Patch Changes#
-
#4023
94548fa- docs: add React JSDoc and deprecation notices for primitive and tool APIs (@AVGVSTVS96) -
#3513
8b6fc88- fix: guardnavigator.clipboardavailability and swallow write rejections inActionBarPrimitive.Copy. Previously, copy clicks in SSR, non-HTTPS contexts, or older browsers without the Clipboard API threw aReferenceError, and permission-denied rejections surfaced as unhandled promise rejections. The web copyToClipboard implementation in@assistant-ui/reactnow early-rejects when the API is unavailable, anduseActionBarCopyin@assistant-ui/coresilently absorbs the rejection so the rest of the UI is unaffected. (@JustAnOkapi) -
#4040
b481ec5- fix:useExternalStoreRuntimeno longer leaves phantom assistant siblings when the external store swaps a message id between syncs (e.g. AI SDK v6useChatreplacing a client-generated id with a server-provided id mid-stream, surfacing asBranchPickershowing2/2on a turn the user never branched). Themessages-array sync path now diffs against the previous sync and removes ids that disappeared, matching themessageRepositorypath's snapshot semantics. Closes #4037. (@okisdev) -
#4063
8f0dbb8- fix thread initialization timing race which causedscrollToBottomOnInitializeto fail inuseLocalRuntime(@AVGVSTVS96) -
#3958
7a8bf26- refactor: hoistMessagePartPrimitiveInProgressto@assistant-ui/core/reactso@assistant-ui/react,@assistant-ui/react-ink, and other distributions can share the same implementation.@assistant-ui/react'sMessagePartPrimitive.InProgressis unchanged for callers; it now re-exports from core. (@ShobhitPatra) -
#4050
693922b- fix(x-buildutils): include localtypes/intypeRootsso x-buildutils itself can resolve its ambientbrowser-processtypes (@Yonom)feat(react): re-export
Unstable_DirectiveFormatter,Unstable_DirectiveSegment,Unstable_TriggerItem, andunstable_defaultDirectiveFormatterfrom@assistant-ui/coreso downstream packages don't need to depend on@assistant-ui/coredirectly -
Updated dependencies [
845c7c1,db721df,94548fa,94548fa,94548fa,8b6fc88,179895f,7a8bf26,3b2bbce]:- assistant-cloud@0.1.28
- @assistant-ui/store@0.2.11
- assistant-stream@0.3.15
- @assistant-ui/core@0.2.3
0.14.5#
Patch Changes#
- Accept the MCP-UI
2026-01-26method names in the MCP App bridge (e.g.ui/notifications/size-changed,ui/request-display-mode,ui/open-link,ui/message). Widgets built with the current xmcp host-bridge emit these names; previously the host silently ignored them, leaving features like auto-resize broken (iframe never received a height change fromonSizeChange).
0.14.4#
Patch Changes#
-
#4033
552ffb0- feat(react): exportgetMcpAppFromToolPartso hosts can detect MCP-app tool parts (@Yonom) -
Updated dependencies []:
- safe-content-frame@0.0.19
0.14.3#
Patch Changes#
- #4031
30f0357- feat(react): clamp MCP app auto-resize height to a configurable max (default 800px) (@Yonom)
0.14.2#
Patch Changes#
-
#4024
19d4d94- feat: add native MCP Apps renderer —McpAppRenderercomposes intoToolsto render MCP UI resources inline in chat over a JSON-RPC postMessage bridge onSafeContentFrame. Adds anmcpfield toToolCallMessagePartand forwardscallProviderMetadata.mcp.appthrough the AI SDK message converter. (@Yonom) -
#4022
4c3eaa1- fix(composer): apply WAI-ARIA combobox attributes to the textarea while a trigger popover is open (@okisdev)Unstable_TriggerPopoverrendered the listbox half of the WAI-ARIA editable combobox pattern, but the focused element (the textarea) lacked the corresponding combobox attributes. screen readers had no way to announce that an autocomplete was open or which item was highlighted.ComposerPrimitive.Inputnow reads the active popover descriptor fromTriggerPopoverRootand appliesaria-controls,aria-expanded,aria-haspopup="listbox", andaria-activedescendantto the textarea while a popover is open. attributes are removed when the popover closes. consumers usingComposerPrimitive.Inputoutside aTriggerPopoverRootare unaffected. -
#4020
03694bd- fix(composer): select highlighted item on Tab in trigger popover (@serhiizghama)ComposerPrimitive.Unstable_TriggerPopoveronly accepted the highlighted entry on Enter. Tab fell through to the underlying textarea, moving focus out of the composer or inserting a tab character. This diverged from the autocomplete convention used in CLIs, IDEs, command palettes, GitHub, Slack, Discord, and Notion, where Tab accepts the highlighted suggestion.Tab now mirrors Enter and selects the highlighted item or category. Shift+Tab still passes through so native focus traversal keeps working.
-
Updated dependencies [
19d4d94]:- @assistant-ui/core@0.2.2
0.14.1#
Patch Changes#
-
#3984
35d0146- feat(composer): exposecanSendstate andisSendDisabledadapter input (@okisdev)ComposerState.canSend(read-only) is now derivable viauseAuiState((s) => s.composer.canSend)and<AuiIf condition={(s) => s.composer.canSend}/>. it reflects whether the composer is in a state where send is permitted; cross-thread gating (isRunning,capabilities.queue) continues to be layered on top byuseComposerSend.ExternalStoreAdapter.isSendDisabledis a new optional input alongsideisDisabled. whentrue, the thread composer's input remains usable butsend()becomes a no-op andcanSendisfalse. use this to gate sending on external React state (e.g. while tool config is loading) without disabling the input itself. edit composers (saving in-progress message edits) intentionally ignore this flag, since it is a thread-scoped gate.BaseComposerRuntimeCore.send()now early-returns when!canSend, so theCmd/Ctrl+Shift+Entersteer hotkey, form-requestSubmit(), and directaui.composer().send()calls are all gated by the same flag. the same gating is wired through the tap-basedExternalThreadclient via a newisSendDisabledprop onExternalThreadProps. -
#4008
fa4510a- feat: support multi-modal tool results viatoModelOutput(@okisdev)frontend tools can now project their execution output into multi-modal model content (text + image / pdf / arbitrary file parts), aligning with the AI SDK v6
toModelOutputcallback. previously, tool results were always serialized as a single JSON value, so a "read pdf" style tool had no way to send the PDF back to a multi-modal model.assistant-streamexports a newToolModelContentParttype ({ type: "text", text } | { type: "file", data, mediaType, filename? }) and aToolModelOutputFunction<TArgs, TResult>callback type.Tool.toModelOutputis wired throughunstable_runPendingToolsandToolExecutionStream, attaching the resultingmodelContentto thetool-callpart on the assistant message.@assistant-ui/corere-exportsToolModelContentPartand adds an optionalmodelContent?: readonly ToolModelContentPart[]field onToolCallMessagePart. existing tools and renderers are unchanged.@assistant-ui/react-ai-sdk'sfrontendTools(...)helper now also registers atoModelOutputon each forwarded tool. it transparently unwraps an envelope thatuseAISDKRuntimewrites when a frontend-executed tool producedmodelContent, turning it into AI SDK's{ type: "content", value: [...] }output. plain (non-envelope) outputs fall back to the existing{ type: "text" | "json", value }shape, so behavior for tools withouttoModelOutputis unchanged.
route handlers that adopt
toModelOutputalso need to passtoolstoconvertToModelMessages(this is the AI SDK's documented pattern):const aiSDKTools = { ...frontendTools(tools ?? {}) }; streamText({ messages: await convertToModelMessages(messages, { tools: aiSDKTools }), tools: aiSDKTools, });templates and existing examples are unchanged. they keep the simpler
convertToModelMessages(messages)form because none of the tools they ship with usetoModelOutput. the new tools guide page documents how to opt in.reserved key. when a frontend tool defines
toModelOutput, its result is persisted in the AI SDK chat as{ __aui_modelContent: ToolModelContentPart[], value: <your result> }. tools must not return objects whose top-level key is literally__aui_modelContent, orconvertMessagewill misread the result. the prefix is namespaced for this reason.read/write compatibility for persisted threads. the envelope is recognized by
@assistant-ui/react-ai-sdkfrom this version onward. if you persist UI messages and read them from multiple environments, upgrade every reader before any writer starts producingtoModelOutput; otherwise older readers will treat the envelope object as theresultand break the affected toolrenderfunctions. -
#3634
9c3d24d- Support AI SDKsource-documentparts by preserving them as assistant-ui (@sicko7947)
document source message parts across conversion and cloud serialization,
including the legacy React cloud encoder. -
Updated dependencies [
9ecda1d,35d0146,fa4510a,c9dd16c,dea8bc7,9c3d24d]:- assistant-stream@0.3.14
- @assistant-ui/core@0.2.1
0.14.0#
Minor Changes#
-
#3970
040d469- chore: drop APIs deprecated in v0.11/v0.12 (@Yonom)See the v0.14 migration guide for the full removal list and replacements.
useAssistantApi/useAssistantState/useAssistantEvent/AssistantIfremoved (useuseAui/useAuiState/useAuiEvent/AuiIf).getExternalStoreMessage(singular) removed (usegetExternalStoreMessages).MessageState.submittedFeedbackremoved (usemessage.metadata.submittedFeedback).ThreadRuntime.startRun(parentId)positional overload removed (pass{ parentId }).ThreadRuntime.unstable_loadExternalStateremoved (useimportExternalState).ThreadRuntime.unstable_resumeRunremoved (useresumeRun).ThreadRuntime.getModelConfigremoved (usegetModelContext).AssistantRuntime.threadList/switchToNewThread/switchToThread/registerModelConfigProvider/resetremoved (usethreads/threads.switchToNewThread/threads.switchToThread/registerModelContextProvider/thread.reset).ChatModelRunOptions.configremoved (usecontext).useLocalThreadRuntimealias removed (useuseLocalRuntime).unstable_useRemoteThreadListRuntime/unstable_useCloudThreadListAdapter/unstable_RemoteThreadListAdapter/unstable_InMemoryThreadListAdapteraliases removed (drop theunstable_prefix).react-langgraphonSwitchToThreadremoved (useload).toAISDKTools/getEnabledToolsremoved (usetoToolsJSONSchemafromassistant-stream).
Patch Changes#
- Updated dependencies [
040d469]:- @assistant-ui/core@0.2.0
0.13.0#
Minor Changes#
-
#3908
d864d07- fix: robust top-turn anchoring with viewport-owned reserve (@AVGVSTVS96)Migration:
- Remove
ThreadPrimitive.ViewportSlackfrom your tree. It has been removed from the public API because top-anchor target registration is now handled automatically byMessagePrimitive.RootwhenturnAnchor="top". - If you customized
fillClampThreshold/fillClampOffsetonThreadPrimitive.ViewportSlackorMessagePrimitive.Root, replace them withtopAnchorMessageClamponThreadPrimitive.Viewport:
// Before, either: <MessagePrimitive.Root fillClampThreshold="10em" fillClampOffset="6em" /> // or: <ThreadPrimitive.ViewportSlack fillClampThreshold="10em" fillClampOffset="6em"> ... </ThreadPrimitive.ViewportSlack> // After <ThreadPrimitive.Viewport turnAnchor="top" topAnchorMessageClamp={{ tallerThan: "10em", visibleHeight: "6em" }} ... </ThreadPrimitive.Viewport> - Remove
Patch Changes#
-
#3924
801b9a6- fix(react): recover ComposerPrimitive.Input from dropped compositionend (@nitnizzie)reset
compositionRefwhen the next change event reportsisComposing: falseso a droppedcompositionend(chromium dead-key layouts, mid-composition focus loss) can no longer freeze the input. additionally callsetTextduring composition so React 19's stricter controlled-input reconciliation does not reset the textarea mid-IME. fixes #3923. -
#3953
7098bab- Add cursor-based pagination to the thread list.RemoteThreadListAdapter.list()accepts an optional{ after }cursor and may returnnextCursoron the response. The runtime exposesloadMore(),hasMore, andisLoadingMorethrough both the legacyThreadListRuntimeAPI and the tap-onlyaui.threads()path;ThreadListRuntimeCore.loadMore?(),hasMore?, andisLoadingMore?are optional, so non-paginating cores (local, external-store, single-thread, in-memory) remain conformant. (@okisdev)@assistant-ui/reactships a matchingThreadListPrimitive.LoadMorebutton built oncreateActionButton, plus auseThreadListLoadMoreprimitive hook. Consumers wanting anIntersectionObserversentinel can reads.threads.hasMore/isLoadingMorefromuseAuiStateand callaui.threads().loadMore()directly.In-flight
loadMore()calls dedup via a single promise. The existing_loadGenerationcounter drops stale append callbacks when areload()interleaves aloadMore(). The loadMore reducer captures the active adapter so a mid-flight adapter swap cannot leak a stale page. Empty-stringnextCursoris normalised toundefined.reload()pre-clears the cursor so consumers readinghasMoredirectly during a reload do not observe a stale value.Adapter rejections are surfaced via
console.errorin both the initial-load andloadMorepaths, matching the pattern inRemoteThreadListHookInstanceManageranduseToolInvocations. -
#3954
aa6e071- fix: keep active top-anchored messages visible to layout (@AVGVSTVS96) -
#3952
df7eb3e- perf: cut per-message overhead in long threads (@okisdev)Two
MessagePrimitive.Rootchanges remove work that scaled with message count:- Defer the
parseCssLengthcall inside the top-anchor target ref to the next animation frame. The synchronousgetComputedStyleread previously forced a full-tree layout during the bulk-mount of a long thread (a 335 ms forced reflow at 100 messages in our trace). Deferring past first paint lets the browser do the layout naturally. - Split the root into a default and a top-anchor path. Threads using the default
turnAnchor="bottom"no longer subscribe to the top-anchoruseAuiStateselectors per message.
The only observable change is that top-anchor target registration is now async by one frame.
Note:
@assistant-ui/ui(private, copy-into-project) gains acontent-visibility: autodefault on message wrappers in the same PR. On a cold load with pre-existing history taller than the viewport, the placeholder-basedscrollHeightcan transiently disagree with the at-bottom check until off-screen messages are measured.useOnResizeContentresyncs within a frame, and the auto-scroll path uses an explicit "scrolling" flag rather than trustingisAtBottomalone, so run-start scrolling is unaffected. - Defer the
-
#3948
f4a693e- fix(core): restore adapter context flow through RemoteThreadListAdapter.unstable_Provider (@okisdev)PR #3891 hoisted the runtime binder out of
RemoteThreadListAdapter.unstable_Providerso that user-supplied loading / Suspense wrappers no longer strand the runtime binding. as a side effect, anyRuntimeAdapterProvidermounted insideunstable_Provider(history, attachments — whatuseCloudThreadListAdapterandLocalStorageThreadListAdapterboth do) ended up below the binder in the render tree.useRuntimeAdapters()reads context from above, so the runtime hook sawnullanduseExternalHistoryearly-returned.for
useChatRuntime({ cloud })setups this silently disabled message persistence (POST /v1/threads/:id/messages), thread history loading, run telemetry (POST /v1/runs), and forced cloud attachments to fall back tovercelAttachmentAdapter's base64 inlining. the same regression hitsuseA2ARuntime,useAgUiRuntime, anduseLocalRuntimewhenever they are wrapped byuseRemoteThreadListRuntimewith a similar adapter.restore the pre-#3891 layering: the binder once again renders inside
unstable_Provider, so the runtime hook reads any context the Provider injects. theProviderRenderDetectorwarning introduced by #3891 is kept and now fires whenever Provider gateschildrenbehind suspense, loading state, oruseEffect(the original #3678 case), pointing the user at the synchronous-children rule. no API surface changes; first-party adapters keep working unchanged. -
Updated dependencies [
7098bab,b090acb,5fdf17e]:- @assistant-ui/core@0.1.18
- assistant-stream@0.3.13
- @assistant-ui/store@0.2.10
- @assistant-ui/tap@0.5.11
0.12.28#
Patch Changes#
-
#3853
6a919c1- feat: add<MessagePrimitive.GroupedParts>for hierarchical adjacent grouping of message parts (@Yonom)Introduces a new primitive that coalesces adjacent parts into groups via a user-supplied
groupBy(part) → "group-…" | readonly "group-…"[] | null. Adjacent parts sharing a key-path prefix coalesce up to that prefix; ungrouped parts render as direct leaves.The render function takes
{ part, children }and dispatches on a singleswitch (part.type)."group-…"cases wrapchildren(the recursively-rendered subtree); real part types ("text","tool-call","reasoning", …) render the part directly with the sameEnrichedPartStateenrichments (toolUI,addResult,resume,dataRendererUI) that<MessagePrimitive.Parts>provides.GroupPartis intentionally minimal:{ type, status, indices }. The render function is invoked once per group node and once per individual leaf part, so users never have to nest a<MessagePrimitive.Parts>call.The
groupByreturn type is constrained to`group-${string}`so the unified switch can never collide with a real part type. The component infers a literalTKeyper call site, sopart.typenarrows to the exact union of group keys plus part types.For leaf parts,
childrenis a sentinel that throws if rendered — accidental fall-through likedefault: return children;errors loudly instead of silently rendering nothing. Returningnullfrom a leaf case is fine.Deprecates the legacy
components.ToolGroup,components.ReasoningGroup, andcomponents.ChainOfThoughtprops on<Parts>, and<MessagePrimitive.Unstable_PartsGrouped>for adjacent grouping — all still work for backwards compatibility. -
Updated dependencies [
0bbf5dd,98f165c,62ec5bd,6a919c1]:- @assistant-ui/core@0.1.17
0.12.27#
Patch Changes#
-
Updated dependencies [
549037a,005f83f,976aec5,25b97d5,2008fc9,88fcd35]:- @assistant-ui/core@0.1.16
- @assistant-ui/store@0.2.9
- @assistant-ui/tap@0.5.10
0.12.26#
Patch Changes#
-
#3873
c56f98f- feat(core): addreload()method onThreadListRuntimeandaui.threads()that re-invokes the remote adapter'slist()and refreshes the thread list. Use this after asynchronous auth (e.g. OIDC, better-auth) completes to recover from an initial load that ran before the authenticated user was available. A generation counter ensures a mid-flight response from a superseded load cannot overwrite a newer reload's state. (@okisdev) -
#3829
9aa5410- fix: add render prop support to dropdown menu primitives (@AVGVSTVS96) -
#3583
a1f84ae- fix: process dropped attachments in parallel (@samdickson22)Align drag-and-drop attachment handling with paste so multiple files appear together instead of appearing one by one.
-
#3870
b4fde97- fix(composer): sync mouse hover with keyboard highlight inTriggerPopover. Items and categories now updatehighlightedIndexon mouse move, keepingdata-highlighted,aria-selected, andaria-activedescendantconsistent with the hovered element. A newhighlightIndex(index)method is exposed on the popover scope. Closes #3868. (@okisdev) -
#3831
d53ff4f- chore: remove decorative separator comments across packages (@okisdev) -
#3834
17958c9- refactor: unify mention/slash under behavior sub-primitives; delete Mention/SlashCommand aliases and theexecutefield onUnstable_TriggerItem; split TriggerPopoverResource; rename react-lexicalMentionNode/MentionPlugin/MentionChipProvider/mentionChipprop toDirectiveNode/DirectivePlugin/DirectiveChipProvider/directiveChip; fix IME/Unicode/copy-paste/undo bugs. Breaking (Unstable_APIs): replaceonSelect={{type:"insertDirective",formatter}}with<Unstable_TriggerPopover.Directive formatter={...}>; replaceonSelect={{type:"action",handler}}with<Unstable_TriggerPopover.Action onExecute={...}>. Renameunstable_useToolMentionAdapter→unstable_useMentionAdapterwith newitems/categories/includeModelContextToolsoptions.unstable_useSlashCommandAdapternow returns{ adapter, action }—executestays in the hook closure instead of on the item. Rename CSS classaui-mention-chip→aui-directive-chipand attributesdata-mention-*→data-directive-*. (@okisdev) -
#3827
477fa8a- feat: unify mention and slash command primitives underUnstable_TriggerPopover(@okisdev) -
Updated dependencies [
c7a274e,ce865bc,ca8f526,c56f98f,974d15e,4b19d42,055dda5,da0f598,d53ff4f,20f8404,17958c9]:- @assistant-ui/core@0.1.15
- assistant-stream@0.3.12
- assistant-cloud@0.1.27
- @assistant-ui/store@0.2.8
- @assistant-ui/tap@0.5.9
0.12.25#
Patch Changes#
- c988db8: chore: update dependencies
- Updated dependencies [f20b9ca]
- Updated dependencies [c988db8]
- @assistant-ui/core@0.1.14
- assistant-stream@0.3.11
- assistant-cloud@0.1.26
- @assistant-ui/store@0.2.7
- @assistant-ui/tap@0.5.8
0.12.24#
Patch Changes#
-
42bc640: feat: support edit lineage and startRun in EditComposer send flow
- Add
SendOptionswithstartRunflag tocomposer.send() - Expose
parentIdandsourceIdonEditComposerState - Add
EditComposerRuntimeCoreinterface extendingComposerRuntimeCore - Bypass text-unchanged guard when
startRunis explicitly set ComposerSendOptionsextendsSendOptionsfor consistent layering
- Add
-
e82726c: fix(react): forward viewport slack props from MessagePrimitive.Root
-
376bb00: chore: update dependencies
-
87e7761: feat: generalize mention system into trigger popover architecture with slash command support
- Introduce
ComposerInputPluginprotocol to decouple ComposerInput from mention-specific code - Extract generic
TriggerPopoverResourcefromMentionResourcesupporting multiple trigger characters - Add
Unstable_TriggerItem,Unstable_TriggerCategory,Unstable_TriggerAdaptergeneric types - Add
Unstable_SlashCommandAdapter,Unstable_SlashCommandItemtypes - Add
ComposerPrimitive.Unstable_TriggerPopoverRootand related primitives - Add
ComposerPrimitive.Unstable_SlashCommandRootand related primitives - Add
unstable_useSlashCommandAdapterhook for building slash command adapters - Refactor
MentionResourceas thin wrapper aroundTriggerPopoverResource - Alias
Unstable_MentionItem/Unstable_MentionAdapterto generic trigger types - Update
react-lexicalKeyboardPluginto use plugin protocol - All existing
Unstable_Mention*APIs remain unchanged
- Introduce
-
Updated dependencies [42bc640]
-
Updated dependencies [376bb00]
-
Updated dependencies [87e7761]
- @assistant-ui/core@0.1.13
- assistant-cloud@0.1.25
- @assistant-ui/tap@0.5.7
0.12.23#
Patch Changes#
- a8bf84b: feat(core): expose
getLoadThreadsPromise()onThreadListRuntimepublic API - bdbd024: fix(core): set EMPTY_THREAD_CORE.isLoading to true to prevent Welcome page flash during thread switch
- 0958070: feat(core): add
initialThreadIdoption touseRemoteThreadListRuntime - Updated dependencies [de29641]
- Updated dependencies [a8bf84b]
- Updated dependencies [5fd5c3d]
- Updated dependencies [2c5cd97]
- Updated dependencies [ec50e8a]
- @assistant-ui/core@0.1.11
- assistant-stream@0.3.10
0.12.22#
Patch Changes#
-
6554892: feat: add useAssistantContext for dynamic context injection
Register a callback-based context provider that injects computed text into the system prompt at evaluation time, ensuring the prompt always reflects current application state.
-
d726499: fix: unify assistant-transport request body format with AssistantChatTransport
callSettingsandconfigare now sent as nested objects in the request body,
aligned with the AI SDK transport. The old top-level spread is preserved for
backward compatibility but deprecated and will be removed in a future version. -
876f75d: feat: add interactable state persistence
Add persistence API to interactables with exportState/importState, debounced setPersistenceAdapter, per-id isPending/error tracking, flush() for immediate sync, and auto-flush on component unregister.
-
bdce66f: chore: update dependencies
-
c362685: feat: add RealtimeVoiceAdapter with VoiceOrb UI, mode/volume support, and ElevenLabs/LiveKit examples
-
4abb898: refactor: align interactables with codebase conventions
- Rename
useInteractabletouseAssistantInteractable(registration only, returns id) - Add
useInteractableStatehook for reading/writing interactable state - Remove
makeInteractableand related types - Rename
UseInteractableConfigtoAssistantInteractableProps - Extract
buildInteractableModelContextfromInteractablesresource - Add
with-interactablesexample to CLI
- Rename
-
209ae81: chore: remove aui-source export condition from package.json exports
-
50b3100: feat: add render prop support to all primitives for shadcn "Base" component library compatibility
-
af70d7f: feat: add useToolArgsStatus hook for per-prop streaming status
Add a convenience hook that derives per-property streaming completion status from tool call args using structural partial JSON analysis.
-
Updated dependencies [dffb6b4]
-
Updated dependencies [6554892]
-
Updated dependencies [9103282]
-
Updated dependencies [876f75d]
-
Updated dependencies [bdce66f]
-
Updated dependencies [4abb898]
-
Updated dependencies [209ae81]
-
Updated dependencies [2dd0c9f]
-
Updated dependencies [af70d7f]
- assistant-stream@0.3.9
- @assistant-ui/core@0.1.10
- assistant-cloud@0.1.24
- @assistant-ui/store@0.2.6
- @assistant-ui/tap@0.5.6
0.12.21#
Patch Changes#
-
3227e71: feat: add interactables with partial updates, multi-instance, and selection
useInteractable(name, config)hook andmakeInteractablefactory for registering AI-controllable UIInteractables()scope resource with auto-generated update tools and system prompt injection- Partial updates — auto-generated tools use partial schemas so AI only sends changed fields
- Multi-instance support — same name with different IDs get separate
update_{name}_{id}tools - Selection —
setSelected(true)marks an interactable as focused, surfaced as(SELECTED)in system prompt
-
52403c3: chore: update dependencies
-
Updated dependencies [781f28d]
-
Updated dependencies [3227e71]
-
Updated dependencies [3227e71]
-
Updated dependencies [0f55ce8]
-
Updated dependencies [83a15f7]
-
Updated dependencies [52403c3]
-
Updated dependencies [ffa3a0f]
- @assistant-ui/core@0.1.9
- assistant-stream@0.3.8
- assistant-cloud@0.1.23
- @assistant-ui/store@0.2.5
- @assistant-ui/tap@0.5.5
0.12.20#
Patch Changes#
-
28a987a: feat: SingleThreadList resource
refactor: attachTransformScopes should mutate the scopes instead of cloning it -
736344c: chore: update dependencies
-
ff3be2a: Add @-mention system with cursor-aware trigger detection, keyboard navigation, search, and Lexical rich editor support
-
70b19f3: feat: add queue.clear callback, route thread.append through queue
- Add
clear(reason: "edit" | "reload" | "cancel-run")toExternalThreadQueueAdapter thread.append()now routes throughqueue.enqueuewhen a queue adapter is present- Cancel, edit, and reload operations call
queue.clearwith the appropriate reason
- Add
-
70b19f3: feat: add native queue and steer support
- Add
queueadapter toExternalThreadPropsfor runtimes that support message queuing - Add
QueueItemPrimitive.Text,.Steer,.Removeprimitives for rendering queue items - Add
ComposerPrimitive.Queuefor rendering the queue list within the composer - Add
ComposerSendOptionswithsteerflag tocomposer.send() - Add
capabilities.queuetoRuntimeCapabilities ComposerPrimitive.Sendstays enabled during runs when queue is supported- Cmd/Ctrl+Shift+Enter hotkey sends with
steer: true(interrupt current run) - Add
queueItemscope toScopeRegistry - Add
queuefield toComposerStateandqueueItem()method toComposerMethods
- Add
-
c71cb58: chore: update dependencies
-
Updated dependencies [1406aed]
-
Updated dependencies [9480f30]
-
Updated dependencies [28a987a]
-
Updated dependencies [736344c]
-
Updated dependencies [ff3be2a]
-
Updated dependencies [70b19f3]
-
Updated dependencies [c71cb58]
- @assistant-ui/core@0.1.8
- @assistant-ui/store@0.2.4
- assistant-stream@0.3.7
- @assistant-ui/tap@0.5.4
0.12.19#
Patch Changes#
- 7ecc497: feat: children API for primitives with part.toolUI, part.dataRendererUI, and MessagePrimitive.Quote
- Updated dependencies [7ecc497]
- @assistant-ui/core@0.1.7
0.12.18#
Patch Changes#
-
1ed9867: feat: move resumeRun to stable
-
427ffaa: refactor: useRemoteThreadListRuntime no longer marked unstable
-
349f3c7: chore: update deps
-
02614aa: feat: add multi-agent support
ReadonlyThreadProviderandMessagePartPrimitive.Messagesfor rendering sub-agent messagesassistant-stream: addmessagesfield totool-resultchunks,ToolResponseLike, andToolCallParttypes, enabling sub-agent messages to flow through the streaming protocol
-
642bcda: Add
quote.tsxregistry components andinjectQuoteContexthelper -
Updated dependencies [1ed9867]
-
Updated dependencies [427ffaa]
-
Updated dependencies [349f3c7]
-
Updated dependencies [02614aa]
-
Updated dependencies [6cc4122]
-
Updated dependencies [642bcda]
- @assistant-ui/core@0.1.6
- assistant-stream@0.3.6
- assistant-cloud@0.1.22
- @assistant-ui/store@0.2.3
- @assistant-ui/tap@0.5.3
0.12.17#
Patch Changes#
- 990e41d: refactor: code sharing between the multiple platforms
- Updated dependencies [990e41d]
- @assistant-ui/core@0.1.5
0.12.16#
Patch Changes#
- 5ae74fe: fix: prevent double-submit when ComposerPrimitive.Send child has type="submit"
- 8ed9d6f: Refactor React Native component API: move shared runtime logic (remote thread list, external store, cloud adapters, message converter, tool invocations) into @assistant-ui/core for reuse across React and React Native
- Updated dependencies [5ae74fe]
- Updated dependencies [8ed9d6f]
- Updated dependencies [01bee2b]
- @assistant-ui/core@0.1.3
0.12.15#
Patch Changes#
- 07dcce0: fix(react): duplicate
toolCallIdparts when joining consecutive assistant snapshots in the external message converter. - a845911: chore: update dependencies
- bc40eaf: fix(react):
ActionBarMorePrimitivedisappearing whenActionBarPrimitive.Rootusesautohide="not-last"on non-last messages. - be23d74: fix(react): make
useToolInvocationsargs stream rewrites recover safely and avoid premature closure for non-executable client tools. - 1eb059c: fix(react): avoid crashing when external message conversion receives orphaned tool results without a matching tool call.
- Updated dependencies [a845911]
- assistant-cloud@0.1.21
- @assistant-ui/store@0.2.2
- @assistant-ui/tap@0.5.2
0.12.14#
Patch Changes#
- 03714af: fix: DataRenderers not in scope
- Updated dependencies [03714af]
- @assistant-ui/core@0.1.2
0.12.13#
Patch Changes#
- 17cf9a8: feat(telemetry): add reasoning/cached token usage across cloud reporting paths
- Updated dependencies [17cf9a8]
- assistant-cloud@0.1.20
0.12.12#
Patch Changes#
-
36ef3a2: chore: update dependencies
-
6692226: feat: support external source attachments in composer
addAttachment()now accepts either aFileor aCreateAttachmentdescriptor, allowing users to add attachments from external sources (URLs, API data, CMS references) without creating dummyFileobjects or requiring anAttachmentAdapter. -
c31c0fa: Extract shared React code (model-context, client, types, providers, RuntimeAdapter) into
@assistant-ui/core/reactsub-path so both@assistant-ui/reactand@assistant-ui/react-nativere-export from one source. -
1672be8: feat: bindExternalStoreMessage
-
28f39fe: Handle unknown attachment types with fallback component and unknown message part types with
console.warninstead of throwing -
3a1cb66: feat: assistant transport prepareRequestBody support
-
14769af: refactor: move RuntimeAdapter base logic to @assistant-ui/core; re-export missing core APIs from distribution packages
-
7c360ce: Update npm README
-
a638f05: refactor(react): target @assistant-ui/store for ScopeRegistry module augmentation
-
8a78cd2: fix: stabilize runtimeHook identity in useRemoteThreadListRuntime to avoid unnecessary option updates and thread state churn
-
Updated dependencies [a638f05]
-
Updated dependencies [28f39fe]
-
Updated dependencies [36ef3a2]
-
Updated dependencies [6692226]
-
Updated dependencies [c31c0fa]
-
Updated dependencies [fc98475]
-
Updated dependencies [374f83a]
-
Updated dependencies [fc98475]
-
Updated dependencies [1672be8]
-
Updated dependencies [14769af]
-
Updated dependencies [a638f05]
- @assistant-ui/core@0.1.1
- assistant-stream@0.3.4
- assistant-cloud@0.1.19
- @assistant-ui/store@0.2.1
- @assistant-ui/tap@0.5.1
0.12.11#
Patch Changes#
-
5bbe8a9: Fix rewritten streaming tool arguments in assistant transport by safely restarting tool-call arg streams without crashing, preserving logical tool call IDs, and preventing stale status cleanup after reset.
-
5e304ea: feat: client-side run telemetry reporting with
beforeReporthook -
546c053: feat(core): extract subscribable, utils, and model-context; add public/internal API split
-
a7039e3: feat(core): extract remote-thread-list and assistant-transport utilities to @assistant-ui/core
-
16c10fd: feat(core): extract runtime and adapters to @assistant-ui/core
-
98c3d54: feat(react): support custom components for "data" message parts
-
b181803: feat(core): introduce @assistant-ui/core package
Extract framework-agnostic core from @assistant-ui/react. Replace React ComponentType references with framework-agnostic types and decouple AssistantToolProps/AssistantInstructionsConfig from React hook files.
-
7836760: fix(assistant-cloud): expand joined messages for AI SDK v6 history export and telemetry reporting
-
9276547: fix: thread deletion crash "Entry not available in the store"
-
b65428e: refactor: thread().composer() now needs to be invoked
-
af5b085: feat(assistant-cloud): support MCP tool observability
-
61b54e9: Add message timing metadata:
AssistantMessageTimingtype, automatic timing tracking inAssistantMessageAccumulator,MessageTimingtype,useMessageTiming()hook, and client-side streaming timing for AI SDK runtime. -
a094c45: fix: add DataMessagePart to ThreadUserMessagePart for parity with ThreadAssistantMessagePart
-
4d7f712: feat(core): move runtime-to-client bridge to core/store for framework reuse
-
ecc29ec: feat(core): move scope types and client implementations to @assistant-ui/core/store
-
6e97999: feat(core): move store tap infrastructure to @assistant-ui/core/store
-
a247fc9: feat(assistant-cloud): allow save complete multi-step message
-
f414af9: fix: avoid stale thread metadata overwrite while streaming generated titles
-
b48912c: fix(react): smooth streaming behaviour to include first chunk
-
93910bd: Rename .tsx files to .ts where no JSX syntax is used
-
58a8472: feat: Add standalone AI SDK hooks for cloud persistence without assistant-ui
New
@assistant-ui/cloud-ai-sdkpackage withuseCloudChatanduseThreadshooks. Wraps AI SDK'suseChatwith automatic message persistence, thread management, and auto-title generation. -
Updated dependencies [b65428e]
-
Updated dependencies [d08a488]
-
Updated dependencies [b65428e]
-
Updated dependencies [5e304ea]
-
Updated dependencies [546c053]
-
Updated dependencies [a7039e3]
-
Updated dependencies [16c10fd]
-
Updated dependencies [40a67b6]
-
Updated dependencies [b65428e]
-
Updated dependencies [b181803]
-
Updated dependencies [b65428e]
-
Updated dependencies [6bd6419]
-
Updated dependencies [b65428e]
-
Updated dependencies [b65428e]
-
Updated dependencies [af5b085]
-
Updated dependencies [61b54e9]
-
Updated dependencies [4d7f712]
-
Updated dependencies [ecc29ec]
-
Updated dependencies [6e97999]
-
Updated dependencies [a247fc9]
-
Updated dependencies [b65428e]
-
Updated dependencies [93910bd]
-
Updated dependencies [60bbe53]
-
Updated dependencies [58a8472]
-
Updated dependencies [b65428e]
-
Updated dependencies [b65428e]
- @assistant-ui/tap@0.5.0
- assistant-cloud@0.1.18
- @assistant-ui/store@0.2.0
- @assistant-ui/core@0.1.0
- assistant-stream@0.3.3
0.12.10#
Patch Changes#
-
afaaf3b: fix: use bracket notation for process.env
-
afaaf3b: fix: duplicate key toolCallId error in HITL tools (#3197)
-
afaaf3b: fix(react): runConfig not applied when clicking Suggestion with send=true
-
afaaf3b: feat(react): Quote Selected Text primitives
Added new primitives and hooks for quoting selected text from messages:
SelectionToolbarPrimitive.Root- Floating toolbar that appears on text selection within a messageSelectionToolbarPrimitive.Quote- Button inside the floating toolbar to capture the selection as a quoteComposerPrimitive.Quote- Container for quote preview (renders only when quote is set)ComposerPrimitive.QuoteText- Displays the quoted textComposerPrimitive.QuoteDismiss- Button to clear the quoteuseMessageQuote()- Hook to read quote info from message metadataQuoteInfotype -{ text: string; messageId: string }ComposerRuntime.setQuote()- Programmatic API to set/clear quotesMessagePrimitive.Rootnow rendersdata-message-idattribute
-
51d24be: feat(react): add submitMode prop
Add submitMode prop to ComposerInput with three options: "enter" (default), "ctrlEnter", and "none". This controls keyboard submission behavior - "ctrlEnter" mode allows plain Enter to insert newlines for easier multi-line message composition, "none" disables keyboard submission entirely.
The existing submitOnEnter prop is now deprecated but still supported for backward compatibility.
-
afaaf3b: feat(assistant-transport): support editing messages
-
Updated dependencies [afaaf3b]
- @assistant-ui/tap@0.4.6
0.12.9#
Patch Changes#
- a088518: chore: update dependencies
- d8122cc: feat: ChainOfThought Layout API
- Updated dependencies [a088518]
- assistant-stream@0.3.2
- assistant-cloud@0.1.17
- @assistant-ui/store@0.1.6
- @assistant-ui/tap@0.4.5
0.12.8#
Patch Changes#
- 38f4a32: feat: ChainOfThoughtPrimitive
0.12.7#
Patch Changes#
- 77af8c3: fix: runtime not responsive if loaded under React StrictMode (critial bug)
- 9ef966a: fix(store): memoize the aui client instance
- Updated dependencies [77af8c3]
- Updated dependencies [9ef966a]
- @assistant-ui/tap@0.4.4
- @assistant-ui/store@0.1.5
0.12.6#
Patch Changes#
- 39fefec: feat: importExternalState API
0.12.5#
Patch Changes#
- d45b893: chore: update dependencies
- fe71bfc: feat: use enhanced tapSubscribableResource hook
- Updated dependencies [d45b893]
- Updated dependencies [fe71bfc]
- Updated dependencies [fe71bfc]
- assistant-stream@0.3.1
- assistant-cloud@0.1.16
- @assistant-ui/store@0.1.4
- @assistant-ui/tap@0.4.3
0.12.4#
Patch Changes#
- 86baaee: fix(react): devtools not register
- 3bbe318: fix: allow destructuring proxy methods (e.g.
addToolResult,resumeToolCall) - Updated dependencies [3bbe318]
- @assistant-ui/store@0.1.3
0.12.3#
Patch Changes#
- 07d1c65: fix: nesting assistant providers
- b591d72: feat: new tools API
- 59a338a: feat: åshowEmptyOnNonTextEnd
- acbaf07: feat: add framework-agnostic
toToolsJSONSchemaandtoGenericMessagesutilities toassistant-stream - c665612: fix: do not capture handleSendMessage errors
- 0371d72: feat: AssistantRuntimeProvider aui prop
- e8b3f34: feat: Suggestions API and Primitives
- Updated dependencies [07d1c65]
- Updated dependencies [acbaf07]
- Updated dependencies [5ab3690]
- Updated dependencies [0371d72]
- @assistant-ui/store@0.1.2
- assistant-stream@0.3.0
- @assistant-ui/tap@0.4.2
- assistant-cloud@0.1.15
0.12.2#
Patch Changes#
- 1ea3e28: feat(react): better error handling
- 8cbf686: fix: tap should run effects after remount
- a8be364: feat: log individual errors when throwing AggregateError
- 605d825: chore: update dependencies
- Updated dependencies [8cbf686]
- Updated dependencies [2e088eb]
- Updated dependencies [a8be364]
- Updated dependencies [605d825]
- Updated dependencies [fe15232]
- @assistant-ui/tap@0.4.1
- @assistant-ui/store@0.1.1
- assistant-stream@0.2.48
- assistant-cloud@0.1.14
0.12.1#
Patch Changes#
- 8672695: fix: race condition in RemoteThreadListRuntime causing app crash on thread deletion
0.12.0#
Minor Changes#
- 9314b36: feat: use @assistant-ui/store to power state management
Patch Changes#
- 6eab31e: fix(react): handle tool argsText key reordering during streaming
- 083ed83: fix(cloud): serialize image and file parts across all formats
- 6511990: fix(react): bind
thiscontext when calling__internal_setGetInitializePromise - a526e63: fix uncaught AbortError when cancelling streams
- Updated dependencies [11625b5]
- @assistant-ui/store@0.0.7
0.11.59#
Patch Changes#
- fe06c7c: Revert "fix(react): accept URL-based images in sanitizeImageContent (#3069)"
- Updated dependencies
- @assistant-ui/tap@0.4.0
0.11.58#
Patch Changes#
- 3719567: chore: update deps
- Updated dependencies [3719567]
- assistant-stream@0.2.47
- assistant-cloud@0.1.13
- @assistant-ui/tap@0.3.6
0.11.57#
Patch Changes#
- 9a110ea: fix(react): prevent viewport slack feedback loop
- caee095: feat(react): allow passing threadId to backend
- 9883125: fix(react): merge reasoning parts with same parentId in ExternalStoreRuntime
0.11.56#
Patch Changes#
- 3a0b9c8: fix(react): scroll to bottom on initial history load
- b8f62e1: fix: add missing type export for
ExportedMessageRespositoryItem - 8d5c20c: fix: restore
useLocalThreadRuntimeexport as deprecated alias touseLocalRuntime
0.11.55#
Patch Changes#
- 5ca09bc: fix(cloud): filter unsupported messages parts passed to
generateTitle
0.11.54#
Patch Changes#
-
ab2259d: feat(react): thread list item more primitive
-
699e585: feat(react): action bar more primitive
-
4b63488: Allow async function for
bodyin runtime options -
aee8561: feat(react): add dictation (speech-to-text) support
Adds dictation (speech-to-text) support via a new
DictationAdapterinterface. Users can now convert voice input to text in the composer using the browser's Web Speech API or custom adapters.- New adapter:
WebSpeechDictationAdapter- uses browser's Web Speech API - New components:
ComposerPrimitive.Dictate,ComposerPrimitive.StopDictation,ComposerPrimitive.DictationTranscript - New state:
composer.dictationfor dictation status and transcript - New methods:
composer.startDictation(),composer.stopDictation() - Configuration via
adapters.dictationin runtime options
- New adapter:
-
dbfdb11: fix(docs): fix broken migration links
0.11.53#
Patch Changes#
- 57bd207: chore: update dependencies
- cce009d: chore: use tsc for building packages
- Updated dependencies [57bd207]
- Updated dependencies [cce009d]
- assistant-stream@0.2.46
- assistant-cloud@0.1.12
- @assistant-ui/tap@0.3.5
0.11.52#
Patch Changes#
- 4db92c9: fix(react): useIsHoveringRef on SSR issue
0.11.51#
Patch Changes#
- fix: update tap package
0.11.50#
Patch Changes#
- bae3aa2: feat: use new tap global flushSync method
- e8ea57b: chore: update deps
- Updated dependencies [bae3aa2]
- Updated dependencies [bae3aa2]
- Updated dependencies [bae3aa2]
- Updated dependencies [bae3aa2]
- Updated dependencies [bae3aa2]
- Updated dependencies [bae3aa2]
- Updated dependencies [e8ea57b]
- Updated dependencies [bae3aa2]
- @assistant-ui/tap@0.3.3
- assistant-stream@0.2.45
- assistant-cloud@0.1.11
0.11.49#
Patch Changes#
- 89aec17: feat: AI SDK frontend tool execution cancellation support
fix: AI SDK isRunning status when running frontend tools - ee7040f: fix: always scroll to bottom when switching to a thread
- bd27465: feat: ability to disable auto scrollToBottom on message send / thread switch
- a3e9549: feat: only add turn anchor slack after the first turn
- 206616b: fix: scroll to bottom button flickers on send message
- 7aa77b5: feat: do not take viewport padding into account when calculating the slack inset
- Updated dependencies [89aec17]
- assistant-stream@0.2.44
0.11.48#
Patch Changes#
-
ba26b22: feat(react): export as anything
-
d169e4f: feat: add AssistantIf
-
da9f8a6: Fix ESC keydown handler to only trigger when event originates from the composer input
The
useEscapeKeydownhook was intercepting ESC key events globally, preventing other UI elements (like Radix dialogs) from responding to ESC. The handler now checks if the event target is within the composer input before callingpreventDefault(). -
01c31fe: chore: update dependencies
-
Updated dependencies [01c31fe]
- assistant-stream@0.2.43
- assistant-cloud@0.1.10
- @assistant-ui/tap@0.3.2
0.11.47#
Patch Changes#
- 45d771f: fix(react): data-status stuck on running when smooth streaming disabled
0.11.46#
Patch Changes#
- ab8953b: feat(react): add
allowNestingoption to allow wrapping runtimes with custom thread list adapters
0.11.45#
Patch Changes#
- ec662cd: chore: update dependencies
- Updated dependencies [ec662cd]
- assistant-stream@0.2.42
- assistant-cloud@0.1.9
- @assistant-ui/tap@0.3.1
0.11.44#
Patch Changes#
- 4f6afef: feat: unified json schema
0.11.43#
Patch Changes#
- f54c17b: feat: Viewport turnAnchor="top"
0.11.42#
Patch Changes#
- 354c5c3: feat: MessageState.index
- c3ac004: fix: export
ComposerAttachmentDropzoneasComposerPrimitive.AttachmentDropzone
fix: prevent drag state flicker inComposerAttachmentDropzone - 282a596: feat: ThreadPrimitive.ScrollToBottom behavior prop
0.11.41#
Patch Changes#
- 08430e8: feat(assistant-transport): support command enqueue inside onError/onCancel
feat(assistant-transport): cancel queued commands on error
0.11.40#
Patch Changes#
- 2c33091: chore: update deps
- Updated dependencies [2c33091]
- assistant-stream@0.2.41
- assistant-cloud@0.1.8
- @assistant-ui/tap@0.2.2
0.11.39#
Patch Changes#
- b408005: feat(react-ai-sdk): Integrate AI SDK v5 data parts in message content
- 7a6d9ca: fix: LocalThreadRuntime deleting branches during message reloads
- 70d5966: feat: allow storing runConfig with ThreadHistoryAdapter
- 3754bdd: refactor: rename toolUIs to tools and remove ToolUI API
- 0a4bdc1: feat: renamed
ResourceElementConstructortoResource, changedResourceElement.typeto beResourceinstead ofResourceFn - Updated dependencies [0a4bdc1]
- @assistant-ui/tap@0.2.1
0.11.38#
Patch Changes#
-
66a13a0: fix: separate scroll-to-bottom button from autoScroll behavior (#1916)
-
4e3877e: feat: Add thread fetching capability to remote thread list adapter
- Add
fetchmethod toRemoteThreadListAdapterinterface - Implement
fetchin cloud adapter to retrieve individual threads - Enhance
switchToThreadto automatically fetch and load threads not present in the current list - Add
getmethod toAssistantCloudThreadsfor individual thread retrieval
- Add
-
eef682b: fix(react): update check for scroll position in autoscroll
-
Updated dependencies [4e3877e]
- assistant-cloud@0.1.7
0.11.37#
Patch Changes#
- 0ce129b: add scroll lock hook for reasoning component
0.11.36#
Patch Changes#
- 3ab9484: feat: Toolkit API
- 7a88ead: chore: mark all old context API hooks as deprecated
- 81b581f: feat: display AI SDK errors
- 2fc7e99: chore: update deps
- Updated dependencies [dbc4ec7]
- Updated dependencies [2fc7e99]
- @assistant-ui/tap@0.1.5
- assistant-stream@0.2.39
- assistant-cloud@0.1.6
0.11.35#
Patch Changes#
- 2fc5c3d: feat: AssistantTransport wire format
- 04144dd: feat: useAssistantTransportState
- Updated dependencies [2fc5c3d]
- assistant-stream@0.2.38
0.11.34#
Patch Changes#
- 953db24: chore: update deps
- fix: submittedFeedback external message converter support
- Updated dependencies [953db24]
- assistant-stream@0.2.37
- assistant-cloud@0.1.5
- @assistant-ui/tap@0.1.4
0.11.33#
Patch Changes#
- refactor: move submittedFeedback to metadata, add ThreadMessageLike support
0.11.32#
Patch Changes#
- fix: Cannot enqueue a chunk into a readable stream that is closed or has been requested to be closed
0.11.31#
Patch Changes#
- chore: update deps
- Updated dependencies
- assistant-stream@0.2.36
- assistant-cloud@0.1.4
- @assistant-ui/tap@0.1.3
0.11.30#
Patch Changes#
- feat: add submittedFeedback ThreadAssistantMessage
0.11.29#
Patch Changes#
- 92dfb0f: fix: update and maintain message levels on reparent
0.11.28#
Patch Changes#
- fix: useExternalMessageConverter Tool subagent messages support
0.11.27#
Patch Changes#
- e6a46e4: chore: update deps
- Updated dependencies [e6a46e4]
- assistant-stream@0.2.34
- assistant-cloud@0.1.3
- @assistant-ui/tap@0.1.2
0.11.26#
Patch Changes#
- feat: Add support for nested tool calls in assistant transport. Tool calls can now include a
messagesfield containing nestedThreadMessage[], enabling subagent tool calls to be automatically invoked byuseToolInvocations.
0.11.25#
Patch Changes#
- feat: ToolCallMessagePart.messages for subagent messages
0.11.24#
Patch Changes#
-
4a1e4cf: Deprecate
autoSendandmethodin favor ofsendandclearComposer<ThreadPrimitive.Suggestion prompt="Tell me about React hooks" send // same as autoSend=true clearComposer // same as method="replace", defaults to true />When
sendandclearComposerarefalse, the suggestion is appended to existing user input
0.11.23#
Patch Changes#
- 3caad00: refactor: rename interrupt -> human for tool input handling
- Updated dependencies [3caad00]
- assistant-stream@0.2.33
0.11.22#
Patch Changes#
- e8d6d7b: feat: revamp Assistant augmentation mechanism
- e81784b: feat: Tool Call interrupt() resume() API
- Updated dependencies [e81784b]
- assistant-stream@0.2.32
0.11.21#
Patch Changes#
- 7a020fa: fix: disallow branch switching during runs for most runtimes
- 7a020fa: feat: Add switchBranchDuringRun capability flag to control branch switching while running
- c5188d9: feat: revamp langgraph thread management integration
0.11.20#
Patch Changes#
-
94fcc39: feat: Add custom commands support to useAssistantTransportRuntime
Adds the ability to send custom commands through useAssistantTransportRuntime by:
- Introducing a global augmentation pattern via
Assistant.Commandsinterface - Adding
useAssistantTransportSendCommandhook for sending custom commands - Supporting custom command types in the transport layer
Users can now extend the Assistant interface to define their own command types:
declare global { interface Assistant { Commands: { myCommand: { type: "my-command"; data: string }; }; } } - Introducing a global augmentation pattern via
0.11.19#
Patch Changes#
- 2c6198a: fix: thread empty should return false while thread is loading
fix: devtools hydration warning
0.11.18#
Patch Changes#
- 057cdc7: fix: notify when suggestions change
0.11.17#
Patch Changes#
- 2bbe604: feat: createMssageConverter toThreadMessages isRunning support
0.11.16#
Patch Changes#
- cc9945b: feat: MessageProvider API
0.11.15#
Patch Changes#
- d19ebab: feat(assistant-transport): surface stream errors to caller
- Updated dependencies [d19ebab]
- assistant-stream@0.2.29
0.11.14#
Patch Changes#
- feat: throttle only on stream resume
- Updated dependencies
- assistant-stream@0.2.28
0.11.13#
Patch Changes#
- 3ce485f: feat: add cancel handling and extend message types
0.11.12#
Patch Changes#
- c4830cc: feat: assistant transport allow passing state in converter
0.11.11#
Patch Changes#
- fix: make accumulator throttling smoother
- Updated dependencies
- assistant-stream@0.2.27
0.11.10#
Patch Changes#
- 367996e: fix: subscribe to scope identity changes
0.11.9#
Patch Changes#
- 6c36e21: fix: react 18 compatibility for AssistantProvider API
0.11.8#
Patch Changes#
- 0f21c70: feat: Attachment support for useAssistantTransportRuntime
- Updated dependencies [0f21c70]
- assistant-stream@0.2.26
0.11.7#
Patch Changes#
- 8f6fb59: feat: useAssistantTransportRuntime (experimental)
- d318c83: fix: ThreadMessageLike should prefer argsText if provided over json stringifying args
0.11.6#
Patch Changes#
- 5cdfc9c: fix: TextContentPartProvider not updating when passed text changes
0.11.5#
Patch Changes#
- 161db8b: fix: newThreadId should be null instead of undefined when empty
- 161db8b: fix: composer.add-attachment should only fire once
- 161db8b: feat: add wildcard event support to EventManager
- Added support for wildcard "*" event subscriptions to listen to all events
- Wildcard listeners receive events in format:
{ event: string, payload: any } - Updated type definitions to include "*" as a valid event type
- Modified emit method to trigger both specific and wildcard listeners
0.11.4#
Patch Changes#
- effd817: fix: race condition in remote threadlist runtime
0.11.3#
Patch Changes#
- 2e1815e: feat: select attachment by id
0.11.2#
Patch Changes#
- 2d46069: chore: drop deprecated renamed fields
0.11.1#
Patch Changes#
- 986b1c0: fix: attachments should not cause infinite rerenders
- 0534bc5: refactor: reorganize runtime files to prepare for part 2 of runtime rearchitecture
- Updated dependencies [0534bc5]
- @assistant-ui/tap@0.1.1
0.11.0#
Minor Changes#
- 5437dbe: feat: runtime rearchitecture (unified state API)
Patch Changes#
- 39ac2f3: feat: AI SDK v5 import support
- Updated dependencies [5437dbe]
- @assistant-ui/tap@0.1.0
0.10.50#
Patch Changes#
- 3498c99: feat: assistant cloud attachments support
0.10.49#
Patch Changes#
- af2666a: fix: AssistantCloudThreadHistoryAdapter should be stateless
0.10.48#
Patch Changes#
- ad53f5f: fix: ComposerInput does not auto focus on thread switch when using ExternalStoreRuntime
0.10.47#
Patch Changes#
- 1f2ad24: fix: reset assistantOptimisticId on import
- 1f2ad24: fix: drop resetScheduled mechanism
0.10.46#
Patch Changes#
- 25104d0: feat: MessageRepository should delete dangling messages on resetHead
0.10.45#
Patch Changes#
- e242a06: feat: AssistantFrameHost, AssistantFrameProvider APIs
- e242a06: feat: ModelContextRegistry API
0.10.44#
Patch Changes#
- 13684d5: feat: useExternalStoreRuntime improved reset handling
0.10.43#
Patch Changes#
-
a80dcff: feat: Add *ByIndex primitives for direct indexed access
Added new primitives that allow rendering individual items by index, improving performance and enabling more granular control:
ThreadPrimitive.MessageByIndex- Render a specific message by indexMessagePrimitive.PartByIndex- Render a specific message part by indexMessagePrimitive.AttachmentByIndex- Render a specific message attachment by indexComposerPrimitive.AttachmentByIndex- Render a specific composer attachment by indexThreadListPrimitive.ItemByIndex- Render a specific thread list item by index
These primitives provide direct access to individual items without iterating through entire collections, and are now used internally by their parent components (Messages, Parts, Attachments, Items) for improved efficiency.
0.10.42#
Patch Changes#
- 12e0a77: chore: update deps
- Updated dependencies [12e0a77]
0.10.41#
Patch Changes#
- eda5558: feat: AI SDK custom UIMessage type support
0.10.40#
Patch Changes#
-
179f8b7: Add format parameter support to assistant-cloud client library
- Add optional
formatquery parameter toAssistantCloudThreadMessages.list()method - Update cloud history adapter to pass format parameter when loading messages
- Enables backend-level message format conversion when supported by the cloud backend
- Add optional
-
Updated dependencies [179f8b7]
- assistant-cloud@0.1.0
0.10.39#
Patch Changes#
- a4389da: feat: AI SDK v5 assistant-cloud thread history support
0.10.38#
Patch Changes#
- 979ee67: feat: assistant cloud support for AI SDK v5
0.10.37#
Patch Changes#
- f32b6a4: fix: new thread functionality no longer working with new threadlistruntime
0.10.36#
Patch Changes#
- ed78407: Modified the
detachandcancelRunmethods to create a standardizedErrorobject with a JSON-encoded message and a name of"AbortError", improving consistency in how abort reasons are passed and processed. - 77ce337: Fix polymorphic ref type error in
ComposerInput - f59959e: fix: add image message part support and sanitize function
0.10.35#
Patch Changes#
- fix: threadListItemRuntime Method not implemented
- feat: support zod v4
0.10.34#
Patch Changes#
- 0f063e0: chore: update dependencies
- 5d8b074: feat: MessagePrimitive.PartsGrouedp
- Updated dependencies [0f063e0]
0.10.33#
Patch Changes#
- fix: error on mount of local runtime
0.10.32#
Patch Changes#
- fix: race condition in generateTitle when a newly running thread is detached
0.10.31#
Patch Changes#
- fix: maintain chronological order for parts without parentId in PartsGroupedByParentId
0.10.30#
Patch Changes#
- fix: race condition in RunController when using parentIds
- 3fb37f9: Fix internal dependency cycles
- Updated dependencies
- assistant-stream@0.2.21
0.10.29#
Patch Changes#
- 1f2fb01: fix: message id not found when using messageRepository in external store
0.10.28#
Patch Changes#
- e92f7cc: feat: ExternalStoreAdapter.messageRepository API
- c823efe: feat: add
runtime.thread.reset()method for clearing thread
0.10.27#
Patch Changes#
- f23fdb6: feat: add parent ID grouping for message parts
- Updated dependencies [f23fdb6]
- assistant-stream@0.2.20
0.10.26#
Patch Changes#
- e359ffc: Fix circular dependency in ThreadMessageLike
- 2561cc0: fix: remove double onAddToolResult call in ExternalStoreThreadRuntimeCore
- 9793e64: fix: if tool calls have no argsText, assume empty object instead of crashing
- Updated dependencies [20a4649]
- Updated dependencies [9793e64]
- assistant-stream@0.2.19
0.10.25#
Patch Changes#
- 65b3ff1: chore: update deps
- 2731323: refactor: rename ContentPart to MessagePart
- 308afff: feat(react): add isLoading state to ThreadList and Thread runtimes
- cc9f567: feat: allow forwarding portal props for assistant modal content
- c380f37: feat: MessageContent.ToolGroup
- Updated dependencies [65b3ff1]
0.10.24#
Patch Changes#
- b65e354: docs: add JSDoc comments
- 8eda24b: performance: Memoize Array.from() calls in render methods
- 644abb8: chore: update deps
- Updated dependencies [644abb8]
0.10.23#
Patch Changes#
- 1b77d8a: fix: Add missing
useLocalThreadRuntimeexport
0.10.22#
Patch Changes#
- 5a86bda: feat(runtime): export
useLocalThreadRuntimefor more flexibility and runtime customization - 7a65c80: feat(assistant-cloud): filesToPdf support
- Updated dependencies [51b8493]
- assistant-stream@0.2.15
0.10.21#
Patch Changes#
- 57b5735: fix: logic for ComposerPrimitive.Input disabled prop
0.10.20#
Patch Changes#
- 8aa3020: Fix: Export missing adapter primitives
- f69ca69: fix(react): preserve message metadata in useThreadRuntime().append()
0.10.19#
Patch Changes#
- d0867eb: fix(message): add missing condition in
MessageIf - 52e18bc: feat: addToolResponse ToolResponse support
- 52e18bc: fix: add support for artifact and isError for langgraph tool calls
- Updated dependencies [52e18bc]
- assistant-stream@0.2.14
0.10.18#
Patch Changes#
- 3ed39ef: feat: export MessagePartStatus
0.10.17#
Patch Changes#
- fix: useInlineRender should correctly handle updates
0.10.16#
Patch Changes#
- fix: Last is not a partial call attempt 3
- Updated dependencies
- assistant-stream@0.2.13
0.10.15#
Patch Changes#
- fix: add another workaround for Last is not a partial call
- Updated dependencies
- assistant-stream@0.2.12
0.10.14#
Patch Changes#
- fix: Last is not a partial call error
- Updated dependencies
- assistant-stream@0.2.11
0.10.13#
Patch Changes#
- 971b05c: feat: useCloudRuntime (wip)
0.10.12#
Patch Changes#
- chore: update deps
- Updated dependencies
- assistant-stream@0.2.10
0.10.11#
Patch Changes#
- 6d214b9: add ComposerAttachmentDropzone component to enable file drag and drop
0.10.10#
Patch Changes#
-
9811ff8: Introduced a new
ErrorPrimitivecomponent for displaying error messages in the UI, includingErrorPrimitive.RootandErrorPrimitive.Message.Added
MessagePrimitive.Errorfor rendering error states in messages. -
1a4927a: feat: ThreadListItem.detach()
0.10.9#
Patch Changes#
- fix: correctly forward state updates from ChatModelAdapter
0.10.8#
Patch Changes#
- 5cb9598: feat(assistant-stream): ObjectStream
- Updated dependencies [5cb9598]
- assistant-stream@0.2.7
0.10.7#
Patch Changes#
- 621f35a: fix: patch Safari/iOS attachment issue by adding/removing input element to DOM
- Updated dependencies [0809c9f]
- assistant-stream@0.2.6
0.10.6#
Patch Changes#
- e63d574: feat: MessagePrimitive.If last
0.10.5#
Patch Changes#
- e9f8e7e: feat: tighten tool args type to be object
- c4c60cf: fix: server-side tool results should be forwarded to StreamCallController
- 73a6ff1: feat: Tool.type
- Updated dependencies [c4c60cf]
- Updated dependencies [73a6ff1]
- assistant-stream@0.2.5
0.10.4#
Patch Changes#
- 98a680e: fix: allow import from route handlers
- 98a680e: chore: update deps
- Updated dependencies [98a680e]
- assistant-stream@0.2.4
0.10.3#
Patch Changes#
- 30ae924: fix: disabled tools should still execute if invoked
0.10.2#
Patch Changes#
- fix: ESM without bundler compat
0.10.1#
Patch Changes#
- fix: correctly include Typescript declarations
0.10.0#
Patch Changes#
- 557c3f7: build: drop CJS builds
0.9.6#
Patch Changes#
- chore: update deps
0.9.5#
Patch Changes#
- chore: bump assistant-stream dependency
- 1ad0696: feat: assistant-ui update CLI command
0.9.4#
Patch Changes#
- c77ef43: feat: assistant-ui update CLI command
0.9.3#
Patch Changes#
- 62c2af7: feat: tool.streamCall API
- b9c731a: chore: update dependencies
0.9.2#
Patch Changes#
- 553bdff: feat: early return ChatModelAdapter.run on cancellation
- c0c9422: feat: useToolArgsFieldStatus
- 675fb20: feat: export types from
external-store - 4e86ab4: fix: should allow sending assistant messages from the composer
- e893985: fix: allow useMessagePartText on reasoning parts
- 0500584: fix: make addResult typesafe
0.9.1#
Patch Changes#
- chore: update deps
0.9.0#
Patch Changes#
- afae5c9: refactor!: edge package split
- Updated dependencies [1f65c94]
- Updated dependencies [8df35f6]
- Updated dependencies [476cbfb]
- assistant-stream@0.0.33
0.8.20#
Patch Changes#
- Updated dependencies [545a17c]
- assistant-stream@0.0.32
0.8.19#
Patch Changes#
- 93c3eb4: fix: drop ToolResponseBrand
- Updated dependencies [93c3eb4]
- assistant-stream@0.0.31
0.8.18#
Patch Changes#
- a22bc7a: refactor: merge setResult and setArtifact to setResponse
- 39aecd7: chore: update dependencies
- Updated dependencies [a22bc7a]
- Updated dependencies [39aecd7]
- assistant-stream@0.0.30
0.8.17#
Patch Changes#
- feat: expose assitant-stream ToolResponse API
- Updated dependencies
- assistant-stream@0.0.29
0.8.16#
Patch Changes#
- 40579cd: feat: ToolResponse support
- Updated dependencies [40579cd]
- assistant-stream@0.0.28
0.8.15#
Patch Changes#
- fix: assistant-stream appendText must only append to the very last part
- Updated dependencies
- assistant-stream@0.0.27
0.8.14#
Patch Changes#
- feat: update resumeRun signature
0.8.12#
Patch Changes#
- c4d7b29: feat: tool call artifacts
- 0962274: feat: ThreadRuntime.unstable_resumeRun
- Updated dependencies [c4d7b29]
- assistant-stream@0.0.26
0.8.11#
Patch Changes#
- Updated dependencies
- assistant-stream@0.0.25
0.8.10#
Patch Changes#
- Updated dependencies
- assistant-stream@0.0.24
0.8.9#
Patch Changes#
- fix: adjust message status even if no message-finish event is emitted
0.8.8#
Patch Changes#
- 439ae67: fix: properly emit tool-call args-text finish
- Updated dependencies [439ae67]
- assistant-stream@0.0.23
0.8.7#
Patch Changes#
- ecc6afd: feat: ThreadHistoryAdapter.resume
- b07603d: feat: assistant-stream rewrite
- b07603d: feat: use assistant-stream
- Updated dependencies [b07603d]
- assistant-stream@0.0.22
0.8.6#
Patch Changes#
- f8a157a: Add support for dynamic headers in EdgeChatAdapter
- 2497388: fix: useAssistantInstructions should correctly update on disabled change
0.8.5#
Patch Changes#
- chore: update deps
0.8.4#
Patch Changes#
- 4f22af9: fix: infinite rerender bug with useThread
0.8.3#
Patch Changes#
- 2e299b6: chore: update typescript
0.8.2#
Patch Changes#
- feat: source message parts
0.8.1#
Patch Changes#
- ba4a282: fix: cloud env variable loading
0.8.0#
Breaking changes#
- pre-styled UI components have moved to
@assistant-ui/react-ui - run
npx assistant-ui upgradeto update your codebase - manual upgrade: change styled component imports from
@assistant-ui/reactto@assistant-ui/react-ui(and same with markdown)
- manual upgrade: change styled component imports from
@assistant-ui/reactto@assistant-ui/react-ui(and same with Markdown)
0.7.91#
Patch Changes#
- feat: dispatch events for edit action; allow text area
0.7.90#
Patch Changes#
- feat: makeAssistantVisible editable
0.7.89#
Patch Changes#
- 5540aae: feat: local runtime SuggestionAdapter
0.7.88#
Patch Changes#
- a36fd9e: fix: bind reset method
0.7.87#
Patch Changes#
- e01b6cd: fix: remove reset() method on local-runtime
- 2dd5abc: feat: makeAssistantReadable
- 4531190: feat: ExportdMessageRepository.fromArray
- 400ff97: feat.import() should reset the MessageRepository
0.7.86#
Patch Changes#
- 4685652: feat: useToolArgsFieldStatus
0.7.85#
Patch Changes#
- 3454871: fix: Vite bundler compat
0.7.84#
Patch Changes#
- fix: pin nanoid version for CJS compat
- Updated dependencies
- assistant-stream@0.0.21
0.7.83#
Patch Changes#
- 54b631c: chore: update README
0.7.82#
Patch Changes#
- 934ee4b: feat: anonymous login and auto-config for cloud
0.7.81#
Patch Changes#
- 7f7ab5e: refactor: assitant-stream API
- Updated dependencies [7f7ab5e]
- assistant-stream@0.0.20
0.7.80#
Patch Changes#
- fix: relax ReadonlyJSONObject requirement on tool/toolUI
0.7.79#
Patch Changes#
- fix: argsText parsing
0.7.78#
Patch Changes#
- fix: result sometimes set to undefined
0.7.77#
Patch Changes#
- f2a1e86: feat: unstable_humanToolNames
0.7.76#
Patch Changes#
- fix: README
0.7.75#
Patch Changes#
- 87fa024: fix: remove tailwind from peerdeps
0.7.74#
Patch Changes#
- 61f278b: fix: drop tailwind peer dependency
0.7.73#
Patch Changes#
- fix: return from createMessageConverter
- 86ba433: fix: ToolMessagePart.args should never be null
0.7.72#
Patch Changes#
- 797ce9c: fix: ToolMessagePart.args should never be null
0.7.71#
Patch Changes#
- 72e66db: chore: update dependencies
- Updated dependencies [72e66db]
- assistant-stream@0.0.19
0.7.70#
Patch Changes#
- 55a9cb2: fix: runConfig for reload / edits
- 2bc6781: feat: send toolCallId to the exeucte callback
- 2bc6781: feat: Tool.experimental_onSchemaValidationError
- 9fefc9d: feat: ThreadViewportContext & multiple renders of the same thread support
0.7.69#
Patch Changes#
- a7a871e: feat: make ThreadPrimitive.Suggestion method optional
- a7a871e: fix: ThreadPrimitive.Suggestion no longer clears the composer
- a7a871e: feat: expose the useThreadViewportAutoScroll in the API
0.7.68#
Patch Changes#
- eb4e13c: feat: useExternalMessageConverter megeConfig.joinStrategy
0.7.67#
Patch Changes#
- ddf468e: fix: import path
0.7.66#
Patch Changes#
- f4d71da: feat: Edge Runtime onResponse/onError/onfinish, sendExtraMessageFields, unstable_AISDKInterop=v2 support
- 16cd124: feat(local-runtime): native support for AssistantCloud
0.7.65#
Patch Changes#
- a07d8c1: fix: thread auto-scroll reliability
0.7.64#
Patch Changes#
- 6703842: feat: codemod to migrate to @assistant-ui/react-ui
- 79f7120: feat: createMessageConverter API
0.7.63#
Patch Changes#
- 843047d: feat(thread-list): forward model context to thread runtimes
0.7.62#
Patch Changes#
- 7e5f127: fix: useSmooth unnecessary re-renders
0.7.61#
Patch Changes#
- bd78a70: feat: ThreadListPrimitive.Root
- 9ea8100: feat: ThreadMessageLike optional toolCallId + args
0.7.60#
Patch Changes#
- 246ce4e: fix: export getExternalStoreMessages
0.7.59#
Patch Changes#
- 8ec1f07: feat: AssistantCloudThreadHistoryAdapter
- 4f5d77f: feat: ToolCallMessagePart.args should be JSONObject
- 8ec1f07: feat: auto-inject history adapter in local runtime
0.7.58#
Patch Changes#
- 02996f9: fix: support AISDKInterop + sendMessageId for human+system messages
0.7.57#
Patch Changes#
- 103efee: fix: mark ChatAdapter types as readonly
- 60bb6ff: fix: memoize MessageRepository.getMessages()
0.7.56#
Patch Changes#
- dba4dde: feat(ai-sdk): message.metadata.annotations
- efd60fe: fix(ai-sdk): onSwitchToThread
0.7.55#
Patch Changes#
- 0bf5082: fix: tailwindcss plugin crashes without config
0.7.54#
Patch Changes#
- 6cb7d10: refactor: rename ModelConfig to ModelContext
- c302933: feat: convertExternalMessages
0.7.53#
Patch Changes#
- 7618bf3: feat: AI SDK DataStream ReasoningDelta, StartStep support
0.7.52#
Patch Changes#
- fix: excessive number of classes included via tailwindcss plugin
0.7.51#
Patch Changes#
- fix: crash when message part is empty
0.7.50#
Patch Changes#
- fix: properly forward unstable_shouldContinueIgnoreToolNames
0.7.49#
Patch Changes#
- feat(local-runtime): add temporary shouldContinueIgnoreToolNames override
0.7.48#
Patch Changes#
- fix: crash
0.7.47#
Patch Changes#
- a3c6c1a: feat: ensure runtime methods are bound to the object
- a76ea0e: feat: AttachmentAdapter file upload progress update support via generator add callback
- a3c6c1a: feat: useRuntimeState API
0.7.46#
Patch Changes#
- fix: improved interrupt+Command support
- feat: MessagesFooter UI
- 2713487: feat: styled UI assistant message footer
0.7.45#
Patch Changes#
- 9934aef: feat(cloud-threadlist): auto initialize threads
- 3a8b55a: feat: styled UI assistant message footer
0.7.44#
Patch Changes#
- 2f44e9e: refactor: move switchToThread / switchToNewThread to runtime.threads
- 2f44e9e: refactor: rename runtime.threadList to runtime.threads
- 2f44e9e: refactor: drop CloudThreadListItemRuntime
- 2f44e9e: feat: add threads.getById and threads.main
- 2f44e9e: feat: ThreadListItemRuntime.initialize()
0.7.43#
Patch Changes#
- feat: reverse order of threads in useRemoteThreadListRuntime
0.7.42#
Patch Changes#
- 9c3961d: fix: event subscriptions triggering on threadList changes
0.7.41#
Patch Changes#
- 08de9c9: fix: RemoteThreadList should not return an iterator
0.7.40#
Patch Changes#
- feat: export useRemoteThreadListRuntime
0.7.39#
Patch Changes#
- 0979334: feat(local-runtime): New ThreadList items should appear at the top of the list
- 22272e6: chore: update dependencies
- Updated dependencies [b44a7ad]
- Updated dependencies [22272e6]
- assistant-stream@0.0.18
0.7.38#
Patch Changes#
- 5794b1b: feat: CreateStartRunConfig
0.7.37#
Patch Changes#
- 799dc79: feat: AppendMessage.sourceId
- 799dc79: feat: StartRunConfig.sourceId
0.7.36#
Patch Changes#
- 34d2915: feat: widen initialMessages type to ThreadMessageLike
- 4f3834a: refactor: deprecate UIMessagePart
- b8b11d3: feat: FileMessagePart
- 889a55e: fix: attachment filename should never overflow
- a7d9e41: feat: ComposerRuntime.unstable_on("attachment_add", ...)
0.7.35#
Patch Changes#
- 345f3d5: chore: update dependencies
- 345f3d5: fix: import errors in react server environments
- 2846559: feat: allow selecting multiple files as attachments
0.7.34#
Patch Changes#
- 9a3dc93: fix(external-store): metadata & attachments support
- 4c2bf58: chore: update dependencies
0.7.33#
Patch Changes#
- bb47b90: fix: invalid JSON in argsText should be gracefully handled
0.7.32#
Patch Changes#
- feat: MessagePrimitive.tools.Override
0.7.31#
Patch Changes#
- fix: data results should be forwarded via LocalThreadRuntime
0.7.30#
Patch Changes#
- 982a6a2: chore: update dependencies
0.7.29#
Patch Changes#
- 75a274f: feat: AssistantRuntimeCore.RenderComponent
- dcf51cb: fix: do not throw on AI SDK annotation packets
- 9ad9e75: fix: mark arrays in message types as readonly
- 75a274f: refactor: drop AssistantRuntimeCore.Provider due to causing app rerenders on runtime switch
- 65de5d6: feat: message.metadata.unstable_data
0.7.28#
Patch Changes#
- a8ac203: feat: export useThreadListItemRuntime
0.7.27#
Patch Changes#
- 528cfd3: feat: ExternalStoreAdapter.unstable_Provider
- 3c70ea1: feat: allow customizing thread max width
0.7.26#
Patch Changes#
- 6a17ec2: feat: useAssistantInstructions disable support
0.7.25#
Patch Changes#
- 798e9f3: fix: AttachmentRemove should not trigger AttachmentPreviewDialog
- 37e1abc: feat: ComposerRuntime.clearAttachments
- d6b3b79: feat: useRemoteThreadListRuntime
0.7.24#
Patch Changes#
- fix: ComposerRuntime.send() should not reset role or runConfig
0.7.23#
Patch Changes#
- feat(edge-runtime): pass RunConfig to backend
0.7.22#
Patch Changes#
- feat: RunConfig
0.7.21#
Patch Changes#
- feat: Composer.unstable_on("send", callback)
0.7.20#
Patch Changes#
- 2c7dec0: feat: useAssistantTool allow disabling tools
0.7.19#
Patch Changes#
- ec3b8cc: chore: update dependencies
0.7.18#
Patch Changes#
- 1b16dce: fix: thread initialization
- b0f309a: feat: allow specifying Empty component in thread-config
0.7.17#
Patch Changes#
- fix: toLanguageModelMessages should include attachments
0.7.16#
Patch Changes#
- fix: ensure message status is set on runResultStream flush
0.7.15#
Patch Changes#
- fix: toolResultStream should support JSONSchema params
0.7.14#
Patch Changes#
- fix: assistantDecoderStream should end current tool call on flush
0.7.12#
Patch Changes#
- 4c54273: chore: update dependencies
- 4c54273: fix: initialize thread on import
0.7.11#
Patch Changes#
- 0f88efb: fix: external store thread list should not crash
0.7.10#
Patch Changes#
- 1eab7b4: refactor: ThreadList
0.7.9#
Patch Changes#
- 2276e57: fix: cjs builds
- e8752ac: fix: ThreadList a11y improvements
0.7.8#
Patch Changes#
- 589d37b: feat: ThreadList / ThreadListItem UI
- 2112ce8: chore: update dependencies
0.7.7#
Patch Changes#
- 10d70db: fix: remove console.log
- c3027a0: fix: disallow nested ThreadConfigs
0.7.6#
Patch Changes#
- 933b8c0: chore: update deps
- 09a2a38: fix: TextMessagePartProvider should support MessagePartRuntime.getState()
0.7.5#
Patch Changes#
- c59d8b5: chore: update dependencies
0.7.4#
Patch Changes#
- 5462390: fix: Thread.Messages AssistantEditComposer support
- 0fb80c1: feat: ThreadConfig.UserMessage / AssistantMessage / EditComposer
0.7.3#
Patch Changes#
- 0dcd9cf: feat: mark message types as readonly
0.7.2#
Patch Changes#
- 7fa9a1b: feat: ThreadMessageLike metadata support
- 1a1f4a5: feat: message metadata for all message types
0.7.1#
Patch Changes#
- c2f75e5: feat: ThreadListRuntime API types
0.7.0#
Breaking Changes#
- c6e886b: refactor!: drop deprecated features
Patch Changes#
- 2912fda: feat: ThreadListItemPrimitive
0.5.100#
Patch Changes#
- b5f92fe: fix(external-store): crash on cancel when using separate converter, fix branching
0.5.99#
Patch Changes#
- cdcfe1e: feat: ThreadListItemPrimitive (wip)
- cdcfe1e: fix: add React 19 RC to peerDeps
- 94feab2: feat: ComposerState.role / ComposerRuntime.setRole
- 472c548: feat: ThreadListPrimitive
- 14da684: feat: AppendMessage.startRun flag
- 1ada091: chore: update deps
0.5.98#
Patch Changes#
- ff5b86c: build: refactor build script into @assistant-ui/tsbuildutils
- ff5b86c: fix: better ESM compatibility
- ff5b86c: chore: update deps
0.5.97#
Patch Changes#
- 9a9c01d: feat(edge-runtime): add unstable_AISDKInterop flag
0.5.96#
Patch Changes#
- fix: properly pass initialMessages to LocalRuntime
0.5.95#
Patch Changes#
- fix: include generated css files in bundle
0.5.94#
Patch Changes#
- fix: toMessagePartStatus support for parallel tool calls
0.5.93#
Patch Changes#
- d2375cd: build: disable bundling in UI package releases
0.5.92#
Patch Changes#
- f6d197a: feat: Edge Runtime Server Accessible Ids (temp)
0.5.91#
Patch Changes#
- 56f80fa: fix: tailwind plugin turbopack interop
0.5.90#
Patch Changes#
- 2090544: fix: attachments infinite rerender bug
- be04b5b: feat: Unstable_AudioMessagePart (wip)
- 2090544: fix: Attachment preview accessibility
- fb32e61: chore: update deps
- fb32e61: feat: react-19 support
0.5.89#
Patch Changes#
- fd9ff67: fix(local-runtime): update capabilities on initial render
0.5.88#
Patch Changes#
- 0afecda: fix(ai-sdk): server-side maxSteps interop
0.5.87#
Patch Changes#
- b38165d: feat: export useAttachmentRuntime, useAttachment, FeedbackAdapter
- a1bfd26: fix(ai-sdk): DataStream interop without tool call streaming
- b38165d: feat(ai-sdk): Adapters support (attachment, feedback, speech, threadManager)
0.5.86#
Patch Changes#
- fix: do not cache adapter in useEdgeRuntime
0.5.85#
Patch Changes#
- 3a602b9: fix: correctly handle new thread creation
0.5.84#
Patch Changes#
- ba5116f: feat: useInlineRender hook
0.5.83#
Patch Changes#
- c38a018: feat: ThreadListRuntime
0.5.82#
Patch Changes#
- 0edadd1: feat: useThreadModelConfig API
- 1aeda53: feat: Runtime.path API
- 0c8277e: feat: MessageRuntime.unstable_getCopyText API
- 91d3951: feat: MessageRuntime.getMessagePartByToolCallId
- cf6861c: refactor!: simplify SpeechSynthesisAdapter to accept a text string
- 7c76939: feat: ThreadRuntime.getMesssageById
0.5.79#
Patch Changes#
- feat: allow out of order tool args streaming
0.5.78#
Patch Changes#
- dba0082: fix: border should apply to all aui-root children
- b182ea5: feat: Events API (experimental)
0.5.77#
Patch Changes#
- 0a3bd06: feat: Attachment image thumbnail and previews
0.5.76#
Patch Changes#
- c3806f8: fix: do not export internal Runtime types
- 899b963: refactor: add BaseThreadRuntimeCore class
- 899b963: feat: work towards Edit Composer attachment support
- 899b963: refactor: remove composerState.attachmentAccept, add composerRuntime.getAttachmentAccept()
- 8c80f2a: feat: MessageState.submittedFeedback state
- 809c5c1: feat: New Attachment UI
0.5.75#
Patch Changes#
- 31702b2: feat: MessageRuntime.stopSpeaking MessageState.speech state
- 44bfecd: refactor: move primitive types under the same namespace as the primitive components
0.5.74#
Patch Changes#
- 3d31f10: refactor: deprecate primitive-hooks
- cf872da: feat: AttachmentPrimitive
0.5.73#
Patch Changes#
- fb46305: chore: update dependencies
- e225116: feat(ui): add component override option for ThreadWelcome
- 0ff22a7: feat: switch to DataStream transfer protocol for edge runtime
- 378ee99: refactor: rename maxToolRoundtrips to maxSteps
- 378ee99: feat: server-side tool roundtrips support
0.5.72#
Patch Changes#
- d0db602: fix: useDangerousInBrowserRuntime correct options forwarding
0.5.71#
Patch Changes#
- 55942d8: fix: useMessagePartText backwards compat type
- e455aff: feat: FollowupSuggestions
- f7c156b: feat: mark new runtime API methods as stable
- f6a832e: chore: update dependencies
- 2b7c6fe: refactor: define interface types for the new runtime API
0.5.70#
Patch Changes#
- 3df0061: fix: TextMessagePartProvider missing fields
0.5.69#
Patch Changes#
- 46f91c2: feat(langgraph): allow disabling autocancellation of pending tool calls
0.5.68#
Patch Changes#
- 96b9d1f: feat: new Runtime API part 8
- 9fd85da: fix: ensure branch picker is supported before showing it
- d8bd40b: chore: update dependencies
- 42156cf: refactor: drop ReactThreadRuntimeCore, unstable_synchronizer
0.5.67#
Patch Changes#
- cfa8844: feat: useComposerRuntime hook
- 70720ba: feat: lift EditComposer to runtime layer
0.5.66#
Patch Changes#
- 325b049: fix: include attachments prop in the useExternalMessageConverter
- df9ec8f: feat: new Runtime API rollout part 2
- 3f549b2: refactor: rename internal export
0.5.65#
Patch Changes#
- 27208fb: fix: only include "use client" banner in ESM builds
0.5.64#
Patch Changes#
- ed24305: fix: add newline after "use client" for .js builds
0.5.63#
Patch Changes#
- c438773: feat: allow disabling ComposerInput keyboard shortcuts
- e1ae3d0: chore: update dependencies
0.5.62#
Patch Changes#
- cd1b286: fix: BranchPicker styles
0.5.61#
Patch Changes#
- 88957ac: feat: New unified Runtime API (part 1/n)
- 1a99132: feat: ThreadRuntime.Composer subscribe
- 3187013: feat: add status, attachments and metadata fields to all messages
0.5.60#
Patch Changes#
- 926dce5: feat: Feedback Primtives, UI and Adapter
- 155d6e7: chore: update dependencies
- f80226f: feat: ThreadActions.getModelConfig
0.5.59#
Patch Changes#
- 0f547a9: fix: useSmooth should work inside TextMessagePartProvider
0.5.58#
Patch Changes#
- 6507071: fix: TextMessagePartProvider text streaming support
- 6507071: feat: TextMessagePartProvider isRunning
0.5.57#
Patch Changes#
- 745d6e1: fix(runtimes/external-store): switch to thread should correctly copy the entire store
- 745d6e1: fix: only deprecate the null usage of switchToThread
0.5.56#
Patch Changes#
- e4863bb: feat(runtimes/external): add onSwitchToNewThread callback
- e4863bb: feat: add attachmentAccept to ThreadComposer
0.5.55#
Patch Changes#
- b0a22e3: feat: runtime.switchToNewThread()
- 11ca453: refactor: drop useModelConfig Context - use useAssistantActions instead
0.5.54#
Patch Changes#
- 0f99aa6: feat: New Context API
- c348553: chore: update dependencies
0.5.53#
Patch Changes#
- f0f7497: feat: MessageContent Empty should be displayed for empty messages with empty text part
- 8555685: feat: allow editing assistant/system messages
- 892b019: fix: Empty should default to the provided Text component
0.5.52#
Patch Changes#
- c0f975a: feat: TextMessagePartProvider
0.5.51#
Patch Changes#
- 164e46c: feat: ignore edits with text part unchanged
- 5eccae7: fix: createActionButton disabled handling
0.5.50#
Patch Changes#
- 04f6fc8: chore: update deps
0.5.49#
Patch Changes#
- 7ed296b: fix: make AppendMessage attachments field optional for now
0.5.48#
Patch Changes#
- 25a711d: fix: user message action bar css
0.5.47#
Patch Changes#
- a81b18f: feat: ComposerPrimitive.AddAttachment
- 44d08bd: feat: styled components for attachments
- b48fbcc: feat: UserMessageAttachment UI
- cc5e7d4: perf: memoize tool Ul components
- bdd3084: feat: allow runtimes to signal support for attachments
- 7dcab47: fix: message copy handling for runtimes
- a22e6bb: feat: AttachmentAdapter.accept allow attachment adapters to specify supported file types
- 9e00772: feat: add composer attachments state
- d2580d3: feat: SimpleImageAttachmentAdapter
- c845fcf: feat: allow sending attachment-only messages
- 3ba193e: feat: AttachmentContext
- d2580d3: feat: SimpleTextAttachmentAdapter
- 3b0f20b: feat: MessagePrimitive.Attachments
- 3ba193e: feat: ComposerPrimitive.Attachments
- d2580d3: feat: CompositeAttachmentAdapter
- 44d08bd: feat: Edge/Local runtime AttachmentAdapter support
0.5.46#
Patch Changes#
- 0a4b8d7: feat: adjust the override order of tool UIs
- 34ad491: feat: ThreadConfig.ToolFallback
- 34ad491: feat: ThreadConfig.tools
- 0a4b8d7: fix: tool UI fallback should not override makeAssistantToolUI definitions
0.5.45#
Patch Changes#
- fb8e58f: feat: add thread runtime threadId
0.5.44#
Patch Changes#
- b2801ce: feat(styling): cursor-not-allowed when composer input is disabled
- 0aa4e6b: fix: use-smooth-state should notdesync
0.5.43#
Patch Changes#
- 3962831: feat: useExternalMessageConverter API
- 85defe1: feat: allow string content in ThreadMessageLike
- 6f7ccf7: feat: add toolName to addToolResult callback
- 6f7ccf7: feat: thread converter should ignore empty text parts
0.5.42#
Patch Changes#
- c8b98b6: feat: animate composer border color on focus
- 800eb9e: fix: error on switchToThread / switchToNewThread
- 8768c67: feat: support shadcn scroll area
0.5.41#
Patch Changes#
- f526279: feat: SpeechSyntehsis
- e8aa697: refactor: remove unsupported external runtime onCopy callback
0.5.40#
Patch Changes#
- 4333382: fix(runtime/edge): handle maxToolRoundtrips
0.5.39#
Patch Changes#
- ab1160c: fix: switchToThread should persist maxToolRoundtrips
0.5.38#
Patch Changes#
- 554a423: chore: update deps
0.5.37#
Patch Changes#
- 60c0fdc: fix: remove Composer focus ring when using @tailwindcss/forms
- edbab24: feat(runtimes/local): reset thread
0.5.36#
Patch Changes#
- edb5a16: feat: DangerousInBrowserRuntime
- f8e2cf1: fix: @tailwindcss/forms input border
0.5.35#
Patch Changes#
- 53cf707: fix: do not require content in ChatModelRunResult
0.5.34#
Patch Changes#
- 3178788: feat: custom AssistantMessage metadata
0.5.33#
Patch Changes#
- c154b8f: feat(runtime/edge): allow extra headers & body
0.5.32#
Patch Changes#
- cd70d4f: refactor: rewrite ai-sdk integration to use external runtime
0.5.31#
Patch Changes#
- 34621cc: feat(runtimes/edge): getEdgeRuntimeResponse API
- 2df3e73: fix: CircleStopIcon invisible on safari
- 1b9ded0: feat: lift thread composer state to ThreadRuntime.Composer
0.5.30#
Patch Changes#
- ccf5fef: fix: do not capture enter key during IME composition events
0.5.29#
Patch Changes#
- 556001f: chore: update deps
- 556001f: feat: tool call cancellation support
0.5.28#
Patch Changes#
- 915b5b7: feat: expose streamUtils
- 9a55735: chore: update deps
0.5.27#
Patch Changes#
- dbf1042: fix: minor styling fixes
- dbf1042: chore: update deps
0.5.26#
Patch Changes#
- 440b051: fix: sending messages when thread is empty
0.5.25#
Patch Changes#
- 0445cdf: fix: disallow sending new messages when last message is in requires-action state
- 0445cdf: refactor: remove Runtime.isRunning / auto-infer isRunning state from last message state
- 71f4b77: feat: update Tooltip styles
0.5.24#
Patch Changes#
- a7e8ef6: refactor: rewrite external store sync
- 6629dd8: fix: render loop if a message ID is used twice
0.5.23#
Patch Changes#
- f83e4d1: feat: LocalRuntime export / import
0.5.22#
Patch Changes#
- 134d39e: fix: undo moving internal utilities to /react/internal
0.5.20#
Patch Changes#
- de04d92: feat: loading status & smooth streaming interop
- 3cc67f2: refactor: move internal utilities to @assistant-ui/react/internal
0.5.19#
Patch Changes#
- 2534938: feat: Message.Content Empty component
0.5.18#
Patch Changes#
- 0302235: fix(external-store): add initial messages to message repository
0.5.17#
Patch Changes#
- 4b4f9c8: feat(local-runtime): AsyncGenerator support
0.5.16#
Patch Changes#
- 9dc942f: feat: useThread.isDisabled flag
0.5.15#
Patch Changes#
- 0418c73: fix(runtimes/external-store): invalidate cache when isRunning changes during autoStatus
0.5.12#
Patch Changes#
- 8688a9f: feat(runtimes/external-store): loosen the return type for convertMessage callback
0.5.11#
Patch Changes#
- fc6bc35: feat: initialMessages SSR support
0.5.10#
Patch Changes#
- 1c6bf72: feat(tailwindcss): allow customizing colors directly in tailwind config
0.5.9#
Patch Changes#
- a216fbf: chore: update deps
0.5.6#
Patch Changes#
- e5e6b20: feat(runtime): BranchPicker feature detection
0.5.5#
Patch Changes#
- f26783a: feat(ui): allow ReactNode in SuggestionConfig.text
0.5.4#
Patch Changes#
- f2d7590: fix(rsc): hide copy message button
0.5.3#
Patch Changes#
- 1acdf45: feat: external store runtime
0.5.2#
Patch Changes#
- 2d7a8bd: fix: markdown loading indicator
- 2d7a8bd: fix: ScrollToBottom visbility bug
- 2d7a8bd: fix: text message part data-status field
0.5.1#
Patch Changes#
- ee38c0c: feat: message status v2
- ee38c0c: fix(runtimes/edge): wait for serverside tool call results before reporting onFinish
- 2baa898: chore: v5
0.4.6#
Patch Changes#
- bc77b4f: feat(runtimes/edge): dynamic model creator functions
- e220617: feat(runtimes/edge): client side API key, model name, model parameters specification
0.4.4#
Patch Changes#
- 998081b: fix: reduce specificity of built-in CSS styles
0.4.3#
Minor Changes#
- feat: scrolling to bottom during streaming is now instant
- fix: useSmooth gets triggered during branch switch
0.4.2#
Minor Changes#
- fix: issue with forwarding props to primitives
0.4.1#
Minor Changes#
- fix: useSmooth scrolling performance in dev mode
0.4.0#
Minor Changes#
- e0e51cf: refactor!: Rename AssistantMessage to ThreadAssistantMessage
- e0e51cf: refactor!: Rename UserMessage to ThreadUserMessage
- 679cd54: feat: system message support
Patch Changes#
- c7ba6a2: feat: Edge Runtime API
- e0e51cf: feat: add styled UI components
0.3.5#
Patch Changes#
- ef25706: feat: Code Header and Syntax Highlighter support
0.3.3#
Patch Changes#
- b5aa29f: feat: smooth streaming by default
0.3.2#
Patch Changes#
- 1a8919b: feat: smooth text streaming
0.3.1#
Patch Changes#
- 05fd5d6: feat: runtime capabilities API
0.3.0#
Minor Changes#
- 5b68f4a: refactor!: drop Message.InProgress support
Patch Changes#
- 3dd7384: fix: better message hover state tracking
- 23f474e: fix: remove warning about useLayoutEffect in SSR
0.2.4#
Patch Changes#
- c373fc9: feat: AssistantModalPrimitive.Anchor
0.2.3#
Patch Changes#
- be2c26b: fix: Vercel useAssistant BranchPicker duplicates bug
0.2.2#
Patch Changes#
- 62e9f19: feat: AssistantRuntime newThread
- 611fdcc: feat: useAssistantActions
- ca0eaa1: feat: Programmatic Interactions API
0.2.1#
Patch Changes#
- d52c345: feat: Primitive Prop Types
0.2.0#
Minor Changes#
- de20b1c: feat!: MessagePartText is now a
element
- 2ab2cab: feat!: experimental features are now marked as stable
0.1.12#
Patch Changes#
- 904556d: feat: ComposerContext focus() API
- 33ae8f9: feat: AssistantModalPrimitive
0.1.11#
Patch Changes#
- fd6a202: feat: Primitive Hook useThreadViewportAutoScroll
- c2a6b22: fix: improved Viewport autoscroll handling
- c2a6b22: fix: more reliable escape hotkey handling
- c2a6b22: feat: add "role" field to AppendMessage
0.1.10#
Patch Changes#
- 269b32f: feat: Primitive Hooks API
- 2867923: feat: Composer API Docs
0.1.9#
Patch Changes#
- ab16a99: feat: useMessageUtils Context API
- ab16a99: feat: useThreadActions Context API
- ab16a99: fix: make all Context APIs read-only
0.1.8#
Patch Changes#
- 8513f9a: feat: ToolUI addResult API
0.1.7#
Patch Changes#
- 36f3a1f: fix: add DisplayName to primitive components for better error logs
- 36f3a1f: chore: upgrade to radix-ui 1.1
- 36f3a1f: chore: update dependencies
0.1.6#
Patch Changes#
- a6769d5: feat: MessagePartComponent types
- 52236ab: feat: new default chat bubble design
0.1.5#
Patch Changes#
- 671dc86: feat: Tool Render functions
0.1.4#
Patch Changes#
- a73b50f: fix: ComposerRoot onSubmit should be called when using keyboard shortcuts
0.1.3#
Patch Changes#
- 6e9528d: build: add changesets
- 6e9528d: feat: add useAssistantTool API