@assistant-ui/core 0.2.23 → 0.3.1

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 (199) hide show
  1. package/dist/react/adapters/LocalStorageThreadListAdapter.js +2 -2
  2. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  3. package/dist/react/client/Tools.d.ts.map +1 -1
  4. package/dist/react/client/Tools.js +40 -55
  5. package/dist/react/client/Tools.js.map +1 -1
  6. package/dist/react/interactables-legacy/useAssistantInteractable.js +1 -1
  7. package/dist/react/interactables-legacy/useAssistantInteractable.js.map +1 -1
  8. package/dist/react/interactables-legacy/useInteractableState.js +3 -3
  9. package/dist/react/interactables-legacy/useInteractableState.js.map +1 -1
  10. package/dist/react/model-context/useAssistantContext.js +1 -1
  11. package/dist/react/model-context/useAssistantContext.js.map +1 -1
  12. package/dist/react/model-context/useAssistantDataUI.js +1 -1
  13. package/dist/react/model-context/useAssistantDataUI.js.map +1 -1
  14. package/dist/react/model-context/useAssistantInstructions.js +1 -1
  15. package/dist/react/model-context/useAssistantInstructions.js.map +1 -1
  16. package/dist/react/model-context/useAssistantTool.js +29 -25
  17. package/dist/react/model-context/useAssistantTool.js.map +1 -1
  18. package/dist/react/model-context/useAssistantToolUI.js +1 -1
  19. package/dist/react/model-context/useAssistantToolUI.js.map +1 -1
  20. package/dist/react/model-context/useAuiToolOverrides.js +1 -1
  21. package/dist/react/model-context/useAuiToolOverrides.js.map +1 -1
  22. package/dist/react/model-context/useInteractable.d.ts.map +1 -1
  23. package/dist/react/model-context/useInteractable.js +3 -5
  24. package/dist/react/model-context/useInteractable.js.map +1 -1
  25. package/dist/react/model-context/useInteractableState.js +2 -2
  26. package/dist/react/model-context/useInteractableState.js.map +1 -1
  27. package/dist/react/primitive-hooks/useActionBarCopy.js +3 -3
  28. package/dist/react/primitive-hooks/useActionBarCopy.js.map +1 -1
  29. package/dist/react/primitive-hooks/useActionBarEdit.js +1 -1
  30. package/dist/react/primitive-hooks/useActionBarEdit.js.map +1 -1
  31. package/dist/react/primitive-hooks/useActionBarFeedback.js +2 -2
  32. package/dist/react/primitive-hooks/useActionBarFeedback.js.map +1 -1
  33. package/dist/react/primitive-hooks/useActionBarReload.js +1 -1
  34. package/dist/react/primitive-hooks/useActionBarReload.js.map +1 -1
  35. package/dist/react/primitive-hooks/useActionBarSpeak.js +1 -1
  36. package/dist/react/primitive-hooks/useActionBarSpeak.js.map +1 -1
  37. package/dist/react/primitive-hooks/useActionBarStopSpeaking.js +1 -1
  38. package/dist/react/primitive-hooks/useActionBarStopSpeaking.js.map +1 -1
  39. package/dist/react/primitive-hooks/useBranchPickerNext.js +1 -1
  40. package/dist/react/primitive-hooks/useBranchPickerNext.js.map +1 -1
  41. package/dist/react/primitive-hooks/useBranchPickerPrevious.js +1 -1
  42. package/dist/react/primitive-hooks/useBranchPickerPrevious.js.map +1 -1
  43. package/dist/react/primitive-hooks/useComposerAddAttachment.js +1 -1
  44. package/dist/react/primitive-hooks/useComposerAddAttachment.js.map +1 -1
  45. package/dist/react/primitive-hooks/useComposerCancel.js +1 -1
  46. package/dist/react/primitive-hooks/useComposerCancel.js.map +1 -1
  47. package/dist/react/primitive-hooks/useComposerDictate.js +1 -1
  48. package/dist/react/primitive-hooks/useComposerDictate.js.map +1 -1
  49. package/dist/react/primitive-hooks/useComposerSend.js +1 -1
  50. package/dist/react/primitive-hooks/useComposerSend.js.map +1 -1
  51. package/dist/react/primitive-hooks/useEditComposerCancel.js +1 -1
  52. package/dist/react/primitive-hooks/useEditComposerCancel.js.map +1 -1
  53. package/dist/react/primitive-hooks/useEditComposerSend.js +1 -1
  54. package/dist/react/primitive-hooks/useEditComposerSend.js.map +1 -1
  55. package/dist/react/primitive-hooks/useMessageBranching.js +2 -2
  56. package/dist/react/primitive-hooks/useMessageBranching.js.map +1 -1
  57. package/dist/react/primitive-hooks/useMessageReload.js +1 -1
  58. package/dist/react/primitive-hooks/useMessageReload.js.map +1 -1
  59. package/dist/react/primitive-hooks/useSuggestionTrigger.js +7 -7
  60. package/dist/react/primitive-hooks/useSuggestionTrigger.js.map +1 -1
  61. package/dist/react/primitive-hooks/useThreadListItemArchive.js +1 -1
  62. package/dist/react/primitive-hooks/useThreadListItemArchive.js.map +1 -1
  63. package/dist/react/primitive-hooks/useThreadListItemDelete.js +1 -1
  64. package/dist/react/primitive-hooks/useThreadListItemDelete.js.map +1 -1
  65. package/dist/react/primitive-hooks/useThreadListItemTrigger.js +1 -1
  66. package/dist/react/primitive-hooks/useThreadListItemTrigger.js.map +1 -1
  67. package/dist/react/primitive-hooks/useThreadListItemUnarchive.js +1 -1
  68. package/dist/react/primitive-hooks/useThreadListItemUnarchive.js.map +1 -1
  69. package/dist/react/primitive-hooks/useThreadListLoadMore.js +1 -1
  70. package/dist/react/primitive-hooks/useThreadListLoadMore.js.map +1 -1
  71. package/dist/react/primitive-hooks/useThreadListNew.js +1 -1
  72. package/dist/react/primitive-hooks/useThreadListNew.js.map +1 -1
  73. package/dist/react/primitive-hooks/useVoice.js +5 -13
  74. package/dist/react/primitive-hooks/useVoice.js.map +1 -1
  75. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js +1 -1
  76. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js.map +1 -1
  77. package/dist/react/primitives/composer/ComposerAttachments.js +1 -1
  78. package/dist/react/primitives/composer/ComposerAttachments.js.map +1 -1
  79. package/dist/react/primitives/composer/ComposerQueue.d.ts.map +1 -1
  80. package/dist/react/primitives/composer/ComposerQueue.js +1 -1
  81. package/dist/react/primitives/composer/ComposerQueue.js.map +1 -1
  82. package/dist/react/primitives/message/MessageAttachments.d.ts.map +1 -1
  83. package/dist/react/primitives/message/MessageAttachments.js +1 -1
  84. package/dist/react/primitives/message/MessageAttachments.js.map +1 -1
  85. package/dist/react/primitives/message/MessageParts.js +84 -122
  86. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  87. package/dist/react/primitives/thread/ThreadMessages.js +1 -1
  88. package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
  89. package/dist/react/primitives/thread/ThreadSuggestions.js +1 -1
  90. package/dist/react/primitives/thread/ThreadSuggestions.js.map +1 -1
  91. package/dist/react/primitives/threadList/ThreadListItems.js +1 -1
  92. package/dist/react/primitives/threadList/ThreadListItems.js.map +1 -1
  93. package/dist/react/providers/AttachmentByIndexProvider.js +2 -2
  94. package/dist/react/providers/AttachmentByIndexProvider.js.map +1 -1
  95. package/dist/react/providers/ChainOfThoughtByIndicesProvider.js +1 -1
  96. package/dist/react/providers/ChainOfThoughtByIndicesProvider.js.map +1 -1
  97. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.d.ts.map +1 -1
  98. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.js +30 -18
  99. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.js.map +1 -1
  100. package/dist/react/providers/MessageByIdProvider.js +2 -2
  101. package/dist/react/providers/MessageByIdProvider.js.map +1 -1
  102. package/dist/react/providers/MessageByIndexProvider.js +2 -2
  103. package/dist/react/providers/MessageByIndexProvider.js.map +1 -1
  104. package/dist/react/providers/PartByIndexProvider.d.ts.map +1 -1
  105. package/dist/react/providers/PartByIndexProvider.js +30 -18
  106. package/dist/react/providers/PartByIndexProvider.js.map +1 -1
  107. package/dist/react/providers/QueueItemByIndexProvider.js +1 -1
  108. package/dist/react/providers/QueueItemByIndexProvider.js.map +1 -1
  109. package/dist/react/providers/ReadonlyThreadProvider.js +1 -1
  110. package/dist/react/providers/ReadonlyThreadProvider.js.map +1 -1
  111. package/dist/react/providers/SuggestionByIndexProvider.js +1 -1
  112. package/dist/react/providers/SuggestionByIndexProvider.js.map +1 -1
  113. package/dist/react/providers/ThreadListItemByIndexProvider.js +1 -1
  114. package/dist/react/providers/ThreadListItemByIndexProvider.js.map +1 -1
  115. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +3 -3
  116. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  117. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  118. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +32 -20
  119. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  120. package/dist/react/runtimes/createRuntimeExtras.js +1 -1
  121. package/dist/react/runtimes/createRuntimeExtras.js.map +1 -1
  122. package/dist/react/types/scopes/tools.d.ts +0 -6
  123. package/dist/react/types/scopes/tools.d.ts.map +1 -1
  124. package/dist/react/utils/groupParts.d.ts +1 -3
  125. package/dist/react/utils/groupParts.d.ts.map +1 -1
  126. package/dist/react/utils/groupParts.js +1 -3
  127. package/dist/react/utils/groupParts.js.map +1 -1
  128. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  129. package/dist/runtimes/local/local-thread-runtime-core.js +4 -3
  130. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  131. package/dist/store/clients/runtime-adapter.js +3 -3
  132. package/dist/store/clients/runtime-adapter.js.map +1 -1
  133. package/package.json +5 -5
  134. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +2 -2
  135. package/src/react/client/Tools.ts +0 -7
  136. package/src/react/interactables-legacy/useAssistantInteractable.ts +1 -1
  137. package/src/react/interactables-legacy/useInteractableState.ts +3 -3
  138. package/src/react/model-context/useAssistantContext.ts +1 -1
  139. package/src/react/model-context/useAssistantDataUI.ts +1 -1
  140. package/src/react/model-context/useAssistantInstructions.ts +1 -1
  141. package/src/react/model-context/useAssistantTool.ts +2 -2
  142. package/src/react/model-context/useAssistantToolUI.ts +1 -1
  143. package/src/react/model-context/useAuiToolOverrides.ts +1 -1
  144. package/src/react/model-context/useInteractable.ts +3 -7
  145. package/src/react/model-context/useInteractableState.ts +2 -2
  146. package/src/react/primitive-hooks/useActionBarCopy.test.ts +2 -2
  147. package/src/react/primitive-hooks/useActionBarCopy.ts +3 -3
  148. package/src/react/primitive-hooks/useActionBarEdit.ts +1 -1
  149. package/src/react/primitive-hooks/useActionBarFeedback.ts +2 -2
  150. package/src/react/primitive-hooks/useActionBarReload.ts +1 -1
  151. package/src/react/primitive-hooks/useActionBarSpeak.ts +1 -1
  152. package/src/react/primitive-hooks/useActionBarStopSpeaking.ts +1 -1
  153. package/src/react/primitive-hooks/useBranchPickerNext.ts +1 -1
  154. package/src/react/primitive-hooks/useBranchPickerPrevious.ts +1 -1
  155. package/src/react/primitive-hooks/useComposerAddAttachment.ts +1 -1
  156. package/src/react/primitive-hooks/useComposerCancel.ts +1 -1
  157. package/src/react/primitive-hooks/useComposerDictate.ts +1 -1
  158. package/src/react/primitive-hooks/useComposerSend.ts +1 -1
  159. package/src/react/primitive-hooks/useEditComposerCancel.ts +1 -1
  160. package/src/react/primitive-hooks/useEditComposerSend.ts +1 -1
  161. package/src/react/primitive-hooks/useMessageBranching.ts +2 -2
  162. package/src/react/primitive-hooks/useMessageReload.ts +1 -1
  163. package/src/react/primitive-hooks/useSuggestionTrigger.ts +9 -9
  164. package/src/react/primitive-hooks/useThreadListItemArchive.ts +1 -1
  165. package/src/react/primitive-hooks/useThreadListItemDelete.ts +1 -1
  166. package/src/react/primitive-hooks/useThreadListItemTrigger.ts +1 -1
  167. package/src/react/primitive-hooks/useThreadListItemUnarchive.ts +1 -1
  168. package/src/react/primitive-hooks/useThreadListLoadMore.ts +1 -1
  169. package/src/react/primitive-hooks/useThreadListNew.ts +1 -1
  170. package/src/react/primitive-hooks/useVoice.ts +5 -5
  171. package/src/react/primitives/chainOfThought/ChainOfThoughtParts.tsx +1 -1
  172. package/src/react/primitives/composer/ComposerAttachments.tsx +1 -1
  173. package/src/react/primitives/composer/ComposerQueue.tsx +1 -3
  174. package/src/react/primitives/message/MessageAttachments.tsx +1 -3
  175. package/src/react/primitives/message/MessageParts.tsx +9 -9
  176. package/src/react/primitives/thread/ThreadMessages.tsx +1 -1
  177. package/src/react/primitives/thread/ThreadSuggestions.tsx +1 -1
  178. package/src/react/primitives/threadList/ThreadListItems.tsx +1 -1
  179. package/src/react/providers/AttachmentByIndexProvider.tsx +2 -2
  180. package/src/react/providers/ChainOfThoughtByIndicesProvider.tsx +1 -1
  181. package/src/react/providers/ChainOfThoughtPartByIndexProvider.tsx +2 -19
  182. package/src/react/providers/MessageByIdProvider.tsx +2 -2
  183. package/src/react/providers/MessageByIndexProvider.tsx +2 -2
  184. package/src/react/providers/PartByIndexProvider.tsx +2 -16
  185. package/src/react/providers/QueueItemByIndexProvider.tsx +1 -1
  186. package/src/react/providers/ReadonlyThreadProvider.tsx +1 -1
  187. package/src/react/providers/SuggestionByIndexProvider.tsx +1 -1
  188. package/src/react/providers/ThreadListItemByIndexProvider.tsx +1 -1
  189. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +3 -3
  190. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +32 -7
  191. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +26 -16
  192. package/src/react/runtimes/createRuntimeExtras.test.ts +1 -1
  193. package/src/react/runtimes/createRuntimeExtras.ts +1 -1
  194. package/src/react/types/scopes/tools.ts +0 -6
  195. package/src/react/utils/groupParts.ts +1 -7
  196. package/src/runtimes/local/local-thread-runtime-core.test.ts +38 -0
  197. package/src/runtimes/local/local-thread-runtime-core.ts +6 -3
  198. package/src/store/clients/runtime-adapter.ts +3 -3
  199. package/src/tests/groupParts.test.ts +3 -48
