@assistant-ui/core 0.3.14 → 0.3.16

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 (341) hide show
  1. package/dist/adapters/voice.js +11 -0
  2. package/dist/adapters/voice.js.map +1 -1
  3. package/dist/index.js +1 -1
  4. package/dist/internal.d.ts +8 -2
  5. package/dist/internal.js +9 -3
  6. package/dist/model-context/frame/host.d.ts +1 -1
  7. package/dist/model-context/frame/host.d.ts.map +1 -1
  8. package/dist/model-context/frame/host.js +20 -5
  9. package/dist/model-context/frame/host.js.map +1 -1
  10. package/dist/model-context/frame/provider.d.ts +6 -0
  11. package/dist/model-context/frame/provider.d.ts.map +1 -1
  12. package/dist/model-context/frame/provider.js +126 -16
  13. package/dist/model-context/frame/provider.js.map +1 -1
  14. package/dist/model-context/frame/types.d.ts +4 -1
  15. package/dist/model-context/frame/types.d.ts.map +1 -1
  16. package/dist/model-context/frame/types.js.map +1 -1
  17. package/dist/model-context/interactable-composer-metadata.d.ts +1 -1
  18. package/dist/model-context/interactable-composer-metadata.js +1 -1
  19. package/dist/model-context/interactable-composer-metadata.js.map +1 -1
  20. package/dist/model-context/registry.d.ts +2 -2
  21. package/dist/model-context/registry.d.ts.map +1 -1
  22. package/dist/model-context/registry.js +9 -28
  23. package/dist/model-context/registry.js.map +1 -1
  24. package/dist/react/client/InMemoryThreadList.d.ts.map +1 -1
  25. package/dist/react/client/InMemoryThreadList.js +24 -20
  26. package/dist/react/client/InMemoryThreadList.js.map +1 -1
  27. package/dist/react/client/Interactables.d.ts.map +1 -1
  28. package/dist/react/client/Interactables.js +59 -177
  29. package/dist/react/client/Interactables.js.map +1 -1
  30. package/dist/react/client/RemoteThreadList.d.ts +1 -1
  31. package/dist/react/client/RemoteThreadList.d.ts.map +1 -1
  32. package/dist/react/client/RemoteThreadList.js +117 -78
  33. package/dist/react/client/RemoteThreadList.js.map +1 -1
  34. package/dist/react/index.d.ts +2 -1
  35. package/dist/react/interactables-legacy/Interactables.d.ts.map +1 -1
  36. package/dist/react/interactables-legacy/Interactables.js +56 -174
  37. package/dist/react/interactables-legacy/Interactables.js.map +1 -1
  38. package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts +24 -0
  39. package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts.map +1 -0
  40. package/dist/react/interactables-shared/useInteractablePersistenceQueue.js +138 -0
  41. package/dist/react/interactables-shared/useInteractablePersistenceQueue.js.map +1 -0
  42. package/dist/react/primitive-hooks/useActionBarCopy.js +7 -1
  43. package/dist/react/primitive-hooks/useActionBarCopy.js.map +1 -1
  44. package/dist/react/primitive-hooks/useThreadIsEmpty.d.ts +3 -0
  45. package/dist/react/primitive-hooks/useThreadIsEmpty.d.ts.map +1 -1
  46. package/dist/react/primitive-hooks/useThreadIsEmpty.js +3 -0
  47. package/dist/react/primitive-hooks/useThreadIsEmpty.js.map +1 -1
  48. package/dist/react/primitive-hooks/useThreadIsRunning.d.ts +3 -0
  49. package/dist/react/primitive-hooks/useThreadIsRunning.d.ts.map +1 -1
  50. package/dist/react/primitive-hooks/useThreadIsRunning.js +3 -0
  51. package/dist/react/primitive-hooks/useThreadIsRunning.js.map +1 -1
  52. package/dist/react/primitives/composer/ComposerIf.js.map +1 -1
  53. package/dist/react/primitives/composer/ComposerQueue.d.ts +2 -1
  54. package/dist/react/primitives/composer/ComposerQueue.d.ts.map +1 -1
  55. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  56. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +3 -1
  57. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  58. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +6 -0
  59. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  60. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +7 -1
  61. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  62. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +174 -64
  63. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  64. package/dist/react/runtimes/RemoteThreadResource.d.ts.map +1 -1
  65. package/dist/react/runtimes/RemoteThreadResource.js +2 -0
  66. package/dist/react/runtimes/RemoteThreadResource.js.map +1 -1
  67. package/dist/react/runtimes/assistant-transport/runManager.d.ts.map +1 -1
  68. package/dist/react/runtimes/assistant-transport/runManager.js +2 -12
  69. package/dist/react/runtimes/assistant-transport/runManager.js.map +1 -1
  70. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts.map +1 -1
  71. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.js +1 -1
  72. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.js.map +1 -1
  73. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +3 -10
  74. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  75. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +20 -67
  76. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  77. package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.d.ts +12 -0
  78. package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.d.ts.map +1 -0
  79. package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.js +10 -0
  80. package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.js.map +1 -0
  81. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
  82. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +38 -5
  83. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  84. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.js.map +1 -1
  85. package/dist/react/runtimes/createMessageConverter.d.ts +2 -1
  86. package/dist/react/runtimes/createMessageConverter.d.ts.map +1 -1
  87. package/dist/react/runtimes/external-message-converter.d.ts +6 -25
  88. package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
  89. package/dist/react/runtimes/external-message-converter.js +33 -233
  90. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  91. package/dist/runtime/api/composer-runtime.d.ts +1 -1
  92. package/dist/runtime/api/composer-runtime.js.map +1 -1
  93. package/dist/runtime/api/thread-runtime.d.ts +1 -2
  94. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  95. package/dist/runtime/base/base-composer-runtime-core.d.ts +1 -1
  96. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  97. package/dist/runtime/base/base-composer-runtime-core.js +14 -29
  98. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  99. package/dist/runtime/base/base-thread-runtime-core.d.ts +2 -4
  100. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  101. package/dist/runtime/base/base-thread-runtime-core.js +3 -9
  102. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  103. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +1 -1
  104. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
  105. package/dist/runtime/base/default-thread-composer-runtime-core.js +1 -1
  106. package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
  107. package/dist/runtime/interfaces/composer-runtime-core.d.ts +1 -1
  108. package/dist/runtime/interfaces/thread-runtime-core.d.ts +1 -1
  109. package/dist/runtime/internal.d.ts +2 -1
  110. package/dist/runtime/internal.js +2 -1
  111. package/dist/runtime/queue/external-thread-queue-adapter.d.ts +1 -1
  112. package/dist/runtime/queue/message-queue.d.ts.map +1 -1
  113. package/dist/runtime/queue/message-queue.js +1 -1
  114. package/dist/runtime/queue/message-queue.js.map +1 -1
  115. package/dist/runtime/queue/queue-item.d.ts +12 -0
  116. package/dist/runtime/queue/queue-item.d.ts.map +1 -0
  117. package/dist/runtime/queue/queue-item.js +6 -0
  118. package/dist/runtime/queue/queue-item.js.map +1 -0
  119. package/dist/runtime/utils/abortable-thread-load.d.ts +15 -0
  120. package/dist/runtime/utils/abortable-thread-load.d.ts.map +1 -0
  121. package/dist/runtime/utils/abortable-thread-load.js +35 -0
  122. package/dist/runtime/utils/abortable-thread-load.js.map +1 -0
  123. package/dist/runtime/utils/attachment-add-operations.d.ts +18 -0
  124. package/dist/runtime/utils/attachment-add-operations.d.ts.map +1 -0
  125. package/dist/runtime/utils/attachment-add-operations.js +43 -0
  126. package/dist/runtime/utils/attachment-add-operations.js.map +1 -0
  127. package/dist/runtime/utils/auto-status.d.ts +6 -1
  128. package/dist/runtime/utils/auto-status.d.ts.map +1 -1
  129. package/dist/runtime/utils/auto-status.js +7 -1
  130. package/dist/runtime/utils/auto-status.js.map +1 -1
  131. package/dist/runtime/utils/external-message-conversion.d.ts +47 -0
  132. package/dist/runtime/utils/external-message-conversion.d.ts.map +1 -0
  133. package/dist/runtime/utils/external-message-conversion.js +221 -0
  134. package/dist/runtime/utils/external-message-conversion.js.map +1 -0
  135. package/dist/runtime/utils/external-store-message.d.ts +2 -1
  136. package/dist/runtime/utils/external-store-message.d.ts.map +1 -1
  137. package/dist/runtime/utils/external-store-message.js +2 -1
  138. package/dist/runtime/utils/external-store-message.js.map +1 -1
  139. package/dist/runtime/utils/message-repository-session.d.ts +30 -0
  140. package/dist/runtime/utils/message-repository-session.d.ts.map +1 -0
  141. package/dist/runtime/utils/message-repository-session.js +130 -0
  142. package/dist/runtime/utils/message-repository-session.js.map +1 -0
  143. package/dist/runtime/utils/message-repository.d.ts.map +1 -1
  144. package/dist/runtime/utils/message-repository.js +30 -22
  145. package/dist/runtime/utils/message-repository.js.map +1 -1
  146. package/dist/runtime/utils/pending-tool-calls.d.ts +20 -0
  147. package/dist/runtime/utils/pending-tool-calls.d.ts.map +1 -0
  148. package/dist/runtime/utils/pending-tool-calls.js +22 -0
  149. package/dist/runtime/utils/pending-tool-calls.js.map +1 -0
  150. package/dist/runtime/utils/thread-message-like.d.ts +2 -1
  151. package/dist/runtime/utils/thread-message-like.d.ts.map +1 -1
  152. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  153. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts +2 -5
  154. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  155. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +3 -10
  156. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  157. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +19 -1
  158. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  159. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +124 -20
  160. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  161. package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts +102 -0
  162. package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts.map +1 -0
  163. package/dist/runtimes/inert/InertThreadRuntimeCore.js +156 -0
  164. package/dist/runtimes/inert/InertThreadRuntimeCore.js.map +1 -0
  165. package/dist/runtimes/local/local-thread-runtime-core.d.ts +3 -1
  166. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  167. package/dist/runtimes/local/local-thread-runtime-core.js +45 -8
  168. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  169. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +12 -60
  170. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
  171. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js +10 -145
  172. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js.map +1 -1
  173. package/dist/runtimes/remote-thread-list/adapter-changed.d.ts +9 -0
  174. package/dist/runtimes/remote-thread-list/adapter-changed.d.ts.map +1 -0
  175. package/dist/runtimes/remote-thread-list/adapter-changed.js +13 -0
  176. package/dist/runtimes/remote-thread-list/adapter-changed.js.map +1 -0
  177. package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts.map +1 -1
  178. package/dist/runtimes/remote-thread-list/empty-thread-core.js +16 -155
  179. package/dist/runtimes/remote-thread-list/empty-thread-core.js.map +1 -1
  180. package/dist/runtimes/remote-thread-list/optimistic-state.d.ts +2 -0
  181. package/dist/runtimes/remote-thread-list/optimistic-state.d.ts.map +1 -1
  182. package/dist/runtimes/remote-thread-list/optimistic-state.js +11 -0
  183. package/dist/runtimes/remote-thread-list/optimistic-state.js.map +1 -1
  184. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +12 -1
  185. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -1
  186. package/dist/runtimes/remote-thread-list/remote-thread-state.js +77 -1
  187. package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
  188. package/dist/runtimes/remote-thread-list/types.d.ts +3 -0
  189. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  190. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
  191. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +2 -0
  192. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  193. package/dist/store/clients/external-thread.d.ts.map +1 -1
  194. package/dist/store/clients/external-thread.js +75 -100
  195. package/dist/store/clients/external-thread.js.map +1 -1
  196. package/dist/store/clients/single-thread-list.d.ts.map +1 -1
  197. package/dist/store/clients/single-thread-list.js +1 -1
  198. package/dist/store/clients/single-thread-list.js.map +1 -1
  199. package/dist/store/clients/suggestions.d.ts.map +1 -1
  200. package/dist/store/clients/suggestions.js +16 -7
  201. package/dist/store/clients/suggestions.js.map +1 -1
  202. package/dist/store/index.d.ts +4 -2
  203. package/dist/store/runtime-clients/handle-runtime-action.d.ts.map +1 -1
  204. package/dist/store/runtime-clients/handle-runtime-action.js +2 -0
  205. package/dist/store/runtime-clients/handle-runtime-action.js.map +1 -1
  206. package/dist/store/scope-registration.d.ts +1 -1
  207. package/dist/store/scopes/composer.d.ts +2 -1
  208. package/dist/store/scopes/composer.d.ts.map +1 -1
  209. package/dist/store/scopes/message.d.ts +1 -1
  210. package/dist/store/scopes/queue-item.d.ts +2 -9
  211. package/dist/store/scopes/queue-item.d.ts.map +1 -1
  212. package/dist/store/scopes/queue-item.js +0 -6
  213. package/dist/types/message.d.ts +8 -4
  214. package/dist/types/message.d.ts.map +1 -1
  215. package/dist/types/message.js.map +1 -1
  216. package/dist/utils/data-url.d.ts +14 -1
  217. package/dist/utils/data-url.d.ts.map +1 -1
  218. package/dist/utils/data-url.js +13 -1
  219. package/dist/utils/data-url.js.map +1 -1
  220. package/dist/utils/invoke-user-callback.d.ts +5 -0
  221. package/dist/utils/invoke-user-callback.d.ts.map +1 -0
  222. package/dist/utils/invoke-user-callback.js +19 -0
  223. package/dist/utils/invoke-user-callback.js.map +1 -0
  224. package/dist/utils/normalizePartStatus.js.map +1 -1
  225. package/dist/utils/silent-runtime-action.d.ts +6 -0
  226. package/dist/utils/silent-runtime-action.d.ts.map +1 -0
  227. package/dist/utils/silent-runtime-action.js +7 -0
  228. package/dist/utils/silent-runtime-action.js.map +1 -0
  229. package/package.json +10 -10
  230. package/src/adapters/voice.test.ts +66 -1
  231. package/src/adapters/voice.ts +8 -0
  232. package/src/internal.ts +13 -0
  233. package/src/model-context/frame/host.test.ts +152 -9
  234. package/src/model-context/frame/host.ts +23 -5
  235. package/src/model-context/frame/provider.test.ts +601 -19
  236. package/src/model-context/frame/provider.ts +158 -20
  237. package/src/model-context/frame/types.ts +5 -0
  238. package/src/model-context/interactable-composer-metadata.ts +1 -1
  239. package/src/model-context/registry.test.ts +44 -0
  240. package/src/model-context/registry.ts +13 -35
  241. package/src/react/client/InMemoryThreadList.test.tsx +49 -0
  242. package/src/react/client/InMemoryThreadList.ts +7 -1
  243. package/src/react/client/Interactables.ts +19 -178
  244. package/src/react/client/RemoteThreadList.test.ts +292 -0
  245. package/src/react/client/RemoteThreadList.ts +119 -82
  246. package/src/react/interactables-legacy/Interactables.ts +20 -177
  247. package/src/react/interactables-shared/useInteractablePersistenceQueue.test.tsx +161 -0
  248. package/src/react/interactables-shared/useInteractablePersistenceQueue.ts +206 -0
  249. package/src/react/primitive-hooks/useActionBarCopy.test.ts +15 -0
  250. package/src/react/primitive-hooks/useActionBarCopy.ts +13 -3
  251. package/src/react/primitive-hooks/useThreadIsEmpty.ts +3 -0
  252. package/src/react/primitive-hooks/useThreadIsRunning.ts +3 -0
  253. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +12 -0
  254. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.republish.test.ts +87 -0
  255. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +251 -76
  256. package/src/react/runtimes/RemoteThreadResource.ts +2 -0
  257. package/src/react/runtimes/assistant-transport/runManager.ts +4 -17
  258. package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.test.tsx +58 -0
  259. package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.ts +3 -1
  260. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +92 -0
  261. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +40 -141
  262. package/src/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.test.ts +37 -0
  263. package/src/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.ts +18 -0
  264. package/src/react/runtimes/cloud/useCloudThreadListAdapter.test.tsx +98 -3
  265. package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +68 -6
  266. package/src/react/runtimes/external-message-converter.test.ts +0 -14
  267. package/src/react/runtimes/external-message-converter.test.tsx +77 -0
  268. package/src/react/runtimes/external-message-converter.ts +58 -481
  269. package/src/react/runtimes/useLocalRuntime.test.tsx +5 -5
  270. package/src/runtime/api/composer-runtime.ts +1 -1
  271. package/src/runtime/api/message-runtime.test.ts +28 -1
  272. package/src/runtime/base/base-composer-runtime-core.ts +20 -40
  273. package/src/runtime/base/base-thread-runtime-core.test.ts +16 -0
  274. package/src/runtime/base/base-thread-runtime-core.ts +6 -11
  275. package/src/runtime/base/default-thread-composer-runtime-core.ts +1 -4
  276. package/src/runtime/interfaces/composer-runtime-core.ts +1 -1
  277. package/src/runtime/interfaces/thread-runtime-core.ts +1 -1
  278. package/src/runtime/internal.ts +5 -0
  279. package/src/runtime/queue/external-thread-queue-adapter.ts +1 -1
  280. package/src/runtime/queue/message-queue.ts +1 -4
  281. package/src/runtime/queue/queue-item.ts +10 -0
  282. package/src/runtime/utils/abortable-thread-load.test.ts +87 -0
  283. package/src/runtime/utils/abortable-thread-load.ts +53 -0
  284. package/src/runtime/utils/attachment-add-operations.ts +59 -0
  285. package/src/runtime/utils/auto-status.ts +33 -0
  286. package/src/runtime/utils/external-message-conversion.test.ts +113 -0
  287. package/src/runtime/utils/external-message-conversion.ts +494 -0
  288. package/src/runtime/utils/external-store-message.ts +2 -0
  289. package/src/runtime/utils/message-repository-session.test.ts +195 -0
  290. package/src/runtime/utils/message-repository-session.ts +176 -0
  291. package/src/runtime/utils/message-repository.ts +33 -22
  292. package/src/runtime/utils/pending-tool-calls.test.ts +57 -0
  293. package/src/runtime/utils/pending-tool-calls.ts +35 -0
  294. package/src/runtime/utils/thread-message-like.ts +2 -0
  295. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +6 -14
  296. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +179 -28
  297. package/src/runtimes/inert/InertThreadRuntimeCore.test.ts +253 -0
  298. package/src/runtimes/inert/InertThreadRuntimeCore.ts +232 -0
  299. package/src/runtimes/local/local-thread-runtime-core.test.ts +491 -1
  300. package/src/runtimes/local/local-thread-runtime-core.ts +86 -11
  301. package/src/runtimes/readonly/ReadonlyThreadRuntimeCore.ts +17 -209
  302. package/src/runtimes/remote-thread-list/adapter-changed.ts +10 -0
  303. package/src/runtimes/remote-thread-list/empty-thread-core.ts +28 -221
  304. package/src/runtimes/remote-thread-list/optimistic-state.test.ts +18 -0
  305. package/src/runtimes/remote-thread-list/optimistic-state.ts +13 -0
  306. package/src/runtimes/remote-thread-list/remote-thread-state.test.ts +37 -0
  307. package/src/runtimes/remote-thread-list/remote-thread-state.ts +123 -0
  308. package/src/runtimes/remote-thread-list/types.ts +4 -0
  309. package/src/runtimes/tool-invocations/EDGE_CASES.md +17 -0
  310. package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +140 -0
  311. package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +3 -0
  312. package/src/store/clients/external-thread.ts +17 -62
  313. package/src/store/clients/single-thread-list.ts +4 -1
  314. package/src/store/clients/suggestions.test.ts +31 -0
  315. package/src/store/clients/suggestions.ts +18 -19
  316. package/src/store/runtime-clients/handle-runtime-action.test.ts +40 -0
  317. package/src/store/runtime-clients/handle-runtime-action.ts +3 -0
  318. package/src/store/scopes/message.ts +1 -1
  319. package/src/store/scopes/queue-item.ts +2 -9
  320. package/src/tests/MessageRepository.test.ts +125 -0
  321. package/src/tests/RemoteThreadListThreadListRuntimeCore-errors.test.ts +2 -2
  322. package/src/tests/RemoteThreadListThreadListRuntimeCore-load-race.test.ts +194 -0
  323. package/src/tests/RemoteThreadListThreadListRuntimeCore-loadMore.test.ts +8 -6
  324. package/src/tests/RemoteThreadListThreadListRuntimeCore-title-race.test.ts +158 -0
  325. package/src/tests/empty-thread-core.test.ts +6 -0
  326. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +184 -0
  327. package/src/tests/external-store-thread-runtime-core.test.ts +642 -0
  328. package/src/tests/external-thread-attachments.test.tsx +173 -0
  329. package/src/tests/external-thread-isEmpty.test.tsx +100 -0
  330. package/src/tests/remote-thread-list-adapter-switch.test.ts +383 -0
  331. package/src/tests/single-thread-list-item.test.tsx +47 -0
  332. package/src/tests/thread-message-like.test.ts +39 -1
  333. package/src/tests/useRemoteThreadListRuntime-controlled.test.tsx +67 -0
  334. package/src/types/message.ts +9 -4
  335. package/src/utils/data-url.test.ts +52 -1
  336. package/src/utils/data-url.ts +21 -0
  337. package/src/utils/invoke-user-callback.test.ts +82 -0
  338. package/src/utils/invoke-user-callback.ts +31 -0
  339. package/src/utils/normalizePartStatus.ts +1 -1
  340. package/src/utils/silent-runtime-action.ts +6 -0
  341. package/dist/store/scopes/queue-item.js.map +0 -1
