Documents
CHANGELOG
CHANGELOG
Type
External
Status
Published
Created
Mar 17, 2026
Updated
May 21, 2026
Updated by
Dosu Bot
Source
View

@assistant-ui/react-ink#

0.0.17#

Patch Changes#

  • #3635 4ae1d2b - feat(react-ink): add StatusBarPrimitive components (@ShobhitPatra)

  • #3860 c1ffce1 - feat(react-ink): add intra-line highlighting to DiffView replacement lines (@ShobhitPatra)

  • #3983 a26f2bd - fix(react-ink): guard Pressable's onPress against the disabled prop independently of isFocused, so disabled reliably blocks key presses even when focus state and the prop disagree. (@ShobhitPatra)

  • #3633 300b3eb - feat(react-ink): add LoadingPrimitive for terminal loading states (@ShobhitPatra)

  • #3983 a26f2bd - feat(react-ink): add Status sub-component for terminal-safe attachment status display, and fall back from extensionless filenames to the attachment type in Thumb. (@ShobhitPatra)

  • #3965 a71f716 - feat(react-ink): add ComposerPrimitive.Queue and QueueItemPrimitive (Text, Remove, Steer) (@ShobhitPatra)

  • #3969 2bcbaf2 - feat(react-ink): add ComposerPrimitive.Quote, QuoteText, and QuoteDismiss for terminal composer quote parity with @assistant-ui/react (@ShobhitPatra)

  • #3957 a25381e - feat(react-ink): harden terminal pressable interactions (@ShobhitPatra)

  • #3958 7a8bf26 - feat(react-ink): add MessagePartPrimitive namespace with terminal-safe defaults for image, file, source, reasoning, and data parts. (@ShobhitPatra)

    Behavior changes in react-ink:

    • MessagePrimitive.Content (deprecated) now renders the new terminal-safe defaults for image/file/source/reasoning/data parts when no render* prop is provided; previously these parts were silently dropped. Pass render*={() => null} to restore the prior behavior.
    • MessagePrimitive.Content now consults dataRenderers.fallbacks[0] before falling back to the inline data renderer, matching MessagePrimitive.Parts.
    • MessagePrimitive.Parts now forwards data and Quote components alongside ChainOfThought; previously data was dropped when ChainOfThought was set.
  • Updated dependencies [db721df, 94548fa, 94548fa, 94548fa, 8b6fc88, 179895f, 7a8bf26, 3b2bbce]:

0.0.16#

Patch Changes#

  • #4008 fa4510a - feat: support multi-modal tool results via toModelOutput (@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 toModelOutput callback. 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-stream exports a new ToolModelContentPart type ({ type: "text", text } | { type: "file", data, mediaType, filename? }) and a ToolModelOutputFunction<TArgs, TResult> callback type. Tool.toModelOutput is wired through unstable_runPendingTools and ToolExecutionStream, attaching the resulting modelContent to the tool-call part on the assistant message.
    • @assistant-ui/core re-exports ToolModelContentPart and adds an optional modelContent?: readonly ToolModelContentPart[] field on ToolCallMessagePart. existing tools and renderers are unchanged.
    • @assistant-ui/react-ai-sdk's frontendTools(...) helper now also registers a toModelOutput on each forwarded tool. it transparently unwraps an envelope that useAISDKRuntime writes when a frontend-executed tool produced modelContent, 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 without toModelOutput is unchanged.

    route handlers that adopt toModelOutput also need to pass tools to convertToModelMessages (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 use toModelOutput. 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, or convertMessage will 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-sdk from this version onward. if you persist UI messages and read them from multiple environments, upgrade every reader before any writer starts producing toModelOutput; otherwise older readers will treat the envelope object as the result and break the affected tool render functions.

  • #3966 3d78764 - perf: Virtualize message list and memoize per-message render in long ink threads (@samdickson22)

    ThreadPrimitive.Messages now accepts optional windowSize / windowOverscan. When set, the live render region keeps the last windowSize + windowOverscan messages; older ones graduate through Ink's <Static> into terminal scrollback. Each rendered message is wrapped in a memoized boundary keyed by (index, render), so streaming a single message no longer reconciles the full list. Defaults preserve legacy behavior; negative values clamp to 0.

  • Updated dependencies [9ecda1d, 35d0146, fa4510a, c9dd16c, dea8bc7, 9c3d24d]:

0.0.15#

Patch Changes#

0.0.14#

Patch Changes#

0.0.13#

Patch Changes#

0.0.12#

Patch Changes#

0.0.11#

Patch Changes#

0.0.10#

Patch Changes#

  • 376bb00: chore: update dependencies
  • Updated dependencies [42bc640]
  • Updated dependencies [376bb00]
  • Updated dependencies [87e7761]

0.0.9#

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.

  • bdce66f: chore: update dependencies

  • 4abb898: refactor: align interactables with codebase conventions

    • Rename useInteractable to useAssistantInteractable (registration only, returns id)
    • Add useInteractableState hook for reading/writing interactable state
    • Remove makeInteractable and related types
    • Rename UseInteractableConfig to AssistantInteractableProps
    • Extract buildInteractableModelContext from Interactables resource
    • Add with-interactables example to CLI
  • 209ae81: chore: remove aui-source export condition from package.json exports

  • 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]

0.0.8#

Patch Changes#

  • 3227e71: feat: add interactables with partial updates, multi-instance, and selection

    • useInteractable(name, config) hook and makeInteractable factory for registering AI-controllable UI
    • Interactables() 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]

0.0.7#

Patch Changes#

  • 3247231: feat(react-ink): add DiffPrimitive and DiffView for terminal diff rendering
  • 736344c: chore: update dependencies
  • Updated dependencies [1406aed]
  • Updated dependencies [9480f30]
  • Updated dependencies [28a987a]
  • Updated dependencies [736344c]
  • Updated dependencies [ff3be2a]
  • Updated dependencies [70b19f3]
  • Updated dependencies [c71cb58]

0.0.6#

Patch Changes#

  • 7ecc497: feat: children API for primitives with part.toolUI, part.dataRendererUI, and MessagePrimitive.Quote
  • 639792c: feat(react-ink): add ErrorPrimitive (Root, Message)
  • Updated dependencies [7ecc497]

0.0.5#

Patch Changes#

  • 4a904de: refactor: remove useAssistantRuntime hook
  • 349f3c7: chore: update deps
  • 6cc4122: refactor: use primitive hooks
  • Updated dependencies [1ed9867]
  • Updated dependencies [427ffaa]
  • Updated dependencies [349f3c7]
  • Updated dependencies [02614aa]
  • Updated dependencies [6cc4122]
  • Updated dependencies [642bcda]

0.0.4#

Patch Changes#

  • f38a59b: Launch React Ink: add documentation, landing page, CLI --ink flag, and README
  • 990e41d: refactor: code sharing between the multiple platforms
  • Updated dependencies [990e41d]

0.0.3#

Patch Changes#

  • 6d78873: feat: add ToolFallback component with collapsible tool call visualization
  • Updated dependencies [f032ea5]
  • Updated dependencies [2828b67]

0.0.2#

Patch Changes#

  • 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]