@assistant-ui/core 0.3.15 → 0.3.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/dist/internal.d.ts +7 -2
  2. package/dist/internal.js +8 -3
  3. package/dist/model-context/frame/host.d.ts.map +1 -1
  4. package/dist/model-context/frame/host.js +3 -2
  5. package/dist/model-context/frame/host.js.map +1 -1
  6. package/dist/model-context/frame/provider.d.ts +2 -0
  7. package/dist/model-context/frame/provider.d.ts.map +1 -1
  8. package/dist/model-context/frame/provider.js +88 -25
  9. package/dist/model-context/frame/provider.js.map +1 -1
  10. package/dist/model-context/interactable-composer-metadata.d.ts +1 -1
  11. package/dist/model-context/interactable-composer-metadata.js +1 -1
  12. package/dist/model-context/interactable-composer-metadata.js.map +1 -1
  13. package/dist/model-context/registry.d.ts +2 -2
  14. package/dist/model-context/registry.d.ts.map +1 -1
  15. package/dist/model-context/registry.js +9 -28
  16. package/dist/model-context/registry.js.map +1 -1
  17. package/dist/react/client/InMemoryThreadList.d.ts.map +1 -1
  18. package/dist/react/client/InMemoryThreadList.js +24 -20
  19. package/dist/react/client/InMemoryThreadList.js.map +1 -1
  20. package/dist/react/client/Interactables.d.ts.map +1 -1
  21. package/dist/react/client/Interactables.js +59 -177
  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 +23 -56
  25. package/dist/react/client/RemoteThreadList.js.map +1 -1
  26. package/dist/react/index.d.ts +2 -1
  27. package/dist/react/interactables-legacy/Interactables.d.ts.map +1 -1
  28. package/dist/react/interactables-legacy/Interactables.js +56 -174
  29. package/dist/react/interactables-legacy/Interactables.js.map +1 -1
  30. package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts +24 -0
  31. package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts.map +1 -0
  32. package/dist/react/interactables-shared/useInteractablePersistenceQueue.js +138 -0
  33. package/dist/react/interactables-shared/useInteractablePersistenceQueue.js.map +1 -0
  34. package/dist/react/primitives/composer/ComposerIf.js.map +1 -1
  35. package/dist/react/primitives/composer/ComposerQueue.d.ts +2 -1
  36. package/dist/react/primitives/composer/ComposerQueue.d.ts.map +1 -1
  37. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  38. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +1 -1
  39. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +1 -1
  40. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  41. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +23 -55
  42. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  43. package/dist/react/runtimes/assistant-transport/runManager.d.ts.map +1 -1
  44. package/dist/react/runtimes/assistant-transport/runManager.js +2 -12
  45. package/dist/react/runtimes/assistant-transport/runManager.js.map +1 -1
  46. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +3 -10
  47. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  48. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +20 -67
  49. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  50. package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.d.ts +12 -0
  51. package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.d.ts.map +1 -0
  52. package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.js +10 -0
  53. package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.js.map +1 -0
  54. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.js.map +1 -1
  55. package/dist/react/runtimes/createMessageConverter.d.ts +2 -1
  56. package/dist/react/runtimes/createMessageConverter.d.ts.map +1 -1
  57. package/dist/react/runtimes/external-message-converter.d.ts +6 -25
  58. package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
  59. package/dist/react/runtimes/external-message-converter.js +33 -233
  60. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  61. package/dist/runtime/api/composer-runtime.d.ts +1 -1
  62. package/dist/runtime/api/composer-runtime.js.map +1 -1
  63. package/dist/runtime/api/thread-runtime.d.ts +1 -2
  64. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  65. package/dist/runtime/base/base-composer-runtime-core.d.ts +1 -1
  66. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  67. package/dist/runtime/base/base-composer-runtime-core.js +14 -29
  68. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  69. package/dist/runtime/base/base-thread-runtime-core.d.ts +2 -4
  70. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  71. package/dist/runtime/base/base-thread-runtime-core.js +3 -9
  72. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  73. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +1 -1
  74. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
  75. package/dist/runtime/base/default-thread-composer-runtime-core.js +1 -1
  76. package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
  77. package/dist/runtime/interfaces/composer-runtime-core.d.ts +1 -1
  78. package/dist/runtime/interfaces/thread-runtime-core.d.ts +1 -1
  79. package/dist/runtime/internal.d.ts +2 -1
  80. package/dist/runtime/internal.js +2 -1
  81. package/dist/runtime/queue/external-thread-queue-adapter.d.ts +1 -1
  82. package/dist/runtime/queue/message-queue.d.ts.map +1 -1
  83. package/dist/runtime/queue/message-queue.js +1 -1
  84. package/dist/runtime/queue/message-queue.js.map +1 -1
  85. package/dist/runtime/queue/queue-item.d.ts +12 -0
  86. package/dist/runtime/queue/queue-item.d.ts.map +1 -0
  87. package/dist/runtime/queue/queue-item.js +6 -0
  88. package/dist/runtime/queue/queue-item.js.map +1 -0
  89. package/dist/runtime/utils/abortable-thread-load.d.ts +15 -0
  90. package/dist/runtime/utils/abortable-thread-load.d.ts.map +1 -0
  91. package/dist/runtime/utils/abortable-thread-load.js +35 -0
  92. package/dist/runtime/utils/abortable-thread-load.js.map +1 -0
  93. package/dist/runtime/utils/attachment-add-operations.d.ts +18 -0
  94. package/dist/runtime/utils/attachment-add-operations.d.ts.map +1 -0
  95. package/dist/runtime/utils/attachment-add-operations.js +43 -0
  96. package/dist/runtime/utils/attachment-add-operations.js.map +1 -0
  97. package/dist/runtime/utils/auto-status.d.ts +6 -1
  98. package/dist/runtime/utils/auto-status.d.ts.map +1 -1
  99. package/dist/runtime/utils/auto-status.js +7 -1
  100. package/dist/runtime/utils/auto-status.js.map +1 -1
  101. package/dist/runtime/utils/external-message-conversion.d.ts +47 -0
  102. package/dist/runtime/utils/external-message-conversion.d.ts.map +1 -0
  103. package/dist/runtime/utils/external-message-conversion.js +221 -0
  104. package/dist/runtime/utils/external-message-conversion.js.map +1 -0
  105. package/dist/runtime/utils/external-store-message.d.ts +2 -1
  106. package/dist/runtime/utils/external-store-message.d.ts.map +1 -1
  107. package/dist/runtime/utils/external-store-message.js +2 -1
  108. package/dist/runtime/utils/external-store-message.js.map +1 -1
  109. package/dist/runtime/utils/message-repository-session.d.ts +30 -0
  110. package/dist/runtime/utils/message-repository-session.d.ts.map +1 -0
  111. package/dist/runtime/utils/message-repository-session.js +130 -0
  112. package/dist/runtime/utils/message-repository-session.js.map +1 -0
  113. package/dist/runtime/utils/message-repository.d.ts.map +1 -1
  114. package/dist/runtime/utils/message-repository.js +3 -4
  115. package/dist/runtime/utils/message-repository.js.map +1 -1
  116. package/dist/runtime/utils/pending-tool-calls.d.ts +20 -0
  117. package/dist/runtime/utils/pending-tool-calls.d.ts.map +1 -0
  118. package/dist/runtime/utils/pending-tool-calls.js +22 -0
  119. package/dist/runtime/utils/pending-tool-calls.js.map +1 -0
  120. package/dist/runtime/utils/thread-message-like.d.ts +2 -1
  121. package/dist/runtime/utils/thread-message-like.d.ts.map +1 -1
  122. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  123. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts +2 -5
  124. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  125. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +3 -10
  126. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  127. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +19 -1
  128. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  129. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +122 -20
  130. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  131. package/dist/runtimes/local/local-thread-runtime-core.d.ts +3 -1
  132. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  133. package/dist/runtimes/local/local-thread-runtime-core.js +20 -2
  134. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  135. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +12 -1
  136. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -1
  137. package/dist/runtimes/remote-thread-list/remote-thread-state.js +77 -1
  138. package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
  139. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
  140. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +2 -0
  141. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  142. package/dist/store/clients/external-thread.d.ts.map +1 -1
  143. package/dist/store/clients/external-thread.js +74 -99
  144. package/dist/store/clients/external-thread.js.map +1 -1
  145. package/dist/store/clients/single-thread-list.d.ts.map +1 -1
  146. package/dist/store/clients/single-thread-list.js +1 -1
  147. package/dist/store/clients/single-thread-list.js.map +1 -1
  148. package/dist/store/clients/suggestions.d.ts.map +1 -1
  149. package/dist/store/clients/suggestions.js +16 -7
  150. package/dist/store/clients/suggestions.js.map +1 -1
  151. package/dist/store/index.d.ts +4 -2
  152. package/dist/store/scope-registration.d.ts +1 -1
  153. package/dist/store/scopes/composer.d.ts +2 -1
  154. package/dist/store/scopes/composer.d.ts.map +1 -1
  155. package/dist/store/scopes/message.d.ts +1 -1
  156. package/dist/store/scopes/queue-item.d.ts +2 -9
  157. package/dist/store/scopes/queue-item.d.ts.map +1 -1
  158. package/dist/store/scopes/queue-item.js +0 -6
  159. package/dist/types/message.d.ts +7 -3
  160. package/dist/types/message.d.ts.map +1 -1
  161. package/dist/types/message.js.map +1 -1
  162. package/dist/utils/data-url.d.ts +14 -1
  163. package/dist/utils/data-url.d.ts.map +1 -1
  164. package/dist/utils/data-url.js +13 -1
  165. package/dist/utils/data-url.js.map +1 -1
  166. package/dist/utils/invoke-user-callback.d.ts +5 -0
  167. package/dist/utils/invoke-user-callback.d.ts.map +1 -0
  168. package/dist/utils/invoke-user-callback.js +19 -0
  169. package/dist/utils/invoke-user-callback.js.map +1 -0
  170. package/dist/utils/normalizePartStatus.js.map +1 -1
  171. package/package.json +10 -10
  172. package/src/internal.ts +12 -0
  173. package/src/model-context/frame/host.test.ts +91 -7
  174. package/src/model-context/frame/host.ts +7 -2
  175. package/src/model-context/frame/provider.test.ts +267 -12
  176. package/src/model-context/frame/provider.ts +113 -31
  177. package/src/model-context/interactable-composer-metadata.ts +1 -1
  178. package/src/model-context/registry.test.ts +44 -0
  179. package/src/model-context/registry.ts +13 -35
  180. package/src/react/client/InMemoryThreadList.test.tsx +49 -0
  181. package/src/react/client/InMemoryThreadList.ts +7 -1
  182. package/src/react/client/Interactables.ts +19 -178
  183. package/src/react/client/RemoteThreadList.test.ts +96 -0
  184. package/src/react/client/RemoteThreadList.ts +27 -59
  185. package/src/react/interactables-legacy/Interactables.ts +20 -177
  186. package/src/react/interactables-shared/useInteractablePersistenceQueue.test.tsx +161 -0
  187. package/src/react/interactables-shared/useInteractablePersistenceQueue.ts +206 -0
  188. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +26 -56
  189. package/src/react/runtimes/assistant-transport/runManager.ts +4 -17
  190. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +92 -0
  191. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +40 -141
  192. package/src/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.test.ts +37 -0
  193. package/src/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.ts +18 -0
  194. package/src/react/runtimes/external-message-converter.test.ts +0 -14
  195. package/src/react/runtimes/external-message-converter.test.tsx +77 -0
  196. package/src/react/runtimes/external-message-converter.ts +58 -481
  197. package/src/runtime/api/composer-runtime.ts +1 -1
  198. package/src/runtime/api/message-runtime.test.ts +28 -1
  199. package/src/runtime/base/base-composer-runtime-core.ts +20 -40
  200. package/src/runtime/base/base-thread-runtime-core.test.ts +16 -0
  201. package/src/runtime/base/base-thread-runtime-core.ts +6 -11
  202. package/src/runtime/base/default-thread-composer-runtime-core.ts +1 -4
  203. package/src/runtime/interfaces/composer-runtime-core.ts +1 -1
  204. package/src/runtime/interfaces/thread-runtime-core.ts +1 -1
  205. package/src/runtime/internal.ts +5 -0
  206. package/src/runtime/queue/external-thread-queue-adapter.ts +1 -1
  207. package/src/runtime/queue/message-queue.ts +1 -4
  208. package/src/runtime/queue/queue-item.ts +10 -0
  209. package/src/runtime/utils/abortable-thread-load.test.ts +87 -0
  210. package/src/runtime/utils/abortable-thread-load.ts +53 -0
  211. package/src/runtime/utils/attachment-add-operations.ts +59 -0
  212. package/src/runtime/utils/auto-status.ts +33 -0
  213. package/src/runtime/utils/external-message-conversion.test.ts +113 -0
  214. package/src/runtime/utils/external-message-conversion.ts +494 -0
  215. package/src/runtime/utils/external-store-message.ts +2 -0
  216. package/src/runtime/utils/message-repository-session.test.ts +195 -0
  217. package/src/runtime/utils/message-repository-session.ts +176 -0
  218. package/src/runtime/utils/message-repository.ts +7 -4
  219. package/src/runtime/utils/pending-tool-calls.test.ts +57 -0
  220. package/src/runtime/utils/pending-tool-calls.ts +35 -0
  221. package/src/runtime/utils/thread-message-like.ts +2 -0
  222. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +6 -14
  223. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +175 -28
  224. package/src/runtimes/local/local-thread-runtime-core.test.ts +172 -1
  225. package/src/runtimes/local/local-thread-runtime-core.ts +48 -3
  226. package/src/runtimes/remote-thread-list/remote-thread-state.test.ts +37 -0
  227. package/src/runtimes/remote-thread-list/remote-thread-state.ts +123 -0
  228. package/src/runtimes/tool-invocations/EDGE_CASES.md +17 -0
  229. package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +140 -0
  230. package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +3 -0
  231. package/src/store/clients/external-thread.ts +16 -61
  232. package/src/store/clients/single-thread-list.ts +4 -1
  233. package/src/store/clients/suggestions.test.ts +31 -0
  234. package/src/store/clients/suggestions.ts +18 -19
  235. package/src/store/scopes/message.ts +1 -1
  236. package/src/store/scopes/queue-item.ts +2 -9
  237. package/src/tests/MessageRepository.test.ts +77 -0
  238. package/src/tests/RemoteThreadListThreadListRuntimeCore-load-race.test.ts +194 -0
  239. package/src/tests/RemoteThreadListThreadListRuntimeCore-title-race.test.ts +158 -0
  240. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +164 -0
  241. package/src/tests/external-store-thread-runtime-core.test.ts +642 -0
  242. package/src/tests/external-thread-attachments.test.tsx +173 -0
  243. package/src/tests/single-thread-list-item.test.tsx +47 -0
  244. package/src/tests/thread-message-like.test.ts +39 -1
  245. package/src/types/message.ts +8 -3
  246. package/src/utils/data-url.test.ts +52 -1
  247. package/src/utils/data-url.ts +21 -0
  248. package/src/utils/invoke-user-callback.test.ts +82 -0
  249. package/src/utils/invoke-user-callback.ts +31 -0
  250. package/src/utils/normalizePartStatus.ts +1 -1
  251. package/dist/store/scopes/queue-item.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantCloudThreadHistoryAdapter.js","names":["RefObject","useEffect","useRef","useState","GenericThreadHistoryAdapter","ThreadHistoryAdapter","MessageFormatAdapter","MessageFormatItem","MessageFormatRepository","ExportedMessageRepositoryItem","AssistantCloud","CloudMessagePersistence","createFormattedPersistence","auiV0Decode","auiV0Encode","AssistantClient","getClientId","useAui","ThreadListItemMethods","CloudThreadListItem","Pick","globalPersistence","WeakMap","ClientId","AssistantCloudThreadHistoryAdapter","cloudRef","getAui","constructor","aui","getPersistence","threadListItem","key","has","set","current","get","_persistence","tryGetKeyedThreadListItem","live","source","undefined","id","getState","threads","item","withFormat","Record","formatAdapter","TMessage","TStorageFormat","adapter","pinCurrent","next","resolvePinned","getFormatted","getTargetFormatted","pin","append","pinned","Error","remoteId","initialize","update","localMessageId","delete","reportTelemetry","items","options","durationMs","stepTimestamps","StepTimestamp","encodedRunMessages","map","encode","_reportRunTelemetry","format","load","Promise","messages","parentId","message","encoded","telemetry","enabled","_maybeReportRun","isPersisted","filter","m","reverse","runMessages","T","extracted","extractRunTelemetry","_sendReport","content","extractTelemetry","data","TelemetryData","mergedSteps","mergeStepTimestamps","steps","initial","Parameters","this","runs","report","thread_id","status","totalSteps","total_steps","toolCalls","tool_calls","inputTokens","input_tokens","outputTokens","output_tokens","reasoningTokens","reasoning_tokens","cachedInputTokens","cached_input_tokens","duration_ms","outputText","output_text","metadata","modelId","model_id","beforeReport","catch","MAX_SPAN_CONTENT","truncateStr","value","length","slice","safeStringify","JSON","stringify","TelemetryToolCall","tool_name","tool_call_id","tool_args","tool_result","tool_source","BASE64_PATTERN","summarizeMcpResult","parsed","parse","Array","isArray","summarized","type","test","sizeKB","toFixed","buildToolCall","toolName","toolCallId","args","result","argsText","toolSource","call","toolArgs","toolResult","TelemetryStepData","start_ms","end_ms","timestamps","t","len","Math","min","s","i","extractAuiV0","extractAiSdkV6","aggregateAiSdkV6RunSteps","AUI_STATUS_MAP","error","incomplete","msg","role","text","usage","custom","p","textParts","join","totalInput","totalOutput","totalReasoning","totalCachedInput","hasInput","hasOutput","hasReasoning","hasCachedInput","step","statusType","telemetrySteps","AiSdkV6Part","input","output","AiSdkV6Message","parts","isToolCallPart","startsWith","isDynamicToolPart","partToToolCall","collectAiSdkV6Parts","stepsData","currentStepToolCalls","push","tc","extractModelId","buildAiSdkV6Result","hasText","UsageFields","promptTokens","completionTokens","normalizeUsage","u","extractAiSdkV6Usage","normalized","hasAny","n","stepMessages","allTextParts","allToolCalls","allStepsData","hasAssistant","useAssistantCloudThreadHistoryAdapter","auiRef"],"sources":["../../../../src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts"],"sourcesContent":["import { type RefObject, useEffect, useRef, useState } from \"react\";\nimport type {\n GenericThreadHistoryAdapter,\n ThreadHistoryAdapter,\n MessageFormatAdapter,\n MessageFormatItem,\n MessageFormatRepository,\n} from \"../../../adapters/thread-history\";\nimport type { ExportedMessageRepositoryItem } from \"../../../runtime/utils/message-repository\";\nimport {\n type AssistantCloud,\n CloudMessagePersistence,\n createFormattedPersistence,\n} from \"assistant-cloud\";\nimport { auiV0Decode, auiV0Encode } from \"./auiV0\";\nimport { type AssistantClient, getClientId, useAui } from \"@assistant-ui/store\";\nimport type { ThreadListItemMethods } from \"../../../store/scopes/thread-list-item\";\n\ntype CloudThreadListItem = Pick<\n ThreadListItemMethods,\n \"getState\" | \"initialize\"\n>;\n\nconst globalPersistence = new WeakMap<\n getClientId.ClientId,\n CloudMessagePersistence\n>();\n\nclass AssistantCloudThreadHistoryAdapter implements ThreadHistoryAdapter {\n private cloudRef: RefObject<AssistantCloud>;\n private getAui: () => AssistantClient;\n\n constructor(\n cloudRef: RefObject<AssistantCloud>,\n getAui: () => AssistantClient,\n ) {\n this.cloudRef = cloudRef;\n this.getAui = getAui;\n }\n\n private get aui(): AssistantClient {\n return this.getAui();\n }\n\n private getPersistence(\n threadListItem: CloudThreadListItem = this.aui.threadListItem,\n ): CloudMessagePersistence {\n const key = getClientId(threadListItem);\n if (!globalPersistence.has(key)) {\n globalPersistence.set(\n key,\n new CloudMessagePersistence(() => this.cloudRef.current),\n );\n }\n return globalPersistence.get(key)!;\n }\n\n private get _persistence(): CloudMessagePersistence {\n return this.getPersistence();\n }\n\n private tryGetKeyedThreadListItem(): CloudThreadListItem | undefined {\n const live = this.aui.threadListItem;\n if (!live.source) return undefined;\n const id = live.getState().id;\n if (id === undefined) return undefined;\n return this.aui.threads.item({ id });\n }\n\n withFormat<TMessage, TStorageFormat extends Record<string, unknown>>(\n formatAdapter: MessageFormatAdapter<TMessage, TStorageFormat>,\n ): GenericThreadHistoryAdapter<TMessage> {\n const adapter = this;\n let threadListItem: CloudThreadListItem | undefined;\n const pinCurrent = () => {\n const next = adapter.tryGetKeyedThreadListItem();\n if (next) threadListItem = next;\n return threadListItem;\n };\n const resolvePinned = () => threadListItem ?? pinCurrent();\n const getFormatted = () =>\n createFormattedPersistence(adapter._persistence, formatAdapter);\n const getTargetFormatted = (item: CloudThreadListItem) =>\n createFormattedPersistence(adapter.getPersistence(item), formatAdapter);\n return {\n pin() {\n pinCurrent();\n },\n async append(item: MessageFormatItem<TMessage>) {\n const pinned = resolvePinned();\n if (!pinned) {\n throw new Error(\n \"Cannot persist cloud history without a thread list item.\",\n );\n }\n const remoteId =\n pinned.getState().remoteId ?? (await pinned.initialize()).remoteId;\n await getTargetFormatted(pinned).append(remoteId, item);\n },\n async update(item: MessageFormatItem<TMessage>, localMessageId: string) {\n const pinned = resolvePinned();\n const remoteId = pinned?.getState().remoteId;\n if (!remoteId || !pinned) return;\n await getTargetFormatted(pinned).update?.(\n remoteId,\n item,\n localMessageId,\n );\n },\n async delete() {\n throw new Error(\n \"Assistant Cloud does not support deleting thread messages yet.\",\n );\n },\n reportTelemetry(\n items: MessageFormatItem<TMessage>[],\n options?: {\n durationMs?: number;\n stepTimestamps?: StepTimestamp[];\n },\n ) {\n const encodedRunMessages = items.map((item) =>\n formatAdapter.encode(item),\n );\n adapter._reportRunTelemetry(\n formatAdapter.format,\n encodedRunMessages,\n options,\n resolvePinned(),\n );\n },\n async load(): Promise<MessageFormatRepository<TMessage>> {\n pinCurrent();\n const live = adapter.aui.threadListItem;\n const remoteId = live.source ? live.getState().remoteId : undefined;\n if (!remoteId) return { messages: [] };\n return getFormatted().load(remoteId);\n },\n };\n }\n\n async append({ parentId, message }: ExportedMessageRepositoryItem) {\n const { remoteId } = await this.aui.threadListItem.initialize();\n const encoded = auiV0Encode(message);\n await this._persistence.append(\n remoteId,\n message.id,\n parentId,\n \"aui/v0\",\n encoded,\n );\n\n if (this.cloudRef.current.telemetry.enabled) {\n this._maybeReportRun(remoteId, \"aui/v0\", encoded);\n }\n }\n\n async update(item: ExportedMessageRepositoryItem) {\n if (!this._persistence.isPersisted(item.message.id)) {\n return this.append(item);\n }\n const { message } = item;\n const remoteId = this.aui.threadListItem.getState().remoteId;\n if (!remoteId) return;\n const encoded = auiV0Encode(message);\n await this._persistence.update(remoteId, message.id, \"aui/v0\", encoded);\n\n if (this.cloudRef.current.telemetry.enabled) {\n this._maybeReportRun(remoteId, \"aui/v0\", encoded);\n }\n }\n\n async delete() {\n throw new Error(\n \"Assistant Cloud does not support deleting thread messages yet.\",\n );\n }\n\n async load() {\n const remoteId = this.aui.threadListItem.getState().remoteId;\n if (!remoteId) return { messages: [] };\n const messages = await this._persistence.load(remoteId, \"aui/v0\");\n return {\n messages: messages\n .filter(\n (m): m is typeof m & { format: \"aui/v0\" } => m.format === \"aui/v0\",\n )\n .map(auiV0Decode)\n .reverse(),\n };\n }\n\n private _reportRunTelemetry<T>(\n format: string,\n runMessages: T[],\n options?: {\n durationMs?: number;\n stepTimestamps?: StepTimestamp[];\n },\n threadListItem?: CloudThreadListItem,\n ) {\n if (!this.cloudRef.current.telemetry.enabled) return;\n\n const remoteId = (threadListItem ?? this.aui.threadListItem).getState()\n .remoteId;\n if (!remoteId) return;\n\n const extracted = extractRunTelemetry(format, runMessages);\n if (!extracted) return;\n\n this._sendReport(\n remoteId,\n extracted,\n options?.durationMs,\n options?.stepTimestamps,\n );\n }\n\n private _maybeReportRun<T>(remoteId: string, format: string, content: T) {\n const extracted = extractTelemetry(format, content);\n if (!extracted) return;\n\n this._sendReport(remoteId, extracted);\n }\n\n private _sendReport(\n remoteId: string,\n data: TelemetryData,\n durationMs?: number,\n stepTimestamps?: StepTimestamp[],\n ) {\n const mergedSteps = mergeStepTimestamps(data.steps, stepTimestamps);\n // Keep in sync with assistant-cloud createRunSchema\n // (apps/aui-cloud-api/src/endpoints/runs/create.ts).\n const initial: Parameters<typeof this.cloudRef.current.runs.report>[0] = {\n thread_id: remoteId,\n status: data.status,\n ...(data.totalSteps != null\n ? { total_steps: data.totalSteps }\n : undefined),\n ...(data.toolCalls ? { tool_calls: data.toolCalls } : undefined),\n ...(mergedSteps ? { steps: mergedSteps } : undefined),\n ...(data.inputTokens != null\n ? { input_tokens: data.inputTokens }\n : undefined),\n ...(data.outputTokens != null\n ? { output_tokens: data.outputTokens }\n : undefined),\n ...(data.reasoningTokens != null\n ? { reasoning_tokens: data.reasoningTokens }\n : undefined),\n ...(data.cachedInputTokens != null\n ? { cached_input_tokens: data.cachedInputTokens }\n : undefined),\n ...(durationMs != null ? { duration_ms: durationMs } : undefined),\n ...(data.outputText != null\n ? { output_text: data.outputText }\n : undefined),\n ...(data.metadata ? { metadata: data.metadata } : undefined),\n ...(data.modelId ? { model_id: data.modelId } : undefined),\n };\n\n const { beforeReport } = this.cloudRef.current.telemetry;\n const report = beforeReport ? beforeReport(initial) : initial;\n if (!report) return;\n\n this.cloudRef.current.runs.report(report).catch(() => {});\n }\n}\n\nconst MAX_SPAN_CONTENT = 50_000;\n\nfunction truncateStr(value: string): string {\n if (value.length <= MAX_SPAN_CONTENT) return value;\n return value.slice(0, MAX_SPAN_CONTENT);\n}\n\nfunction safeStringify(value: unknown): string | undefined {\n if (value == null) return undefined;\n try {\n return truncateStr(JSON.stringify(value));\n } catch {\n return undefined;\n }\n}\n\ntype TelemetryToolCall = {\n tool_name: string;\n tool_call_id: string;\n tool_args?: string;\n tool_result?: string;\n tool_source?: \"mcp\" | \"frontend\" | \"backend\";\n};\n\nconst BASE64_PATTERN = /^[A-Za-z0-9+/]{100,}={0,2}$/;\n\nfunction summarizeMcpResult(value: unknown): string | undefined {\n if (value == null) return undefined;\n try {\n const parsed = typeof value === \"string\" ? JSON.parse(value) : value;\n if (Array.isArray(parsed)) {\n const summarized = parsed.map((item) => {\n if (item && typeof item === \"object\" && item.type) {\n if (\n (item.type === \"image\" || item.type === \"audio\") &&\n typeof item.data === \"string\" &&\n BASE64_PATTERN.test(item.data.slice(0, 200))\n ) {\n const sizeKB = ((item.data.length * 3) / 4 / 1024).toFixed(1);\n return { ...item, data: `[${item.type}: ${sizeKB}KB]` };\n }\n }\n return item;\n });\n return truncateStr(JSON.stringify(summarized));\n }\n } catch {\n // not JSON array, fall through\n }\n return safeStringify(value);\n}\n\nfunction buildToolCall(\n toolName: string,\n toolCallId: string,\n args: unknown,\n result: unknown,\n argsText?: string,\n toolSource?: \"mcp\" | \"frontend\" | \"backend\",\n): TelemetryToolCall {\n const call: TelemetryToolCall = {\n tool_name: toolName,\n tool_call_id: toolCallId,\n };\n const toolArgs = argsText ?? safeStringify(args);\n if (toolArgs !== undefined) call.tool_args = toolArgs;\n const toolResult =\n toolSource === \"mcp\" ? summarizeMcpResult(result) : safeStringify(result);\n if (toolResult !== undefined) call.tool_result = toolResult;\n if (toolSource) call.tool_source = toolSource;\n return call;\n}\n\ntype TelemetryStepData = {\n input_tokens?: number;\n output_tokens?: number;\n reasoning_tokens?: number;\n cached_input_tokens?: number;\n tool_calls?: TelemetryToolCall[];\n start_ms?: number;\n end_ms?: number;\n};\n\ntype StepTimestamp = { start_ms: number; end_ms: number };\n\nfunction mergeStepTimestamps(\n steps: TelemetryStepData[] | undefined,\n timestamps: StepTimestamp[] | undefined,\n): TelemetryStepData[] | undefined {\n if (!timestamps) return steps;\n if (!steps) return timestamps.map((t) => ({ ...t }));\n\n const len = Math.min(steps.length, timestamps.length);\n return steps.map((s, i) => ({\n ...s,\n ...(i < len ? timestamps[i] : undefined),\n }));\n}\n\ntype TelemetryData = {\n status: \"completed\" | \"incomplete\" | \"error\";\n toolCalls?: TelemetryToolCall[];\n totalSteps?: number;\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n outputText?: string;\n metadata?: Record<string, unknown>;\n steps?: TelemetryStepData[];\n modelId?: string;\n};\n\nfunction extractTelemetry<T>(format: string, content: T): TelemetryData | null {\n switch (format) {\n case \"aui/v0\":\n return extractAuiV0(content);\n case \"ai-sdk/v6\":\n return extractAiSdkV6(content);\n default:\n return null;\n }\n}\n\nfunction extractRunTelemetry<T>(\n format: string,\n runMessages: T[],\n): TelemetryData | null {\n if (format === \"ai-sdk/v6\") {\n return aggregateAiSdkV6RunSteps(runMessages);\n }\n for (let i = runMessages.length - 1; i >= 0; i--) {\n const result = extractTelemetry(format, runMessages[i]!);\n if (result) return result;\n }\n return null;\n}\n\nconst AUI_STATUS_MAP: Record<string, TelemetryData[\"status\"]> = {\n error: \"error\",\n incomplete: \"incomplete\",\n};\n\nexport function extractAuiV0<T>(content: T): TelemetryData | null {\n const msg = content as {\n role?: string;\n status?: { type: string };\n content?: readonly {\n type: string;\n text?: string;\n toolName?: string;\n toolCallId?: string;\n args?: unknown;\n argsText?: string;\n result?: unknown;\n }[];\n metadata?: {\n modelId?: string;\n steps?: readonly {\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n };\n }[];\n custom?: Record<string, unknown> & { modelId?: string };\n };\n };\n\n if (msg.role !== \"assistant\") return null;\n // A paused (requires-action) write is not a finished run; reporting it would\n // mislabel it \"completed\" and double-count steps once the terminal write reports.\n if (msg.status?.type === \"requires-action\") return null;\n\n const toolCalls = msg.content\n ?.filter((p) => p.type === \"tool-call\" && p.toolName && p.toolCallId)\n .map((p) =>\n buildToolCall(p.toolName!, p.toolCallId!, p.args, p.result, p.argsText),\n );\n\n const textParts = msg.content?.filter((p) => p.type === \"text\" && p.text);\n const outputText =\n textParts && textParts.length > 0\n ? truncateStr(textParts.map((p) => p.text).join(\"\"))\n : undefined;\n\n const steps = msg.metadata?.steps;\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let reasoningTokens: number | undefined;\n let cachedInputTokens: number | undefined;\n if (steps && steps.length > 0) {\n let totalInput = 0;\n let totalOutput = 0;\n let totalReasoning = 0;\n let totalCachedInput = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n for (const step of steps) {\n if (step.usage?.inputTokens != null) {\n totalInput += step.usage.inputTokens;\n hasInput = true;\n }\n if (step.usage?.outputTokens != null) {\n totalOutput += step.usage.outputTokens;\n hasOutput = true;\n }\n if (step.usage?.reasoningTokens != null) {\n totalReasoning += step.usage.reasoningTokens;\n hasReasoning = true;\n }\n if (step.usage?.cachedInputTokens != null) {\n totalCachedInput += step.usage.cachedInputTokens;\n hasCachedInput = true;\n }\n }\n inputTokens = hasInput ? totalInput : undefined;\n outputTokens = hasOutput ? totalOutput : undefined;\n reasoningTokens = hasReasoning ? totalReasoning : undefined;\n cachedInputTokens = hasCachedInput ? totalCachedInput : undefined;\n }\n\n const statusType = msg.status?.type;\n const status: TelemetryData[\"status\"] =\n (statusType && AUI_STATUS_MAP[statusType]) || \"completed\";\n\n const metadata = msg.metadata?.custom as Record<string, unknown> | undefined;\n const modelId =\n msg.metadata?.modelId ??\n (typeof msg.metadata?.custom?.modelId === \"string\"\n ? msg.metadata.custom.modelId\n : undefined);\n\n const telemetrySteps: TelemetryStepData[] | undefined =\n steps && steps.length > 1\n ? steps.map((s) => ({\n ...(s.usage?.inputTokens != null\n ? { input_tokens: s.usage.inputTokens }\n : undefined),\n ...(s.usage?.outputTokens != null\n ? { output_tokens: s.usage.outputTokens }\n : undefined),\n ...(s.usage?.reasoningTokens != null\n ? { reasoning_tokens: s.usage.reasoningTokens }\n : undefined),\n ...(s.usage?.cachedInputTokens != null\n ? { cached_input_tokens: s.usage.cachedInputTokens }\n : undefined),\n }))\n : undefined;\n\n return {\n status,\n ...(toolCalls && toolCalls.length > 0 ? { toolCalls } : undefined),\n ...(steps?.length ? { totalSteps: steps.length } : undefined),\n ...(inputTokens != null ? { inputTokens } : undefined),\n ...(outputTokens != null ? { outputTokens } : undefined),\n ...(reasoningTokens != null ? { reasoningTokens } : undefined),\n ...(cachedInputTokens != null ? { cachedInputTokens } : undefined),\n ...(outputText != null ? { outputText } : undefined),\n ...(metadata ? { metadata } : undefined),\n ...(telemetrySteps ? { steps: telemetrySteps } : undefined),\n ...(modelId ? { modelId } : undefined),\n };\n}\n\ntype AiSdkV6Part = {\n type: string;\n text?: string;\n toolName?: string;\n toolCallId?: string;\n args?: unknown;\n result?: unknown;\n input?: unknown;\n output?: unknown;\n};\n\ntype AiSdkV6Message = {\n role?: string;\n parts?: readonly AiSdkV6Part[];\n metadata?: Record<string, unknown>;\n};\n\nfunction isToolCallPart(p: AiSdkV6Part): boolean {\n if (!p.toolCallId) return false;\n if (p.type === \"tool-call\" || p.type === \"dynamic-tool\") return !!p.toolName;\n return p.type.startsWith(\"tool-\") || p.type.startsWith(\"dynamic-tool-\");\n}\n\nfunction isDynamicToolPart(p: AiSdkV6Part): boolean {\n return p.type === \"dynamic-tool\" || p.type.startsWith(\"dynamic-tool-\");\n}\n\nfunction partToToolCall(p: AiSdkV6Part): TelemetryToolCall {\n const toolSource: \"mcp\" | undefined = isDynamicToolPart(p)\n ? \"mcp\"\n : undefined;\n return buildToolCall(\n p.toolName ?? p.type.slice(5),\n p.toolCallId!,\n p.args ?? p.input,\n p.result ?? p.output,\n undefined,\n toolSource,\n );\n}\n\nfunction collectAiSdkV6Parts(parts: readonly AiSdkV6Part[]): {\n textParts: string[];\n toolCalls: TelemetryToolCall[];\n stepsData: { tool_calls: TelemetryToolCall[] }[];\n} {\n const textParts: string[] = [];\n const toolCalls: TelemetryToolCall[] = [];\n const stepsData: { tool_calls: TelemetryToolCall[] }[] = [];\n let currentStepToolCalls: TelemetryToolCall[] | null = null;\n\n for (const p of parts) {\n if (p.type === \"step-start\") {\n if (currentStepToolCalls !== null) {\n stepsData.push({ tool_calls: currentStepToolCalls });\n }\n currentStepToolCalls = [];\n } else if (p.type === \"text\" && p.text) {\n textParts.push(p.text);\n } else if (isToolCallPart(p)) {\n const tc = partToToolCall(p);\n toolCalls.push(tc);\n if (currentStepToolCalls !== null) {\n currentStepToolCalls.push(tc);\n }\n }\n }\n\n if (currentStepToolCalls !== null) {\n stepsData.push({ tool_calls: currentStepToolCalls });\n }\n\n return { textParts, toolCalls, stepsData };\n}\n\nfunction extractModelId(\n metadata?: Record<string, unknown>,\n): string | undefined {\n if (!metadata) return undefined;\n if (typeof metadata.modelId === \"string\") return metadata.modelId;\n const custom = metadata.custom as Record<string, unknown> | undefined;\n if (typeof custom?.modelId === \"string\") return custom.modelId;\n return undefined;\n}\n\nfunction buildAiSdkV6Result(\n textParts: string[],\n toolCalls: TelemetryToolCall[],\n totalSteps: number,\n metadata?: Record<string, unknown>,\n stepsData?: { tool_calls: TelemetryToolCall[] }[],\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n },\n): TelemetryData {\n const hasText = textParts.length > 0;\n const outputText = hasText ? truncateStr(textParts.join(\"\")) : undefined;\n const modelId = extractModelId(metadata);\n\n const steps: TelemetryStepData[] | undefined =\n stepsData && stepsData.length > 1\n ? stepsData.map((s) => ({\n ...(s.tool_calls.length > 0\n ? { tool_calls: s.tool_calls }\n : undefined),\n }))\n : undefined;\n\n return {\n status: hasText ? \"completed\" : \"incomplete\",\n ...(toolCalls.length > 0 ? { toolCalls } : undefined),\n ...(totalSteps > 0 ? { totalSteps } : undefined),\n ...(usage?.inputTokens != null\n ? { inputTokens: usage.inputTokens }\n : undefined),\n ...(usage?.outputTokens != null\n ? { outputTokens: usage.outputTokens }\n : undefined),\n ...(usage?.reasoningTokens != null\n ? { reasoningTokens: usage.reasoningTokens }\n : undefined),\n ...(usage?.cachedInputTokens != null\n ? { cachedInputTokens: usage.cachedInputTokens }\n : undefined),\n ...(outputText != null ? { outputText } : undefined),\n ...(metadata ? { metadata } : undefined),\n ...(steps ? { steps } : undefined),\n ...(modelId ? { modelId } : undefined),\n };\n}\n\ntype UsageFields = {\n inputTokens?: number;\n outputTokens?: number;\n promptTokens?: number;\n completionTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n};\n\nfunction normalizeUsage(u: UsageFields):\n | {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n }\n | undefined {\n const input = u.inputTokens ?? u.promptTokens;\n const output = u.outputTokens ?? u.completionTokens;\n if (\n input == null &&\n output == null &&\n u.reasoningTokens == null &&\n u.cachedInputTokens == null\n ) {\n return undefined;\n }\n\n return {\n ...(input != null ? { inputTokens: input } : undefined),\n ...(output != null ? { outputTokens: output } : undefined),\n ...(u.reasoningTokens != null\n ? { reasoningTokens: u.reasoningTokens }\n : undefined),\n ...(u.cachedInputTokens != null\n ? { cachedInputTokens: u.cachedInputTokens }\n : undefined),\n };\n}\n\nfunction extractAiSdkV6Usage(metadata?: Record<string, unknown>):\n | {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n }\n | undefined {\n // Try top-level metadata.usage\n const usage = metadata?.usage as UsageFields | undefined;\n if (usage) {\n const normalized = normalizeUsage(usage);\n if (normalized) return normalized;\n }\n\n // Try aggregating from metadata.steps[].usage\n const steps = metadata?.steps as\n | readonly { usage?: UsageFields }[]\n | undefined;\n if (steps && steps.length > 0) {\n let inputTokens = 0;\n let outputTokens = 0;\n let reasoningTokens = 0;\n let cachedInputTokens = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n let hasAny = false;\n for (const s of steps) {\n if (!s.usage) continue;\n const n = normalizeUsage(s.usage);\n if (n) {\n if (n.inputTokens != null) {\n inputTokens += n.inputTokens;\n hasInput = true;\n }\n if (n.outputTokens != null) {\n outputTokens += n.outputTokens;\n hasOutput = true;\n }\n if (n.reasoningTokens != null) {\n reasoningTokens += n.reasoningTokens;\n hasReasoning = true;\n }\n if (n.cachedInputTokens != null) {\n cachedInputTokens += n.cachedInputTokens;\n hasCachedInput = true;\n }\n hasAny = true;\n }\n }\n if (hasAny) {\n return {\n ...(hasInput ? { inputTokens } : undefined),\n ...(hasOutput ? { outputTokens } : undefined),\n ...(hasReasoning ? { reasoningTokens } : undefined),\n ...(hasCachedInput ? { cachedInputTokens } : undefined),\n };\n }\n }\n\n return undefined;\n}\n\nfunction extractAiSdkV6<T>(content: T): TelemetryData | null {\n const msg = content as AiSdkV6Message;\n if (msg.role !== \"assistant\") return null;\n\n const { textParts, toolCalls, stepsData } = collectAiSdkV6Parts(\n msg.parts ?? [],\n );\n return buildAiSdkV6Result(\n textParts,\n toolCalls,\n stepsData.length,\n msg.metadata,\n stepsData,\n extractAiSdkV6Usage(msg.metadata),\n );\n}\n\nfunction aggregateAiSdkV6RunSteps<T>(stepMessages: T[]): TelemetryData | null {\n const allTextParts: string[] = [];\n const allToolCalls: TelemetryToolCall[] = [];\n const allStepsData: { tool_calls: TelemetryToolCall[] }[] = [];\n let hasAssistant = false;\n let metadata: Record<string, unknown> | undefined;\n let inputTokens = 0;\n let outputTokens = 0;\n let reasoningTokens = 0;\n let cachedInputTokens = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n\n for (const content of stepMessages) {\n const msg = content as AiSdkV6Message;\n if (msg.role !== \"assistant\") continue;\n hasAssistant = true;\n\n const { textParts, toolCalls, stepsData } = collectAiSdkV6Parts(\n msg.parts ?? [],\n );\n allTextParts.push(...textParts);\n allToolCalls.push(...toolCalls);\n allStepsData.push(...stepsData);\n if (msg.metadata) metadata = msg.metadata;\n\n const usage = extractAiSdkV6Usage(msg.metadata);\n if (usage) {\n if (usage.inputTokens != null) {\n inputTokens += usage.inputTokens;\n hasInput = true;\n }\n if (usage.outputTokens != null) {\n outputTokens += usage.outputTokens;\n hasOutput = true;\n }\n if (usage.reasoningTokens != null) {\n reasoningTokens += usage.reasoningTokens;\n hasReasoning = true;\n }\n if (usage.cachedInputTokens != null) {\n cachedInputTokens += usage.cachedInputTokens;\n hasCachedInput = true;\n }\n }\n }\n\n if (!hasAssistant) return null;\n return buildAiSdkV6Result(\n allTextParts,\n allToolCalls,\n allStepsData.length,\n metadata,\n allStepsData,\n {\n ...(hasInput ? { inputTokens } : undefined),\n ...(hasOutput ? { outputTokens } : undefined),\n ...(hasReasoning ? { reasoningTokens } : undefined),\n ...(hasCachedInput ? { cachedInputTokens } : undefined),\n },\n );\n}\n\nexport function useAssistantCloudThreadHistoryAdapter(\n cloudRef: RefObject<AssistantCloud>,\n): ThreadHistoryAdapter {\n const aui = useAui();\n // Not useEffectEvent: history adapter methods run during render (SSR load).\n const auiRef = useRef(aui);\n useEffect(() => {\n auiRef.current = aui;\n });\n const [adapter] = useState(\n () =>\n new AssistantCloudThreadHistoryAdapter(cloudRef, () => auiRef.current),\n );\n return adapter;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AssistantCloudThreadHistoryAdapter.js","names":["RefObject","useEffect","useRef","useState","GenericThreadHistoryAdapter","ThreadHistoryAdapter","MessageFormatAdapter","MessageFormatItem","MessageFormatRepository","ExportedMessageRepositoryItem","AssistantCloud","AssistantCloudRunReportToolCall","CloudMessagePersistence","createFormattedPersistence","createRunTelemetryToolCall","normalizeRunTelemetryUsage","RunTelemetryUsageInit","truncateRunTelemetryText","auiV0Decode","auiV0Encode","AssistantClient","getClientId","useAui","ThreadListItemMethods","CloudThreadListItem","Pick","globalPersistence","WeakMap","ClientId","AssistantCloudThreadHistoryAdapter","cloudRef","getAui","constructor","aui","getPersistence","threadListItem","key","has","set","current","get","_persistence","tryGetKeyedThreadListItem","live","source","undefined","id","getState","threads","item","withFormat","Record","formatAdapter","TMessage","TStorageFormat","adapter","pinCurrent","next","resolvePinned","getFormatted","getTargetFormatted","pin","append","pinned","Error","remoteId","initialize","update","localMessageId","delete","reportTelemetry","items","options","durationMs","stepTimestamps","StepTimestamp","encodedRunMessages","map","encode","_reportRunTelemetry","format","load","Promise","messages","parentId","message","encoded","telemetry","enabled","_maybeReportRun","isPersisted","filter","m","reverse","runMessages","T","extracted","extractRunTelemetry","_sendReport","content","extractTelemetry","data","TelemetryData","mergedSteps","mergeStepTimestamps","steps","initial","Parameters","this","runs","report","thread_id","status","totalSteps","total_steps","toolCalls","tool_calls","inputTokens","input_tokens","outputTokens","output_tokens","reasoningTokens","reasoning_tokens","cachedInputTokens","cached_input_tokens","duration_ms","outputText","output_text","metadata","modelId","model_id","beforeReport","catch","TelemetryStepData","start_ms","end_ms","timestamps","t","len","Math","min","length","s","i","extractAuiV0","extractAiSdkV6","aggregateAiSdkV6RunSteps","result","AUI_STATUS_MAP","error","incomplete","msg","role","type","text","toolName","toolCallId","args","argsText","usage","custom","p","textParts","join","totalInput","totalOutput","totalReasoning","totalCachedInput","hasInput","hasOutput","hasReasoning","hasCachedInput","step","statusType","telemetrySteps","AiSdkV6Part","input","output","AiSdkV6Message","parts","isToolCallPart","startsWith","isDynamicToolPart","partToToolCall","toolSource","slice","collectAiSdkV6Parts","stepsData","currentStepToolCalls","push","tc","extractModelId","buildAiSdkV6Result","hasText","extractAiSdkV6Usage","normalized","hasAny","n","stepMessages","allTextParts","allToolCalls","allStepsData","hasAssistant","useAssistantCloudThreadHistoryAdapter","auiRef"],"sources":["../../../../src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts"],"sourcesContent":["import { type RefObject, useEffect, useRef, useState } from \"react\";\nimport type {\n GenericThreadHistoryAdapter,\n ThreadHistoryAdapter,\n MessageFormatAdapter,\n MessageFormatItem,\n MessageFormatRepository,\n} from \"../../../adapters/thread-history\";\nimport type { ExportedMessageRepositoryItem } from \"../../../runtime/utils/message-repository\";\nimport {\n type AssistantCloud,\n type AssistantCloudRunReportToolCall,\n CloudMessagePersistence,\n createFormattedPersistence,\n createRunTelemetryToolCall,\n normalizeRunTelemetryUsage,\n type RunTelemetryUsageInit,\n truncateRunTelemetryText,\n} from \"assistant-cloud\";\nimport { auiV0Decode, auiV0Encode } from \"./auiV0\";\nimport { type AssistantClient, getClientId, useAui } from \"@assistant-ui/store\";\nimport type { ThreadListItemMethods } from \"../../../store/scopes/thread-list-item\";\n\ntype CloudThreadListItem = Pick<\n ThreadListItemMethods,\n \"getState\" | \"initialize\"\n>;\n\nconst globalPersistence = new WeakMap<\n getClientId.ClientId,\n CloudMessagePersistence\n>();\n\nclass AssistantCloudThreadHistoryAdapter implements ThreadHistoryAdapter {\n private cloudRef: RefObject<AssistantCloud>;\n private getAui: () => AssistantClient;\n\n constructor(\n cloudRef: RefObject<AssistantCloud>,\n getAui: () => AssistantClient,\n ) {\n this.cloudRef = cloudRef;\n this.getAui = getAui;\n }\n\n private get aui(): AssistantClient {\n return this.getAui();\n }\n\n private getPersistence(\n threadListItem: CloudThreadListItem = this.aui.threadListItem,\n ): CloudMessagePersistence {\n const key = getClientId(threadListItem);\n if (!globalPersistence.has(key)) {\n globalPersistence.set(\n key,\n new CloudMessagePersistence(() => this.cloudRef.current),\n );\n }\n return globalPersistence.get(key)!;\n }\n\n private get _persistence(): CloudMessagePersistence {\n return this.getPersistence();\n }\n\n private tryGetKeyedThreadListItem(): CloudThreadListItem | undefined {\n const live = this.aui.threadListItem;\n if (!live.source) return undefined;\n const id = live.getState().id;\n if (id === undefined) return undefined;\n return this.aui.threads.item({ id });\n }\n\n withFormat<TMessage, TStorageFormat extends Record<string, unknown>>(\n formatAdapter: MessageFormatAdapter<TMessage, TStorageFormat>,\n ): GenericThreadHistoryAdapter<TMessage> {\n const adapter = this;\n let threadListItem: CloudThreadListItem | undefined;\n const pinCurrent = () => {\n const next = adapter.tryGetKeyedThreadListItem();\n if (next) threadListItem = next;\n return threadListItem;\n };\n const resolvePinned = () => threadListItem ?? pinCurrent();\n const getFormatted = () =>\n createFormattedPersistence(adapter._persistence, formatAdapter);\n const getTargetFormatted = (item: CloudThreadListItem) =>\n createFormattedPersistence(adapter.getPersistence(item), formatAdapter);\n return {\n pin() {\n pinCurrent();\n },\n async append(item: MessageFormatItem<TMessage>) {\n const pinned = resolvePinned();\n if (!pinned) {\n throw new Error(\n \"Cannot persist cloud history without a thread list item.\",\n );\n }\n const remoteId =\n pinned.getState().remoteId ?? (await pinned.initialize()).remoteId;\n await getTargetFormatted(pinned).append(remoteId, item);\n },\n async update(item: MessageFormatItem<TMessage>, localMessageId: string) {\n const pinned = resolvePinned();\n const remoteId = pinned?.getState().remoteId;\n if (!remoteId || !pinned) return;\n await getTargetFormatted(pinned).update?.(\n remoteId,\n item,\n localMessageId,\n );\n },\n async delete() {\n throw new Error(\n \"Assistant Cloud does not support deleting thread messages yet.\",\n );\n },\n reportTelemetry(\n items: MessageFormatItem<TMessage>[],\n options?: {\n durationMs?: number;\n stepTimestamps?: StepTimestamp[];\n },\n ) {\n const encodedRunMessages = items.map((item) =>\n formatAdapter.encode(item),\n );\n adapter._reportRunTelemetry(\n formatAdapter.format,\n encodedRunMessages,\n options,\n resolvePinned(),\n );\n },\n async load(): Promise<MessageFormatRepository<TMessage>> {\n pinCurrent();\n const live = adapter.aui.threadListItem;\n const remoteId = live.source ? live.getState().remoteId : undefined;\n if (!remoteId) return { messages: [] };\n return getFormatted().load(remoteId);\n },\n };\n }\n\n async append({ parentId, message }: ExportedMessageRepositoryItem) {\n const { remoteId } = await this.aui.threadListItem.initialize();\n const encoded = auiV0Encode(message);\n await this._persistence.append(\n remoteId,\n message.id,\n parentId,\n \"aui/v0\",\n encoded,\n );\n\n if (this.cloudRef.current.telemetry.enabled) {\n this._maybeReportRun(remoteId, \"aui/v0\", encoded);\n }\n }\n\n async update(item: ExportedMessageRepositoryItem) {\n if (!this._persistence.isPersisted(item.message.id)) {\n return this.append(item);\n }\n const { message } = item;\n const remoteId = this.aui.threadListItem.getState().remoteId;\n if (!remoteId) return;\n const encoded = auiV0Encode(message);\n await this._persistence.update(remoteId, message.id, \"aui/v0\", encoded);\n\n if (this.cloudRef.current.telemetry.enabled) {\n this._maybeReportRun(remoteId, \"aui/v0\", encoded);\n }\n }\n\n async delete() {\n throw new Error(\n \"Assistant Cloud does not support deleting thread messages yet.\",\n );\n }\n\n async load() {\n const remoteId = this.aui.threadListItem.getState().remoteId;\n if (!remoteId) return { messages: [] };\n const messages = await this._persistence.load(remoteId, \"aui/v0\");\n return {\n messages: messages\n .filter(\n (m): m is typeof m & { format: \"aui/v0\" } => m.format === \"aui/v0\",\n )\n .map(auiV0Decode)\n .reverse(),\n };\n }\n\n private _reportRunTelemetry<T>(\n format: string,\n runMessages: T[],\n options?: {\n durationMs?: number;\n stepTimestamps?: StepTimestamp[];\n },\n threadListItem?: CloudThreadListItem,\n ) {\n if (!this.cloudRef.current.telemetry.enabled) return;\n\n const remoteId = (threadListItem ?? this.aui.threadListItem).getState()\n .remoteId;\n if (!remoteId) return;\n\n const extracted = extractRunTelemetry(format, runMessages);\n if (!extracted) return;\n\n this._sendReport(\n remoteId,\n extracted,\n options?.durationMs,\n options?.stepTimestamps,\n );\n }\n\n private _maybeReportRun<T>(remoteId: string, format: string, content: T) {\n const extracted = extractTelemetry(format, content);\n if (!extracted) return;\n\n this._sendReport(remoteId, extracted);\n }\n\n private _sendReport(\n remoteId: string,\n data: TelemetryData,\n durationMs?: number,\n stepTimestamps?: StepTimestamp[],\n ) {\n const mergedSteps = mergeStepTimestamps(data.steps, stepTimestamps);\n // Keep in sync with assistant-cloud createRunSchema\n // (apps/aui-cloud-api/src/endpoints/runs/create.ts).\n const initial: Parameters<typeof this.cloudRef.current.runs.report>[0] = {\n thread_id: remoteId,\n status: data.status,\n ...(data.totalSteps != null\n ? { total_steps: data.totalSteps }\n : undefined),\n ...(data.toolCalls ? { tool_calls: data.toolCalls } : undefined),\n ...(mergedSteps ? { steps: mergedSteps } : undefined),\n ...(data.inputTokens != null\n ? { input_tokens: data.inputTokens }\n : undefined),\n ...(data.outputTokens != null\n ? { output_tokens: data.outputTokens }\n : undefined),\n ...(data.reasoningTokens != null\n ? { reasoning_tokens: data.reasoningTokens }\n : undefined),\n ...(data.cachedInputTokens != null\n ? { cached_input_tokens: data.cachedInputTokens }\n : undefined),\n ...(durationMs != null ? { duration_ms: durationMs } : undefined),\n ...(data.outputText != null\n ? { output_text: data.outputText }\n : undefined),\n ...(data.metadata ? { metadata: data.metadata } : undefined),\n ...(data.modelId ? { model_id: data.modelId } : undefined),\n };\n\n const { beforeReport } = this.cloudRef.current.telemetry;\n const report = beforeReport ? beforeReport(initial) : initial;\n if (!report) return;\n\n this.cloudRef.current.runs.report(report).catch(() => {});\n }\n}\n\ntype TelemetryStepData = {\n input_tokens?: number;\n output_tokens?: number;\n reasoning_tokens?: number;\n cached_input_tokens?: number;\n tool_calls?: AssistantCloudRunReportToolCall[];\n start_ms?: number;\n end_ms?: number;\n};\n\ntype StepTimestamp = { start_ms: number; end_ms: number };\n\nfunction mergeStepTimestamps(\n steps: TelemetryStepData[] | undefined,\n timestamps: StepTimestamp[] | undefined,\n): TelemetryStepData[] | undefined {\n if (!timestamps) return steps;\n if (!steps) return timestamps.map((t) => ({ ...t }));\n\n const len = Math.min(steps.length, timestamps.length);\n return steps.map((s, i) => ({\n ...s,\n ...(i < len ? timestamps[i] : undefined),\n }));\n}\n\ntype TelemetryData = {\n status: \"completed\" | \"incomplete\" | \"error\";\n toolCalls?: AssistantCloudRunReportToolCall[];\n totalSteps?: number;\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n outputText?: string;\n metadata?: Record<string, unknown>;\n steps?: TelemetryStepData[];\n modelId?: string;\n};\n\nfunction extractTelemetry<T>(format: string, content: T): TelemetryData | null {\n switch (format) {\n case \"aui/v0\":\n return extractAuiV0(content);\n case \"ai-sdk/v6\":\n return extractAiSdkV6(content);\n default:\n return null;\n }\n}\n\nfunction extractRunTelemetry<T>(\n format: string,\n runMessages: T[],\n): TelemetryData | null {\n if (format === \"ai-sdk/v6\") {\n return aggregateAiSdkV6RunSteps(runMessages);\n }\n for (let i = runMessages.length - 1; i >= 0; i--) {\n const result = extractTelemetry(format, runMessages[i]!);\n if (result) return result;\n }\n return null;\n}\n\nconst AUI_STATUS_MAP: Record<string, TelemetryData[\"status\"]> = {\n error: \"error\",\n incomplete: \"incomplete\",\n};\n\nexport function extractAuiV0<T>(content: T): TelemetryData | null {\n const msg = content as {\n role?: string;\n status?: { type: string };\n content?: readonly {\n type: string;\n text?: string;\n toolName?: string;\n toolCallId?: string;\n args?: unknown;\n argsText?: string;\n result?: unknown;\n }[];\n metadata?: {\n modelId?: string;\n steps?: readonly {\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n };\n }[];\n custom?: Record<string, unknown> & { modelId?: string };\n };\n };\n\n if (msg.role !== \"assistant\") return null;\n // A paused (requires-action) write is not a finished run; reporting it would\n // mislabel it \"completed\" and double-count steps once the terminal write reports.\n if (msg.status?.type === \"requires-action\") return null;\n\n const toolCalls = msg.content\n ?.filter((p) => p.type === \"tool-call\" && p.toolName && p.toolCallId)\n .map((p) =>\n createRunTelemetryToolCall({\n toolName: p.toolName!,\n toolCallId: p.toolCallId!,\n args: p.args,\n result: p.result,\n argsText: p.argsText,\n }),\n );\n\n const textParts = msg.content?.filter((p) => p.type === \"text\" && p.text);\n const outputText =\n textParts && textParts.length > 0\n ? truncateRunTelemetryText(textParts.map((p) => p.text).join(\"\"))\n : undefined;\n\n const steps = msg.metadata?.steps;\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let reasoningTokens: number | undefined;\n let cachedInputTokens: number | undefined;\n if (steps && steps.length > 0) {\n let totalInput = 0;\n let totalOutput = 0;\n let totalReasoning = 0;\n let totalCachedInput = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n for (const step of steps) {\n if (step.usage?.inputTokens != null) {\n totalInput += step.usage.inputTokens;\n hasInput = true;\n }\n if (step.usage?.outputTokens != null) {\n totalOutput += step.usage.outputTokens;\n hasOutput = true;\n }\n if (step.usage?.reasoningTokens != null) {\n totalReasoning += step.usage.reasoningTokens;\n hasReasoning = true;\n }\n if (step.usage?.cachedInputTokens != null) {\n totalCachedInput += step.usage.cachedInputTokens;\n hasCachedInput = true;\n }\n }\n inputTokens = hasInput ? totalInput : undefined;\n outputTokens = hasOutput ? totalOutput : undefined;\n reasoningTokens = hasReasoning ? totalReasoning : undefined;\n cachedInputTokens = hasCachedInput ? totalCachedInput : undefined;\n }\n\n const statusType = msg.status?.type;\n const status: TelemetryData[\"status\"] =\n (statusType && AUI_STATUS_MAP[statusType]) || \"completed\";\n\n const metadata = msg.metadata?.custom as Record<string, unknown> | undefined;\n const modelId =\n msg.metadata?.modelId ??\n (typeof msg.metadata?.custom?.modelId === \"string\"\n ? msg.metadata.custom.modelId\n : undefined);\n\n const telemetrySteps: TelemetryStepData[] | undefined =\n steps && steps.length > 1\n ? steps.map((s) => ({\n ...(s.usage?.inputTokens != null\n ? { input_tokens: s.usage.inputTokens }\n : undefined),\n ...(s.usage?.outputTokens != null\n ? { output_tokens: s.usage.outputTokens }\n : undefined),\n ...(s.usage?.reasoningTokens != null\n ? { reasoning_tokens: s.usage.reasoningTokens }\n : undefined),\n ...(s.usage?.cachedInputTokens != null\n ? { cached_input_tokens: s.usage.cachedInputTokens }\n : undefined),\n }))\n : undefined;\n\n return {\n status,\n ...(toolCalls && toolCalls.length > 0 ? { toolCalls } : undefined),\n ...(steps?.length ? { totalSteps: steps.length } : undefined),\n ...(inputTokens != null ? { inputTokens } : undefined),\n ...(outputTokens != null ? { outputTokens } : undefined),\n ...(reasoningTokens != null ? { reasoningTokens } : undefined),\n ...(cachedInputTokens != null ? { cachedInputTokens } : undefined),\n ...(outputText != null ? { outputText } : undefined),\n ...(metadata ? { metadata } : undefined),\n ...(telemetrySteps ? { steps: telemetrySteps } : undefined),\n ...(modelId ? { modelId } : undefined),\n };\n}\n\ntype AiSdkV6Part = {\n type: string;\n text?: string;\n toolName?: string;\n toolCallId?: string;\n args?: unknown;\n result?: unknown;\n input?: unknown;\n output?: unknown;\n};\n\ntype AiSdkV6Message = {\n role?: string;\n parts?: readonly AiSdkV6Part[];\n metadata?: Record<string, unknown>;\n};\n\nfunction isToolCallPart(p: AiSdkV6Part): boolean {\n if (!p.toolCallId) return false;\n if (p.type === \"tool-call\" || p.type === \"dynamic-tool\") return !!p.toolName;\n return p.type.startsWith(\"tool-\") || p.type.startsWith(\"dynamic-tool-\");\n}\n\nfunction isDynamicToolPart(p: AiSdkV6Part): boolean {\n return p.type === \"dynamic-tool\" || p.type.startsWith(\"dynamic-tool-\");\n}\n\nfunction partToToolCall(p: AiSdkV6Part): AssistantCloudRunReportToolCall {\n const toolSource: \"mcp\" | \"frontend\" = isDynamicToolPart(p)\n ? \"mcp\"\n : \"frontend\";\n return createRunTelemetryToolCall({\n toolName: p.toolName ?? p.type.slice(5),\n toolCallId: p.toolCallId!,\n args: p.args ?? p.input,\n result: p.result ?? p.output,\n toolSource,\n });\n}\n\nfunction collectAiSdkV6Parts(parts: readonly AiSdkV6Part[]): {\n textParts: string[];\n toolCalls: AssistantCloudRunReportToolCall[];\n stepsData: { tool_calls: AssistantCloudRunReportToolCall[] }[];\n} {\n const textParts: string[] = [];\n const toolCalls: AssistantCloudRunReportToolCall[] = [];\n const stepsData: { tool_calls: AssistantCloudRunReportToolCall[] }[] = [];\n let currentStepToolCalls: AssistantCloudRunReportToolCall[] | null = null;\n\n for (const p of parts) {\n if (p.type === \"step-start\") {\n if (currentStepToolCalls !== null) {\n stepsData.push({ tool_calls: currentStepToolCalls });\n }\n currentStepToolCalls = [];\n } else if (p.type === \"text\" && p.text) {\n textParts.push(p.text);\n } else if (isToolCallPart(p)) {\n const tc = partToToolCall(p);\n toolCalls.push(tc);\n if (currentStepToolCalls !== null) {\n currentStepToolCalls.push(tc);\n }\n }\n }\n\n if (currentStepToolCalls !== null) {\n stepsData.push({ tool_calls: currentStepToolCalls });\n }\n\n return { textParts, toolCalls, stepsData };\n}\n\nfunction extractModelId(\n metadata?: Record<string, unknown>,\n): string | undefined {\n if (!metadata) return undefined;\n if (typeof metadata.modelId === \"string\") return metadata.modelId;\n const custom = metadata.custom as Record<string, unknown> | undefined;\n if (typeof custom?.modelId === \"string\") return custom.modelId;\n return undefined;\n}\n\nfunction buildAiSdkV6Result(\n textParts: string[],\n toolCalls: AssistantCloudRunReportToolCall[],\n totalSteps: number,\n metadata?: Record<string, unknown>,\n stepsData?: { tool_calls: AssistantCloudRunReportToolCall[] }[],\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n },\n): TelemetryData {\n const hasText = textParts.length > 0;\n const outputText = hasText\n ? truncateRunTelemetryText(textParts.join(\"\"))\n : undefined;\n const modelId = extractModelId(metadata);\n\n const steps: TelemetryStepData[] | undefined =\n stepsData && stepsData.length > 1\n ? stepsData.map((s) => ({\n ...(s.tool_calls.length > 0\n ? { tool_calls: s.tool_calls }\n : undefined),\n }))\n : undefined;\n\n return {\n status: hasText ? \"completed\" : \"incomplete\",\n ...(toolCalls.length > 0 ? { toolCalls } : undefined),\n ...(totalSteps > 0 ? { totalSteps } : undefined),\n ...(usage?.inputTokens != null\n ? { inputTokens: usage.inputTokens }\n : undefined),\n ...(usage?.outputTokens != null\n ? { outputTokens: usage.outputTokens }\n : undefined),\n ...(usage?.reasoningTokens != null\n ? { reasoningTokens: usage.reasoningTokens }\n : undefined),\n ...(usage?.cachedInputTokens != null\n ? { cachedInputTokens: usage.cachedInputTokens }\n : undefined),\n ...(outputText != null ? { outputText } : undefined),\n ...(metadata ? { metadata } : undefined),\n ...(steps ? { steps } : undefined),\n ...(modelId ? { modelId } : undefined),\n };\n}\n\nfunction extractAiSdkV6Usage(metadata?: Record<string, unknown>):\n | {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n }\n | undefined {\n // Try top-level metadata.usage\n const usage = metadata?.usage as RunTelemetryUsageInit | undefined;\n if (usage) {\n const normalized = normalizeRunTelemetryUsage(usage);\n if (normalized) return normalized;\n }\n\n // Try aggregating from metadata.steps[].usage\n const steps = metadata?.steps as\n | readonly { usage?: RunTelemetryUsageInit }[]\n | undefined;\n if (steps && steps.length > 0) {\n let inputTokens = 0;\n let outputTokens = 0;\n let reasoningTokens = 0;\n let cachedInputTokens = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n let hasAny = false;\n for (const s of steps) {\n if (!s.usage) continue;\n const n = normalizeRunTelemetryUsage(s.usage);\n if (n) {\n if (n.inputTokens != null) {\n inputTokens += n.inputTokens;\n hasInput = true;\n }\n if (n.outputTokens != null) {\n outputTokens += n.outputTokens;\n hasOutput = true;\n }\n if (n.reasoningTokens != null) {\n reasoningTokens += n.reasoningTokens;\n hasReasoning = true;\n }\n if (n.cachedInputTokens != null) {\n cachedInputTokens += n.cachedInputTokens;\n hasCachedInput = true;\n }\n hasAny = true;\n }\n }\n if (hasAny) {\n return {\n ...(hasInput ? { inputTokens } : undefined),\n ...(hasOutput ? { outputTokens } : undefined),\n ...(hasReasoning ? { reasoningTokens } : undefined),\n ...(hasCachedInput ? { cachedInputTokens } : undefined),\n };\n }\n }\n\n return undefined;\n}\n\nfunction extractAiSdkV6<T>(content: T): TelemetryData | null {\n const msg = content as AiSdkV6Message;\n if (msg.role !== \"assistant\") return null;\n\n const { textParts, toolCalls, stepsData } = collectAiSdkV6Parts(\n msg.parts ?? [],\n );\n return buildAiSdkV6Result(\n textParts,\n toolCalls,\n stepsData.length,\n msg.metadata,\n stepsData,\n extractAiSdkV6Usage(msg.metadata),\n );\n}\n\nfunction aggregateAiSdkV6RunSteps<T>(stepMessages: T[]): TelemetryData | null {\n const allTextParts: string[] = [];\n const allToolCalls: AssistantCloudRunReportToolCall[] = [];\n const allStepsData: { tool_calls: AssistantCloudRunReportToolCall[] }[] = [];\n let hasAssistant = false;\n let metadata: Record<string, unknown> | undefined;\n let inputTokens = 0;\n let outputTokens = 0;\n let reasoningTokens = 0;\n let cachedInputTokens = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n\n for (const content of stepMessages) {\n const msg = content as AiSdkV6Message;\n if (msg.role !== \"assistant\") continue;\n hasAssistant = true;\n\n const { textParts, toolCalls, stepsData } = collectAiSdkV6Parts(\n msg.parts ?? [],\n );\n allTextParts.push(...textParts);\n allToolCalls.push(...toolCalls);\n allStepsData.push(...stepsData);\n if (msg.metadata) metadata = msg.metadata;\n\n const usage = extractAiSdkV6Usage(msg.metadata);\n if (usage) {\n if (usage.inputTokens != null) {\n inputTokens += usage.inputTokens;\n hasInput = true;\n }\n if (usage.outputTokens != null) {\n outputTokens += usage.outputTokens;\n hasOutput = true;\n }\n if (usage.reasoningTokens != null) {\n reasoningTokens += usage.reasoningTokens;\n hasReasoning = true;\n }\n if (usage.cachedInputTokens != null) {\n cachedInputTokens += usage.cachedInputTokens;\n hasCachedInput = true;\n }\n }\n }\n\n if (!hasAssistant) return null;\n return buildAiSdkV6Result(\n allTextParts,\n allToolCalls,\n allStepsData.length,\n metadata,\n allStepsData,\n {\n ...(hasInput ? { inputTokens } : undefined),\n ...(hasOutput ? { outputTokens } : undefined),\n ...(hasReasoning ? { reasoningTokens } : undefined),\n ...(hasCachedInput ? { cachedInputTokens } : undefined),\n },\n );\n}\n\nexport function useAssistantCloudThreadHistoryAdapter(\n cloudRef: RefObject<AssistantCloud>,\n): ThreadHistoryAdapter {\n const aui = useAui();\n // Not useEffectEvent: history adapter methods run during render (SSR load).\n const auiRef = useRef(aui);\n useEffect(() => {\n auiRef.current = aui;\n });\n const [adapter] = useState(\n () =>\n new AssistantCloudThreadHistoryAdapter(cloudRef, () => auiRef.current),\n );\n return adapter;\n}\n"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ //#region src/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.d.ts
2
+ type ThreadData = {
3
+ externalId: string | undefined;
4
+ };
5
+ type ThreadListItem = {
6
+ source: unknown;
7
+ initialize: () => Promise<ThreadData>;
8
+ };
9
+ declare const createCloudThreadListAdapterCreateFallback: (create: (() => Promise<ThreadData>) | undefined, threadListItem: ThreadListItem) => (() => Promise<ThreadData>);
10
+ //#endregion
11
+ export { createCloudThreadListAdapterCreateFallback };
12
+ //# sourceMappingURL=createCloudThreadListAdapterCreateFallback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createCloudThreadListAdapterCreateFallback.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.ts"],"mappings":";KAAK;EACH;;KAGG;EACH;EACA,kBAAkB,QAAQ;;cAGf,6CACX,eAAe,QAAQ,0BACvB,gBAAgB,0BACR,QAAQ"}
@@ -0,0 +1,10 @@
1
+ //#region src/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.ts
2
+ const createCloudThreadListAdapterCreateFallback = (create, threadListItem) => async function createThread() {
3
+ if (create) return create();
4
+ if (threadListItem.source) return threadListItem.initialize();
5
+ return { externalId: void 0 };
6
+ };
7
+ //#endregion
8
+ export { createCloudThreadListAdapterCreateFallback };
9
+
10
+ //# sourceMappingURL=createCloudThreadListAdapterCreateFallback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createCloudThreadListAdapterCreateFallback.js","names":["ThreadData","externalId","ThreadListItem","source","initialize","Promise","createCloudThreadListAdapterCreateFallback","create","threadListItem","createThread","undefined"],"sources":["../../../../src/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.ts"],"sourcesContent":["type ThreadData = {\n externalId: string | undefined;\n};\n\ntype ThreadListItem = {\n source: unknown;\n initialize: () => Promise<ThreadData>;\n};\n\nexport const createCloudThreadListAdapterCreateFallback = (\n create: (() => Promise<ThreadData>) | undefined,\n threadListItem: ThreadListItem,\n): (() => Promise<ThreadData>) =>\n async function createThread() {\n if (create) return create();\n if (threadListItem.source) return threadListItem.initialize();\n return { externalId: undefined };\n };\n"],"mappings":";AASA,MAAaM,8CACXC,QACAC,mBAEA,eAAeC,eAAe;CAC5B,IAAIF,QAAQ,OAAOA,OAAO;CAC1B,IAAIC,eAAeL,QAAQ,OAAOK,eAAeJ,WAAW;CAC5D,OAAO,EAAEH,YAAYS,KAAAA,EAAU;AACjC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useCloudThreadListRuntime.js","names":["c","_c","AssistantCloud","AssistantRuntime","useRemoteThreadListRuntime","useCloudThreadListAdapter","ThreadData","externalId","CloudThreadListAdapter","cloud","runtimeHook","create","Promise","delete","threadId","useCloudThreadListRuntime","t0","$","adapterOptions","adapter","t1","allowNesting"],"sources":["../../../../src/react/runtimes/cloud/useCloudThreadListRuntime.ts"],"sourcesContent":["\"use client\";\n\nimport type { AssistantCloud } from \"assistant-cloud\";\nimport type { AssistantRuntime } from \"../../../runtime/api/assistant-runtime\";\nimport { useRemoteThreadListRuntime } from \"../useRemoteThreadListRuntime\";\nimport { useCloudThreadListAdapter } from \"./useCloudThreadListAdapter\";\n\ntype ThreadData = {\n externalId: string;\n};\n\ntype CloudThreadListAdapter = {\n cloud: AssistantCloud;\n\n runtimeHook: () => AssistantRuntime;\n\n create?(): Promise<ThreadData>;\n delete?(threadId: string): Promise<void>;\n};\n\nexport function useCloudThreadListRuntime({\n runtimeHook,\n ...adapterOptions\n}: CloudThreadListAdapter) {\n const adapter = useCloudThreadListAdapter(adapterOptions);\n return useRemoteThreadListRuntime({\n runtimeHook,\n adapter,\n allowNesting: true,\n });\n}\n"],"mappings":";;;;;AAoBA,SAAOe,0BAAAC,IAAA;CAAA,MAAAC,IAAAhB,EAAA,CAAA;CAAA,IAAAiB;CAAA,IAAAR;CAAA,IAAAO,EAAA,OAAAD,IAAA;EAAmC,CAAA,CAAAN,gBAAAQ,kBAAAF;EAGjBC,EAAA,KAAAD;EAAAC,EAAA,KAAAC;EAAAD,EAAA,KAAAP;CAAA,OAAA;EAAAQ,iBAAAD,EAAA;EAAAP,cAAAO,EAAA;CAAA;CACvB,MAAAE,UAAgBd,0BAA0Ba,cAAc;CAAE,IAAAE;CAAA,IAAAH,EAAA,OAAAE,WAAAF,EAAA,OAAAP,aAAA;EACxBU,KAAA;GAAAV;GAAAS;GAAAE,cAGlB;EAChB;EAACJ,EAAA,KAAAE;EAAAF,EAAA,KAAAP;EAAAO,EAAA,KAAAG;CAAA,OAAAA,KAAAH,EAAA;CAAA,OAJMb,2BAA2BgB,EAIjC;AAAC"}
1
+ {"version":3,"file":"useCloudThreadListRuntime.js","names":["c","_c","AssistantCloud","AssistantRuntime","useRemoteThreadListRuntime","useCloudThreadListAdapter","ThreadData","externalId","CloudThreadListAdapter","cloud","runtimeHook","create","Promise","delete","threadId","useCloudThreadListRuntime","t0","$","adapterOptions","adapter","t1","allowNesting"],"sources":["../../../../src/react/runtimes/cloud/useCloudThreadListRuntime.ts"],"sourcesContent":["\"use client\";\n\nimport type { AssistantCloud } from \"assistant-cloud\";\nimport type { AssistantRuntime } from \"../../../runtime/api/assistant-runtime\";\nimport { useRemoteThreadListRuntime } from \"../useRemoteThreadListRuntime\";\nimport { useCloudThreadListAdapter } from \"./useCloudThreadListAdapter\";\n\ntype ThreadData = {\n externalId: string;\n};\n\ntype CloudThreadListAdapter = {\n cloud: AssistantCloud;\n\n runtimeHook: () => AssistantRuntime;\n\n create?(): Promise<ThreadData>;\n delete?(threadId: string): Promise<void>;\n};\n\nexport function useCloudThreadListRuntime({\n runtimeHook,\n ...adapterOptions\n}: CloudThreadListAdapter) {\n const adapter = useCloudThreadListAdapter(adapterOptions);\n return useRemoteThreadListRuntime({\n runtimeHook,\n adapter,\n allowNesting: true,\n });\n}\n"],"mappings":";;;;;AAoBA,SAAOe,0BAAAC,IAAA;CAAA,MAAAC,IAAAhB,EAAA,CAAA;CAAA,IAAAiB;CAAA,IAAAR;CAAA,IAAAO,EAAA,OAAAD,IAAA;EAAmC,CAAA,CAAAN,aAAA,GAAAQ,kBAAAF;EAGjBC,EAAA,KAAAD;EAAAC,EAAA,KAAAC;EAAAD,EAAA,KAAAP;CAAA,OAAA;EAAAQ,iBAAAD,EAAA;EAAAP,cAAAO,EAAA;CAAA;CACvB,MAAAE,UAAgBd,0BAA0Ba,cAAc;CAAE,IAAAE;CAAA,IAAAH,EAAA,OAAAE,WAAAF,EAAA,OAAAP,aAAA;EACxBU,KAAA;GAAAV;GAAAS;GAAAE,cAGlB;EAChB;EAACJ,EAAA,KAAAE;EAAAF,EAAA,KAAAP;EAAAO,EAAA,KAAAG;CAAA,OAAAA,KAAAH,EAAA;CAAA,OAJMb,2BAA2BgB,EAIjC;AAAC"}
@@ -1,5 +1,6 @@
1
1
  import { ThreadMessage } from "../../types/message.js";
2
- import { JoinStrategy, useExternalMessageConverter } from "./external-message-converter.js";
2
+ import { JoinStrategy } from "../../runtime/utils/external-message-conversion.js";
3
+ import { useExternalMessageConverter } from "./external-message-converter.js";
3
4
  import { ThreadState } from "../../runtime/api/thread-runtime.js";
4
5
  //#region src/react/runtimes/createMessageConverter.d.ts
5
6
  declare const createMessageConverter: <T extends object>(callback: useExternalMessageConverter.Callback<T>) => {
@@ -1 +1 @@
1
- {"version":3,"file":"createMessageConverter.d.ts","names":[],"sources":["../../../src/react/runtimes/createMessageConverter.ts"],"mappings":";;;;cAWa,yBAA0B,kBACrC,UAAU,4BAA4B,SAAS;EAQ1C,sBAAA,UAAA,WAAA,cAAA;IACD,UAAU;IACV;IACA,eAAe;IACf,WAAW,4BAA4B;QACxC;EAUW,mBAAA,UAAA,KAAG,qBAAA,WAEH,4BAA4B,aAAQ;EAKvC,qBAAA,OAAA,cAAc,gBAAgB;EAO9B,oBAAA,OAAA,cAAc,gBAAgB"}
1
+ {"version":3,"file":"createMessageConverter.d.ts","names":[],"sources":["../../../src/react/runtimes/createMessageConverter.ts"],"mappings":";;;;;cAWa,yBAA0B,kBACrC,UAAU,4BAA4B,SAAS;EAQ1C,sBAAA,UAAA,WAAA,cAAA;IACD,UAAU;IACV;IACA,eAAe;IACf,WAAW,4BAA4B;QACxC;EAUW,mBAAA,UAAA,KAAG,qBAAA,WAEH,4BAA4B,aAAQ;EAKvC,qBAAA,OAAA,cAAc,gBAAgB;EAO9B,oBAAA,OAAA,cAAc,gBAAgB"}
@@ -1,29 +1,10 @@
1
- import { MessageTiming, ThreadMessage } from "../../types/message.js";
2
- import { ThreadMessageLike } from "../../runtime/utils/thread-message-like.js";
3
- import { ToolExecutionStatus } from "../../runtimes/tool-invocations/ToolInvocationTracker.js";
4
- import { ReadonlyJSONValue } from "assistant-stream/utils";
1
+ import { ThreadMessage } from "../../types/message.js";
2
+ import { ExternalMessageConverterCallback, ExternalMessageConverterMessage, ExternalMessageConverterMetadata, JoinStrategy } from "../../runtime/utils/external-message-conversion.js";
5
3
  //#region src/react/runtimes/external-message-converter.d.ts
6
- type JoinStrategy = "concat-content" | "none";
7
4
  declare namespace useExternalMessageConverter {
8
- type Message = (ThreadMessageLike & {
9
- readonly convertConfig?: {
10
- readonly joinStrategy?: JoinStrategy;
11
- };
12
- }) | {
13
- role: "tool";
14
- toolCallId: string;
15
- toolName?: string | undefined;
16
- result: any;
17
- artifact?: any;
18
- isError?: boolean;
19
- messages?: readonly ThreadMessage[];
20
- };
21
- type Metadata = {
22
- readonly toolStatuses?: Record<string, ToolExecutionStatus>;
23
- readonly error?: ReadonlyJSONValue;
24
- readonly messageTiming?: Record<string, MessageTiming>;
25
- };
26
- type Callback<T> = (message: T, metadata: Metadata) => Message | Message[];
5
+ type Message = ExternalMessageConverterMessage;
6
+ type Metadata = ExternalMessageConverterMetadata;
7
+ type Callback<T> = ExternalMessageConverterCallback<T>;
27
8
  }
28
9
  declare const convertExternalMessages: <T extends WeakKey>(messages: T[], callback: useExternalMessageConverter.Callback<T>, isRunning: boolean, metadata: useExternalMessageConverter.Metadata) => ThreadMessage[];
29
10
  declare const useExternalMessageConverter: <T extends WeakKey>({ callback, messages, isRunning, joinStrategy, metadata }: {
@@ -34,5 +15,5 @@ declare const useExternalMessageConverter: <T extends WeakKey>({ callback, messa
34
15
  metadata?: useExternalMessageConverter.Metadata | undefined;
35
16
  }) => ThreadMessage[];
36
17
  //#endregion
37
- export { JoinStrategy, convertExternalMessages, useExternalMessageConverter };
18
+ export { type JoinStrategy, convertExternalMessages, useExternalMessageConverter };
38
19
  //# sourceMappingURL=external-message-converter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"external-message-converter.d.ts","names":[],"sources":["../../../src/react/runtimes/external-message-converter.ts"],"mappings":";;;;;KAwBY;kBAoBK;OACH,WACP;aACU;eACE,eAAe;;;IAI1B;IACA;IACA;IACA;IACA;IACA;IACA,oBAAoB;;OAGd;aACD,eAAe,eAAe;aAC9B,QAAQ;aACR,gBAAgB,eAAe;;OAG9B,SAAS,MACnB,SAAS,GACT,UAAU,aACP,UAAU;;cAsTJ,0BAA2B,UAAU,SAChD,UAAU,KACV,UAAU,4BAA4B,SAAS,IAC/C,oBACA,UAAU,4BAA4B,aAAQ;cA+CnC,8BAA+B,UAAU,WAAS,UAAA,UAAA,WAAA,cAAA;EAO7D,UAAU,4BAA4B,SAAS;EAC/C,UAAU;EACV;EACA,eAAe;EACf,WAAW,4BAA4B;MACxC"}
1
+ {"version":3,"file":"external-message-converter.d.ts","names":[],"sources":["../../../src/react/runtimes/external-message-converter.ts"],"mappings":";;;kBA2BiB;OACH,UAAU;OACV,WAAW;OACX,SAAS,KAAK,iCAAiC;;cAGhD,0BAA0B,UAAU,SAC/C,UAAU,KACV,UAAU,4BAA4B,SAAS,IAC/C,oBACA,UAAU,4BAA4B,aACnC;cAOQ,8BAA+B,UAAU,WAAS,UAAA,UAAA,WAAA,cAAA;EAO7D,UAAU,4BAA4B,SAAS;EAC/C,UAAU;EACV;EACA,eAAe;EACf,WAAW,4BAA4B;MACxC"}
@@ -1,198 +1,14 @@
1
1
  "use client";
2
- import { generateErrorMessageId } from "../../utils/id.js";
3
- import { fromThreadMessageLike } from "../../runtime/utils/thread-message-like.js";
4
- import { bindExternalStoreMessage, getExternalStoreMessages, symbolInnerMessage } from "../../runtime/utils/external-store-message.js";
5
- import { getAutoStatus, isAutoStatus } from "../../runtime/utils/auto-status.js";
2
+ import { bindExternalStoreMessage } from "../../runtime/utils/external-store-message.js";
6
3
  import { ThreadMessageConverter } from "../../runtimes/external-store/thread-message-converter.js";
4
+ import { chunkExternalMessages, completeExternalMessageConversion, convertExternalMessageCallback, convertExternalMessageChunk, convertExternalMessages as convertExternalMessages$1, shallowArrayEqual } from "../../runtime/utils/external-message-conversion.js";
7
5
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
8
6
  import { useState } from "@assistant-ui/tap/react-shim";
9
7
  //#region src/react/runtimes/external-message-converter.ts
10
- const isPendingToolCall = (c) => c.type === "tool-call" && c.result === void 0;
11
- const isInterruptedToolCall = (c) => {
12
- if (c.type !== "tool-call" || c.result !== void 0) return false;
13
- return c.interrupt != null || c.approval != null && c.approval.approved === void 0 && c.approval.resolution === void 0;
14
- };
15
- const stringifyForError = (value) => {
16
- let text;
17
- try {
18
- text = value instanceof Error ? String(value) : JSON.stringify(value);
19
- } catch {}
20
- text ??= String(value);
21
- return text.length > 200 ? `${text.slice(0, 200)}…` : text;
22
- };
23
- const toCallbackOutputs = (output, input) => {
24
- const outputs = Array.isArray(output) ? output : [output];
25
- for (const o of outputs) if (!(typeof o === "object" && o !== null && (o.role === "tool" || (o.role === "assistant" || o.role === "user" || o.role === "system") && (typeof o.content === "string" || Array.isArray(o.content))))) throw new Error(`External message converter: the converter callback returned an invalid message (${stringifyForError(o)}) for input ${stringifyForError(input)}. Return an empty array to skip a message.`);
26
- return outputs;
27
- };
28
- const mergeInnerMessages = (existing, incoming) => ({ [symbolInnerMessage]: [...existing[symbolInnerMessage] ?? [], ...incoming[symbolInnerMessage] ?? []] });
29
- const joinExternalMessages = (messages) => {
30
- const assistantMessage = {
31
- role: "assistant",
32
- content: []
33
- };
34
- for (const output of messages) if (output.role === "tool") {
35
- const toolCallIdx = assistantMessage.content.findIndex((c) => c.type === "tool-call" && c.toolCallId === output.toolCallId);
36
- if (toolCallIdx !== -1) {
37
- const toolCall = assistantMessage.content[toolCallIdx];
38
- if (output.toolName != null) {
39
- if (toolCall.toolName !== output.toolName) throw new Error(`Tool call name ${output.toolCallId} ${output.toolName} does not match existing tool call ${toolCall.toolName}`);
40
- }
41
- assistantMessage.content[toolCallIdx] = {
42
- ...toolCall,
43
- [symbolInnerMessage]: [...toolCall[symbolInnerMessage] ?? [], output],
44
- result: output.result,
45
- artifact: output.artifact,
46
- isError: output.isError,
47
- messages: output.messages
48
- };
49
- }
50
- } else {
51
- const role = output.role;
52
- const content = (typeof output.content === "string" ? [{
53
- type: "text",
54
- text: output.content
55
- }] : output.content).map((c) => ({
56
- ...c,
57
- [symbolInnerMessage]: [output]
58
- }));
59
- switch (role) {
60
- case "system":
61
- case "user": return {
62
- ...output,
63
- content
64
- };
65
- case "assistant":
66
- if (assistantMessage.content.length === 0) {
67
- assistantMessage.id = output.id;
68
- assistantMessage.createdAt ??= output.createdAt;
69
- assistantMessage.status ??= output.status;
70
- if (output.attachments) assistantMessage.attachments = [...assistantMessage.attachments ?? [], ...output.attachments];
71
- }
72
- if (output.metadata) {
73
- assistantMessage.metadata ??= {};
74
- if (output.metadata.unstable_state !== void 0) assistantMessage.metadata.unstable_state = output.metadata.unstable_state;
75
- if (output.metadata.unstable_annotations) assistantMessage.metadata.unstable_annotations = [...assistantMessage.metadata.unstable_annotations ?? [], ...output.metadata.unstable_annotations];
76
- if (output.metadata.unstable_data) assistantMessage.metadata.unstable_data = [...assistantMessage.metadata.unstable_data ?? [], ...output.metadata.unstable_data];
77
- if (output.metadata.steps) assistantMessage.metadata.steps = [...assistantMessage.metadata.steps ?? [], ...output.metadata.steps];
78
- if (output.metadata.custom) assistantMessage.metadata.custom = {
79
- ...assistantMessage.metadata.custom ?? {},
80
- ...output.metadata.custom
81
- };
82
- if (output.metadata.timing) assistantMessage.metadata.timing = output.metadata.timing;
83
- if (output.metadata.submittedFeedback) assistantMessage.metadata.submittedFeedback = output.metadata.submittedFeedback;
84
- if (output.metadata.isOptimistic) assistantMessage.metadata.isOptimistic = true;
85
- }
86
- for (const part of content) {
87
- if (part.type === "tool-call") {
88
- const existingIdx = assistantMessage.content.findIndex((c) => c.type === "tool-call" && c.toolCallId === part.toolCallId);
89
- if (existingIdx !== -1) {
90
- const existing = assistantMessage.content[existingIdx];
91
- assistantMessage.content[existingIdx] = {
92
- ...existing,
93
- ...part,
94
- ...mergeInnerMessages(existing, part)
95
- };
96
- continue;
97
- }
98
- }
99
- if (part.type === "reasoning" && "parentId" in part && part.parentId) {
100
- const existingIdx = assistantMessage.content.findIndex((c) => c.type === "reasoning" && "parentId" in c && c.parentId === part.parentId);
101
- if (existingIdx !== -1) {
102
- const existing = assistantMessage.content[existingIdx];
103
- assistantMessage.content[existingIdx] = {
104
- ...existing,
105
- text: `${existing.text}\n\n${part.text}`,
106
- ...mergeInnerMessages(existing, part)
107
- };
108
- continue;
109
- }
110
- }
111
- assistantMessage.content.push(part);
112
- }
113
- break;
114
- default: throw new Error(`Unknown message role: ${role}`);
115
- }
116
- }
117
- return assistantMessage;
118
- };
119
- const chunkExternalMessages = (callbackResults, joinStrategy) => {
120
- const results = [];
121
- let isAssistant = false;
122
- let pendingNone = false;
123
- let inputs = [];
124
- let outputs = [];
125
- const flush = () => {
126
- if (outputs.length) results.push({
127
- inputs,
128
- outputs
129
- });
130
- inputs = [];
131
- outputs = [];
132
- isAssistant = false;
133
- pendingNone = false;
134
- };
135
- for (const callbackResult of callbackResults) for (const output of callbackResult.outputs) {
136
- if (pendingNone && output.role !== "tool" || !isAssistant || output.role === "user" || output.role === "system") flush();
137
- isAssistant = output.role === "assistant" || output.role === "tool";
138
- if (inputs.at(-1) !== callbackResult.input) inputs.push(callbackResult.input);
139
- outputs.push(output);
140
- if (output.role === "assistant" && (output.convertConfig?.joinStrategy === "none" || joinStrategy === "none")) pendingNone = true;
141
- }
142
- flush();
143
- return results;
144
- };
145
- function createErrorAssistantMessage(error) {
146
- const msg = {
147
- id: generateErrorMessageId(),
148
- role: "assistant",
149
- content: [],
150
- status: {
151
- type: "incomplete",
152
- reason: "error",
153
- error
154
- },
155
- createdAt: /* @__PURE__ */ new Date(),
156
- metadata: {
157
- unstable_state: null,
158
- unstable_annotations: [],
159
- unstable_data: [],
160
- custom: {},
161
- steps: []
162
- }
163
- };
164
- bindExternalStoreMessage(msg, []);
165
- return msg;
166
- }
167
- const convertExternalMessages = (messages, callback, isRunning, metadata) => {
168
- const callbackResults = [];
169
- for (const message of messages) {
170
- const output = callback(message, metadata);
171
- const result = {
172
- input: message,
173
- outputs: toCallbackOutputs(output, message)
174
- };
175
- callbackResults.push(result);
176
- }
177
- const chunks = chunkExternalMessages(callbackResults);
178
- const result = chunks.map((message, idx) => {
179
- const isLast = idx === chunks.length - 1;
180
- const joined = joinExternalMessages(message.outputs);
181
- const hasInterruptedToolCalls = typeof joined.content === "object" && joined.content.some(isInterruptedToolCall);
182
- const hasPendingToolCalls = typeof joined.content === "object" && joined.content.some(isPendingToolCall);
183
- const autoStatus = getAutoStatus(isLast, isRunning, hasInterruptedToolCalls, hasPendingToolCalls, isLast ? metadata.error : void 0);
184
- const newMessage = fromThreadMessageLike(joined, idx.toString(), autoStatus);
185
- bindExternalStoreMessage(newMessage, message.inputs);
186
- return newMessage;
187
- });
188
- if (metadata.error) {
189
- const lastMessage = result.at(-1);
190
- if (!lastMessage || lastMessage.role !== "assistant") result.push(createErrorAssistantMessage(metadata.error));
191
- }
192
- return result;
193
- };
8
+ const generatedFallbackMessages = /* @__PURE__ */ new WeakSet();
9
+ const convertExternalMessages = convertExternalMessages$1;
194
10
  const useExternalMessageConverter = (t0) => {
195
- const $ = c(13);
11
+ const $ = c(17);
196
12
  const { callback, messages, isRunning, joinStrategy, metadata } = t0;
197
13
  const [caches] = useState(_temp);
198
14
  let t1;
@@ -214,16 +30,14 @@ const useExternalMessageConverter = (t0) => {
214
30
  $[5] = t2;
215
31
  } else t2 = $[5];
216
32
  const state = t2;
217
- let threadMessages;
218
- if ($[6] !== isRunning || $[7] !== joinStrategy || $[8] !== messages || $[9] !== state) {
33
+ let t3;
34
+ if ($[6] !== isRunning || $[7] !== joinStrategy || $[8] !== messages || $[9] !== state.callback || $[10] !== state.callbackCache || $[11] !== state.chunkCache || $[12] !== state.converterCache || $[13] !== state.metadata) {
219
35
  const callbackResults = [];
220
36
  for (const message of messages) {
221
37
  let result = state.callbackCache.get(message);
222
38
  if (!result || result.metadata !== state.metadata || result.callback !== state.callback) {
223
- const output = state.callback(message, state.metadata);
224
39
  result = {
225
- input: message,
226
- outputs: toCallbackOutputs(output, message),
40
+ ...convertExternalMessageCallback(message, state.callback, state.metadata),
227
41
  metadata: state.metadata,
228
42
  callback: state.callback
229
43
  };
@@ -231,51 +45,37 @@ const useExternalMessageConverter = (t0) => {
231
45
  }
232
46
  callbackResults.push(result);
233
47
  }
234
- let t3;
235
- if ($[11] !== state.chunkCache) {
236
- t3 = (m) => {
237
- const key = m.outputs[0];
238
- if (!key) return m;
48
+ let t4;
49
+ if ($[15] !== state.chunkCache) {
50
+ t4 = (message_0) => {
51
+ const key = message_0.outputs[0];
52
+ if (!key) return message_0;
239
53
  const cached = state.chunkCache.get(key);
240
- if (cached && shallowArrayEqual(cached.outputs, m.outputs)) return cached;
241
- state.chunkCache.set(key, m);
242
- return m;
54
+ if (cached && shallowArrayEqual(cached.outputs, message_0.outputs)) return cached;
55
+ state.chunkCache.set(key, message_0);
56
+ return message_0;
243
57
  };
244
- $[11] = state.chunkCache;
245
- $[12] = t3;
246
- } else t3 = $[12];
247
- const chunks = chunkExternalMessages(callbackResults, joinStrategy).map(t3);
248
- threadMessages = state.converterCache.convertMessages(chunks, (cache, message_0, idx) => {
249
- const isLast = idx === chunks.length - 1;
250
- const joined = joinExternalMessages(message_0.outputs);
251
- const hasInterruptedToolCalls = typeof joined.content === "object" && joined.content.some(isInterruptedToolCall);
252
- const hasPendingToolCalls = typeof joined.content === "object" && joined.content.some(isPendingToolCall);
253
- const autoStatus = getAutoStatus(isLast, isRunning, hasInterruptedToolCalls, hasPendingToolCalls, isLast ? state.metadata.error : void 0);
254
- if (cache && (cache.role !== "assistant" || !isAutoStatus(cache.status) || cache.status === autoStatus)) {
255
- const inputs = getExternalStoreMessages(cache);
256
- if (shallowArrayEqual(inputs, message_0.inputs)) return cache;
257
- }
258
- const newMessage = fromThreadMessageLike(joined, idx.toString(), autoStatus);
259
- bindExternalStoreMessage(newMessage, message_0.inputs);
260
- return newMessage;
261
- });
58
+ $[15] = state.chunkCache;
59
+ $[16] = t4;
60
+ } else t4 = $[16];
61
+ const chunks = chunkExternalMessages(callbackResults, joinStrategy).map(t4);
62
+ const threadMessages = state.converterCache.convertMessages(chunks, (cache, message_1, idx) => convertExternalMessageChunk(message_1, idx, chunks.length, isRunning, state.metadata.error, {
63
+ message: cache,
64
+ generatedFallbackMessages
65
+ }));
262
66
  bindExternalStoreMessage(threadMessages, messages);
263
- if (state.metadata.error) {
264
- const lastMessage = threadMessages.at(-1);
265
- if (!lastMessage || lastMessage.role !== "assistant") threadMessages.push(createErrorAssistantMessage(state.metadata.error));
266
- }
67
+ t3 = completeExternalMessageConversion(threadMessages, state.metadata.error);
267
68
  $[6] = isRunning;
268
69
  $[7] = joinStrategy;
269
70
  $[8] = messages;
270
- $[9] = state;
271
- $[10] = threadMessages;
272
- } else threadMessages = $[10];
273
- return threadMessages;
274
- };
275
- const shallowArrayEqual = (a, b) => {
276
- if (a.length !== b.length) return false;
277
- for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;
278
- return true;
71
+ $[9] = state.callback;
72
+ $[10] = state.callbackCache;
73
+ $[11] = state.chunkCache;
74
+ $[12] = state.converterCache;
75
+ $[13] = state.metadata;
76
+ $[14] = t3;
77
+ } else t3 = $[14];
78
+ return t3;
279
79
  };
280
80
  function _temp() {
281
81
  return {