@@ -1,26 +1,19 @@
1
1
  import { ThreadHistoryAdapter } from "../../../adapters/thread-history.js";
2
2
  import { RefObject } from "react";
3
- import { AssistantCloud } from "assistant-cloud";
3
+ import { AssistantCloud, AssistantCloudRunReportToolCall } from "assistant-cloud";
4
4
  //#region src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts
5
- type TelemetryToolCall = {
6
- tool_name: string;
7
- tool_call_id: string;
8
- tool_args?: string;
9
- tool_result?: string;
10
- tool_source?: "mcp" | "frontend" | "backend";
11
- };
12
5
  type TelemetryStepData = {
13
6
  input_tokens?: number;
14
7
  output_tokens?: number;
15
8
  reasoning_tokens?: number;
16
9
  cached_input_tokens?: number;
17
- tool_calls?: TelemetryToolCall[];
10
+ tool_calls?: AssistantCloudRunReportToolCall[];
18
11
  start_ms?: number;
19
12
  end_ms?: number;
20
13
  };
21
14
  type TelemetryData = {
22
15
  status: "completed" | "incomplete" | "error";
23
- toolCalls?: TelemetryToolCall[];
16
+ toolCalls?: AssistantCloudRunReportToolCall[];
24
17
  totalSteps?: number;
25
18
  inputTokens?: number;
26
19
  outputTokens?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantCloudThreadHistoryAdapter.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts"],"mappings":";;;;KA8RK;EACH;EACA;EACA;EACA;EACA;;KAoDG;EACH;EACA;EACA;EACA;EACA,aAAa;EACb;EACA;;KAmBG;EACH;EACA,YAAY;EACZ;EACA;EACA;EACA;EACA;EACA;EACA,WAAW;EACX,QAAQ;EACR;;iBAiCc,aAAa,GAAG,SAAS,IAAI;iBA+b7B,sCACd,UAAU,UAAU,kBACnB"}
1
+ {"version":3,"file":"AssistantCloudThreadHistoryAdapter.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts"],"mappings":";;;;KAmRK;EACH;EACA;EACA;EACA;EACA,aAAa;EACb;EACA;;KAmBG;EACH;EACA,YAAY;EACZ;EACA;EACA;EACA;EACA;EACA;EACA,WAAW;EACX,QAAQ;EACR;;iBAiCc,aAAa,GAAG,SAAS,IAAI;iBA8Z7B,sCACd,UAAU,UAAU,kBACnB"}
@@ -1,7 +1,7 @@
1
1
  import { auiV0Decode, auiV0Encode } from "./auiV0.js";
2
2
  import { useEffect, useRef, useState } from "@assistant-ui/tap/react-shim";
3
3
  import { getClientId, useAui } from "@assistant-ui/store";
4
- import { CloudMessagePersistence, createFormattedPersistence } from "assistant-cloud";
4
+ import { CloudMessagePersistence, createFormattedPersistence, createRunTelemetryToolCall, normalizeRunTelemetryUsage, truncateRunTelemetryText } from "assistant-cloud";
5
5
  //#region src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts
6
6
  const globalPersistence = /* @__PURE__ */ new WeakMap();
7
7
  var AssistantCloudThreadHistoryAdapter = class {
@@ -131,54 +131,6 @@ var AssistantCloudThreadHistoryAdapter = class {
131
131
  this.cloudRef.current.runs.report(report).catch(() => {});
132
132
  }
133
133
  };
