@assistant-ui/core 0.3.20 → 0.3.21

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 (905) hide show
  1. package/dist/adapters/attachment.d.ts +42 -34
  2. package/dist/adapters/attachment.d.ts.map +1 -1
  3. package/dist/adapters/attachment.js +51 -21
  4. package/dist/adapters/attachment.js.map +1 -1
  5. package/dist/adapters/directive-formatter.d.ts +1 -3
  6. package/dist/adapters/directive-formatter.d.ts.map +1 -1
  7. package/dist/adapters/feedback.d.ts +6 -7
  8. package/dist/adapters/feedback.d.ts.map +1 -1
  9. package/dist/adapters/index.d.ts +14 -9
  10. package/dist/adapters/index.d.ts.map +1 -0
  11. package/dist/adapters/index.js +1 -1
  12. package/dist/adapters/speech.d.ts +57 -58
  13. package/dist/adapters/speech.d.ts.map +1 -1
  14. package/dist/adapters/speech.js +16 -2
  15. package/dist/adapters/speech.js.map +1 -1
  16. package/dist/adapters/suggestion.d.ts +14 -16
  17. package/dist/adapters/suggestion.d.ts.map +1 -1
  18. package/dist/adapters/thread-history.d.ts +54 -51
  19. package/dist/adapters/thread-history.d.ts.map +1 -1
  20. package/dist/adapters/trigger.d.ts +7 -9
  21. package/dist/adapters/trigger.d.ts.map +1 -1
  22. package/dist/adapters/voice.d.ts +46 -40
  23. package/dist/adapters/voice.d.ts.map +1 -1
  24. package/dist/adapters/voice.js +17 -3
  25. package/dist/adapters/voice.js.map +1 -1
  26. package/dist/index.d.ts +70 -56
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +6 -6
  29. package/dist/index.js.map +1 -1
  30. package/dist/internal/duplicate-detection.d.ts +0 -2
  31. package/dist/internal/duplicate-detection.d.ts.map +1 -1
  32. package/dist/internal.d.ts +27 -58
  33. package/dist/internal.d.ts.map +1 -0
  34. package/dist/internal.js +8 -6
  35. package/dist/model-context/frame/host.d.ts +19 -21
  36. package/dist/model-context/frame/host.d.ts.map +1 -1
  37. package/dist/model-context/frame/host.js +3 -1
  38. package/dist/model-context/frame/host.js.map +1 -1
  39. package/dist/model-context/frame/provider.d.ts +27 -28
  40. package/dist/model-context/frame/provider.d.ts.map +1 -1
  41. package/dist/model-context/frame/provider.js +6 -0
  42. package/dist/model-context/frame/provider.js.map +1 -1
  43. package/dist/model-context/frame/types.d.ts +19 -21
  44. package/dist/model-context/frame/types.d.ts.map +1 -1
  45. package/dist/model-context/frame/validate.d.ts +3 -0
  46. package/dist/model-context/frame/validate.d.ts.map +1 -0
  47. package/dist/model-context/frame/validate.js +26 -0
  48. package/dist/model-context/frame/validate.js.map +1 -0
  49. package/dist/model-context/interactable-composer-metadata.d.ts +42 -29
  50. package/dist/model-context/interactable-composer-metadata.d.ts.map +1 -1
  51. package/dist/model-context/interactable-composer-metadata.js +30 -6
  52. package/dist/model-context/interactable-composer-metadata.js.map +1 -1
  53. package/dist/model-context/registry-handles.d.ts +6 -8
  54. package/dist/model-context/registry-handles.d.ts.map +1 -1
  55. package/dist/model-context/registry.d.ts +14 -16
  56. package/dist/model-context/registry.d.ts.map +1 -1
  57. package/dist/model-context/tool-call-text.d.ts +13 -14
  58. package/dist/model-context/tool-call-text.d.ts.map +1 -1
  59. package/dist/model-context/tool.d.ts +10 -11
  60. package/dist/model-context/tool.d.ts.map +1 -1
  61. package/dist/model-context/types.d.ts +32 -34
  62. package/dist/model-context/types.d.ts.map +1 -1
  63. package/dist/react/AssistantProvider.d.ts +6 -8
  64. package/dist/react/AssistantProvider.d.ts.map +1 -1
  65. package/dist/react/AssistantRuntimeProvider.d.ts +23 -25
  66. package/dist/react/AssistantRuntimeProvider.d.ts.map +1 -1
  67. package/dist/react/RuntimeAdapter.d.ts +2 -5
  68. package/dist/react/RuntimeAdapter.d.ts.map +1 -1
  69. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts +24 -18
  70. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
  71. package/dist/react/adapters/LocalStorageThreadListAdapter.js +58 -25
  72. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  73. package/dist/react/adapters/TitleGenerationAdapter.d.ts +2 -4
  74. package/dist/react/adapters/TitleGenerationAdapter.d.ts.map +1 -1
  75. package/dist/react/client/AdaptedRemoteThread.d.ts +5 -7
  76. package/dist/react/client/AdaptedRemoteThread.d.ts.map +1 -1
  77. package/dist/react/client/DataRenderers.d.ts +1 -3
  78. package/dist/react/client/DataRenderers.d.ts.map +1 -1
  79. package/dist/react/client/InMemoryThreadList.d.ts +6 -8
  80. package/dist/react/client/InMemoryThreadList.d.ts.map +1 -1
  81. package/dist/react/client/Interactables.d.ts +2 -4
  82. package/dist/react/client/Interactables.d.ts.map +1 -1
  83. package/dist/react/client/Interactables.js +306 -101
  84. package/dist/react/client/Interactables.js.map +1 -1
  85. package/dist/react/client/RemoteThreadList.d.ts +32 -34
  86. package/dist/react/client/RemoteThreadList.d.ts.map +1 -1
  87. package/dist/react/client/RemoteThreadList.js +2 -1
  88. package/dist/react/client/RemoteThreadList.js.map +1 -1
  89. package/dist/react/client/Tools.d.ts +9 -11
  90. package/dist/react/client/Tools.d.ts.map +1 -1
  91. package/dist/react/client/Tools.js +4 -8
  92. package/dist/react/client/Tools.js.map +1 -1
  93. package/dist/react/client/interactable-model-context.d.ts +9 -10
  94. package/dist/react/client/interactable-model-context.d.ts.map +1 -1
  95. package/dist/react/client/interactable-model-context.js +32 -22
  96. package/dist/react/client/interactable-model-context.js.map +1 -1
  97. package/dist/react/index.d.ts +160 -122
  98. package/dist/react/index.d.ts.map +1 -0
  99. package/dist/react/index.js +5 -5
  100. package/dist/react/interactables-legacy/Interactables.d.ts +1 -3
  101. package/dist/react/interactables-legacy/Interactables.d.ts.map +1 -1
  102. package/dist/react/interactables-legacy/Interactables.js +15 -8
  103. package/dist/react/interactables-legacy/Interactables.js.map +1 -1
  104. package/dist/react/interactables-legacy/interactable-model-context.d.ts +6 -8
  105. package/dist/react/interactables-legacy/interactable-model-context.d.ts.map +1 -1
  106. package/dist/react/interactables-legacy/interactable-model-context.js +13 -14
  107. package/dist/react/interactables-legacy/interactable-model-context.js.map +1 -1
  108. package/dist/react/interactables-legacy/scopes.d.ts +33 -36
  109. package/dist/react/interactables-legacy/scopes.d.ts.map +1 -1
  110. package/dist/react/interactables-legacy/useAssistantInteractable.d.ts +6 -8
  111. package/dist/react/interactables-legacy/useAssistantInteractable.d.ts.map +1 -1
  112. package/dist/react/interactables-legacy/useInteractableState.d.ts +6 -7
  113. package/dist/react/interactables-legacy/useInteractableState.d.ts.map +1 -1
  114. package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts +23 -13
  115. package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts.map +1 -1
  116. package/dist/react/interactables-shared/useInteractablePersistenceQueue.js +54 -25
  117. package/dist/react/interactables-shared/useInteractablePersistenceQueue.js.map +1 -1
  118. package/dist/react/model-context/define-mcp-toolkit.d.ts +11 -13
  119. package/dist/react/model-context/define-mcp-toolkit.d.ts.map +1 -1
  120. package/dist/react/model-context/define-toolkit.d.ts +12 -4
  121. package/dist/react/model-context/define-toolkit.d.ts.map +1 -1
  122. package/dist/react/model-context/external-tool.d.ts +0 -2
  123. package/dist/react/model-context/external-tool.d.ts.map +1 -1
  124. package/dist/react/model-context/human-tool.d.ts +0 -2
  125. package/dist/react/model-context/human-tool.d.ts.map +1 -1
  126. package/dist/react/model-context/interactableTool.d.ts +23 -25
  127. package/dist/react/model-context/interactableTool.d.ts.map +1 -1
  128. package/dist/react/model-context/makeAssistantDataUI.d.ts +4 -6
  129. package/dist/react/model-context/makeAssistantDataUI.d.ts.map +1 -1
  130. package/dist/react/model-context/makeAssistantTool.d.ts +4 -6
  131. package/dist/react/model-context/makeAssistantTool.d.ts.map +1 -1
  132. package/dist/react/model-context/makeAssistantToolUI.d.ts +4 -6
  133. package/dist/react/model-context/makeAssistantToolUI.d.ts.map +1 -1
  134. package/dist/react/model-context/provider-tool.d.ts +3 -4
  135. package/dist/react/model-context/provider-tool.d.ts.map +1 -1
  136. package/dist/react/model-context/stub-tool.d.ts +0 -2
  137. package/dist/react/model-context/stub-tool.d.ts.map +1 -1
  138. package/dist/react/model-context/toolbox.d.ts +37 -24
  139. package/dist/react/model-context/toolbox.d.ts.map +1 -1
  140. package/dist/react/model-context/useAssistantContext.d.ts +2 -5
  141. package/dist/react/model-context/useAssistantContext.d.ts.map +1 -1
  142. package/dist/react/model-context/useAssistantDataUI.d.ts +5 -7
  143. package/dist/react/model-context/useAssistantDataUI.d.ts.map +1 -1
  144. package/dist/react/model-context/useAssistantInstructions.d.ts +2 -5
  145. package/dist/react/model-context/useAssistantInstructions.d.ts.map +1 -1
  146. package/dist/react/model-context/useAssistantTool.d.ts +8 -11
  147. package/dist/react/model-context/useAssistantTool.d.ts.map +1 -1
  148. package/dist/react/model-context/useAssistantToolUI.d.ts +11 -13
  149. package/dist/react/model-context/useAssistantToolUI.d.ts.map +1 -1
  150. package/dist/react/model-context/useAuiToolOverrides.d.ts +2 -3
  151. package/dist/react/model-context/useAuiToolOverrides.d.ts.map +1 -1
  152. package/dist/react/model-context/useInlineRender.d.ts +2 -4
  153. package/dist/react/model-context/useInlineRender.d.ts.map +1 -1
  154. package/dist/react/model-context/useInteractable.d.ts +37 -36
  155. package/dist/react/model-context/useInteractable.d.ts.map +1 -1
  156. package/dist/react/model-context/useInteractableState.d.ts +10 -8
  157. package/dist/react/model-context/useInteractableState.d.ts.map +1 -1
  158. package/dist/react/model-context/useInteractableVersions.d.ts +3 -5
  159. package/dist/react/model-context/useInteractableVersions.d.ts.map +1 -1
  160. package/dist/react/model-context/useToolArgsStatus.d.ts +5 -6
  161. package/dist/react/model-context/useToolArgsStatus.d.ts.map +1 -1
  162. package/dist/react/primitive-hooks/useActionBarCopy.d.ts +6 -8
  163. package/dist/react/primitive-hooks/useActionBarCopy.d.ts.map +1 -1
  164. package/dist/react/primitive-hooks/useActionBarEdit.d.ts +2 -4
  165. package/dist/react/primitive-hooks/useActionBarEdit.d.ts.map +1 -1
  166. package/dist/react/primitive-hooks/useActionBarFeedback.d.ts +4 -6
  167. package/dist/react/primitive-hooks/useActionBarFeedback.d.ts.map +1 -1
  168. package/dist/react/primitive-hooks/useActionBarReload.d.ts +2 -4
  169. package/dist/react/primitive-hooks/useActionBarReload.d.ts.map +1 -1
  170. package/dist/react/primitive-hooks/useActionBarSpeak.d.ts +2 -4
  171. package/dist/react/primitive-hooks/useActionBarSpeak.d.ts.map +1 -1
  172. package/dist/react/primitive-hooks/useActionBarStopSpeaking.d.ts +2 -4
  173. package/dist/react/primitive-hooks/useActionBarStopSpeaking.d.ts.map +1 -1
  174. package/dist/react/primitive-hooks/useBranchPickerNext.d.ts +2 -4
  175. package/dist/react/primitive-hooks/useBranchPickerNext.d.ts.map +1 -1
  176. package/dist/react/primitive-hooks/useBranchPickerPrevious.d.ts +2 -4
  177. package/dist/react/primitive-hooks/useBranchPickerPrevious.d.ts.map +1 -1
  178. package/dist/react/primitive-hooks/useComposerAddAttachment.d.ts +3 -5
  179. package/dist/react/primitive-hooks/useComposerAddAttachment.d.ts.map +1 -1
  180. package/dist/react/primitive-hooks/useComposerCancel.d.ts +2 -4
  181. package/dist/react/primitive-hooks/useComposerCancel.d.ts.map +1 -1
  182. package/dist/react/primitive-hooks/useComposerDictate.d.ts +2 -4
  183. package/dist/react/primitive-hooks/useComposerDictate.d.ts.map +1 -1
  184. package/dist/react/primitive-hooks/useComposerSend.d.ts +3 -5
  185. package/dist/react/primitive-hooks/useComposerSend.d.ts.map +1 -1
  186. package/dist/react/primitive-hooks/useEditComposerCancel.d.ts +1 -3
  187. package/dist/react/primitive-hooks/useEditComposerCancel.d.ts.map +1 -1
  188. package/dist/react/primitive-hooks/useEditComposerSend.d.ts +2 -4
  189. package/dist/react/primitive-hooks/useEditComposerSend.d.ts.map +1 -1
  190. package/dist/react/primitive-hooks/useMessageBranching.d.ts +4 -6
  191. package/dist/react/primitive-hooks/useMessageBranching.d.ts.map +1 -1
  192. package/dist/react/primitive-hooks/useMessageError.d.ts +0 -2
  193. package/dist/react/primitive-hooks/useMessageError.d.ts.map +1 -1
  194. package/dist/react/primitive-hooks/useMessageReload.d.ts +2 -4
  195. package/dist/react/primitive-hooks/useMessageReload.d.ts.map +1 -1
  196. package/dist/react/primitive-hooks/useSuggestionTrigger.d.ts +6 -8
  197. package/dist/react/primitive-hooks/useSuggestionTrigger.d.ts.map +1 -1
  198. package/dist/react/primitive-hooks/useSuggestionTrigger.js +4 -4
  199. package/dist/react/primitive-hooks/useSuggestionTrigger.js.map +1 -1
  200. package/dist/react/primitive-hooks/useThreadIsEmpty.d.ts +0 -2
  201. package/dist/react/primitive-hooks/useThreadIsEmpty.d.ts.map +1 -1
  202. package/dist/react/primitive-hooks/useThreadIsRunning.d.ts +0 -2
  203. package/dist/react/primitive-hooks/useThreadIsRunning.d.ts.map +1 -1
  204. package/dist/react/primitive-hooks/useThreadListItemArchive.d.ts +1 -3
  205. package/dist/react/primitive-hooks/useThreadListItemArchive.d.ts.map +1 -1
  206. package/dist/react/primitive-hooks/useThreadListItemDelete.d.ts +1 -3
  207. package/dist/react/primitive-hooks/useThreadListItemDelete.d.ts.map +1 -1
  208. package/dist/react/primitive-hooks/useThreadListItemTrigger.d.ts +1 -3
  209. package/dist/react/primitive-hooks/useThreadListItemTrigger.d.ts.map +1 -1
  210. package/dist/react/primitive-hooks/useThreadListItemUnarchive.d.ts +1 -3
  211. package/dist/react/primitive-hooks/useThreadListItemUnarchive.d.ts.map +1 -1
  212. package/dist/react/primitive-hooks/useThreadListLoadMore.d.ts +2 -4
  213. package/dist/react/primitive-hooks/useThreadListLoadMore.d.ts.map +1 -1
  214. package/dist/react/primitive-hooks/useThreadListNew.d.ts +1 -3
  215. package/dist/react/primitive-hooks/useThreadListNew.d.ts.map +1 -1
  216. package/dist/react/primitive-hooks/useThreadMessageIds.d.ts +0 -2
  217. package/dist/react/primitive-hooks/useThreadMessageIds.d.ts.map +1 -1
  218. package/dist/react/primitive-hooks/useThreadMessages.d.ts +1 -3
  219. package/dist/react/primitive-hooks/useThreadMessages.d.ts.map +1 -1
  220. package/dist/react/primitive-hooks/useVoice.d.ts +5 -7
  221. package/dist/react/primitive-hooks/useVoice.d.ts.map +1 -1
  222. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.d.ts +25 -26
  223. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.d.ts.map +1 -1
  224. package/dist/react/primitives/composer/ComposerAttachments.d.ts +22 -23
  225. package/dist/react/primitives/composer/ComposerAttachments.d.ts.map +1 -1
  226. package/dist/react/primitives/composer/ComposerIf.d.ts +10 -9
  227. package/dist/react/primitives/composer/ComposerIf.d.ts.map +1 -1
  228. package/dist/react/primitives/composer/ComposerQueue.d.ts +11 -14
  229. package/dist/react/primitives/composer/ComposerQueue.d.ts.map +1 -1
  230. package/dist/react/primitives/generativeUI/GenerativeUI.d.ts +26 -28
  231. package/dist/react/primitives/generativeUI/GenerativeUI.d.ts.map +1 -1
  232. package/dist/react/primitives/generativeUI/GenerativeUI.js +16 -6
  233. package/dist/react/primitives/generativeUI/GenerativeUI.js.map +1 -1
  234. package/dist/react/primitives/message/MessageAttachments.d.ts +26 -23
  235. package/dist/react/primitives/message/MessageAttachments.d.ts.map +1 -1
  236. package/dist/react/primitives/message/MessageAttachments.js +14 -15
  237. package/dist/react/primitives/message/MessageAttachments.js.map +1 -1
  238. package/dist/react/primitives/message/MessageGroupedParts.d.ts +120 -117
  239. package/dist/react/primitives/message/MessageGroupedParts.d.ts.map +1 -1
  240. package/dist/react/primitives/message/MessageGroupedParts.js +3 -3
  241. package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
  242. package/dist/react/primitives/message/MessageParts.d.ts +199 -185
  243. package/dist/react/primitives/message/MessageParts.d.ts.map +1 -1
  244. package/dist/react/primitives/message/MessageParts.js +124 -82
  245. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  246. package/dist/react/primitives/message/MessageQuote.d.ts +6 -8
  247. package/dist/react/primitives/message/MessageQuote.d.ts.map +1 -1
  248. package/dist/react/primitives/messagePart/MessagePartInProgress.d.ts +2 -4
  249. package/dist/react/primitives/messagePart/MessagePartInProgress.d.ts.map +1 -1
  250. package/dist/react/primitives/part/PartMessages.d.ts +13 -15
  251. package/dist/react/primitives/part/PartMessages.d.ts.map +1 -1
  252. package/dist/react/primitives/thread/ThreadMessages.d.ts +54 -56
  253. package/dist/react/primitives/thread/ThreadMessages.d.ts.map +1 -1
  254. package/dist/react/primitives/thread/ThreadSuggestions.d.ts +20 -21
  255. package/dist/react/primitives/thread/ThreadSuggestions.d.ts.map +1 -1
  256. package/dist/react/primitives/thread/ThreadSuggestions.js +24 -5
  257. package/dist/react/primitives/thread/ThreadSuggestions.js.map +1 -1
  258. package/dist/react/primitives/threadList/ThreadListItems.d.ts +22 -23
  259. package/dist/react/primitives/threadList/ThreadListItems.d.ts.map +1 -1
  260. package/dist/react/primitives/threadListItem/ThreadListItemTitle.d.ts +4 -6
  261. package/dist/react/primitives/threadListItem/ThreadListItemTitle.d.ts.map +1 -1
  262. package/dist/react/providers/AttachmentByIndexProvider.d.ts +3 -5
  263. package/dist/react/providers/AttachmentByIndexProvider.d.ts.map +1 -1
  264. package/dist/react/providers/ChainOfThoughtByIndicesProvider.d.ts +3 -5
  265. package/dist/react/providers/ChainOfThoughtByIndicesProvider.d.ts.map +1 -1
  266. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.d.ts +2 -4
  267. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.d.ts.map +1 -1
  268. package/dist/react/providers/MessageByIdProvider.d.ts +2 -4
  269. package/dist/react/providers/MessageByIdProvider.d.ts.map +1 -1
  270. package/dist/react/providers/MessageByIndexProvider.d.ts +2 -4
  271. package/dist/react/providers/MessageByIndexProvider.d.ts.map +1 -1
  272. package/dist/react/providers/PartByIndexProvider.d.ts +2 -4
  273. package/dist/react/providers/PartByIndexProvider.d.ts.map +1 -1
  274. package/dist/react/providers/QueueItemByIndexProvider.d.ts +2 -4
  275. package/dist/react/providers/QueueItemByIndexProvider.d.ts.map +1 -1
  276. package/dist/react/providers/ReadonlyThreadProvider.d.ts +5 -7
  277. package/dist/react/providers/ReadonlyThreadProvider.d.ts.map +1 -1
  278. package/dist/react/providers/ReadonlyThreadProvider.js.map +1 -1
  279. package/dist/react/providers/SuggestionByIndexProvider.d.ts +2 -4
  280. package/dist/react/providers/SuggestionByIndexProvider.d.ts.map +1 -1
  281. package/dist/react/providers/TextMessagePartProvider.d.ts +3 -5
  282. package/dist/react/providers/TextMessagePartProvider.d.ts.map +1 -1
  283. package/dist/react/providers/TextMessagePartProvider.js +5 -1
  284. package/dist/react/providers/TextMessagePartProvider.js.map +1 -1
  285. package/dist/react/providers/ThreadListItemByIndexProvider.d.ts +3 -5
  286. package/dist/react/providers/ThreadListItemByIndexProvider.d.ts.map +1 -1
  287. package/dist/react/providers/ThreadListItemRuntimeProvider.d.ts +3 -6
  288. package/dist/react/providers/ThreadListItemRuntimeProvider.d.ts.map +1 -1
  289. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +209 -219
  290. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  291. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +53 -39
  292. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  293. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +185 -196
  294. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  295. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +13 -4
  296. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  297. package/dist/react/runtimes/RemoteThreadResource.d.ts +14 -19
  298. package/dist/react/runtimes/RemoteThreadResource.d.ts.map +1 -1
  299. package/dist/react/runtimes/RemoteThreadResource.js +3 -1
  300. package/dist/react/runtimes/RemoteThreadResource.js.map +1 -1
  301. package/dist/react/runtimes/RuntimeAdapterProvider.d.ts +8 -9
  302. package/dist/react/runtimes/RuntimeAdapterProvider.d.ts.map +1 -1
  303. package/dist/react/runtimes/assistant-transport/commandQueue.d.ts +9 -11
  304. package/dist/react/runtimes/assistant-transport/commandQueue.d.ts.map +1 -1
  305. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.d.ts +4 -5
  306. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.d.ts.map +1 -1
  307. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.js +9 -2
  308. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.js.map +1 -1
  309. package/dist/react/runtimes/assistant-transport/runManager.d.ts +7 -9
  310. package/dist/react/runtimes/assistant-transport/runManager.d.ts.map +1 -1
  311. package/dist/react/runtimes/assistant-transport/runManager.js +4 -1
  312. package/dist/react/runtimes/assistant-transport/runManager.js.map +1 -1
  313. package/dist/react/runtimes/assistant-transport/types.d.ts +106 -100
  314. package/dist/react/runtimes/assistant-transport/types.d.ts.map +1 -1
  315. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts +3 -5
  316. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts.map +1 -1
  317. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.js +17 -6
  318. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.js.map +1 -1
  319. package/dist/react/runtimes/assistant-transport/useConvertedState.d.ts +2 -4
  320. package/dist/react/runtimes/assistant-transport/useConvertedState.d.ts.map +1 -1
  321. package/dist/react/runtimes/assistant-transport/useLatestRef.d.ts +1 -3
  322. package/dist/react/runtimes/assistant-transport/useLatestRef.d.ts.map +1 -1
  323. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +5 -7
  324. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  325. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +410 -213
  326. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  327. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts +14 -16
  328. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts.map +1 -1
  329. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js +8 -4
  330. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js.map +1 -1
  331. package/dist/react/runtimes/cloud/auiV0.d.ts +136 -123
  332. package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
  333. package/dist/react/runtimes/cloud/auiV0.js +60 -9
  334. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  335. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts +9 -10
  336. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts.map +1 -1
  337. package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.d.ts +4 -5
  338. package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.d.ts.map +1 -1
  339. package/dist/react/runtimes/cloud/sdkIdentity.d.ts +1 -3
  340. package/dist/react/runtimes/cloud/sdkIdentity.d.ts.map +1 -1
  341. package/dist/react/runtimes/cloud/sdkIdentity.js +1 -1
  342. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts +2 -4
  343. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
  344. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.d.ts +8 -9
  345. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.d.ts.map +1 -1
  346. package/dist/react/runtimes/createMessageConverter.d.ts +14 -17
  347. package/dist/react/runtimes/createMessageConverter.d.ts.map +1 -1
  348. package/dist/react/runtimes/createMessageConverter.js.map +1 -1
  349. package/dist/react/runtimes/createRuntimeExtras.d.ts +11 -13
  350. package/dist/react/runtimes/createRuntimeExtras.d.ts.map +1 -1
  351. package/dist/react/runtimes/external-message-converter.d.ts +14 -18
  352. package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
  353. package/dist/react/runtimes/external-store-history-copy.d.ts +25 -0
  354. package/dist/react/runtimes/external-store-history-copy.d.ts.map +1 -0
  355. package/dist/react/runtimes/external-store-history-copy.js +148 -0
  356. package/dist/react/runtimes/external-store-history-copy.js.map +1 -0
  357. package/dist/react/runtimes/useExternalStoreRuntime.d.ts +2 -4
  358. package/dist/react/runtimes/useExternalStoreRuntime.d.ts.map +1 -1
  359. package/dist/react/runtimes/useExternalStoreRuntime.js +72 -35
  360. package/dist/react/runtimes/useExternalStoreRuntime.js.map +1 -1
  361. package/dist/react/runtimes/useExternalStoreSharedOptions.d.ts +1 -3
  362. package/dist/react/runtimes/useExternalStoreSharedOptions.d.ts.map +1 -1
  363. package/dist/react/runtimes/useLocalRuntime.d.ts +26 -37
  364. package/dist/react/runtimes/useLocalRuntime.d.ts.map +1 -1
  365. package/dist/react/runtimes/useLocalRuntime.js +142 -34
  366. package/dist/react/runtimes/useLocalRuntime.js.map +1 -1
  367. package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts +2 -4
  368. package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts.map +1 -1
  369. package/dist/react/runtimes/useRuntimeAdapters.d.ts +1 -3
  370. package/dist/react/runtimes/useRuntimeAdapters.d.ts.map +1 -1
  371. package/dist/react/runtimes/useStreamingTiming.d.ts +3 -5
  372. package/dist/react/runtimes/useStreamingTiming.d.ts.map +1 -1
  373. package/dist/react/types/MessagePartComponentTypes.d.ts +46 -43
  374. package/dist/react/types/MessagePartComponentTypes.d.ts.map +1 -1
  375. package/dist/react/types/scopes/dataRenderers.d.ts +8 -11
  376. package/dist/react/types/scopes/dataRenderers.d.ts.map +1 -1
  377. package/dist/react/types/scopes/interactables.d.ts +50 -49
  378. package/dist/react/types/scopes/interactables.d.ts.map +1 -1
  379. package/dist/react/types/scopes/tools.d.ts +17 -19
  380. package/dist/react/types/scopes/tools.d.ts.map +1 -1
  381. package/dist/react/types/store-augmentation.d.ts +10 -11
  382. package/dist/react/types/store-augmentation.d.ts.map +1 -1
  383. package/dist/react/utils/getMessageQuote.d.ts +5 -6
  384. package/dist/react/utils/getMessageQuote.d.ts.map +1 -1
  385. package/dist/react/utils/groupParts.d.ts +28 -29
  386. package/dist/react/utils/groupParts.d.ts.map +1 -1
  387. package/dist/react/utils/useJSONEqual.d.ts +1 -3
  388. package/dist/react/utils/useJSONEqual.d.ts.map +1 -1
  389. package/dist/react/utils/useJSONSchemaDependency.d.ts +2 -4
  390. package/dist/react/utils/useJSONSchemaDependency.d.ts.map +1 -1
  391. package/dist/runtime/api/assistant-runtime.d.ts +26 -28
  392. package/dist/runtime/api/assistant-runtime.d.ts.map +1 -1
  393. package/dist/runtime/api/attachment-runtime.d.ts +46 -43
  394. package/dist/runtime/api/attachment-runtime.d.ts.map +1 -1
  395. package/dist/runtime/api/attachment-runtime.js.map +1 -1
  396. package/dist/runtime/api/bindings.d.ts +31 -30
  397. package/dist/runtime/api/bindings.d.ts.map +1 -1
  398. package/dist/runtime/api/composer-runtime.d.ts +207 -193
  399. package/dist/runtime/api/composer-runtime.d.ts.map +1 -1
  400. package/dist/runtime/api/composer-runtime.js +4 -0
  401. package/dist/runtime/api/composer-runtime.js.map +1 -1
  402. package/dist/runtime/api/message-part-runtime.d.ts +28 -26
  403. package/dist/runtime/api/message-part-runtime.d.ts.map +1 -1
  404. package/dist/runtime/api/message-part-runtime.js +22 -0
  405. package/dist/runtime/api/message-part-runtime.js.map +1 -1
  406. package/dist/runtime/api/message-runtime.d.ts +87 -84
  407. package/dist/runtime/api/message-runtime.d.ts.map +1 -1
  408. package/dist/runtime/api/message-runtime.js +1 -1
  409. package/dist/runtime/api/message-runtime.js.map +1 -1
  410. package/dist/runtime/api/paths.d.ts +48 -50
  411. package/dist/runtime/api/paths.d.ts.map +1 -1
  412. package/dist/runtime/api/thread-list-item-runtime.d.ts +64 -66
  413. package/dist/runtime/api/thread-list-item-runtime.d.ts.map +1 -1
  414. package/dist/runtime/api/thread-list-item-runtime.js.map +1 -1
  415. package/dist/runtime/api/thread-list-runtime.d.ts +73 -76
  416. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  417. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  418. package/dist/runtime/api/thread-runtime.d.ts +299 -300
  419. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  420. package/dist/runtime/api/thread-runtime.js +2 -1
  421. package/dist/runtime/api/thread-runtime.js.map +1 -1
  422. package/dist/runtime/base/base-assistant-runtime-core.d.ts +8 -10
  423. package/dist/runtime/base/base-assistant-runtime-core.d.ts.map +1 -1
  424. package/dist/runtime/base/base-composer-runtime-core.d.ts +149 -99
  425. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  426. package/dist/runtime/base/base-composer-runtime-core.js +400 -122
  427. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  428. package/dist/runtime/base/base-thread-runtime-core.d.ts +120 -108
  429. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  430. package/dist/runtime/base/base-thread-runtime-core.js +109 -41
  431. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  432. package/dist/runtime/base/default-edit-composer-runtime-core.d.ts +29 -29
  433. package/dist/runtime/base/default-edit-composer-runtime-core.d.ts.map +1 -1
  434. package/dist/runtime/base/default-edit-composer-runtime-core.js +10 -1
  435. package/dist/runtime/base/default-edit-composer-runtime-core.js.map +1 -1
  436. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +27 -29
  437. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
  438. package/dist/runtime/base/default-thread-composer-runtime-core.js +21 -6
  439. package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
  440. package/dist/runtime/branch/external-thread-branch-adapter.d.ts +14 -16
  441. package/dist/runtime/branch/external-thread-branch-adapter.d.ts.map +1 -1
  442. package/dist/runtime/interfaces/assistant-runtime-core.d.ts +7 -9
  443. package/dist/runtime/interfaces/assistant-runtime-core.d.ts.map +1 -1
  444. package/dist/runtime/interfaces/composer-runtime-core.d.ts +88 -72
  445. package/dist/runtime/interfaces/composer-runtime-core.d.ts.map +1 -1
  446. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +63 -65
  447. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
  448. package/dist/runtime/interfaces/thread-runtime-core.d.ts +210 -197
  449. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  450. package/dist/runtime/internal.d.ts +25 -20
  451. package/dist/runtime/internal.d.ts.map +1 -0
  452. package/dist/runtime/queue/external-thread-queue-adapter.d.ts +35 -37
  453. package/dist/runtime/queue/external-thread-queue-adapter.d.ts.map +1 -1
  454. package/dist/runtime/queue/message-queue.d.ts +29 -31
  455. package/dist/runtime/queue/message-queue.d.ts.map +1 -1
  456. package/dist/runtime/queue/message-queue.js +1 -1
  457. package/dist/runtime/queue/queue-item.d.ts +5 -7
  458. package/dist/runtime/queue/queue-item.d.ts.map +1 -1
  459. package/dist/runtime/utils/abortable-thread-load.d.ts +7 -8
  460. package/dist/runtime/utils/abortable-thread-load.d.ts.map +1 -1
  461. package/dist/runtime/utils/attachment-add-operations.d.ts +13 -11
  462. package/dist/runtime/utils/attachment-add-operations.d.ts.map +1 -1
  463. package/dist/runtime/utils/attachment-add-operations.js +24 -2
  464. package/dist/runtime/utils/attachment-add-operations.js.map +1 -1
  465. package/dist/runtime/utils/attachment-send-operations.d.ts +12 -0
  466. package/dist/runtime/utils/attachment-send-operations.d.ts.map +1 -0
  467. package/dist/runtime/utils/attachment-send-operations.js +34 -0
  468. package/dist/runtime/utils/attachment-send-operations.js.map +1 -0
  469. package/dist/runtime/utils/auto-status.d.ts +4 -5
  470. package/dist/runtime/utils/auto-status.d.ts.map +1 -1
  471. package/dist/runtime/utils/auto-status.js +3 -5
  472. package/dist/runtime/utils/auto-status.js.map +1 -1
  473. package/dist/runtime/utils/chat-model-adapter.d.ts +26 -27
  474. package/dist/runtime/utils/chat-model-adapter.d.ts.map +1 -1
  475. package/dist/runtime/utils/external-message-conversion.d.ts +32 -32
  476. package/dist/runtime/utils/external-message-conversion.d.ts.map +1 -1
  477. package/dist/runtime/utils/external-message-conversion.js +3 -3
  478. package/dist/runtime/utils/external-message-conversion.js.map +1 -1
  479. package/dist/runtime/utils/external-store-message.d.ts +2 -4
  480. package/dist/runtime/utils/external-store-message.d.ts.map +1 -1
  481. package/dist/runtime/utils/message-repository-session.d.ts +21 -23
  482. package/dist/runtime/utils/message-repository-session.d.ts.map +1 -1
  483. package/dist/runtime/utils/message-repository.d.ts +50 -51
  484. package/dist/runtime/utils/message-repository.d.ts.map +1 -1
  485. package/dist/runtime/utils/message-repository.js +8 -7
  486. package/dist/runtime/utils/message-repository.js.map +1 -1
  487. package/dist/runtime/utils/pending-tool-calls.d.ts +10 -11
  488. package/dist/runtime/utils/pending-tool-calls.d.ts.map +1 -1
  489. package/dist/runtime/utils/resolveToolApprovalResponse.d.ts +6 -8
  490. package/dist/runtime/utils/resolveToolApprovalResponse.d.ts.map +1 -1
  491. package/dist/runtime/utils/runtime-extras-brand.d.ts +4 -6
  492. package/dist/runtime/utils/runtime-extras-brand.d.ts.map +1 -1
  493. package/dist/runtime/utils/stored-message-parts.d.ts +5 -5
  494. package/dist/runtime/utils/stored-message-parts.d.ts.map +1 -1
  495. package/dist/runtime/utils/stored-message-parts.js +22 -2
  496. package/dist/runtime/utils/stored-message-parts.js.map +1 -1
  497. package/dist/runtime/utils/streaming-timing.d.ts +19 -21
  498. package/dist/runtime/utils/streaming-timing.d.ts.map +1 -1
  499. package/dist/runtime/utils/thread-message-like.d.ts +36 -32
  500. package/dist/runtime/utils/thread-message-like.d.ts.map +1 -1
  501. package/dist/runtime/utils/thread-message-like.js +16 -6
  502. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  503. package/dist/runtime/utils/thread-runtime-lifecycle.d.ts +4 -5
  504. package/dist/runtime/utils/thread-runtime-lifecycle.d.ts.map +1 -1
  505. package/dist/runtime/utils/thread-runtime-lifecycle.js +31 -4
  506. package/dist/runtime/utils/thread-runtime-lifecycle.js.map +1 -1
  507. package/dist/runtime/utils/tool-call-tree.d.ts +6 -8
  508. package/dist/runtime/utils/tool-call-tree.d.ts.map +1 -1
  509. package/dist/runtime/utils/tool-interactions.d.ts +10 -0
  510. package/dist/runtime/utils/tool-interactions.d.ts.map +1 -0
  511. package/dist/runtime/utils/tool-interactions.js +92 -0
  512. package/dist/runtime/utils/tool-interactions.js.map +1 -0
  513. package/dist/runtimes/assistant-transport/utils.d.ts +0 -2
  514. package/dist/runtimes/assistant-transport/utils.d.ts.map +1 -1
  515. package/dist/runtimes/external-store/external-store-adapter.d.ts +215 -198
  516. package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
  517. package/dist/runtimes/external-store/external-store-runtime-core.d.ts +5 -6
  518. package/dist/runtimes/external-store/external-store-runtime-core.d.ts.map +1 -1
  519. package/dist/runtimes/external-store/external-store-runtime-core.js +4 -1
  520. package/dist/runtimes/external-store/external-store-runtime-core.js.map +1 -1
  521. package/dist/runtimes/external-store/external-store-shared-options.d.ts +1 -3
  522. package/dist/runtimes/external-store/external-store-shared-options.d.ts.map +1 -1
  523. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts +38 -40
  524. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  525. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +2 -2
  526. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  527. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +117 -124
  528. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  529. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +44 -14
  530. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  531. package/dist/runtimes/external-store/thread-message-converter.d.ts +3 -5
  532. package/dist/runtimes/external-store/thread-message-converter.d.ts.map +1 -1
  533. package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts +94 -95
  534. package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts.map +1 -1
  535. package/dist/runtimes/inert/InertThreadRuntimeCore.js +3 -0
  536. package/dist/runtimes/inert/InertThreadRuntimeCore.js.map +1 -1
  537. package/dist/runtimes/internal.d.ts +20 -16
  538. package/dist/runtimes/internal.d.ts.map +1 -0
  539. package/dist/runtimes/local/local-runtime-core.d.ts +6 -8
  540. package/dist/runtimes/local/local-runtime-core.d.ts.map +1 -1
  541. package/dist/runtimes/local/local-runtime-options.d.ts +40 -42
  542. package/dist/runtimes/local/local-runtime-options.d.ts.map +1 -1
  543. package/dist/runtimes/local/local-thread-list-runtime-core.d.ts +40 -42
  544. package/dist/runtimes/local/local-thread-list-runtime-core.d.ts.map +1 -1
  545. package/dist/runtimes/local/local-thread-runtime-core.d.ts +93 -97
  546. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  547. package/dist/runtimes/local/local-thread-runtime-core.js +178 -31
  548. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  549. package/dist/runtimes/local/should-continue.d.ts +1 -3
  550. package/dist/runtimes/local/should-continue.d.ts.map +1 -1
  551. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +76 -53
  552. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
  553. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js +28 -1
  554. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js.map +1 -1
  555. package/dist/runtimes/remote-thread-list/adapter/in-memory.d.ts +11 -13
  556. package/dist/runtimes/remote-thread-list/adapter/in-memory.d.ts.map +1 -1
  557. package/dist/runtimes/remote-thread-list/adapter-changed.d.ts +2 -4
  558. package/dist/runtimes/remote-thread-list/adapter-changed.d.ts.map +1 -1
  559. package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts +1 -3
  560. package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts.map +1 -1
  561. package/dist/runtimes/remote-thread-list/optimistic-state.d.ts +33 -29
  562. package/dist/runtimes/remote-thread-list/optimistic-state.d.ts.map +1 -1
  563. package/dist/runtimes/remote-thread-list/optimistic-state.js +8 -3
  564. package/dist/runtimes/remote-thread-list/optimistic-state.js.map +1 -1
  565. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +44 -46
  566. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -1
  567. package/dist/runtimes/remote-thread-list/remote-thread-state.js +1 -1
  568. package/dist/runtimes/remote-thread-list/title-generation.d.ts +25 -26
  569. package/dist/runtimes/remote-thread-list/title-generation.d.ts.map +1 -1
  570. package/dist/runtimes/remote-thread-list/title.d.ts +3 -5
  571. package/dist/runtimes/remote-thread-list/title.d.ts.map +1 -1
  572. package/dist/runtimes/remote-thread-list/types.d.ts +111 -112
  573. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  574. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts +144 -145
  575. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
  576. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +22 -7
  577. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  578. package/dist/store/clients/chain-of-thought-client.d.ts +7 -9
  579. package/dist/store/clients/chain-of-thought-client.d.ts.map +1 -1
  580. package/dist/store/clients/external-thread.d.ts +53 -54
  581. package/dist/store/clients/external-thread.d.ts.map +1 -1
  582. package/dist/store/clients/external-thread.js +1256 -731
  583. package/dist/store/clients/external-thread.js.map +1 -1
  584. package/dist/store/clients/model-context-client.d.ts +1 -3
  585. package/dist/store/clients/model-context-client.d.ts.map +1 -1
  586. package/dist/store/clients/no-op-composer-client.d.ts +2 -4
  587. package/dist/store/clients/no-op-composer-client.d.ts.map +1 -1
  588. package/dist/store/clients/no-op-composer-client.js +3 -1
  589. package/dist/store/clients/no-op-composer-client.js.map +1 -1
  590. package/dist/store/clients/runtime-adapter.d.ts +1 -3
  591. package/dist/store/clients/runtime-adapter.d.ts.map +1 -1
  592. package/dist/store/clients/single-thread-list.d.ts +3 -4
  593. package/dist/store/clients/single-thread-list.d.ts.map +1 -1
  594. package/dist/store/clients/submission-message.d.ts +8 -0
  595. package/dist/store/clients/submission-message.d.ts.map +1 -0
  596. package/dist/store/clients/submission-message.js +22 -0
  597. package/dist/store/clients/submission-message.js.map +1 -0
  598. package/dist/store/clients/suggestions.d.ts +5 -7
  599. package/dist/store/clients/suggestions.d.ts.map +1 -1
  600. package/dist/store/clients/thread-message-client.d.ts +10 -9
  601. package/dist/store/clients/thread-message-client.d.ts.map +1 -1
  602. package/dist/store/clients/thread-message-client.js +81 -82
  603. package/dist/store/clients/thread-message-client.js.map +1 -1
  604. package/dist/store/clients/thread-selection-events.d.ts +0 -2
  605. package/dist/store/clients/thread-selection-events.d.ts.map +1 -1
  606. package/dist/store/clients/thread-tasks.d.ts +4 -6
  607. package/dist/store/clients/thread-tasks.d.ts.map +1 -1
  608. package/dist/store/env.d.ts +0 -2
  609. package/dist/store/env.d.ts.map +1 -1
  610. package/dist/store/index.d.ts +33 -36
  611. package/dist/store/index.d.ts.map +1 -0
  612. package/dist/store/index.js +5 -5
  613. package/dist/store/internal.d.ts +12 -12
  614. package/dist/store/internal.d.ts.map +1 -0
  615. package/dist/store/internal.js +2 -2
  616. package/dist/store/primitive-predicates.d.ts +3 -4
  617. package/dist/store/primitive-predicates.d.ts.map +1 -1
  618. package/dist/store/primitive-predicates.js +9 -4
  619. package/dist/store/primitive-predicates.js.map +1 -1
  620. package/dist/store/runtime-clients/attachment-runtime-client.d.ts +3 -5
  621. package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -1
  622. package/dist/store/runtime-clients/composer-runtime-client.d.ts +10 -12
  623. package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
  624. package/dist/store/runtime-clients/composer-runtime-client.js +65 -62
  625. package/dist/store/runtime-clients/composer-runtime-client.js.map +1 -1
  626. package/dist/store/runtime-clients/handle-runtime-action.d.ts +0 -2
  627. package/dist/store/runtime-clients/handle-runtime-action.d.ts.map +1 -1
  628. package/dist/store/runtime-clients/handle-thread-list-action.d.ts +0 -2
  629. package/dist/store/runtime-clients/handle-thread-list-action.d.ts.map +1 -1
  630. package/dist/store/runtime-clients/liveRef.d.ts +1 -3
  631. package/dist/store/runtime-clients/liveRef.d.ts.map +1 -1
  632. package/dist/store/runtime-clients/message-part-runtime-client.d.ts +3 -5
  633. package/dist/store/runtime-clients/message-part-runtime-client.d.ts.map +1 -1
  634. package/dist/store/runtime-clients/message-part-runtime-client.js +26 -16
  635. package/dist/store/runtime-clients/message-part-runtime-client.js.map +1 -1
  636. package/dist/store/runtime-clients/message-runtime-client.d.ts +9 -9
  637. package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
  638. package/dist/store/runtime-clients/message-runtime-client.js +121 -113
  639. package/dist/store/runtime-clients/message-runtime-client.js.map +1 -1
  640. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts +4 -6
  641. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  642. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts +5 -7
  643. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  644. package/dist/store/runtime-clients/thread-runtime-client.d.ts +3 -5
  645. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  646. package/dist/store/runtime-clients/thread-runtime-client.js +221 -158
  647. package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
  648. package/dist/store/runtime-clients/useSubscribable.d.ts +2 -4
  649. package/dist/store/runtime-clients/useSubscribable.d.ts.map +1 -1
  650. package/dist/store/scope-registration.d.ts +28 -29
  651. package/dist/store/scope-registration.d.ts.map +1 -1
  652. package/dist/store/scopes/attachment.d.ts +15 -17
  653. package/dist/store/scopes/attachment.d.ts.map +1 -1
  654. package/dist/store/scopes/chain-of-thought.d.ts +28 -29
  655. package/dist/store/scopes/chain-of-thought.d.ts.map +1 -1
  656. package/dist/store/scopes/composer.d.ts +141 -128
  657. package/dist/store/scopes/composer.d.ts.map +1 -1
  658. package/dist/store/scopes/message.d.ts +114 -107
  659. package/dist/store/scopes/message.d.ts.map +1 -1
  660. package/dist/store/scopes/model-context.d.ts +7 -9
  661. package/dist/store/scopes/model-context.d.ts.map +1 -1
  662. package/dist/store/scopes/part.d.ts +49 -45
  663. package/dist/store/scopes/part.d.ts.map +1 -1
  664. package/dist/store/scopes/queue-item.d.ts +18 -20
  665. package/dist/store/scopes/queue-item.d.ts.map +1 -1
  666. package/dist/store/scopes/suggestion.d.ts +10 -12
  667. package/dist/store/scopes/suggestion.d.ts.map +1 -1
  668. package/dist/store/scopes/suggestions.d.ts +13 -15
  669. package/dist/store/scopes/suggestions.d.ts.map +1 -1
  670. package/dist/store/scopes/task.d.ts +23 -25
  671. package/dist/store/scopes/task.d.ts.map +1 -1
  672. package/dist/store/scopes/thread-list-item.d.ts +63 -65
  673. package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
  674. package/dist/store/scopes/thread.d.ts +192 -194
  675. package/dist/store/scopes/thread.d.ts.map +1 -1
  676. package/dist/store/scopes/threads.d.ts +45 -47
  677. package/dist/store/scopes/threads.d.ts.map +1 -1
  678. package/dist/subscribable/subscribable.d.ts +58 -53
  679. package/dist/subscribable/subscribable.d.ts.map +1 -1
  680. package/dist/subscribable/subscribable.js +35 -7
  681. package/dist/subscribable/subscribable.js.map +1 -1
  682. package/dist/types/attachment.d.ts +26 -27
  683. package/dist/types/attachment.d.ts.map +1 -1
  684. package/dist/types/augmentations.d.ts +4 -4
  685. package/dist/types/augmentations.d.ts.map +1 -1
  686. package/dist/types/directive.d.ts +11 -13
  687. package/dist/types/directive.d.ts.map +1 -1
  688. package/dist/types/error.d.ts +7 -8
  689. package/dist/types/error.d.ts.map +1 -1
  690. package/dist/types/index.d.ts +7 -7
  691. package/dist/types/index.d.ts.map +1 -0
  692. package/dist/types/message.d.ts +322 -284
  693. package/dist/types/message.d.ts.map +1 -1
  694. package/dist/types/message.js.map +1 -1
  695. package/dist/types/quote.d.ts +2 -4
  696. package/dist/types/quote.d.ts.map +1 -1
  697. package/dist/types/trigger.d.ts +8 -10
  698. package/dist/types/trigger.d.ts.map +1 -1
  699. package/dist/types/unsubscribe.d.ts +0 -2
  700. package/dist/types/unsubscribe.d.ts.map +1 -1
  701. package/dist/utils/abortable-iterable.d.ts +0 -2
  702. package/dist/utils/abortable-iterable.d.ts.map +1 -1
  703. package/dist/utils/composite-context-provider.d.ts +8 -11
  704. package/dist/utils/composite-context-provider.d.ts.map +1 -1
  705. package/dist/utils/data-url.d.ts +10 -12
  706. package/dist/utils/data-url.d.ts.map +1 -1
  707. package/dist/utils/getGroupStatus.d.ts +17 -18
  708. package/dist/utils/getGroupStatus.d.ts.map +1 -1
  709. package/dist/utils/id.d.ts +0 -2
  710. package/dist/utils/id.d.ts.map +1 -1
  711. package/dist/utils/image-media-type.d.ts +0 -2
  712. package/dist/utils/image-media-type.d.ts.map +1 -1
  713. package/dist/utils/invoke-user-callback.d.ts +0 -2
  714. package/dist/utils/invoke-user-callback.d.ts.map +1 -1
  715. package/dist/utils/json/is-json-equal.d.ts +0 -2
  716. package/dist/utils/json/is-json-equal.d.ts.map +1 -1
  717. package/dist/utils/json/is-json.d.ts +1 -3
  718. package/dist/utils/json/is-json.d.ts.map +1 -1
  719. package/dist/utils/json/stable-stringify-tool-args.d.ts +1 -3
  720. package/dist/utils/json/stable-stringify-tool-args.d.ts.map +1 -1
  721. package/dist/utils/normalizePartStatus.d.ts +2 -3
  722. package/dist/utils/normalizePartStatus.d.ts.map +1 -1
  723. package/dist/utils/normalizePartStatus.js +3 -2
  724. package/dist/utils/normalizePartStatus.js.map +1 -1
  725. package/dist/utils/notify-event-listeners.d.ts +1 -2
  726. package/dist/utils/notify-event-listeners.d.ts.map +1 -1
  727. package/dist/utils/record.d.ts +0 -2
  728. package/dist/utils/record.d.ts.map +1 -1
  729. package/dist/utils/silent-runtime-action.d.ts +0 -2
  730. package/dist/utils/silent-runtime-action.d.ts.map +1 -1
  731. package/dist/utils/text.d.ts +1 -3
  732. package/dist/utils/text.d.ts.map +1 -1
  733. package/dist/utils/wire-media.d.ts +0 -2
  734. package/dist/utils/wire-media.d.ts.map +1 -1
  735. package/package.json +11 -10
  736. package/src/adapters/attachment.test.ts +98 -1
  737. package/src/adapters/attachment.ts +70 -20
  738. package/src/adapters/speech.test.ts +94 -0
  739. package/src/adapters/speech.ts +16 -2
  740. package/src/adapters/thread-history.ts +16 -5
  741. package/src/adapters/voice.test.ts +169 -0
  742. package/src/adapters/voice.ts +25 -4
  743. package/src/index.ts +14 -2
  744. package/src/internal.ts +7 -0
  745. package/src/model-context/frame/host.test.ts +51 -1
  746. package/src/model-context/frame/host.ts +3 -1
  747. package/src/model-context/frame/provider.test.ts +61 -0
  748. package/src/model-context/frame/provider.ts +8 -1
  749. package/src/model-context/frame/validate.ts +57 -0
  750. package/src/model-context/interactable-composer-metadata.test.ts +82 -0
  751. package/src/model-context/interactable-composer-metadata.ts +45 -2
  752. package/src/react/adapters/LocalStorageThreadListAdapter.test.ts +594 -0
  753. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +98 -35
  754. package/src/react/client/Interactables.test.ts +853 -1
  755. package/src/react/client/Interactables.ts +325 -45
  756. package/src/react/client/RemoteThreadList.initialize-failure.test.ts +124 -0
  757. package/src/react/client/RemoteThreadList.ts +6 -0
  758. package/src/react/client/Tools.ts +2 -3
  759. package/src/react/client/interactable-model-context.test.ts +56 -13
  760. package/src/react/client/interactable-model-context.ts +48 -23
  761. package/src/react/index.ts +2 -2
  762. package/src/react/interactables-legacy/Interactables.test.ts +212 -1
  763. package/src/react/interactables-legacy/Interactables.ts +25 -14
  764. package/src/react/interactables-legacy/interactable-model-context.ts +26 -24
  765. package/src/react/interactables-shared/useInteractablePersistenceQueue.test.tsx +22 -2
  766. package/src/react/interactables-shared/useInteractablePersistenceQueue.ts +63 -11
  767. package/src/react/primitive-hooks/useSuggestionTrigger.test.ts +33 -0
  768. package/src/react/primitive-hooks/useSuggestionTrigger.ts +7 -4
  769. package/src/react/primitives/generativeUI/GenerativeUI.test.tsx +124 -8
  770. package/src/react/primitives/generativeUI/GenerativeUI.tsx +35 -15
  771. package/src/react/primitives/message/MessageAttachments.test.tsx +2 -6
  772. package/src/react/primitives/message/MessageAttachments.tsx +14 -8
  773. package/src/react/primitives/message/MessageGroupedParts.test.tsx +151 -7
  774. package/src/react/primitives/message/MessageGroupedParts.tsx +19 -6
  775. package/src/react/primitives/message/MessageParts.test.tsx +84 -0
  776. package/src/react/primitives/message/MessageParts.tool-interaction.test.tsx +69 -0
  777. package/src/react/primitives/message/MessageParts.tsx +29 -8
  778. package/src/react/primitives/thread/ThreadSuggestions.test.tsx +97 -0
  779. package/src/react/primitives/thread/ThreadSuggestions.tsx +29 -6
  780. package/src/react/providers/ReadonlyThreadProvider.tsx +2 -2
  781. package/src/react/providers/TextMessagePartProvider.tsx +3 -0
  782. package/src/react/runtimes/RemoteThreadListHookInstanceManager.running.test.tsx +93 -0
  783. package/src/react/runtimes/RemoteThreadListHookInstanceManager.test.tsx +160 -3
  784. package/src/react/runtimes/RemoteThreadListHookInstanceManager.title.test.tsx +38 -0
  785. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +73 -53
  786. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +19 -3
  787. package/src/react/runtimes/RemoteThreadResource.ts +5 -2
  788. package/src/react/runtimes/assistant-transport/replayBoundaryStream.test.ts +3 -1
  789. package/src/react/runtimes/assistant-transport/replayBoundaryStream.ts +10 -2
  790. package/src/react/runtimes/assistant-transport/runManager.ts +3 -0
  791. package/src/react/runtimes/assistant-transport/transport-parentid.test.tsx +57 -0
  792. package/src/react/runtimes/assistant-transport/transport-thread-id.test.tsx +571 -0
  793. package/src/react/runtimes/assistant-transport/types.ts +9 -1
  794. package/src/react/runtimes/assistant-transport/useAssistantTransport.spec.md +10 -0
  795. package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.test.tsx +42 -0
  796. package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.ts +33 -9
  797. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.copy.integration.test.tsx +289 -0
  798. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.copy.test.tsx +471 -0
  799. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.engagement.test.tsx +330 -0
  800. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.ts +78 -2
  801. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +361 -2
  802. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +571 -216
  803. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.test.ts +25 -0
  804. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts +7 -3
  805. package/src/react/runtimes/cloud/auiV0.ts +158 -9
  806. package/src/react/runtimes/cloud/auiV0DecodeSafely.test.ts +352 -1
  807. package/src/react/runtimes/createMessageConverter.ts +9 -3
  808. package/src/react/runtimes/external-store-history-copy.ts +223 -0
  809. package/src/react/runtimes/useExternalStoreRuntime.history-copy.test.tsx +483 -0
  810. package/src/react/runtimes/useExternalStoreRuntime.lifecycle.test.tsx +76 -1
  811. package/src/react/runtimes/useExternalStoreRuntime.ts +25 -5
  812. package/src/react/runtimes/useLocalRuntime.test.tsx +145 -1
  813. package/src/react/runtimes/useLocalRuntime.ts +8 -5
  814. package/src/react/types/MessagePartComponentTypes.ts +10 -0
  815. package/src/react/types/scopes/interactables.ts +3 -0
  816. package/src/runtime/api/attachment-runtime.ts +10 -5
  817. package/src/runtime/api/bindings.ts +6 -1
  818. package/src/runtime/api/composer-runtime.ts +29 -6
  819. package/src/runtime/api/message-part-runtime.test.ts +215 -0
  820. package/src/runtime/api/message-part-runtime.ts +40 -0
  821. package/src/runtime/api/message-runtime.test.ts +112 -2
  822. package/src/runtime/api/message-runtime.ts +10 -5
  823. package/src/runtime/api/thread-list-item-runtime.ts +5 -5
  824. package/src/runtime/api/thread-list-runtime.ts +3 -3
  825. package/src/runtime/api/thread-runtime.test.ts +59 -0
  826. package/src/runtime/api/thread-runtime.ts +21 -11
  827. package/src/runtime/base/base-composer-runtime-core.ts +548 -153
  828. package/src/runtime/base/base-thread-runtime-core.test.ts +744 -9
  829. package/src/runtime/base/base-thread-runtime-core.ts +154 -27
  830. package/src/runtime/base/default-edit-composer-runtime-core.ts +13 -1
  831. package/src/runtime/base/default-thread-composer-runtime-core.ts +29 -10
  832. package/src/runtime/interfaces/composer-runtime-core.ts +19 -0
  833. package/src/runtime/interfaces/thread-runtime-core.ts +22 -1
  834. package/src/runtime/utils/attachment-add-operations.ts +45 -2
  835. package/src/runtime/utils/attachment-send-operations.ts +54 -0
  836. package/src/runtime/utils/auto-status.test.ts +54 -0
  837. package/src/runtime/utils/auto-status.ts +3 -10
  838. package/src/runtime/utils/external-message-conversion.test.ts +48 -0
  839. package/src/runtime/utils/external-message-conversion.ts +3 -4
  840. package/src/runtime/utils/message-repository.test.ts +69 -1
  841. package/src/runtime/utils/message-repository.ts +14 -7
  842. package/src/runtime/utils/stored-message-parts.ts +43 -1
  843. package/src/runtime/utils/thread-message-like.test.ts +58 -0
  844. package/src/runtime/utils/thread-message-like.ts +72 -46
  845. package/src/runtime/utils/thread-runtime-lifecycle.test.ts +67 -0
  846. package/src/runtime/utils/thread-runtime-lifecycle.ts +42 -8
  847. package/src/runtime/utils/tool-interactions.test.ts +193 -0
  848. package/src/runtime/utils/tool-interactions.ts +147 -0
  849. package/src/runtimes/external-store/external-store-adapter.ts +22 -1
  850. package/src/runtimes/external-store/external-store-runtime-core.ts +10 -2
  851. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +2 -2
  852. package/src/runtimes/external-store/external-store-thread-runtime-core.test.ts +49 -0
  853. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +76 -29
  854. package/src/runtimes/inert/InertThreadRuntimeCore.test.ts +127 -56
  855. package/src/runtimes/inert/InertThreadRuntimeCore.ts +10 -1
  856. package/src/runtimes/local/local-thread-runtime-core.edit-cancellation.test.ts +70 -0
  857. package/src/runtimes/local/local-thread-runtime-core.test.ts +1649 -108
  858. package/src/runtimes/local/local-thread-runtime-core.ts +301 -47
  859. package/src/runtimes/readonly/ReadonlyThreadRuntimeCore.ts +53 -1
  860. package/src/runtimes/remote-thread-list/optimistic-state.ts +8 -3
  861. package/src/runtimes/tool-invocations/EDGE_CASES.md +19 -4
  862. package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +392 -39
  863. package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +31 -8
  864. package/src/store/clients/external-thread.test.ts +145 -0
  865. package/src/store/clients/external-thread.ts +635 -131
  866. package/src/store/clients/model-context-client.test.ts +8 -8
  867. package/src/store/clients/no-op-composer-client.ts +2 -0
  868. package/src/store/clients/submission-message.ts +27 -0
  869. package/src/store/clients/thread-message-client.test.ts +39 -0
  870. package/src/store/clients/thread-message-client.ts +13 -6
  871. package/src/store/index.ts +2 -2
  872. package/src/store/internal.ts +1 -0
  873. package/src/store/primitive-predicates.test.ts +103 -0
  874. package/src/store/primitive-predicates.ts +15 -3
  875. package/src/store/runtime-clients/composer-runtime-client.ts +4 -3
  876. package/src/store/runtime-clients/message-part-runtime-client.test.ts +42 -0
  877. package/src/store/runtime-clients/message-part-runtime-client.ts +4 -0
  878. package/src/store/runtime-clients/message-runtime-client.ts +5 -0
  879. package/src/store/runtime-clients/thread-runtime-client.test.tsx +138 -5
  880. package/src/store/runtime-clients/thread-runtime-client.ts +46 -9
  881. package/src/store/scopes/composer.ts +22 -4
  882. package/src/store/scopes/message.ts +8 -0
  883. package/src/store/scopes/part.ts +8 -0
  884. package/src/subscribable/subscribable.test.ts +198 -1
  885. package/src/subscribable/subscribable.ts +49 -7
  886. package/src/tests/RemoteThreadListThreadListRuntimeCore-errors.test.ts +95 -1
  887. package/src/tests/auiV0Encode.test.ts +408 -1
  888. package/src/tests/base-composer-runtime-core-send.test.ts +722 -29
  889. package/src/tests/base-composer-runtime-core.test.ts +196 -0
  890. package/src/tests/composer-can-send.test.ts +98 -1
  891. package/src/tests/composer-submission.test.tsx +796 -0
  892. package/src/tests/default-edit-composer-runtime-core.test.ts +102 -2
  893. package/src/tests/external-store-thread-list-runtime-core.test.ts +111 -0
  894. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +581 -1
  895. package/src/tests/external-store-thread-runtime-core.test.ts +186 -0
  896. package/src/tests/external-thread-attachments.test.tsx +741 -3
  897. package/src/tests/external-thread-isLast.test.tsx +69 -0
  898. package/src/tests/get-thread-state-isRunning.test.ts +2 -2
  899. package/src/tests/remote-thread-list-adapter-switch.test.ts +45 -1
  900. package/src/types/message.ts +49 -2
  901. package/src/utils/normalizePartStatus.ts +14 -1
  902. package/dist/tests/remote-thread-list-test-helpers.d.ts +0 -15
  903. package/dist/tests/remote-thread-list-test-helpers.d.ts.map +0 -1
  904. package/dist/tests/remote-thread-list-test-helpers.js +0 -59
  905. package/dist/tests/remote-thread-list-test-helpers.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantCloudThreadHistoryAdapter.js","names":["RefObject","useEffect","useRef","useState","GenericThreadHistoryAdapter","ThreadHistoryAdapter","MessageFormatAdapter","MessageFormatItem","MessageFormatRepository","ExportedMessageRepositoryItem","ThreadMessage","AssistantCloud","AssistantCloudEvent","CloudEngagementReporter","CloudMessagePersistence","CloudRunReporter","createFormattedPersistence","createRunTelemetryToolCall","deriveRunOutcome","describeRunError","extractRunTelemetryModelId","normalizeRunTelemetryUsage","RunMessageTelemetry","RunReportOutcome","RunReportStepInit","RunTelemetryUsageInit","truncateRunTelemetryText","extractAISDKRunTelemetry","AISDKMessageLike","auiV0DecodeSafely","auiV0Encode","AssistantClient","getClientId","useAui","ThreadListItemMethods","FeedbackAdapter","CloudThreadListItem","Pick","globalPersistence","WeakMap","ClientId","AssistantCloudThreadHistoryAdapter","cloudRef","getAui","runReporter","engagementReporter","constructor","current","threadId","messageId","options","resolveEngagementEventIds","aui","getPersistence","threadListItem","key","has","set","get","_persistence","awaitThread","Promise","getThreadListItem","remoteThreadId","getState","remoteId","initialize","then","result","catch","undefined","remoteMessageId","getResolvedRemoteId","thread_id","message_id","feedback","submit","message","type","comment","tryGetKeyedThreadListItem","console","warn","id","cloudMessageId","getRemoteId","threads","messages","error","live","source","listed","threadItems","some","item","currentState","find","withFormat","Record","formatAdapter","TMessage","TStorageFormat","adapter","pinCurrent","next","resolvePinned","getTargetFormatted","pin","append","pinned","Error","update","localMessageId","delete","reportTelemetry","items","durationMs","stepTimestamps","StepTimestamp","encodedRunMessages","map","encode","_reportRunTelemetry","format","mergeRunMessageInfo","extractLastRunMessageInfo","extractRunMessageInfo","load","parentId","encoded","telemetry","enabled","_maybeReportRun","isPersisted","rows","filter","m","reverse","loaded","loadedIds","Set","row","add","push","runMessages","T","messageInfo","RunMessageInfo","extracted","extractRunTelemetry","status","const","_sendReport","content","extractTelemetry","data","persistence","mergedSteps","mergeStepTimestamps","steps","report","outcome","outcomeType","errorCode","traceId","modelId","provider","usage","totalSteps","toolCalls","firstTokenMs","outputText","metadata","start_ms","end_ms","timestamps","startMs","endMs","len","Math","min","length","step","index","i","info","getId","stored","observed","_observedId","isRecord","role","custom","timing","firstTokenTime","Number","isFinite","round","finishReason","reason","failed","isError","runStatus","failure","value","extractAuiV0","msg","text","toolName","toolCallId","args","argsText","p","textParts","join","inputTokens","outputTokens","reasoningTokens","cachedInputTokens","totalInput","totalOutput","totalReasoning","totalCachedInput","hasInput","hasOutput","hasReasoning","hasCachedInput","telemetrySteps","useAssistantCloudThreadHistoryAdapter","auiRef","useAssistantCloudEngagementEvents","RootEngagementTracker","count","dispose","rootEngagementTrackers","useRootEngagementEvents","$","_c","t0","tracker","created","_temp","on","scope","event","payload","threadSwitched","active","t1","reporter","unsubscribers","messageEdited","chars","messageSent","attachments","suggestion","suggestionClicked","payload_0","attachmentAdded","contentType","payload_1","attachmentFailed","payload_2","runStopped","payload_3","runStarted","payload_4","runEnded","payload_5","payload_6","voiceStarted","payload_7","messageRegenerated","payload_8","branchSwitched","payload_9","messageCopied","payload_10","approved","toolApproved","toolRejected","payload_11","speechStarted","payload_12","errorShown","unsubscribe","t2","reportSuggestions","mainThreadId","isEmpty","suggestions","thread","suggestionsShown","subscribe","t3"],"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 type { ThreadMessage } from \"../../../types\";\nimport {\n type AssistantCloud,\n type AssistantCloudEvent,\n CloudEngagementReporter,\n CloudMessagePersistence,\n CloudRunReporter,\n createFormattedPersistence,\n createRunTelemetryToolCall,\n deriveRunOutcome,\n describeRunError,\n extractRunTelemetryModelId,\n normalizeRunTelemetryUsage,\n type RunMessageTelemetry,\n type RunReportOutcome,\n type RunReportStepInit,\n type RunTelemetryUsageInit,\n truncateRunTelemetryText,\n} from \"assistant-cloud\";\nimport {\n extractAISDKRunTelemetry,\n type AISDKMessageLike,\n} from \"assistant-cloud/ai-sdk\";\nimport { auiV0DecodeSafely, auiV0Encode } from \"./auiV0\";\nimport { type AssistantClient, getClientId, useAui } from \"@assistant-ui/store\";\nimport type { ThreadListItemMethods } from \"../../../store/scopes/thread-list-item\";\nimport type { FeedbackAdapter } from \"../../../adapters/feedback\";\n\ntype CloudThreadListItem = Pick<\n ThreadListItemMethods,\n \"getState\" | \"initialize\"\n>;\n\nconst globalPersistence = new WeakMap<\n getClientId.ClientId,\n CloudMessagePersistence\n>();\n\nclass AssistantCloudThreadHistoryAdapter implements ThreadHistoryAdapter {\n private cloudRef: RefObject<AssistantCloud>;\n private getAui: () => AssistantClient;\n private runReporter: CloudRunReporter;\n public readonly engagementReporter: CloudEngagementReporter;\n\n constructor(\n cloudRef: RefObject<AssistantCloud>,\n getAui: () => AssistantClient,\n ) {\n this.cloudRef = cloudRef;\n this.getAui = getAui;\n this.runReporter = new CloudRunReporter(() => this.cloudRef.current);\n this.engagementReporter = new CloudEngagementReporter(\n () => this.cloudRef.current,\n (threadId, messageId, options) =>\n this.resolveEngagementEventIds(threadId, messageId, options),\n );\n }\n\n private get aui(): AssistantClient {\n return this.getAui();\n }\n\n private getPersistence(\n threadListItem: CloudThreadListItem = this.aui.threadListItem,\n ): CloudMessagePersistence {\n const key = getClientId(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 private get _persistence(): CloudMessagePersistence {\n return this.getPersistence();\n }\n\n /**\n * A send is the moment the runtime creates the remote thread, so that one\n * event waits for the id; every other event reads the id that already\n * exists, because initializing a thread nobody has written to would create\n * an empty remote thread just to attribute an event.\n */\n public async resolveEngagementEventIds(\n threadId: string,\n messageId?: string,\n options?: { awaitThread?: boolean },\n ): Promise<Pick<AssistantCloudEvent, \"thread_id\" | \"message_id\">> {\n const threadListItem = this.getThreadListItem(threadId);\n if (!threadListItem) return {};\n\n let remoteThreadId = threadListItem.getState().remoteId;\n if (!remoteThreadId && options?.awaitThread) {\n remoteThreadId = await threadListItem\n .initialize()\n .then((result) => result.remoteId)\n .catch(() => undefined);\n }\n const remoteMessageId = messageId\n ? this.getPersistence(threadListItem).getResolvedRemoteId(messageId)\n : undefined;\n return {\n ...(remoteThreadId ? { thread_id: remoteThreadId } : undefined),\n ...(remoteMessageId ? { message_id: remoteMessageId } : undefined),\n };\n }\n\n public readonly feedback: FeedbackAdapter = {\n submit: ({ message, type, comment }) => {\n void (async () => {\n const threadListItem = this.tryGetKeyedThreadListItem();\n const remoteThreadId = threadListItem?.getState().remoteId;\n if (!threadListItem || !remoteThreadId) {\n console.warn(\n `[assistant-ui] Skipping feedback for message ${message.id}: the thread has no remote id.`,\n );\n return;\n }\n\n const cloudMessageId = await this.getPersistence(\n threadListItem,\n ).getRemoteId(message.id);\n if (!cloudMessageId) {\n console.warn(\n `[assistant-ui] Skipping feedback for message ${message.id}: no cloud message id is mapped.`,\n );\n return;\n }\n\n await this.cloudRef.current.threads.messages.feedback(\n remoteThreadId,\n cloudMessageId,\n { type, ...(comment ? { comment } : undefined) },\n );\n })().catch((error: unknown) => {\n console.error(\n \"[assistant-ui] Cloud feedback submission failed:\",\n error,\n );\n });\n },\n };\n\n private tryGetKeyedThreadListItem(): CloudThreadListItem | undefined {\n const live = this.aui.threadListItem;\n if (!live.source) return undefined;\n const id = live.getState().id;\n if (id === undefined) return undefined;\n // A body can resolve before the list's committed items include its\n // thread; the live item is already the per-thread anchor in that window.\n const listed = this.aui.threads\n .getState()\n .threadItems.some((item) => item.id === id || item.remoteId === id);\n return listed ? this.aui.threads.item({ id }) : live;\n }\n\n private getThreadListItem(threadId: string): CloudThreadListItem | undefined {\n const current = this.aui.threadListItem;\n const currentState = current.getState();\n if (currentState.id === threadId || currentState.remoteId === threadId) {\n return current;\n }\n\n const listed = this.aui.threads\n .getState()\n .threadItems.find(\n (item) => item.id === threadId || item.remoteId === threadId,\n );\n return listed ? this.aui.threads.item({ id: listed.id }) : undefined;\n }\n\n withFormat<TMessage, TStorageFormat extends Record<string, unknown>>(\n formatAdapter: MessageFormatAdapter<TMessage, TStorageFormat>,\n ): GenericThreadHistoryAdapter<TMessage> {\n const adapter = this;\n let threadListItem: CloudThreadListItem | undefined;\n const pinCurrent = () => {\n const next = adapter.tryGetKeyedThreadListItem();\n if (next) threadListItem = next;\n return threadListItem;\n };\n const resolvePinned = () => threadListItem ?? pinCurrent();\n const getTargetFormatted = (item: CloudThreadListItem) =>\n createFormattedPersistence(adapter.getPersistence(item), formatAdapter);\n return {\n pin() {\n pinCurrent();\n },\n async append(item: MessageFormatItem<TMessage>) {\n const pinned = resolvePinned();\n if (!pinned) {\n throw new Error(\n \"Cannot persist cloud history without a thread list item.\",\n );\n }\n const remoteId =\n pinned.getState().remoteId ?? (await pinned.initialize()).remoteId;\n await getTargetFormatted(pinned).append(remoteId, item);\n },\n async update(item: MessageFormatItem<TMessage>, localMessageId: string) {\n const pinned = resolvePinned();\n const remoteId = pinned?.getState().remoteId;\n if (!remoteId || !pinned) return;\n await getTargetFormatted(pinned).update?.(\n remoteId,\n item,\n localMessageId,\n );\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 message?: ThreadMessage;\n },\n ) {\n const encodedRunMessages = items.map((item) =>\n formatAdapter.encode(item),\n );\n adapter._reportRunTelemetry(\n formatAdapter.format,\n encodedRunMessages,\n options,\n resolvePinned(),\n mergeRunMessageInfo(\n extractLastRunMessageInfo(items, formatAdapter),\n options?.message\n ? extractRunMessageInfo(options.message, \"aui/v0\")\n : undefined,\n ),\n );\n },\n async load(): Promise<MessageFormatRepository<TMessage>> {\n // Loads re-pin and resolve through the pinned item, so the id mapping\n // they populate lives on the same persistence instance later writes\n // resolve, whichever of the list item or the live graft won the pin.\n const pinned = pinCurrent();\n const live = adapter.aui.threadListItem;\n const remoteId = live.source ? live.getState().remoteId : undefined;\n if (!remoteId) return { messages: [] };\n return getTargetFormatted(pinned ?? live).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(\n remoteId,\n \"aui/v0\",\n encoded,\n extractRunMessageInfo(message, \"aui/v0\"),\n );\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(\n remoteId,\n \"aui/v0\",\n encoded,\n extractRunMessageInfo(message, \"aui/v0\"),\n );\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 // The cloud lists rows newest first, so walking them oldest first puts a\n // parent ahead of its children and a row orphaned by an unreadable parent\n // can be dropped in the same pass; MessageRepository.import throws on a\n // message whose parent is missing.\n const rows = messages\n .filter(\n (m): m is typeof m & { format: \"aui/v0\" } => m.format === \"aui/v0\",\n )\n .reverse();\n\n const loaded: ExportedMessageRepositoryItem[] = [];\n const loadedIds = new Set<string>();\n for (const row of rows) {\n const item = auiV0DecodeSafely(row);\n if (!item) continue;\n if (item.parentId && !loadedIds.has(item.parentId)) continue;\n loadedIds.add(item.message.id);\n loaded.push(item);\n }\n\n return { messages: loaded };\n }\n\n private _reportRunTelemetry<T>(\n format: string,\n runMessages: T[],\n options?: {\n durationMs?: number;\n stepTimestamps?: StepTimestamp[];\n },\n threadListItem?: CloudThreadListItem,\n messageInfo?: RunMessageInfo,\n ) {\n const item = threadListItem ?? this.aui.threadListItem;\n const remoteId = item.getState().remoteId;\n if (!remoteId) return;\n\n const extracted =\n extractRunTelemetry(format, runMessages) ??\n (messageInfo?.status !== undefined\n ? { status: \"incomplete\" as const }\n : undefined);\n if (!extracted) return;\n\n this._sendReport(\n remoteId,\n extracted,\n options?.durationMs,\n options?.stepTimestamps,\n messageInfo,\n this.getPersistence(item),\n );\n }\n\n private _maybeReportRun<T>(\n remoteId: string,\n format: string,\n content: T,\n messageInfo?: RunMessageInfo,\n ) {\n const extracted = extractTelemetry(format, content);\n if (!extracted) return;\n\n this._sendReport(remoteId, extracted, undefined, undefined, messageInfo);\n }\n\n private _sendReport(\n remoteId: string,\n data: RunMessageTelemetry,\n durationMs?: number,\n stepTimestamps?: StepTimestamp[],\n messageInfo?: RunMessageInfo,\n persistence = this._persistence,\n ) {\n const mergedSteps = mergeStepTimestamps(data.steps, stepTimestamps);\n const messageId = messageInfo?.localMessageId\n ? persistence.getResolvedRemoteId(messageInfo.localMessageId)\n : undefined;\n void this.runReporter.report({\n threadId: remoteId,\n status: messageInfo?.status ?? data.status,\n outcome: messageInfo?.outcomeType,\n error: messageInfo?.error,\n errorCode: messageInfo?.errorCode,\n messageId,\n traceId: messageInfo?.traceId,\n modelId: data.modelId,\n provider: messageInfo?.provider,\n usage: data.usage,\n steps: mergedSteps,\n totalSteps: data.totalSteps,\n toolCalls: data.toolCalls,\n durationMs,\n firstTokenMs: messageInfo?.firstTokenMs,\n outputText: data.outputText,\n metadata: data.metadata,\n });\n }\n}\n\ntype StepTimestamp = { start_ms: number; end_ms: number };\n\nfunction mergeStepTimestamps(\n steps: RunReportStepInit[] | undefined,\n timestamps: StepTimestamp[] | undefined,\n): RunReportStepInit[] | undefined {\n if (!timestamps) return steps;\n if (!steps) {\n return timestamps.map(({ start_ms, end_ms }) => ({\n startMs: start_ms,\n endMs: end_ms,\n }));\n }\n\n const len = Math.min(steps.length, timestamps.length);\n return steps.map((step, index) => ({\n ...step,\n ...(index < len\n ? {\n startMs: timestamps[index]!.start_ms,\n endMs: timestamps[index]!.end_ms,\n }\n : undefined),\n }));\n}\n\ntype RunMessageInfo = {\n localMessageId?: string;\n status?: \"completed\" | \"incomplete\" | \"error\";\n outcomeType?: RunReportOutcome;\n error?: string;\n errorCode?: string;\n firstTokenMs?: number;\n traceId?: string;\n provider?: string;\n};\n\nfunction extractLastRunMessageInfo<\n TMessage,\n TStorageFormat extends Record<string, unknown>,\n>(\n items: MessageFormatItem<TMessage>[],\n formatAdapter: MessageFormatAdapter<TMessage, TStorageFormat>,\n): RunMessageInfo | undefined {\n for (let i = items.length - 1; i >= 0; i--) {\n const item = items[i]!;\n const info = extractRunMessageInfo(\n item.message,\n formatAdapter.format,\n formatAdapter.getId(item.message),\n );\n if (info) return info;\n }\n return undefined;\n}\n\nfunction mergeRunMessageInfo(\n stored: RunMessageInfo | undefined,\n observed: RunMessageInfo | undefined,\n): RunMessageInfo | undefined {\n if (!observed) return stored;\n const { localMessageId: _observedId, ...outcome } = observed;\n return { ...stored, ...outcome };\n}\n\nfunction extractRunMessageInfo(\n message: unknown,\n format: string,\n localMessageId?: string,\n): RunMessageInfo | undefined {\n if (!isRecord(message) || message.role !== \"assistant\") return undefined;\n\n const status = isRecord(message.status) ? message.status : undefined;\n const metadata = isRecord(message.metadata) ? message.metadata : undefined;\n const custom = isRecord(metadata?.custom) ? metadata.custom : undefined;\n const timing = isRecord(metadata?.timing) ? metadata.timing : undefined;\n const firstTokenTime = timing?.firstTokenTime;\n const firstTokenMs =\n typeof firstTokenTime === \"number\" && Number.isFinite(firstTokenTime)\n ? Math.round(firstTokenTime)\n : undefined;\n const finishReason =\n status?.type === \"incomplete\"\n ? typeof status.reason === \"string\"\n ? status.reason\n : undefined\n : typeof metadata?.finishReason === \"string\"\n ? metadata.finishReason\n : undefined;\n const failed = status?.type === \"incomplete\" && status.reason === \"error\";\n const outcome = deriveRunOutcome({ finishReason, isError: failed });\n const outcomeType = outcome.outcome;\n const runStatus =\n outcome.status === \"error\"\n ? \"error\"\n : status?.type === \"incomplete\"\n ? \"incomplete\"\n : finishReason !== undefined\n ? outcome.status\n : undefined;\n const failure = failed ? describeRunError(status.error) : {};\n const messageId =\n localMessageId ?? (typeof message.id === \"string\" ? message.id : undefined);\n const traceId =\n format === \"aui/v0\"\n ? custom?.traceId\n : format === \"ai-sdk/v6\"\n ? metadata?.traceId\n : undefined;\n const provider =\n typeof custom?.provider === \"string\"\n ? custom.provider\n : typeof metadata?.provider === \"string\"\n ? metadata.provider\n : undefined;\n\n return {\n ...(messageId ? { localMessageId: messageId } : undefined),\n ...(runStatus !== undefined ? { status: runStatus } : undefined),\n ...(outcomeType ? { outcomeType } : undefined),\n ...failure,\n ...(firstTokenMs != null && firstTokenMs >= 0\n ? { firstTokenMs }\n : undefined),\n ...(typeof traceId === \"string\" ? { traceId } : undefined),\n ...(provider !== undefined ? { provider } : undefined),\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\";\n}\n\nfunction extractTelemetry<T>(\n format: string,\n content: T,\n): RunMessageTelemetry | null {\n switch (format) {\n case \"aui/v0\":\n return extractAuiV0(content);\n case \"ai-sdk/v6\":\n return extractAISDKRunTelemetry([content as AISDKMessageLike]);\n default:\n return null;\n }\n}\n\nfunction extractRunTelemetry<T>(\n format: string,\n runMessages: T[],\n): RunMessageTelemetry | null {\n if (format === \"ai-sdk/v6\") {\n return extractAISDKRunTelemetry(runMessages as AISDKMessageLike[]);\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\nexport function extractAuiV0<T>(content: T): RunMessageTelemetry | null {\n const msg = content as {\n role?: string;\n status?: { type: string; reason?: 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 { usage?: RunTelemetryUsageInit }[];\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 createRunTelemetryToolCall({\n toolName: p.toolName!,\n toolCallId: p.toolCallId!,\n args: p.args,\n result: p.result,\n argsText: p.argsText,\n }),\n );\n\n const textParts = msg.content?.filter((p) => p.type === \"text\" && p.text);\n const outputText =\n textParts && textParts.length > 0\n ? truncateRunTelemetryText(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) continue;\n const usage = normalizeRunTelemetryUsage(step.usage);\n if (!usage) continue;\n if (usage.inputTokens != null) {\n totalInput += usage.inputTokens;\n hasInput = true;\n }\n if (usage.outputTokens != null) {\n totalOutput += usage.outputTokens;\n hasOutput = true;\n }\n if (usage.reasoningTokens != null) {\n totalReasoning += usage.reasoningTokens;\n hasReasoning = true;\n }\n if (usage.cachedInputTokens != null) {\n totalCachedInput += 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 status = msg.status?.type === \"incomplete\" ? \"incomplete\" : \"completed\";\n\n const metadata = msg.metadata?.custom as Record<string, unknown> | undefined;\n const modelId = extractRunTelemetryModelId(\n msg.metadata as Record<string, unknown> | undefined,\n );\n\n const telemetrySteps: RunReportStepInit[] | undefined =\n steps && steps.length > 0\n ? steps.map((step) => (step.usage ? { usage: step.usage } : {}))\n : undefined;\n\n return {\n status,\n ...(toolCalls && toolCalls.length > 0 ? { toolCalls } : undefined),\n ...(steps?.length ? { totalSteps: steps.length } : undefined),\n ...(inputTokens != null ||\n outputTokens != null ||\n reasoningTokens != null ||\n cachedInputTokens != null\n ? {\n usage: {\n ...(inputTokens != null ? { inputTokens } : undefined),\n ...(outputTokens != null ? { outputTokens } : undefined),\n ...(reasoningTokens != null ? { reasoningTokens } : undefined),\n ...(cachedInputTokens != null ? { cachedInputTokens } : undefined),\n },\n }\n : undefined),\n ...(outputText != null ? { outputText } : undefined),\n ...(metadata ? { metadata } : undefined),\n ...(telemetrySteps ? { steps: telemetrySteps } : undefined),\n ...(modelId ? { modelId } : undefined),\n };\n}\n\nexport function useAssistantCloudThreadHistoryAdapter(\n cloudRef: RefObject<AssistantCloud>,\n): ThreadHistoryAdapter & { readonly feedback: FeedbackAdapter } {\n const aui = useAui();\n // Not useEffectEvent: history adapter methods run during render (SSR load).\n const auiRef = useRef(aui);\n useEffect(() => {\n auiRef.current = aui;\n });\n const [adapter] = useState(\n () =>\n new AssistantCloudThreadHistoryAdapter(cloudRef, () => auiRef.current),\n );\n useAssistantCloudEngagementEvents(adapter, aui);\n return adapter;\n}\n\ntype RootEngagementTracker = {\n count: number;\n engagementReporter: CloudEngagementReporter;\n dispose: () => void;\n};\n\nconst rootEngagementTrackers = new WeakMap<\n AssistantClient,\n RootEngagementTracker\n>();\n\n/**\n * Thread switches are a thread list event, so one subscription per assistant\n * client reports them; every thread runtime mounted under it shares the\n * subscription and the last one to unmount removes it.\n */\nconst useRootEngagementEvents = (\n adapter: AssistantCloudThreadHistoryAdapter,\n aui: AssistantClient,\n) => {\n useEffect(() => {\n let tracker = rootEngagementTrackers.get(aui);\n if (!tracker) {\n const created: RootEngagementTracker = {\n count: 0,\n engagementReporter: adapter.engagementReporter,\n dispose: () => {},\n };\n created.dispose = aui.on(\n { scope: \"*\", event: \"threads.selectionChanged\" },\n (payload) => {\n created.engagementReporter.threadSwitched(payload.threadId);\n },\n );\n rootEngagementTrackers.set(aui, created);\n tracker = created;\n }\n const active = tracker;\n active.engagementReporter = adapter.engagementReporter;\n active.count += 1;\n return () => {\n active.count -= 1;\n if (active.count === 0) {\n active.dispose();\n rootEngagementTrackers.delete(aui);\n }\n };\n }, [adapter, aui]);\n};\n\nconst useAssistantCloudEngagementEvents = (\n adapter: AssistantCloudThreadHistoryAdapter,\n aui: AssistantClient,\n) => {\n useRootEngagementEvents(adapter, aui);\n\n useEffect(() => {\n const reporter = adapter.engagementReporter;\n\n const unsubscribers = [\n aui.on({ scope: \"thread\", event: \"composer.send\" }, (payload) => {\n if (payload.messageId) {\n reporter.messageEdited(payload.threadId, {\n messageId: payload.messageId,\n chars: payload.chars,\n });\n } else {\n reporter.messageSent(payload.threadId, {\n chars: payload.chars,\n attachments: payload.attachments,\n });\n }\n if (payload.suggestion) {\n reporter.suggestionClicked(payload.threadId);\n }\n }),\n aui.on(\n { scope: \"thread\", event: \"composer.attachmentAdd\" },\n (payload) => {\n reporter.attachmentAdded(payload.threadId, {\n messageId: payload.messageId,\n contentType: payload.contentType,\n });\n },\n ),\n aui.on(\n { scope: \"thread\", event: \"composer.attachmentAddError\" },\n (payload) => {\n reporter.attachmentFailed(payload.threadId, {\n messageId: payload.messageId,\n contentType: payload.contentType,\n });\n },\n ),\n aui.on({ scope: \"thread\", event: \"composer.cancel\" }, (payload) => {\n reporter.runStopped(payload.threadId);\n }),\n aui.on({ scope: \"thread\", event: \"thread.runStart\" }, (payload) => {\n reporter.runStarted(payload.threadId);\n }),\n aui.on({ scope: \"thread\", event: \"thread.runEnd\" }, (payload) => {\n reporter.runEnded(payload.threadId);\n }),\n aui.on({ scope: \"thread\", event: \"thread.cancelRun\" }, (payload) => {\n reporter.runStopped(payload.threadId);\n }),\n aui.on({ scope: \"thread\", event: \"thread.voiceStarted\" }, (payload) => {\n reporter.voiceStarted(payload.threadId);\n }),\n aui.on({ scope: \"thread\", event: \"message.reload\" }, (payload) => {\n reporter.messageRegenerated(payload.threadId, payload.messageId);\n }),\n aui.on(\n { scope: \"thread\", event: \"message.branchSwitched\" },\n (payload) => {\n reporter.branchSwitched(payload.threadId, payload.messageId);\n },\n ),\n aui.on({ scope: \"thread\", event: \"message.copied\" }, (payload) => {\n reporter.messageCopied(payload.threadId, payload.messageId);\n }),\n aui.on(\n { scope: \"thread\", event: \"thread.toolApprovalAnswered\" },\n (payload) => {\n if (payload.approved) {\n reporter.toolApproved(\n payload.threadId,\n payload.messageId,\n payload.toolCallId,\n payload.toolName,\n );\n } else {\n reporter.toolRejected(\n payload.threadId,\n payload.messageId,\n payload.toolCallId,\n payload.toolName,\n );\n }\n },\n ),\n aui.on({ scope: \"thread\", event: \"message.speak\" }, (payload) => {\n reporter.speechStarted(payload.threadId, payload.messageId);\n }),\n aui.on({ scope: \"thread\", event: \"message.error\" }, (payload) => {\n reporter.errorShown(payload.threadId, {\n messageId: payload.messageId,\n reason: payload.reason,\n });\n }),\n ];\n\n return () => {\n for (const unsubscribe of unsubscribers) unsubscribe();\n };\n }, [adapter, aui]);\n\n useEffect(() => {\n const reportSuggestions = () => {\n const { mainThreadId } = aui.threads.getState();\n if (aui.threadListItem.getState().id !== mainThreadId) return;\n const { isEmpty, suggestions } = aui.thread.getState();\n if (!isEmpty || suggestions.length === 0) return;\n adapter.engagementReporter.suggestionsShown(\n mainThreadId,\n suggestions.length,\n );\n };\n\n reportSuggestions();\n return aui.subscribe(reportSuggestions);\n }, [adapter, aui]);\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"AssistantCloudThreadHistoryAdapter.js","names":["RefObject","useEffect","useRef","useState","GenericThreadHistoryAdapter","ThreadHistoryAdapter","MessageFormatAdapter","MessageFormatItem","MessageFormatRepository","ExportedMessageRepositoryItem","ThreadMessage","Unstable_ToolInteractionLog","appendToolInteraction","readToolInteractionLog","isJSONValueEqual","AssistantCloud","AssistantCloudEvent","CloudAPIError","CloudEngagementReporter","CloudMessagePersistence","CloudRunReporter","createFormattedPersistence","createRunTelemetryToolCall","deriveRunOutcome","describeRunError","extractRunTelemetryModelId","normalizeRunTelemetryUsage","RunMessageTelemetry","RunReportOutcome","RunReportStepInit","RunTelemetryUsageInit","truncateRunTelemetryText","extractAISDKRunTelemetry","AISDKMessageLike","auiV0DecodeSafely","auiV0Encode","AssistantClient","getClientId","useAui","ThreadListItemMethods","FeedbackAdapter","isStoredMessageStatus","parseStoredThreadSteps","runCleanups","CloudThreadListItem","Pick","globalPersistence","WeakMap","ClientId","runLedgers","settled","Set","reported","runLedgerOf","persistence","ledger","get","set","isSettledMessage","message","role","status","type","mergeInteractionLogs","stored","current","incoming","omitted","Math","max","merged","entries","undefined","entry","some","existing","occurredAt","payload","CopiedThread","refused","closed","interactions","Map","RETRIED_COPY_STATUSES","THREAD_REFUSAL_STATUSES","isRefusedCopy","error","has","AssistantCloudThreadHistoryAdapter","cloudRef","getAui","runReporter","copiedThreads","Promise","copyQueues","constructor","aui","getCloud","ownsThread","threadId","live","threadListItem","source","id","remoteId","getState","getPersistence","key","_persistence","resolveEngagementEventIds","messageId","options","awaitThread","getThreadListItem","remoteThreadId","initialize","then","result","catch","remoteMessageId","getResolvedRemoteId","thread_id","message_id","feedback","submit","comment","tryGetKeyedThreadListItem","console","warn","cloudMessageId","getRemoteId","threads","messages","listed","threadItems","item","currentState","find","withFormat","Record","formatAdapter","TMessage","TStorageFormat","adapter","pinCurrent","next","resolvePinned","getTargetFormatted","pin","append","pinned","Error","update","localMessageId","delete","reportTelemetry","items","durationMs","stepTimestamps","StepTimestamp","encodedRunMessages","map","encode","_reportRunTelemetry","format","mergeRunMessageInfo","extractLastRunMessageInfo","extractRunMessageInfo","load","parentId","_writeMessage","encoded","isPersisted","unstable_copy","telemetry","enabled","copy","branch","messageIds","cloud","length","previous","task","resolve","copyBranch","inventory","copied","seen","after","page","list","limit","fresh","filter","row","add","external_id","record","decoded","part","content","toolCallId","unstable_interactions","last","at","eligible","changed","parent","index","create","parent_id","parent_external_id","size","write","ReturnType","firstSettle","extracted","extractTelemetry","_sendReport","rows","m","reverse","loaded","loadedIds","push","runMessages","T","messageInfo","RunMessageInfo","extractRunTelemetry","const","data","mergedSteps","mergeStepTimestamps","steps","report","outcome","outcomeType","errorCode","traceId","modelId","provider","usage","totalSteps","toolCalls","firstTokenMs","outputText","metadata","start_ms","end_ms","timestamps","startMs","endMs","len","min","step","i","info","getId","observed","_observedId","isRecord","custom","timing","firstTokenTime","Number","isFinite","round","finishReason","reason","failed","isError","runStatus","failure","value","usageTokenKeys","readTokenCount","readStoredTelemetryUsage","Array","isArray","count","cacheReadTokens","inputTokenDetails","reasoningTokens","outputTokenDetails","Object","keys","parseStoredTelemetrySteps","extractAuiV0","msg","text","toolName","args","argsText","statusType","p","textParts","join","inputTokens","outputTokens","cachedInputTokens","totalInput","totalOutput","totalReasoning","totalCachedInput","hasInput","hasOutput","hasReasoning","hasCachedInput","telemetrySteps","useAssistantCloudThreadHistoryAdapter","auiRef","useAssistantCloudEngagementEvents","EngagementTracker","mounted","lastMounted","reporter","host","dispose","engagementTrackers","mountedAdapter","tracker","fallback","createEngagementTracker","subscribeEngagementEvents","reportSuggestions","mainThreadId","isEmpty","suggestions","thread","suggestionsShown","unsubscribers","on","scope","event","threadSwitched","messageEdited","chars","messageSent","attachments","suggestion","suggestionClicked","attachmentAdded","contentType","attachmentFailed","runStopped","runStarted","runEnded","voiceStarted","messageRegenerated","branchSwitched","messageCopied","approved","toolApproved","toolRejected","speechStarted","errorShown","subscribe","installEngagementEvents","uninstallEngagementEvents","$","_c","t0","t1","active","values","done"],"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 type { ThreadMessage } from \"../../../types\";\nimport type { Unstable_ToolInteractionLog } from \"../../../types/message\";\nimport {\n appendToolInteraction,\n readToolInteractionLog,\n} from \"../../../runtime/utils/tool-interactions\";\nimport { isJSONValueEqual } from \"../../../utils/json/is-json-equal\";\nimport {\n type AssistantCloud,\n type AssistantCloudEvent,\n CloudAPIError,\n CloudEngagementReporter,\n CloudMessagePersistence,\n CloudRunReporter,\n createFormattedPersistence,\n createRunTelemetryToolCall,\n deriveRunOutcome,\n describeRunError,\n extractRunTelemetryModelId,\n normalizeRunTelemetryUsage,\n type RunMessageTelemetry,\n type RunReportOutcome,\n type RunReportStepInit,\n type RunTelemetryUsageInit,\n truncateRunTelemetryText,\n} from \"assistant-cloud\";\nimport {\n extractAISDKRunTelemetry,\n type AISDKMessageLike,\n} from \"assistant-cloud/ai-sdk\";\nimport { auiV0DecodeSafely, auiV0Encode } from \"./auiV0\";\nimport { type AssistantClient, getClientId, useAui } from \"@assistant-ui/store\";\nimport type { ThreadListItemMethods } from \"../../../store/scopes/thread-list-item\";\nimport type { FeedbackAdapter } from \"../../../adapters/feedback\";\nimport {\n isStoredMessageStatus,\n parseStoredThreadSteps,\n} from \"../../../runtime/utils/stored-message-parts\";\nimport { runCleanups } from \"../../../subscribable/subscribable\";\n\ntype CloudThreadListItem = Pick<\n ThreadListItemMethods,\n \"getState\" | \"initialize\"\n>;\n\nconst globalPersistence = new WeakMap<\n getClientId.ClientId,\n CloudMessagePersistence\n>();\n\n// Kept per persistence so they share the id mapping's lifetime: ids whose stored aui/v0 entry is settled, and ids whose run a write has reported.\nconst runLedgers = new WeakMap<\n CloudMessagePersistence,\n { settled: Set<string>; reported: Set<string> }\n>();\n\nconst runLedgerOf = (persistence: CloudMessagePersistence) => {\n let ledger = runLedgers.get(persistence);\n if (!ledger) {\n ledger = { settled: new Set<string>(), reported: new Set<string>() };\n runLedgers.set(persistence, ledger);\n }\n return ledger;\n};\n\nconst isSettledMessage = (message: ThreadMessage) =>\n message.role === \"assistant\" &&\n (message.status.type === \"complete\" || message.status.type === \"incomplete\");\n\nconst mergeInteractionLogs = (\n stored: Unstable_ToolInteractionLog | undefined,\n current: Unstable_ToolInteractionLog | undefined,\n): Unstable_ToolInteractionLog | undefined => {\n const incoming = readToolInteractionLog(current);\n if (!stored) return incoming;\n if (!incoming) return stored;\n const omitted = Math.max(stored.omitted ?? 0, incoming.omitted ?? 0);\n let merged: Unstable_ToolInteractionLog = {\n entries: stored.entries,\n ...(omitted ? { omitted } : undefined),\n };\n for (const entry of incoming.entries) {\n if (\n merged.entries.some(\n (existing) =>\n existing.type === entry.type &&\n existing.occurredAt === entry.occurredAt &&\n isJSONValueEqual(existing.payload, entry.payload),\n )\n ) {\n continue;\n }\n merged = appendToolInteraction(merged, entry);\n }\n return merged;\n};\n\ntype CopiedThread = {\n stored: Set<string>;\n refused: Set<string>;\n closed: boolean;\n interactions: Map<string, Unstable_ToolInteractionLog>;\n};\n\nconst RETRIED_COPY_STATUSES = new Set([401, 403, 408, 429]);\n// The thread is gone, or its end user may not write this month.\nconst THREAD_REFUSAL_STATUSES = new Set([402, 404]);\n\nconst isRefusedCopy = (error: unknown): error is CloudAPIError =>\n error instanceof CloudAPIError &&\n error.status >= 400 &&\n error.status < 500 &&\n !RETRIED_COPY_STATUSES.has(error.status);\n\nclass AssistantCloudThreadHistoryAdapter implements ThreadHistoryAdapter {\n private cloudRef: RefObject<AssistantCloud>;\n private getAui: () => AssistantClient;\n private runReporter: CloudRunReporter;\n private copiedThreads = new Map<string, Promise<CopiedThread>>();\n private copyQueues = new Map<string, Promise<void>>();\n\n constructor(\n cloudRef: RefObject<AssistantCloud>,\n getAui: () => AssistantClient,\n ) {\n this.cloudRef = cloudRef;\n this.getAui = getAui;\n this.runReporter = new CloudRunReporter(() => this.cloudRef.current);\n }\n\n private get aui(): AssistantClient {\n return this.getAui();\n }\n\n public getCloud(): AssistantCloud {\n return this.cloudRef.current;\n }\n\n public ownsThread(threadId: string): boolean {\n const live = this.aui.threadListItem;\n if (!live.source) return false;\n const { id, remoteId } = live.getState();\n return id === threadId || remoteId === threadId;\n }\n\n private getPersistence(\n threadListItem: CloudThreadListItem = this.aui.threadListItem,\n ): CloudMessagePersistence {\n const key = getClientId(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 private get _persistence(): CloudMessagePersistence {\n return this.getPersistence();\n }\n\n /**\n * A send is the moment the runtime creates the remote thread, so that one\n * event waits for the id; every other event reads the id that already\n * exists, because initializing a thread nobody has written to would create\n * an empty remote thread just to attribute an event. A thread the list does\n * not know resolves to nothing, which declines the event.\n */\n public async resolveEngagementEventIds(\n threadId: string,\n messageId?: string,\n options?: { awaitThread?: boolean },\n ): Promise<\n Pick<AssistantCloudEvent, \"thread_id\" | \"message_id\"> | undefined\n > {\n const threadListItem = this.getThreadListItem(threadId);\n if (!threadListItem) return undefined;\n\n let remoteThreadId = threadListItem.getState().remoteId;\n if (!remoteThreadId && options?.awaitThread) {\n remoteThreadId = await threadListItem\n .initialize()\n .then((result) => result.remoteId)\n .catch(() => undefined);\n }\n const remoteMessageId = messageId\n ? this.getPersistence(threadListItem).getResolvedRemoteId(messageId)\n : undefined;\n return {\n ...(remoteThreadId ? { thread_id: remoteThreadId } : undefined),\n ...(remoteMessageId ? { message_id: remoteMessageId } : undefined),\n };\n }\n\n public readonly feedback: FeedbackAdapter = {\n submit: ({ message, type, comment }) => {\n void (async () => {\n const threadListItem = this.tryGetKeyedThreadListItem();\n const remoteThreadId = threadListItem?.getState().remoteId;\n if (!threadListItem || !remoteThreadId) {\n console.warn(\n `[assistant-ui] Skipping feedback for message ${message.id}: the thread has no remote id.`,\n );\n return;\n }\n\n const cloudMessageId = await this.getPersistence(\n threadListItem,\n ).getRemoteId(message.id);\n if (!cloudMessageId) {\n console.warn(\n `[assistant-ui] Skipping feedback for message ${message.id}: no cloud message id is mapped.`,\n );\n return;\n }\n\n await this.cloudRef.current.threads.messages.feedback(\n remoteThreadId,\n cloudMessageId,\n { type, ...(comment ? { comment } : undefined) },\n );\n })().catch((error: unknown) => {\n console.error(\n \"[assistant-ui] Cloud feedback submission failed:\",\n error,\n );\n });\n },\n };\n\n private tryGetKeyedThreadListItem(): CloudThreadListItem | undefined {\n const live = this.aui.threadListItem;\n if (!live.source) return undefined;\n const id = live.getState().id;\n if (id === undefined) return undefined;\n // A body can resolve before the list's committed items include its\n // thread; the live item is already the per-thread anchor in that window.\n const listed = this.aui.threads\n .getState()\n .threadItems.some((item) => item.id === id || item.remoteId === id);\n return listed ? this.aui.threads.item({ id }) : live;\n }\n\n private getThreadListItem(threadId: string): CloudThreadListItem | undefined {\n const current = this.aui.threadListItem;\n if (current.source) {\n const currentState = current.getState();\n if (currentState.id === threadId || currentState.remoteId === threadId) {\n return current;\n }\n }\n\n const listed = this.aui.threads\n .getState()\n .threadItems.find(\n (item) => item.id === threadId || item.remoteId === threadId,\n );\n return listed ? this.aui.threads.item({ id: listed.id }) : undefined;\n }\n\n withFormat<TMessage, TStorageFormat extends Record<string, unknown>>(\n formatAdapter: MessageFormatAdapter<TMessage, TStorageFormat>,\n ): GenericThreadHistoryAdapter<TMessage> {\n const adapter = this;\n let threadListItem: CloudThreadListItem | undefined;\n const pinCurrent = () => {\n const next = adapter.tryGetKeyedThreadListItem();\n if (next) threadListItem = next;\n return threadListItem;\n };\n const resolvePinned = () => threadListItem ?? pinCurrent();\n const getTargetFormatted = (item: CloudThreadListItem) =>\n createFormattedPersistence(adapter.getPersistence(item), formatAdapter);\n return {\n pin() {\n pinCurrent();\n },\n async append(item: MessageFormatItem<TMessage>) {\n const pinned = resolvePinned();\n if (!pinned) {\n throw new Error(\n \"Cannot persist cloud history without a thread list item.\",\n );\n }\n const remoteId =\n pinned.getState().remoteId ?? (await pinned.initialize()).remoteId;\n await getTargetFormatted(pinned).append(remoteId, item);\n },\n async update(item: MessageFormatItem<TMessage>, localMessageId: string) {\n const pinned = resolvePinned();\n const remoteId = pinned?.getState().remoteId;\n if (!remoteId || !pinned) return;\n await getTargetFormatted(pinned).update?.(\n remoteId,\n item,\n localMessageId,\n );\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 message?: ThreadMessage;\n },\n ) {\n const encodedRunMessages = items.map((item) =>\n formatAdapter.encode(item),\n );\n adapter._reportRunTelemetry(\n formatAdapter.format,\n encodedRunMessages,\n options,\n resolvePinned(),\n mergeRunMessageInfo(\n extractLastRunMessageInfo(items, formatAdapter),\n options?.message\n ? extractRunMessageInfo(options.message, \"aui/v0\")\n : undefined,\n ),\n );\n },\n async load(): Promise<MessageFormatRepository<TMessage>> {\n // Loads re-pin and resolve through the pinned item, so the id mapping\n // they populate lives on the same persistence instance later writes\n // resolve, whichever of the list item or the live graft won the pin.\n const pinned = pinCurrent();\n const live = adapter.aui.threadListItem;\n const remoteId = live.source ? live.getState().remoteId : undefined;\n if (!remoteId) return { messages: [] };\n return getTargetFormatted(pinned ?? live).load(remoteId);\n },\n };\n }\n\n async append({ parentId, message }: ExportedMessageRepositoryItem) {\n const { remoteId } = await this.aui.threadListItem.initialize();\n const persistence = this._persistence;\n await this._writeMessage(persistence, remoteId, message, (encoded) =>\n persistence.append(remoteId, message.id, parentId, \"aui/v0\", encoded),\n );\n }\n\n async update(item: ExportedMessageRepositoryItem) {\n const persistence = this._persistence;\n if (!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 await this._writeMessage(persistence, remoteId, message, (encoded) =>\n persistence.update(remoteId, message.id, \"aui/v0\", encoded),\n );\n }\n\n get unstable_copy() {\n const telemetry = this.cloudRef.current?.telemetry;\n return telemetry?.enabled === false || telemetry?.messages === false\n ? undefined\n : this.copy;\n }\n\n private copy = async (\n branch: readonly ThreadMessage[],\n messageIds: readonly string[],\n ): Promise<void> => {\n const cloud = this.cloudRef.current;\n if (messageIds.length === 0) return;\n\n const threadListItem = this.tryGetKeyedThreadListItem();\n if (!threadListItem) {\n throw new Error(\"Cannot copy cloud history without a thread list item.\");\n }\n const remoteId = (await threadListItem.initialize()).remoteId;\n const persistence = this.getPersistence(threadListItem);\n const previous = this.copyQueues.get(remoteId);\n const task = (previous ?? Promise.resolve())\n .catch(() => undefined)\n .then(() =>\n this.copyBranch(cloud, remoteId, persistence, branch, messageIds),\n );\n this.copyQueues.set(remoteId, task);\n try {\n await task;\n } finally {\n if (this.copyQueues.get(remoteId) === task) {\n this.copyQueues.delete(remoteId);\n }\n }\n };\n\n private async copyBranch(\n cloud: AssistantCloud,\n remoteId: string,\n persistence: CloudMessagePersistence,\n branch: readonly ThreadMessage[],\n messageIds: readonly string[],\n ): Promise<void> {\n let inventory = this.copiedThreads.get(remoteId);\n if (!inventory) {\n inventory = (async (): Promise<CopiedThread> => {\n const copied: CopiedThread = {\n stored: new Set(),\n refused: new Set(),\n closed: false,\n interactions: new Map(),\n };\n const seen = new Set<string>();\n let after: string | undefined;\n while (true) {\n const page = await cloud.threads.messages.list(remoteId, {\n limit: 200,\n ...(after ? { after } : undefined),\n });\n // A cursor the server cannot resolve drops the keyset filter and replays\n // an earlier page, so already-seen rows end the walk instead of repeating.\n const fresh = page.messages.filter((row) => !seen.has(row.id));\n for (const row of fresh) {\n seen.add(row.id);\n if (!row.external_id || row.format !== \"aui/v0\") continue;\n copied.stored.add(row.external_id);\n persistence.record(row.external_id, row.id);\n const decoded = auiV0DecodeSafely(\n row as typeof row & { format: \"aui/v0\" },\n );\n for (const part of decoded?.message.content ?? []) {\n if (part.type !== \"tool-call\") continue;\n const merged = mergeInteractionLogs(\n copied.interactions.get(part.toolCallId),\n part.unstable_interactions,\n );\n if (merged) copied.interactions.set(part.toolCallId, merged);\n }\n }\n const last = page.messages.at(-1);\n if (fresh.length === 0 || page.messages.length < 200 || !last) break;\n after = last.id;\n }\n return copied;\n })();\n this.copiedThreads.set(remoteId, inventory);\n }\n\n let copied: CopiedThread;\n try {\n copied = await inventory;\n } catch (error) {\n if (this.copiedThreads.get(remoteId) === inventory) {\n this.copiedThreads.delete(remoteId);\n }\n throw error;\n }\n if (copied.closed) return;\n\n const eligible = branch.filter(\n (message) => message.id.length > 0 && message.id.length <= 255,\n );\n const changed = new Set(messageIds);\n let next = 0;\n let parent: string | undefined;\n for (let index = 0; index < eligible.length; index++) {\n if (!changed.has(eligible[index]!.id)) continue;\n for (; next <= index; next++) {\n const message = eligible[next]!;\n if (\n next !== index &&\n (copied.stored.has(message.id) || copied.refused.has(message.id))\n ) {\n if (copied.stored.has(message.id)) parent = message.id;\n continue;\n }\n const encoded = auiV0Encode(message);\n const content = {\n ...encoded,\n content: encoded.content.map((part) => {\n if (part.type !== \"tool-call\") return part;\n const interactions = mergeInteractionLogs(\n copied.interactions.get(part.toolCallId),\n part.unstable_interactions,\n );\n return {\n ...part,\n ...(interactions\n ? { unstable_interactions: interactions }\n : undefined),\n };\n }),\n };\n let message_id: string;\n try {\n ({ message_id } = await cloud.threads.messages.create(remoteId, {\n parent_id: null,\n format: \"aui/v0\",\n content,\n external_id: message.id,\n ...(parent ? { parent_external_id: parent } : undefined),\n }));\n } catch (error) {\n if (!isRefusedCopy(error)) throw error;\n // Two refusals before any accepted message mean the cloud takes none of the thread, as a server without external ids does; one alone may be an oversized first message.\n if (\n THREAD_REFUSAL_STATUSES.has(error.status) ||\n (copied.stored.size === 0 && copied.refused.size > 0)\n ) {\n copied.closed = true;\n console.warn(\n `[assistant-ui] The cloud refused copies to thread ${remoteId}; the dashboard shows the conversation as far as it was copied.`,\n error,\n );\n return;\n }\n copied.refused.add(message.id);\n console.warn(\n `[assistant-ui] The cloud refused the copy of message ${message.id}; the dashboard shows the conversation without it.`,\n error,\n );\n continue;\n }\n copied.stored.add(message.id);\n copied.refused.delete(message.id);\n parent = message.id;\n persistence.record(message.id, message_id);\n for (const part of content.content) {\n if (part.type === \"tool-call\" && part.unstable_interactions) {\n copied.interactions.set(\n part.toolCallId,\n part.unstable_interactions,\n );\n }\n }\n }\n }\n }\n\n // A run is reported once, by the write that first stores its message as settled; rewriting that entry later, as a late tool result does, is not a new run. Eligibility is read before the write, so a load that reads the write back cannot take the report, and the report is claimed after it, so overlapping writes of one message report once.\n private async _writeMessage(\n persistence: CloudMessagePersistence,\n remoteId: string,\n message: ThreadMessage,\n write: (encoded: ReturnType<typeof auiV0Encode>) => Promise<void>,\n ) {\n const encoded = auiV0Encode(message);\n const ledger = runLedgerOf(persistence);\n const firstSettle =\n isSettledMessage(message) && !ledger.settled.has(message.id);\n await write(encoded);\n if (!firstSettle) return;\n ledger.settled.add(message.id);\n if (ledger.reported.has(message.id)) return;\n\n if (!this.cloudRef.current.telemetry.enabled) return;\n const extracted = extractTelemetry(\"aui/v0\", encoded);\n if (!extracted) return;\n ledger.reported.add(message.id);\n this._sendReport(\n remoteId,\n extracted,\n undefined,\n undefined,\n extractRunMessageInfo(message, \"aui/v0\"),\n persistence,\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 persistence = this._persistence;\n const messages = await persistence.load(remoteId, \"aui/v0\");\n // The cloud lists rows newest first, so walking them oldest first puts a\n // parent ahead of its children and a row orphaned by an unreadable parent\n // can be dropped in the same pass; MessageRepository.import throws on a\n // message whose parent is missing.\n const rows = messages\n .filter(\n (m): m is typeof m & { format: \"aui/v0\" } => m.format === \"aui/v0\",\n )\n .reverse();\n\n const loaded: ExportedMessageRepositoryItem[] = [];\n const loadedIds = new Set<string>();\n const { settled } = runLedgerOf(persistence);\n for (const row of rows) {\n const item = auiV0DecodeSafely(row);\n if (!item) continue;\n if (item.parentId && !loadedIds.has(item.parentId)) continue;\n loadedIds.add(item.message.id);\n if (isSettledMessage(item.message)) settled.add(item.message.id);\n loaded.push(item);\n }\n\n return { messages: loaded };\n }\n\n private _reportRunTelemetry<T>(\n format: string,\n runMessages: T[],\n options?: {\n durationMs?: number;\n stepTimestamps?: StepTimestamp[];\n },\n threadListItem?: CloudThreadListItem,\n messageInfo?: RunMessageInfo,\n ) {\n const item = threadListItem ?? this.aui.threadListItem;\n const remoteId = item.getState().remoteId;\n if (!remoteId) return;\n\n const extracted =\n extractRunTelemetry(format, runMessages) ??\n (messageInfo?.status !== undefined\n ? { status: \"incomplete\" as const }\n : undefined);\n if (!extracted) return;\n\n this._sendReport(\n remoteId,\n extracted,\n options?.durationMs,\n options?.stepTimestamps,\n messageInfo,\n this.getPersistence(item),\n );\n }\n\n private _sendReport(\n remoteId: string,\n data: RunMessageTelemetry,\n durationMs?: number,\n stepTimestamps?: StepTimestamp[],\n messageInfo?: RunMessageInfo,\n persistence = this._persistence,\n ) {\n const mergedSteps = mergeStepTimestamps(data.steps, stepTimestamps);\n const messageId = messageInfo?.localMessageId\n ? persistence.getResolvedRemoteId(messageInfo.localMessageId)\n : undefined;\n void this.runReporter.report({\n threadId: remoteId,\n status: messageInfo?.status ?? data.status,\n outcome: messageInfo?.outcomeType,\n error: messageInfo?.error,\n errorCode: messageInfo?.errorCode,\n messageId,\n traceId: messageInfo?.traceId,\n modelId: data.modelId,\n provider: messageInfo?.provider,\n usage: data.usage,\n steps: mergedSteps,\n totalSteps: data.totalSteps,\n toolCalls: data.toolCalls,\n durationMs,\n firstTokenMs: messageInfo?.firstTokenMs,\n outputText: data.outputText,\n metadata: data.metadata,\n });\n }\n}\n\ntype StepTimestamp = { start_ms: number; end_ms: number };\n\nfunction mergeStepTimestamps(\n steps: RunReportStepInit[] | undefined,\n timestamps: StepTimestamp[] | undefined,\n): RunReportStepInit[] | undefined {\n if (!timestamps) return steps;\n if (!steps) {\n return timestamps.map(({ start_ms, end_ms }) => ({\n startMs: start_ms,\n endMs: end_ms,\n }));\n }\n\n const len = Math.min(steps.length, timestamps.length);\n return steps.map((step, index) => ({\n ...step,\n ...(index < len\n ? {\n startMs: timestamps[index]!.start_ms,\n endMs: timestamps[index]!.end_ms,\n }\n : undefined),\n }));\n}\n\ntype RunMessageInfo = {\n localMessageId?: string;\n status?: \"completed\" | \"incomplete\" | \"error\";\n outcomeType?: RunReportOutcome;\n error?: string;\n errorCode?: string;\n firstTokenMs?: number;\n traceId?: string;\n provider?: string;\n};\n\nfunction extractLastRunMessageInfo<\n TMessage,\n TStorageFormat extends Record<string, unknown>,\n>(\n items: MessageFormatItem<TMessage>[],\n formatAdapter: MessageFormatAdapter<TMessage, TStorageFormat>,\n): RunMessageInfo | undefined {\n for (let i = items.length - 1; i >= 0; i--) {\n const item = items[i]!;\n const info = extractRunMessageInfo(\n item.message,\n formatAdapter.format,\n formatAdapter.getId(item.message),\n );\n if (info) return info;\n }\n return undefined;\n}\n\nfunction mergeRunMessageInfo(\n stored: RunMessageInfo | undefined,\n observed: RunMessageInfo | undefined,\n): RunMessageInfo | undefined {\n if (!observed) return stored;\n const { localMessageId: _observedId, ...outcome } = observed;\n return { ...stored, ...outcome };\n}\n\nfunction extractRunMessageInfo(\n message: unknown,\n format: string,\n localMessageId?: string,\n): RunMessageInfo | undefined {\n if (!isRecord(message) || message.role !== \"assistant\") return undefined;\n\n const status = isRecord(message.status) ? message.status : undefined;\n const metadata = isRecord(message.metadata) ? message.metadata : undefined;\n const custom = isRecord(metadata?.custom) ? metadata.custom : undefined;\n const timing = isRecord(metadata?.timing) ? metadata.timing : undefined;\n const firstTokenTime = timing?.firstTokenTime;\n const firstTokenMs =\n typeof firstTokenTime === \"number\" && Number.isFinite(firstTokenTime)\n ? Math.round(firstTokenTime)\n : undefined;\n const finishReason =\n status?.type === \"incomplete\"\n ? typeof status.reason === \"string\"\n ? status.reason\n : undefined\n : typeof metadata?.finishReason === \"string\"\n ? metadata.finishReason\n : undefined;\n const failed = status?.type === \"incomplete\" && status.reason === \"error\";\n const outcome = deriveRunOutcome({ finishReason, isError: failed });\n const outcomeType = outcome.outcome;\n const runStatus =\n outcome.status === \"error\"\n ? \"error\"\n : status?.type === \"incomplete\"\n ? \"incomplete\"\n : finishReason !== undefined\n ? outcome.status\n : undefined;\n const failure = failed ? describeRunError(status.error) : {};\n const messageId =\n localMessageId ?? (typeof message.id === \"string\" ? message.id : undefined);\n const traceId =\n format === \"aui/v0\"\n ? custom?.traceId\n : format === \"ai-sdk/v6\"\n ? metadata?.traceId\n : undefined;\n const provider =\n typeof custom?.provider === \"string\"\n ? custom.provider\n : typeof metadata?.provider === \"string\"\n ? metadata.provider\n : undefined;\n\n return {\n ...(messageId ? { localMessageId: messageId } : undefined),\n ...(runStatus !== undefined ? { status: runStatus } : undefined),\n ...(outcomeType ? { outcomeType } : undefined),\n ...failure,\n ...(firstTokenMs != null && firstTokenMs >= 0\n ? { firstTokenMs }\n : undefined),\n ...(typeof traceId === \"string\" ? { traceId } : undefined),\n ...(provider !== undefined ? { provider } : undefined),\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\";\n}\n\nconst usageTokenKeys = [\n \"inputTokens\",\n \"outputTokens\",\n \"reasoningTokens\",\n \"cachedInputTokens\",\n \"promptTokens\",\n \"completionTokens\",\n] as const;\n\nconst readTokenCount = (value: unknown): number | undefined =>\n typeof value === \"number\" && Number.isFinite(value) && value >= 0\n ? value\n : undefined;\n\nconst readStoredTelemetryUsage = (\n value: unknown,\n): RunTelemetryUsageInit | undefined => {\n if (!isRecord(value) || Array.isArray(value)) return undefined;\n\n const usage: Record<string, unknown> = {};\n for (const key of usageTokenKeys) {\n const count = readTokenCount(value[key]);\n if (count !== undefined) usage[key] = count;\n }\n\n const cacheReadTokens =\n isRecord(value.inputTokenDetails) && !Array.isArray(value.inputTokenDetails)\n ? readTokenCount(value.inputTokenDetails.cacheReadTokens)\n : undefined;\n if (cacheReadTokens !== undefined) {\n usage.inputTokenDetails = { cacheReadTokens };\n }\n\n const reasoningTokens =\n isRecord(value.outputTokenDetails) &&\n !Array.isArray(value.outputTokenDetails)\n ? readTokenCount(value.outputTokenDetails.reasoningTokens)\n : undefined;\n if (reasoningTokens !== undefined) {\n usage.outputTokenDetails = { reasoningTokens };\n }\n\n return Object.keys(usage).length > 0\n ? (usage as RunTelemetryUsageInit)\n : undefined;\n};\n\nconst parseStoredTelemetrySteps = (\n value: unknown,\n): { usage?: RunTelemetryUsageInit }[] =>\n parseStoredThreadSteps(value).map((step) => {\n const usage = readStoredTelemetryUsage(\n (step as Record<string, unknown>).usage,\n );\n return usage ? { usage } : {};\n });\n\nfunction extractTelemetry<T>(\n format: string,\n content: T,\n): RunMessageTelemetry | null {\n switch (format) {\n case \"aui/v0\":\n return extractAuiV0(content);\n case \"ai-sdk/v6\":\n return extractAISDKRunTelemetry([content as AISDKMessageLike]);\n default:\n return null;\n }\n}\n\nfunction extractRunTelemetry<T>(\n format: string,\n runMessages: T[],\n): RunMessageTelemetry | null {\n if (format === \"ai-sdk/v6\") {\n return extractAISDKRunTelemetry(runMessages as AISDKMessageLike[]);\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\nexport function extractAuiV0<T>(content: T): RunMessageTelemetry | null {\n const msg = content as {\n role?: string;\n status?: unknown;\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?: unknown;\n custom?: Record<string, unknown> & { modelId?: string };\n };\n };\n\n if (msg.role !== \"assistant\") return null;\n // A status the persistence boundary rejects carries no verdict, so reporting\n // one would label the run from a value the thread itself never restores.\n if (msg.status !== undefined && !isStoredMessageStatus(msg.status))\n return null;\n const statusType =\n isRecord(msg.status) && typeof msg.status.type === \"string\"\n ? msg.status.type\n : undefined;\n // A non-terminal write is not a finished run; reporting it would mislabel it\n // \"completed\" and double-count steps once the terminal write reports.\n if (statusType === \"running\" || statusType === \"requires-action\") {\n return null;\n }\n\n const toolCalls = msg.content\n ?.filter((p) => p.type === \"tool-call\" && p.toolName && p.toolCallId)\n .map((p) =>\n createRunTelemetryToolCall({\n toolName: p.toolName!,\n toolCallId: p.toolCallId!,\n args: p.args,\n result: p.result,\n argsText: p.argsText,\n }),\n );\n\n const textParts = msg.content?.filter((p) => p.type === \"text\" && p.text);\n const outputText =\n textParts && textParts.length > 0\n ? truncateRunTelemetryText(textParts.map((p) => p.text).join(\"\"))\n : undefined;\n\n const steps = parseStoredTelemetrySteps(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) continue;\n const usage = normalizeRunTelemetryUsage(step.usage);\n if (!usage) continue;\n if (usage.inputTokens != null) {\n totalInput += usage.inputTokens;\n hasInput = true;\n }\n if (usage.outputTokens != null) {\n totalOutput += usage.outputTokens;\n hasOutput = true;\n }\n if (usage.reasoningTokens != null) {\n totalReasoning += usage.reasoningTokens;\n hasReasoning = true;\n }\n if (usage.cachedInputTokens != null) {\n totalCachedInput += 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 status = statusType === \"incomplete\" ? \"incomplete\" : \"completed\";\n\n const metadata = msg.metadata?.custom as Record<string, unknown> | undefined;\n const modelId = extractRunTelemetryModelId(\n msg.metadata as Record<string, unknown> | undefined,\n );\n\n const telemetrySteps: RunReportStepInit[] | undefined =\n steps.length > 0 ? steps : undefined;\n\n return {\n status,\n ...(toolCalls && toolCalls.length > 0 ? { toolCalls } : undefined),\n ...(steps?.length ? { totalSteps: steps.length } : undefined),\n ...(inputTokens != null ||\n outputTokens != null ||\n reasoningTokens != null ||\n cachedInputTokens != null\n ? {\n usage: {\n ...(inputTokens != null ? { inputTokens } : undefined),\n ...(outputTokens != null ? { outputTokens } : undefined),\n ...(reasoningTokens != null ? { reasoningTokens } : undefined),\n ...(cachedInputTokens != null ? { cachedInputTokens } : undefined),\n },\n }\n : undefined),\n ...(outputText != null ? { outputText } : undefined),\n ...(metadata ? { metadata } : undefined),\n ...(telemetrySteps ? { steps: telemetrySteps } : undefined),\n ...(modelId ? { modelId } : undefined),\n };\n}\n\nexport function useAssistantCloudThreadHistoryAdapter(\n cloudRef: RefObject<AssistantCloud>,\n): ThreadHistoryAdapter & { readonly feedback: FeedbackAdapter } {\n const aui = useAui();\n // Not useEffectEvent: history adapter methods run during render (SSR load).\n const auiRef = useRef(aui);\n useEffect(() => {\n auiRef.current = aui;\n });\n const [adapter] = useState(\n () =>\n new AssistantCloudThreadHistoryAdapter(cloudRef, () => auiRef.current),\n );\n useAssistantCloudEngagementEvents(adapter, aui);\n return adapter;\n}\n\ntype EngagementTracker = {\n mounted: Map<AssistantCloudThreadHistoryAdapter, AssistantClient>;\n lastMounted: AssistantCloudThreadHistoryAdapter;\n reporter: CloudEngagementReporter;\n host: AssistantClient | undefined;\n dispose: (() => void) | undefined;\n};\n\nconst engagementTrackers = new WeakMap<\n getClientId.ClientId,\n EngagementTracker\n>();\n\nconst mountedAdapter = (\n tracker: EngagementTracker,\n threadId?: string,\n): AssistantCloudThreadHistoryAdapter => {\n let fallback: AssistantCloudThreadHistoryAdapter | undefined;\n for (const adapter of tracker.mounted.keys()) {\n if (threadId !== undefined && adapter.ownsThread(threadId)) return adapter;\n fallback ??= adapter;\n }\n return fallback ?? tracker.lastMounted;\n};\n\nconst createEngagementTracker = (\n adapter: AssistantCloudThreadHistoryAdapter,\n): EngagementTracker => {\n const tracker: EngagementTracker = {\n mounted: new Map(),\n lastMounted: adapter,\n reporter: new CloudEngagementReporter(\n () => mountedAdapter(tracker).getCloud(),\n (threadId, messageId, options) =>\n mountedAdapter(tracker, threadId).resolveEngagementEventIds(\n threadId,\n messageId,\n options,\n ),\n ),\n host: undefined,\n dispose: undefined,\n };\n return tracker;\n};\n\nconst subscribeEngagementEvents = (\n aui: AssistantClient,\n reporter: CloudEngagementReporter,\n): (() => void) => {\n const reportSuggestions = () => {\n const { mainThreadId } = aui.threads.getState();\n const { isEmpty, suggestions } = aui.thread.getState();\n if (!isEmpty || suggestions.length === 0) return;\n reporter.suggestionsShown(mainThreadId, suggestions.length);\n };\n\n const unsubscribers = [\n aui.on({ scope: \"*\", event: \"threads.selectionChanged\" }, (payload) => {\n reporter.threadSwitched(payload.threadId);\n }),\n aui.on({ scope: \"*\", event: \"composer.send\" }, (payload) => {\n if (payload.messageId) {\n reporter.messageEdited(payload.threadId, {\n messageId: payload.messageId,\n chars: payload.chars,\n });\n } else {\n reporter.messageSent(payload.threadId, {\n chars: payload.chars,\n attachments: payload.attachments,\n });\n }\n if (payload.suggestion) {\n reporter.suggestionClicked(payload.threadId);\n }\n }),\n aui.on({ scope: \"*\", event: \"composer.attachmentAdd\" }, (payload) => {\n reporter.attachmentAdded(payload.threadId, {\n messageId: payload.messageId,\n contentType: payload.contentType,\n });\n }),\n aui.on({ scope: \"*\", event: \"composer.attachmentAddError\" }, (payload) => {\n reporter.attachmentFailed(payload.threadId, {\n messageId: payload.messageId,\n contentType: payload.contentType,\n });\n }),\n aui.on({ scope: \"*\", event: \"composer.cancel\" }, (payload) => {\n reporter.runStopped(payload.threadId);\n }),\n aui.on({ scope: \"*\", event: \"thread.runStart\" }, (payload) => {\n reporter.runStarted(payload.threadId);\n }),\n aui.on({ scope: \"*\", event: \"thread.runEnd\" }, (payload) => {\n reporter.runEnded(payload.threadId);\n }),\n aui.on({ scope: \"*\", event: \"thread.cancelRun\" }, (payload) => {\n reporter.runStopped(payload.threadId);\n }),\n aui.on({ scope: \"*\", event: \"thread.voiceStarted\" }, (payload) => {\n reporter.voiceStarted(payload.threadId);\n }),\n aui.on({ scope: \"*\", event: \"message.reload\" }, (payload) => {\n reporter.messageRegenerated(payload.threadId, payload.messageId);\n }),\n aui.on({ scope: \"*\", event: \"message.branchSwitched\" }, (payload) => {\n reporter.branchSwitched(payload.threadId, payload.messageId);\n }),\n aui.on({ scope: \"*\", event: \"message.copied\" }, (payload) => {\n reporter.messageCopied(payload.threadId, payload.messageId);\n }),\n aui.on({ scope: \"*\", event: \"thread.toolApprovalAnswered\" }, (payload) => {\n if (payload.approved) {\n reporter.toolApproved(\n payload.threadId,\n payload.messageId,\n payload.toolCallId,\n payload.toolName,\n );\n } else {\n reporter.toolRejected(\n payload.threadId,\n payload.messageId,\n payload.toolCallId,\n payload.toolName,\n );\n }\n }),\n aui.on({ scope: \"*\", event: \"message.speak\" }, (payload) => {\n reporter.speechStarted(payload.threadId, payload.messageId);\n }),\n aui.on({ scope: \"*\", event: \"message.error\" }, (payload) => {\n reporter.errorShown(payload.threadId, {\n messageId: payload.messageId,\n reason: payload.reason,\n });\n }),\n aui.subscribe(reportSuggestions),\n ];\n\n reportSuggestions();\n return () => runCleanups(unsubscribers);\n};\n\nconst installEngagementEvents = (\n tracker: EngagementTracker,\n host: AssistantClient,\n) => {\n tracker.host = host;\n tracker.dispose = subscribeEngagementEvents(host, tracker.reporter);\n};\n\nconst uninstallEngagementEvents = (tracker: EngagementTracker) => {\n const dispose = tracker.dispose;\n tracker.host = undefined;\n tracker.dispose = undefined;\n dispose?.();\n};\n\n/**\n * The client delivers an event to every listener once per emission, and a\n * thread runtime, with this adapter inside it, mounts once per visited\n * thread. One subscription set per thread list therefore reports each event\n * once, attributed by the thread id the event carries, and the reporter that\n * keeps run timing per thread lives as long as the list. The subscriptions\n * ride on one mounted thread's client, because a thread's own client stops\n * forwarding state notifications once its runtime unmounts, so they move to\n * another mounted thread when their host leaves.\n */\nconst useAssistantCloudEngagementEvents = (\n adapter: AssistantCloudThreadHistoryAdapter,\n aui: AssistantClient,\n) => {\n useEffect(() => {\n const key = getClientId(aui.threads);\n let tracker = engagementTrackers.get(key);\n if (!tracker) {\n tracker = createEngagementTracker(adapter);\n engagementTrackers.set(key, tracker);\n }\n const active = tracker;\n active.mounted.set(adapter, aui);\n active.lastMounted = adapter;\n if (active.host === undefined) installEngagementEvents(active, aui);\n return () => {\n active.mounted.delete(adapter);\n if (active.host !== aui) return;\n uninstallEngagementEvents(active);\n const next = active.mounted.values().next();\n if (!next.done) installEngagementEvents(active, next.value);\n };\n }, [adapter, aui]);\n};\n"],"mappings":"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"}
