@assistant-ui/core 0.3.18 → 0.3.19

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 (274) hide show
  1. package/dist/adapters/speech.d.ts.map +1 -1
  2. package/dist/adapters/speech.js +13 -3
  3. package/dist/adapters/speech.js.map +1 -1
  4. package/dist/adapters/thread-history.d.ts +4 -0
  5. package/dist/adapters/thread-history.d.ts.map +1 -1
  6. package/dist/index.d.ts +2 -2
  7. package/dist/index.js.map +1 -1
  8. package/dist/internal.d.ts +1 -1
  9. package/dist/model-context/frame/host.d.ts.map +1 -1
  10. package/dist/model-context/frame/host.js +26 -11
  11. package/dist/model-context/frame/host.js.map +1 -1
  12. package/dist/model-context/interactable-composer-metadata.js +11 -9
  13. package/dist/model-context/interactable-composer-metadata.js.map +1 -1
  14. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
  15. package/dist/react/adapters/LocalStorageThreadListAdapter.js +45 -7
  16. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  17. package/dist/react/client/DataRenderers.d.ts.map +1 -1
  18. package/dist/react/client/DataRenderers.js +20 -15
  19. package/dist/react/client/DataRenderers.js.map +1 -1
  20. package/dist/react/client/Interactables.d.ts.map +1 -1
  21. package/dist/react/client/Interactables.js +11 -5
  22. package/dist/react/client/Interactables.js.map +1 -1
  23. package/dist/react/client/RemoteThreadList.d.ts.map +1 -1
  24. package/dist/react/client/RemoteThreadList.js +3 -2
  25. package/dist/react/client/RemoteThreadList.js.map +1 -1
  26. package/dist/react/client/interactable-model-context.d.ts.map +1 -1
  27. package/dist/react/client/interactable-model-context.js +3 -2
  28. package/dist/react/client/interactable-model-context.js.map +1 -1
  29. package/dist/react/index.d.ts +2 -2
  30. package/dist/react/index.js +2 -2
  31. package/dist/react/interactables-legacy/useAssistantInteractable.d.ts.map +1 -1
  32. package/dist/react/interactables-legacy/useAssistantInteractable.js +3 -0
  33. package/dist/react/interactables-legacy/useAssistantInteractable.js.map +1 -1
  34. package/dist/react/model-context/useInteractable.d.ts.map +1 -1
  35. package/dist/react/model-context/useInteractable.js +4 -1
  36. package/dist/react/model-context/useInteractable.js.map +1 -1
  37. package/dist/react/model-context/useInteractableVersions.js +1 -1
  38. package/dist/react/primitives/message/MessageGroupedParts.d.ts +11 -2
  39. package/dist/react/primitives/message/MessageGroupedParts.d.ts.map +1 -1
  40. package/dist/react/primitives/message/MessageGroupedParts.js +3 -2
  41. package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
  42. package/dist/react/primitives/part/PartMessages.d.ts +1 -0
  43. package/dist/react/primitives/part/PartMessages.d.ts.map +1 -1
  44. package/dist/react/primitives/part/PartMessages.js +1 -0
  45. package/dist/react/primitives/part/PartMessages.js.map +1 -1
  46. package/dist/react/primitives/thread/ThreadMessages.d.ts.map +1 -1
  47. package/dist/react/primitives/thread/ThreadMessages.js +6 -5
  48. package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
  49. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  50. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +2 -1
  51. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  52. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +2 -24
  53. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  54. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +135 -374
  55. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  56. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts +1 -0
  57. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts.map +1 -1
  58. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js +22 -2
  59. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js.map +1 -1
  60. package/dist/react/runtimes/cloud/auiV0.d.ts +40 -15
  61. package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
  62. package/dist/react/runtimes/cloud/auiV0.js +62 -15
  63. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  64. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts +2 -1
  65. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts.map +1 -1
  66. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.js +4 -0
  67. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.js.map +1 -1
  68. package/dist/react/runtimes/cloud/sdkIdentity.d.ts +6 -0
  69. package/dist/react/runtimes/cloud/sdkIdentity.d.ts.map +1 -0
  70. package/dist/react/runtimes/cloud/sdkIdentity.js +9 -0
  71. package/dist/react/runtimes/cloud/sdkIdentity.js.map +1 -0
  72. package/dist/react/runtimes/external-message-converter.d.ts +12 -2
  73. package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
  74. package/dist/react/runtimes/external-message-converter.js +26 -61
  75. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  76. package/dist/react/runtimes/useRemoteThreadListRuntime.js +1 -1
  77. package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
  78. package/dist/react/utils/groupParts.d.ts +6 -1
  79. package/dist/react/utils/groupParts.d.ts.map +1 -1
  80. package/dist/react/utils/groupParts.js +6 -0
  81. package/dist/react/utils/groupParts.js.map +1 -1
  82. package/dist/react/utils/useJSONEqual.d.ts +3 -1
  83. package/dist/react/utils/useJSONEqual.d.ts.map +1 -1
  84. package/dist/react/utils/useJSONEqual.js +6 -1
  85. package/dist/react/utils/useJSONEqual.js.map +1 -1
  86. package/dist/react/utils/useJSONSchemaDependency.d.ts +7 -0
  87. package/dist/react/utils/useJSONSchemaDependency.d.ts.map +1 -0
  88. package/dist/react/utils/useJSONSchemaDependency.js +20 -0
  89. package/dist/react/utils/useJSONSchemaDependency.js.map +1 -0
  90. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  91. package/dist/runtime/api/thread-runtime.js +2 -5
  92. package/dist/runtime/api/thread-runtime.js.map +1 -1
  93. package/dist/runtime/base/base-composer-runtime-core.d.ts +1 -0
  94. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  95. package/dist/runtime/base/base-composer-runtime-core.js +46 -10
  96. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  97. package/dist/runtime/base/base-thread-runtime-core.d.ts +2 -0
  98. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  99. package/dist/runtime/base/base-thread-runtime-core.js +155 -64
  100. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  101. package/dist/runtime/interfaces/thread-runtime-core.d.ts +6 -0
  102. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  103. package/dist/runtime/queue/message-queue.d.ts +5 -0
  104. package/dist/runtime/queue/message-queue.d.ts.map +1 -1
  105. package/dist/runtime/queue/message-queue.js +61 -6
  106. package/dist/runtime/queue/message-queue.js.map +1 -1
  107. package/dist/runtime/utils/auto-status.d.ts +6 -2
  108. package/dist/runtime/utils/auto-status.d.ts.map +1 -1
  109. package/dist/runtime/utils/auto-status.js +12 -4
  110. package/dist/runtime/utils/auto-status.js.map +1 -1
  111. package/dist/runtime/utils/external-message-conversion.d.ts +16 -4
  112. package/dist/runtime/utils/external-message-conversion.d.ts.map +1 -1
  113. package/dist/runtime/utils/external-message-conversion.js +48 -12
  114. package/dist/runtime/utils/external-message-conversion.js.map +1 -1
  115. package/dist/runtime/utils/message-repository.js +3 -3
  116. package/dist/runtime/utils/message-repository.js.map +1 -1
  117. package/dist/runtime/utils/thread-message-like.d.ts +2 -1
  118. package/dist/runtime/utils/thread-message-like.d.ts.map +1 -1
  119. package/dist/runtime/utils/thread-message-like.js +4 -2
  120. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  121. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  122. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +8 -1
  123. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  124. package/dist/runtimes/internal.d.ts +1 -1
  125. package/dist/runtimes/local/local-thread-runtime-core.d.ts +1 -1
  126. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  127. package/dist/runtimes/local/local-thread-runtime-core.js +4 -1
  128. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  129. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
  130. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +2 -1
  131. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  132. package/dist/store/clients/external-thread.d.ts.map +1 -1
  133. package/dist/store/clients/external-thread.js +241 -200
  134. package/dist/store/clients/external-thread.js.map +1 -1
  135. package/dist/store/clients/thread-tasks.d.ts +13 -0
  136. package/dist/store/clients/thread-tasks.d.ts.map +1 -0
  137. package/dist/store/clients/thread-tasks.js +69 -0
  138. package/dist/store/clients/thread-tasks.js.map +1 -0
  139. package/dist/store/index.d.ts +3 -2
  140. package/dist/store/index.js +3 -3
  141. package/dist/store/primitive-predicates.d.ts.map +1 -1
  142. package/dist/store/primitive-predicates.js +4 -4
  143. package/dist/store/primitive-predicates.js.map +1 -1
  144. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  145. package/dist/store/runtime-clients/thread-runtime-client.js +176 -128
  146. package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
  147. package/dist/store/scope-registration.d.ts +2 -0
  148. package/dist/store/scope-registration.d.ts.map +1 -1
  149. package/dist/store/scopes/task.d.ts +36 -0
  150. package/dist/store/scopes/task.d.ts.map +1 -0
  151. package/dist/store/scopes/task.js +0 -0
  152. package/dist/store/scopes/thread.d.ts +20 -0
  153. package/dist/store/scopes/thread.d.ts.map +1 -1
  154. package/dist/subscribable/subscribable.d.ts +2 -1
  155. package/dist/subscribable/subscribable.d.ts.map +1 -1
  156. package/dist/subscribable/subscribable.js +23 -15
  157. package/dist/subscribable/subscribable.js.map +1 -1
  158. package/dist/types/index.d.ts +2 -2
  159. package/dist/types/message.d.ts +8 -1
  160. package/dist/types/message.d.ts.map +1 -1
  161. package/dist/types/message.js.map +1 -1
  162. package/dist/utils/abortable-iterable.d.ts.map +1 -1
  163. package/dist/utils/abortable-iterable.js +30 -14
  164. package/dist/utils/abortable-iterable.js.map +1 -1
  165. package/dist/utils/getGroupStatus.d.ts +18 -2
  166. package/dist/utils/getGroupStatus.d.ts.map +1 -1
  167. package/dist/utils/getGroupStatus.js +32 -7
  168. package/dist/utils/getGroupStatus.js.map +1 -1
  169. package/dist/utils/wire-media.d.ts.map +1 -1
  170. package/dist/utils/wire-media.js +2 -2
  171. package/dist/utils/wire-media.js.map +1 -1
  172. package/package.json +6 -6
  173. package/src/adapters/speech.test.ts +236 -0
  174. package/src/adapters/speech.ts +17 -10
  175. package/src/adapters/thread-history.ts +3 -0
  176. package/src/index.ts +1 -0
  177. package/src/model-context/frame/host.test.ts +113 -1
  178. package/src/model-context/frame/host.ts +39 -12
  179. package/src/model-context/interactable-composer-metadata.test.ts +30 -0
  180. package/src/model-context/interactable-composer-metadata.ts +10 -10
  181. package/src/react/adapters/LocalStorageThreadListAdapter.test.ts +244 -0
  182. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +104 -7
  183. package/src/react/client/DataRenderers.test.tsx +45 -0
  184. package/src/react/client/DataRenderers.ts +13 -9
  185. package/src/react/client/Interactables.test.ts +44 -1
  186. package/src/react/client/Interactables.ts +7 -1
  187. package/src/react/client/RemoteThreadList.test.ts +41 -1
  188. package/src/react/client/RemoteThreadList.ts +15 -2
  189. package/src/react/client/interactable-model-context.test.ts +44 -0
  190. package/src/react/client/interactable-model-context.ts +3 -2
  191. package/src/react/index.ts +5 -1
  192. package/src/react/interactables-legacy/useAssistantInteractable.test.tsx +132 -0
  193. package/src/react/interactables-legacy/useAssistantInteractable.ts +10 -1
  194. package/src/react/model-context/useInteractable.test.tsx +177 -0
  195. package/src/react/model-context/useInteractable.ts +3 -0
  196. package/src/react/primitive-hooks/useActionBarCopy.test.ts +0 -1
  197. package/src/react/primitive-hooks/useSuggestionTrigger.test.ts +0 -1
  198. package/src/react/primitives/message/MessageGroupedParts.test.tsx +96 -0
  199. package/src/react/primitives/message/MessageGroupedParts.tsx +15 -4
  200. package/src/react/primitives/part/PartMessages.test.tsx +104 -1
  201. package/src/react/primitives/part/PartMessages.tsx +1 -0
  202. package/src/react/primitives/thread/ThreadMessages.test.tsx +142 -0
  203. package/src/react/primitives/thread/ThreadMessages.tsx +8 -5
  204. package/src/react/providers/ReadonlyThreadProvider.test.tsx +56 -0
  205. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +7 -1
  206. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.ts +20 -14
  207. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +221 -1
  208. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +166 -512
  209. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.test.ts +77 -0
  210. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts +27 -1
  211. package/src/react/runtimes/cloud/auiV0.ts +160 -25
  212. package/src/react/runtimes/cloud/createCloudThreadListAdapter.test.ts +21 -0
  213. package/src/react/runtimes/cloud/createCloudThreadListAdapter.ts +7 -1
  214. package/src/react/runtimes/cloud/sdkIdentity.ts +9 -0
  215. package/src/react/runtimes/cloud/useCloudThreadListAdapter.test.tsx +18 -4
  216. package/src/react/runtimes/external-message-converter.test.ts +136 -1
  217. package/src/react/runtimes/external-message-converter.ts +39 -93
  218. package/src/react/runtimes/useRemoteThreadListRuntime.ts +1 -1
  219. package/src/react/utils/groupParts.ts +12 -1
  220. package/src/react/utils/useJSONEqual.ts +9 -0
  221. package/src/react/utils/useJSONSchemaDependency.ts +22 -0
  222. package/src/runtime/api/thread-runtime.test.ts +58 -0
  223. package/src/runtime/api/thread-runtime.ts +2 -4
  224. package/src/runtime/base/base-composer-runtime-core.ts +69 -16
  225. package/src/runtime/base/base-thread-runtime-core.test.ts +1008 -1
  226. package/src/runtime/base/base-thread-runtime-core.ts +222 -83
  227. package/src/runtime/interfaces/thread-runtime-core.ts +6 -0
  228. package/src/runtime/queue/message-queue.ts +68 -6
  229. package/src/runtime/utils/auto-status.test.ts +112 -1
  230. package/src/runtime/utils/auto-status.ts +31 -5
  231. package/src/runtime/utils/external-message-conversion.test.ts +134 -0
  232. package/src/runtime/utils/external-message-conversion.ts +122 -31
  233. package/src/runtime/utils/message-repository.test.ts +49 -0
  234. package/src/runtime/utils/message-repository.ts +3 -3
  235. package/src/runtime/utils/thread-message-like.test.ts +52 -0
  236. package/src/runtime/utils/thread-message-like.ts +4 -0
  237. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +31 -1
  238. package/src/runtimes/local/local-thread-runtime-core.test.ts +21 -0
  239. package/src/runtimes/local/local-thread-runtime-core.ts +11 -1
  240. package/src/runtimes/tool-invocations/EDGE_CASES.md +2 -6
  241. package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +133 -0
  242. package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +10 -6
  243. package/src/store/clients/external-thread.ts +19 -1
  244. package/src/store/clients/thread-tasks.test.ts +274 -0
  245. package/src/store/clients/thread-tasks.ts +138 -0
  246. package/src/store/index.ts +8 -0
  247. package/src/store/primitive-predicates.test.ts +48 -5
  248. package/src/store/primitive-predicates.ts +7 -2
  249. package/src/store/runtime-clients/thread-runtime-client.ts +31 -1
  250. package/src/store/scope-registration.ts +2 -0
  251. package/src/store/scopes/task.ts +34 -0
  252. package/src/store/scopes/thread.ts +16 -0
  253. package/src/store/thread-tasks.test.tsx +209 -0
  254. package/src/subscribable/subscribable.test.ts +156 -1
  255. package/src/subscribable/subscribable.ts +25 -15
  256. package/src/tests/MessageRepository.test.ts +1 -5
  257. package/src/tests/auiV0Encode.test.ts +300 -0
  258. package/src/tests/base-composer-runtime-core-send.test.ts +51 -0
  259. package/src/tests/base-composer-runtime-core.test.ts +314 -2
  260. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +151 -0
  261. package/src/tests/external-thread-attachments.test.tsx +69 -0
  262. package/src/tests/external-thread-parity.test.tsx +34 -0
  263. package/src/tests/groupParts.test.ts +71 -0
  264. package/src/tests/message-queue.test.ts +253 -0
  265. package/src/tests/remote-thread-list-reactive-threadId.test.ts +51 -0
  266. package/src/tests/useRemoteThreadListRuntime-controlled.test.tsx +43 -0
  267. package/src/types/index.ts +1 -0
  268. package/src/types/message.ts +8 -0
  269. package/src/utils/abortable-iterable.test.ts +115 -0
  270. package/src/utils/abortable-iterable.ts +34 -23
  271. package/src/utils/getGroupStatus.test.ts +70 -4
  272. package/src/utils/getGroupStatus.ts +35 -12
  273. package/src/utils/wire-media.test.ts +10 -0
  274. package/src/utils/wire-media.ts +6 -2
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantCloudThreadHistoryAdapter.js","names":["RefObject","useEffect","useRef","useState","GenericThreadHistoryAdapter","ThreadHistoryAdapter","MessageFormatAdapter","MessageFormatItem","MessageFormatRepository","ExportedMessageRepositoryItem","AssistantCloud","AssistantCloudEvent","AssistantCloudRunReportToolCall","CloudMessagePersistence","createFormattedPersistence","createRunReport","createRunTelemetryToolCall","deriveRunOutcome","describeRunError","extractRunTelemetryModelId","normalizeRunTelemetryUsage","RunReportOutcome","RunReportStepInit","RunTelemetryUsage","RunTelemetryUsageInit","truncateRunTelemetryText","auiV0Decode","auiV0Encode","AssistantClient","getClientId","useAui","ThreadListItemMethods","FeedbackAdapter","CloudThreadListItem","Pick","globalPersistence","WeakMap","ClientId","AssistantCloudThreadHistoryAdapter","cloudRef","getAui","constructor","aui","getPersistence","threadListItem","key","has","set","current","get","_persistence","resolveEngagementEventIds","threadId","messageId","options","awaitThread","Promise","getThreadListItem","remoteThreadId","getState","remoteId","initialize","then","result","catch","undefined","remoteMessageId","getResolvedRemoteId","thread_id","message_id","feedback","submit","message","type","tryGetKeyedThreadListItem","console","warn","id","cloudMessageId","getRemoteId","threads","messages","error","live","source","listed","threadItems","some","item","currentState","find","withFormat","Record","formatAdapter","TMessage","TStorageFormat","adapter","pinCurrent","next","resolvePinned","getTargetFormatted","pin","append","pinned","Error","update","localMessageId","delete","reportTelemetry","items","durationMs","stepTimestamps","StepTimestamp","encodedRunMessages","map","encode","_reportRunTelemetry","format","extractLastRunMessageInfo","load","parentId","encoded","telemetry","enabled","_maybeReportRun","extractRunMessageInfo","isPersisted","filter","m","reverse","runMessages","T","messageInfo","RunMessageInfo","extracted","extractRunTelemetry","_sendReport","content","extractTelemetry","data","TelemetryData","persistence","mergedSteps","mergeStepTimestamps","steps","initial","status","outcome","outcomeType","errorCode","traceId","modelId","provider","usage","inputTokens","outputTokens","reasoningTokens","cachedInputTokens","toRunReportSteps","totalSteps","toolCalls","firstTokenMs","outputText","metadata","beforeReport","report","runs","TelemetryStepData","input_tokens","output_tokens","reasoning_tokens","cached_input_tokens","tool_calls","start_ms","end_ms","step","startMs","endMs","timestamps","t","len","Math","min","length","s","i","info","getId","isRecord","role","custom","timing","streamStartTime","firstTokenTime","Number","isFinite","round","finishReason","reason","failed","isError","failure","const","value","extractAuiV0","extractAiSdkV6","aggregateAiSdkV6RunSteps","AUI_STATUS_MAP","incomplete","msg","text","toolName","toolCallId","args","argsText","p","textParts","join","totalInput","totalOutput","totalReasoning","totalCachedInput","hasInput","hasOutput","hasReasoning","hasCachedInput","statusType","telemetrySteps","AiSdkV6Part","input","output","AiSdkV6Message","parts","isToolCallPart","startsWith","isDynamicToolPart","partToToolCall","toolSource","slice","collectAiSdkV6Parts","stepsData","currentStepToolCalls","push","tc","buildAiSdkV6Result","hasText","extractAiSdkV6Usage","normalized","hasAny","n","stepMessages","allTextParts","allToolCalls","allStepsData","hasAssistant","useAssistantCloudThreadHistoryAdapter","auiRef","useAssistantCloudEngagementEvents","RootEngagementTracker","count","dispose","rootEngagementTrackers","useRootEngagementEvents","$","_c","t0","t1","tracker","created","_temp","on","scope","event","payload","ids","events","track","kind","_temp2","active","Symbol","for","Map","runStartedAt","runEndedAt","t2","Set","shownSuggestions","t3","t4","_temp3","trackRunStopped","threadId_0","startedAt","max","Date","now","unsubscribers","previousRunEndedAt","props","chars","attachments","suggestion","payload_0","contentType","payload_1","payload_2","payload_3","payload_4","payload_5","payload_6","payload_7","payload_8","payload_9","payload_10","payload_11","unsubscribe","t5","t6","reportSuggestions","mainThreadId","isEmpty","suggestions","thread","add","ids_0","subscribe"],"sources":["../../../../src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts"],"sourcesContent":["import { type RefObject, useEffect, useRef, useState } from \"react\";\nimport type {\n GenericThreadHistoryAdapter,\n ThreadHistoryAdapter,\n MessageFormatAdapter,\n MessageFormatItem,\n MessageFormatRepository,\n} from \"../../../adapters/thread-history\";\nimport type { ExportedMessageRepositoryItem } from \"../../../runtime/utils/message-repository\";\nimport {\n type AssistantCloud,\n type AssistantCloudEvent,\n type AssistantCloudRunReportToolCall,\n CloudMessagePersistence,\n createFormattedPersistence,\n createRunReport,\n createRunTelemetryToolCall,\n deriveRunOutcome,\n describeRunError,\n extractRunTelemetryModelId,\n normalizeRunTelemetryUsage,\n type RunReportOutcome,\n type RunReportStepInit,\n type RunTelemetryUsage,\n type RunTelemetryUsageInit,\n truncateRunTelemetryText,\n} from \"assistant-cloud\";\nimport { auiV0Decode, auiV0Encode } from \"./auiV0\";\nimport { type AssistantClient, getClientId, useAui } from \"@assistant-ui/store\";\nimport type { ThreadListItemMethods } from \"../../../store/scopes/thread-list-item\";\nimport type { FeedbackAdapter } from \"../../../adapters/feedback\";\n\ntype CloudThreadListItem = Pick<\n ThreadListItemMethods,\n \"getState\" | \"initialize\"\n>;\n\nconst globalPersistence = new WeakMap<\n getClientId.ClientId,\n CloudMessagePersistence\n>();\n\nclass AssistantCloudThreadHistoryAdapter implements ThreadHistoryAdapter {\n private cloudRef: RefObject<AssistantCloud>;\n private getAui: () => AssistantClient;\n\n constructor(\n cloudRef: RefObject<AssistantCloud>,\n getAui: () => AssistantClient,\n ) {\n this.cloudRef = cloudRef;\n this.getAui = getAui;\n }\n\n private get aui(): AssistantClient {\n return this.getAui();\n }\n\n private getPersistence(\n threadListItem: CloudThreadListItem = this.aui.threadListItem,\n ): CloudMessagePersistence {\n const key = getClientId(threadListItem);\n if (!globalPersistence.has(key)) {\n globalPersistence.set(\n key,\n new CloudMessagePersistence(() => this.cloudRef.current),\n );\n }\n return globalPersistence.get(key)!;\n }\n\n private get _persistence(): CloudMessagePersistence {\n return this.getPersistence();\n }\n\n /**\n * A send is the moment the runtime creates the remote thread, so that one\n * event waits for the id; every other event reads the id that already\n * exists, because initializing a thread nobody has written to would create\n * an empty remote thread just to attribute an event.\n */\n public async resolveEngagementEventIds(\n threadId: string,\n messageId?: string,\n options?: { awaitThread?: boolean },\n ): Promise<Pick<AssistantCloudEvent, \"thread_id\" | \"message_id\">> {\n const threadListItem = this.getThreadListItem(threadId);\n if (!threadListItem) return {};\n\n let remoteThreadId = threadListItem.getState().remoteId;\n if (!remoteThreadId && options?.awaitThread) {\n remoteThreadId = await threadListItem\n .initialize()\n .then((result) => result.remoteId)\n .catch(() => undefined);\n }\n const remoteMessageId = messageId\n ? this.getPersistence(threadListItem).getResolvedRemoteId(messageId)\n : undefined;\n return {\n ...(remoteThreadId ? { thread_id: remoteThreadId } : undefined),\n ...(remoteMessageId ? { message_id: remoteMessageId } : undefined),\n };\n }\n\n public readonly feedback: FeedbackAdapter = {\n submit: ({ message, type }) => {\n void (async () => {\n const threadListItem = this.tryGetKeyedThreadListItem();\n const remoteThreadId = threadListItem?.getState().remoteId;\n if (!threadListItem || !remoteThreadId) {\n console.warn(\n `[assistant-ui] Skipping feedback for message ${message.id}: the thread has no remote id.`,\n );\n return;\n }\n\n const cloudMessageId = await this.getPersistence(\n threadListItem,\n ).getRemoteId(message.id);\n if (!cloudMessageId) {\n console.warn(\n `[assistant-ui] Skipping feedback for message ${message.id}: no cloud message id is mapped.`,\n );\n return;\n }\n\n await this.cloudRef.current.threads.messages.feedback(\n remoteThreadId,\n cloudMessageId,\n { type },\n );\n })().catch((error: unknown) => {\n console.error(\n \"[assistant-ui] Cloud feedback submission failed:\",\n error,\n );\n });\n },\n };\n\n private tryGetKeyedThreadListItem(): CloudThreadListItem | undefined {\n const live = this.aui.threadListItem;\n if (!live.source) return undefined;\n const id = live.getState().id;\n if (id === undefined) return undefined;\n // A body can resolve before the list's committed items include its\n // thread; the live item is already the per-thread anchor in that window.\n const listed = this.aui.threads\n .getState()\n .threadItems.some((item) => item.id === id || item.remoteId === id);\n return listed ? this.aui.threads.item({ id }) : live;\n }\n\n private getThreadListItem(threadId: string): CloudThreadListItem | undefined {\n const current = this.aui.threadListItem;\n const currentState = current.getState();\n if (currentState.id === threadId || currentState.remoteId === threadId) {\n return current;\n }\n\n const listed = this.aui.threads\n .getState()\n .threadItems.find(\n (item) => item.id === threadId || item.remoteId === threadId,\n );\n return listed ? this.aui.threads.item({ id: listed.id }) : undefined;\n }\n\n withFormat<TMessage, TStorageFormat extends Record<string, unknown>>(\n formatAdapter: MessageFormatAdapter<TMessage, TStorageFormat>,\n ): GenericThreadHistoryAdapter<TMessage> {\n const adapter = this;\n let threadListItem: CloudThreadListItem | undefined;\n const pinCurrent = () => {\n const next = adapter.tryGetKeyedThreadListItem();\n if (next) threadListItem = next;\n return threadListItem;\n };\n const resolvePinned = () => threadListItem ?? pinCurrent();\n const getTargetFormatted = (item: CloudThreadListItem) =>\n createFormattedPersistence(adapter.getPersistence(item), formatAdapter);\n return {\n pin() {\n pinCurrent();\n },\n async append(item: MessageFormatItem<TMessage>) {\n const pinned = resolvePinned();\n if (!pinned) {\n throw new Error(\n \"Cannot persist cloud history without a thread list item.\",\n );\n }\n const remoteId =\n pinned.getState().remoteId ?? (await pinned.initialize()).remoteId;\n await getTargetFormatted(pinned).append(remoteId, item);\n },\n async update(item: MessageFormatItem<TMessage>, localMessageId: string) {\n const pinned = resolvePinned();\n const remoteId = pinned?.getState().remoteId;\n if (!remoteId || !pinned) return;\n await getTargetFormatted(pinned).update?.(\n remoteId,\n item,\n localMessageId,\n );\n },\n async delete() {\n throw new Error(\n \"Assistant Cloud does not support deleting thread messages yet.\",\n );\n },\n reportTelemetry(\n items: MessageFormatItem<TMessage>[],\n options?: {\n durationMs?: number;\n stepTimestamps?: StepTimestamp[];\n },\n ) {\n const encodedRunMessages = items.map((item) =>\n formatAdapter.encode(item),\n );\n adapter._reportRunTelemetry(\n formatAdapter.format,\n encodedRunMessages,\n options,\n resolvePinned(),\n extractLastRunMessageInfo(items, formatAdapter),\n );\n },\n async load(): Promise<MessageFormatRepository<TMessage>> {\n // Loads re-pin and resolve through the pinned item, so the id mapping\n // they populate lives on the same persistence instance later writes\n // resolve, whichever of the list item or the live graft won the pin.\n const pinned = pinCurrent();\n const live = adapter.aui.threadListItem;\n const remoteId = live.source ? live.getState().remoteId : undefined;\n if (!remoteId) return { messages: [] };\n return getTargetFormatted(pinned ?? live).load(remoteId);\n },\n };\n }\n\n async append({ parentId, message }: ExportedMessageRepositoryItem) {\n const { remoteId } = await this.aui.threadListItem.initialize();\n const encoded = auiV0Encode(message);\n await this._persistence.append(\n remoteId,\n message.id,\n parentId,\n \"aui/v0\",\n encoded,\n );\n\n if (this.cloudRef.current.telemetry.enabled) {\n this._maybeReportRun(\n remoteId,\n \"aui/v0\",\n encoded,\n extractRunMessageInfo(message, \"aui/v0\"),\n );\n }\n }\n\n async update(item: ExportedMessageRepositoryItem) {\n if (!this._persistence.isPersisted(item.message.id)) {\n return this.append(item);\n }\n const { message } = item;\n const remoteId = this.aui.threadListItem.getState().remoteId;\n if (!remoteId) return;\n const encoded = auiV0Encode(message);\n await this._persistence.update(remoteId, message.id, \"aui/v0\", encoded);\n\n if (this.cloudRef.current.telemetry.enabled) {\n this._maybeReportRun(\n remoteId,\n \"aui/v0\",\n encoded,\n extractRunMessageInfo(message, \"aui/v0\"),\n );\n }\n }\n\n async delete() {\n throw new Error(\n \"Assistant Cloud does not support deleting thread messages yet.\",\n );\n }\n\n async load() {\n const remoteId = this.aui.threadListItem.getState().remoteId;\n if (!remoteId) return { messages: [] };\n const messages = await this._persistence.load(remoteId, \"aui/v0\");\n return {\n messages: messages\n .filter(\n (m): m is typeof m & { format: \"aui/v0\" } => m.format === \"aui/v0\",\n )\n .map(auiV0Decode)\n .reverse(),\n };\n }\n\n private _reportRunTelemetry<T>(\n format: string,\n runMessages: T[],\n options?: {\n durationMs?: number;\n stepTimestamps?: StepTimestamp[];\n },\n threadListItem?: CloudThreadListItem,\n messageInfo?: RunMessageInfo,\n ) {\n if (!this.cloudRef.current.telemetry.enabled) return;\n\n const item = threadListItem ?? this.aui.threadListItem;\n const remoteId = item.getState().remoteId;\n if (!remoteId) return;\n\n const extracted = extractRunTelemetry(format, runMessages);\n if (!extracted) return;\n\n this._sendReport(\n remoteId,\n extracted,\n options?.durationMs,\n options?.stepTimestamps,\n messageInfo,\n this.getPersistence(item),\n );\n }\n\n private _maybeReportRun<T>(\n remoteId: string,\n format: string,\n content: T,\n messageInfo?: RunMessageInfo,\n ) {\n const extracted = extractTelemetry(format, content);\n if (!extracted) return;\n\n this._sendReport(remoteId, extracted, undefined, undefined, messageInfo);\n }\n\n private _sendReport(\n remoteId: string,\n data: TelemetryData,\n durationMs?: number,\n stepTimestamps?: StepTimestamp[],\n messageInfo?: RunMessageInfo,\n persistence = this._persistence,\n ) {\n const mergedSteps = mergeStepTimestamps(data.steps, stepTimestamps);\n const messageId = messageInfo?.localMessageId\n ? persistence.getResolvedRemoteId(messageInfo.localMessageId)\n : undefined;\n const initial = createRunReport({\n threadId: remoteId,\n status: messageInfo?.status ?? data.status,\n outcome: messageInfo?.outcomeType,\n error: messageInfo?.error,\n errorCode: messageInfo?.errorCode,\n messageId,\n traceId: messageInfo?.traceId,\n modelId: data.modelId,\n provider: messageInfo?.provider,\n usage: {\n inputTokens: data.inputTokens,\n outputTokens: data.outputTokens,\n reasoningTokens: data.reasoningTokens,\n cachedInputTokens: data.cachedInputTokens,\n },\n steps: toRunReportSteps(mergedSteps),\n totalSteps: data.totalSteps,\n toolCalls: data.toolCalls,\n durationMs,\n firstTokenMs: messageInfo?.firstTokenMs,\n outputText: data.outputText,\n metadata: data.metadata,\n telemetry: this.cloudRef.current.telemetry,\n });\n\n const { beforeReport } = this.cloudRef.current.telemetry;\n const report = beforeReport ? beforeReport(initial) : initial;\n if (!report) return;\n\n this.cloudRef.current.runs.report(report).catch(() => {});\n }\n}\n\ntype TelemetryStepData = {\n input_tokens?: number;\n output_tokens?: number;\n reasoning_tokens?: number;\n cached_input_tokens?: number;\n tool_calls?: AssistantCloudRunReportToolCall[];\n start_ms?: number;\n end_ms?: number;\n};\n\ntype StepTimestamp = { start_ms: number; end_ms: number };\n\nfunction toRunReportSteps(\n steps: TelemetryStepData[] | undefined,\n): RunReportStepInit[] | undefined {\n if (!steps) return undefined;\n return steps.map((step) => ({\n usage: {\n inputTokens: step.input_tokens,\n outputTokens: step.output_tokens,\n reasoningTokens: step.reasoning_tokens,\n cachedInputTokens: step.cached_input_tokens,\n },\n toolCalls: step.tool_calls,\n startMs: step.start_ms,\n endMs: step.end_ms,\n }));\n}\n\nfunction mergeStepTimestamps(\n steps: TelemetryStepData[] | undefined,\n timestamps: StepTimestamp[] | undefined,\n): TelemetryStepData[] | undefined {\n if (!timestamps) return steps;\n if (!steps) return timestamps.map((t) => ({ ...t }));\n\n const len = Math.min(steps.length, timestamps.length);\n return steps.map((s, i) => ({\n ...s,\n ...(i < len ? timestamps[i] : undefined),\n }));\n}\n\ntype TelemetryData = {\n status: \"completed\" | \"incomplete\" | \"error\";\n toolCalls?: AssistantCloudRunReportToolCall[];\n totalSteps?: number;\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n outputText?: string;\n metadata?: Record<string, unknown>;\n steps?: TelemetryStepData[];\n modelId?: string;\n};\n\ntype RunMessageInfo = {\n localMessageId?: string;\n status?: \"error\";\n outcomeType?: RunReportOutcome;\n error?: string;\n errorCode?: string;\n firstTokenMs?: number;\n traceId?: string;\n provider?: string;\n};\n\nfunction extractLastRunMessageInfo<\n TMessage,\n TStorageFormat extends Record<string, unknown>,\n>(\n items: MessageFormatItem<TMessage>[],\n formatAdapter: MessageFormatAdapter<TMessage, TStorageFormat>,\n): RunMessageInfo | undefined {\n for (let i = items.length - 1; i >= 0; i--) {\n const item = items[i]!;\n const info = extractRunMessageInfo(\n item.message,\n formatAdapter.format,\n formatAdapter.getId(item.message),\n );\n if (info) return info;\n }\n return undefined;\n}\n\nfunction extractRunMessageInfo(\n message: unknown,\n format: string,\n localMessageId?: string,\n): RunMessageInfo | undefined {\n if (!isRecord(message) || message.role !== \"assistant\") return undefined;\n\n const status = isRecord(message.status) ? message.status : undefined;\n const metadata = isRecord(message.metadata) ? message.metadata : undefined;\n const custom = isRecord(metadata?.custom) ? metadata.custom : undefined;\n const timing = isRecord(metadata?.timing) ? metadata.timing : undefined;\n const streamStartTime = timing?.streamStartTime;\n const firstTokenTime = timing?.firstTokenTime;\n const firstTokenMs =\n typeof streamStartTime === \"number\" &&\n Number.isFinite(streamStartTime) &&\n typeof firstTokenTime === \"number\" &&\n Number.isFinite(firstTokenTime)\n ? Math.round(firstTokenTime - streamStartTime)\n : undefined;\n const finishReason =\n status?.type === \"incomplete\"\n ? status.reason\n : typeof metadata?.finishReason === \"string\"\n ? metadata.finishReason\n : undefined;\n const failed = status?.type === \"incomplete\" && status.reason === \"error\";\n const outcome = deriveRunOutcome({\n finishReason: typeof finishReason === \"string\" ? finishReason : undefined,\n isError: failed,\n });\n const outcomeType = outcome.outcome;\n const failure = failed ? describeRunError(status.error) : {};\n const messageId =\n localMessageId ?? (typeof message.id === \"string\" ? message.id : undefined);\n const traceId =\n format === \"aui/v0\"\n ? custom?.traceId\n : format === \"ai-sdk/v6\"\n ? metadata?.traceId\n : undefined;\n const provider =\n typeof custom?.provider === \"string\"\n ? custom.provider\n : typeof metadata?.provider === \"string\"\n ? metadata.provider\n : undefined;\n\n return {\n ...(messageId ? { localMessageId: messageId } : undefined),\n ...(outcome.status === \"error\" ? { status: \"error\" as const } : undefined),\n ...(outcomeType ? { outcomeType } : undefined),\n ...failure,\n ...(firstTokenMs != null && firstTokenMs >= 0\n ? { firstTokenMs }\n : undefined),\n ...(typeof traceId === \"string\" ? { traceId } : undefined),\n ...(provider !== undefined ? { provider } : undefined),\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\";\n}\n\nfunction extractTelemetry<T>(format: string, content: T): TelemetryData | null {\n switch (format) {\n case \"aui/v0\":\n return extractAuiV0(content);\n case \"ai-sdk/v6\":\n return extractAiSdkV6(content);\n default:\n return null;\n }\n}\n\nfunction extractRunTelemetry<T>(\n format: string,\n runMessages: T[],\n): TelemetryData | null {\n if (format === \"ai-sdk/v6\") {\n return aggregateAiSdkV6RunSteps(runMessages);\n }\n for (let i = runMessages.length - 1; i >= 0; i--) {\n const result = extractTelemetry(format, runMessages[i]!);\n if (result) return result;\n }\n return null;\n}\n\nconst AUI_STATUS_MAP: Record<string, TelemetryData[\"status\"]> = {\n error: \"error\",\n incomplete: \"incomplete\",\n};\n\nexport function extractAuiV0<T>(content: T): TelemetryData | null {\n const msg = content as {\n role?: string;\n status?: { type: string; reason?: string };\n content?: readonly {\n type: string;\n text?: string;\n toolName?: string;\n toolCallId?: string;\n args?: unknown;\n argsText?: string;\n result?: unknown;\n }[];\n metadata?: {\n modelId?: string;\n steps?: readonly { usage?: RunTelemetryUsageInit }[];\n custom?: Record<string, unknown> & { modelId?: string };\n };\n };\n\n if (msg.role !== \"assistant\") return null;\n // A paused (requires-action) write is not a finished run; reporting it would\n // mislabel it \"completed\" and double-count steps once the terminal write reports.\n if (msg.status?.type === \"requires-action\") return null;\n\n const toolCalls = msg.content\n ?.filter((p) => p.type === \"tool-call\" && p.toolName && p.toolCallId)\n .map((p) =>\n createRunTelemetryToolCall({\n toolName: p.toolName!,\n toolCallId: p.toolCallId!,\n args: p.args,\n result: p.result,\n argsText: p.argsText,\n }),\n );\n\n const textParts = msg.content?.filter((p) => p.type === \"text\" && p.text);\n const outputText =\n textParts && textParts.length > 0\n ? truncateRunTelemetryText(textParts.map((p) => p.text).join(\"\"))\n : undefined;\n\n const steps = msg.metadata?.steps;\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let reasoningTokens: number | undefined;\n let cachedInputTokens: number | undefined;\n if (steps && steps.length > 0) {\n let totalInput = 0;\n let totalOutput = 0;\n let totalReasoning = 0;\n let totalCachedInput = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n for (const step of steps) {\n if (!step.usage) continue;\n const usage = normalizeRunTelemetryUsage(step.usage);\n if (!usage) continue;\n if (usage.inputTokens != null) {\n totalInput += usage.inputTokens;\n hasInput = true;\n }\n if (usage.outputTokens != null) {\n totalOutput += usage.outputTokens;\n hasOutput = true;\n }\n if (usage.reasoningTokens != null) {\n totalReasoning += usage.reasoningTokens;\n hasReasoning = true;\n }\n if (usage.cachedInputTokens != null) {\n totalCachedInput += usage.cachedInputTokens;\n hasCachedInput = true;\n }\n }\n inputTokens = hasInput ? totalInput : undefined;\n outputTokens = hasOutput ? totalOutput : undefined;\n reasoningTokens = hasReasoning ? totalReasoning : undefined;\n cachedInputTokens = hasCachedInput ? totalCachedInput : undefined;\n }\n\n const statusType = msg.status?.type;\n const status: TelemetryData[\"status\"] =\n statusType === \"incomplete\" && msg.status?.reason === \"error\"\n ? \"error\"\n : (statusType && AUI_STATUS_MAP[statusType]) || \"completed\";\n\n const metadata = msg.metadata?.custom as Record<string, unknown> | undefined;\n const modelId = extractRunTelemetryModelId(\n msg.metadata as Record<string, unknown> | undefined,\n );\n\n const telemetrySteps: TelemetryStepData[] | undefined =\n steps && steps.length > 1\n ? steps.map((s) => {\n const usage = s.usage\n ? normalizeRunTelemetryUsage(s.usage)\n : undefined;\n return {\n ...(usage?.inputTokens != null\n ? { input_tokens: usage.inputTokens }\n : undefined),\n ...(usage?.outputTokens != null\n ? { output_tokens: usage.outputTokens }\n : undefined),\n ...(usage?.reasoningTokens != null\n ? { reasoning_tokens: usage.reasoningTokens }\n : undefined),\n ...(usage?.cachedInputTokens != null\n ? { cached_input_tokens: usage.cachedInputTokens }\n : undefined),\n };\n })\n : undefined;\n\n return {\n status,\n ...(toolCalls && toolCalls.length > 0 ? { toolCalls } : undefined),\n ...(steps?.length ? { totalSteps: steps.length } : undefined),\n ...(inputTokens != null ? { inputTokens } : undefined),\n ...(outputTokens != null ? { outputTokens } : undefined),\n ...(reasoningTokens != null ? { reasoningTokens } : undefined),\n ...(cachedInputTokens != null ? { cachedInputTokens } : undefined),\n ...(outputText != null ? { outputText } : undefined),\n ...(metadata ? { metadata } : undefined),\n ...(telemetrySteps ? { steps: telemetrySteps } : undefined),\n ...(modelId ? { modelId } : undefined),\n };\n}\n\ntype AiSdkV6Part = {\n type: string;\n text?: string;\n toolName?: string;\n toolCallId?: string;\n args?: unknown;\n result?: unknown;\n input?: unknown;\n output?: unknown;\n};\n\ntype AiSdkV6Message = {\n role?: string;\n parts?: readonly AiSdkV6Part[];\n metadata?: Record<string, unknown>;\n};\n\nfunction isToolCallPart(p: AiSdkV6Part): boolean {\n if (!p.toolCallId) return false;\n if (p.type === \"tool-call\" || p.type === \"dynamic-tool\") return !!p.toolName;\n return p.type.startsWith(\"tool-\") || p.type.startsWith(\"dynamic-tool-\");\n}\n\nfunction isDynamicToolPart(p: AiSdkV6Part): boolean {\n return p.type === \"dynamic-tool\" || p.type.startsWith(\"dynamic-tool-\");\n}\n\nfunction partToToolCall(p: AiSdkV6Part): AssistantCloudRunReportToolCall {\n const toolSource: \"mcp\" | \"frontend\" = isDynamicToolPart(p)\n ? \"mcp\"\n : \"frontend\";\n return createRunTelemetryToolCall({\n toolName: p.toolName ?? p.type.slice(5),\n toolCallId: p.toolCallId!,\n args: p.args ?? p.input,\n result: p.result ?? p.output,\n toolSource,\n });\n}\n\nfunction collectAiSdkV6Parts(parts: readonly AiSdkV6Part[]): {\n textParts: string[];\n toolCalls: AssistantCloudRunReportToolCall[];\n stepsData: { tool_calls: AssistantCloudRunReportToolCall[] }[];\n} {\n const textParts: string[] = [];\n const toolCalls: AssistantCloudRunReportToolCall[] = [];\n const stepsData: { tool_calls: AssistantCloudRunReportToolCall[] }[] = [];\n let currentStepToolCalls: AssistantCloudRunReportToolCall[] | null = null;\n\n for (const p of parts) {\n if (p.type === \"step-start\") {\n if (currentStepToolCalls !== null) {\n stepsData.push({ tool_calls: currentStepToolCalls });\n }\n currentStepToolCalls = [];\n } else if (p.type === \"text\" && p.text) {\n textParts.push(p.text);\n } else if (isToolCallPart(p)) {\n const tc = partToToolCall(p);\n toolCalls.push(tc);\n if (currentStepToolCalls !== null) {\n currentStepToolCalls.push(tc);\n }\n }\n }\n\n if (currentStepToolCalls !== null) {\n stepsData.push({ tool_calls: currentStepToolCalls });\n }\n\n return { textParts, toolCalls, stepsData };\n}\n\nfunction buildAiSdkV6Result(\n textParts: string[],\n toolCalls: AssistantCloudRunReportToolCall[],\n totalSteps: number,\n metadata?: Record<string, unknown>,\n stepsData?: { tool_calls: AssistantCloudRunReportToolCall[] }[],\n usage?: RunTelemetryUsage,\n): TelemetryData {\n const hasText = textParts.length > 0;\n const outputText = hasText\n ? truncateRunTelemetryText(textParts.join(\"\"))\n : undefined;\n const modelId = extractRunTelemetryModelId(metadata);\n\n const steps: TelemetryStepData[] | undefined =\n stepsData && stepsData.length > 1\n ? stepsData.map((s) => ({\n ...(s.tool_calls.length > 0\n ? { tool_calls: s.tool_calls }\n : undefined),\n }))\n : undefined;\n\n return {\n status: hasText ? \"completed\" : \"incomplete\",\n ...(toolCalls.length > 0 ? { toolCalls } : undefined),\n ...(totalSteps > 0 ? { totalSteps } : undefined),\n ...(usage?.inputTokens != null\n ? { inputTokens: usage.inputTokens }\n : undefined),\n ...(usage?.outputTokens != null\n ? { outputTokens: usage.outputTokens }\n : undefined),\n ...(usage?.reasoningTokens != null\n ? { reasoningTokens: usage.reasoningTokens }\n : undefined),\n ...(usage?.cachedInputTokens != null\n ? { cachedInputTokens: usage.cachedInputTokens }\n : undefined),\n ...(outputText != null ? { outputText } : undefined),\n ...(metadata ? { metadata } : undefined),\n ...(steps ? { steps } : undefined),\n ...(modelId ? { modelId } : undefined),\n };\n}\n\nfunction extractAiSdkV6Usage(\n metadata?: Record<string, unknown>,\n): RunTelemetryUsage | undefined {\n // Try top-level metadata.usage\n const usage = metadata?.usage as RunTelemetryUsageInit | undefined;\n if (usage) {\n const normalized = normalizeRunTelemetryUsage(usage);\n if (normalized) return normalized;\n }\n\n // Try aggregating from metadata.steps[].usage\n const steps = metadata?.steps as\n | readonly { usage?: RunTelemetryUsageInit }[]\n | undefined;\n if (steps && steps.length > 0) {\n let inputTokens = 0;\n let outputTokens = 0;\n let reasoningTokens = 0;\n let cachedInputTokens = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n let hasAny = false;\n for (const s of steps) {\n if (!s.usage) continue;\n const n = normalizeRunTelemetryUsage(s.usage);\n if (n) {\n if (n.inputTokens != null) {\n inputTokens += n.inputTokens;\n hasInput = true;\n }\n if (n.outputTokens != null) {\n outputTokens += n.outputTokens;\n hasOutput = true;\n }\n if (n.reasoningTokens != null) {\n reasoningTokens += n.reasoningTokens;\n hasReasoning = true;\n }\n if (n.cachedInputTokens != null) {\n cachedInputTokens += n.cachedInputTokens;\n hasCachedInput = true;\n }\n hasAny = true;\n }\n }\n if (hasAny) {\n return {\n ...(hasInput ? { inputTokens } : undefined),\n ...(hasOutput ? { outputTokens } : undefined),\n ...(hasReasoning ? { reasoningTokens } : undefined),\n ...(hasCachedInput ? { cachedInputTokens } : undefined),\n };\n }\n }\n\n return undefined;\n}\n\nfunction extractAiSdkV6<T>(content: T): TelemetryData | null {\n const msg = content as AiSdkV6Message;\n if (msg.role !== \"assistant\") return null;\n\n const { textParts, toolCalls, stepsData } = collectAiSdkV6Parts(\n msg.parts ?? [],\n );\n return buildAiSdkV6Result(\n textParts,\n toolCalls,\n stepsData.length,\n msg.metadata,\n stepsData,\n extractAiSdkV6Usage(msg.metadata),\n );\n}\n\nfunction aggregateAiSdkV6RunSteps<T>(stepMessages: T[]): TelemetryData | null {\n const allTextParts: string[] = [];\n const allToolCalls: AssistantCloudRunReportToolCall[] = [];\n const allStepsData: { tool_calls: AssistantCloudRunReportToolCall[] }[] = [];\n let hasAssistant = false;\n let metadata: Record<string, unknown> | undefined;\n let inputTokens = 0;\n let outputTokens = 0;\n let reasoningTokens = 0;\n let cachedInputTokens = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n\n for (const content of stepMessages) {\n const msg = content as AiSdkV6Message;\n if (msg.role !== \"assistant\") continue;\n hasAssistant = true;\n\n const { textParts, toolCalls, stepsData } = collectAiSdkV6Parts(\n msg.parts ?? [],\n );\n allTextParts.push(...textParts);\n allToolCalls.push(...toolCalls);\n allStepsData.push(...stepsData);\n if (msg.metadata) metadata = msg.metadata;\n\n const usage = extractAiSdkV6Usage(msg.metadata);\n if (usage) {\n if (usage.inputTokens != null) {\n inputTokens += usage.inputTokens;\n hasInput = true;\n }\n if (usage.outputTokens != null) {\n outputTokens += usage.outputTokens;\n hasOutput = true;\n }\n if (usage.reasoningTokens != null) {\n reasoningTokens += usage.reasoningTokens;\n hasReasoning = true;\n }\n if (usage.cachedInputTokens != null) {\n cachedInputTokens += usage.cachedInputTokens;\n hasCachedInput = true;\n }\n }\n }\n\n if (!hasAssistant) return null;\n return buildAiSdkV6Result(\n allTextParts,\n allToolCalls,\n allStepsData.length,\n metadata,\n allStepsData,\n {\n ...(hasInput ? { inputTokens } : undefined),\n ...(hasOutput ? { outputTokens } : undefined),\n ...(hasReasoning ? { reasoningTokens } : undefined),\n ...(hasCachedInput ? { cachedInputTokens } : undefined),\n },\n );\n}\n\nexport function useAssistantCloudThreadHistoryAdapter(\n cloudRef: RefObject<AssistantCloud>,\n): ThreadHistoryAdapter & { readonly feedback: FeedbackAdapter } {\n const aui = useAui();\n // Not useEffectEvent: history adapter methods run during render (SSR load).\n const auiRef = useRef(aui);\n useEffect(() => {\n auiRef.current = aui;\n });\n const [adapter] = useState(\n () =>\n new AssistantCloudThreadHistoryAdapter(cloudRef, () => auiRef.current),\n );\n useAssistantCloudEngagementEvents(cloudRef, adapter, aui);\n return adapter;\n}\n\ntype RootEngagementTracker = {\n count: number;\n adapter: AssistantCloudThreadHistoryAdapter;\n cloudRef: RefObject<AssistantCloud>;\n dispose: () => void;\n};\n\nconst rootEngagementTrackers = new WeakMap<\n AssistantClient,\n RootEngagementTracker\n>();\n\n/**\n * Thread switches are a thread list event, so one subscription per assistant\n * client reports them; every thread runtime mounted under it shares the\n * subscription and the last one to unmount removes it.\n */\nconst useRootEngagementEvents = (\n cloudRef: RefObject<AssistantCloud>,\n adapter: AssistantCloudThreadHistoryAdapter,\n aui: AssistantClient,\n) => {\n useEffect(() => {\n let tracker = rootEngagementTrackers.get(aui);\n if (!tracker) {\n const created: RootEngagementTracker = {\n count: 0,\n adapter,\n cloudRef,\n dispose: () => {},\n };\n created.dispose = aui.on(\n { scope: \"*\", event: \"threads.selectionChanged\" },\n (payload) => {\n void created.adapter\n .resolveEngagementEventIds(payload.threadId)\n .then((ids) => {\n if (!ids.thread_id) return;\n created.cloudRef.current.events?.track({\n kind: \"thread_switched\",\n ...ids,\n });\n })\n .catch(() => {});\n },\n );\n rootEngagementTrackers.set(aui, created);\n tracker = created;\n }\n const active = tracker;\n active.adapter = adapter;\n active.cloudRef = cloudRef;\n active.count += 1;\n return () => {\n active.count -= 1;\n if (active.count === 0) {\n active.dispose();\n rootEngagementTrackers.delete(aui);\n }\n };\n }, [adapter, aui, cloudRef]);\n};\n\nconst useAssistantCloudEngagementEvents = (\n cloudRef: RefObject<AssistantCloud>,\n adapter: AssistantCloudThreadHistoryAdapter,\n aui: AssistantClient,\n) => {\n useRootEngagementEvents(cloudRef, adapter, aui);\n const runStartedAt = useRef(new Map<string, number>());\n const runEndedAt = useRef(new Map<string, number>());\n const shownSuggestions = useRef(new Set<string>());\n\n useEffect(() => {\n const track = (\n event: AssistantCloudEvent,\n threadId: string,\n messageId?: string,\n options?: { awaitThread?: boolean },\n ) => {\n void adapter\n .resolveEngagementEventIds(threadId, messageId, options)\n .then((ids) => {\n cloudRef.current.events?.track({ ...event, ...ids });\n })\n .catch(() => {});\n };\n const trackRunStopped = (threadId: string) => {\n const startedAt = runStartedAt.current.get(threadId);\n if (startedAt === undefined) return;\n runStartedAt.current.delete(threadId);\n track(\n { kind: \"run_stopped\", value: Math.max(0, Date.now() - startedAt) },\n threadId,\n );\n };\n\n const unsubscribers = [\n aui.on({ scope: \"thread\", event: \"composer.send\" }, (payload) => {\n const previousRunEndedAt = runEndedAt.current.get(payload.threadId);\n track(\n {\n kind: payload.messageId ? \"message_edited\" : \"message_sent\",\n ...(payload.messageId\n ? { props: { chars: payload.chars } }\n : {\n props: {\n chars: payload.chars,\n attachments: payload.attachments,\n },\n }),\n ...(!payload.messageId && previousRunEndedAt !== undefined\n ? { value: Math.max(0, Date.now() - previousRunEndedAt) }\n : undefined),\n },\n payload.threadId,\n payload.messageId,\n { awaitThread: !payload.messageId },\n );\n if (payload.suggestion) {\n track({ kind: \"suggestion_clicked\" }, payload.threadId);\n }\n }),\n aui.on(\n { scope: \"thread\", event: \"composer.attachmentAdd\" },\n (payload) => {\n track(\n {\n kind: \"attachment_added\",\n ...(payload.contentType\n ? { props: { type: payload.contentType } }\n : undefined),\n },\n payload.threadId,\n payload.messageId,\n );\n },\n ),\n aui.on(\n { scope: \"thread\", event: \"composer.attachmentAddError\" },\n (payload) => {\n track(\n {\n kind: \"attachment_failed\",\n ...(payload.contentType\n ? { props: { type: payload.contentType } }\n : undefined),\n },\n payload.threadId,\n payload.messageId,\n );\n },\n ),\n aui.on({ scope: \"thread\", event: \"composer.cancel\" }, (payload) => {\n trackRunStopped(payload.threadId);\n }),\n aui.on({ scope: \"thread\", event: \"thread.runStart\" }, (payload) => {\n runStartedAt.current.set(payload.threadId, Date.now());\n }),\n aui.on({ scope: \"thread\", event: \"thread.runEnd\" }, (payload) => {\n runStartedAt.current.delete(payload.threadId);\n runEndedAt.current.set(payload.threadId, Date.now());\n }),\n aui.on({ scope: \"thread\", event: \"thread.cancelRun\" }, (payload) => {\n trackRunStopped(payload.threadId);\n }),\n aui.on({ scope: \"thread\", event: \"thread.voiceStarted\" }, (payload) => {\n track({ kind: \"voice_started\" }, payload.threadId);\n }),\n aui.on({ scope: \"thread\", event: \"message.reload\" }, (payload) => {\n track(\n { kind: \"message_regenerated\" },\n payload.threadId,\n payload.messageId,\n );\n }),\n aui.on(\n { scope: \"thread\", event: \"message.branchSwitched\" },\n (payload) => {\n track(\n { kind: \"branch_switched\" },\n payload.threadId,\n payload.messageId,\n );\n },\n ),\n aui.on({ scope: \"thread\", event: \"message.copied\" }, (payload) => {\n track({ kind: \"message_copied\" }, payload.threadId, payload.messageId);\n }),\n aui.on({ scope: \"thread\", event: \"message.speak\" }, (payload) => {\n track({ kind: \"speech_started\" }, payload.threadId, payload.messageId);\n }),\n aui.on({ scope: \"thread\", event: \"message.error\" }, (payload) => {\n track(\n { kind: \"error_shown\", props: { reason: payload.reason } },\n payload.threadId,\n payload.messageId,\n );\n }),\n ];\n\n return () => {\n for (const unsubscribe of unsubscribers) unsubscribe();\n };\n }, [adapter, aui, cloudRef]);\n\n useEffect(() => {\n const reportSuggestions = () => {\n const { mainThreadId } = aui.threads.getState();\n if (aui.threadListItem.getState().id !== mainThreadId) return;\n const { isEmpty, suggestions } = aui.thread.getState();\n if (\n !isEmpty ||\n suggestions.length === 0 ||\n shownSuggestions.current.has(mainThreadId)\n ) {\n return;\n }\n shownSuggestions.current.add(mainThreadId);\n void adapter.resolveEngagementEventIds(mainThreadId).then((ids) => {\n cloudRef.current.events?.track({\n kind: \"suggestions_shown\",\n value: suggestions.length,\n ...ids,\n });\n });\n };\n\n reportSuggestions();\n return aui.subscribe(reportSuggestions);\n }, [adapter, aui, cloudRef]);\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"AssistantCloudThreadHistoryAdapter.js","names":["RefObject","useEffect","useRef","useState","GenericThreadHistoryAdapter","ThreadHistoryAdapter","MessageFormatAdapter","MessageFormatItem","MessageFormatRepository","ExportedMessageRepositoryItem","ThreadMessage","AssistantCloud","AssistantCloudEvent","CloudEngagementReporter","CloudMessagePersistence","CloudRunReporter","createFormattedPersistence","createRunTelemetryToolCall","deriveRunOutcome","describeRunError","extractRunTelemetryModelId","normalizeRunTelemetryUsage","RunMessageTelemetry","RunReportOutcome","RunReportStepInit","RunTelemetryUsageInit","truncateRunTelemetryText","extractAISDKRunTelemetry","AISDKMessageLike","auiV0Decode","auiV0Encode","AssistantClient","getClientId","useAui","ThreadListItemMethods","FeedbackAdapter","CloudThreadListItem","Pick","globalPersistence","WeakMap","ClientId","AssistantCloudThreadHistoryAdapter","cloudRef","getAui","runReporter","engagementReporter","constructor","current","threadId","messageId","options","resolveEngagementEventIds","aui","getPersistence","threadListItem","key","has","set","get","_persistence","awaitThread","Promise","getThreadListItem","remoteThreadId","getState","remoteId","initialize","then","result","catch","undefined","remoteMessageId","getResolvedRemoteId","thread_id","message_id","feedback","submit","message","type","tryGetKeyedThreadListItem","console","warn","id","cloudMessageId","getRemoteId","threads","messages","error","live","source","listed","threadItems","some","item","currentState","find","withFormat","Record","formatAdapter","TMessage","TStorageFormat","adapter","pinCurrent","next","resolvePinned","getTargetFormatted","pin","append","pinned","Error","update","localMessageId","delete","reportTelemetry","items","durationMs","stepTimestamps","StepTimestamp","encodedRunMessages","map","encode","_reportRunTelemetry","format","mergeRunMessageInfo","extractLastRunMessageInfo","extractRunMessageInfo","load","parentId","encoded","telemetry","enabled","_maybeReportRun","isPersisted","filter","m","reverse","runMessages","T","messageInfo","RunMessageInfo","extracted","extractRunTelemetry","status","const","_sendReport","content","extractTelemetry","data","persistence","mergedSteps","mergeStepTimestamps","steps","report","outcome","outcomeType","errorCode","traceId","modelId","provider","usage","totalSteps","toolCalls","firstTokenMs","outputText","metadata","start_ms","end_ms","timestamps","startMs","endMs","len","Math","min","length","step","index","i","info","getId","stored","observed","_observedId","isRecord","role","custom","timing","firstTokenTime","Number","isFinite","round","finishReason","reason","failed","isError","runStatus","failure","value","extractAuiV0","msg","text","toolName","toolCallId","args","argsText","p","textParts","join","inputTokens","outputTokens","reasoningTokens","cachedInputTokens","totalInput","totalOutput","totalReasoning","totalCachedInput","hasInput","hasOutput","hasReasoning","hasCachedInput","telemetrySteps","useAssistantCloudThreadHistoryAdapter","auiRef","useAssistantCloudEngagementEvents","RootEngagementTracker","count","dispose","rootEngagementTrackers","useRootEngagementEvents","$","_c","t0","tracker","created","_temp","on","scope","event","payload","threadSwitched","active","t1","reporter","unsubscribers","messageEdited","chars","messageSent","attachments","suggestion","suggestionClicked","payload_0","attachmentAdded","contentType","payload_1","attachmentFailed","payload_2","runStopped","payload_3","runStarted","payload_4","runEnded","payload_5","payload_6","voiceStarted","payload_7","messageRegenerated","payload_8","branchSwitched","payload_9","messageCopied","payload_10","approved","toolApproved","toolRejected","payload_11","speechStarted","payload_12","errorShown","unsubscribe","t2","reportSuggestions","mainThreadId","isEmpty","suggestions","thread","suggestionsShown","subscribe","t3"],"sources":["../../../../src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts"],"sourcesContent":["import { type RefObject, useEffect, useRef, useState } from \"react\";\nimport type {\n GenericThreadHistoryAdapter,\n ThreadHistoryAdapter,\n MessageFormatAdapter,\n MessageFormatItem,\n MessageFormatRepository,\n} from \"../../../adapters/thread-history\";\nimport type { ExportedMessageRepositoryItem } from \"../../../runtime/utils/message-repository\";\nimport type { ThreadMessage } from \"../../../types\";\nimport {\n type AssistantCloud,\n type AssistantCloudEvent,\n CloudEngagementReporter,\n CloudMessagePersistence,\n CloudRunReporter,\n createFormattedPersistence,\n createRunTelemetryToolCall,\n deriveRunOutcome,\n describeRunError,\n extractRunTelemetryModelId,\n normalizeRunTelemetryUsage,\n type RunMessageTelemetry,\n type RunReportOutcome,\n type RunReportStepInit,\n type RunTelemetryUsageInit,\n truncateRunTelemetryText,\n} from \"assistant-cloud\";\nimport {\n extractAISDKRunTelemetry,\n type AISDKMessageLike,\n} from \"assistant-cloud/ai-sdk\";\nimport { auiV0Decode, auiV0Encode } from \"./auiV0\";\nimport { type AssistantClient, getClientId, useAui } from \"@assistant-ui/store\";\nimport type { ThreadListItemMethods } from \"../../../store/scopes/thread-list-item\";\nimport type { FeedbackAdapter } from \"../../../adapters/feedback\";\n\ntype CloudThreadListItem = Pick<\n ThreadListItemMethods,\n \"getState\" | \"initialize\"\n>;\n\nconst globalPersistence = new WeakMap<\n getClientId.ClientId,\n CloudMessagePersistence\n>();\n\nclass AssistantCloudThreadHistoryAdapter implements ThreadHistoryAdapter {\n private cloudRef: RefObject<AssistantCloud>;\n private getAui: () => AssistantClient;\n private runReporter: CloudRunReporter;\n public readonly engagementReporter: CloudEngagementReporter;\n\n constructor(\n cloudRef: RefObject<AssistantCloud>,\n getAui: () => AssistantClient,\n ) {\n this.cloudRef = cloudRef;\n this.getAui = getAui;\n this.runReporter = new CloudRunReporter(() => this.cloudRef.current);\n this.engagementReporter = new CloudEngagementReporter(\n () => this.cloudRef.current,\n (threadId, messageId, options) =>\n this.resolveEngagementEventIds(threadId, messageId, options),\n );\n }\n\n private get aui(): AssistantClient {\n return this.getAui();\n }\n\n private getPersistence(\n threadListItem: CloudThreadListItem = this.aui.threadListItem,\n ): CloudMessagePersistence {\n const key = getClientId(threadListItem);\n if (!globalPersistence.has(key)) {\n globalPersistence.set(\n key,\n new CloudMessagePersistence(() => this.cloudRef.current),\n );\n }\n return globalPersistence.get(key)!;\n }\n\n private get _persistence(): CloudMessagePersistence {\n return this.getPersistence();\n }\n\n /**\n * A send is the moment the runtime creates the remote thread, so that one\n * event waits for the id; every other event reads the id that already\n * exists, because initializing a thread nobody has written to would create\n * an empty remote thread just to attribute an event.\n */\n public async resolveEngagementEventIds(\n threadId: string,\n messageId?: string,\n options?: { awaitThread?: boolean },\n ): Promise<Pick<AssistantCloudEvent, \"thread_id\" | \"message_id\">> {\n const threadListItem = this.getThreadListItem(threadId);\n if (!threadListItem) return {};\n\n let remoteThreadId = threadListItem.getState().remoteId;\n if (!remoteThreadId && options?.awaitThread) {\n remoteThreadId = await threadListItem\n .initialize()\n .then((result) => result.remoteId)\n .catch(() => undefined);\n }\n const remoteMessageId = messageId\n ? this.getPersistence(threadListItem).getResolvedRemoteId(messageId)\n : undefined;\n return {\n ...(remoteThreadId ? { thread_id: remoteThreadId } : undefined),\n ...(remoteMessageId ? { message_id: remoteMessageId } : undefined),\n };\n }\n\n public readonly feedback: FeedbackAdapter = {\n submit: ({ message, type }) => {\n void (async () => {\n const threadListItem = this.tryGetKeyedThreadListItem();\n const remoteThreadId = threadListItem?.getState().remoteId;\n if (!threadListItem || !remoteThreadId) {\n console.warn(\n `[assistant-ui] Skipping feedback for message ${message.id}: the thread has no remote id.`,\n );\n return;\n }\n\n const cloudMessageId = await this.getPersistence(\n threadListItem,\n ).getRemoteId(message.id);\n if (!cloudMessageId) {\n console.warn(\n `[assistant-ui] Skipping feedback for message ${message.id}: no cloud message id is mapped.`,\n );\n return;\n }\n\n await this.cloudRef.current.threads.messages.feedback(\n remoteThreadId,\n cloudMessageId,\n { type },\n );\n })().catch((error: unknown) => {\n console.error(\n \"[assistant-ui] Cloud feedback submission failed:\",\n error,\n );\n });\n },\n };\n\n private tryGetKeyedThreadListItem(): CloudThreadListItem | undefined {\n const live = this.aui.threadListItem;\n if (!live.source) return undefined;\n const id = live.getState().id;\n if (id === undefined) return undefined;\n // A body can resolve before the list's committed items include its\n // thread; the live item is already the per-thread anchor in that window.\n const listed = this.aui.threads\n .getState()\n .threadItems.some((item) => item.id === id || item.remoteId === id);\n return listed ? this.aui.threads.item({ id }) : live;\n }\n\n private getThreadListItem(threadId: string): CloudThreadListItem | undefined {\n const current = this.aui.threadListItem;\n const currentState = current.getState();\n if (currentState.id === threadId || currentState.remoteId === threadId) {\n return current;\n }\n\n const listed = this.aui.threads\n .getState()\n .threadItems.find(\n (item) => item.id === threadId || item.remoteId === threadId,\n );\n return listed ? this.aui.threads.item({ id: listed.id }) : undefined;\n }\n\n withFormat<TMessage, TStorageFormat extends Record<string, unknown>>(\n formatAdapter: MessageFormatAdapter<TMessage, TStorageFormat>,\n ): GenericThreadHistoryAdapter<TMessage> {\n const adapter = this;\n let threadListItem: CloudThreadListItem | undefined;\n const pinCurrent = () => {\n const next = adapter.tryGetKeyedThreadListItem();\n if (next) threadListItem = next;\n return threadListItem;\n };\n const resolvePinned = () => threadListItem ?? pinCurrent();\n const getTargetFormatted = (item: CloudThreadListItem) =>\n createFormattedPersistence(adapter.getPersistence(item), formatAdapter);\n return {\n pin() {\n pinCurrent();\n },\n async append(item: MessageFormatItem<TMessage>) {\n const pinned = resolvePinned();\n if (!pinned) {\n throw new Error(\n \"Cannot persist cloud history without a thread list item.\",\n );\n }\n const remoteId =\n pinned.getState().remoteId ?? (await pinned.initialize()).remoteId;\n await getTargetFormatted(pinned).append(remoteId, item);\n },\n async update(item: MessageFormatItem<TMessage>, localMessageId: string) {\n const pinned = resolvePinned();\n const remoteId = pinned?.getState().remoteId;\n if (!remoteId || !pinned) return;\n await getTargetFormatted(pinned).update?.(\n remoteId,\n item,\n localMessageId,\n );\n },\n async delete() {\n throw new Error(\n \"Assistant Cloud does not support deleting thread messages yet.\",\n );\n },\n reportTelemetry(\n items: MessageFormatItem<TMessage>[],\n options?: {\n durationMs?: number;\n stepTimestamps?: StepTimestamp[];\n message?: ThreadMessage;\n },\n ) {\n const encodedRunMessages = items.map((item) =>\n formatAdapter.encode(item),\n );\n adapter._reportRunTelemetry(\n formatAdapter.format,\n encodedRunMessages,\n options,\n resolvePinned(),\n mergeRunMessageInfo(\n extractLastRunMessageInfo(items, formatAdapter),\n options?.message\n ? extractRunMessageInfo(options.message, \"aui/v0\")\n : undefined,\n ),\n );\n },\n async load(): Promise<MessageFormatRepository<TMessage>> {\n // Loads re-pin and resolve through the pinned item, so the id mapping\n // they populate lives on the same persistence instance later writes\n // resolve, whichever of the list item or the live graft won the pin.\n const pinned = pinCurrent();\n const live = adapter.aui.threadListItem;\n const remoteId = live.source ? live.getState().remoteId : undefined;\n if (!remoteId) return { messages: [] };\n return getTargetFormatted(pinned ?? live).load(remoteId);\n },\n };\n }\n\n async append({ parentId, message }: ExportedMessageRepositoryItem) {\n const { remoteId } = await this.aui.threadListItem.initialize();\n const encoded = auiV0Encode(message);\n await this._persistence.append(\n remoteId,\n message.id,\n parentId,\n \"aui/v0\",\n encoded,\n );\n\n if (this.cloudRef.current.telemetry.enabled) {\n this._maybeReportRun(\n remoteId,\n \"aui/v0\",\n encoded,\n extractRunMessageInfo(message, \"aui/v0\"),\n );\n }\n }\n\n async update(item: ExportedMessageRepositoryItem) {\n if (!this._persistence.isPersisted(item.message.id)) {\n return this.append(item);\n }\n const { message } = item;\n const remoteId = this.aui.threadListItem.getState().remoteId;\n if (!remoteId) return;\n const encoded = auiV0Encode(message);\n await this._persistence.update(remoteId, message.id, \"aui/v0\", encoded);\n\n if (this.cloudRef.current.telemetry.enabled) {\n this._maybeReportRun(\n remoteId,\n \"aui/v0\",\n encoded,\n extractRunMessageInfo(message, \"aui/v0\"),\n );\n }\n }\n\n async delete() {\n throw new Error(\n \"Assistant Cloud does not support deleting thread messages yet.\",\n );\n }\n\n async load() {\n const remoteId = this.aui.threadListItem.getState().remoteId;\n if (!remoteId) return { messages: [] };\n const messages = await this._persistence.load(remoteId, \"aui/v0\");\n return {\n messages: messages\n .filter(\n (m): m is typeof m & { format: \"aui/v0\" } => m.format === \"aui/v0\",\n )\n .map(auiV0Decode)\n .reverse(),\n };\n }\n\n private _reportRunTelemetry<T>(\n format: string,\n runMessages: T[],\n options?: {\n durationMs?: number;\n stepTimestamps?: StepTimestamp[];\n },\n threadListItem?: CloudThreadListItem,\n messageInfo?: RunMessageInfo,\n ) {\n const item = threadListItem ?? this.aui.threadListItem;\n const remoteId = item.getState().remoteId;\n if (!remoteId) return;\n\n const extracted =\n extractRunTelemetry(format, runMessages) ??\n (messageInfo?.status !== undefined\n ? { status: \"incomplete\" as const }\n : undefined);\n if (!extracted) return;\n\n this._sendReport(\n remoteId,\n extracted,\n options?.durationMs,\n options?.stepTimestamps,\n messageInfo,\n this.getPersistence(item),\n );\n }\n\n private _maybeReportRun<T>(\n remoteId: string,\n format: string,\n content: T,\n messageInfo?: RunMessageInfo,\n ) {\n const extracted = extractTelemetry(format, content);\n if (!extracted) return;\n\n this._sendReport(remoteId, extracted, undefined, undefined, messageInfo);\n }\n\n private _sendReport(\n remoteId: string,\n data: RunMessageTelemetry,\n durationMs?: number,\n stepTimestamps?: StepTimestamp[],\n messageInfo?: RunMessageInfo,\n persistence = this._persistence,\n ) {\n const mergedSteps = mergeStepTimestamps(data.steps, stepTimestamps);\n const messageId = messageInfo?.localMessageId\n ? persistence.getResolvedRemoteId(messageInfo.localMessageId)\n : undefined;\n void this.runReporter.report({\n threadId: remoteId,\n status: messageInfo?.status ?? data.status,\n outcome: messageInfo?.outcomeType,\n error: messageInfo?.error,\n errorCode: messageInfo?.errorCode,\n messageId,\n traceId: messageInfo?.traceId,\n modelId: data.modelId,\n provider: messageInfo?.provider,\n usage: data.usage,\n steps: mergedSteps,\n totalSteps: data.totalSteps,\n toolCalls: data.toolCalls,\n durationMs,\n firstTokenMs: messageInfo?.firstTokenMs,\n outputText: data.outputText,\n metadata: data.metadata,\n });\n }\n}\n\ntype StepTimestamp = { start_ms: number; end_ms: number };\n\nfunction mergeStepTimestamps(\n steps: RunReportStepInit[] | undefined,\n timestamps: StepTimestamp[] | undefined,\n): RunReportStepInit[] | undefined {\n if (!timestamps) return steps;\n if (!steps) {\n return timestamps.map(({ start_ms, end_ms }) => ({\n startMs: start_ms,\n endMs: end_ms,\n }));\n }\n\n const len = Math.min(steps.length, timestamps.length);\n return steps.map((step, index) => ({\n ...step,\n ...(index < len\n ? {\n startMs: timestamps[index]!.start_ms,\n endMs: timestamps[index]!.end_ms,\n }\n : undefined),\n }));\n}\n\ntype RunMessageInfo = {\n localMessageId?: string;\n status?: \"completed\" | \"incomplete\" | \"error\";\n outcomeType?: RunReportOutcome;\n error?: string;\n errorCode?: string;\n firstTokenMs?: number;\n traceId?: string;\n provider?: string;\n};\n\nfunction extractLastRunMessageInfo<\n TMessage,\n TStorageFormat extends Record<string, unknown>,\n>(\n items: MessageFormatItem<TMessage>[],\n formatAdapter: MessageFormatAdapter<TMessage, TStorageFormat>,\n): RunMessageInfo | undefined {\n for (let i = items.length - 1; i >= 0; i--) {\n const item = items[i]!;\n const info = extractRunMessageInfo(\n item.message,\n formatAdapter.format,\n formatAdapter.getId(item.message),\n );\n if (info) return info;\n }\n return undefined;\n}\n\nfunction mergeRunMessageInfo(\n stored: RunMessageInfo | undefined,\n observed: RunMessageInfo | undefined,\n): RunMessageInfo | undefined {\n if (!observed) return stored;\n const { localMessageId: _observedId, ...outcome } = observed;\n return { ...stored, ...outcome };\n}\n\nfunction extractRunMessageInfo(\n message: unknown,\n format: string,\n localMessageId?: string,\n): RunMessageInfo | undefined {\n if (!isRecord(message) || message.role !== \"assistant\") return undefined;\n\n const status = isRecord(message.status) ? message.status : undefined;\n const metadata = isRecord(message.metadata) ? message.metadata : undefined;\n const custom = isRecord(metadata?.custom) ? metadata.custom : undefined;\n const timing = isRecord(metadata?.timing) ? metadata.timing : undefined;\n const firstTokenTime = timing?.firstTokenTime;\n const firstTokenMs =\n typeof firstTokenTime === \"number\" && Number.isFinite(firstTokenTime)\n ? Math.round(firstTokenTime)\n : undefined;\n const finishReason =\n status?.type === \"incomplete\"\n ? typeof status.reason === \"string\"\n ? status.reason\n : undefined\n : typeof metadata?.finishReason === \"string\"\n ? metadata.finishReason\n : undefined;\n const failed = status?.type === \"incomplete\" && status.reason === \"error\";\n const outcome = deriveRunOutcome({ finishReason, isError: failed });\n const outcomeType = outcome.outcome;\n const runStatus =\n outcome.status === \"error\"\n ? \"error\"\n : status?.type === \"incomplete\"\n ? \"incomplete\"\n : finishReason !== undefined\n ? outcome.status\n : undefined;\n const failure = failed ? describeRunError(status.error) : {};\n const messageId =\n localMessageId ?? (typeof message.id === \"string\" ? message.id : undefined);\n const traceId =\n format === \"aui/v0\"\n ? custom?.traceId\n : format === \"ai-sdk/v6\"\n ? metadata?.traceId\n : undefined;\n const provider =\n typeof custom?.provider === \"string\"\n ? custom.provider\n : typeof metadata?.provider === \"string\"\n ? metadata.provider\n : undefined;\n\n return {\n ...(messageId ? { localMessageId: messageId } : undefined),\n ...(runStatus !== undefined ? { status: runStatus } : undefined),\n ...(outcomeType ? { outcomeType } : undefined),\n ...failure,\n ...(firstTokenMs != null && firstTokenMs >= 0\n ? { firstTokenMs }\n : undefined),\n ...(typeof traceId === \"string\" ? { traceId } : undefined),\n ...(provider !== undefined ? { provider } : undefined),\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\";\n}\n\nfunction extractTelemetry<T>(\n format: string,\n content: T,\n): RunMessageTelemetry | null {\n switch (format) {\n case \"aui/v0\":\n return extractAuiV0(content);\n case \"ai-sdk/v6\":\n return extractAISDKRunTelemetry([content as AISDKMessageLike]);\n default:\n return null;\n }\n}\n\nfunction extractRunTelemetry<T>(\n format: string,\n runMessages: T[],\n): RunMessageTelemetry | null {\n if (format === \"ai-sdk/v6\") {\n return extractAISDKRunTelemetry(runMessages as AISDKMessageLike[]);\n }\n for (let i = runMessages.length - 1; i >= 0; i--) {\n const result = extractTelemetry(format, runMessages[i]!);\n if (result) return result;\n }\n return null;\n}\n\nexport function extractAuiV0<T>(content: T): RunMessageTelemetry | null {\n const msg = content as {\n role?: string;\n status?: { type: string; reason?: string };\n content?: readonly {\n type: string;\n text?: string;\n toolName?: string;\n toolCallId?: string;\n args?: unknown;\n argsText?: string;\n result?: unknown;\n }[];\n metadata?: {\n modelId?: string;\n steps?: readonly { usage?: RunTelemetryUsageInit }[];\n custom?: Record<string, unknown> & { modelId?: string };\n };\n };\n\n if (msg.role !== \"assistant\") return null;\n // A paused (requires-action) write is not a finished run; reporting it would\n // mislabel it \"completed\" and double-count steps once the terminal write reports.\n if (msg.status?.type === \"requires-action\") return null;\n\n const toolCalls = msg.content\n ?.filter((p) => p.type === \"tool-call\" && p.toolName && p.toolCallId)\n .map((p) =>\n createRunTelemetryToolCall({\n toolName: p.toolName!,\n toolCallId: p.toolCallId!,\n args: p.args,\n result: p.result,\n argsText: p.argsText,\n }),\n );\n\n const textParts = msg.content?.filter((p) => p.type === \"text\" && p.text);\n const outputText =\n textParts && textParts.length > 0\n ? truncateRunTelemetryText(textParts.map((p) => p.text).join(\"\"))\n : undefined;\n\n const steps = msg.metadata?.steps;\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let reasoningTokens: number | undefined;\n let cachedInputTokens: number | undefined;\n if (steps && steps.length > 0) {\n let totalInput = 0;\n let totalOutput = 0;\n let totalReasoning = 0;\n let totalCachedInput = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n for (const step of steps) {\n if (!step.usage) continue;\n const usage = normalizeRunTelemetryUsage(step.usage);\n if (!usage) continue;\n if (usage.inputTokens != null) {\n totalInput += usage.inputTokens;\n hasInput = true;\n }\n if (usage.outputTokens != null) {\n totalOutput += usage.outputTokens;\n hasOutput = true;\n }\n if (usage.reasoningTokens != null) {\n totalReasoning += usage.reasoningTokens;\n hasReasoning = true;\n }\n if (usage.cachedInputTokens != null) {\n totalCachedInput += usage.cachedInputTokens;\n hasCachedInput = true;\n }\n }\n inputTokens = hasInput ? totalInput : undefined;\n outputTokens = hasOutput ? totalOutput : undefined;\n reasoningTokens = hasReasoning ? totalReasoning : undefined;\n cachedInputTokens = hasCachedInput ? totalCachedInput : undefined;\n }\n\n const status = msg.status?.type === \"incomplete\" ? \"incomplete\" : \"completed\";\n\n const metadata = msg.metadata?.custom as Record<string, unknown> | undefined;\n const modelId = extractRunTelemetryModelId(\n msg.metadata as Record<string, unknown> | undefined,\n );\n\n const telemetrySteps: RunReportStepInit[] | undefined =\n steps && steps.length > 0\n ? steps.map((step) => (step.usage ? { usage: step.usage } : {}))\n : undefined;\n\n return {\n status,\n ...(toolCalls && toolCalls.length > 0 ? { toolCalls } : undefined),\n ...(steps?.length ? { totalSteps: steps.length } : undefined),\n ...(inputTokens != null ||\n outputTokens != null ||\n reasoningTokens != null ||\n cachedInputTokens != null\n ? {\n usage: {\n ...(inputTokens != null ? { inputTokens } : undefined),\n ...(outputTokens != null ? { outputTokens } : undefined),\n ...(reasoningTokens != null ? { reasoningTokens } : undefined),\n ...(cachedInputTokens != null ? { cachedInputTokens } : undefined),\n },\n }\n : undefined),\n ...(outputText != null ? { outputText } : undefined),\n ...(metadata ? { metadata } : undefined),\n ...(telemetrySteps ? { steps: telemetrySteps } : undefined),\n ...(modelId ? { modelId } : undefined),\n };\n}\n\nexport function useAssistantCloudThreadHistoryAdapter(\n cloudRef: RefObject<AssistantCloud>,\n): ThreadHistoryAdapter & { readonly feedback: FeedbackAdapter } {\n const aui = useAui();\n // Not useEffectEvent: history adapter methods run during render (SSR load).\n const auiRef = useRef(aui);\n useEffect(() => {\n auiRef.current = aui;\n });\n const [adapter] = useState(\n () =>\n new AssistantCloudThreadHistoryAdapter(cloudRef, () => auiRef.current),\n );\n useAssistantCloudEngagementEvents(adapter, aui);\n return adapter;\n}\n\ntype RootEngagementTracker = {\n count: number;\n engagementReporter: CloudEngagementReporter;\n dispose: () => void;\n};\n\nconst rootEngagementTrackers = new WeakMap<\n AssistantClient,\n RootEngagementTracker\n>();\n\n/**\n * Thread switches are a thread list event, so one subscription per assistant\n * client reports them; every thread runtime mounted under it shares the\n * subscription and the last one to unmount removes it.\n */\nconst useRootEngagementEvents = (\n adapter: AssistantCloudThreadHistoryAdapter,\n aui: AssistantClient,\n) => {\n useEffect(() => {\n let tracker = rootEngagementTrackers.get(aui);\n if (!tracker) {\n const created: RootEngagementTracker = {\n count: 0,\n engagementReporter: adapter.engagementReporter,\n dispose: () => {},\n };\n created.dispose = aui.on(\n { scope: \"*\", event: \"threads.selectionChanged\" },\n (payload) => {\n created.engagementReporter.threadSwitched(payload.threadId);\n },\n );\n rootEngagementTrackers.set(aui, created);\n tracker = created;\n }\n const active = tracker;\n active.engagementReporter = adapter.engagementReporter;\n active.count += 1;\n return () => {\n active.count -= 1;\n if (active.count === 0) {\n active.dispose();\n rootEngagementTrackers.delete(aui);\n }\n };\n }, [adapter, aui]);\n};\n\nconst useAssistantCloudEngagementEvents = (\n adapter: AssistantCloudThreadHistoryAdapter,\n aui: AssistantClient,\n) => {\n useRootEngagementEvents(adapter, aui);\n\n useEffect(() => {\n const reporter = adapter.engagementReporter;\n\n const unsubscribers = [\n aui.on({ scope: \"thread\", event: \"composer.send\" }, (payload) => {\n if (payload.messageId) {\n reporter.messageEdited(payload.threadId, {\n messageId: payload.messageId,\n chars: payload.chars,\n });\n } else {\n reporter.messageSent(payload.threadId, {\n chars: payload.chars,\n attachments: payload.attachments,\n });\n }\n if (payload.suggestion) {\n reporter.suggestionClicked(payload.threadId);\n }\n }),\n aui.on(\n { scope: \"thread\", event: \"composer.attachmentAdd\" },\n (payload) => {\n reporter.attachmentAdded(payload.threadId, {\n messageId: payload.messageId,\n contentType: payload.contentType,\n });\n },\n ),\n aui.on(\n { scope: \"thread\", event: \"composer.attachmentAddError\" },\n (payload) => {\n reporter.attachmentFailed(payload.threadId, {\n messageId: payload.messageId,\n contentType: payload.contentType,\n });\n },\n ),\n aui.on({ scope: \"thread\", event: \"composer.cancel\" }, (payload) => {\n reporter.runStopped(payload.threadId);\n }),\n aui.on({ scope: \"thread\", event: \"thread.runStart\" }, (payload) => {\n reporter.runStarted(payload.threadId);\n }),\n aui.on({ scope: \"thread\", event: \"thread.runEnd\" }, (payload) => {\n reporter.runEnded(payload.threadId);\n }),\n aui.on({ scope: \"thread\", event: \"thread.cancelRun\" }, (payload) => {\n reporter.runStopped(payload.threadId);\n }),\n aui.on({ scope: \"thread\", event: \"thread.voiceStarted\" }, (payload) => {\n reporter.voiceStarted(payload.threadId);\n }),\n aui.on({ scope: \"thread\", event: \"message.reload\" }, (payload) => {\n reporter.messageRegenerated(payload.threadId, payload.messageId);\n }),\n aui.on(\n { scope: \"thread\", event: \"message.branchSwitched\" },\n (payload) => {\n reporter.branchSwitched(payload.threadId, payload.messageId);\n },\n ),\n aui.on({ scope: \"thread\", event: \"message.copied\" }, (payload) => {\n reporter.messageCopied(payload.threadId, payload.messageId);\n }),\n aui.on(\n { scope: \"thread\", event: \"thread.toolApprovalAnswered\" },\n (payload) => {\n if (payload.approved) {\n reporter.toolApproved(\n payload.threadId,\n payload.messageId,\n payload.toolCallId,\n payload.toolName,\n );\n } else {\n reporter.toolRejected(\n payload.threadId,\n payload.messageId,\n payload.toolCallId,\n payload.toolName,\n );\n }\n },\n ),\n aui.on({ scope: \"thread\", event: \"message.speak\" }, (payload) => {\n reporter.speechStarted(payload.threadId, payload.messageId);\n }),\n aui.on({ scope: \"thread\", event: \"message.error\" }, (payload) => {\n reporter.errorShown(payload.threadId, {\n messageId: payload.messageId,\n reason: payload.reason,\n });\n }),\n ];\n\n return () => {\n for (const unsubscribe of unsubscribers) unsubscribe();\n };\n }, [adapter, aui]);\n\n useEffect(() => {\n const reportSuggestions = () => {\n const { mainThreadId } = aui.threads.getState();\n if (aui.threadListItem.getState().id !== mainThreadId) return;\n const { isEmpty, suggestions } = aui.thread.getState();\n if (!isEmpty || suggestions.length === 0) return;\n adapter.engagementReporter.suggestionsShown(\n mainThreadId,\n suggestions.length,\n );\n };\n\n reportSuggestions();\n return aui.subscribe(reportSuggestions);\n }, [adapter, aui]);\n};\n"],"mappings":"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"}
@@ -8,6 +8,7 @@ declare class CloudFileAttachmentAdapter implements AttachmentAdapter {
8
8
  constructor(cloud: AssistantCloud);
9
9
  constructor(getCloud: () => AssistantCloud);
10
10
  private uploadedUrls;
11
+ private activeUploads;
11
12
  add({ file }: {
12
13
  file: File;
13
14
  }): AsyncGenerator<PendingAttachment, void>;
@@ -1 +1 @@
1
- {"version":3,"file":"CloudFileAttachmentAdapter.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts"],"mappings":";;;;cAkBa,sCAAsC;EAC1C;UAEC;EAEI,YAAA,OAAO;EACP,YAAA,gBAAgB;UAKpB;EAEM,MACZ;IAEA,MAAM;MACJ,eAAe;EAmDN,OAAO,YAAY,aAAa;EAIhC,KACX,YAAY,oBACX,QAAQ"}
1
+ {"version":3,"file":"CloudFileAttachmentAdapter.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts"],"mappings":";;;;cAkBa,sCAAsC;EAC1C;UAEC;EAEI,YAAA,OAAO;EACP,YAAA,gBAAgB;UAKpB;UACA;EAKM,MACZ;IAEA,MAAM;MACJ,eAAe;EAmEN,OAAO,YAAY,aAAa;EAUhC,KACX,YAAY,oBACX,QAAQ"}
@@ -12,6 +12,7 @@ var CloudFileAttachmentAdapter = class {
12
12
  this.getCloud = typeof cloud === "function" ? cloud : () => cloud;
13
13
  }
