@assistant-ui/ai-sdk 0.0.6 → 0.0.8

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.
Files changed (107) hide show
  1. package/README.md +1 -1
  2. package/dist/adapters/aiSDKFormatAdapter.d.ts +2 -2
  3. package/dist/adapters/aiSDKFormatAdapter.d.ts.map +1 -0
  4. package/dist/adapters/vercelAttachmentAdapter.d.ts +2 -5
  5. package/dist/adapters/vercelAttachmentAdapter.d.ts.map +1 -1
  6. package/dist/adapters/vercelAttachmentAdapter.js +3 -3
  7. package/dist/adapters/vercelAttachmentAdapter.js.map +1 -1
  8. package/dist/aiSDKExtras.d.ts +6 -9
  9. package/dist/aiSDKExtras.d.ts.map +1 -1
  10. package/dist/converters/convertMessage.d.ts +34 -25
  11. package/dist/converters/convertMessage.d.ts.map +1 -1
  12. package/dist/converters/convertMessage.js +78 -8
  13. package/dist/converters/convertMessage.js.map +1 -1
  14. package/dist/converters/modelContentEnvelope.d.ts +10 -12
  15. package/dist/converters/modelContentEnvelope.d.ts.map +1 -1
  16. package/dist/converters/toCreateMessage.d.ts +3 -6
  17. package/dist/converters/toCreateMessage.d.ts.map +1 -1
  18. package/dist/converters/toolOutputConversion.d.ts +22 -25
  19. package/dist/converters/toolOutputConversion.d.ts.map +1 -1
  20. package/dist/hooks.d.ts +4 -7
  21. package/dist/hooks.d.ts.map +1 -1
  22. package/dist/index.d.ts +17 -14
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.native.d.ts +15 -12
  25. package/dist/index.native.d.ts.map +1 -0
  26. package/dist/model-context/injectInteractableContext.d.ts +3 -6
  27. package/dist/model-context/injectInteractableContext.d.ts.map +1 -1
  28. package/dist/model-context/injectQuoteContext.d.ts +2 -5
  29. package/dist/model-context/injectQuoteContext.d.ts.map +1 -1
  30. package/dist/runtime/AISDKChat.d.ts +4 -7
  31. package/dist/runtime/AISDKChat.d.ts.map +1 -1
  32. package/dist/runtime/AISDKChat.js +1 -1
  33. package/dist/runtime/AISDKThreads.d.ts +29 -32
  34. package/dist/runtime/AISDKThreads.d.ts.map +1 -1
  35. package/dist/runtime/AISDKThreads.js +26 -33
  36. package/dist/runtime/AISDKThreads.js.map +1 -1
  37. package/dist/runtime/sdkIdentity.d.ts +2 -5
  38. package/dist/runtime/sdkIdentity.d.ts.map +1 -1
  39. package/dist/runtime/sdkIdentity.js +1 -1
  40. package/dist/runtime/useAISDKRuntime.d.ts +72 -61
  41. package/dist/runtime/useAISDKRuntime.d.ts.map +1 -1
  42. package/dist/runtime/useAISDKRuntime.js +170 -56
  43. package/dist/runtime/useAISDKRuntime.js.map +1 -1
  44. package/dist/runtime/useChatRuntime.d.ts +8 -11
  45. package/dist/runtime/useChatRuntime.d.ts.map +1 -1
  46. package/dist/runtime/useChatRuntime.js +14 -10
  47. package/dist/runtime/useChatRuntime.js.map +1 -1
  48. package/dist/runtime/useChatThread.d.ts +100 -81
  49. package/dist/runtime/useChatThread.d.ts.map +1 -1
  50. package/dist/runtime/useChatThread.js +33 -13
  51. package/dist/runtime/useChatThread.js.map +1 -1
  52. package/dist/runtime/useExternalHistory.d.ts +8 -9
  53. package/dist/runtime/useExternalHistory.d.ts.map +1 -1
  54. package/dist/runtime/useExternalHistory.js +236 -58
  55. package/dist/runtime/useExternalHistory.js.map +1 -1
  56. package/dist/runtime/useResourceCleanup.d.ts +1 -4
  57. package/dist/runtime/useResourceCleanup.d.ts.map +1 -1
  58. package/dist/runtime/useResourceCleanup.js +38 -14
  59. package/dist/runtime/useResourceCleanup.js.map +1 -1
  60. package/dist/runtime/useStreamingTiming.d.ts +5 -8
  61. package/dist/runtime/useStreamingTiming.d.ts.map +1 -1
  62. package/dist/runtime/useStreamingTiming.js +1 -1
  63. package/dist/tools/frontendTools.d.ts +24 -27
  64. package/dist/tools/frontendTools.d.ts.map +1 -1
  65. package/dist/tools/generativeTools.d.ts +29 -32
  66. package/dist/tools/generativeTools.d.ts.map +1 -1
  67. package/dist/tools/mcp-stdio.node.d.ts +2 -2
  68. package/dist/tools/mcp-stdio.node.d.ts.map +1 -0
  69. package/dist/tools/mcp-stdio.unsupported.d.ts +2 -5
  70. package/dist/tools/mcp-stdio.unsupported.d.ts.map +1 -1
  71. package/dist/transport/AssistantChatTransport.d.ts +17 -20
  72. package/dist/transport/AssistantChatTransport.d.ts.map +1 -1
  73. package/dist/transport/resumable.d.ts +29 -32
  74. package/dist/transport/resumable.d.ts.map +1 -1
  75. package/dist/usage.d.ts +12 -15
  76. package/dist/usage.d.ts.map +1 -1
  77. package/dist/usage.js.map +1 -1
  78. package/dist/utils/getVercelAIMessages.d.ts +3 -6
  79. package/dist/utils/getVercelAIMessages.d.ts.map +1 -1
  80. package/dist/utils/sliceMessagesUntil.d.ts +2 -5
  81. package/dist/utils/sliceMessagesUntil.d.ts.map +1 -1
  82. package/package.json +16 -14
  83. package/src/adapters/vercelAttachmentAdapter.test.ts +23 -0
  84. package/src/adapters/vercelAttachmentAdapter.ts +2 -2
  85. package/src/converters/convertMessage.test.ts +616 -3
  86. package/src/converters/convertMessage.ts +187 -12
  87. package/src/index.native.ts +1 -1
  88. package/src/index.ts +1 -1
  89. package/src/runtime/AISDKChat.test.ts +4 -5
  90. package/src/runtime/AISDKThreads.cloud.test.ts +60 -2
  91. package/src/runtime/AISDKThreads.test.ts +88 -51
  92. package/src/runtime/AISDKThreads.ts +4 -13
  93. package/src/runtime/useAISDKRuntime.approval.integration.test.tsx +338 -0
  94. package/src/runtime/useAISDKRuntime.approval.test.tsx +476 -4
  95. package/src/runtime/useAISDKRuntime.test.ts +282 -8
  96. package/src/runtime/useAISDKRuntime.ts +274 -46
  97. package/src/runtime/useAISDKRuntime.voice.test.tsx +319 -0
  98. package/src/runtime/useChatRuntime.integration.test.tsx +56 -0
  99. package/src/runtime/useChatRuntime.test.ts +77 -5
  100. package/src/runtime/useChatRuntime.ts +6 -2
  101. package/src/runtime/useChatThread.transport.test.tsx +149 -0
  102. package/src/runtime/useChatThread.ts +77 -10
  103. package/src/runtime/useExternalHistory.test.ts +989 -3
  104. package/src/runtime/useExternalHistory.ts +390 -24
  105. package/src/runtime/useResourceCleanup.ts +41 -15
  106. package/src/tools/generativeTools.test.ts +7 -1
  107. package/src/usage.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"useExternalHistory.js","names":["AssistantRuntime","ThreadHistoryAdapter","ThreadMessage","MessageFormatAdapter","MessageFormatItem","MessageFormatRepository","ExportedMessageRepository","getExternalStoreMessages","MessageRepository","useAui","useRef","useEffect","useState","RefObject","useCallback","useMemo","toExportedMessageRepository","toThreadMessages","messages","TMessage","survivingIds","Set","survivors","flatMap","m","message","console","warn","parentId","has","add","id","headId","isAwaitingToolApproval","status","type","reason","encodeContent","storageFormatAdapter","item","JSON","stringify","encode","useExternalHistory","runtimeRef","historyAdapter","onSetMessages","loadedRef","itemEpoch","setItemEpoch","aui","optionalThreadListItem","threadListItem","source","hasLoaded","setHasLoaded","historyIds","deferredTelemetryIds","persistedInnerMessages","Map","content","onSetMessagesRef","current","formatAdapter","undefined","withFormat","Error","isLoading","loadHistory","repo","load","length","set","getId","converted","thread","import","tempRepo","getMessages","error","pin","remoteId","getState","subscribe","n","threadState","isRunning","runStartRef","persistTimerRef","ReturnType","setTimeout","persistInFlightRef","Promise","resolve","stepBoundariesRef","wasRunningRef","toolCallCountRef","adapter","unsubscribe","wasRunning","lastMsg","at","role","currentToolCallCount","filter","p","push","Date","now","clearTimeout","persistSettled","initialThreadState","ignoreRunning","latest","boundaries","durationMs","lastAssistant","findLast","tcCount","totalSteps","stepDur","i","Math","round","stepTimestamps","map","endMs","start_ms","end_ms","telemetryOptions","then","lastInnerMessageId","getLastInnerId","msgs","toBatchItems","msg","idx","innerMessages","isTerminal","isAwaitingToolCalls","isReady","update","batchItems","innerId","persisted","get","append","delete","reportTelemetry","catch","deleteMessage","messageId","deleteMessages","bind","messageIndex","findIndex","previousInnerMessages","slice","itemsToDelete","deletion"],"sources":["../../src/runtime/useExternalHistory.ts"],"sourcesContent":["\"use client\";\n\nimport type {\n AssistantRuntime,\n ThreadHistoryAdapter,\n ThreadMessage,\n MessageFormatAdapter,\n MessageFormatItem,\n MessageFormatRepository,\n ExportedMessageRepository,\n} from \"@assistant-ui/core\";\nimport { getExternalStoreMessages } from \"@assistant-ui/core\";\nimport { MessageRepository } from \"@assistant-ui/core/internal\";\nimport { useAui } from \"@assistant-ui/store\";\nimport {\n useRef,\n useEffect,\n useState,\n type RefObject,\n useCallback,\n useMemo,\n} from \"react\";\n\nexport const toExportedMessageRepository = <TMessage>(\n toThreadMessages: (messages: TMessage[]) => ThreadMessage[],\n messages: MessageFormatRepository<TMessage>,\n): ExportedMessageRepository => {\n const survivingIds = new Set<string>();\n const survivors = messages.messages.flatMap((m) => {\n const message = toThreadMessages([m.message])[0];\n if (!message) {\n console.warn(\"Skipping a stored message that could not be loaded.\");\n return [];\n }\n if (m.parentId && !survivingIds.has(m.parentId)) return [];\n survivingIds.add(message.id);\n return [{ ...m, message }];\n });\n\n return {\n headId:\n messages.headId && survivingIds.has(messages.headId)\n ? messages.headId\n : null,\n messages: survivors,\n };\n};\n\nconst isAwaitingToolApproval = (message: ThreadMessage) =>\n message.status?.type === \"requires-action\" &&\n message.status.reason === \"tool-calls\";\n\nconst encodeContent = <TMessage>(\n storageFormatAdapter: MessageFormatAdapter<TMessage, any>,\n item: MessageFormatItem<TMessage>,\n) => JSON.stringify(storageFormatAdapter.encode(item));\n\nexport const useExternalHistory = <TMessage>(\n runtimeRef: RefObject<AssistantRuntime>,\n historyAdapter: ThreadHistoryAdapter | undefined,\n toThreadMessages: (messages: TMessage[]) => ThreadMessage[],\n storageFormatAdapter: MessageFormatAdapter<TMessage, any>,\n onSetMessages: (messages: TMessage[]) => void,\n) => {\n const loadedRef = useRef(false);\n const [itemEpoch, setItemEpoch] = useState(0);\n\n const aui = useAui();\n const optionalThreadListItem = useCallback(\n () => (aui.threadListItem.source ? aui.threadListItem : null),\n [aui],\n );\n\n const [hasLoaded, setHasLoaded] = useState(false);\n\n const historyIds = useRef(new Set<string>());\n const deferredTelemetryIds = useRef(new Set<string>());\n // `content` is a snapshot taken at write time rather than a re-encode of `source`, because a retained message object can be mutated in place by the runtime that produced it.\n const persistedInnerMessages = useRef(\n new Map<string, { source: TMessage; content: string }>(),\n );\n\n const onSetMessagesRef = useRef(onSetMessages);\n useEffect(() => {\n onSetMessagesRef.current = onSetMessages;\n });\n\n const formatAdapter = useMemo(() => {\n if (!historyAdapter) return undefined;\n if (!historyAdapter.withFormat) {\n throw new Error(\n \"useAISDKRuntime: ThreadHistoryAdapter is missing the required `withFormat` method.\",\n );\n }\n return historyAdapter.withFormat<TMessage, any>(storageFormatAdapter);\n }, [historyAdapter, storageFormatAdapter]);\n\n const isLoading = formatAdapter != null && !hasLoaded;\n\n useEffect(() => {\n if (!formatAdapter || loadedRef.current) return undefined;\n\n const loadHistory = async () => {\n try {\n const repo = await formatAdapter.load();\n if (repo && repo.messages.length > 0) {\n for (const m of repo.messages) {\n persistedInnerMessages.current.set(\n storageFormatAdapter.getId(m.message),\n {\n source: m.message,\n content: encodeContent(storageFormatAdapter, m),\n },\n );\n }\n const converted = toExportedMessageRepository(toThreadMessages, repo);\n runtimeRef.current.thread.import(converted);\n\n const tempRepo = new MessageRepository();\n tempRepo.import(converted);\n const messages = tempRepo.getMessages();\n\n onSetMessagesRef.current(\n messages.flatMap(getExternalStoreMessages<TMessage>),\n );\n\n historyIds.current = new Set();\n for (const m of converted.messages) {\n historyIds.current.add(m.message.id);\n if (isAwaitingToolApproval(m.message)) {\n deferredTelemetryIds.current.add(m.message.id);\n }\n }\n }\n } catch (error) {\n console.error(\"Failed to load message history:\", error);\n } finally {\n setHasLoaded(true);\n }\n };\n\n formatAdapter.pin?.();\n\n const remoteId = optionalThreadListItem()?.getState().remoteId;\n if (!remoteId) {\n // History loads asynchronously against the thread list item; without a\n // remote id there is nothing to await, so the flag settles here.\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setHasLoaded(true);\n return aui.subscribe(() => {\n if (optionalThreadListItem()?.getState().remoteId) {\n setItemEpoch((n) => n + 1);\n }\n });\n }\n\n const threadState = runtimeRef.current.thread.getState();\n if (threadState.isRunning || threadState.messages.length > 0) {\n loadedRef.current = true;\n setHasLoaded(true);\n return undefined;\n }\n\n loadedRef.current = true;\n void loadHistory();\n return undefined;\n }, [\n formatAdapter,\n toThreadMessages,\n runtimeRef,\n optionalThreadListItem,\n aui,\n itemEpoch,\n storageFormatAdapter,\n ]);\n\n const runStartRef = useRef<number | null>(null);\n const persistTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const persistInFlightRef = useRef<Promise<void>>(Promise.resolve());\n const stepBoundariesRef = useRef<number[]>([]);\n const wasRunningRef = useRef(false);\n const toolCallCountRef = useRef(0);\n\n useEffect(() => {\n if (!formatAdapter) return;\n const adapter = formatAdapter;\n\n const unsubscribe = runtimeRef.current.thread.subscribe(() => {\n const threadState = runtimeRef.current.thread.getState();\n const { isRunning } = threadState;\n const wasRunning = wasRunningRef.current;\n wasRunningRef.current = isRunning;\n\n // Track step boundaries by content changes (more reliable than isRunning)\n if (runStartRef.current != null) {\n const lastMsg = threadState.messages.at(-1);\n if (lastMsg?.role === \"assistant\") {\n const currentToolCallCount = lastMsg.content.filter(\n (p) => p.type === \"tool-call\",\n ).length;\n while (toolCallCountRef.current < currentToolCallCount) {\n stepBoundariesRef.current.push(Date.now() - runStartRef.current);\n toolCallCountRef.current++;\n }\n }\n }\n\n if (isRunning) {\n if (runStartRef.current == null) {\n runStartRef.current = Date.now();\n stepBoundariesRef.current = [];\n toolCallCountRef.current = 0;\n adapter.pin?.();\n }\n // Cancel any pending persist — isRunning went back to true\n if (persistTimerRef.current) {\n clearTimeout(persistTimerRef.current);\n persistTimerRef.current = null;\n }\n return;\n }\n\n // Only act on the true→false transition\n if (!wasRunning) return;\n\n // Record step boundary offset (synchronous for accuracy)\n if (runStartRef.current != null) {\n stepBoundariesRef.current.push(Date.now() - runStartRef.current);\n }\n\n // Debounce: wait one macrotask so agentic step flickers are absorbed\n if (persistTimerRef.current) clearTimeout(persistTimerRef.current);\n persistTimerRef.current = setTimeout(() => {\n persistSettled(false);\n }, 0);\n });\n\n const initialThreadState = runtimeRef.current.thread.getState();\n wasRunningRef.current = initialThreadState.isRunning;\n if (initialThreadState.isRunning) {\n if (runStartRef.current == null) {\n runStartRef.current = Date.now();\n stepBoundariesRef.current = [];\n toolCallCountRef.current = 0;\n adapter.pin?.();\n }\n } else if (initialThreadState.messages.length > 0) {\n persistSettled(true);\n }\n\n function persistSettled(ignoreRunning: boolean) {\n persistTimerRef.current = null;\n const latest = runtimeRef.current.thread.getState();\n if (!ignoreRunning && latest.isRunning) return;\n\n const boundaries = stepBoundariesRef.current;\n const durationMs = boundaries.length > 0 ? boundaries.at(-1) : undefined;\n\n // Fallback: if only 1 boundary but message has multiple steps, distribute evenly\n if (boundaries.length === 1 && durationMs != null) {\n const lastAssistant = latest.messages.findLast(\n (m) => m.role === \"assistant\",\n );\n if (lastAssistant) {\n const tcCount = lastAssistant.content.filter(\n (p) => p.type === \"tool-call\",\n ).length;\n if (tcCount > 0) {\n const totalSteps = tcCount + 1;\n const stepDur = durationMs / totalSteps;\n boundaries.length = 0;\n for (let i = 0; i < totalSteps; i++) {\n boundaries.push(Math.round((i + 1) * stepDur));\n }\n }\n }\n }\n\n // Build per-step timestamps when there are multiple steps\n const stepTimestamps =\n boundaries.length > 1\n ? boundaries.map((endMs, i) => ({\n start_ms: i === 0 ? 0 : boundaries[i - 1]!,\n end_ms: endMs,\n }))\n : undefined;\n\n runStartRef.current = null;\n stepBoundariesRef.current = [];\n\n const telemetryOptions = {\n ...(durationMs != null ? { durationMs } : undefined),\n ...(stepTimestamps != null ? { stepTimestamps } : undefined),\n };\n\n persistInFlightRef.current = persistInFlightRef.current\n .then(async () => {\n const { messages } = latest;\n let lastInnerMessageId: string | null = null;\n\n const getLastInnerId = (msgs: TMessage[]): string | null =>\n msgs.length > 0 ? storageFormatAdapter.getId(msgs.at(-1)!) : null;\n\n const toBatchItems = (msgs: TMessage[]) =>\n msgs.map((msg, idx) => ({\n parentId:\n idx === 0\n ? lastInnerMessageId\n : storageFormatAdapter.getId(msgs[idx - 1]!),\n message: msg,\n }));\n\n for (const message of messages) {\n const innerMessages = getExternalStoreMessages<TMessage>(message);\n\n const isTerminal =\n message.status === undefined ||\n message.status.type === \"complete\" ||\n message.status.type === \"incomplete\";\n const isAwaitingToolCalls = isAwaitingToolApproval(message);\n // A paused message's later content can only reach storage via update, so it is persisted early only when the adapter supports update.\n const isReady =\n isTerminal ||\n (isAwaitingToolCalls && adapter.update !== undefined);\n\n if (!isReady) {\n lastInnerMessageId =\n getLastInnerId(innerMessages) ?? lastInnerMessageId;\n continue;\n }\n\n if (!historyIds.current.has(message.id)) {\n historyIds.current.add(message.id);\n deferredTelemetryIds.current.add(message.id);\n }\n\n const batchItems = toBatchItems(innerMessages);\n for (const item of batchItems) {\n const innerId = storageFormatAdapter.getId(item.message);\n const persisted = persistedInnerMessages.current.get(innerId);\n if (!persisted) {\n await adapter.append(item);\n persistedInnerMessages.current.set(innerId, {\n source: item.message,\n content: encodeContent(storageFormatAdapter, item),\n });\n } else if (\n persisted.source !== item.message &&\n durationMs !== undefined &&\n adapter.update\n ) {\n const content = encodeContent(storageFormatAdapter, item);\n if (content === persisted.content) {\n persisted.source = item.message;\n } else {\n try {\n await adapter.update(item, innerId);\n persistedInnerMessages.current.set(innerId, {\n source: item.message,\n content,\n });\n } catch {\n // A failed update leaves the stale baseline behind so the next run stop retries it.\n }\n }\n }\n }\n\n lastInnerMessageId =\n getLastInnerId(innerMessages) ?? lastInnerMessageId;\n\n if (deferredTelemetryIds.current.has(message.id) && isTerminal) {\n deferredTelemetryIds.current.delete(message.id);\n adapter.reportTelemetry?.(batchItems, {\n ...telemetryOptions,\n message,\n });\n }\n }\n })\n .catch((error) => {\n console.error(\"Failed to persist message history:\", error);\n });\n }\n\n return () => {\n unsubscribe();\n if (persistTimerRef.current) {\n clearTimeout(persistTimerRef.current);\n persistTimerRef.current = null;\n persistSettled(false);\n }\n };\n }, [formatAdapter, storageFormatAdapter, runtimeRef]);\n\n const deleteMessage = useCallback(\n async (messageId: string) => {\n const deleteMessages = formatAdapter?.delete?.bind(formatAdapter);\n if (!deleteMessages) return;\n\n const messages = runtimeRef.current.thread.getState().messages;\n const messageIndex = messages.findIndex((m) => m.id === messageId);\n if (messageIndex === -1) return;\n\n const previousInnerMessages = messages\n .slice(0, messageIndex)\n .flatMap(getExternalStoreMessages<TMessage>);\n let parentId = previousInnerMessages.at(-1)\n ? storageFormatAdapter.getId(previousInnerMessages.at(-1)!)\n : null;\n const itemsToDelete = getExternalStoreMessages<TMessage>(\n messages[messageIndex]!,\n ).map((message) => {\n const item = { parentId, message };\n parentId = storageFormatAdapter.getId(message);\n return item;\n });\n\n const deletion = persistInFlightRef.current.then(async () => {\n await deleteMessages(itemsToDelete);\n\n historyIds.current.delete(messageId);\n deferredTelemetryIds.current.delete(messageId);\n for (const item of itemsToDelete) {\n persistedInnerMessages.current.delete(\n storageFormatAdapter.getId(item.message),\n );\n }\n });\n\n persistInFlightRef.current = deletion.catch(() => {});\n await deletion;\n },\n [formatAdapter, runtimeRef, storageFormatAdapter],\n );\n\n return { isLoading, deleteMessage };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"useExternalHistory.js","names":["AssistantRuntime","ThreadHistoryAdapter","ThreadMessage","MessageFormatAdapter","MessageFormatItem","MessageFormatRepository","ExportedMessageRepository","RespondToToolApprovalOptions","Unstable_ToolInteractionLog","getExternalStoreMessages","MessageRepository","readToolInteractionLog","useAui","useRef","useEffect","useState","RefObject","useCallback","useMemo","toExportedMessageRepository","toThreadMessages","messages","TMessage","survivingIds","Set","survivors","flatMap","m","message","console","warn","parentId","has","add","id","headId","isAwaitingToolApproval","status","type","reason","isTerminalMessage","undefined","TOOL_ARTIFACTS_METADATA_KEY","TOOL_INTERACTIONS_METADATA_KEY","TOOL_APPROVAL_RESPONSES_METADATA_KEY","StoredToolApprovalResponse","Omit","isRecord","value","Record","Array","isArray","collectToolArtifacts","toolArtifacts","ReadonlyMap","entries","content","part","artifact","get","toolCallId","const","length","Object","fromEntries","collectToolInteractions","toolInteractions","interactions","collectToolApprovalResponses","toolApprovalResponses","approval","response","approved","optionId","text","addToolData","parts","toolCallIds","artifacts","hasOwn","approvalIds","approvalId","approvalResponses","hasArtifacts","keys","hasInteractions","hasApprovalResponses","metadata","restoreToolData","Map","set","log","_","__","___","restMetadata","_metadata","restMessage","encodeContent","storageFormatAdapter","item","JSON","stringify","encode","useExternalHistory","runtimeRef","historyAdapter","onSetMessages","onToolArtifactsRestored","onToolInteractionsRestored","onToolApprovalResponsesRestored","loadedRef","itemEpoch","setItemEpoch","aui","optionalThreadListItem","threadListItem","source","hasLoaded","setHasLoaded","historyIds","deferredTelemetryIds","persistedInnerMessages","onSetMessagesRef","current","formatAdapter","withFormat","Error","isLoading","loadHistory","repo","load","clear","restoredMessages","map","restoredRepo","index","getId","converted","thread","import","tempRepo","getMessages","error","pin","remoteId","getState","subscribe","n","threadState","isRunning","runStartRef","persistTimerRef","ReturnType","setTimeout","persistInFlightRef","Promise","resolve","stepBoundariesRef","wasRunningRef","toolCallCountRef","persistToolInteractions","messageId","persistence","then","update","find","some","innerMessage","previousMessages","slice","indexOf","at","storedToolArtifacts","storedToolInteractions","storedToolApprovalResponses","innerId","persisted","catch","adapter","idleScheduledInnerIds","unpersistedInnerIds","filter","unsubscribe","wasRunning","lastMsg","role","currentToolCallCount","p","push","Date","now","clearTimeout","pending","every","persistSettled","initialThreadState","ignoreRunning","latest","boundaries","durationMs","lastAssistant","findLast","tcCount","totalSteps","stepDur","i","Math","round","stepTimestamps","endMs","start_ms","end_ms","telemetryOptions","lastInnerMessageId","getLastInnerId","msgs","toBatchItems","msg","idx","innerMessages","isTerminal","isAwaitingToolCalls","isReady","batchItems","append","delete","reportTelemetry","deleteMessage","deleteMessages","bind","messageIndex","findIndex","previousInnerMessages","itemsToDelete","deletion","persistToolApprovalResponses"],"sources":["../../src/runtime/useExternalHistory.ts"],"sourcesContent":["\"use client\";\n\nimport type {\n AssistantRuntime,\n ThreadHistoryAdapter,\n ThreadMessage,\n MessageFormatAdapter,\n MessageFormatItem,\n MessageFormatRepository,\n ExportedMessageRepository,\n RespondToToolApprovalOptions,\n Unstable_ToolInteractionLog,\n} from \"@assistant-ui/core\";\nimport { getExternalStoreMessages } from \"@assistant-ui/core\";\nimport {\n MessageRepository,\n readToolInteractionLog,\n} from \"@assistant-ui/core/internal\";\nimport { useAui } from \"@assistant-ui/store\";\nimport {\n useRef,\n useEffect,\n useState,\n type RefObject,\n useCallback,\n useMemo,\n} from \"react\";\n\nexport const toExportedMessageRepository = <TMessage>(\n toThreadMessages: (messages: TMessage[]) => ThreadMessage[],\n messages: MessageFormatRepository<TMessage>,\n): ExportedMessageRepository => {\n const survivingIds = new Set<string>();\n const survivors = messages.messages.flatMap((m) => {\n const message = toThreadMessages([m.message])[0];\n if (!message) {\n console.warn(\"Skipping a stored message that could not be loaded.\");\n return [];\n }\n if (m.parentId && !survivingIds.has(m.parentId)) return [];\n survivingIds.add(message.id);\n return [{ ...m, message }];\n });\n\n return {\n headId:\n messages.headId && survivingIds.has(messages.headId)\n ? messages.headId\n : null,\n messages: survivors,\n };\n};\n\nconst isAwaitingToolApproval = (message: ThreadMessage) =>\n message.status?.type === \"requires-action\" &&\n message.status.reason === \"tool-calls\";\n\nconst isTerminalMessage = (message: ThreadMessage) =>\n message.status === undefined ||\n message.status.type === \"complete\" ||\n message.status.type === \"incomplete\";\n\nconst TOOL_ARTIFACTS_METADATA_KEY = \"__aui_toolArtifacts\";\nconst TOOL_INTERACTIONS_METADATA_KEY = \"__aui_toolInteractions\";\nconst TOOL_APPROVAL_RESPONSES_METADATA_KEY = \"__aui_toolApprovalResponses\";\n\ntype StoredToolApprovalResponse = Omit<\n RespondToToolApprovalOptions,\n \"approvalId\"\n>;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value);\n\nconst collectToolArtifacts = (\n message: ThreadMessage,\n toolArtifacts: ReadonlyMap<string, unknown> | undefined,\n) => {\n if (!toolArtifacts) return undefined;\n const entries = message.content.flatMap((part) => {\n if (part.type !== \"tool-call\") return [];\n const artifact = toolArtifacts.get(part.toolCallId);\n return artifact === undefined ? [] : [[part.toolCallId, artifact] as const];\n });\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n};\n\nconst collectToolInteractions = (\n message: ThreadMessage,\n toolInteractions:\n | ReadonlyMap<string, Unstable_ToolInteractionLog>\n | undefined,\n) => {\n if (!toolInteractions) return undefined;\n const entries = message.content.flatMap((part) => {\n if (part.type !== \"tool-call\") return [];\n const interactions = toolInteractions.get(part.toolCallId);\n return interactions === undefined\n ? []\n : [[part.toolCallId, interactions] as const];\n });\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n};\n\nconst collectToolApprovalResponses = (\n message: ThreadMessage,\n toolApprovalResponses:\n | ReadonlyMap<string, RespondToToolApprovalOptions>\n | undefined,\n) => {\n if (!toolApprovalResponses) return undefined;\n const entries = message.content.flatMap((part) => {\n if (part.type !== \"tool-call\" || !part.approval) return [];\n const response = toolApprovalResponses.get(part.approval.id);\n if (!response) return [];\n return [\n [\n part.approval.id,\n {\n approved: response.approved,\n ...(response.optionId != null && { optionId: response.optionId }),\n ...(response.text != null && { text: response.text }),\n ...(response.reason != null && { reason: response.reason }),\n },\n ] as const,\n ];\n });\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n};\n\nconst addToolData = <TMessage>(\n message: TMessage,\n toolArtifacts: Record<string, unknown> | undefined,\n toolInteractions: Record<string, Unstable_ToolInteractionLog> | undefined,\n toolApprovalResponses: Record<string, StoredToolApprovalResponse> | undefined,\n): TMessage => {\n if (\n (!toolArtifacts && !toolInteractions && !toolApprovalResponses) ||\n !isRecord(message) ||\n !Array.isArray(message.parts)\n )\n return message;\n const toolCallIds = message.parts.flatMap((part) => {\n if (!isRecord(part) || typeof part.toolCallId !== \"string\") return [];\n return [part.toolCallId];\n });\n const artifacts = toolArtifacts\n ? Object.fromEntries(\n toolCallIds.flatMap((toolCallId) =>\n Object.hasOwn(toolArtifacts, toolCallId)\n ? [[toolCallId, toolArtifacts[toolCallId]] as const]\n : [],\n ),\n )\n : undefined;\n const interactions = toolInteractions\n ? Object.fromEntries(\n toolCallIds.flatMap((toolCallId) =>\n Object.hasOwn(toolInteractions, toolCallId)\n ? [[toolCallId, toolInteractions[toolCallId]] as const]\n : [],\n ),\n )\n : undefined;\n const approvalIds = message.parts.flatMap((part) => {\n if (!isRecord(part) || !isRecord(part.approval)) return [];\n const approvalId = part.approval.id;\n return typeof approvalId === \"string\" ? [approvalId] : [];\n });\n const approvalResponses = toolApprovalResponses\n ? Object.fromEntries(\n approvalIds.flatMap((approvalId) =>\n Object.hasOwn(toolApprovalResponses, approvalId)\n ? [[approvalId, toolApprovalResponses[approvalId]] as const]\n : [],\n ),\n )\n : undefined;\n const hasArtifacts = !!artifacts && Object.keys(artifacts).length > 0;\n const hasInteractions =\n !!interactions && Object.keys(interactions).length > 0;\n const hasApprovalResponses =\n !!approvalResponses && Object.keys(approvalResponses).length > 0;\n if (!hasArtifacts && !hasInteractions && !hasApprovalResponses)\n return message;\n const metadata = isRecord(message.metadata) ? message.metadata : {};\n return {\n ...message,\n metadata: {\n ...metadata,\n ...(hasArtifacts && { [TOOL_ARTIFACTS_METADATA_KEY]: artifacts }),\n ...(hasInteractions && {\n [TOOL_INTERACTIONS_METADATA_KEY]: interactions,\n }),\n ...(hasApprovalResponses && {\n [TOOL_APPROVAL_RESPONSES_METADATA_KEY]: approvalResponses,\n }),\n },\n } as TMessage;\n};\n\nconst restoreToolData = <TMessage>(\n message: TMessage,\n toolArtifacts: Map<string, unknown> | undefined,\n toolInteractions: Map<string, Unstable_ToolInteractionLog> | undefined,\n toolApprovalResponses: Map<string, RespondToToolApprovalOptions> | undefined,\n): TMessage => {\n if (!isRecord(message) || !isRecord(message.metadata)) return message;\n const metadata = message.metadata;\n const hasArtifacts = Object.hasOwn(metadata, TOOL_ARTIFACTS_METADATA_KEY);\n const hasInteractions = Object.hasOwn(\n metadata,\n TOOL_INTERACTIONS_METADATA_KEY,\n );\n const hasApprovalResponses = Object.hasOwn(\n metadata,\n TOOL_APPROVAL_RESPONSES_METADATA_KEY,\n );\n if (!hasArtifacts && !hasInteractions && !hasApprovalResponses)\n return message;\n const artifacts = metadata[TOOL_ARTIFACTS_METADATA_KEY];\n if (toolArtifacts && isRecord(artifacts)) {\n for (const [toolCallId, artifact] of Object.entries(artifacts)) {\n toolArtifacts.set(toolCallId, artifact);\n }\n }\n const interactions = metadata[TOOL_INTERACTIONS_METADATA_KEY];\n if (toolInteractions && isRecord(interactions)) {\n for (const [toolCallId, value] of Object.entries(interactions)) {\n const log = readToolInteractionLog(value);\n if (log) toolInteractions.set(toolCallId, log);\n }\n }\n const approvalResponses = metadata[TOOL_APPROVAL_RESPONSES_METADATA_KEY];\n if (toolApprovalResponses && isRecord(approvalResponses)) {\n for (const [approvalId, value] of Object.entries(approvalResponses)) {\n if (!isRecord(value) || typeof value.approved !== \"boolean\") continue;\n toolApprovalResponses.set(approvalId, {\n approvalId,\n approved: value.approved,\n ...(typeof value.optionId === \"string\" && {\n optionId: value.optionId,\n }),\n ...(typeof value.text === \"string\" && { text: value.text }),\n ...(typeof value.reason === \"string\" && { reason: value.reason }),\n });\n }\n }\n const {\n [TOOL_ARTIFACTS_METADATA_KEY]: _,\n [TOOL_INTERACTIONS_METADATA_KEY]: __,\n [TOOL_APPROVAL_RESPONSES_METADATA_KEY]: ___,\n ...restMetadata\n } = metadata;\n const { metadata: _metadata, ...restMessage } = message;\n return (\n Object.keys(restMetadata).length === 0\n ? restMessage\n : { ...restMessage, metadata: restMetadata }\n ) as TMessage;\n};\n\nconst encodeContent = <TMessage>(\n storageFormatAdapter: MessageFormatAdapter<TMessage, any>,\n item: MessageFormatItem<TMessage>,\n) => JSON.stringify(storageFormatAdapter.encode(item));\n\nexport const useExternalHistory = <TMessage>(\n runtimeRef: RefObject<AssistantRuntime>,\n historyAdapter: ThreadHistoryAdapter | undefined,\n toThreadMessages: (messages: TMessage[]) => ThreadMessage[],\n storageFormatAdapter: MessageFormatAdapter<TMessage, any>,\n onSetMessages: (messages: TMessage[]) => void,\n toolArtifacts?: Map<string, unknown>,\n onToolArtifactsRestored?: () => void,\n toolInteractions?: Map<string, Unstable_ToolInteractionLog>,\n onToolInteractionsRestored?: () => void,\n toolApprovalResponses?: Map<string, RespondToToolApprovalOptions>,\n onToolApprovalResponsesRestored?: () => void,\n) => {\n const loadedRef = useRef(false);\n const [itemEpoch, setItemEpoch] = useState(0);\n\n const aui = useAui();\n const optionalThreadListItem = useCallback(\n () => (aui.threadListItem.source ? aui.threadListItem : null),\n [aui],\n );\n\n const [hasLoaded, setHasLoaded] = useState(false);\n\n const historyIds = useRef(new Set<string>());\n const deferredTelemetryIds = useRef(new Set<string>());\n // `content` is a snapshot taken at write time rather than a re-encode of `source`, because a retained message object can be mutated in place by the runtime that produced it.\n const persistedInnerMessages = useRef(\n new Map<string, { source: TMessage; content: string }>(),\n );\n\n const onSetMessagesRef = useRef(onSetMessages);\n useEffect(() => {\n onSetMessagesRef.current = onSetMessages;\n });\n\n const formatAdapter = useMemo(() => {\n if (!historyAdapter) return undefined;\n if (!historyAdapter.withFormat) {\n throw new Error(\n \"useAISDKRuntime: ThreadHistoryAdapter is missing the required `withFormat` method.\",\n );\n }\n return historyAdapter.withFormat<TMessage, any>(storageFormatAdapter);\n }, [historyAdapter, storageFormatAdapter]);\n\n const isLoading = formatAdapter != null && !hasLoaded;\n\n useEffect(() => {\n if (!formatAdapter || loadedRef.current) return undefined;\n\n const loadHistory = async () => {\n try {\n const repo = await formatAdapter.load();\n toolArtifacts?.clear();\n toolInteractions?.clear();\n toolApprovalResponses?.clear();\n const restoredMessages =\n repo?.messages.map((item) => ({\n ...item,\n message: restoreToolData(\n item.message,\n toolArtifacts,\n toolInteractions,\n toolApprovalResponses,\n ),\n })) ?? [];\n onToolArtifactsRestored?.();\n onToolInteractionsRestored?.();\n onToolApprovalResponsesRestored?.();\n if (repo && restoredMessages.length > 0) {\n const restoredRepo = { ...repo, messages: restoredMessages };\n for (const [index, m] of repo.messages.entries()) {\n persistedInnerMessages.current.set(\n storageFormatAdapter.getId(m.message),\n {\n source: restoredMessages[index]!.message,\n content: encodeContent(storageFormatAdapter, m),\n },\n );\n }\n const converted = toExportedMessageRepository(\n toThreadMessages,\n restoredRepo,\n );\n runtimeRef.current.thread.import(converted);\n\n const tempRepo = new MessageRepository();\n tempRepo.import(converted);\n const messages = tempRepo.getMessages();\n\n onSetMessagesRef.current(\n messages.flatMap(getExternalStoreMessages<TMessage>),\n );\n\n historyIds.current = new Set();\n for (const m of converted.messages) {\n historyIds.current.add(m.message.id);\n if (isAwaitingToolApproval(m.message)) {\n deferredTelemetryIds.current.add(m.message.id);\n }\n }\n }\n } catch (error) {\n console.error(\"Failed to load message history:\", error);\n } finally {\n setHasLoaded(true);\n }\n };\n\n formatAdapter.pin?.();\n\n const remoteId = optionalThreadListItem()?.getState().remoteId;\n if (!remoteId) {\n // History loads asynchronously against the thread list item; without a\n // remote id there is nothing to await, so the flag settles here.\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setHasLoaded(true);\n return aui.subscribe(() => {\n if (optionalThreadListItem()?.getState().remoteId) {\n setItemEpoch((n) => n + 1);\n }\n });\n }\n\n const threadState = runtimeRef.current.thread.getState();\n if (threadState.isRunning || threadState.messages.length > 0) {\n loadedRef.current = true;\n setHasLoaded(true);\n return undefined;\n }\n\n loadedRef.current = true;\n void loadHistory();\n return undefined;\n }, [\n formatAdapter,\n toThreadMessages,\n runtimeRef,\n optionalThreadListItem,\n aui,\n itemEpoch,\n storageFormatAdapter,\n toolArtifacts,\n onToolArtifactsRestored,\n toolInteractions,\n onToolInteractionsRestored,\n toolApprovalResponses,\n onToolApprovalResponsesRestored,\n ]);\n\n const runStartRef = useRef<number | null>(null);\n const persistTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const persistInFlightRef = useRef<Promise<void>>(Promise.resolve());\n const stepBoundariesRef = useRef<number[]>([]);\n const wasRunningRef = useRef(false);\n const toolCallCountRef = useRef(0);\n\n const persistToolInteractions = useCallback(\n (messageId: string) => {\n const persistence = persistInFlightRef.current.then(async () => {\n if (!formatAdapter?.update) return;\n const messages = runtimeRef.current.thread.getState().messages;\n const message = messages.find(\n (item) =>\n item.id === messageId ||\n getExternalStoreMessages<TMessage>(item).some(\n (innerMessage) =>\n storageFormatAdapter.getId(innerMessage) === messageId,\n ),\n );\n if (!message) return;\n\n const previousMessages = messages\n .slice(0, messages.indexOf(message))\n .flatMap(getExternalStoreMessages<TMessage>);\n let parentId = previousMessages.at(-1)\n ? storageFormatAdapter.getId(previousMessages.at(-1)!)\n : null;\n const storedToolArtifacts = collectToolArtifacts(\n message,\n toolArtifacts,\n );\n const storedToolInteractions = collectToolInteractions(\n message,\n toolInteractions,\n );\n const storedToolApprovalResponses = collectToolApprovalResponses(\n message,\n toolApprovalResponses,\n );\n\n for (const innerMessage of getExternalStoreMessages<TMessage>(\n message,\n )) {\n const item = {\n parentId,\n message: addToolData(\n innerMessage,\n storedToolArtifacts,\n storedToolInteractions,\n storedToolApprovalResponses,\n ),\n };\n const innerId = storageFormatAdapter.getId(item.message);\n const persisted = persistedInnerMessages.current.get(innerId);\n if (persisted) {\n const content = encodeContent(storageFormatAdapter, item);\n if (content === persisted.content) {\n persisted.source = item.message;\n } else {\n await formatAdapter.update(item, innerId);\n persistedInnerMessages.current.set(innerId, {\n source: item.message,\n content,\n });\n }\n }\n parentId = innerId;\n }\n });\n persistInFlightRef.current = persistence.catch(() => {});\n return persistence.catch((error) => {\n console.error(\"Failed to persist tool data:\", error);\n });\n },\n [\n formatAdapter,\n runtimeRef,\n storageFormatAdapter,\n toolArtifacts,\n toolInteractions,\n toolApprovalResponses,\n ],\n );\n\n useEffect(() => {\n if (!formatAdapter) return;\n const adapter = formatAdapter;\n\n const idleScheduledInnerIds = new Set<string>();\n const unpersistedInnerIds = (message: ThreadMessage) =>\n isTerminalMessage(message)\n ? getExternalStoreMessages<TMessage>(message)\n .map((innerMessage) => storageFormatAdapter.getId(innerMessage))\n .filter((innerId) => !persistedInnerMessages.current.has(innerId))\n : [];\n\n const unsubscribe = runtimeRef.current.thread.subscribe(() => {\n const threadState = runtimeRef.current.thread.getState();\n const { isRunning } = threadState;\n const wasRunning = wasRunningRef.current;\n wasRunningRef.current = isRunning;\n\n // Track step boundaries by content changes (more reliable than isRunning)\n if (runStartRef.current != null) {\n const lastMsg = threadState.messages.at(-1);\n if (lastMsg?.role === \"assistant\") {\n const currentToolCallCount = lastMsg.content.filter(\n (p) => p.type === \"tool-call\",\n ).length;\n while (toolCallCountRef.current < currentToolCallCount) {\n stepBoundariesRef.current.push(Date.now() - runStartRef.current);\n toolCallCountRef.current++;\n }\n }\n }\n\n if (isRunning) {\n if (runStartRef.current == null) {\n runStartRef.current = Date.now();\n stepBoundariesRef.current = [];\n toolCallCountRef.current = 0;\n adapter.pin?.();\n }\n // Cancel any pending persist — isRunning went back to true\n if (persistTimerRef.current) {\n clearTimeout(persistTimerRef.current);\n persistTimerRef.current = null;\n }\n return;\n }\n\n if (wasRunning) {\n // Record step boundary offset (synchronous for accuracy)\n if (runStartRef.current != null) {\n stepBoundariesRef.current.push(Date.now() - runStartRef.current);\n }\n } else {\n const pending = threadState.messages.flatMap(unpersistedInnerIds);\n if (pending.every((innerId) => idleScheduledInnerIds.has(innerId)))\n return;\n for (const innerId of pending) idleScheduledInnerIds.add(innerId);\n }\n\n // Debounce: wait one macrotask so agentic step flickers are absorbed\n if (persistTimerRef.current) clearTimeout(persistTimerRef.current);\n persistTimerRef.current = setTimeout(() => {\n persistSettled(false);\n }, 0);\n });\n\n const initialThreadState = runtimeRef.current.thread.getState();\n wasRunningRef.current = initialThreadState.isRunning;\n if (initialThreadState.isRunning) {\n if (runStartRef.current == null) {\n runStartRef.current = Date.now();\n stepBoundariesRef.current = [];\n toolCallCountRef.current = 0;\n adapter.pin?.();\n }\n } else if (initialThreadState.messages.length > 0) {\n persistSettled(true);\n }\n\n function persistSettled(ignoreRunning: boolean) {\n persistTimerRef.current = null;\n const latest = runtimeRef.current.thread.getState();\n if (!ignoreRunning && latest.isRunning) return;\n\n const boundaries = stepBoundariesRef.current;\n const durationMs = boundaries.length > 0 ? boundaries.at(-1) : undefined;\n\n // Fallback: if only 1 boundary but message has multiple steps, distribute evenly\n if (boundaries.length === 1 && durationMs != null) {\n const lastAssistant = latest.messages.findLast(\n (m) => m.role === \"assistant\",\n );\n if (lastAssistant) {\n const tcCount = lastAssistant.content.filter(\n (p) => p.type === \"tool-call\",\n ).length;\n if (tcCount > 0) {\n const totalSteps = tcCount + 1;\n const stepDur = durationMs / totalSteps;\n boundaries.length = 0;\n for (let i = 0; i < totalSteps; i++) {\n boundaries.push(Math.round((i + 1) * stepDur));\n }\n }\n }\n }\n\n // Build per-step timestamps when there are multiple steps\n const stepTimestamps =\n boundaries.length > 1\n ? boundaries.map((endMs, i) => ({\n start_ms: i === 0 ? 0 : boundaries[i - 1]!,\n end_ms: endMs,\n }))\n : undefined;\n\n runStartRef.current = null;\n stepBoundariesRef.current = [];\n\n const telemetryOptions = {\n ...(durationMs != null ? { durationMs } : undefined),\n ...(stepTimestamps != null ? { stepTimestamps } : undefined),\n };\n\n persistInFlightRef.current = persistInFlightRef.current\n .then(async () => {\n const { messages } = latest;\n let lastInnerMessageId: string | null = null;\n\n const getLastInnerId = (msgs: TMessage[]): string | null =>\n msgs.length > 0 ? storageFormatAdapter.getId(msgs.at(-1)!) : null;\n\n const toBatchItems = (\n msgs: TMessage[],\n toolArtifacts: Record<string, unknown> | undefined,\n toolInteractions:\n | Record<string, Unstable_ToolInteractionLog>\n | undefined,\n toolApprovalResponses:\n | Record<string, StoredToolApprovalResponse>\n | undefined,\n ) =>\n msgs.map((msg, idx) => ({\n parentId:\n idx === 0\n ? lastInnerMessageId\n : storageFormatAdapter.getId(msgs[idx - 1]!),\n message: addToolData(\n msg,\n toolArtifacts,\n toolInteractions,\n toolApprovalResponses,\n ),\n }));\n\n for (const message of messages) {\n const innerMessages = getExternalStoreMessages<TMessage>(message);\n\n const isTerminal = isTerminalMessage(message);\n const isAwaitingToolCalls = isAwaitingToolApproval(message);\n // A paused message's later content can only reach storage via update, so it is persisted early only when the adapter supports update.\n const isReady =\n isTerminal ||\n (isAwaitingToolCalls && adapter.update !== undefined);\n\n if (!isReady) {\n lastInnerMessageId =\n getLastInnerId(innerMessages) ?? lastInnerMessageId;\n continue;\n }\n\n if (!historyIds.current.has(message.id)) {\n historyIds.current.add(message.id);\n deferredTelemetryIds.current.add(message.id);\n }\n\n const batchItems = toBatchItems(\n innerMessages,\n collectToolArtifacts(message, toolArtifacts),\n collectToolInteractions(message, toolInteractions),\n collectToolApprovalResponses(message, toolApprovalResponses),\n );\n for (const item of batchItems) {\n const innerId = storageFormatAdapter.getId(item.message);\n const persisted = persistedInnerMessages.current.get(innerId);\n if (!persisted) {\n await adapter.append(item);\n persistedInnerMessages.current.set(innerId, {\n source: item.message,\n content: encodeContent(storageFormatAdapter, item),\n });\n } else if (\n persisted.source !== item.message &&\n durationMs !== undefined &&\n adapter.update\n ) {\n const content = encodeContent(storageFormatAdapter, item);\n if (content === persisted.content) {\n persisted.source = item.message;\n } else {\n try {\n await adapter.update(item, innerId);\n persistedInnerMessages.current.set(innerId, {\n source: item.message,\n content,\n });\n } catch {\n // A failed update leaves the stale baseline behind so the next run stop retries it.\n }\n }\n }\n }\n\n lastInnerMessageId =\n getLastInnerId(innerMessages) ?? lastInnerMessageId;\n\n if (deferredTelemetryIds.current.has(message.id) && isTerminal) {\n deferredTelemetryIds.current.delete(message.id);\n adapter.reportTelemetry?.(\n batchItems.map((item, index) => ({\n ...item,\n message: innerMessages[index]!,\n })),\n {\n ...telemetryOptions,\n message,\n },\n );\n }\n }\n })\n .catch((error) => {\n console.error(\"Failed to persist message history:\", error);\n });\n }\n\n return () => {\n unsubscribe();\n if (persistTimerRef.current) {\n clearTimeout(persistTimerRef.current);\n persistTimerRef.current = null;\n persistSettled(false);\n }\n };\n }, [\n formatAdapter,\n storageFormatAdapter,\n runtimeRef,\n toolArtifacts,\n toolInteractions,\n toolApprovalResponses,\n ]);\n\n const deleteMessage = useCallback(\n async (messageId: string) => {\n const deleteMessages = formatAdapter?.delete?.bind(formatAdapter);\n if (!deleteMessages) return;\n\n const messages = runtimeRef.current.thread.getState().messages;\n const messageIndex = messages.findIndex((m) => m.id === messageId);\n if (messageIndex === -1) return;\n\n const previousInnerMessages = messages\n .slice(0, messageIndex)\n .flatMap(getExternalStoreMessages<TMessage>);\n let parentId = previousInnerMessages.at(-1)\n ? storageFormatAdapter.getId(previousInnerMessages.at(-1)!)\n : null;\n const itemsToDelete = getExternalStoreMessages<TMessage>(\n messages[messageIndex]!,\n ).map((message) => {\n const item = { parentId, message };\n parentId = storageFormatAdapter.getId(message);\n return item;\n });\n\n const deletion = persistInFlightRef.current.then(async () => {\n await deleteMessages(itemsToDelete);\n\n historyIds.current.delete(messageId);\n deferredTelemetryIds.current.delete(messageId);\n for (const item of itemsToDelete) {\n persistedInnerMessages.current.delete(\n storageFormatAdapter.getId(item.message),\n );\n }\n });\n\n persistInFlightRef.current = deletion.catch(() => {});\n await deletion;\n },\n [formatAdapter, runtimeRef, storageFormatAdapter],\n );\n\n return {\n isLoading,\n deleteMessage,\n persistToolInteractions,\n persistToolApprovalResponses: persistToolInteractions,\n };\n};\n"],"mappings":"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"}
