@assistant-ui/react 0.15.19 → 0.15.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadViewport.d.ts","names":[],"sources":["../../../src/context/stores/ThreadViewport.ts"],"mappings":";;KAKY;;EAEV,YAAY;;EAEZ,YAAY;;KAyCF;WACD;WACA,iBAAiB;IACxB,WAAW;;WAEJ,mBACP,aAAa;IAAc,UAAU;iBAClC;;WAGI;;WAGA;aACE;aACA;;;WAIF;;aAEE;;aAEA;;;WAIF;aACE,UAAU;aACV,QAAQ;aACR,QAAQ;;;WAIV;aACE;aACA;;;;;;;WAQF;aACE;aACA;;;WAIF,wBAAwB;;WAGxB,4BAA4B;;WAG5B,0BACP,SAAS,uBACN;;WAGI,wBAAwB,SAAS,uBAAuB;;;;;;WAOxD,8BACP,SAAS,oBACT;aAAoB;aAA6B;QAC9C;WAEI,mBACP;aAAiB;aAA2B;;;KAIpC;EACV;EACA;IAEM;IACA;;;cAKK,0BACX,UAAS,iDAA+B,gCAAA,SAAA"}
1
+ {"version":3,"file":"ThreadViewport.d.ts","names":[],"sources":["../../../src/context/stores/ThreadViewport.ts"],"mappings":";;KAMY;;EAEV,YAAY;;EAEZ,YAAY;;KAyCF;WACD;WACA,iBAAiB;IACxB,WAAW;;WAEJ,mBACP,aAAa;IAAc,UAAU;iBAClC;;WAGI;;WAGA;aACE;aACA;;;WAIF;;aAEE;;aAEA;;;WAIF;aACE,UAAU;aACV,QAAQ;aACR,QAAQ;;;WAIV;aACE;aACA;;;;;;;WAQF;aACE;aACA;;;WAIF,wBAAwB;;WAGxB,4BAA4B;;WAG5B,0BACP,SAAS,uBACN;;WAGI,wBAAwB,SAAS,uBAAuB;;;;;;WAOxD,8BACP,SAAS,oBACT;aAAoB;aAA6B;QAC9C;WAEI,mBACP;aAAiB;aAA2B;;;KAIpC;EACV;EACA;IAEM;IACA;;;cAKK,0BACX,UAAS,iDAA+B,gCAAA,SAAA"}
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
  import { create } from "zustand";
3
+ import { notifyEventListeners } from "@assistant-ui/core/internal";
3
4
  //#region src/context/stores/ThreadViewport.ts
