@assistant-ui/ai-sdk 0.0.8 → 0.0.9
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.
- package/LICENSE +1 -1
- package/dist/converters/convertMessage.d.ts +2 -0
- package/dist/converters/convertMessage.d.ts.map +1 -1
- package/dist/converters/convertMessage.js +14 -4
- package/dist/converters/convertMessage.js.map +1 -1
- package/dist/runtime/AISDKChat.d.ts.map +1 -1
- package/dist/runtime/AISDKChat.js.map +1 -1
- package/dist/runtime/sdkIdentity.js +1 -1
- package/dist/runtime/useAISDKRuntime.d.ts +8 -1
- package/dist/runtime/useAISDKRuntime.d.ts.map +1 -1
- package/dist/runtime/useAISDKRuntime.js +212 -34
- package/dist/runtime/useAISDKRuntime.js.map +1 -1
- package/dist/runtime/useChatRuntime.js +1 -1
- package/dist/runtime/useChatThread.d.ts.map +1 -1
- package/dist/runtime/useChatThread.js +40 -10
- package/dist/runtime/useChatThread.js.map +1 -1
- package/dist/runtime/useExternalHistory.d.ts.map +1 -1
- package/dist/runtime/useExternalHistory.js +2 -1
- package/dist/runtime/useExternalHistory.js.map +1 -1
- package/dist/transport/AssistantChatTransport.d.ts.map +1 -1
- package/dist/transport/AssistantChatTransport.js +9 -2
- package/dist/transport/AssistantChatTransport.js.map +1 -1
- package/package.json +10 -7
- package/src/converters/convertMessage.test.ts +63 -0
- package/src/converters/convertMessage.ts +24 -2
- package/src/runtime/AISDKChat.ts +0 -4
- package/src/runtime/AISDKThreads.test.ts +26 -0
- package/src/runtime/useAISDKRuntime.approval.integration.test.tsx +1588 -19
- package/src/runtime/useAISDKRuntime.approval.test.tsx +27 -0
- package/src/runtime/useAISDKRuntime.fast-refresh.test.tsx +182 -0
- package/src/runtime/useAISDKRuntime.ts +397 -28
- package/src/runtime/useChatRuntime.fast-refresh.test.tsx +94 -0
- package/src/runtime/useChatRuntime.integration.test.tsx +134 -112
- package/src/runtime/useChatRuntime.test.ts +7 -7
- package/src/runtime/useChatThread.test.ts +166 -2
- package/src/runtime/useChatThread.transport.test.tsx +5 -2
- package/src/runtime/useChatThread.ts +56 -17
- package/src/runtime/useExternalHistory.ts +12 -1
- package/src/transport/AssistantChatTransport.test.ts +164 -0
- package/src/transport/AssistantChatTransport.ts +22 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAISDKRuntime.js","names":["c","_c","useCallback","useEffect","useInsertionEffect","useMemo","useRef","useState","UIMessage","useChat","CreateUIMessage","UseChatHelpers","isToolUIPart","generateId","getToolName","useExternalStoreRuntime","useRuntimeAdapters","JoinStrategy","SuggestionAdapter","ThreadSuggestion","ToolExecutionStatus","ExternalStoreAdapter","ExternalStoreSharedOptions","ThreadHistoryAdapter","AssistantRuntime","ThreadMessage","MessageFormatAdapter","MessageFormatItem","MessageFormatRepository","AppendMessage","RunConfig","McpAppMetadata","RespondToToolApprovalOptions","Unstable_ToolInteractionLog","getExternalStoreMessages","pickExternalStoreSharedOptions","appendToolInteraction","consumeSuggestionResult","MessageRepository","ReadonlyJSONObject","AssistantError","sliceMessagesUntil","toCreateMessage","vercelAttachmentAdapter","getVercelAIMessages","AISDKMessageConverter","AISDKMessageConverterMetadata","wrapModelContentEnvelope","AISDKStorageFormat","aiSDKV6FormatAdapter","useExternalHistory","toExportedMessageRepository","useStreamingTiming","aiSDKExtras","CustomToCreateMessageFunction","message","UI_MESSAGE","toUIMessage","createMessage","fallbackRole","id","role","toVoiceTranscriptUIMessage","parts","content","filter","part","type","map","text","metadata","modality","Object","keys","custom","length","AISDKRuntimeAdapter","adapters","NonNullable","history","suggestion","unstable_messageRepositoryInstance","cancelPendingToolCallsOnSend","onResume","onResumeToolCall","onRespondToToolApproval","response","context","toolCallId","toolName","respondViaAISDK","Promise","joinStrategy","messageRepository","unstable_onBranchChange","EMPTY_SUGGESTIONS","useGeneratedSuggestions","suggestionAdapter","messages","isRunning","$","suggestions","setSuggestions","controllerRef","wasRunningRef","messagesRef","t0","t1","current","adapterRef","t2","t3","hasAdapter","t4","clearSuggestions","abort","_temp","adapter","currentMessages","last","at","status","controller","AbortController","signal","promiseOrGenerator","generate","onUpdate","t5","t6","t7","Symbol","for","NO_CANCELLED_MESSAGE_IDS","ReadonlySet","Set","NO_TOOL_APPROVAL_RESPONSES","ReadonlyMap","Map","toChatError","error","Error","code","name","useAISDKRuntime","chatHelpers","ReturnType","customToCreateMessage","customOnRespondToToolApproval","contextAdapters","toolStatuses","setToolStatuses","Record","cancelledMessages","setCancelledMessages","chatId","ids","toolApprovalResponses","setToolApprovalResponses","toolArtifactEpoch","setToolArtifactEpoch","toolInteractionEpoch","setToolInteractionEpoch","hostApprovalIdsRef","toolApprovalResponsesRef","toolArgsKeyOrderCacheRef","toolLastInputCacheRef","toolArgsTextCacheRef","WeakMap","mcpAppMetadataCacheRef","toolArtifactsRef","toolInteractionsRef","lastRunConfigRef","undefined","markToolArtifactsChanged","epoch","markToolInteractionsChanged","hasExecutingTools","values","some","s","providerIsRunning","wasProviderRunningRef","messageTiming","lastMessage","optimisticMessageId","cancelledMessageIds","supportsRichToolApprovalResponses","toThreadMessages","sourceMessages","toolArtifacts","toolInteractions","retractCancellation","messageId","prev","has","delete","resumedMessageId","wasProviderRunning","useThreadMessages","toolArgsKeyOrderCache","toolArgsTextCache","toolLastInputCache","mcpAppMetadataCache","size","exportedMessageRepository","converted","generatedSuggestions","runtimeRef","runtime","isLoading","deleteMessage","deleteHistoryMessage","persistToolInteractions","persistToolApprovalResponses","setMessages","chatMessages","chatStatus","extras","provide","chat","completePendingToolCalls","hasChanges","next","messageChanged","state","approval","_approval","rest","const","errorText","approvalId","approved","reason","resolve","addToolApprovalResponse","options","respondViaHost","onRespond","requested","flatMap","find","applyResponse","applied","add","set","hasSeededRepositoryRef","shouldFeedRepository","unstable_persistsHistory","unstable_enableToolInvocations","Boolean","flat","onImport","onVoiceTranscript","onExportExternalState","exported","thread","export","expandedMessages","lastInnerIdMap","item","innerMessages","parentId","get","innerMessage","push","getId","result","headId","onLoadExternalState","repo","exportedRepo","import","onCancel","cancelledId","liveIds","m","kept","stop","onNew","startRun","runConfig","sendMessage","onEdit","onDelete","threadMessages","getState","messageIndex","findIndex","removedToolArtifact","removedToolInteractions","removedToolApprovalResponse","removedHostApprovalId","deleteIds","onReload","config","newMessages","regenerate","onAddToolResult","isError","artifact","modelContent","addToolOutput","tool","JSON","stringify","output","unstable_onRecordToolInteraction","interaction","attachments","setMessagesRef","tempRepo","getMessages"],"sources":["../../src/runtime/useAISDKRuntime.ts"],"sourcesContent":["\"use client\";\n\nimport {\n useCallback,\n useEffect,\n useInsertionEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type {\n UIMessage,\n useChat,\n CreateUIMessage,\n UseChatHelpers,\n} from \"@ai-sdk/react\";\nimport { isToolUIPart, generateId, getToolName } from \"ai\";\nimport {\n useExternalStoreRuntime,\n useRuntimeAdapters,\n type JoinStrategy,\n} from \"@assistant-ui/core/react\";\nimport type {\n SuggestionAdapter,\n ThreadSuggestion,\n ToolExecutionStatus,\n} from \"@assistant-ui/core\";\nimport type {\n ExternalStoreAdapter,\n ExternalStoreSharedOptions,\n ThreadHistoryAdapter,\n AssistantRuntime,\n ThreadMessage,\n MessageFormatAdapter,\n MessageFormatItem,\n MessageFormatRepository,\n AppendMessage,\n RunConfig,\n McpAppMetadata,\n RespondToToolApprovalOptions,\n Unstable_ToolInteractionLog,\n} from \"@assistant-ui/core\";\nimport {\n getExternalStoreMessages,\n pickExternalStoreSharedOptions,\n} from \"@assistant-ui/core\";\nimport {\n appendToolInteraction,\n consumeSuggestionResult,\n MessageRepository,\n} from \"@assistant-ui/core/internal\";\nimport type { ReadonlyJSONObject } from \"assistant-stream/utils\";\nimport type { AssistantError } from \"@assistant-ui/core\";\nimport { sliceMessagesUntil } from \"../utils/sliceMessagesUntil\";\nimport { toCreateMessage } from \"../converters/toCreateMessage\";\nimport { vercelAttachmentAdapter } from \"../adapters/vercelAttachmentAdapter\";\nimport { getVercelAIMessages } from \"../utils/getVercelAIMessages\";\nimport {\n AISDKMessageConverter,\n type AISDKMessageConverterMetadata,\n} from \"../converters/convertMessage\";\nimport { wrapModelContentEnvelope } from \"../converters/modelContentEnvelope\";\nimport {\n type AISDKStorageFormat,\n aiSDKV6FormatAdapter,\n} from \"../adapters/aiSDKFormatAdapter\";\nimport {\n useExternalHistory,\n toExportedMessageRepository,\n} from \"./useExternalHistory\";\nimport { useStreamingTiming } from \"./useStreamingTiming\";\nimport { aiSDKExtras } from \"../aiSDKExtras\";\n\nexport type CustomToCreateMessageFunction = <\n UI_MESSAGE extends UIMessage = UIMessage,\n>(\n message: AppendMessage,\n) => CreateUIMessage<UI_MESSAGE>;\n\nconst toUIMessage = <UI_MESSAGE extends UIMessage>(\n createMessage: CreateUIMessage<UI_MESSAGE>,\n fallbackRole: UI_MESSAGE[\"role\"],\n): UI_MESSAGE =>\n ({\n ...createMessage,\n id: createMessage.id ?? generateId(),\n role: createMessage.role ?? fallbackRole,\n }) as UI_MESSAGE;\n\nconst toVoiceTranscriptUIMessage = <UI_MESSAGE extends UIMessage>(\n message: ThreadMessage,\n): UI_MESSAGE =>\n ({\n id: message.id,\n role: message.role,\n parts: message.content\n .filter((part) => part.type === \"text\")\n .map((part) => ({ type: \"text\", text: part.text })),\n metadata: {\n ...(message.metadata.modality && { modality: message.metadata.modality }),\n ...(Object.keys(message.metadata.custom).length > 0 && {\n custom: message.metadata.custom,\n }),\n },\n }) as UI_MESSAGE;\n\nexport type AISDKRuntimeAdapter<UI_MESSAGE extends UIMessage = UIMessage> =\n ExternalStoreSharedOptions & {\n adapters?:\n | (NonNullable<ExternalStoreAdapter[\"adapters\"]> & {\n history?: ThreadHistoryAdapter | undefined;\n suggestion?: SuggestionAdapter | undefined;\n })\n | undefined;\n toCreateMessage?: CustomToCreateMessageFunction;\n unstable_messageRepositoryInstance?: MessageRepository | undefined;\n /**\n * Whether to automatically cancel pending interactive tool calls when the user sends a new message.\n *\n * When enabled (default), the pending tool calls will be marked as failed with an error message\n * indicating the user cancelled the tool call by sending a new message.\n *\n * @default true\n */\n cancelPendingToolCallsOnSend?: boolean | undefined;\n /**\n * Called when `runtime.thread.resumeRun(config)` is invoked.\n *\n * When omitted, `resumeRun` throws `\"Runtime does not support resuming runs.\"`.\n * Provide this to bridge resume invocations into a custom replay channel\n * (for example, an SSE reconnect endpoint keyed by turn id).\n */\n onResume?: ExternalStoreAdapter[\"onResume\"];\n /**\n * Called when `runtime.thread.resumeToolCall(options)` is invoked for a tool call the in-process tracker does not own.\n *\n * When omitted, `resumeToolCall` throws `\"Tool call ${toolCallId} is not waiting for resume.\"`.\n * Provide this to bridge resume-tool-call invocations into a custom handler.\n */\n onResumeToolCall?: ExternalStoreAdapter[\"onResumeToolCall\"];\n /**\n * Answers tool approval requests through a host-owned channel instead of the AI SDK's `addToolApprovalResponse`.\n *\n * Called for every approval request in the thread with the complete response, including option and free-form answers. Hand requests the host does not own to `respondViaAISDK`, which is what runs when this option is omitted. The answer applies to the approval when the handler starts and is removed if it throws. It is never written into the `useChat` messages, so `sendAutomaticallyWhen` cannot forward it. With a history adapter, the answer is stored with its message once the handler resolves and returns on reload, and a second response to the same request rejects; without one it lasts as long as this runtime, and a runtime mounted again over the same chat shows the request open until the resumed run records its resolution in the chat.\n *\n * While a handler is set, an approval's `display`, `allowFreeform`, `dismissible` and `options` reach the renderer, because the handler can receive answers the AI SDK cannot carry. A stream declares them through the `approvalDescriptor` of its `tool-approval-request` chunk, the one approval field the AI SDK keeps opaque; the converter reads the request and answer fields from that descriptor when the approval itself lacks them.\n */\n onRespondToToolApproval?:\n | ((\n response: RespondToToolApprovalOptions,\n context: {\n toolCallId: string;\n toolName: string;\n /** Sends this response through the AI SDK's `addToolApprovalResponse`, which carries only `approved` and `reason`. */\n respondViaAISDK: () => Promise<void>;\n },\n ) => Promise<void> | void)\n | undefined;\n /**\n * How consecutive assistant messages are rendered.\n *\n * `\"concat-content\"` (the default) merges them into a single thread message.\n * `\"none\"` keeps each assistant message as its own thread message, which is\n * useful when a backend persists proactive or consecutive assistant messages\n * as separate entries.\n */\n joinStrategy?: JoinStrategy | undefined;\n /**\n * A branch-aware AI SDK message tree seeded once when `useChat` is empty.\n * After that seed, live updates come only from `useChat`. A later empty\n * chat or a new object identity does not reload the tree.\n */\n messageRepository?: MessageFormatRepository<UI_MESSAGE>;\n /**\n * Called after an explicit `switchToBranch` (for example a BranchPicker\n * click). Complements `setMessages` and does not enable switching by itself.\n *\n * @deprecated This API is still under active development and might change without notice.\n */\n unstable_onBranchChange?: ExternalStoreAdapter[\"unstable_onBranchChange\"];\n };\n\nconst EMPTY_SUGGESTIONS: readonly ThreadSuggestion[] = [];\n\nconst useGeneratedSuggestions = (\n suggestionAdapter: SuggestionAdapter | undefined,\n messages: readonly ThreadMessage[],\n isRunning: boolean,\n): readonly ThreadSuggestion[] => {\n const [suggestions, setSuggestions] =\n useState<readonly ThreadSuggestion[]>(EMPTY_SUGGESTIONS);\n const controllerRef = useRef<AbortController | null>(null);\n const wasRunningRef = useRef(false);\n const messagesRef = useRef(messages);\n useInsertionEffect(() => {\n messagesRef.current = messages;\n }, [messages]);\n const adapterRef = useRef(suggestionAdapter);\n useInsertionEffect(() => {\n adapterRef.current = suggestionAdapter;\n }, [suggestionAdapter]);\n const hasAdapter = suggestionAdapter != null;\n\n useEffect(() => {\n const clearSuggestions = () => {\n controllerRef.current?.abort();\n controllerRef.current = null;\n setSuggestions((prev) => (prev.length === 0 ? prev : EMPTY_SUGGESTIONS));\n };\n\n const adapter = adapterRef.current;\n if (!adapter) {\n clearSuggestions();\n wasRunningRef.current = isRunning;\n return;\n }\n\n if (isRunning) {\n if (!wasRunningRef.current) {\n clearSuggestions();\n }\n wasRunningRef.current = true;\n return;\n }\n\n if (!wasRunningRef.current) return;\n wasRunningRef.current = false;\n\n const currentMessages = messagesRef.current;\n const last = currentMessages.at(-1);\n if (last?.role !== \"assistant\") return;\n if (last.status?.type === \"requires-action\") return;\n\n const controller = new AbortController();\n controllerRef.current = controller;\n const { signal } = controller;\n\n void (async () => {\n try {\n const promiseOrGenerator = adapter.generate({\n messages: currentMessages,\n signal,\n });\n\n await consumeSuggestionResult(promiseOrGenerator, {\n signal,\n onUpdate: setSuggestions,\n });\n } catch {}\n })();\n }, [hasAdapter, isRunning]);\n\n useEffect(() => {\n return () => {\n controllerRef.current?.abort();\n };\n }, []);\n\n return suggestions;\n};\n\nconst NO_CANCELLED_MESSAGE_IDS: ReadonlySet<string> = new Set();\n\nconst NO_TOOL_APPROVAL_RESPONSES: ReadonlyMap<\n string,\n RespondToToolApprovalOptions\n> = new Map();\n\nconst toChatError = (error: Error): AssistantError => {\n const code = (error as { code?: unknown }).code;\n return {\n code:\n typeof code === \"string\"\n ? code\n : error.name !== \"Error\"\n ? error.name\n : \"unknown\",\n message: error.message,\n };\n};\n\nexport const useAISDKRuntime = <UI_MESSAGE extends UIMessage = UIMessage>(\n chatHelpers: ReturnType<typeof useChat<UI_MESSAGE>>,\n adapter: AISDKRuntimeAdapter<UI_MESSAGE> = {},\n) => {\n const {\n adapters,\n toCreateMessage: customToCreateMessage,\n cancelPendingToolCallsOnSend = true,\n onResume,\n onResumeToolCall,\n onRespondToToolApproval: customOnRespondToToolApproval,\n joinStrategy,\n messageRepository,\n unstable_onBranchChange,\n } = adapter;\n const suggestionAdapter = adapters?.suggestion;\n const contextAdapters = useRuntimeAdapters();\n const [toolStatuses, setToolStatuses] = useState<\n Record<string, ToolExecutionStatus>\n >({});\n const [cancelledMessages, setCancelledMessages] = useState<{\n chatId: string;\n ids: ReadonlySet<string>;\n } | null>(null);\n const [toolApprovalResponses, setToolApprovalResponses] = useState<\n ReadonlyMap<string, RespondToToolApprovalOptions>\n >(NO_TOOL_APPROVAL_RESPONSES);\n const [toolArtifactEpoch, setToolArtifactEpoch] = useState(0);\n const [toolInteractionEpoch, setToolInteractionEpoch] = useState(0);\n const hostApprovalIdsRef = useRef(new Set<string>());\n const toolApprovalResponsesRef = useRef<\n Map<string, RespondToToolApprovalOptions>\n >(new Map());\n const toolArgsKeyOrderCacheRef = useRef<Map<string, Map<string, string[]>>>(\n new Map(),\n );\n const toolLastInputCacheRef = useRef<Map<string, ReadonlyJSONObject>>(\n new Map(),\n );\n const toolArgsTextCacheRef = useRef<\n WeakMap<ReadonlyJSONObject, Map<string, string>>\n >(new WeakMap());\n const mcpAppMetadataCacheRef = useRef<Map<string, McpAppMetadata>>(new Map());\n const toolArtifactsRef = useRef<Map<string, unknown>>(new Map());\n const toolInteractionsRef = useRef<Map<string, Unstable_ToolInteractionLog>>(\n new Map(),\n );\n const lastRunConfigRef = useRef<RunConfig | undefined>(undefined);\n const markToolArtifactsChanged = useCallback(() => {\n setToolArtifactEpoch((epoch) => epoch + 1);\n }, []);\n const markToolInteractionsChanged = useCallback(() => {\n setToolInteractionEpoch((epoch) => epoch + 1);\n }, []);\n\n const hasExecutingTools = Object.values(toolStatuses).some(\n (s) => s?.type === \"executing\",\n );\n const providerIsRunning =\n chatHelpers.status === \"submitted\" || chatHelpers.status === \"streaming\";\n const isRunning = providerIsRunning || hasExecutingTools;\n const wasProviderRunningRef = useRef(providerIsRunning);\n\n const messageTiming = useStreamingTiming(chatHelpers.messages, isRunning);\n\n // Flag the streaming message optimistic: its id can be swapped for a server\n // id mid-run, and the repository then drops the orphaned pre-swap id (#4037).\n const lastMessage = chatHelpers.messages.at(-1);\n const optimisticMessageId =\n isRunning && lastMessage?.role === \"assistant\" ? lastMessage.id : undefined;\n\n const cancelledMessageIds =\n cancelledMessages?.chatId === chatHelpers.id\n ? cancelledMessages.ids\n : NO_CANCELLED_MESSAGE_IDS;\n const supportsRichToolApprovalResponses =\n customOnRespondToToolApproval != null;\n\n const toThreadMessages = useCallback(\n (sourceMessages: UI_MESSAGE[]) => {\n const metadata: AISDKMessageConverterMetadata = {\n supportsRichToolApprovalResponses,\n toolArtifacts: toolArtifactsRef.current,\n toolInteractions: toolInteractionsRef.current,\n toolApprovalResponses: toolApprovalResponsesRef.current,\n };\n return AISDKMessageConverter.toThreadMessages(\n sourceMessages,\n false,\n metadata,\n );\n },\n [supportsRichToolApprovalResponses],\n );\n\n const retractCancellation = useCallback(\n (chatId: string, messageId: string) => {\n setCancelledMessages((prev) => {\n if (prev?.chatId !== chatId || !prev.ids.has(messageId)) return prev;\n const ids = new Set(prev.ids);\n ids.delete(messageId);\n return { chatId, ids };\n });\n },\n [],\n );\n\n // A provider run that resumes the stopped response retracts its cancellation;\n // a run that starts a new response leaves the stopped one marked.\n const resumedMessageId =\n providerIsRunning && lastMessage?.role === \"assistant\"\n ? lastMessage.id\n : undefined;\n\n useEffect(() => {\n const wasProviderRunning = wasProviderRunningRef.current;\n wasProviderRunningRef.current = providerIsRunning;\n if (wasProviderRunning || !resumedMessageId) return;\n retractCancellation(chatHelpers.id, resumedMessageId);\n }, [\n providerIsRunning,\n resumedMessageId,\n chatHelpers.id,\n retractCancellation,\n ]);\n\n const messages = AISDKMessageConverter.useThreadMessages({\n isRunning,\n messages: chatHelpers.messages,\n joinStrategy,\n metadata: useMemo<AISDKMessageConverterMetadata>(\n () => ({\n toolStatuses,\n messageTiming,\n toolArgsKeyOrderCache: toolArgsKeyOrderCacheRef.current,\n toolArgsTextCache: toolArgsTextCacheRef.current,\n toolLastInputCache: toolLastInputCacheRef.current,\n mcpAppMetadataCache: mcpAppMetadataCacheRef.current,\n toolArtifacts: toolArtifactsRef.current,\n toolInteractions: toolInteractionsRef.current,\n supportsRichToolApprovalResponses,\n ...(optimisticMessageId && { optimisticMessageId }),\n ...(chatHelpers.error && {\n error: toChatError(chatHelpers.error),\n }),\n ...(cancelledMessageIds.size > 0 && { cancelledMessageIds }),\n ...(toolApprovalResponses.size > 0 && { toolApprovalResponses }),\n }),\n [\n toolStatuses,\n messageTiming,\n optimisticMessageId,\n chatHelpers.error,\n cancelledMessageIds,\n toolApprovalResponses,\n supportsRichToolApprovalResponses,\n toolArtifactEpoch,\n toolInteractionEpoch,\n ],\n ),\n });\n\n const exportedMessageRepository = useMemo(() => {\n if (!messageRepository) return undefined;\n const converted = toExportedMessageRepository(\n toThreadMessages,\n messageRepository,\n );\n return converted.messages.length > 0 ? converted : undefined;\n }, [messageRepository, toThreadMessages]);\n\n const generatedSuggestions = useGeneratedSuggestions(\n suggestionAdapter,\n messages,\n isRunning,\n );\n\n const [runtimeRef] = useState(() => ({\n get current(): AssistantRuntime {\n return runtime;\n },\n }));\n\n const {\n isLoading,\n deleteMessage: deleteHistoryMessage,\n persistToolInteractions,\n persistToolApprovalResponses,\n } = useExternalHistory(\n runtimeRef,\n adapters?.history ?? contextAdapters?.history,\n toThreadMessages,\n aiSDKV6FormatAdapter as MessageFormatAdapter<\n UI_MESSAGE,\n AISDKStorageFormat\n >,\n (messages) => {\n chatHelpers.setMessages(messages);\n },\n toolArtifactsRef.current,\n markToolArtifactsChanged,\n toolInteractionsRef.current,\n markToolInteractionsChanged,\n toolApprovalResponsesRef.current,\n () => {\n hostApprovalIdsRef.current = new Set(\n toolApprovalResponsesRef.current.keys(),\n );\n setToolApprovalResponses(new Map(toolApprovalResponsesRef.current));\n },\n );\n\n const {\n id: chatId,\n messages: chatMessages,\n status: chatStatus,\n error,\n } = chatHelpers;\n const extras = useMemo(\n () =>\n aiSDKExtras.provide({\n chat: chatHelpers as unknown as UseChatHelpers<UIMessage>,\n error,\n }),\n // oxlint-disable-next-line react/exhaustive-deps -- keyed on the chat's identity and reactive snapshots; useChat re-mints the helpers object every render while its remaining fields are instance-bound methods, and a render-stable extras identity is what lets the external-store core dedupe adapter updates\n [chatId, chatMessages, chatStatus, error],\n );\n\n const completePendingToolCalls = async () => {\n if (!cancelPendingToolCallsOnSend) return;\n\n // The runtime auto-aborts in-flight tool invocations when a new run\n // is dispatched (append() / startRun()), so this only has to mark the\n // abandoned tools cancelled in the UI message list. Every non-terminal\n // tool call qualifies wherever it sits: the run that produced it is over,\n // and a staged `startRun: false` message can sit between it and the tail.\n // Uses setMessages to avoid triggering sendAutomaticallyWhen.\n chatHelpers.setMessages((messages) => {\n let hasChanges = false;\n\n const next = messages.map((message) => {\n if (message.role !== \"assistant\") return message;\n\n let messageChanged = false;\n const parts = message.parts?.map((part) => {\n if (!isToolUIPart(part)) return part;\n if (\n part.state === \"output-available\" ||\n part.state === \"output-error\" ||\n part.state === \"output-denied\"\n )\n return part;\n\n messageChanged = true;\n const { approval: _approval, ...rest } = part;\n return {\n ...rest,\n state: \"output-error\" as const,\n errorText: \"User cancelled tool call by sending a new message.\",\n };\n });\n\n if (!messageChanged) return message;\n hasChanges = true;\n return { ...message, parts };\n });\n\n if (!hasChanges) return messages;\n return next;\n });\n };\n\n const respondViaAISDK = ({\n approvalId,\n approved,\n reason,\n }: RespondToToolApprovalOptions) =>\n Promise.resolve(\n chatHelpers.addToolApprovalResponse({\n id: approvalId,\n approved,\n ...(reason != null && { reason }),\n options: { metadata: lastRunConfigRef.current },\n }),\n );\n\n const respondViaHost = async (\n onRespond: NonNullable<AISDKRuntimeAdapter[\"onRespondToToolApproval\"]>,\n response: RespondToToolApprovalOptions,\n ) => {\n const { approvalId } = response;\n const requested = chatHelpers.messages\n .flatMap((message) =>\n message.parts.flatMap((part) =>\n isToolUIPart(part) ? [{ messageId: message.id, part }] : [],\n ),\n )\n .find(\n ({ part }) =>\n part.state === \"approval-requested\" &&\n part.approval.id === approvalId,\n );\n if (!requested || hostApprovalIdsRef.current.has(approvalId))\n throw new Error(\n `Tool approval ${approvalId} is not waiting for a response.`,\n );\n\n // A host answer stays out of the useChat messages, where sendAutomaticallyWhen would forward it to the chat route.\n const applyResponse = (applied: boolean) => {\n if (applied) hostApprovalIdsRef.current.add(approvalId);\n else hostApprovalIdsRef.current.delete(approvalId);\n if (applied) toolApprovalResponsesRef.current.set(approvalId, response);\n else toolApprovalResponsesRef.current.delete(approvalId);\n setToolApprovalResponses(new Map(toolApprovalResponsesRef.current));\n };\n\n applyResponse(true);\n try {\n await onRespond(response, {\n toolCallId: requested.part.toolCallId,\n toolName: getToolName(requested.part),\n respondViaAISDK: async () => {\n try {\n await respondViaAISDK(response);\n } finally {\n applyResponse(false);\n }\n },\n });\n } catch (error) {\n if (hostApprovalIdsRef.current.has(approvalId)) applyResponse(false);\n throw error;\n }\n if (hostApprovalIdsRef.current.has(approvalId)) {\n await persistToolApprovalResponses(requested.messageId);\n }\n };\n\n const hasSeededRepositoryRef = useRef(false);\n const shouldFeedRepository =\n exportedMessageRepository != null &&\n !hasSeededRepositoryRef.current &&\n messages.length === 0;\n\n const runtime = useExternalStoreRuntime({\n unstable_persistsHistory: true,\n isRunning: providerIsRunning,\n ...(shouldFeedRepository\n ? { messageRepository: exportedMessageRepository }\n : { messages }),\n unstable_enableToolInvocations: true,\n setToolStatuses,\n setMessages: (messages) =>\n chatHelpers.setMessages(\n messages\n .map(getVercelAIMessages<UI_MESSAGE>)\n .filter(Boolean)\n .flat(),\n ),\n onImport: (messages) =>\n chatHelpers.setMessages(\n messages\n .map(getVercelAIMessages<UI_MESSAGE>)\n .filter(Boolean)\n .flat(),\n ),\n onVoiceTranscript: (message: ThreadMessage) =>\n chatHelpers.setMessages((current) => [\n ...current,\n toVoiceTranscriptUIMessage<UI_MESSAGE>(message),\n ]),\n onExportExternalState: (): MessageFormatRepository<UI_MESSAGE> => {\n const exported = runtimeRef.current.thread.export();\n\n const expandedMessages: MessageFormatItem<UI_MESSAGE>[] = [];\n const lastInnerIdMap = new Map<string, string>();\n\n for (const item of exported.messages) {\n const innerMessages = getExternalStoreMessages<UI_MESSAGE>(\n item.message,\n );\n let parentId =\n item.parentId != null\n ? (lastInnerIdMap.get(item.parentId) ?? item.parentId)\n : null;\n for (const innerMessage of innerMessages) {\n expandedMessages.push({ parentId, message: innerMessage });\n parentId = aiSDKV6FormatAdapter.getId(innerMessage as UIMessage);\n }\n if (innerMessages.length > 0) {\n lastInnerIdMap.set(\n item.message.id,\n aiSDKV6FormatAdapter.getId(\n innerMessages[innerMessages.length - 1]! as UIMessage,\n ),\n );\n }\n }\n\n const result: MessageFormatRepository<UI_MESSAGE> = {\n messages: expandedMessages,\n };\n\n if (exported.headId != null) {\n result.headId = lastInnerIdMap.get(exported.headId) ?? exported.headId;\n }\n\n return result;\n },\n onLoadExternalState: (repo: MessageFormatRepository<UI_MESSAGE>) => {\n // Convert MessageFormatRepository to ExportedMessageRepository\n const exportedRepo = toExportedMessageRepository(toThreadMessages, repo);\n\n // Import into the thread's MessageRepository\n runtimeRef.current.thread.import(exportedRepo);\n },\n onCancel: async () => {\n const message = chatHelpers.messages.at(-1);\n const cancelledId =\n isRunning && message?.role === \"assistant\" ? message.id : undefined;\n if (cancelledId) {\n const liveIds = new Set(chatHelpers.messages.map((m) => m.id));\n setCancelledMessages((prev) => {\n const kept =\n prev?.chatId === chatHelpers.id\n ? [...prev.ids].filter((id) => liveIds.has(id))\n : [];\n return {\n chatId: chatHelpers.id,\n ids: new Set([...kept, cancelledId]),\n };\n });\n }\n try {\n await chatHelpers.stop();\n } catch (error) {\n if (!(error instanceof Error && error.name === \"AbortError\")) {\n if (cancelledId) retractCancellation(chatHelpers.id, cancelledId);\n throw error;\n }\n }\n },\n onNew: async (message) => {\n const createMessage = (\n customToCreateMessage ?? toCreateMessage\n )<UI_MESSAGE>(message);\n\n if (!(message.startRun ?? message.role === \"user\")) {\n chatHelpers.setMessages((current) => [\n ...current,\n toUIMessage<UI_MESSAGE>(createMessage, message.role),\n ]);\n return;\n }\n\n lastRunConfigRef.current = message.runConfig;\n await completePendingToolCalls();\n await chatHelpers.sendMessage(createMessage, {\n metadata: message.runConfig,\n });\n },\n onEdit: async (message) => {\n const createMessage = (\n customToCreateMessage ?? toCreateMessage\n )<UI_MESSAGE>(message);\n\n if (!(message.startRun ?? message.role === \"user\")) {\n chatHelpers.setMessages((current) => [\n ...sliceMessagesUntil(current, message.parentId),\n toUIMessage<UI_MESSAGE>(createMessage, message.role),\n ]);\n return;\n }\n\n lastRunConfigRef.current = message.runConfig;\n chatHelpers.setMessages((current) =>\n sliceMessagesUntil(current, message.parentId),\n );\n await chatHelpers.sendMessage(createMessage, {\n metadata: message.runConfig,\n });\n },\n onDelete: async (messageId) => {\n const threadMessages = runtimeRef.current.thread.getState().messages;\n const messageIndex = threadMessages.findIndex(\n (message) => message.id === messageId,\n );\n if (messageIndex === -1) return;\n\n await deleteHistoryMessage(messageId);\n\n let removedToolArtifact = false;\n let removedToolInteractions = false;\n let removedToolApprovalResponse = false;\n let removedHostApprovalId = false;\n for (const part of threadMessages[messageIndex]!.content) {\n if (part.type === \"tool-call\") {\n removedToolArtifact =\n toolArtifactsRef.current.delete(part.toolCallId) ||\n removedToolArtifact;\n removedToolInteractions =\n toolInteractionsRef.current.delete(part.toolCallId) ||\n removedToolInteractions;\n if (part.approval) {\n removedToolApprovalResponse =\n toolApprovalResponsesRef.current.delete(part.approval.id) ||\n removedToolApprovalResponse;\n removedHostApprovalId =\n hostApprovalIdsRef.current.delete(part.approval.id) ||\n removedHostApprovalId;\n }\n }\n }\n if (removedToolArtifact) markToolArtifactsChanged();\n if (removedToolInteractions) markToolInteractionsChanged();\n if (removedToolApprovalResponse || removedHostApprovalId) {\n setToolApprovalResponses(new Map(toolApprovalResponsesRef.current));\n }\n\n const deleteIds = new Set(\n getExternalStoreMessages<UI_MESSAGE>(threadMessages[messageIndex]!).map(\n (message) => message.id,\n ),\n );\n chatHelpers.setMessages((current) =>\n current.filter((message) => !deleteIds.has(message.id)),\n );\n },\n onReload: async (parentId: string | null, config) => {\n lastRunConfigRef.current = config.runConfig;\n const newMessages = sliceMessagesUntil(chatHelpers.messages, parentId);\n chatHelpers.setMessages(newMessages);\n\n await chatHelpers.regenerate({ metadata: config.runConfig });\n },\n onAddToolResult: ({\n toolCallId,\n toolName,\n result,\n isError,\n artifact,\n modelContent,\n }) => {\n if (artifact !== undefined) {\n toolArtifactsRef.current.set(toolCallId, artifact);\n markToolArtifactsChanged();\n }\n const options = { metadata: lastRunConfigRef.current };\n if (isError) {\n return Promise.resolve(\n chatHelpers.addToolOutput({\n state: \"output-error\",\n tool: toolName ?? toolCallId,\n toolCallId,\n errorText:\n typeof result === \"string\" ? result : JSON.stringify(result),\n options,\n }),\n );\n } else {\n const output =\n modelContent !== undefined\n ? wrapModelContentEnvelope(result, modelContent)\n : result;\n return Promise.resolve(\n chatHelpers.addToolOutput({\n tool: toolName,\n toolCallId,\n output,\n options,\n }),\n );\n }\n },\n onRespondToToolApproval: customOnRespondToToolApproval\n ? (response) => respondViaHost(customOnRespondToToolApproval, response)\n : respondViaAISDK,\n unstable_onRecordToolInteraction: ({\n messageId,\n toolCallId,\n interaction,\n }) => {\n toolInteractionsRef.current.set(\n toolCallId,\n appendToolInteraction(\n toolInteractionsRef.current.get(toolCallId),\n interaction,\n ),\n );\n markToolInteractionsChanged();\n return persistToolInteractions(messageId);\n },\n ...pickExternalStoreSharedOptions(adapter),\n ...(adapter.unstable_messageRepositoryInstance && {\n unstable_messageRepositoryInstance:\n adapter.unstable_messageRepositoryInstance,\n }),\n ...(suggestionAdapter ? { suggestions: generatedSuggestions } : {}),\n ...(onResume && { onResume }),\n ...(onResumeToolCall && { onResumeToolCall }),\n ...(unstable_onBranchChange && { unstable_onBranchChange }),\n adapters: {\n attachments: vercelAttachmentAdapter,\n ...contextAdapters,\n ...adapters,\n },\n extras,\n isLoading,\n });\n\n const setMessagesRef = useRef(chatHelpers.setMessages);\n useInsertionEffect(() => {\n setMessagesRef.current = chatHelpers.setMessages;\n }, [chatHelpers.setMessages]);\n\n useEffect(() => {\n if (hasSeededRepositoryRef.current) return;\n if (!exportedMessageRepository) return;\n if (chatHelpers.messages.length > 0) {\n hasSeededRepositoryRef.current = true;\n return;\n }\n const tempRepo = new MessageRepository();\n tempRepo.import(exportedMessageRepository);\n setMessagesRef.current(\n tempRepo.getMessages().flatMap(getExternalStoreMessages<UI_MESSAGE>),\n );\n hasSeededRepositoryRef.current = true;\n }, [exportedMessageRepository, chatHelpers.messages.length]);\n return runtime;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useAISDKRuntime.js","names":["c","_c","useCallback","useEffect","useInsertionEffect","useMemo","useRef","useState","UIMessage","useChat","CreateUIMessage","UseChatHelpers","isToolUIPart","generateId","getToolName","useExternalStoreRuntime","useRuntimeAdapters","JoinStrategy","useReplaySafeEffect","SuggestionAdapter","ThreadSuggestion","ToolExecutionStatus","ExternalStoreAdapter","ExternalStoreSharedOptions","ThreadHistoryAdapter","AssistantRuntime","ThreadMessage","MessageFormatAdapter","MessageFormatItem","MessageFormatRepository","AppendMessage","RunConfig","McpAppMetadata","RespondToToolApprovalOptions","Unstable_ToolInteractionLog","getExternalStoreMessages","pickExternalStoreSharedOptions","appendToolInteraction","consumeSuggestionResult","MessageRepository","ReadonlyJSONObject","AssistantError","sliceMessagesUntil","toCreateMessage","vercelAttachmentAdapter","getVercelAIMessages","AISDKMessageConverter","AISDKMessageConverterMetadata","wrapModelContentEnvelope","AISDKStorageFormat","aiSDKV6FormatAdapter","useExternalHistory","toExportedMessageRepository","useStreamingTiming","aiSDKExtras","CustomToCreateMessageFunction","message","UI_MESSAGE","toUIMessage","createMessage","fallbackRole","id","role","toVoiceTranscriptUIMessage","parts","content","filter","part","type","map","text","metadata","modality","Object","keys","custom","length","AISDKRuntimeAdapter","adapters","NonNullable","history","suggestion","unstable_messageRepositoryInstance","unstable_hostApprovalOwner","cancelPendingToolCallsOnSend","onResume","onResumeToolCall","onRespondToToolApproval","response","context","toolCallId","toolName","respondViaAISDK","Promise","joinStrategy","messageRepository","unstable_onBranchChange","EMPTY_SUGGESTIONS","useGeneratedSuggestions","suggestionAdapter","messages","isRunning","$","suggestions","setSuggestions","controllerRef","wasRunningRef","messagesRef","t0","t1","current","adapterRef","t2","t3","hasAdapter","t4","clearSuggestions","abort","_temp","adapter","currentMessages","last","at","status","controller","AbortController","signal","promiseOrGenerator","generate","onUpdate","t5","t6","t7","Symbol","for","NO_CANCELLED_MESSAGE_IDS","ReadonlySet","Set","NO_SUPERSEDED_APPROVAL_PROJECTION","freeze","approvalIds","statusMessageIds","NO_TOOL_APPROVAL_RESPONSES","ReadonlyMap","Map","OwnedApproval","hostToolApprovalsByChat","WeakMap","toApprovalResponses","owned","size","entry","hostApprovalListenersByChat","subscribeToHostApprovals","owner","listener","listeners","get","set","add","delete","notifyHostApprovals","getSupersededApprovalProjection","hostApprovalIds","lastIndex","lastAssistant","hasSupersededApproval","previousWasVoice","flush","hasOpenToolPart","some","state","approval","resolution","descriptor","undefined","index","isVoice","approvalId","has","findRawToolMessageIndex","messageId","containsToolCall","messageIndex","findIndex","start","end","toChatError","error","Error","code","name","useAISDKRuntime","chatHelpers","ReturnType","customToCreateMessage","customOnRespondToToolApproval","contextAdapters","toolStatuses","setToolStatuses","Record","cancelledMessages","setCancelledMessages","chatId","ids","approvalOwner","ownedApprovals","created","toolApprovalResponses","setToolApprovalResponses","toolArtifactEpoch","setToolArtifactEpoch","toolInteractionEpoch","setToolInteractionEpoch","toolApprovalResponsesRef","ownedApprovalIdsRef","hostApprovalIdsRef","sync","prev","next","unchanged","every","unsubscribe","lastApprovalOwnerRef","toolArgsKeyOrderCacheRef","toolLastInputCacheRef","toolArgsTextCacheRef","mcpAppMetadataCacheRef","toolArtifactsRef","toolInteractionsRef","lastRunConfigRef","markToolArtifactsChanged","epoch","markToolInteractionsChanged","hasExecutingTools","values","s","providerIsRunning","wasProviderRunningRef","messageTiming","lastMessage","optimisticMessageId","cancelledMessageIds","supportsRichToolApprovalResponses","supersededApprovalProjectionRef","supersededApprovalProjection","projection","previous","toThreadMessages","sourceMessages","toolArtifacts","toolInteractions","retractCancellation","resumedMessageId","wasProviderRunning","useThreadMessages","toolArgsKeyOrderCache","toolArgsTextCache","toolLastInputCache","mcpAppMetadataCache","cancelledToolApprovalIds","cancelledStatusMessageIds","exportedMessageRepository","converted","generatedSuggestions","runtimeRef","runtime","isLoading","deleteMessage","deleteHistoryMessage","persistToolInteractions","persistToolApprovalResponses","setMessages","chatMessages","chatStatus","extras","provide","chat","completePendingToolCalls","hasChanges","messageChanged","_approval","rest","const","errorText","approved","reason","resolve","addToolApprovalResponse","options","respondViaHost","onRespond","requested","flatMap","find","startedWith","startedOwner","startedResponses","isApplied","applyResponse","applied","remainsApplied","hasSeededRepositoryRef","shouldFeedRepository","unstable_persistsHistory","unstable_enableToolInvocations","Boolean","flat","onImport","onVoiceTranscript","onExportExternalState","exported","thread","export","expandedMessages","lastInnerIdMap","item","innerMessages","parentId","innerMessage","push","getId","result","headId","onLoadExternalState","repo","exportedRepo","import","onCancel","cancelledId","liveIds","m","kept","stop","onNew","startRun","runConfig","sendMessage","onEdit","onDelete","threadMessages","getState","removedToolArtifact","removedToolInteractions","removedToolApprovalResponse","removedHostApprovalId","deleteIds","onReload","config","newMessages","regenerate","onAddToolResult","isError","artifact","modelContent","targetIndex","JSON","stringify","output","target","targetPart","preliminary","targetMessageId","_preliminary","finalPart","addToolOutput","tool","reject","unstable_onRecordToolInteraction","interaction","attachments","setMessagesRef","tempRepo","getMessages"],"sources":["../../src/runtime/useAISDKRuntime.ts"],"sourcesContent":["\"use client\";\n\nimport {\n useCallback,\n useEffect,\n useInsertionEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type {\n UIMessage,\n useChat,\n CreateUIMessage,\n UseChatHelpers,\n} from \"@ai-sdk/react\";\nimport { isToolUIPart, generateId, getToolName } from \"ai\";\nimport {\n useExternalStoreRuntime,\n useRuntimeAdapters,\n type JoinStrategy,\n} from \"@assistant-ui/core/react\";\nimport { useReplaySafeEffect } from \"@assistant-ui/store/internal\";\nimport type {\n SuggestionAdapter,\n ThreadSuggestion,\n ToolExecutionStatus,\n} from \"@assistant-ui/core\";\nimport type {\n ExternalStoreAdapter,\n ExternalStoreSharedOptions,\n ThreadHistoryAdapter,\n AssistantRuntime,\n ThreadMessage,\n MessageFormatAdapter,\n MessageFormatItem,\n MessageFormatRepository,\n AppendMessage,\n RunConfig,\n McpAppMetadata,\n RespondToToolApprovalOptions,\n Unstable_ToolInteractionLog,\n} from \"@assistant-ui/core\";\nimport {\n getExternalStoreMessages,\n pickExternalStoreSharedOptions,\n} from \"@assistant-ui/core\";\nimport {\n appendToolInteraction,\n consumeSuggestionResult,\n MessageRepository,\n} from \"@assistant-ui/core/internal\";\nimport type { ReadonlyJSONObject } from \"assistant-stream/utils\";\nimport type { AssistantError } from \"@assistant-ui/core\";\nimport { sliceMessagesUntil } from \"../utils/sliceMessagesUntil\";\nimport { toCreateMessage } from \"../converters/toCreateMessage\";\nimport { vercelAttachmentAdapter } from \"../adapters/vercelAttachmentAdapter\";\nimport { getVercelAIMessages } from \"../utils/getVercelAIMessages\";\nimport {\n AISDKMessageConverter,\n type AISDKMessageConverterMetadata,\n} from \"../converters/convertMessage\";\nimport { wrapModelContentEnvelope } from \"../converters/modelContentEnvelope\";\nimport {\n type AISDKStorageFormat,\n aiSDKV6FormatAdapter,\n} from \"../adapters/aiSDKFormatAdapter\";\nimport {\n useExternalHistory,\n toExportedMessageRepository,\n} from \"./useExternalHistory\";\nimport { useStreamingTiming } from \"./useStreamingTiming\";\nimport { aiSDKExtras } from \"../aiSDKExtras\";\n\nexport type CustomToCreateMessageFunction = <\n UI_MESSAGE extends UIMessage = UIMessage,\n>(\n message: AppendMessage,\n) => CreateUIMessage<UI_MESSAGE>;\n\nconst toUIMessage = <UI_MESSAGE extends UIMessage>(\n createMessage: CreateUIMessage<UI_MESSAGE>,\n fallbackRole: UI_MESSAGE[\"role\"],\n): UI_MESSAGE =>\n ({\n ...createMessage,\n id: createMessage.id ?? generateId(),\n role: createMessage.role ?? fallbackRole,\n }) as UI_MESSAGE;\n\nconst toVoiceTranscriptUIMessage = <UI_MESSAGE extends UIMessage>(\n message: ThreadMessage,\n): UI_MESSAGE =>\n ({\n id: message.id,\n role: message.role,\n parts: message.content\n .filter((part) => part.type === \"text\")\n .map((part) => ({ type: \"text\", text: part.text })),\n metadata: {\n ...(message.metadata.modality && { modality: message.metadata.modality }),\n ...(Object.keys(message.metadata.custom).length > 0 && {\n custom: message.metadata.custom,\n }),\n },\n }) as UI_MESSAGE;\n\nexport type AISDKRuntimeAdapter<UI_MESSAGE extends UIMessage = UIMessage> =\n ExternalStoreSharedOptions & {\n adapters?:\n | (NonNullable<ExternalStoreAdapter[\"adapters\"]> & {\n history?: ThreadHistoryAdapter | undefined;\n suggestion?: SuggestionAdapter | undefined;\n })\n | undefined;\n toCreateMessage?: CustomToCreateMessageFunction;\n unstable_messageRepositoryInstance?: MessageRepository | undefined;\n /**\n * The object a host answer belongs to, normally the `Chat` the runtime\n * renders. A host answer never reaches the `useChat` messages, so without\n * an owner it lives only as long as this runtime. With an owner, it\n * survives runtime remounts over the same chat.\n */\n unstable_hostApprovalOwner?: object | undefined;\n /**\n * Whether to automatically cancel pending interactive tool calls when the user sends a new message.\n *\n * When enabled (default), the pending tool calls will be marked as failed with an error message\n * indicating the user cancelled the tool call by sending a new message.\n *\n * @default true\n */\n cancelPendingToolCallsOnSend?: boolean | undefined;\n /**\n * Called when `runtime.thread.resumeRun(config)` is invoked.\n *\n * When omitted, `resumeRun` throws `\"Runtime does not support resuming runs.\"`.\n * Provide this to bridge resume invocations into a custom replay channel\n * (for example, an SSE reconnect endpoint keyed by turn id).\n */\n onResume?: ExternalStoreAdapter[\"onResume\"];\n /**\n * Called when `runtime.thread.resumeToolCall(options)` is invoked for a tool call the in-process tracker does not own.\n *\n * When omitted, `resumeToolCall` throws `\"Tool call ${toolCallId} is not waiting for resume.\"`.\n * Provide this to bridge resume-tool-call invocations into a custom handler.\n */\n onResumeToolCall?: ExternalStoreAdapter[\"onResumeToolCall\"];\n /**\n * Answers tool approval requests through a host-owned channel instead of the AI SDK's `addToolApprovalResponse`.\n *\n * Called for every approval request in the thread with the complete response, including option and free-form answers. Hand requests the host does not own to `respondViaAISDK`, which is what runs when this option is omitted. The answer applies to the approval when the handler starts and is removed if it throws. It is never written into the `useChat` messages, so `sendAutomaticallyWhen` cannot forward it. With a history adapter, the answer is stored with its message once the handler resolves and returns on reload. With `unstable_hostApprovalOwner`, in-memory answers survive runtime remounts over the same chat; without an owner or history adapter, they last only as long as the runtime. Bring the resumed run back into the chat, for example with `resumeStream`, and have the endpoint refuse a second resume.\n *\n * While a handler is set, an approval's `display`, `allowFreeform`, `dismissible` and `options` reach the renderer, because the handler can receive answers the AI SDK cannot carry. A stream declares them through the `approvalDescriptor` of its `tool-approval-request` chunk, the one approval field the AI SDK keeps opaque; the converter reads the request and answer fields from that descriptor when the approval itself lacks them.\n */\n onRespondToToolApproval?:\n | ((\n response: RespondToToolApprovalOptions,\n context: {\n toolCallId: string;\n toolName: string;\n /** Sends this response through the AI SDK's `addToolApprovalResponse`, which carries only `approved` and `reason`. */\n respondViaAISDK: () => Promise<void>;\n },\n ) => Promise<void> | void)\n | undefined;\n /**\n * How consecutive assistant messages are rendered.\n *\n * `\"concat-content\"` (the default) merges them into a single thread message.\n * `\"none\"` keeps each assistant message as its own thread message, which is\n * useful when a backend persists proactive or consecutive assistant messages\n * as separate entries.\n */\n joinStrategy?: JoinStrategy | undefined;\n /**\n * A branch-aware AI SDK message tree seeded once when `useChat` is empty.\n * After that seed, live updates come only from `useChat`. A later empty\n * chat or a new object identity does not reload the tree.\n */\n messageRepository?: MessageFormatRepository<UI_MESSAGE>;\n /**\n * Called after an explicit `switchToBranch` (for example a BranchPicker\n * click). Complements `setMessages` and does not enable switching by itself.\n *\n * @deprecated This API is still under active development and might change without notice.\n */\n unstable_onBranchChange?: ExternalStoreAdapter[\"unstable_onBranchChange\"];\n };\n\nconst EMPTY_SUGGESTIONS: readonly ThreadSuggestion[] = [];\n\nconst useGeneratedSuggestions = (\n suggestionAdapter: SuggestionAdapter | undefined,\n messages: readonly ThreadMessage[],\n isRunning: boolean,\n): readonly ThreadSuggestion[] => {\n const [suggestions, setSuggestions] =\n useState<readonly ThreadSuggestion[]>(EMPTY_SUGGESTIONS);\n const controllerRef = useRef<AbortController | null>(null);\n const wasRunningRef = useRef(false);\n const messagesRef = useRef(messages);\n useInsertionEffect(() => {\n messagesRef.current = messages;\n }, [messages]);\n const adapterRef = useRef(suggestionAdapter);\n useInsertionEffect(() => {\n adapterRef.current = suggestionAdapter;\n }, [suggestionAdapter]);\n const hasAdapter = suggestionAdapter != null;\n\n useEffect(() => {\n const clearSuggestions = () => {\n controllerRef.current?.abort();\n controllerRef.current = null;\n setSuggestions((prev) => (prev.length === 0 ? prev : EMPTY_SUGGESTIONS));\n };\n\n const adapter = adapterRef.current;\n if (!adapter) {\n clearSuggestions();\n wasRunningRef.current = isRunning;\n return;\n }\n\n if (isRunning) {\n if (!wasRunningRef.current) {\n clearSuggestions();\n }\n wasRunningRef.current = true;\n return;\n }\n\n if (!wasRunningRef.current) return;\n wasRunningRef.current = false;\n\n const currentMessages = messagesRef.current;\n const last = currentMessages.at(-1);\n if (last?.role !== \"assistant\") return;\n if (last.status?.type === \"requires-action\") return;\n\n const controller = new AbortController();\n controllerRef.current = controller;\n const { signal } = controller;\n\n void (async () => {\n try {\n const promiseOrGenerator = adapter.generate({\n messages: currentMessages,\n signal,\n });\n\n await consumeSuggestionResult(promiseOrGenerator, {\n signal,\n onUpdate: setSuggestions,\n });\n } catch {}\n })();\n }, [hasAdapter, isRunning]);\n\n useReplaySafeEffect(() => {\n return () => {\n controllerRef.current?.abort();\n };\n }, []);\n\n return suggestions;\n};\n\nconst NO_CANCELLED_MESSAGE_IDS: ReadonlySet<string> = new Set();\n\nconst NO_SUPERSEDED_APPROVAL_PROJECTION = Object.freeze({\n approvalIds: Object.freeze(new Set<string>()),\n statusMessageIds: Object.freeze(new Set<string>()),\n});\n\nconst NO_TOOL_APPROVAL_RESPONSES: ReadonlyMap<\n string,\n RespondToToolApprovalOptions\n> = new Map();\n\n/**\n * A host answer is deliberately kept out of the `useChat` messages, so nothing\n * in the chat records it. Held in runtime state it would die with the runtime,\n * and a runtime mounted again over the same chat would show the request open\n * and take a second answer. Keyed on the chat instead, the answer lives as\n * long as the chat it belongs to, and is collected with it.\n */\ntype OwnedApproval = {\n response: RespondToToolApprovalOptions;\n};\n\nconst hostToolApprovalsByChat = new WeakMap<\n object,\n Map<string, OwnedApproval>\n>();\n\nconst toApprovalResponses = (\n owned: ReadonlyMap<string, OwnedApproval> | undefined,\n): ReadonlyMap<string, RespondToToolApprovalOptions> =>\n owned && owned.size > 0\n ? new Map([...owned].map(([id, entry]) => [id, entry.response]))\n : NO_TOOL_APPROVAL_RESPONSES;\n\n/**\n * The answers live on the owner, but each mounted runtime renders them from\n * its own state, so a write has to be announced: the runtime that performed it\n * may already be unmounted (a rollback resolving after a remount), and another\n * runtime may be mounted over the same owner.\n */\nconst hostApprovalListenersByChat = new WeakMap<object, Set<() => void>>();\n\nconst subscribeToHostApprovals = (owner: object, listener: () => void) => {\n const listeners = hostApprovalListenersByChat.get(owner) ?? new Set();\n hostApprovalListenersByChat.set(owner, listeners);\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n};\n\nconst notifyHostApprovals = (owner: object) => {\n for (const listener of [...(hostApprovalListenersByChat.get(owner) ?? [])]) {\n listener();\n }\n};\n\nconst getSupersededApprovalProjection = <UI_MESSAGE extends UIMessage>(\n messages: readonly UI_MESSAGE[],\n hostApprovalIds: ReadonlySet<string>,\n joinStrategy: JoinStrategy | undefined,\n isRunning: boolean,\n) => {\n const approvalIds = new Set<string>();\n const statusMessageIds = new Set<string>();\n const lastIndex = messages.length - 1;\n let lastAssistant: UI_MESSAGE | undefined;\n let hasSupersededApproval = false;\n let previousWasVoice = false;\n\n const flush = () => {\n const hasOpenToolPart =\n lastAssistant === messages[lastIndex] &&\n lastAssistant?.parts?.some((part) => {\n if (\n !isToolUIPart(part) ||\n part.state === \"output-available\" ||\n part.state === \"output-error\" ||\n part.state === \"output-denied\"\n )\n return false;\n\n const approval = (\n part as {\n approval?: {\n resolution?: unknown;\n descriptor?: unknown;\n };\n }\n ).approval;\n const resolution =\n approval?.resolution ??\n (approval?.descriptor as { resolution?: unknown } | undefined)\n ?.resolution;\n return resolution !== \"cancelled\" && resolution !== \"expired\";\n });\n if (\n lastAssistant &&\n hasSupersededApproval &&\n !hasOpenToolPart &&\n !(isRunning && lastAssistant === messages[lastIndex])\n ) {\n statusMessageIds.add(lastAssistant.id);\n }\n lastAssistant = undefined;\n hasSupersededApproval = false;\n previousWasVoice = false;\n };\n\n for (let index = 0; index < messages.length; index++) {\n const message = messages[index]!;\n if (message.role !== \"assistant\") {\n flush();\n } else {\n const isVoice =\n (message.metadata as { modality?: unknown } | undefined)?.modality ===\n \"voice\";\n if (isVoice || previousWasVoice || joinStrategy === \"none\") flush();\n lastAssistant = message;\n previousWasVoice = isVoice;\n }\n\n for (const part of message.parts ?? []) {\n if (!isToolUIPart(part) || part.state !== \"approval-requested\") continue;\n\n const approval = part.approval;\n if (!approval) continue;\n\n const approvalId = approval.id;\n if (hostApprovalIds.has(approvalId)) continue;\n\n const resolution =\n (approval as { resolution?: unknown }).resolution ??\n (approval.descriptor as { resolution?: unknown } | null | undefined)\n ?.resolution;\n if (resolution === \"cancelled\" || resolution === \"expired\") continue;\n\n if (index !== lastIndex) {\n approvalIds.add(approvalId);\n if (message.role === \"assistant\") hasSupersededApproval = true;\n }\n }\n }\n flush();\n\n if (approvalIds.size === 0 && statusMessageIds.size === 0)\n return NO_SUPERSEDED_APPROVAL_PROJECTION;\n\n return { approvalIds, statusMessageIds };\n};\n\nconst findRawToolMessageIndex = <UI_MESSAGE extends UIMessage>(\n messages: readonly UI_MESSAGE[],\n messageId: string,\n toolCallId: string,\n joinStrategy: JoinStrategy | undefined,\n) => {\n const containsToolCall = (message: UI_MESSAGE) =>\n message.parts?.some(\n (part) => isToolUIPart(part) && part.toolCallId === toolCallId,\n ) === true;\n\n const messageIndex = messages.findIndex(\n (message) => message.id === messageId,\n );\n if (messageIndex === -1) return -1;\n if (containsToolCall(messages[messageIndex]!)) return messageIndex;\n if (joinStrategy === \"none\" || messages[messageIndex]?.role !== \"assistant\")\n return -1;\n\n let start = messageIndex;\n while (start > 0 && messages[start - 1]?.role === \"assistant\") start--;\n\n let end = messageIndex;\n while (end + 1 < messages.length && messages[end + 1]?.role === \"assistant\")\n end++;\n\n for (let index = start; index <= end; index++) {\n if (containsToolCall(messages[index]!)) return index;\n }\n return -1;\n};\n\nconst toChatError = (error: Error): AssistantError => {\n const code = (error as { code?: unknown }).code;\n return {\n code:\n typeof code === \"string\"\n ? code\n : error.name !== \"Error\"\n ? error.name\n : \"unknown\",\n message: error.message,\n };\n};\n\nexport const useAISDKRuntime = <UI_MESSAGE extends UIMessage = UIMessage>(\n chatHelpers: ReturnType<typeof useChat<UI_MESSAGE>>,\n adapter: AISDKRuntimeAdapter<UI_MESSAGE> = {},\n) => {\n const {\n adapters,\n toCreateMessage: customToCreateMessage,\n cancelPendingToolCallsOnSend = true,\n onResume,\n onResumeToolCall,\n onRespondToToolApproval: customOnRespondToToolApproval,\n joinStrategy,\n messageRepository,\n unstable_onBranchChange,\n } = adapter;\n const suggestionAdapter = adapters?.suggestion;\n const contextAdapters = useRuntimeAdapters();\n const [toolStatuses, setToolStatuses] = useState<\n Record<string, ToolExecutionStatus>\n >({});\n const [cancelledMessages, setCancelledMessages] = useState<{\n chatId: string;\n ids: ReadonlySet<string>;\n } | null>(null);\n // Set by hosts that own the chat across runtime lifetimes, so a host answer\n // outlives a remount over that same chat.\n const approvalOwner = adapter.unstable_hostApprovalOwner;\n const ownedApprovals = approvalOwner\n ? (hostToolApprovalsByChat.get(approvalOwner) ??\n (() => {\n const created = new Map<string, OwnedApproval>();\n hostToolApprovalsByChat.set(approvalOwner, created);\n return created;\n })())\n : undefined;\n const [toolApprovalResponses, setToolApprovalResponses] = useState<\n ReadonlyMap<string, RespondToToolApprovalOptions>\n >(() => toApprovalResponses(ownedApprovals));\n const [toolArtifactEpoch, setToolArtifactEpoch] = useState(0);\n const [toolInteractionEpoch, setToolInteractionEpoch] = useState(0);\n const toolApprovalResponsesRef = useRef(\n new Map(toApprovalResponses(ownedApprovals)),\n );\n const ownedApprovalIdsRef = useRef(new Set(ownedApprovals?.keys()));\n const hostApprovalIdsRef = useRef(new Set<string>(ownedApprovals?.keys()));\n\n // The owner's record is shared, so this runtime re-reads it whenever it is\n // written rather than only at mount: the write may come from a runtime that\n // has since unmounted, or from another runtime mounted over the same owner.\n useEffect(() => {\n if (!approvalOwner || !ownedApprovals) return undefined;\n const sync = () => {\n for (const id of ownedApprovalIdsRef.current)\n toolApprovalResponsesRef.current.delete(id);\n for (const [id, entry] of ownedApprovals)\n toolApprovalResponsesRef.current.set(id, entry.response);\n ownedApprovalIdsRef.current = new Set(ownedApprovals.keys());\n hostApprovalIdsRef.current = new Set(\n toolApprovalResponsesRef.current.keys(),\n );\n setToolApprovalResponses((prev) => {\n const next = new Map(toolApprovalResponsesRef.current);\n const unchanged =\n prev.size === next.size &&\n [...next].every(([id, response]) => prev.get(id) === response);\n return unchanged ? prev : next;\n });\n };\n const unsubscribe = subscribeToHostApprovals(approvalOwner, sync);\n // The state was seeded during render, so a write landing between then and\n // this subscription would otherwise never be seen.\n sync();\n return unsubscribe;\n }, [approvalOwner, ownedApprovals]);\n\n // A runtime kept mounted across a change of owner must not carry the\n // previous chat's answers: a reused approval id would render as already\n // answered and reject a genuine response.\n const lastApprovalOwnerRef = useRef(approvalOwner);\n if (lastApprovalOwnerRef.current !== approvalOwner) {\n lastApprovalOwnerRef.current = approvalOwner;\n hostApprovalIdsRef.current = new Set<string>(ownedApprovals?.keys());\n toolApprovalResponsesRef.current = new Map(\n toApprovalResponses(ownedApprovals),\n );\n ownedApprovalIdsRef.current = new Set(ownedApprovals?.keys());\n setToolApprovalResponses(new Map(toolApprovalResponsesRef.current));\n }\n const toolArgsKeyOrderCacheRef = useRef<Map<string, Map<string, string[]>>>(\n new Map(),\n );\n const toolLastInputCacheRef = useRef<Map<string, ReadonlyJSONObject>>(\n new Map(),\n );\n const toolArgsTextCacheRef = useRef<\n WeakMap<ReadonlyJSONObject, Map<string, string>>\n >(new WeakMap());\n const mcpAppMetadataCacheRef = useRef<Map<string, McpAppMetadata>>(new Map());\n const toolArtifactsRef = useRef<Map<string, unknown>>(new Map());\n const toolInteractionsRef = useRef<Map<string, Unstable_ToolInteractionLog>>(\n new Map(),\n );\n const lastRunConfigRef = useRef<RunConfig | undefined>(undefined);\n const markToolArtifactsChanged = useCallback(() => {\n setToolArtifactEpoch((epoch) => epoch + 1);\n }, []);\n const markToolInteractionsChanged = useCallback(() => {\n setToolInteractionEpoch((epoch) => epoch + 1);\n }, []);\n\n const hasExecutingTools = Object.values(toolStatuses).some(\n (s) => s?.type === \"executing\",\n );\n const providerIsRunning =\n chatHelpers.status === \"submitted\" || chatHelpers.status === \"streaming\";\n const isRunning = providerIsRunning || hasExecutingTools;\n const wasProviderRunningRef = useRef(providerIsRunning);\n\n const messageTiming = useStreamingTiming(chatHelpers.messages, isRunning);\n\n // Flag the streaming message optimistic: its id can be swapped for a server\n // id mid-run, and the repository then drops the orphaned pre-swap id (#4037).\n const lastMessage = chatHelpers.messages.at(-1);\n const optimisticMessageId =\n isRunning && lastMessage?.role === \"assistant\" ? lastMessage.id : undefined;\n\n const cancelledMessageIds =\n cancelledMessages?.chatId === chatHelpers.id\n ? cancelledMessages.ids\n : NO_CANCELLED_MESSAGE_IDS;\n const supportsRichToolApprovalResponses =\n customOnRespondToToolApproval != null;\n const supersededApprovalProjectionRef = useRef(\n NO_SUPERSEDED_APPROVAL_PROJECTION,\n );\n const supersededApprovalProjection = useMemo(\n () => {\n const projection = getSupersededApprovalProjection(\n chatHelpers.messages,\n hostApprovalIdsRef.current,\n joinStrategy,\n isRunning,\n );\n const previous = supersededApprovalProjectionRef.current;\n if (\n projection.approvalIds.size === previous.approvalIds.size &&\n projection.statusMessageIds.size === previous.statusMessageIds.size &&\n [...projection.approvalIds].every((id) =>\n previous.approvalIds.has(id),\n ) &&\n [...projection.statusMessageIds].every((id) =>\n previous.statusMessageIds.has(id),\n )\n )\n return previous;\n\n supersededApprovalProjectionRef.current = projection;\n return projection;\n },\n // oxlint-disable-next-line react/exhaustive-deps -- hostApprovalIdsRef changes alongside toolApprovalResponses, which invalidates the projection\n [chatHelpers.messages, joinStrategy, isRunning, toolApprovalResponses],\n );\n\n const toThreadMessages = useCallback(\n (sourceMessages: UI_MESSAGE[]) => {\n const metadata: AISDKMessageConverterMetadata = {\n supportsRichToolApprovalResponses,\n toolArtifacts: toolArtifactsRef.current,\n toolInteractions: toolInteractionsRef.current,\n toolApprovalResponses: toolApprovalResponsesRef.current,\n };\n return AISDKMessageConverter.toThreadMessages(\n sourceMessages,\n false,\n metadata,\n );\n },\n [supportsRichToolApprovalResponses],\n );\n\n const retractCancellation = useCallback(\n (chatId: string, messageId: string) => {\n setCancelledMessages((prev) => {\n if (prev?.chatId !== chatId || !prev.ids.has(messageId)) return prev;\n const ids = new Set(prev.ids);\n ids.delete(messageId);\n return { chatId, ids };\n });\n },\n [],\n );\n\n // A provider run that resumes the stopped response retracts its cancellation;\n // a run that starts a new response leaves the stopped one marked.\n const resumedMessageId =\n providerIsRunning && lastMessage?.role === \"assistant\"\n ? lastMessage.id\n : undefined;\n\n useEffect(() => {\n const wasProviderRunning = wasProviderRunningRef.current;\n wasProviderRunningRef.current = providerIsRunning;\n if (wasProviderRunning || !resumedMessageId) return;\n retractCancellation(chatHelpers.id, resumedMessageId);\n }, [\n providerIsRunning,\n resumedMessageId,\n chatHelpers.id,\n retractCancellation,\n ]);\n\n const messages = AISDKMessageConverter.useThreadMessages({\n isRunning,\n messages: chatHelpers.messages,\n joinStrategy,\n metadata: useMemo<AISDKMessageConverterMetadata>(\n () => ({\n toolStatuses,\n messageTiming,\n toolArgsKeyOrderCache: toolArgsKeyOrderCacheRef.current,\n toolArgsTextCache: toolArgsTextCacheRef.current,\n toolLastInputCache: toolLastInputCacheRef.current,\n mcpAppMetadataCache: mcpAppMetadataCacheRef.current,\n toolArtifacts: toolArtifactsRef.current,\n toolInteractions: toolInteractionsRef.current,\n supportsRichToolApprovalResponses,\n cancelledToolApprovalIds: supersededApprovalProjection.approvalIds,\n cancelledStatusMessageIds:\n supersededApprovalProjection.statusMessageIds,\n ...(optimisticMessageId && { optimisticMessageId }),\n ...(chatHelpers.error && {\n error: toChatError(chatHelpers.error),\n }),\n ...(cancelledMessageIds.size > 0 && { cancelledMessageIds }),\n ...(toolApprovalResponses.size > 0 && { toolApprovalResponses }),\n }),\n [\n toolStatuses,\n messageTiming,\n optimisticMessageId,\n chatHelpers.error,\n cancelledMessageIds,\n toolApprovalResponses,\n supportsRichToolApprovalResponses,\n supersededApprovalProjection,\n toolArtifactEpoch,\n toolInteractionEpoch,\n ],\n ),\n });\n\n const exportedMessageRepository = useMemo(() => {\n if (!messageRepository) return undefined;\n const converted = toExportedMessageRepository(\n toThreadMessages,\n messageRepository,\n );\n return converted.messages.length > 0 ? converted : undefined;\n }, [messageRepository, toThreadMessages]);\n\n const generatedSuggestions = useGeneratedSuggestions(\n suggestionAdapter,\n messages,\n isRunning,\n );\n\n const [runtimeRef] = useState(() => ({\n get current(): AssistantRuntime {\n return runtime;\n },\n }));\n\n const {\n isLoading,\n deleteMessage: deleteHistoryMessage,\n persistToolInteractions,\n persistToolApprovalResponses,\n } = useExternalHistory(\n runtimeRef,\n adapters?.history ?? contextAdapters?.history,\n toThreadMessages,\n aiSDKV6FormatAdapter as MessageFormatAdapter<\n UI_MESSAGE,\n AISDKStorageFormat\n >,\n (messages) => {\n chatHelpers.setMessages(messages);\n },\n toolArtifactsRef.current,\n markToolArtifactsChanged,\n toolInteractionsRef.current,\n markToolInteractionsChanged,\n toolApprovalResponsesRef.current,\n () => {\n for (const [id, entry] of ownedApprovals ?? []) {\n toolApprovalResponsesRef.current.set(id, entry.response);\n }\n hostApprovalIdsRef.current = new Set(\n toolApprovalResponsesRef.current.keys(),\n );\n setToolApprovalResponses(new Map(toolApprovalResponsesRef.current));\n },\n );\n\n const {\n id: chatId,\n messages: chatMessages,\n status: chatStatus,\n error,\n } = chatHelpers;\n const extras = useMemo(\n () =>\n aiSDKExtras.provide({\n chat: chatHelpers as unknown as UseChatHelpers<UIMessage>,\n error,\n }),\n // oxlint-disable-next-line react/exhaustive-deps -- keyed on the chat's identity and reactive snapshots; useChat re-mints the helpers object every render while its remaining fields are instance-bound methods, and a render-stable extras identity is what lets the external-store core dedupe adapter updates\n [chatId, chatMessages, chatStatus, error],\n );\n\n const completePendingToolCalls = async () => {\n if (!cancelPendingToolCallsOnSend) return;\n\n // The runtime auto-aborts in-flight tool invocations when a new run\n // is dispatched (append() / startRun()), so this only has to mark the\n // abandoned tools cancelled in the UI message list. Every non-terminal\n // tool call qualifies wherever it sits: the run that produced it is over,\n // and a staged `startRun: false` message can sit between it and the tail.\n // Uses setMessages to avoid triggering sendAutomaticallyWhen.\n chatHelpers.setMessages((messages) => {\n let hasChanges = false;\n\n const next = messages.map((message) => {\n if (message.role !== \"assistant\") return message;\n\n let messageChanged = false;\n const parts = message.parts?.map((part) => {\n if (!isToolUIPart(part)) return part;\n if (\n part.state === \"output-available\" ||\n part.state === \"output-error\" ||\n part.state === \"output-denied\"\n )\n return part;\n\n messageChanged = true;\n const { approval: _approval, ...rest } = part;\n return {\n ...rest,\n state: \"output-error\" as const,\n errorText: \"User cancelled tool call by sending a new message.\",\n };\n });\n\n if (!messageChanged) return message;\n hasChanges = true;\n return { ...message, parts };\n });\n\n if (!hasChanges) return messages;\n return next;\n });\n };\n\n const respondViaAISDK = ({\n approvalId,\n approved,\n reason,\n }: RespondToToolApprovalOptions) =>\n Promise.resolve(\n chatHelpers.addToolApprovalResponse({\n id: approvalId,\n approved,\n ...(reason != null && { reason }),\n options: { metadata: lastRunConfigRef.current },\n }),\n );\n\n const respondViaHost = async (\n onRespond: NonNullable<AISDKRuntimeAdapter[\"onRespondToToolApproval\"]>,\n response: RespondToToolApprovalOptions,\n ) => {\n const { approvalId } = response;\n const requested = chatHelpers.messages\n .flatMap((message) =>\n message.parts.flatMap((part) =>\n isToolUIPart(part) ? [{ messageId: message.id, part }] : [],\n ),\n )\n .find(\n ({ part }) =>\n part.state === \"approval-requested\" &&\n part.approval?.id === approvalId,\n );\n if (!requested || hostApprovalIdsRef.current.has(approvalId))\n throw new Error(\n `Tool approval ${approvalId} is not waiting for a response.`,\n );\n\n // A host answer stays out of the useChat messages, where sendAutomaticallyWhen would forward it to the chat route.\n // The owner can change while a response is in flight, and the id set is a\n // ref that is reseeded when it does. Both writes are therefore scoped to\n // the record this response started under, so a rollback never reaches a\n // different chat's state.\n const startedWith = ownedApprovals;\n const startedOwner = approvalOwner;\n const startedResponses = toolApprovalResponsesRef.current;\n // Whether this response is currently applied, tracked here rather than\n // read back from the id ref: that ref follows the chat on screen and is\n // reseeded when the owner changes, so it cannot answer for this response.\n let isApplied = false;\n const applyResponse = (applied: boolean) => {\n isApplied = applied;\n // The captured record is always corrected, so a rollback reaches the\n // chat the response belongs to even after the owner moved on.\n if (applied)\n startedWith?.set(approvalId, {\n response,\n });\n else startedWith?.delete(approvalId);\n\n if (startedOwner) {\n // Every runtime mounted over that owner re-reads the record, including\n // one mounted after this response started.\n notifyHostApprovals(startedOwner);\n return;\n }\n\n if (lastApprovalOwnerRef.current !== startedOwner) return;\n if (applied) hostApprovalIdsRef.current.add(approvalId);\n else hostApprovalIdsRef.current.delete(approvalId);\n if (applied) toolApprovalResponsesRef.current.set(approvalId, response);\n else toolApprovalResponsesRef.current.delete(approvalId);\n setToolApprovalResponses(new Map(toolApprovalResponsesRef.current));\n };\n\n applyResponse(true);\n try {\n await onRespond(response, {\n toolCallId: requested.part.toolCallId,\n toolName: getToolName(requested.part),\n respondViaAISDK: async () => {\n try {\n await respondViaAISDK(response);\n } finally {\n applyResponse(false);\n }\n },\n });\n } catch (error) {\n if (isApplied) applyResponse(false);\n throw error;\n }\n const remainsApplied =\n startedWith?.has(approvalId) ?? startedResponses.has(approvalId);\n if (isApplied && remainsApplied) {\n await persistToolApprovalResponses(requested.messageId);\n }\n };\n\n const hasSeededRepositoryRef = useRef(false);\n const shouldFeedRepository =\n exportedMessageRepository != null &&\n !hasSeededRepositoryRef.current &&\n messages.length === 0;\n\n const runtime = useExternalStoreRuntime({\n unstable_persistsHistory: true,\n isRunning: providerIsRunning,\n ...(shouldFeedRepository\n ? { messageRepository: exportedMessageRepository }\n : { messages }),\n unstable_enableToolInvocations: true,\n setToolStatuses,\n setMessages: (messages) =>\n chatHelpers.setMessages(\n messages\n .map(getVercelAIMessages<UI_MESSAGE>)\n .filter(Boolean)\n .flat(),\n ),\n onImport: (messages) =>\n chatHelpers.setMessages(\n messages\n .map(getVercelAIMessages<UI_MESSAGE>)\n .filter(Boolean)\n .flat(),\n ),\n onVoiceTranscript: (message: ThreadMessage) =>\n chatHelpers.setMessages((current) => [\n ...current,\n toVoiceTranscriptUIMessage<UI_MESSAGE>(message),\n ]),\n onExportExternalState: (): MessageFormatRepository<UI_MESSAGE> => {\n const exported = runtimeRef.current.thread.export();\n\n const expandedMessages: MessageFormatItem<UI_MESSAGE>[] = [];\n const lastInnerIdMap = new Map<string, string>();\n\n for (const item of exported.messages) {\n const innerMessages = getExternalStoreMessages<UI_MESSAGE>(\n item.message,\n );\n let parentId =\n item.parentId != null\n ? (lastInnerIdMap.get(item.parentId) ?? item.parentId)\n : null;\n for (const innerMessage of innerMessages) {\n expandedMessages.push({ parentId, message: innerMessage });\n parentId = aiSDKV6FormatAdapter.getId(innerMessage as UIMessage);\n }\n if (innerMessages.length > 0) {\n lastInnerIdMap.set(\n item.message.id,\n aiSDKV6FormatAdapter.getId(\n innerMessages[innerMessages.length - 1]! as UIMessage,\n ),\n );\n }\n }\n\n const result: MessageFormatRepository<UI_MESSAGE> = {\n messages: expandedMessages,\n };\n\n if (exported.headId != null) {\n result.headId = lastInnerIdMap.get(exported.headId) ?? exported.headId;\n }\n\n return result;\n },\n onLoadExternalState: (repo: MessageFormatRepository<UI_MESSAGE>) => {\n // Convert MessageFormatRepository to ExportedMessageRepository\n const exportedRepo = toExportedMessageRepository(toThreadMessages, repo);\n\n // Import into the thread's MessageRepository\n runtimeRef.current.thread.import(exportedRepo);\n },\n onCancel: async () => {\n const message = chatHelpers.messages.at(-1);\n const cancelledId =\n isRunning && message?.role === \"assistant\" ? message.id : undefined;\n if (cancelledId) {\n const liveIds = new Set(chatHelpers.messages.map((m) => m.id));\n setCancelledMessages((prev) => {\n const kept =\n prev?.chatId === chatHelpers.id\n ? [...prev.ids].filter((id) => liveIds.has(id))\n : [];\n return {\n chatId: chatHelpers.id,\n ids: new Set([...kept, cancelledId]),\n };\n });\n }\n try {\n await chatHelpers.stop();\n } catch (error) {\n if (!(error instanceof Error && error.name === \"AbortError\")) {\n if (cancelledId) retractCancellation(chatHelpers.id, cancelledId);\n throw error;\n }\n }\n },\n onNew: async (message) => {\n const createMessage = (\n customToCreateMessage ?? toCreateMessage\n )<UI_MESSAGE>(message);\n\n if (!(message.startRun ?? message.role === \"user\")) {\n chatHelpers.setMessages((current) => [\n ...current,\n toUIMessage<UI_MESSAGE>(createMessage, message.role),\n ]);\n return;\n }\n\n lastRunConfigRef.current = message.runConfig;\n await completePendingToolCalls();\n await chatHelpers.sendMessage(createMessage, {\n metadata: message.runConfig,\n });\n },\n onEdit: async (message) => {\n const createMessage = (\n customToCreateMessage ?? toCreateMessage\n )<UI_MESSAGE>(message);\n\n if (!(message.startRun ?? message.role === \"user\")) {\n chatHelpers.setMessages((current) => [\n ...sliceMessagesUntil(current, message.parentId),\n toUIMessage<UI_MESSAGE>(createMessage, message.role),\n ]);\n return;\n }\n\n lastRunConfigRef.current = message.runConfig;\n chatHelpers.setMessages((current) =>\n sliceMessagesUntil(current, message.parentId),\n );\n await chatHelpers.sendMessage(createMessage, {\n metadata: message.runConfig,\n });\n },\n onDelete: async (messageId) => {\n const threadMessages = runtimeRef.current.thread.getState().messages;\n const messageIndex = threadMessages.findIndex(\n (message) => message.id === messageId,\n );\n if (messageIndex === -1) return;\n\n await deleteHistoryMessage(messageId);\n\n let removedToolArtifact = false;\n let removedToolInteractions = false;\n let removedToolApprovalResponse = false;\n let removedHostApprovalId = false;\n for (const part of threadMessages[messageIndex]!.content) {\n if (part.type === \"tool-call\") {\n removedToolArtifact =\n toolArtifactsRef.current.delete(part.toolCallId) ||\n removedToolArtifact;\n removedToolInteractions =\n toolInteractionsRef.current.delete(part.toolCallId) ||\n removedToolInteractions;\n if (part.approval) {\n ownedApprovals?.delete(part.approval.id);\n removedToolApprovalResponse =\n toolApprovalResponsesRef.current.delete(part.approval.id) ||\n removedToolApprovalResponse;\n removedHostApprovalId =\n hostApprovalIdsRef.current.delete(part.approval.id) ||\n removedHostApprovalId;\n }\n }\n }\n if (removedToolArtifact) markToolArtifactsChanged();\n if (removedToolInteractions) markToolInteractionsChanged();\n if (removedToolApprovalResponse || removedHostApprovalId) {\n if (approvalOwner) notifyHostApprovals(approvalOwner);\n setToolApprovalResponses(new Map(toolApprovalResponsesRef.current));\n }\n\n const deleteIds = new Set(\n getExternalStoreMessages<UI_MESSAGE>(threadMessages[messageIndex]!).map(\n (message) => message.id,\n ),\n );\n chatHelpers.setMessages((current) =>\n current.filter((message) => !deleteIds.has(message.id)),\n );\n },\n onReload: async (parentId: string | null, config) => {\n lastRunConfigRef.current = config.runConfig;\n const newMessages = sliceMessagesUntil(chatHelpers.messages, parentId);\n chatHelpers.setMessages(newMessages);\n\n await chatHelpers.regenerate({ metadata: config.runConfig });\n },\n onAddToolResult: ({\n messageId,\n toolCallId,\n toolName,\n result,\n isError,\n artifact,\n modelContent,\n }) => {\n if (artifact !== undefined) {\n toolArtifactsRef.current.set(toolCallId, artifact);\n markToolArtifactsChanged();\n }\n\n const targetIndex = findRawToolMessageIndex(\n chatHelpers.messages,\n messageId,\n toolCallId,\n joinStrategy,\n );\n\n const errorText =\n typeof result === \"string\" ? result : JSON.stringify(result);\n const output =\n !isError && modelContent !== undefined\n ? wrapModelContentEnvelope(result, modelContent)\n : result;\n\n if (targetIndex >= 0 && targetIndex !== chatHelpers.messages.length - 1) {\n const target = chatHelpers.messages[targetIndex]!;\n const targetPart = target.parts.find(\n (part) => isToolUIPart(part) && part.toolCallId === toolCallId,\n ) as { state?: string; preliminary?: boolean } | undefined;\n // An earlier message's settled output may already have reached the model, as the error a cancelling send writes does.\n if (\n targetPart?.state === \"output-error\" ||\n targetPart?.state === \"output-denied\" ||\n (targetPart?.state === \"output-available\" && !targetPart.preliminary)\n )\n return Promise.resolve();\n\n const targetMessageId = target.id;\n chatHelpers.setMessages((current) =>\n current.map((message) => {\n if (message.id !== targetMessageId) return message;\n\n return {\n ...message,\n parts: message.parts.map((part) => {\n if (!isToolUIPart(part) || part.toolCallId !== toolCallId)\n return part;\n\n const { preliminary: _preliminary, ...finalPart } =\n part as typeof part & { preliminary?: boolean };\n return {\n ...finalPart,\n state: isError\n ? (\"output-error\" as const)\n : (\"output-available\" as const),\n output: isError ? undefined : output,\n errorText: isError ? errorText : undefined,\n } as typeof part;\n }),\n };\n }),\n );\n return Promise.resolve();\n }\n\n const options = { metadata: lastRunConfigRef.current };\n if (isError) {\n return Promise.resolve(\n chatHelpers.addToolOutput({\n state: \"output-error\",\n tool: toolName ?? toolCallId,\n toolCallId,\n errorText,\n options,\n }),\n );\n }\n\n return Promise.resolve(\n chatHelpers.addToolOutput({\n tool: toolName,\n toolCallId,\n output,\n options,\n }),\n );\n },\n onRespondToToolApproval: (response) => {\n if (supersededApprovalProjection.approvalIds.has(response.approvalId))\n return Promise.reject(\n new Error(\n `Tool approval ${response.approvalId} is not waiting for a response.`,\n ),\n );\n return customOnRespondToToolApproval\n ? respondViaHost(customOnRespondToToolApproval, response)\n : respondViaAISDK(response);\n },\n unstable_onRecordToolInteraction: ({\n messageId,\n toolCallId,\n interaction,\n }) => {\n toolInteractionsRef.current.set(\n toolCallId,\n appendToolInteraction(\n toolInteractionsRef.current.get(toolCallId),\n interaction,\n ),\n );\n markToolInteractionsChanged();\n return persistToolInteractions(messageId);\n },\n ...pickExternalStoreSharedOptions(adapter),\n ...(adapter.unstable_messageRepositoryInstance && {\n unstable_messageRepositoryInstance:\n adapter.unstable_messageRepositoryInstance,\n }),\n ...(suggestionAdapter ? { suggestions: generatedSuggestions } : {}),\n ...(onResume && { onResume }),\n ...(onResumeToolCall && { onResumeToolCall }),\n ...(unstable_onBranchChange && { unstable_onBranchChange }),\n adapters: {\n attachments: vercelAttachmentAdapter,\n ...contextAdapters,\n ...adapters,\n },\n extras,\n isLoading,\n });\n\n const setMessagesRef = useRef(chatHelpers.setMessages);\n useInsertionEffect(() => {\n setMessagesRef.current = chatHelpers.setMessages;\n }, [chatHelpers.setMessages]);\n\n useEffect(() => {\n if (hasSeededRepositoryRef.current) return;\n if (!exportedMessageRepository) return;\n if (chatHelpers.messages.length > 0) {\n hasSeededRepositoryRef.current = true;\n return;\n }\n const tempRepo = new MessageRepository();\n tempRepo.import(exportedMessageRepository);\n setMessagesRef.current(\n tempRepo.getMessages().flatMap(getExternalStoreMessages<UI_MESSAGE>),\n );\n hasSeededRepositoryRef.current = true;\n }, [exportedMessageRepository, chatHelpers.messages.length]);\n return runtime;\n};\n"],"mappings":"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"}
|
|
@@ -3,8 +3,8 @@ import { useChatThread } from "./useChatThread.js";
|
|
|
3
3
|
import { AI_SDK_SDK } from "./sdkIdentity.js";
|
|
4
4
|
import { useCloudThreadListAdapter, useRemoteThreadListRuntime } from "@assistant-ui/core/react";
|
|
5
5
|
import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
|
|
6
|
-
import { useAui, useAuiState } from "@assistant-ui/store";
|
|
7
6
|
import { useHostDestroySignal } from "@assistant-ui/store/internal";
|
|
7
|
+
import { useAui, useAuiState } from "@assistant-ui/store";
|
|
8
8
|
//#region src/runtime/useChatRuntime.ts
|
|
9
9
|
const useChatThreadRuntime = (options, hostDestroySignal) => {
|
|
10
10
|
const $ = c(7);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useChatThread.d.ts","sourceRoot":"","sources":["../../src/runtime/useChatThread.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAW,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,0BAA0B,EAChC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,6BAA6B,EACnC,6BAA0B;AAC3B,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAClD,OAAO,EAEL,KAAK,2BAA2B,EACjC,+CAA4C;AAe7C,MAAM,MAAM,iBAAiB,CAAC,UAAU,SAAS,SAAS,GAAG,SAAS,IACpE,QAAQ,CAAC,UAAU,CAAC,GAClB,0BAA0B,GAAG;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,QAAQ,CAAC,EAAE,mBAAmB,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC;IACvD,eAAe,CAAC,EAAE,6BAA6B,CAAC;IAChD,QAAQ,CAAC,EAAE,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAC3C,gBAAgB,CAAC,EAAE,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;IAC3D,uBAAuB,CAAC,EAAE,mBAAmB,CAAC,yBAAyB,CAAC,CAAC;IACzE;;;;;OAKG;IACH,aAAa,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACvD,YAAY,CAAC,EAAE,mBAAmB,CAAC,cAAc,CAAC,CAAC;IACnD,iBAAiB,CAAC,EAAE,mBAAmB,CAAC,UAAU,CAAC,CAAC,mBAAmB,CAAC,CAAC;IACzE,uBAAuB,CAAC,EAAE,mBAAmB,CAAC,yBAAyB,CAAC,CAAC;CAC1E,CAAC;AAEN,MAAM,MAAM,qBAAqB,CAAC,UAAU,SAAS,SAAS,GAAG,SAAS,IAAI;IAC5E,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,OAAO,CAAC;IACtB,iBAAiB,EAAE,MAAM,2BAA2B,GAAG,SAAS,CAAC;IACjE,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAC5C;;;;OAIG;IACH,IAAI,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC;IACpC;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;CAC3D,CAAC;AAsDF;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GAAI,UAAU,SAAS,SAAS,EACjE,SAAS,iBAAiB,CAAC,UAAU,CAAC,GAAG,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;4BAzFrB,OAAO,KAAK,IAAI;;;;;;;;;;;;;;;;;;CAgI9C,CAAC;AAEF,KAAK,aAAa,CAAC,UAAU,SAAS,SAAS,IAAI,IAAI,CACrD,QAAQ,CAAC,UAAU,CAAC,EACpB,YAAY,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,uBAAuB,CAC3E,CAAC;
|
|
1
|
+
{"version":3,"file":"useChatThread.d.ts","sourceRoot":"","sources":["../../src/runtime/useChatThread.ts"],"names":[],"mappings":"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"}
|
|
@@ -55,19 +55,34 @@ const splitChatThreadOptions = (options) => {
|
|
|
55
55
|
chatInit
|
|
56
56
|
};
|
|
57
57
|
};
|
|
58
|
+
const requestsByChat = /* @__PURE__ */ new WeakMap();
|
|
58
59
|
/**
|
|
59
60
|
* Constructs a `Chat` whose callbacks read the latest options through
|
|
60
61
|
* `callbacksRef`, the forwarding `useChat` applies only to a chat it
|
|
61
62
|
* constructs itself.
|
|
62
63
|
*/
|
|
63
|
-
const createChat = (init, callbacksRef) =>
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
64
|
+
const createChat = (init, callbacksRef) => {
|
|
65
|
+
const transport = init.transport;
|
|
66
|
+
const chat = new Chat({
|
|
67
|
+
...init,
|
|
68
|
+
...transport && { transport: {
|
|
69
|
+
sendMessages: (options) => {
|
|
70
|
+
requestsByChat.set(chat, Symbol());
|
|
71
|
+
return transport.sendMessages(options);
|
|
72
|
+
},
|
|
73
|
+
reconnectToStream: (options) => {
|
|
74
|
+
requestsByChat.set(chat, Symbol());
|
|
75
|
+
return transport.reconnectToStream(options);
|
|
76
|
+
}
|
|
77
|
+
} },
|
|
78
|
+
onToolCall: (arg) => callbacksRef.current?.onToolCall?.(arg),
|
|
79
|
+
onData: (arg) => callbacksRef.current?.onData?.(arg),
|
|
80
|
+
onFinish: (arg) => callbacksRef.current?.onFinish?.(arg),
|
|
81
|
+
onError: (arg) => callbacksRef.current?.onError?.(arg),
|
|
82
|
+
sendAutomaticallyWhen: (arg) => callbacksRef.current?.sendAutomaticallyWhen?.(arg) ?? false
|
|
83
|
+
});
|
|
84
|
+
return chat;
|
|
85
|
+
};
|
|
71
86
|
const useChatThread = (options, env) => {
|
|
72
87
|
const { adapters, transport: transportOptions, throttle, toCreateMessage, onResume, onResumeToolCall, onRespondToToolApproval, onResumeError, joinStrategy, messageRepository, unstable_onBranchChange, chatInit: chatOptions } = splitChatThreadOptions(options);
|
|
73
88
|
const { id, isMainThread, getThreadListItem, stopOnClientDestroy = true, hostDestroySignal, chat: externalChat, messageRepositoryInstance } = env;
|
|
@@ -90,7 +105,13 @@ const useChatThread = (options, env) => {
|
|
|
90
105
|
chat.stop().catch(() => {});
|
|
91
106
|
}, hostDestroySignal);
|
|
92
107
|
const runtime = useAISDKRuntime(chat, {
|
|
93
|
-
adapters
|
|
108
|
+
adapters: {
|
|
109
|
+
...adapters,
|
|
110
|
+
threadList: {
|
|
111
|
+
threadId: id,
|
|
112
|
+
...adapters?.threadList
|
|
113
|
+
}
|
|
114
|
+
},
|
|
94
115
|
...pickExternalStoreSharedOptions(options ?? {}),
|
|
95
116
|
...toCreateMessage && { toCreateMessage },
|
|
96
117
|
...onResume && { onResume },
|
|
@@ -99,6 +120,7 @@ const useChatThread = (options, env) => {
|
|
|
99
120
|
...joinStrategy && { joinStrategy },
|
|
100
121
|
...messageRepository && { messageRepository },
|
|
101
122
|
...messageRepositoryInstance && { unstable_messageRepositoryInstance: messageRepositoryInstance },
|
|
123
|
+
unstable_hostApprovalOwner: externalChat ?? ownedChat,
|
|
102
124
|
...unstable_onBranchChange && { unstable_onBranchChange }
|
|
103
125
|
});
|
|
104
126
|
if (sourceTransport instanceof AssistantChatTransport) {
|
|
@@ -134,7 +156,13 @@ const useChatThread = (options, env) => {
|
|
|
134
156
|
}
|
|
135
157
|
if (isLoadingHistory) return;
|
|
136
158
|
resumedStreamIds.add(pendingStreamId);
|
|
137
|
-
|
|
159
|
+
const activeChat = externalChat ?? ownedChat;
|
|
160
|
+
activeChat.clearError();
|
|
161
|
+
const pending = chat.resumeStream();
|
|
162
|
+
const request = requestsByChat.get(activeChat);
|
|
163
|
+
pending.then(() => {
|
|
164
|
+
if (requestsByChat.get(activeChat) === request && activeChat.error) throw activeChat.error;
|
|
165
|
+
}).catch((err) => {
|
|
138
166
|
console.warn("[assistant-ui] resumable: resume failed", err);
|
|
139
167
|
try {
|
|
140
168
|
onResumeErrorRef.current?.(err);
|
|
@@ -146,10 +174,12 @@ const useChatThread = (options, env) => {
|
|
|
146
174
|
});
|
|
147
175
|
}, [
|
|
148
176
|
chat,
|
|
177
|
+
externalChat,
|
|
149
178
|
id,
|
|
150
179
|
isChatRunning,
|
|
151
180
|
isLoadingHistory,
|
|
152
181
|
pendingStreamId,
|
|
182
|
+
ownedChat,
|
|
153
183
|
resumableStorage,
|
|
154
184
|
resumedStreamIds
|
|
155
185
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useChatThread.js","names":["Chat","useChat","UIMessage","MessageRepository","pickExternalStoreSharedOptions","AssistantRuntime","ExternalStoreSharedOptions","useAISDKRuntime","AISDKRuntimeAdapter","CustomToCreateMessageFunction","ChatInit","ChatTransport","AssistantChatTransport","InitializableThreadListItem","AssistantChatResumableOptions","ResumableClientStorage","useCallback","useEffect","useMemo","useRef","useState","useSyncExternalStore","useResourceCleanup","ChatThreadOptions","UI_MESSAGE","throttle","adapters","toCreateMessage","onResume","onResumeToolCall","onRespondToToolApproval","onResumeError","error","joinStrategy","messageRepository","unstable_onBranchChange","ChatThreadEnvironment","id","isMainThread","getThreadListItem","stopOnClientDestroy","hostDestroySignal","AbortSignal","chat","messageRepositoryInstance","useDynamicChatTransport","transport","transportRef","current","dynamicTransport","Proxy","get","_","prop","res","bind","getResumableAdapter","candidate","undefined","call","getNoPendingStreamId","resumedStreamIdsByStorage","WeakMap","Set","getResumedStreamIds","storage","resumedStreamIds","set","splitChatThreadOptions","options","isDisabled","_isDisabled","isSendDisabled","_isSendDisabled","unstable_capabilities","_unstable_capabilities","suggestions","_suggestions","chatInit","ChatCallbacks","Pick","createChat","init","callbacksRef","onToolCall","arg","onData","onFinish","onError","sendAutomaticallyWhen","useChatThread","env","transportOptions","chatOptions","externalChat","sourceTransport","__internal_clone","latestChatOptionsRef","ownedChat","stop","catch","runtime","unstable_messageRepositoryInstance","setRuntime","__internal_setGetThreadListItem","subscribeToRuntime","callback","thread","subscribe","getHistoryLoadingSnapshot","getState","isLoading","isLoadingHistory","resumableStorage","subscribeToResumableStorage","getPendingStreamId","getStreamId","pendingStreamId","isChatRunning","status","onResumeErrorRef","has","add","resumeStream","err","console","warn","callbackError","clear"],"sources":["../../src/runtime/useChatThread.ts"],"sourcesContent":["\"use client\";\n\nimport { Chat, useChat, type UIMessage } from \"@ai-sdk/react\";\nimport type { MessageRepository } from \"@assistant-ui/core/internal\";\nimport {\n pickExternalStoreSharedOptions,\n type AssistantRuntime,\n type ExternalStoreSharedOptions,\n} from \"@assistant-ui/core\";\nimport {\n useAISDKRuntime,\n type AISDKRuntimeAdapter,\n type CustomToCreateMessageFunction,\n} from \"./useAISDKRuntime\";\nimport type { ChatInit, ChatTransport } from \"ai\";\nimport {\n AssistantChatTransport,\n type InitializableThreadListItem,\n} from \"../transport/AssistantChatTransport\";\nimport type {\n AssistantChatResumableOptions,\n ResumableClientStorage,\n} from \"../transport/resumable\";\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from \"react\";\nimport { useResourceCleanup } from \"./useResourceCleanup\";\n\nexport type ChatThreadOptions<UI_MESSAGE extends UIMessage = UIMessage> =\n ChatInit<UI_MESSAGE> &\n ExternalStoreSharedOptions & {\n throttle?: number | undefined;\n adapters?: AISDKRuntimeAdapter[\"adapters\"] | undefined;\n toCreateMessage?: CustomToCreateMessageFunction;\n onResume?: AISDKRuntimeAdapter[\"onResume\"];\n onResumeToolCall?: AISDKRuntimeAdapter[\"onResumeToolCall\"];\n onRespondToToolApproval?: AISDKRuntimeAdapter[\"onRespondToToolApproval\"];\n /**\n * Called when an automatic resumable stream reconnect fails. Use this to\n * surface a toast, report telemetry, or mark the thread as needing a\n * retry. The failed stream id is cleared after the callback unless a\n * newer id has replaced it.\n */\n onResumeError?: ((error: unknown) => void) | undefined;\n joinStrategy?: AISDKRuntimeAdapter[\"joinStrategy\"];\n messageRepository?: AISDKRuntimeAdapter<UI_MESSAGE>[\"messageRepository\"];\n unstable_onBranchChange?: AISDKRuntimeAdapter[\"unstable_onBranchChange\"];\n };\n\nexport type ChatThreadEnvironment<UI_MESSAGE extends UIMessage = UIMessage> = {\n id: string;\n isMainThread: boolean;\n getThreadListItem: () => InitializableThreadListItem | undefined;\n stopOnClientDestroy?: boolean;\n /**\n * Aborts when the React component hosting the runtime is deleted. A nested\n * runtime resolves the destroy signal of the provider above it, which\n * outlives the nested component, so this stops the chat on its own unmount.\n */\n hostDestroySignal?: AbortSignal | undefined;\n /**\n * An externally owned chat instance. State lives on the instance, so it\n * survives the hosting resource unmounting; construction options are read\n * from the instance.\n */\n chat?: Chat<UI_MESSAGE> | undefined;\n /**\n * An externally owned per-thread message repository. Hosts that route\n * multiple threads through one mounting pass a distinct instance per\n * thread so histories and branches stay isolated.\n */\n messageRepositoryInstance?: MessageRepository | undefined;\n};\n\nconst useDynamicChatTransport = <UI_MESSAGE extends UIMessage = UIMessage>(\n transport: ChatTransport<UI_MESSAGE>,\n): ChatTransport<UI_MESSAGE> => {\n const transportRef = useRef<ChatTransport<UI_MESSAGE>>(transport);\n useEffect(() => {\n transportRef.current = transport;\n });\n const dynamicTransport = useMemo(\n () =>\n new Proxy(transportRef.current, {\n get(_, prop) {\n const res =\n transportRef.current[prop as keyof ChatTransport<UI_MESSAGE>];\n return typeof res === \"function\"\n ? res.bind(transportRef.current)\n : res;\n },\n }),\n [],\n );\n return dynamicTransport;\n};\n\nconst getResumableAdapter = <UI_MESSAGE extends UIMessage>(\n transport: ChatTransport<UI_MESSAGE>,\n): AssistantChatResumableOptions | undefined => {\n if (transport instanceof AssistantChatTransport) {\n return transport.getResumableAdapter();\n }\n const candidate = (transport as { getResumableAdapter?: () => unknown })\n .getResumableAdapter;\n if (typeof candidate !== \"function\") return undefined;\n return candidate.call(transport) as AssistantChatResumableOptions | undefined;\n};\n\nconst getNoPendingStreamId = () => null;\n\nconst resumedStreamIdsByStorage = new WeakMap<\n ResumableClientStorage,\n Set<string>\n>();\n\nconst getResumedStreamIds = (storage: ResumableClientStorage | undefined) => {\n if (!storage) return new Set<string>();\n let resumedStreamIds = resumedStreamIdsByStorage.get(storage);\n if (!resumedStreamIds) {\n resumedStreamIds = new Set();\n resumedStreamIdsByStorage.set(storage, resumedStreamIds);\n }\n return resumedStreamIds;\n};\n\n/**\n * Splits the combined options into the assistant-ui side and the `ChatInit`\n * remainder the AI SDK consumes, so external `Chat` construction forwards the\n * same fields `useChat` would.\n */\nexport const splitChatThreadOptions = <UI_MESSAGE extends UIMessage>(\n options: ChatThreadOptions<UI_MESSAGE> | undefined,\n) => {\n const {\n adapters,\n transport,\n throttle,\n toCreateMessage,\n isDisabled: _isDisabled,\n isSendDisabled: _isSendDisabled,\n unstable_capabilities: _unstable_capabilities,\n suggestions: _suggestions,\n onResume,\n onResumeToolCall,\n onRespondToToolApproval,\n onResumeError,\n joinStrategy,\n messageRepository,\n unstable_onBranchChange,\n ...chatInit\n } = options ?? {};\n // peel guard: any shared key left in `chatInit` collapses this to `never`\n true satisfies keyof typeof chatInit &\n keyof ExternalStoreSharedOptions extends never\n ? true\n : never;\n return {\n adapters,\n transport,\n throttle,\n toCreateMessage,\n onResume,\n onResumeToolCall,\n onRespondToToolApproval,\n onResumeError,\n joinStrategy,\n messageRepository,\n unstable_onBranchChange,\n chatInit,\n };\n};\n\ntype ChatCallbacks<UI_MESSAGE extends UIMessage> = Pick<\n ChatInit<UI_MESSAGE>,\n \"onToolCall\" | \"onData\" | \"onFinish\" | \"onError\" | \"sendAutomaticallyWhen\"\n>;\n\n/**\n * Constructs a `Chat` whose callbacks read the latest options through\n * `callbacksRef`, the forwarding `useChat` applies only to a chat it\n * constructs itself.\n */\nexport const createChat = <UI_MESSAGE extends UIMessage>(\n init: ChatInit<UI_MESSAGE>,\n callbacksRef: { readonly current: ChatCallbacks<UI_MESSAGE> | undefined },\n): Chat<UI_MESSAGE> =>\n new Chat<UI_MESSAGE>({\n ...init,\n onToolCall: (arg) => callbacksRef.current?.onToolCall?.(arg),\n onData: (arg) => callbacksRef.current?.onData?.(arg),\n onFinish: (arg) => callbacksRef.current?.onFinish?.(arg),\n onError: (arg) => callbacksRef.current?.onError?.(arg),\n sendAutomaticallyWhen: (arg) =>\n callbacksRef.current?.sendAutomaticallyWhen?.(arg) ?? false,\n });\n\nexport const useChatThread = <UI_MESSAGE extends UIMessage = UIMessage>(\n options: ChatThreadOptions<UI_MESSAGE> | undefined,\n env: ChatThreadEnvironment<UI_MESSAGE>,\n): AssistantRuntime => {\n const {\n adapters,\n transport: transportOptions,\n throttle,\n toCreateMessage,\n onResume,\n onResumeToolCall,\n onRespondToToolApproval,\n onResumeError,\n joinStrategy,\n messageRepository,\n unstable_onBranchChange,\n chatInit: chatOptions,\n } = splitChatThreadOptions(options);\n\n const {\n id,\n isMainThread,\n getThreadListItem,\n stopOnClientDestroy = true,\n hostDestroySignal,\n chat: externalChat,\n messageRepositoryInstance,\n } = env;\n\n // Wiring below is per thread and mutated on the instance, so a transport\n // shared across simultaneously mounted threads is last-writer-wins. A\n // caller-owned chat is already bound to its own clone, so cloning again\n // here would wire a copy the chat never sends through.\n const sourceTransport = useMemo(\n () =>\n transportOptions === undefined\n ? new AssistantChatTransport()\n : externalChat === undefined &&\n transportOptions instanceof AssistantChatTransport\n ? transportOptions.__internal_clone()\n : transportOptions,\n [transportOptions, externalChat],\n );\n const transport = useDynamicChatTransport(sourceTransport);\n\n const latestChatOptionsRef = useRef(chatOptions);\n useEffect(() => {\n latestChatOptionsRef.current = chatOptions;\n });\n // `useChat` stops a chat it constructs whenever it unmounts, and a\n // resource's soft unmount runs that cleanup, so the thread owns its chat.\n const [ownedChat] = useState(\n () =>\n externalChat ??\n createChat({ ...chatOptions, id, transport }, latestChatOptionsRef),\n );\n\n const chat = useChat({\n chat: externalChat ?? ownedChat,\n ...(throttle !== undefined && { throttle }),\n });\n\n useResourceCleanup(\n stopOnClientDestroy,\n () => {\n void chat.stop().catch(() => {});\n },\n hostDestroySignal,\n );\n\n const runtime = useAISDKRuntime(chat, {\n adapters,\n ...pickExternalStoreSharedOptions(options ?? {}),\n ...(toCreateMessage && { toCreateMessage }),\n ...(onResume && { onResume }),\n ...(onResumeToolCall && { onResumeToolCall }),\n ...(onRespondToToolApproval && { onRespondToToolApproval }),\n ...(joinStrategy && { joinStrategy }),\n ...(messageRepository && { messageRepository }),\n ...(messageRepositoryInstance && {\n unstable_messageRepositoryInstance: messageRepositoryInstance,\n }),\n ...(unstable_onBranchChange && { unstable_onBranchChange }),\n });\n\n // Wire in render, not an effect: a send from a descendant's mount effect\n // runs before this hook's effect would (effects fire child-first), and must\n // see a wired transport. The clone is per thread, so a discarded render's\n // wiring is discarded with it and the committed render re-wires the same\n // instance.\n if (sourceTransport instanceof AssistantChatTransport) {\n sourceTransport.setRuntime(runtime);\n sourceTransport.__internal_setGetThreadListItem(getThreadListItem);\n }\n\n const subscribeToRuntime = useCallback(\n (callback: () => void) => runtime.thread.subscribe(callback),\n [runtime],\n );\n const getHistoryLoadingSnapshot = useCallback(\n () => runtime.thread.getState().isLoading,\n [runtime],\n );\n const isLoadingHistory = useSyncExternalStore(\n subscribeToRuntime,\n getHistoryLoadingSnapshot,\n getHistoryLoadingSnapshot,\n );\n\n const resumableStorage = useMemo(\n () => getResumableAdapter(sourceTransport)?.storage,\n [sourceTransport],\n );\n const subscribeToResumableStorage = useCallback(\n (callback: () => void) =>\n isMainThread\n ? (resumableStorage?.subscribe?.(callback, id) ?? (() => {}))\n : () => {},\n [id, isMainThread, resumableStorage],\n );\n const getPendingStreamId = useCallback(\n () => (isMainThread ? (resumableStorage?.getStreamId(id) ?? null) : null),\n [id, isMainThread, resumableStorage],\n );\n const pendingStreamId = useSyncExternalStore(\n subscribeToResumableStorage,\n getPendingStreamId,\n getNoPendingStreamId,\n );\n const isChatRunning =\n chat.status === \"submitted\" || chat.status === \"streaming\";\n\n const resumedStreamIds = useMemo(\n () => getResumedStreamIds(resumableStorage),\n [resumableStorage],\n );\n const onResumeErrorRef = useRef(onResumeError);\n useEffect(() => {\n onResumeErrorRef.current = onResumeError;\n });\n useEffect(() => {\n if (!pendingStreamId || resumedStreamIds.has(pendingStreamId)) {\n return;\n }\n if (isChatRunning) {\n resumedStreamIds.add(pendingStreamId);\n return;\n }\n if (isLoadingHistory) return;\n resumedStreamIds.add(pendingStreamId);\n chat.resumeStream().catch((err: unknown) => {\n console.warn(\"[assistant-ui] resumable: resume failed\", err);\n try {\n onResumeErrorRef.current?.(err);\n } catch (callbackError) {\n console.error(\n \"[assistant-ui] resumable: onResumeError callback failed\",\n callbackError,\n );\n } finally {\n if (resumableStorage?.getStreamId(id) === pendingStreamId) {\n resumableStorage.clear(id);\n }\n }\n });\n }, [\n chat,\n id,\n isChatRunning,\n isLoadingHistory,\n pendingStreamId,\n resumableStorage,\n resumedStreamIds,\n ]);\n\n return runtime;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useChatThread.js","names":["Chat","useChat","UIMessage","MessageRepository","pickExternalStoreSharedOptions","AssistantRuntime","ExternalStoreSharedOptions","useAISDKRuntime","AISDKRuntimeAdapter","CustomToCreateMessageFunction","ChatInit","ChatTransport","AssistantChatTransport","InitializableThreadListItem","AssistantChatResumableOptions","ResumableClientStorage","useCallback","useEffect","useMemo","useRef","useState","useSyncExternalStore","useResourceCleanup","ChatThreadOptions","UI_MESSAGE","throttle","adapters","toCreateMessage","onResume","onResumeToolCall","onRespondToToolApproval","onResumeError","error","joinStrategy","messageRepository","unstable_onBranchChange","ChatThreadEnvironment","id","isMainThread","getThreadListItem","stopOnClientDestroy","hostDestroySignal","AbortSignal","chat","messageRepositoryInstance","useDynamicChatTransport","transport","transportRef","current","dynamicTransport","Proxy","get","_","prop","res","bind","getResumableAdapter","candidate","undefined","call","getNoPendingStreamId","resumedStreamIdsByStorage","WeakMap","Set","getResumedStreamIds","storage","resumedStreamIds","set","splitChatThreadOptions","options","isDisabled","_isDisabled","isSendDisabled","_isSendDisabled","unstable_capabilities","_unstable_capabilities","suggestions","_suggestions","chatInit","ChatCallbacks","Pick","requestsByChat","createChat","init","callbacksRef","sendMessages","Symbol","reconnectToStream","onToolCall","arg","onData","onFinish","onError","sendAutomaticallyWhen","useChatThread","env","transportOptions","chatOptions","externalChat","sourceTransport","__internal_clone","latestChatOptionsRef","ownedChat","stop","catch","runtime","threadList","threadId","unstable_messageRepositoryInstance","unstable_hostApprovalOwner","setRuntime","__internal_setGetThreadListItem","subscribeToRuntime","callback","thread","subscribe","getHistoryLoadingSnapshot","getState","isLoading","isLoadingHistory","resumableStorage","subscribeToResumableStorage","getPendingStreamId","getStreamId","pendingStreamId","isChatRunning","status","onResumeErrorRef","has","add","activeChat","clearError","pending","resumeStream","request","then","err","console","warn","callbackError","clear"],"sources":["../../src/runtime/useChatThread.ts"],"sourcesContent":["\"use client\";\n\nimport { Chat, useChat, type UIMessage } from \"@ai-sdk/react\";\nimport type { MessageRepository } from \"@assistant-ui/core/internal\";\nimport {\n pickExternalStoreSharedOptions,\n type AssistantRuntime,\n type ExternalStoreSharedOptions,\n} from \"@assistant-ui/core\";\nimport {\n useAISDKRuntime,\n type AISDKRuntimeAdapter,\n type CustomToCreateMessageFunction,\n} from \"./useAISDKRuntime\";\nimport type { ChatInit, ChatTransport } from \"ai\";\nimport {\n AssistantChatTransport,\n type InitializableThreadListItem,\n} from \"../transport/AssistantChatTransport\";\nimport type {\n AssistantChatResumableOptions,\n ResumableClientStorage,\n} from \"../transport/resumable\";\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from \"react\";\nimport { useResourceCleanup } from \"./useResourceCleanup\";\n\nexport type ChatThreadOptions<UI_MESSAGE extends UIMessage = UIMessage> =\n ChatInit<UI_MESSAGE> &\n ExternalStoreSharedOptions & {\n throttle?: number | undefined;\n adapters?: AISDKRuntimeAdapter[\"adapters\"] | undefined;\n toCreateMessage?: CustomToCreateMessageFunction;\n onResume?: AISDKRuntimeAdapter[\"onResume\"];\n onResumeToolCall?: AISDKRuntimeAdapter[\"onResumeToolCall\"];\n onRespondToToolApproval?: AISDKRuntimeAdapter[\"onRespondToToolApproval\"];\n /**\n * Called when an automatic resumable stream reconnect fails. Use this to\n * surface a toast, report telemetry, or mark the thread as needing a\n * retry. The failed stream id is cleared after the callback unless a\n * newer id has replaced it.\n */\n onResumeError?: ((error: unknown) => void) | undefined;\n joinStrategy?: AISDKRuntimeAdapter[\"joinStrategy\"];\n messageRepository?: AISDKRuntimeAdapter<UI_MESSAGE>[\"messageRepository\"];\n unstable_onBranchChange?: AISDKRuntimeAdapter[\"unstable_onBranchChange\"];\n };\n\nexport type ChatThreadEnvironment<UI_MESSAGE extends UIMessage = UIMessage> = {\n id: string;\n isMainThread: boolean;\n getThreadListItem: () => InitializableThreadListItem | undefined;\n stopOnClientDestroy?: boolean;\n /**\n * Aborts when the React component hosting the runtime is deleted. A nested\n * runtime resolves the destroy signal of the provider above it, which\n * outlives the nested component, so this stops the chat on its own unmount.\n */\n hostDestroySignal?: AbortSignal | undefined;\n /**\n * An externally owned chat instance. State lives on the instance, so it\n * survives the hosting resource unmounting; construction options are read\n * from the instance.\n */\n chat?: Chat<UI_MESSAGE> | undefined;\n /**\n * An externally owned per-thread message repository. Hosts that route\n * multiple threads through one mounting pass a distinct instance per\n * thread so histories and branches stay isolated.\n */\n messageRepositoryInstance?: MessageRepository | undefined;\n};\n\nconst useDynamicChatTransport = <UI_MESSAGE extends UIMessage = UIMessage>(\n transport: ChatTransport<UI_MESSAGE>,\n): ChatTransport<UI_MESSAGE> => {\n const transportRef = useRef<ChatTransport<UI_MESSAGE>>(transport);\n useEffect(() => {\n transportRef.current = transport;\n });\n const dynamicTransport = useMemo(\n () =>\n new Proxy(transportRef.current, {\n get(_, prop) {\n const res =\n transportRef.current[prop as keyof ChatTransport<UI_MESSAGE>];\n return typeof res === \"function\"\n ? res.bind(transportRef.current)\n : res;\n },\n }),\n [],\n );\n return dynamicTransport;\n};\n\nconst getResumableAdapter = <UI_MESSAGE extends UIMessage>(\n transport: ChatTransport<UI_MESSAGE>,\n): AssistantChatResumableOptions | undefined => {\n if (transport instanceof AssistantChatTransport) {\n return transport.getResumableAdapter();\n }\n const candidate = (transport as { getResumableAdapter?: () => unknown })\n .getResumableAdapter;\n if (typeof candidate !== \"function\") return undefined;\n return candidate.call(transport) as AssistantChatResumableOptions | undefined;\n};\n\nconst getNoPendingStreamId = () => null;\n\nconst resumedStreamIdsByStorage = new WeakMap<\n ResumableClientStorage,\n Set<string>\n>();\n\nconst getResumedStreamIds = (storage: ResumableClientStorage | undefined) => {\n if (!storage) return new Set<string>();\n let resumedStreamIds = resumedStreamIdsByStorage.get(storage);\n if (!resumedStreamIds) {\n resumedStreamIds = new Set();\n resumedStreamIdsByStorage.set(storage, resumedStreamIds);\n }\n return resumedStreamIds;\n};\n\n/**\n * Splits the combined options into the assistant-ui side and the `ChatInit`\n * remainder the AI SDK consumes, so external `Chat` construction forwards the\n * same fields `useChat` would.\n */\nexport const splitChatThreadOptions = <UI_MESSAGE extends UIMessage>(\n options: ChatThreadOptions<UI_MESSAGE> | undefined,\n) => {\n const {\n adapters,\n transport,\n throttle,\n toCreateMessage,\n isDisabled: _isDisabled,\n isSendDisabled: _isSendDisabled,\n unstable_capabilities: _unstable_capabilities,\n suggestions: _suggestions,\n onResume,\n onResumeToolCall,\n onRespondToToolApproval,\n onResumeError,\n joinStrategy,\n messageRepository,\n unstable_onBranchChange,\n ...chatInit\n } = options ?? {};\n // peel guard: any shared key left in `chatInit` collapses this to `never`\n true satisfies keyof typeof chatInit &\n keyof ExternalStoreSharedOptions extends never\n ? true\n : never;\n return {\n adapters,\n transport,\n throttle,\n toCreateMessage,\n onResume,\n onResumeToolCall,\n onRespondToToolApproval,\n onResumeError,\n joinStrategy,\n messageRepository,\n unstable_onBranchChange,\n chatInit,\n };\n};\n\ntype ChatCallbacks<UI_MESSAGE extends UIMessage> = Pick<\n ChatInit<UI_MESSAGE>,\n \"onToolCall\" | \"onData\" | \"onFinish\" | \"onError\" | \"sendAutomaticallyWhen\"\n>;\n\nconst requestsByChat = new WeakMap<object, symbol>();\n\n/**\n * Constructs a `Chat` whose callbacks read the latest options through\n * `callbacksRef`, the forwarding `useChat` applies only to a chat it\n * constructs itself.\n */\nexport const createChat = <UI_MESSAGE extends UIMessage>(\n init: ChatInit<UI_MESSAGE>,\n callbacksRef: { readonly current: ChatCallbacks<UI_MESSAGE> | undefined },\n): Chat<UI_MESSAGE> => {\n const transport = init.transport;\n const chat = new Chat<UI_MESSAGE>({\n ...init,\n ...(transport && {\n transport: {\n sendMessages: (options) => {\n requestsByChat.set(chat, Symbol());\n return transport.sendMessages(options);\n },\n reconnectToStream: (options) => {\n requestsByChat.set(chat, Symbol());\n return transport.reconnectToStream(options);\n },\n },\n }),\n onToolCall: (arg) => callbacksRef.current?.onToolCall?.(arg),\n onData: (arg) => callbacksRef.current?.onData?.(arg),\n onFinish: (arg) => callbacksRef.current?.onFinish?.(arg),\n onError: (arg) => callbacksRef.current?.onError?.(arg),\n sendAutomaticallyWhen: (arg) =>\n callbacksRef.current?.sendAutomaticallyWhen?.(arg) ?? false,\n });\n return chat;\n};\n\nexport const useChatThread = <UI_MESSAGE extends UIMessage = UIMessage>(\n options: ChatThreadOptions<UI_MESSAGE> | undefined,\n env: ChatThreadEnvironment<UI_MESSAGE>,\n): AssistantRuntime => {\n const {\n adapters,\n transport: transportOptions,\n throttle,\n toCreateMessage,\n onResume,\n onResumeToolCall,\n onRespondToToolApproval,\n onResumeError,\n joinStrategy,\n messageRepository,\n unstable_onBranchChange,\n chatInit: chatOptions,\n } = splitChatThreadOptions(options);\n\n const {\n id,\n isMainThread,\n getThreadListItem,\n stopOnClientDestroy = true,\n hostDestroySignal,\n chat: externalChat,\n messageRepositoryInstance,\n } = env;\n\n // Wiring below is per thread and mutated on the instance, so a transport\n // shared across simultaneously mounted threads is last-writer-wins. A\n // caller-owned chat is already bound to its own clone, so cloning again\n // here would wire a copy the chat never sends through.\n const sourceTransport = useMemo(\n () =>\n transportOptions === undefined\n ? new AssistantChatTransport()\n : externalChat === undefined &&\n transportOptions instanceof AssistantChatTransport\n ? transportOptions.__internal_clone()\n : transportOptions,\n [transportOptions, externalChat],\n );\n const transport = useDynamicChatTransport(sourceTransport);\n\n const latestChatOptionsRef = useRef(chatOptions);\n useEffect(() => {\n latestChatOptionsRef.current = chatOptions;\n });\n // `useChat` stops a chat it constructs whenever it unmounts, and a\n // resource's soft unmount runs that cleanup, so the thread owns its chat.\n const [ownedChat] = useState(\n () =>\n externalChat ??\n createChat({ ...chatOptions, id, transport }, latestChatOptionsRef),\n );\n\n const chat = useChat({\n chat: externalChat ?? ownedChat,\n ...(throttle !== undefined && { throttle }),\n });\n\n useResourceCleanup(\n stopOnClientDestroy,\n () => {\n void chat.stop().catch(() => {});\n },\n hostDestroySignal,\n );\n\n const runtime = useAISDKRuntime(chat, {\n adapters: {\n ...adapters,\n threadList: { threadId: id, ...adapters?.threadList },\n },\n ...pickExternalStoreSharedOptions(options ?? {}),\n ...(toCreateMessage && { toCreateMessage }),\n ...(onResume && { onResume }),\n ...(onResumeToolCall && { onResumeToolCall }),\n ...(onRespondToToolApproval && { onRespondToToolApproval }),\n ...(joinStrategy && { joinStrategy }),\n ...(messageRepository && { messageRepository }),\n ...(messageRepositoryInstance && {\n unstable_messageRepositoryInstance: messageRepositoryInstance,\n }),\n // The chat outlives this runtime when a host mounts only the visible\n // thread, so a host approval answer is kept with it. This is the Chat\n // instance, not the useChat helpers, which are re-minted every render and\n // would be a dead WeakMap key by the next one.\n unstable_hostApprovalOwner: externalChat ?? ownedChat,\n ...(unstable_onBranchChange && { unstable_onBranchChange }),\n });\n\n // Wire in render, not an effect: a send from a descendant's mount effect\n // runs before this hook's effect would (effects fire child-first), and must\n // see a wired transport. The clone is per thread, so a discarded render's\n // wiring is discarded with it and the committed render re-wires the same\n // instance.\n if (sourceTransport instanceof AssistantChatTransport) {\n sourceTransport.setRuntime(runtime);\n sourceTransport.__internal_setGetThreadListItem(getThreadListItem);\n }\n\n const subscribeToRuntime = useCallback(\n (callback: () => void) => runtime.thread.subscribe(callback),\n [runtime],\n );\n const getHistoryLoadingSnapshot = useCallback(\n () => runtime.thread.getState().isLoading,\n [runtime],\n );\n const isLoadingHistory = useSyncExternalStore(\n subscribeToRuntime,\n getHistoryLoadingSnapshot,\n getHistoryLoadingSnapshot,\n );\n\n const resumableStorage = useMemo(\n () => getResumableAdapter(sourceTransport)?.storage,\n [sourceTransport],\n );\n const subscribeToResumableStorage = useCallback(\n (callback: () => void) =>\n isMainThread\n ? (resumableStorage?.subscribe?.(callback, id) ?? (() => {}))\n : () => {},\n [id, isMainThread, resumableStorage],\n );\n const getPendingStreamId = useCallback(\n () => (isMainThread ? (resumableStorage?.getStreamId(id) ?? null) : null),\n [id, isMainThread, resumableStorage],\n );\n const pendingStreamId = useSyncExternalStore(\n subscribeToResumableStorage,\n getPendingStreamId,\n getNoPendingStreamId,\n );\n const isChatRunning =\n chat.status === \"submitted\" || chat.status === \"streaming\";\n\n const resumedStreamIds = useMemo(\n () => getResumedStreamIds(resumableStorage),\n [resumableStorage],\n );\n const onResumeErrorRef = useRef(onResumeError);\n useEffect(() => {\n onResumeErrorRef.current = onResumeError;\n });\n useEffect(() => {\n if (!pendingStreamId || resumedStreamIds.has(pendingStreamId)) {\n return;\n }\n if (isChatRunning) {\n resumedStreamIds.add(pendingStreamId);\n return;\n }\n if (isLoadingHistory) return;\n resumedStreamIds.add(pendingStreamId);\n const activeChat = externalChat ?? ownedChat;\n activeChat.clearError();\n const pending = chat.resumeStream();\n const request = requestsByChat.get(activeChat);\n pending\n .then(() => {\n // Chat.error is shared with sends and resumes that can start before\n // this promise settles, including inside the caller's onFinish.\n if (requestsByChat.get(activeChat) === request && activeChat.error) {\n throw activeChat.error;\n }\n })\n .catch((err: unknown) => {\n console.warn(\"[assistant-ui] resumable: resume failed\", err);\n try {\n onResumeErrorRef.current?.(err);\n } catch (callbackError) {\n console.error(\n \"[assistant-ui] resumable: onResumeError callback failed\",\n callbackError,\n );\n } finally {\n if (resumableStorage?.getStreamId(id) === pendingStreamId) {\n resumableStorage.clear(id);\n }\n }\n });\n }, [\n chat,\n externalChat,\n id,\n isChatRunning,\n isLoadingHistory,\n pendingStreamId,\n ownedChat,\n resumableStorage,\n resumedStreamIds,\n ]);\n\n return runtime;\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useExternalHistory.d.ts","sourceRoot":"","sources":["../../src/runtime/useExternalHistory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,oBAAoB,EAEpB,uBAAuB,EACvB,yBAAyB,EACzB,4BAA4B,EAC5B,2BAA2B,EAC5B,MAAM,oBAAoB,CAAC;AAO5B,OAAO,EAIL,KAAK,SAAS,EAGf,MAAM,OAAO,CAAC;AAEf,eAAO,MAAM,2BAA2B,GAAI,QAAQ,EAClD,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,EAC3D,UAAU,uBAAuB,CAAC,QAAQ,CAAC,KAC1C,yBAoBF,CAAC;
|
|
1
|
+
{"version":3,"file":"useExternalHistory.d.ts","sourceRoot":"","sources":["../../src/runtime/useExternalHistory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,oBAAoB,EAEpB,uBAAuB,EACvB,yBAAyB,EACzB,4BAA4B,EAC5B,2BAA2B,EAC5B,MAAM,oBAAoB,CAAC;AAO5B,OAAO,EAIL,KAAK,SAAS,EAGf,MAAM,OAAO,CAAC;AAEf,eAAO,MAAM,2BAA2B,GAAI,QAAQ,EAClD,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,EAC3D,UAAU,uBAAuB,CAAC,QAAQ,CAAC,KAC1C,yBAoBF,CAAC;AAmOF,eAAO,MAAM,kBAAkB,GAAI,QAAQ,EACzC,YAAY,SAAS,CAAC,gBAAgB,CAAC,EACvC,gBAAgB,oBAAoB,GAAG,SAAS,EAChD,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,EAC3D,sBAAsB,oBAAoB,CAAC,QAAQ,EAAE,GAAG,CAAC,EACzD,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,IAAI,EAC7C,gBAAgB,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,0BAA0B,MAAM,IAAI,EACpC,mBAAmB,GAAG,CAAC,MAAM,EAAE,2BAA2B,CAAC,EAC3D,6BAA6B,MAAM,IAAI,EACvC,wBAAwB,GAAG,CAAC,MAAM,EAAE,4BAA4B,CAAC,EACjE,kCAAkC,MAAM,IAAI;;+BA+dxB,MAAM;yCA3UZ,MAAM;8CAAN,MAAM;CAyXrB,CAAC"}
|
|
@@ -24,7 +24,8 @@ const toExportedMessageRepository = (toThreadMessages, messages) => {
|
|
|
24
24
|
messages: survivors
|
|
25
25
|
};
|
|
26
26
|
};
|
|
27
|
-
const
|
|
27
|
+
const hasUnansweredApproval = (message) => message.content.some((part) => part.type === "tool-call" && part.approval != null && part.approval.approved === void 0 && part.approval.resolution === void 0);
|
|
28
|
+
const isAwaitingToolApproval = (message) => message.status?.type === "requires-action" && (message.status.reason === "tool-calls" || message.status.reason === "interrupt" && hasUnansweredApproval(message));
|
|
28
29
|
const isTerminalMessage = (message) => message.status === void 0 || message.status.type === "complete" || message.status.type === "incomplete";
|
|
29
30
|
const TOOL_ARTIFACTS_METADATA_KEY = "__aui_toolArtifacts";
|
|
30
31
|
const TOOL_INTERACTIONS_METADATA_KEY = "__aui_toolInteractions";
|