@@ -1,19 +1,17 @@
1
- import { Attachment, CompleteAttachment, PendingAttachment } from "../../../types/attachment.js";
2
- import { AttachmentAdapter } from "../../../adapters/attachment.js";
3
- import { AssistantCloud } from "assistant-cloud";
4
- //#region src/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts
1
+ import type { AssistantCloud } from "assistant-cloud";
2
+ import type { Attachment, PendingAttachment, CompleteAttachment } from "../../../types/attachment.js";
3
+ import type { AttachmentAdapter } from "../../../adapters/attachment.js";
5
4
  export declare class CloudFileAttachmentAdapter implements AttachmentAdapter {
6
- accept: string;
7
- private getCloud;
8
- constructor(cloud: AssistantCloud);
9
- constructor(getCloud: () => AssistantCloud);
10
- private uploadedUrls;
11
- private activeUploads;
12
- add({ file }: {
13
- file: File;
14
- }): AsyncGenerator<PendingAttachment, void>;
15
- remove(attachment: Attachment): Promise<void>;
16
- send(attachment: PendingAttachment): Promise<CompleteAttachment>;
5
+ accept: string;
6
+ private getCloud;
7
+ constructor(cloud: AssistantCloud);
8
+ constructor(getCloud: () => AssistantCloud);
9
+ private uploadedUrls;
10
+ private activeUploads;
11
+ add({ file, }: {
12
+ file: File;
13
+ }): AsyncGenerator<PendingAttachment, void>;
14
+ remove(attachment: Attachment): Promise<void>;
15
+ send(attachment: PendingAttachment): Promise<CompleteAttachment>;
17
16
  }