4
5
  const createSizeRegistry = (onChange) => {
5
6
  const entries = /* @__PURE__ */ new Map();
@@ -55,7 +56,7 @@ const makeThreadViewportStore = (options = {}) => {
55
56
  const store = create(() => ({
56
57
  isAtBottom: true,
57
58
  scrollToBottom: ({ behavior = "auto" } = {}) => {
58
- for (const listener of scrollToBottomListeners) listener({ behavior });
59
+ notifyEventListeners(scrollToBottomListeners, () => ({ behavior }), "Thread viewport");
59
60
  },
60
61
  onScrollToBottom: (callback) => {
61
62
  scrollToBottomListeners.add(callback);
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadViewport.js","names":["create","Unsubscribe","SizeHandle","setHeight","height","unregister","SizeRegistry","register","createSizeRegistry","onChange","total","entries","Map","recalculate","values","id","Symbol","set","get","delete","ThreadViewportState","isAtBottom","scrollToBottom","config","behavior","ScrollBehavior","onScrollToBottom","callback","turnAnchor","topAnchorMessageClamp","tallerThan","visibleHeight","viewport","inset","element","HTMLElement","anchor","target","targetConfig","topAnchorTurn","anchorId","targetId","registerViewport","registerContentInset","registerViewportElement","registerAnchorElement","registerAnchorTargetElement","setTopAnchorTurn","turn","ThreadViewportStoreOptions","makeThreadViewportStore","options","scrollToBottomListeners","Set","viewportRegistry","store","setState","getState","insetRegistry","registerElementSlot","key","listener","add"],"sources":["../../../src/context/stores/ThreadViewport.ts"],"sourcesContent":["\"use client\";\n\nimport { create } from \"zustand\";\nimport type { Unsubscribe } from \"@assistant-ui/core\";\n\nexport type SizeHandle = {\n /** Update the height */\n setHeight: (height: number) => void;\n /** Unregister this handle */\n unregister: Unsubscribe;\n};\n\ntype SizeRegistry = {\n register: () => SizeHandle;\n};\n\nconst createSizeRegistry = (\n onChange: (total: number) => void,\n): SizeRegistry => {\n const entries = new Map<symbol, number>();\n\n const recalculate = () => {\n let total = 0;\n for (const height of entries.values()) {\n total += height;\n }\n onChange(total);\n };\n\n return {\n register: () => {\n const id = Symbol();\n entries.set(id, 0);\n\n return {\n setHeight: (height: number) => {\n if (entries.get(id) !== height) {\n entries.set(id, height);\n recalculate();\n }\n },\n unregister: () => {\n entries.delete(id);\n recalculate();\n },\n };\n },\n };\n};\n\nexport type ThreadViewportState = {\n readonly isAtBottom: boolean;\n readonly scrollToBottom: (config?: {\n behavior?: ScrollBehavior | undefined;\n }) => void;\n readonly onScrollToBottom: (\n callback: ({ behavior }: { behavior: ScrollBehavior }) => void,\n ) => Unsubscribe;\n\n /** Controls scroll anchoring: \"top\" anchors user messages at top, \"bottom\" is classic behavior */\n readonly turnAnchor: \"top\" | \"bottom\";\n\n /** Clamps tall user messages so the assistant response stays in view. */\n readonly topAnchorMessageClamp: {\n readonly tallerThan: string;\n readonly visibleHeight: string;\n };\n\n /** Raw height values from registered elements */\n readonly height: {\n /** Total viewport height */\n readonly viewport: number;\n /** Total content inset height (footer, anchor message, etc.) */\n readonly inset: number;\n };\n\n /** Current DOM elements used for geometry-based top anchoring */\n readonly element: {\n readonly viewport: HTMLElement | null;\n readonly anchor: HTMLElement | null;\n readonly target: HTMLElement | null;\n };\n\n /** Numeric clamp configuration for the active top-anchor target message */\n readonly targetConfig: {\n readonly tallerThan: number;\n readonly visibleHeight: number;\n } | null;\n\n /**\n * The current top-anchor turn activated in this viewport session.\n * History-loaded messages do not populate this; it is set when a run creates\n * a live user/assistant pair and remains after the run completes.\n */\n readonly topAnchorTurn: {\n readonly anchorId: string;\n readonly targetId: string;\n } | null;\n\n /** Register a viewport and get a handle to update its height */\n readonly registerViewport: () => SizeHandle;\n\n /** Register a content inset (footer, anchor message, etc.) and get a handle to update its height */\n readonly registerContentInset: () => SizeHandle;\n\n /** Register the scroll viewport element */\n readonly registerViewportElement: (\n element: HTMLElement | null,\n ) => Unsubscribe;\n\n /** Register the current anchor user message element */\n readonly registerAnchorElement: (element: HTMLElement | null) => Unsubscribe;\n\n /**\n * Register the current top-anchor target (last assistant response) element\n * along with its numeric clamp configuration. When unregistered, both\n * `element.target` and `targetConfig` clear together.\n */\n readonly registerAnchorTargetElement: (\n element: HTMLElement | null,\n config?: { readonly tallerThan: number; readonly visibleHeight: number },\n ) => Unsubscribe;\n\n readonly setTopAnchorTurn: (\n turn: { readonly anchorId: string; readonly targetId: string } | null,\n ) => void;\n};\n\nexport type ThreadViewportStoreOptions = {\n turnAnchor?: \"top\" | \"bottom\" | undefined;\n topAnchorMessageClamp?:\n | {\n tallerThan?: string | undefined;\n visibleHeight?: string | undefined;\n }\n | undefined;\n};\n\nexport const makeThreadViewportStore = (\n options: ThreadViewportStoreOptions = {},\n) => {\n const scrollToBottomListeners = new Set<\n (config: { behavior: ScrollBehavior }) => void\n >();\n\n const viewportRegistry = createSizeRegistry((total) => {\n store.setState({\n height: {\n ...store.getState().height,\n viewport: total,\n },\n });\n });\n const insetRegistry = createSizeRegistry((total) => {\n store.setState({\n height: {\n ...store.getState().height,\n inset: total,\n },\n });\n });\n const registerElementSlot = (\n key: \"viewport\" | \"anchor\",\n element: HTMLElement | null,\n ) => {\n store.setState({\n element: {\n ...store.getState().element,\n [key]: element,\n },\n });\n\n return () => {\n if (store.getState().element[key] !== element) return;\n store.setState({\n element: {\n ...store.getState().element,\n [key]: null,\n },\n });\n };\n };\n\n const store = create<ThreadViewportState>(() => ({\n isAtBottom: true,\n scrollToBottom: ({ behavior = \"auto\" } = {}) => {\n for (const listener of scrollToBottomListeners) {\n listener({ behavior });\n }\n },\n onScrollToBottom: (callback) => {\n scrollToBottomListeners.add(callback);\n return () => {\n scrollToBottomListeners.delete(callback);\n };\n },\n\n turnAnchor: options.turnAnchor ?? \"bottom\",\n topAnchorMessageClamp: {\n tallerThan: options.topAnchorMessageClamp?.tallerThan ?? \"10em\",\n visibleHeight: options.topAnchorMessageClamp?.visibleHeight ?? \"6em\",\n },\n\n height: {\n viewport: 0,\n inset: 0,\n },\n element: {\n viewport: null,\n anchor: null,\n target: null,\n },\n targetConfig: null,\n topAnchorTurn: null,\n\n registerViewport: viewportRegistry.register,\n registerContentInset: insetRegistry.register,\n registerViewportElement: (element) =>\n registerElementSlot(\"viewport\", element),\n registerAnchorElement: (element) => registerElementSlot(\"anchor\", element),\n registerAnchorTargetElement: (element, config) => {\n store.setState({\n element: {\n ...store.getState().element,\n target: element,\n },\n targetConfig: element && config ? config : null,\n });\n\n return () => {\n if (store.getState().element.target !== element) return;\n store.setState({\n element: {\n ...store.getState().element,\n target: null,\n },\n targetConfig: null,\n });\n };\n },\n setTopAnchorTurn: (topAnchorTurn) => {\n store.setState({ topAnchorTurn });\n },\n }));\n\n return store;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"ThreadViewport.js","names":["create","Unsubscribe","notifyEventListeners","SizeHandle","setHeight","height","unregister","SizeRegistry","register","createSizeRegistry","onChange","total","entries","Map","recalculate","values","id","Symbol","set","get","delete","ThreadViewportState","isAtBottom","scrollToBottom","config","behavior","ScrollBehavior","onScrollToBottom","callback","turnAnchor","topAnchorMessageClamp","tallerThan","visibleHeight","viewport","inset","element","HTMLElement","anchor","target","targetConfig","topAnchorTurn","anchorId","targetId","registerViewport","registerContentInset","registerViewportElement","registerAnchorElement","registerAnchorTargetElement","setTopAnchorTurn","turn","ThreadViewportStoreOptions","makeThreadViewportStore","options","scrollToBottomListeners","Set","viewportRegistry","store","setState","getState","insetRegistry","registerElementSlot","key","add"],"sources":["../../../src/context/stores/ThreadViewport.ts"],"sourcesContent":["\"use client\";\n\nimport { create } from \"zustand\";\nimport type { Unsubscribe } from \"@assistant-ui/core\";\nimport { notifyEventListeners } from \"@assistant-ui/core/internal\";\n\nexport type SizeHandle = {\n /** Update the height */\n setHeight: (height: number) => void;\n /** Unregister this handle */\n unregister: Unsubscribe;\n};\n\ntype SizeRegistry = {\n register: () => SizeHandle;\n};\n\nconst createSizeRegistry = (\n onChange: (total: number) => void,\n): SizeRegistry => {\n const entries = new Map<symbol, number>();\n\n const recalculate = () => {\n let total = 0;\n for (const height of entries.values()) {\n total += height;\n }\n onChange(total);\n };\n\n return {\n register: () => {\n const id = Symbol();\n entries.set(id, 0);\n\n return {\n setHeight: (height: number) => {\n if (entries.get(id) !== height) {\n entries.set(id, height);\n recalculate();\n }\n },\n unregister: () => {\n entries.delete(id);\n recalculate();\n },\n };\n },\n };\n};\n\nexport type ThreadViewportState = {\n readonly isAtBottom: boolean;\n readonly scrollToBottom: (config?: {\n behavior?: ScrollBehavior | undefined;\n }) => void;\n readonly onScrollToBottom: (\n callback: ({ behavior }: { behavior: ScrollBehavior }) => void,\n ) => Unsubscribe;\n\n /** Controls scroll anchoring: \"top\" anchors user messages at top, \"bottom\" is classic behavior */\n readonly turnAnchor: \"top\" | \"bottom\";\n\n /** Clamps tall user messages so the assistant response stays in view. */\n readonly topAnchorMessageClamp: {\n readonly tallerThan: string;\n readonly visibleHeight: string;\n };\n\n /** Raw height values from registered elements */\n readonly height: {\n /** Total viewport height */\n readonly viewport: number;\n /** Total content inset height (footer, anchor message, etc.) */\n readonly inset: number;\n };\n\n /** Current DOM elements used for geometry-based top anchoring */\n readonly element: {\n readonly viewport: HTMLElement | null;\n readonly anchor: HTMLElement | null;\n readonly target: HTMLElement | null;\n };\n\n /** Numeric clamp configuration for the active top-anchor target message */\n readonly targetConfig: {\n readonly tallerThan: number;\n readonly visibleHeight: number;\n } | null;\n\n /**\n * The current top-anchor turn activated in this viewport session.\n * History-loaded messages do not populate this; it is set when a run creates\n * a live user/assistant pair and remains after the run completes.\n */\n readonly topAnchorTurn: {\n readonly anchorId: string;\n readonly targetId: string;\n } | null;\n\n /** Register a viewport and get a handle to update its height */\n readonly registerViewport: () => SizeHandle;\n\n /** Register a content inset (footer, anchor message, etc.) and get a handle to update its height */\n readonly registerContentInset: () => SizeHandle;\n\n /** Register the scroll viewport element */\n readonly registerViewportElement: (\n element: HTMLElement | null,\n ) => Unsubscribe;\n\n /** Register the current anchor user message element */\n readonly registerAnchorElement: (element: HTMLElement | null) => Unsubscribe;\n\n /**\n * Register the current top-anchor target (last assistant response) element\n * along with its numeric clamp configuration. When unregistered, both\n * `element.target` and `targetConfig` clear together.\n */\n readonly registerAnchorTargetElement: (\n element: HTMLElement | null,\n config?: { readonly tallerThan: number; readonly visibleHeight: number },\n ) => Unsubscribe;\n\n readonly setTopAnchorTurn: (\n turn: { readonly anchorId: string; readonly targetId: string } | null,\n ) => void;\n};\n\nexport type ThreadViewportStoreOptions = {\n turnAnchor?: \"top\" | \"bottom\" | undefined;\n topAnchorMessageClamp?:\n | {\n tallerThan?: string | undefined;\n visibleHeight?: string | undefined;\n }\n | undefined;\n};\n\nexport const makeThreadViewportStore = (\n options: ThreadViewportStoreOptions = {},\n) => {\n const scrollToBottomListeners = new Set<\n (config: { behavior: ScrollBehavior }) => void\n >();\n\n const viewportRegistry = createSizeRegistry((total) => {\n store.setState({\n height: {\n ...store.getState().height,\n viewport: total,\n },\n });\n });\n const insetRegistry = createSizeRegistry((total) => {\n store.setState({\n height: {\n ...store.getState().height,\n inset: total,\n },\n });\n });\n const registerElementSlot = (\n key: \"viewport\" | \"anchor\",\n element: HTMLElement | null,\n ) => {\n store.setState({\n element: {\n ...store.getState().element,\n [key]: element,\n },\n });\n\n return () => {\n if (store.getState().element[key] !== element) return;\n store.setState({\n element: {\n ...store.getState().element,\n [key]: null,\n },\n });\n };\n };\n\n const store = create<ThreadViewportState>(() => ({\n isAtBottom: true,\n scrollToBottom: ({ behavior = \"auto\" } = {}) => {\n notifyEventListeners(\n scrollToBottomListeners,\n () => ({ behavior }),\n \"Thread viewport\",\n );\n },\n onScrollToBottom: (callback) => {\n scrollToBottomListeners.add(callback);\n return () => {\n scrollToBottomListeners.delete(callback);\n };\n },\n\n turnAnchor: options.turnAnchor ?? \"bottom\",\n topAnchorMessageClamp: {\n tallerThan: options.topAnchorMessageClamp?.tallerThan ?? \"10em\",\n visibleHeight: options.topAnchorMessageClamp?.visibleHeight ?? \"6em\",\n },\n\n height: {\n viewport: 0,\n inset: 0,\n },\n element: {\n viewport: null,\n anchor: null,\n target: null,\n },\n targetConfig: null,\n topAnchorTurn: null,\n\n registerViewport: viewportRegistry.register,\n registerContentInset: insetRegistry.register,\n registerViewportElement: (element) =>\n registerElementSlot(\"viewport\", element),\n registerAnchorElement: (element) => registerElementSlot(\"anchor\", element),\n registerAnchorTargetElement: (element, config) => {\n store.setState({\n element: {\n ...store.getState().element,\n target: element,\n },\n targetConfig: element && config ? config : null,\n });\n\n return () => {\n if (store.getState().element.target !== element) return;\n store.setState({\n element: {\n ...store.getState().element,\n target: null,\n },\n targetConfig: null,\n });\n };\n },\n setTopAnchorTurn: (topAnchorTurn) => {\n store.setState({ topAnchorTurn });\n },\n }));\n\n return store;\n};\n"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -19,7 +19,7 @@ import { useMessageTiming } from "./hooks/useMessageTiming.js";
19
19
  import { useToolCallElapsed } from "./hooks/useToolCallElapsed.js";
20
20
  import { CloudFileAttachmentAdapter } from "./legacy-runtime/runtime-cores/adapters/attachment/CloudFileAttachmentAdapter.js";
21
21
  import { useExternalStoreRuntime } from "./legacy-runtime/runtime-cores/external-store/useExternalStoreRuntime.js";
22
- import { convertExternalMessages, useExternalMessageConverter } from "./legacy-runtime/runtime-cores/external-store/external-message-converter.js";
22
+ import { ExternalMessageConversionCache, convertExternalMessages, createExternalMessageConversionCache, useExternalMessageConverter } from "./legacy-runtime/runtime-cores/external-store/external-message-converter.js";
23
23
  import { createMessageConverter } from "./legacy-runtime/runtime-cores/external-store/createMessageConverter.js";
24
24
  import { useLocalRuntime } from "./legacy-runtime/runtime-cores/local/useLocalRuntime.js";
25
25
  import { LocalRuntimeOptions } from "./legacy-runtime/runtime-cores/local/LocalRuntimeOptions.js";
@@ -74,9 +74,9 @@ import { Unstable_WebMcpProviderOptions, Unstable_WebMcpProviderResult, unstable
74
74
  import { defaultWebMcpFilter } from "./unstable/webmcp/convertTools.js";
75
75
  import { AssistantContextConfig, AssistantDataUI, AssistantDataUIProps, AssistantInteractableProps, AssistantTool, AssistantToolProps, AssistantToolUI, AssistantToolUIProps, DataMessagePartComponent, DataMessagePartProps, DataRenderers, EmptyMessagePartComponent, EmptyMessagePartProps, EnrichedPartState, FileMessagePartComponent, FileMessagePartProps, GenerativeUIComponentRegistry, GenerativeUIMessagePartComponent, GenerativeUIMessagePartProps, GenerativeUIRender, GenerativeUIRenderError, GenerativeUIRenderProps, GroupByContext, ImageMessagePartComponent, ImageMessagePartProps, Interactables, McpAppResourceOutput, McpToolkitDefinition, McpToolkitEntry, McpToolkitToolConfig, PartState, ProviderToolConfig, QuoteMessagePartComponent, QuoteMessagePartProps, ReasoningGroupComponent, ReasoningGroupProps, ReasoningMessagePartComponent, ReasoningMessagePartProps, RuntimeAdapterProvider, RuntimeAdapters, SourceMessagePartComponent, SourceMessagePartProps, TextMessagePartComponent, TextMessagePartProps, ToolArgsStatus, ToolCallMessagePartComponent, ToolCallMessagePartProps, ToolCallText, ToolDefinition, Toolkit, ToolkitDefinition, ToolkitDefinitionEntry, Tools, Unstable_AudioMessagePartComponent, Unstable_AudioMessagePartProps, Unstable_InferInteractableState, Unstable_InteractableConfig, Unstable_InteractableDefinition, Unstable_InteractablePersistedState, Unstable_InteractablePersistenceAdapter, Unstable_InteractablePersistenceStatus, Unstable_InteractableRegistration, Unstable_InteractableStateSchema, Unstable_InteractableToolConfig, Unstable_InteractableToolRenderProps, Unstable_InteractableVersionInfo, Unstable_InteractablesClientSchema, Unstable_InteractablesConfig, Unstable_InteractablesMethods, Unstable_InteractablesState, defineMcpToolkit, defineToolkit, externalTool, groupPartByType, hitl, hitlTool, humanTool, makeAssistantDataUI, makeAssistantTool, makeAssistantToolUI, providerTool, stubTool, unstable_Interactables, unstable_interactableTool, unstable_useInteractable, unstable_useInteractableState, unstable_useInteractableVersions, unstable_useThreadMessageIds, useAssistantContext, useAssistantDataUI, useAssistantInstructions, useAssistantInteractable, useAssistantTool, useAssistantToolUI, useAuiToolOverrides, useCloudThreadListRuntime, useExternalStoreSharedOptions, useInlineRender, useInteractableState, useRuntimeAdapters, useToolArgsStatus, useVoiceControls, useVoiceState, useVoiceVolume } from "@assistant-ui/core/react";
76
76
  import { AssistantClient, AssistantEventCallback, AssistantEventName, AssistantEventPayload, AssistantEventScope, AssistantEventSelector, AssistantState, AuiConfig, AuiIf, AuiProvider, useAui, useAuiEvent, useAuiState } from "@assistant-ui/store";
77
- import { AddToolResultOptions, AppendMessage, AssistantFrameHost, AssistantFrameProvider, AssistantRuntime, Attachment, AttachmentAdapter, AttachmentRuntime, AttachmentState, AttachmentStatus, ChatModelAdapter, ChatModelRunOptions, ChatModelRunResult, ChatModelRunUpdate, CompleteAttachment, ComposerRuntime, ComposerState, CompositeAttachmentAdapter, CreateAppendMessage, CreateAttachment, CreateResumeRunConfig, CreateStartRunConfig, CreateSuggestionAdapterOptions, DataMessagePart, DictationAdapter, DictationState, EditComposerRuntime, EditComposerState, ExportedMessageRepository, ExportedMessageRepositoryItem, ExternalStoreAdapter, ExternalStoreBranchChange, ExternalStoreMessageConverter, ExternalStoreSharedOptions, ExternalStoreThreadData, ExternalStoreThreadListAdapter, ExternalThreadBranchAdapter, ExternalThreadQueueAdapter, FRAME_MESSAGE_CHANNEL, FeedbackAdapter, FileMessagePart, FrameMessage, FrameMessageType, GenerativeUIMessagePart, GenerativeUINode, GenerativeUISpec, GenericThreadHistoryAdapter, ImageMessagePart, InMemoryThreadListAdapter, LanguageModelConfig, LanguageModelV1CallSettings, LocalRuntimeOptionsBase, MessageFormatAdapter, MessageFormatItem, MessageFormatRepository, MessageNotSentError, MessagePartRuntime, MessagePartState, MessagePartStatus, MessagePartStreamStatus, MessageQueueController, MessageQueueDriver, MessageRuntime, MessageState, MessageStatus, MessageStorageEntry, MessageTiming, ModelContext, ModelContextProvider, ModelContextRegistry, ModelContextRegistryInstructionHandle, ModelContextRegistryProviderHandle, ModelContextRegistryToolHandle, PartProviderMetadata, PendingAttachment, QuoteInfo, RealtimeVoiceAdapter, ReasoningMessagePart, RemoteThreadListAdapter, RemoteThreadListProviderComponent, RespondToToolApprovalOptions, SerializedModelContext, SerializedTool, SimpleImageAttachmentAdapter, SimpleTextAttachmentAdapter, SourceMessagePart, SourceProviderMetadata, SpeechSynthesisAdapter, SubmitFeedbackOptions, SuggestionAdapter, SuggestionAdapterGenerateOptions, TextMessagePart, ThreadAssistantMessage, ThreadAssistantMessagePart, ThreadComposerRuntime, ThreadComposerState, ThreadHistoryAdapter, ThreadListItemRuntime, ThreadListItemState, ThreadListItemStatus, ThreadListRuntime, ThreadListState, ThreadMessage, ThreadMessageLike, ThreadRuntime, ThreadState, ThreadSuggestion, ThreadSystemMessage, ThreadUserMessage, ThreadUserMessagePart, ToolApprovalDisplay, ToolApprovalOption, ToolApprovalOptionKind, ToolApprovalResponse, ToolCallMessagePart, ToolCallMessagePartStatus, ToolCallTiming, ToolModelContentPart, Unstable_AudioMessagePart, Unstable_DirectiveFormatter, Unstable_DirectiveSegment, Unstable_InteractableSnapshotEntry, Unstable_InteractableVersion, Unstable_TriggerItem, Unsubscribe, VoiceSessionControls, VoiceSessionHelpers, VoiceSessionState, WebSpeechDictationAdapter, WebSpeechSynthesisAdapter, bindExternalStoreMessage, createMessageQueue, createSuggestionAdapter, createVoiceSession, fromThreadMessageLike, generateId, getExternalStoreMessages, isMessageNotSentError, mergeModelContexts, pickExternalStoreSharedOptions, tool, toolApprovalAcceptsText, unstable_defaultDirectiveFormatter, unstable_formatInteractableSnapshot, unstable_getInteractableSnapshots, unstable_getInteractableVersions } from "@assistant-ui/core";
77
+ import { AddToolResultOptions, AppendMessage, AssistantFrameHost, AssistantFrameProvider, AssistantRuntime, Attachment, AttachmentAdapter, AttachmentRuntime, AttachmentState, AttachmentStatus, ChatModelAdapter, ChatModelRunOptions, ChatModelRunResult, ChatModelRunUpdate, CompleteAttachment, ComposerRuntime, ComposerState, CompositeAttachmentAdapter, CreateAppendMessage, CreateAttachment, CreateResumeRunConfig, CreateStartRunConfig, CreateSuggestionAdapterOptions, DataMessagePart, DictationAdapter, DictationState, EditComposerRuntime, EditComposerState, ExportedMessageRepository, ExportedMessageRepositoryItem, ExternalStoreAdapter, ExternalStoreBranchChange, ExternalStoreMessageConverter, ExternalStoreSharedOptions, ExternalStoreThreadData, ExternalStoreThreadListAdapter, ExternalThreadBranchAdapter, ExternalThreadQueueAdapter, FRAME_MESSAGE_CHANNEL, FeedbackAdapter, FileMessagePart, FrameMessage, FrameMessageType, GenerativeUIMessagePart, GenerativeUINode, GenerativeUISpec, GenericThreadHistoryAdapter, ImageMessagePart, InMemoryThreadListAdapter, LanguageModelConfig, LanguageModelV1CallSettings, LocalRuntimeOptionsBase, MessageFormatAdapter, MessageFormatItem, MessageFormatRepository, MessageModality, MessageNotSentError, MessagePartRuntime, MessagePartState, MessagePartStatus, MessagePartStreamStatus, MessageQueueController, MessageQueueDriver, MessageRuntime, MessageState, MessageStatus, MessageStorageEntry, MessageTiming, ModelContext, ModelContextProvider, ModelContextRegistry, ModelContextRegistryInstructionHandle, ModelContextRegistryProviderHandle, ModelContextRegistryToolHandle, PartProviderMetadata, PendingAttachment, QuoteInfo, RealtimeVoiceAdapter, ReasoningMessagePart, RemoteThreadListAdapter, RemoteThreadListProviderComponent, RespondToToolApprovalOptions, SerializedModelContext, SerializedTool, SimpleImageAttachmentAdapter, SimpleTextAttachmentAdapter, SourceMessagePart, SourceProviderMetadata, SpeechSynthesisAdapter, SubmitFeedbackOptions, SuggestionAdapter, SuggestionAdapterGenerateOptions, TextMessagePart, ThreadAssistantMessage, ThreadAssistantMessagePart, ThreadComposerRuntime, ThreadComposerState, ThreadHistoryAdapter, ThreadListItemRuntime, ThreadListItemState, ThreadListItemStatus, ThreadListRuntime, ThreadListState, ThreadMessage, ThreadMessageLike, ThreadRuntime, ThreadState, ThreadSuggestion, ThreadSystemMessage, ThreadUserMessage, ThreadUserMessagePart, ToolApprovalDisplay, ToolApprovalOption, ToolApprovalOptionKind, ToolApprovalResponse, ToolCallMessagePart, ToolCallMessagePartStatus, ToolCallTiming, ToolModelContentPart, Unstable_AudioMessagePart, Unstable_DirectiveFormatter, Unstable_DirectiveSegment, Unstable_InteractableSnapshotEntry, Unstable_InteractableVersion, Unstable_TriggerItem, Unsubscribe, VoiceSessionControls, VoiceSessionHelpers, VoiceSessionState, WebSpeechDictationAdapter, WebSpeechSynthesisAdapter, bindExternalStoreMessage, createMessageQueue, createSuggestionAdapter, createVoiceSession, fromThreadMessageLike, generateId, getExternalStoreMessages, isMessageNotSentError, mergeModelContexts, pickExternalStoreSharedOptions, tool, toolApprovalAcceptsText, unstable_defaultDirectiveFormatter, unstable_formatInteractableSnapshot, unstable_getInteractableSnapshots, unstable_getInteractableVersions } from "@assistant-ui/core";
78
78
  import { AssistantCloud, readAnonymousRefreshToken } from "assistant-cloud";
79
- import { ChainOfThoughtClient, ComposerSendOptions, ExternalThread, ExternalThreadMessage, ExternalThreadProps, InMemoryThreadList, InMemoryThreadListProps, ModelContext as ModelContextClient, QueueItemMethods, QueueItemState, RemoteThreadList, RemoteThreadListProps, SingleThreadList, SuggestionConfig, Suggestions } from "@assistant-ui/core/store";
79
+ import { ChainOfThoughtClient, ComposerSendOptions, ExternalThread, ExternalThreadMessage, ExternalThreadProps, InMemoryThreadList, InMemoryThreadListProps, ModelContext as ModelContextClient, QueueItemMethods, QueueItemState, RemoteThreadList, RemoteThreadListProps, SingleThreadList, SuggestionConfig, Suggestions, TaskMethods, TaskState } from "@assistant-ui/core/store";
80
80
  import { ShimLoadError, ShimLoadErrorCode } from "safe-content-frame";
81
81
  import { Tool } from "assistant-stream";
82
- export { actionBarMore_d_exports as ActionBarMorePrimitive, actionBar_d_exports as ActionBarPrimitive, type AddToolResultOptions, type AppendMessage, type Assistant, type AssistantClient, AssistantCloud, type AssistantContextConfig, type AssistantDataUI, type AssistantDataUIProps, type AssistantEventCallback, type AssistantEventName, type AssistantEventPayload, type AssistantEventScope, type AssistantEventSelector, AssistantFrameHost, AssistantFrameProvider, type AssistantInteractableProps, assistantModal_d_exports as AssistantModalPrimitive, type AssistantRuntime, AssistantRuntimeProvider, type AssistantState, type AssistantTool, type AssistantToolProps, type AssistantToolUI, type AssistantToolUIProps, type AssistantTransportCommand, type AssistantTransportConnectionMetadata, type AssistantTransportProtocol, type Attachment, type AttachmentAdapter, attachment_d_exports as AttachmentPrimitive, type AttachmentRuntime, type AttachmentState, type AttachmentStatus, AuiConfig, AuiIf, AuiProvider, branchPicker_d_exports as BranchPickerPrimitive, ChainOfThoughtByIndicesProvider, ChainOfThoughtClient, chainOfThought_d_exports as ChainOfThoughtPrimitive, type ChatModelAdapter, type ChatModelRunOptions, type ChatModelRunResult, type ChatModelRunUpdate, CloudFileAttachmentAdapter, type CompleteAttachment, ComposerAttachmentByIndexProvider, composer_d_exports as ComposerPrimitive, type ComposerRuntime, type ComposerSendOptions, type ComposerState, CompositeAttachmentAdapter, type CreateAppendMessage, type CreateAttachment, type CreateResumeRunConfig, type CreateStartRunConfig, type CreateSuggestionAdapterOptions, type DataMessagePart, type DataMessagePartComponent, type DataMessagePartProps, DataRenderers, DevToolsHooks, DevToolsProviderApi, type DictationAdapter, type DictationState, type EditComposerRuntime, type EditComposerState, type EmptyMessagePartComponent, type EmptyMessagePartProps, type EnrichedPartState, error_d_exports as ErrorPrimitive, ExportedMessageRepository, type ExportedMessageRepositoryItem, type ExternalStoreAdapter, type ExternalStoreBranchChange, type ExternalStoreMessageConverter, type ExternalStoreSharedOptions, type ExternalStoreThreadData, type ExternalStoreThreadListAdapter, ExternalThread, type ExternalThreadBranchAdapter, type ExternalThreadMessage, type ExternalThreadProps, type ExternalThreadQueueAdapter, FRAME_MESSAGE_CHANNEL, type FeedbackAdapter, type FileMessagePart, type FileMessagePartComponent, type FileMessagePartProps, type FrameMessage, type FrameMessageType, type GenerativeUIComponentRegistry, type GenerativeUIMessagePart, type GenerativeUIMessagePartComponent, type GenerativeUIMessagePartProps, type GenerativeUINode, GenerativeUIRender, GenerativeUIRenderError, type GenerativeUIRenderProps, type GenerativeUISpec, type GenericThreadHistoryAdapter, type GroupByContext, internal_d_exports as INTERNAL, type ImageMessagePart, type ImageMessagePartComponent, type ImageMessagePartProps, InMemoryThreadList, InMemoryThreadListAdapter, type InMemoryThreadListProps, Interactables, type LanguageModelConfig, type LanguageModelV1CallSettings, type LocalRuntimeOptions, type LocalRuntimeOptionsBase, type McpAppBridgeHandlers, type McpAppDisplayMode, type McpAppHostContext, type McpAppHostInfo, type McpAppMetadata, type McpAppPartOptions, McpAppRenderer, type McpAppRendererOptions, type McpAppResource, type McpAppResourceCSP, type McpAppResourceMeta, type McpAppResourceOutput, type McpAppSandboxConfig, type McpAppToolCallParams, type McpAppsHost, McpAppsRemoteHost, type McpAppsRemoteHostOptions, type McpToolkitDefinition, type McpToolkitEntry, type McpToolkitToolConfig, MessageAttachmentByIndexProvider, MessageByIndexProvider, type MessageFormatAdapter, type MessageFormatItem, type MessageFormatRepository, MessageNotSentError, messagePart_d_exports as MessagePartPrimitive, type MessagePartRuntime, type MessagePartState, type MessagePartStatus, type MessagePartStreamStatus, message_d_exports as MessagePrimitive, MessageProvider, type MessageQueueController, type MessageQueueDriver, type MessageRuntime, type MessageState, type MessageStatus, type MessageStorageEntry, type MessageTiming, type ModelContext, ModelContextClient, type ModelContextProvider, ModelContextRegistry, type ModelContextRegistryInstructionHandle, type ModelContextRegistryProviderHandle, type ModelContextRegistryToolHandle, PartByIndexProvider, type PartProviderMetadata, type PartState, type PendingAttachment, type ProviderToolConfig, type QueueItemMethods, queueItem_d_exports as QueueItemPrimitive, type QueueItemState, type QuoteInfo, type QuoteMessagePartComponent, type QuoteMessagePartProps, ReadonlyThreadProvider, type RealtimeVoiceAdapter, type ReasoningGroupComponent, type ReasoningGroupProps, type ReasoningMessagePart, type ReasoningMessagePartComponent, type ReasoningMessagePartProps, RemoteThreadList, type RemoteThreadListAdapter, type RemoteThreadListProps, type RemoteThreadListProviderComponent, type RespondToToolApprovalOptions, RuntimeAdapterProvider, type RuntimeAdapters, selectionToolbar_d_exports as SelectionToolbarPrimitive, type SendCommandsRequestBody, type SerializedModelContext, type SerializedTool, type ShimLoadError, type ShimLoadErrorCode, SimpleImageAttachmentAdapter, SimpleTextAttachmentAdapter, SingleThreadList, type SmoothOptions, type SourceMessagePart, type SourceMessagePartComponent, type SourceMessagePartProps, type SourceProviderMetadata, type SpeechSynthesisAdapter, type SubmitFeedbackOptions, type SuggestionAdapter, type SuggestionAdapterGenerateOptions, SuggestionByIndexProvider, type SuggestionConfig, suggestion_d_exports as SuggestionPrimitive, Suggestions, type TextMessagePart, type TextMessagePartComponent, type TextMessagePartProps, TextMessagePartProvider, type ThreadAssistantMessage, type ThreadAssistantMessagePart, type ThreadComposerRuntime, type ThreadComposerState, type ThreadHistoryAdapter, ThreadListItemByIndexProvider, threadListItemMore_d_exports as ThreadListItemMorePrimitive, threadListItem_d_exports as ThreadListItemPrimitive, type ThreadListItemRuntime, ThreadListItemRuntimeProvider, type ThreadListItemState, type ThreadListItemStatus, threadList_d_exports as ThreadListPrimitive, type ThreadListRuntime, type ThreadListState, type ThreadMessage, type ThreadMessageLike, thread_d_exports as ThreadPrimitive, type ThreadRuntime, type ThreadState, type ThreadSuggestion, type ThreadSystemMessage, type ThreadUserMessage, type ThreadUserMessagePart, type ThreadViewportState, type Tool, type ToolApprovalDisplay, type ToolApprovalOption, type ToolApprovalOptionKind, type ToolApprovalResponse, type ToolArgsStatus, type ToolCallMessagePart, type ToolCallMessagePartComponent, type ToolCallMessagePartMcpMetadata, type ToolCallMessagePartProps, type ToolCallMessagePartStatus, type ToolCallText, type ToolCallTiming, type ToolDefinition, type ToolExecutionStatus, type ToolModelContentPart, type Toolkit, type ToolkitDefinition, type ToolkitDefinitionEntry, Tools, type Unstable_AudioMessagePart, type Unstable_AudioMessagePartComponent, type Unstable_AudioMessagePartProps, type Unstable_ComposerInput, type Unstable_ComposerInputHistory, type Unstable_DirectiveFormatter, type Unstable_DirectiveSegment, type Unstable_IconComponent, type Unstable_InferInteractableState, type Unstable_InteractableConfig, type Unstable_InteractableDefinition, type Unstable_InteractablePersistedState, type Unstable_InteractablePersistenceAdapter, type Unstable_InteractablePersistenceStatus, type Unstable_InteractableRegistration, type Unstable_InteractableSnapshotEntry, type Unstable_InteractableStateSchema, type Unstable_InteractableToolConfig, type Unstable_InteractableToolRenderProps, type Unstable_InteractableVersion, type Unstable_InteractableVersionInfo, type Unstable_InteractablesClientSchema, type Unstable_InteractablesConfig, type Unstable_InteractablesMethods, type Unstable_InteractablesState, type Unstable_Mention, type Unstable_MentionCategory, type Unstable_MentionDirective, type Unstable_MessageStallDetection, type Unstable_MessageStallDetectionOptions, type Unstable_ModelContextToolsOptions, type RegisteredTrigger as Unstable_RegisteredTrigger, type Unstable_SlashCommand, type Unstable_SlashCommandAction, type TriggerBehavior as Unstable_TriggerBehavior, type Unstable_TriggerItem, type TriggerMatch as Unstable_TriggerMatch, type TriggerMatcher as Unstable_TriggerMatcher, type Unstable_TriggerPopoverAriaProps, type Unstable_UseComposerInputOptions, type Unstable_UseLiveCompletionAdapterOptions, type Unstable_UseMentionAdapterOptions, type Unstable_UseSlashCommandAdapterOptions, type Unstable_WebMcpProviderOptions, type Unstable_WebMcpProviderResult, type Unsubscribe, type VoiceSessionControls, type VoiceSessionHelpers, type VoiceSessionState, WebSpeechDictationAdapter, WebSpeechSynthesisAdapter, bindExternalStoreMessage, createMessageQueue, createSuggestionAdapter, createVoiceSession, defineMcpToolkit, defineToolkit, externalTool, fromThreadMessageLike, generateId, getExternalStoreMessages, getMcpAppFromToolPart, groupPartByType, hitl, hitlTool, humanTool, isMessageNotSentError, makeAssistantDataUI, makeAssistantTool, makeAssistantToolUI, makeAssistantVisible, mergeModelContexts, pickExternalStoreSharedOptions, providerTool, readAnonymousRefreshToken, stubTool, tool, toolApprovalAcceptsText, unstable_Interactables, convertExternalMessages as unstable_convertExternalMessages, createMessageConverter as unstable_createMessageConverter, unstable_defaultDirectiveFormatter, defaultWebMcpFilter as unstable_defaultWebMcpFilter, unstable_formatInteractableSnapshot, unstable_getInteractableSnapshots, unstable_getInteractableVersions, unstable_interactableTool, unstable_useComposerInput, unstable_useComposerInputHistory, unstable_useInteractable, unstable_useInteractableState, unstable_useInteractableVersions, unstable_useLiveCompletionAdapter, unstable_useMentionAdapter, unstable_useMessageStallDetection, unstable_useSlashCommandAdapter, unstable_useThreadMessageIds, unstable_useTriggerPopoverAriaProps, useTriggerPopoverRootContext as unstable_useTriggerPopoverRootContext, useTriggerPopoverRootContextOptional as unstable_useTriggerPopoverRootContextOptional, useTriggerPopoverScopeContext as unstable_useTriggerPopoverScopeContext, useTriggerPopoverScopeContextOptional as unstable_useTriggerPopoverScopeContextOptional, useTriggerPopoverTriggers as unstable_useTriggerPopoverTriggers, useTriggerPopoverTriggersOptional as unstable_useTriggerPopoverTriggersOptional, unstable_useWebMcpProvider, useAssistantContext, useAssistantDataUI, useAssistantFrameHost, useAssistantInstructions, useAssistantInteractable, useAssistantTool, useAssistantToolUI, useAssistantTransportRuntime, useAssistantTransportSendCommand, useAssistantTransportState, useAui, useAuiEvent, useAuiState, useAuiToolOverrides, useCloudThreadListAdapter, useCloudThreadListRuntime, useExternalMessageConverter, useExternalStoreRuntime, useExternalStoreSharedOptions, useInlineRender, useInteractableState, useLocalRuntime, useMessagePartData, useMessagePartFile, useMessagePartImage, useMessagePartReasoning, useMessagePartSource, useMessagePartText, useMessageQuote, useMessageTiming, useRemoteThreadListRuntime, useRuntimeAdapters, useScrollLock, useSmooth, useThreadViewport, useThreadViewportAutoScroll, useThreadViewportStore, useToolArgsStatus, useToolCallElapsed, useVoiceControls, useVoiceState, useVoiceVolume };
82
+ export { actionBarMore_d_exports as ActionBarMorePrimitive, actionBar_d_exports as ActionBarPrimitive, type AddToolResultOptions, type AppendMessage, type Assistant, type AssistantClient, AssistantCloud, type AssistantContextConfig, type AssistantDataUI, type AssistantDataUIProps, type AssistantEventCallback, type AssistantEventName, type AssistantEventPayload, type AssistantEventScope, type AssistantEventSelector, AssistantFrameHost, AssistantFrameProvider, type AssistantInteractableProps, assistantModal_d_exports as AssistantModalPrimitive, type AssistantRuntime, AssistantRuntimeProvider, type AssistantState, type AssistantTool, type AssistantToolProps, type AssistantToolUI, type AssistantToolUIProps, type AssistantTransportCommand, type AssistantTransportConnectionMetadata, type AssistantTransportProtocol, type Attachment, type AttachmentAdapter, attachment_d_exports as AttachmentPrimitive, type AttachmentRuntime, type AttachmentState, type AttachmentStatus, AuiConfig, AuiIf, AuiProvider, branchPicker_d_exports as BranchPickerPrimitive, ChainOfThoughtByIndicesProvider, ChainOfThoughtClient, chainOfThought_d_exports as ChainOfThoughtPrimitive, type ChatModelAdapter, type ChatModelRunOptions, type ChatModelRunResult, type ChatModelRunUpdate, CloudFileAttachmentAdapter, type CompleteAttachment, ComposerAttachmentByIndexProvider, composer_d_exports as ComposerPrimitive, type ComposerRuntime, type ComposerSendOptions, type ComposerState, CompositeAttachmentAdapter, type CreateAppendMessage, type CreateAttachment, type CreateResumeRunConfig, type CreateStartRunConfig, type CreateSuggestionAdapterOptions, type DataMessagePart, type DataMessagePartComponent, type DataMessagePartProps, DataRenderers, DevToolsHooks, DevToolsProviderApi, type DictationAdapter, type DictationState, type EditComposerRuntime, type EditComposerState, type EmptyMessagePartComponent, type EmptyMessagePartProps, type EnrichedPartState, error_d_exports as ErrorPrimitive, ExportedMessageRepository, type ExportedMessageRepositoryItem, type ExternalStoreAdapter, type ExternalStoreBranchChange, type ExternalStoreMessageConverter, type ExternalStoreSharedOptions, type ExternalStoreThreadData, type ExternalStoreThreadListAdapter, ExternalThread, type ExternalThreadBranchAdapter, type ExternalThreadMessage, type ExternalThreadProps, type ExternalThreadQueueAdapter, FRAME_MESSAGE_CHANNEL, type FeedbackAdapter, type FileMessagePart, type FileMessagePartComponent, type FileMessagePartProps, type FrameMessage, type FrameMessageType, type GenerativeUIComponentRegistry, type GenerativeUIMessagePart, type GenerativeUIMessagePartComponent, type GenerativeUIMessagePartProps, type GenerativeUINode, GenerativeUIRender, GenerativeUIRenderError, type GenerativeUIRenderProps, type GenerativeUISpec, type GenericThreadHistoryAdapter, type GroupByContext, internal_d_exports as INTERNAL, type ImageMessagePart, type ImageMessagePartComponent, type ImageMessagePartProps, InMemoryThreadList, InMemoryThreadListAdapter, type InMemoryThreadListProps, Interactables, type LanguageModelConfig, type LanguageModelV1CallSettings, type LocalRuntimeOptions, type LocalRuntimeOptionsBase, type McpAppBridgeHandlers, type McpAppDisplayMode, type McpAppHostContext, type McpAppHostInfo, type McpAppMetadata, type McpAppPartOptions, McpAppRenderer, type McpAppRendererOptions, type McpAppResource, type McpAppResourceCSP, type McpAppResourceMeta, type McpAppResourceOutput, type McpAppSandboxConfig, type McpAppToolCallParams, type McpAppsHost, McpAppsRemoteHost, type McpAppsRemoteHostOptions, type McpToolkitDefinition, type McpToolkitEntry, type McpToolkitToolConfig, MessageAttachmentByIndexProvider, MessageByIndexProvider, type MessageFormatAdapter, type MessageFormatItem, type MessageFormatRepository, type MessageModality, MessageNotSentError, messagePart_d_exports as MessagePartPrimitive, type MessagePartRuntime, type MessagePartState, type MessagePartStatus, type MessagePartStreamStatus, message_d_exports as MessagePrimitive, MessageProvider, type MessageQueueController, type MessageQueueDriver, type MessageRuntime, type MessageState, type MessageStatus, type MessageStorageEntry, type MessageTiming, type ModelContext, ModelContextClient, type ModelContextProvider, ModelContextRegistry, type ModelContextRegistryInstructionHandle, type ModelContextRegistryProviderHandle, type ModelContextRegistryToolHandle, PartByIndexProvider, type PartProviderMetadata, type PartState, type PendingAttachment, type ProviderToolConfig, type QueueItemMethods, queueItem_d_exports as QueueItemPrimitive, type QueueItemState, type QuoteInfo, type QuoteMessagePartComponent, type QuoteMessagePartProps, ReadonlyThreadProvider, type RealtimeVoiceAdapter, type ReasoningGroupComponent, type ReasoningGroupProps, type ReasoningMessagePart, type ReasoningMessagePartComponent, type ReasoningMessagePartProps, RemoteThreadList, type RemoteThreadListAdapter, type RemoteThreadListProps, type RemoteThreadListProviderComponent, type RespondToToolApprovalOptions, RuntimeAdapterProvider, type RuntimeAdapters, selectionToolbar_d_exports as SelectionToolbarPrimitive, type SendCommandsRequestBody, type SerializedModelContext, type SerializedTool, type ShimLoadError, type ShimLoadErrorCode, SimpleImageAttachmentAdapter, SimpleTextAttachmentAdapter, SingleThreadList, type SmoothOptions, type SourceMessagePart, type SourceMessagePartComponent, type SourceMessagePartProps, type SourceProviderMetadata, type SpeechSynthesisAdapter, type SubmitFeedbackOptions, type SuggestionAdapter, type SuggestionAdapterGenerateOptions, SuggestionByIndexProvider, type SuggestionConfig, suggestion_d_exports as SuggestionPrimitive, Suggestions, type TaskMethods, type TaskState, type TextMessagePart, type TextMessagePartComponent, type TextMessagePartProps, TextMessagePartProvider, type ThreadAssistantMessage, type ThreadAssistantMessagePart, type ThreadComposerRuntime, type ThreadComposerState, type ThreadHistoryAdapter, ThreadListItemByIndexProvider, threadListItemMore_d_exports as ThreadListItemMorePrimitive, threadListItem_d_exports as ThreadListItemPrimitive, type ThreadListItemRuntime, ThreadListItemRuntimeProvider, type ThreadListItemState, type ThreadListItemStatus, threadList_d_exports as ThreadListPrimitive, type ThreadListRuntime, type ThreadListState, type ThreadMessage, type ThreadMessageLike, thread_d_exports as ThreadPrimitive, type ThreadRuntime, type ThreadState, type ThreadSuggestion, type ThreadSystemMessage, type ThreadUserMessage, type ThreadUserMessagePart, type ThreadViewportState, type Tool, type ToolApprovalDisplay, type ToolApprovalOption, type ToolApprovalOptionKind, type ToolApprovalResponse, type ToolArgsStatus, type ToolCallMessagePart, type ToolCallMessagePartComponent, type ToolCallMessagePartMcpMetadata, type ToolCallMessagePartProps, type ToolCallMessagePartStatus, type ToolCallText, type ToolCallTiming, type ToolDefinition, type ToolExecutionStatus, type ToolModelContentPart, type Toolkit, type ToolkitDefinition, type ToolkitDefinitionEntry, Tools, type Unstable_AudioMessagePart, type Unstable_AudioMessagePartComponent, type Unstable_AudioMessagePartProps, type Unstable_ComposerInput, type Unstable_ComposerInputHistory, type Unstable_DirectiveFormatter, type Unstable_DirectiveSegment, type ExternalMessageConversionCache as Unstable_ExternalMessageConversionCache, type Unstable_IconComponent, type Unstable_InferInteractableState, type Unstable_InteractableConfig, type Unstable_InteractableDefinition, type Unstable_InteractablePersistedState, type Unstable_InteractablePersistenceAdapter, type Unstable_InteractablePersistenceStatus, type Unstable_InteractableRegistration, type Unstable_InteractableSnapshotEntry, type Unstable_InteractableStateSchema, type Unstable_InteractableToolConfig, type Unstable_InteractableToolRenderProps, type Unstable_InteractableVersion, type Unstable_InteractableVersionInfo, type Unstable_InteractablesClientSchema, type Unstable_InteractablesConfig, type Unstable_InteractablesMethods, type Unstable_InteractablesState, type Unstable_Mention, type Unstable_MentionCategory, type Unstable_MentionDirective, type Unstable_MessageStallDetection, type Unstable_MessageStallDetectionOptions, type Unstable_ModelContextToolsOptions, type RegisteredTrigger as Unstable_RegisteredTrigger, type Unstable_SlashCommand, type Unstable_SlashCommandAction, type TriggerBehavior as Unstable_TriggerBehavior, type Unstable_TriggerItem, type TriggerMatch as Unstable_TriggerMatch, type TriggerMatcher as Unstable_TriggerMatcher, type Unstable_TriggerPopoverAriaProps, type Unstable_UseComposerInputOptions, type Unstable_UseLiveCompletionAdapterOptions, type Unstable_UseMentionAdapterOptions, type Unstable_UseSlashCommandAdapterOptions, type Unstable_WebMcpProviderOptions, type Unstable_WebMcpProviderResult, type Unsubscribe, type VoiceSessionControls, type VoiceSessionHelpers, type VoiceSessionState, WebSpeechDictationAdapter, WebSpeechSynthesisAdapter, bindExternalStoreMessage, createMessageQueue, createSuggestionAdapter, createVoiceSession, defineMcpToolkit, defineToolkit, externalTool, fromThreadMessageLike, generateId, getExternalStoreMessages, getMcpAppFromToolPart, groupPartByType, hitl, hitlTool, humanTool, isMessageNotSentError, makeAssistantDataUI, makeAssistantTool, makeAssistantToolUI, makeAssistantVisible, mergeModelContexts, pickExternalStoreSharedOptions, providerTool, readAnonymousRefreshToken, stubTool, tool, toolApprovalAcceptsText, unstable_Interactables, convertExternalMessages as unstable_convertExternalMessages, createExternalMessageConversionCache as unstable_createExternalMessageConversionCache, createMessageConverter as unstable_createMessageConverter, unstable_defaultDirectiveFormatter, defaultWebMcpFilter as unstable_defaultWebMcpFilter, unstable_formatInteractableSnapshot, unstable_getInteractableSnapshots, unstable_getInteractableVersions, unstable_interactableTool, unstable_useComposerInput, unstable_useComposerInputHistory, unstable_useInteractable, unstable_useInteractableState, unstable_useInteractableVersions, unstable_useLiveCompletionAdapter, unstable_useMentionAdapter, unstable_useMessageStallDetection, unstable_useSlashCommandAdapter, unstable_useThreadMessageIds, unstable_useTriggerPopoverAriaProps, useTriggerPopoverRootContext as unstable_useTriggerPopoverRootContext, useTriggerPopoverRootContextOptional as unstable_useTriggerPopoverRootContextOptional, useTriggerPopoverScopeContext as unstable_useTriggerPopoverScopeContext, useTriggerPopoverScopeContextOptional as unstable_useTriggerPopoverScopeContextOptional, useTriggerPopoverTriggers as unstable_useTriggerPopoverTriggers, useTriggerPopoverTriggersOptional as unstable_useTriggerPopoverTriggersOptional, unstable_useWebMcpProvider, useAssistantContext, useAssistantDataUI, useAssistantFrameHost, useAssistantInstructions, useAssistantInteractable, useAssistantTool, useAssistantToolUI, useAssistantTransportRuntime, useAssistantTransportSendCommand, useAssistantTransportState, useAui, useAuiEvent, useAuiState, useAuiToolOverrides, useCloudThreadListAdapter, useCloudThreadListRuntime, useExternalMessageConverter, useExternalStoreRuntime, useExternalStoreSharedOptions, useInlineRender, useInteractableState, useLocalRuntime, useMessagePartData, useMessagePartFile, useMessagePartImage, useMessagePartReasoning, useMessagePartSource, useMessagePartText, useMessageQuote, useMessageTiming, useRemoteThreadListRuntime, useRuntimeAdapters, useScrollLock, useSmooth, useThreadViewport, useThreadViewportAutoScroll, useThreadViewportStore, useToolArgsStatus, useToolCallElapsed, useVoiceControls, useVoiceState, useVoiceVolume };
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { useAssistantTransportRuntime, useAssistantTransportSendCommand, useAssistantTransportState } from "./assistant-transport.js";
2
2
  import { CloudFileAttachmentAdapter } from "./legacy-runtime/runtime-cores/adapters/attachment/CloudFileAttachmentAdapter.js";
3
3
  import { useExternalStoreRuntime } from "./legacy-runtime/runtime-cores/external-store/useExternalStoreRuntime.js";
4
- import { convertExternalMessages, useExternalMessageConverter } from "./legacy-runtime/runtime-cores/external-store/external-message-converter.js";
4
+ import { convertExternalMessages, createExternalMessageConversionCache, useExternalMessageConverter } from "./legacy-runtime/runtime-cores/external-store/external-message-converter.js";
5
5
  import { createMessageConverter } from "./legacy-runtime/runtime-cores/external-store/createMessageConverter.js";
6
6
  import { useLocalRuntime } from "./legacy-runtime/runtime-cores/local/useLocalRuntime.js";
7
7
  import { useRemoteThreadListRuntime } from "./legacy-runtime/runtime-cores/remote-thread-list/useRemoteThreadListRuntime.js";
@@ -68,4 +68,4 @@ import { AuiConfig, AuiIf, AuiProvider, useAui, useAuiEvent, useAuiState } from
68
68
  import { AssistantFrameHost, AssistantFrameProvider, CompositeAttachmentAdapter, ExportedMessageRepository, FRAME_MESSAGE_CHANNEL, InMemoryThreadListAdapter, MessageNotSentError, ModelContextRegistry, SimpleImageAttachmentAdapter, SimpleTextAttachmentAdapter, WebSpeechDictationAdapter, WebSpeechSynthesisAdapter, bindExternalStoreMessage, createMessageQueue, createSuggestionAdapter, createVoiceSession, fromThreadMessageLike, generateId, getExternalStoreMessages, isMessageNotSentError, mergeModelContexts, pickExternalStoreSharedOptions, tool, toolApprovalAcceptsText, unstable_defaultDirectiveFormatter, unstable_formatInteractableSnapshot, unstable_getInteractableSnapshots, unstable_getInteractableVersions } from "@assistant-ui/core";
69
69
  import { AssistantCloud, readAnonymousRefreshToken } from "assistant-cloud";
70
70
  import { ChainOfThoughtClient, ExternalThread, InMemoryThreadList, ModelContext as ModelContextClient, RemoteThreadList, SingleThreadList, Suggestions } from "@assistant-ui/core/store";
71
- export { actionBarMore_exports as ActionBarMorePrimitive, actionBar_exports as ActionBarPrimitive, AssistantCloud, AssistantFrameHost, AssistantFrameProvider, assistantModal_exports as AssistantModalPrimitive, AssistantRuntimeProvider, attachment_exports as AttachmentPrimitive, AuiConfig, AuiIf, AuiProvider, branchPicker_exports as BranchPickerPrimitive, ChainOfThoughtByIndicesProvider, ChainOfThoughtClient, chainOfThought_exports as ChainOfThoughtPrimitive, CloudFileAttachmentAdapter, ComposerAttachmentByIndexProvider, composer_exports as ComposerPrimitive, CompositeAttachmentAdapter, DataRenderers, DevToolsHooks, DevToolsProviderApi, error_exports as ErrorPrimitive, ExportedMessageRepository, ExternalThread, FRAME_MESSAGE_CHANNEL, GenerativeUIRender, GenerativeUIRenderError, internal_exports as INTERNAL, InMemoryThreadList, InMemoryThreadListAdapter, Interactables, McpAppRenderer, McpAppsRemoteHost, MessageAttachmentByIndexProvider, MessageByIndexProvider, MessageNotSentError, messagePart_exports as MessagePartPrimitive, message_exports as MessagePrimitive, MessageProvider, ModelContextClient, ModelContextRegistry, PartByIndexProvider, queueItem_exports as QueueItemPrimitive, ReadonlyThreadProvider, RemoteThreadList, RuntimeAdapterProvider, selectionToolbar_exports as SelectionToolbarPrimitive, SimpleImageAttachmentAdapter, SimpleTextAttachmentAdapter, SingleThreadList, SuggestionByIndexProvider, suggestion_exports as SuggestionPrimitive, Suggestions, TextMessagePartProvider, ThreadListItemByIndexProvider, threadListItemMore_exports as ThreadListItemMorePrimitive, threadListItem_exports as ThreadListItemPrimitive, ThreadListItemRuntimeProvider, threadList_exports as ThreadListPrimitive, thread_exports as ThreadPrimitive, Tools, WebSpeechDictationAdapter, WebSpeechSynthesisAdapter, bindExternalStoreMessage, createMessageQueue, createSuggestionAdapter, createVoiceSession, defineMcpToolkit, defineToolkit, externalTool, fromThreadMessageLike, generateId, getExternalStoreMessages, getMcpAppFromToolPart, groupPartByType, hitl, hitlTool, humanTool, isMessageNotSentError, makeAssistantDataUI, makeAssistantTool, makeAssistantToolUI, makeAssistantVisible, mergeModelContexts, pickExternalStoreSharedOptions, providerTool, readAnonymousRefreshToken, stubTool, tool, toolApprovalAcceptsText, unstable_Interactables, convertExternalMessages as unstable_convertExternalMessages, createMessageConverter as unstable_createMessageConverter, unstable_defaultDirectiveFormatter, defaultWebMcpFilter as unstable_defaultWebMcpFilter, unstable_formatInteractableSnapshot, unstable_getInteractableSnapshots, unstable_getInteractableVersions, unstable_interactableTool, unstable_useComposerInput, unstable_useComposerInputHistory, unstable_useInteractable, unstable_useInteractableState, unstable_useInteractableVersions, unstable_useLiveCompletionAdapter, unstable_useMentionAdapter, unstable_useMessageStallDetection, unstable_useSlashCommandAdapter, unstable_useThreadMessageIds, unstable_useTriggerPopoverAriaProps, useTriggerPopoverRootContext as unstable_useTriggerPopoverRootContext, useTriggerPopoverRootContextOptional as unstable_useTriggerPopoverRootContextOptional, useTriggerPopoverScopeContext as unstable_useTriggerPopoverScopeContext, useTriggerPopoverScopeContextOptional as unstable_useTriggerPopoverScopeContextOptional, useTriggerPopoverTriggers as unstable_useTriggerPopoverTriggers, useTriggerPopoverTriggersOptional as unstable_useTriggerPopoverTriggersOptional, unstable_useWebMcpProvider, useAssistantContext, useAssistantDataUI, useAssistantFrameHost, useAssistantInstructions, useAssistantInteractable, useAssistantTool, useAssistantToolUI, useAssistantTransportRuntime, useAssistantTransportSendCommand, useAssistantTransportState, useAui, useAuiEvent, useAuiState, useAuiToolOverrides, useCloudThreadListAdapter, useCloudThreadListRuntime, useExternalMessageConverter, useExternalStoreRuntime, useExternalStoreSharedOptions, useInlineRender, useInteractableState, useLocalRuntime, useMessagePartData, useMessagePartFile, useMessagePartImage, useMessagePartReasoning, useMessagePartSource, useMessagePartText, useMessageQuote, useMessageTiming, useRemoteThreadListRuntime, useRuntimeAdapters, useScrollLock, useSmooth, useThreadViewport, useThreadViewportAutoScroll, useThreadViewportStore, useToolArgsStatus, useToolCallElapsed, useVoiceControls, useVoiceState, useVoiceVolume };
71
+ export { actionBarMore_exports as ActionBarMorePrimitive, actionBar_exports as ActionBarPrimitive, AssistantCloud, AssistantFrameHost, AssistantFrameProvider, assistantModal_exports as AssistantModalPrimitive, AssistantRuntimeProvider, attachment_exports as AttachmentPrimitive, AuiConfig, AuiIf, AuiProvider, branchPicker_exports as BranchPickerPrimitive, ChainOfThoughtByIndicesProvider, ChainOfThoughtClient, chainOfThought_exports as ChainOfThoughtPrimitive, CloudFileAttachmentAdapter, ComposerAttachmentByIndexProvider, composer_exports as ComposerPrimitive, CompositeAttachmentAdapter, DataRenderers, DevToolsHooks, DevToolsProviderApi, error_exports as ErrorPrimitive, ExportedMessageRepository, ExternalThread, FRAME_MESSAGE_CHANNEL, GenerativeUIRender, GenerativeUIRenderError, internal_exports as INTERNAL, InMemoryThreadList, InMemoryThreadListAdapter, Interactables, McpAppRenderer, McpAppsRemoteHost, MessageAttachmentByIndexProvider, MessageByIndexProvider, MessageNotSentError, messagePart_exports as MessagePartPrimitive, message_exports as MessagePrimitive, MessageProvider, ModelContextClient, ModelContextRegistry, PartByIndexProvider, queueItem_exports as QueueItemPrimitive, ReadonlyThreadProvider, RemoteThreadList, RuntimeAdapterProvider, selectionToolbar_exports as SelectionToolbarPrimitive, SimpleImageAttachmentAdapter, SimpleTextAttachmentAdapter, SingleThreadList, SuggestionByIndexProvider, suggestion_exports as SuggestionPrimitive, Suggestions, TextMessagePartProvider, ThreadListItemByIndexProvider, threadListItemMore_exports as ThreadListItemMorePrimitive, threadListItem_exports as ThreadListItemPrimitive, ThreadListItemRuntimeProvider, threadList_exports as ThreadListPrimitive, thread_exports as ThreadPrimitive, Tools, WebSpeechDictationAdapter, WebSpeechSynthesisAdapter, bindExternalStoreMessage, createMessageQueue, createSuggestionAdapter, createVoiceSession, defineMcpToolkit, defineToolkit, externalTool, fromThreadMessageLike, generateId, getExternalStoreMessages, getMcpAppFromToolPart, groupPartByType, hitl, hitlTool, humanTool, isMessageNotSentError, makeAssistantDataUI, makeAssistantTool, makeAssistantToolUI, makeAssistantVisible, mergeModelContexts, pickExternalStoreSharedOptions, providerTool, readAnonymousRefreshToken, stubTool, tool, toolApprovalAcceptsText, unstable_Interactables, convertExternalMessages as unstable_convertExternalMessages, createExternalMessageConversionCache as unstable_createExternalMessageConversionCache, createMessageConverter as unstable_createMessageConverter, unstable_defaultDirectiveFormatter, defaultWebMcpFilter as unstable_defaultWebMcpFilter, unstable_formatInteractableSnapshot, unstable_getInteractableSnapshots, unstable_getInteractableVersions, unstable_interactableTool, unstable_useComposerInput, unstable_useComposerInputHistory, unstable_useInteractable, unstable_useInteractableState, unstable_useInteractableVersions, unstable_useLiveCompletionAdapter, unstable_useMentionAdapter, unstable_useMessageStallDetection, unstable_useSlashCommandAdapter, unstable_useThreadMessageIds, unstable_useTriggerPopoverAriaProps, useTriggerPopoverRootContext as unstable_useTriggerPopoverRootContext, useTriggerPopoverRootContextOptional as unstable_useTriggerPopoverRootContextOptional, useTriggerPopoverScopeContext as unstable_useTriggerPopoverScopeContext, useTriggerPopoverScopeContextOptional as unstable_useTriggerPopoverScopeContextOptional, useTriggerPopoverTriggers as unstable_useTriggerPopoverTriggers, useTriggerPopoverTriggersOptional as unstable_useTriggerPopoverTriggersOptional, unstable_useWebMcpProvider, useAssistantContext, useAssistantDataUI, useAssistantFrameHost, useAssistantInstructions, useAssistantInteractable, useAssistantTool, useAssistantToolUI, useAssistantTransportRuntime, useAssistantTransportSendCommand, useAssistantTransportState, useAui, useAuiEvent, useAuiState, useAuiToolOverrides, useCloudThreadListAdapter, useCloudThreadListRuntime, useExternalMessageConverter, useExternalStoreRuntime, useExternalStoreSharedOptions, useInlineRender, useInteractableState, useLocalRuntime, useMessagePartData, useMessagePartFile, useMessagePartImage, useMessagePartReasoning, useMessagePartSource, useMessagePartText, useMessageQuote, useMessageTiming, useRemoteThreadListRuntime, useRuntimeAdapters, useScrollLock, useSmooth, useThreadViewport, useThreadViewportAutoScroll, useThreadViewportStore, useToolArgsStatus, useToolCallElapsed, useVoiceControls, useVoiceState, useVoiceVolume };
@@ -1,2 +1,2 @@
1
- import { convertExternalMessages, useExternalMessageConverter } from "@assistant-ui/core/react";
2
- export { convertExternalMessages, useExternalMessageConverter };
1
+ import { ExternalMessageConversionCache, convertExternalMessages, createExternalMessageConversionCache, useExternalMessageConverter } from "@assistant-ui/core/react";
2
+ export { type ExternalMessageConversionCache, convertExternalMessages, createExternalMessageConversionCache, useExternalMessageConverter };
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import { convertExternalMessages, useExternalMessageConverter } from "@assistant-ui/core/react";
3
- export { convertExternalMessages, useExternalMessageConverter };
2
+ import { convertExternalMessages, createExternalMessageConversionCache, useExternalMessageConverter } from "@assistant-ui/core/react";
3
+ export { convertExternalMessages, createExternalMessageConversionCache, useExternalMessageConverter };
@@ -4,8 +4,8 @@ import { getMcpAppFromToolPart } from "./utils.js";
4
4
  import { useAui } from "@assistant-ui/store";
5
5
  import { useEffect, useLayoutEffect, useMemo, useRef, useState } from "@assistant-ui/tap/react-shim";
6
6
  import { create } from "zustand";
7
- import { Fragment, jsx } from "react/jsx-runtime";
8
7
  import { isRecord } from "@assistant-ui/core/internal";
8
+ import { Fragment, jsx } from "react/jsx-runtime";
9
9
  import { resource, useResource } from "@assistant-ui/tap";
10
10
  //#region src/mcp-apps/McpAppRenderer.tsx
11
11
  const isSameOptions = (a, b) => {
@@ -3,8 +3,8 @@ import { createMcpAppBridge } from "./bridge.js";
3
3
  import { SandboxHost } from "../sandbox-host/SandboxHost.js";
4
4
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
5
5
  import { useEffect, useLayoutEffect, useRef } from "@assistant-ui/tap/react-shim";
6
- import { jsx } from "react/jsx-runtime";
7
6
  import { isRecord } from "@assistant-ui/core/internal";
7
+ import { jsx } from "react/jsx-runtime";
8
8
  //#region src/mcp-apps/app-frame.tsx
9
9
  const DEFAULT_PRODUCT = "assistant-ui-mcp-app";
10
10
  const INIT_TIMEOUT_MS = 5e3;
@@ -32,8 +32,26 @@ const useAssistantFrameHost = (t0) => {
32
32
  const frameHost = new AssistantFrameHost(iframeWindow, targetOrigin);
33
33
  const unsubscribe = register(frameHost);
34
34
  return () => {
35
- frameHost.dispose();
36
- unsubscribe();
35
+ let cleanupFailed = false;
36
+ let cleanupError;
37
+ try {
38
+ frameHost.dispose();
39
+ } catch (t3) {
40
+ const error = t3;
41
+ cleanupFailed = true;
42
+ cleanupError = error;
43
+ }
44
+ try {
45
+ unsubscribe();
46
+ } catch (t4) {
47
+ const error_0 = t4;
48
+ if (cleanupFailed) console.error("[assistant-ui] AssistantFrameHost unregistration failed.", error_0);
49
+ else {
50
+ cleanupFailed = true;
51
+ cleanupError = error_0;
52
+ }
53
+ }
54
+ if (cleanupFailed) throw cleanupError;
37
55
  };
38
56
  };
39
57
  t2 = [
@@ -1 +1 @@
1
- {"version":3,"file":"useAssistantFrameHost.js","names":["c","_c","Unsubscribe","useEffect","RefObject","AssistantFrameHost","UseAssistantFrameHostOptions","iframeRef","Readonly","HTMLIFrameElement","targetOrigin","register","frameHost","useAssistantFrameHost","t0","$","t1","t2","iframeWindow","current","contentWindow","unsubscribe","dispose"],"sources":["../../../src/model-context/frame/useAssistantFrameHost.ts"],"sourcesContent":["\"use client\";\n\nimport type { Unsubscribe } from \"@assistant-ui/core\";\nimport { useEffect, type RefObject } from \"react\";\nimport { AssistantFrameHost } from \"@assistant-ui/core\";\n\ntype UseAssistantFrameHostOptions = {\n iframeRef: Readonly<RefObject<HTMLIFrameElement | null | undefined>>;\n targetOrigin?: string;\n register: (frameHost: AssistantFrameHost) => Unsubscribe;\n};\n\n/**\n * React hook that manages the lifecycle of an AssistantFrameHost and its binding to the current AssistantRuntime.\n *\n * Usage example:\n * ```typescript\n * function MyComponent() {\n * const iframeRef = useRef<HTMLIFrameElement>(null);\n *\n * useAssistantFrameHost({\n * iframeRef,\n * targetOrigin: \"https://trusted-domain.com\",\n * });\n *\n * return <iframe ref={iframeRef} src=\"...\" />;\n * }\n * ```\n */\nexport const useAssistantFrameHost = ({\n iframeRef,\n targetOrigin,\n register,\n}: UseAssistantFrameHostOptions): void => {\n useEffect(() => {\n const iframeWindow = iframeRef.current?.contentWindow;\n if (!iframeWindow) return;\n\n const frameHost = new AssistantFrameHost(iframeWindow, targetOrigin);\n\n const unsubscribe = register(frameHost);\n\n return () => {\n frameHost.dispose();\n unsubscribe();\n };\n }, [iframeRef, targetOrigin, register]);\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA6BA,MAAaa,yBAAwBC,OAAA;CAAA,MAAAC,IAAAd,EAAA,CAAA;CAAC,MAAA,EAAAM,WAAAG,cAAAC,aAAAG;CAIP,IAAAE;CAAA,IAAAC;CAAA,IAAAF,EAAA,OAAAR,aAAAQ,EAAA,OAAAJ,YAAAI,EAAA,OAAAL,cAAA;EACnBM,WAAA;GACR,MAAAE,eAAqBX,UAASY,SAAuBC;GACrD,IAAI,CAACF,cAAY;GAEjB,MAAAN,YAAkB,IAAIP,mBAAmBa,cAAcR,YAAY;GAEnE,MAAAW,cAAoBV,SAASC,SAAS;GAAE,aAEjC;IACLA,UAASU,QAAS;IAClBD,YAAY;GAAC;EACd;EACAJ,KAAA;GAACV;GAAWG;GAAcC;EAAQ;EAACI,EAAA,KAAAR;EAAAQ,EAAA,KAAAJ;EAAAI,EAAA,KAAAL;EAAAK,EAAA,KAAAC;EAAAD,EAAA,KAAAE;CAAA,OAAA;EAAAD,KAAAD,EAAA;EAAAE,KAAAF,EAAA;CAAA;CAZtCZ,UAAUa,IAYPC,EAAmC;AAAC"}
1
+ {"version":3,"file":"useAssistantFrameHost.js","names":["c","_c","Unsubscribe","useEffect","RefObject","AssistantFrameHost","UseAssistantFrameHostOptions","iframeRef","Readonly","HTMLIFrameElement","targetOrigin","register","frameHost","useAssistantFrameHost","t0","$","t1","t2","iframeWindow","current","contentWindow","unsubscribe","cleanupFailed","cleanupError","dispose","t3","error","t4","console"],"sources":["../../../src/model-context/frame/useAssistantFrameHost.ts"],"sourcesContent":["\"use client\";\n\nimport type { Unsubscribe } from \"@assistant-ui/core\";\nimport { useEffect, type RefObject } from \"react\";\nimport { AssistantFrameHost } from \"@assistant-ui/core\";\n\ntype UseAssistantFrameHostOptions = {\n iframeRef: Readonly<RefObject<HTMLIFrameElement | null | undefined>>;\n targetOrigin?: string;\n register: (frameHost: AssistantFrameHost) => Unsubscribe;\n};\n\n/**\n * React hook that manages the lifecycle of an AssistantFrameHost and its binding to the current AssistantRuntime.\n *\n * Usage example:\n * ```typescript\n * function MyComponent() {\n * const iframeRef = useRef<HTMLIFrameElement>(null);\n *\n * useAssistantFrameHost({\n * iframeRef,\n * targetOrigin: \"https://trusted-domain.com\",\n * });\n *\n * return <iframe ref={iframeRef} src=\"...\" />;\n * }\n * ```\n */\nexport const useAssistantFrameHost = ({\n iframeRef,\n targetOrigin,\n register,\n}: UseAssistantFrameHostOptions): void => {\n useEffect(() => {\n const iframeWindow = iframeRef.current?.contentWindow;\n if (!iframeWindow) return;\n\n const frameHost = new AssistantFrameHost(iframeWindow, targetOrigin);\n\n const unsubscribe = register(frameHost);\n\n return () => {\n let cleanupFailed = false;\n let cleanupError: unknown;\n\n try {\n frameHost.dispose();\n } catch (error) {\n cleanupFailed = true;\n cleanupError = error;\n }\n\n try {\n unsubscribe();\n } catch (error) {\n if (cleanupFailed) {\n console.error(\n \"[assistant-ui] AssistantFrameHost unregistration failed.\",\n error,\n );\n } else {\n cleanupFailed = true;\n cleanupError = error;\n }\n }\n\n if (cleanupFailed) throw cleanupError;\n };\n }, [iframeRef, targetOrigin, register]);\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA6BA,MAAaa,yBAAwBC,OAAA;CAAA,MAAAC,IAAAd,EAAA,CAAA;CAAC,MAAA,EAAAM,WAAAG,cAAAC,aAAAG;CAIP,IAAAE;CAAA,IAAAC;CAAA,IAAAF,EAAA,OAAAR,aAAAQ,EAAA,OAAAJ,YAAAI,EAAA,OAAAL,cAAA;EACnBM,WAAA;GACR,MAAAE,eAAqBX,UAASY,SAAuBC;GACrD,IAAI,CAACF,cAAY;GAEjB,MAAAN,YAAkB,IAAIP,mBAAmBa,cAAcR,YAAY;GAEnE,MAAAW,cAAoBV,SAASC,SAAS;GAAE,aAEjC;IACL,IAAAU,gBAAoB;IAChBC,IAAAA;IAEJ,IAAA;KACEX,UAASY,QAAS;IAAC,SAAAC,IAAA;KACZC,MAAAA,QAAAA;KACPJ,gBAAgBA;KAChBC,eAAeG;IAAH;IAGd,IAAA;KACEL,YAAY;IAAC,SAAAM,IAAA;KACND,MAAAA,UAAAA;KACP,IAAIJ,eACFM,QAAOF,MACL,4DACAA,OACF;UAAC;MAEDJ,gBAAgBA;MAChBC,eAAeG;KAAH;IACb;IAGH,IAAIJ,eAAe,MAAMC;GAAa;EACvC;EACAN,KAAA;GAACV;GAAWG;GAAcC;EAAQ;EAACI,EAAA,KAAAR;EAAAQ,EAAA,KAAAJ;EAAAI,EAAA,KAAAL;EAAAK,EAAA,KAAAC;EAAAD,EAAA,KAAAE;CAAA,OAAA;EAAAD,KAAAD,EAAA;EAAAE,KAAAF,EAAA;CAAA;CAnCtCZ,UAAUa,IAmCPC,EAAmC;AAAC"}
@@ -41,7 +41,7 @@ declare const MessagePartPrimitiveText: import("react").ForwardRefExoticComponen
41
41
  asChild?: boolean;
42
42
  }, "ref"> & {
43
43
  render?: import("react").ReactElement | undefined;
44
- } & import("react").RefAttributes<HTMLSpanElement>, "ref">, "asChild" | "children"> & {
44
+ } & import("react").RefAttributes<HTMLSpanElement>, "ref">, "children" | "asChild"> & {
45
45
  /**
46
46
  * Whether to enable smooth text streaming animation.
47
47
  * When enabled, text appears with a typing effect as it streams in.
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
3
3
  import { useEffect, useLayoutEffect, useRef, useState } from "@assistant-ui/tap/react-shim";
4
- import { jsx } from "react/jsx-runtime";
5
4
  import { invokeUserCallback } from "@assistant-ui/core/internal";
5
+ import { jsx } from "react/jsx-runtime";
6
6
  import { SafeContentFrame, isShimLoadError } from "safe-content-frame";
7
7
  //#region src/sandbox-host/SandboxHost.tsx
8
8
  const DEFAULT_PRODUCT = "assistant-ui-sandbox";
@@ -101,16 +101,16 @@ declare const Primitive: {
101
101
  }, "ref"> & {
102
102
  render?: ReactElement | undefined;
103
103
  } & RefAttributes<HTMLSpanElement>>;
104
- svg: ForwardRefExoticComponent<Omit<import("react").SVGProps<SVGSVGElement> & {
104
+ ul: ForwardRefExoticComponent<Omit<import("react").ClassAttributes<HTMLUListElement> & import("react").HTMLAttributes<HTMLUListElement> & {
105
105
  asChild?: boolean;
106
106
  }, "ref"> & {
107
107
  render?: ReactElement | undefined;
108
- } & RefAttributes<SVGSVGElement>>;
109
- ul: ForwardRefExoticComponent<Omit<import("react").ClassAttributes<HTMLUListElement> & import("react").HTMLAttributes<HTMLUListElement> & {
108
+ } & RefAttributes<HTMLUListElement>>;
109
+ svg: ForwardRefExoticComponent<Omit<import("react").SVGProps<SVGSVGElement> & {
110
110
  asChild?: boolean;
111
111
  }, "ref"> & {
112
112
  render?: ReactElement | undefined;
113
- } & RefAttributes<HTMLUListElement>>;
113
+ } & RefAttributes<SVGSVGElement>>;
114
114
  };
115
115
  //#endregion
116
116
  export { Primitive, type PrimitiveProps, type WithRenderPropProps, renderSlot, withRenderProp };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@assistant-ui/react",
3
- "version": "0.15.19",
3
+ "version": "0.15.20",
4
4
  "description": "Open-source TypeScript/React library for building production-grade AI chat experiences",
5
5
  "keywords": [
6
6
  "ai",
@@ -55,11 +55,11 @@
55
55
  ],
56
56
  "sideEffects": false,
57
57
  "dependencies": {
58
- "@assistant-ui/core": "^0.3.18",
58
+ "@assistant-ui/core": "^0.3.19",
59
59
  "@assistant-ui/store": "^0.3.13",
60
60
  "@assistant-ui/tap": "^0.9.17",
61
- "assistant-cloud": "^0.2.0",
62
- "assistant-stream": "^0.3.42",
61
+ "assistant-cloud": "^0.2.1",
62
+ "assistant-stream": "^0.3.43",
63
63
  "radix-ui": "^1.6.7",
64
64
  "react-textarea-autosize": "^8.5.9",
65
65
  "safe-content-frame": "^0.0.30",
@@ -82,7 +82,7 @@
82
82
  },
83
83
  "devDependencies": {
84
84
  "@assistant-ui/vite": "0.0.17",
85
- "@assistant-ui/x-buildutils": "0.0.26",
85
+ "@assistant-ui/x-buildutils": "0.0.27",
86
86
  "@testing-library/react": "^16.3.3",
87
87
  "@types/json-schema": "^7.0.15",
88
88
  "@types/node": "^26.4.1",
@@ -91,7 +91,7 @@
91
91
  "jsdom": "^30.0.1",
92
92
  "react": "^19.2.8",
93
93
  "react-dom": "^19.2.8",
94
- "vitest": "^4.1.11"
94
+ "vitest": "^5.0.0"
95
95
  },
96
96
  "publishConfig": {
97
97
  "access": "public",
@@ -0,0 +1,29 @@
1
+ import { describe, expect, it, onTestFinished, vi } from "vitest";
2
+ import { makeThreadViewportStore } from "./ThreadViewport";
3
+
4
+ describe("makeThreadViewportStore", () => {
5
+ it("notifies every scroll listener when one throws", () => {
6
+ const store = makeThreadViewportStore();
7
+ const listenerError = new Error("scroll listener failed");
8
+ const consoleError = vi
9
+ .spyOn(console, "error")
10
+ .mockImplementation(() => {});
11
+ onTestFinished(() => consoleError.mockRestore());
12
+ const laterListener = vi.fn();
13
+
14
+ store.getState().onScrollToBottom(() => {
15
+ throw listenerError;
16
+ });
17
+ store.getState().onScrollToBottom((config) => {
18
+ config.behavior = "smooth";
19
+ });
20
+ store.getState().onScrollToBottom(laterListener);
21
+
22
+ expect(() => store.getState().scrollToBottom()).not.toThrow();
23
+ expect(laterListener).toHaveBeenCalledWith({ behavior: "auto" });
24
+ expect(consoleError).toHaveBeenCalledWith(
25
+ expect.stringContaining("Thread viewport"),
26
+ listenerError,
27
+ );
28
+ });
29
+ });
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { create } from "zustand";
4
4
  import type { Unsubscribe } from "@assistant-ui/core";
5
+ import { notifyEventListeners } from "@assistant-ui/core/internal";
5
6
 
6
7
  export type SizeHandle = {
7
8
  /** Update the height */
@@ -184,9 +185,11 @@ export const makeThreadViewportStore = (
184
185
  const store = create<ThreadViewportState>(() => ({
185
186
  isAtBottom: true,
186
187
  scrollToBottom: ({ behavior = "auto" } = {}) => {
187
- for (const listener of scrollToBottomListeners) {
188
- listener({ behavior });
189
- }
188
+ notifyEventListeners(
189
+ scrollToBottomListeners,
190
+ () => ({ behavior }),
191
+ "Thread viewport",
192
+ );
190
193
  },
191
194
  onScrollToBottom: (callback) => {
192
195
  scrollToBottomListeners.add(callback);
package/src/index.ts CHANGED
@@ -159,6 +159,8 @@ export { useExternalStoreSharedOptions } from "@assistant-ui/core/react";
159
159
  export {
160
160
  useExternalMessageConverter,
161
161
  convertExternalMessages as unstable_convertExternalMessages,
162
+ createExternalMessageConversionCache as unstable_createExternalMessageConversionCache,
163
+ type ExternalMessageConversionCache as Unstable_ExternalMessageConversionCache,
162
164
  } from "./legacy-runtime/runtime-cores/external-store/external-message-converter";
163
165
  export { createMessageConverter as unstable_createMessageConverter } from "./legacy-runtime/runtime-cores/external-store/createMessageConverter";
164
166
 
@@ -278,6 +280,8 @@ export { tool } from "@assistant-ui/core";
278
280
  export { Suggestions, type SuggestionConfig } from "@assistant-ui/core/store";
279
281
  export type {
280
282
  QueueItemState,
283
+ TaskState,
284
+ TaskMethods,
281
285
  QueueItemMethods,
282
286
  } from "@assistant-ui/core/store";
283
287
  export type { ComposerSendOptions } from "@assistant-ui/core/store";
@@ -374,6 +378,7 @@ export type {
374
378
  MessagePartStreamStatus,
375
379
  ToolCallMessagePartStatus,
376
380
  MessageTiming,
381
+ MessageModality,
377
382
  ThreadUserMessagePart,
378
383
  ThreadAssistantMessagePart,
379
384
  ThreadSystemMessage,
@@ -2,4 +2,6 @@
2
2
  export {
3
3
  useExternalMessageConverter,
4
4
  convertExternalMessages,
5
+ createExternalMessageConversionCache,
6
+ type ExternalMessageConversionCache,
5
7
  } from "@assistant-ui/core/react";
@@ -29,7 +29,6 @@ import { McpAppFrame } from "./app-frame";
29
29
  describe("McpAppFrame", () => {
30
30
  afterEach(() => {
31
31
  cleanup();
32
- vi.clearAllMocks();
33
32
  });
34
33
 
35
34
  it("keeps bridge options scoped to committed renders", async () => {
@@ -0,0 +1,42 @@
1
+ // @vitest-environment jsdom
2
+
3
+ import { renderHook } from "@testing-library/react";
4
+ import { AssistantFrameHost } from "@assistant-ui/core";
5
+ import { afterEach, describe, expect, it, vi } from "vitest";
6
+ import { useAssistantFrameHost } from "./useAssistantFrameHost";
7
+
8
+ afterEach(() => {
9
+ vi.restoreAllMocks();
10
+ });
11
+
12
+ describe("useAssistantFrameHost", () => {
13
+ it("unregisters the host when disposal throws", () => {
14
+ const disposalError = new Error("tool cancellation failed");
15
+ const unregistrationError = new Error("unregistration failed");
16
+ vi.spyOn(AssistantFrameHost.prototype, "dispose").mockImplementation(() => {
17
+ throw disposalError;
18
+ });
19
+ const consoleError = vi
20
+ .spyOn(console, "error")
21
+ .mockImplementation(() => undefined);
22
+ const unsubscribe = vi.fn(() => {
23
+ throw unregistrationError;
24
+ });
25
+ const register = vi.fn(() => unsubscribe);
26
+ const iframeRef = {
27
+ current: {
28
+ contentWindow: { postMessage: vi.fn() } as unknown as Window,
29
+ } as HTMLIFrameElement,
30
+ };
31
+ const { unmount } = renderHook(() =>
32
+ useAssistantFrameHost({ iframeRef, register }),
33
+ );
34
+
35
+ expect(() => unmount()).toThrow(disposalError);
36
+ expect(unsubscribe).toHaveBeenCalledOnce();
37
+ expect(consoleError).toHaveBeenCalledWith(
38
+ "[assistant-ui] AssistantFrameHost unregistration failed.",
39
+ unregistrationError,
40
+ );
41
+ });
42
+ });
@@ -41,8 +41,31 @@ export const useAssistantFrameHost = ({
41
41
  const unsubscribe = register(frameHost);
42
42
 
43
43
  return () => {
44
- frameHost.dispose();
45
- unsubscribe();
44
+ let cleanupFailed = false;
45
+ let cleanupError: unknown;
46
+
47
+ try {
48
+ frameHost.dispose();
49
+ } catch (error) {
50
+ cleanupFailed = true;
51
+ cleanupError = error;
52
+ }
53
+
54
+ try {
55
+ unsubscribe();
56
+ } catch (error) {
57
+ if (cleanupFailed) {
58
+ console.error(
59
+ "[assistant-ui] AssistantFrameHost unregistration failed.",
60
+ error,
61
+ );
62
+ } else {
63
+ cleanupFailed = true;
64
+ cleanupError = error;
65
+ }
66
+ }
67
+
68
+ if (cleanupFailed) throw cleanupError;
46
69
  };
47
70
  }, [iframeRef, targetOrigin, register]);
48
71
  };