@assistant-ui/core 0.3.13 → 0.3.14

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 (396) hide show
  1. package/dist/adapters/speech.d.ts.map +1 -1
  2. package/dist/adapters/speech.js +9 -15
  3. package/dist/adapters/speech.js.map +1 -1
  4. package/dist/adapters/thread-history.d.ts +2 -0
  5. package/dist/adapters/thread-history.d.ts.map +1 -1
  6. package/dist/adapters/voice.d.ts.map +1 -1
  7. package/dist/adapters/voice.js +27 -15
  8. package/dist/adapters/voice.js.map +1 -1
  9. package/dist/index.d.ts +2 -2
  10. package/dist/index.js.map +1 -1
  11. package/dist/internal.d.ts +1 -1
  12. package/dist/internal.js +6 -6
  13. package/dist/model-context/frame/host.d.ts.map +1 -1
  14. package/dist/model-context/frame/host.js +2 -1
  15. package/dist/model-context/frame/host.js.map +1 -1
  16. package/dist/model-context/registry.d.ts.map +1 -1
  17. package/dist/model-context/registry.js +16 -4
  18. package/dist/model-context/registry.js.map +1 -1
  19. package/dist/react/RuntimeAdapter.d.ts +8 -1
  20. package/dist/react/RuntimeAdapter.d.ts.map +1 -1
  21. package/dist/react/RuntimeAdapter.js +23 -18
  22. package/dist/react/RuntimeAdapter.js.map +1 -1
  23. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
  24. package/dist/react/adapters/LocalStorageThreadListAdapter.js +28 -12
  25. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  26. package/dist/react/client/AdaptedRemoteThread.d.ts +11 -0
  27. package/dist/react/client/AdaptedRemoteThread.d.ts.map +1 -0
  28. package/dist/react/client/AdaptedRemoteThread.js +27 -0
  29. package/dist/react/client/AdaptedRemoteThread.js.map +1 -0
  30. package/dist/react/client/InMemoryThreadList.d.ts +19 -0
  31. package/dist/react/client/InMemoryThreadList.d.ts.map +1 -0
  32. package/dist/react/client/InMemoryThreadList.js +418 -0
  33. package/dist/react/client/InMemoryThreadList.js.map +1 -0
  34. package/dist/react/client/Interactables.d.ts.map +1 -1
  35. package/dist/react/client/Interactables.js +159 -102
  36. package/dist/react/client/Interactables.js.map +1 -1
  37. package/dist/react/client/RemoteThreadList.d.ts +34 -0
  38. package/dist/react/client/RemoteThreadList.d.ts.map +1 -0
  39. package/dist/react/client/RemoteThreadList.js +826 -0
  40. package/dist/react/client/RemoteThreadList.js.map +1 -0
  41. package/dist/react/client/Tools.d.ts.map +1 -1
  42. package/dist/react/client/Tools.js +38 -27
  43. package/dist/react/client/Tools.js.map +1 -1
  44. package/dist/react/index.d.ts +7 -2
  45. package/dist/react/index.js +5 -2
  46. package/dist/react/interactables-legacy/Interactables.d.ts.map +1 -1
  47. package/dist/react/interactables-legacy/Interactables.js +145 -110
  48. package/dist/react/interactables-legacy/Interactables.js.map +1 -1
  49. package/dist/react/primitive-hooks/useActionBarCopy.d.ts.map +1 -1
  50. package/dist/react/primitive-hooks/useActionBarCopy.js +13 -18
  51. package/dist/react/primitive-hooks/useActionBarCopy.js.map +1 -1
  52. package/dist/react/primitive-hooks/useActionBarEdit.d.ts.map +1 -1
  53. package/dist/react/primitive-hooks/useActionBarEdit.js +2 -4
  54. package/dist/react/primitive-hooks/useActionBarEdit.js.map +1 -1
  55. package/dist/react/primitive-hooks/useActionBarReload.d.ts.map +1 -1
  56. package/dist/react/primitive-hooks/useActionBarReload.js +2 -4
  57. package/dist/react/primitive-hooks/useActionBarReload.js.map +1 -1
  58. package/dist/react/primitive-hooks/useBranchPickerNext.d.ts.map +1 -1
  59. package/dist/react/primitive-hooks/useBranchPickerNext.js +2 -6
  60. package/dist/react/primitive-hooks/useBranchPickerNext.js.map +1 -1
  61. package/dist/react/primitive-hooks/useBranchPickerPrevious.d.ts.map +1 -1
  62. package/dist/react/primitive-hooks/useBranchPickerPrevious.js +2 -6
  63. package/dist/react/primitive-hooks/useBranchPickerPrevious.js.map +1 -1
  64. package/dist/react/primitive-hooks/useComposerCancel.d.ts.map +1 -1
  65. package/dist/react/primitive-hooks/useComposerCancel.js +2 -4
  66. package/dist/react/primitive-hooks/useComposerCancel.js.map +1 -1
  67. package/dist/react/primitive-hooks/useComposerSend.d.ts.map +1 -1
  68. package/dist/react/primitive-hooks/useComposerSend.js +2 -4
  69. package/dist/react/primitive-hooks/useComposerSend.js.map +1 -1
  70. package/dist/react/primitive-hooks/useSuggestionTrigger.d.ts.map +1 -1
  71. package/dist/react/primitive-hooks/useSuggestionTrigger.js +6 -2
  72. package/dist/react/primitive-hooks/useSuggestionTrigger.js.map +1 -1
  73. package/dist/react/primitives/message/MessageParts.d.ts +13 -0
  74. package/dist/react/primitives/message/MessageParts.d.ts.map +1 -1
  75. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  76. package/dist/react/primitives/thread/ThreadMessages.d.ts.map +1 -1
  77. package/dist/react/primitives/thread/ThreadMessages.js +1 -1
  78. package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
  79. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +22 -10
  80. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  81. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +109 -71
  82. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  83. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +8 -2
  84. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  85. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +40 -13
  86. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  87. package/dist/react/runtimes/RemoteThreadResource.d.ts +30 -0
  88. package/dist/react/runtimes/RemoteThreadResource.d.ts.map +1 -0
  89. package/dist/react/runtimes/RemoteThreadResource.js +134 -0
  90. package/dist/react/runtimes/RemoteThreadResource.js.map +1 -0
  91. package/dist/react/runtimes/RuntimeAdapterProvider.d.ts +3 -10
  92. package/dist/react/runtimes/RuntimeAdapterProvider.d.ts.map +1 -1
  93. package/dist/react/runtimes/RuntimeAdapterProvider.js +3 -6
  94. package/dist/react/runtimes/RuntimeAdapterProvider.js.map +1 -1
  95. package/dist/react/runtimes/assistant-transport/commandQueue.d.ts +17 -0
  96. package/dist/react/runtimes/assistant-transport/commandQueue.d.ts.map +1 -0
  97. package/dist/react/runtimes/assistant-transport/commandQueue.js +55 -0
  98. package/dist/react/runtimes/assistant-transport/commandQueue.js.map +1 -0
  99. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.d.ts +11 -0
  100. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.d.ts.map +1 -0
  101. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.js +165 -0
  102. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.js.map +1 -0
  103. package/dist/react/runtimes/assistant-transport/runManager.d.ts +15 -0
  104. package/dist/react/runtimes/assistant-transport/runManager.d.ts.map +1 -0
  105. package/dist/react/runtimes/assistant-transport/runManager.js +86 -0
  106. package/dist/react/runtimes/assistant-transport/runManager.js.map +1 -0
  107. package/dist/react/runtimes/assistant-transport/types.d.ts +130 -0
  108. package/dist/react/runtimes/assistant-transport/types.d.ts.map +1 -0
  109. package/dist/react/runtimes/assistant-transport/types.js +0 -0
  110. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts +14 -0
  111. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts.map +1 -0
  112. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.js +296 -0
  113. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.js.map +1 -0
  114. package/dist/react/runtimes/assistant-transport/useConvertedState.d.ts +7 -0
  115. package/dist/react/runtimes/assistant-transport/useConvertedState.d.ts.map +1 -0
  116. package/dist/react/runtimes/assistant-transport/useConvertedState.js +25 -0
  117. package/dist/react/runtimes/assistant-transport/useConvertedState.js.map +1 -0
  118. package/dist/react/runtimes/assistant-transport/useLatestRef.d.ts +7 -0
  119. package/dist/react/runtimes/assistant-transport/useLatestRef.d.ts.map +1 -0
  120. package/dist/react/runtimes/assistant-transport/useLatestRef.js +27 -0
  121. package/dist/react/runtimes/assistant-transport/useLatestRef.js.map +1 -0
  122. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  123. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +39 -13
  124. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  125. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts +2 -1
  126. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts.map +1 -1
  127. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js +3 -3
  128. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js.map +1 -1
  129. package/dist/react/runtimes/cloud/auiV0.d.ts +4 -0
  130. package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
  131. package/dist/react/runtimes/cloud/auiV0.js +7 -0
  132. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  133. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
  134. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +22 -12
  135. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  136. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.d.ts +16 -0
  137. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.d.ts.map +1 -0
  138. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.js +36 -0
  139. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.js.map +1 -0
  140. package/dist/react/runtimes/external-message-converter.js +14 -14
  141. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  142. package/dist/react/runtimes/useExternalStoreRuntime.d.ts.map +1 -1
  143. package/dist/react/runtimes/useExternalStoreRuntime.js +44 -28
  144. package/dist/react/runtimes/useExternalStoreRuntime.js.map +1 -1
  145. package/dist/react/runtimes/useExternalStoreSharedOptions.js.map +1 -1
  146. package/dist/react/runtimes/useLocalRuntime.js +1 -1
  147. package/dist/react/runtimes/useRuntimeAdapters.d.ts +9 -0
  148. package/dist/react/runtimes/useRuntimeAdapters.d.ts.map +1 -0
  149. package/dist/react/runtimes/useRuntimeAdapters.js +20 -0
  150. package/dist/react/runtimes/useRuntimeAdapters.js.map +1 -0
  151. package/dist/runtime/api/composer-runtime.d.ts +5 -0
  152. package/dist/runtime/api/composer-runtime.d.ts.map +1 -1
  153. package/dist/runtime/api/composer-runtime.js.map +1 -1
  154. package/dist/runtime/api/message-runtime.js +1 -1
  155. package/dist/runtime/api/thread-list-runtime.d.ts +1 -0
  156. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  157. package/dist/runtime/api/thread-list-runtime.js +4 -2
  158. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  159. package/dist/runtime/api/thread-runtime.d.ts +12 -2
  160. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  161. package/dist/runtime/api/thread-runtime.js +8 -2
  162. package/dist/runtime/api/thread-runtime.js.map +1 -1
  163. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  164. package/dist/runtime/base/base-composer-runtime-core.js +8 -7
  165. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  166. package/dist/runtime/base/base-thread-runtime-core.d.ts +1 -0
  167. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  168. package/dist/runtime/base/base-thread-runtime-core.js +3 -3
  169. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  170. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +0 -1
  171. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
  172. package/dist/runtime/base/default-thread-composer-runtime-core.js +10 -4
  173. package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
  174. package/dist/runtime/interfaces/thread-runtime-core.d.ts +6 -0
  175. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  176. package/dist/runtime/internal.js +5 -5
  177. package/dist/runtime/queue/message-queue.d.ts.map +1 -1
  178. package/dist/runtime/queue/message-queue.js +2 -1
  179. package/dist/runtime/queue/message-queue.js.map +1 -1
  180. package/dist/runtime/utils/thread-runtime-lifecycle.d.ts +8 -0
  181. package/dist/runtime/utils/thread-runtime-lifecycle.d.ts.map +1 -0
  182. package/dist/runtime/utils/thread-runtime-lifecycle.js +11 -0
  183. package/dist/runtime/utils/thread-runtime-lifecycle.js.map +1 -0
  184. package/dist/runtimes/external-store/external-store-shared-options.js.map +1 -1
  185. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  186. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +4 -1
  187. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  188. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +8 -0
  189. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  190. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +35 -13
  191. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  192. package/dist/runtimes/internal.d.ts +1 -1
  193. package/dist/runtimes/local/local-thread-runtime-core.d.ts +3 -0
  194. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  195. package/dist/runtimes/local/local-thread-runtime-core.js +53 -13
  196. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  197. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +1 -0
  198. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
  199. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js +3 -0
  200. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js.map +1 -1
  201. package/dist/runtimes/remote-thread-list/empty-thread-core.js +3 -0
  202. package/dist/runtimes/remote-thread-list/empty-thread-core.js.map +1 -1
  203. package/dist/runtimes/remote-thread-list/types.d.ts +29 -1
  204. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  205. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts +1 -12
  206. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
  207. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +67 -38
  208. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  209. package/dist/store/clients/suggestions.js +2 -2
  210. package/dist/store/clients/suggestions.js.map +1 -1
  211. package/dist/store/clients/thread-selection-events.d.ts +10 -0
  212. package/dist/store/clients/thread-selection-events.d.ts.map +1 -0
  213. package/dist/store/clients/thread-selection-events.js +40 -0
  214. package/dist/store/clients/thread-selection-events.js.map +1 -0
  215. package/dist/store/env.d.ts +5 -0
  216. package/dist/store/env.d.ts.map +1 -0
  217. package/dist/store/env.js +12 -0
  218. package/dist/store/env.js.map +1 -0
  219. package/dist/store/index.d.ts +5 -3
  220. package/dist/store/index.js +4 -2
  221. package/dist/store/internal.d.ts +4 -1
  222. package/dist/store/internal.js +4 -1
  223. package/dist/store/primitive-predicates.d.ts +19 -0
  224. package/dist/store/primitive-predicates.d.ts.map +1 -0
  225. package/dist/store/primitive-predicates.js +19 -0
  226. package/dist/store/primitive-predicates.js.map +1 -0
  227. package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -1
  228. package/dist/store/runtime-clients/attachment-runtime-client.js +18 -11
  229. package/dist/store/runtime-clients/attachment-runtime-client.js.map +1 -1
  230. package/dist/store/runtime-clients/handle-runtime-action.d.ts +5 -0
  231. package/dist/store/runtime-clients/handle-runtime-action.d.ts.map +1 -0
  232. package/dist/store/runtime-clients/handle-runtime-action.js +12 -0
  233. package/dist/store/runtime-clients/handle-runtime-action.js.map +1 -0
  234. package/dist/store/runtime-clients/handle-thread-list-action.d.ts +5 -0
  235. package/dist/store/runtime-clients/handle-thread-list-action.d.ts.map +1 -0
  236. package/dist/store/runtime-clients/handle-thread-list-action.js +7 -0
  237. package/dist/store/runtime-clients/handle-thread-list-action.js.map +1 -0
  238. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  239. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +62 -29
  240. package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
  241. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  242. package/dist/store/runtime-clients/thread-list-runtime-client.js +5 -6
  243. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  244. package/dist/store/scopes/composer.d.ts +9 -4
  245. package/dist/store/scopes/composer.d.ts.map +1 -1
  246. package/dist/store/scopes/thread-list-item.d.ts +7 -6
  247. package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
  248. package/dist/store/scopes/thread.d.ts +8 -7
  249. package/dist/store/scopes/thread.d.ts.map +1 -1
  250. package/dist/store/scopes/threads.d.ts +17 -1
  251. package/dist/store/scopes/threads.d.ts.map +1 -1
  252. package/dist/subscribable/subscribable.d.ts +2 -1
  253. package/dist/subscribable/subscribable.d.ts.map +1 -1
  254. package/dist/subscribable/subscribable.js +23 -18
  255. package/dist/subscribable/subscribable.js.map +1 -1
  256. package/dist/utils/composite-context-provider.d.ts +1 -0
  257. package/dist/utils/composite-context-provider.d.ts.map +1 -1
  258. package/dist/utils/composite-context-provider.js +25 -9
  259. package/dist/utils/composite-context-provider.js.map +1 -1
  260. package/dist/utils/notify-event-listeners.d.ts +2 -2
  261. package/dist/utils/notify-event-listeners.d.ts.map +1 -1
  262. package/dist/utils/notify-event-listeners.js +2 -2
  263. package/dist/utils/notify-event-listeners.js.map +1 -1
  264. package/package.json +7 -7
  265. package/src/adapters/speech.test.ts +118 -1
  266. package/src/adapters/speech.ts +21 -22
  267. package/src/adapters/thread-history.ts +2 -0
  268. package/src/adapters/voice.test.ts +69 -0
  269. package/src/adapters/voice.ts +27 -27
  270. package/src/index.ts +1 -0
  271. package/src/model-context/frame/host.test.ts +23 -0
  272. package/src/model-context/frame/host.ts +2 -1
  273. package/src/model-context/registry.test.ts +131 -0
  274. package/src/model-context/registry.ts +16 -6
  275. package/src/react/RuntimeAdapter.test.ts +2 -0
  276. package/src/react/RuntimeAdapter.ts +20 -8
  277. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +34 -17
  278. package/src/react/client/AdaptedRemoteThread.ts +41 -0
  279. package/src/react/client/InMemoryThreadList.test.tsx +148 -0
  280. package/src/react/client/InMemoryThreadList.ts +290 -0
  281. package/src/react/client/Interactables.test.ts +326 -2
  282. package/src/react/client/Interactables.ts +227 -110
  283. package/src/react/client/RemoteThreadList.test.ts +1026 -0
  284. package/src/react/client/RemoteThreadList.ts +1067 -0
  285. package/src/react/client/Tools.ts +36 -29
  286. package/src/react/index.ts +13 -0
  287. package/src/react/interactables-legacy/Interactables.test.ts +317 -0
  288. package/src/react/interactables-legacy/Interactables.ts +204 -128
  289. package/src/react/primitive-hooks/useActionBarCopy.ts +2 -7
  290. package/src/react/primitive-hooks/useActionBarEdit.ts +2 -1
  291. package/src/react/primitive-hooks/useActionBarReload.ts +2 -6
  292. package/src/react/primitive-hooks/useBranchPickerNext.ts +2 -7
  293. package/src/react/primitive-hooks/useBranchPickerPrevious.ts +2 -7
  294. package/src/react/primitive-hooks/useComposerCancel.ts +2 -1
  295. package/src/react/primitive-hooks/useComposerSend.ts +2 -5
  296. package/src/react/primitive-hooks/useSuggestionTrigger.test.ts +11 -0
  297. package/src/react/primitive-hooks/useSuggestionTrigger.ts +4 -5
  298. package/src/react/primitives/message/MessageParts.tsx +0 -1
  299. package/src/react/primitives/thread/ThreadMessages.tsx +2 -1
  300. package/src/react/runtimes/RemoteThreadListHookInstanceManager.retry.test.tsx +116 -0
  301. package/src/react/runtimes/RemoteThreadListHookInstanceManager.running.test.tsx +1 -1
  302. package/src/react/runtimes/RemoteThreadListHookInstanceManager.test.tsx +57 -6
  303. package/src/react/runtimes/RemoteThreadListHookInstanceManager.title.test.tsx +272 -0
  304. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +159 -124
  305. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +59 -20
  306. package/src/react/runtimes/RemoteThreadResource.test.ts +141 -0
  307. package/src/react/runtimes/RemoteThreadResource.ts +231 -0
  308. package/src/react/runtimes/RuntimeAdapterProvider.tsx +8 -20
  309. package/src/react/runtimes/assistant-transport/commandQueue.ts +68 -0
  310. package/src/react/runtimes/assistant-transport/replayBoundaryStream.test.ts +455 -0
  311. package/src/react/runtimes/assistant-transport/replayBoundaryStream.ts +172 -0
  312. package/src/react/runtimes/assistant-transport/runManager.ts +124 -0
  313. package/src/react/runtimes/assistant-transport/transport-delivery.test.tsx +79 -0
  314. package/src/react/runtimes/assistant-transport/transport-parentid.test.tsx +97 -0
  315. package/src/react/runtimes/assistant-transport/transport-scheduling.test.ts +414 -0
  316. package/src/react/runtimes/assistant-transport/types.ts +170 -0
  317. package/src/react/runtimes/assistant-transport/useAssistantTransport.spec.md +141 -0
  318. package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.test.tsx +625 -0
  319. package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.ts +481 -0
  320. package/src/react/runtimes/assistant-transport/useConvertedState.ts +20 -0
  321. package/src/react/runtimes/assistant-transport/useLatestRef.ts +9 -0
  322. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +131 -6
  323. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +61 -15
  324. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts +6 -4
  325. package/src/react/runtimes/cloud/auiV0.ts +17 -1
  326. package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +36 -21
  327. package/src/react/runtimes/cloud/useCloudThreadListRuntime.test.tsx +56 -0
  328. package/src/react/runtimes/cloud/useCloudThreadListRuntime.ts +31 -0
  329. package/src/react/runtimes/external-message-converter.test.ts +143 -0
  330. package/src/react/runtimes/external-message-converter.ts +41 -41
  331. package/src/react/runtimes/remote-thread-hook-on-tap.test.ts +58 -0
  332. package/src/react/runtimes/useExternalStoreRuntime.lifecycle.test.tsx +83 -0
  333. package/src/react/runtimes/useExternalStoreRuntime.suggestions.test.tsx +13 -3
  334. package/src/react/runtimes/useExternalStoreRuntime.ts +7 -0
  335. package/src/react/runtimes/useExternalStoreSharedOptions.ts +3 -1
  336. package/src/react/runtimes/useLocalRuntime.test.tsx +130 -4
  337. package/src/react/runtimes/useRuntimeAdapters.test.tsx +62 -0
  338. package/src/react/runtimes/useRuntimeAdapters.ts +28 -0
  339. package/src/runtime/api/composer-runtime.ts +5 -0
  340. package/src/runtime/api/thread-list-runtime.ts +3 -1
  341. package/src/runtime/api/thread-runtime.ts +20 -2
  342. package/src/runtime/base/base-composer-runtime-core.ts +6 -5
  343. package/src/runtime/base/base-thread-runtime-core.test.ts +191 -0
  344. package/src/runtime/base/base-thread-runtime-core.ts +11 -2
  345. package/src/runtime/base/default-thread-composer-runtime-core.ts +12 -4
  346. package/src/runtime/interfaces/thread-runtime-core.ts +6 -0
  347. package/src/runtime/queue/message-queue.ts +2 -1
  348. package/src/runtime/utils/thread-runtime-lifecycle.ts +18 -0
  349. package/src/runtimes/external-store/external-store-shared-options.ts +3 -1
  350. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +4 -1
  351. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +99 -34
  352. package/src/runtimes/local/local-thread-runtime-core.test.ts +373 -4
  353. package/src/runtimes/local/local-thread-runtime-core.ts +79 -14
  354. package/src/runtimes/readonly/ReadonlyThreadRuntimeCore.ts +4 -0
  355. package/src/runtimes/remote-thread-list/empty-thread-core.ts +4 -0
  356. package/src/runtimes/remote-thread-list/types.ts +30 -0
  357. package/src/runtimes/tool-invocations/EDGE_CASES.md +17 -6
  358. package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +243 -0
  359. package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +127 -61
  360. package/src/store/clients/model-context-client.test.ts +16 -8
  361. package/src/store/clients/suggestions.ts +2 -2
  362. package/src/store/clients/thread-selection-events.ts +21 -0
  363. package/src/store/env.ts +11 -0
  364. package/src/store/index.ts +14 -1
  365. package/src/store/internal.ts +13 -0
  366. package/src/store/primitive-predicates.test.ts +184 -0
  367. package/src/store/primitive-predicates.ts +43 -0
  368. package/src/store/runtime-clients/attachment-runtime-client.test.ts +41 -0
  369. package/src/store/runtime-clients/attachment-runtime-client.ts +2 -1
  370. package/src/store/runtime-clients/handle-runtime-action.ts +11 -0
  371. package/src/store/runtime-clients/handle-thread-list-action.test.ts +69 -0
  372. package/src/store/runtime-clients/handle-thread-list-action.ts +6 -0
  373. package/src/store/runtime-clients/thread-list-item-runtime-client.ts +15 -7
  374. package/src/store/runtime-clients/thread-list-runtime-client.ts +9 -6
  375. package/src/store/scopes/composer.ts +9 -4
  376. package/src/store/scopes/thread-list-item.ts +7 -6
  377. package/src/store/scopes/thread.ts +8 -7
  378. package/src/store/scopes/threads.ts +14 -0
  379. package/src/subscribable/subscribable.test.ts +77 -1
  380. package/src/subscribable/subscribable.ts +38 -23
  381. package/src/tests/RemoteThreadListThreadListRuntimeCore-switchToThread-unarchive.test.ts +25 -0
  382. package/src/tests/auiV0Encode.test.ts +66 -0
  383. package/src/tests/base-composer-runtime-core-send.test.ts +30 -0
  384. package/src/tests/base-composer-runtime-core.test.ts +28 -0
  385. package/src/tests/composer-can-cancel.test.ts +101 -0
  386. package/src/tests/external-store-thread-list-runtime-core.test.ts +101 -0
  387. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +191 -1
  388. package/src/tests/external-store-thread-runtime-core.test.ts +124 -0
  389. package/src/tests/interactables-toolui-migration.test.tsx +66 -0
  390. package/src/tests/message-queue.test.ts +28 -0
  391. package/src/tests/session-reset-notification.test.ts +145 -0
  392. package/src/tests/thread-switch-events.test.tsx +99 -1
  393. package/src/tests/tools-scope-migration.test.tsx +58 -0
  394. package/src/utils/composite-context-provider.test.ts +139 -0
  395. package/src/utils/composite-context-provider.ts +26 -8
  396. package/src/utils/notify-event-listeners.ts +10 -5
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantCloudThreadHistoryAdapter.js","names":["RefObject","useEffect","useRef","useState","GenericThreadHistoryAdapter","ThreadHistoryAdapter","MessageFormatAdapter","MessageFormatItem","MessageFormatRepository","ExportedMessageRepositoryItem","AssistantCloud","CloudMessagePersistence","createFormattedPersistence","auiV0Decode","auiV0Encode","AssistantClient","getClientId","useAui","globalPersistence","WeakMap","ClientId","AssistantCloudThreadHistoryAdapter","cloudRef","getAui","constructor","aui","_persistence","key","threadListItem","has","set","current","get","withFormat","Record","formatAdapter","TMessage","TStorageFormat","adapter","formatted","append","item","remoteId","initialize","update","localMessageId","getState","delete","Error","reportTelemetry","items","options","durationMs","stepTimestamps","StepTimestamp","encodedRunMessages","map","encode","_reportRunTelemetry","format","load","Promise","messages","parentId","message","encoded","id","telemetry","enabled","_maybeReportRun","isPersisted","filter","m","reverse","runMessages","T","extracted","extractRunTelemetry","_sendReport","content","extractTelemetry","data","TelemetryData","mergedSteps","mergeStepTimestamps","steps","initial","Parameters","this","runs","report","thread_id","status","totalSteps","total_steps","undefined","toolCalls","tool_calls","inputTokens","input_tokens","outputTokens","output_tokens","reasoningTokens","reasoning_tokens","cachedInputTokens","cached_input_tokens","duration_ms","outputText","output_text","metadata","modelId","model_id","beforeReport","catch","MAX_SPAN_CONTENT","truncateStr","value","length","slice","safeStringify","JSON","stringify","TelemetryToolCall","tool_name","tool_call_id","tool_args","tool_result","tool_source","BASE64_PATTERN","summarizeMcpResult","parsed","parse","Array","isArray","summarized","type","test","sizeKB","toFixed","buildToolCall","toolName","toolCallId","args","result","argsText","toolSource","call","toolArgs","toolResult","TelemetryStepData","start_ms","end_ms","timestamps","t","len","Math","min","s","i","extractAuiV0","extractAiSdkV6","aggregateAiSdkV6RunSteps","AUI_STATUS_MAP","error","incomplete","msg","role","text","usage","custom","p","textParts","join","totalInput","totalOutput","totalReasoning","totalCachedInput","hasInput","hasOutput","hasReasoning","hasCachedInput","step","statusType","telemetrySteps","AiSdkV6Part","input","output","AiSdkV6Message","parts","isToolCallPart","startsWith","isDynamicToolPart","partToToolCall","collectAiSdkV6Parts","stepsData","currentStepToolCalls","push","tc","extractModelId","buildAiSdkV6Result","hasText","UsageFields","promptTokens","completionTokens","normalizeUsage","u","extractAiSdkV6Usage","normalized","hasAny","n","stepMessages","allTextParts","allToolCalls","allStepsData","hasAssistant","useAssistantCloudThreadHistoryAdapter","auiRef"],"sources":["../../../../src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts"],"sourcesContent":["import { type RefObject, useEffect, useRef, useState } from \"react\";\nimport type {\n GenericThreadHistoryAdapter,\n ThreadHistoryAdapter,\n MessageFormatAdapter,\n MessageFormatItem,\n MessageFormatRepository,\n} from \"../../../adapters/thread-history\";\nimport type { ExportedMessageRepositoryItem } from \"../../../runtime/utils/message-repository\";\nimport {\n type AssistantCloud,\n CloudMessagePersistence,\n createFormattedPersistence,\n} from \"assistant-cloud\";\nimport { auiV0Decode, auiV0Encode } from \"./auiV0\";\nimport { type AssistantClient, getClientId, useAui } from \"@assistant-ui/store\";\n\nconst globalPersistence = new WeakMap<\n getClientId.ClientId,\n CloudMessagePersistence\n>();\n\nclass AssistantCloudThreadHistoryAdapter implements ThreadHistoryAdapter {\n private cloudRef: RefObject<AssistantCloud>;\n private getAui: () => AssistantClient;\n\n constructor(\n cloudRef: RefObject<AssistantCloud>,\n getAui: () => AssistantClient,\n ) {\n this.cloudRef = cloudRef;\n this.getAui = getAui;\n }\n\n private get aui(): AssistantClient {\n return this.getAui();\n }\n\n private get _persistence(): CloudMessagePersistence {\n const key = getClientId(this.aui.threadListItem);\n if (!globalPersistence.has(key)) {\n globalPersistence.set(\n key,\n new CloudMessagePersistence(() => this.cloudRef.current),\n );\n }\n return globalPersistence.get(key)!;\n }\n\n withFormat<TMessage, TStorageFormat extends Record<string, unknown>>(\n formatAdapter: MessageFormatAdapter<TMessage, TStorageFormat>,\n ): GenericThreadHistoryAdapter<TMessage> {\n const adapter = this;\n const formatted = createFormattedPersistence(\n this._persistence,\n formatAdapter,\n );\n return {\n // Note: callers must also call reportTelemetry() for run tracking\n async append(item: MessageFormatItem<TMessage>) {\n const { remoteId } = await adapter.aui.threadListItem.initialize();\n await formatted.append(remoteId, item);\n },\n async update(item: MessageFormatItem<TMessage>, localMessageId: string) {\n const remoteId = adapter.aui.threadListItem.getState().remoteId;\n if (!remoteId) return;\n await formatted.update?.(remoteId, item, localMessageId);\n },\n async delete() {\n throw new Error(\n \"Assistant Cloud does not support deleting thread messages yet.\",\n );\n },\n reportTelemetry(\n items: MessageFormatItem<TMessage>[],\n options?: {\n durationMs?: number;\n stepTimestamps?: StepTimestamp[];\n },\n ) {\n const encodedRunMessages = items.map((item) =>\n formatAdapter.encode(item),\n );\n adapter._reportRunTelemetry(\n formatAdapter.format,\n encodedRunMessages,\n options,\n );\n },\n async load(): Promise<MessageFormatRepository<TMessage>> {\n const remoteId = adapter.aui.threadListItem.getState().remoteId;\n if (!remoteId) return { messages: [] };\n return formatted.load(remoteId);\n },\n };\n }\n\n async append({ parentId, message }: ExportedMessageRepositoryItem) {\n const { remoteId } = await this.aui.threadListItem.initialize();\n const encoded = auiV0Encode(message);\n await this._persistence.append(\n remoteId,\n message.id,\n parentId,\n \"aui/v0\",\n encoded,\n );\n\n if (this.cloudRef.current.telemetry.enabled) {\n this._maybeReportRun(remoteId, \"aui/v0\", encoded);\n }\n }\n\n async update(item: ExportedMessageRepositoryItem) {\n if (!this._persistence.isPersisted(item.message.id)) {\n return this.append(item);\n }\n const { message } = item;\n const remoteId = this.aui.threadListItem.getState().remoteId;\n if (!remoteId) return;\n const encoded = auiV0Encode(message);\n await this._persistence.update(remoteId, message.id, \"aui/v0\", encoded);\n\n if (this.cloudRef.current.telemetry.enabled) {\n this._maybeReportRun(remoteId, \"aui/v0\", encoded);\n }\n }\n\n async delete() {\n throw new Error(\n \"Assistant Cloud does not support deleting thread messages yet.\",\n );\n }\n\n async load() {\n const remoteId = this.aui.threadListItem.getState().remoteId;\n if (!remoteId) return { messages: [] };\n const messages = await this._persistence.load(remoteId, \"aui/v0\");\n return {\n messages: messages\n .filter(\n (m): m is typeof m & { format: \"aui/v0\" } => m.format === \"aui/v0\",\n )\n .map(auiV0Decode)\n .reverse(),\n };\n }\n\n private _reportRunTelemetry<T>(\n format: string,\n runMessages: T[],\n options?: {\n durationMs?: number;\n stepTimestamps?: StepTimestamp[];\n },\n ) {\n if (!this.cloudRef.current.telemetry.enabled) return;\n\n const remoteId = this.aui.threadListItem.getState().remoteId;\n if (!remoteId) return;\n\n const extracted = extractRunTelemetry(format, runMessages);\n if (!extracted) return;\n\n this._sendReport(\n remoteId,\n extracted,\n options?.durationMs,\n options?.stepTimestamps,\n );\n }\n\n private _maybeReportRun<T>(remoteId: string, format: string, content: T) {\n const extracted = extractTelemetry(format, content);\n if (!extracted) return;\n\n this._sendReport(remoteId, extracted);\n }\n\n private _sendReport(\n remoteId: string,\n data: TelemetryData,\n durationMs?: number,\n stepTimestamps?: StepTimestamp[],\n ) {\n const mergedSteps = mergeStepTimestamps(data.steps, stepTimestamps);\n // Keep in sync with assistant-cloud createRunSchema\n // (apps/aui-cloud-api/src/endpoints/runs/create.ts).\n const initial: Parameters<typeof this.cloudRef.current.runs.report>[0] = {\n thread_id: remoteId,\n status: data.status,\n ...(data.totalSteps != null\n ? { total_steps: data.totalSteps }\n : undefined),\n ...(data.toolCalls ? { tool_calls: data.toolCalls } : undefined),\n ...(mergedSteps ? { steps: mergedSteps } : undefined),\n ...(data.inputTokens != null\n ? { input_tokens: data.inputTokens }\n : undefined),\n ...(data.outputTokens != null\n ? { output_tokens: data.outputTokens }\n : undefined),\n ...(data.reasoningTokens != null\n ? { reasoning_tokens: data.reasoningTokens }\n : undefined),\n ...(data.cachedInputTokens != null\n ? { cached_input_tokens: data.cachedInputTokens }\n : undefined),\n ...(durationMs != null ? { duration_ms: durationMs } : undefined),\n ...(data.outputText != null\n ? { output_text: data.outputText }\n : undefined),\n ...(data.metadata ? { metadata: data.metadata } : undefined),\n ...(data.modelId ? { model_id: data.modelId } : undefined),\n };\n\n const { beforeReport } = this.cloudRef.current.telemetry;\n const report = beforeReport ? beforeReport(initial) : initial;\n if (!report) return;\n\n this.cloudRef.current.runs.report(report).catch(() => {});\n }\n}\n\nconst MAX_SPAN_CONTENT = 50_000;\n\nfunction truncateStr(value: string): string {\n if (value.length <= MAX_SPAN_CONTENT) return value;\n return value.slice(0, MAX_SPAN_CONTENT);\n}\n\nfunction safeStringify(value: unknown): string | undefined {\n if (value == null) return undefined;\n try {\n return truncateStr(JSON.stringify(value));\n } catch {\n return undefined;\n }\n}\n\ntype TelemetryToolCall = {\n tool_name: string;\n tool_call_id: string;\n tool_args?: string;\n tool_result?: string;\n tool_source?: \"mcp\" | \"frontend\" | \"backend\";\n};\n\nconst BASE64_PATTERN = /^[A-Za-z0-9+/]{100,}={0,2}$/;\n\nfunction summarizeMcpResult(value: unknown): string | undefined {\n if (value == null) return undefined;\n try {\n const parsed = typeof value === \"string\" ? JSON.parse(value) : value;\n if (Array.isArray(parsed)) {\n const summarized = parsed.map((item) => {\n if (item && typeof item === \"object\" && item.type) {\n if (\n (item.type === \"image\" || item.type === \"audio\") &&\n typeof item.data === \"string\" &&\n BASE64_PATTERN.test(item.data.slice(0, 200))\n ) {\n const sizeKB = ((item.data.length * 3) / 4 / 1024).toFixed(1);\n return { ...item, data: `[${item.type}: ${sizeKB}KB]` };\n }\n }\n return item;\n });\n return truncateStr(JSON.stringify(summarized));\n }\n } catch {\n // not JSON array, fall through\n }\n return safeStringify(value);\n}\n\nfunction buildToolCall(\n toolName: string,\n toolCallId: string,\n args: unknown,\n result: unknown,\n argsText?: string,\n toolSource?: \"mcp\" | \"frontend\" | \"backend\",\n): TelemetryToolCall {\n const call: TelemetryToolCall = {\n tool_name: toolName,\n tool_call_id: toolCallId,\n };\n const toolArgs = argsText ?? safeStringify(args);\n if (toolArgs !== undefined) call.tool_args = toolArgs;\n const toolResult =\n toolSource === \"mcp\" ? summarizeMcpResult(result) : safeStringify(result);\n if (toolResult !== undefined) call.tool_result = toolResult;\n if (toolSource) call.tool_source = toolSource;\n return call;\n}\n\ntype TelemetryStepData = {\n input_tokens?: number;\n output_tokens?: number;\n reasoning_tokens?: number;\n cached_input_tokens?: number;\n tool_calls?: TelemetryToolCall[];\n start_ms?: number;\n end_ms?: number;\n};\n\ntype StepTimestamp = { start_ms: number; end_ms: number };\n\nfunction mergeStepTimestamps(\n steps: TelemetryStepData[] | undefined,\n timestamps: StepTimestamp[] | undefined,\n): TelemetryStepData[] | undefined {\n if (!timestamps) return steps;\n if (!steps) return timestamps.map((t) => ({ ...t }));\n\n const len = Math.min(steps.length, timestamps.length);\n return steps.map((s, i) => ({\n ...s,\n ...(i < len ? timestamps[i] : undefined),\n }));\n}\n\ntype TelemetryData = {\n status: \"completed\" | \"incomplete\" | \"error\";\n toolCalls?: TelemetryToolCall[];\n totalSteps?: number;\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n outputText?: string;\n metadata?: Record<string, unknown>;\n steps?: TelemetryStepData[];\n modelId?: string;\n};\n\nfunction extractTelemetry<T>(format: string, content: T): TelemetryData | null {\n switch (format) {\n case \"aui/v0\":\n return extractAuiV0(content);\n case \"ai-sdk/v6\":\n return extractAiSdkV6(content);\n default:\n return null;\n }\n}\n\nfunction extractRunTelemetry<T>(\n format: string,\n runMessages: T[],\n): TelemetryData | null {\n if (format === \"ai-sdk/v6\") {\n return aggregateAiSdkV6RunSteps(runMessages);\n }\n for (let i = runMessages.length - 1; i >= 0; i--) {\n const result = extractTelemetry(format, runMessages[i]!);\n if (result) return result;\n }\n return null;\n}\n\nconst AUI_STATUS_MAP: Record<string, TelemetryData[\"status\"]> = {\n error: \"error\",\n incomplete: \"incomplete\",\n};\n\nexport function extractAuiV0<T>(content: T): TelemetryData | null {\n const msg = content as {\n role?: string;\n status?: { type: string };\n content?: readonly {\n type: string;\n text?: string;\n toolName?: string;\n toolCallId?: string;\n args?: unknown;\n argsText?: string;\n result?: unknown;\n }[];\n metadata?: {\n modelId?: string;\n steps?: readonly {\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n };\n }[];\n custom?: Record<string, unknown> & { modelId?: string };\n };\n };\n\n if (msg.role !== \"assistant\") return null;\n // A paused (requires-action) write is not a finished run; reporting it would\n // mislabel it \"completed\" and double-count steps once the terminal write reports.\n if (msg.status?.type === \"requires-action\") return null;\n\n const toolCalls = msg.content\n ?.filter((p) => p.type === \"tool-call\" && p.toolName && p.toolCallId)\n .map((p) =>\n buildToolCall(p.toolName!, p.toolCallId!, p.args, p.result, p.argsText),\n );\n\n const textParts = msg.content?.filter((p) => p.type === \"text\" && p.text);\n const outputText =\n textParts && textParts.length > 0\n ? truncateStr(textParts.map((p) => p.text).join(\"\"))\n : undefined;\n\n const steps = msg.metadata?.steps;\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let reasoningTokens: number | undefined;\n let cachedInputTokens: number | undefined;\n if (steps && steps.length > 0) {\n let totalInput = 0;\n let totalOutput = 0;\n let totalReasoning = 0;\n let totalCachedInput = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n for (const step of steps) {\n if (step.usage?.inputTokens != null) {\n totalInput += step.usage.inputTokens;\n hasInput = true;\n }\n if (step.usage?.outputTokens != null) {\n totalOutput += step.usage.outputTokens;\n hasOutput = true;\n }\n if (step.usage?.reasoningTokens != null) {\n totalReasoning += step.usage.reasoningTokens;\n hasReasoning = true;\n }\n if (step.usage?.cachedInputTokens != null) {\n totalCachedInput += step.usage.cachedInputTokens;\n hasCachedInput = true;\n }\n }\n inputTokens = hasInput ? totalInput : undefined;\n outputTokens = hasOutput ? totalOutput : undefined;\n reasoningTokens = hasReasoning ? totalReasoning : undefined;\n cachedInputTokens = hasCachedInput ? totalCachedInput : undefined;\n }\n\n const statusType = msg.status?.type;\n const status: TelemetryData[\"status\"] =\n (statusType && AUI_STATUS_MAP[statusType]) || \"completed\";\n\n const metadata = msg.metadata?.custom as Record<string, unknown> | undefined;\n const modelId =\n msg.metadata?.modelId ??\n (typeof msg.metadata?.custom?.modelId === \"string\"\n ? msg.metadata.custom.modelId\n : undefined);\n\n const telemetrySteps: TelemetryStepData[] | undefined =\n steps && steps.length > 1\n ? steps.map((s) => ({\n ...(s.usage?.inputTokens != null\n ? { input_tokens: s.usage.inputTokens }\n : undefined),\n ...(s.usage?.outputTokens != null\n ? { output_tokens: s.usage.outputTokens }\n : undefined),\n ...(s.usage?.reasoningTokens != null\n ? { reasoning_tokens: s.usage.reasoningTokens }\n : undefined),\n ...(s.usage?.cachedInputTokens != null\n ? { cached_input_tokens: s.usage.cachedInputTokens }\n : undefined),\n }))\n : undefined;\n\n return {\n status,\n ...(toolCalls && toolCalls.length > 0 ? { toolCalls } : undefined),\n ...(steps?.length ? { totalSteps: steps.length } : undefined),\n ...(inputTokens != null ? { inputTokens } : undefined),\n ...(outputTokens != null ? { outputTokens } : undefined),\n ...(reasoningTokens != null ? { reasoningTokens } : undefined),\n ...(cachedInputTokens != null ? { cachedInputTokens } : undefined),\n ...(outputText != null ? { outputText } : undefined),\n ...(metadata ? { metadata } : undefined),\n ...(telemetrySteps ? { steps: telemetrySteps } : undefined),\n ...(modelId ? { modelId } : undefined),\n };\n}\n\ntype AiSdkV6Part = {\n type: string;\n text?: string;\n toolName?: string;\n toolCallId?: string;\n args?: unknown;\n result?: unknown;\n input?: unknown;\n output?: unknown;\n};\n\ntype AiSdkV6Message = {\n role?: string;\n parts?: readonly AiSdkV6Part[];\n metadata?: Record<string, unknown>;\n};\n\nfunction isToolCallPart(p: AiSdkV6Part): boolean {\n if (!p.toolCallId) return false;\n if (p.type === \"tool-call\" || p.type === \"dynamic-tool\") return !!p.toolName;\n return p.type.startsWith(\"tool-\") || p.type.startsWith(\"dynamic-tool-\");\n}\n\nfunction isDynamicToolPart(p: AiSdkV6Part): boolean {\n return p.type === \"dynamic-tool\" || p.type.startsWith(\"dynamic-tool-\");\n}\n\nfunction partToToolCall(p: AiSdkV6Part): TelemetryToolCall {\n const toolSource: \"mcp\" | undefined = isDynamicToolPart(p)\n ? \"mcp\"\n : undefined;\n return buildToolCall(\n p.toolName ?? p.type.slice(5),\n p.toolCallId!,\n p.args ?? p.input,\n p.result ?? p.output,\n undefined,\n toolSource,\n );\n}\n\nfunction collectAiSdkV6Parts(parts: readonly AiSdkV6Part[]): {\n textParts: string[];\n toolCalls: TelemetryToolCall[];\n stepsData: { tool_calls: TelemetryToolCall[] }[];\n} {\n const textParts: string[] = [];\n const toolCalls: TelemetryToolCall[] = [];\n const stepsData: { tool_calls: TelemetryToolCall[] }[] = [];\n let currentStepToolCalls: TelemetryToolCall[] | null = null;\n\n for (const p of parts) {\n if (p.type === \"step-start\") {\n if (currentStepToolCalls !== null) {\n stepsData.push({ tool_calls: currentStepToolCalls });\n }\n currentStepToolCalls = [];\n } else if (p.type === \"text\" && p.text) {\n textParts.push(p.text);\n } else if (isToolCallPart(p)) {\n const tc = partToToolCall(p);\n toolCalls.push(tc);\n if (currentStepToolCalls !== null) {\n currentStepToolCalls.push(tc);\n }\n }\n }\n\n if (currentStepToolCalls !== null) {\n stepsData.push({ tool_calls: currentStepToolCalls });\n }\n\n return { textParts, toolCalls, stepsData };\n}\n\nfunction extractModelId(\n metadata?: Record<string, unknown>,\n): string | undefined {\n if (!metadata) return undefined;\n if (typeof metadata.modelId === \"string\") return metadata.modelId;\n const custom = metadata.custom as Record<string, unknown> | undefined;\n if (typeof custom?.modelId === \"string\") return custom.modelId;\n return undefined;\n}\n\nfunction buildAiSdkV6Result(\n textParts: string[],\n toolCalls: TelemetryToolCall[],\n totalSteps: number,\n metadata?: Record<string, unknown>,\n stepsData?: { tool_calls: TelemetryToolCall[] }[],\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n },\n): TelemetryData {\n const hasText = textParts.length > 0;\n const outputText = hasText ? truncateStr(textParts.join(\"\")) : undefined;\n const modelId = extractModelId(metadata);\n\n const steps: TelemetryStepData[] | undefined =\n stepsData && stepsData.length > 1\n ? stepsData.map((s) => ({\n ...(s.tool_calls.length > 0\n ? { tool_calls: s.tool_calls }\n : undefined),\n }))\n : undefined;\n\n return {\n status: hasText ? \"completed\" : \"incomplete\",\n ...(toolCalls.length > 0 ? { toolCalls } : undefined),\n ...(totalSteps > 0 ? { totalSteps } : undefined),\n ...(usage?.inputTokens != null\n ? { inputTokens: usage.inputTokens }\n : undefined),\n ...(usage?.outputTokens != null\n ? { outputTokens: usage.outputTokens }\n : undefined),\n ...(usage?.reasoningTokens != null\n ? { reasoningTokens: usage.reasoningTokens }\n : undefined),\n ...(usage?.cachedInputTokens != null\n ? { cachedInputTokens: usage.cachedInputTokens }\n : undefined),\n ...(outputText != null ? { outputText } : undefined),\n ...(metadata ? { metadata } : undefined),\n ...(steps ? { steps } : undefined),\n ...(modelId ? { modelId } : undefined),\n };\n}\n\ntype UsageFields = {\n inputTokens?: number;\n outputTokens?: number;\n promptTokens?: number;\n completionTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n};\n\nfunction normalizeUsage(u: UsageFields):\n | {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n }\n | undefined {\n const input = u.inputTokens ?? u.promptTokens;\n const output = u.outputTokens ?? u.completionTokens;\n if (\n input == null &&\n output == null &&\n u.reasoningTokens == null &&\n u.cachedInputTokens == null\n ) {\n return undefined;\n }\n\n return {\n ...(input != null ? { inputTokens: input } : undefined),\n ...(output != null ? { outputTokens: output } : undefined),\n ...(u.reasoningTokens != null\n ? { reasoningTokens: u.reasoningTokens }\n : undefined),\n ...(u.cachedInputTokens != null\n ? { cachedInputTokens: u.cachedInputTokens }\n : undefined),\n };\n}\n\nfunction extractAiSdkV6Usage(metadata?: Record<string, unknown>):\n | {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n }\n | undefined {\n // Try top-level metadata.usage\n const usage = metadata?.usage as UsageFields | undefined;\n if (usage) {\n const normalized = normalizeUsage(usage);\n if (normalized) return normalized;\n }\n\n // Try aggregating from metadata.steps[].usage\n const steps = metadata?.steps as\n | readonly { usage?: UsageFields }[]\n | undefined;\n if (steps && steps.length > 0) {\n let inputTokens = 0;\n let outputTokens = 0;\n let reasoningTokens = 0;\n let cachedInputTokens = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n let hasAny = false;\n for (const s of steps) {\n if (!s.usage) continue;\n const n = normalizeUsage(s.usage);\n if (n) {\n if (n.inputTokens != null) {\n inputTokens += n.inputTokens;\n hasInput = true;\n }\n if (n.outputTokens != null) {\n outputTokens += n.outputTokens;\n hasOutput = true;\n }\n if (n.reasoningTokens != null) {\n reasoningTokens += n.reasoningTokens;\n hasReasoning = true;\n }\n if (n.cachedInputTokens != null) {\n cachedInputTokens += n.cachedInputTokens;\n hasCachedInput = true;\n }\n hasAny = true;\n }\n }\n if (hasAny) {\n return {\n ...(hasInput ? { inputTokens } : undefined),\n ...(hasOutput ? { outputTokens } : undefined),\n ...(hasReasoning ? { reasoningTokens } : undefined),\n ...(hasCachedInput ? { cachedInputTokens } : undefined),\n };\n }\n }\n\n return undefined;\n}\n\nfunction extractAiSdkV6<T>(content: T): TelemetryData | null {\n const msg = content as AiSdkV6Message;\n if (msg.role !== \"assistant\") return null;\n\n const { textParts, toolCalls, stepsData } = collectAiSdkV6Parts(\n msg.parts ?? [],\n );\n return buildAiSdkV6Result(\n textParts,\n toolCalls,\n stepsData.length,\n msg.metadata,\n stepsData,\n extractAiSdkV6Usage(msg.metadata),\n );\n}\n\nfunction aggregateAiSdkV6RunSteps<T>(stepMessages: T[]): TelemetryData | null {\n const allTextParts: string[] = [];\n const allToolCalls: TelemetryToolCall[] = [];\n const allStepsData: { tool_calls: TelemetryToolCall[] }[] = [];\n let hasAssistant = false;\n let metadata: Record<string, unknown> | undefined;\n let inputTokens = 0;\n let outputTokens = 0;\n let reasoningTokens = 0;\n let cachedInputTokens = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n\n for (const content of stepMessages) {\n const msg = content as AiSdkV6Message;\n if (msg.role !== \"assistant\") continue;\n hasAssistant = true;\n\n const { textParts, toolCalls, stepsData } = collectAiSdkV6Parts(\n msg.parts ?? [],\n );\n allTextParts.push(...textParts);\n allToolCalls.push(...toolCalls);\n allStepsData.push(...stepsData);\n if (msg.metadata) metadata = msg.metadata;\n\n const usage = extractAiSdkV6Usage(msg.metadata);\n if (usage) {\n if (usage.inputTokens != null) {\n inputTokens += usage.inputTokens;\n hasInput = true;\n }\n if (usage.outputTokens != null) {\n outputTokens += usage.outputTokens;\n hasOutput = true;\n }\n if (usage.reasoningTokens != null) {\n reasoningTokens += usage.reasoningTokens;\n hasReasoning = true;\n }\n if (usage.cachedInputTokens != null) {\n cachedInputTokens += usage.cachedInputTokens;\n hasCachedInput = true;\n }\n }\n }\n\n if (!hasAssistant) return null;\n return buildAiSdkV6Result(\n allTextParts,\n allToolCalls,\n allStepsData.length,\n metadata,\n allStepsData,\n {\n ...(hasInput ? { inputTokens } : undefined),\n ...(hasOutput ? { outputTokens } : undefined),\n ...(hasReasoning ? { reasoningTokens } : undefined),\n ...(hasCachedInput ? { cachedInputTokens } : undefined),\n },\n );\n}\n\nexport function useAssistantCloudThreadHistoryAdapter(\n cloudRef: RefObject<AssistantCloud>,\n): ThreadHistoryAdapter {\n const aui = useAui();\n // 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 return adapter;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AssistantCloudThreadHistoryAdapter.js","names":["RefObject","useEffect","useRef","useState","GenericThreadHistoryAdapter","ThreadHistoryAdapter","MessageFormatAdapter","MessageFormatItem","MessageFormatRepository","ExportedMessageRepositoryItem","AssistantCloud","CloudMessagePersistence","createFormattedPersistence","auiV0Decode","auiV0Encode","AssistantClient","getClientId","useAui","ThreadListItemMethods","CloudThreadListItem","Pick","globalPersistence","WeakMap","ClientId","AssistantCloudThreadHistoryAdapter","cloudRef","getAui","constructor","aui","getPersistence","threadListItem","key","has","set","current","get","_persistence","tryGetKeyedThreadListItem","live","source","undefined","id","getState","threads","item","withFormat","Record","formatAdapter","TMessage","TStorageFormat","adapter","pinCurrent","next","resolvePinned","getFormatted","getTargetFormatted","pin","append","pinned","Error","remoteId","initialize","update","localMessageId","delete","reportTelemetry","items","options","durationMs","stepTimestamps","StepTimestamp","encodedRunMessages","map","encode","_reportRunTelemetry","format","load","Promise","messages","parentId","message","encoded","telemetry","enabled","_maybeReportRun","isPersisted","filter","m","reverse","runMessages","T","extracted","extractRunTelemetry","_sendReport","content","extractTelemetry","data","TelemetryData","mergedSteps","mergeStepTimestamps","steps","initial","Parameters","this","runs","report","thread_id","status","totalSteps","total_steps","toolCalls","tool_calls","inputTokens","input_tokens","outputTokens","output_tokens","reasoningTokens","reasoning_tokens","cachedInputTokens","cached_input_tokens","duration_ms","outputText","output_text","metadata","modelId","model_id","beforeReport","catch","MAX_SPAN_CONTENT","truncateStr","value","length","slice","safeStringify","JSON","stringify","TelemetryToolCall","tool_name","tool_call_id","tool_args","tool_result","tool_source","BASE64_PATTERN","summarizeMcpResult","parsed","parse","Array","isArray","summarized","type","test","sizeKB","toFixed","buildToolCall","toolName","toolCallId","args","result","argsText","toolSource","call","toolArgs","toolResult","TelemetryStepData","start_ms","end_ms","timestamps","t","len","Math","min","s","i","extractAuiV0","extractAiSdkV6","aggregateAiSdkV6RunSteps","AUI_STATUS_MAP","error","incomplete","msg","role","text","usage","custom","p","textParts","join","totalInput","totalOutput","totalReasoning","totalCachedInput","hasInput","hasOutput","hasReasoning","hasCachedInput","step","statusType","telemetrySteps","AiSdkV6Part","input","output","AiSdkV6Message","parts","isToolCallPart","startsWith","isDynamicToolPart","partToToolCall","collectAiSdkV6Parts","stepsData","currentStepToolCalls","push","tc","extractModelId","buildAiSdkV6Result","hasText","UsageFields","promptTokens","completionTokens","normalizeUsage","u","extractAiSdkV6Usage","normalized","hasAny","n","stepMessages","allTextParts","allToolCalls","allStepsData","hasAssistant","useAssistantCloudThreadHistoryAdapter","auiRef"],"sources":["../../../../src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts"],"sourcesContent":["import { type RefObject, useEffect, useRef, useState } from \"react\";\nimport type {\n GenericThreadHistoryAdapter,\n ThreadHistoryAdapter,\n MessageFormatAdapter,\n MessageFormatItem,\n MessageFormatRepository,\n} from \"../../../adapters/thread-history\";\nimport type { ExportedMessageRepositoryItem } from \"../../../runtime/utils/message-repository\";\nimport {\n type AssistantCloud,\n CloudMessagePersistence,\n createFormattedPersistence,\n} from \"assistant-cloud\";\nimport { auiV0Decode, auiV0Encode } from \"./auiV0\";\nimport { type AssistantClient, getClientId, useAui } from \"@assistant-ui/store\";\nimport type { ThreadListItemMethods } from \"../../../store/scopes/thread-list-item\";\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\n constructor(\n cloudRef: RefObject<AssistantCloud>,\n getAui: () => AssistantClient,\n ) {\n this.cloudRef = cloudRef;\n this.getAui = getAui;\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 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 return this.aui.threads.item({ id });\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 getFormatted = () =>\n createFormattedPersistence(adapter._persistence, formatAdapter);\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 },\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 );\n },\n async load(): Promise<MessageFormatRepository<TMessage>> {\n pinCurrent();\n const live = adapter.aui.threadListItem;\n const remoteId = live.source ? live.getState().remoteId : undefined;\n if (!remoteId) return { messages: [] };\n return getFormatted().load(remoteId);\n },\n };\n }\n\n async append({ parentId, message }: ExportedMessageRepositoryItem) {\n const { remoteId } = await this.aui.threadListItem.initialize();\n const encoded = auiV0Encode(message);\n await this._persistence.append(\n remoteId,\n message.id,\n parentId,\n \"aui/v0\",\n encoded,\n );\n\n if (this.cloudRef.current.telemetry.enabled) {\n this._maybeReportRun(remoteId, \"aui/v0\", encoded);\n }\n }\n\n async update(item: ExportedMessageRepositoryItem) {\n if (!this._persistence.isPersisted(item.message.id)) {\n return this.append(item);\n }\n const { message } = item;\n const remoteId = this.aui.threadListItem.getState().remoteId;\n if (!remoteId) return;\n const encoded = auiV0Encode(message);\n await this._persistence.update(remoteId, message.id, \"aui/v0\", encoded);\n\n if (this.cloudRef.current.telemetry.enabled) {\n this._maybeReportRun(remoteId, \"aui/v0\", encoded);\n }\n }\n\n async delete() {\n throw new Error(\n \"Assistant Cloud does not support deleting thread messages yet.\",\n );\n }\n\n async load() {\n const remoteId = this.aui.threadListItem.getState().remoteId;\n if (!remoteId) return { messages: [] };\n const messages = await this._persistence.load(remoteId, \"aui/v0\");\n return {\n messages: messages\n .filter(\n (m): m is typeof m & { format: \"aui/v0\" } => m.format === \"aui/v0\",\n )\n .map(auiV0Decode)\n .reverse(),\n };\n }\n\n private _reportRunTelemetry<T>(\n format: string,\n runMessages: T[],\n options?: {\n durationMs?: number;\n stepTimestamps?: StepTimestamp[];\n },\n threadListItem?: CloudThreadListItem,\n ) {\n if (!this.cloudRef.current.telemetry.enabled) return;\n\n const remoteId = (threadListItem ?? this.aui.threadListItem).getState()\n .remoteId;\n if (!remoteId) return;\n\n const extracted = extractRunTelemetry(format, runMessages);\n if (!extracted) return;\n\n this._sendReport(\n remoteId,\n extracted,\n options?.durationMs,\n options?.stepTimestamps,\n );\n }\n\n private _maybeReportRun<T>(remoteId: string, format: string, content: T) {\n const extracted = extractTelemetry(format, content);\n if (!extracted) return;\n\n this._sendReport(remoteId, extracted);\n }\n\n private _sendReport(\n remoteId: string,\n data: TelemetryData,\n durationMs?: number,\n stepTimestamps?: StepTimestamp[],\n ) {\n const mergedSteps = mergeStepTimestamps(data.steps, stepTimestamps);\n // Keep in sync with assistant-cloud createRunSchema\n // (apps/aui-cloud-api/src/endpoints/runs/create.ts).\n const initial: Parameters<typeof this.cloudRef.current.runs.report>[0] = {\n thread_id: remoteId,\n status: data.status,\n ...(data.totalSteps != null\n ? { total_steps: data.totalSteps }\n : undefined),\n ...(data.toolCalls ? { tool_calls: data.toolCalls } : undefined),\n ...(mergedSteps ? { steps: mergedSteps } : undefined),\n ...(data.inputTokens != null\n ? { input_tokens: data.inputTokens }\n : undefined),\n ...(data.outputTokens != null\n ? { output_tokens: data.outputTokens }\n : undefined),\n ...(data.reasoningTokens != null\n ? { reasoning_tokens: data.reasoningTokens }\n : undefined),\n ...(data.cachedInputTokens != null\n ? { cached_input_tokens: data.cachedInputTokens }\n : undefined),\n ...(durationMs != null ? { duration_ms: durationMs } : undefined),\n ...(data.outputText != null\n ? { output_text: data.outputText }\n : undefined),\n ...(data.metadata ? { metadata: data.metadata } : undefined),\n ...(data.modelId ? { model_id: data.modelId } : undefined),\n };\n\n const { beforeReport } = this.cloudRef.current.telemetry;\n const report = beforeReport ? beforeReport(initial) : initial;\n if (!report) return;\n\n this.cloudRef.current.runs.report(report).catch(() => {});\n }\n}\n\nconst MAX_SPAN_CONTENT = 50_000;\n\nfunction truncateStr(value: string): string {\n if (value.length <= MAX_SPAN_CONTENT) return value;\n return value.slice(0, MAX_SPAN_CONTENT);\n}\n\nfunction safeStringify(value: unknown): string | undefined {\n if (value == null) return undefined;\n try {\n return truncateStr(JSON.stringify(value));\n } catch {\n return undefined;\n }\n}\n\ntype TelemetryToolCall = {\n tool_name: string;\n tool_call_id: string;\n tool_args?: string;\n tool_result?: string;\n tool_source?: \"mcp\" | \"frontend\" | \"backend\";\n};\n\nconst BASE64_PATTERN = /^[A-Za-z0-9+/]{100,}={0,2}$/;\n\nfunction summarizeMcpResult(value: unknown): string | undefined {\n if (value == null) return undefined;\n try {\n const parsed = typeof value === \"string\" ? JSON.parse(value) : value;\n if (Array.isArray(parsed)) {\n const summarized = parsed.map((item) => {\n if (item && typeof item === \"object\" && item.type) {\n if (\n (item.type === \"image\" || item.type === \"audio\") &&\n typeof item.data === \"string\" &&\n BASE64_PATTERN.test(item.data.slice(0, 200))\n ) {\n const sizeKB = ((item.data.length * 3) / 4 / 1024).toFixed(1);\n return { ...item, data: `[${item.type}: ${sizeKB}KB]` };\n }\n }\n return item;\n });\n return truncateStr(JSON.stringify(summarized));\n }\n } catch {\n // not JSON array, fall through\n }\n return safeStringify(value);\n}\n\nfunction buildToolCall(\n toolName: string,\n toolCallId: string,\n args: unknown,\n result: unknown,\n argsText?: string,\n toolSource?: \"mcp\" | \"frontend\" | \"backend\",\n): TelemetryToolCall {\n const call: TelemetryToolCall = {\n tool_name: toolName,\n tool_call_id: toolCallId,\n };\n const toolArgs = argsText ?? safeStringify(args);\n if (toolArgs !== undefined) call.tool_args = toolArgs;\n const toolResult =\n toolSource === \"mcp\" ? summarizeMcpResult(result) : safeStringify(result);\n if (toolResult !== undefined) call.tool_result = toolResult;\n if (toolSource) call.tool_source = toolSource;\n return call;\n}\n\ntype TelemetryStepData = {\n input_tokens?: number;\n output_tokens?: number;\n reasoning_tokens?: number;\n cached_input_tokens?: number;\n tool_calls?: TelemetryToolCall[];\n start_ms?: number;\n end_ms?: number;\n};\n\ntype StepTimestamp = { start_ms: number; end_ms: number };\n\nfunction mergeStepTimestamps(\n steps: TelemetryStepData[] | undefined,\n timestamps: StepTimestamp[] | undefined,\n): TelemetryStepData[] | undefined {\n if (!timestamps) return steps;\n if (!steps) return timestamps.map((t) => ({ ...t }));\n\n const len = Math.min(steps.length, timestamps.length);\n return steps.map((s, i) => ({\n ...s,\n ...(i < len ? timestamps[i] : undefined),\n }));\n}\n\ntype TelemetryData = {\n status: \"completed\" | \"incomplete\" | \"error\";\n toolCalls?: TelemetryToolCall[];\n totalSteps?: number;\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n outputText?: string;\n metadata?: Record<string, unknown>;\n steps?: TelemetryStepData[];\n modelId?: string;\n};\n\nfunction extractTelemetry<T>(format: string, content: T): TelemetryData | null {\n switch (format) {\n case \"aui/v0\":\n return extractAuiV0(content);\n case \"ai-sdk/v6\":\n return extractAiSdkV6(content);\n default:\n return null;\n }\n}\n\nfunction extractRunTelemetry<T>(\n format: string,\n runMessages: T[],\n): TelemetryData | null {\n if (format === \"ai-sdk/v6\") {\n return aggregateAiSdkV6RunSteps(runMessages);\n }\n for (let i = runMessages.length - 1; i >= 0; i--) {\n const result = extractTelemetry(format, runMessages[i]!);\n if (result) return result;\n }\n return null;\n}\n\nconst AUI_STATUS_MAP: Record<string, TelemetryData[\"status\"]> = {\n error: \"error\",\n incomplete: \"incomplete\",\n};\n\nexport function extractAuiV0<T>(content: T): TelemetryData | null {\n const msg = content as {\n role?: string;\n status?: { type: string };\n content?: readonly {\n type: string;\n text?: string;\n toolName?: string;\n toolCallId?: string;\n args?: unknown;\n argsText?: string;\n result?: unknown;\n }[];\n metadata?: {\n modelId?: string;\n steps?: readonly {\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n };\n }[];\n custom?: Record<string, unknown> & { modelId?: string };\n };\n };\n\n if (msg.role !== \"assistant\") return null;\n // A paused (requires-action) write is not a finished run; reporting it would\n // mislabel it \"completed\" and double-count steps once the terminal write reports.\n if (msg.status?.type === \"requires-action\") return null;\n\n const toolCalls = msg.content\n ?.filter((p) => p.type === \"tool-call\" && p.toolName && p.toolCallId)\n .map((p) =>\n buildToolCall(p.toolName!, p.toolCallId!, p.args, p.result, p.argsText),\n );\n\n const textParts = msg.content?.filter((p) => p.type === \"text\" && p.text);\n const outputText =\n textParts && textParts.length > 0\n ? truncateStr(textParts.map((p) => p.text).join(\"\"))\n : undefined;\n\n const steps = msg.metadata?.steps;\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let reasoningTokens: number | undefined;\n let cachedInputTokens: number | undefined;\n if (steps && steps.length > 0) {\n let totalInput = 0;\n let totalOutput = 0;\n let totalReasoning = 0;\n let totalCachedInput = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n for (const step of steps) {\n if (step.usage?.inputTokens != null) {\n totalInput += step.usage.inputTokens;\n hasInput = true;\n }\n if (step.usage?.outputTokens != null) {\n totalOutput += step.usage.outputTokens;\n hasOutput = true;\n }\n if (step.usage?.reasoningTokens != null) {\n totalReasoning += step.usage.reasoningTokens;\n hasReasoning = true;\n }\n if (step.usage?.cachedInputTokens != null) {\n totalCachedInput += step.usage.cachedInputTokens;\n hasCachedInput = true;\n }\n }\n inputTokens = hasInput ? totalInput : undefined;\n outputTokens = hasOutput ? totalOutput : undefined;\n reasoningTokens = hasReasoning ? totalReasoning : undefined;\n cachedInputTokens = hasCachedInput ? totalCachedInput : undefined;\n }\n\n const statusType = msg.status?.type;\n const status: TelemetryData[\"status\"] =\n (statusType && AUI_STATUS_MAP[statusType]) || \"completed\";\n\n const metadata = msg.metadata?.custom as Record<string, unknown> | undefined;\n const modelId =\n msg.metadata?.modelId ??\n (typeof msg.metadata?.custom?.modelId === \"string\"\n ? msg.metadata.custom.modelId\n : undefined);\n\n const telemetrySteps: TelemetryStepData[] | undefined =\n steps && steps.length > 1\n ? steps.map((s) => ({\n ...(s.usage?.inputTokens != null\n ? { input_tokens: s.usage.inputTokens }\n : undefined),\n ...(s.usage?.outputTokens != null\n ? { output_tokens: s.usage.outputTokens }\n : undefined),\n ...(s.usage?.reasoningTokens != null\n ? { reasoning_tokens: s.usage.reasoningTokens }\n : undefined),\n ...(s.usage?.cachedInputTokens != null\n ? { cached_input_tokens: s.usage.cachedInputTokens }\n : undefined),\n }))\n : undefined;\n\n return {\n status,\n ...(toolCalls && toolCalls.length > 0 ? { toolCalls } : undefined),\n ...(steps?.length ? { totalSteps: steps.length } : undefined),\n ...(inputTokens != null ? { inputTokens } : undefined),\n ...(outputTokens != null ? { outputTokens } : undefined),\n ...(reasoningTokens != null ? { reasoningTokens } : undefined),\n ...(cachedInputTokens != null ? { cachedInputTokens } : undefined),\n ...(outputText != null ? { outputText } : undefined),\n ...(metadata ? { metadata } : undefined),\n ...(telemetrySteps ? { steps: telemetrySteps } : undefined),\n ...(modelId ? { modelId } : undefined),\n };\n}\n\ntype AiSdkV6Part = {\n type: string;\n text?: string;\n toolName?: string;\n toolCallId?: string;\n args?: unknown;\n result?: unknown;\n input?: unknown;\n output?: unknown;\n};\n\ntype AiSdkV6Message = {\n role?: string;\n parts?: readonly AiSdkV6Part[];\n metadata?: Record<string, unknown>;\n};\n\nfunction isToolCallPart(p: AiSdkV6Part): boolean {\n if (!p.toolCallId) return false;\n if (p.type === \"tool-call\" || p.type === \"dynamic-tool\") return !!p.toolName;\n return p.type.startsWith(\"tool-\") || p.type.startsWith(\"dynamic-tool-\");\n}\n\nfunction isDynamicToolPart(p: AiSdkV6Part): boolean {\n return p.type === \"dynamic-tool\" || p.type.startsWith(\"dynamic-tool-\");\n}\n\nfunction partToToolCall(p: AiSdkV6Part): TelemetryToolCall {\n const toolSource: \"mcp\" | undefined = isDynamicToolPart(p)\n ? \"mcp\"\n : undefined;\n return buildToolCall(\n p.toolName ?? p.type.slice(5),\n p.toolCallId!,\n p.args ?? p.input,\n p.result ?? p.output,\n undefined,\n toolSource,\n );\n}\n\nfunction collectAiSdkV6Parts(parts: readonly AiSdkV6Part[]): {\n textParts: string[];\n toolCalls: TelemetryToolCall[];\n stepsData: { tool_calls: TelemetryToolCall[] }[];\n} {\n const textParts: string[] = [];\n const toolCalls: TelemetryToolCall[] = [];\n const stepsData: { tool_calls: TelemetryToolCall[] }[] = [];\n let currentStepToolCalls: TelemetryToolCall[] | null = null;\n\n for (const p of parts) {\n if (p.type === \"step-start\") {\n if (currentStepToolCalls !== null) {\n stepsData.push({ tool_calls: currentStepToolCalls });\n }\n currentStepToolCalls = [];\n } else if (p.type === \"text\" && p.text) {\n textParts.push(p.text);\n } else if (isToolCallPart(p)) {\n const tc = partToToolCall(p);\n toolCalls.push(tc);\n if (currentStepToolCalls !== null) {\n currentStepToolCalls.push(tc);\n }\n }\n }\n\n if (currentStepToolCalls !== null) {\n stepsData.push({ tool_calls: currentStepToolCalls });\n }\n\n return { textParts, toolCalls, stepsData };\n}\n\nfunction extractModelId(\n metadata?: Record<string, unknown>,\n): string | undefined {\n if (!metadata) return undefined;\n if (typeof metadata.modelId === \"string\") return metadata.modelId;\n const custom = metadata.custom as Record<string, unknown> | undefined;\n if (typeof custom?.modelId === \"string\") return custom.modelId;\n return undefined;\n}\n\nfunction buildAiSdkV6Result(\n textParts: string[],\n toolCalls: TelemetryToolCall[],\n totalSteps: number,\n metadata?: Record<string, unknown>,\n stepsData?: { tool_calls: TelemetryToolCall[] }[],\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n },\n): TelemetryData {\n const hasText = textParts.length > 0;\n const outputText = hasText ? truncateStr(textParts.join(\"\")) : undefined;\n const modelId = extractModelId(metadata);\n\n const steps: TelemetryStepData[] | undefined =\n stepsData && stepsData.length > 1\n ? stepsData.map((s) => ({\n ...(s.tool_calls.length > 0\n ? { tool_calls: s.tool_calls }\n : undefined),\n }))\n : undefined;\n\n return {\n status: hasText ? \"completed\" : \"incomplete\",\n ...(toolCalls.length > 0 ? { toolCalls } : undefined),\n ...(totalSteps > 0 ? { totalSteps } : undefined),\n ...(usage?.inputTokens != null\n ? { inputTokens: usage.inputTokens }\n : undefined),\n ...(usage?.outputTokens != null\n ? { outputTokens: usage.outputTokens }\n : undefined),\n ...(usage?.reasoningTokens != null\n ? { reasoningTokens: usage.reasoningTokens }\n : undefined),\n ...(usage?.cachedInputTokens != null\n ? { cachedInputTokens: usage.cachedInputTokens }\n : undefined),\n ...(outputText != null ? { outputText } : undefined),\n ...(metadata ? { metadata } : undefined),\n ...(steps ? { steps } : undefined),\n ...(modelId ? { modelId } : undefined),\n };\n}\n\ntype UsageFields = {\n inputTokens?: number;\n outputTokens?: number;\n promptTokens?: number;\n completionTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n};\n\nfunction normalizeUsage(u: UsageFields):\n | {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n }\n | undefined {\n const input = u.inputTokens ?? u.promptTokens;\n const output = u.outputTokens ?? u.completionTokens;\n if (\n input == null &&\n output == null &&\n u.reasoningTokens == null &&\n u.cachedInputTokens == null\n ) {\n return undefined;\n }\n\n return {\n ...(input != null ? { inputTokens: input } : undefined),\n ...(output != null ? { outputTokens: output } : undefined),\n ...(u.reasoningTokens != null\n ? { reasoningTokens: u.reasoningTokens }\n : undefined),\n ...(u.cachedInputTokens != null\n ? { cachedInputTokens: u.cachedInputTokens }\n : undefined),\n };\n}\n\nfunction extractAiSdkV6Usage(metadata?: Record<string, unknown>):\n | {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n }\n | undefined {\n // Try top-level metadata.usage\n const usage = metadata?.usage as UsageFields | undefined;\n if (usage) {\n const normalized = normalizeUsage(usage);\n if (normalized) return normalized;\n }\n\n // Try aggregating from metadata.steps[].usage\n const steps = metadata?.steps as\n | readonly { usage?: UsageFields }[]\n | undefined;\n if (steps && steps.length > 0) {\n let inputTokens = 0;\n let outputTokens = 0;\n let reasoningTokens = 0;\n let cachedInputTokens = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n let hasAny = false;\n for (const s of steps) {\n if (!s.usage) continue;\n const n = normalizeUsage(s.usage);\n if (n) {\n if (n.inputTokens != null) {\n inputTokens += n.inputTokens;\n hasInput = true;\n }\n if (n.outputTokens != null) {\n outputTokens += n.outputTokens;\n hasOutput = true;\n }\n if (n.reasoningTokens != null) {\n reasoningTokens += n.reasoningTokens;\n hasReasoning = true;\n }\n if (n.cachedInputTokens != null) {\n cachedInputTokens += n.cachedInputTokens;\n hasCachedInput = true;\n }\n hasAny = true;\n }\n }\n if (hasAny) {\n return {\n ...(hasInput ? { inputTokens } : undefined),\n ...(hasOutput ? { outputTokens } : undefined),\n ...(hasReasoning ? { reasoningTokens } : undefined),\n ...(hasCachedInput ? { cachedInputTokens } : undefined),\n };\n }\n }\n\n return undefined;\n}\n\nfunction extractAiSdkV6<T>(content: T): TelemetryData | null {\n const msg = content as AiSdkV6Message;\n if (msg.role !== \"assistant\") return null;\n\n const { textParts, toolCalls, stepsData } = collectAiSdkV6Parts(\n msg.parts ?? [],\n );\n return buildAiSdkV6Result(\n textParts,\n toolCalls,\n stepsData.length,\n msg.metadata,\n stepsData,\n extractAiSdkV6Usage(msg.metadata),\n );\n}\n\nfunction aggregateAiSdkV6RunSteps<T>(stepMessages: T[]): TelemetryData | null {\n const allTextParts: string[] = [];\n const allToolCalls: TelemetryToolCall[] = [];\n const allStepsData: { tool_calls: TelemetryToolCall[] }[] = [];\n let hasAssistant = false;\n let metadata: Record<string, unknown> | undefined;\n let inputTokens = 0;\n let outputTokens = 0;\n let reasoningTokens = 0;\n let cachedInputTokens = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n\n for (const content of stepMessages) {\n const msg = content as AiSdkV6Message;\n if (msg.role !== \"assistant\") continue;\n hasAssistant = true;\n\n const { textParts, toolCalls, stepsData } = collectAiSdkV6Parts(\n msg.parts ?? [],\n );\n allTextParts.push(...textParts);\n allToolCalls.push(...toolCalls);\n allStepsData.push(...stepsData);\n if (msg.metadata) metadata = msg.metadata;\n\n const usage = extractAiSdkV6Usage(msg.metadata);\n if (usage) {\n if (usage.inputTokens != null) {\n inputTokens += usage.inputTokens;\n hasInput = true;\n }\n if (usage.outputTokens != null) {\n outputTokens += usage.outputTokens;\n hasOutput = true;\n }\n if (usage.reasoningTokens != null) {\n reasoningTokens += usage.reasoningTokens;\n hasReasoning = true;\n }\n if (usage.cachedInputTokens != null) {\n cachedInputTokens += usage.cachedInputTokens;\n hasCachedInput = true;\n }\n }\n }\n\n if (!hasAssistant) return null;\n return buildAiSdkV6Result(\n allTextParts,\n allToolCalls,\n allStepsData.length,\n metadata,\n allStepsData,\n {\n ...(hasInput ? { inputTokens } : undefined),\n ...(hasOutput ? { outputTokens } : undefined),\n ...(hasReasoning ? { reasoningTokens } : undefined),\n ...(hasCachedInput ? { cachedInputTokens } : undefined),\n },\n );\n}\n\nexport function useAssistantCloudThreadHistoryAdapter(\n cloudRef: RefObject<AssistantCloud>,\n): ThreadHistoryAdapter {\n const aui = useAui();\n // 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 return adapter;\n}\n"],"mappings":"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"}
@@ -4,8 +4,9 @@ import { AssistantCloud } from "assistant-cloud";
4
4
  //#region src/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts
5
5
  declare class CloudFileAttachmentAdapter implements AttachmentAdapter {
6
6
  accept: string;
7
- private cloud;
7
+ private getCloud;
8
8
  constructor(cloud: AssistantCloud);
9
+ constructor(getCloud: () => AssistantCloud);
9
10
  private uploadedUrls;
10
11
  add({ file }: {
11
12
  file: File;
@@ -1 +1 @@
1
- {"version":3,"file":"CloudFileAttachmentAdapter.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts"],"mappings":";;;;cAkBa,sCAAsC;EAC1C;UAEC;EAEI,YAAA,OAAO;UAIX;EAEM,MACZ;IAEA,MAAM;MACJ,eAAe;EAmDN,OAAO,YAAY,aAAa;EAIhC,KACX,YAAY,oBACX,QAAQ"}
1
+ {"version":3,"file":"CloudFileAttachmentAdapter.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts"],"mappings":";;;;cAkBa,sCAAsC;EAC1C;UAEC;EAEI,YAAA,OAAO;EACP,YAAA,gBAAgB;UAKpB;EAEM,MACZ;IAEA,MAAM;MACJ,eAAe;EAmDN,OAAO,YAAY,aAAa;EAIhC,KACX,YAAY,oBACX,QAAQ"}
@@ -7,9 +7,9 @@ const guessAttachmentType = (contentType) => {
7
7
  };
8
8
  var CloudFileAttachmentAdapter = class {
9
9
  accept = "*";
10
- cloud;
10
+ getCloud;
11
11
  constructor(cloud) {
12
- this.cloud = cloud;
12
+ this.getCloud = typeof cloud === "function" ? cloud : () => cloud;
13
13
  }
14
14
  uploadedUrls = /* @__PURE__ */ new Map();
15
15
  async *add({ file }) {
@@ -28,7 +28,7 @@ var CloudFileAttachmentAdapter = class {
28
28
  };
29
29
  yield attachment;
30
30
  try {
31
- const { signedUrl, publicUrl } = await this.cloud.files.generatePresignedUploadUrl({ filename: file.name });
31
+ const { signedUrl, publicUrl } = await this.getCloud().files.generatePresignedUploadUrl({ filename: file.name });
32
32
  const res = await fetch(signedUrl, {
33
33
  method: "PUT",
34
34
  body: file,
@@ -1 +1 @@
1
- {"version":3,"file":"CloudFileAttachmentAdapter.js","names":["AssistantCloud","Attachment","PendingAttachment","CompleteAttachment","ThreadUserMessagePart","AttachmentAdapter","generateId","guessAttachmentType","contentType","startsWith","CloudFileAttachmentAdapter","accept","cloud","constructor","uploadedUrls","Map","add","file","File","AsyncGenerator","id","type","attachment","name","status","reason","progress","signedUrl","publicUrl","files","generatePresignedUploadUrl","filename","res","fetch","method","body","headers","mode","ok","Error","statusText","set","error","console","message","String","remove","Promise","delete","send","url","get","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 cloud: AssistantCloud;\n\n constructor(cloud: AssistantCloud) {\n this.cloud = cloud;\n }\n\n private uploadedUrls = new Map<string, string>();\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 yield attachment;\n\n try {\n const { signedUrl, publicUrl } =\n await this.cloud.files.generatePresignedUploadUrl({\n filename: file.name,\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 });\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 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 }\n }\n\n public async remove(attachment: Attachment): Promise<void> {\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":";;AAUA,MAAMO,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;CAEAG,YAAYD,OAAuB;EACjC,KAAKA,QAAQA;CACf;CAEA,+BAAuB,IAAIG,IAAoB;CAE/C,OAAcC,IAAI,EAChBC,QAG0C;EAC1C,MAAMG,KAAKd,WAAW;EAEtB,IAAIgB,aAAgC;GAClCF;GACAC,MAHWd,oBAAoBU,KAAKI,IAGpCA;GACAE,MAAMN,KAAKM;GACXf,aAAaS,KAAKI;GAClBJ;GACAO,QAAQ;IAAEH,MAAM;IAAWI,QAAQ;IAAaC,UAAU;GAAE;EAC9D;EACA,MAAMJ;EAEN,IAAI;GACF,MAAM,EAAEK,WAAWC,cACjB,MAAM,KAAKhB,MAAMiB,MAAMC,2BAA2B,EAChDC,UAAUd,KAAKM,KACjB,CAAC;GACH,MAAMS,MAAM,MAAMC,MAAMN,WAAW;IACjCO,QAAQ;IACRC,MAAMlB;IACNmB,SAAS,EACP,gBAAgBnB,KAAKI,KACvB;IACAgB,MAAM;GACR,CAAC;GACD,IAAI,CAACL,IAAIM,IACP,MAAM,IAAIC,MACR,0BAA0BP,IAAIR,OAAM,GAAIQ,IAAIQ,YAC9C;GAEF,KAAK1B,aAAa2B,IAAIrB,IAAIQ,SAAS;GACnCN,aAAa;IACX,GAAGA;IACHE,QAAQ;KAAEH,MAAM;KAAmBI,QAAQ;IAAgB;GAC7D;GACA,MAAMH;EACR,SAASoB,OAAO;GACdC,QAAQD,MAAM,+CAA+CA,KAAK;GAClEpB,aAAa;IACX,GAAGA;IACHE,QAAQ;KACNH,MAAM;KACNI,QAAQ;KACRmB,SAASF,iBAAiBH,QAAQG,MAAME,UAAUC,OAAOH,KAAK;IAChE;GACF;GACA,MAAMpB;EACR;CACF;CAEA,MAAawB,OAAOxB,YAAuC;EACzD,KAAKR,aAAakC,OAAO1B,WAAWF,EAAE;CACxC;CAEA,MAAa6B,KACX3B,YAC6B;EAC7B,MAAM4B,MAAM,KAAKpC,aAAaqC,IAAI7B,WAAWF,EAAE;EAC/C,IAAI,CAAC8B,KAAK,MAAM,IAAIX,MAAM,yBAAyB;EACnD,KAAKzB,aAAakC,OAAO1B,WAAWF,EAAE;EAEtC,IAAIgC;EACJ,IAAI9B,WAAWD,SAAS,SACtB+B,UAAU,CAAC;GAAE/B,MAAM;GAASgC,OAAOH;GAAKnB,UAAUT,WAAWC;EAAK,CAAC;OAEnE6B,UAAU,CACR;GACE/B,MAAM;GACNiC,MAAMJ;GACNK,UAAUjC,WAAWd,eAAe;GACpCuB,UAAUT,WAAWC;EACvB,CAAC;EAIL,OAAO;GACL,GAAGD;GACHE,QAAQ,EAAEH,MAAM,WAAW;GAC3B+B;EACF;CACF;AACF"}
1
+ {"version":3,"file":"CloudFileAttachmentAdapter.js","names":["AssistantCloud","Attachment","PendingAttachment","CompleteAttachment","ThreadUserMessagePart","AttachmentAdapter","generateId","guessAttachmentType","contentType","startsWith","CloudFileAttachmentAdapter","accept","getCloud","constructor","cloud","uploadedUrls","Map","add","file","File","AsyncGenerator","id","type","attachment","name","status","reason","progress","signedUrl","publicUrl","files","generatePresignedUploadUrl","filename","res","fetch","method","body","headers","mode","ok","Error","statusText","set","error","console","message","String","remove","Promise","delete","send","url","get","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\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 yield attachment;\n\n try {\n const { signedUrl, publicUrl } =\n await this.getCloud().files.generatePresignedUploadUrl({\n filename: file.name,\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 });\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 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 }\n }\n\n public async remove(attachment: Attachment): Promise<void> {\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":";;AAUA,MAAMO,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;CAE/C,OAAcC,IAAI,EAChBC,QAG0C;EAC1C,MAAMG,KAAKf,WAAW;EAEtB,IAAIiB,aAAgC;GAClCF;GACAC,MAHWf,oBAAoBW,KAAKI,IAGpCA;GACAE,MAAMN,KAAKM;GACXhB,aAAaU,KAAKI;GAClBJ;GACAO,QAAQ;IAAEH,MAAM;IAAWI,QAAQ;IAAaC,UAAU;GAAE;EAC9D;EACA,MAAMJ;EAEN,IAAI;GACF,MAAM,EAAEK,WAAWC,cACjB,MAAM,KAAKjB,SAAS,CAAC,CAACkB,MAAMC,2BAA2B,EACrDC,UAAUd,KAAKM,KACjB,CAAC;GACH,MAAMS,MAAM,MAAMC,MAAMN,WAAW;IACjCO,QAAQ;IACRC,MAAMlB;IACNmB,SAAS,EACP,gBAAgBnB,KAAKI,KACvB;IACAgB,MAAM;GACR,CAAC;GACD,IAAI,CAACL,IAAIM,IACP,MAAM,IAAIC,MACR,0BAA0BP,IAAIR,OAAM,GAAIQ,IAAIQ,YAC9C;GAEF,KAAK1B,aAAa2B,IAAIrB,IAAIQ,SAAS;GACnCN,aAAa;IACX,GAAGA;IACHE,QAAQ;KAAEH,MAAM;KAAmBI,QAAQ;IAAgB;GAC7D;GACA,MAAMH;EACR,SAASoB,OAAO;GACdC,QAAQD,MAAM,+CAA+CA,KAAK;GAClEpB,aAAa;IACX,GAAGA;IACHE,QAAQ;KACNH,MAAM;KACNI,QAAQ;KACRmB,SAASF,iBAAiBH,QAAQG,MAAME,UAAUC,OAAOH,KAAK;IAChE;GACF;GACA,MAAMpB;EACR;CACF;CAEA,MAAawB,OAAOxB,YAAuC;EACzD,KAAKR,aAAakC,OAAO1B,WAAWF,EAAE;CACxC;CAEA,MAAa6B,KACX3B,YAC6B;EAC7B,MAAM4B,MAAM,KAAKpC,aAAaqC,IAAI7B,WAAWF,EAAE;EAC/C,IAAI,CAAC8B,KAAK,MAAM,IAAIX,MAAM,yBAAyB;EACnD,KAAKzB,aAAakC,OAAO1B,WAAWF,EAAE;EAEtC,IAAIgC;EACJ,IAAI9B,WAAWD,SAAS,SACtB+B,UAAU,CAAC;GAAE/B,MAAM;GAASgC,OAAOH;GAAKnB,UAAUT,WAAWC;EAAK,CAAC;OAEnE6B,UAAU,CACR;GACE/B,MAAM;GACNiC,MAAMJ;GACNK,UAAUjC,WAAWf,eAAe;GACpCwB,UAAUT,WAAWC;EACvB,CAAC;EAIL,OAAO;GACL,GAAGD;GACHE,QAAQ,EAAEH,MAAM,WAAW;GAC3B+B;EACF;CACF;AACF"}
@@ -60,6 +60,10 @@ type AuiV0MessagePart = {
60
60
  readonly mimeType: string;
61
61
  readonly filename?: string;
62
62
  readonly sourceType?: "url" | "id";
63
+ } | {
64
+ readonly type: "data";
65
+ readonly name: string;
66
+ readonly data: ReadonlyJSONValue;
63
67
  };
64
68
  type AuiV0AttachmentPart = {
65
69
  readonly type: "text";
@@ -1 +1 @@
1
- {"version":3,"file":"auiV0.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/auiV0.ts"],"mappings":";;;;;;KAgBK;WACM;WACA;WACA;WACA;WACA,mBAAmB;WACnB;WACA;;KAGN;WAEU;WACA;;WAGA;WACA;WACA;;WAGA;WACA;WACA;WACA;WACA;WACA,mBAAmB;;WAGnB;WACA;WACA;WACA;WACA;WACA;WACA,mBAAmB;;WAGnB;WACA;WACA;WACA,MAAM;WACN,SAAS;WACT;WACA,WAAW;;WAGX;WACA;WACA;WACA;WACA,SAAS;WACT;WACA,WAAW;;WAGX;WACA;;WAGA;WACA;WACA;WACA;WACA;;KAGV;WAEU;WACA;;WAGA;WACA;WACA;;WAGA;WACA;WACA;WACA;WACA;;WAGA;WACA;aACE;aACA;;;WAIF;WACA;WACA,MAAM;;KAGhB;WACM;WACA,MAAM;WACN;WACA;WACA,QAAQ;WACR,kBAAkB;;KAGxB;WACM;WACA,SAAS;WACT,kBAAkB;WAClB,uBAAuB;WACvB;aACE,iBAAiB;aACjB,+BAA+B;aAC/B,wBAAwB;aACxB;eACE;iBACE;iBACA;;;aAGJ,QAAQ;;;iBA2EL,YAAY,SAAS,gBAAgB;iBAoGrC,YACd,cAAc;EAAiB;IAC9B"}
1
+ {"version":3,"file":"auiV0.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/auiV0.ts"],"mappings":";;;;;;KAgBK;WACM;WACA;WACA;WACA;WACA,mBAAmB;WACnB;WACA;;KAGN;WAEU;WACA;;WAGA;WACA;WACA;;WAGA;WACA;WACA;WACA;WACA;WACA,mBAAmB;;WAGnB;WACA;WACA;WACA;WACA;WACA;WACA,mBAAmB;;WAGnB;WACA;WACA;WACA,MAAM;WACN,SAAS;WACT;WACA,WAAW;;WAGX;WACA;WACA;WACA;WACA,SAAS;WACT;WACA,WAAW;;WAGX;WACA;;WAGA;WACA;WACA;WACA;WACA;;WAGA;WACA;WACA,MAAM;;KAGhB;WAEU;WACA;;WAGA;WACA;WACA;;WAGA;WACA;WACA;WACA;WACA;;WAGA;WACA;aACE;aACA;;;WAIF;WACA;WACA,MAAM;;KAGhB;WACM;WACA,MAAM;WACN;WACA;WACA,QAAQ;WACR,kBAAkB;;KAGxB;WACM;WACA,SAAS;WACT,kBAAkB;WAClB,uBAAuB;WACvB;aACE,iBAAiB;aACjB,+BAA+B;aAC/B,wBAAwB;aACxB;eACE;iBACE;iBACA;;;aAGJ,QAAQ;;;iBA2EL,YAAY,SAAS,gBAAgB;iBA+GrC,YACd,cAAc;EAAiB;IAC9B"}
@@ -108,6 +108,13 @@ function auiV0Encode(message) {
108
108
  ...part.filename ? { filename: part.filename } : void 0,
109
109
  ...part.sourceType ? { sourceType: part.sourceType } : void 0
110
110
  };
111
+ case "data":
112
+ if (!isJSONValue(part.data)) console.warn(`data part is not JSON! ${JSON.stringify(part)}`);
113
+ return {
114
+ type: "data",
115
+ name: part.name,
116
+ data: part.data
117
+ };
111
118
  default: throw new Error(`Message part type not supported by aui/v0: ${type}`);
112
119
  }
113
120
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"auiV0.js","names":["MessageStatus","SourceProviderMetadata","ThreadMessage","ToolApprovalOption","CompleteAttachment","fromThreadMessageLike","CloudMessage","isJSONValue","ReadonlyJSONObject","ReadonlyJSONValue","ExportedMessageRepositoryItem","AuiV0ToolApproval","id","approved","reason","isAutomatic","options","optionId","resolution","AuiV0MessagePart","type","text","unstable_summary","sourceType","url","title","providerMetadata","mediaType","filename","toolCallId","toolName","args","result","isError","approval","argsText","image","data","mimeType","AuiV0AttachmentPart","audio","format","name","AuiV0Attachment","contentType","status","content","AuiV0Message","role","attachments","metadata","unstable_state","unstable_annotations","unstable_data","steps","usage","inputTokens","outputTokens","custom","encodeAttachmentPart","part","undefined","console","warn","JSON","stringify","unhandledType","Error","encodeAttachments","message","length","map","auiV0Encode","auiV0Decode","cloudMessage","payload","createdAt","created_at","parentId","parent_id"],"sources":["../../../../src/react/runtimes/cloud/auiV0.ts"],"sourcesContent":["import type {\n MessageStatus,\n SourceProviderMetadata,\n ThreadMessage,\n ToolApprovalOption,\n} from \"../../../types/message\";\nimport type { CompleteAttachment } from \"../../../types/attachment\";\nimport { fromThreadMessageLike } from \"../../../runtime/utils/thread-message-like\";\nimport type { CloudMessage } from \"assistant-cloud\";\nimport { isJSONValue } from \"../../../utils/json/is-json\";\nimport type {\n ReadonlyJSONObject,\n ReadonlyJSONValue,\n} from \"assistant-stream/utils\";\nimport type { ExportedMessageRepositoryItem } from \"../../../runtime/utils/message-repository\";\n\ntype AuiV0ToolApproval = {\n readonly id: string;\n readonly approved?: boolean;\n readonly reason?: string;\n readonly isAutomatic?: boolean;\n readonly options?: readonly ToolApprovalOption[];\n readonly optionId?: string;\n readonly resolution?: \"cancelled\" | \"expired\";\n};\n\ntype AuiV0MessagePart =\n | {\n readonly type: \"text\";\n readonly text: string;\n }\n | {\n readonly type: \"reasoning\";\n readonly text: string;\n readonly unstable_summary?: string;\n }\n | {\n readonly type: \"source\";\n readonly sourceType: \"url\";\n readonly id: string;\n readonly url: string;\n readonly title?: string;\n readonly providerMetadata?: SourceProviderMetadata;\n }\n | {\n readonly type: \"source\";\n readonly sourceType: \"document\";\n readonly id: string;\n readonly title: string;\n readonly mediaType: string;\n readonly filename?: string;\n readonly providerMetadata?: SourceProviderMetadata;\n }\n | {\n readonly type: \"tool-call\";\n readonly toolCallId: string;\n readonly toolName: string;\n readonly args: ReadonlyJSONObject;\n readonly result?: ReadonlyJSONValue;\n readonly isError?: true;\n readonly approval?: AuiV0ToolApproval;\n }\n | {\n readonly type: \"tool-call\";\n readonly toolCallId: string;\n readonly toolName: string;\n readonly argsText: string;\n readonly result?: ReadonlyJSONValue;\n readonly isError?: true;\n readonly approval?: AuiV0ToolApproval;\n }\n | {\n readonly type: \"image\";\n readonly image: string;\n }\n | {\n readonly type: \"file\";\n readonly data: string;\n readonly mimeType: string;\n readonly filename?: string;\n readonly sourceType?: \"url\" | \"id\";\n };\n\ntype AuiV0AttachmentPart =\n | {\n readonly type: \"text\";\n readonly text: string;\n }\n | {\n readonly type: \"image\";\n readonly image: string;\n readonly filename?: string;\n }\n | {\n readonly type: \"file\";\n readonly data: string;\n readonly mimeType: string;\n readonly filename?: string;\n readonly sourceType?: \"url\" | \"id\";\n }\n | {\n readonly type: \"audio\";\n readonly audio: {\n readonly data: string;\n readonly format: \"mp3\" | \"wav\";\n };\n }\n | {\n readonly type: \"data\";\n readonly name: string;\n readonly data: ReadonlyJSONValue;\n };\n\ntype AuiV0Attachment = {\n readonly id: string;\n readonly type: CompleteAttachment[\"type\"];\n readonly name: string;\n readonly contentType?: string;\n readonly status: CompleteAttachment[\"status\"];\n readonly content: readonly AuiV0AttachmentPart[];\n};\n\ntype AuiV0Message = {\n readonly role: \"assistant\" | \"user\" | \"system\";\n readonly status?: MessageStatus;\n readonly content: readonly AuiV0MessagePart[];\n readonly attachments?: readonly AuiV0Attachment[];\n readonly metadata: {\n readonly unstable_state?: ReadonlyJSONValue;\n readonly unstable_annotations: readonly ReadonlyJSONValue[];\n readonly unstable_data: readonly ReadonlyJSONValue[];\n readonly steps: readonly {\n readonly usage?: {\n readonly inputTokens: number;\n readonly outputTokens: number;\n };\n }[];\n readonly custom: ReadonlyJSONObject;\n };\n};\n\nconst encodeAttachmentPart = (\n part: CompleteAttachment[\"content\"][number],\n): AuiV0AttachmentPart => {\n const type = part.type;\n switch (type) {\n case \"text\":\n return { type: \"text\", text: part.text };\n\n case \"image\":\n return {\n type: \"image\",\n image: part.image,\n ...(part.filename != null ? { filename: part.filename } : undefined),\n };\n\n case \"file\":\n return {\n type: \"file\",\n data: part.data,\n mimeType: part.mimeType,\n ...(part.filename != null ? { filename: part.filename } : undefined),\n ...(part.sourceType != null\n ? { sourceType: part.sourceType }\n : undefined),\n };\n\n case \"audio\":\n return {\n type: \"audio\",\n audio: { data: part.audio.data, format: part.audio.format },\n };\n\n case \"data\": {\n if (!isJSONValue(part.data)) {\n console.warn(`attachment data is not JSON! ${JSON.stringify(part)}`);\n }\n return {\n type: \"data\",\n name: part.name,\n data: part.data as ReadonlyJSONValue,\n };\n }\n\n default: {\n const unhandledType: never = type;\n throw new Error(\n `Attachment part type not supported by aui/v0: ${unhandledType}`,\n );\n }\n }\n};\n\nconst encodeAttachments = (\n message: ThreadMessage,\n): readonly AuiV0Attachment[] | undefined => {\n if (message.role !== \"user\" || message.attachments.length === 0) {\n return undefined;\n }\n\n return message.attachments.map(\n ({ id, type, name, contentType, status, content }) => ({\n id,\n type,\n name,\n status,\n ...(contentType != null ? { contentType } : undefined),\n content: content.map(encodeAttachmentPart),\n }),\n );\n};\n\nexport function auiV0Encode(message: ThreadMessage): AuiV0Message {\n // info: ID and createdAt are ignored (we use the server value instead)\n const status: MessageStatus | undefined =\n message.status?.type === \"running\"\n ? { type: \"incomplete\", reason: \"cancelled\" }\n : message.status;\n const attachments = encodeAttachments(message);\n\n return {\n role: message.role,\n content: message.content.map((part) => {\n const type = part.type;\n switch (type) {\n case \"text\":\n return { type: \"text\", text: part.text };\n\n case \"reasoning\":\n return {\n type: \"reasoning\",\n text: part.text,\n ...(part.unstable_summary !== undefined\n ? { unstable_summary: part.unstable_summary }\n : undefined),\n };\n\n case \"source\":\n if (part.sourceType === \"url\") {\n return {\n type: \"source\",\n sourceType: \"url\",\n id: part.id,\n url: part.url,\n ...(part.title != null ? { title: part.title } : undefined),\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : undefined),\n };\n }\n\n return {\n type: \"source\",\n sourceType: \"document\",\n id: part.id,\n title: part.title,\n mediaType: part.mediaType,\n ...(part.filename != null\n ? { filename: part.filename }\n : undefined),\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : undefined),\n };\n\n case \"tool-call\": {\n if (part.result !== undefined && !isJSONValue(part.result)) {\n console.warn(\n `tool-call result is not JSON! ${JSON.stringify(part)}`,\n );\n }\n return {\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n ...(JSON.stringify(part.args) === part.argsText\n ? { args: part.args }\n : { argsText: part.argsText }),\n ...(part.result !== undefined\n ? { result: part.result as ReadonlyJSONValue }\n : undefined),\n ...(part.isError ? { isError: true } : undefined),\n ...(part.approval ? { approval: part.approval } : undefined),\n };\n }\n\n case \"image\":\n return { type: \"image\", image: part.image };\n\n case \"file\":\n return {\n type: \"file\",\n data: part.data,\n mimeType: part.mimeType,\n ...(part.filename ? { filename: part.filename } : undefined),\n ...(part.sourceType ? { sourceType: part.sourceType } : undefined),\n };\n\n default: {\n const unhandledType: \"audio\" | \"data\" | \"generative-ui\" = type;\n throw new Error(\n `Message part type not supported by aui/v0: ${unhandledType}`,\n );\n }\n }\n }),\n metadata: message.metadata as AuiV0Message[\"metadata\"],\n ...(status ? { status } : undefined),\n ...(attachments ? { attachments } : undefined),\n };\n}\n\nexport function auiV0Decode(\n cloudMessage: CloudMessage & { format: \"aui/v0\" },\n): ExportedMessageRepositoryItem {\n const payload = cloudMessage.content as unknown as AuiV0Message;\n const message = fromThreadMessageLike(\n {\n id: cloudMessage.id,\n createdAt: cloudMessage.created_at,\n ...payload,\n },\n cloudMessage.id,\n { type: \"complete\", reason: \"unknown\" },\n );\n\n return {\n parentId: cloudMessage.parent_id,\n message,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"auiV0.js","names":["MessageStatus","SourceProviderMetadata","ThreadMessage","ToolApprovalOption","CompleteAttachment","fromThreadMessageLike","CloudMessage","isJSONValue","ReadonlyJSONObject","ReadonlyJSONValue","ExportedMessageRepositoryItem","AuiV0ToolApproval","id","approved","reason","isAutomatic","options","optionId","resolution","AuiV0MessagePart","type","text","unstable_summary","sourceType","url","title","providerMetadata","mediaType","filename","toolCallId","toolName","args","result","isError","approval","argsText","image","data","mimeType","name","AuiV0AttachmentPart","audio","format","AuiV0Attachment","contentType","status","content","AuiV0Message","role","attachments","metadata","unstable_state","unstable_annotations","unstable_data","steps","usage","inputTokens","outputTokens","custom","encodeAttachmentPart","part","undefined","console","warn","JSON","stringify","unhandledType","Error","encodeAttachments","message","length","map","auiV0Encode","auiV0Decode","cloudMessage","payload","createdAt","created_at","parentId","parent_id"],"sources":["../../../../src/react/runtimes/cloud/auiV0.ts"],"sourcesContent":["import type {\n MessageStatus,\n SourceProviderMetadata,\n ThreadMessage,\n ToolApprovalOption,\n} from \"../../../types/message\";\nimport type { CompleteAttachment } from \"../../../types/attachment\";\nimport { fromThreadMessageLike } from \"../../../runtime/utils/thread-message-like\";\nimport type { CloudMessage } from \"assistant-cloud\";\nimport { isJSONValue } from \"../../../utils/json/is-json\";\nimport type {\n ReadonlyJSONObject,\n ReadonlyJSONValue,\n} from \"assistant-stream/utils\";\nimport type { ExportedMessageRepositoryItem } from \"../../../runtime/utils/message-repository\";\n\ntype AuiV0ToolApproval = {\n readonly id: string;\n readonly approved?: boolean;\n readonly reason?: string;\n readonly isAutomatic?: boolean;\n readonly options?: readonly ToolApprovalOption[];\n readonly optionId?: string;\n readonly resolution?: \"cancelled\" | \"expired\";\n};\n\ntype AuiV0MessagePart =\n | {\n readonly type: \"text\";\n readonly text: string;\n }\n | {\n readonly type: \"reasoning\";\n readonly text: string;\n readonly unstable_summary?: string;\n }\n | {\n readonly type: \"source\";\n readonly sourceType: \"url\";\n readonly id: string;\n readonly url: string;\n readonly title?: string;\n readonly providerMetadata?: SourceProviderMetadata;\n }\n | {\n readonly type: \"source\";\n readonly sourceType: \"document\";\n readonly id: string;\n readonly title: string;\n readonly mediaType: string;\n readonly filename?: string;\n readonly providerMetadata?: SourceProviderMetadata;\n }\n | {\n readonly type: \"tool-call\";\n readonly toolCallId: string;\n readonly toolName: string;\n readonly args: ReadonlyJSONObject;\n readonly result?: ReadonlyJSONValue;\n readonly isError?: true;\n readonly approval?: AuiV0ToolApproval;\n }\n | {\n readonly type: \"tool-call\";\n readonly toolCallId: string;\n readonly toolName: string;\n readonly argsText: string;\n readonly result?: ReadonlyJSONValue;\n readonly isError?: true;\n readonly approval?: AuiV0ToolApproval;\n }\n | {\n readonly type: \"image\";\n readonly image: string;\n }\n | {\n readonly type: \"file\";\n readonly data: string;\n readonly mimeType: string;\n readonly filename?: string;\n readonly sourceType?: \"url\" | \"id\";\n }\n | {\n readonly type: \"data\";\n readonly name: string;\n readonly data: ReadonlyJSONValue;\n };\n\ntype AuiV0AttachmentPart =\n | {\n readonly type: \"text\";\n readonly text: string;\n }\n | {\n readonly type: \"image\";\n readonly image: string;\n readonly filename?: string;\n }\n | {\n readonly type: \"file\";\n readonly data: string;\n readonly mimeType: string;\n readonly filename?: string;\n readonly sourceType?: \"url\" | \"id\";\n }\n | {\n readonly type: \"audio\";\n readonly audio: {\n readonly data: string;\n readonly format: \"mp3\" | \"wav\";\n };\n }\n | {\n readonly type: \"data\";\n readonly name: string;\n readonly data: ReadonlyJSONValue;\n };\n\ntype AuiV0Attachment = {\n readonly id: string;\n readonly type: CompleteAttachment[\"type\"];\n readonly name: string;\n readonly contentType?: string;\n readonly status: CompleteAttachment[\"status\"];\n readonly content: readonly AuiV0AttachmentPart[];\n};\n\ntype AuiV0Message = {\n readonly role: \"assistant\" | \"user\" | \"system\";\n readonly status?: MessageStatus;\n readonly content: readonly AuiV0MessagePart[];\n readonly attachments?: readonly AuiV0Attachment[];\n readonly metadata: {\n readonly unstable_state?: ReadonlyJSONValue;\n readonly unstable_annotations: readonly ReadonlyJSONValue[];\n readonly unstable_data: readonly ReadonlyJSONValue[];\n readonly steps: readonly {\n readonly usage?: {\n readonly inputTokens: number;\n readonly outputTokens: number;\n };\n }[];\n readonly custom: ReadonlyJSONObject;\n };\n};\n\nconst encodeAttachmentPart = (\n part: CompleteAttachment[\"content\"][number],\n): AuiV0AttachmentPart => {\n const type = part.type;\n switch (type) {\n case \"text\":\n return { type: \"text\", text: part.text };\n\n case \"image\":\n return {\n type: \"image\",\n image: part.image,\n ...(part.filename != null ? { filename: part.filename } : undefined),\n };\n\n case \"file\":\n return {\n type: \"file\",\n data: part.data,\n mimeType: part.mimeType,\n ...(part.filename != null ? { filename: part.filename } : undefined),\n ...(part.sourceType != null\n ? { sourceType: part.sourceType }\n : undefined),\n };\n\n case \"audio\":\n return {\n type: \"audio\",\n audio: { data: part.audio.data, format: part.audio.format },\n };\n\n case \"data\": {\n if (!isJSONValue(part.data)) {\n console.warn(`attachment data is not JSON! ${JSON.stringify(part)}`);\n }\n return {\n type: \"data\",\n name: part.name,\n data: part.data as ReadonlyJSONValue,\n };\n }\n\n default: {\n const unhandledType: never = type;\n throw new Error(\n `Attachment part type not supported by aui/v0: ${unhandledType}`,\n );\n }\n }\n};\n\nconst encodeAttachments = (\n message: ThreadMessage,\n): readonly AuiV0Attachment[] | undefined => {\n if (message.role !== \"user\" || message.attachments.length === 0) {\n return undefined;\n }\n\n return message.attachments.map(\n ({ id, type, name, contentType, status, content }) => ({\n id,\n type,\n name,\n status,\n ...(contentType != null ? { contentType } : undefined),\n content: content.map(encodeAttachmentPart),\n }),\n );\n};\n\nexport function auiV0Encode(message: ThreadMessage): AuiV0Message {\n // info: ID and createdAt are ignored (we use the server value instead)\n const status: MessageStatus | undefined =\n message.status?.type === \"running\"\n ? { type: \"incomplete\", reason: \"cancelled\" }\n : message.status;\n const attachments = encodeAttachments(message);\n\n return {\n role: message.role,\n content: message.content.map((part) => {\n const type = part.type;\n switch (type) {\n case \"text\":\n return { type: \"text\", text: part.text };\n\n case \"reasoning\":\n return {\n type: \"reasoning\",\n text: part.text,\n ...(part.unstable_summary !== undefined\n ? { unstable_summary: part.unstable_summary }\n : undefined),\n };\n\n case \"source\":\n if (part.sourceType === \"url\") {\n return {\n type: \"source\",\n sourceType: \"url\",\n id: part.id,\n url: part.url,\n ...(part.title != null ? { title: part.title } : undefined),\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : undefined),\n };\n }\n\n return {\n type: \"source\",\n sourceType: \"document\",\n id: part.id,\n title: part.title,\n mediaType: part.mediaType,\n ...(part.filename != null\n ? { filename: part.filename }\n : undefined),\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : undefined),\n };\n\n case \"tool-call\": {\n if (part.result !== undefined && !isJSONValue(part.result)) {\n console.warn(\n `tool-call result is not JSON! ${JSON.stringify(part)}`,\n );\n }\n return {\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n ...(JSON.stringify(part.args) === part.argsText\n ? { args: part.args }\n : { argsText: part.argsText }),\n ...(part.result !== undefined\n ? { result: part.result as ReadonlyJSONValue }\n : undefined),\n ...(part.isError ? { isError: true } : undefined),\n ...(part.approval ? { approval: part.approval } : undefined),\n };\n }\n\n case \"image\":\n return { type: \"image\", image: part.image };\n\n case \"file\":\n return {\n type: \"file\",\n data: part.data,\n mimeType: part.mimeType,\n ...(part.filename ? { filename: part.filename } : undefined),\n ...(part.sourceType ? { sourceType: part.sourceType } : undefined),\n };\n\n case \"data\": {\n if (!isJSONValue(part.data)) {\n console.warn(`data part is not JSON! ${JSON.stringify(part)}`);\n }\n return {\n type: \"data\",\n name: part.name,\n data: part.data as ReadonlyJSONValue,\n };\n }\n\n default: {\n const unhandledType: \"audio\" | \"generative-ui\" = type;\n throw new Error(\n `Message part type not supported by aui/v0: ${unhandledType}`,\n );\n }\n }\n }),\n metadata: message.metadata as AuiV0Message[\"metadata\"],\n ...(status ? { status } : undefined),\n ...(attachments ? { attachments } : undefined),\n };\n}\n\nexport function auiV0Decode(\n cloudMessage: CloudMessage & { format: \"aui/v0\" },\n): ExportedMessageRepositoryItem {\n const payload = cloudMessage.content as unknown as AuiV0Message;\n const message = fromThreadMessageLike(\n {\n id: cloudMessage.id,\n createdAt: cloudMessage.created_at,\n ...payload,\n },\n cloudMessage.id,\n { type: \"complete\", reason: \"unknown\" },\n );\n\n return {\n parentId: cloudMessage.parent_id,\n message,\n };\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useCloudThreadListAdapter.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/useCloudThreadListAdapter.tsx"],"mappings":";;;KAkBK;EACH;;KAGG;EACH,QAAQ;EAER,gBAAgB,QAAQ;EACxB,WAAW,qBAAqB;;cAerB,4BACX,SAAS,kCACR"}
1
+ {"version":3,"file":"useCloudThreadListAdapter.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/useCloudThreadListAdapter.tsx"],"mappings":";;;KAuBK;EACH;;KAGG;EACH,QAAQ;EAER,gBAAgB,QAAQ;EACxB,WAAW,qBAAqB;;cAsCrB,4BACX,SAAS,kCACR"}
@@ -3,7 +3,7 @@ import { InMemoryThreadListAdapter } from "../../../runtimes/remote-thread-list/
3
3
  import { RuntimeAdapterProvider } from "../RuntimeAdapterProvider.js";
4
4
  import { useAssistantCloudThreadHistoryAdapter } from "./AssistantCloudThreadHistoryAdapter.js";
5
5
  import { CloudFileAttachmentAdapter } from "./CloudFileAttachmentAdapter.js";
6
- import { useCallback, useEffect, useMemo, useRef } from "@assistant-ui/tap/react-shim";
6
+ import { useCallback, useEffect, useMemo, useRef, useState } from "@assistant-ui/tap/react-shim";
7
7
  import { jsx } from "react/jsx-runtime";
8
8
  import { AssistantCloud } from "assistant-cloud";
9
9
  //#region src/react/runtimes/cloud/useCloudThreadListAdapter.tsx
@@ -14,21 +14,26 @@ const autoCloud = baseUrl ? new AssistantCloud({
14
14
  anonymous: true
15
15
  }) : void 0;
16
16
  const CLOUD_THREAD_PAGE_SIZE = 20;
17
+ const useCloudThreadListAdapters = (adapterRef) => {
18
+ const history = useAssistantCloudThreadHistoryAdapter({ get current() {
19
+ return adapterRef.current.cloud ?? autoCloud;
20
+ } });
21
+ const [attachments] = useState(() => new CloudFileAttachmentAdapter(() => adapterRef.current.cloud ?? autoCloud));
22
+ return useMemo(() => ({
23
+ history,
24
+ attachments
25
+ }), [history, attachments]);
26
+ };
17
27
  const useCloudThreadListAdapter = (adapter) => {
18
28
  const adapterRef = useRef(adapter);
19
29
  useEffect(() => {
20
30
  adapterRef.current = adapter;
21
31
  }, [adapter]);
32
+ const unstable_useAdapters = useCallback(function useCloudAdapters() {
33
+ return useCloudThreadListAdapters(adapterRef);
34
+ }, []);
22
35
  const unstable_Provider = useCallback(function Provider({ children }) {
23
- const history = useAssistantCloudThreadHistoryAdapter({ get current() {
24
- return adapterRef.current.cloud ?? autoCloud;
25
- } });
26
- const cloudInstance = adapterRef.current.cloud ?? autoCloud;
27
- const attachments = useMemo(() => new CloudFileAttachmentAdapter(cloudInstance), [cloudInstance]);
28
- const adapters = useMemo(() => ({
29
- history,
30
- attachments
31
- }), [history, attachments]);
36
+ const adapters = useCloudThreadListAdapters(adapterRef);
32
37
  return /* @__PURE__ */ jsx(RuntimeAdapterProvider, {
33
38
  adapters,
34
39
  children
@@ -115,9 +120,14 @@ const useCloudThreadListAdapter = (adapter) => {
115
120
  custom: toCustom(thread.metadata)
116
121
  };
117
122
  },
118
- unstable_Provider
123
+ unstable_Provider,
124
+ unstable_useAdapters
119
125
  };
120
- }, [cloud, unstable_Provider]);
126
+ }, [
127
+ cloud,
128
+ unstable_Provider,
129
+ unstable_useAdapters
130
+ ]);
121
131
  };
122
132
  //#endregion
123
133
  export { useCloudThreadListAdapter };
@@ -1 +1 @@
1
- {"version":3,"file":"useCloudThreadListAdapter.js","names":["process","env","Record","FC","PropsWithChildren","useCallback","useEffect","useMemo","useRef","AssistantCloud","RemoteThreadListAdapter","InMemoryThreadListAdapter","useAssistantCloudThreadHistoryAdapter","RuntimeAdapterProvider","CloudFileAttachmentAdapter","isRecord","ThreadData","externalId","CloudThreadListAdapterOptions","cloud","create","Promise","delete","threadId","toCustom","value","undefined","baseUrl","NEXT_PUBLIC_ASSISTANT_BASE_URL","autoCloud","anonymous","CLOUD_THREAD_PAGE_SIZE","useCloudThreadListAdapter","adapter","adapterRef","current","unstable_Provider","Provider","children","history","cloudInstance","attachments","adapters","ref","inMemory","initialize","result","remoteId","list","after","threads","limit","map","t","status","is_archived","id","title","lastMessageAt","last_message_at","Date","external_id","custom","metadata","nextCursor","length","at","createTask","resolve","thread_id","rename","newTitle","update","updateCustom","archive","unarchive","generateTitle","messages","filteredMessages","msg","content","filter","part","type","runs","stream","assistant_id","fetch","thread","get"],"sources":["../../../../src/react/runtimes/cloud/useCloudThreadListAdapter.tsx"],"sourcesContent":["declare const process: { env: Record<string, string | undefined> };\n\nimport {\n type FC,\n type PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { AssistantCloud } from \"assistant-cloud\";\nimport type { RemoteThreadListAdapter } from \"../../../runtimes/remote-thread-list/types\";\nimport { InMemoryThreadListAdapter } from \"../../../runtimes/remote-thread-list/adapter/in-memory\";\nimport { useAssistantCloudThreadHistoryAdapter } from \"./AssistantCloudThreadHistoryAdapter\";\nimport { RuntimeAdapterProvider } from \"../RuntimeAdapterProvider\";\nimport { CloudFileAttachmentAdapter } from \"./CloudFileAttachmentAdapter\";\nimport { isRecord } from \"../../../utils/json/is-json\";\n\ntype ThreadData = {\n externalId: string | undefined;\n};\n\ntype CloudThreadListAdapterOptions = {\n cloud?: AssistantCloud | undefined;\n\n create?: (() => Promise<ThreadData>) | undefined;\n delete?: ((threadId: string) => Promise<void>) | undefined;\n};\n\nconst toCustom = (value: unknown): Record<string, unknown> | undefined =>\n isRecord(value) ? value : undefined;\n\nconst baseUrl =\n typeof process !== \"undefined\" &&\n process?.env?.NEXT_PUBLIC_ASSISTANT_BASE_URL;\nconst autoCloud = baseUrl\n ? new AssistantCloud({ baseUrl, anonymous: true })\n : undefined;\n\nconst CLOUD_THREAD_PAGE_SIZE = 20;\n\nexport const useCloudThreadListAdapter = (\n adapter: CloudThreadListAdapterOptions,\n): RemoteThreadListAdapter => {\n const adapterRef = useRef(adapter);\n useEffect(() => {\n adapterRef.current = adapter;\n }, [adapter]);\n\n const unstable_Provider = useCallback<FC<PropsWithChildren>>(\n function Provider({ children }) {\n const history = useAssistantCloudThreadHistoryAdapter({\n get current() {\n return adapterRef.current.cloud ?? autoCloud!;\n },\n });\n const cloudInstance = adapterRef.current.cloud ?? autoCloud!;\n const attachments = useMemo(\n () => new CloudFileAttachmentAdapter(cloudInstance),\n [cloudInstance],\n );\n\n const adapters = useMemo(\n () => ({\n history,\n attachments,\n }),\n [history, attachments],\n );\n\n return (\n <RuntimeAdapterProvider adapters={adapters}>\n {children}\n </RuntimeAdapterProvider>\n );\n },\n [],\n );\n\n const cloud = adapter.cloud ?? autoCloud;\n return useMemo<RemoteThreadListAdapter>(() => {\n if (!cloud) {\n const ref = adapterRef;\n const inMemory = new InMemoryThreadListAdapter();\n inMemory.initialize = async (threadId: string) => {\n const result = await ref.current.create?.();\n return { remoteId: threadId, externalId: result?.externalId };\n };\n return inMemory;\n }\n\n return {\n list: async ({ after } = {}) => {\n const { threads } = await cloud.threads.list({\n limit: CLOUD_THREAD_PAGE_SIZE,\n ...(after ? { after } : {}),\n });\n return {\n threads: threads.map((t) => ({\n status: t.is_archived ? \"archived\" : \"regular\",\n remoteId: t.id,\n title: t.title,\n lastMessageAt: t.last_message_at\n ? new Date(t.last_message_at)\n : undefined,\n externalId: t.external_id ?? undefined,\n custom: toCustom(t.metadata),\n })),\n nextCursor:\n threads.length === CLOUD_THREAD_PAGE_SIZE\n ? threads.at(-1)?.id\n : undefined,\n };\n },\n\n initialize: async () => {\n const createTask = adapterRef.current.create?.() ?? Promise.resolve();\n const t = await createTask;\n const external_id = t ? t.externalId : undefined;\n const { thread_id: remoteId } = await cloud.threads.create({\n last_message_at: new Date(),\n external_id,\n });\n\n return { externalId: external_id, remoteId: remoteId };\n },\n\n rename: async (threadId, newTitle) => {\n return cloud.threads.update(threadId, { title: newTitle });\n },\n updateCustom: async (threadId, custom) => {\n return cloud.threads.update(threadId, { metadata: custom ?? null });\n },\n archive: async (threadId) => {\n return cloud.threads.update(threadId, { is_archived: true });\n },\n unarchive: async (threadId) => {\n return cloud.threads.update(threadId, { is_archived: false });\n },\n delete: async (threadId) => {\n await adapterRef.current.delete?.(threadId);\n return cloud.threads.delete(threadId);\n },\n\n generateTitle: async (threadId, messages) => {\n // Filter messages to only include content types the title generator understands\n // (reasoning, source, etc. are not needed for title generation)\n // TODO serialize these to a more efficient format\n const filteredMessages = messages.map((msg) => ({\n ...msg,\n content: msg.content.filter(\n (part) => part.type === \"text\" || part.type === \"tool-call\",\n ),\n }));\n\n return cloud.runs.stream({\n thread_id: threadId,\n assistant_id: \"system/thread_title\",\n messages: filteredMessages,\n });\n },\n\n fetch: async (threadId: string) => {\n const thread = await cloud.threads.get(threadId);\n return {\n status: thread.is_archived ? \"archived\" : \"regular\",\n remoteId: thread.id,\n title: thread.title,\n lastMessageAt: thread.last_message_at\n ? new Date(thread.last_message_at)\n : undefined,\n externalId: thread.external_id ?? undefined,\n custom: toCustom(thread.metadata),\n };\n },\n\n unstable_Provider,\n };\n }, [cloud, unstable_Provider]);\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"useCloudThreadListAdapter.js","names":["process","env","Record","FC","PropsWithChildren","RefObject","useCallback","useEffect","useMemo","useRef","useState","AssistantCloud","RemoteThreadListAdapter","InMemoryThreadListAdapter","useAssistantCloudThreadHistoryAdapter","RuntimeAdapterProvider","RuntimeAdapters","CloudFileAttachmentAdapter","isRecord","ThreadData","externalId","CloudThreadListAdapterOptions","cloud","create","Promise","delete","threadId","toCustom","value","undefined","baseUrl","NEXT_PUBLIC_ASSISTANT_BASE_URL","autoCloud","anonymous","CLOUD_THREAD_PAGE_SIZE","useCloudThreadListAdapters","adapterRef","history","current","attachments","useCloudThreadListAdapter","adapter","unstable_useAdapters","useCloudAdapters","unstable_Provider","Provider","children","adapters","ref","inMemory","initialize","result","remoteId","list","after","threads","limit","map","t","status","is_archived","id","title","lastMessageAt","last_message_at","Date","external_id","custom","metadata","nextCursor","length","at","createTask","resolve","thread_id","rename","newTitle","update","updateCustom","archive","unarchive","generateTitle","messages","filteredMessages","msg","content","filter","part","type","runs","stream","assistant_id","fetch","thread","get"],"sources":["../../../../src/react/runtimes/cloud/useCloudThreadListAdapter.tsx"],"sourcesContent":["declare const process: { env: Record<string, string | undefined> };\n\nimport {\n type FC,\n type PropsWithChildren,\n type RefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { AssistantCloud } from \"assistant-cloud\";\nimport type { RemoteThreadListAdapter } from \"../../../runtimes/remote-thread-list/types\";\nimport { InMemoryThreadListAdapter } from \"../../../runtimes/remote-thread-list/adapter/in-memory\";\nimport { useAssistantCloudThreadHistoryAdapter } from \"./AssistantCloudThreadHistoryAdapter\";\nimport {\n RuntimeAdapterProvider,\n type RuntimeAdapters,\n} from \"../RuntimeAdapterProvider\";\nimport { CloudFileAttachmentAdapter } from \"./CloudFileAttachmentAdapter\";\nimport { isRecord } from \"../../../utils/json/is-json\";\n\ntype ThreadData = {\n externalId: string | undefined;\n};\n\ntype CloudThreadListAdapterOptions = {\n cloud?: AssistantCloud | undefined;\n\n create?: (() => Promise<ThreadData>) | undefined;\n delete?: ((threadId: string) => Promise<void>) | undefined;\n};\n\nconst toCustom = (value: unknown): Record<string, unknown> | undefined =>\n isRecord(value) ? value : undefined;\n\nconst baseUrl =\n typeof process !== \"undefined\" &&\n process?.env?.NEXT_PUBLIC_ASSISTANT_BASE_URL;\nconst autoCloud = baseUrl\n ? new AssistantCloud({ baseUrl, anonymous: true })\n : undefined;\n\nconst CLOUD_THREAD_PAGE_SIZE = 20;\n\nconst useCloudThreadListAdapters = (\n adapterRef: RefObject<CloudThreadListAdapterOptions>,\n): RuntimeAdapters => {\n const history = useAssistantCloudThreadHistoryAdapter({\n get current() {\n return adapterRef.current.cloud ?? autoCloud!;\n },\n });\n const [attachments] = useState(\n () =>\n new CloudFileAttachmentAdapter(\n () => adapterRef.current.cloud ?? autoCloud!,\n ),\n );\n return useMemo(\n () => ({\n history,\n attachments,\n }),\n [history, attachments],\n );\n};\n\nexport const useCloudThreadListAdapter = (\n adapter: CloudThreadListAdapterOptions,\n): RemoteThreadListAdapter => {\n const adapterRef = useRef(adapter);\n useEffect(() => {\n adapterRef.current = adapter;\n }, [adapter]);\n\n const unstable_useAdapters = useCallback(function useCloudAdapters() {\n return useCloudThreadListAdapters(adapterRef);\n }, []);\n\n const unstable_Provider = useCallback<FC<PropsWithChildren>>(\n function Provider({ children }) {\n const adapters = useCloudThreadListAdapters(adapterRef);\n return (\n <RuntimeAdapterProvider adapters={adapters}>\n {children}\n </RuntimeAdapterProvider>\n );\n },\n [],\n );\n\n const cloud = adapter.cloud ?? autoCloud;\n return useMemo<RemoteThreadListAdapter>(() => {\n if (!cloud) {\n const ref = adapterRef;\n const inMemory = new InMemoryThreadListAdapter();\n inMemory.initialize = async (threadId: string) => {\n const result = await ref.current.create?.();\n return { remoteId: threadId, externalId: result?.externalId };\n };\n return inMemory;\n }\n\n return {\n list: async ({ after } = {}) => {\n const { threads } = await cloud.threads.list({\n limit: CLOUD_THREAD_PAGE_SIZE,\n ...(after ? { after } : {}),\n });\n return {\n threads: threads.map((t) => ({\n status: t.is_archived ? \"archived\" : \"regular\",\n remoteId: t.id,\n title: t.title,\n lastMessageAt: t.last_message_at\n ? new Date(t.last_message_at)\n : undefined,\n externalId: t.external_id ?? undefined,\n custom: toCustom(t.metadata),\n })),\n nextCursor:\n threads.length === CLOUD_THREAD_PAGE_SIZE\n ? threads.at(-1)?.id\n : undefined,\n };\n },\n\n initialize: async () => {\n const createTask = adapterRef.current.create?.() ?? Promise.resolve();\n const t = await createTask;\n const external_id = t ? t.externalId : undefined;\n const { thread_id: remoteId } = await cloud.threads.create({\n last_message_at: new Date(),\n external_id,\n });\n\n return { externalId: external_id, remoteId: remoteId };\n },\n\n rename: async (threadId, newTitle) => {\n return cloud.threads.update(threadId, { title: newTitle });\n },\n updateCustom: async (threadId, custom) => {\n return cloud.threads.update(threadId, { metadata: custom ?? null });\n },\n archive: async (threadId) => {\n return cloud.threads.update(threadId, { is_archived: true });\n },\n unarchive: async (threadId) => {\n return cloud.threads.update(threadId, { is_archived: false });\n },\n delete: async (threadId) => {\n await adapterRef.current.delete?.(threadId);\n return cloud.threads.delete(threadId);\n },\n\n generateTitle: async (threadId, messages) => {\n // Filter messages to only include content types the title generator understands\n // (reasoning, source, etc. are not needed for title generation)\n // TODO serialize these to a more efficient format\n const filteredMessages = messages.map((msg) => ({\n ...msg,\n content: msg.content.filter(\n (part) => part.type === \"text\" || part.type === \"tool-call\",\n ),\n }));\n\n return cloud.runs.stream({\n thread_id: threadId,\n assistant_id: \"system/thread_title\",\n messages: filteredMessages,\n });\n },\n\n fetch: async (threadId: string) => {\n const thread = await cloud.threads.get(threadId);\n return {\n status: thread.is_archived ? \"archived\" : \"regular\",\n remoteId: thread.id,\n title: thread.title,\n lastMessageAt: thread.last_message_at\n ? new Date(thread.last_message_at)\n : undefined,\n externalId: thread.external_id ?? undefined,\n custom: toCustom(thread.metadata),\n };\n },\n\n unstable_Provider,\n unstable_useAdapters,\n };\n }, [cloud, unstable_Provider, unstable_useAdapters]);\n};\n"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { AssistantRuntime } from "../../../runtime/api/assistant-runtime.js";
2
+ import { AssistantCloud } from "assistant-cloud";
3
+ //#region src/react/runtimes/cloud/useCloudThreadListRuntime.d.ts
4
+ type ThreadData = {
5
+ externalId: string;
6
+ };
7
+ type CloudThreadListAdapter = {
8
+ cloud: AssistantCloud;
9
+ runtimeHook: () => AssistantRuntime;
10
+ create?(): Promise<ThreadData>;
11
+ delete?(threadId: string): Promise<void>;
12
+ };
13
+ declare function useCloudThreadListRuntime({ runtimeHook, ...adapterOptions }: CloudThreadListAdapter): AssistantRuntime;
14
+ //#endregion
15
+ export { useCloudThreadListRuntime };
16
+ //# sourceMappingURL=useCloudThreadListRuntime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCloudThreadListRuntime.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/useCloudThreadListRuntime.ts"],"mappings":";;;KAOK;EACH;;KAGG;EACH,OAAO;EAEP,mBAAmB;EAEnB,WAAW,QAAQ;EACnB,QAAQ,mBAAmB;;iBAGb,4BACd,gBACG,kBACF,yBAAsB"}
@@ -0,0 +1,36 @@
1
+ "use client";
2
+ import { useRemoteThreadListRuntime } from "../useRemoteThreadListRuntime.js";
3
+ import { useCloudThreadListAdapter } from "./useCloudThreadListAdapter.js";
4
+ import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
5
+ //#region src/react/runtimes/cloud/useCloudThreadListRuntime.ts
6
+ function useCloudThreadListRuntime(t0) {
7
+ const $ = c(6);
8
+ let adapterOptions;
9
+ let runtimeHook;
10
+ if ($[0] !== t0) {
11
+ ({runtimeHook, ...adapterOptions} = t0);
12
+ $[0] = t0;
13
+ $[1] = adapterOptions;
14
+ $[2] = runtimeHook;
15
+ } else {
16
+ adapterOptions = $[1];
17
+ runtimeHook = $[2];
18
+ }
19
+ const adapter = useCloudThreadListAdapter(adapterOptions);
20
+ let t1;
21
+ if ($[3] !== adapter || $[4] !== runtimeHook) {
22
+ t1 = {
23
+ runtimeHook,
24
+ adapter,
25
+ allowNesting: true
26
+ };
27
+ $[3] = adapter;
28
+ $[4] = runtimeHook;
29
+ $[5] = t1;
30
+ } else t1 = $[5];
31
+ return useRemoteThreadListRuntime(t1);
32
+ }
33
+ //#endregion
34
+ export { useCloudThreadListRuntime };
35
+
36
+ //# sourceMappingURL=useCloudThreadListRuntime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCloudThreadListRuntime.js","names":["c","_c","AssistantCloud","AssistantRuntime","useRemoteThreadListRuntime","useCloudThreadListAdapter","ThreadData","externalId","CloudThreadListAdapter","cloud","runtimeHook","create","Promise","delete","threadId","useCloudThreadListRuntime","t0","$","adapterOptions","adapter","t1","allowNesting"],"sources":["../../../../src/react/runtimes/cloud/useCloudThreadListRuntime.ts"],"sourcesContent":["\"use client\";\n\nimport type { AssistantCloud } from \"assistant-cloud\";\nimport type { AssistantRuntime } from \"../../../runtime/api/assistant-runtime\";\nimport { useRemoteThreadListRuntime } from \"../useRemoteThreadListRuntime\";\nimport { useCloudThreadListAdapter } from \"./useCloudThreadListAdapter\";\n\ntype ThreadData = {\n externalId: string;\n};\n\ntype CloudThreadListAdapter = {\n cloud: AssistantCloud;\n\n runtimeHook: () => AssistantRuntime;\n\n create?(): Promise<ThreadData>;\n delete?(threadId: string): Promise<void>;\n};\n\nexport function useCloudThreadListRuntime({\n runtimeHook,\n ...adapterOptions\n}: CloudThreadListAdapter) {\n const adapter = useCloudThreadListAdapter(adapterOptions);\n return useRemoteThreadListRuntime({\n runtimeHook,\n adapter,\n allowNesting: true,\n });\n}\n"],"mappings":";;;;;AAoBA,SAAOe,0BAAAC,IAAA;CAAA,MAAAC,IAAAhB,EAAA,CAAA;CAAA,IAAAiB;CAAA,IAAAR;CAAA,IAAAO,EAAA,OAAAD,IAAA;EAAmC,CAAA,CAAAN,gBAAAQ,kBAAAF;EAGjBC,EAAA,KAAAD;EAAAC,EAAA,KAAAC;EAAAD,EAAA,KAAAP;CAAA,OAAA;EAAAQ,iBAAAD,EAAA;EAAAP,cAAAO,EAAA;CAAA;CACvB,MAAAE,UAAgBd,0BAA0Ba,cAAc;CAAE,IAAAE;CAAA,IAAAH,EAAA,OAAAE,WAAAF,EAAA,OAAAP,aAAA;EACxBU,KAAA;GAAAV;GAAAS;GAAAE,cAGlB;EAChB;EAACJ,EAAA,KAAAE;EAAAF,EAAA,KAAAP;EAAAO,EAAA,KAAAG;CAAA,OAAAA,KAAAH,EAAA;CAAA,OAJMb,2BAA2BgB,EAIjC;AAAC"}