18
- //#endregion
19
17
  //# sourceMappingURL=CloudFileAttachmentAdapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CloudFileAttachmentAdapter.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts"],"mappings":";;;;qBAkBa,sCAAsC;EAC1C;UAEC;EAEI,YAAA,OAAO;EACP,YAAA,gBAAgB;UAKpB;UACA;EAKM,MACZ;IAEA,MAAM;MACJ,eAAe;EAmEN,OAAO,YAAY,aAAa;EAUhC,KACX,YAAY,oBACX,QAAQ"}
1
+ {"version":3,"file":"CloudFileAttachmentAdapter.d.ts","sourceRoot":"","sources":["../../../../src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EACV,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EACnB,qCAAkC;AAEnC,OAAO,KAAK,EAAE,iBAAiB,EAAE,wCAAqC;AActE,qBAAa,0BAA2B,YAAW,iBAAiB;IAC3D,MAAM,SAAO;IAEpB,OAAO,CAAC,QAAQ,CAAuB;gBAE3B,KAAK,EAAE,cAAc;gBACrB,QAAQ,EAAE,MAAM,cAAc;IAK1C,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,aAAa,CAGjB;IAEU,GAAG,CAAC,EAChB,IAAI,GACL,EAAE;QACD,IAAI,EAAE,IAAI,CAAC;KACZ,GAAG,cAAc,CAAC,iBAAiB,EAAE,IAAI,CAAC;IAoE9B,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAU7C,IAAI,CACf,UAAU,EAAE,iBAAiB,GAC5B,OAAO,CAAC,kBAAkB,CAAC;CAyB/B"}
@@ -1,5 +1,7 @@
1
1
  import { generateId } from "../../../utils/id.js";
2
+ import { resolveFileMediaType } from "../../../utils/wire-media.js";
2
3
  //#region src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts
4
+ const DEFAULT_CONTENT_TYPE = "application/octet-stream";
3
5
  const guessAttachmentType = (contentType) => {
4
6
  if (contentType.startsWith("image/")) return "image";
5
7
  if (contentType.startsWith("text/")) return "document";
@@ -15,11 +17,13 @@ var CloudFileAttachmentAdapter = class {
15
17
  activeUploads = /* @__PURE__ */ new Map();
16
18
  async *add({ file }) {
17
19
  const id = generateId();
20
+ const type = guessAttachmentType(file.type);
21
+ const contentType = file.type || DEFAULT_CONTENT_TYPE;
18
22
  let attachment = {
19
23
  id,
20
- type: guessAttachmentType(file.type),
24
+ type,
21
25
  name: file.name,
22
- contentType: file.type,
26
+ contentType,
23
27
  file,
24
28
  status: {
25
29
  type: "running",
@@ -41,7 +45,7 @@ var CloudFileAttachmentAdapter = class {
41
45
  const res = await fetch(signedUrl, {
42
46
  method: "PUT",
43
47
  body: file,
44
- headers: { "Content-Type": file.type },
48
+ headers: { "Content-Type": contentType },
45
49
  mode: "cors",
46
50
  signal: controller.signal
47
51
  });
@@ -94,7 +98,7 @@ var CloudFileAttachmentAdapter = class {
94
98
  else content = [{
95
99
  type: "file",
96
100
  data: url,
97
- mimeType: attachment.contentType ?? "",
101
+ mimeType: resolveFileMediaType(url, attachment.contentType),
98
102
  filename: attachment.name
99
103
  }];
100
104
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"CloudFileAttachmentAdapter.js","names":["AssistantCloud","Attachment","PendingAttachment","CompleteAttachment","ThreadUserMessagePart","AttachmentAdapter","generateId","guessAttachmentType","contentType","startsWith","CloudFileAttachmentAdapter","accept","getCloud","constructor","cloud","uploadedUrls","Map","activeUploads","cancelled","controller","AbortController","add","file","File","AsyncGenerator","id","type","attachment","name","status","reason","progress","upload","set","signedUrl","publicUrl","files","generatePresignedUploadUrl","filename","res","fetch","method","body","headers","mode","signal","ok","Error","statusText","error","console","message","String","get","delete","remove","Promise","abort","send","url","content","image","data","mimeType"],"sources":["../../../../src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts"],"sourcesContent":["import type { AssistantCloud } from \"assistant-cloud\";\nimport type {\n Attachment,\n PendingAttachment,\n CompleteAttachment,\n} from \"../../../types/attachment\";\nimport type { ThreadUserMessagePart } from \"../../../types/message\";\nimport type { AttachmentAdapter } from \"../../../adapters/attachment\";\nimport { generateId } from \"../../../utils/id\";\n\nconst guessAttachmentType = (\n contentType: string,\n): \"image\" | \"document\" | \"file\" => {\n if (contentType.startsWith(\"image/\")) return \"image\";\n if (contentType.startsWith(\"text/\")) return \"document\";\n return \"file\";\n};\n\nexport class CloudFileAttachmentAdapter implements AttachmentAdapter {\n public accept = \"*\";\n\n private getCloud: () => AssistantCloud;\n\n constructor(cloud: AssistantCloud);\n constructor(getCloud: () => AssistantCloud);\n constructor(cloud: AssistantCloud | (() => AssistantCloud)) {\n this.getCloud = typeof cloud === \"function\" ? cloud : () => cloud;\n }\n\n private uploadedUrls = new Map<string, string>();\n private activeUploads = new Map<\n string,\n { cancelled: boolean; controller: AbortController }\n >();\n\n public async *add({\n file,\n }: {\n file: File;\n }): AsyncGenerator<PendingAttachment, void> {\n const id = generateId();\n const type = guessAttachmentType(file.type);\n let attachment: PendingAttachment = {\n id,\n type,\n name: file.name,\n contentType: file.type,\n file,\n status: { type: \"running\", reason: \"uploading\", progress: 0 },\n };\n const controller = new AbortController();\n const upload = { cancelled: false, controller };\n this.activeUploads.set(id, upload);\n\n try {\n yield attachment;\n if (upload.cancelled) return;\n\n const { signedUrl, publicUrl } =\n await this.getCloud().files.generatePresignedUploadUrl({\n filename: file.name,\n });\n if (upload.cancelled) return;\n\n const res = await fetch(signedUrl, {\n method: \"PUT\",\n body: file,\n headers: {\n \"Content-Type\": file.type,\n },\n mode: \"cors\",\n signal: controller.signal,\n });\n if (upload.cancelled) return;\n\n if (!res.ok) {\n throw new Error(\n `Failed to upload file: ${res.status} ${res.statusText}`,\n );\n }\n this.uploadedUrls.set(id, publicUrl);\n attachment = {\n ...attachment,\n status: { type: \"requires-action\", reason: \"composer-send\" },\n };\n yield attachment;\n } catch (error) {\n if (upload.cancelled) return;\n\n console.error(\"[assistant-ui] Failed to upload attachment:\", error);\n attachment = {\n ...attachment,\n status: {\n type: \"incomplete\",\n reason: \"error\",\n message: error instanceof Error ? error.message : String(error),\n },\n };\n yield attachment;\n } finally {\n if (this.activeUploads.get(id) === upload) {\n this.activeUploads.delete(id);\n }\n }\n }\n\n public async remove(attachment: Attachment): Promise<void> {\n const upload = this.activeUploads.get(attachment.id);\n if (upload) {\n upload.cancelled = true;\n upload.controller.abort();\n this.activeUploads.delete(attachment.id);\n }\n this.uploadedUrls.delete(attachment.id);\n }\n\n public async send(\n attachment: PendingAttachment,\n ): Promise<CompleteAttachment> {\n const url = this.uploadedUrls.get(attachment.id);\n if (!url) throw new Error(\"Attachment not uploaded\");\n this.uploadedUrls.delete(attachment.id);\n\n let content: ThreadUserMessagePart[];\n if (attachment.type === \"image\") {\n content = [{ type: \"image\", image: url, filename: attachment.name }];\n } else {\n content = [\n {\n type: \"file\",\n data: url,\n mimeType: attachment.contentType ?? \"\",\n filename: attachment.name,\n },\n ];\n }\n\n return {\n ...attachment,\n status: { type: \"complete\" },\n content,\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"CloudFileAttachmentAdapter.js","names":["AssistantCloud","Attachment","PendingAttachment","CompleteAttachment","ThreadUserMessagePart","AttachmentAdapter","generateId","resolveFileMediaType","DEFAULT_CONTENT_TYPE","guessAttachmentType","contentType","startsWith","CloudFileAttachmentAdapter","accept","getCloud","constructor","cloud","uploadedUrls","Map","activeUploads","cancelled","controller","AbortController","add","file","File","AsyncGenerator","id","type","attachment","name","status","reason","progress","upload","set","signedUrl","publicUrl","files","generatePresignedUploadUrl","filename","res","fetch","method","body","headers","mode","signal","ok","Error","statusText","error","console","message","String","get","delete","remove","Promise","abort","send","url","content","image","data","mimeType"],"sources":["../../../../src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts"],"sourcesContent":["import type { AssistantCloud } from \"assistant-cloud\";\nimport type {\n Attachment,\n PendingAttachment,\n CompleteAttachment,\n} from \"../../../types/attachment\";\nimport type { ThreadUserMessagePart } from \"../../../types/message\";\nimport type { AttachmentAdapter } from \"../../../adapters/attachment\";\nimport { generateId } from \"../../../utils/id\";\nimport { resolveFileMediaType } from \"../../../utils/wire-media\";\n\nconst DEFAULT_CONTENT_TYPE = \"application/octet-stream\";\n\nconst guessAttachmentType = (\n contentType: string,\n): \"image\" | \"document\" | \"file\" => {\n if (contentType.startsWith(\"image/\")) return \"image\";\n if (contentType.startsWith(\"text/\")) return \"document\";\n return \"file\";\n};\n\nexport class CloudFileAttachmentAdapter implements AttachmentAdapter {\n public accept = \"*\";\n\n private getCloud: () => AssistantCloud;\n\n constructor(cloud: AssistantCloud);\n constructor(getCloud: () => AssistantCloud);\n constructor(cloud: AssistantCloud | (() => AssistantCloud)) {\n this.getCloud = typeof cloud === \"function\" ? cloud : () => cloud;\n }\n\n private uploadedUrls = new Map<string, string>();\n private activeUploads = new Map<\n string,\n { cancelled: boolean; controller: AbortController }\n >();\n\n public async *add({\n file,\n }: {\n file: File;\n }): AsyncGenerator<PendingAttachment, void> {\n const id = generateId();\n const type = guessAttachmentType(file.type);\n const contentType = file.type || DEFAULT_CONTENT_TYPE;\n let attachment: PendingAttachment = {\n id,\n type,\n name: file.name,\n contentType,\n file,\n status: { type: \"running\", reason: \"uploading\", progress: 0 },\n };\n const controller = new AbortController();\n const upload = { cancelled: false, controller };\n this.activeUploads.set(id, upload);\n\n try {\n yield attachment;\n if (upload.cancelled) return;\n\n const { signedUrl, publicUrl } =\n await this.getCloud().files.generatePresignedUploadUrl({\n filename: file.name,\n });\n if (upload.cancelled) return;\n\n const res = await fetch(signedUrl, {\n method: \"PUT\",\n body: file,\n headers: {\n \"Content-Type\": contentType,\n },\n mode: \"cors\",\n signal: controller.signal,\n });\n if (upload.cancelled) return;\n\n if (!res.ok) {\n throw new Error(\n `Failed to upload file: ${res.status} ${res.statusText}`,\n );\n }\n this.uploadedUrls.set(id, publicUrl);\n attachment = {\n ...attachment,\n status: { type: \"requires-action\", reason: \"composer-send\" },\n };\n yield attachment;\n } catch (error) {\n if (upload.cancelled) return;\n\n console.error(\"[assistant-ui] Failed to upload attachment:\", error);\n attachment = {\n ...attachment,\n status: {\n type: \"incomplete\",\n reason: \"error\",\n message: error instanceof Error ? error.message : String(error),\n },\n };\n yield attachment;\n } finally {\n if (this.activeUploads.get(id) === upload) {\n this.activeUploads.delete(id);\n }\n }\n }\n\n public async remove(attachment: Attachment): Promise<void> {\n const upload = this.activeUploads.get(attachment.id);\n if (upload) {\n upload.cancelled = true;\n upload.controller.abort();\n this.activeUploads.delete(attachment.id);\n }\n this.uploadedUrls.delete(attachment.id);\n }\n\n public async send(\n attachment: PendingAttachment,\n ): Promise<CompleteAttachment> {\n const url = this.uploadedUrls.get(attachment.id);\n if (!url) throw new Error(\"Attachment not uploaded\");\n this.uploadedUrls.delete(attachment.id);\n\n let content: ThreadUserMessagePart[];\n if (attachment.type === \"image\") {\n content = [{ type: \"image\", image: url, filename: attachment.name }];\n } else {\n content = [\n {\n type: \"file\",\n data: url,\n mimeType: resolveFileMediaType(url, attachment.contentType),\n filename: attachment.name,\n },\n ];\n }\n\n return {\n ...attachment,\n status: { type: \"complete\" },\n content,\n };\n }\n}\n"],"mappings":";;;AAWA,MAAMQ,uBAAuB;AAE7B,MAAMC,uBACJC,gBACkC;CAClC,IAAIA,YAAYC,WAAW,QAAQ,GAAG,OAAO;CAC7C,IAAID,YAAYC,WAAW,OAAO,GAAG,OAAO;CAC5C,OAAO;AACT;AAEA,IAAaC,6BAAb,MAAqE;CACnE,SAAgB;CAEhB;CAIAG,YAAYC,OAAgD;EAC1D,KAAKF,WAAW,OAAOE,UAAU,aAAaA,cAAcA;CAC9D;CAEA,+BAAuB,IAAIE,IAAoB;CAC/C,gCAAwB,IAAIA,IAG1B;CAEF,OAAcK,IAAI,EAChBC,QAG0C;EAC1C,MAAMG,KAAKrB,WAAW;EACtB,MAAMsB,OAAOnB,oBAAoBe,KAAKI,IAAI;EAC1C,MAAMlB,cAAcc,KAAKI,QAAQpB;EACjC,IAAIqB,aAAgC;GAClCF;GACAC;GACAE,MAAMN,KAAKM;GACXpB;GACAc;GACAO,QAAQ;IAAEH,MAAM;IAAWI,QAAQ;IAAaC,UAAU;GAAE;EAC9D;EACA,MAAMZ,aAAa,IAAIC,gBAAgB;EACvC,MAAMY,SAAS;GAAEd,WAAW;GAAOC;EAAW;EAC9C,KAAKF,cAAcgB,IAAIR,IAAIO,MAAM;EAEjC,IAAI;GACF,MAAML;GACN,IAAIK,OAAOd,WAAW;GAEtB,MAAM,EAAEgB,WAAWC,cACjB,MAAM,KAAKvB,SAAS,CAAC,CAACwB,MAAMC,2BAA2B,EACrDC,UAAUhB,KAAKM,KACjB,CAAC;GACH,IAAII,OAAOd,WAAW;GAEtB,MAAMqB,MAAM,MAAMC,MAAMN,WAAW;IACjCO,QAAQ;IACRC,MAAMpB;IACNqB,SAAS,EACP,gBAAgBnC,YAClB;IACAoC,MAAM;IACNC,QAAQ1B,WAAW0B;GACrB,CAAC;GACD,IAAIb,OAAOd,WAAW;GAEtB,IAAI,CAACqB,IAAIO,IACP,MAAM,IAAIC,MACR,0BAA0BR,IAAIV,OAAM,GAAIU,IAAIS,YAC9C;GAEF,KAAKjC,aAAakB,IAAIR,IAAIU,SAAS;GACnCR,aAAa;IACX,GAAGA;IACHE,QAAQ;KAAEH,MAAM;KAAmBI,QAAQ;IAAgB;GAC7D;GACA,MAAMH;EACR,SAASsB,OAAO;GACd,IAAIjB,OAAOd,WAAW;GAEtBgC,QAAQD,MAAM,+CAA+CA,KAAK;GAClEtB,aAAa;IACX,GAAGA;IACHE,QAAQ;KACNH,MAAM;KACNI,QAAQ;KACRqB,SAASF,iBAAiBF,QAAQE,MAAME,UAAUC,OAAOH,KAAK;IAChE;GACF;GACA,MAAMtB;EACR,UAAU;GACR,IAAI,KAAKV,cAAcoC,IAAI5B,EAAE,MAAMO,QACjC,KAAKf,cAAcqC,OAAO7B,EAAE;EAEhC;CACF;CAEA,MAAa8B,OAAO5B,YAAuC;EACzD,MAAMK,SAAS,KAAKf,cAAcoC,IAAI1B,WAAWF,EAAE;EACnD,IAAIO,QAAQ;GACVA,OAAOd,YAAY;GACnBc,OAAOb,WAAWsC,MAAM;GACxB,KAAKxC,cAAcqC,OAAO3B,WAAWF,EAAE;EACzC;EACA,KAAKV,aAAauC,OAAO3B,WAAWF,EAAE;CACxC;CAEA,MAAaiC,KACX/B,YAC6B;EAC7B,MAAMgC,MAAM,KAAK5C,aAAasC,IAAI1B,WAAWF,EAAE;EAC/C,IAAI,CAACkC,KAAK,MAAM,IAAIZ,MAAM,yBAAyB;EACnD,KAAKhC,aAAauC,OAAO3B,WAAWF,EAAE;EAEtC,IAAImC;EACJ,IAAIjC,WAAWD,SAAS,SACtBkC,UAAU,CAAC;GAAElC,MAAM;GAASmC,OAAOF;GAAKrB,UAAUX,WAAWC;EAAK,CAAC;OAEnEgC,UAAU,CACR;GACElC,MAAM;GACNoC,MAAMH;GACNI,UAAU1D,qBAAqBsD,KAAKhC,WAAWnB,WAAW;GAC1D8B,UAAUX,WAAWC;EACvB,CAAC;EAIL,OAAO;GACL,GAAGD;GACHE,QAAQ,EAAEH,MAAM,WAAW;GAC3BkC;EACF;CACF;AACF"}