134
- const MAX_SPAN_CONTENT = 5e4;
135
- function truncateStr(value) {
136
- if (value.length <= MAX_SPAN_CONTENT) return value;
137
- return value.slice(0, MAX_SPAN_CONTENT);
138
- }
139
- function safeStringify(value) {
140
- if (value == null) return void 0;
141
- try {
142
- return truncateStr(JSON.stringify(value));
143
- } catch {
144
- return;
145
- }
146
- }
147
- const BASE64_PATTERN = /^[A-Za-z0-9+/]{100,}={0,2}$/;
148
- function summarizeMcpResult(value) {
149
- if (value == null) return void 0;
150
- try {
151
- const parsed = typeof value === "string" ? JSON.parse(value) : value;
152
- if (Array.isArray(parsed)) {
153
- const summarized = parsed.map((item) => {
154
- if (item && typeof item === "object" && item.type) {
155
- if ((item.type === "image" || item.type === "audio") && typeof item.data === "string" && BASE64_PATTERN.test(item.data.slice(0, 200))) {
156
- const sizeKB = (item.data.length * 3 / 4 / 1024).toFixed(1);
157
- return {
158
- ...item,
159
- data: `[${item.type}: ${sizeKB}KB]`
160
- };
161
- }
162
- }
163
- return item;
164
- });
165
- return truncateStr(JSON.stringify(summarized));
166
- }
167
- } catch {}
168
- return safeStringify(value);
169
- }
170
- function buildToolCall(toolName, toolCallId, args, result, argsText, toolSource) {
171
- const call = {
172
- tool_name: toolName,
173
- tool_call_id: toolCallId
174
- };
175
- const toolArgs = argsText ?? safeStringify(args);
176
- if (toolArgs !== void 0) call.tool_args = toolArgs;
177
- const toolResult = toolSource === "mcp" ? summarizeMcpResult(result) : safeStringify(result);
178
- if (toolResult !== void 0) call.tool_result = toolResult;
179
- if (toolSource) call.tool_source = toolSource;
180
- return call;
181
- }
182
134
  function mergeStepTimestamps(steps, timestamps) {
183
135
  if (!timestamps) return steps;
184
136
  if (!steps) return timestamps.map((t) => ({ ...t }));
@@ -211,9 +163,15 @@ function extractAuiV0(content) {
211
163
  const msg = content;
212
164
  if (msg.role !== "assistant") return null;
213
165
  if (msg.status?.type === "requires-action") return null;
214
- const toolCalls = msg.content?.filter((p) => p.type === "tool-call" && p.toolName && p.toolCallId).map((p) => buildToolCall(p.toolName, p.toolCallId, p.args, p.result, p.argsText));
166
+ const toolCalls = msg.content?.filter((p) => p.type === "tool-call" && p.toolName && p.toolCallId).map((p) => createRunTelemetryToolCall({
167
+ toolName: p.toolName,
168
+ toolCallId: p.toolCallId,
169
+ args: p.args,
170
+ result: p.result,
171
+ argsText: p.argsText
172
+ }));
215
173
  const textParts = msg.content?.filter((p) => p.type === "text" && p.text);
216
- const outputText = textParts && textParts.length > 0 ? truncateStr(textParts.map((p) => p.text).join("")) : void 0;
174
+ const outputText = textParts && textParts.length > 0 ? truncateRunTelemetryText(textParts.map((p) => p.text).join("")) : void 0;
217
175
  const steps = msg.metadata?.steps;
218
176
  let inputTokens;
219
177
  let outputTokens;
@@ -284,8 +242,14 @@ function isDynamicToolPart(p) {
284
242
  return p.type === "dynamic-tool" || p.type.startsWith("dynamic-tool-");
285
243
  }
286
244
  function partToToolCall(p) {
287
- const toolSource = isDynamicToolPart(p) ? "mcp" : void 0;
288
- return buildToolCall(p.toolName ?? p.type.slice(5), p.toolCallId, p.args ?? p.input, p.result ?? p.output, void 0, toolSource);
245
+ const toolSource = isDynamicToolPart(p) ? "mcp" : "frontend";
246
+ return createRunTelemetryToolCall({
247
+ toolName: p.toolName ?? p.type.slice(5),
248
+ toolCallId: p.toolCallId,
249
+ args: p.args ?? p.input,
250
+ result: p.result ?? p.output,
251
+ toolSource
252
+ });
289
253
  }
290
254
  function collectAiSdkV6Parts(parts) {
291
255
  const textParts = [];
@@ -316,7 +280,7 @@ function extractModelId(metadata) {
316
280
  }
317
281
  function buildAiSdkV6Result(textParts, toolCalls, totalSteps, metadata, stepsData, usage) {
318
282
  const hasText = textParts.length > 0;
319
- const outputText = hasText ? truncateStr(textParts.join("")) : void 0;
283
+ const outputText = hasText ? truncateRunTelemetryText(textParts.join("")) : void 0;
320
284
  const modelId = extractModelId(metadata);
321
285
  const steps = stepsData && stepsData.length > 1 ? stepsData.map((s) => ({ ...s.tool_calls.length > 0 ? { tool_calls: s.tool_calls } : void 0 })) : void 0;
322
286
  return {
@@ -333,21 +297,10 @@ function buildAiSdkV6Result(textParts, toolCalls, totalSteps, metadata, stepsDat
333
297
  ...modelId ? { modelId } : void 0
334
298
  };
335
299
  }
336
- function normalizeUsage(u) {
337
- const input = u.inputTokens ?? u.promptTokens;
338
- const output = u.outputTokens ?? u.completionTokens;
339
- if (input == null && output == null && u.reasoningTokens == null && u.cachedInputTokens == null) return;
340
- return {
341
- ...input != null ? { inputTokens: input } : void 0,
342
- ...output != null ? { outputTokens: output } : void 0,
343
- ...u.reasoningTokens != null ? { reasoningTokens: u.reasoningTokens } : void 0,
344
- ...u.cachedInputTokens != null ? { cachedInputTokens: u.cachedInputTokens } : void 0
345
- };
346
- }
347
300
  function extractAiSdkV6Usage(metadata) {
348
301
  const usage = metadata?.usage;
349
302
  if (usage) {
350
- const normalized = normalizeUsage(usage);
303
+ const normalized = normalizeRunTelemetryUsage(usage);
351
304
  if (normalized) return normalized;
352
305
  }
353
306
  const steps = metadata?.steps;
@@ -363,7 +316,7 @@ function extractAiSdkV6Usage(metadata) {
363
316
  let hasAny = false;
364
317
  for (const s of steps) {
365
318
  if (!s.usage) continue;
366
- const n = normalizeUsage(s.usage);
319
+ const n = normalizeRunTelemetryUsage(s.usage);
367
320
  if (n) {
368
321
  if (n.inputTokens != null) {
369
322
  inputTokens += n.inputTokens;
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantCloudThreadHistoryAdapter.js","names":["RefObject","useEffect","useRef","useState","GenericThreadHistoryAdapter","ThreadHistoryAdapter","MessageFormatAdapter","MessageFormatItem","MessageFormatRepository","ExportedMessageRepositoryItem","AssistantCloud","CloudMessagePersistence","createFormattedPersistence","auiV0Decode","auiV0Encode","AssistantClient","getClientId","useAui","ThreadListItemMethods","CloudThreadListItem","Pick","globalPersistence","WeakMap","ClientId","AssistantCloudThreadHistoryAdapter","cloudRef","getAui","constructor","aui","getPersistence","threadListItem","key","has","set","current","get","_persistence","tryGetKeyedThreadListItem","live","source","undefined","id","getState","threads","item","withFormat","Record","formatAdapter","TMessage","TStorageFormat","adapter","pinCurrent","next","resolvePinned","getFormatted","getTargetFormatted","pin","append","pinned","Error","remoteId","initialize","update","localMessageId","delete","reportTelemetry","items","options","durationMs","stepTimestamps","StepTimestamp","encodedRunMessages","map","encode","_reportRunTelemetry","format","load","Promise","messages","parentId","message","encoded","telemetry","enabled","_maybeReportRun","isPersisted","filter","m","reverse","runMessages","T","extracted","extractRunTelemetry","_sendReport","content","extractTelemetry","data","TelemetryData","mergedSteps","mergeStepTimestamps","steps","initial","Parameters","this","runs","report","thread_id","status","totalSteps","total_steps","toolCalls","tool_calls","inputTokens","input_tokens","outputTokens","output_tokens","reasoningTokens","reasoning_tokens","cachedInputTokens","cached_input_tokens","duration_ms","outputText","output_text","metadata","modelId","model_id","beforeReport","catch","MAX_SPAN_CONTENT","truncateStr","value","length","slice","safeStringify","JSON","stringify","TelemetryToolCall","tool_name","tool_call_id","tool_args","tool_result","tool_source","BASE64_PATTERN","summarizeMcpResult","parsed","parse","Array","isArray","summarized","type","test","sizeKB","toFixed","buildToolCall","toolName","toolCallId","args","result","argsText","toolSource","call","toolArgs","toolResult","TelemetryStepData","start_ms","end_ms","timestamps","t","len","Math","min","s","i","extractAuiV0","extractAiSdkV6","aggregateAiSdkV6RunSteps","AUI_STATUS_MAP","error","incomplete","msg","role","text","usage","custom","p","textParts","join","totalInput","totalOutput","totalReasoning","totalCachedInput","hasInput","hasOutput","hasReasoning","hasCachedInput","step","statusType","telemetrySteps","AiSdkV6Part","input","output","AiSdkV6Message","parts","isToolCallPart","startsWith","isDynamicToolPart","partToToolCall","collectAiSdkV6Parts","stepsData","currentStepToolCalls","push","tc","extractModelId","buildAiSdkV6Result","hasText","UsageFields","promptTokens","completionTokens","normalizeUsage","u","extractAiSdkV6Usage","normalized","hasAny","n","stepMessages","allTextParts","allToolCalls","allStepsData","hasAssistant","useAssistantCloudThreadHistoryAdapter","auiRef"],"sources":["../../../../src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts"],"sourcesContent":["import { type RefObject, useEffect, useRef, useState } from \"react\";\nimport type {\n GenericThreadHistoryAdapter,\n ThreadHistoryAdapter,\n MessageFormatAdapter,\n MessageFormatItem,\n MessageFormatRepository,\n} from \"../../../adapters/thread-history\";\nimport type { ExportedMessageRepositoryItem } from \"../../../runtime/utils/message-repository\";\nimport {\n type AssistantCloud,\n CloudMessagePersistence,\n createFormattedPersistence,\n} from \"assistant-cloud\";\nimport { auiV0Decode, auiV0Encode } from \"./auiV0\";\nimport { type AssistantClient, getClientId, useAui } from \"@assistant-ui/store\";\nimport type { ThreadListItemMethods } from \"../../../store/scopes/thread-list-item\";\n\ntype CloudThreadListItem = Pick<\n ThreadListItemMethods,\n \"getState\" | \"initialize\"\n>;\n\nconst globalPersistence = new WeakMap<\n getClientId.ClientId,\n CloudMessagePersistence\n>();\n\nclass AssistantCloudThreadHistoryAdapter implements ThreadHistoryAdapter {\n private cloudRef: RefObject<AssistantCloud>;\n private getAui: () => AssistantClient;\n\n constructor(\n cloudRef: RefObject<AssistantCloud>,\n getAui: () => AssistantClient,\n ) {\n this.cloudRef = cloudRef;\n this.getAui = getAui;\n }\n\n private get aui(): AssistantClient {\n return this.getAui();\n }\n\n private getPersistence(\n threadListItem: CloudThreadListItem = this.aui.threadListItem,\n ): CloudMessagePersistence {\n const key = getClientId(threadListItem);\n if (!globalPersistence.has(key)) {\n globalPersistence.set(\n key,\n new CloudMessagePersistence(() => this.cloudRef.current),\n );\n }\n return globalPersistence.get(key)!;\n }\n\n private get _persistence(): CloudMessagePersistence {\n return this.getPersistence();\n }\n\n private tryGetKeyedThreadListItem(): CloudThreadListItem | undefined {\n const live = this.aui.threadListItem;\n if (!live.source) return undefined;\n const id = live.getState().id;\n if (id === undefined) return undefined;\n return this.aui.threads.item({ id });\n }\n\n withFormat<TMessage, TStorageFormat extends Record<string, unknown>>(\n formatAdapter: MessageFormatAdapter<TMessage, TStorageFormat>,\n ): GenericThreadHistoryAdapter<TMessage> {\n const adapter = this;\n let threadListItem: CloudThreadListItem | undefined;\n const pinCurrent = () => {\n const next = adapter.tryGetKeyedThreadListItem();\n if (next) threadListItem = next;\n return threadListItem;\n };\n const resolvePinned = () => threadListItem ?? pinCurrent();\n const getFormatted = () =>\n createFormattedPersistence(adapter._persistence, formatAdapter);\n const getTargetFormatted = (item: CloudThreadListItem) =>\n createFormattedPersistence(adapter.getPersistence(item), formatAdapter);\n return {\n pin() {\n pinCurrent();\n },\n async append(item: MessageFormatItem<TMessage>) {\n const pinned = resolvePinned();\n if (!pinned) {\n throw new Error(\n \"Cannot persist cloud history without a thread list item.\",\n );\n }\n const remoteId =\n pinned.getState().remoteId ?? (await pinned.initialize()).remoteId;\n await getTargetFormatted(pinned).append(remoteId, item);\n },\n async update(item: MessageFormatItem<TMessage>, localMessageId: string) {\n const pinned = resolvePinned();\n const remoteId = pinned?.getState().remoteId;\n if (!remoteId || !pinned) return;\n await getTargetFormatted(pinned).update?.(\n remoteId,\n item,\n localMessageId,\n );\n },\n async delete() {\n throw new Error(\n \"Assistant Cloud does not support deleting thread messages yet.\",\n );\n },\n reportTelemetry(\n items: MessageFormatItem<TMessage>[],\n options?: {\n durationMs?: number;\n stepTimestamps?: StepTimestamp[];\n },\n ) {\n const encodedRunMessages = items.map((item) =>\n formatAdapter.encode(item),\n );\n adapter._reportRunTelemetry(\n formatAdapter.format,\n encodedRunMessages,\n options,\n resolvePinned(),\n );\n },\n async load(): Promise<MessageFormatRepository<TMessage>> {\n pinCurrent();\n const live = adapter.aui.threadListItem;\n const remoteId = live.source ? live.getState().remoteId : undefined;\n if (!remoteId) return { messages: [] };\n return getFormatted().load(remoteId);\n },\n };\n }\n\n async append({ parentId, message }: ExportedMessageRepositoryItem) {\n const { remoteId } = await this.aui.threadListItem.initialize();\n const encoded = auiV0Encode(message);\n await this._persistence.append(\n remoteId,\n message.id,\n parentId,\n \"aui/v0\",\n encoded,\n );\n\n if (this.cloudRef.current.telemetry.enabled) {\n this._maybeReportRun(remoteId, \"aui/v0\", encoded);\n }\n }\n\n async update(item: ExportedMessageRepositoryItem) {\n if (!this._persistence.isPersisted(item.message.id)) {\n return this.append(item);\n }\n const { message } = item;\n const remoteId = this.aui.threadListItem.getState().remoteId;\n if (!remoteId) return;\n const encoded = auiV0Encode(message);\n await this._persistence.update(remoteId, message.id, \"aui/v0\", encoded);\n\n if (this.cloudRef.current.telemetry.enabled) {\n this._maybeReportRun(remoteId, \"aui/v0\", encoded);\n }\n }\n\n async delete() {\n throw new Error(\n \"Assistant Cloud does not support deleting thread messages yet.\",\n );\n }\n\n async load() {\n const remoteId = this.aui.threadListItem.getState().remoteId;\n if (!remoteId) return { messages: [] };\n const messages = await this._persistence.load(remoteId, \"aui/v0\");\n return {\n messages: messages\n .filter(\n (m): m is typeof m & { format: \"aui/v0\" } => m.format === \"aui/v0\",\n )\n .map(auiV0Decode)\n .reverse(),\n };\n }\n\n private _reportRunTelemetry<T>(\n format: string,\n runMessages: T[],\n options?: {\n durationMs?: number;\n stepTimestamps?: StepTimestamp[];\n },\n threadListItem?: CloudThreadListItem,\n ) {\n if (!this.cloudRef.current.telemetry.enabled) return;\n\n const remoteId = (threadListItem ?? this.aui.threadListItem).getState()\n .remoteId;\n if (!remoteId) return;\n\n const extracted = extractRunTelemetry(format, runMessages);\n if (!extracted) return;\n\n this._sendReport(\n remoteId,\n extracted,\n options?.durationMs,\n options?.stepTimestamps,\n );\n }\n\n private _maybeReportRun<T>(remoteId: string, format: string, content: T) {\n const extracted = extractTelemetry(format, content);\n if (!extracted) return;\n\n this._sendReport(remoteId, extracted);\n }\n\n private _sendReport(\n remoteId: string,\n data: TelemetryData,\n durationMs?: number,\n stepTimestamps?: StepTimestamp[],\n ) {\n const mergedSteps = mergeStepTimestamps(data.steps, stepTimestamps);\n // Keep in sync with assistant-cloud createRunSchema\n // (apps/aui-cloud-api/src/endpoints/runs/create.ts).\n const initial: Parameters<typeof this.cloudRef.current.runs.report>[0] = {\n thread_id: remoteId,\n status: data.status,\n ...(data.totalSteps != null\n ? { total_steps: data.totalSteps }\n : undefined),\n ...(data.toolCalls ? { tool_calls: data.toolCalls } : undefined),\n ...(mergedSteps ? { steps: mergedSteps } : undefined),\n ...(data.inputTokens != null\n ? { input_tokens: data.inputTokens }\n : undefined),\n ...(data.outputTokens != null\n ? { output_tokens: data.outputTokens }\n : undefined),\n ...(data.reasoningTokens != null\n ? { reasoning_tokens: data.reasoningTokens }\n : undefined),\n ...(data.cachedInputTokens != null\n ? { cached_input_tokens: data.cachedInputTokens }\n : undefined),\n ...(durationMs != null ? { duration_ms: durationMs } : undefined),\n ...(data.outputText != null\n ? { output_text: data.outputText }\n : undefined),\n ...(data.metadata ? { metadata: data.metadata } : undefined),\n ...(data.modelId ? { model_id: data.modelId } : undefined),\n };\n\n const { beforeReport } = this.cloudRef.current.telemetry;\n const report = beforeReport ? beforeReport(initial) : initial;\n if (!report) return;\n\n this.cloudRef.current.runs.report(report).catch(() => {});\n }\n}\n\nconst MAX_SPAN_CONTENT = 50_000;\n\nfunction truncateStr(value: string): string {\n if (value.length <= MAX_SPAN_CONTENT) return value;\n return value.slice(0, MAX_SPAN_CONTENT);\n}\n\nfunction safeStringify(value: unknown): string | undefined {\n if (value == null) return undefined;\n try {\n return truncateStr(JSON.stringify(value));\n } catch {\n return undefined;\n }\n}\n\ntype TelemetryToolCall = {\n tool_name: string;\n tool_call_id: string;\n tool_args?: string;\n tool_result?: string;\n tool_source?: \"mcp\" | \"frontend\" | \"backend\";\n};\n\nconst BASE64_PATTERN = /^[A-Za-z0-9+/]{100,}={0,2}$/;\n\nfunction summarizeMcpResult(value: unknown): string | undefined {\n if (value == null) return undefined;\n try {\n const parsed = typeof value === \"string\" ? JSON.parse(value) : value;\n if (Array.isArray(parsed)) {\n const summarized = parsed.map((item) => {\n if (item && typeof item === \"object\" && item.type) {\n if (\n (item.type === \"image\" || item.type === \"audio\") &&\n typeof item.data === \"string\" &&\n BASE64_PATTERN.test(item.data.slice(0, 200))\n ) {\n const sizeKB = ((item.data.length * 3) / 4 / 1024).toFixed(1);\n return { ...item, data: `[${item.type}: ${sizeKB}KB]` };\n }\n }\n return item;\n });\n return truncateStr(JSON.stringify(summarized));\n }\n } catch {\n // not JSON array, fall through\n }\n return safeStringify(value);\n}\n\nfunction buildToolCall(\n toolName: string,\n toolCallId: string,\n args: unknown,\n result: unknown,\n argsText?: string,\n toolSource?: \"mcp\" | \"frontend\" | \"backend\",\n): TelemetryToolCall {\n const call: TelemetryToolCall = {\n tool_name: toolName,\n tool_call_id: toolCallId,\n };\n const toolArgs = argsText ?? safeStringify(args);\n if (toolArgs !== undefined) call.tool_args = toolArgs;\n const toolResult =\n toolSource === \"mcp\" ? summarizeMcpResult(result) : safeStringify(result);\n if (toolResult !== undefined) call.tool_result = toolResult;\n if (toolSource) call.tool_source = toolSource;\n return call;\n}\n\ntype TelemetryStepData = {\n input_tokens?: number;\n output_tokens?: number;\n reasoning_tokens?: number;\n cached_input_tokens?: number;\n tool_calls?: TelemetryToolCall[];\n start_ms?: number;\n end_ms?: number;\n};\n\ntype StepTimestamp = { start_ms: number; end_ms: number };\n\nfunction mergeStepTimestamps(\n steps: TelemetryStepData[] | undefined,\n timestamps: StepTimestamp[] | undefined,\n): TelemetryStepData[] | undefined {\n if (!timestamps) return steps;\n if (!steps) return timestamps.map((t) => ({ ...t }));\n\n const len = Math.min(steps.length, timestamps.length);\n return steps.map((s, i) => ({\n ...s,\n ...(i < len ? timestamps[i] : undefined),\n }));\n}\n\ntype TelemetryData = {\n status: \"completed\" | \"incomplete\" | \"error\";\n toolCalls?: TelemetryToolCall[];\n totalSteps?: number;\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n outputText?: string;\n metadata?: Record<string, unknown>;\n steps?: TelemetryStepData[];\n modelId?: string;\n};\n\nfunction extractTelemetry<T>(format: string, content: T): TelemetryData | null {\n switch (format) {\n case \"aui/v0\":\n return extractAuiV0(content);\n case \"ai-sdk/v6\":\n return extractAiSdkV6(content);\n default:\n return null;\n }\n}\n\nfunction extractRunTelemetry<T>(\n format: string,\n runMessages: T[],\n): TelemetryData | null {\n if (format === \"ai-sdk/v6\") {\n return aggregateAiSdkV6RunSteps(runMessages);\n }\n for (let i = runMessages.length - 1; i >= 0; i--) {\n const result = extractTelemetry(format, runMessages[i]!);\n if (result) return result;\n }\n return null;\n}\n\nconst AUI_STATUS_MAP: Record<string, TelemetryData[\"status\"]> = {\n error: \"error\",\n incomplete: \"incomplete\",\n};\n\nexport function extractAuiV0<T>(content: T): TelemetryData | null {\n const msg = content as {\n role?: string;\n status?: { type: string };\n content?: readonly {\n type: string;\n text?: string;\n toolName?: string;\n toolCallId?: string;\n args?: unknown;\n argsText?: string;\n result?: unknown;\n }[];\n metadata?: {\n modelId?: string;\n steps?: readonly {\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n };\n }[];\n custom?: Record<string, unknown> & { modelId?: string };\n };\n };\n\n if (msg.role !== \"assistant\") return null;\n // A paused (requires-action) write is not a finished run; reporting it would\n // mislabel it \"completed\" and double-count steps once the terminal write reports.\n if (msg.status?.type === \"requires-action\") return null;\n\n const toolCalls = msg.content\n ?.filter((p) => p.type === \"tool-call\" && p.toolName && p.toolCallId)\n .map((p) =>\n buildToolCall(p.toolName!, p.toolCallId!, p.args, p.result, p.argsText),\n );\n\n const textParts = msg.content?.filter((p) => p.type === \"text\" && p.text);\n const outputText =\n textParts && textParts.length > 0\n ? truncateStr(textParts.map((p) => p.text).join(\"\"))\n : undefined;\n\n const steps = msg.metadata?.steps;\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let reasoningTokens: number | undefined;\n let cachedInputTokens: number | undefined;\n if (steps && steps.length > 0) {\n let totalInput = 0;\n let totalOutput = 0;\n let totalReasoning = 0;\n let totalCachedInput = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n for (const step of steps) {\n if (step.usage?.inputTokens != null) {\n totalInput += step.usage.inputTokens;\n hasInput = true;\n }\n if (step.usage?.outputTokens != null) {\n totalOutput += step.usage.outputTokens;\n hasOutput = true;\n }\n if (step.usage?.reasoningTokens != null) {\n totalReasoning += step.usage.reasoningTokens;\n hasReasoning = true;\n }\n if (step.usage?.cachedInputTokens != null) {\n totalCachedInput += step.usage.cachedInputTokens;\n hasCachedInput = true;\n }\n }\n inputTokens = hasInput ? totalInput : undefined;\n outputTokens = hasOutput ? totalOutput : undefined;\n reasoningTokens = hasReasoning ? totalReasoning : undefined;\n cachedInputTokens = hasCachedInput ? totalCachedInput : undefined;\n }\n\n const statusType = msg.status?.type;\n const status: TelemetryData[\"status\"] =\n (statusType && AUI_STATUS_MAP[statusType]) || \"completed\";\n\n const metadata = msg.metadata?.custom as Record<string, unknown> | undefined;\n const modelId =\n msg.metadata?.modelId ??\n (typeof msg.metadata?.custom?.modelId === \"string\"\n ? msg.metadata.custom.modelId\n : undefined);\n\n const telemetrySteps: TelemetryStepData[] | undefined =\n steps && steps.length > 1\n ? steps.map((s) => ({\n ...(s.usage?.inputTokens != null\n ? { input_tokens: s.usage.inputTokens }\n : undefined),\n ...(s.usage?.outputTokens != null\n ? { output_tokens: s.usage.outputTokens }\n : undefined),\n ...(s.usage?.reasoningTokens != null\n ? { reasoning_tokens: s.usage.reasoningTokens }\n : undefined),\n ...(s.usage?.cachedInputTokens != null\n ? { cached_input_tokens: s.usage.cachedInputTokens }\n : undefined),\n }))\n : undefined;\n\n return {\n status,\n ...(toolCalls && toolCalls.length > 0 ? { toolCalls } : undefined),\n ...(steps?.length ? { totalSteps: steps.length } : undefined),\n ...(inputTokens != null ? { inputTokens } : undefined),\n ...(outputTokens != null ? { outputTokens } : undefined),\n ...(reasoningTokens != null ? { reasoningTokens } : undefined),\n ...(cachedInputTokens != null ? { cachedInputTokens } : undefined),\n ...(outputText != null ? { outputText } : undefined),\n ...(metadata ? { metadata } : undefined),\n ...(telemetrySteps ? { steps: telemetrySteps } : undefined),\n ...(modelId ? { modelId } : undefined),\n };\n}\n\ntype AiSdkV6Part = {\n type: string;\n text?: string;\n toolName?: string;\n toolCallId?: string;\n args?: unknown;\n result?: unknown;\n input?: unknown;\n output?: unknown;\n};\n\ntype AiSdkV6Message = {\n role?: string;\n parts?: readonly AiSdkV6Part[];\n metadata?: Record<string, unknown>;\n};\n\nfunction isToolCallPart(p: AiSdkV6Part): boolean {\n if (!p.toolCallId) return false;\n if (p.type === \"tool-call\" || p.type === \"dynamic-tool\") return !!p.toolName;\n return p.type.startsWith(\"tool-\") || p.type.startsWith(\"dynamic-tool-\");\n}\n\nfunction isDynamicToolPart(p: AiSdkV6Part): boolean {\n return p.type === \"dynamic-tool\" || p.type.startsWith(\"dynamic-tool-\");\n}\n\nfunction partToToolCall(p: AiSdkV6Part): TelemetryToolCall {\n const toolSource: \"mcp\" | undefined = isDynamicToolPart(p)\n ? \"mcp\"\n : undefined;\n return buildToolCall(\n p.toolName ?? p.type.slice(5),\n p.toolCallId!,\n p.args ?? p.input,\n p.result ?? p.output,\n undefined,\n toolSource,\n );\n}\n\nfunction collectAiSdkV6Parts(parts: readonly AiSdkV6Part[]): {\n textParts: string[];\n toolCalls: TelemetryToolCall[];\n stepsData: { tool_calls: TelemetryToolCall[] }[];\n} {\n const textParts: string[] = [];\n const toolCalls: TelemetryToolCall[] = [];\n const stepsData: { tool_calls: TelemetryToolCall[] }[] = [];\n let currentStepToolCalls: TelemetryToolCall[] | null = null;\n\n for (const p of parts) {\n if (p.type === \"step-start\") {\n if (currentStepToolCalls !== null) {\n stepsData.push({ tool_calls: currentStepToolCalls });\n }\n currentStepToolCalls = [];\n } else if (p.type === \"text\" && p.text) {\n textParts.push(p.text);\n } else if (isToolCallPart(p)) {\n const tc = partToToolCall(p);\n toolCalls.push(tc);\n if (currentStepToolCalls !== null) {\n currentStepToolCalls.push(tc);\n }\n }\n }\n\n if (currentStepToolCalls !== null) {\n stepsData.push({ tool_calls: currentStepToolCalls });\n }\n\n return { textParts, toolCalls, stepsData };\n}\n\nfunction extractModelId(\n metadata?: Record<string, unknown>,\n): string | undefined {\n if (!metadata) return undefined;\n if (typeof metadata.modelId === \"string\") return metadata.modelId;\n const custom = metadata.custom as Record<string, unknown> | undefined;\n if (typeof custom?.modelId === \"string\") return custom.modelId;\n return undefined;\n}\n\nfunction buildAiSdkV6Result(\n textParts: string[],\n toolCalls: TelemetryToolCall[],\n totalSteps: number,\n metadata?: Record<string, unknown>,\n stepsData?: { tool_calls: TelemetryToolCall[] }[],\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n },\n): TelemetryData {\n const hasText = textParts.length > 0;\n const outputText = hasText ? truncateStr(textParts.join(\"\")) : undefined;\n const modelId = extractModelId(metadata);\n\n const steps: TelemetryStepData[] | undefined =\n stepsData && stepsData.length > 1\n ? stepsData.map((s) => ({\n ...(s.tool_calls.length > 0\n ? { tool_calls: s.tool_calls }\n : undefined),\n }))\n : undefined;\n\n return {\n status: hasText ? \"completed\" : \"incomplete\",\n ...(toolCalls.length > 0 ? { toolCalls } : undefined),\n ...(totalSteps > 0 ? { totalSteps } : undefined),\n ...(usage?.inputTokens != null\n ? { inputTokens: usage.inputTokens }\n : undefined),\n ...(usage?.outputTokens != null\n ? { outputTokens: usage.outputTokens }\n : undefined),\n ...(usage?.reasoningTokens != null\n ? { reasoningTokens: usage.reasoningTokens }\n : undefined),\n ...(usage?.cachedInputTokens != null\n ? { cachedInputTokens: usage.cachedInputTokens }\n : undefined),\n ...(outputText != null ? { outputText } : undefined),\n ...(metadata ? { metadata } : undefined),\n ...(steps ? { steps } : undefined),\n ...(modelId ? { modelId } : undefined),\n };\n}\n\ntype UsageFields = {\n inputTokens?: number;\n outputTokens?: number;\n promptTokens?: number;\n completionTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n};\n\nfunction normalizeUsage(u: UsageFields):\n | {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n }\n | undefined {\n const input = u.inputTokens ?? u.promptTokens;\n const output = u.outputTokens ?? u.completionTokens;\n if (\n input == null &&\n output == null &&\n u.reasoningTokens == null &&\n u.cachedInputTokens == null\n ) {\n return undefined;\n }\n\n return {\n ...(input != null ? { inputTokens: input } : undefined),\n ...(output != null ? { outputTokens: output } : undefined),\n ...(u.reasoningTokens != null\n ? { reasoningTokens: u.reasoningTokens }\n : undefined),\n ...(u.cachedInputTokens != null\n ? { cachedInputTokens: u.cachedInputTokens }\n : undefined),\n };\n}\n\nfunction extractAiSdkV6Usage(metadata?: Record<string, unknown>):\n | {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n }\n | undefined {\n // Try top-level metadata.usage\n const usage = metadata?.usage as UsageFields | undefined;\n if (usage) {\n const normalized = normalizeUsage(usage);\n if (normalized) return normalized;\n }\n\n // Try aggregating from metadata.steps[].usage\n const steps = metadata?.steps as\n | readonly { usage?: UsageFields }[]\n | undefined;\n if (steps && steps.length > 0) {\n let inputTokens = 0;\n let outputTokens = 0;\n let reasoningTokens = 0;\n let cachedInputTokens = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n let hasAny = false;\n for (const s of steps) {\n if (!s.usage) continue;\n const n = normalizeUsage(s.usage);\n if (n) {\n if (n.inputTokens != null) {\n inputTokens += n.inputTokens;\n hasInput = true;\n }\n if (n.outputTokens != null) {\n outputTokens += n.outputTokens;\n hasOutput = true;\n }\n if (n.reasoningTokens != null) {\n reasoningTokens += n.reasoningTokens;\n hasReasoning = true;\n }\n if (n.cachedInputTokens != null) {\n cachedInputTokens += n.cachedInputTokens;\n hasCachedInput = true;\n }\n hasAny = true;\n }\n }\n if (hasAny) {\n return {\n ...(hasInput ? { inputTokens } : undefined),\n ...(hasOutput ? { outputTokens } : undefined),\n ...(hasReasoning ? { reasoningTokens } : undefined),\n ...(hasCachedInput ? { cachedInputTokens } : undefined),\n };\n }\n }\n\n return undefined;\n}\n\nfunction extractAiSdkV6<T>(content: T): TelemetryData | null {\n const msg = content as AiSdkV6Message;\n if (msg.role !== \"assistant\") return null;\n\n const { textParts, toolCalls, stepsData } = collectAiSdkV6Parts(\n msg.parts ?? [],\n );\n return buildAiSdkV6Result(\n textParts,\n toolCalls,\n stepsData.length,\n msg.metadata,\n stepsData,\n extractAiSdkV6Usage(msg.metadata),\n );\n}\n\nfunction aggregateAiSdkV6RunSteps<T>(stepMessages: T[]): TelemetryData | null {\n const allTextParts: string[] = [];\n const allToolCalls: TelemetryToolCall[] = [];\n const allStepsData: { tool_calls: TelemetryToolCall[] }[] = [];\n let hasAssistant = false;\n let metadata: Record<string, unknown> | undefined;\n let inputTokens = 0;\n let outputTokens = 0;\n let reasoningTokens = 0;\n let cachedInputTokens = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n\n for (const content of stepMessages) {\n const msg = content as AiSdkV6Message;\n if (msg.role !== \"assistant\") continue;\n hasAssistant = true;\n\n const { textParts, toolCalls, stepsData } = collectAiSdkV6Parts(\n msg.parts ?? [],\n );\n allTextParts.push(...textParts);\n allToolCalls.push(...toolCalls);\n allStepsData.push(...stepsData);\n if (msg.metadata) metadata = msg.metadata;\n\n const usage = extractAiSdkV6Usage(msg.metadata);\n if (usage) {\n if (usage.inputTokens != null) {\n inputTokens += usage.inputTokens;\n hasInput = true;\n }\n if (usage.outputTokens != null) {\n outputTokens += usage.outputTokens;\n hasOutput = true;\n }\n if (usage.reasoningTokens != null) {\n reasoningTokens += usage.reasoningTokens;\n hasReasoning = true;\n }\n if (usage.cachedInputTokens != null) {\n cachedInputTokens += usage.cachedInputTokens;\n hasCachedInput = true;\n }\n }\n }\n\n if (!hasAssistant) return null;\n return buildAiSdkV6Result(\n allTextParts,\n allToolCalls,\n allStepsData.length,\n metadata,\n allStepsData,\n {\n ...(hasInput ? { inputTokens } : undefined),\n ...(hasOutput ? { outputTokens } : undefined),\n ...(hasReasoning ? { reasoningTokens } : undefined),\n ...(hasCachedInput ? { cachedInputTokens } : undefined),\n },\n );\n}\n\nexport function useAssistantCloudThreadHistoryAdapter(\n cloudRef: RefObject<AssistantCloud>,\n): ThreadHistoryAdapter {\n const aui = useAui();\n // Not useEffectEvent: history adapter methods run during render (SSR load).\n const auiRef = useRef(aui);\n useEffect(() => {\n auiRef.current = aui;\n });\n const [adapter] = useState(\n () =>\n new AssistantCloudThreadHistoryAdapter(cloudRef, () => auiRef.current),\n );\n return adapter;\n}\n"],"mappings":"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"}
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":";;;;;AA4BA,MAAM0B,oCAAoB,IAAIC,QAG5B;AAEF,IAAME,qCAAN,MAAyE;CACvE;CACA;CAEAG,YACEF,UACAC,QACA;EACA,KAAKD,WAAWA;EAChB,KAAKC,SAASA;CAChB;CAEA,IAAYE,MAAuB;EACjC,OAAO,KAAKF,OAAO;CACrB;CAEA,eACEI,iBAAsC,KAAKF,IAAIE,gBACtB;EACzB,MAAMC,MAAMf,YAAYc,cAAc;EACtC,IAAI,CAACT,kBAAkBW,IAAID,GAAG,GAC5BV,kBAAkBY,IAChBF,KACA,IAAIxB,8BAA8B,KAAKkB,SAASS,OAAO,CACzD;EAEF,OAAOb,kBAAkBc,IAAIJ,GAAG;CAClC;CAEA,IAAYK,eAAwC;EAClD,OAAO,KAAKP,eAAe;CAC7B;CAEA,4BAAqE;EACnE,MAAMS,OAAO,KAAKV,IAAIE;EACtB,IAAI,CAACQ,KAAKC,QAAQ,OAAOC,KAAAA;EACzB,MAAMC,KAAKH,KAAKI,SAAS,CAAC,CAACD;EAC3B,IAAIA,OAAOD,KAAAA,GAAW,OAAOA,KAAAA;EAC7B,OAAO,KAAKZ,IAAIe,QAAQC,KAAK,EAAEH,GAAG,CAAC;CACrC;CAEAI,WACEE,eACuC;EACvC,MAAMG,UAAU;EAChB,IAAIpB;EACJ,MAAMqB,mBAAmB;GACvB,MAAMC,OAAOF,QAAQb,0BAA0B;GAC/C,IAAIe,MAAMtB,iBAAiBsB;GAC3B,OAAOtB;EACT;EACA,MAAMuB,sBAAsBvB,kBAAkBqB,WAAW;EACzD,MAAMG,qBACJ9C,2BAA2B0C,QAAQd,cAAcW,aAAa;EAChE,MAAMQ,sBAAsBX,SAC1BpC,2BAA2B0C,QAAQrB,eAAee,IAAI,GAAGG,aAAa;EACxE,OAAO;GACLS,MAAM;IACJL,WAAW;GACb;GACA,MAAMM,OAAOb,MAAmC;IAC9C,MAAMc,SAASL,cAAc;IAC7B,IAAI,CAACK,QACH,MAAM,IAAIC,MACR,0DACF;IAEF,MAAMC,WACJF,OAAOhB,SAAS,CAAC,CAACkB,aAAa,MAAMF,OAAOG,WAAW,EAAA,CAAGD;IAC5D,MAAML,mBAAmBG,MAAM,CAAC,CAACD,OAAOG,UAAUhB,IAAI;GACxD;GACA,MAAMkB,OAAOlB,MAAmCmB,gBAAwB;IACtE,MAAML,SAASL,cAAc;IAC7B,MAAMO,WAAWF,QAAQhB,SAAS,CAAC,CAACkB;IACpC,IAAI,CAACA,YAAY,CAACF,QAAQ;IAC1B,MAAMH,mBAAmBG,MAAM,CAAC,CAACI,SAC/BF,UACAhB,MACAmB,cACF;GACF;GACA,MAAMC,SAAS;IACb,MAAM,IAAIL,MACR,gEACF;GACF;GACAM,gBACEC,OACAC,SAIA;IACA,MAAMI,qBAAqBL,MAAMM,KAAK5B,SACpCG,cAAc0B,OAAO7B,IAAI,CAC3B;IACAM,QAAQwB,oBACN3B,cAAc4B,QACdJ,oBACAJ,SACAd,cAAc,CAChB;GACF;GACA,MAAMuB,OAAmD;IACvDzB,WAAW;IACX,MAAMb,OAAOY,QAAQtB,IAAIE;IACzB,MAAM8B,WAAWtB,KAAKC,SAASD,KAAKI,SAAS,CAAC,CAACkB,WAAWpB,KAAAA;IAC1D,IAAI,CAACoB,UAAU,OAAO,EAAEkB,UAAU,CAAA,EAAG;IACrC,OAAOxB,aAAa,CAAC,CAACsB,KAAKhB,QAAQ;GACrC;EACF;CACF;CAEA,MAAMH,OAAO,EAAEsB,UAAUC,WAA0C;EACjE,MAAM,EAAEpB,aAAa,MAAM,KAAKhC,IAAIE,eAAe+B,WAAW;EAC9D,MAAMoB,UAAUnE,YAAYkE,OAAO;EACnC,MAAM,KAAK5C,aAAaqB,OACtBG,UACAoB,QAAQvC,IACRsC,UACA,UACAE,OACF;EAEA,IAAI,KAAKxD,SAASS,QAAQgD,UAAUC,SAClC,KAAKC,gBAAgBxB,UAAU,UAAUqB,OAAO;CAEpD;CAEA,MAAMnB,OAAOlB,MAAqC;EAChD,IAAI,CAAC,KAAKR,aAAaiD,YAAYzC,KAAKoC,QAAQvC,EAAE,GAChD,OAAO,KAAKgB,OAAOb,IAAI;EAEzB,MAAM,EAAEoC,YAAYpC;EACpB,MAAMgB,WAAW,KAAKhC,IAAIE,eAAeY,SAAS,CAAC,CAACkB;EACpD,IAAI,CAACA,UAAU;EACf,MAAMqB,UAAUnE,YAAYkE,OAAO;EACnC,MAAM,KAAK5C,aAAa0B,OAAOF,UAAUoB,QAAQvC,IAAI,UAAUwC,OAAO;EAEtE,IAAI,KAAKxD,SAASS,QAAQgD,UAAUC,SAClC,KAAKC,gBAAgBxB,UAAU,UAAUqB,OAAO;CAEpD;CAEA,MAAMjB,SAAS;EACb,MAAM,IAAIL,MACR,gEACF;CACF;CAEA,MAAMiB,OAAO;EACX,MAAMhB,WAAW,KAAKhC,IAAIE,eAAeY,SAAS,CAAC,CAACkB;EACpD,IAAI,CAACA,UAAU,OAAO,EAAEkB,UAAU,CAAA,EAAG;EAErC,OAAO,EACLA,WAAUA,MAFW,KAAK1C,aAAawC,KAAKhB,UAAU,QAAQ,EAAA,CAG3D0B,QACEC,MAA4CA,EAAEZ,WAAW,QAC5D,CAAC,CACAH,IAAI3D,WAAW,CAAC,CAChB2E,QAAQ,EACb;CACF;CAEA,oBACEb,QACAc,aACAtB,SAIArC,gBACA;EACA,IAAI,CAAC,KAAKL,SAASS,QAAQgD,UAAUC,SAAS;EAE9C,MAAMvB,YAAY9B,kBAAkB,KAAKF,IAAIE,eAAAA,CAAgBY,SAAS,CAAC,CACpEkB;EACH,IAAI,CAACA,UAAU;EAEf,MAAM+B,YAAYC,oBAAoBjB,QAAQc,WAAW;EACzD,IAAI,CAACE,WAAW;EAEhB,KAAKE,YACHjC,UACA+B,WACAxB,SAASC,YACTD,SAASE,cACX;CACF;CAEA,gBAA2BT,UAAkBe,QAAgBmB,SAAY;EACvE,MAAMH,YAAYI,iBAAiBpB,QAAQmB,OAAO;EAClD,IAAI,CAACH,WAAW;EAEhB,KAAKE,YAAYjC,UAAU+B,SAAS;CACtC;CAEA,YACE/B,UACAoC,MACA5B,YACAC,gBACA;EACA,MAAM6B,cAAcC,oBAAoBH,KAAKI,OAAO/B,cAAc;EAGlE,MAAMgC,UAAmE;GACvEK,WAAW9C;GACX+C,QAAQX,KAAKW;GACb,GAAIX,KAAKY,cAAc,OACnB,EAAEC,aAAab,KAAKY,WAAW,IAC/BpE,KAAAA;GACJ,GAAIwD,KAAKc,YAAY,EAAEC,YAAYf,KAAKc,UAAU,IAAItE,KAAAA;GACtD,GAAI0D,cAAc,EAAEE,OAAOF,YAAY,IAAI1D,KAAAA;GAC3C,GAAIwD,KAAKgB,eAAe,OACpB,EAAEC,cAAcjB,KAAKgB,YAAY,IACjCxE,KAAAA;GACJ,GAAIwD,KAAKkB,gBAAgB,OACrB,EAAEC,eAAenB,KAAKkB,aAAa,IACnC1E,KAAAA;GACJ,GAAIwD,KAAKoB,mBAAmB,OACxB,EAAEC,kBAAkBrB,KAAKoB,gBAAgB,IACzC5E,KAAAA;GACJ,GAAIwD,KAAKsB,qBAAqB,OAC1B,EAAEC,qBAAqBvB,KAAKsB,kBAAkB,IAC9C9E,KAAAA;GACJ,GAAI4B,cAAc,OAAO,EAAEoD,aAAapD,WAAW,IAAI5B,KAAAA;GACvD,GAAIwD,KAAKyB,cAAc,OACnB,EAAEC,aAAa1B,KAAKyB,WAAW,IAC/BjF,KAAAA;GACJ,GAAIwD,KAAK2B,WAAW,EAAEA,UAAU3B,KAAK2B,SAAS,IAAInF,KAAAA;GAClD,GAAIwD,KAAK4B,UAAU,EAAEC,UAAU7B,KAAK4B,QAAQ,IAAIpF,KAAAA;EAClD;EAEA,MAAM,EAAEsF,iBAAiB,KAAKrG,SAASS,QAAQgD;EAC/C,MAAMuB,SAASqB,eAAeA,aAAazB,OAAO,IAAIA;EACtD,IAAI,CAACI,QAAQ;EAEb,KAAKhF,SAASS,QAAQsE,KAAKC,OAAOA,MAAM,CAAC,CAACsB,YAAY,CAAC,CAAC;CAC1D;AACF;AAcA,SAAS5B,oBACPC,OACA+B,YACiC;CACjC,IAAI,CAACA,YAAY,OAAO/B;CACxB,IAAI,CAACA,OAAO,OAAO+B,WAAW3D,KAAK4D,OAAO,EAAE,GAAGA,EAAE,EAAE;CAEnD,MAAMC,MAAMC,KAAKC,IAAInC,MAAMoC,QAAQL,WAAWK,MAAM;CACpD,OAAOpC,MAAM5B,KAAKiE,GAAGC,OAAO;EAC1B,GAAGD;EACH,GAAIC,IAAIL,MAAMF,WAAWO,KAAKlG,KAAAA;CAChC,EAAE;AACJ;AAgBA,SAASuD,iBAAoBpB,QAAgBmB,SAAkC;CAC7E,QAAQnB,QAAR;EACE,KAAK,UACH,OAAOgE,aAAa7C,OAAO;EAC7B,KAAK,aACH,OAAO8C,eAAe9C,OAAO;EAC/B,SACE,OAAO;CACX;AACF;AAEA,SAASF,oBACPjB,QACAc,aACsB;CACtB,IAAId,WAAW,aACb,OAAOkE,yBAAyBpD,WAAW;CAE7C,KAAK,IAAIiD,IAAIjD,YAAY+C,SAAS,GAAGE,KAAK,GAAGA,KAAK;EAChD,MAAMI,SAAS/C,iBAAiBpB,QAAQc,YAAYiD,EAAG;EACvD,IAAII,QAAQ,OAAOA;CACrB;CACA,OAAO;AACT;AAEA,MAAMC,iBAA0D;CAC9DC,OAAO;CACPC,YAAY;AACd;AAEA,SAAgBN,aAAgB7C,SAAkC;CAChE,MAAMoD,MAAMpD;CA0BZ,IAAIoD,IAAIC,SAAS,aAAa,OAAO;CAGrC,IAAID,IAAIvC,QAAQyC,SAAS,mBAAmB,OAAO;CAEnD,MAAMtC,YAAYoC,IAAIpD,SAClBR,QAAQsE,MAAMA,EAAER,SAAS,eAAeQ,EAAEN,YAAYM,EAAEL,UAAU,CAAC,CACpE/E,KAAKoF,MACJnJ,2BAA2B;EACzB6I,UAAUM,EAAEN;EACZC,YAAYK,EAAEL;EACdC,MAAMI,EAAEJ;EACRV,QAAQc,EAAEd;EACVW,UAAUG,EAAEH;CACd,CAAC,CACH;CAEF,MAAMI,YAAYX,IAAIpD,SAASR,QAAQsE,MAAMA,EAAER,SAAS,UAAUQ,EAAEP,IAAI;CACxE,MAAM5B,aACJoC,aAAaA,UAAUrB,SAAS,IAC5B5H,yBAAyBiJ,UAAUrF,KAAKoF,MAAMA,EAAEP,IAAI,CAAC,CAACS,KAAK,EAAE,CAAC,IAC9DtH,KAAAA;CAEN,MAAM4D,QAAQ8C,IAAIvB,UAAUvB;CAC5B,IAAIY;CACJ,IAAIE;CACJ,IAAIE;CACJ,IAAIE;CACJ,IAAIlB,SAASA,MAAMoC,SAAS,GAAG;EAC7B,IAAIuB,aAAa;EACjB,IAAIC,cAAc;EAClB,IAAIC,iBAAiB;EACrB,IAAIC,mBAAmB;EACvB,IAAIC,WAAW;EACf,IAAIC,YAAY;EAChB,IAAIC,eAAe;EACnB,IAAIC,iBAAiB;EACrB,KAAK,MAAMC,QAAQnE,OAAO;GACxB,IAAImE,KAAKb,OAAO1C,eAAe,MAAM;IACnC+C,cAAcQ,KAAKb,MAAM1C;IACzBmD,WAAW;GACb;GACA,IAAII,KAAKb,OAAOxC,gBAAgB,MAAM;IACpC8C,eAAeO,KAAKb,MAAMxC;IAC1BkD,YAAY;GACd;GACA,IAAIG,KAAKb,OAAOtC,mBAAmB,MAAM;IACvC6C,kBAAkBM,KAAKb,MAAMtC;IAC7BiD,eAAe;GACjB;GACA,IAAIE,KAAKb,OAAOpC,qBAAqB,MAAM;IACzC4C,oBAAoBK,KAAKb,MAAMpC;IAC/BgD,iBAAiB;GACnB;EACF;EACAtD,cAAcmD,WAAWJ,aAAavH,KAAAA;EACtC0E,eAAekD,YAAYJ,cAAcxH,KAAAA;EACzC4E,kBAAkBiD,eAAeJ,iBAAiBzH,KAAAA;EAClD8E,oBAAoBgD,iBAAiBJ,mBAAmB1H,KAAAA;CAC1D;CAEA,MAAMgI,aAAatB,IAAIvC,QAAQyC;CAC/B,MAAMzC,SACH6D,cAAczB,eAAeyB,eAAgB;CAEhD,MAAM7C,WAAWuB,IAAIvB,UAAUgC;CAC/B,MAAM/B,UACJsB,IAAIvB,UAAUC,YACb,OAAOsB,IAAIvB,UAAUgC,QAAQ/B,YAAY,WACtCsB,IAAIvB,SAASgC,OAAO/B,UACpBpF,KAAAA;CAEN,MAAMiI,iBACJrE,SAASA,MAAMoC,SAAS,IACpBpC,MAAM5B,KAAKiE,OAAO;EAChB,GAAIA,EAAEiB,OAAO1C,eAAe,OACxB,EAAEC,cAAcwB,EAAEiB,MAAM1C,YAAY,IACpCxE,KAAAA;EACJ,GAAIiG,EAAEiB,OAAOxC,gBAAgB,OACzB,EAAEC,eAAesB,EAAEiB,MAAMxC,aAAa,IACtC1E,KAAAA;EACJ,GAAIiG,EAAEiB,OAAOtC,mBAAmB,OAC5B,EAAEC,kBAAkBoB,EAAEiB,MAAMtC,gBAAgB,IAC5C5E,KAAAA;EACJ,GAAIiG,EAAEiB,OAAOpC,qBAAqB,OAC9B,EAAEC,qBAAqBkB,EAAEiB,MAAMpC,kBAAkB,IACjD9E,KAAAA;CACN,EAAE,IACFA,KAAAA;CAEN,OAAO;EACLmE;EACA,GAAIG,aAAaA,UAAU0B,SAAS,IAAI,EAAE1B,UAAU,IAAItE,KAAAA;EACxD,GAAI4D,OAAOoC,SAAS,EAAE5B,YAAYR,MAAMoC,OAAO,IAAIhG,KAAAA;EACnD,GAAIwE,eAAe,OAAO,EAAEA,YAAY,IAAIxE,KAAAA;EAC5C,GAAI0E,gBAAgB,OAAO,EAAEA,aAAa,IAAI1E,KAAAA;EAC9C,GAAI4E,mBAAmB,OAAO,EAAEA,gBAAgB,IAAI5E,KAAAA;EACpD,GAAI8E,qBAAqB,OAAO,EAAEA,kBAAkB,IAAI9E,KAAAA;EACxD,GAAIiF,cAAc,OAAO,EAAEA,WAAW,IAAIjF,KAAAA;EAC1C,GAAImF,WAAW,EAAEA,SAAS,IAAInF,KAAAA;EAC9B,GAAIiI,iBAAiB,EAAErE,OAAOqE,eAAe,IAAIjI,KAAAA;EACjD,GAAIoF,UAAU,EAAEA,QAAQ,IAAIpF,KAAAA;CAC9B;AACF;AAmBA,SAASuI,eAAenB,GAAyB;CAC/C,IAAI,CAACA,EAAEL,YAAY,OAAO;CAC1B,IAAIK,EAAER,SAAS,eAAeQ,EAAER,SAAS,gBAAgB,OAAO,CAAC,CAACQ,EAAEN;CACpE,OAAOM,EAAER,KAAK4B,WAAW,OAAO,KAAKpB,EAAER,KAAK4B,WAAW,eAAe;AACxE;AAEA,SAASC,kBAAkBrB,GAAyB;CAClD,OAAOA,EAAER,SAAS,kBAAkBQ,EAAER,KAAK4B,WAAW,eAAe;AACvE;AAEA,SAASE,eAAetB,GAAiD;CACvE,MAAMuB,aAAiCF,kBAAkBrB,CAAC,IACtD,QACA;CACJ,OAAOnJ,2BAA2B;EAChC6I,UAAUM,EAAEN,YAAYM,EAAER,KAAKgC,MAAM,CAAC;EACtC7B,YAAYK,EAAEL;EACdC,MAAMI,EAAEJ,QAAQI,EAAEe;EAClB7B,QAAQc,EAAEd,UAAUc,EAAEgB;EACtBO;CACF,CAAC;AACH;AAEA,SAASE,oBAAoBP,OAI3B;CACA,MAAMjB,YAAsB,CAAA;CAC5B,MAAM/C,YAA+C,CAAA;CACrD,MAAMwE,YAAiE,CAAA;CACvE,IAAIC,uBAAiE;CAErE,KAAK,MAAM3B,KAAKkB,OACd,IAAIlB,EAAER,SAAS,cAAc;EAC3B,IAAImC,yBAAyB,MAC3BD,UAAUE,KAAK,EAAEzE,YAAYwE,qBAAqB,CAAC;EAErDA,uBAAuB,CAAA;CACzB,OAAO,IAAI3B,EAAER,SAAS,UAAUQ,EAAEP,MAChCQ,UAAU2B,KAAK5B,EAAEP,IAAI;MAChB,IAAI0B,eAAenB,CAAC,GAAG;EAC5B,MAAM6B,KAAKP,eAAetB,CAAC;EAC3B9C,UAAU0E,KAAKC,EAAE;EACjB,IAAIF,yBAAyB,MAC3BA,qBAAqBC,KAAKC,EAAE;CAEhC;CAGF,IAAIF,yBAAyB,MAC3BD,UAAUE,KAAK,EAAEzE,YAAYwE,qBAAqB,CAAC;CAGrD,OAAO;EAAE1B;EAAW/C;EAAWwE;CAAU;AAC3C;AAEA,SAASI,eACP/D,UACoB;CACpB,IAAI,CAACA,UAAU,OAAOnF,KAAAA;CACtB,IAAI,OAAOmF,SAASC,YAAY,UAAU,OAAOD,SAASC;CAC1D,MAAM+B,SAAShC,SAASgC;CACxB,IAAI,OAAOA,QAAQ/B,YAAY,UAAU,OAAO+B,OAAO/B;AAEzD;AAEA,SAAS+D,mBACP9B,WACA/C,WACAF,YACAe,UACA2D,WACA5B,OAMe;CACf,MAAMkC,UAAU/B,UAAUrB,SAAS;CACnC,MAAMf,aAAamE,UACfhL,yBAAyBiJ,UAAUC,KAAK,EAAE,CAAC,IAC3CtH,KAAAA;CACJ,MAAMoF,UAAU8D,eAAe/D,QAAQ;CAEvC,MAAMvB,QACJkF,aAAaA,UAAU9C,SAAS,IAC5B8C,UAAU9G,KAAKiE,OAAO,EACpB,GAAIA,EAAE1B,WAAWyB,SAAS,IACtB,EAAEzB,YAAY0B,EAAE1B,WAAW,IAC3BvE,KAAAA,EACN,EAAE,IACFA,KAAAA;CAEN,OAAO;EACLmE,QAAQiF,UAAU,cAAc;EAChC,GAAI9E,UAAU0B,SAAS,IAAI,EAAE1B,UAAU,IAAItE,KAAAA;EAC3C,GAAIoE,aAAa,IAAI,EAAEA,WAAW,IAAIpE,KAAAA;EACtC,GAAIkH,OAAO1C,eAAe,OACtB,EAAEA,aAAa0C,MAAM1C,YAAY,IACjCxE,KAAAA;EACJ,GAAIkH,OAAOxC,gBAAgB,OACvB,EAAEA,cAAcwC,MAAMxC,aAAa,IACnC1E,KAAAA;EACJ,GAAIkH,OAAOtC,mBAAmB,OAC1B,EAAEA,iBAAiBsC,MAAMtC,gBAAgB,IACzC5E,KAAAA;EACJ,GAAIkH,OAAOpC,qBAAqB,OAC5B,EAAEA,mBAAmBoC,MAAMpC,kBAAkB,IAC7C9E,KAAAA;EACJ,GAAIiF,cAAc,OAAO,EAAEA,WAAW,IAAIjF,KAAAA;EAC1C,GAAImF,WAAW,EAAEA,SAAS,IAAInF,KAAAA;EAC9B,GAAI4D,QAAQ,EAAEA,MAAM,IAAI5D,KAAAA;EACxB,GAAIoF,UAAU,EAAEA,QAAQ,IAAIpF,KAAAA;CAC9B;AACF;AAEA,SAASqJ,oBAAoBlE,UAOf;CAEZ,MAAM+B,QAAQ/B,UAAU+B;CACxB,IAAIA,OAAO;EACT,MAAMoC,aAAapL,2BAA2BgJ,KAAK;EACnD,IAAIoC,YAAY,OAAOA;CACzB;CAGA,MAAM1F,QAAQuB,UAAUvB;CAGxB,IAAIA,SAASA,MAAMoC,SAAS,GAAG;EAC7B,IAAIxB,cAAc;EAClB,IAAIE,eAAe;EACnB,IAAIE,kBAAkB;EACtB,IAAIE,oBAAoB;EACxB,IAAI6C,WAAW;EACf,IAAIC,YAAY;EAChB,IAAIC,eAAe;EACnB,IAAIC,iBAAiB;EACrB,IAAIyB,SAAS;EACb,KAAK,MAAMtD,KAAKrC,OAAO;GACrB,IAAI,CAACqC,EAAEiB,OAAO;GACd,MAAMsC,IAAItL,2BAA2B+H,EAAEiB,KAAK;GAC5C,IAAIsC,GAAG;IACL,IAAIA,EAAEhF,eAAe,MAAM;KACzBA,eAAegF,EAAEhF;KACjBmD,WAAW;IACb;IACA,IAAI6B,EAAE9E,gBAAgB,MAAM;KAC1BA,gBAAgB8E,EAAE9E;KAClBkD,YAAY;IACd;IACA,IAAI4B,EAAE5E,mBAAmB,MAAM;KAC7BA,mBAAmB4E,EAAE5E;KACrBiD,eAAe;IACjB;IACA,IAAI2B,EAAE1E,qBAAqB,MAAM;KAC/BA,qBAAqB0E,EAAE1E;KACvBgD,iBAAiB;IACnB;IACAyB,SAAS;GACX;EACF;EACA,IAAIA,QACF,OAAO;GACL,GAAI5B,WAAW,EAAEnD,YAAY,IAAIxE,KAAAA;GACjC,GAAI4H,YAAY,EAAElD,aAAa,IAAI1E,KAAAA;GACnC,GAAI6H,eAAe,EAAEjD,gBAAgB,IAAI5E,KAAAA;GACzC,GAAI8H,iBAAiB,EAAEhD,kBAAkB,IAAI9E,KAAAA;EAC/C;CAEJ;AAGF;AAEA,SAASoG,eAAkB9C,SAAkC;CAC3D,MAAMoD,MAAMpD;CACZ,IAAIoD,IAAIC,SAAS,aAAa,OAAO;CAErC,MAAM,EAAEU,WAAW/C,WAAWwE,cAAcD,oBAC1CnC,IAAI4B,SAAS,CAAA,CACf;CACA,OAAOa,mBACL9B,WACA/C,WACAwE,UAAU9C,QACVU,IAAIvB,UACJ2D,WACAO,oBAAoB3C,IAAIvB,QAAQ,CAClC;AACF;AAEA,SAASkB,yBAA4BoD,cAAyC;CAC5E,MAAMC,eAAyB,CAAA;CAC/B,MAAMC,eAAkD,CAAA;CACxD,MAAMC,eAAoE,CAAA;CAC1E,IAAIC,eAAe;CACnB,IAAI1E;CACJ,IAAIX,cAAc;CAClB,IAAIE,eAAe;CACnB,IAAIE,kBAAkB;CACtB,IAAIE,oBAAoB;CACxB,IAAI6C,WAAW;CACf,IAAIC,YAAY;CAChB,IAAIC,eAAe;CACnB,IAAIC,iBAAiB;CAErB,KAAK,MAAMxE,WAAWmG,cAAc;EAClC,MAAM/C,MAAMpD;EACZ,IAAIoD,IAAIC,SAAS,aAAa;EAC9BkD,eAAe;EAEf,MAAM,EAAExC,WAAW/C,WAAWwE,cAAcD,oBAC1CnC,IAAI4B,SAAS,CAAA,CACf;EACAoB,aAAaV,KAAK,GAAG3B,SAAS;EAC9BsC,aAAaX,KAAK,GAAG1E,SAAS;EAC9BsF,aAAaZ,KAAK,GAAGF,SAAS;EAC9B,IAAIpC,IAAIvB,UAAUA,WAAWuB,IAAIvB;EAEjC,MAAM+B,QAAQmC,oBAAoB3C,IAAIvB,QAAQ;EAC9C,IAAI+B,OAAO;GACT,IAAIA,MAAM1C,eAAe,MAAM;IAC7BA,eAAe0C,MAAM1C;IACrBmD,WAAW;GACb;GACA,IAAIT,MAAMxC,gBAAgB,MAAM;IAC9BA,gBAAgBwC,MAAMxC;IACtBkD,YAAY;GACd;GACA,IAAIV,MAAMtC,mBAAmB,MAAM;IACjCA,mBAAmBsC,MAAMtC;IACzBiD,eAAe;GACjB;GACA,IAAIX,MAAMpC,qBAAqB,MAAM;IACnCA,qBAAqBoC,MAAMpC;IAC3BgD,iBAAiB;GACnB;EACF;CACF;CAEA,IAAI,CAAC+B,cAAc,OAAO;CAC1B,OAAOV,mBACLO,cACAC,cACAC,aAAa5D,QACbb,UACAyE,cACA;EACE,GAAIjC,WAAW,EAAEnD,YAAY,IAAIxE,KAAAA;EACjC,GAAI4H,YAAY,EAAElD,aAAa,IAAI1E,KAAAA;EACnC,GAAI6H,eAAe,EAAEjD,gBAAgB,IAAI5E,KAAAA;EACzC,GAAI8H,iBAAiB,EAAEhD,kBAAkB,IAAI9E,KAAAA;CAC/C,CACF;AACF;AAEA,SAAgB8J,sCACd7K,UACsB;CACtB,MAAMG,MAAMX,OAAO;CAEnB,MAAMsL,SAAS1M,OAAO+B,GAAG;CACzBhC,gBAAgB;EACd2M,OAAOrK,UAAUN;CACnB,CAAC;CACD,MAAM,CAACsB,WAAWpD,eAEd,IAAI0B,mCAAmCC,gBAAgB8K,OAAOrK,OAAO,CACzE;CACA,OAAOgB;AACT"}
@@ -0,0 +1,12 @@
1
+ //#region src/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.d.ts
2
+ type ThreadData = {
3
+ externalId: string | undefined;
4
+ };
5
+ type ThreadListItem = {
6
+ source: unknown;
7
+ initialize: () => Promise<ThreadData>;
8
+ };
9
+ declare const createCloudThreadListAdapterCreateFallback: (create: (() => Promise<ThreadData>) | undefined, threadListItem: ThreadListItem) => (() => Promise<ThreadData>);
10
+ //#endregion
11
+ export { createCloudThreadListAdapterCreateFallback };
12
+ //# sourceMappingURL=createCloudThreadListAdapterCreateFallback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createCloudThreadListAdapterCreateFallback.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.ts"],"mappings":";KAAK;EACH;;KAGG;EACH;EACA,kBAAkB,QAAQ;;cAGf,6CACX,eAAe,QAAQ,0BACvB,gBAAgB,0BACR,QAAQ"}
@@ -0,0 +1,10 @@
1
+ //#region src/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.ts
2
+ const createCloudThreadListAdapterCreateFallback = (create, threadListItem) => async function createThread() {
3
+ if (create) return create();
4
+ if (threadListItem.source) return threadListItem.initialize();
5
+ return { externalId: void 0 };
6
+ };
7
+ //#endregion
8
+ export { createCloudThreadListAdapterCreateFallback };
9
+
10
+ //# sourceMappingURL=createCloudThreadListAdapterCreateFallback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createCloudThreadListAdapterCreateFallback.js","names":["ThreadData","externalId","ThreadListItem","source","initialize","Promise","createCloudThreadListAdapterCreateFallback","create","threadListItem","createThread","undefined"],"sources":["../../../../src/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.ts"],"sourcesContent":["type ThreadData = {\n externalId: string | undefined;\n};\n\ntype ThreadListItem = {\n source: unknown;\n initialize: () => Promise<ThreadData>;\n};\n\nexport const createCloudThreadListAdapterCreateFallback = (\n create: (() => Promise<ThreadData>) | undefined,\n threadListItem: ThreadListItem,\n): (() => Promise<ThreadData>) =>\n async function createThread() {\n if (create) return create();\n if (threadListItem.source) return threadListItem.initialize();\n return { externalId: undefined };\n };\n"],"mappings":";AASA,MAAaM,8CACXC,QACAC,mBAEA,eAAeC,eAAe;CAC5B,IAAIF,QAAQ,OAAOA,OAAO;CAC1B,IAAIC,eAAeL,QAAQ,OAAOK,eAAeJ,WAAW;CAC5D,OAAO,EAAEH,YAAYS,KAAAA,EAAU;AACjC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useCloudThreadListAdapter.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/useCloudThreadListAdapter.tsx"],"mappings":";;;KAuBK;EACH;;KAGG;EACH,QAAQ;EAER,gBAAgB,QAAQ;EACxB,WAAW,qBAAqB;;cAsCrB,4BACX,SAAS,kCACR"}
1
+ {"version":3,"file":"useCloudThreadListAdapter.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/useCloudThreadListAdapter.tsx"],"mappings":";;;KAuBK;EACH;;KAGG;EACH,QAAQ;EAER,gBAAgB,QAAQ;EACxB,WAAW,qBAAqB;;cAmErB,4BACX,SAAS,kCACR"}
@@ -14,6 +14,27 @@ const autoCloud = baseUrl ? new AssistantCloud({
14
14
  anonymous: true
15
15
  }) : void 0;
16
16
  const CLOUD_THREAD_PAGE_SIZE = 20;
17
+ const parseListCursor = (after) => {
18
+ const fallback = {
19
+ activeCursor: after,
20
+ archivedCursor: void 0,
21
+ activeExhausted: false,
22
+ archivedExhausted: false
23
+ };
24
+ if (!after || !after.startsWith("{")) return fallback;
25
+ try {
26
+ const parsed = JSON.parse(after);
27
+ if (!isRecord(parsed)) return fallback;
28
+ return {
29
+ activeCursor: typeof parsed.a === "string" ? parsed.a : void 0,
30
+ archivedCursor: typeof parsed.r === "string" ? parsed.r : void 0,
31
+ activeExhausted: parsed.ae === true,
32
+ archivedExhausted: parsed.re === true
33
+ };
34
+ } catch {
35
+ return fallback;
36
+ }
37
+ };
17
38
  const useCloudThreadListAdapters = (adapterRef) => {
18
39
  const history = useAssistantCloudThreadHistoryAdapter({ get current() {
19
40
  return adapterRef.current.cloud ?? autoCloud;
@@ -54,12 +75,19 @@ const useCloudThreadListAdapter = (adapter) => {
54
75
  }
55
76
  return {
56
77
  list: async ({ after } = {}) => {
57
- const { threads } = await cloud.threads.list({
78
+ const { activeCursor, archivedCursor, activeExhausted, archivedExhausted } = parseListCursor(after);
79
+ const [{ threads: activeThreads }, { threads: archivedThreads }] = await Promise.all([activeExhausted ? Promise.resolve({ threads: [] }) : cloud.threads.list({
58
80
  limit: CLOUD_THREAD_PAGE_SIZE,
59
- ...after ? { after } : {}
60
- });
81
+ ...activeCursor ? { after: activeCursor } : {}
82
+ }), archivedExhausted ? Promise.resolve({ threads: [] }) : cloud.threads.list({
83
+ is_archived: true,
84
+ limit: CLOUD_THREAD_PAGE_SIZE,
85
+ ...archivedCursor ? { after: archivedCursor } : {}
86
+ })]);
87
+ const activeNext = !activeExhausted && activeThreads.length === CLOUD_THREAD_PAGE_SIZE ? activeThreads.at(-1)?.id : void 0;
88
+ const archivedNext = !archivedExhausted && archivedThreads.length === CLOUD_THREAD_PAGE_SIZE ? archivedThreads.at(-1)?.id : void 0;
61
89
  return {
62
- threads: threads.map((t) => ({
90
+ threads: [...activeThreads, ...archivedThreads].map((t) => ({
63
91
  status: t.is_archived ? "archived" : "regular",
64
92
  remoteId: t.id,
65
93
  title: t.title,
@@ -67,7 +95,12 @@ const useCloudThreadListAdapter = (adapter) => {
67
95
  externalId: t.external_id ?? void 0,
68
96
  custom: toCustom(t.metadata)
69
97
  })),
70
- nextCursor: threads.length === CLOUD_THREAD_PAGE_SIZE ? threads.at(-1)?.id : void 0
98
+ nextCursor: activeNext || archivedNext ? JSON.stringify({
99
+ a: activeNext,
100
+ r: archivedNext,
101
+ ...activeNext === void 0 ? { ae: true } : {},
102
+ ...archivedNext === void 0 ? { re: true } : {}
103
+ }) : void 0
71
104
  };
72
105
  },
73
106
  initialize: async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"useCloudThreadListAdapter.js","names":["process","env","Record","FC","PropsWithChildren","RefObject","useCallback","useEffect","useMemo","useRef","useState","AssistantCloud","RemoteThreadListAdapter","InMemoryThreadListAdapter","useAssistantCloudThreadHistoryAdapter","RuntimeAdapterProvider","RuntimeAdapters","CloudFileAttachmentAdapter","isRecord","ThreadData","externalId","CloudThreadListAdapterOptions","cloud","create","Promise","delete","threadId","toCustom","value","undefined","baseUrl","NEXT_PUBLIC_ASSISTANT_BASE_URL","autoCloud","anonymous","CLOUD_THREAD_PAGE_SIZE","useCloudThreadListAdapters","adapterRef","history","current","attachments","useCloudThreadListAdapter","adapter","unstable_useAdapters","useCloudAdapters","unstable_Provider","Provider","children","adapters","ref","inMemory","initialize","result","remoteId","list","after","threads","limit","map","t","status","is_archived","id","title","lastMessageAt","last_message_at","Date","external_id","custom","metadata","nextCursor","length","at","createTask","resolve","thread_id","rename","newTitle","update","updateCustom","archive","unarchive","generateTitle","messages","filteredMessages","msg","content","filter","part","type","runs","stream","assistant_id","fetch","thread","get"],"sources":["../../../../src/react/runtimes/cloud/useCloudThreadListAdapter.tsx"],"sourcesContent":["declare const process: { env: Record<string, string | undefined> };\n\nimport {\n type FC,\n type PropsWithChildren,\n type RefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { AssistantCloud } from \"assistant-cloud\";\nimport type { RemoteThreadListAdapter } from \"../../../runtimes/remote-thread-list/types\";\nimport { InMemoryThreadListAdapter } from \"../../../runtimes/remote-thread-list/adapter/in-memory\";\nimport { useAssistantCloudThreadHistoryAdapter } from \"./AssistantCloudThreadHistoryAdapter\";\nimport {\n RuntimeAdapterProvider,\n type RuntimeAdapters,\n} from \"../RuntimeAdapterProvider\";\nimport { CloudFileAttachmentAdapter } from \"./CloudFileAttachmentAdapter\";\nimport { isRecord } from \"../../../utils/json/is-json\";\n\ntype ThreadData = {\n externalId: string | undefined;\n};\n\ntype CloudThreadListAdapterOptions = {\n cloud?: AssistantCloud | undefined;\n\n create?: (() => Promise<ThreadData>) | undefined;\n delete?: ((threadId: string) => Promise<void>) | undefined;\n};\n\nconst toCustom = (value: unknown): Record<string, unknown> | undefined =>\n isRecord(value) ? value : undefined;\n\nconst baseUrl =\n typeof process !== \"undefined\" &&\n process?.env?.NEXT_PUBLIC_ASSISTANT_BASE_URL;\nconst autoCloud = baseUrl\n ? new AssistantCloud({ baseUrl, anonymous: true })\n : undefined;\n\nconst CLOUD_THREAD_PAGE_SIZE = 20;\n\nconst useCloudThreadListAdapters = (\n adapterRef: RefObject<CloudThreadListAdapterOptions>,\n): RuntimeAdapters => {\n const history = useAssistantCloudThreadHistoryAdapter({\n get current() {\n return adapterRef.current.cloud ?? autoCloud!;\n },\n });\n const [attachments] = useState(\n () =>\n new CloudFileAttachmentAdapter(\n () => adapterRef.current.cloud ?? autoCloud!,\n ),\n );\n return useMemo(\n () => ({\n history,\n attachments,\n }),\n [history, attachments],\n );\n};\n\nexport const useCloudThreadListAdapter = (\n adapter: CloudThreadListAdapterOptions,\n): RemoteThreadListAdapter => {\n const adapterRef = useRef(adapter);\n useEffect(() => {\n adapterRef.current = adapter;\n }, [adapter]);\n\n const unstable_useAdapters = useCallback(function useCloudAdapters() {\n return useCloudThreadListAdapters(adapterRef);\n }, []);\n\n const unstable_Provider = useCallback<FC<PropsWithChildren>>(\n function Provider({ children }) {\n const adapters = useCloudThreadListAdapters(adapterRef);\n return (\n <RuntimeAdapterProvider adapters={adapters}>\n {children}\n </RuntimeAdapterProvider>\n );\n },\n [],\n );\n\n const cloud = adapter.cloud ?? autoCloud;\n return useMemo<RemoteThreadListAdapter>(() => {\n if (!cloud) {\n const ref = adapterRef;\n const inMemory = new InMemoryThreadListAdapter();\n inMemory.initialize = async (threadId: string) => {\n const result = await ref.current.create?.();\n return { remoteId: threadId, externalId: result?.externalId };\n };\n return inMemory;\n }\n\n return {\n list: async ({ after } = {}) => {\n const { threads } = await cloud.threads.list({\n limit: CLOUD_THREAD_PAGE_SIZE,\n ...(after ? { after } : {}),\n });\n return {\n threads: threads.map((t) => ({\n status: t.is_archived ? \"archived\" : \"regular\",\n remoteId: t.id,\n title: t.title,\n lastMessageAt: t.last_message_at\n ? new Date(t.last_message_at)\n : undefined,\n externalId: t.external_id ?? undefined,\n custom: toCustom(t.metadata),\n })),\n nextCursor:\n threads.length === CLOUD_THREAD_PAGE_SIZE\n ? threads.at(-1)?.id\n : undefined,\n };\n },\n\n initialize: async () => {\n const createTask = adapterRef.current.create?.() ?? Promise.resolve();\n const t = await createTask;\n const external_id = t ? t.externalId : undefined;\n const { thread_id: remoteId } = await cloud.threads.create({\n last_message_at: new Date(),\n external_id,\n });\n\n return { externalId: external_id, remoteId: remoteId };\n },\n\n rename: async (threadId, newTitle) => {\n return cloud.threads.update(threadId, { title: newTitle });\n },\n updateCustom: async (threadId, custom) => {\n return cloud.threads.update(threadId, { metadata: custom ?? null });\n },\n archive: async (threadId) => {\n return cloud.threads.update(threadId, { is_archived: true });\n },\n unarchive: async (threadId) => {\n return cloud.threads.update(threadId, { is_archived: false });\n },\n delete: async (threadId) => {\n await adapterRef.current.delete?.(threadId);\n return cloud.threads.delete(threadId);\n },\n\n generateTitle: async (threadId, messages) => {\n // Filter messages to only include content types the title generator understands\n // (reasoning, source, etc. are not needed for title generation)\n // TODO serialize these to a more efficient format\n const filteredMessages = messages.map((msg) => ({\n ...msg,\n content: msg.content.filter(\n (part) => part.type === \"text\" || part.type === \"tool-call\",\n ),\n }));\n\n return cloud.runs.stream({\n thread_id: threadId,\n assistant_id: \"system/thread_title\",\n messages: filteredMessages,\n });\n },\n\n fetch: async (threadId: string) => {\n const thread = await cloud.threads.get(threadId);\n return {\n status: thread.is_archived ? \"archived\" : \"regular\",\n remoteId: thread.id,\n title: thread.title,\n lastMessageAt: thread.last_message_at\n ? new Date(thread.last_message_at)\n : undefined,\n externalId: thread.external_id ?? undefined,\n custom: toCustom(thread.metadata),\n };\n },\n\n unstable_Provider,\n unstable_useAdapters,\n };\n }, [cloud, unstable_Provider, unstable_useAdapters]);\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"useCloudThreadListAdapter.js","names":["process","env","Record","FC","PropsWithChildren","RefObject","useCallback","useEffect","useMemo","useRef","useState","AssistantCloud","RemoteThreadListAdapter","InMemoryThreadListAdapter","useAssistantCloudThreadHistoryAdapter","RuntimeAdapterProvider","RuntimeAdapters","CloudFileAttachmentAdapter","isRecord","ThreadData","externalId","CloudThreadListAdapterOptions","cloud","create","Promise","delete","threadId","toCustom","value","undefined","baseUrl","NEXT_PUBLIC_ASSISTANT_BASE_URL","autoCloud","anonymous","CLOUD_THREAD_PAGE_SIZE","CloudListCursor","activeCursor","archivedCursor","activeExhausted","archivedExhausted","parseListCursor","after","fallback","startsWith","parsed","JSON","parse","a","r","ae","re","useCloudThreadListAdapters","adapterRef","history","current","attachments","useCloudThreadListAdapter","adapter","unstable_useAdapters","useCloudAdapters","unstable_Provider","Provider","children","adapters","ref","inMemory","initialize","result","remoteId","list","threads","activeThreads","archivedThreads","all","resolve","limit","is_archived","activeNext","length","at","id","archivedNext","map","t","status","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/useCloudThreadListAdapter.tsx"],"sourcesContent":["declare const process: { env: Record<string, string | undefined> };\n\nimport {\n type FC,\n type PropsWithChildren,\n type RefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { AssistantCloud } from \"assistant-cloud\";\nimport type { RemoteThreadListAdapter } from \"../../../runtimes/remote-thread-list/types\";\nimport { InMemoryThreadListAdapter } from \"../../../runtimes/remote-thread-list/adapter/in-memory\";\nimport { useAssistantCloudThreadHistoryAdapter } from \"./AssistantCloudThreadHistoryAdapter\";\nimport {\n RuntimeAdapterProvider,\n type RuntimeAdapters,\n} from \"../RuntimeAdapterProvider\";\nimport { CloudFileAttachmentAdapter } from \"./CloudFileAttachmentAdapter\";\nimport { isRecord } from \"../../../utils/json/is-json\";\n\ntype ThreadData = {\n externalId: string | undefined;\n};\n\ntype CloudThreadListAdapterOptions = {\n cloud?: AssistantCloud | undefined;\n\n create?: (() => Promise<ThreadData>) | undefined;\n delete?: ((threadId: string) => Promise<void>) | undefined;\n};\n\nconst toCustom = (value: unknown): Record<string, unknown> | undefined =>\n isRecord(value) ? value : undefined;\n\nconst baseUrl =\n typeof process !== \"undefined\" &&\n process?.env?.NEXT_PUBLIC_ASSISTANT_BASE_URL;\nconst autoCloud = baseUrl\n ? new AssistantCloud({ baseUrl, anonymous: true })\n : undefined;\n\nconst CLOUD_THREAD_PAGE_SIZE = 20;\n\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\nconst useCloudThreadListAdapters = (\n adapterRef: RefObject<CloudThreadListAdapterOptions>,\n): RuntimeAdapters => {\n const history = useAssistantCloudThreadHistoryAdapter({\n get current() {\n return adapterRef.current.cloud ?? autoCloud!;\n },\n });\n const [attachments] = useState(\n () =>\n new CloudFileAttachmentAdapter(\n () => adapterRef.current.cloud ?? autoCloud!,\n ),\n );\n return useMemo(\n () => ({\n history,\n attachments,\n }),\n [history, attachments],\n );\n};\n\nexport const useCloudThreadListAdapter = (\n adapter: CloudThreadListAdapterOptions,\n): RemoteThreadListAdapter => {\n const adapterRef = useRef(adapter);\n useEffect(() => {\n adapterRef.current = adapter;\n }, [adapter]);\n\n const unstable_useAdapters = useCallback(function useCloudAdapters() {\n return useCloudThreadListAdapters(adapterRef);\n }, []);\n\n const unstable_Provider = useCallback<FC<PropsWithChildren>>(\n function Provider({ children }) {\n const adapters = useCloudThreadListAdapters(adapterRef);\n return (\n <RuntimeAdapterProvider adapters={adapters}>\n {children}\n </RuntimeAdapterProvider>\n );\n },\n [],\n );\n\n const cloud = adapter.cloud ?? autoCloud;\n return useMemo<RemoteThreadListAdapter>(() => {\n if (!cloud) {\n const ref = adapterRef;\n const inMemory = new InMemoryThreadListAdapter();\n inMemory.initialize = async (threadId: string) => {\n const result = await ref.current.create?.();\n return { remoteId: threadId, externalId: result?.externalId };\n };\n return inMemory;\n }\n\n return {\n list: async ({ after } = {}) => {\n const {\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 &&\n 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\" : \"regular\",\n remoteId: t.id,\n title: t.title,\n lastMessageAt: t.last_message_at\n ? new Date(t.last_message_at)\n : undefined,\n externalId: t.external_id ?? undefined,\n custom: toCustom(t.metadata),\n })),\n nextCursor:\n 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 = adapterRef.current.create?.() ?? Promise.resolve();\n const t = await createTask;\n const external_id = t ? t.externalId : undefined;\n const { thread_id: remoteId } = await cloud.threads.create({\n last_message_at: new Date(),\n external_id,\n });\n\n return { externalId: external_id, remoteId: remoteId };\n },\n\n rename: async (threadId, newTitle) => {\n return cloud.threads.update(threadId, { title: newTitle });\n },\n updateCustom: async (threadId, custom) => {\n return cloud.threads.update(threadId, { metadata: custom ?? null });\n },\n archive: async (threadId) => {\n return cloud.threads.update(threadId, { is_archived: true });\n },\n unarchive: async (threadId) => {\n return cloud.threads.update(threadId, { is_archived: false });\n },\n delete: async (threadId) => {\n await adapterRef.current.delete?.(threadId);\n return cloud.threads.delete(threadId);\n },\n\n generateTitle: async (threadId, messages) => {\n // Filter messages to only include content types the title generator understands\n // (reasoning, source, etc. are not needed for title generation)\n // TODO serialize these to a more efficient format\n const filteredMessages = messages.map((msg) => ({\n ...msg,\n content: msg.content.filter(\n (part) => part.type === \"text\" || part.type === \"tool-call\",\n ),\n }));\n\n return cloud.runs.stream({\n thread_id: threadId,\n assistant_id: \"system/thread_title\",\n messages: filteredMessages,\n });\n },\n\n fetch: async (threadId: string) => {\n const thread = await cloud.threads.get(threadId);\n return {\n status: thread.is_archived ? \"archived\" : \"regular\",\n remoteId: thread.id,\n title: thread.title,\n lastMessageAt: thread.last_message_at\n ? new Date(thread.last_message_at)\n : undefined,\n externalId: thread.external_id ?? undefined,\n custom: toCustom(thread.metadata),\n };\n },\n\n unstable_Provider,\n unstable_useAdapters,\n };\n }, [cloud, unstable_Provider, unstable_useAdapters]);\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useCloudThreadListRuntime.js","names":["c","_c","AssistantCloud","AssistantRuntime","useRemoteThreadListRuntime","useCloudThreadListAdapter","ThreadData","externalId","CloudThreadListAdapter","cloud","runtimeHook","create","Promise","delete","threadId","useCloudThreadListRuntime","t0","$","adapterOptions","adapter","t1","allowNesting"],"sources":["../../../../src/react/runtimes/cloud/useCloudThreadListRuntime.ts"],"sourcesContent":["\"use client\";\n\nimport type { AssistantCloud } from \"assistant-cloud\";\nimport type { AssistantRuntime } from \"../../../runtime/api/assistant-runtime\";\nimport { useRemoteThreadListRuntime } from \"../useRemoteThreadListRuntime\";\nimport { useCloudThreadListAdapter } from \"./useCloudThreadListAdapter\";\n\ntype ThreadData = {\n externalId: string;\n};\n\ntype CloudThreadListAdapter = {\n cloud: AssistantCloud;\n\n runtimeHook: () => AssistantRuntime;\n\n create?(): Promise<ThreadData>;\n delete?(threadId: string): Promise<void>;\n};\n\nexport function useCloudThreadListRuntime({\n runtimeHook,\n ...adapterOptions\n}: CloudThreadListAdapter) {\n const adapter = useCloudThreadListAdapter(adapterOptions);\n return useRemoteThreadListRuntime({\n runtimeHook,\n adapter,\n allowNesting: true,\n });\n}\n"],"mappings":";;;;;AAoBA,SAAOe,0BAAAC,IAAA;CAAA,MAAAC,IAAAhB,EAAA,CAAA;CAAA,IAAAiB;CAAA,IAAAR;CAAA,IAAAO,EAAA,OAAAD,IAAA;EAAmC,CAAA,CAAAN,gBAAAQ,kBAAAF;EAGjBC,EAAA,KAAAD;EAAAC,EAAA,KAAAC;EAAAD,EAAA,KAAAP;CAAA,OAAA;EAAAQ,iBAAAD,EAAA;EAAAP,cAAAO,EAAA;CAAA;CACvB,MAAAE,UAAgBd,0BAA0Ba,cAAc;CAAE,IAAAE;CAAA,IAAAH,EAAA,OAAAE,WAAAF,EAAA,OAAAP,aAAA;EACxBU,KAAA;GAAAV;GAAAS;GAAAE,cAGlB;EAChB;EAACJ,EAAA,KAAAE;EAAAF,EAAA,KAAAP;EAAAO,EAAA,KAAAG;CAAA,OAAAA,KAAAH,EAAA;CAAA,OAJMb,2BAA2BgB,EAIjC;AAAC"}
1
+ {"version":3,"file":"useCloudThreadListRuntime.js","names":["c","_c","AssistantCloud","AssistantRuntime","useRemoteThreadListRuntime","useCloudThreadListAdapter","ThreadData","externalId","CloudThreadListAdapter","cloud","runtimeHook","create","Promise","delete","threadId","useCloudThreadListRuntime","t0","$","adapterOptions","adapter","t1","allowNesting"],"sources":["../../../../src/react/runtimes/cloud/useCloudThreadListRuntime.ts"],"sourcesContent":["\"use client\";\n\nimport type { AssistantCloud } from \"assistant-cloud\";\nimport type { AssistantRuntime } from \"../../../runtime/api/assistant-runtime\";\nimport { useRemoteThreadListRuntime } from \"../useRemoteThreadListRuntime\";\nimport { useCloudThreadListAdapter } from \"./useCloudThreadListAdapter\";\n\ntype ThreadData = {\n externalId: string;\n};\n\ntype CloudThreadListAdapter = {\n cloud: AssistantCloud;\n\n runtimeHook: () => AssistantRuntime;\n\n create?(): Promise<ThreadData>;\n delete?(threadId: string): Promise<void>;\n};\n\nexport function useCloudThreadListRuntime({\n runtimeHook,\n ...adapterOptions\n}: CloudThreadListAdapter) {\n const adapter = useCloudThreadListAdapter(adapterOptions);\n return useRemoteThreadListRuntime({\n runtimeHook,\n adapter,\n allowNesting: true,\n });\n}\n"],"mappings":";;;;;AAoBA,SAAOe,0BAAAC,IAAA;CAAA,MAAAC,IAAAhB,EAAA,CAAA;CAAA,IAAAiB;CAAA,IAAAR;CAAA,IAAAO,EAAA,OAAAD,IAAA;EAAmC,CAAA,CAAAN,aAAA,GAAAQ,kBAAAF;EAGjBC,EAAA,KAAAD;EAAAC,EAAA,KAAAC;EAAAD,EAAA,KAAAP;CAAA,OAAA;EAAAQ,iBAAAD,EAAA;EAAAP,cAAAO,EAAA;CAAA;CACvB,MAAAE,UAAgBd,0BAA0Ba,cAAc;CAAE,IAAAE;CAAA,IAAAH,EAAA,OAAAE,WAAAF,EAAA,OAAAP,aAAA;EACxBU,KAAA;GAAAV;GAAAS;GAAAE,cAGlB;EAChB;EAACJ,EAAA,KAAAE;EAAAF,EAAA,KAAAP;EAAAO,EAAA,KAAAG;CAAA,OAAAA,KAAAH,EAAA;CAAA,OAJMb,2BAA2BgB,EAIjC;AAAC"}
@@ -1,5 +1,6 @@
1
1
  import { ThreadMessage } from "../../types/message.js";
2
- import { JoinStrategy, useExternalMessageConverter } from "./external-message-converter.js";
2
+ import { JoinStrategy } from "../../runtime/utils/external-message-conversion.js";
3
+ import { useExternalMessageConverter } from "./external-message-converter.js";
3
4
  import { ThreadState } from "../../runtime/api/thread-runtime.js";
4
5
  //#region src/react/runtimes/createMessageConverter.d.ts
5
6
  declare const createMessageConverter: <T extends object>(callback: useExternalMessageConverter.Callback<T>) => {
@@ -1 +1 @@
1
- {"version":3,"file":"createMessageConverter.d.ts","names":[],"sources":["../../../src/react/runtimes/createMessageConverter.ts"],"mappings":";;;;cAWa,yBAA0B,kBACrC,UAAU,4BAA4B,SAAS;EAQ1C,sBAAA,UAAA,WAAA,cAAA;IACD,UAAU;IACV;IACA,eAAe;IACf,WAAW,4BAA4B;QACxC;EAUW,mBAAA,UAAA,KAAG,qBAAA,WAEH,4BAA4B,aAAQ;EAKvC,qBAAA,OAAA,cAAc,gBAAgB;EAO9B,oBAAA,OAAA,cAAc,gBAAgB"}
1
+ {"version":3,"file":"createMessageConverter.d.ts","names":[],"sources":["../../../src/react/runtimes/createMessageConverter.ts"],"mappings":";;;;;cAWa,yBAA0B,kBACrC,UAAU,4BAA4B,SAAS;EAQ1C,sBAAA,UAAA,WAAA,cAAA;IACD,UAAU;IACV;IACA,eAAe;IACf,WAAW,4BAA4B;QACxC;EAUW,mBAAA,UAAA,KAAG,qBAAA,WAEH,4BAA4B,aAAQ;EAKvC,qBAAA,OAAA,cAAc,gBAAgB;EAO9B,oBAAA,OAAA,cAAc,gBAAgB"}