@@ -1 +1 @@
1
- {"version":3,"file":"RemoteThreadListHookInstanceManager.js","names":["FC","RefObject","useCallback","useRef","useEffect","useLayoutEffect","memo","PropsWithChildren","ComponentType","useMemo","Fragment","UseBoundStore","StoreApi","create","useAui","ThreadListItemRuntimeProvider","ThreadRuntimeCore","ThreadListRuntimeCore","AssistantRuntime","BaseSubscribable","ThreadRuntimeImpl","ThreadListRuntimeImpl","RemoteThreadListHook","RemoteThreadListHookInstance","runtime","ProviderRenderDetector","detectorRef","t0","$","_c","t1","t2","current","RemoteThreadListHookInstanceManager","useRuntimeHook","useRuntime","instances","Map","useAliveThreadsKeysChanged","parent","constructor","runtimeHook","startThreadRuntime","threadId","has","set","setState","Promise","resolve","reject","callback","instance","get","dispose","Error","subscribe","getThreadRuntimeCore","undefined","stopThreadRuntime","delete","_notifySubscribers","setRuntimeHook","newRuntimeHook","prevRuntimeHook","getState","_RuntimeBinder","children","threadBinding","thread","__internal_threadBinding","updateRuntime","aliveThread","isMounted","outerSubscribe","aui","initPromiseRef","hasInitializedRef","runtimeCore","setGetInitializePromise","Record","__internal_setGetInitializePromise","call","threads","main","unstable_on","state","threadListItem","status","initialize","generateTitle","_OuterActiveThreadProvider","provider","Provider","getItemById","process","env","NODE_ENV","id","setTimeout","console","warn","clearTimeout","__internal_RenderThreadRuntimes","Array","from","keys","map"],"sources":["../../../src/react/runtimes/RemoteThreadListHookInstanceManager.tsx"],"sourcesContent":["import {\n type FC,\n type RefObject,\n useCallback,\n useRef,\n useEffect,\n useLayoutEffect,\n memo,\n type PropsWithChildren,\n type ComponentType,\n useMemo,\n Fragment,\n} from \"react\";\nimport { type UseBoundStore, type StoreApi, create } from \"zustand\";\nimport { useAui } from \"@assistant-ui/store\";\nimport { ThreadListItemRuntimeProvider } from \"../providers/ThreadListItemRuntimeProvider\";\nimport type { ThreadRuntimeCore } from \"../../runtime/interfaces/thread-runtime-core\";\nimport type { ThreadListRuntimeCore } from \"../../runtime/interfaces/thread-list-runtime-core\";\nimport type { AssistantRuntime } from \"../../runtime/api/assistant-runtime\";\nimport { BaseSubscribable } from \"../../subscribable/subscribable\";\nimport type { ThreadRuntimeImpl } from \"../../runtime/api/thread-runtime\";\nimport { ThreadListRuntimeImpl } from \"../../runtime/api/thread-list-runtime\";\n\ntype RemoteThreadListHook = () => AssistantRuntime;\n\ntype RemoteThreadListHookInstance = {\n runtime?: ThreadRuntimeCore;\n};\n\nconst ProviderRenderDetector: FC<{\n detectorRef: RefObject<boolean>;\n}> = ({ detectorRef }) => {\n useLayoutEffect(() => {\n detectorRef.current = true;\n }, [detectorRef]);\n return null;\n};\nexport class RemoteThreadListHookInstanceManager extends BaseSubscribable {\n private useRuntimeHook: UseBoundStore<\n StoreApi<{ useRuntime: RemoteThreadListHook }>\n >;\n private instances = new Map<string, RemoteThreadListHookInstance>();\n private useAliveThreadsKeysChanged = create(() => ({}));\n private parent: ThreadListRuntimeCore;\n\n constructor(\n runtimeHook: RemoteThreadListHook,\n parent: ThreadListRuntimeCore,\n ) {\n super();\n this.parent = parent;\n this.useRuntimeHook = create(() => ({ useRuntime: runtimeHook }));\n }\n\n public startThreadRuntime(threadId: string) {\n if (!this.instances.has(threadId)) {\n this.instances.set(threadId, {});\n this.useAliveThreadsKeysChanged.setState({}, true);\n }\n\n return new Promise<ThreadRuntimeCore>((resolve, reject) => {\n const callback = () => {\n const instance = this.instances.get(threadId);\n if (!instance) {\n dispose();\n reject(new Error(\"Thread was deleted before runtime was started\"));\n } else if (!instance.runtime) {\n return; // misc update\n } else {\n dispose();\n resolve(instance.runtime);\n }\n };\n const dispose = this.subscribe(callback);\n callback();\n });\n }\n\n public getThreadRuntimeCore(threadId: string) {\n const instance = this.instances.get(threadId);\n if (!instance) return undefined;\n return instance.runtime;\n }\n\n public stopThreadRuntime(threadId: string) {\n this.instances.delete(threadId);\n this.useAliveThreadsKeysChanged.setState({}, true);\n this._notifySubscribers();\n }\n\n public setRuntimeHook(newRuntimeHook: RemoteThreadListHook) {\n const prevRuntimeHook = this.useRuntimeHook.getState().useRuntime;\n if (prevRuntimeHook !== newRuntimeHook) {\n this.useRuntimeHook.setState({ useRuntime: newRuntimeHook }, true);\n }\n }\n\n // Rendered as a child of the user's Provider so the runtime hook can\n // read context the Provider injects (e.g. RuntimeAdapterProvider).\n private _RuntimeBinder: FC<PropsWithChildren<{ threadId: string }>> = ({\n threadId,\n children,\n }) => {\n const { useRuntime } = this.useRuntimeHook();\n const runtime = useRuntime();\n\n const threadBinding = (runtime.thread as ThreadRuntimeImpl)\n .__internal_threadBinding;\n\n const updateRuntime = useCallback(() => {\n const aliveThread = this.instances.get(threadId);\n if (!aliveThread)\n throw new Error(\n `Thread \"${threadId}\" runtime binding not found. This is a bug in assistant-ui.`,\n );\n\n aliveThread.runtime = threadBinding.getState();\n this._notifySubscribers();\n }, [threadId, threadBinding]);\n\n const isMounted = useRef(false);\n if (!isMounted.current) {\n updateRuntime();\n }\n\n useEffect(() => {\n isMounted.current = true;\n updateRuntime();\n return threadBinding.outerSubscribe(updateRuntime);\n }, [threadBinding, updateRuntime]);\n\n const aui = useAui();\n const initPromiseRef = useRef<Promise<unknown> | undefined>(undefined);\n const hasInitializedRef = useRef(false);\n\n useEffect(() => {\n const runtimeCore = threadBinding.getState();\n const setGetInitializePromise = (runtimeCore as Record<string, unknown>)\n .__internal_setGetInitializePromise;\n if (typeof setGetInitializePromise === \"function\") {\n setGetInitializePromise.call(runtimeCore, () => initPromiseRef.current);\n }\n }, [threadBinding]);\n\n useEffect(() => {\n hasInitializedRef.current = false;\n return runtime.threads.main.unstable_on(\"initialize\", () => {\n if (hasInitializedRef.current) return;\n\n const state = aui.threadListItem().getState();\n if (state.status !== \"new\") return;\n hasInitializedRef.current = true;\n\n initPromiseRef.current = aui.threadListItem().initialize();\n\n const dispose = runtime.thread.unstable_on(\"runEnd\", () => {\n dispose();\n aui.threadListItem().generateTitle();\n });\n });\n }, [runtime, aui]);\n\n return <>{children}</>;\n };\n\n private _OuterActiveThreadProvider: FC<{\n threadId: string;\n provider: ComponentType<PropsWithChildren>;\n }> = memo(({ threadId, provider: Provider }) => {\n const runtime = useMemo(\n () => new ThreadListRuntimeImpl(this.parent).getItemById(threadId),\n [threadId],\n );\n\n const detectorRef = useRef(false);\n useEffect(() => {\n if (process.env.NODE_ENV !== \"production\" && Provider !== Fragment) {\n const id = setTimeout(() => {\n if (!detectorRef.current) {\n console.warn(\n \"RemoteThreadListAdapter.unstable_Provider did not render its `children` synchronously. \" +\n \"Render `children` on first commit; deferring them behind a loading state, Suspense boundary, \" +\n \"or `useEffect` gate strands the runtime binder and leaves the thread without context.\",\n );\n }\n }, 100);\n return () => clearTimeout(id);\n }\n return undefined;\n }, [Provider]);\n\n return (\n <ThreadListItemRuntimeProvider runtime={runtime}>\n <Provider>\n <this._RuntimeBinder threadId={threadId}>\n <ProviderRenderDetector detectorRef={detectorRef} />\n </this._RuntimeBinder>\n </Provider>\n </ThreadListItemRuntimeProvider>\n );\n });\n\n public __internal_RenderThreadRuntimes: FC<{\n provider: ComponentType<PropsWithChildren>;\n }> = ({ provider }) => {\n this.useAliveThreadsKeysChanged(); // trigger re-render on alive threads change\n\n return Array.from(this.instances.keys()).map((threadId) => (\n <this._OuterActiveThreadProvider\n key={threadId}\n threadId={threadId}\n provider={provider}\n />\n ));\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"RemoteThreadListHookInstanceManager.js","names":["FC","RefObject","useCallback","useRef","useEffect","useLayoutEffect","memo","PropsWithChildren","ComponentType","useMemo","Fragment","UseBoundStore","StoreApi","create","useAui","ThreadListItemRuntimeProvider","ThreadRuntimeCore","ThreadListRuntimeCore","AssistantRuntime","BaseSubscribable","ThreadRuntimeImpl","ThreadListRuntimeImpl","RemoteThreadListHook","RemoteThreadListHookInstance","runtime","ProviderRenderDetector","detectorRef","t0","$","_c","t1","t2","current","RemoteThreadListHookInstanceManager","useRuntimeHook","useRuntime","instances","Map","useAliveThreadsKeysChanged","parent","constructor","runtimeHook","startThreadRuntime","threadId","has","set","setState","Promise","resolve","reject","callback","instance","get","dispose","Error","subscribe","getThreadRuntimeCore","undefined","stopThreadRuntime","delete","_notifySubscribers","setRuntimeHook","newRuntimeHook","prevRuntimeHook","getState","_RuntimeBinder","children","threadBinding","thread","__internal_threadBinding","updateRuntime","aliveThread","isMounted","outerSubscribe","aui","initPromiseRef","hasInitializedRef","runtimeCore","setGetInitializePromise","Record","__internal_setGetInitializePromise","call","threads","main","unstable_on","state","threadListItem","status","initialize","generateTitle","_OuterActiveThreadProvider","provider","Provider","getItemById","process","env","NODE_ENV","id","setTimeout","console","warn","clearTimeout","__internal_RenderThreadRuntimes","Array","from","keys","map"],"sources":["../../../src/react/runtimes/RemoteThreadListHookInstanceManager.tsx"],"sourcesContent":["import {\n type FC,\n type RefObject,\n useCallback,\n useRef,\n useEffect,\n useLayoutEffect,\n memo,\n type PropsWithChildren,\n type ComponentType,\n useMemo,\n Fragment,\n} from \"react\";\nimport { type UseBoundStore, type StoreApi, create } from \"zustand\";\nimport { useAui } from \"@assistant-ui/store\";\nimport { ThreadListItemRuntimeProvider } from \"../providers/ThreadListItemRuntimeProvider\";\nimport type { ThreadRuntimeCore } from \"../../runtime/interfaces/thread-runtime-core\";\nimport type { ThreadListRuntimeCore } from \"../../runtime/interfaces/thread-list-runtime-core\";\nimport type { AssistantRuntime } from \"../../runtime/api/assistant-runtime\";\nimport { BaseSubscribable } from \"../../subscribable/subscribable\";\nimport type { ThreadRuntimeImpl } from \"../../runtime/api/thread-runtime\";\nimport { ThreadListRuntimeImpl } from \"../../runtime/api/thread-list-runtime\";\n\ntype RemoteThreadListHook = () => AssistantRuntime;\n\ntype RemoteThreadListHookInstance = {\n runtime?: ThreadRuntimeCore;\n};\n\nconst ProviderRenderDetector: FC<{\n detectorRef: RefObject<boolean>;\n}> = ({ detectorRef }) => {\n useLayoutEffect(() => {\n detectorRef.current = true;\n }, [detectorRef]);\n return null;\n};\nexport class RemoteThreadListHookInstanceManager extends BaseSubscribable {\n private useRuntimeHook: UseBoundStore<\n StoreApi<{ useRuntime: RemoteThreadListHook }>\n >;\n private instances = new Map<string, RemoteThreadListHookInstance>();\n private useAliveThreadsKeysChanged = create(() => ({}));\n private parent: ThreadListRuntimeCore;\n\n constructor(\n runtimeHook: RemoteThreadListHook,\n parent: ThreadListRuntimeCore,\n ) {\n super();\n this.parent = parent;\n this.useRuntimeHook = create(() => ({ useRuntime: runtimeHook }));\n }\n\n public startThreadRuntime(threadId: string) {\n if (!this.instances.has(threadId)) {\n this.instances.set(threadId, {});\n this.useAliveThreadsKeysChanged.setState({}, true);\n }\n\n return new Promise<ThreadRuntimeCore>((resolve, reject) => {\n const callback = () => {\n const instance = this.instances.get(threadId);\n if (!instance) {\n dispose();\n reject(new Error(\"Thread was deleted before runtime was started\"));\n } else if (!instance.runtime) {\n return; // misc update\n } else {\n dispose();\n resolve(instance.runtime);\n }\n };\n const dispose = this.subscribe(callback);\n callback();\n });\n }\n\n public getThreadRuntimeCore(threadId: string) {\n const instance = this.instances.get(threadId);\n if (!instance) return undefined;\n return instance.runtime;\n }\n\n public stopThreadRuntime(threadId: string) {\n this.instances.delete(threadId);\n this.useAliveThreadsKeysChanged.setState({}, true);\n this._notifySubscribers();\n }\n\n public setRuntimeHook(newRuntimeHook: RemoteThreadListHook) {\n const prevRuntimeHook = this.useRuntimeHook.getState().useRuntime;\n if (prevRuntimeHook !== newRuntimeHook) {\n this.useRuntimeHook.setState({ useRuntime: newRuntimeHook }, true);\n }\n }\n\n // Rendered as a child of the user's Provider so the runtime hook can\n // read context the Provider injects (e.g. RuntimeAdapterProvider).\n private _RuntimeBinder: FC<PropsWithChildren<{ threadId: string }>> = ({\n threadId,\n children,\n }) => {\n const { useRuntime } = this.useRuntimeHook();\n const runtime = useRuntime();\n\n const threadBinding = (runtime.thread as ThreadRuntimeImpl)\n .__internal_threadBinding;\n\n const updateRuntime = useCallback(() => {\n const aliveThread = this.instances.get(threadId);\n if (!aliveThread)\n throw new Error(\n `Thread \"${threadId}\" runtime binding not found. This is a bug in assistant-ui.`,\n );\n\n aliveThread.runtime = threadBinding.getState();\n this._notifySubscribers();\n }, [threadId, threadBinding]);\n\n const isMounted = useRef(false);\n if (!isMounted.current) {\n updateRuntime();\n }\n\n useEffect(() => {\n isMounted.current = true;\n updateRuntime();\n return threadBinding.outerSubscribe(updateRuntime);\n }, [threadBinding, updateRuntime]);\n\n const aui = useAui();\n const initPromiseRef = useRef<Promise<unknown> | undefined>(undefined);\n const hasInitializedRef = useRef(false);\n\n useEffect(() => {\n const runtimeCore = threadBinding.getState();\n const setGetInitializePromise = (runtimeCore as Record<string, unknown>)\n .__internal_setGetInitializePromise;\n if (typeof setGetInitializePromise === \"function\") {\n setGetInitializePromise.call(runtimeCore, () => initPromiseRef.current);\n }\n }, [threadBinding]);\n\n useEffect(() => {\n hasInitializedRef.current = false;\n return runtime.threads.main.unstable_on(\"initialize\", () => {\n if (hasInitializedRef.current) return;\n\n const state = aui.threadListItem.getState();\n if (state.status !== \"new\") return;\n hasInitializedRef.current = true;\n\n initPromiseRef.current = aui.threadListItem.initialize();\n\n const dispose = runtime.thread.unstable_on(\"runEnd\", () => {\n dispose();\n aui.threadListItem.generateTitle();\n });\n });\n }, [runtime, aui]);\n\n return <>{children}</>;\n };\n\n private _OuterActiveThreadProvider: FC<{\n threadId: string;\n provider: ComponentType<PropsWithChildren>;\n }> = memo(({ threadId, provider: Provider }) => {\n const runtime = useMemo(\n () => new ThreadListRuntimeImpl(this.parent).getItemById(threadId),\n [threadId],\n );\n\n const detectorRef = useRef(false);\n useEffect(() => {\n if (process.env.NODE_ENV !== \"production\" && Provider !== Fragment) {\n const id = setTimeout(() => {\n if (!detectorRef.current) {\n console.warn(\n \"RemoteThreadListAdapter.unstable_Provider did not render its `children` synchronously. \" +\n \"Render `children` on first commit; deferring them behind a loading state, Suspense boundary, \" +\n \"or `useEffect` gate strands the runtime binder and leaves the thread without context.\",\n );\n }\n }, 100);\n return () => clearTimeout(id);\n }\n return undefined;\n }, [Provider]);\n\n return (\n <ThreadListItemRuntimeProvider runtime={runtime}>\n <Provider>\n <this._RuntimeBinder threadId={threadId}>\n <ProviderRenderDetector detectorRef={detectorRef} />\n </this._RuntimeBinder>\n </Provider>\n </ThreadListItemRuntimeProvider>\n );\n });\n\n public __internal_RenderThreadRuntimes: FC<{\n provider: ComponentType<PropsWithChildren>;\n }> = ({ provider }) => {\n this.useAliveThreadsKeysChanged(); // trigger re-render on alive threads change\n\n return Array.from(this.instances.keys()).map((threadId) => (\n <this._OuterActiveThreadProvider\n key={threadId}\n threadId={threadId}\n provider={provider}\n />\n ));\n };\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantCloudThreadHistoryAdapter.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts"],"mappings":";;;;KA0OK;EACH;EACA;EACA;EACA;EACA;;KAoDG;EACH;EACA;EACA;EACA;EACA,aAAa;EACb;EACA;;KAmBG;EACH;EACA,YAAY;EACZ;EACA;EACA;EACA;EACA;EACA;EACA,WAAW;EACX,QAAQ;EACR;;iBAiCc,aAAa,GAAG,SAAS,IAAI;iBA+b7B,sCACd,UAAU,UAAU,kBACnB"}
1
+ {"version":3,"file":"AssistantCloudThreadHistoryAdapter.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts"],"mappings":";;;;KAgPK;EACH;EACA;EACA;EACA;EACA;;KAoDG;EACH;EACA;EACA;EACA;EACA,aAAa;EACb;EACA;;KAmBG;EACH;EACA,YAAY;EACZ;EACA;EACA;EACA;EACA;EACA;EACA,WAAW;EACX,QAAQ;EACR;;iBAiCc,aAAa,GAAG,SAAS,IAAI;iBA+b7B,sCACd,UAAU,UAAU,kBACnB"}
@@ -1,19 +1,22 @@
1
1
  import { auiV0Decode, auiV0Encode } from "./auiV0.js";
2
- import { useAui } from "@assistant-ui/store";
3
- import { useState } from "@assistant-ui/tap/react-shim";
2
+ import { getClientId, useAui } from "@assistant-ui/store";
3
+ import { useEffect, useRef, useState } from "@assistant-ui/tap/react-shim";
4
4
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
5
5
  import { CloudMessagePersistence, createFormattedPersistence } from "assistant-cloud";
6
6
  //#region src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts
7
7
  const globalPersistence = /* @__PURE__ */ new WeakMap();