@@ -1,5 +1,2 @@
1
- //#region src/runtime/useResourceCleanup.d.ts
2
- declare const useResourceCleanup: (enabled: boolean, cleanup: () => void) => void;
3
- //#endregion
4
- export { useResourceCleanup };
1
+ export declare const useResourceCleanup: (enabled: boolean, cleanup: () => void, hostDestroySignal?: AbortSignal) => void;
5
2
  //# sourceMappingURL=useResourceCleanup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useResourceCleanup.d.ts","names":[],"sources":["../../src/runtime/useResourceCleanup.ts"],"mappings":";cAGa,qBAAsB,kBAAkB"}
1
+ {"version":3,"file":"useResourceCleanup.d.ts","sourceRoot":"","sources":["../../src/runtime/useResourceCleanup.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,kBAAkB,GAC7B,SAAS,OAAO,EAChB,SAAS,MAAM,IAAI,EACnB,oBAAoB,WAAW,SAmDhC,CAAC"}
@@ -2,12 +2,12 @@ import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
2
2
  import { useEffect, useRef } from "@assistant-ui/tap/react-shim";
3
3
  import { useAssistantClientDestroySignal } from "@assistant-ui/store/internal";
4
4
  //#region src/runtime/useResourceCleanup.ts
5
- const useResourceCleanup = (enabled, cleanup) => {
6
- const $ = c(7);
5
+ const useResourceCleanup = (enabled, cleanup, hostDestroySignal) => {
6
+ const $ = c(8);
7
7
  const destroySignal = useAssistantClientDestroySignal();
8
8
  const cleanupRef = useRef(cleanup);
9
9
  const enabledRef = useRef(enabled);
10
- const registeredSignalRef = useRef(void 0);
10
+ const registrationRef = useRef(null);
11
11
  let t0;
12
12
  if ($[0] !== cleanup || $[1] !== enabled) {
13
13
  t0 = () => {
@@ -21,23 +21,47 @@ const useResourceCleanup = (enabled, cleanup) => {
21
21
  useEffect(t0);
22
22
  let t1;
23
23
  let t2;
24
- if ($[3] !== destroySignal || $[4] !== enabled) {
24
+ if ($[3] !== destroySignal || $[4] !== enabled || $[5] !== hostDestroySignal) {
25
25
  t1 = () => {
26
- if (!enabled || !destroySignal) return;
27
- if (registeredSignalRef.current === destroySignal) return;
28
- registeredSignalRef.current = destroySignal;
29
- destroySignal.addEventListener("abort", () => {
26
+ if (!enabled || !destroySignal && !hostDestroySignal) return;
27
+ const current = registrationRef.current;
28
+ if (current !== null && current.destroySignal === destroySignal && current.hostDestroySignal === hostDestroySignal) return;
29
+ current?.controller.abort();
30
+ const registration = new AbortController();
31
+ registrationRef.current = {
32
+ destroySignal,
33
+ hostDestroySignal,
34
+ controller: registration
35
+ };
36
+ const run = () => {
37
+ if (registration.signal.aborted) return;
38
+ registration.abort();
30
39
  if (enabledRef.current) cleanupRef.current();
31
- }, { once: true });
40
+ };
41
+ if (destroySignal?.aborted || hostDestroySignal?.aborted) {
42
+ run();
43
+ return;
44
+ }
45
+ const options = {
46
+ once: true,
47
+ signal: registration.signal
48
+ };
49
+ destroySignal?.addEventListener("abort", run, options);
50
+ hostDestroySignal?.addEventListener("abort", run, options);
32
51
  };
33
- t2 = [destroySignal, enabled];
52
+ t2 = [
53
+ destroySignal,
54
+ enabled,
55
+ hostDestroySignal
56
+ ];
34
57
  $[3] = destroySignal;
35
58
  $[4] = enabled;
36
- $[5] = t1;
37
- $[6] = t2;
59
+ $[5] = hostDestroySignal;
60
+ $[6] = t1;
61
+ $[7] = t2;
38
62
  } else {
39
- t1 = $[5];
40
- t2 = $[6];
63
+ t1 = $[6];
64
+ t2 = $[7];
41
65
  }
42
66
  useEffect(t1, t2);
43
67
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useResourceCleanup.js","names":["useEffect","useRef","useAssistantClientDestroySignal","useResourceCleanup","enabled","cleanup","$","_c","destroySignal","cleanupRef","enabledRef","registeredSignalRef","undefined","t0","current","t1","t2","addEventListener","once"],"sources":["../../src/runtime/useResourceCleanup.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\nimport { useAssistantClientDestroySignal } from \"@assistant-ui/store/internal\";\n\nexport const useResourceCleanup = (enabled: boolean, cleanup: () => void) => {\n const destroySignal = useAssistantClientDestroySignal();\n const cleanupRef = useRef(cleanup);\n const enabledRef = useRef(enabled);\n const registeredSignalRef = useRef<AbortSignal | undefined>(undefined);\n\n useEffect(() => {\n cleanupRef.current = cleanup;\n enabledRef.current = enabled;\n });\n\n useEffect(() => {\n if (!enabled || !destroySignal) return undefined;\n if (registeredSignalRef.current === destroySignal) return undefined;\n\n registeredSignalRef.current = destroySignal;\n destroySignal.addEventListener(\n \"abort\",\n () => {\n if (enabledRef.current) cleanupRef.current();\n },\n { once: true },\n );\n\n // The listener must survive standalone soft unmounts so a later permanent\n // client destroy still cleans up the retained resource state.\n return undefined;\n }, [destroySignal, enabled]);\n};\n"],"mappings":";;;;AAGA,MAAaG,sBAAqBC,SAAAC,YAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAChC,MAAAC,gBAAsBN,gCAAgC;CACtD,MAAAO,aAAmBR,OAAOI,OAAO;CACjC,MAAAK,aAAmBT,OAAOG,OAAO;CACjC,MAAAO,sBAA4BV,OAAgCW,KAAAA,CAAS;CAAE,IAAAC;CAAA,IAAAP,EAAA,OAAAD,WAAAC,EAAA,OAAAF,SAAA;EAE7DS,WAAA;GACRJ,WAAUK,UAAWT;GACrBK,WAAUI,UAAWV;EAAH;EACnBE,EAAA,KAAAD;EAAAC,EAAA,KAAAF;EAAAE,EAAA,KAAAO;CAAA,OAAAA,KAAAP,EAAA;CAHDN,UAAUa,EAGT;CAAC,IAAAE;CAAA,IAAAC;CAAA,IAAAV,EAAA,OAAAE,iBAAAF,EAAA,OAAAF,SAAA;EAEQW,WAAA;GACR,IAAI,CAACX,WAAD,CAAaI,eAAa;GAC9B,IAAIG,oBAAmBG,YAAaN,eAAa;GAEjDG,oBAAmBG,UAAWN;GAC9BA,cAAaS,iBACX,eACA;IACE,IAAIP,WAAUI,SAAUL,WAAUK,QAAS;GAAE,GAE/C,EAAAI,MAAQ,KAAK,CACf;EAAC;EAKAF,KAAA,CAACR,eAAeJ,OAAO;EAACE,EAAA,KAAAE;EAAAF,EAAA,KAAAF;EAAAE,EAAA,KAAAS;EAAAT,EAAA,KAAAU;CAAA,OAAA;EAAAD,KAAAT,EAAA;EAAAU,KAAAV,EAAA;CAAA;CAhB3BN,UAAUe,IAgBPC,EAAwB;AAAC"}
1
+ {"version":3,"file":"useResourceCleanup.js","names":["useEffect","useRef","useAssistantClientDestroySignal","useResourceCleanup","enabled","cleanup","hostDestroySignal","$","_c","destroySignal","cleanupRef","enabledRef","registrationRef","t0","current","t1","t2","controller","abort","registration","AbortController","run","signal","aborted","options","once","addEventListener"],"sources":["../../src/runtime/useResourceCleanup.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\nimport { useAssistantClientDestroySignal } from \"@assistant-ui/store/internal\";\n\nexport const useResourceCleanup = (\n enabled: boolean,\n cleanup: () => void,\n hostDestroySignal?: AbortSignal,\n) => {\n const destroySignal = useAssistantClientDestroySignal();\n const cleanupRef = useRef(cleanup);\n const enabledRef = useRef(enabled);\n const registrationRef = useRef<{\n destroySignal: AbortSignal | undefined;\n hostDestroySignal: AbortSignal | undefined;\n controller: AbortController;\n } | null>(null);\n\n useEffect(() => {\n cleanupRef.current = cleanup;\n enabledRef.current = enabled;\n });\n\n useEffect(() => {\n if (!enabled || (!destroySignal && !hostDestroySignal)) return undefined;\n const current = registrationRef.current;\n if (\n current !== null &&\n current.destroySignal === destroySignal &&\n current.hostDestroySignal === hostDestroySignal\n ) {\n return undefined;\n }\n current?.controller.abort();\n\n const registration = new AbortController();\n registrationRef.current = {\n destroySignal,\n hostDestroySignal,\n controller: registration,\n };\n const run = () => {\n if (registration.signal.aborted) return;\n registration.abort();\n if (enabledRef.current) cleanupRef.current();\n };\n if (destroySignal?.aborted || hostDestroySignal?.aborted) {\n run();\n return undefined;\n }\n const options = { once: true, signal: registration.signal };\n destroySignal?.addEventListener(\"abort\", run, options);\n hostDestroySignal?.addEventListener(\"abort\", run, options);\n\n // The listeners must survive standalone soft unmounts so a later\n // permanent destroy still cleans up the retained resource state.\n return undefined;\n }, [destroySignal, enabled, hostDestroySignal]);\n};\n"],"mappings":";;;;AAGA,MAAaG,sBAAqBC,SAAAC,SAAAC,sBAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAKhC,MAAAC,gBAAsBP,gCAAgC;CACtD,MAAAQ,aAAmBT,OAAOI,OAAO;CACjC,MAAAM,aAAmBV,OAAOG,OAAO;CACjC,MAAAQ,kBAAwBX,OAId,IAAI;CAAE,IAAAY;CAAA,IAAAN,EAAA,OAAAF,WAAAE,EAAA,OAAAH,SAAA;EAENS,WAAA;GACRH,WAAUI,UAAWT;GACrBM,WAAUG,UAAWV;EAAH;EACnBG,EAAA,KAAAF;EAAAE,EAAA,KAAAH;EAAAG,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAHDP,UAAUa,EAGT;CAAC,IAAAE;CAAA,IAAAC;CAAA,IAAAT,EAAA,OAAAE,iBAAAF,EAAA,OAAAH,WAAAG,EAAA,OAAAD,mBAAA;EAEQS,WAAA;GACR,IAAI,CAACX,WAAY,CAACK,iBAAD,CAAmBH,mBAAkB;GACtD,MAAAQ,UAAgBF,gBAAeE;GAC/B,IACEA,YAAY,QACZA,QAAOL,kBAAmBA,iBAC1BK,QAAOR,sBAAuBA,mBAAiB;GAIjDQ,SAAOG,WAAkBC,MAAC;GAE1B,MAAAC,eAAqB,IAAIC,gBAAgB;GACzCR,gBAAeE,UAAW;IAAAL;IAAAH;IAAAW,YAGZE;GACd;GACA,MAAAE,YAAY;IACV,IAAIF,aAAYG,OAAOC,SAAQ;IAC/BJ,aAAYD,MAAO;IACnB,IAAIP,WAAUG,SAAUJ,WAAUI,QAAS;GAAE;GAE/C,IAAIL,eAAac,WAAajB,mBAAiBiB,SAAS;IACtDF,IAAI;IAAC;GAAA;GAGP,MAAAG,UAAgB;IAAAC,MAAQ;IAAIH,QAAUH,aAAYG;GAAQ;GAC1Db,eAAaiB,iBAAmB,SAASL,KAAKG,OAAO;GACrDlB,mBAAiBoB,iBAAmB,SAASL,KAAKG,OAAO;EAAC;EAKzDR,KAAA;GAACP;GAAeL;GAASE;EAAiB;EAACC,EAAA,KAAAE;EAAAF,EAAA,KAAAH;EAAAG,EAAA,KAAAD;EAAAC,EAAA,KAAAQ;EAAAR,EAAA,KAAAS;CAAA,OAAA;EAAAD,KAAAR,EAAA;EAAAS,KAAAT,EAAA;CAAA;CAlC9CP,UAAUe,IAkCPC,EAA2C;AAAC"}
@@ -1,15 +1,12 @@
1
- import { StreamingTimingAccessors } from "@assistant-ui/core/react";
2
- import { MessageTiming } from "@assistant-ui/core";
3
- import { UIMessage } from "@ai-sdk/react";
4
- //#region src/runtime/useStreamingTiming.d.ts
5
- declare const aiSdkStreamingTimingAccessors: StreamingTimingAccessors<UIMessage>;
1
+ import type { UIMessage } from "@ai-sdk/react";
2
+ import type { MessageTiming } from "@assistant-ui/core";
3
+ import { type StreamingTimingAccessors } from "@assistant-ui/core/react";
4
+ export declare const aiSdkStreamingTimingAccessors: StreamingTimingAccessors<UIMessage>;
6
5
  /**
7
6
  * Tracks streaming timing for AI SDK messages client-side. Delegates to the
8
7
  * shared `useStreamingTiming` primitive in `@assistant-ui/core/react`,
9
8
  * adapted to the `UIMessage` shape. Timing is finalized when streaming ends
10
9
  * and stored per message id.
11
10
  */
12
- declare const useStreamingTiming: (messages: UIMessage[], isRunning: boolean) => Record<string, MessageTiming>;
13
- //#endregion
14
- export { aiSdkStreamingTimingAccessors, useStreamingTiming };
11
+ export declare const useStreamingTiming: (messages: UIMessage[], isRunning: boolean) => Record<string, MessageTiming>;
15
12
  //# sourceMappingURL=useStreamingTiming.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useStreamingTiming.d.ts","names":[],"sources":["../../src/runtime/useStreamingTiming.ts"],"mappings":";;;;cA8Ca,+BAA+B,yBAAyB;;;;;;;cAaxD,qBACX,UAAU,aACV,uBACC,eAAe"}
1
+ {"version":3,"file":"useStreamingTiming.d.ts","sourceRoot":"","sources":["../../src/runtime/useStreamingTiming.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,0BAA0B,CAAC;AAsClC,eAAO,MAAM,6BAA6B,EAAE,wBAAwB,CAAC,SAAS,CAK3E,CAAC;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,GAC7B,UAAU,SAAS,EAAE,EACrB,WAAW,OAAO,KACjB,MAAM,CAAC,MAAM,EAAE,aAAa,CAK5B,CAAC"}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { useStreamingTiming as useStreamingTiming$1 } from "@assistant-ui/core/react";
3
2
  import { isToolUIPart } from "ai";
3
+ import { useStreamingTiming as useStreamingTiming$1 } from "@assistant-ui/core/react";
4
4
  //#region src/runtime/useStreamingTiming.ts
5
5
  const findAssistant = (messages, messageId) => messages.find((m) => m.role === "assistant" && m.id === messageId);
6
6
  const getTextLength = (messages, messageId) => {
@@ -1,33 +1,30 @@
1
- import { ToolSet } from "ai";
2
- import { ToolJSONSchema } from "assistant-stream";
3
- //#region src/tools/frontendTools.d.ts
1
+ import { type ToolSet } from "ai";
2
+ import type { ToolJSONSchema } from "assistant-stream";
4
3
  /** Frontend tool definitions uploaded by AssistantChatTransport. */
5
- type FrontendTools = Record<string, ToolJSONSchema>;
6
- declare const defaultToModelOutput: ({ output }: {
7
- output: unknown;
4
+ export type FrontendTools = Record<string, ToolJSONSchema>;
5
+ export declare const defaultToModelOutput: ({ output }: {
6
+ output: unknown;
8
7
  }) => {
9
- type: "content";
10
- value: ({
11
- type: "text";
12
- text: string;
13
- } | {
14
- filename?: string;
15
- type: "file";
16
- data: {
17
- type: "data";
18
- data: string;
19
- };
20
- mediaType: string;
21
- text?: never;
22
- })[];
8
+ type: "content";
9
+ value: ({
10
+ type: "text";
11
+ text: string;
12
+ } | {
13
+ filename?: string;
14
+ type: "file";
15
+ data: {
16
+ type: "data";
17
+ data: string;
18
+ };
19
+ mediaType: string;
20
+ text?: never;
21
+ })[];
23
22
  } | {
24
- type: "text";
25
- value: string;
23
+ type: "text";
24
+ value: string;
26
25
  } | {
27
- type: "json";
28
- value: import("ai").JSONValue;
26
+ type: "json";
27
+ value: import("ai").JSONValue;
29
28
  };
30
- declare const frontendTools: (tools: FrontendTools) => ToolSet;
31
- //#endregion
32
- export { FrontendTools, defaultToModelOutput, frontendTools };
29
+ export declare const frontendTools: (tools: FrontendTools) => ToolSet;
33
30
  //# sourceMappingURL=frontendTools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"frontendTools.d.ts","names":[],"sources":["../../src/tools/frontendTools.ts"],"mappings":";;;;KASY,gBAAgB,eAAe;cAE9B,yBAAwB;EAAc;;;;;;;;;;;;;;;;;;;;;;;cAuDtC,gBAAiB,OAAO,kBAAgB"}
1
+ {"version":3,"file":"frontendTools.d.ts","sourceRoot":"","sources":["../../src/tools/frontendTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,OAAO,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAOvD,oEAAoE;AACpE,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAE3D,eAAO,MAAM,oBAAoB,GAAI,YAAY;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE;;;;;;;;;;;;;;;;;;;;;CAMnE,CAAC;AAiDF,eAAO,MAAM,aAAa,GAAI,OAAO,aAAa,KAAG,OAgBpD,CAAC"}
@@ -1,34 +1,33 @@
1
- import { FrontendTools } from "./frontendTools.js";
2
- import { Toolkit } from "@assistant-ui/core/react";
3
- import { ToolSet } from "ai";
4
- //#region src/tools/generativeTools.d.ts
1
+ import { type ToolSet } from "ai";
2
+ import type { Toolkit } from "@assistant-ui/core/react";
3
+ import { type FrontendTools } from "./frontendTools.js";
5
4
  /**
6
5
  * @deprecated Options for the deprecated {@link generativeTools}. Use
7
6
  * {@link AISDKToolkit} with {@link AISDKToolkitOptions} /
8
7
  * {@link AISDKToolkitToolsOptions} instead.
9
8
  */
10
- interface GenerativeToolsOptions {
11
- /**
12
- * The server build of a generative toolkit (schema + server `execute`). Typed
13
- * as the canonical {@link Toolkit} so callers don't need to cast; the server
14
- * build carries `execute`, recovered internally as {@link ToolkitDefinition}.
15
- */
16
- toolkit: Toolkit;
17
- /**
18
- * Tools uploaded by the frontend (the request body's `tools`). Merged in
19
- * alongside the `toolkit`; a server `execute` from `toolkit` takes precedence
20
- * over an uploaded entry of the same name.
21
- */
22
- frontendTools?: FrontendTools;
9
+ export interface GenerativeToolsOptions {
10
+ /**
11
+ * The server build of a generative toolkit (schema + server `execute`). Typed
12
+ * as the canonical {@link Toolkit} so callers don't need to cast; the server
13
+ * build carries `execute`, recovered internally as {@link ToolkitDefinition}.
14
+ */
15
+ toolkit: Toolkit;
16
+ /**
17
+ * Tools uploaded by the frontend (the request body's `tools`). Merged in
18
+ * alongside the `toolkit`; a server `execute` from `toolkit` takes precedence
19
+ * over an uploaded entry of the same name.
20
+ */
21
+ frontendTools?: FrontendTools;
23
22
  }
24
- type AISDKToolkitOptions = {
25
- toolkit: Toolkit;
23
+ export type AISDKToolkitOptions = {
24
+ toolkit: Toolkit;
26
25
  };
27
- type AISDKToolkitToolsOptions = {
28
- /**
29
- * Tools uploaded by the frontend request body.
30
- */
31
- frontend?: FrontendTools;
26
+ export type AISDKToolkitToolsOptions = {
27
+ /**
28
+ * Tools uploaded by the frontend request body.
29
+ */
30
+ frontend?: FrontendTools;
32
31
  };
33
32
  /**
34
33
  * Builds an AI SDK `ToolSet` for server-side use with `streamText` /
@@ -61,13 +60,11 @@ type AISDKToolkitToolsOptions = {
61
60
  * });
62
61
  * ```
63
62
  */
64
- declare const generativeTools: (options: GenerativeToolsOptions) => ToolSet;
65
- declare class AISDKToolkit {
66
- #private;
67
- constructor(options: AISDKToolkitOptions);
68
- tools(options?: AISDKToolkitToolsOptions): Promise<ToolSet>;
69
- close(): Promise<void>;
63
+ export declare const generativeTools: (options: GenerativeToolsOptions) => ToolSet;
64
+ export declare class AISDKToolkit {
65
+ #private;
66
+ constructor(options: AISDKToolkitOptions);
67
+ tools(options?: AISDKToolkitToolsOptions): Promise<ToolSet>;
68
+ close(): Promise<void>;
70
69
  }
71
- //#endregion
72
- export { AISDKToolkit, AISDKToolkitOptions, AISDKToolkitToolsOptions, GenerativeToolsOptions, generativeTools };
73
70
  //# sourceMappingURL=generativeTools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"generativeTools.d.ts","names":[],"sources":["../../src/tools/generativeTools.ts"],"mappings":";;;;;;;;;UAsFiB;;;;;;EAMf,SAAS;;;;;;EAMT,gBAAgB;;KAGN;EACV,SAAS;;KAGC;;;;EAIV,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAkCA,kBAAmB,SAAS,2BAAyB;cAYrD;;EAIC,YAAA,SAAS;EAIf,MAAM,UAAS,2BAAgC,QAAQ;EAsBvD,SAAS"}
1
+ {"version":3,"file":"generativeTools.d.ts","sourceRoot":"","sources":["../../src/tools/generativeTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,OAAO,EAAE,MAAM,IAAI,CAAC;AAU9C,OAAO,KAAK,EAEV,OAAO,EAER,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAiB,KAAK,aAAa,EAAE,2BAAwB;AAkEpE;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC;;OAEG;IACH,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,eAAO,MAAM,eAAe,GAAI,SAAS,sBAAsB,KAAG,OAUjE,CAAC;AAEF,qBAAa,YAAY;;gBAIX,OAAO,EAAE,mBAAmB;IAIlC,KAAK,CAAC,OAAO,GAAE,wBAA6B,GAAG,OAAO,CAAC,OAAO,CAAC;IAsB/D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAmH7B"}
@@ -1,2 +1,2 @@
1
- import { Experimental_StdioMCPTransport } from "@ai-sdk/mcp/mcp-stdio";
2
- export { Experimental_StdioMCPTransport };
1
+ export { Experimental_StdioMCPTransport } from "@ai-sdk/mcp/mcp-stdio";
2
+ //# sourceMappingURL=mcp-stdio.node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-stdio.node.d.ts","sourceRoot":"","sources":["../../src/tools/mcp-stdio.node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAC"}
@@ -1,6 +1,3 @@
1
- import { Experimental_StdioMCPTransport as Experimental_StdioMCPTransport$1 } from "@ai-sdk/mcp/mcp-stdio";
2
- //#region src/tools/mcp-stdio.unsupported.d.ts
3
- declare const Experimental_StdioMCPTransport: typeof Experimental_StdioMCPTransport$1;
4
- //#endregion
5
- export { Experimental_StdioMCPTransport };
1
+ import type { Experimental_StdioMCPTransport as NodeStdioMCPTransport } from "@ai-sdk/mcp/mcp-stdio";
2
+ export declare const Experimental_StdioMCPTransport: typeof NodeStdioMCPTransport;
6
3
  //# sourceMappingURL=mcp-stdio.unsupported.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-stdio.unsupported.d.ts","names":[],"sources":["../../src/tools/mcp-stdio.unsupported.ts"],"mappings":";;cAUa,uCACuC"}
1
+ {"version":3,"file":"mcp-stdio.unsupported.d.ts","sourceRoot":"","sources":["../../src/tools/mcp-stdio.unsupported.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,8BAA8B,IAAI,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAUrG,eAAO,MAAM,8BAA8B,EACE,OAAO,qBAAqB,CAAC"}
@@ -1,23 +1,20 @@
1
- import { AssistantChatResumableOptions } from "./resumable.js";
2
- import { DefaultChatTransport, HttpChatTransportInitOptions, UIMessage } from "ai";
3
- import { AssistantRuntime, ThreadListItemRuntime } from "@assistant-ui/core";
4
- //#region src/transport/AssistantChatTransport.d.ts
5
- type InitializableThreadListItem = Pick<ThreadListItemRuntime, "initialize">;
6
- type AssistantChatTransportInitOptions<UI_MESSAGE extends UIMessage> = HttpChatTransportInitOptions<UI_MESSAGE> & {
7
- resumable?: AssistantChatResumableOptions;
1
+ import type { AssistantRuntime, ThreadListItemRuntime } from "@assistant-ui/core";
2
+ import { DefaultChatTransport, type HttpChatTransportInitOptions, type UIMessage } from "ai";
3
+ import { type AssistantChatResumableOptions } from "./resumable.js";
4
+ export type InitializableThreadListItem = Pick<ThreadListItemRuntime, "initialize">;
5
+ export type AssistantChatTransportInitOptions<UI_MESSAGE extends UIMessage> = HttpChatTransportInitOptions<UI_MESSAGE> & {
6
+ resumable?: AssistantChatResumableOptions;
8
7
  };
9
- declare class AssistantChatTransport<UI_MESSAGE extends UIMessage> extends DefaultChatTransport<UI_MESSAGE> {
10
- private runtime;
11
- private getThreadListItem;
12
- private readonly resumable;
13
- private readonly __internal_initOptions;
14
- /** Constructs an unwired copy with the same init options. */
15
- __internal_clone(): AssistantChatTransport<UI_MESSAGE>;
16
- constructor(initOptions?: AssistantChatTransportInitOptions<UI_MESSAGE>);
17
- setRuntime(runtime: AssistantRuntime): void;
18
- getResumableAdapter(): AssistantChatResumableOptions | undefined;
19
- __internal_setGetThreadListItem(getter: () => InitializableThreadListItem | undefined): void;
8
+ export declare class AssistantChatTransport<UI_MESSAGE extends UIMessage> extends DefaultChatTransport<UI_MESSAGE> {
9
+ private runtime;
10
+ private getThreadListItem;
11
+ private readonly resumable;
12
+ private readonly __internal_initOptions;
13
+ /** Constructs an unwired copy with the same init options. */
14
+ __internal_clone(): AssistantChatTransport<UI_MESSAGE>;
15
+ constructor(initOptions?: AssistantChatTransportInitOptions<UI_MESSAGE>);
16
+ setRuntime(runtime: AssistantRuntime): void;
17
+ getResumableAdapter(): AssistantChatResumableOptions | undefined;
18
+ __internal_setGetThreadListItem(getter: () => InitializableThreadListItem | undefined): void;
20
19
  }
21
- //#endregion
22
- export { AssistantChatTransport, AssistantChatTransportInitOptions, InitializableThreadListItem };
23
20
  //# sourceMappingURL=AssistantChatTransport.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantChatTransport.d.ts","names":[],"sources":["../../src/transport/AssistantChatTransport.ts"],"mappings":";;;;KAeY,8BAA8B,KACxC;KAaU,kCAAkC,mBAAmB,aAC/D,6BAA6B;EAC3B,YAAY;;cAGH,uBACX,mBAAmB,mBACX,qBAAqB;UACrB;UACA;mBAGS;mBAEA;;EAKV,oBAAoB,uBAAuB;EAOtC,YAAA,cAAc,kCAAkC;EA0D5D,WAAW,SAAS;EAIpB,uBAAuB;EAIvB,gCACE,cAAc"}
1
+ {"version":3,"file":"AssistantChatTransport.d.ts","sourceRoot":"","sources":["../../src/transport/AssistantChatTransport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,oBAAoB,EACpB,KAAK,4BAA4B,EACjC,KAAK,SAAS,EACf,MAAM,IAAI,CAAC;AAEZ,OAAO,EAEL,KAAK,6BAA6B,EACnC,uBAAoB;AAErB,MAAM,MAAM,2BAA2B,GAAG,IAAI,CAC5C,qBAAqB,EACrB,YAAY,CACb,CAAC;AAWF,MAAM,MAAM,iCAAiC,CAAC,UAAU,SAAS,SAAS,IACxE,4BAA4B,CAAC,UAAU,CAAC,GAAG;IACzC,SAAS,CAAC,EAAE,6BAA6B,CAAC;CAC3C,CAAC;AAEJ,qBAAa,sBAAsB,CACjC,UAAU,SAAS,SAAS,CAC5B,SAAQ,oBAAoB,CAAC,UAAU,CAAC;IACxC,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,iBAAiB,CAEX;IACd,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4C;IAEtE,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAEzB;IAEd,6DAA6D;IACtD,gBAAgB,IAAI,sBAAsB,CAAC,UAAU,CAAC;gBAOjD,WAAW,CAAC,EAAE,iCAAiC,CAAC,UAAU,CAAC;IA0DvE,UAAU,CAAC,OAAO,EAAE,gBAAgB;IAIpC,mBAAmB,IAAI,6BAA6B,GAAG,SAAS;IAIhE,+BAA+B,CAC7B,MAAM,EAAE,MAAM,2BAA2B,GAAG,SAAS;CAIxD"}