@assistant-ui/core 0.3.16 → 0.3.18

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 (474) hide show
  1. package/dist/adapters/attachment.d.ts.map +1 -1
  2. package/dist/adapters/attachment.js +5 -4
  3. package/dist/adapters/attachment.js.map +1 -1
  4. package/dist/index.d.ts +3 -3
  5. package/dist/index.js +2 -2
  6. package/dist/index.js.map +1 -1
  7. package/dist/internal.d.ts +4 -2
  8. package/dist/internal.js +4 -2
  9. package/dist/model-context/frame/host.d.ts.map +1 -1
  10. package/dist/model-context/frame/host.js +10 -4
  11. package/dist/model-context/frame/host.js.map +1 -1
  12. package/dist/model-context/frame/provider.d.ts +5 -0
  13. package/dist/model-context/frame/provider.d.ts.map +1 -1
  14. package/dist/model-context/frame/provider.js +101 -28
  15. package/dist/model-context/frame/provider.js.map +1 -1
  16. package/dist/model-context/interactable-composer-metadata.d.ts.map +1 -1
  17. package/dist/model-context/interactable-composer-metadata.js +16 -9
  18. package/dist/model-context/interactable-composer-metadata.js.map +1 -1
  19. package/dist/model-context/registry.d.ts.map +1 -1
  20. package/dist/model-context/registry.js +3 -5
  21. package/dist/model-context/registry.js.map +1 -1
  22. package/dist/model-context/tool-call-text.d.ts +26 -0
  23. package/dist/model-context/tool-call-text.d.ts.map +1 -0
  24. package/dist/model-context/tool-call-text.js +18 -0
  25. package/dist/model-context/tool-call-text.js.map +1 -0
  26. package/dist/model-context/types.d.ts.map +1 -1
  27. package/dist/model-context/types.js +5 -4
  28. package/dist/model-context/types.js.map +1 -1
  29. package/dist/react/RuntimeAdapter.js +1 -1
  30. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
  31. package/dist/react/adapters/LocalStorageThreadListAdapter.js +1 -1
  32. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  33. package/dist/react/client/AdaptedRemoteThread.js +1 -1
  34. package/dist/react/client/InMemoryThreadList.d.ts.map +1 -1
  35. package/dist/react/client/InMemoryThreadList.js +63 -57
  36. package/dist/react/client/InMemoryThreadList.js.map +1 -1
  37. package/dist/react/client/Interactables.d.ts.map +1 -1
  38. package/dist/react/client/Interactables.js +25 -28
  39. package/dist/react/client/Interactables.js.map +1 -1
  40. package/dist/react/client/RemoteThreadList.d.ts +16 -0
  41. package/dist/react/client/RemoteThreadList.d.ts.map +1 -1
  42. package/dist/react/client/RemoteThreadList.js +354 -242
  43. package/dist/react/client/RemoteThreadList.js.map +1 -1
  44. package/dist/react/client/Tools.d.ts.map +1 -1
  45. package/dist/react/client/Tools.js +24 -18
  46. package/dist/react/client/Tools.js.map +1 -1
  47. package/dist/react/index.d.ts +2 -1
  48. package/dist/react/index.js +2 -1
  49. package/dist/react/interactables-legacy/Interactables.js +246 -125
  50. package/dist/react/interactables-legacy/Interactables.js.map +1 -1
  51. package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts.map +1 -1
  52. package/dist/react/interactables-shared/useInteractablePersistenceQueue.js +11 -9
  53. package/dist/react/interactables-shared/useInteractablePersistenceQueue.js.map +1 -1
  54. package/dist/react/model-context/makeAssistantTool.d.ts +2 -2
  55. package/dist/react/model-context/makeAssistantTool.js +1 -1
  56. package/dist/react/model-context/makeAssistantTool.js.map +1 -1
  57. package/dist/react/model-context/toolbox.d.ts +2 -14
  58. package/dist/react/model-context/toolbox.d.ts.map +1 -1
  59. package/dist/react/model-context/toolbox.js +1 -13
  60. package/dist/react/model-context/toolbox.js.map +1 -1
  61. package/dist/react/model-context/useAssistantContext.js +37 -7
  62. package/dist/react/model-context/useAssistantContext.js.map +1 -1
  63. package/dist/react/model-context/useAssistantTool.d.ts +2 -2
  64. package/dist/react/model-context/useAssistantTool.js +1 -1
  65. package/dist/react/model-context/useAssistantTool.js.map +1 -1
  66. package/dist/react/model-context/useAuiToolOverrides.js +31 -5
  67. package/dist/react/model-context/useAuiToolOverrides.js.map +1 -1
  68. package/dist/react/model-context/useInlineRender.d.ts.map +1 -1
  69. package/dist/react/model-context/useInlineRender.js +10 -36
  70. package/dist/react/model-context/useInlineRender.js.map +1 -1
  71. package/dist/react/model-context/useToolArgsStatus.d.ts.map +1 -1
  72. package/dist/react/model-context/useToolArgsStatus.js +2 -1
  73. package/dist/react/model-context/useToolArgsStatus.js.map +1 -1
  74. package/dist/react/primitive-hooks/useMessageError.d.ts.map +1 -1
  75. package/dist/react/primitive-hooks/useMessageError.js +2 -8
  76. package/dist/react/primitive-hooks/useMessageError.js.map +1 -1
  77. package/dist/react/primitive-hooks/useThreadListLoadMore.d.ts.map +1 -1
  78. package/dist/react/primitive-hooks/useThreadListLoadMore.js +2 -4
  79. package/dist/react/primitive-hooks/useThreadListLoadMore.js.map +1 -1
  80. package/dist/react/primitives/composer/ComposerAttachments.d.ts.map +1 -1
  81. package/dist/react/primitives/composer/ComposerAttachments.js +4 -3
  82. package/dist/react/primitives/composer/ComposerAttachments.js.map +1 -1
  83. package/dist/react/primitives/composer/ComposerQueue.d.ts.map +1 -1
  84. package/dist/react/primitives/composer/ComposerQueue.js +4 -3
  85. package/dist/react/primitives/composer/ComposerQueue.js.map +1 -1
  86. package/dist/react/primitives/message/MessageAttachments.d.ts.map +1 -1
  87. package/dist/react/primitives/message/MessageAttachments.js +7 -6
  88. package/dist/react/primitives/message/MessageAttachments.js.map +1 -1
  89. package/dist/react/primitives/message/MessageGroupedParts.js +2 -2
  90. package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
  91. package/dist/react/primitives/message/MessageParts.js +3 -3
  92. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  93. package/dist/react/primitives/threadList/ThreadListItems.d.ts.map +1 -1
  94. package/dist/react/primitives/threadList/ThreadListItems.js +5 -4
  95. package/dist/react/primitives/threadList/ThreadListItems.js.map +1 -1
  96. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +6 -4
  97. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  98. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +59 -29
  99. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  100. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +11 -6
  101. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  102. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +160 -143
  103. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  104. package/dist/react/runtimes/RemoteThreadResource.d.ts +2 -6
  105. package/dist/react/runtimes/RemoteThreadResource.d.ts.map +1 -1
  106. package/dist/react/runtimes/RemoteThreadResource.js +15 -13
  107. package/dist/react/runtimes/RemoteThreadResource.js.map +1 -1
  108. package/dist/react/runtimes/assistant-transport/useLatestRef.js +2 -2
  109. package/dist/react/runtimes/assistant-transport/useLatestRef.js.map +1 -1
  110. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +4 -1
  111. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  112. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +424 -52
  113. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  114. package/dist/react/runtimes/cloud/auiV0.d.ts +5 -1
  115. package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
  116. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  117. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts +29 -0
  118. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts.map +1 -0
  119. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.js +160 -0
  120. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.js.map +1 -0
  121. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts +1 -9
  122. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
  123. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +16 -153
  124. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  125. package/dist/react/runtimes/external-message-converter.js +1 -1
  126. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  127. package/dist/react/runtimes/useExternalStoreRuntime.js +75 -46
  128. package/dist/react/runtimes/useExternalStoreRuntime.js.map +1 -1
  129. package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts.map +1 -1
  130. package/dist/react/runtimes/useRemoteThreadListRuntime.js +77 -29
  131. package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
  132. package/dist/react/types/MessagePartComponentTypes.d.ts +7 -3
  133. package/dist/react/types/MessagePartComponentTypes.d.ts.map +1 -1
  134. package/dist/react/types/scopes/tools.d.ts +2 -0
  135. package/dist/react/types/scopes/tools.d.ts.map +1 -1
  136. package/dist/runtime/api/message-part-runtime.d.ts +2 -2
  137. package/dist/runtime/api/message-part-runtime.d.ts.map +1 -1
  138. package/dist/runtime/api/message-part-runtime.js +1 -1
  139. package/dist/runtime/api/message-part-runtime.js.map +1 -1
  140. package/dist/runtime/api/thread-list-item-runtime.d.ts +7 -3
  141. package/dist/runtime/api/thread-list-item-runtime.d.ts.map +1 -1
  142. package/dist/runtime/api/thread-list-item-runtime.js +2 -2
  143. package/dist/runtime/api/thread-list-item-runtime.js.map +1 -1
  144. package/dist/runtime/api/thread-list-runtime.d.ts +12 -1
  145. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  146. package/dist/runtime/api/thread-list-runtime.js +23 -14
  147. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  148. package/dist/runtime/api/thread-runtime.d.ts +5 -1
  149. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  150. package/dist/runtime/api/thread-runtime.js +1 -1
  151. package/dist/runtime/api/thread-runtime.js.map +1 -1
  152. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  153. package/dist/runtime/base/base-composer-runtime-core.js +16 -12
  154. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  155. package/dist/runtime/base/base-thread-runtime-core.d.ts +2 -2
  156. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  157. package/dist/runtime/base/base-thread-runtime-core.js +8 -7
  158. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  159. package/dist/runtime/interfaces/composer-runtime-core.d.ts +12 -5
  160. package/dist/runtime/interfaces/composer-runtime-core.d.ts.map +1 -1
  161. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +18 -3
  162. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
  163. package/dist/runtime/interfaces/thread-runtime-core.d.ts +15 -1
  164. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  165. package/dist/runtime/utils/auto-status.d.ts +1 -1
  166. package/dist/runtime/utils/auto-status.d.ts.map +1 -1
  167. package/dist/runtime/utils/auto-status.js +6 -2
  168. package/dist/runtime/utils/auto-status.js.map +1 -1
  169. package/dist/runtime/utils/external-message-conversion.d.ts +3 -2
  170. package/dist/runtime/utils/external-message-conversion.d.ts.map +1 -1
  171. package/dist/runtime/utils/external-message-conversion.js +5 -4
  172. package/dist/runtime/utils/external-message-conversion.js.map +1 -1
  173. package/dist/runtime/utils/message-repository.d.ts +1 -0
  174. package/dist/runtime/utils/message-repository.d.ts.map +1 -1
  175. package/dist/runtime/utils/message-repository.js +15 -6
  176. package/dist/runtime/utils/message-repository.js.map +1 -1
  177. package/dist/runtime/utils/resolveToolApprovalResponse.d.ts +6 -3
  178. package/dist/runtime/utils/resolveToolApprovalResponse.d.ts.map +1 -1
  179. package/dist/runtime/utils/resolveToolApprovalResponse.js +12 -3
  180. package/dist/runtime/utils/resolveToolApprovalResponse.js.map +1 -1
  181. package/dist/runtime/utils/thread-message-like.d.ts +2 -10
  182. package/dist/runtime/utils/thread-message-like.d.ts.map +1 -1
  183. package/dist/runtime/utils/thread-message-like.js +1 -1
  184. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  185. package/dist/runtime/utils/tool-call-tree.d.ts +39 -0
  186. package/dist/runtime/utils/tool-call-tree.d.ts.map +1 -0
  187. package/dist/runtime/utils/tool-call-tree.js +85 -0
  188. package/dist/runtime/utils/tool-call-tree.js.map +1 -0
  189. package/dist/runtimes/external-store/external-store-adapter.d.ts +29 -2
  190. package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
  191. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  192. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +21 -27
  193. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  194. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +2 -1
  195. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  196. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +34 -28
  197. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  198. package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts +1 -1
  199. package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts.map +1 -1
  200. package/dist/runtimes/inert/InertThreadRuntimeCore.js.map +1 -1
  201. package/dist/runtimes/internal.d.ts +2 -2
  202. package/dist/runtimes/internal.js +2 -2
  203. package/dist/runtimes/local/local-thread-runtime-core.d.ts +1 -1
  204. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  205. package/dist/runtimes/local/local-thread-runtime-core.js +3 -1
  206. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  207. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +18 -1
  208. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -1
  209. package/dist/runtimes/remote-thread-list/remote-thread-state.js +148 -43
  210. package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
  211. package/dist/runtimes/remote-thread-list/title-generation.d.ts +49 -0
  212. package/dist/runtimes/remote-thread-list/title-generation.d.ts.map +1 -0
  213. package/dist/runtimes/remote-thread-list/title-generation.js +197 -0
  214. package/dist/runtimes/remote-thread-list/title-generation.js.map +1 -0
  215. package/dist/runtimes/remote-thread-list/title.d.ts +11 -0
  216. package/dist/runtimes/remote-thread-list/title.d.ts.map +1 -0
  217. package/dist/runtimes/remote-thread-list/title.js +14 -0
  218. package/dist/runtimes/remote-thread-list/title.js.map +1 -0
  219. package/dist/runtimes/remote-thread-list/types.d.ts +16 -5
  220. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  221. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts +31 -8
  222. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
  223. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +97 -60
  224. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  225. package/dist/store/clients/external-thread.d.ts +1 -1
  226. package/dist/store/clients/external-thread.d.ts.map +1 -1
  227. package/dist/store/clients/external-thread.js +30 -7
  228. package/dist/store/clients/external-thread.js.map +1 -1
  229. package/dist/store/clients/model-context-client.d.ts.map +1 -1
  230. package/dist/store/clients/model-context-client.js +2 -1
  231. package/dist/store/clients/model-context-client.js.map +1 -1
  232. package/dist/store/clients/single-thread-list.d.ts.map +1 -1
  233. package/dist/store/clients/single-thread-list.js +2 -1
  234. package/dist/store/clients/single-thread-list.js.map +1 -1
  235. package/dist/store/clients/suggestions.d.ts.map +1 -1
  236. package/dist/store/clients/suggestions.js +19 -6
  237. package/dist/store/clients/suggestions.js.map +1 -1
  238. package/dist/store/clients/thread-message-client.js +1 -1
  239. package/dist/store/clients/thread-selection-events.js +1 -1
  240. package/dist/store/index.d.ts +2 -1
  241. package/dist/store/index.js +2 -1
  242. package/dist/store/internal.d.ts +2 -2
  243. package/dist/store/internal.js +2 -2
  244. package/dist/store/primitive-predicates.d.ts +4 -1
  245. package/dist/store/primitive-predicates.d.ts.map +1 -1
  246. package/dist/store/primitive-predicates.js +9 -1
  247. package/dist/store/primitive-predicates.js.map +1 -1
  248. package/dist/store/runtime-clients/composer-runtime-client.d.ts +1 -0
  249. package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
  250. package/dist/store/runtime-clients/composer-runtime-client.js +98 -62
  251. package/dist/store/runtime-clients/composer-runtime-client.js.map +1 -1
  252. package/dist/store/runtime-clients/message-runtime-client.d.ts +1 -0
  253. package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
  254. package/dist/store/runtime-clients/message-runtime-client.js +221 -144
  255. package/dist/store/runtime-clients/message-runtime-client.js.map +1 -1
  256. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  257. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +2 -2
  258. package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
  259. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  260. package/dist/store/runtime-clients/thread-list-runtime-client.js +128 -107
  261. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  262. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  263. package/dist/store/runtime-clients/thread-runtime-client.js +194 -122
  264. package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
  265. package/dist/store/runtime-clients/useSubscribable.d.ts +3 -1
  266. package/dist/store/runtime-clients/useSubscribable.d.ts.map +1 -1
  267. package/dist/store/runtime-clients/useSubscribable.js +1 -1
  268. package/dist/store/runtime-clients/useSubscribable.js.map +1 -1
  269. package/dist/store/scopes/composer.d.ts +10 -2
  270. package/dist/store/scopes/composer.d.ts.map +1 -1
  271. package/dist/store/scopes/message.d.ts +30 -1
  272. package/dist/store/scopes/message.d.ts.map +1 -1
  273. package/dist/store/scopes/part.d.ts +6 -3
  274. package/dist/store/scopes/part.d.ts.map +1 -1
  275. package/dist/store/scopes/thread-list-item.d.ts +2 -2
  276. package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
  277. package/dist/store/scopes/thread.d.ts +8 -0
  278. package/dist/store/scopes/thread.d.ts.map +1 -1
  279. package/dist/store/scopes/threads.d.ts +1 -0
  280. package/dist/store/scopes/threads.d.ts.map +1 -1
  281. package/dist/subscribable/subscribable.d.ts +8 -1
  282. package/dist/subscribable/subscribable.d.ts.map +1 -1
  283. package/dist/subscribable/subscribable.js +24 -16
  284. package/dist/subscribable/subscribable.js.map +1 -1
  285. package/dist/types/attachment.d.ts +2 -1
  286. package/dist/types/attachment.d.ts.map +1 -1
  287. package/dist/types/attachment.js +2 -1
  288. package/dist/types/attachment.js.map +1 -1
  289. package/dist/types/message.d.ts +40 -1
  290. package/dist/types/message.d.ts.map +1 -1
  291. package/dist/types/message.js +7 -1
  292. package/dist/types/message.js.map +1 -1
  293. package/dist/utils/abortable-iterable.d.ts +19 -0
  294. package/dist/utils/abortable-iterable.d.ts.map +1 -0
  295. package/dist/utils/abortable-iterable.js +72 -0
  296. package/dist/utils/abortable-iterable.js.map +1 -0
  297. package/dist/utils/composite-context-provider.d.ts.map +1 -1
  298. package/dist/utils/composite-context-provider.js +20 -2
  299. package/dist/utils/composite-context-provider.js.map +1 -1
  300. package/dist/utils/record.d.ts +11 -0
  301. package/dist/utils/record.d.ts.map +1 -0
  302. package/dist/utils/record.js +12 -0
  303. package/dist/utils/record.js.map +1 -0
  304. package/package.json +12 -17
  305. package/src/adapters/attachment.test.ts +50 -1
  306. package/src/adapters/attachment.ts +7 -4
  307. package/src/index.ts +7 -1
  308. package/src/internal.ts +12 -0
  309. package/src/model-context/frame/host.test.ts +24 -0
  310. package/src/model-context/frame/host.ts +10 -4
  311. package/src/model-context/frame/provider.test.ts +288 -1
  312. package/src/model-context/frame/provider.ts +148 -30
  313. package/src/model-context/interactable-composer-metadata.test.ts +28 -0
  314. package/src/model-context/interactable-composer-metadata.ts +9 -3
  315. package/src/model-context/registry.test.ts +12 -0
  316. package/src/model-context/registry.ts +3 -2
  317. package/src/model-context/tool-call-text.test.ts +67 -0
  318. package/src/model-context/tool-call-text.ts +67 -0
  319. package/src/model-context/types.test.ts +25 -0
  320. package/src/model-context/types.ts +9 -4
  321. package/src/react/AssistantRuntimeProvider.test.tsx +66 -2
  322. package/src/react/RuntimeAdapter.test.ts +34 -0
  323. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +1 -3
  324. package/src/react/client/InMemoryThreadList.ts +1 -0
  325. package/src/react/client/Interactables.test.ts +28 -0
  326. package/src/react/client/Interactables.ts +15 -13
  327. package/src/react/client/RemoteThreadList.background.test.ts +526 -0
  328. package/src/react/client/RemoteThreadList.concurrent.test.tsx +315 -0
  329. package/src/react/client/RemoteThreadList.test.ts +617 -3
  330. package/src/react/client/RemoteThreadList.ts +433 -167
  331. package/src/react/client/Tools.ts +29 -12
  332. package/src/react/index.ts +4 -0
  333. package/src/react/interactables-legacy/Interactables.ts +16 -16
  334. package/src/react/interactables-shared/useInteractablePersistenceQueue.ts +9 -10
  335. package/src/react/model-context/makeAssistantTool.ts +2 -2
  336. package/src/react/model-context/modelContextHooks.test.tsx +131 -0
  337. package/src/react/model-context/toolbox.test.ts +9 -9
  338. package/src/react/model-context/toolbox.ts +9 -36
  339. package/src/react/model-context/useAssistantContext.ts +4 -2
  340. package/src/react/model-context/useAssistantTool.ts +2 -2
  341. package/src/react/model-context/useAuiToolOverrides.ts +4 -2
  342. package/src/react/model-context/useInlineRender.test.tsx +48 -0
  343. package/src/react/model-context/useInlineRender.ts +14 -10
  344. package/src/react/model-context/useToolArgsStatus.test.tsx +30 -0
  345. package/src/react/model-context/useToolArgsStatus.ts +2 -1
  346. package/src/react/primitive-hooks/useMessageError.ts +2 -19
  347. package/src/react/primitive-hooks/useThreadListLoadMore.ts +2 -3
  348. package/src/react/primitives/composer/ComposerAttachments.test.tsx +76 -0
  349. package/src/react/primitives/composer/ComposerAttachments.tsx +9 -4
  350. package/src/react/primitives/composer/ComposerQueue.test.tsx +72 -0
  351. package/src/react/primitives/composer/ComposerQueue.tsx +7 -4
  352. package/src/react/primitives/message/MessageAttachments.test.tsx +107 -37
  353. package/src/react/primitives/message/MessageAttachments.tsx +10 -7
  354. package/src/react/primitives/message/MessageGroupedParts.tsx +2 -2
  355. package/src/react/primitives/message/MessageParts.tsx +3 -3
  356. package/src/react/primitives/threadList/ThreadListItems.test.tsx +99 -0
  357. package/src/react/primitives/threadList/ThreadListItems.tsx +8 -5
  358. package/src/react/runtimes/RemoteThreadListHookInstanceManager.destroy.test.tsx +172 -0
  359. package/src/react/runtimes/RemoteThreadListHookInstanceManager.running.test.tsx +127 -1
  360. package/src/react/runtimes/RemoteThreadListHookInstanceManager.test.tsx +7 -1
  361. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +99 -35
  362. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.load-error.test.ts +132 -0
  363. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.switch-delete.test.ts +274 -0
  364. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +223 -152
  365. package/src/react/runtimes/RemoteThreadResource.test.ts +9 -0
  366. package/src/react/runtimes/RemoteThreadResource.ts +20 -16
  367. package/src/react/runtimes/assistant-transport/transport-scheduling.test.ts +51 -2
  368. package/src/react/runtimes/assistant-transport/useLatestRef.ts +2 -2
  369. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.ts +45 -0
  370. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +546 -5
  371. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +546 -103
  372. package/src/react/runtimes/cloud/auiV0.ts +5 -0
  373. package/src/react/runtimes/cloud/createCloudThreadListAdapter.test.ts +103 -0
  374. package/src/react/runtimes/cloud/createCloudThreadListAdapter.ts +237 -0
  375. package/src/react/runtimes/cloud/useCloudThreadListAdapter.test.tsx +90 -1
  376. package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +33 -238
  377. package/src/react/runtimes/external-message-converter.ts +1 -0
  378. package/src/react/runtimes/useExternalStoreRuntime.lifecycle.test.tsx +41 -0
  379. package/src/react/runtimes/useExternalStoreRuntime.ts +10 -4
  380. package/src/react/runtimes/useLocalRuntime.test.tsx +20 -0
  381. package/src/react/runtimes/useRemoteThreadListRuntime.concurrent.test.tsx +216 -0
  382. package/src/react/runtimes/useRemoteThreadListRuntime.load-error.test.tsx +108 -0
  383. package/src/react/runtimes/useRemoteThreadListRuntime.ts +57 -6
  384. package/src/react/types/MessagePartComponentTypes.ts +7 -3
  385. package/src/react/types/scopes/tools.ts +2 -0
  386. package/src/runtime/api/message-part-runtime.ts +3 -3
  387. package/src/runtime/api/message-runtime.test.ts +75 -0
  388. package/src/runtime/api/thread-list-item-runtime.ts +10 -3
  389. package/src/runtime/api/thread-list-runtime.ts +46 -12
  390. package/src/runtime/api/thread-runtime.test.ts +78 -0
  391. package/src/runtime/api/thread-runtime.ts +8 -1
  392. package/src/runtime/base/base-composer-runtime-core.ts +36 -8
  393. package/src/runtime/base/base-thread-runtime-core.test.ts +149 -4
  394. package/src/runtime/base/base-thread-runtime-core.ts +16 -8
  395. package/src/runtime/interfaces/composer-runtime-core.ts +10 -5
  396. package/src/runtime/interfaces/thread-list-runtime-core.ts +25 -2
  397. package/src/runtime/interfaces/thread-runtime-core.ts +17 -1
  398. package/src/runtime/utils/auto-status.test.ts +57 -0
  399. package/src/runtime/utils/auto-status.ts +13 -1
  400. package/src/runtime/utils/external-message-conversion.test.ts +165 -0
  401. package/src/runtime/utils/external-message-conversion.ts +18 -2
  402. package/src/runtime/utils/message-repository.ts +29 -17
  403. package/src/runtime/utils/resolveToolApprovalResponse.test.ts +73 -0
  404. package/src/runtime/utils/resolveToolApprovalResponse.ts +27 -6
  405. package/src/runtime/utils/thread-message-like.ts +3 -11
  406. package/src/runtime/utils/tool-call-tree.test.ts +191 -0
  407. package/src/runtime/utils/tool-call-tree.ts +97 -0
  408. package/src/runtimes/external-store/external-store-adapter.ts +38 -2
  409. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +18 -13
  410. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +56 -33
  411. package/src/runtimes/inert/InertThreadRuntimeCore.ts +1 -1
  412. package/src/runtimes/internal.ts +1 -0
  413. package/src/runtimes/local/local-thread-runtime-core.test.ts +29 -3
  414. package/src/runtimes/local/local-thread-runtime-core.ts +5 -1
  415. package/src/runtimes/remote-thread-list/remote-thread-state.test.ts +238 -0
  416. package/src/runtimes/remote-thread-list/remote-thread-state.ts +223 -44
  417. package/src/runtimes/remote-thread-list/title-generation.test.ts +602 -0
  418. package/src/runtimes/remote-thread-list/title-generation.ts +329 -0
  419. package/src/runtimes/remote-thread-list/title.test.ts +62 -0
  420. package/src/runtimes/remote-thread-list/title.ts +16 -0
  421. package/src/runtimes/remote-thread-list/types.ts +16 -5
  422. package/src/runtimes/tool-invocations/EDGE_CASES.md +110 -5
  423. package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +750 -136
  424. package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +144 -91
  425. package/src/store/clients/external-thread.ts +62 -11
  426. package/src/store/clients/model-context-client.ts +5 -1
  427. package/src/store/clients/single-thread-list.ts +1 -0
  428. package/src/store/clients/suggestions.test.ts +195 -1
  429. package/src/store/clients/suggestions.ts +45 -34
  430. package/src/store/index.ts +4 -0
  431. package/src/store/internal.ts +2 -0
  432. package/src/store/primitive-predicates.ts +35 -0
  433. package/src/store/runtime-clients/composer-runtime-client.ts +42 -9
  434. package/src/store/runtime-clients/message-runtime-client.ts +54 -6
  435. package/src/store/runtime-clients/thread-list-item-runtime-client.ts +4 -2
  436. package/src/store/runtime-clients/thread-list-runtime-client.ts +17 -2
  437. package/src/store/runtime-clients/thread-runtime-client.ts +58 -10
  438. package/src/store/runtime-clients/useSubscribable.ts +8 -2
  439. package/src/store/scopes/composer.ts +16 -4
  440. package/src/store/scopes/message.ts +14 -0
  441. package/src/store/scopes/part.ts +6 -3
  442. package/src/store/scopes/thread-list-item.ts +5 -2
  443. package/src/store/scopes/thread.ts +4 -0
  444. package/src/store/scopes/threads.ts +1 -0
  445. package/src/subscribable/subscribable.test.ts +50 -0
  446. package/src/subscribable/subscribable.ts +33 -21
  447. package/src/tests/MessageRepository.test.ts +116 -0
  448. package/src/tests/OptimisticState-list-race.test.ts +1 -0
  449. package/src/tests/RemoteThreadListThreadListRuntimeCore-initialize-adapter-change.test.ts +38 -0
  450. package/src/tests/RemoteThreadListThreadListRuntimeCore-load-race.test.ts +158 -0
  451. package/src/tests/RemoteThreadListThreadListRuntimeCore-loadMore.test.ts +78 -0
  452. package/src/tests/RemoteThreadListThreadListRuntimeCore-reload.test.ts +52 -0
  453. package/src/tests/RemoteThreadListThreadListRuntimeCore-title-race.test.ts +89 -0
  454. package/src/tests/attachment-adapters.test.ts +14 -0
  455. package/src/tests/base-composer-runtime-core.test.ts +39 -0
  456. package/src/tests/external-store-optimistic-id.test.ts +79 -0
  457. package/src/tests/external-store-repository-instance.test.ts +166 -0
  458. package/src/tests/external-store-thread-list-runtime-core.test.ts +83 -0
  459. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +49 -34
  460. package/src/tests/external-thread-attachments.test.tsx +224 -1
  461. package/src/tests/external-thread-parity.test.tsx +23 -0
  462. package/src/tests/remote-thread-list-adapter-switch.test.ts +66 -1
  463. package/src/tests/remote-thread-list-isLoading.test.ts +1 -0
  464. package/src/tests/thread-list-runtime-getLoadThreadsPromise.test.ts +1 -0
  465. package/src/tests/thread-switch-events.test.tsx +475 -2
  466. package/src/tests/tools-scope-migration.test.tsx +28 -0
  467. package/src/types/attachment.ts +4 -0
  468. package/src/types/message.ts +50 -2
  469. package/src/utils/abortable-iterable.test.ts +213 -0
  470. package/src/utils/abortable-iterable.ts +93 -0
  471. package/src/utils/composite-context-provider.test.ts +25 -0
  472. package/src/utils/composite-context-provider.ts +23 -2
  473. package/src/utils/record.test.ts +48 -0
  474. package/src/utils/record.ts +11 -0
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantCloudThreadHistoryAdapter.js","names":["RefObject","useEffect","useRef","useState","GenericThreadHistoryAdapter","ThreadHistoryAdapter","MessageFormatAdapter","MessageFormatItem","MessageFormatRepository","ExportedMessageRepositoryItem","AssistantCloud","AssistantCloudRunReportToolCall","CloudMessagePersistence","createFormattedPersistence","createRunTelemetryToolCall","normalizeRunTelemetryUsage","RunTelemetryUsageInit","truncateRunTelemetryText","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","TelemetryStepData","start_ms","end_ms","timestamps","t","len","Math","min","length","s","i","extractAuiV0","extractAiSdkV6","aggregateAiSdkV6RunSteps","result","AUI_STATUS_MAP","error","incomplete","msg","role","type","text","toolName","toolCallId","args","argsText","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","toolSource","slice","collectAiSdkV6Parts","stepsData","currentStepToolCalls","push","tc","extractModelId","buildAiSdkV6Result","hasText","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 type AssistantCloudRunReportToolCall,\n CloudMessagePersistence,\n createFormattedPersistence,\n createRunTelemetryToolCall,\n normalizeRunTelemetryUsage,\n type RunTelemetryUsageInit,\n truncateRunTelemetryText,\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\ntype TelemetryStepData = {\n input_tokens?: number;\n output_tokens?: number;\n reasoning_tokens?: number;\n cached_input_tokens?: number;\n tool_calls?: AssistantCloudRunReportToolCall[];\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?: AssistantCloudRunReportToolCall[];\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 createRunTelemetryToolCall({\n toolName: p.toolName!,\n toolCallId: p.toolCallId!,\n args: p.args,\n result: p.result,\n argsText: p.argsText,\n }),\n );\n\n const textParts = msg.content?.filter((p) => p.type === \"text\" && p.text);\n const outputText =\n textParts && textParts.length > 0\n ? truncateRunTelemetryText(textParts.map((p) => p.text).join(\"\"))\n : undefined;\n\n const steps = msg.metadata?.steps;\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let reasoningTokens: number | undefined;\n let cachedInputTokens: number | undefined;\n if (steps && steps.length > 0) {\n let totalInput = 0;\n let totalOutput = 0;\n let totalReasoning = 0;\n let totalCachedInput = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n for (const step of steps) {\n if (step.usage?.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): AssistantCloudRunReportToolCall {\n const toolSource: \"mcp\" | \"frontend\" = isDynamicToolPart(p)\n ? \"mcp\"\n : \"frontend\";\n return createRunTelemetryToolCall({\n toolName: p.toolName ?? p.type.slice(5),\n toolCallId: p.toolCallId!,\n args: p.args ?? p.input,\n result: p.result ?? p.output,\n toolSource,\n });\n}\n\nfunction collectAiSdkV6Parts(parts: readonly AiSdkV6Part[]): {\n textParts: string[];\n toolCalls: AssistantCloudRunReportToolCall[];\n stepsData: { tool_calls: AssistantCloudRunReportToolCall[] }[];\n} {\n const textParts: string[] = [];\n const toolCalls: AssistantCloudRunReportToolCall[] = [];\n const stepsData: { tool_calls: AssistantCloudRunReportToolCall[] }[] = [];\n let currentStepToolCalls: AssistantCloudRunReportToolCall[] | 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: AssistantCloudRunReportToolCall[],\n totalSteps: number,\n metadata?: Record<string, unknown>,\n stepsData?: { tool_calls: AssistantCloudRunReportToolCall[] }[],\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\n ? truncateRunTelemetryText(textParts.join(\"\"))\n : 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\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 RunTelemetryUsageInit | undefined;\n if (usage) {\n const normalized = normalizeRunTelemetryUsage(usage);\n if (normalized) return normalized;\n }\n\n // Try aggregating from metadata.steps[].usage\n const steps = metadata?.steps as\n | readonly { usage?: RunTelemetryUsageInit }[]\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 = normalizeRunTelemetryUsage(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: AssistantCloudRunReportToolCall[] = [];\n const allStepsData: { tool_calls: AssistantCloudRunReportToolCall[] }[] = [];\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","AssistantCloudEvent","AssistantCloudRunReportToolCall","CloudMessagePersistence","createFormattedPersistence","createRunReport","createRunTelemetryToolCall","deriveRunOutcome","describeRunError","extractRunTelemetryModelId","normalizeRunTelemetryUsage","RunReportOutcome","RunReportStepInit","RunTelemetryUsage","RunTelemetryUsageInit","truncateRunTelemetryText","auiV0Decode","auiV0Encode","AssistantClient","getClientId","useAui","ThreadListItemMethods","FeedbackAdapter","CloudThreadListItem","Pick","globalPersistence","WeakMap","ClientId","AssistantCloudThreadHistoryAdapter","cloudRef","getAui","constructor","aui","getPersistence","threadListItem","key","has","set","current","get","_persistence","resolveEngagementEventIds","threadId","messageId","options","awaitThread","Promise","getThreadListItem","remoteThreadId","getState","remoteId","initialize","then","result","catch","undefined","remoteMessageId","getResolvedRemoteId","thread_id","message_id","feedback","submit","message","type","tryGetKeyedThreadListItem","console","warn","id","cloudMessageId","getRemoteId","threads","messages","error","live","source","listed","threadItems","some","item","currentState","find","withFormat","Record","formatAdapter","TMessage","TStorageFormat","adapter","pinCurrent","next","resolvePinned","getTargetFormatted","pin","append","pinned","Error","update","localMessageId","delete","reportTelemetry","items","durationMs","stepTimestamps","StepTimestamp","encodedRunMessages","map","encode","_reportRunTelemetry","format","extractLastRunMessageInfo","load","parentId","encoded","telemetry","enabled","_maybeReportRun","extractRunMessageInfo","isPersisted","filter","m","reverse","runMessages","T","messageInfo","RunMessageInfo","extracted","extractRunTelemetry","_sendReport","content","extractTelemetry","data","TelemetryData","persistence","mergedSteps","mergeStepTimestamps","steps","initial","status","outcome","outcomeType","errorCode","traceId","modelId","provider","usage","inputTokens","outputTokens","reasoningTokens","cachedInputTokens","toRunReportSteps","totalSteps","toolCalls","firstTokenMs","outputText","metadata","beforeReport","report","runs","TelemetryStepData","input_tokens","output_tokens","reasoning_tokens","cached_input_tokens","tool_calls","start_ms","end_ms","step","startMs","endMs","timestamps","t","len","Math","min","length","s","i","info","getId","isRecord","role","custom","timing","streamStartTime","firstTokenTime","Number","isFinite","round","finishReason","reason","failed","isError","failure","const","value","extractAuiV0","extractAiSdkV6","aggregateAiSdkV6RunSteps","AUI_STATUS_MAP","incomplete","msg","text","toolName","toolCallId","args","argsText","p","textParts","join","totalInput","totalOutput","totalReasoning","totalCachedInput","hasInput","hasOutput","hasReasoning","hasCachedInput","statusType","telemetrySteps","AiSdkV6Part","input","output","AiSdkV6Message","parts","isToolCallPart","startsWith","isDynamicToolPart","partToToolCall","toolSource","slice","collectAiSdkV6Parts","stepsData","currentStepToolCalls","push","tc","buildAiSdkV6Result","hasText","extractAiSdkV6Usage","normalized","hasAny","n","stepMessages","allTextParts","allToolCalls","allStepsData","hasAssistant","useAssistantCloudThreadHistoryAdapter","auiRef","useAssistantCloudEngagementEvents","RootEngagementTracker","count","dispose","rootEngagementTrackers","useRootEngagementEvents","$","_c","t0","t1","tracker","created","_temp","on","scope","event","payload","ids","events","track","kind","_temp2","active","Symbol","for","Map","runStartedAt","runEndedAt","t2","Set","shownSuggestions","t3","t4","_temp3","trackRunStopped","threadId_0","startedAt","max","Date","now","unsubscribers","previousRunEndedAt","props","chars","attachments","suggestion","payload_0","contentType","payload_1","payload_2","payload_3","payload_4","payload_5","payload_6","payload_7","payload_8","payload_9","payload_10","payload_11","unsubscribe","t5","t6","reportSuggestions","mainThreadId","isEmpty","suggestions","thread","add","ids_0","subscribe"],"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 type AssistantCloudEvent,\n type AssistantCloudRunReportToolCall,\n CloudMessagePersistence,\n createFormattedPersistence,\n createRunReport,\n createRunTelemetryToolCall,\n deriveRunOutcome,\n describeRunError,\n extractRunTelemetryModelId,\n normalizeRunTelemetryUsage,\n type RunReportOutcome,\n type RunReportStepInit,\n type RunTelemetryUsage,\n type RunTelemetryUsageInit,\n truncateRunTelemetryText,\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\";\nimport type { FeedbackAdapter } from \"../../../adapters/feedback\";\n\ntype CloudThreadListItem = Pick<\n ThreadListItemMethods,\n \"getState\" | \"initialize\"\n>;\n\nconst globalPersistence = new WeakMap<\n getClientId.ClientId,\n CloudMessagePersistence\n>();\n\nclass AssistantCloudThreadHistoryAdapter implements ThreadHistoryAdapter {\n private cloudRef: RefObject<AssistantCloud>;\n private getAui: () => AssistantClient;\n\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 /**\n * A send is the moment the runtime creates the remote thread, so that one\n * event waits for the id; every other event reads the id that already\n * exists, because initializing a thread nobody has written to would create\n * an empty remote thread just to attribute an event.\n */\n public async resolveEngagementEventIds(\n threadId: string,\n messageId?: string,\n options?: { awaitThread?: boolean },\n ): Promise<Pick<AssistantCloudEvent, \"thread_id\" | \"message_id\">> {\n const threadListItem = this.getThreadListItem(threadId);\n if (!threadListItem) return {};\n\n let remoteThreadId = threadListItem.getState().remoteId;\n if (!remoteThreadId && options?.awaitThread) {\n remoteThreadId = await threadListItem\n .initialize()\n .then((result) => result.remoteId)\n .catch(() => undefined);\n }\n const remoteMessageId = messageId\n ? this.getPersistence(threadListItem).getResolvedRemoteId(messageId)\n : undefined;\n return {\n ...(remoteThreadId ? { thread_id: remoteThreadId } : undefined),\n ...(remoteMessageId ? { message_id: remoteMessageId } : undefined),\n };\n }\n\n public readonly feedback: FeedbackAdapter = {\n submit: ({ message, type }) => {\n void (async () => {\n const threadListItem = this.tryGetKeyedThreadListItem();\n const remoteThreadId = threadListItem?.getState().remoteId;\n if (!threadListItem || !remoteThreadId) {\n console.warn(\n `[assistant-ui] Skipping feedback for message ${message.id}: the thread has no remote id.`,\n );\n return;\n }\n\n const cloudMessageId = await this.getPersistence(\n threadListItem,\n ).getRemoteId(message.id);\n if (!cloudMessageId) {\n console.warn(\n `[assistant-ui] Skipping feedback for message ${message.id}: no cloud message id is mapped.`,\n );\n return;\n }\n\n await this.cloudRef.current.threads.messages.feedback(\n remoteThreadId,\n cloudMessageId,\n { type },\n );\n })().catch((error: unknown) => {\n console.error(\n \"[assistant-ui] Cloud feedback submission failed:\",\n error,\n );\n });\n },\n };\n\n private tryGetKeyedThreadListItem(): CloudThreadListItem | undefined {\n const live = this.aui.threadListItem;\n if (!live.source) return undefined;\n const id = live.getState().id;\n if (id === undefined) return undefined;\n // A body can resolve before the list's committed items include its\n // thread; the live item is already the per-thread anchor in that window.\n const listed = this.aui.threads\n .getState()\n .threadItems.some((item) => item.id === id || item.remoteId === id);\n return listed ? this.aui.threads.item({ id }) : live;\n }\n\n private getThreadListItem(threadId: string): CloudThreadListItem | undefined {\n const current = this.aui.threadListItem;\n const currentState = current.getState();\n if (currentState.id === threadId || currentState.remoteId === threadId) {\n return current;\n }\n\n const listed = this.aui.threads\n .getState()\n .threadItems.find(\n (item) => item.id === threadId || item.remoteId === threadId,\n );\n return listed ? this.aui.threads.item({ id: listed.id }) : undefined;\n }\n\n withFormat<TMessage, TStorageFormat extends Record<string, unknown>>(\n formatAdapter: MessageFormatAdapter<TMessage, TStorageFormat>,\n ): GenericThreadHistoryAdapter<TMessage> {\n const adapter = this;\n let threadListItem: CloudThreadListItem | undefined;\n const pinCurrent = () => {\n const next = adapter.tryGetKeyedThreadListItem();\n if (next) threadListItem = next;\n return threadListItem;\n };\n const resolvePinned = () => threadListItem ?? pinCurrent();\n const getTargetFormatted = (item: CloudThreadListItem) =>\n createFormattedPersistence(adapter.getPersistence(item), formatAdapter);\n return {\n pin() {\n pinCurrent();\n },\n async append(item: MessageFormatItem<TMessage>) {\n const pinned = resolvePinned();\n if (!pinned) {\n throw new Error(\n \"Cannot persist cloud history without a thread list item.\",\n );\n }\n const remoteId =\n pinned.getState().remoteId ?? (await pinned.initialize()).remoteId;\n await getTargetFormatted(pinned).append(remoteId, item);\n },\n async update(item: MessageFormatItem<TMessage>, localMessageId: string) {\n const pinned = resolvePinned();\n const remoteId = pinned?.getState().remoteId;\n if (!remoteId || !pinned) return;\n await getTargetFormatted(pinned).update?.(\n remoteId,\n item,\n localMessageId,\n );\n },\n async delete() {\n throw new Error(\n \"Assistant Cloud does not support deleting thread messages yet.\",\n );\n },\n reportTelemetry(\n items: MessageFormatItem<TMessage>[],\n options?: {\n durationMs?: number;\n stepTimestamps?: StepTimestamp[];\n },\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 extractLastRunMessageInfo(items, formatAdapter),\n );\n },\n async load(): Promise<MessageFormatRepository<TMessage>> {\n // Loads re-pin and resolve through the pinned item, so the id mapping\n // they populate lives on the same persistence instance later writes\n // resolve, whichever of the list item or the live graft won the pin.\n const pinned = pinCurrent();\n const live = adapter.aui.threadListItem;\n const remoteId = live.source ? live.getState().remoteId : undefined;\n if (!remoteId) return { messages: [] };\n return getTargetFormatted(pinned ?? live).load(remoteId);\n },\n };\n }\n\n async append({ parentId, message }: ExportedMessageRepositoryItem) {\n const { remoteId } = await this.aui.threadListItem.initialize();\n const encoded = auiV0Encode(message);\n await this._persistence.append(\n remoteId,\n message.id,\n parentId,\n \"aui/v0\",\n encoded,\n );\n\n if (this.cloudRef.current.telemetry.enabled) {\n this._maybeReportRun(\n remoteId,\n \"aui/v0\",\n encoded,\n extractRunMessageInfo(message, \"aui/v0\"),\n );\n }\n }\n\n async update(item: ExportedMessageRepositoryItem) {\n if (!this._persistence.isPersisted(item.message.id)) {\n return this.append(item);\n }\n const { message } = item;\n const remoteId = this.aui.threadListItem.getState().remoteId;\n if (!remoteId) return;\n const encoded = auiV0Encode(message);\n await this._persistence.update(remoteId, message.id, \"aui/v0\", encoded);\n\n if (this.cloudRef.current.telemetry.enabled) {\n this._maybeReportRun(\n remoteId,\n \"aui/v0\",\n encoded,\n extractRunMessageInfo(message, \"aui/v0\"),\n );\n }\n }\n\n async delete() {\n throw new Error(\n \"Assistant Cloud does not support deleting thread messages yet.\",\n );\n }\n\n async load() {\n const remoteId = this.aui.threadListItem.getState().remoteId;\n if (!remoteId) return { messages: [] };\n const messages = await this._persistence.load(remoteId, \"aui/v0\");\n 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 messageInfo?: RunMessageInfo,\n ) {\n if (!this.cloudRef.current.telemetry.enabled) return;\n\n const item = threadListItem ?? this.aui.threadListItem;\n const remoteId = item.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 messageInfo,\n this.getPersistence(item),\n );\n }\n\n private _maybeReportRun<T>(\n remoteId: string,\n format: string,\n content: T,\n messageInfo?: RunMessageInfo,\n ) {\n const extracted = extractTelemetry(format, content);\n if (!extracted) return;\n\n this._sendReport(remoteId, extracted, undefined, undefined, messageInfo);\n }\n\n private _sendReport(\n remoteId: string,\n data: TelemetryData,\n durationMs?: number,\n stepTimestamps?: StepTimestamp[],\n messageInfo?: RunMessageInfo,\n persistence = this._persistence,\n ) {\n const mergedSteps = mergeStepTimestamps(data.steps, stepTimestamps);\n const messageId = messageInfo?.localMessageId\n ? persistence.getResolvedRemoteId(messageInfo.localMessageId)\n : undefined;\n const initial = createRunReport({\n threadId: remoteId,\n status: messageInfo?.status ?? data.status,\n outcome: messageInfo?.outcomeType,\n error: messageInfo?.error,\n errorCode: messageInfo?.errorCode,\n messageId,\n traceId: messageInfo?.traceId,\n modelId: data.modelId,\n provider: messageInfo?.provider,\n usage: {\n inputTokens: data.inputTokens,\n outputTokens: data.outputTokens,\n reasoningTokens: data.reasoningTokens,\n cachedInputTokens: data.cachedInputTokens,\n },\n steps: toRunReportSteps(mergedSteps),\n totalSteps: data.totalSteps,\n toolCalls: data.toolCalls,\n durationMs,\n firstTokenMs: messageInfo?.firstTokenMs,\n outputText: data.outputText,\n metadata: data.metadata,\n telemetry: this.cloudRef.current.telemetry,\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\ntype TelemetryStepData = {\n input_tokens?: number;\n output_tokens?: number;\n reasoning_tokens?: number;\n cached_input_tokens?: number;\n tool_calls?: AssistantCloudRunReportToolCall[];\n start_ms?: number;\n end_ms?: number;\n};\n\ntype StepTimestamp = { start_ms: number; end_ms: number };\n\nfunction toRunReportSteps(\n steps: TelemetryStepData[] | undefined,\n): RunReportStepInit[] | undefined {\n if (!steps) return undefined;\n return steps.map((step) => ({\n usage: {\n inputTokens: step.input_tokens,\n outputTokens: step.output_tokens,\n reasoningTokens: step.reasoning_tokens,\n cachedInputTokens: step.cached_input_tokens,\n },\n toolCalls: step.tool_calls,\n startMs: step.start_ms,\n endMs: step.end_ms,\n }));\n}\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?: AssistantCloudRunReportToolCall[];\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\ntype RunMessageInfo = {\n localMessageId?: string;\n status?: \"error\";\n outcomeType?: RunReportOutcome;\n error?: string;\n errorCode?: string;\n firstTokenMs?: number;\n traceId?: string;\n provider?: string;\n};\n\nfunction extractLastRunMessageInfo<\n TMessage,\n TStorageFormat extends Record<string, unknown>,\n>(\n items: MessageFormatItem<TMessage>[],\n formatAdapter: MessageFormatAdapter<TMessage, TStorageFormat>,\n): RunMessageInfo | undefined {\n for (let i = items.length - 1; i >= 0; i--) {\n const item = items[i]!;\n const info = extractRunMessageInfo(\n item.message,\n formatAdapter.format,\n formatAdapter.getId(item.message),\n );\n if (info) return info;\n }\n return undefined;\n}\n\nfunction extractRunMessageInfo(\n message: unknown,\n format: string,\n localMessageId?: string,\n): RunMessageInfo | undefined {\n if (!isRecord(message) || message.role !== \"assistant\") return undefined;\n\n const status = isRecord(message.status) ? message.status : undefined;\n const metadata = isRecord(message.metadata) ? message.metadata : undefined;\n const custom = isRecord(metadata?.custom) ? metadata.custom : undefined;\n const timing = isRecord(metadata?.timing) ? metadata.timing : undefined;\n const streamStartTime = timing?.streamStartTime;\n const firstTokenTime = timing?.firstTokenTime;\n const firstTokenMs =\n typeof streamStartTime === \"number\" &&\n Number.isFinite(streamStartTime) &&\n typeof firstTokenTime === \"number\" &&\n Number.isFinite(firstTokenTime)\n ? Math.round(firstTokenTime - streamStartTime)\n : undefined;\n const finishReason =\n status?.type === \"incomplete\"\n ? status.reason\n : typeof metadata?.finishReason === \"string\"\n ? metadata.finishReason\n : undefined;\n const failed = status?.type === \"incomplete\" && status.reason === \"error\";\n const outcome = deriveRunOutcome({\n finishReason: typeof finishReason === \"string\" ? finishReason : undefined,\n isError: failed,\n });\n const outcomeType = outcome.outcome;\n const failure = failed ? describeRunError(status.error) : {};\n const messageId =\n localMessageId ?? (typeof message.id === \"string\" ? message.id : undefined);\n const traceId =\n format === \"aui/v0\"\n ? custom?.traceId\n : format === \"ai-sdk/v6\"\n ? metadata?.traceId\n : undefined;\n const provider =\n typeof custom?.provider === \"string\"\n ? custom.provider\n : typeof metadata?.provider === \"string\"\n ? metadata.provider\n : undefined;\n\n return {\n ...(messageId ? { localMessageId: messageId } : undefined),\n ...(outcome.status === \"error\" ? { status: \"error\" as const } : undefined),\n ...(outcomeType ? { outcomeType } : undefined),\n ...failure,\n ...(firstTokenMs != null && firstTokenMs >= 0\n ? { firstTokenMs }\n : undefined),\n ...(typeof traceId === \"string\" ? { traceId } : undefined),\n ...(provider !== undefined ? { provider } : undefined),\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\";\n}\n\nfunction extractTelemetry<T>(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; reason?: string };\n content?: readonly {\n type: string;\n text?: string;\n toolName?: string;\n toolCallId?: string;\n args?: unknown;\n argsText?: string;\n result?: unknown;\n }[];\n metadata?: {\n modelId?: string;\n steps?: readonly { usage?: RunTelemetryUsageInit }[];\n custom?: Record<string, unknown> & { modelId?: string };\n };\n };\n\n if (msg.role !== \"assistant\") return null;\n // A paused (requires-action) write is not a finished run; reporting it would\n // mislabel it \"completed\" and double-count steps once the terminal write reports.\n if (msg.status?.type === \"requires-action\") return null;\n\n const toolCalls = msg.content\n ?.filter((p) => p.type === \"tool-call\" && p.toolName && p.toolCallId)\n .map((p) =>\n createRunTelemetryToolCall({\n toolName: p.toolName!,\n toolCallId: p.toolCallId!,\n args: p.args,\n result: p.result,\n argsText: p.argsText,\n }),\n );\n\n const textParts = msg.content?.filter((p) => p.type === \"text\" && p.text);\n const outputText =\n textParts && textParts.length > 0\n ? truncateRunTelemetryText(textParts.map((p) => p.text).join(\"\"))\n : undefined;\n\n const steps = msg.metadata?.steps;\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let reasoningTokens: number | undefined;\n let cachedInputTokens: number | undefined;\n if (steps && steps.length > 0) {\n let totalInput = 0;\n let totalOutput = 0;\n let totalReasoning = 0;\n let totalCachedInput = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n for (const step of steps) {\n if (!step.usage) continue;\n const usage = normalizeRunTelemetryUsage(step.usage);\n if (!usage) continue;\n if (usage.inputTokens != null) {\n totalInput += usage.inputTokens;\n hasInput = true;\n }\n if (usage.outputTokens != null) {\n totalOutput += usage.outputTokens;\n hasOutput = true;\n }\n if (usage.reasoningTokens != null) {\n totalReasoning += usage.reasoningTokens;\n hasReasoning = true;\n }\n if (usage.cachedInputTokens != null) {\n totalCachedInput += usage.cachedInputTokens;\n hasCachedInput = true;\n }\n }\n inputTokens = hasInput ? totalInput : undefined;\n outputTokens = hasOutput ? totalOutput : undefined;\n reasoningTokens = hasReasoning ? totalReasoning : undefined;\n cachedInputTokens = hasCachedInput ? totalCachedInput : undefined;\n }\n\n const statusType = msg.status?.type;\n const status: TelemetryData[\"status\"] =\n statusType === \"incomplete\" && msg.status?.reason === \"error\"\n ? \"error\"\n : (statusType && AUI_STATUS_MAP[statusType]) || \"completed\";\n\n const metadata = msg.metadata?.custom as Record<string, unknown> | undefined;\n const modelId = extractRunTelemetryModelId(\n msg.metadata as Record<string, unknown> | undefined,\n );\n\n const telemetrySteps: TelemetryStepData[] | undefined =\n steps && steps.length > 1\n ? steps.map((s) => {\n const usage = s.usage\n ? normalizeRunTelemetryUsage(s.usage)\n : undefined;\n return {\n ...(usage?.inputTokens != null\n ? { input_tokens: usage.inputTokens }\n : undefined),\n ...(usage?.outputTokens != null\n ? { output_tokens: usage.outputTokens }\n : undefined),\n ...(usage?.reasoningTokens != null\n ? { reasoning_tokens: usage.reasoningTokens }\n : undefined),\n ...(usage?.cachedInputTokens != null\n ? { cached_input_tokens: usage.cachedInputTokens }\n : undefined),\n };\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): AssistantCloudRunReportToolCall {\n const toolSource: \"mcp\" | \"frontend\" = isDynamicToolPart(p)\n ? \"mcp\"\n : \"frontend\";\n return createRunTelemetryToolCall({\n toolName: p.toolName ?? p.type.slice(5),\n toolCallId: p.toolCallId!,\n args: p.args ?? p.input,\n result: p.result ?? p.output,\n toolSource,\n });\n}\n\nfunction collectAiSdkV6Parts(parts: readonly AiSdkV6Part[]): {\n textParts: string[];\n toolCalls: AssistantCloudRunReportToolCall[];\n stepsData: { tool_calls: AssistantCloudRunReportToolCall[] }[];\n} {\n const textParts: string[] = [];\n const toolCalls: AssistantCloudRunReportToolCall[] = [];\n const stepsData: { tool_calls: AssistantCloudRunReportToolCall[] }[] = [];\n let currentStepToolCalls: AssistantCloudRunReportToolCall[] | 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 buildAiSdkV6Result(\n textParts: string[],\n toolCalls: AssistantCloudRunReportToolCall[],\n totalSteps: number,\n metadata?: Record<string, unknown>,\n stepsData?: { tool_calls: AssistantCloudRunReportToolCall[] }[],\n usage?: RunTelemetryUsage,\n): TelemetryData {\n const hasText = textParts.length > 0;\n const outputText = hasText\n ? truncateRunTelemetryText(textParts.join(\"\"))\n : undefined;\n const modelId = extractRunTelemetryModelId(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\nfunction extractAiSdkV6Usage(\n metadata?: Record<string, unknown>,\n): RunTelemetryUsage | undefined {\n // Try top-level metadata.usage\n const usage = metadata?.usage as RunTelemetryUsageInit | undefined;\n if (usage) {\n const normalized = normalizeRunTelemetryUsage(usage);\n if (normalized) return normalized;\n }\n\n // Try aggregating from metadata.steps[].usage\n const steps = metadata?.steps as\n | readonly { usage?: RunTelemetryUsageInit }[]\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 = normalizeRunTelemetryUsage(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: AssistantCloudRunReportToolCall[] = [];\n const allStepsData: { tool_calls: AssistantCloudRunReportToolCall[] }[] = [];\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 & { readonly feedback: FeedbackAdapter } {\n const aui = useAui();\n // Not useEffectEvent: history adapter methods run during render (SSR load).\n const auiRef = useRef(aui);\n useEffect(() => {\n auiRef.current = aui;\n });\n const [adapter] = useState(\n () =>\n new AssistantCloudThreadHistoryAdapter(cloudRef, () => auiRef.current),\n );\n useAssistantCloudEngagementEvents(cloudRef, adapter, aui);\n return adapter;\n}\n\ntype RootEngagementTracker = {\n count: number;\n adapter: AssistantCloudThreadHistoryAdapter;\n cloudRef: RefObject<AssistantCloud>;\n dispose: () => void;\n};\n\nconst rootEngagementTrackers = new WeakMap<\n AssistantClient,\n RootEngagementTracker\n>();\n\n/**\n * Thread switches are a thread list event, so one subscription per assistant\n * client reports them; every thread runtime mounted under it shares the\n * subscription and the last one to unmount removes it.\n */\nconst useRootEngagementEvents = (\n cloudRef: RefObject<AssistantCloud>,\n adapter: AssistantCloudThreadHistoryAdapter,\n aui: AssistantClient,\n) => {\n useEffect(() => {\n let tracker = rootEngagementTrackers.get(aui);\n if (!tracker) {\n const created: RootEngagementTracker = {\n count: 0,\n adapter,\n cloudRef,\n dispose: () => {},\n };\n created.dispose = aui.on(\n { scope: \"*\", event: \"threads.selectionChanged\" },\n (payload) => {\n void created.adapter\n .resolveEngagementEventIds(payload.threadId)\n .then((ids) => {\n if (!ids.thread_id) return;\n created.cloudRef.current.events?.track({\n kind: \"thread_switched\",\n ...ids,\n });\n })\n .catch(() => {});\n },\n );\n rootEngagementTrackers.set(aui, created);\n tracker = created;\n }\n const active = tracker;\n active.adapter = adapter;\n active.cloudRef = cloudRef;\n active.count += 1;\n return () => {\n active.count -= 1;\n if (active.count === 0) {\n active.dispose();\n rootEngagementTrackers.delete(aui);\n }\n };\n }, [adapter, aui, cloudRef]);\n};\n\nconst useAssistantCloudEngagementEvents = (\n cloudRef: RefObject<AssistantCloud>,\n adapter: AssistantCloudThreadHistoryAdapter,\n aui: AssistantClient,\n) => {\n useRootEngagementEvents(cloudRef, adapter, aui);\n const runStartedAt = useRef(new Map<string, number>());\n const runEndedAt = useRef(new Map<string, number>());\n const shownSuggestions = useRef(new Set<string>());\n\n useEffect(() => {\n const track = (\n event: AssistantCloudEvent,\n threadId: string,\n messageId?: string,\n options?: { awaitThread?: boolean },\n ) => {\n void adapter\n .resolveEngagementEventIds(threadId, messageId, options)\n .then((ids) => {\n cloudRef.current.events?.track({ ...event, ...ids });\n })\n .catch(() => {});\n };\n const trackRunStopped = (threadId: string) => {\n const startedAt = runStartedAt.current.get(threadId);\n if (startedAt === undefined) return;\n runStartedAt.current.delete(threadId);\n track(\n { kind: \"run_stopped\", value: Math.max(0, Date.now() - startedAt) },\n threadId,\n );\n };\n\n const unsubscribers = [\n aui.on({ scope: \"thread\", event: \"composer.send\" }, (payload) => {\n const previousRunEndedAt = runEndedAt.current.get(payload.threadId);\n track(\n {\n kind: payload.messageId ? \"message_edited\" : \"message_sent\",\n ...(payload.messageId\n ? { props: { chars: payload.chars } }\n : {\n props: {\n chars: payload.chars,\n attachments: payload.attachments,\n },\n }),\n ...(!payload.messageId && previousRunEndedAt !== undefined\n ? { value: Math.max(0, Date.now() - previousRunEndedAt) }\n : undefined),\n },\n payload.threadId,\n payload.messageId,\n { awaitThread: !payload.messageId },\n );\n if (payload.suggestion) {\n track({ kind: \"suggestion_clicked\" }, payload.threadId);\n }\n }),\n aui.on(\n { scope: \"thread\", event: \"composer.attachmentAdd\" },\n (payload) => {\n track(\n {\n kind: \"attachment_added\",\n ...(payload.contentType\n ? { props: { type: payload.contentType } }\n : undefined),\n },\n payload.threadId,\n payload.messageId,\n );\n },\n ),\n aui.on(\n { scope: \"thread\", event: \"composer.attachmentAddError\" },\n (payload) => {\n track(\n {\n kind: \"attachment_failed\",\n ...(payload.contentType\n ? { props: { type: payload.contentType } }\n : undefined),\n },\n payload.threadId,\n payload.messageId,\n );\n },\n ),\n aui.on({ scope: \"thread\", event: \"composer.cancel\" }, (payload) => {\n trackRunStopped(payload.threadId);\n }),\n aui.on({ scope: \"thread\", event: \"thread.runStart\" }, (payload) => {\n runStartedAt.current.set(payload.threadId, Date.now());\n }),\n aui.on({ scope: \"thread\", event: \"thread.runEnd\" }, (payload) => {\n runStartedAt.current.delete(payload.threadId);\n runEndedAt.current.set(payload.threadId, Date.now());\n }),\n aui.on({ scope: \"thread\", event: \"thread.cancelRun\" }, (payload) => {\n trackRunStopped(payload.threadId);\n }),\n aui.on({ scope: \"thread\", event: \"thread.voiceStarted\" }, (payload) => {\n track({ kind: \"voice_started\" }, payload.threadId);\n }),\n aui.on({ scope: \"thread\", event: \"message.reload\" }, (payload) => {\n track(\n { kind: \"message_regenerated\" },\n payload.threadId,\n payload.messageId,\n );\n }),\n aui.on(\n { scope: \"thread\", event: \"message.branchSwitched\" },\n (payload) => {\n track(\n { kind: \"branch_switched\" },\n payload.threadId,\n payload.messageId,\n );\n },\n ),\n aui.on({ scope: \"thread\", event: \"message.copied\" }, (payload) => {\n track({ kind: \"message_copied\" }, payload.threadId, payload.messageId);\n }),\n aui.on({ scope: \"thread\", event: \"message.speak\" }, (payload) => {\n track({ kind: \"speech_started\" }, payload.threadId, payload.messageId);\n }),\n aui.on({ scope: \"thread\", event: \"message.error\" }, (payload) => {\n track(\n { kind: \"error_shown\", props: { reason: payload.reason } },\n payload.threadId,\n payload.messageId,\n );\n }),\n ];\n\n return () => {\n for (const unsubscribe of unsubscribers) unsubscribe();\n };\n }, [adapter, aui, cloudRef]);\n\n useEffect(() => {\n const reportSuggestions = () => {\n const { mainThreadId } = aui.threads.getState();\n if (aui.threadListItem.getState().id !== mainThreadId) return;\n const { isEmpty, suggestions } = aui.thread.getState();\n if (\n !isEmpty ||\n suggestions.length === 0 ||\n shownSuggestions.current.has(mainThreadId)\n ) {\n return;\n }\n shownSuggestions.current.add(mainThreadId);\n void adapter.resolveEngagementEventIds(mainThreadId).then((ids) => {\n cloudRef.current.events?.track({\n kind: \"suggestions_shown\",\n value: suggestions.length,\n ...ids,\n });\n });\n };\n\n reportSuggestions();\n return aui.subscribe(reportSuggestions);\n }, [adapter, aui, cloudRef]);\n};\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { MessageStatus, SourceProviderMetadata, ThreadMessage, ToolApprovalOption } from "../../../types/message.js";
1
+ import { MessageStatus, SourceProviderMetadata, ThreadMessage, ToolApprovalDisplay, ToolApprovalOption } from "../../../types/message.js";
2
2
  import { CompleteAttachment } from "../../../types/attachment.js";