8
8
  var AssistantCloudThreadHistoryAdapter = class {
9
9
  cloudRef;
10
- aui;
11
- constructor(cloudRef, aui) {
10
+ auiRef;
11
+ constructor(cloudRef, auiRef) {
12
12
  this.cloudRef = cloudRef;
13
- this.aui = aui;
13
+ this.auiRef = auiRef;
14
+ }
15
+ get aui() {
16
+ return this.auiRef.current;
14
17
  }
15
18
  get _persistence() {
16
- const key = this.aui.threadListItem();
19
+ const key = getClientId(this.aui.threadListItem);
17
20
  if (!globalPersistence.has(key)) globalPersistence.set(key, new CloudMessagePersistence(() => this.cloudRef.current));
18
21
  return globalPersistence.get(key);
19
22
  }
@@ -22,11 +25,11 @@ var AssistantCloudThreadHistoryAdapter = class {
22
25
  const formatted = createFormattedPersistence(this._persistence, formatAdapter);
23
26
  return {
24
27
  async append(item) {
25
- const { remoteId } = await adapter.aui.threadListItem().initialize();
28
+ const { remoteId } = await adapter.aui.threadListItem.initialize();
26
29
  await formatted.append(remoteId, item);
27
30
  },
28
31
  async update(item, localMessageId) {
29
- const remoteId = adapter.aui.threadListItem().getState().remoteId;
32
+ const remoteId = adapter.aui.threadListItem.getState().remoteId;
30
33
  if (!remoteId) return;
31
34
  await formatted.update?.(remoteId, item, localMessageId);
32
35
  },
@@ -38,14 +41,14 @@ var AssistantCloudThreadHistoryAdapter = class {
38
41
  adapter._reportRunTelemetry(formatAdapter.format, encodedRunMessages, options);
39
42
  },
40
43
  async load() {
41
- const remoteId = adapter.aui.threadListItem().getState().remoteId;
44
+ const remoteId = adapter.aui.threadListItem.getState().remoteId;
42
45
  if (!remoteId) return { messages: [] };
43
46
  return formatted.load(remoteId);
44
47
  }
45
48
  };
46
49
  }
47
50
  async append({ parentId, message }) {
48
- const { remoteId } = await this.aui.threadListItem().initialize();
51
+ const { remoteId } = await this.aui.threadListItem.initialize();
49
52
  const encoded = auiV0Encode(message);
50
53
  await this._persistence.append(remoteId, message.id, parentId, "aui/v0", encoded);
51
54
  if (this.cloudRef.current.telemetry.enabled) this._maybeReportRun(remoteId, "aui/v0", encoded);
@@ -53,7 +56,7 @@ var AssistantCloudThreadHistoryAdapter = class {
53
56
  async update(item) {
54
57
  if (!this._persistence.isPersisted(item.message.id)) return this.append(item);
55
58
  const { message } = item;
56
- const remoteId = this.aui.threadListItem().getState().remoteId;
59
+ const remoteId = this.aui.threadListItem.getState().remoteId;
57
60
  if (!remoteId) return;
58
61
  const encoded = auiV0Encode(message);
59
62
  await this._persistence.update(remoteId, message.id, "aui/v0", encoded);
@@ -63,13 +66,13 @@ var AssistantCloudThreadHistoryAdapter = class {
63
66
  throw new Error("Assistant Cloud does not support deleting thread messages yet.");
64
67
  }
65
68
  async load() {
66
- const remoteId = this.aui.threadListItem().getState().remoteId;
69
+ const remoteId = this.aui.threadListItem.getState().remoteId;
67
70
  if (!remoteId) return { messages: [] };
68
71
  return { messages: (await this._persistence.load(remoteId, "aui/v0")).filter((m) => m.format === "aui/v0").map(auiV0Decode).reverse() };
69
72
  }
70
73
  _reportRunTelemetry(format, runMessages, options) {
71
74
  if (!this.cloudRef.current.telemetry.enabled) return;
72
- const remoteId = this.aui.threadListItem().getState().remoteId;
75
+ const remoteId = this.aui.threadListItem.getState().remoteId;
73
76
  if (!remoteId) return;
74
77
  const extracted = extractRunTelemetry(format, runMessages);
75
78
  if (!extracted) return;
@@ -422,16 +425,25 @@ function aggregateAiSdkV6RunSteps(stepMessages) {
422
425
  });
423
426
  }
424
427
  function useAssistantCloudThreadHistoryAdapter(cloudRef) {
425
- const $ = c(3);
428
+ const $ = c(4);
426
429
  const aui = useAui();
430
+ const auiRef = useRef(aui);
427
431
  let t0;
428
- if ($[0] !== aui || $[1] !== cloudRef) {
429
- t0 = () => new AssistantCloudThreadHistoryAdapter(cloudRef, aui);
432
+ if ($[0] !== aui) {
433
+ t0 = () => {
434
+ auiRef.current = aui;
435
+ };
430
436
  $[0] = aui;
431
- $[1] = cloudRef;
432
- $[2] = t0;
433
- } else t0 = $[2];
434
- const [adapter] = useState(t0);
437
+ $[1] = t0;
438
+ } else t0 = $[1];
439
+ useEffect(t0);
440
+ let t1;
441
+ if ($[2] !== cloudRef) {
442
+ t1 = () => new AssistantCloudThreadHistoryAdapter(cloudRef, auiRef);
443
+ $[2] = cloudRef;
444
+ $[3] = t1;
445
+ } else t1 = $[3];
446
+ const [adapter] = useState(t1);
435
447
  return adapter;
436
448
  }
437
449
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantCloudThreadHistoryAdapter.js","names":["RefObject","useState","GenericThreadHistoryAdapter","ThreadHistoryAdapter","MessageFormatAdapter","MessageFormatItem","MessageFormatRepository","ExportedMessageRepositoryItem","AssistantCloud","CloudMessagePersistence","createFormattedPersistence","auiV0Decode","auiV0Encode","AssistantClient","useAui","ThreadListItemMethods","globalPersistence","WeakMap","AssistantCloudThreadHistoryAdapter","cloudRef","aui","constructor","_persistence","key","threadListItem","has","set","current","get","withFormat","Record","formatAdapter","TMessage","TStorageFormat","adapter","formatted","append","item","remoteId","initialize","update","localMessageId","getState","delete","Error","reportTelemetry","items","options","durationMs","stepTimestamps","StepTimestamp","encodedRunMessages","map","encode","_reportRunTelemetry","format","load","Promise","messages","parentId","message","encoded","id","telemetry","enabled","_maybeReportRun","isPersisted","filter","m","reverse","runMessages","T","extracted","extractRunTelemetry","_sendReport","content","extractTelemetry","data","TelemetryData","mergedSteps","mergeStepTimestamps","steps","initial","Parameters","this","runs","report","thread_id","status","totalSteps","total_steps","undefined","toolCalls","tool_calls","inputTokens","input_tokens","outputTokens","output_tokens","reasoningTokens","reasoning_tokens","cachedInputTokens","cached_input_tokens","duration_ms","outputText","output_text","metadata","modelId","model_id","beforeReport","catch","MAX_SPAN_CONTENT","truncateStr","value","length","slice","safeStringify","JSON","stringify","TelemetryToolCall","tool_name","tool_call_id","tool_args","tool_result","tool_source","BASE64_PATTERN","summarizeMcpResult","parsed","parse","Array","isArray","summarized","type","test","sizeKB","toFixed","buildToolCall","toolName","toolCallId","args","result","argsText","toolSource","call","toolArgs","toolResult","TelemetryStepData","start_ms","end_ms","timestamps","t","len","Math","min","s","i","extractAuiV0","extractAiSdkV6","aggregateAiSdkV6RunSteps","AUI_STATUS_MAP","error","incomplete","msg","role","text","usage","custom","p","textParts","join","totalInput","totalOutput","totalReasoning","totalCachedInput","hasInput","hasOutput","hasReasoning","hasCachedInput","step","statusType","telemetrySteps","AiSdkV6Part","input","output","AiSdkV6Message","parts","isToolCallPart","startsWith","isDynamicToolPart","partToToolCall","collectAiSdkV6Parts","stepsData","currentStepToolCalls","push","tc","extractModelId","buildAiSdkV6Result","hasText","UsageFields","promptTokens","completionTokens","normalizeUsage","u","extractAiSdkV6Usage","normalized","hasAny","n","stepMessages","allTextParts","allToolCalls","allStepsData","hasAssistant","useAssistantCloudThreadHistoryAdapter","$","_c","t0"],"sources":["../../../../src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts"],"sourcesContent":["import { type RefObject, useState } from \"react\";\nimport type {\n GenericThreadHistoryAdapter,\n ThreadHistoryAdapter,\n MessageFormatAdapter,\n MessageFormatItem,\n MessageFormatRepository,\n} from \"../../../adapters/thread-history\";\nimport type { ExportedMessageRepositoryItem } from \"../../../runtime/utils/message-repository\";\nimport {\n type AssistantCloud,\n CloudMessagePersistence,\n createFormattedPersistence,\n} from \"assistant-cloud\";\nimport { auiV0Decode, auiV0Encode } from \"./auiV0\";\nimport { type AssistantClient, useAui } from \"@assistant-ui/store\";\nimport type { ThreadListItemMethods } from \"../../../store/scopes/thread-list-item\";\n\nconst globalPersistence = new WeakMap<\n ThreadListItemMethods,\n CloudMessagePersistence\n>();\n\nclass AssistantCloudThreadHistoryAdapter implements ThreadHistoryAdapter {\n private cloudRef: RefObject<AssistantCloud>;\n private aui: AssistantClient;\n\n constructor(cloudRef: RefObject<AssistantCloud>, aui: AssistantClient) {\n this.cloudRef = cloudRef;\n this.aui = aui;\n }\n\n private get _persistence(): CloudMessagePersistence {\n const key = this.aui.threadListItem();\n if (!globalPersistence.has(key)) {\n globalPersistence.set(\n key,\n new CloudMessagePersistence(() => this.cloudRef.current),\n );\n }\n return globalPersistence.get(key)!;\n }\n\n withFormat<TMessage, TStorageFormat extends Record<string, unknown>>(\n formatAdapter: MessageFormatAdapter<TMessage, TStorageFormat>,\n ): GenericThreadHistoryAdapter<TMessage> {\n const adapter = this;\n const formatted = createFormattedPersistence(\n this._persistence,\n formatAdapter,\n );\n return {\n // Note: callers must also call reportTelemetry() for run tracking\n async append(item: MessageFormatItem<TMessage>) {\n const { remoteId } = await adapter.aui.threadListItem().initialize();\n await formatted.append(remoteId, item);\n },\n async update(item: MessageFormatItem<TMessage>, localMessageId: string) {\n const remoteId = adapter.aui.threadListItem().getState().remoteId;\n if (!remoteId) return;\n await formatted.update?.(remoteId, item, localMessageId);\n },\n async delete() {\n throw new Error(\n \"Assistant Cloud does not support deleting thread messages yet.\",\n );\n },\n reportTelemetry(\n items: MessageFormatItem<TMessage>[],\n options?: {\n durationMs?: number;\n stepTimestamps?: StepTimestamp[];\n },\n ) {\n const encodedRunMessages = items.map((item) =>\n formatAdapter.encode(item),\n );\n adapter._reportRunTelemetry(\n formatAdapter.format,\n encodedRunMessages,\n options,\n );\n },\n async load(): Promise<MessageFormatRepository<TMessage>> {\n const remoteId = adapter.aui.threadListItem().getState().remoteId;\n if (!remoteId) return { messages: [] };\n return formatted.load(remoteId);\n },\n };\n }\n\n async append({ parentId, message }: ExportedMessageRepositoryItem) {\n const { remoteId } = await this.aui.threadListItem().initialize();\n const encoded = auiV0Encode(message);\n await this._persistence.append(\n remoteId,\n message.id,\n parentId,\n \"aui/v0\",\n encoded,\n );\n\n if (this.cloudRef.current.telemetry.enabled) {\n this._maybeReportRun(remoteId, \"aui/v0\", encoded);\n }\n }\n\n async update(item: ExportedMessageRepositoryItem) {\n if (!this._persistence.isPersisted(item.message.id)) {\n return this.append(item);\n }\n const { message } = item;\n const remoteId = this.aui.threadListItem().getState().remoteId;\n if (!remoteId) return;\n const encoded = auiV0Encode(message);\n await this._persistence.update(remoteId, message.id, \"aui/v0\", encoded);\n\n if (this.cloudRef.current.telemetry.enabled) {\n this._maybeReportRun(remoteId, \"aui/v0\", encoded);\n }\n }\n\n async delete() {\n throw new Error(\n \"Assistant Cloud does not support deleting thread messages yet.\",\n );\n }\n\n async load() {\n const remoteId = this.aui.threadListItem().getState().remoteId;\n if (!remoteId) return { messages: [] };\n const messages = await this._persistence.load(remoteId, \"aui/v0\");\n return {\n messages: messages\n .filter(\n (m): m is typeof m & { format: \"aui/v0\" } => m.format === \"aui/v0\",\n )\n .map(auiV0Decode)\n .reverse(),\n };\n }\n\n private _reportRunTelemetry<T>(\n format: string,\n runMessages: T[],\n options?: {\n durationMs?: number;\n stepTimestamps?: StepTimestamp[];\n },\n ) {\n if (!this.cloudRef.current.telemetry.enabled) return;\n\n const remoteId = this.aui.threadListItem().getState().remoteId;\n if (!remoteId) return;\n\n const extracted = extractRunTelemetry(format, runMessages);\n if (!extracted) return;\n\n this._sendReport(\n remoteId,\n extracted,\n options?.durationMs,\n options?.stepTimestamps,\n );\n }\n\n private _maybeReportRun<T>(remoteId: string, format: string, content: T) {\n const extracted = extractTelemetry(format, content);\n if (!extracted) return;\n\n this._sendReport(remoteId, extracted);\n }\n\n private _sendReport(\n remoteId: string,\n data: TelemetryData,\n durationMs?: number,\n stepTimestamps?: StepTimestamp[],\n ) {\n const mergedSteps = mergeStepTimestamps(data.steps, stepTimestamps);\n // Keep in sync with assistant-cloud createRunSchema\n // (apps/aui-cloud-api/src/endpoints/runs/create.ts).\n const initial: Parameters<typeof this.cloudRef.current.runs.report>[0] = {\n thread_id: remoteId,\n status: data.status,\n ...(data.totalSteps != null\n ? { total_steps: data.totalSteps }\n : undefined),\n ...(data.toolCalls ? { tool_calls: data.toolCalls } : undefined),\n ...(mergedSteps ? { steps: mergedSteps } : undefined),\n ...(data.inputTokens != null\n ? { input_tokens: data.inputTokens }\n : undefined),\n ...(data.outputTokens != null\n ? { output_tokens: data.outputTokens }\n : undefined),\n ...(data.reasoningTokens != null\n ? { reasoning_tokens: data.reasoningTokens }\n : undefined),\n ...(data.cachedInputTokens != null\n ? { cached_input_tokens: data.cachedInputTokens }\n : undefined),\n ...(durationMs != null ? { duration_ms: durationMs } : undefined),\n ...(data.outputText != null\n ? { output_text: data.outputText }\n : undefined),\n ...(data.metadata ? { metadata: data.metadata } : undefined),\n ...(data.modelId ? { model_id: data.modelId } : undefined),\n };\n\n const { beforeReport } = this.cloudRef.current.telemetry;\n const report = beforeReport ? beforeReport(initial) : initial;\n if (!report) return;\n\n this.cloudRef.current.runs.report(report).catch(() => {});\n }\n}\n\nconst MAX_SPAN_CONTENT = 50_000;\n\nfunction truncateStr(value: string): string {\n if (value.length <= MAX_SPAN_CONTENT) return value;\n return value.slice(0, MAX_SPAN_CONTENT);\n}\n\nfunction safeStringify(value: unknown): string | undefined {\n if (value == null) return undefined;\n try {\n return truncateStr(JSON.stringify(value));\n } catch {\n return undefined;\n }\n}\n\ntype TelemetryToolCall = {\n tool_name: string;\n tool_call_id: string;\n tool_args?: string;\n tool_result?: string;\n tool_source?: \"mcp\" | \"frontend\" | \"backend\";\n};\n\nconst BASE64_PATTERN = /^[A-Za-z0-9+/]{100,}={0,2}$/;\n\nfunction summarizeMcpResult(value: unknown): string | undefined {\n if (value == null) return undefined;\n try {\n const parsed = typeof value === \"string\" ? JSON.parse(value) : value;\n if (Array.isArray(parsed)) {\n const summarized = parsed.map((item) => {\n if (item && typeof item === \"object\" && item.type) {\n if (\n (item.type === \"image\" || item.type === \"audio\") &&\n typeof item.data === \"string\" &&\n BASE64_PATTERN.test(item.data.slice(0, 200))\n ) {\n const sizeKB = ((item.data.length * 3) / 4 / 1024).toFixed(1);\n return { ...item, data: `[${item.type}: ${sizeKB}KB]` };\n }\n }\n return item;\n });\n return truncateStr(JSON.stringify(summarized));\n }\n } catch {\n // not JSON array, fall through\n }\n return safeStringify(value);\n}\n\nfunction buildToolCall(\n toolName: string,\n toolCallId: string,\n args: unknown,\n result: unknown,\n argsText?: string,\n toolSource?: \"mcp\" | \"frontend\" | \"backend\",\n): TelemetryToolCall {\n const call: TelemetryToolCall = {\n tool_name: toolName,\n tool_call_id: toolCallId,\n };\n const toolArgs = argsText ?? safeStringify(args);\n if (toolArgs !== undefined) call.tool_args = toolArgs;\n const toolResult =\n toolSource === \"mcp\" ? summarizeMcpResult(result) : safeStringify(result);\n if (toolResult !== undefined) call.tool_result = toolResult;\n if (toolSource) call.tool_source = toolSource;\n return call;\n}\n\ntype TelemetryStepData = {\n input_tokens?: number;\n output_tokens?: number;\n reasoning_tokens?: number;\n cached_input_tokens?: number;\n tool_calls?: TelemetryToolCall[];\n start_ms?: number;\n end_ms?: number;\n};\n\ntype StepTimestamp = { start_ms: number; end_ms: number };\n\nfunction mergeStepTimestamps(\n steps: TelemetryStepData[] | undefined,\n timestamps: StepTimestamp[] | undefined,\n): TelemetryStepData[] | undefined {\n if (!timestamps) return steps;\n if (!steps) return timestamps.map((t) => ({ ...t }));\n\n const len = Math.min(steps.length, timestamps.length);\n return steps.map((s, i) => ({\n ...s,\n ...(i < len ? timestamps[i] : undefined),\n }));\n}\n\ntype TelemetryData = {\n status: \"completed\" | \"incomplete\" | \"error\";\n toolCalls?: TelemetryToolCall[];\n totalSteps?: number;\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n outputText?: string;\n metadata?: Record<string, unknown>;\n steps?: TelemetryStepData[];\n modelId?: string;\n};\n\nfunction extractTelemetry<T>(format: string, content: T): TelemetryData | null {\n switch (format) {\n case \"aui/v0\":\n return extractAuiV0(content);\n case \"ai-sdk/v6\":\n return extractAiSdkV6(content);\n default:\n return null;\n }\n}\n\nfunction extractRunTelemetry<T>(\n format: string,\n runMessages: T[],\n): TelemetryData | null {\n if (format === \"ai-sdk/v6\") {\n return aggregateAiSdkV6RunSteps(runMessages);\n }\n for (let i = runMessages.length - 1; i >= 0; i--) {\n const result = extractTelemetry(format, runMessages[i]!);\n if (result) return result;\n }\n return null;\n}\n\nconst AUI_STATUS_MAP: Record<string, TelemetryData[\"status\"]> = {\n error: \"error\",\n incomplete: \"incomplete\",\n};\n\nexport function extractAuiV0<T>(content: T): TelemetryData | null {\n const msg = content as {\n role?: string;\n status?: { type: string };\n content?: readonly {\n type: string;\n text?: string;\n toolName?: string;\n toolCallId?: string;\n args?: unknown;\n argsText?: string;\n result?: unknown;\n }[];\n metadata?: {\n modelId?: string;\n steps?: readonly {\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n };\n }[];\n custom?: Record<string, unknown> & { modelId?: string };\n };\n };\n\n if (msg.role !== \"assistant\") return null;\n // A paused (requires-action) write is not a finished run; reporting it would\n // mislabel it \"completed\" and double-count steps once the terminal write reports.\n if (msg.status?.type === \"requires-action\") return null;\n\n const toolCalls = msg.content\n ?.filter((p) => p.type === \"tool-call\" && p.toolName && p.toolCallId)\n .map((p) =>\n buildToolCall(p.toolName!, p.toolCallId!, p.args, p.result, p.argsText),\n );\n\n const textParts = msg.content?.filter((p) => p.type === \"text\" && p.text);\n const outputText =\n textParts && textParts.length > 0\n ? truncateStr(textParts.map((p) => p.text).join(\"\"))\n : undefined;\n\n const steps = msg.metadata?.steps;\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let reasoningTokens: number | undefined;\n let cachedInputTokens: number | undefined;\n if (steps && steps.length > 0) {\n let totalInput = 0;\n let totalOutput = 0;\n let totalReasoning = 0;\n let totalCachedInput = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n for (const step of steps) {\n if (step.usage?.inputTokens != null) {\n totalInput += step.usage.inputTokens;\n hasInput = true;\n }\n if (step.usage?.outputTokens != null) {\n totalOutput += step.usage.outputTokens;\n hasOutput = true;\n }\n if (step.usage?.reasoningTokens != null) {\n totalReasoning += step.usage.reasoningTokens;\n hasReasoning = true;\n }\n if (step.usage?.cachedInputTokens != null) {\n totalCachedInput += step.usage.cachedInputTokens;\n hasCachedInput = true;\n }\n }\n inputTokens = hasInput ? totalInput : undefined;\n outputTokens = hasOutput ? totalOutput : undefined;\n reasoningTokens = hasReasoning ? totalReasoning : undefined;\n cachedInputTokens = hasCachedInput ? totalCachedInput : undefined;\n }\n\n const statusType = msg.status?.type;\n const status: TelemetryData[\"status\"] =\n (statusType && AUI_STATUS_MAP[statusType]) || \"completed\";\n\n const metadata = msg.metadata?.custom as Record<string, unknown> | undefined;\n const modelId =\n msg.metadata?.modelId ??\n (typeof msg.metadata?.custom?.modelId === \"string\"\n ? msg.metadata.custom.modelId\n : undefined);\n\n const telemetrySteps: TelemetryStepData[] | undefined =\n steps && steps.length > 1\n ? steps.map((s) => ({\n ...(s.usage?.inputTokens != null\n ? { input_tokens: s.usage.inputTokens }\n : undefined),\n ...(s.usage?.outputTokens != null\n ? { output_tokens: s.usage.outputTokens }\n : undefined),\n ...(s.usage?.reasoningTokens != null\n ? { reasoning_tokens: s.usage.reasoningTokens }\n : undefined),\n ...(s.usage?.cachedInputTokens != null\n ? { cached_input_tokens: s.usage.cachedInputTokens }\n : undefined),\n }))\n : undefined;\n\n return {\n status,\n ...(toolCalls && toolCalls.length > 0 ? { toolCalls } : undefined),\n ...(steps?.length ? { totalSteps: steps.length } : undefined),\n ...(inputTokens != null ? { inputTokens } : undefined),\n ...(outputTokens != null ? { outputTokens } : undefined),\n ...(reasoningTokens != null ? { reasoningTokens } : undefined),\n ...(cachedInputTokens != null ? { cachedInputTokens } : undefined),\n ...(outputText != null ? { outputText } : undefined),\n ...(metadata ? { metadata } : undefined),\n ...(telemetrySteps ? { steps: telemetrySteps } : undefined),\n ...(modelId ? { modelId } : undefined),\n };\n}\n\ntype AiSdkV6Part = {\n type: string;\n text?: string;\n toolName?: string;\n toolCallId?: string;\n args?: unknown;\n result?: unknown;\n input?: unknown;\n output?: unknown;\n};\n\ntype AiSdkV6Message = {\n role?: string;\n parts?: readonly AiSdkV6Part[];\n metadata?: Record<string, unknown>;\n};\n\nfunction isToolCallPart(p: AiSdkV6Part): boolean {\n if (!p.toolCallId) return false;\n if (p.type === \"tool-call\" || p.type === \"dynamic-tool\") return !!p.toolName;\n return p.type.startsWith(\"tool-\") || p.type.startsWith(\"dynamic-tool-\");\n}\n\nfunction isDynamicToolPart(p: AiSdkV6Part): boolean {\n return p.type === \"dynamic-tool\" || p.type.startsWith(\"dynamic-tool-\");\n}\n\nfunction partToToolCall(p: AiSdkV6Part): TelemetryToolCall {\n const toolSource: \"mcp\" | undefined = isDynamicToolPart(p)\n ? \"mcp\"\n : undefined;\n return buildToolCall(\n p.toolName ?? p.type.slice(5),\n p.toolCallId!,\n p.args ?? p.input,\n p.result ?? p.output,\n undefined,\n toolSource,\n );\n}\n\nfunction collectAiSdkV6Parts(parts: readonly AiSdkV6Part[]): {\n textParts: string[];\n toolCalls: TelemetryToolCall[];\n stepsData: { tool_calls: TelemetryToolCall[] }[];\n} {\n const textParts: string[] = [];\n const toolCalls: TelemetryToolCall[] = [];\n const stepsData: { tool_calls: TelemetryToolCall[] }[] = [];\n let currentStepToolCalls: TelemetryToolCall[] | null = null;\n\n for (const p of parts) {\n if (p.type === \"step-start\") {\n if (currentStepToolCalls !== null) {\n stepsData.push({ tool_calls: currentStepToolCalls });\n }\n currentStepToolCalls = [];\n } else if (p.type === \"text\" && p.text) {\n textParts.push(p.text);\n } else if (isToolCallPart(p)) {\n const tc = partToToolCall(p);\n toolCalls.push(tc);\n if (currentStepToolCalls !== null) {\n currentStepToolCalls.push(tc);\n }\n }\n }\n\n if (currentStepToolCalls !== null) {\n stepsData.push({ tool_calls: currentStepToolCalls });\n }\n\n return { textParts, toolCalls, stepsData };\n}\n\nfunction extractModelId(\n metadata?: Record<string, unknown>,\n): string | undefined {\n if (!metadata) return undefined;\n if (typeof metadata.modelId === \"string\") return metadata.modelId;\n const custom = metadata.custom as Record<string, unknown> | undefined;\n if (typeof custom?.modelId === \"string\") return custom.modelId;\n return undefined;\n}\n\nfunction buildAiSdkV6Result(\n textParts: string[],\n toolCalls: TelemetryToolCall[],\n totalSteps: number,\n metadata?: Record<string, unknown>,\n stepsData?: { tool_calls: TelemetryToolCall[] }[],\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n },\n): TelemetryData {\n const hasText = textParts.length > 0;\n const outputText = hasText ? truncateStr(textParts.join(\"\")) : undefined;\n const modelId = extractModelId(metadata);\n\n const steps: TelemetryStepData[] | undefined =\n stepsData && stepsData.length > 1\n ? stepsData.map((s) => ({\n ...(s.tool_calls.length > 0\n ? { tool_calls: s.tool_calls }\n : undefined),\n }))\n : undefined;\n\n return {\n status: hasText ? \"completed\" : \"incomplete\",\n ...(toolCalls.length > 0 ? { toolCalls } : undefined),\n ...(totalSteps > 0 ? { totalSteps } : undefined),\n ...(usage?.inputTokens != null\n ? { inputTokens: usage.inputTokens }\n : undefined),\n ...(usage?.outputTokens != null\n ? { outputTokens: usage.outputTokens }\n : undefined),\n ...(usage?.reasoningTokens != null\n ? { reasoningTokens: usage.reasoningTokens }\n : undefined),\n ...(usage?.cachedInputTokens != null\n ? { cachedInputTokens: usage.cachedInputTokens }\n : undefined),\n ...(outputText != null ? { outputText } : undefined),\n ...(metadata ? { metadata } : undefined),\n ...(steps ? { steps } : undefined),\n ...(modelId ? { modelId } : undefined),\n };\n}\n\ntype UsageFields = {\n inputTokens?: number;\n outputTokens?: number;\n promptTokens?: number;\n completionTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n};\n\nfunction normalizeUsage(u: UsageFields):\n | {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n }\n | undefined {\n const input = u.inputTokens ?? u.promptTokens;\n const output = u.outputTokens ?? u.completionTokens;\n if (\n input == null &&\n output == null &&\n u.reasoningTokens == null &&\n u.cachedInputTokens == null\n ) {\n return undefined;\n }\n\n return {\n ...(input != null ? { inputTokens: input } : undefined),\n ...(output != null ? { outputTokens: output } : undefined),\n ...(u.reasoningTokens != null\n ? { reasoningTokens: u.reasoningTokens }\n : undefined),\n ...(u.cachedInputTokens != null\n ? { cachedInputTokens: u.cachedInputTokens }\n : undefined),\n };\n}\n\nfunction extractAiSdkV6Usage(metadata?: Record<string, unknown>):\n | {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n }\n | undefined {\n // Try top-level metadata.usage\n const usage = metadata?.usage as UsageFields | undefined;\n if (usage) {\n const normalized = normalizeUsage(usage);\n if (normalized) return normalized;\n }\n\n // Try aggregating from metadata.steps[].usage\n const steps = metadata?.steps as\n | readonly { usage?: UsageFields }[]\n | undefined;\n if (steps && steps.length > 0) {\n let inputTokens = 0;\n let outputTokens = 0;\n let reasoningTokens = 0;\n let cachedInputTokens = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n let hasAny = false;\n for (const s of steps) {\n if (!s.usage) continue;\n const n = normalizeUsage(s.usage);\n if (n) {\n if (n.inputTokens != null) {\n inputTokens += n.inputTokens;\n hasInput = true;\n }\n if (n.outputTokens != null) {\n outputTokens += n.outputTokens;\n hasOutput = true;\n }\n if (n.reasoningTokens != null) {\n reasoningTokens += n.reasoningTokens;\n hasReasoning = true;\n }\n if (n.cachedInputTokens != null) {\n cachedInputTokens += n.cachedInputTokens;\n hasCachedInput = true;\n }\n hasAny = true;\n }\n }\n if (hasAny) {\n return {\n ...(hasInput ? { inputTokens } : undefined),\n ...(hasOutput ? { outputTokens } : undefined),\n ...(hasReasoning ? { reasoningTokens } : undefined),\n ...(hasCachedInput ? { cachedInputTokens } : undefined),\n };\n }\n }\n\n return undefined;\n}\n\nfunction extractAiSdkV6<T>(content: T): TelemetryData | null {\n const msg = content as AiSdkV6Message;\n if (msg.role !== \"assistant\") return null;\n\n const { textParts, toolCalls, stepsData } = collectAiSdkV6Parts(\n msg.parts ?? [],\n );\n return buildAiSdkV6Result(\n textParts,\n toolCalls,\n stepsData.length,\n msg.metadata,\n stepsData,\n extractAiSdkV6Usage(msg.metadata),\n );\n}\n\nfunction aggregateAiSdkV6RunSteps<T>(stepMessages: T[]): TelemetryData | null {\n const allTextParts: string[] = [];\n const allToolCalls: TelemetryToolCall[] = [];\n const allStepsData: { tool_calls: TelemetryToolCall[] }[] = [];\n let hasAssistant = false;\n let metadata: Record<string, unknown> | undefined;\n let inputTokens = 0;\n let outputTokens = 0;\n let reasoningTokens = 0;\n let cachedInputTokens = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n\n for (const content of stepMessages) {\n const msg = content as AiSdkV6Message;\n if (msg.role !== \"assistant\") continue;\n hasAssistant = true;\n\n const { textParts, toolCalls, stepsData } = collectAiSdkV6Parts(\n msg.parts ?? [],\n );\n allTextParts.push(...textParts);\n allToolCalls.push(...toolCalls);\n allStepsData.push(...stepsData);\n if (msg.metadata) metadata = msg.metadata;\n\n const usage = extractAiSdkV6Usage(msg.metadata);\n if (usage) {\n if (usage.inputTokens != null) {\n inputTokens += usage.inputTokens;\n hasInput = true;\n }\n if (usage.outputTokens != null) {\n outputTokens += usage.outputTokens;\n hasOutput = true;\n }\n if (usage.reasoningTokens != null) {\n reasoningTokens += usage.reasoningTokens;\n hasReasoning = true;\n }\n if (usage.cachedInputTokens != null) {\n cachedInputTokens += usage.cachedInputTokens;\n hasCachedInput = true;\n }\n }\n }\n\n if (!hasAssistant) return null;\n return buildAiSdkV6Result(\n allTextParts,\n allToolCalls,\n allStepsData.length,\n metadata,\n allStepsData,\n {\n ...(hasInput ? { inputTokens } : undefined),\n ...(hasOutput ? { outputTokens } : undefined),\n ...(hasReasoning ? { reasoningTokens } : undefined),\n ...(hasCachedInput ? { cachedInputTokens } : undefined),\n },\n );\n}\n\nexport function useAssistantCloudThreadHistoryAdapter(\n cloudRef: RefObject<AssistantCloud>,\n): ThreadHistoryAdapter {\n const aui = useAui();\n const [adapter] = useState(\n () => new AssistantCloudThreadHistoryAdapter(cloudRef, aui),\n );\n return adapter;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AssistantCloudThreadHistoryAdapter.js","names":["RefObject","useEffect","useRef","useState","GenericThreadHistoryAdapter","ThreadHistoryAdapter","MessageFormatAdapter","MessageFormatItem","MessageFormatRepository","ExportedMessageRepositoryItem","AssistantCloud","CloudMessagePersistence","createFormattedPersistence","auiV0Decode","auiV0Encode","AssistantClient","getClientId","useAui","globalPersistence","WeakMap","ClientId","AssistantCloudThreadHistoryAdapter","cloudRef","auiRef","constructor","aui","current","_persistence","key","threadListItem","has","set","get","withFormat","Record","formatAdapter","TMessage","TStorageFormat","adapter","formatted","append","item","remoteId","initialize","update","localMessageId","getState","delete","Error","reportTelemetry","items","options","durationMs","stepTimestamps","StepTimestamp","encodedRunMessages","map","encode","_reportRunTelemetry","format","load","Promise","messages","parentId","message","encoded","id","telemetry","enabled","_maybeReportRun","isPersisted","filter","m","reverse","runMessages","T","extracted","extractRunTelemetry","_sendReport","content","extractTelemetry","data","TelemetryData","mergedSteps","mergeStepTimestamps","steps","initial","Parameters","this","runs","report","thread_id","status","totalSteps","total_steps","undefined","toolCalls","tool_calls","inputTokens","input_tokens","outputTokens","output_tokens","reasoningTokens","reasoning_tokens","cachedInputTokens","cached_input_tokens","duration_ms","outputText","output_text","metadata","modelId","model_id","beforeReport","catch","MAX_SPAN_CONTENT","truncateStr","value","length","slice","safeStringify","JSON","stringify","TelemetryToolCall","tool_name","tool_call_id","tool_args","tool_result","tool_source","BASE64_PATTERN","summarizeMcpResult","parsed","parse","Array","isArray","summarized","type","test","sizeKB","toFixed","buildToolCall","toolName","toolCallId","args","result","argsText","toolSource","call","toolArgs","toolResult","TelemetryStepData","start_ms","end_ms","timestamps","t","len","Math","min","s","i","extractAuiV0","extractAiSdkV6","aggregateAiSdkV6RunSteps","AUI_STATUS_MAP","error","incomplete","msg","role","text","usage","custom","p","textParts","join","totalInput","totalOutput","totalReasoning","totalCachedInput","hasInput","hasOutput","hasReasoning","hasCachedInput","step","statusType","telemetrySteps","AiSdkV6Part","input","output","AiSdkV6Message","parts","isToolCallPart","startsWith","isDynamicToolPart","partToToolCall","collectAiSdkV6Parts","stepsData","currentStepToolCalls","push","tc","extractModelId","buildAiSdkV6Result","hasText","UsageFields","promptTokens","completionTokens","normalizeUsage","u","extractAiSdkV6Usage","normalized","hasAny","n","stepMessages","allTextParts","allToolCalls","allStepsData","hasAssistant","useAssistantCloudThreadHistoryAdapter","$","_c","t0","t1"],"sources":["../../../../src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts"],"sourcesContent":["import { type RefObject, useEffect, useRef, useState } from \"react\";\nimport type {\n GenericThreadHistoryAdapter,\n ThreadHistoryAdapter,\n MessageFormatAdapter,\n MessageFormatItem,\n MessageFormatRepository,\n} from \"../../../adapters/thread-history\";\nimport type { ExportedMessageRepositoryItem } from \"../../../runtime/utils/message-repository\";\nimport {\n type AssistantCloud,\n CloudMessagePersistence,\n createFormattedPersistence,\n} from \"assistant-cloud\";\nimport { auiV0Decode, auiV0Encode } from \"./auiV0\";\nimport { type AssistantClient, getClientId, useAui } from \"@assistant-ui/store\";\n\nconst globalPersistence = new WeakMap<\n getClientId.ClientId,\n CloudMessagePersistence\n>();\n\nclass AssistantCloudThreadHistoryAdapter implements ThreadHistoryAdapter {\n private cloudRef: RefObject<AssistantCloud>;\n private auiRef: RefObject<AssistantClient>;\n\n constructor(\n cloudRef: RefObject<AssistantCloud>,\n auiRef: RefObject<AssistantClient>,\n ) {\n this.cloudRef = cloudRef;\n this.auiRef = auiRef;\n }\n\n private get aui(): AssistantClient {\n return this.auiRef.current;\n }\n\n private get _persistence(): CloudMessagePersistence {\n const key = getClientId(this.aui.threadListItem);\n if (!globalPersistence.has(key)) {\n globalPersistence.set(\n key,\n new CloudMessagePersistence(() => this.cloudRef.current),\n );\n }\n return globalPersistence.get(key)!;\n }\n\n withFormat<TMessage, TStorageFormat extends Record<string, unknown>>(\n formatAdapter: MessageFormatAdapter<TMessage, TStorageFormat>,\n ): GenericThreadHistoryAdapter<TMessage> {\n const adapter = this;\n const formatted = createFormattedPersistence(\n this._persistence,\n formatAdapter,\n );\n return {\n // Note: callers must also call reportTelemetry() for run tracking\n async append(item: MessageFormatItem<TMessage>) {\n const { remoteId } = await adapter.aui.threadListItem.initialize();\n await formatted.append(remoteId, item);\n },\n async update(item: MessageFormatItem<TMessage>, localMessageId: string) {\n const remoteId = adapter.aui.threadListItem.getState().remoteId;\n if (!remoteId) return;\n await formatted.update?.(remoteId, item, localMessageId);\n },\n async delete() {\n throw new Error(\n \"Assistant Cloud does not support deleting thread messages yet.\",\n );\n },\n reportTelemetry(\n items: MessageFormatItem<TMessage>[],\n options?: {\n durationMs?: number;\n stepTimestamps?: StepTimestamp[];\n },\n ) {\n const encodedRunMessages = items.map((item) =>\n formatAdapter.encode(item),\n );\n adapter._reportRunTelemetry(\n formatAdapter.format,\n encodedRunMessages,\n options,\n );\n },\n async load(): Promise<MessageFormatRepository<TMessage>> {\n const remoteId = adapter.aui.threadListItem.getState().remoteId;\n if (!remoteId) return { messages: [] };\n return formatted.load(remoteId);\n },\n };\n }\n\n async append({ parentId, message }: ExportedMessageRepositoryItem) {\n const { remoteId } = await this.aui.threadListItem.initialize();\n const encoded = auiV0Encode(message);\n await this._persistence.append(\n remoteId,\n message.id,\n parentId,\n \"aui/v0\",\n encoded,\n );\n\n if (this.cloudRef.current.telemetry.enabled) {\n this._maybeReportRun(remoteId, \"aui/v0\", encoded);\n }\n }\n\n async update(item: ExportedMessageRepositoryItem) {\n if (!this._persistence.isPersisted(item.message.id)) {\n return this.append(item);\n }\n const { message } = item;\n const remoteId = this.aui.threadListItem.getState().remoteId;\n if (!remoteId) return;\n const encoded = auiV0Encode(message);\n await this._persistence.update(remoteId, message.id, \"aui/v0\", encoded);\n\n if (this.cloudRef.current.telemetry.enabled) {\n this._maybeReportRun(remoteId, \"aui/v0\", encoded);\n }\n }\n\n async delete() {\n throw new Error(\n \"Assistant Cloud does not support deleting thread messages yet.\",\n );\n }\n\n async load() {\n const remoteId = this.aui.threadListItem.getState().remoteId;\n if (!remoteId) return { messages: [] };\n const messages = await this._persistence.load(remoteId, \"aui/v0\");\n return {\n messages: messages\n .filter(\n (m): m is typeof m & { format: \"aui/v0\" } => m.format === \"aui/v0\",\n )\n .map(auiV0Decode)\n .reverse(),\n };\n }\n\n private _reportRunTelemetry<T>(\n format: string,\n runMessages: T[],\n options?: {\n durationMs?: number;\n stepTimestamps?: StepTimestamp[];\n },\n ) {\n if (!this.cloudRef.current.telemetry.enabled) return;\n\n const remoteId = this.aui.threadListItem.getState().remoteId;\n if (!remoteId) return;\n\n const extracted = extractRunTelemetry(format, runMessages);\n if (!extracted) return;\n\n this._sendReport(\n remoteId,\n extracted,\n options?.durationMs,\n options?.stepTimestamps,\n );\n }\n\n private _maybeReportRun<T>(remoteId: string, format: string, content: T) {\n const extracted = extractTelemetry(format, content);\n if (!extracted) return;\n\n this._sendReport(remoteId, extracted);\n }\n\n private _sendReport(\n remoteId: string,\n data: TelemetryData,\n durationMs?: number,\n stepTimestamps?: StepTimestamp[],\n ) {\n const mergedSteps = mergeStepTimestamps(data.steps, stepTimestamps);\n // Keep in sync with assistant-cloud createRunSchema\n // (apps/aui-cloud-api/src/endpoints/runs/create.ts).\n const initial: Parameters<typeof this.cloudRef.current.runs.report>[0] = {\n thread_id: remoteId,\n status: data.status,\n ...(data.totalSteps != null\n ? { total_steps: data.totalSteps }\n : undefined),\n ...(data.toolCalls ? { tool_calls: data.toolCalls } : undefined),\n ...(mergedSteps ? { steps: mergedSteps } : undefined),\n ...(data.inputTokens != null\n ? { input_tokens: data.inputTokens }\n : undefined),\n ...(data.outputTokens != null\n ? { output_tokens: data.outputTokens }\n : undefined),\n ...(data.reasoningTokens != null\n ? { reasoning_tokens: data.reasoningTokens }\n : undefined),\n ...(data.cachedInputTokens != null\n ? { cached_input_tokens: data.cachedInputTokens }\n : undefined),\n ...(durationMs != null ? { duration_ms: durationMs } : undefined),\n ...(data.outputText != null\n ? { output_text: data.outputText }\n : undefined),\n ...(data.metadata ? { metadata: data.metadata } : undefined),\n ...(data.modelId ? { model_id: data.modelId } : undefined),\n };\n\n const { beforeReport } = this.cloudRef.current.telemetry;\n const report = beforeReport ? beforeReport(initial) : initial;\n if (!report) return;\n\n this.cloudRef.current.runs.report(report).catch(() => {});\n }\n}\n\nconst MAX_SPAN_CONTENT = 50_000;\n\nfunction truncateStr(value: string): string {\n if (value.length <= MAX_SPAN_CONTENT) return value;\n return value.slice(0, MAX_SPAN_CONTENT);\n}\n\nfunction safeStringify(value: unknown): string | undefined {\n if (value == null) return undefined;\n try {\n return truncateStr(JSON.stringify(value));\n } catch {\n return undefined;\n }\n}\n\ntype TelemetryToolCall = {\n tool_name: string;\n tool_call_id: string;\n tool_args?: string;\n tool_result?: string;\n tool_source?: \"mcp\" | \"frontend\" | \"backend\";\n};\n\nconst BASE64_PATTERN = /^[A-Za-z0-9+/]{100,}={0,2}$/;\n\nfunction summarizeMcpResult(value: unknown): string | undefined {\n if (value == null) return undefined;\n try {\n const parsed = typeof value === \"string\" ? JSON.parse(value) : value;\n if (Array.isArray(parsed)) {\n const summarized = parsed.map((item) => {\n if (item && typeof item === \"object\" && item.type) {\n if (\n (item.type === \"image\" || item.type === \"audio\") &&\n typeof item.data === \"string\" &&\n BASE64_PATTERN.test(item.data.slice(0, 200))\n ) {\n const sizeKB = ((item.data.length * 3) / 4 / 1024).toFixed(1);\n return { ...item, data: `[${item.type}: ${sizeKB}KB]` };\n }\n }\n return item;\n });\n return truncateStr(JSON.stringify(summarized));\n }\n } catch {\n // not JSON array, fall through\n }\n return safeStringify(value);\n}\n\nfunction buildToolCall(\n toolName: string,\n toolCallId: string,\n args: unknown,\n result: unknown,\n argsText?: string,\n toolSource?: \"mcp\" | \"frontend\" | \"backend\",\n): TelemetryToolCall {\n const call: TelemetryToolCall = {\n tool_name: toolName,\n tool_call_id: toolCallId,\n };\n const toolArgs = argsText ?? safeStringify(args);\n if (toolArgs !== undefined) call.tool_args = toolArgs;\n const toolResult =\n toolSource === \"mcp\" ? summarizeMcpResult(result) : safeStringify(result);\n if (toolResult !== undefined) call.tool_result = toolResult;\n if (toolSource) call.tool_source = toolSource;\n return call;\n}\n\ntype TelemetryStepData = {\n input_tokens?: number;\n output_tokens?: number;\n reasoning_tokens?: number;\n cached_input_tokens?: number;\n tool_calls?: TelemetryToolCall[];\n start_ms?: number;\n end_ms?: number;\n};\n\ntype StepTimestamp = { start_ms: number; end_ms: number };\n\nfunction mergeStepTimestamps(\n steps: TelemetryStepData[] | undefined,\n timestamps: StepTimestamp[] | undefined,\n): TelemetryStepData[] | undefined {\n if (!timestamps) return steps;\n if (!steps) return timestamps.map((t) => ({ ...t }));\n\n const len = Math.min(steps.length, timestamps.length);\n return steps.map((s, i) => ({\n ...s,\n ...(i < len ? timestamps[i] : undefined),\n }));\n}\n\ntype TelemetryData = {\n status: \"completed\" | \"incomplete\" | \"error\";\n toolCalls?: TelemetryToolCall[];\n totalSteps?: number;\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n outputText?: string;\n metadata?: Record<string, unknown>;\n steps?: TelemetryStepData[];\n modelId?: string;\n};\n\nfunction extractTelemetry<T>(format: string, content: T): TelemetryData | null {\n switch (format) {\n case \"aui/v0\":\n return extractAuiV0(content);\n case \"ai-sdk/v6\":\n return extractAiSdkV6(content);\n default:\n return null;\n }\n}\n\nfunction extractRunTelemetry<T>(\n format: string,\n runMessages: T[],\n): TelemetryData | null {\n if (format === \"ai-sdk/v6\") {\n return aggregateAiSdkV6RunSteps(runMessages);\n }\n for (let i = runMessages.length - 1; i >= 0; i--) {\n const result = extractTelemetry(format, runMessages[i]!);\n if (result) return result;\n }\n return null;\n}\n\nconst AUI_STATUS_MAP: Record<string, TelemetryData[\"status\"]> = {\n error: \"error\",\n incomplete: \"incomplete\",\n};\n\nexport function extractAuiV0<T>(content: T): TelemetryData | null {\n const msg = content as {\n role?: string;\n status?: { type: string };\n content?: readonly {\n type: string;\n text?: string;\n toolName?: string;\n toolCallId?: string;\n args?: unknown;\n argsText?: string;\n result?: unknown;\n }[];\n metadata?: {\n modelId?: string;\n steps?: readonly {\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n };\n }[];\n custom?: Record<string, unknown> & { modelId?: string };\n };\n };\n\n if (msg.role !== \"assistant\") return null;\n // A paused (requires-action) write is not a finished run; reporting it would\n // mislabel it \"completed\" and double-count steps once the terminal write reports.\n if (msg.status?.type === \"requires-action\") return null;\n\n const toolCalls = msg.content\n ?.filter((p) => p.type === \"tool-call\" && p.toolName && p.toolCallId)\n .map((p) =>\n buildToolCall(p.toolName!, p.toolCallId!, p.args, p.result, p.argsText),\n );\n\n const textParts = msg.content?.filter((p) => p.type === \"text\" && p.text);\n const outputText =\n textParts && textParts.length > 0\n ? truncateStr(textParts.map((p) => p.text).join(\"\"))\n : undefined;\n\n const steps = msg.metadata?.steps;\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let reasoningTokens: number | undefined;\n let cachedInputTokens: number | undefined;\n if (steps && steps.length > 0) {\n let totalInput = 0;\n let totalOutput = 0;\n let totalReasoning = 0;\n let totalCachedInput = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n for (const step of steps) {\n if (step.usage?.inputTokens != null) {\n totalInput += step.usage.inputTokens;\n hasInput = true;\n }\n if (step.usage?.outputTokens != null) {\n totalOutput += step.usage.outputTokens;\n hasOutput = true;\n }\n if (step.usage?.reasoningTokens != null) {\n totalReasoning += step.usage.reasoningTokens;\n hasReasoning = true;\n }\n if (step.usage?.cachedInputTokens != null) {\n totalCachedInput += step.usage.cachedInputTokens;\n hasCachedInput = true;\n }\n }\n inputTokens = hasInput ? totalInput : undefined;\n outputTokens = hasOutput ? totalOutput : undefined;\n reasoningTokens = hasReasoning ? totalReasoning : undefined;\n cachedInputTokens = hasCachedInput ? totalCachedInput : undefined;\n }\n\n const statusType = msg.status?.type;\n const status: TelemetryData[\"status\"] =\n (statusType && AUI_STATUS_MAP[statusType]) || \"completed\";\n\n const metadata = msg.metadata?.custom as Record<string, unknown> | undefined;\n const modelId =\n msg.metadata?.modelId ??\n (typeof msg.metadata?.custom?.modelId === \"string\"\n ? msg.metadata.custom.modelId\n : undefined);\n\n const telemetrySteps: TelemetryStepData[] | undefined =\n steps && steps.length > 1\n ? steps.map((s) => ({\n ...(s.usage?.inputTokens != null\n ? { input_tokens: s.usage.inputTokens }\n : undefined),\n ...(s.usage?.outputTokens != null\n ? { output_tokens: s.usage.outputTokens }\n : undefined),\n ...(s.usage?.reasoningTokens != null\n ? { reasoning_tokens: s.usage.reasoningTokens }\n : undefined),\n ...(s.usage?.cachedInputTokens != null\n ? { cached_input_tokens: s.usage.cachedInputTokens }\n : undefined),\n }))\n : undefined;\n\n return {\n status,\n ...(toolCalls && toolCalls.length > 0 ? { toolCalls } : undefined),\n ...(steps?.length ? { totalSteps: steps.length } : undefined),\n ...(inputTokens != null ? { inputTokens } : undefined),\n ...(outputTokens != null ? { outputTokens } : undefined),\n ...(reasoningTokens != null ? { reasoningTokens } : undefined),\n ...(cachedInputTokens != null ? { cachedInputTokens } : undefined),\n ...(outputText != null ? { outputText } : undefined),\n ...(metadata ? { metadata } : undefined),\n ...(telemetrySteps ? { steps: telemetrySteps } : undefined),\n ...(modelId ? { modelId } : undefined),\n };\n}\n\ntype AiSdkV6Part = {\n type: string;\n text?: string;\n toolName?: string;\n toolCallId?: string;\n args?: unknown;\n result?: unknown;\n input?: unknown;\n output?: unknown;\n};\n\ntype AiSdkV6Message = {\n role?: string;\n parts?: readonly AiSdkV6Part[];\n metadata?: Record<string, unknown>;\n};\n\nfunction isToolCallPart(p: AiSdkV6Part): boolean {\n if (!p.toolCallId) return false;\n if (p.type === \"tool-call\" || p.type === \"dynamic-tool\") return !!p.toolName;\n return p.type.startsWith(\"tool-\") || p.type.startsWith(\"dynamic-tool-\");\n}\n\nfunction isDynamicToolPart(p: AiSdkV6Part): boolean {\n return p.type === \"dynamic-tool\" || p.type.startsWith(\"dynamic-tool-\");\n}\n\nfunction partToToolCall(p: AiSdkV6Part): TelemetryToolCall {\n const toolSource: \"mcp\" | undefined = isDynamicToolPart(p)\n ? \"mcp\"\n : undefined;\n return buildToolCall(\n p.toolName ?? p.type.slice(5),\n p.toolCallId!,\n p.args ?? p.input,\n p.result ?? p.output,\n undefined,\n toolSource,\n );\n}\n\nfunction collectAiSdkV6Parts(parts: readonly AiSdkV6Part[]): {\n textParts: string[];\n toolCalls: TelemetryToolCall[];\n stepsData: { tool_calls: TelemetryToolCall[] }[];\n} {\n const textParts: string[] = [];\n const toolCalls: TelemetryToolCall[] = [];\n const stepsData: { tool_calls: TelemetryToolCall[] }[] = [];\n let currentStepToolCalls: TelemetryToolCall[] | null = null;\n\n for (const p of parts) {\n if (p.type === \"step-start\") {\n if (currentStepToolCalls !== null) {\n stepsData.push({ tool_calls: currentStepToolCalls });\n }\n currentStepToolCalls = [];\n } else if (p.type === \"text\" && p.text) {\n textParts.push(p.text);\n } else if (isToolCallPart(p)) {\n const tc = partToToolCall(p);\n toolCalls.push(tc);\n if (currentStepToolCalls !== null) {\n currentStepToolCalls.push(tc);\n }\n }\n }\n\n if (currentStepToolCalls !== null) {\n stepsData.push({ tool_calls: currentStepToolCalls });\n }\n\n return { textParts, toolCalls, stepsData };\n}\n\nfunction extractModelId(\n metadata?: Record<string, unknown>,\n): string | undefined {\n if (!metadata) return undefined;\n if (typeof metadata.modelId === \"string\") return metadata.modelId;\n const custom = metadata.custom as Record<string, unknown> | undefined;\n if (typeof custom?.modelId === \"string\") return custom.modelId;\n return undefined;\n}\n\nfunction buildAiSdkV6Result(\n textParts: string[],\n toolCalls: TelemetryToolCall[],\n totalSteps: number,\n metadata?: Record<string, unknown>,\n stepsData?: { tool_calls: TelemetryToolCall[] }[],\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n },\n): TelemetryData {\n const hasText = textParts.length > 0;\n const outputText = hasText ? truncateStr(textParts.join(\"\")) : undefined;\n const modelId = extractModelId(metadata);\n\n const steps: TelemetryStepData[] | undefined =\n stepsData && stepsData.length > 1\n ? stepsData.map((s) => ({\n ...(s.tool_calls.length > 0\n ? { tool_calls: s.tool_calls }\n : undefined),\n }))\n : undefined;\n\n return {\n status: hasText ? \"completed\" : \"incomplete\",\n ...(toolCalls.length > 0 ? { toolCalls } : undefined),\n ...(totalSteps > 0 ? { totalSteps } : undefined),\n ...(usage?.inputTokens != null\n ? { inputTokens: usage.inputTokens }\n : undefined),\n ...(usage?.outputTokens != null\n ? { outputTokens: usage.outputTokens }\n : undefined),\n ...(usage?.reasoningTokens != null\n ? { reasoningTokens: usage.reasoningTokens }\n : undefined),\n ...(usage?.cachedInputTokens != null\n ? { cachedInputTokens: usage.cachedInputTokens }\n : undefined),\n ...(outputText != null ? { outputText } : undefined),\n ...(metadata ? { metadata } : undefined),\n ...(steps ? { steps } : undefined),\n ...(modelId ? { modelId } : undefined),\n };\n}\n\ntype UsageFields = {\n inputTokens?: number;\n outputTokens?: number;\n promptTokens?: number;\n completionTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n};\n\nfunction normalizeUsage(u: UsageFields):\n | {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n }\n | undefined {\n const input = u.inputTokens ?? u.promptTokens;\n const output = u.outputTokens ?? u.completionTokens;\n if (\n input == null &&\n output == null &&\n u.reasoningTokens == null &&\n u.cachedInputTokens == null\n ) {\n return undefined;\n }\n\n return {\n ...(input != null ? { inputTokens: input } : undefined),\n ...(output != null ? { outputTokens: output } : undefined),\n ...(u.reasoningTokens != null\n ? { reasoningTokens: u.reasoningTokens }\n : undefined),\n ...(u.cachedInputTokens != null\n ? { cachedInputTokens: u.cachedInputTokens }\n : undefined),\n };\n}\n\nfunction extractAiSdkV6Usage(metadata?: Record<string, unknown>):\n | {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n }\n | undefined {\n // Try top-level metadata.usage\n const usage = metadata?.usage as UsageFields | undefined;\n if (usage) {\n const normalized = normalizeUsage(usage);\n if (normalized) return normalized;\n }\n\n // Try aggregating from metadata.steps[].usage\n const steps = metadata?.steps as\n | readonly { usage?: UsageFields }[]\n | undefined;\n if (steps && steps.length > 0) {\n let inputTokens = 0;\n let outputTokens = 0;\n let reasoningTokens = 0;\n let cachedInputTokens = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n let hasAny = false;\n for (const s of steps) {\n if (!s.usage) continue;\n const n = normalizeUsage(s.usage);\n if (n) {\n if (n.inputTokens != null) {\n inputTokens += n.inputTokens;\n hasInput = true;\n }\n if (n.outputTokens != null) {\n outputTokens += n.outputTokens;\n hasOutput = true;\n }\n if (n.reasoningTokens != null) {\n reasoningTokens += n.reasoningTokens;\n hasReasoning = true;\n }\n if (n.cachedInputTokens != null) {\n cachedInputTokens += n.cachedInputTokens;\n hasCachedInput = true;\n }\n hasAny = true;\n }\n }\n if (hasAny) {\n return {\n ...(hasInput ? { inputTokens } : undefined),\n ...(hasOutput ? { outputTokens } : undefined),\n ...(hasReasoning ? { reasoningTokens } : undefined),\n ...(hasCachedInput ? { cachedInputTokens } : undefined),\n };\n }\n }\n\n return undefined;\n}\n\nfunction extractAiSdkV6<T>(content: T): TelemetryData | null {\n const msg = content as AiSdkV6Message;\n if (msg.role !== \"assistant\") return null;\n\n const { textParts, toolCalls, stepsData } = collectAiSdkV6Parts(\n msg.parts ?? [],\n );\n return buildAiSdkV6Result(\n textParts,\n toolCalls,\n stepsData.length,\n msg.metadata,\n stepsData,\n extractAiSdkV6Usage(msg.metadata),\n );\n}\n\nfunction aggregateAiSdkV6RunSteps<T>(stepMessages: T[]): TelemetryData | null {\n const allTextParts: string[] = [];\n const allToolCalls: TelemetryToolCall[] = [];\n const allStepsData: { tool_calls: TelemetryToolCall[] }[] = [];\n let hasAssistant = false;\n let metadata: Record<string, unknown> | undefined;\n let inputTokens = 0;\n let outputTokens = 0;\n let reasoningTokens = 0;\n let cachedInputTokens = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n\n for (const content of stepMessages) {\n const msg = content as AiSdkV6Message;\n if (msg.role !== \"assistant\") continue;\n hasAssistant = true;\n\n const { textParts, toolCalls, stepsData } = collectAiSdkV6Parts(\n msg.parts ?? [],\n );\n allTextParts.push(...textParts);\n allToolCalls.push(...toolCalls);\n allStepsData.push(...stepsData);\n if (msg.metadata) metadata = msg.metadata;\n\n const usage = extractAiSdkV6Usage(msg.metadata);\n if (usage) {\n if (usage.inputTokens != null) {\n inputTokens += usage.inputTokens;\n hasInput = true;\n }\n if (usage.outputTokens != null) {\n outputTokens += usage.outputTokens;\n hasOutput = true;\n }\n if (usage.reasoningTokens != null) {\n reasoningTokens += usage.reasoningTokens;\n hasReasoning = true;\n }\n if (usage.cachedInputTokens != null) {\n cachedInputTokens += usage.cachedInputTokens;\n hasCachedInput = true;\n }\n }\n }\n\n if (!hasAssistant) return null;\n return buildAiSdkV6Result(\n allTextParts,\n allToolCalls,\n allStepsData.length,\n metadata,\n allStepsData,\n {\n ...(hasInput ? { inputTokens } : undefined),\n ...(hasOutput ? { outputTokens } : undefined),\n ...(hasReasoning ? { reasoningTokens } : undefined),\n ...(hasCachedInput ? { cachedInputTokens } : undefined),\n },\n );\n}\n\nexport function useAssistantCloudThreadHistoryAdapter(\n cloudRef: RefObject<AssistantCloud>,\n): ThreadHistoryAdapter {\n const aui = useAui();\n const auiRef = useRef(aui);\n useEffect(() => {\n auiRef.current = aui;\n });\n const [adapter] = useState(\n () => new AssistantCloudThreadHistoryAdapter(cloudRef, auiRef),\n );\n return adapter;\n}\n"],"mappings":";;;;;;AAiBA,MAAMkB,oCAAoB,IAAIC,QAG5B;AAEF,IAAME,qCAAN,MAAyE;CACvE;CACA;CAEAG,YACEF,UACAC,QACA;EACA,KAAKD,WAAWA;EAChB,KAAKC,SAASA;CAChB;CAEA,IAAYE,MAAuB;EACjC,OAAO,KAAKF,OAAOG;CACrB;CAEA,IAAYC,eAAwC;EAClD,MAAMC,MAAMZ,YAAY,KAAKS,IAAII,cAAc;EAC/C,IAAI,CAACX,kBAAkBY,IAAIF,GAAG,GAC5BV,kBAAkBa,IAChBH,KACA,IAAIjB,8BAA8B,KAAKW,SAASI,OAAO,CACzD;EAEF,OAAOR,kBAAkBc,IAAIJ,GAAG;CAClC;CAEAK,WACEE,eACuC;EACvC,MAAMG,UAAU;EAChB,MAAMC,YAAY3B,2BAChB,KAAKe,cACLQ,aACF;EACA,OAAO;GAEL,MAAMK,OAAOC,MAAmC;IAC9C,MAAM,EAAEC,aAAa,MAAMJ,QAAQb,IAAII,eAAec,WAAW;IACjE,MAAMJ,UAAUC,OAAOE,UAAUD,IAAI;GACvC;GACA,MAAMG,OAAOH,MAAmCI,gBAAwB;IACtE,MAAMH,WAAWJ,QAAQb,IAAII,eAAeiB,SAAS,CAAC,CAACJ;IACvD,IAAI,CAACA,UAAU;IACf,MAAMH,UAAUK,SAASF,UAAUD,MAAMI,cAAc;GACzD;GACA,MAAME,SAAS;IACb,MAAM,IAAIC,MACR,gEACF;GACF;GACAC,gBACEC,OACAC,SAIA;IACA,MAAMI,qBAAqBL,MAAMM,KAAKf,SACpCN,cAAcsB,OAAOhB,IAAI,CAC3B;IACAH,QAAQoB,oBACNvB,cAAcwB,QACdJ,oBACAJ,OACF;GACF;GACA,MAAMS,OAAmD;IACvD,MAAMlB,WAAWJ,QAAQb,IAAII,eAAeiB,SAAS,CAAC,CAACJ;IACvD,IAAI,CAACA,UAAU,OAAO,EAAEoB,UAAU,CAAA,EAAG;IACrC,OAAOvB,UAAUqB,KAAKlB,QAAQ;GAChC;EACF;CACF;CAEA,MAAMF,OAAO,EAAEuB,UAAUC,WAA0C;EACjE,MAAM,EAAEtB,aAAa,MAAM,KAAKjB,IAAII,eAAec,WAAW;EAC9D,MAAMsB,UAAUnD,YAAYkD,OAAO;EACnC,MAAM,KAAKrC,aAAaa,OACtBE,UACAsB,QAAQE,IACRH,UACA,UACAE,OACF;EAEA,IAAI,KAAK3C,SAASI,QAAQyC,UAAUC,SAClC,KAAKC,gBAAgB3B,UAAU,UAAUuB,OAAO;CAEpD;CAEA,MAAMrB,OAAOH,MAAqC;EAChD,IAAI,CAAC,KAAKd,aAAa2C,YAAY7B,KAAKuB,QAAQE,EAAE,GAChD,OAAO,KAAK1B,OAAOC,IAAI;EAEzB,MAAM,EAAEuB,YAAYvB;EACpB,MAAMC,WAAW,KAAKjB,IAAII,eAAeiB,SAAS,CAAC,CAACJ;EACpD,IAAI,CAACA,UAAU;EACf,MAAMuB,UAAUnD,YAAYkD,OAAO;EACnC,MAAM,KAAKrC,aAAaiB,OAAOF,UAAUsB,QAAQE,IAAI,UAAUD,OAAO;EAEtE,IAAI,KAAK3C,SAASI,QAAQyC,UAAUC,SAClC,KAAKC,gBAAgB3B,UAAU,UAAUuB,OAAO;CAEpD;CAEA,MAAMlB,SAAS;EACb,MAAM,IAAIC,MACR,gEACF;CACF;CAEA,MAAMY,OAAO;EACX,MAAMlB,WAAW,KAAKjB,IAAII,eAAeiB,SAAS,CAAC,CAACJ;EACpD,IAAI,CAACA,UAAU,OAAO,EAAEoB,UAAU,CAAA,EAAG;EAErC,OAAO,EACLA,WAAUA,MAFW,KAAKnC,aAAaiC,KAAKlB,UAAU,QAAQ,EAAA,CAG3D6B,QACEC,MAA4CA,EAAEb,WAAW,QAC5D,CAAC,CACAH,IAAI3C,WAAW,CAAC,CAChB4D,QAAQ,EACb;CACF;CAEA,oBACEd,QACAe,aACAvB,SAIA;EACA,IAAI,CAAC,KAAK7B,SAASI,QAAQyC,UAAUC,SAAS;EAE9C,MAAM1B,WAAW,KAAKjB,IAAII,eAAeiB,SAAS,CAAC,CAACJ;EACpD,IAAI,CAACA,UAAU;EAEf,MAAMkC,YAAYC,oBAAoBlB,QAAQe,WAAW;EACzD,IAAI,CAACE,WAAW;EAEhB,KAAKE,YACHpC,UACAkC,WACAzB,SAASC,YACTD,SAASE,cACX;CACF;CAEA,gBAA2BX,UAAkBiB,QAAgBoB,SAAY;EACvE,MAAMH,YAAYI,iBAAiBrB,QAAQoB,OAAO;EAClD,IAAI,CAACH,WAAW;EAEhB,KAAKE,YAAYpC,UAAUkC,SAAS;CACtC;CAEA,YACElC,UACAuC,MACA7B,YACAC,gBACA;EACA,MAAM8B,cAAcC,oBAAoBH,KAAKI,OAAOhC,cAAc;EAGlE,MAAMiC,UAAmE;GACvEK,WAAWjD;GACXkD,QAAQX,KAAKW;GACb,GAAIX,KAAKY,cAAc,OACnB,EAAEC,aAAab,KAAKY,WAAW,IAC/BE,KAAAA;GACJ,GAAId,KAAKe,YAAY,EAAEC,YAAYhB,KAAKe,UAAU,IAAID,KAAAA;GACtD,GAAIZ,cAAc,EAAEE,OAAOF,YAAY,IAAIY,KAAAA;GAC3C,GAAId,KAAKiB,eAAe,OACpB,EAAEC,cAAclB,KAAKiB,YAAY,IACjCH,KAAAA;GACJ,GAAId,KAAKmB,gBAAgB,OACrB,EAAEC,eAAepB,KAAKmB,aAAa,IACnCL,KAAAA;GACJ,GAAId,KAAKqB,mBAAmB,OACxB,EAAEC,kBAAkBtB,KAAKqB,gBAAgB,IACzCP,KAAAA;GACJ,GAAId,KAAKuB,qBAAqB,OAC1B,EAAEC,qBAAqBxB,KAAKuB,kBAAkB,IAC9CT,KAAAA;GACJ,GAAI3C,cAAc,OAAO,EAAEsD,aAAatD,WAAW,IAAI2C,KAAAA;GACvD,GAAId,KAAK0B,cAAc,OACnB,EAAEC,aAAa3B,KAAK0B,WAAW,IAC/BZ,KAAAA;GACJ,GAAId,KAAK4B,WAAW,EAAEA,UAAU5B,KAAK4B,SAAS,IAAId,KAAAA;GAClD,GAAId,KAAK6B,UAAU,EAAEC,UAAU9B,KAAK6B,QAAQ,IAAIf,KAAAA;EAClD;EAEA,MAAM,EAAEiB,iBAAiB,KAAK1F,SAASI,QAAQyC;EAC/C,MAAMuB,SAASsB,eAAeA,aAAa1B,OAAO,IAAIA;EACtD,IAAI,CAACI,QAAQ;EAEb,KAAKpE,SAASI,QAAQ+D,KAAKC,OAAOA,MAAM,CAAC,CAACuB,YAAY,CAAC,CAAC;CAC1D;AACF;AAEA,MAAMC,mBAAmB;AAEzB,SAASC,YAAYC,OAAuB;CAC1C,IAAIA,MAAMC,UAAUH,kBAAkB,OAAOE;CAC7C,OAAOA,MAAME,MAAM,GAAGJ,gBAAgB;AACxC;AAEA,SAASK,cAAcH,OAAoC;CACzD,IAAIA,SAAS,MAAM,OAAOrB,KAAAA;CAC1B,IAAI;EACF,OAAOoB,YAAYK,KAAKC,UAAUL,KAAK,CAAC;CAC1C,QAAQ;EACN;CACF;AACF;AAUA,MAAMY,iBAAiB;AAEvB,SAASC,mBAAmBb,OAAoC;CAC9D,IAAIA,SAAS,MAAM,OAAOrB,KAAAA;CAC1B,IAAI;EACF,MAAMmC,SAAS,OAAOd,UAAU,WAAWI,KAAKW,MAAMf,KAAK,IAAIA;EAC/D,IAAIgB,MAAMC,QAAQH,MAAM,GAAG;GACzB,MAAMI,aAAaJ,OAAO1E,KAAKf,SAAS;IACtC,IAAIA,QAAQ,OAAOA,SAAS,YAAYA,KAAK8F,MAExC9F;UAAAA,KAAK8F,SAAS,WAAW9F,KAAK8F,SAAS,YACxC,OAAO9F,KAAKwC,SAAS,YACrB+C,eAAeQ,KAAK/F,KAAKwC,KAAKqC,MAAM,GAAG,GAAG,CAAC,GAC3C;MACA,MAAMmB,UAAWhG,KAAKwC,KAAKoC,SAAS,IAAK,IAAI,KAAA,CAAMqB,QAAQ,CAAC;MAC5D,OAAO;OAAE,GAAGjG;OAAMwC,MAAM,IAAIxC,KAAK8F,KAAI,IAAKE,OAAM;MAAM;KACxD;;IAEF,OAAOhG;GACT,CAAC;GACD,OAAO0E,YAAYK,KAAKC,UAAUa,UAAU,CAAC;EAC/C;CACF,QAAQ,CACN;CAEF,OAAOf,cAAcH,KAAK;AAC5B;AAEA,SAASuB,cACPC,UACAC,YACAC,MACAC,QACAC,UACAC,YACmB;CACnB,MAAMC,OAA0B;EAC9BvB,WAAWiB;EACXhB,cAAciB;CAChB;CACA,MAAMM,WAAWH,YAAYzB,cAAcuB,IAAI;CAC/C,IAAIK,aAAapD,KAAAA,GAAWmD,KAAKrB,YAAYsB;CAC7C,MAAMC,aACJH,eAAe,QAAQhB,mBAAmBc,MAAM,IAAIxB,cAAcwB,MAAM;CAC1E,IAAIK,eAAerD,KAAAA,GAAWmD,KAAKpB,cAAcsB;CACjD,IAAIH,YAAYC,KAAKnB,cAAckB;CACnC,OAAOC;AACT;AAcA,SAAS9D,oBACPC,OACAmE,YACiC;CACjC,IAAI,CAACA,YAAY,OAAOnE;CACxB,IAAI,CAACA,OAAO,OAAOmE,WAAWhG,KAAKiG,OAAO,EAAE,GAAGA,EAAE,EAAE;CAEnD,MAAMC,MAAMC,KAAKC,IAAIvE,MAAMgC,QAAQmC,WAAWnC,MAAM;CACpD,OAAOhC,MAAM7B,KAAKqG,GAAGC,OAAO;EAC1B,GAAGD;EACH,GAAIC,IAAIJ,MAAMF,WAAWM,KAAK/D,KAAAA;CAChC,EAAE;AACJ;AAgBA,SAASf,iBAAoBrB,QAAgBoB,SAAkC;CAC7E,QAAQpB,QAAR;EACE,KAAK,UACH,OAAOoG,aAAahF,OAAO;EAC7B,KAAK,aACH,OAAOiF,eAAejF,OAAO;EAC/B,SACE,OAAO;CACX;AACF;AAEA,SAASF,oBACPlB,QACAe,aACsB;CACtB,IAAIf,WAAW,aACb,OAAOsG,yBAAyBvF,WAAW;CAE7C,KAAK,IAAIoF,IAAIpF,YAAY2C,SAAS,GAAGyC,KAAK,GAAGA,KAAK;EAChD,MAAMf,SAAS/D,iBAAiBrB,QAAQe,YAAYoF,EAAG;EACvD,IAAIf,QAAQ,OAAOA;CACrB;CACA,OAAO;AACT;AAEA,MAAMmB,iBAA0D;CAC9DC,OAAO;CACPC,YAAY;AACd;AAEA,SAAgBL,aAAgBhF,SAAkC;CAChE,MAAMsF,MAAMtF;CA0BZ,IAAIsF,IAAIC,SAAS,aAAa,OAAO;CAGrC,IAAID,IAAIzE,QAAQ2C,SAAS,mBAAmB,OAAO;CAEnD,MAAMvC,YAAYqE,IAAItF,SAClBR,QAAQmG,MAAMA,EAAEnC,SAAS,eAAemC,EAAE9B,YAAY8B,EAAE7B,UAAU,CAAC,CACpErF,KAAKkH,MACJ/B,cAAc+B,EAAE9B,UAAW8B,EAAE7B,YAAa6B,EAAE5B,MAAM4B,EAAE3B,QAAQ2B,EAAE1B,QAAQ,CACxE;CAEF,MAAM2B,YAAYN,IAAItF,SAASR,QAAQmG,MAAMA,EAAEnC,SAAS,UAAUmC,EAAEH,IAAI;CACxE,MAAM5D,aACJgE,aAAaA,UAAUtD,SAAS,IAC5BF,YAAYwD,UAAUnH,KAAKkH,MAAMA,EAAEH,IAAI,CAAC,CAACK,KAAK,EAAE,CAAC,IACjD7E,KAAAA;CAEN,MAAMV,QAAQgF,IAAIxD,UAAUxB;CAC5B,IAAIa;CACJ,IAAIE;CACJ,IAAIE;CACJ,IAAIE;CACJ,IAAInB,SAASA,MAAMgC,SAAS,GAAG;EAC7B,IAAIwD,aAAa;EACjB,IAAIC,cAAc;EAClB,IAAIC,iBAAiB;EACrB,IAAIC,mBAAmB;EACvB,IAAIC,WAAW;EACf,IAAIC,YAAY;EAChB,IAAIC,eAAe;EACnB,IAAIC,iBAAiB;EACrB,KAAK,MAAMC,QAAQhG,OAAO;GACxB,IAAIgG,KAAKb,OAAOtE,eAAe,MAAM;IACnC2E,cAAcQ,KAAKb,MAAMtE;IACzB+E,WAAW;GACb;GACA,IAAII,KAAKb,OAAOpE,gBAAgB,MAAM;IACpC0E,eAAeO,KAAKb,MAAMpE;IAC1B8E,YAAY;GACd;GACA,IAAIG,KAAKb,OAAOlE,mBAAmB,MAAM;IACvCyE,kBAAkBM,KAAKb,MAAMlE;IAC7B6E,eAAe;GACjB;GACA,IAAIE,KAAKb,OAAOhE,qBAAqB,MAAM;IACzCwE,oBAAoBK,KAAKb,MAAMhE;IAC/B4E,iBAAiB;GACnB;EACF;EACAlF,cAAc+E,WAAWJ,aAAa9E,KAAAA;EACtCK,eAAe8E,YAAYJ,cAAc/E,KAAAA;EACzCO,kBAAkB6E,eAAeJ,iBAAiBhF,KAAAA;EAClDS,oBAAoB4E,iBAAiBJ,mBAAmBjF,KAAAA;CAC1D;CAEA,MAAMuF,aAAajB,IAAIzE,QAAQ2C;CAC/B,MAAM3C,SACH0F,cAAcpB,eAAeoB,eAAgB;CAEhD,MAAMzE,WAAWwD,IAAIxD,UAAU4D;CAC/B,MAAM3D,UACJuD,IAAIxD,UAAUC,YACb,OAAOuD,IAAIxD,UAAU4D,QAAQ3D,YAAY,WACtCuD,IAAIxD,SAAS4D,OAAO3D,UACpBf,KAAAA;CAEN,MAAMwF,iBACJlG,SAASA,MAAMgC,SAAS,IACpBhC,MAAM7B,KAAKqG,OAAO;EAChB,GAAIA,EAAEW,OAAOtE,eAAe,OACxB,EAAEC,cAAc0D,EAAEW,MAAMtE,YAAY,IACpCH,KAAAA;EACJ,GAAI8D,EAAEW,OAAOpE,gBAAgB,OACzB,EAAEC,eAAewD,EAAEW,MAAMpE,aAAa,IACtCL,KAAAA;EACJ,GAAI8D,EAAEW,OAAOlE,mBAAmB,OAC5B,EAAEC,kBAAkBsD,EAAEW,MAAMlE,gBAAgB,IAC5CP,KAAAA;EACJ,GAAI8D,EAAEW,OAAOhE,qBAAqB,OAC9B,EAAEC,qBAAqBoD,EAAEW,MAAMhE,kBAAkB,IACjDT,KAAAA;CACN,EAAE,IACFA,KAAAA;CAEN,OAAO;EACLH;EACA,GAAII,aAAaA,UAAUqB,SAAS,IAAI,EAAErB,UAAU,IAAID,KAAAA;EACxD,GAAIV,OAAOgC,SAAS,EAAExB,YAAYR,MAAMgC,OAAO,IAAItB,KAAAA;EACnD,GAAIG,eAAe,OAAO,EAAEA,YAAY,IAAIH,KAAAA;EAC5C,GAAIK,gBAAgB,OAAO,EAAEA,aAAa,IAAIL,KAAAA;EAC9C,GAAIO,mBAAmB,OAAO,EAAEA,gBAAgB,IAAIP,KAAAA;EACpD,GAAIS,qBAAqB,OAAO,EAAEA,kBAAkB,IAAIT,KAAAA;EACxD,GAAIY,cAAc,OAAO,EAAEA,WAAW,IAAIZ,KAAAA;EAC1C,GAAIc,WAAW,EAAEA,SAAS,IAAId,KAAAA;EAC9B,GAAIwF,iBAAiB,EAAElG,OAAOkG,eAAe,IAAIxF,KAAAA;EACjD,GAAIe,UAAU,EAAEA,QAAQ,IAAIf,KAAAA;CAC9B;AACF;AAmBA,SAAS8F,eAAenB,GAAyB;CAC/C,IAAI,CAACA,EAAE7B,YAAY,OAAO;CAC1B,IAAI6B,EAAEnC,SAAS,eAAemC,EAAEnC,SAAS,gBAAgB,OAAO,CAAC,CAACmC,EAAE9B;CACpE,OAAO8B,EAAEnC,KAAKuD,WAAW,OAAO,KAAKpB,EAAEnC,KAAKuD,WAAW,eAAe;AACxE;AAEA,SAASC,kBAAkBrB,GAAyB;CAClD,OAAOA,EAAEnC,SAAS,kBAAkBmC,EAAEnC,KAAKuD,WAAW,eAAe;AACvE;AAEA,SAASE,eAAetB,GAAmC;CACzD,MAAMzB,aAAgC8C,kBAAkBrB,CAAC,IACrD,QACA3E,KAAAA;CACJ,OAAO4C,cACL+B,EAAE9B,YAAY8B,EAAEnC,KAAKjB,MAAM,CAAC,GAC5BoD,EAAE7B,YACF6B,EAAE5B,QAAQ4B,EAAEe,OACZf,EAAE3B,UAAU2B,EAAEgB,QACd3F,KAAAA,GACAkD,UACF;AACF;AAEA,SAASgD,oBAAoBL,OAI3B;CACA,MAAMjB,YAAsB,CAAA;CAC5B,MAAM3E,YAAiC,CAAA;CACvC,MAAMkG,YAAmD,CAAA;CACzD,IAAIC,uBAAmD;CAEvD,KAAK,MAAMzB,KAAKkB,OACd,IAAIlB,EAAEnC,SAAS,cAAc;EAC3B,IAAI4D,yBAAyB,MAC3BD,UAAUE,KAAK,EAAEnG,YAAYkG,qBAAqB,CAAC;EAErDA,uBAAuB,CAAA;CACzB,OAAO,IAAIzB,EAAEnC,SAAS,UAAUmC,EAAEH,MAChCI,UAAUyB,KAAK1B,EAAEH,IAAI;MAChB,IAAIsB,eAAenB,CAAC,GAAG;EAC5B,MAAM2B,KAAKL,eAAetB,CAAC;EAC3B1E,UAAUoG,KAAKC,EAAE;EACjB,IAAIF,yBAAyB,MAC3BA,qBAAqBC,KAAKC,EAAE;CAEhC;CAGF,IAAIF,yBAAyB,MAC3BD,UAAUE,KAAK,EAAEnG,YAAYkG,qBAAqB,CAAC;CAGrD,OAAO;EAAExB;EAAW3E;EAAWkG;CAAU;AAC3C;AAEA,SAASI,eACPzF,UACoB;CACpB,IAAI,CAACA,UAAU,OAAOd,KAAAA;CACtB,IAAI,OAAOc,SAASC,YAAY,UAAU,OAAOD,SAASC;CAC1D,MAAM2D,SAAS5D,SAAS4D;CACxB,IAAI,OAAOA,QAAQ3D,YAAY,UAAU,OAAO2D,OAAO3D;AAEzD;AAEA,SAASyF,mBACP5B,WACA3E,WACAH,YACAgB,UACAqF,WACA1B,OAMe;CACf,MAAMgC,UAAU7B,UAAUtD,SAAS;CACnC,MAAMV,aAAa6F,UAAUrF,YAAYwD,UAAUC,KAAK,EAAE,CAAC,IAAI7E,KAAAA;CAC/D,MAAMe,UAAUwF,eAAezF,QAAQ;CAEvC,MAAMxB,QACJ6G,aAAaA,UAAU7E,SAAS,IAC5B6E,UAAU1I,KAAKqG,OAAO,EACpB,GAAIA,EAAE5D,WAAWoB,SAAS,IACtB,EAAEpB,YAAY4D,EAAE5D,WAAW,IAC3BF,KAAAA,EACN,EAAE,IACFA,KAAAA;CAEN,OAAO;EACLH,QAAQ4G,UAAU,cAAc;EAChC,GAAIxG,UAAUqB,SAAS,IAAI,EAAErB,UAAU,IAAID,KAAAA;EAC3C,GAAIF,aAAa,IAAI,EAAEA,WAAW,IAAIE,KAAAA;EACtC,GAAIyE,OAAOtE,eAAe,OACtB,EAAEA,aAAasE,MAAMtE,YAAY,IACjCH,KAAAA;EACJ,GAAIyE,OAAOpE,gBAAgB,OACvB,EAAEA,cAAcoE,MAAMpE,aAAa,IACnCL,KAAAA;EACJ,GAAIyE,OAAOlE,mBAAmB,OAC1B,EAAEA,iBAAiBkE,MAAMlE,gBAAgB,IACzCP,KAAAA;EACJ,GAAIyE,OAAOhE,qBAAqB,OAC5B,EAAEA,mBAAmBgE,MAAMhE,kBAAkB,IAC7CT,KAAAA;EACJ,GAAIY,cAAc,OAAO,EAAEA,WAAW,IAAIZ,KAAAA;EAC1C,GAAIc,WAAW,EAAEA,SAAS,IAAId,KAAAA;EAC9B,GAAIV,QAAQ,EAAEA,MAAM,IAAIU,KAAAA;EACxB,GAAIe,UAAU,EAAEA,QAAQ,IAAIf,KAAAA;CAC9B;AACF;AAWA,SAAS6G,eAAeC,GAOV;CACZ,MAAMpB,QAAQoB,EAAE3G,eAAe2G,EAAEH;CACjC,MAAMhB,SAASmB,EAAEzG,gBAAgByG,EAAEF;CACnC,IACElB,SAAS,QACTC,UAAU,QACVmB,EAAEvG,mBAAmB,QACrBuG,EAAErG,qBAAqB,MAEvB;CAGF,OAAO;EACL,GAAIiF,SAAS,OAAO,EAAEvF,aAAauF,MAAM,IAAI1F,KAAAA;EAC7C,GAAI2F,UAAU,OAAO,EAAEtF,cAAcsF,OAAO,IAAI3F,KAAAA;EAChD,GAAI8G,EAAEvG,mBAAmB,OACrB,EAAEA,iBAAiBuG,EAAEvG,gBAAgB,IACrCP,KAAAA;EACJ,GAAI8G,EAAErG,qBAAqB,OACvB,EAAEA,mBAAmBqG,EAAErG,kBAAkB,IACzCT,KAAAA;CACN;AACF;AAEA,SAAS+G,oBAAoBjG,UAOf;CAEZ,MAAM2D,QAAQ3D,UAAU2D;CACxB,IAAIA,OAAO;EACT,MAAMuC,aAAaH,eAAepC,KAAK;EACvC,IAAIuC,YAAY,OAAOA;CACzB;CAGA,MAAM1H,QAAQwB,UAAUxB;CAGxB,IAAIA,SAASA,MAAMgC,SAAS,GAAG;EAC7B,IAAInB,cAAc;EAClB,IAAIE,eAAe;EACnB,IAAIE,kBAAkB;EACtB,IAAIE,oBAAoB;EACxB,IAAIyE,WAAW;EACf,IAAIC,YAAY;EAChB,IAAIC,eAAe;EACnB,IAAIC,iBAAiB;EACrB,IAAI4B,SAAS;EACb,KAAK,MAAMnD,KAAKxE,OAAO;GACrB,IAAI,CAACwE,EAAEW,OAAO;GACd,MAAMyC,IAAIL,eAAe/C,EAAEW,KAAK;GAChC,IAAIyC,GAAG;IACL,IAAIA,EAAE/G,eAAe,MAAM;KACzBA,eAAe+G,EAAE/G;KACjB+E,WAAW;IACb;IACA,IAAIgC,EAAE7G,gBAAgB,MAAM;KAC1BA,gBAAgB6G,EAAE7G;KAClB8E,YAAY;IACd;IACA,IAAI+B,EAAE3G,mBAAmB,MAAM;KAC7BA,mBAAmB2G,EAAE3G;KACrB6E,eAAe;IACjB;IACA,IAAI8B,EAAEzG,qBAAqB,MAAM;KAC/BA,qBAAqByG,EAAEzG;KACvB4E,iBAAiB;IACnB;IACA4B,SAAS;GACX;EACF;EACA,IAAIA,QACF,OAAO;GACL,GAAI/B,WAAW,EAAE/E,YAAY,IAAIH,KAAAA;GACjC,GAAImF,YAAY,EAAE9E,aAAa,IAAIL,KAAAA;GACnC,GAAIoF,eAAe,EAAE7E,gBAAgB,IAAIP,KAAAA;GACzC,GAAIqF,iBAAiB,EAAE5E,kBAAkB,IAAIT,KAAAA;EAC/C;CAEJ;AAGF;AAEA,SAASiE,eAAkBjF,SAAkC;CAC3D,MAAMsF,MAAMtF;CACZ,IAAIsF,IAAIC,SAAS,aAAa,OAAO;CAErC,MAAM,EAAEK,WAAW3E,WAAWkG,cAAcD,oBAC1C5B,IAAIuB,SAAS,CAAA,CACf;CACA,OAAOW,mBACL5B,WACA3E,WACAkG,UAAU7E,QACVgD,IAAIxD,UACJqF,WACAY,oBAAoBzC,IAAIxD,QAAQ,CAClC;AACF;AAEA,SAASoD,yBAA4BiD,cAAyC;CAC5E,MAAMC,eAAyB,CAAA;CAC/B,MAAMC,eAAoC,CAAA;CAC1C,MAAMC,eAAsD,CAAA;CAC5D,IAAIC,eAAe;CACnB,IAAIzG;CACJ,IAAIX,cAAc;CAClB,IAAIE,eAAe;CACnB,IAAIE,kBAAkB;CACtB,IAAIE,oBAAoB;CACxB,IAAIyE,WAAW;CACf,IAAIC,YAAY;CAChB,IAAIC,eAAe;CACnB,IAAIC,iBAAiB;CAErB,KAAK,MAAMrG,WAAWmI,cAAc;EAClC,MAAM7C,MAAMtF;EACZ,IAAIsF,IAAIC,SAAS,aAAa;EAC9BgD,eAAe;EAEf,MAAM,EAAE3C,WAAW3E,WAAWkG,cAAcD,oBAC1C5B,IAAIuB,SAAS,CAAA,CACf;EACAuB,aAAaf,KAAK,GAAGzB,SAAS;EAC9ByC,aAAahB,KAAK,GAAGpG,SAAS;EAC9BqH,aAAajB,KAAK,GAAGF,SAAS;EAC9B,IAAI7B,IAAIxD,UAAUA,WAAWwD,IAAIxD;EAEjC,MAAM2D,QAAQsC,oBAAoBzC,IAAIxD,QAAQ;EAC9C,IAAI2D,OAAO;GACT,IAAIA,MAAMtE,eAAe,MAAM;IAC7BA,eAAesE,MAAMtE;IACrB+E,WAAW;GACb;GACA,IAAIT,MAAMpE,gBAAgB,MAAM;IAC9BA,gBAAgBoE,MAAMpE;IACtB8E,YAAY;GACd;GACA,IAAIV,MAAMlE,mBAAmB,MAAM;IACjCA,mBAAmBkE,MAAMlE;IACzB6E,eAAe;GACjB;GACA,IAAIX,MAAMhE,qBAAqB,MAAM;IACnCA,qBAAqBgE,MAAMhE;IAC3B4E,iBAAiB;GACnB;EACF;CACF;CAEA,IAAI,CAACkC,cAAc,OAAO;CAC1B,OAAOf,mBACLY,cACAC,cACAC,aAAahG,QACbR,UACAwG,cACA;EACE,GAAIpC,WAAW,EAAE/E,YAAY,IAAIH,KAAAA;EACjC,GAAImF,YAAY,EAAE9E,aAAa,IAAIL,KAAAA;EACnC,GAAIoF,eAAe,EAAE7E,gBAAgB,IAAIP,KAAAA;EACzC,GAAIqF,iBAAiB,EAAE5E,kBAAkB,IAAIT,KAAAA;CAC/C,CACF;AACF;AAEA,SAAOwH,sCAAAjM,UAAA;CAAA,MAAAkM,IAAAC,EAAA,CAAA;CAGL,MAAAhM,MAAYR,OAAO;CACnB,MAAAM,SAAerB,OAAOuB,GAAG;CAAE,IAAAiM;CAAA,IAAAF,EAAA,OAAA/L,KAAA;EACjBiM,WAAA;GACRnM,OAAMG,UAAWD;EAAH;EACf+L,EAAA,KAAA/L;EAAA+L,EAAA,KAAAE;CAAA,OAAAA,KAAAF,EAAA;CAFDvN,UAAUyN,EAET;CAAC,IAAAC;CAAA,IAAAH,EAAA,OAAAlM,UAAA;EAEAqM,WAAM,IAAItM,mCAAmCC,UAAUC,MAAM;EAACiM,EAAA,KAAAlM;EAAAkM,EAAA,KAAAG;CAAA,OAAAA,KAAAH,EAAA;CADhE,MAAA,CAAAlL,WAAkBnC,SAChBwN,EACF;CAAE,OACKrL;AAAO"}
@@ -18,7 +18,7 @@ const createRuntimeExtras = (runtimeName) => {
18
18
  return value;
19
19
  };
20
20
  const tryGet = (extras) => is(extras) ? extras : void 0;
21
- const get = (client) => assert(client.thread().getState().extras);
21
+ const get = (client) => assert(client.thread.getState().extras);
22
22
  function use(select, ...rest) {
23
23
  const hasFallback = rest.length > 0;
24
24
  const fallback = rest[0];
@@ -1 +1 @@
1
- {"version":3,"file":"createRuntimeExtras.js","names":["useAuiState","AssistantClient","RuntimeExtras","provide","value","T","is","extras","tryGet","get","client","use","select","S","fallback","createRuntimeExtras","runtimeName","brand","Symbol","assert","Error","Object","defineProperty","enumerable","configurable","undefined","thread","getState","rest","hasFallback","length","s"],"sources":["../../../src/react/runtimes/createRuntimeExtras.ts"],"sourcesContent":["\"use client\";\n\nimport { useAuiState } from \"@assistant-ui/store\";\nimport type { AssistantClient } from \"@assistant-ui/store\";\n\n/** @deprecated Internal API for external-store adapter authors. Not part of the public API; may change or be removed without notice. */\nexport type RuntimeExtras<T extends object> = {\n provide: (value: T) => T;\n is: (extras: unknown) => extras is T;\n tryGet: (extras: unknown) => T | undefined;\n get: (client: AssistantClient) => T;\n use: {\n (): T;\n <S>(select: (extras: T) => S): S;\n <S>(select: (extras: T) => S, fallback: S): S;\n };\n};\n\n/** @deprecated Internal API for external-store adapter authors. Not part of the public API; may change or be removed without notice. */\nexport const createRuntimeExtras = <T extends object>(\n runtimeName: string,\n): RuntimeExtras<T> => {\n const brand = Symbol(`${runtimeName} extras`);\n\n const is = (extras: unknown): extras is T =>\n typeof extras === \"object\" && extras !== null && brand in extras;\n\n const assert = (extras: unknown): T => {\n if (!is(extras))\n throw new Error(\n `The current thread is not backed by the ${runtimeName} runtime.`,\n );\n return extras;\n };\n\n const provide = (value: T): T => {\n Object.defineProperty(value, brand, {\n value: true,\n enumerable: false,\n configurable: true,\n });\n return value;\n };\n\n const tryGet = (extras: unknown): T | undefined =>\n is(extras) ? extras : undefined;\n\n const get = (client: AssistantClient): T =>\n assert(client.thread().getState().extras);\n\n function use<S>(\n select?: (extras: T) => S,\n ...rest: [fallback: S] | []\n ): S | T {\n // Detect a provided fallback by arity, not value: callers pass an explicit\n // `undefined` fallback, which must return `undefined` rather than throw.\n const hasFallback = rest.length > 0;\n const fallback = rest[0] as S;\n return useAuiState((s) => {\n const extras = s.thread.extras;\n if (is(extras)) return select ? select(extras) : extras;\n if (hasFallback) return fallback;\n return assert(extras);\n });\n }\n\n return { provide, is, tryGet, get, use: use as RuntimeExtras<T>[\"use\"] };\n};\n"],"mappings":";;;;AAmBA,MAAae,uBACXC,gBACqB;CACrB,MAAMC,QAAQC,OAAO,GAAGF,YAAW,QAAS;CAE5C,MAAMV,MAAMC,WACV,OAAOA,WAAW,YAAYA,WAAW,QAAQU,SAASV;CAE5D,MAAMY,UAAUZ,WAAuB;EACrC,IAAI,CAACD,GAAGC,MAAM,GACZ,MAAM,IAAIa,MACR,2CAA2CJ,YAAW,UACxD;EACF,OAAOT;CACT;CAEA,MAAMJ,WAAWC,UAAgB;EAC/BiB,OAAOC,eAAelB,OAAOa,OAAO;GAClCb,OAAO;GACPmB,YAAY;GACZC,cAAc;EAChB,CAAC;EACD,OAAOpB;CACT;CAEA,MAAMI,UAAUD,WACdD,GAAGC,MAAM,IAAIA,SAASkB,KAAAA;CAExB,MAAMhB,OAAOC,WACXS,OAAOT,OAAOgB,OAAO,CAAC,CAACC,SAAS,CAAC,CAACpB,MAAM;CAE1C,SAASI,IACPC,QACA,GAAGgB,MACI;EAGP,MAAMC,cAAcD,KAAKE,SAAS;EAClC,MAAMhB,WAAWc,KAAK;EACtB,OAAO5B,aAAa+B,MAAM;GACxB,MAAMxB,SAASwB,EAAEL,OAAOnB;GACxB,IAAID,GAAGC,MAAM,GAAG,OAAOK,SAASA,OAAOL,MAAM,IAAIA;GACjD,IAAIsB,aAAa,OAAOf;GACxB,OAAOK,OAAOZ,MAAM;EACtB,CAAC;CACH;CAEA,OAAO;EAAEJ;EAASG;EAAIE;EAAQC;EAAUE;CAA+B;AACzE"}
1
+ {"version":3,"file":"createRuntimeExtras.js","names":["useAuiState","AssistantClient","RuntimeExtras","provide","value","T","is","extras","tryGet","get","client","use","select","S","fallback","createRuntimeExtras","runtimeName","brand","Symbol","assert","Error","Object","defineProperty","enumerable","configurable","undefined","thread","getState","rest","hasFallback","length","s"],"sources":["../../../src/react/runtimes/createRuntimeExtras.ts"],"sourcesContent":["\"use client\";\n\nimport { useAuiState } from \"@assistant-ui/store\";\nimport type { AssistantClient } from \"@assistant-ui/store\";\n\n/** @deprecated Internal API for external-store adapter authors. Not part of the public API; may change or be removed without notice. */\nexport type RuntimeExtras<T extends object> = {\n provide: (value: T) => T;\n is: (extras: unknown) => extras is T;\n tryGet: (extras: unknown) => T | undefined;\n get: (client: AssistantClient) => T;\n use: {\n (): T;\n <S>(select: (extras: T) => S): S;\n <S>(select: (extras: T) => S, fallback: S): S;\n };\n};\n\n/** @deprecated Internal API for external-store adapter authors. Not part of the public API; may change or be removed without notice. */\nexport const createRuntimeExtras = <T extends object>(\n runtimeName: string,\n): RuntimeExtras<T> => {\n const brand = Symbol(`${runtimeName} extras`);\n\n const is = (extras: unknown): extras is T =>\n typeof extras === \"object\" && extras !== null && brand in extras;\n\n const assert = (extras: unknown): T => {\n if (!is(extras))\n throw new Error(\n `The current thread is not backed by the ${runtimeName} runtime.`,\n );\n return extras;\n };\n\n const provide = (value: T): T => {\n Object.defineProperty(value, brand, {\n value: true,\n enumerable: false,\n configurable: true,\n });\n return value;\n };\n\n const tryGet = (extras: unknown): T | undefined =>\n is(extras) ? extras : undefined;\n\n const get = (client: AssistantClient): T =>\n assert(client.thread.getState().extras);\n\n function use<S>(\n select?: (extras: T) => S,\n ...rest: [fallback: S] | []\n ): S | T {\n // Detect a provided fallback by arity, not value: callers pass an explicit\n // `undefined` fallback, which must return `undefined` rather than throw.\n const hasFallback = rest.length > 0;\n const fallback = rest[0] as S;\n return useAuiState((s) => {\n const extras = s.thread.extras;\n if (is(extras)) return select ? select(extras) : extras;\n if (hasFallback) return fallback;\n return assert(extras);\n });\n }\n\n return { provide, is, tryGet, get, use: use as RuntimeExtras<T>[\"use\"] };\n};\n"],"mappings":";;;;AAmBA,MAAae,uBACXC,gBACqB;CACrB,MAAMC,QAAQC,OAAO,GAAGF,YAAW,QAAS;CAE5C,MAAMV,MAAMC,WACV,OAAOA,WAAW,YAAYA,WAAW,QAAQU,SAASV;CAE5D,MAAMY,UAAUZ,WAAuB;EACrC,IAAI,CAACD,GAAGC,MAAM,GACZ,MAAM,IAAIa,MACR,2CAA2CJ,YAAW,UACxD;EACF,OAAOT;CACT;CAEA,MAAMJ,WAAWC,UAAgB;EAC/BiB,OAAOC,eAAelB,OAAOa,OAAO;GAClCb,OAAO;GACPmB,YAAY;GACZC,cAAc;EAChB,CAAC;EACD,OAAOpB;CACT;CAEA,MAAMI,UAAUD,WACdD,GAAGC,MAAM,IAAIA,SAASkB,KAAAA;CAExB,MAAMhB,OAAOC,WACXS,OAAOT,OAAOgB,OAAOC,SAAS,CAAC,CAACpB,MAAM;CAExC,SAASI,IACPC,QACA,GAAGgB,MACI;EAGP,MAAMC,cAAcD,KAAKE,SAAS;EAClC,MAAMhB,WAAWc,KAAK;EACtB,OAAO5B,aAAa+B,MAAM;GACxB,MAAMxB,SAASwB,EAAEL,OAAOnB;GACxB,IAAID,GAAGC,MAAM,GAAG,OAAOK,SAASA,OAAOL,MAAM,IAAIA;GACjD,IAAIsB,aAAa,OAAOf;GACxB,OAAOK,OAAOZ,MAAM;EACtB,CAAC;CACH;CAEA,OAAO;EAAEJ;EAASG;EAAIE;EAAQC;EAAUE;CAA+B;AACzE"}
@@ -19,12 +19,6 @@ type ToolsState = {
19
19
  /** Registered tool UIs (renderer + presentation options) keyed by tool name. */
20
20
  toolUIs: Record<string, readonly ToolRegistration[]>;
21
21
  mcpApp?: McpAppResourceOutput | undefined;
22
- /**
23
- * @deprecated Use {@link toolUIs} instead, whose entries carry the renderer
24
- * alongside its presentation options. This component-only map is kept for
25
- * back-compat and will be removed in v0.15.
26
- */
27
- tools: Record<string, ToolCallMessagePartComponent[]>;
28
22
  };
29
23
  type ToolsMethods = {
30
24
  getState(): ToolsState;
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","names":[],"sources":["../../../../src/react/types/scopes/tools.ts"],"mappings":";;;;KAGY;WACD,QAAQ;;;;;;;KAQd;WACM,QAAQ;;WAER;;KAGC;;EAEV,SAAS,wBAAwB;EACjC,SAAS;;;;;;EAMT,OAAO,eAAe;;KAGZ;EACV,YAAY;EACZ,UACE,kBACA,QAAQ,8BACR;IAAY;MACX;;KAGO;EACV,SAAS"}
1
+ {"version":3,"file":"tools.d.ts","names":[],"sources":["../../../../src/react/types/scopes/tools.ts"],"mappings":";;;;KAGY;WACD,QAAQ;;;;;;;KAQd;WACM,QAAQ;;WAER;;KAGC;;EAEV,SAAS,wBAAwB;EACjC,SAAS;;KAGC;EACV,YAAY;EACZ,UACE,kBACA,QAAQ,8BACR;IAAY;MACX;;KAGO;EACV,SAAS"}
@@ -41,10 +41,8 @@ declare const GROUPBY_MEMO_KEY: unique symbol;
41
41
  * `display: "standalone"`). Resolving the registry-driven cases reads the
42
42
  * {@link GroupByContext} passed to the `groupBy` function. Takes precedence
43
43
  * over the `"tool-call"` entry.
44
- * - `"mcp-app"` — **deprecated**, kept for back-compat. Matches only MCP-app
45
- * tool calls. Prefer `"standalone-tool-call"`, which is a superset.
46
44
  */
47
- type GroupPartType = PartState["type"] | "standalone-tool-call" | "mcp-app";
45
+ type GroupPartType = PartState["type"] | "standalone-tool-call";
48
46
  /**
49
47
  * Build a `groupBy` from a `part.type → group-key path` lookup.
50
48
  * Parts whose type isn't in the map are left ungrouped. The returned
@@ -1 +1 @@
1
- {"version":3,"file":"groupParts.d.ts","names":[],"sources":["../../../src/react/utils/groupParts.ts"],"mappings":";;;;;;;;;KAUY;;WAED,UAAU;;;;;;;;;;;;;;;;;;;;cAsBR;;;;;;;;;;;;;;;KAkBR,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;cA4BR,kBAAmB,gCAC9B,KAAK,QAAQ,SAAS,OAAO,wBAAwB,gBAClD,MAAM,WAAW,UAAU,4BAA4B;KA+BhD,YAAY,iBAAiB;UAExB;WACN;;WAEA;;WAEA;;;;;WAKA;;WAEA;WACA,mBAAmB;;UAGb;WACN;;WAEA;;WAEA;;;;;WAKA;;;;;;;;;cAiCE,iBACX,uCACA,uDACU"}
1
+ {"version":3,"file":"groupParts.d.ts","names":[],"sources":["../../../src/react/utils/groupParts.ts"],"mappings":";;;;;;;;;KAUY;;WAED,UAAU;;;;;;;;;;;;;;;;;;;;cAsBR;;;;;;;;;;;;;KAgBR,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;cA4BR,kBAAmB,gCAC9B,KAAK,QAAQ,SAAS,OAAO,wBAAwB,gBAClD,MAAM,WAAW,UAAU,4BAA4B;KA2BhD,YAAY,iBAAiB;UAExB;WACN;;WAEA;;WAEA;;;;;WAKA;;WAEA;WACA,mBAAmB;;UAGb;WACN;;WAEA;;WAEA;;;;;WAKA;;;;;;;;;cAiCE,iBACX,uCACA,uDACU"}
@@ -49,9 +49,7 @@ const groupPartByType = (map) => {
49
49
  const lookup = map;
50
50
  const fn = ((part, context) => {
51
51
  if (part.type === "tool-call") {
52
- const isMcpApp = isMcpAppUri(part.mcp?.app?.resourceUri);
53
- if ((isMcpApp || (context?.toolUIs?.[part.toolName]?.[0]?.standalone ?? false)) && lookup["standalone-tool-call"] !== void 0) return lookup["standalone-tool-call"];
54
- if (isMcpApp && lookup["mcp-app"] !== void 0) return lookup["mcp-app"];
52
+ if ((isMcpAppUri(part.mcp?.app?.resourceUri) || (context?.toolUIs?.[part.toolName]?.[0]?.standalone ?? false)) && lookup["standalone-tool-call"] !== void 0) return lookup["standalone-tool-call"];
55
53
  }
56
54
  return lookup[part.type] ?? [];
57
55
  });
@@ -1 +1 @@
1
- {"version":3,"file":"groupParts.js","names":["isMcpAppUri","PartState","ToolsState","GroupByContext","toolUIs","GROUPBY_MEMO_KEY","Symbol","for","GroupPartType","groupPartByType","map","Partial","Readonly","Record","TKey","part","context","lookup","fn","type","isMcpApp","mcp","app","resourceUri","isStandalone","toolName","standalone","undefined","sortedKeys","Object","keys","sort","sortedEntries","k","JSON","stringify","GroupNode","GroupNodeGroup","GroupNodePart","key","nodeKey","idKey","indices","children","index","BuildFrame","nextChildIdx","claimed","Set","makeChildNodeKey","parent","idx","String","claimIdKey","frame","id","has","add","buildGroupTree","paths","partIds","root","stack","closeTop","closing","pop","length","push","i","path","common","top","s"],"sources":["../../../src/react/utils/groupParts.ts"],"sourcesContent":["import { isMcpAppUri } from \"../../types/message\";\nimport type { PartState } from \"../../store/scopes/part\";\nimport type { ToolsState } from \"../types/scopes/tools\";\n\n/**\n * Registry context passed to a `groupBy` function as its second argument by\n * `<MessagePrimitive.GroupedParts>`. Carries the live tool-UI registry so a\n * `groupBy` can resolve registry-driven grouping (e.g. standalone tool calls)\n * without the part itself having to carry that information.\n */\nexport type GroupByContext = {\n /** Tool UIs registered in the tool-UI registry, keyed by tool name. */\n readonly toolUIs?: ToolsState[\"toolUIs\"];\n};\n\n/**\n * Hierarchical adjacent-coalescing grouping for message parts.\n *\n * Given a group path per part (from `groupBy`), builds a tree of group\n * nodes wrapping individual parts. Adjacent parts sharing a path prefix\n * coalesce into the same group; ungrouped parts are direct children of\n * the root.\n *\n * Each node gets a structural `nodeKey` built from sibling indices\n * (`\"0.1.0\"`), stable under append-only streaming.\n */\n\n/**\n * Symbol attached to memoizable `groupBy` functions (e.g. those returned\n * by {@link groupPartByType}). Carries a string fingerprint of the config\n * so `MessagePrimitive.GroupedParts` can memo the tree on\n * `[parts, memoKey]` across renders — even when the helper call site\n * reconstructs the function each render.\n */\nexport const GROUPBY_MEMO_KEY: unique symbol = Symbol.for(\n \"@assistant-ui/groupBy.memoKey\",\n);\n\n/**\n * Synthetic part-type keys recognized by {@link groupPartByType}, in\n * addition to real {@link PartState} types:\n *\n * - `\"standalone-tool-call\"` — a tool-call whose UI should be presented on its\n * own, outside the chain-of-thought grouping. Matches MCP-app tool calls plus\n * any tool-call whose registered UI opts into standalone display (human\n * tools, the built-in generative-UI tool, and tools that set\n * `display: \"standalone\"`). Resolving the registry-driven cases reads the\n * {@link GroupByContext} passed to the `groupBy` function. Takes precedence\n * over the `\"tool-call\"` entry.\n * - `\"mcp-app\"` — **deprecated**, kept for back-compat. Matches only MCP-app\n * tool calls. Prefer `\"standalone-tool-call\"`, which is a superset.\n */\ntype GroupPartType = PartState[\"type\"] | \"standalone-tool-call\" | \"mcp-app\";\n\n/**\n * Build a `groupBy` from a `part.type → group-key path` lookup.\n * Parts whose type isn't in the map are left ungrouped. The returned\n * function carries a stable {@link GROUPBY_MEMO_KEY} fingerprint so\n * `<MessagePrimitive.GroupedParts>` can memoize its tree across renders.\n *\n * The synthetic `\"standalone-tool-call\"` key matches tool calls that should\n * render outside the chain-of-thought grouping. MCP-app calls are detected from\n * the part alone; the registry-driven cases (human tools, the generative-UI\n * tool, `display: \"standalone\"` opt-ins) are resolved from the\n * {@link GroupByContext} that `<MessagePrimitive.GroupedParts>` passes to the\n * `groupBy` function — the helper needs nothing threaded into it.\n *\n * @example\n * ```tsx\n * <MessagePrimitive.GroupedParts\n * groupBy={groupPartByType({\n * reasoning: [\"group-thought\", \"group-reasoning\"],\n * \"tool-call\": [\"group-thought\", \"group-tool\"],\n * \"standalone-tool-call\": [],\n * })}\n * >\n * {({ part, children }) => { ... }}\n * </MessagePrimitive.GroupedParts>\n * ```\n */\nexport const groupPartByType = <TKey extends `group-${string}`>(\n map: Partial<Readonly<Record<GroupPartType, readonly TKey[]>>>,\n): ((part: PartState, context?: GroupByContext) => readonly TKey[]) => {\n const lookup = map as Readonly<Record<string, readonly TKey[] | undefined>>;\n const fn = ((part, context) => {\n if (part.type === \"tool-call\") {\n const isMcpApp = isMcpAppUri(part.mcp?.app?.resourceUri);\n // Read the first registration's flag — the same one `resolveToolRender`\n // renders — so grouping and rendering never disagree for a tool name.\n const isStandalone =\n isMcpApp ||\n (context?.toolUIs?.[part.toolName]?.[0]?.standalone ?? false);\n if (isStandalone && lookup[\"standalone-tool-call\"] !== undefined) {\n return lookup[\"standalone-tool-call\"]!;\n }\n // TODO(v0.15): drop the deprecated \"mcp-app\" key (superseded by \"standalone-tool-call\").\n if (isMcpApp && lookup[\"mcp-app\"] !== undefined) {\n return lookup[\"mcp-app\"]!;\n }\n }\n return lookup[part.type] ?? [];\n }) as ((part: PartState, context?: GroupByContext) => readonly TKey[]) & {\n [GROUPBY_MEMO_KEY]?: string;\n };\n // Sort keys so the fingerprint is insensitive to map insertion order —\n // two maps with the same key/value pairs but different declaration order\n // would otherwise hash differently and invalidate the memo unnecessarily.\n const sortedKeys = Object.keys(map).sort();\n const sortedEntries = sortedKeys.map((k) => [k, map[k as keyof typeof map]]);\n fn[GROUPBY_MEMO_KEY] = `groupPartByType:${JSON.stringify(sortedEntries)}`;\n return fn;\n};\n\nexport type GroupNode = GroupNodeGroup | GroupNodePart;\n\nexport interface GroupNodeGroup {\n readonly type: \"group\";\n /** Current-level group key (last segment of the path). */\n readonly key: string;\n /** Structural React key: sibling-index path, e.g. `\"0.1.0\"`. */\n readonly nodeKey: string;\n /**\n * Identity key (`\"id:<partId>\"`) from the group's first part; undefined\n * when absent or already claimed by an earlier sibling.\n */\n readonly idKey: string | undefined;\n /** Indices of parts in this subtree, in order. */\n readonly indices: readonly number[];\n readonly children: readonly GroupNode[];\n}\n\nexport interface GroupNodePart {\n readonly type: \"part\";\n /** Index of the part in the message. */\n readonly index: number;\n /** Structural React key: sibling-index path within parent. */\n readonly nodeKey: string;\n /**\n * Identity key (`\"id:<partId>\"`); undefined when absent or already\n * claimed by an earlier sibling.\n */\n readonly idKey: string | undefined;\n}\n\ninterface BuildFrame {\n key: string;\n nodeKey: string;\n indices: number[];\n children: GroupNode[];\n nextChildIdx: number;\n claimed: Set<string>;\n}\n\nconst makeChildNodeKey = (parent: BuildFrame): string => {\n const idx = parent.nextChildIdx++;\n return parent.nodeKey === \"\" ? String(idx) : `${parent.nodeKey}.${idx}`;\n};\n\nconst claimIdKey = (\n frame: BuildFrame,\n id: string | undefined,\n): string | undefined => {\n if (id === undefined || frame.claimed.has(id)) return undefined;\n frame.claimed.add(id);\n return `id:${id}`;\n};\n\n/**\n * Build the group tree from an array of normalized group paths.\n * `paths[i]` is the path for part `i`. The output tree contains one\n * `part` node per part and one `group` node per coalesced run.\n * `partIds[i]` optionally carries a stable identity for part `i` (e.g. a\n * tool call id), from which nodes derive an `idKey`.\n */\nexport const buildGroupTree = (\n paths: readonly (readonly string[])[],\n partIds?: readonly (string | undefined)[],\n): readonly GroupNode[] => {\n const root: BuildFrame = {\n key: \"\",\n nodeKey: \"\",\n indices: [],\n children: [],\n nextChildIdx: 0,\n claimed: new Set(),\n };\n const stack: BuildFrame[] = [root];\n\n const closeTop = (): void => {\n const closing = stack.pop()!;\n const parent = stack[stack.length - 1]!;\n parent.children.push({\n type: \"group\",\n key: closing.key,\n nodeKey: closing.nodeKey,\n idKey: claimIdKey(parent, partIds?.[closing.indices[0]!]),\n indices: closing.indices,\n children: closing.children,\n });\n };\n\n for (let i = 0; i < paths.length; i++) {\n const path = paths[i]!;\n\n // Find the longest prefix shared between currently-open groups\n // (excluding root) and this part's path.\n let common = 0;\n while (\n common < stack.length - 1 &&\n common < path.length &&\n stack[common + 1]!.key === path[common]\n ) {\n common++;\n }\n\n // Close groups not on this path.\n while (stack.length - 1 > common) {\n closeTop();\n }\n\n // Open new groups down to the part's depth.\n while (stack.length - 1 < path.length) {\n const parent = stack[stack.length - 1]!;\n stack.push({\n key: path[stack.length - 1]!,\n nodeKey: makeChildNodeKey(parent),\n indices: [],\n children: [],\n nextChildIdx: 0,\n claimed: new Set(),\n });\n }\n\n // Push this part as a leaf in the deepest open group (or root).\n const top = stack[stack.length - 1]!;\n top.children.push({\n type: \"part\",\n index: i,\n nodeKey: makeChildNodeKey(top),\n idKey: claimIdKey(top, partIds?.[i]),\n });\n\n // Record the part index in every open ancestor group.\n for (let s = 1; s < stack.length; s++) {\n stack[s]!.indices.push(i);\n }\n }\n\n // Close any still-open groups.\n while (stack.length > 1) {\n closeTop();\n }\n\n return root.children;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"groupParts.js","names":["isMcpAppUri","PartState","ToolsState","GroupByContext","toolUIs","GROUPBY_MEMO_KEY","Symbol","for","GroupPartType","groupPartByType","map","Partial","Readonly","Record","TKey","part","context","lookup","fn","type","isMcpApp","mcp","app","resourceUri","isStandalone","toolName","standalone","undefined","sortedKeys","Object","keys","sort","sortedEntries","k","JSON","stringify","GroupNode","GroupNodeGroup","GroupNodePart","key","nodeKey","idKey","indices","children","index","BuildFrame","nextChildIdx","claimed","Set","makeChildNodeKey","parent","idx","String","claimIdKey","frame","id","has","add","buildGroupTree","paths","partIds","root","stack","closeTop","closing","pop","length","push","i","path","common","top","s"],"sources":["../../../src/react/utils/groupParts.ts"],"sourcesContent":["import { isMcpAppUri } from \"../../types/message\";\nimport type { PartState } from \"../../store/scopes/part\";\nimport type { ToolsState } from \"../types/scopes/tools\";\n\n/**\n * Registry context passed to a `groupBy` function as its second argument by\n * `<MessagePrimitive.GroupedParts>`. Carries the live tool-UI registry so a\n * `groupBy` can resolve registry-driven grouping (e.g. standalone tool calls)\n * without the part itself having to carry that information.\n */\nexport type GroupByContext = {\n /** Tool UIs registered in the tool-UI registry, keyed by tool name. */\n readonly toolUIs?: ToolsState[\"toolUIs\"];\n};\n\n/**\n * Hierarchical adjacent-coalescing grouping for message parts.\n *\n * Given a group path per part (from `groupBy`), builds a tree of group\n * nodes wrapping individual parts. Adjacent parts sharing a path prefix\n * coalesce into the same group; ungrouped parts are direct children of\n * the root.\n *\n * Each node gets a structural `nodeKey` built from sibling indices\n * (`\"0.1.0\"`), stable under append-only streaming.\n */\n\n/**\n * Symbol attached to memoizable `groupBy` functions (e.g. those returned\n * by {@link groupPartByType}). Carries a string fingerprint of the config\n * so `MessagePrimitive.GroupedParts` can memo the tree on\n * `[parts, memoKey]` across renders — even when the helper call site\n * reconstructs the function each render.\n */\nexport const GROUPBY_MEMO_KEY: unique symbol = Symbol.for(\n \"@assistant-ui/groupBy.memoKey\",\n);\n\n/**\n * Synthetic part-type keys recognized by {@link groupPartByType}, in\n * addition to real {@link PartState} types:\n *\n * - `\"standalone-tool-call\"` — a tool-call whose UI should be presented on its\n * own, outside the chain-of-thought grouping. Matches MCP-app tool calls plus\n * any tool-call whose registered UI opts into standalone display (human\n * tools, the built-in generative-UI tool, and tools that set\n * `display: \"standalone\"`). Resolving the registry-driven cases reads the\n * {@link GroupByContext} passed to the `groupBy` function. Takes precedence\n * over the `\"tool-call\"` entry.\n */\ntype GroupPartType = PartState[\"type\"] | \"standalone-tool-call\";\n\n/**\n * Build a `groupBy` from a `part.type → group-key path` lookup.\n * Parts whose type isn't in the map are left ungrouped. The returned\n * function carries a stable {@link GROUPBY_MEMO_KEY} fingerprint so\n * `<MessagePrimitive.GroupedParts>` can memoize its tree across renders.\n *\n * The synthetic `\"standalone-tool-call\"` key matches tool calls that should\n * render outside the chain-of-thought grouping. MCP-app calls are detected from\n * the part alone; the registry-driven cases (human tools, the generative-UI\n * tool, `display: \"standalone\"` opt-ins) are resolved from the\n * {@link GroupByContext} that `<MessagePrimitive.GroupedParts>` passes to the\n * `groupBy` function — the helper needs nothing threaded into it.\n *\n * @example\n * ```tsx\n * <MessagePrimitive.GroupedParts\n * groupBy={groupPartByType({\n * reasoning: [\"group-thought\", \"group-reasoning\"],\n * \"tool-call\": [\"group-thought\", \"group-tool\"],\n * \"standalone-tool-call\": [],\n * })}\n * >\n * {({ part, children }) => { ... }}\n * </MessagePrimitive.GroupedParts>\n * ```\n */\nexport const groupPartByType = <TKey extends `group-${string}`>(\n map: Partial<Readonly<Record<GroupPartType, readonly TKey[]>>>,\n): ((part: PartState, context?: GroupByContext) => readonly TKey[]) => {\n const lookup = map as Readonly<Record<string, readonly TKey[] | undefined>>;\n const fn = ((part, context) => {\n if (part.type === \"tool-call\") {\n const isMcpApp = isMcpAppUri(part.mcp?.app?.resourceUri);\n // Read the first registration's flag — the same one `resolveToolRender`\n // renders — so grouping and rendering never disagree for a tool name.\n const isStandalone =\n isMcpApp ||\n (context?.toolUIs?.[part.toolName]?.[0]?.standalone ?? false);\n if (isStandalone && lookup[\"standalone-tool-call\"] !== undefined) {\n return lookup[\"standalone-tool-call\"]!;\n }\n }\n return lookup[part.type] ?? [];\n }) as ((part: PartState, context?: GroupByContext) => readonly TKey[]) & {\n [GROUPBY_MEMO_KEY]?: string;\n };\n // Sort keys so the fingerprint is insensitive to map insertion order —\n // two maps with the same key/value pairs but different declaration order\n // would otherwise hash differently and invalidate the memo unnecessarily.\n const sortedKeys = Object.keys(map).sort();\n const sortedEntries = sortedKeys.map((k) => [k, map[k as keyof typeof map]]);\n fn[GROUPBY_MEMO_KEY] = `groupPartByType:${JSON.stringify(sortedEntries)}`;\n return fn;\n};\n\nexport type GroupNode = GroupNodeGroup | GroupNodePart;\n\nexport interface GroupNodeGroup {\n readonly type: \"group\";\n /** Current-level group key (last segment of the path). */\n readonly key: string;\n /** Structural React key: sibling-index path, e.g. `\"0.1.0\"`. */\n readonly nodeKey: string;\n /**\n * Identity key (`\"id:<partId>\"`) from the group's first part; undefined\n * when absent or already claimed by an earlier sibling.\n */\n readonly idKey: string | undefined;\n /** Indices of parts in this subtree, in order. */\n readonly indices: readonly number[];\n readonly children: readonly GroupNode[];\n}\n\nexport interface GroupNodePart {\n readonly type: \"part\";\n /** Index of the part in the message. */\n readonly index: number;\n /** Structural React key: sibling-index path within parent. */\n readonly nodeKey: string;\n /**\n * Identity key (`\"id:<partId>\"`); undefined when absent or already\n * claimed by an earlier sibling.\n */\n readonly idKey: string | undefined;\n}\n\ninterface BuildFrame {\n key: string;\n nodeKey: string;\n indices: number[];\n children: GroupNode[];\n nextChildIdx: number;\n claimed: Set<string>;\n}\n\nconst makeChildNodeKey = (parent: BuildFrame): string => {\n const idx = parent.nextChildIdx++;\n return parent.nodeKey === \"\" ? String(idx) : `${parent.nodeKey}.${idx}`;\n};\n\nconst claimIdKey = (\n frame: BuildFrame,\n id: string | undefined,\n): string | undefined => {\n if (id === undefined || frame.claimed.has(id)) return undefined;\n frame.claimed.add(id);\n return `id:${id}`;\n};\n\n/**\n * Build the group tree from an array of normalized group paths.\n * `paths[i]` is the path for part `i`. The output tree contains one\n * `part` node per part and one `group` node per coalesced run.\n * `partIds[i]` optionally carries a stable identity for part `i` (e.g. a\n * tool call id), from which nodes derive an `idKey`.\n */\nexport const buildGroupTree = (\n paths: readonly (readonly string[])[],\n partIds?: readonly (string | undefined)[],\n): readonly GroupNode[] => {\n const root: BuildFrame = {\n key: \"\",\n nodeKey: \"\",\n indices: [],\n children: [],\n nextChildIdx: 0,\n claimed: new Set(),\n };\n const stack: BuildFrame[] = [root];\n\n const closeTop = (): void => {\n const closing = stack.pop()!;\n const parent = stack[stack.length - 1]!;\n parent.children.push({\n type: \"group\",\n key: closing.key,\n nodeKey: closing.nodeKey,\n idKey: claimIdKey(parent, partIds?.[closing.indices[0]!]),\n indices: closing.indices,\n children: closing.children,\n });\n };\n\n for (let i = 0; i < paths.length; i++) {\n const path = paths[i]!;\n\n // Find the longest prefix shared between currently-open groups\n // (excluding root) and this part's path.\n let common = 0;\n while (\n common < stack.length - 1 &&\n common < path.length &&\n stack[common + 1]!.key === path[common]\n ) {\n common++;\n }\n\n // Close groups not on this path.\n while (stack.length - 1 > common) {\n closeTop();\n }\n\n // Open new groups down to the part's depth.\n while (stack.length - 1 < path.length) {\n const parent = stack[stack.length - 1]!;\n stack.push({\n key: path[stack.length - 1]!,\n nodeKey: makeChildNodeKey(parent),\n indices: [],\n children: [],\n nextChildIdx: 0,\n claimed: new Set(),\n });\n }\n\n // Push this part as a leaf in the deepest open group (or root).\n const top = stack[stack.length - 1]!;\n top.children.push({\n type: \"part\",\n index: i,\n nodeKey: makeChildNodeKey(top),\n idKey: claimIdKey(top, partIds?.[i]),\n });\n\n // Record the part index in every open ancestor group.\n for (let s = 1; s < stack.length; s++) {\n stack[s]!.indices.push(i);\n }\n }\n\n // Close any still-open groups.\n while (stack.length > 1) {\n closeTop();\n }\n\n return root.children;\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"local-thread-runtime-core.d.ts","names":[],"sources":["../../../src/runtimes/local/local-thread-runtime-core.ts"],"mappings":";;;;;;;;;;;;;;;cA6Ca,+BACH,iCACG;WAEK;;;;;;;;;;;;;;;UAgBR;UAEA;UACA;UAEA;UAIA;UAuBA;WAYQ;WACA;UAER;MACG;UAIH;UACA;MACG,wBAAwB;MAIxB;;;;;;;;;;EAKT,YAAA,iBAAiB,sBACjB,SAAS;UAMH;UAEA;UAEA;EAED,0BAA0B;UAIzB;EAED,mCACL,kBAAkB;MAKT;EAIJ,sBAAsB,SAAS;UAuE9B;EACD,mBAAe;EAuCT,OAAO,SAAS,gBAAgB;EAWtC,0BAA0B;EAM1B,eAAe;EAIf,gBAAgB;UAIT;EAgCD,cAAc,oBAAoB;EAmBxC,YAAY,WAAW,eAAe,kBAAkB;EAMxD;EAIA;EAIM,WACT,UAAU,aAAa,gBACzB,cAAc,0BACb;UAuBW;UAkEA;EA+LP;EASA;EASA,gBACL,WACA,YACA,QACA,SACA,YACC;EA6CI,eAAe,UAAU;EAMzB,wBACL,YACA,UACA,UACA,UACC"}
1
+ {"version":3,"file":"local-thread-runtime-core.d.ts","names":[],"sources":["../../../src/runtimes/local/local-thread-runtime-core.ts"],"mappings":";;;;;;;;;;;;;;;cA6Ca,+BACH,iCACG;WAEK;;;;;;;;;;;;;;;UAgBR;UAEA;UACA;UAEA;UAIA;UAuBA;WAYQ;WACA;UAER;MACG;UAIH;UACA;MACG,wBAAwB;MAIxB;;;;;;;;;;EAKT,YAAA,iBAAiB,sBACjB,SAAS;UAMH;UAEA;UAEA;EAED,0BAA0B;UAIzB;EAED,mCACL,kBAAkB;MAKT;EAIJ,sBAAsB,SAAS;UAuE9B;EACD,mBAAe;EAuCT,OAAO,SAAS,gBAAgB;EAWtC,0BAA0B;EAM1B,eAAe;EAIf,gBAAgB;UAIT;EAgCD,cAAc,oBAAoB;EAmBxC,YAAY,WAAW,eAAe,kBAAkB;EAMxD;EAIA;EAIM,WACT,UAAU,aAAa,gBACzB,cAAc,0BACb;UAuBW;UAkEA;EAkMP;EASA;EASA,gBACL,WACA,YACA,QACA,SACA,YACC;EA6CI,eAAe,UAAU;EAMzB,wBACL,YACA,UACA,UACA,UACC"}
@@ -288,7 +288,8 @@ var LocalThreadRuntimeCore = class extends BaseThreadRuntimeCore {
288
288
  async performRoundtrip(parentId, message, runConfig, alreadyPersisted, runCallback) {
289
289
  const messages = parentId ? this.repository.getMessages(parentId) : [];
290
290
  this.abortController?.abort();
291
- this.abortController = new AbortController();
291
+ const abortController = new AbortController();
292
+ this.abortController = abortController;
292
293
  const initialContent = message.content;
293
294
  const initialAnnotations = message.metadata?.unstable_annotations;
294
295
  const initialData = message.metadata?.unstable_data;
@@ -336,7 +337,7 @@ var LocalThreadRuntimeCore = class extends BaseThreadRuntimeCore {
336
337
  this._lastRunConfig = runConfig ?? {};
337
338
  const { unstable_composerMetadata: _, ...context } = this.getModelContext();
338
339
  runCallback = runCallback ?? this.adapters.chatModel.run.bind(this.adapters.chatModel);
339
- const abortSignal = this.abortController.signal;
340
+ const abortSignal = abortController.signal;
340
341
  const threadId = this._getThreadId?.();
341
342
  const promiseOrGenerator = runCallback({
342
343
  messages,
@@ -386,7 +387,7 @@ var LocalThreadRuntimeCore = class extends BaseThreadRuntimeCore {
386
387
  throw e;
387
388
  }
388
389
  } finally {
389
- this.abortController = null;
390
+ if (this.abortController === abortController) this.abortController = null;
390
391
  const history = this._options.adapters.history;
391
392
  const item = {
392
393
  parentId,