14
14
  uploadedUrls = /* @__PURE__ */ new Map();
15
+ activeUploads = /* @__PURE__ */ new Map();
15
16
  async *add({ file }) {
16
17
  const id = generateId();
17
18
  let attachment = {
@@ -26,15 +27,25 @@ var CloudFileAttachmentAdapter = class {
26
27
  progress: 0
27
28
  }
28
29
  };
29
- yield attachment;
30
+ const controller = new AbortController();
31
+ const upload = {
32
+ cancelled: false,
33
+ controller
34
+ };
35
+ this.activeUploads.set(id, upload);
30
36
  try {
37
+ yield attachment;
38
+ if (upload.cancelled) return;
31
39
  const { signedUrl, publicUrl } = await this.getCloud().files.generatePresignedUploadUrl({ filename: file.name });
40
+ if (upload.cancelled) return;
32
41
  const res = await fetch(signedUrl, {
33
42
  method: "PUT",
34
43
  body: file,
35
44
  headers: { "Content-Type": file.type },
36
- mode: "cors"
45
+ mode: "cors",
46
+ signal: controller.signal
37
47
  });
48
+ if (upload.cancelled) return;
38
49
  if (!res.ok) throw new Error(`Failed to upload file: ${res.status} ${res.statusText}`);
39
50
  this.uploadedUrls.set(id, publicUrl);
40
51
  attachment = {
@@ -46,6 +57,7 @@ var CloudFileAttachmentAdapter = class {
46
57
  };
47
58
  yield attachment;
48
59
  } catch (error) {
60
+ if (upload.cancelled) return;
49
61
  console.error("[assistant-ui] Failed to upload attachment:", error);
50
62
  attachment = {
51
63
  ...attachment,
@@ -56,9 +68,17 @@ var CloudFileAttachmentAdapter = class {
56
68
  }
57
69
  };
58
70
  yield attachment;
71
+ } finally {
72
+ if (this.activeUploads.get(id) === upload) this.activeUploads.delete(id);
59
73
  }
60
74
  }
61
75
  async remove(attachment) {
76
+ const upload = this.activeUploads.get(attachment.id);
77
+ if (upload) {
78
+ upload.cancelled = true;
79
+ upload.controller.abort();
80
+ this.activeUploads.delete(attachment.id);
81
+ }
62
82
  this.uploadedUrls.delete(attachment.id);
63
83
  }
64
84
  async send(attachment) {
@@ -1 +1 @@
1
- {"version":3,"file":"CloudFileAttachmentAdapter.js","names":["AssistantCloud","Attachment","PendingAttachment","CompleteAttachment","ThreadUserMessagePart","AttachmentAdapter","generateId","guessAttachmentType","contentType","startsWith","CloudFileAttachmentAdapter","accept","getCloud","constructor","cloud","uploadedUrls","Map","add","file","File","AsyncGenerator","id","type","attachment","name","status","reason","progress","signedUrl","publicUrl","files","generatePresignedUploadUrl","filename","res","fetch","method","body","headers","mode","ok","Error","statusText","set","error","console","message","String","remove","Promise","delete","send","url","get","content","image","data","mimeType"],"sources":["../../../../src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts"],"sourcesContent":["import type { AssistantCloud } from \"assistant-cloud\";\nimport type {\n Attachment,\n PendingAttachment,\n CompleteAttachment,\n} from \"../../../types/attachment\";\nimport type { ThreadUserMessagePart } from \"../../../types/message\";\nimport type { AttachmentAdapter } from \"../../../adapters/attachment\";\nimport { generateId } from \"../../../utils/id\";\n\nconst guessAttachmentType = (\n contentType: string,\n): \"image\" | \"document\" | \"file\" => {\n if (contentType.startsWith(\"image/\")) return \"image\";\n if (contentType.startsWith(\"text/\")) return \"document\";\n return \"file\";\n};\n\nexport class CloudFileAttachmentAdapter implements AttachmentAdapter {\n public accept = \"*\";\n\n private getCloud: () => AssistantCloud;\n\n constructor(cloud: AssistantCloud);\n constructor(getCloud: () => AssistantCloud);\n constructor(cloud: AssistantCloud | (() => AssistantCloud)) {\n this.getCloud = typeof cloud === \"function\" ? cloud : () => cloud;\n }\n\n private uploadedUrls = new Map<string, string>();\n\n public async *add({\n file,\n }: {\n file: File;\n }): AsyncGenerator<PendingAttachment, void> {\n const id = generateId();\n const type = guessAttachmentType(file.type);\n let attachment: PendingAttachment = {\n id,\n type,\n name: file.name,\n contentType: file.type,\n file,\n status: { type: \"running\", reason: \"uploading\", progress: 0 },\n };\n yield attachment;\n\n try {\n const { signedUrl, publicUrl } =\n await this.getCloud().files.generatePresignedUploadUrl({\n filename: file.name,\n });\n const res = await fetch(signedUrl, {\n method: \"PUT\",\n body: file,\n headers: {\n \"Content-Type\": file.type,\n },\n mode: \"cors\",\n });\n if (!res.ok) {\n throw new Error(\n `Failed to upload file: ${res.status} ${res.statusText}`,\n );\n }\n this.uploadedUrls.set(id, publicUrl);\n attachment = {\n ...attachment,\n status: { type: \"requires-action\", reason: \"composer-send\" },\n };\n yield attachment;\n } catch (error) {\n console.error(\"[assistant-ui] Failed to upload attachment:\", error);\n attachment = {\n ...attachment,\n status: {\n type: \"incomplete\",\n reason: \"error\",\n message: error instanceof Error ? error.message : String(error),\n },\n };\n yield attachment;\n }\n }\n\n public async remove(attachment: Attachment): Promise<void> {\n this.uploadedUrls.delete(attachment.id);\n }\n\n public async send(\n attachment: PendingAttachment,\n ): Promise<CompleteAttachment> {\n const url = this.uploadedUrls.get(attachment.id);\n if (!url) throw new Error(\"Attachment not uploaded\");\n this.uploadedUrls.delete(attachment.id);\n\n let content: ThreadUserMessagePart[];\n if (attachment.type === \"image\") {\n content = [{ type: \"image\", image: url, filename: attachment.name }];\n } else {\n content = [\n {\n type: \"file\",\n data: url,\n mimeType: attachment.contentType ?? \"\",\n filename: attachment.name,\n },\n ];\n }\n\n return {\n ...attachment,\n status: { type: \"complete\" },\n content,\n };\n }\n}\n"],"mappings":";;AAUA,MAAMO,uBACJC,gBACkC;CAClC,IAAIA,YAAYC,WAAW,QAAQ,GAAG,OAAO;CAC7C,IAAID,YAAYC,WAAW,OAAO,GAAG,OAAO;CAC5C,OAAO;AACT;AAEA,IAAaC,6BAAb,MAAqE;CACnE,SAAgB;CAEhB;CAIAG,YAAYC,OAAgD;EAC1D,KAAKF,WAAW,OAAOE,UAAU,aAAaA,cAAcA;CAC9D;CAEA,+BAAuB,IAAIE,IAAoB;CAE/C,OAAcC,IAAI,EAChBC,QAG0C;EAC1C,MAAMG,KAAKf,WAAW;EAEtB,IAAIiB,aAAgC;GAClCF;GACAC,MAHWf,oBAAoBW,KAAKI,IAGpCA;GACAE,MAAMN,KAAKM;GACXhB,aAAaU,KAAKI;GAClBJ;GACAO,QAAQ;IAAEH,MAAM;IAAWI,QAAQ;IAAaC,UAAU;GAAE;EAC9D;EACA,MAAMJ;EAEN,IAAI;GACF,MAAM,EAAEK,WAAWC,cACjB,MAAM,KAAKjB,SAAS,CAAC,CAACkB,MAAMC,2BAA2B,EACrDC,UAAUd,KAAKM,KACjB,CAAC;GACH,MAAMS,MAAM,MAAMC,MAAMN,WAAW;IACjCO,QAAQ;IACRC,MAAMlB;IACNmB,SAAS,EACP,gBAAgBnB,KAAKI,KACvB;IACAgB,MAAM;GACR,CAAC;GACD,IAAI,CAACL,IAAIM,IACP,MAAM,IAAIC,MACR,0BAA0BP,IAAIR,OAAM,GAAIQ,IAAIQ,YAC9C;GAEF,KAAK1B,aAAa2B,IAAIrB,IAAIQ,SAAS;GACnCN,aAAa;IACX,GAAGA;IACHE,QAAQ;KAAEH,MAAM;KAAmBI,QAAQ;IAAgB;GAC7D;GACA,MAAMH;EACR,SAASoB,OAAO;GACdC,QAAQD,MAAM,+CAA+CA,KAAK;GAClEpB,aAAa;IACX,GAAGA;IACHE,QAAQ;KACNH,MAAM;KACNI,QAAQ;KACRmB,SAASF,iBAAiBH,QAAQG,MAAME,UAAUC,OAAOH,KAAK;IAChE;GACF;GACA,MAAMpB;EACR;CACF;CAEA,MAAawB,OAAOxB,YAAuC;EACzD,KAAKR,aAAakC,OAAO1B,WAAWF,EAAE;CACxC;CAEA,MAAa6B,KACX3B,YAC6B;EAC7B,MAAM4B,MAAM,KAAKpC,aAAaqC,IAAI7B,WAAWF,EAAE;EAC/C,IAAI,CAAC8B,KAAK,MAAM,IAAIX,MAAM,yBAAyB;EACnD,KAAKzB,aAAakC,OAAO1B,WAAWF,EAAE;EAEtC,IAAIgC;EACJ,IAAI9B,WAAWD,SAAS,SACtB+B,UAAU,CAAC;GAAE/B,MAAM;GAASgC,OAAOH;GAAKnB,UAAUT,WAAWC;EAAK,CAAC;OAEnE6B,UAAU,CACR;GACE/B,MAAM;GACNiC,MAAMJ;GACNK,UAAUjC,WAAWf,eAAe;GACpCwB,UAAUT,WAAWC;EACvB,CAAC;EAIL,OAAO;GACL,GAAGD;GACHE,QAAQ,EAAEH,MAAM,WAAW;GAC3B+B;EACF;CACF;AACF"}
1
+ {"version":3,"file":"CloudFileAttachmentAdapter.js","names":["AssistantCloud","Attachment","PendingAttachment","CompleteAttachment","ThreadUserMessagePart","AttachmentAdapter","generateId","guessAttachmentType","contentType","startsWith","CloudFileAttachmentAdapter","accept","getCloud","constructor","cloud","uploadedUrls","Map","activeUploads","cancelled","controller","AbortController","add","file","File","AsyncGenerator","id","type","attachment","name","status","reason","progress","upload","set","signedUrl","publicUrl","files","generatePresignedUploadUrl","filename","res","fetch","method","body","headers","mode","signal","ok","Error","statusText","error","console","message","String","get","delete","remove","Promise","abort","send","url","content","image","data","mimeType"],"sources":["../../../../src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts"],"sourcesContent":["import type { AssistantCloud } from \"assistant-cloud\";\nimport type {\n Attachment,\n PendingAttachment,\n CompleteAttachment,\n} from \"../../../types/attachment\";\nimport type { ThreadUserMessagePart } from \"../../../types/message\";\nimport type { AttachmentAdapter } from \"../../../adapters/attachment\";\nimport { generateId } from \"../../../utils/id\";\n\nconst guessAttachmentType = (\n contentType: string,\n): \"image\" | \"document\" | \"file\" => {\n if (contentType.startsWith(\"image/\")) return \"image\";\n if (contentType.startsWith(\"text/\")) return \"document\";\n return \"file\";\n};\n\nexport class CloudFileAttachmentAdapter implements AttachmentAdapter {\n public accept = \"*\";\n\n private getCloud: () => AssistantCloud;\n\n constructor(cloud: AssistantCloud);\n constructor(getCloud: () => AssistantCloud);\n constructor(cloud: AssistantCloud | (() => AssistantCloud)) {\n this.getCloud = typeof cloud === \"function\" ? cloud : () => cloud;\n }\n\n private uploadedUrls = new Map<string, string>();\n private activeUploads = new Map<\n string,\n { cancelled: boolean; controller: AbortController }\n >();\n\n public async *add({\n file,\n }: {\n file: File;\n }): AsyncGenerator<PendingAttachment, void> {\n const id = generateId();\n const type = guessAttachmentType(file.type);\n let attachment: PendingAttachment = {\n id,\n type,\n name: file.name,\n contentType: file.type,\n file,\n status: { type: \"running\", reason: \"uploading\", progress: 0 },\n };\n const controller = new AbortController();\n const upload = { cancelled: false, controller };\n this.activeUploads.set(id, upload);\n\n try {\n yield attachment;\n if (upload.cancelled) return;\n\n const { signedUrl, publicUrl } =\n await this.getCloud().files.generatePresignedUploadUrl({\n filename: file.name,\n });\n if (upload.cancelled) return;\n\n const res = await fetch(signedUrl, {\n method: \"PUT\",\n body: file,\n headers: {\n \"Content-Type\": file.type,\n },\n mode: \"cors\",\n signal: controller.signal,\n });\n if (upload.cancelled) return;\n\n if (!res.ok) {\n throw new Error(\n `Failed to upload file: ${res.status} ${res.statusText}`,\n );\n }\n this.uploadedUrls.set(id, publicUrl);\n attachment = {\n ...attachment,\n status: { type: \"requires-action\", reason: \"composer-send\" },\n };\n yield attachment;\n } catch (error) {\n if (upload.cancelled) return;\n\n console.error(\"[assistant-ui] Failed to upload attachment:\", error);\n attachment = {\n ...attachment,\n status: {\n type: \"incomplete\",\n reason: \"error\",\n message: error instanceof Error ? error.message : String(error),\n },\n };\n yield attachment;\n } finally {\n if (this.activeUploads.get(id) === upload) {\n this.activeUploads.delete(id);\n }\n }\n }\n\n public async remove(attachment: Attachment): Promise<void> {\n const upload = this.activeUploads.get(attachment.id);\n if (upload) {\n upload.cancelled = true;\n upload.controller.abort();\n this.activeUploads.delete(attachment.id);\n }\n this.uploadedUrls.delete(attachment.id);\n }\n\n public async send(\n attachment: PendingAttachment,\n ): Promise<CompleteAttachment> {\n const url = this.uploadedUrls.get(attachment.id);\n if (!url) throw new Error(\"Attachment not uploaded\");\n this.uploadedUrls.delete(attachment.id);\n\n let content: ThreadUserMessagePart[];\n if (attachment.type === \"image\") {\n content = [{ type: \"image\", image: url, filename: attachment.name }];\n } else {\n content = [\n {\n type: \"file\",\n data: url,\n mimeType: attachment.contentType ?? \"\",\n filename: attachment.name,\n },\n ];\n }\n\n return {\n ...attachment,\n status: { type: \"complete\" },\n content,\n };\n }\n}\n"],"mappings":";;AAUA,MAAMO,uBACJC,gBACkC;CAClC,IAAIA,YAAYC,WAAW,QAAQ,GAAG,OAAO;CAC7C,IAAID,YAAYC,WAAW,OAAO,GAAG,OAAO;CAC5C,OAAO;AACT;AAEA,IAAaC,6BAAb,MAAqE;CACnE,SAAgB;CAEhB;CAIAG,YAAYC,OAAgD;EAC1D,KAAKF,WAAW,OAAOE,UAAU,aAAaA,cAAcA;CAC9D;CAEA,+BAAuB,IAAIE,IAAoB;CAC/C,gCAAwB,IAAIA,IAG1B;CAEF,OAAcK,IAAI,EAChBC,QAG0C;EAC1C,MAAMG,KAAKnB,WAAW;EAEtB,IAAIqB,aAAgC;GAClCF;GACAC,MAHWnB,oBAAoBe,KAAKI,IAGpCA;GACAE,MAAMN,KAAKM;GACXpB,aAAac,KAAKI;GAClBJ;GACAO,QAAQ;IAAEH,MAAM;IAAWI,QAAQ;IAAaC,UAAU;GAAE;EAC9D;EACA,MAAMZ,aAAa,IAAIC,gBAAgB;EACvC,MAAMY,SAAS;GAAEd,WAAW;GAAOC;EAAW;EAC9C,KAAKF,cAAcgB,IAAIR,IAAIO,MAAM;EAEjC,IAAI;GACF,MAAML;GACN,IAAIK,OAAOd,WAAW;GAEtB,MAAM,EAAEgB,WAAWC,cACjB,MAAM,KAAKvB,SAAS,CAAC,CAACwB,MAAMC,2BAA2B,EACrDC,UAAUhB,KAAKM,KACjB,CAAC;GACH,IAAII,OAAOd,WAAW;GAEtB,MAAMqB,MAAM,MAAMC,MAAMN,WAAW;IACjCO,QAAQ;IACRC,MAAMpB;IACNqB,SAAS,EACP,gBAAgBrB,KAAKI,KACvB;IACAkB,MAAM;IACNC,QAAQ1B,WAAW0B;GACrB,CAAC;GACD,IAAIb,OAAOd,WAAW;GAEtB,IAAI,CAACqB,IAAIO,IACP,MAAM,IAAIC,MACR,0BAA0BR,IAAIV,OAAM,GAAIU,IAAIS,YAC9C;GAEF,KAAKjC,aAAakB,IAAIR,IAAIU,SAAS;GACnCR,aAAa;IACX,GAAGA;IACHE,QAAQ;KAAEH,MAAM;KAAmBI,QAAQ;IAAgB;GAC7D;GACA,MAAMH;EACR,SAASsB,OAAO;GACd,IAAIjB,OAAOd,WAAW;GAEtBgC,QAAQD,MAAM,+CAA+CA,KAAK;GAClEtB,aAAa;IACX,GAAGA;IACHE,QAAQ;KACNH,MAAM;KACNI,QAAQ;KACRqB,SAASF,iBAAiBF,QAAQE,MAAME,UAAUC,OAAOH,KAAK;IAChE;GACF;GACA,MAAMtB;EACR,UAAU;GACR,IAAI,KAAKV,cAAcoC,IAAI5B,EAAE,MAAMO,QACjC,KAAKf,cAAcqC,OAAO7B,EAAE;EAEhC;CACF;CAEA,MAAa8B,OAAO5B,YAAuC;EACzD,MAAMK,SAAS,KAAKf,cAAcoC,IAAI1B,WAAWF,EAAE;EACnD,IAAIO,QAAQ;GACVA,OAAOd,YAAY;GACnBc,OAAOb,WAAWsC,MAAM;GACxB,KAAKxC,cAAcqC,OAAO3B,WAAWF,EAAE;EACzC;EACA,KAAKV,aAAauC,OAAO3B,WAAWF,EAAE;CACxC;CAEA,MAAaiC,KACX/B,YAC6B;EAC7B,MAAMgC,MAAM,KAAK5C,aAAasC,IAAI1B,WAAWF,EAAE;EAC/C,IAAI,CAACkC,KAAK,MAAM,IAAIZ,MAAM,yBAAyB;EACnD,KAAKhC,aAAauC,OAAO3B,WAAWF,EAAE;EAEtC,IAAImC;EACJ,IAAIjC,WAAWD,SAAS,SACtBkC,UAAU,CAAC;GAAElC,MAAM;GAASmC,OAAOF;GAAKrB,UAAUX,WAAWC;EAAK,CAAC;OAEnEgC,UAAU,CACR;GACElC,MAAM;GACNoC,MAAMH;GACNI,UAAUpC,WAAWnB,eAAe;GACpC8B,UAAUX,WAAWC;EACvB,CAAC;EAIL,OAAO;GACL,GAAGD;GACHE,QAAQ,EAAEH,MAAM,WAAW;GAC3BkC;EACF;CACF;AACF"}
@@ -1,4 +1,4 @@
1
- import { MessageStatus, SourceProviderMetadata, ThreadMessage, ToolApprovalDisplay, ToolApprovalOption } from "../../../types/message.js";
1
+ import { MessageStatus, ReasoningMessagePart, SourceProviderMetadata, ThreadMessage, ToolApprovalDisplay, ToolApprovalOption, ToolCallMessagePartMcpMetadata, ToolCallTiming } from "../../../types/message.js";
2
2
  import { CompleteAttachment } from "../../../types/attachment.js";
3
3
  import { ExportedMessageRepositoryItem } from "../../../runtime/utils/message-repository.js";
4
4
  import { ReadonlyJSONObject, ReadonlyJSONValue } from "assistant-stream/utils";
@@ -20,10 +20,13 @@ type AuiV0ToolApproval = {
20
20
  type AuiV0MessagePart = {
21
21
  readonly type: "text";
22
22
  readonly text: string;
23
+ readonly parentId?: string;
23
24
  } | {
24
25
  readonly type: "reasoning";
25
26
  readonly text: string;
26
27
  readonly unstable_summary?: string;
28
+ readonly providerMetadata?: NonNullable<ReasoningMessagePart["providerMetadata"]>;
29
+ readonly parentId?: string;
27
30
  } | {
28
31
  readonly type: "source";
29
32
  readonly sourceType: "url";
@@ -31,6 +34,7 @@ type AuiV0MessagePart = {
31
34
  readonly url: string;
32
35
  readonly title?: string;
33
36
  readonly providerMetadata?: SourceProviderMetadata;
37
+ readonly parentId?: string;
34
38
  } | {
35
39
  readonly type: "source";
36
40
  readonly sourceType: "document";
@@ -39,23 +43,12 @@ type AuiV0MessagePart = {
39
43
  readonly mediaType: string;
40
44
  readonly filename?: string;
41
45
  readonly providerMetadata?: SourceProviderMetadata;
42
- } | {
43
- readonly type: "tool-call";
44
- readonly toolCallId: string;
45
- readonly toolName: string;
46
+ readonly parentId?: string;
47
+ } | (AuiV0ToolCallPart & ({
46
48
  readonly args: ReadonlyJSONObject;
47
- readonly result?: ReadonlyJSONValue;
48
- readonly isError?: true;
49
- readonly approval?: AuiV0ToolApproval;
50
49
  } | {
51
- readonly type: "tool-call";
52
- readonly toolCallId: string;
53
- readonly toolName: string;
54
50
  readonly argsText: string;
55
- readonly result?: ReadonlyJSONValue;
56
- readonly isError?: true;
57
- readonly approval?: AuiV0ToolApproval;
58
- } | {
51
+ })) | {
59
52
  readonly type: "image";
60
53
  readonly image: string;
61
54
  } | {
@@ -64,14 +57,43 @@ type AuiV0MessagePart = {
64
57
  readonly mimeType: string;
65
58
  readonly filename?: string;
66
59
  readonly sourceType?: "url" | "id";
60
+ readonly parentId?: string;
67
61
  } | {
68
62
  readonly type: "data";
69
63
  readonly name: string;
70
64
  readonly data: ReadonlyJSONValue;
65
+ } | {
66
+ readonly type: "audio";
67
+ readonly audio: {
68
+ readonly data: string;
69
+ readonly format: "mp3" | "wav";
70
+ };
71
+ } | {
72
+ readonly type: "generative-ui";
73
+ readonly spec: ReadonlyJSONObject;
74
+ readonly id?: string;
75
+ readonly parentId?: string;
76
+ };
77
+ type AuiV0ToolCallPart = {
78
+ readonly type: "tool-call";
79
+ readonly toolCallId: string;
80
+ readonly toolName: string;
81
+ readonly result?: ReadonlyJSONValue;
82
+ readonly isError?: true;
83
+ readonly interrupt?: {
84
+ readonly type: "human";
85
+ readonly payload: ReadonlyJSONValue;
86
+ };
87
+ readonly timing?: ToolCallTiming;
88
+ readonly mcp?: ToolCallMessagePartMcpMetadata;
89
+ readonly approval?: AuiV0ToolApproval;
90
+ readonly parentId?: string;
91
+ readonly messages?: readonly AuiV0Message[];
71
92
  };
72
93
  type AuiV0AttachmentPart = {
73
94
  readonly type: "text";
74
95
  readonly text: string;
96
+ readonly parentId?: string;
75
97
  } | {
76
98
  readonly type: "image";
77
99
  readonly image: string;
@@ -82,6 +104,7 @@ type AuiV0AttachmentPart = {
82
104
  readonly mimeType: string;
83
105
  readonly filename?: string;
84
106
  readonly sourceType?: "url" | "id";
107
+ readonly parentId?: string;
85
108
  } | {
86
109
  readonly type: "audio";
87
110
  readonly audio: {
@@ -102,6 +125,8 @@ type AuiV0Attachment = {
102
125
  readonly content: readonly AuiV0AttachmentPart[];
103
126
  };
104
127
  type AuiV0Message = {
128
+ readonly id?: string;
129
+ readonly createdAt?: string;
105
130
  readonly role: "assistant" | "user" | "system";
106
131
  readonly status?: MessageStatus;
107
132
  readonly content: readonly AuiV0MessagePart[];
@@ -1 +1 @@
1
- {"version":3,"file":"auiV0.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/auiV0.ts"],"mappings":";;;;;;KAiBK;WACM;WACA;WACA,UAAU;WACV;WACA;WACA;WACA;WACA,mBAAmB;WACnB;WACA;WACA;;KAGN;WAEU;WACA;;WAGA;WACA;WACA;;WAGA;WACA;WACA;WACA;WACA;WACA,mBAAmB;;WAGnB;WACA;WACA;WACA;WACA;WACA;WACA,mBAAmB;;WAGnB;WACA;WACA;WACA,MAAM;WACN,SAAS;WACT;WACA,WAAW;;WAGX;WACA;WACA;WACA;WACA,SAAS;WACT;WACA,WAAW;;WAGX;WACA;;WAGA;WACA;WACA;WACA;WACA;;WAGA;WACA;WACA,MAAM;;KAGhB;WAEU;WACA;;WAGA;WACA;WACA;;WAGA;WACA;WACA;WACA;WACA;;WAGA;WACA;aACE;aACA;;;WAIF;WACA;WACA,MAAM;;KAGhB;WACM;WACA,MAAM;WACN;WACA;WACA,QAAQ;WACR,kBAAkB;;KAGxB;WACM;WACA,SAAS;WACT,kBAAkB;WAClB,uBAAuB;WACvB;aACE,iBAAiB;aACjB,+BAA+B;aAC/B,wBAAwB;aACxB;eACE;iBACE;iBACA;;;aAGJ,QAAQ;;;iBA2EL,YAAY,SAAS,gBAAgB;iBA+GrC,YACd,cAAc;EAAiB;IAC9B"}
1
+ {"version":3,"file":"auiV0.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/auiV0.ts"],"mappings":";;;;;;KAuBK;WACM;WACA;WACA,UAAU;WACV;WACA;WACA;WACA;WACA,mBAAmB;WACnB;WACA;WACA;;KAGN;WAEU;WACA;WACA;;WAGA;WACA;WACA;WACA,mBAAmB,YAC1B;WAEO;;WAGA;WACA;WACA;WACA;WACA;WACA,mBAAmB;WACnB;;WAGA;WACA;WACA;WACA;WACA;WACA;WACA,mBAAmB;WACnB;KAEV;WACa,MAAM;;WAAkC;;WAE3C;WACA;;WAGA;WACA;WACA;WACA;WACA;WACA;;WAGA;WACA;WACA,MAAM;;WAGN;WACA;aACE;aACA;;;WAIF;WACA,MAAM;WACN;WACA;;KAGV;WACM;WACA;WACA;WACA,SAAS;WACT;WACA;aACE;aACA,SAAS;;WAEX,SAAS;WACT,MAAM;WACN,WAAW;WACX;WACA,oBAAoB;;KAG1B;WAEU;WACA;WACA;;WAGA;WACA;WACA;;WAGA;WACA;WACA;WACA;WACA;WACA;;WAGA;WACA;aACE;aACA;;;WAIF;WACA;WACA,MAAM;;KAGhB;WACM;WACA,MAAM;WACN;WACA;WACA,QAAQ;WACR,kBAAkB;;KAGxB;WACM;WACA;WACA;WACA,SAAS;WACT,kBAAkB;WAClB,uBAAuB;WACvB;aACE,iBAAiB;aACjB,+BAA+B;aAC/B,wBAAwB;aACxB;eACE;iBACE;iBACA;;;aAGJ,QAAQ;;;iBAoFL,YAAY,SAAS,gBAAgB;iBAsKrC,YACd,cAAc;EAAiB;IAC9B"}