npm / @assistant-ui/core
@assistant-ui/core
What changed in @assistant-ui/core 0.3, from its official release notes, upgrade guides and advisories. Sources checked 2026-10-27.
1 breaking2 deprecations13 new APIs and options1 performance3 behavior and defaults34 fixes and other
See which of these apply to your code, ranked, in your agent:
npx @unstale/cli init@assistant-ui/core 0.354 changes
Breaking changes 1
Adapters may omit unarchive; archived threads then open without unarchiving, and explicit unarchive rejects.
Deprecations 2
Deprecated for removal in a future minor release; return the same adapters from unstable_useAdapters instead.
Direct use of this runtime core is deprecated.
New APIs and options 13
The store reports every composer text write with the text it left and its origin, distinguishing clearing a draft from sending, resetting, or recalling input history.
A completed turn whose thread history fails to store is reported as a persistence_error run.
setText accepts an origin option so composer text writes can be attributed to their source.
Exposes thread-list unarchive support and disables unarchive controls when the adapter cannot restore archived threads.
Accepts an optional name for its interactable, allowing the creating tool to have a different name.
Adapters can opt in to interrupted-run resumption when they keep an exact checkpoint; the flag is optional on thread state for compatibility.
Adds a Resume control for interrupted runs; it is disabled while the draft is not empty or the thread is busy.
ModelContext() accepts maxSystemLength to cap the merged system prompt, trimming the lowest-priority parts first.
ModelContext() accepts mergeSystem to let developers combine prioritized SystemParts themselves.
Resumes an interrupted run from its exact checkpoint; concurrent resumes share one attempt.
Adds a hook for resuming interrupted runs when the adapter reports canResume.
Tool-call parts carry responseDeliveryStatus: "queued" while replies are held and unsent, preventing the tool UI from showing them as sent.
Thread state reports failed switches, such as a URL-controlled threadId whose fetch rejects; controlled switches retry when the browser comes online or the tab becomes visible.
Performance 1
Skips unchanged remote thread resources when the thread list host re-renders.
Behavior and default changes 3
Failed and stopped turns now report outcomes including rate_limited, validation_failed, server_error, aborted, and incomplete; HTTP failures include their status as error_code.
Runs on the RemoteThreadList store client unless the mounting adapter sets unstable_Provider; later adapters are served through unstable_useAdapters, and a failed first load requires reload() to retry after a controlled threadId change.
assistant-cloud is now a dependency rather than an optional peer, so @assistant-ui/core/react loads in Node and Vitest without installing it separately.
Fixes and other changes 34
Marks useLocalRuntime, useRemoteThreadListRuntime, useCloudThreadListAdapter, and CloudFileAttachmentAdapter as client modules.
With a conversion cache, a streaming token no longer rejoins every finished message in the thread.
Keeps generated external message timestamps stable across conversion cache invalidations and in the external store runtime.
Forwards composer store events from ExternalThread.
Keeps replacement speech stoppable after stale utterance callbacks, supersedes a speak started during cancellation, and clears speech state when adapter cancellation throws.
Reads LangGraph and LangChain interactable update results returned as JSON text so id-less updates remain attributed to the resolved instance.
Preserves earlier answers' streaming timing when a later run ends without new output.
History messages listed before their parents are preserved using parent-first ordering; the selected head and sibling branches remain while malformed messages and orphaned descendants are skipped.
Composer text is visible as soon as setText returns, preventing inputs with their own state from moving the caret to the end.
Title generation is retried after a thread's first run ends if it still has no title, including for threads created outside the runtime.
A controlled new-thread request stays selected when the previous draft initializes during the switch.
Custom metadata from draft threads is passed to remote thread initialization.
Selectors that read through a forwarding client are tracked when its target changes.
Labels and IDs containing directive delimiters are preserved without changing existing bracket-form directives.
Mutations for each remote thread are sent to its adapter in call order.
After a failed title write-back, the server title is re-read instead of leaving the list with a title the server never received.
A switch waits for the replacement runtime to attach; it rejects with ThreadListDestroyedError if the list is destroyed or with the mount error if mounting fails.
Restoring unsent drafts uses the latest attachment cleanup state.
Composer text is visible as soon as setText returns, preventing inputs with their own state from moving the caret to the end.
Automatic title generation waits for explicit title generation and runs only if that produces no title, keeping the thread list and server aligned.
The server-saved automatic title is shown when explicit title generation fails or returns no title, and overlapping automatic titles settle on the newest one.
Percent-encoded payloads are decoded before being forwarded to model adapters or providers, including when the media type already matches.
Copy feedback is preserved when unrelated assistant scopes change.
Dictation no longer starts on a disabled thread.
History copies stay up to date when attachments on an existing user message are added, removed, or changed.
Late client tool calls from cancelled runs are discarded using host-provided run ids.
Frame tools and pending calls are cleared when the iframe document changes or reloads.
When an external-store host drops a message from the middle of its messages array, that message and its feedback are removed from the thread instead of remaining as a sibling branch.
A still-initializing thread is reported through onThreadIdChange once its remote id settles, rather than being reported as undefined.
Pending deletes settle after reloads, branch switches, and edits.
Legacy audio parts are projected as file parts with an audio/<format> media type instead of being dropped when building a queued message's item.
Selecting the already displayed thread no longer cancels an in-flight controlled switch in the client.
Text sending remains available when voice setup ends synchronously.
Selecting the already displayed thread no longer cancels a pending thread switch.