3
3
  import { ExportedMessageRepositoryItem } from "../../../runtime/utils/message-repository.js";
4
4
  import { ReadonlyJSONObject, ReadonlyJSONValue } from "assistant-stream/utils";
@@ -6,11 +6,15 @@ import { CloudMessage } from "assistant-cloud";
6
6
  //#region src/react/runtimes/cloud/auiV0.d.ts
7
7
  type AuiV0ToolApproval = {
8
8
  readonly id: string;
9
+ readonly prompt?: string;
10
+ readonly display?: ToolApprovalDisplay;
11
+ readonly allowFreeform?: boolean;
9
12
  readonly approved?: boolean;
10
13
  readonly reason?: string;
11
14
  readonly isAutomatic?: boolean;
12
15
  readonly options?: readonly ToolApprovalOption[];
13
16
  readonly optionId?: string;
17
+ readonly text?: string;
14
18
  readonly resolution?: "cancelled" | "expired";
15
19
  };
16
20
  type AuiV0MessagePart = {
@@ -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;;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"}
1
+ {"version":3,"file":"auiV0.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/auiV0.ts"],"mappings":";;;;;;KAiBK;WACM;WACA;WACA,UAAU;WACV;WACA;WACA;WACA;WACA,mBAAmB;WACnB;WACA;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"}
@@ -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","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
+ {"version":3,"file":"auiV0.js","names":["MessageStatus","SourceProviderMetadata","ThreadMessage","ToolApprovalDisplay","ToolApprovalOption","CompleteAttachment","fromThreadMessageLike","CloudMessage","isJSONValue","ReadonlyJSONObject","ReadonlyJSONValue","ExportedMessageRepositoryItem","AuiV0ToolApproval","id","prompt","display","allowFreeform","approved","reason","isAutomatic","options","optionId","text","resolution","AuiV0MessagePart","type","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 ToolApprovalDisplay,\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 prompt?: string;\n readonly display?: ToolApprovalDisplay;\n readonly allowFreeform?: boolean;\n readonly approved?: boolean;\n readonly reason?: string;\n readonly isAutomatic?: boolean;\n readonly options?: readonly ToolApprovalOption[];\n readonly optionId?: string;\n readonly text?: 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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"}
@@ -0,0 +1,29 @@
1
+ import { RemoteThreadListAdapter, RuntimeAdapters } from "../../../runtimes/remote-thread-list/types.js";
2
+ import { RefObject } from "react";
3
+ import { AssistantCloud } from "assistant-cloud";
4
+ //#region src/react/runtimes/cloud/createCloudThreadListAdapter.d.ts
5
+ type ThreadData = {
6
+ externalId: string | undefined;
7
+ };
8
+ type CloudThreadListAdapterOptions = {
9
+ cloud?: AssistantCloud | undefined;
10
+ create?: (() => Promise<ThreadData>) | undefined;
11
+ delete?: ((threadId: string) => Promise<void>) | undefined;
12
+ };
13
+ declare const autoCloud: AssistantCloud | undefined;
14
+ declare const useCloudRuntimeAdapters: (cloudRef: RefObject<AssistantCloud>) => RuntimeAdapters;
15
+ /**
16
+ * Builds the `RemoteThreadListAdapter` for an assistant-cloud backend without
17
+ * requiring a hook call site, so plain code (a Vue or Svelte setup function,
18
+ * a module-level config) can construct it. Options are read through the
19
+ * getter on every call, so a stable adapter can follow changing `create` and
20
+ * `delete` callbacks; swapping to a different `cloud` instance requires a new
21
+ * adapter (and `reload()` on the list). Without a `cloud` instance (and
22
+ * without `NEXT_PUBLIC_ASSISTANT_BASE_URL`), the adapter falls back to an
23
+ * in-memory list. `useCloudThreadListAdapter` wraps this for the React
24
+ * hook signature.
25
+ */
26
+ declare const createCloudThreadListAdapter: (options: CloudThreadListAdapterOptions | (() => CloudThreadListAdapterOptions)) => RemoteThreadListAdapter;
27
+ //#endregion
28
+ export { CloudThreadListAdapterOptions, autoCloud, createCloudThreadListAdapter, useCloudRuntimeAdapters };
29
+ //# sourceMappingURL=createCloudThreadListAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createCloudThreadListAdapter.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/createCloudThreadListAdapter.ts"],"mappings":";;;;KAaK;EACH;;KAGU;EACV,QAAQ;EAER,gBAAgB,QAAQ;EACxB,WAAW,qBAAqB;;cASrB,WAAS;cAIT,0BACX,UAAU,UAAU,oBACnB;;;;;;;;;;;;cAyDU,+BACX,SACI,uCACO,mCACV"}
@@ -0,0 +1,160 @@
1
+ import { isRecord } from "../../../utils/json/is-json.js";
2
+ import { InMemoryThreadListAdapter } from "../../../runtimes/remote-thread-list/adapter/in-memory.js";
3
+ import { useAssistantCloudThreadHistoryAdapter } from "./AssistantCloudThreadHistoryAdapter.js";
4
+ import { CloudFileAttachmentAdapter } from "./CloudFileAttachmentAdapter.js";
5
+ import { useMemo, useState } from "@assistant-ui/tap/react-shim";
6
+ import { AssistantCloud } from "assistant-cloud";
7
+ //#region src/react/runtimes/cloud/createCloudThreadListAdapter.ts
8
+ const toCustom = (value) => isRecord(value) ? value : void 0;
9
+ const baseUrl = typeof process !== "undefined" && process?.env?.NEXT_PUBLIC_ASSISTANT_BASE_URL;
10
+ const autoCloud = baseUrl ? new AssistantCloud({
11
+ baseUrl,
12
+ anonymous: true
13
+ }) : void 0;
14
+ const useCloudRuntimeAdapters = (cloudRef) => {
15
+ const history = useAssistantCloudThreadHistoryAdapter(cloudRef);
16
+ const [attachments] = useState(() => new CloudFileAttachmentAdapter(() => cloudRef.current));
17
+ return useMemo(() => ({
18
+ history,
19
+ attachments,
20
+ feedback: history.feedback
21
+ }), [history, attachments]);
22
+ };
23
+ const CLOUD_THREAD_PAGE_SIZE = 20;
24
+ const parseListCursor = (after) => {
25
+ const fallback = {
26
+ activeCursor: after,
27
+ archivedCursor: void 0,
28
+ activeExhausted: false,
29
+ archivedExhausted: false
30
+ };
31
+ if (!after || !after.startsWith("{")) return fallback;
32
+ try {
33
+ const parsed = JSON.parse(after);
34
+ if (!isRecord(parsed)) return fallback;
35
+ return {
36
+ activeCursor: typeof parsed.a === "string" ? parsed.a : void 0,
37
+ archivedCursor: typeof parsed.r === "string" ? parsed.r : void 0,
38
+ activeExhausted: parsed.ae === true,
39
+ archivedExhausted: parsed.re === true
40
+ };
41
+ } catch {
42
+ return fallback;
43
+ }
44
+ };
45
+ /**
46
+ * Builds the `RemoteThreadListAdapter` for an assistant-cloud backend without
47
+ * requiring a hook call site, so plain code (a Vue or Svelte setup function,
48
+ * a module-level config) can construct it. Options are read through the
49
+ * getter on every call, so a stable adapter can follow changing `create` and
50
+ * `delete` callbacks; swapping to a different `cloud` instance requires a new
51
+ * adapter (and `reload()` on the list). Without a `cloud` instance (and
52
+ * without `NEXT_PUBLIC_ASSISTANT_BASE_URL`), the adapter falls back to an
53
+ * in-memory list. `useCloudThreadListAdapter` wraps this for the React
54
+ * hook signature.
55
+ */
56
+ const createCloudThreadListAdapter = (options) => {
57
+ const getOptions = typeof options === "function" ? options : () => options;
58
+ const unstable_useAdapters = function useCloudAdapters() {
59
+ return useCloudRuntimeAdapters({ get current() {
60
+ return getOptions().cloud ?? autoCloud;
61
+ } });
62
+ };
63
+ const cloud = getOptions().cloud ?? autoCloud;
64
+ if (!cloud) {
65
+ const inMemory = new InMemoryThreadListAdapter();
66
+ inMemory.initialize = async (threadId) => {
67
+ return {
68
+ remoteId: threadId,
69
+ externalId: (await getOptions().create?.())?.externalId
70
+ };
71
+ };
72
+ return inMemory;
73
+ }
74
+ return {
75
+ list: async ({ after } = {}) => {
76
+ const { activeCursor, archivedCursor, activeExhausted, archivedExhausted } = parseListCursor(after);
77
+ const [{ threads: activeThreads }, { threads: archivedThreads }] = await Promise.all([activeExhausted ? Promise.resolve({ threads: [] }) : cloud.threads.list({
78
+ limit: CLOUD_THREAD_PAGE_SIZE,
79
+ ...activeCursor ? { after: activeCursor } : {}
80
+ }), archivedExhausted ? Promise.resolve({ threads: [] }) : cloud.threads.list({
81
+ is_archived: true,
82
+ limit: CLOUD_THREAD_PAGE_SIZE,
83
+ ...archivedCursor ? { after: archivedCursor } : {}
84
+ })]);
85
+ const activeNext = !activeExhausted && activeThreads.length === CLOUD_THREAD_PAGE_SIZE ? activeThreads.at(-1)?.id : void 0;
86
+ const archivedNext = !archivedExhausted && archivedThreads.length === CLOUD_THREAD_PAGE_SIZE ? archivedThreads.at(-1)?.id : void 0;
87
+ return {
88
+ threads: [...activeThreads, ...archivedThreads].map((t) => ({
89
+ status: t.is_archived ? "archived" : "regular",
90
+ remoteId: t.id,
91
+ title: t.title,
92
+ lastMessageAt: t.last_message_at ? new Date(t.last_message_at) : void 0,
93
+ externalId: t.external_id ?? void 0,
94
+ custom: toCustom(t.metadata)
95
+ })),
96
+ nextCursor: activeNext || archivedNext ? JSON.stringify({
97
+ a: activeNext,
98
+ r: archivedNext,
99
+ ...activeNext === void 0 ? { ae: true } : {},
100
+ ...archivedNext === void 0 ? { re: true } : {}
101
+ }) : void 0
102
+ };
103
+ },
104
+ initialize: async () => {
105
+ const t = await (getOptions().create?.() ?? Promise.resolve());
106
+ const external_id = t ? t.externalId : void 0;
107
+ const { thread_id: remoteId } = await cloud.threads.create({
108
+ last_message_at: /* @__PURE__ */ new Date(),
109
+ external_id
110
+ });
111
+ return {
112
+ externalId: external_id,
113
+ remoteId
114
+ };
115
+ },
116
+ rename: async (threadId, newTitle) => {
117
+ return cloud.threads.update(threadId, { title: newTitle });
118
+ },
119
+ updateCustom: async (threadId, custom) => {
120
+ return cloud.threads.update(threadId, { metadata: custom ?? null });
121
+ },
122
+ archive: async (threadId) => {
123
+ return cloud.threads.update(threadId, { is_archived: true });
124
+ },
125
+ unarchive: async (threadId) => {
126
+ return cloud.threads.update(threadId, { is_archived: false });
127
+ },
128
+ delete: async (threadId) => {
129
+ await getOptions().delete?.(threadId);
130
+ return cloud.threads.delete(threadId);
131
+ },
132
+ generateTitle: async (threadId, messages) => {
133
+ const filteredMessages = messages.map((msg) => ({
134
+ ...msg,
135
+ content: msg.content.filter((part) => part.type === "text" || part.type === "tool-call")
136
+ }));
137
+ return cloud.runs.stream({
138
+ thread_id: threadId,
139
+ assistant_id: "system/thread_title",
140
+ messages: filteredMessages
141
+ });
142
+ },
143
+ fetch: async (threadId) => {
144
+ const thread = await cloud.threads.get(threadId);
145
+ return {
146
+ status: thread.is_archived ? "archived" : "regular",
147
+ remoteId: thread.id,
148
+ title: thread.title,
149
+ lastMessageAt: thread.last_message_at ? new Date(thread.last_message_at) : void 0,
150
+ externalId: thread.external_id ?? void 0,
151
+ custom: toCustom(thread.metadata)
152
+ };
153
+ },
154
+ unstable_useAdapters
155
+ };
156
+ };
157
+ //#endregion
158
+ export { autoCloud, createCloudThreadListAdapter, useCloudRuntimeAdapters };
159
+
160
+ //# sourceMappingURL=createCloudThreadListAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createCloudThreadListAdapter.js","names":["process","env","Record","RefObject","useMemo","useState","AssistantCloud","RemoteThreadListAdapter","RuntimeAdapters","InMemoryThreadListAdapter","useAssistantCloudThreadHistoryAdapter","CloudFileAttachmentAdapter","isRecord","ThreadData","externalId","CloudThreadListAdapterOptions","cloud","create","Promise","delete","threadId","toCustom","value","undefined","baseUrl","NEXT_PUBLIC_ASSISTANT_BASE_URL","autoCloud","anonymous","useCloudRuntimeAdapters","cloudRef","history","attachments","current","feedback","CLOUD_THREAD_PAGE_SIZE","CloudListCursor","activeCursor","archivedCursor","activeExhausted","archivedExhausted","parseListCursor","after","fallback","startsWith","parsed","JSON","parse","a","r","ae","re","createCloudThreadListAdapter","options","getOptions","unstable_useAdapters","useCloudAdapters","inMemory","initialize","result","remoteId","list","threads","activeThreads","archivedThreads","all","resolve","limit","is_archived","activeNext","length","at","id","archivedNext","map","t","status","const","title","lastMessageAt","last_message_at","Date","external_id","custom","metadata","nextCursor","stringify","createTask","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/createCloudThreadListAdapter.ts"],"sourcesContent":["declare const process: { env: Record<string, string | undefined> };\n\nimport { type RefObject, useMemo, useState } from \"react\";\nimport { AssistantCloud } from \"assistant-cloud\";\nimport type {\n RemoteThreadListAdapter,\n RuntimeAdapters,\n} from \"../../../runtimes/remote-thread-list/types\";\nimport { InMemoryThreadListAdapter } from \"../../../runtimes/remote-thread-list/adapter/in-memory\";\nimport { useAssistantCloudThreadHistoryAdapter } from \"./AssistantCloudThreadHistoryAdapter\";\nimport { CloudFileAttachmentAdapter } from \"./CloudFileAttachmentAdapter\";\nimport { isRecord } from \"../../../utils/json/is-json\";\n\ntype ThreadData = {\n externalId: string | undefined;\n};\n\nexport type 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;\nexport const autoCloud = baseUrl\n ? new AssistantCloud({ baseUrl, anonymous: true })\n : undefined;\n\nexport const useCloudRuntimeAdapters = (\n cloudRef: RefObject<AssistantCloud>,\n): RuntimeAdapters => {\n const history = useAssistantCloudThreadHistoryAdapter(cloudRef);\n const [attachments] = useState(\n () => new CloudFileAttachmentAdapter(() => cloudRef.current),\n );\n return useMemo(\n () => ({\n history,\n attachments,\n feedback: history.feedback,\n }),\n [history, attachments],\n );\n};\n\nconst CLOUD_THREAD_PAGE_SIZE = 20;\n\ntype CloudListCursor = {\n activeCursor: string | undefined;\n archivedCursor: string | undefined;\n activeExhausted: boolean;\n archivedExhausted: boolean;\n};\n\nconst parseListCursor = (after: string | undefined): CloudListCursor => {\n const fallback: CloudListCursor = {\n activeCursor: after,\n archivedCursor: undefined,\n activeExhausted: false,\n archivedExhausted: false,\n };\n if (!after || !after.startsWith(\"{\")) return fallback;\n try {\n const parsed = JSON.parse(after);\n if (!isRecord(parsed)) return fallback;\n return {\n activeCursor: typeof parsed.a === \"string\" ? parsed.a : undefined,\n archivedCursor: typeof parsed.r === \"string\" ? parsed.r : undefined,\n activeExhausted: parsed.ae === true,\n archivedExhausted: parsed.re === true,\n };\n } catch {\n return fallback;\n }\n};\n\n/**\n * Builds the `RemoteThreadListAdapter` for an assistant-cloud backend without\n * requiring a hook call site, so plain code (a Vue or Svelte setup function,\n * a module-level config) can construct it. Options are read through the\n * getter on every call, so a stable adapter can follow changing `create` and\n * `delete` callbacks; swapping to a different `cloud` instance requires a new\n * adapter (and `reload()` on the list). Without a `cloud` instance (and\n * without `NEXT_PUBLIC_ASSISTANT_BASE_URL`), the adapter falls back to an\n * in-memory list. `useCloudThreadListAdapter` wraps this for the React\n * hook signature.\n */\nexport const createCloudThreadListAdapter = (\n options:\n | CloudThreadListAdapterOptions\n | (() => CloudThreadListAdapterOptions),\n): RemoteThreadListAdapter => {\n const getOptions = typeof options === \"function\" ? options : () => options;\n\n const unstable_useAdapters = function useCloudAdapters(): RuntimeAdapters {\n return useCloudRuntimeAdapters({\n get current() {\n return getOptions().cloud ?? autoCloud!;\n },\n });\n };\n\n const cloud = getOptions().cloud ?? autoCloud;\n if (!cloud) {\n const inMemory = new InMemoryThreadListAdapter();\n inMemory.initialize = async (threadId: string) => {\n const result = await getOptions().create?.();\n return { remoteId: threadId, externalId: result?.externalId };\n };\n return inMemory;\n }\n\n return {\n list: async ({ after } = {}) => {\n const {\n activeCursor,\n archivedCursor,\n activeExhausted,\n archivedExhausted,\n } = parseListCursor(after);\n const [{ threads: activeThreads }, { threads: archivedThreads }] =\n await Promise.all([\n activeExhausted\n ? Promise.resolve({ threads: [] })\n : cloud.threads.list({\n limit: CLOUD_THREAD_PAGE_SIZE,\n ...(activeCursor ? { after: activeCursor } : {}),\n }),\n archivedExhausted\n ? Promise.resolve({ threads: [] })\n : cloud.threads.list({\n is_archived: true,\n limit: CLOUD_THREAD_PAGE_SIZE,\n ...(archivedCursor ? { after: archivedCursor } : {}),\n }),\n ]);\n const activeNext =\n !activeExhausted && activeThreads.length === CLOUD_THREAD_PAGE_SIZE\n ? activeThreads.at(-1)?.id\n : undefined;\n const archivedNext =\n !archivedExhausted && archivedThreads.length === CLOUD_THREAD_PAGE_SIZE\n ? archivedThreads.at(-1)?.id\n : undefined;\n const threads = [...activeThreads, ...archivedThreads];\n return {\n threads: threads.map((t) => ({\n status: t.is_archived ? (\"archived\" as const) : (\"regular\" as const),\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 activeNext || archivedNext\n ? JSON.stringify({\n a: activeNext,\n r: archivedNext,\n ...(activeNext === undefined ? { ae: true } : {}),\n ...(archivedNext === undefined ? { re: true } : {}),\n })\n : undefined,\n };\n },\n\n initialize: async () => {\n const createTask = getOptions().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 getOptions().delete?.(threadId);\n return cloud.threads.delete(threadId);\n },\n\n generateTitle: async (threadId, messages) => {\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\n ? (\"archived\" as const)\n : (\"regular\" as const),\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_useAdapters,\n };\n};\n"],"mappings":"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"}