# What changed in @assistant-ui/core

> 54 changes in @assistant-ui/core 0.3 from its official release notes, upgrade guides and advisories: 1 breaking, 2 deprecations, 13 new APIs and options. Each one cited. Sources checked 2026-10-27. HTML: https://unstale.sh/npm/@assistant-ui/core/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## @assistant-ui/core 0.3

### Breaking changes

- Adapters may omit unarchive; archived threads then open without unarchiving, and explicit unarchive rejects. (0.3.30) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.30)

### Deprecations

- Deprecated for removal in a future minor release; return the same adapters from unstable_useAdapters instead. (0.3.31) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.31)
- Direct use of this runtime core is deprecated. (0.3.30) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.30)

### New APIs and options

- 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. (0.3.31) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.31)
- A completed turn whose thread history fails to store is reported as a persistence_error run. (0.3.31) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.31)
- setText accepts an origin option so composer text writes can be attributed to their source. (0.3.31) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.31)
- Exposes thread-list unarchive support and disables unarchive controls when the adapter cannot restore archived threads. (0.3.31) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.31)
- Accepts an optional name for its interactable, allowing the creating tool to have a different name. (0.3.31) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.31)
- Adapters can opt in to interrupted-run resumption when they keep an exact checkpoint; the flag is optional on thread state for compatibility. (0.3.30) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.30)
- Adds a Resume control for interrupted runs; it is disabled while the draft is not empty or the thread is busy. (0.3.30) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.30)
- ModelContext() accepts maxSystemLength to cap the merged system prompt, trimming the lowest-priority parts first. (0.3.30) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.30)
- ModelContext() accepts mergeSystem to let developers combine prioritized SystemParts themselves. (0.3.30) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.30)
- Resumes an interrupted run from its exact checkpoint; concurrent resumes share one attempt. (0.3.30) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.30)
- Adds a hook for resuming interrupted runs when the adapter reports canResume. (0.3.30) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.30)
- Tool-call parts carry responseDeliveryStatus: "queued" while replies are held and unsent, preventing the tool UI from showing them as sent. (0.3.29) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.29)
- 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. (0.3.29) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.29)

### Performance

- Skips unchanged remote thread resources when the thread list host re-renders. (0.3.31) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.31)

### Behavior and default changes

- 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. (0.3.31) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.31)
- 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. (0.3.30) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.30)
- 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. (0.3.29) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.29)

### Fixes and other changes

- Marks useLocalRuntime, useRemoteThreadListRuntime, useCloudThreadListAdapter, and CloudFileAttachmentAdapter as client modules. (0.3.31) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.31)
- With a conversion cache, a streaming token no longer rejoins every finished message in the thread. (0.3.31) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.31)
- Keeps generated external message timestamps stable across conversion cache invalidations and in the external store runtime. (0.3.31) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.31)
- Forwards composer store events from ExternalThread. (0.3.31) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.31)
- Keeps replacement speech stoppable after stale utterance callbacks, supersedes a speak started during cancellation, and clears speech state when adapter cancellation throws. (0.3.31) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.31)
- Reads LangGraph and LangChain interactable update results returned as JSON text so id-less updates remain attributed to the resolved instance. (0.3.31) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.31)
- Preserves earlier answers' streaming timing when a later run ends without new output. (0.3.31) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.31)
- 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. (0.3.30) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.30)
- Composer text is visible as soon as setText returns, preventing inputs with their own state from moving the caret to the end. (0.3.30) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.30)
- Title generation is retried after a thread's first run ends if it still has no title, including for threads created outside the runtime. (0.3.30) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.30)
- A controlled new-thread request stays selected when the previous draft initializes during the switch. (0.3.30) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.30)
- Custom metadata from draft threads is passed to remote thread initialization. (0.3.30) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.30)
- Selectors that read through a forwarding client are tracked when its target changes. (0.3.30) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.30)
- Labels and IDs containing directive delimiters are preserved without changing existing bracket-form directives. (0.3.30) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.30)
- Mutations for each remote thread are sent to its adapter in call order. (0.3.30) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.30)
- After a failed title write-back, the server title is re-read instead of leaving the list with a title the server never received. (0.3.30) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.30)
- 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. (0.3.30) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.30)
- Restoring unsent drafts uses the latest attachment cleanup state. (0.3.30) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.30)
- Composer text is visible as soon as setText returns, preventing inputs with their own state from moving the caret to the end. (0.3.30) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.30)
- Automatic title generation waits for explicit title generation and runs only if that produces no title, keeping the thread list and server aligned. (0.3.29) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.29)
- 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. (0.3.29) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.29)
- Percent-encoded payloads are decoded before being forwarded to model adapters or providers, including when the media type already matches. (0.3.29) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.29)
- Copy feedback is preserved when unrelated assistant scopes change. (0.3.29) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.29)
- Dictation no longer starts on a disabled thread. (0.3.29) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.29)
- History copies stay up to date when attachments on an existing user message are added, removed, or changed. (0.3.29) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.29)
- Late client tool calls from cancelled runs are discarded using host-provided run ids. (0.3.29) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.29)
- Frame tools and pending calls are cleared when the iframe document changes or reloads. (0.3.29) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.29)
- 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. (0.3.29) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.29)
- A still-initializing thread is reported through onThreadIdChange once its remote id settles, rather than being reported as undefined. (0.3.29) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.29)
- Pending deletes settle after reloads, branch switches, and edits. (0.3.29) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.29)
- 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. (0.3.29) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.29)
- Selecting the already displayed thread no longer cancels an in-flight controlled switch in the client. (0.3.29) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.29)
- Text sending remains available when voice setup ends synchronously. (0.3.29) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.29)
- Selecting the already displayed thread no longer cancels a pending thread switch. (0.3.29) — [release notes](https://github.com/assistant-ui/assistant-ui/releases/tag/%40assistant-ui/core%400.3.29)
