@assistant-ui/core 0.2.22 → 0.2.23

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 (214) hide show
  1. package/dist/adapters/thread-history.d.ts +8 -0
  2. package/dist/adapters/thread-history.d.ts.map +1 -1
  3. package/dist/internal.d.ts +3 -2
  4. package/dist/internal.js +3 -2
  5. package/dist/model-context/frame/host.d.ts.map +1 -1
  6. package/dist/model-context/frame/host.js +36 -21
  7. package/dist/model-context/frame/host.js.map +1 -1
  8. package/dist/model-context/types.d.ts.map +1 -1
  9. package/dist/model-context/types.js +13 -4
  10. package/dist/model-context/types.js.map +1 -1
  11. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
  12. package/dist/react/adapters/LocalStorageThreadListAdapter.js +1 -0
  13. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  14. package/dist/react/client/interactable-model-context.js +1 -0
  15. package/dist/react/client/interactable-model-context.js.map +1 -1
  16. package/dist/react/interactables-legacy/useInteractableState.js +1 -0
  17. package/dist/react/interactables-legacy/useInteractableState.js.map +1 -1
  18. package/dist/react/model-context/useInteractableState.js +1 -0
  19. package/dist/react/model-context/useInteractableState.js.map +1 -1
  20. package/dist/react/model-context/useInteractableVersions.js +1 -0
  21. package/dist/react/model-context/useInteractableVersions.js.map +1 -1
  22. package/dist/react/model-context/useToolArgsStatus.js +1 -0
  23. package/dist/react/model-context/useToolArgsStatus.js.map +1 -1
  24. package/dist/react/primitive-hooks/useActionBarCopy.js +1 -0
  25. package/dist/react/primitive-hooks/useActionBarCopy.js.map +1 -1
  26. package/dist/react/primitive-hooks/useActionBarEdit.js +1 -0
  27. package/dist/react/primitive-hooks/useActionBarEdit.js.map +1 -1
  28. package/dist/react/primitive-hooks/useActionBarFeedback.js +1 -0
  29. package/dist/react/primitive-hooks/useActionBarFeedback.js.map +1 -1
  30. package/dist/react/primitive-hooks/useActionBarReload.js +1 -0
  31. package/dist/react/primitive-hooks/useActionBarReload.js.map +1 -1
  32. package/dist/react/primitive-hooks/useActionBarSpeak.js +1 -0
  33. package/dist/react/primitive-hooks/useActionBarSpeak.js.map +1 -1
  34. package/dist/react/primitive-hooks/useActionBarStopSpeaking.js +1 -0
  35. package/dist/react/primitive-hooks/useActionBarStopSpeaking.js.map +1 -1
  36. package/dist/react/primitive-hooks/useBranchPickerNext.js +1 -0
  37. package/dist/react/primitive-hooks/useBranchPickerNext.js.map +1 -1
  38. package/dist/react/primitive-hooks/useBranchPickerPrevious.js +1 -0
  39. package/dist/react/primitive-hooks/useBranchPickerPrevious.js.map +1 -1
  40. package/dist/react/primitive-hooks/useComposerAddAttachment.js +1 -0
  41. package/dist/react/primitive-hooks/useComposerAddAttachment.js.map +1 -1
  42. package/dist/react/primitive-hooks/useComposerCancel.js +1 -0
  43. package/dist/react/primitive-hooks/useComposerCancel.js.map +1 -1
  44. package/dist/react/primitive-hooks/useComposerDictate.js +1 -0
  45. package/dist/react/primitive-hooks/useComposerDictate.js.map +1 -1
  46. package/dist/react/primitive-hooks/useComposerSend.js +1 -0
  47. package/dist/react/primitive-hooks/useComposerSend.js.map +1 -1
  48. package/dist/react/primitive-hooks/useEditComposerCancel.js +1 -0
  49. package/dist/react/primitive-hooks/useEditComposerCancel.js.map +1 -1
  50. package/dist/react/primitive-hooks/useEditComposerSend.js +1 -0
  51. package/dist/react/primitive-hooks/useEditComposerSend.js.map +1 -1
  52. package/dist/react/primitive-hooks/useMessageBranching.js +1 -0
  53. package/dist/react/primitive-hooks/useMessageBranching.js.map +1 -1
  54. package/dist/react/primitive-hooks/useMessageReload.js +1 -0
  55. package/dist/react/primitive-hooks/useMessageReload.js.map +1 -1
  56. package/dist/react/primitive-hooks/useSuggestionTrigger.js +1 -0
  57. package/dist/react/primitive-hooks/useSuggestionTrigger.js.map +1 -1
  58. package/dist/react/primitive-hooks/useThreadListItemArchive.js +1 -0
  59. package/dist/react/primitive-hooks/useThreadListItemArchive.js.map +1 -1
  60. package/dist/react/primitive-hooks/useThreadListItemDelete.js +1 -0
  61. package/dist/react/primitive-hooks/useThreadListItemDelete.js.map +1 -1
  62. package/dist/react/primitive-hooks/useThreadListItemTrigger.js +1 -0
  63. package/dist/react/primitive-hooks/useThreadListItemTrigger.js.map +1 -1
  64. package/dist/react/primitive-hooks/useThreadListItemUnarchive.js +1 -0
  65. package/dist/react/primitive-hooks/useThreadListItemUnarchive.js.map +1 -1
  66. package/dist/react/primitive-hooks/useThreadListLoadMore.js +1 -0
  67. package/dist/react/primitive-hooks/useThreadListLoadMore.js.map +1 -1
  68. package/dist/react/primitive-hooks/useThreadListNew.js +1 -0
  69. package/dist/react/primitive-hooks/useThreadListNew.js.map +1 -1
  70. package/dist/react/providers/TextMessagePartProvider.js +1 -0
  71. package/dist/react/providers/TextMessagePartProvider.js.map +1 -1
  72. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  73. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +6 -4
  74. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  75. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +31 -1
  76. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  77. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +11 -1
  78. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  79. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts +1 -1
  80. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts.map +1 -1
  81. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js +1 -1
  82. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js.map +1 -1
  83. package/dist/react/runtimes/cloud/auiV0.d.ts +12 -1
  84. package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
  85. package/dist/react/runtimes/cloud/auiV0.js +2 -1
  86. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  87. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +75 -73
  88. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  89. package/dist/react/runtimes/external-message-converter.js +1 -1
  90. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  91. package/dist/react/runtimes/useExternalStoreSharedOptions.js +1 -0
  92. package/dist/react/runtimes/useExternalStoreSharedOptions.js.map +1 -1
  93. package/dist/react/runtimes/useLocalRuntime.d.ts +0 -1
  94. package/dist/react/runtimes/useLocalRuntime.d.ts.map +1 -1
  95. package/dist/runtime/api/assistant-runtime.d.ts +1 -1
  96. package/dist/runtime/api/assistant-runtime.d.ts.map +1 -1
  97. package/dist/runtime/api/assistant-runtime.js +1 -1
  98. package/dist/runtime/api/assistant-runtime.js.map +1 -1
  99. package/dist/runtime/api/attachment-runtime.d.ts +1 -1
  100. package/dist/runtime/api/attachment-runtime.d.ts.map +1 -1
  101. package/dist/runtime/api/attachment-runtime.js +1 -1
  102. package/dist/runtime/api/attachment-runtime.js.map +1 -1
  103. package/dist/runtime/api/composer-runtime.d.ts +2 -2
  104. package/dist/runtime/api/composer-runtime.d.ts.map +1 -1
  105. package/dist/runtime/api/composer-runtime.js +2 -2
  106. package/dist/runtime/api/composer-runtime.js.map +1 -1
  107. package/dist/runtime/api/message-part-runtime.d.ts +4 -4
  108. package/dist/runtime/api/message-part-runtime.d.ts.map +1 -1
  109. package/dist/runtime/api/message-part-runtime.js +3 -3
  110. package/dist/runtime/api/message-part-runtime.js.map +1 -1
  111. package/dist/runtime/api/message-runtime.d.ts +1 -1
  112. package/dist/runtime/api/message-runtime.d.ts.map +1 -1
  113. package/dist/runtime/api/message-runtime.js +2 -2
  114. package/dist/runtime/api/message-runtime.js.map +1 -1
  115. package/dist/runtime/api/thread-list-item-runtime.d.ts +1 -1
  116. package/dist/runtime/api/thread-list-item-runtime.d.ts.map +1 -1
  117. package/dist/runtime/api/thread-list-item-runtime.js +2 -2
  118. package/dist/runtime/api/thread-list-item-runtime.js.map +1 -1
  119. package/dist/runtime/api/thread-list-runtime.d.ts +1 -1
  120. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  121. package/dist/runtime/api/thread-list-runtime.js +1 -1
  122. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  123. package/dist/runtime/base/base-thread-runtime-core.d.ts +1 -1
  124. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  125. package/dist/runtime/base/base-thread-runtime-core.js +1 -1
  126. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  127. package/dist/runtime/base/default-edit-composer-runtime-core.d.ts +2 -2
  128. package/dist/runtime/base/default-edit-composer-runtime-core.d.ts.map +1 -1
  129. package/dist/runtime/base/default-edit-composer-runtime-core.js +2 -2
  130. package/dist/runtime/base/default-edit-composer-runtime-core.js.map +1 -1
  131. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +1 -1
  132. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
  133. package/dist/runtime/base/default-thread-composer-runtime-core.js +1 -1
  134. package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
  135. package/dist/runtime/utils/message-repository.d.ts.map +1 -1
  136. package/dist/runtime/utils/message-repository.js +4 -2
  137. package/dist/runtime/utils/message-repository.js.map +1 -1
  138. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts +1 -1
  139. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  140. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +1 -1
  141. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  142. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  143. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +12 -0
  144. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  145. package/dist/runtimes/internal.d.ts +2 -1
  146. package/dist/runtimes/internal.js +2 -1
  147. package/dist/runtimes/local/local-thread-runtime-core.d.ts +3 -0
  148. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  149. package/dist/runtimes/local/local-thread-runtime-core.js +44 -13
  150. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  151. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts +32 -27
  152. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
  153. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +2 -0
  154. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  155. package/dist/store/clients/no-op-composer-client.js +1 -0
  156. package/dist/store/clients/no-op-composer-client.js.map +1 -1
  157. package/dist/store/runtime-clients/thread-list-runtime-client.js +1 -0
  158. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  159. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  160. package/dist/store/runtime-clients/thread-runtime-client.js +17 -15
  161. package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
  162. package/dist/store/scopes/thread.d.ts +1 -0
  163. package/dist/store/scopes/thread.d.ts.map +1 -1
  164. package/dist/subscribable/subscribable.d.ts +3 -3
  165. package/dist/subscribable/subscribable.d.ts.map +1 -1
  166. package/dist/subscribable/subscribable.js +3 -3
  167. package/dist/subscribable/subscribable.js.map +1 -1
  168. package/package.json +7 -7
  169. package/src/adapters/thread-history.ts +8 -0
  170. package/src/internal.ts +1 -1
  171. package/src/model-context/frame/host.test.ts +47 -0
  172. package/src/model-context/frame/host.ts +46 -19
  173. package/src/model-context/types.ts +16 -6
  174. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +15 -5
  175. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +20 -6
  176. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.ts +34 -0
  177. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +26 -5
  178. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts +5 -1
  179. package/src/react/runtimes/cloud/auiV0.ts +14 -0
  180. package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +90 -88
  181. package/src/react/runtimes/external-message-converter.test.ts +346 -0
  182. package/src/react/runtimes/external-message-converter.ts +1 -1
  183. package/src/react/runtimes/useLocalRuntime.test.tsx +43 -0
  184. package/src/runtime/api/assistant-runtime.ts +4 -1
  185. package/src/runtime/api/attachment-runtime.ts +8 -2
  186. package/src/runtime/api/composer-runtime.ts +9 -5
  187. package/src/runtime/api/message-part-runtime.ts +10 -3
  188. package/src/runtime/api/message-runtime.ts +7 -2
  189. package/src/runtime/api/thread-list-item-runtime.ts +7 -2
  190. package/src/runtime/api/thread-list-runtime.ts +10 -2
  191. package/src/runtime/base/base-thread-runtime-core.ts +5 -1
  192. package/src/runtime/base/default-edit-composer-runtime-core.ts +14 -2
  193. package/src/runtime/base/default-thread-composer-runtime-core.ts +11 -1
  194. package/src/runtime/utils/message-repository.ts +19 -13
  195. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +4 -1
  196. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +15 -0
  197. package/src/runtimes/internal.ts +3 -0
  198. package/src/runtimes/local/local-thread-runtime-core.test.ts +596 -0
  199. package/src/runtimes/local/local-thread-runtime-core.ts +85 -21
  200. package/src/runtimes/local/should-continue.test.ts +122 -0
  201. package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +9 -10
  202. package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +38 -32
  203. package/src/store/clients/model-context-client.test.ts +21 -1
  204. package/src/store/runtime-clients/thread-runtime-client.ts +2 -1
  205. package/src/store/scopes/thread.ts +1 -0
  206. package/src/subscribable/subscribable.ts +16 -8
  207. package/src/tests/MessageRepository.test.ts +12 -0
  208. package/src/tests/RemoteThreadListThreadListRuntimeCore-switchToThread-position.test.ts +121 -0
  209. package/src/tests/auiV0Encode.test.ts +74 -0
  210. package/src/tests/base-composer-runtime-core.test.ts +422 -0
  211. package/src/tests/external-store-thread-list-runtime-core.test.ts +6 -6
  212. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +575 -0
  213. package/src/tests/external-store-thread-runtime-core.test.ts +55 -1
  214. package/src/tests/OptimisticState-delete-crash.test.ts +0 -208
@@ -251,10 +251,12 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
251
251
  ...state.threadIdMap,
252
252
  [remoteMetadata.remoteId]: mappingId
253
253
  };
254
- const threadIdsWithoutRemote = state.threadIds.filter((id) => id !== remoteMetadata.remoteId);
255
- const archivedThreadIdsWithoutRemote = state.archivedThreadIds.filter((id) => id !== remoteMetadata.remoteId);
256
- const newThreadIds = remoteMetadata.status === "regular" ? [...threadIdsWithoutRemote, remoteMetadata.remoteId] : threadIdsWithoutRemote;
257
- const newArchivedThreadIds = remoteMetadata.status === "archived" ? [...archivedThreadIdsWithoutRemote, remoteMetadata.remoteId] : archivedThreadIdsWithoutRemote;
254
+ const remoteId = remoteMetadata.remoteId;
255
+ const wasInTarget = remoteMetadata.status === "regular" ? state.threadIds.includes(remoteId) : state.archivedThreadIds.includes(remoteId);
256
+ const threadIdsWithoutRemote = state.threadIds.filter((id) => id !== remoteId);
257
+ const archivedThreadIdsWithoutRemote = state.archivedThreadIds.filter((id) => id !== remoteId);
258
+ const newThreadIds = remoteMetadata.status === "regular" ? wasInTarget ? state.threadIds : [...threadIdsWithoutRemote, remoteId] : threadIdsWithoutRemote;
259
+ const newArchivedThreadIds = remoteMetadata.status === "archived" ? wasInTarget ? state.archivedThreadIds : [...archivedThreadIdsWithoutRemote, remoteId] : archivedThreadIdsWithoutRemote;
258
260
  this._state.update({
259
261
  ...state,
260
262
  threadIds: newThreadIds,
@@ -1 +1 @@
1
- {"version":3,"file":"RemoteThreadListThreadListRuntimeCore.js","names":["ThreadListRuntimeCore","generateId","BaseSubscribable","OptimisticState","EMPTY_THREAD_CORE","RemoteThreadData","RemoteThreadState","classifyThreads","createThreadMappingId","getThreadData","normalizeCursor","updateStatusReducer","RemoteThreadListOptions","RemoteThreadListHookInstanceManager","FC","Fragment","useEffect","useId","create","AssistantMessageStream","ModelContextProvider","RuntimeAdapterProvider","threadNotFoundError","threadIdOrRemoteId","action","Error","threadStatusError","status","RemoteThreadListThreadListRuntimeCore","_options","_hookManager","_loadThreadsPromise","Promise","_loadMorePromise","_loadGeneration","_switchGeneration","_switchTask","_mainThreadId","_state","isLoading","isLoadingMore","cursor","undefined","newThreadId","threadIds","archivedThreadIds","threadIdMap","threadData","threadItems","value","getLoadThreadsPromise","generation","optimisticUpdate","execute","adapter","list","loading","state","then","l","fresh","threads","nextCursor","catch","error","console","update","baseValue","loadMore","initialState","resolve","dedup","after","appended","contextProvider","constructor","options","subscribe","_notifySubscribers","_notifyThreadIdChange","runtimeHook","useProvider","Provider","unstable_Provider","__internal_setOptions","switchToNewThread","_initialThreadLoaded","adapterChanged","getState","setState","setRuntimeHook","__internal_load","startThreadId","threadId","initialThreadId","switchToThread","reload","hasMore","mainThreadId","_mainThreadRemoteId","remoteId","_lastNotifiedThreadId","onThreadIdChange","getMainThreadRuntimeCore","result","getThreadRuntimeCore","data","getItemById","id","unarchive","task","_switchToThread","remoteMetadata","fetch","mappingId","newThreadData","initializeTask","externalId","title","lastMessageAt","custom","newThreadIdMap","threadIdsWithoutRemote","filter","archivedThreadIdsWithoutRemote","newThreadIds","newArchivedThreadIds","startThreadRuntime","_switchToNewThread","waitForUpdate","initialize","optimistic","generateTitle","runtimeCore","messages","stream","messageStream","fromAssistantStream","newTitle","parts","c","type","text","currentData","rename","updateCustom","Record","_ensureThreadIsNotMain","lastAwaitedTask","switchTask","startedFallback","archive","delete","stopThreadRuntime","detach","useBoundIds","__internal_RenderComponent","s","i","boundIds","adapters","modelContext","length"],"sources":["../../../src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx"],"sourcesContent":["import type { ThreadListRuntimeCore } from \"../../runtime/interfaces/thread-list-runtime-core\";\nimport { generateId } from \"../../utils/id\";\nimport { BaseSubscribable } from \"../../subscribable/subscribable\";\nimport { OptimisticState } from \"../../runtimes/remote-thread-list/optimistic-state\";\nimport { EMPTY_THREAD_CORE } from \"../../runtimes/remote-thread-list/empty-thread-core\";\nimport type {\n RemoteThreadData,\n RemoteThreadState,\n} from \"../../runtimes/remote-thread-list/remote-thread-state\";\nimport {\n classifyThreads,\n createThreadMappingId,\n getThreadData,\n normalizeCursor,\n updateStatusReducer,\n} from \"../../runtimes/remote-thread-list/remote-thread-state\";\nimport type { RemoteThreadListOptions } from \"../../runtimes/remote-thread-list/types\";\nimport { RemoteThreadListHookInstanceManager } from \"./RemoteThreadListHookInstanceManager\";\nimport { type FC, Fragment, useEffect, useId } from \"react\";\nimport { create } from \"zustand\";\nimport { AssistantMessageStream } from \"assistant-stream\";\nimport type { ModelContextProvider } from \"../../model-context/types\";\nimport { RuntimeAdapterProvider } from \"./RuntimeAdapterProvider\";\n\nconst threadNotFoundError = (threadIdOrRemoteId: string, action: string) =>\n new Error(`Thread \"${threadIdOrRemoteId}\" not found while ${action}.`);\n\nconst threadStatusError = (\n threadIdOrRemoteId: string,\n status: RemoteThreadData[\"status\"],\n action: string,\n) =>\n new Error(\n `Thread \"${threadIdOrRemoteId}\" has status \"${status}\", so it cannot ${action}.`,\n );\n\nexport class RemoteThreadListThreadListRuntimeCore\n extends BaseSubscribable\n implements ThreadListRuntimeCore\n{\n private _options!: RemoteThreadListOptions;\n private readonly _hookManager: RemoteThreadListHookInstanceManager;\n\n private _loadThreadsPromise: Promise<void> | undefined;\n private _loadMorePromise: Promise<void> | undefined;\n private _loadGeneration = 0;\n private _switchGeneration = 0;\n private _switchTask: Promise<void> | undefined;\n\n private _mainThreadId!: string;\n private readonly _state = new OptimisticState<RemoteThreadState>({\n isLoading: true,\n isLoadingMore: false,\n cursor: undefined,\n newThreadId: undefined,\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n });\n\n public get threadItems() {\n return this._state.value.threadData;\n }\n\n public getLoadThreadsPromise() {\n // TODO this needs to be cached in case this promise is loaded during suspense\n if (!this._loadThreadsPromise) {\n const generation = this._loadGeneration;\n this._loadThreadsPromise = this._state\n .optimisticUpdate({\n execute: () => this._options.adapter.list(),\n loading: (state) => {\n return {\n ...state,\n isLoading: true,\n };\n },\n then: (state, l) => {\n if (generation !== this._loadGeneration) return state;\n const fresh = classifyThreads(l.threads, {\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n });\n\n return {\n ...state,\n isLoading: false,\n cursor: normalizeCursor(l.nextCursor),\n threadIds: fresh.threadIds,\n archivedThreadIds: fresh.archivedThreadIds,\n threadIdMap: {\n ...state.threadIdMap,\n ...fresh.threadIdMap,\n },\n threadData: {\n ...state.threadData,\n ...fresh.threadData,\n },\n };\n },\n })\n .catch((error: unknown) => {\n if (generation !== this._loadGeneration) return;\n console.error(\"[assistant-ui] thread list load failed:\", error);\n this._loadThreadsPromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n isLoading: false,\n });\n })\n .then(() => {});\n }\n\n return this._loadThreadsPromise;\n }\n\n public loadMore(): Promise<void> {\n if (this._loadMorePromise) return this._loadMorePromise;\n\n const initialState = this._state.value;\n if (initialState.cursor === undefined || initialState.isLoading) {\n return Promise.resolve();\n }\n\n const generation = this._loadGeneration;\n const adapter = this._options.adapter;\n const cursor = initialState.cursor;\n\n const dedup = this._state\n .optimisticUpdate({\n execute: () => adapter.list({ after: cursor }),\n loading: (state) => ({ ...state, isLoadingMore: true }),\n then: (state, l) => {\n if (generation !== this._loadGeneration) return state;\n if (adapter !== this._options.adapter) return state;\n\n const appended = classifyThreads(l.threads, {\n threadIds: [...state.threadIds],\n archivedThreadIds: [...state.archivedThreadIds],\n threadIdMap: { ...state.threadIdMap },\n threadData: { ...state.threadData },\n });\n\n return {\n ...state,\n isLoadingMore: false,\n cursor: normalizeCursor(l.nextCursor),\n threadIds: appended.threadIds,\n archivedThreadIds: appended.archivedThreadIds,\n threadIdMap: appended.threadIdMap,\n threadData: appended.threadData,\n };\n },\n })\n .catch((error: unknown) => {\n console.error(\"[assistant-ui] thread list loadMore failed:\", error);\n })\n .then(() => {\n if (this._loadMorePromise === dedup) {\n this._loadMorePromise = undefined;\n }\n });\n\n this._loadMorePromise = dedup;\n return dedup;\n }\n\n private readonly contextProvider: ModelContextProvider;\n\n constructor(\n options: RemoteThreadListOptions,\n contextProvider: ModelContextProvider,\n ) {\n super();\n this.contextProvider = contextProvider;\n\n this._state.subscribe(() => {\n this._notifySubscribers();\n this._notifyThreadIdChange();\n });\n this._hookManager = new RemoteThreadListHookInstanceManager(\n options.runtimeHook,\n this,\n );\n this.useProvider = create(() => ({\n Provider: options.adapter.unstable_Provider ?? Fragment,\n }));\n this.__internal_setOptions(options);\n this.switchToNewThread();\n }\n\n private _initialThreadLoaded = false;\n private useProvider;\n\n public __internal_setOptions(options: RemoteThreadListOptions) {\n if (this._options === options) return;\n\n const adapterChanged =\n this._options !== undefined && this._options.adapter !== options.adapter;\n\n this._options = options;\n\n const Provider = options.adapter.unstable_Provider ?? Fragment;\n if (Provider !== this.useProvider.getState().Provider) {\n this.useProvider.setState({ Provider }, true);\n }\n\n this._hookManager.setRuntimeHook(options.runtimeHook);\n\n if (adapterChanged) {\n this._loadGeneration++;\n this._loadThreadsPromise = undefined;\n this._loadMorePromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n cursor: undefined,\n });\n }\n }\n\n public __internal_load() {\n this.getLoadThreadsPromise(); // begin loading on initial bind\n const startThreadId =\n this._options.threadId ?? this._options.initialThreadId;\n if (!this._initialThreadLoaded && startThreadId) {\n this._initialThreadLoaded = true;\n this.switchToThread(startThreadId).catch(() => {});\n }\n }\n\n public reload() {\n this._loadGeneration++;\n this._loadThreadsPromise = undefined;\n this._loadMorePromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n cursor: undefined,\n });\n return this.getLoadThreadsPromise();\n }\n\n public get isLoading() {\n return this._state.value.isLoading;\n }\n\n public get isLoadingMore() {\n return this._state.value.isLoadingMore;\n }\n\n public get hasMore() {\n return this._state.value.cursor !== undefined;\n }\n\n public get threadIds() {\n return this._state.value.threadIds;\n }\n\n public get archivedThreadIds() {\n return this._state.value.archivedThreadIds;\n }\n\n public get newThreadId() {\n return this._state.value.newThreadId;\n }\n\n public get mainThreadId(): string {\n return this._mainThreadId;\n }\n\n // The settled remote ID of the active thread, or undefined while it is still\n // a new/optimistic thread. This is the value surfaced to `onThreadIdChange`.\n private get _mainThreadRemoteId(): string | undefined {\n if (this._mainThreadId === undefined) return undefined;\n return getThreadData(this._state.value, this._mainThreadId)?.remoteId;\n }\n\n private _lastNotifiedThreadId: string | undefined = undefined;\n\n private _notifyThreadIdChange() {\n const threadId = this._mainThreadRemoteId;\n if (this._lastNotifiedThreadId === threadId) return;\n this._lastNotifiedThreadId = threadId;\n this._options.onThreadIdChange?.(threadId);\n }\n\n public getMainThreadRuntimeCore() {\n const result = this._hookManager.getThreadRuntimeCore(this._mainThreadId);\n if (!result) return EMPTY_THREAD_CORE;\n return result;\n }\n\n public getThreadRuntimeCore(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data)\n throw threadNotFoundError(threadIdOrRemoteId, \"getting its runtime\");\n\n const result = this._hookManager.getThreadRuntimeCore(data.id);\n if (!result)\n throw new Error(\n `Runtime for thread \"${threadIdOrRemoteId}\" not found while getting its runtime.`,\n );\n return result;\n }\n\n public getItemById(threadIdOrRemoteId: string) {\n return getThreadData(this._state.value, threadIdOrRemoteId);\n }\n\n public switchToThread(\n threadIdOrRemoteId: string,\n options?: { unarchive?: boolean },\n ): Promise<void> {\n const generation = ++this._switchGeneration;\n const task = this._switchToThread(threadIdOrRemoteId, options, generation);\n this._switchTask = task;\n return task;\n }\n\n private async _switchToThread(\n threadIdOrRemoteId: string,\n options: { unarchive?: boolean } | undefined,\n generation: number,\n ): Promise<void> {\n let data = this.getItemById(threadIdOrRemoteId);\n\n if (!data) {\n const remoteMetadata =\n await this._options.adapter.fetch(threadIdOrRemoteId);\n if (generation !== this._switchGeneration) return;\n\n const state = this._state.value;\n const mappingId = createThreadMappingId(remoteMetadata.remoteId);\n\n const newThreadData = {\n ...state.threadData,\n [mappingId]: {\n id: mappingId,\n initializeTask: Promise.resolve({\n remoteId: remoteMetadata.remoteId,\n externalId: remoteMetadata.externalId,\n }),\n remoteId: remoteMetadata.remoteId,\n externalId: remoteMetadata.externalId,\n status: remoteMetadata.status,\n title: remoteMetadata.title,\n lastMessageAt: remoteMetadata.lastMessageAt,\n custom: remoteMetadata.custom,\n } as RemoteThreadData,\n };\n\n const newThreadIdMap = {\n ...state.threadIdMap,\n [remoteMetadata.remoteId]: mappingId,\n };\n\n // Filter both arrays first so a concurrent `list()` can't leave the id\n // duplicated or under the wrong status.\n const threadIdsWithoutRemote = state.threadIds.filter(\n (id) => id !== remoteMetadata.remoteId,\n );\n const archivedThreadIdsWithoutRemote = state.archivedThreadIds.filter(\n (id) => id !== remoteMetadata.remoteId,\n );\n\n const newThreadIds =\n remoteMetadata.status === \"regular\"\n ? [...threadIdsWithoutRemote, remoteMetadata.remoteId]\n : threadIdsWithoutRemote;\n const newArchivedThreadIds =\n remoteMetadata.status === \"archived\"\n ? [...archivedThreadIdsWithoutRemote, remoteMetadata.remoteId]\n : archivedThreadIdsWithoutRemote;\n\n this._state.update({\n ...state,\n threadIds: newThreadIds,\n archivedThreadIds: newArchivedThreadIds,\n threadIdMap: newThreadIdMap,\n threadData: newThreadData,\n });\n\n data = this.getItemById(threadIdOrRemoteId);\n }\n\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"switching to it\");\n if (this._mainThreadId === data.id) return;\n\n const task = this._hookManager.startThreadRuntime(data.id);\n if (this.mainThreadId !== undefined) {\n await task;\n } else {\n task.then(() => this._notifySubscribers());\n }\n\n if (generation !== this._switchGeneration) return;\n\n if (data.status === \"archived\" && options?.unarchive !== false) {\n await this.unarchive(data.id);\n if (generation !== this._switchGeneration) return;\n }\n this._mainThreadId = data.id;\n\n this._notifySubscribers();\n this._notifyThreadIdChange();\n }\n\n public switchToNewThread(): Promise<void> {\n const generation = ++this._switchGeneration;\n const task = this._switchToNewThread(generation);\n this._switchTask = task;\n return task;\n }\n\n private async _switchToNewThread(generation: number): Promise<void> {\n // an initialization transaction is in progress, wait for it to settle\n while (\n this._state.baseValue.newThreadId !== undefined &&\n this._state.value.newThreadId === undefined\n ) {\n await this._state.waitForUpdate();\n if (generation !== this._switchGeneration) return;\n }\n\n const state = this._state.value;\n let id: string | undefined = this._state.value.newThreadId;\n if (id === undefined) {\n do {\n id = `__LOCALID_${generateId()}`;\n } while (state.threadIdMap[id]);\n\n const mappingId = createThreadMappingId(id);\n this._state.update({\n ...state,\n newThreadId: id,\n threadIdMap: {\n ...state.threadIdMap,\n [id]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [mappingId]: {\n status: \"new\",\n id,\n remoteId: undefined,\n externalId: undefined,\n title: undefined,\n custom: undefined,\n } satisfies RemoteThreadData,\n },\n });\n }\n\n return this._switchToThread(id, undefined, generation);\n }\n\n public initialize = async (threadId: string) => {\n if (this._state.value.newThreadId !== threadId) {\n const data = this.getItemById(threadId);\n if (!data) throw threadNotFoundError(threadId, \"initializing it\");\n if (data.status === \"new\")\n throw threadStatusError(threadId, data.status, \"be initialized here\");\n const { remoteId, externalId } = await data.initializeTask;\n return { remoteId, externalId };\n }\n\n const { remoteId, externalId } = await this._state.optimisticUpdate({\n execute: () => {\n return this._options.adapter.initialize(threadId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, threadId, \"regular\");\n },\n loading: (state, task) => {\n const mappingId = createThreadMappingId(threadId);\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [mappingId]: {\n ...state.threadData[mappingId],\n initializeTask: task,\n },\n },\n };\n },\n then: (state, { remoteId, externalId }) => {\n const data = getThreadData(state, threadId);\n if (!data) return state;\n\n const mappingId = createThreadMappingId(threadId);\n return {\n ...state,\n threadIdMap: {\n ...state.threadIdMap,\n [remoteId]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [mappingId]: {\n ...data,\n initializeTask: Promise.resolve({ remoteId, externalId }),\n remoteId,\n externalId,\n },\n },\n };\n },\n });\n return { remoteId, externalId };\n };\n\n public generateTitle = async (threadId: string) => {\n const data = this.getItemById(threadId);\n if (!data) throw threadNotFoundError(threadId, \"generating its title\");\n if (data.status === \"new\")\n throw threadStatusError(threadId, data.status, \"generate a title\");\n\n const { remoteId } = await data.initializeTask;\n\n const runtimeCore = this._hookManager.getThreadRuntimeCore(data.id);\n if (!runtimeCore) return; // thread is no longer running\n\n const messages = runtimeCore.messages;\n const stream = await this._options.adapter.generateTitle(\n remoteId,\n messages,\n );\n const messageStream = AssistantMessageStream.fromAssistantStream(stream);\n for await (const result of messageStream) {\n const newTitle = result.parts.filter((c) => c.type === \"text\")[0]?.text;\n const state = this._state.baseValue;\n const currentData = getThreadData(state, data.id);\n if (!currentData) continue;\n this._state.update({\n ...state,\n threadData: {\n ...state.threadData,\n [currentData.id]: {\n ...currentData,\n title: newTitle,\n },\n },\n });\n }\n };\n\n public rename(threadIdOrRemoteId: string, newTitle: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"renaming it\");\n if (data.status === \"new\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be renamed\");\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return this._options.adapter.rename(remoteId, newTitle);\n },\n optimistic: (state) => {\n const data = getThreadData(state, threadIdOrRemoteId);\n if (!data) return state;\n\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [data.id]: {\n ...data,\n title: newTitle,\n },\n },\n };\n },\n });\n }\n\n public updateCustom(\n threadIdOrRemoteId: string,\n custom: Record<string, unknown> | undefined,\n ): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data)\n throw threadNotFoundError(\n threadIdOrRemoteId,\n \"updating its custom metadata\",\n );\n if (data.status === \"new\")\n throw threadStatusError(\n threadIdOrRemoteId,\n data.status,\n \"update custom metadata\",\n );\n\n if (!this._options.adapter.updateCustom) {\n throw new Error(\n \"Remote thread list adapter does not support updating custom metadata\",\n );\n }\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n const adapter = this._options.adapter;\n if (!adapter.updateCustom) {\n throw new Error(\n \"Remote thread list adapter does not support updating custom metadata\",\n );\n }\n return adapter.updateCustom(remoteId, custom);\n },\n optimistic: (state) => {\n const data = getThreadData(state, threadIdOrRemoteId);\n if (!data) return state;\n\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [data.id]: {\n ...data,\n custom,\n },\n },\n };\n },\n });\n }\n\n private async _ensureThreadIsNotMain(threadId: string) {\n if (threadId === this.newThreadId)\n throw new Error(\"Cannot ensure new thread is not main\");\n\n let lastAwaitedTask: Promise<void> | undefined;\n\n while (threadId === this._mainThreadId) {\n let switchTask = this._switchTask;\n const startedFallback = !switchTask || switchTask === lastAwaitedTask;\n if (startedFallback) switchTask = this.switchToNewThread();\n lastAwaitedTask = switchTask;\n\n try {\n await switchTask;\n } catch (error) {\n if (startedFallback && this._switchTask === switchTask) {\n throw error;\n }\n }\n }\n }\n\n public async archive(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"archiving it\");\n if (data.status !== \"regular\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be archived\");\n\n await this._ensureThreadIsNotMain(data.id);\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return this._options.adapter.archive(remoteId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"archived\");\n },\n });\n }\n\n public unarchive(threadIdOrRemoteId: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"unarchiving it\");\n if (data.status !== \"archived\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be unarchived\");\n\n return this._state.optimisticUpdate({\n execute: async () => {\n try {\n const { remoteId } = await data.initializeTask;\n return await this._options.adapter.unarchive(remoteId);\n } catch (error) {\n await this._ensureThreadIsNotMain(data.id);\n throw error;\n }\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"regular\");\n },\n });\n }\n\n public async delete(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"deleting it\");\n if (data.status !== \"regular\" && data.status !== \"archived\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be deleted\");\n\n await this._ensureThreadIsNotMain(data.id);\n this._hookManager.stopThreadRuntime(data.id);\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return await this._options.adapter.delete(remoteId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"deleted\");\n },\n });\n }\n\n public async detach(threadIdOrRemoteId: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"detaching it\");\n if (data.status !== \"regular\" && data.status !== \"archived\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be detached\");\n\n await this._ensureThreadIsNotMain(data.id);\n this._hookManager.stopThreadRuntime(data.id);\n }\n\n private useBoundIds = create<string[]>(() => []);\n\n public __internal_RenderComponent: FC = () => {\n const id = useId();\n useEffect(() => {\n this.useBoundIds.setState((s) => [...s, id], true);\n return () => {\n this.useBoundIds.setState((s) => s.filter((i) => i !== id), true);\n };\n }, [id]);\n\n const boundIds = this.useBoundIds();\n const { Provider } = this.useProvider();\n\n const adapters = {\n modelContext: this.contextProvider,\n };\n\n return (\n (boundIds.length === 0 || boundIds[0] === id) && (\n // only render if the component is the first one mounted\n <RuntimeAdapterProvider adapters={adapters}>\n <this._hookManager.__internal_RenderThreadRuntimes\n provider={Provider}\n />\n </RuntimeAdapterProvider>\n )\n );\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"RemoteThreadListThreadListRuntimeCore.js","names":["ThreadListRuntimeCore","generateId","BaseSubscribable","OptimisticState","EMPTY_THREAD_CORE","RemoteThreadData","RemoteThreadState","classifyThreads","createThreadMappingId","getThreadData","normalizeCursor","updateStatusReducer","RemoteThreadListOptions","RemoteThreadListHookInstanceManager","FC","Fragment","useEffect","useId","create","AssistantMessageStream","ModelContextProvider","RuntimeAdapterProvider","threadNotFoundError","threadIdOrRemoteId","action","Error","threadStatusError","status","RemoteThreadListThreadListRuntimeCore","_options","_hookManager","_loadThreadsPromise","Promise","_loadMorePromise","_loadGeneration","_switchGeneration","_switchTask","_mainThreadId","_state","isLoading","isLoadingMore","cursor","undefined","newThreadId","threadIds","archivedThreadIds","threadIdMap","threadData","threadItems","value","getLoadThreadsPromise","generation","optimisticUpdate","execute","adapter","list","loading","state","then","l","fresh","threads","nextCursor","catch","error","console","update","baseValue","loadMore","initialState","resolve","dedup","after","appended","contextProvider","constructor","options","subscribe","_notifySubscribers","_notifyThreadIdChange","runtimeHook","useProvider","Provider","unstable_Provider","__internal_setOptions","switchToNewThread","_initialThreadLoaded","adapterChanged","getState","setState","setRuntimeHook","__internal_load","startThreadId","threadId","initialThreadId","switchToThread","reload","hasMore","mainThreadId","_mainThreadRemoteId","remoteId","_lastNotifiedThreadId","onThreadIdChange","getMainThreadRuntimeCore","result","getThreadRuntimeCore","data","getItemById","id","unarchive","task","_switchToThread","remoteMetadata","fetch","mappingId","newThreadData","initializeTask","externalId","title","lastMessageAt","custom","newThreadIdMap","wasInTarget","includes","threadIdsWithoutRemote","filter","archivedThreadIdsWithoutRemote","newThreadIds","newArchivedThreadIds","startThreadRuntime","_switchToNewThread","waitForUpdate","initialize","optimistic","generateTitle","runtimeCore","messages","stream","messageStream","fromAssistantStream","newTitle","parts","c","type","text","currentData","rename","updateCustom","Record","_ensureThreadIsNotMain","lastAwaitedTask","switchTask","startedFallback","archive","delete","stopThreadRuntime","detach","useBoundIds","__internal_RenderComponent","s","i","boundIds","adapters","modelContext","length"],"sources":["../../../src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx"],"sourcesContent":["import type { ThreadListRuntimeCore } from \"../../runtime/interfaces/thread-list-runtime-core\";\nimport { generateId } from \"../../utils/id\";\nimport { BaseSubscribable } from \"../../subscribable/subscribable\";\nimport { OptimisticState } from \"../../runtimes/remote-thread-list/optimistic-state\";\nimport { EMPTY_THREAD_CORE } from \"../../runtimes/remote-thread-list/empty-thread-core\";\nimport type {\n RemoteThreadData,\n RemoteThreadState,\n} from \"../../runtimes/remote-thread-list/remote-thread-state\";\nimport {\n classifyThreads,\n createThreadMappingId,\n getThreadData,\n normalizeCursor,\n updateStatusReducer,\n} from \"../../runtimes/remote-thread-list/remote-thread-state\";\nimport type { RemoteThreadListOptions } from \"../../runtimes/remote-thread-list/types\";\nimport { RemoteThreadListHookInstanceManager } from \"./RemoteThreadListHookInstanceManager\";\nimport { type FC, Fragment, useEffect, useId } from \"react\";\nimport { create } from \"zustand\";\nimport { AssistantMessageStream } from \"assistant-stream\";\nimport type { ModelContextProvider } from \"../../model-context/types\";\nimport { RuntimeAdapterProvider } from \"./RuntimeAdapterProvider\";\n\nconst threadNotFoundError = (threadIdOrRemoteId: string, action: string) =>\n new Error(`Thread \"${threadIdOrRemoteId}\" not found while ${action}.`);\n\nconst threadStatusError = (\n threadIdOrRemoteId: string,\n status: RemoteThreadData[\"status\"],\n action: string,\n) =>\n new Error(\n `Thread \"${threadIdOrRemoteId}\" has status \"${status}\", so it cannot ${action}.`,\n );\n\nexport class RemoteThreadListThreadListRuntimeCore\n extends BaseSubscribable\n implements ThreadListRuntimeCore\n{\n private _options!: RemoteThreadListOptions;\n private readonly _hookManager: RemoteThreadListHookInstanceManager;\n\n private _loadThreadsPromise: Promise<void> | undefined;\n private _loadMorePromise: Promise<void> | undefined;\n private _loadGeneration = 0;\n private _switchGeneration = 0;\n private _switchTask: Promise<void> | undefined;\n\n private _mainThreadId!: string;\n private readonly _state = new OptimisticState<RemoteThreadState>({\n isLoading: true,\n isLoadingMore: false,\n cursor: undefined,\n newThreadId: undefined,\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n });\n\n public get threadItems() {\n return this._state.value.threadData;\n }\n\n public getLoadThreadsPromise() {\n // TODO this needs to be cached in case this promise is loaded during suspense\n if (!this._loadThreadsPromise) {\n const generation = this._loadGeneration;\n this._loadThreadsPromise = this._state\n .optimisticUpdate({\n execute: () => this._options.adapter.list(),\n loading: (state) => {\n return {\n ...state,\n isLoading: true,\n };\n },\n then: (state, l) => {\n if (generation !== this._loadGeneration) return state;\n const fresh = classifyThreads(l.threads, {\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n });\n\n return {\n ...state,\n isLoading: false,\n cursor: normalizeCursor(l.nextCursor),\n threadIds: fresh.threadIds,\n archivedThreadIds: fresh.archivedThreadIds,\n threadIdMap: {\n ...state.threadIdMap,\n ...fresh.threadIdMap,\n },\n threadData: {\n ...state.threadData,\n ...fresh.threadData,\n },\n };\n },\n })\n .catch((error: unknown) => {\n if (generation !== this._loadGeneration) return;\n console.error(\"[assistant-ui] thread list load failed:\", error);\n this._loadThreadsPromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n isLoading: false,\n });\n })\n .then(() => {});\n }\n\n return this._loadThreadsPromise;\n }\n\n public loadMore(): Promise<void> {\n if (this._loadMorePromise) return this._loadMorePromise;\n\n const initialState = this._state.value;\n if (initialState.cursor === undefined || initialState.isLoading) {\n return Promise.resolve();\n }\n\n const generation = this._loadGeneration;\n const adapter = this._options.adapter;\n const cursor = initialState.cursor;\n\n const dedup = this._state\n .optimisticUpdate({\n execute: () => adapter.list({ after: cursor }),\n loading: (state) => ({ ...state, isLoadingMore: true }),\n then: (state, l) => {\n if (generation !== this._loadGeneration) return state;\n if (adapter !== this._options.adapter) return state;\n\n const appended = classifyThreads(l.threads, {\n threadIds: [...state.threadIds],\n archivedThreadIds: [...state.archivedThreadIds],\n threadIdMap: { ...state.threadIdMap },\n threadData: { ...state.threadData },\n });\n\n return {\n ...state,\n isLoadingMore: false,\n cursor: normalizeCursor(l.nextCursor),\n threadIds: appended.threadIds,\n archivedThreadIds: appended.archivedThreadIds,\n threadIdMap: appended.threadIdMap,\n threadData: appended.threadData,\n };\n },\n })\n .catch((error: unknown) => {\n console.error(\"[assistant-ui] thread list loadMore failed:\", error);\n })\n .then(() => {\n if (this._loadMorePromise === dedup) {\n this._loadMorePromise = undefined;\n }\n });\n\n this._loadMorePromise = dedup;\n return dedup;\n }\n\n private readonly contextProvider: ModelContextProvider;\n\n constructor(\n options: RemoteThreadListOptions,\n contextProvider: ModelContextProvider,\n ) {\n super();\n this.contextProvider = contextProvider;\n\n this._state.subscribe(() => {\n this._notifySubscribers();\n this._notifyThreadIdChange();\n });\n this._hookManager = new RemoteThreadListHookInstanceManager(\n options.runtimeHook,\n this,\n );\n this.useProvider = create(() => ({\n Provider: options.adapter.unstable_Provider ?? Fragment,\n }));\n this.__internal_setOptions(options);\n this.switchToNewThread();\n }\n\n private _initialThreadLoaded = false;\n private useProvider;\n\n public __internal_setOptions(options: RemoteThreadListOptions) {\n if (this._options === options) return;\n\n const adapterChanged =\n this._options !== undefined && this._options.adapter !== options.adapter;\n\n this._options = options;\n\n const Provider = options.adapter.unstable_Provider ?? Fragment;\n if (Provider !== this.useProvider.getState().Provider) {\n this.useProvider.setState({ Provider }, true);\n }\n\n this._hookManager.setRuntimeHook(options.runtimeHook);\n\n if (adapterChanged) {\n this._loadGeneration++;\n this._loadThreadsPromise = undefined;\n this._loadMorePromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n cursor: undefined,\n });\n }\n }\n\n public __internal_load() {\n this.getLoadThreadsPromise(); // begin loading on initial bind\n const startThreadId =\n this._options.threadId ?? this._options.initialThreadId;\n if (!this._initialThreadLoaded && startThreadId) {\n this._initialThreadLoaded = true;\n this.switchToThread(startThreadId).catch(() => {});\n }\n }\n\n public reload() {\n this._loadGeneration++;\n this._loadThreadsPromise = undefined;\n this._loadMorePromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n cursor: undefined,\n });\n return this.getLoadThreadsPromise();\n }\n\n public get isLoading() {\n return this._state.value.isLoading;\n }\n\n public get isLoadingMore() {\n return this._state.value.isLoadingMore;\n }\n\n public get hasMore() {\n return this._state.value.cursor !== undefined;\n }\n\n public get threadIds() {\n return this._state.value.threadIds;\n }\n\n public get archivedThreadIds() {\n return this._state.value.archivedThreadIds;\n }\n\n public get newThreadId() {\n return this._state.value.newThreadId;\n }\n\n public get mainThreadId(): string {\n return this._mainThreadId;\n }\n\n // The settled remote ID of the active thread, or undefined while it is still\n // a new/optimistic thread. This is the value surfaced to `onThreadIdChange`.\n private get _mainThreadRemoteId(): string | undefined {\n if (this._mainThreadId === undefined) return undefined;\n return getThreadData(this._state.value, this._mainThreadId)?.remoteId;\n }\n\n private _lastNotifiedThreadId: string | undefined = undefined;\n\n private _notifyThreadIdChange() {\n const threadId = this._mainThreadRemoteId;\n if (this._lastNotifiedThreadId === threadId) return;\n this._lastNotifiedThreadId = threadId;\n this._options.onThreadIdChange?.(threadId);\n }\n\n public getMainThreadRuntimeCore() {\n const result = this._hookManager.getThreadRuntimeCore(this._mainThreadId);\n if (!result) return EMPTY_THREAD_CORE;\n return result;\n }\n\n public getThreadRuntimeCore(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data)\n throw threadNotFoundError(threadIdOrRemoteId, \"getting its runtime\");\n\n const result = this._hookManager.getThreadRuntimeCore(data.id);\n if (!result)\n throw new Error(\n `Runtime for thread \"${threadIdOrRemoteId}\" not found while getting its runtime.`,\n );\n return result;\n }\n\n public getItemById(threadIdOrRemoteId: string) {\n return getThreadData(this._state.value, threadIdOrRemoteId);\n }\n\n public switchToThread(\n threadIdOrRemoteId: string,\n options?: { unarchive?: boolean },\n ): Promise<void> {\n const generation = ++this._switchGeneration;\n const task = this._switchToThread(threadIdOrRemoteId, options, generation);\n this._switchTask = task;\n return task;\n }\n\n private async _switchToThread(\n threadIdOrRemoteId: string,\n options: { unarchive?: boolean } | undefined,\n generation: number,\n ): Promise<void> {\n let data = this.getItemById(threadIdOrRemoteId);\n\n if (!data) {\n const remoteMetadata =\n await this._options.adapter.fetch(threadIdOrRemoteId);\n if (generation !== this._switchGeneration) return;\n\n const state = this._state.value;\n const mappingId = createThreadMappingId(remoteMetadata.remoteId);\n\n const newThreadData = {\n ...state.threadData,\n [mappingId]: {\n id: mappingId,\n initializeTask: Promise.resolve({\n remoteId: remoteMetadata.remoteId,\n externalId: remoteMetadata.externalId,\n }),\n remoteId: remoteMetadata.remoteId,\n externalId: remoteMetadata.externalId,\n status: remoteMetadata.status,\n title: remoteMetadata.title,\n lastMessageAt: remoteMetadata.lastMessageAt,\n custom: remoteMetadata.custom,\n } as RemoteThreadData,\n };\n\n const newThreadIdMap = {\n ...state.threadIdMap,\n [remoteMetadata.remoteId]: mappingId,\n };\n\n // A concurrent `list()` may already have placed this thread; keep that\n // position and only merge metadata. A genuinely absent thread stays\n // appended: it may live on an unloaded page, and a prepend would pin it\n // above newer threads permanently since `classifyThreads` skips ids it\n // has already seen. Filtering both arrays first still prevents\n // duplication or a wrong-status entry from `list()`.\n const remoteId = remoteMetadata.remoteId;\n const wasInTarget =\n remoteMetadata.status === \"regular\"\n ? state.threadIds.includes(remoteId)\n : state.archivedThreadIds.includes(remoteId);\n\n const threadIdsWithoutRemote = state.threadIds.filter(\n (id) => id !== remoteId,\n );\n const archivedThreadIdsWithoutRemote = state.archivedThreadIds.filter(\n (id) => id !== remoteId,\n );\n\n const newThreadIds =\n remoteMetadata.status === \"regular\"\n ? wasInTarget\n ? state.threadIds\n : [...threadIdsWithoutRemote, remoteId]\n : threadIdsWithoutRemote;\n const newArchivedThreadIds =\n remoteMetadata.status === \"archived\"\n ? wasInTarget\n ? state.archivedThreadIds\n : [...archivedThreadIdsWithoutRemote, remoteId]\n : archivedThreadIdsWithoutRemote;\n\n this._state.update({\n ...state,\n threadIds: newThreadIds,\n archivedThreadIds: newArchivedThreadIds,\n threadIdMap: newThreadIdMap,\n threadData: newThreadData,\n });\n\n data = this.getItemById(threadIdOrRemoteId);\n }\n\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"switching to it\");\n if (this._mainThreadId === data.id) return;\n\n const task = this._hookManager.startThreadRuntime(data.id);\n if (this.mainThreadId !== undefined) {\n await task;\n } else {\n task.then(() => this._notifySubscribers());\n }\n\n if (generation !== this._switchGeneration) return;\n\n if (data.status === \"archived\" && options?.unarchive !== false) {\n await this.unarchive(data.id);\n if (generation !== this._switchGeneration) return;\n }\n this._mainThreadId = data.id;\n\n this._notifySubscribers();\n this._notifyThreadIdChange();\n }\n\n public switchToNewThread(): Promise<void> {\n const generation = ++this._switchGeneration;\n const task = this._switchToNewThread(generation);\n this._switchTask = task;\n return task;\n }\n\n private async _switchToNewThread(generation: number): Promise<void> {\n // an initialization transaction is in progress, wait for it to settle\n while (\n this._state.baseValue.newThreadId !== undefined &&\n this._state.value.newThreadId === undefined\n ) {\n await this._state.waitForUpdate();\n if (generation !== this._switchGeneration) return;\n }\n\n const state = this._state.value;\n let id: string | undefined = this._state.value.newThreadId;\n if (id === undefined) {\n do {\n id = `__LOCALID_${generateId()}`;\n } while (state.threadIdMap[id]);\n\n const mappingId = createThreadMappingId(id);\n this._state.update({\n ...state,\n newThreadId: id,\n threadIdMap: {\n ...state.threadIdMap,\n [id]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [mappingId]: {\n status: \"new\",\n id,\n remoteId: undefined,\n externalId: undefined,\n title: undefined,\n custom: undefined,\n } satisfies RemoteThreadData,\n },\n });\n }\n\n return this._switchToThread(id, undefined, generation);\n }\n\n public initialize = async (threadId: string) => {\n if (this._state.value.newThreadId !== threadId) {\n const data = this.getItemById(threadId);\n if (!data) throw threadNotFoundError(threadId, \"initializing it\");\n if (data.status === \"new\")\n throw threadStatusError(threadId, data.status, \"be initialized here\");\n const { remoteId, externalId } = await data.initializeTask;\n return { remoteId, externalId };\n }\n\n const { remoteId, externalId } = await this._state.optimisticUpdate({\n execute: () => {\n return this._options.adapter.initialize(threadId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, threadId, \"regular\");\n },\n loading: (state, task) => {\n const mappingId = createThreadMappingId(threadId);\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [mappingId]: {\n ...state.threadData[mappingId],\n initializeTask: task,\n },\n },\n };\n },\n then: (state, { remoteId, externalId }) => {\n const data = getThreadData(state, threadId);\n if (!data) return state;\n\n const mappingId = createThreadMappingId(threadId);\n return {\n ...state,\n threadIdMap: {\n ...state.threadIdMap,\n [remoteId]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [mappingId]: {\n ...data,\n initializeTask: Promise.resolve({ remoteId, externalId }),\n remoteId,\n externalId,\n },\n },\n };\n },\n });\n return { remoteId, externalId };\n };\n\n public generateTitle = async (threadId: string) => {\n const data = this.getItemById(threadId);\n if (!data) throw threadNotFoundError(threadId, \"generating its title\");\n if (data.status === \"new\")\n throw threadStatusError(threadId, data.status, \"generate a title\");\n\n const { remoteId } = await data.initializeTask;\n\n const runtimeCore = this._hookManager.getThreadRuntimeCore(data.id);\n if (!runtimeCore) return; // thread is no longer running\n\n const messages = runtimeCore.messages;\n const stream = await this._options.adapter.generateTitle(\n remoteId,\n messages,\n );\n const messageStream = AssistantMessageStream.fromAssistantStream(stream);\n for await (const result of messageStream) {\n const newTitle = result.parts.filter((c) => c.type === \"text\")[0]?.text;\n const state = this._state.baseValue;\n const currentData = getThreadData(state, data.id);\n if (!currentData) continue;\n this._state.update({\n ...state,\n threadData: {\n ...state.threadData,\n [currentData.id]: {\n ...currentData,\n title: newTitle,\n },\n },\n });\n }\n };\n\n public rename(threadIdOrRemoteId: string, newTitle: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"renaming it\");\n if (data.status === \"new\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be renamed\");\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return this._options.adapter.rename(remoteId, newTitle);\n },\n optimistic: (state) => {\n const data = getThreadData(state, threadIdOrRemoteId);\n if (!data) return state;\n\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [data.id]: {\n ...data,\n title: newTitle,\n },\n },\n };\n },\n });\n }\n\n public updateCustom(\n threadIdOrRemoteId: string,\n custom: Record<string, unknown> | undefined,\n ): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data)\n throw threadNotFoundError(\n threadIdOrRemoteId,\n \"updating its custom metadata\",\n );\n if (data.status === \"new\")\n throw threadStatusError(\n threadIdOrRemoteId,\n data.status,\n \"update custom metadata\",\n );\n\n if (!this._options.adapter.updateCustom) {\n throw new Error(\n \"Remote thread list adapter does not support updating custom metadata\",\n );\n }\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n const adapter = this._options.adapter;\n if (!adapter.updateCustom) {\n throw new Error(\n \"Remote thread list adapter does not support updating custom metadata\",\n );\n }\n return adapter.updateCustom(remoteId, custom);\n },\n optimistic: (state) => {\n const data = getThreadData(state, threadIdOrRemoteId);\n if (!data) return state;\n\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [data.id]: {\n ...data,\n custom,\n },\n },\n };\n },\n });\n }\n\n private async _ensureThreadIsNotMain(threadId: string) {\n if (threadId === this.newThreadId)\n throw new Error(\"Cannot ensure new thread is not main\");\n\n let lastAwaitedTask: Promise<void> | undefined;\n\n while (threadId === this._mainThreadId) {\n let switchTask = this._switchTask;\n const startedFallback = !switchTask || switchTask === lastAwaitedTask;\n if (startedFallback) switchTask = this.switchToNewThread();\n lastAwaitedTask = switchTask;\n\n try {\n await switchTask;\n } catch (error) {\n if (startedFallback && this._switchTask === switchTask) {\n throw error;\n }\n }\n }\n }\n\n public async archive(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"archiving it\");\n if (data.status !== \"regular\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be archived\");\n\n await this._ensureThreadIsNotMain(data.id);\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return this._options.adapter.archive(remoteId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"archived\");\n },\n });\n }\n\n public unarchive(threadIdOrRemoteId: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"unarchiving it\");\n if (data.status !== \"archived\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be unarchived\");\n\n return this._state.optimisticUpdate({\n execute: async () => {\n try {\n const { remoteId } = await data.initializeTask;\n return await this._options.adapter.unarchive(remoteId);\n } catch (error) {\n await this._ensureThreadIsNotMain(data.id);\n throw error;\n }\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"regular\");\n },\n });\n }\n\n public async delete(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"deleting it\");\n if (data.status !== \"regular\" && data.status !== \"archived\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be deleted\");\n\n await this._ensureThreadIsNotMain(data.id);\n this._hookManager.stopThreadRuntime(data.id);\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return await this._options.adapter.delete(remoteId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"deleted\");\n },\n });\n }\n\n public async detach(threadIdOrRemoteId: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"detaching it\");\n if (data.status !== \"regular\" && data.status !== \"archived\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be detached\");\n\n await this._ensureThreadIsNotMain(data.id);\n this._hookManager.stopThreadRuntime(data.id);\n }\n\n private useBoundIds = create<string[]>(() => []);\n\n public __internal_RenderComponent: FC = () => {\n const id = useId();\n useEffect(() => {\n this.useBoundIds.setState((s) => [...s, id], true);\n return () => {\n this.useBoundIds.setState((s) => s.filter((i) => i !== id), true);\n };\n }, [id]);\n\n const boundIds = this.useBoundIds();\n const { Provider } = this.useProvider();\n\n const adapters = {\n modelContext: this.contextProvider,\n };\n\n return (\n (boundIds.length === 0 || boundIds[0] === id) && (\n // only render if the component is the first one mounted\n <RuntimeAdapterProvider adapters={adapters}>\n <this._hookManager.__internal_RenderThreadRuntimes\n provider={Provider}\n />\n </RuntimeAdapterProvider>\n )\n );\n };\n}\n"],"mappings":"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"}
@@ -2,7 +2,37 @@ import { ThreadHistoryAdapter } from "../../../adapters/thread-history.js";
2
2
  import { RefObject } from "react";
3
3
  import { AssistantCloud } from "assistant-cloud";
4
4
  //#region src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts
5
+ type TelemetryToolCall = {
6
+ tool_name: string;
7
+ tool_call_id: string;
8
+ tool_args?: string;
9
+ tool_result?: string;
10
+ tool_source?: "mcp" | "frontend" | "backend";
11
+ };
12
+ type TelemetryStepData = {
13
+ input_tokens?: number;
14
+ output_tokens?: number;
15
+ reasoning_tokens?: number;
16
+ cached_input_tokens?: number;
17
+ tool_calls?: TelemetryToolCall[];
18
+ start_ms?: number;
19
+ end_ms?: number;
20
+ };
21
+ type TelemetryData = {
22
+ status: "completed" | "incomplete" | "error";
23
+ toolCalls?: TelemetryToolCall[];
24
+ totalSteps?: number;
25
+ inputTokens?: number;
26
+ outputTokens?: number;
27
+ reasoningTokens?: number;
28
+ cachedInputTokens?: number;
29
+ outputText?: string;
30
+ metadata?: Record<string, unknown>;
31
+ steps?: TelemetryStepData[];
32
+ modelId?: string;
33
+ };
34
+ declare function extractAuiV0<T>(content: T): TelemetryData | null;
5
35
  declare function useAssistantCloudThreadHistoryAdapter(cloudRef: RefObject<AssistantCloud>): ThreadHistoryAdapter;
6
36
  //#endregion
7
- export { useAssistantCloudThreadHistoryAdapter };
37
+ export { extractAuiV0, useAssistantCloudThreadHistoryAdapter };
8
38
  //# sourceMappingURL=AssistantCloudThreadHistoryAdapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantCloudThreadHistoryAdapter.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts"],"mappings":";;;;iBAmxBgB,sCACd,UAAU,UAAU,kBACnB"}
1
+ {"version":3,"file":"AssistantCloudThreadHistoryAdapter.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts"],"mappings":";;;;KA0OK;EACH;EACA;EACA;EACA;EACA;;KAoDG;EACH;EACA;EACA;EACA;EACA,aAAa;EACb;EACA;;KAmBG;EACH;EACA,YAAY;EACZ;EACA;EACA;EACA;EACA;EACA;EACA,WAAW;EACX,QAAQ;EACR;;iBAiCc,aAAa,GAAG,SAAS,IAAI;iBA+b7B,sCACd,UAAU,UAAU,kBACnB"}
@@ -50,6 +50,15 @@ var AssistantCloudThreadHistoryAdapter = class {
50
50
  await this._persistence.append(remoteId, message.id, parentId, "aui/v0", encoded);
51
51
  if (this.cloudRef.current.telemetry.enabled) this._maybeReportRun(remoteId, "aui/v0", encoded);
52
52
  }
53
+ async update(item) {
54
+ if (!this._persistence.isPersisted(item.message.id)) return this.append(item);
55
+ const { message } = item;
56
+ const remoteId = this.aui.threadListItem().getState().remoteId;
57
+ if (!remoteId) return;
58
+ const encoded = auiV0Encode(message);
59
+ await this._persistence.update(remoteId, message.id, "aui/v0", encoded);
60
+ if (this.cloudRef.current.telemetry.enabled) this._maybeReportRun(remoteId, "aui/v0", encoded);
61
+ }
53
62
  async delete() {
54
63
  throw new Error("Assistant Cloud does not support deleting thread messages yet.");
55
64
  }
@@ -173,6 +182,7 @@ const AUI_STATUS_MAP = {
173
182
  function extractAuiV0(content) {
174
183
  const msg = content;
175
184
  if (msg.role !== "assistant") return null;
185
+ if (msg.status?.type === "requires-action") return null;
176
186
  const toolCalls = msg.content?.filter((p) => p.type === "tool-call" && p.toolName && p.toolCallId).map((p) => buildToolCall(p.toolName, p.toolCallId, p.args, p.result, p.argsText));
177
187
  const textParts = msg.content?.filter((p) => p.type === "text" && p.text);
178
188
  const outputText = textParts && textParts.length > 0 ? truncateStr(textParts.map((p) => p.text).join("")) : void 0;
@@ -425,6 +435,6 @@ function useAssistantCloudThreadHistoryAdapter(cloudRef) {
425
435
  return adapter;
426
436
  }
427
437
  //#endregion
428
- export { useAssistantCloudThreadHistoryAdapter };
438
+ export { extractAuiV0, useAssistantCloudThreadHistoryAdapter };
429
439
 
430
440
  //# sourceMappingURL=AssistantCloudThreadHistoryAdapter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantCloudThreadHistoryAdapter.js","names":["RefObject","useState","GenericThreadHistoryAdapter","ThreadHistoryAdapter","MessageFormatAdapter","MessageFormatItem","MessageFormatRepository","ExportedMessageRepositoryItem","AssistantCloud","CloudMessagePersistence","createFormattedPersistence","auiV0Decode","auiV0Encode","AssistantClient","useAui","ThreadListItemMethods","globalPersistence","WeakMap","AssistantCloudThreadHistoryAdapter","constructor","cloudRef","aui","_persistence","key","threadListItem","has","set","current","get","withFormat","Record","formatAdapter","TMessage","TStorageFormat","adapter","formatted","append","item","remoteId","initialize","update","localMessageId","getState","delete","Error","reportTelemetry","items","options","durationMs","stepTimestamps","StepTimestamp","encodedRunMessages","map","encode","_reportRunTelemetry","format","load","Promise","messages","parentId","message","encoded","id","telemetry","enabled","_maybeReportRun","filter","m","reverse","runMessages","T","extracted","extractRunTelemetry","_sendReport","content","extractTelemetry","data","TelemetryData","mergedSteps","mergeStepTimestamps","steps","initial","Parameters","this","runs","report","thread_id","status","totalSteps","total_steps","undefined","toolCalls","tool_calls","inputTokens","input_tokens","outputTokens","output_tokens","reasoningTokens","reasoning_tokens","cachedInputTokens","cached_input_tokens","duration_ms","outputText","output_text","metadata","modelId","model_id","beforeReport","catch","MAX_SPAN_CONTENT","truncateStr","value","length","slice","safeStringify","JSON","stringify","TelemetryToolCall","tool_name","tool_call_id","tool_args","tool_result","tool_source","BASE64_PATTERN","summarizeMcpResult","parsed","parse","Array","isArray","summarized","type","test","sizeKB","toFixed","buildToolCall","toolName","toolCallId","args","result","argsText","toolSource","call","toolArgs","toolResult","TelemetryStepData","start_ms","end_ms","timestamps","t","len","Math","min","s","i","extractAuiV0","extractAiSdkV6","aggregateAiSdkV6RunSteps","AUI_STATUS_MAP","error","incomplete","msg","role","text","usage","custom","p","textParts","join","totalInput","totalOutput","totalReasoning","totalCachedInput","hasInput","hasOutput","hasReasoning","hasCachedInput","step","statusType","telemetrySteps","AiSdkV6Part","input","output","AiSdkV6Message","parts","isToolCallPart","startsWith","isDynamicToolPart","partToToolCall","collectAiSdkV6Parts","stepsData","currentStepToolCalls","push","tc","extractModelId","buildAiSdkV6Result","hasText","UsageFields","promptTokens","completionTokens","normalizeUsage","u","extractAiSdkV6Usage","normalized","hasAny","n","stepMessages","allTextParts","allToolCalls","allStepsData","hasAssistant","useAssistantCloudThreadHistoryAdapter","$","_c","t0"],"sources":["../../../../src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts"],"sourcesContent":["import { type RefObject, 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, useAui } from \"@assistant-ui/store\";\nimport type { ThreadListItemMethods } from \"../../../store/scopes/thread-list-item\";\n\nconst globalPersistence = new WeakMap<\n ThreadListItemMethods,\n CloudMessagePersistence\n>();\n\nclass AssistantCloudThreadHistoryAdapter implements ThreadHistoryAdapter {\n constructor(\n private cloudRef: RefObject<AssistantCloud>,\n private aui: AssistantClient,\n ) {}\n\n private get _persistence(): CloudMessagePersistence {\n const key = this.aui.threadListItem();\n if (!globalPersistence.has(key)) {\n globalPersistence.set(\n key,\n new CloudMessagePersistence(() => this.cloudRef.current),\n );\n }\n return globalPersistence.get(key)!;\n }\n\n withFormat<TMessage, TStorageFormat extends Record<string, unknown>>(\n formatAdapter: MessageFormatAdapter<TMessage, TStorageFormat>,\n ): GenericThreadHistoryAdapter<TMessage> {\n const adapter = this;\n const formatted = createFormattedPersistence(\n this._persistence,\n formatAdapter,\n );\n return {\n // Note: callers must also call reportTelemetry() for run tracking\n async append(item: MessageFormatItem<TMessage>) {\n const { remoteId } = await adapter.aui.threadListItem().initialize();\n await formatted.append(remoteId, item);\n },\n async update(item: MessageFormatItem<TMessage>, localMessageId: string) {\n const remoteId = adapter.aui.threadListItem().getState().remoteId;\n if (!remoteId) return;\n await formatted.update?.(remoteId, item, localMessageId);\n },\n async delete() {\n throw new Error(\n \"Assistant Cloud does not support deleting thread messages yet.\",\n );\n },\n reportTelemetry(\n items: MessageFormatItem<TMessage>[],\n options?: {\n durationMs?: number;\n stepTimestamps?: StepTimestamp[];\n },\n ) {\n const encodedRunMessages = items.map((item) =>\n formatAdapter.encode(item),\n );\n adapter._reportRunTelemetry(\n formatAdapter.format,\n encodedRunMessages,\n options,\n );\n },\n async load(): Promise<MessageFormatRepository<TMessage>> {\n const remoteId = adapter.aui.threadListItem().getState().remoteId;\n if (!remoteId) return { messages: [] };\n return formatted.load(remoteId);\n },\n };\n }\n\n async append({ parentId, message }: ExportedMessageRepositoryItem) {\n const { remoteId } = await this.aui.threadListItem().initialize();\n const encoded = auiV0Encode(message);\n await this._persistence.append(\n remoteId,\n message.id,\n parentId,\n \"aui/v0\",\n encoded,\n );\n\n if (this.cloudRef.current.telemetry.enabled) {\n this._maybeReportRun(remoteId, \"aui/v0\", encoded);\n }\n }\n\n async delete() {\n throw new Error(\n \"Assistant Cloud does not support deleting thread messages yet.\",\n );\n }\n\n async load() {\n const remoteId = this.aui.threadListItem().getState().remoteId;\n if (!remoteId) return { messages: [] };\n const messages = await this._persistence.load(remoteId, \"aui/v0\");\n return {\n messages: messages\n .filter(\n (m): m is typeof m & { format: \"aui/v0\" } => m.format === \"aui/v0\",\n )\n .map(auiV0Decode)\n .reverse(),\n };\n }\n\n private _reportRunTelemetry<T>(\n format: string,\n runMessages: T[],\n options?: {\n durationMs?: number;\n stepTimestamps?: StepTimestamp[];\n },\n ) {\n if (!this.cloudRef.current.telemetry.enabled) return;\n\n const remoteId = this.aui.threadListItem().getState().remoteId;\n if (!remoteId) return;\n\n const extracted = extractRunTelemetry(format, runMessages);\n if (!extracted) return;\n\n this._sendReport(\n remoteId,\n extracted,\n options?.durationMs,\n options?.stepTimestamps,\n );\n }\n\n private _maybeReportRun<T>(remoteId: string, format: string, content: T) {\n const extracted = extractTelemetry(format, content);\n if (!extracted) return;\n\n this._sendReport(remoteId, extracted);\n }\n\n private _sendReport(\n remoteId: string,\n data: TelemetryData,\n durationMs?: number,\n stepTimestamps?: StepTimestamp[],\n ) {\n const mergedSteps = mergeStepTimestamps(data.steps, stepTimestamps);\n // Keep in sync with assistant-cloud createRunSchema\n // (apps/aui-cloud-api/src/endpoints/runs/create.ts).\n const initial: Parameters<typeof this.cloudRef.current.runs.report>[0] = {\n thread_id: remoteId,\n status: data.status,\n ...(data.totalSteps != null\n ? { total_steps: data.totalSteps }\n : undefined),\n ...(data.toolCalls ? { tool_calls: data.toolCalls } : undefined),\n ...(mergedSteps ? { steps: mergedSteps } : undefined),\n ...(data.inputTokens != null\n ? { input_tokens: data.inputTokens }\n : undefined),\n ...(data.outputTokens != null\n ? { output_tokens: data.outputTokens }\n : undefined),\n ...(data.reasoningTokens != null\n ? { reasoning_tokens: data.reasoningTokens }\n : undefined),\n ...(data.cachedInputTokens != null\n ? { cached_input_tokens: data.cachedInputTokens }\n : undefined),\n ...(durationMs != null ? { duration_ms: durationMs } : undefined),\n ...(data.outputText != null\n ? { output_text: data.outputText }\n : undefined),\n ...(data.metadata ? { metadata: data.metadata } : undefined),\n ...(data.modelId ? { model_id: data.modelId } : undefined),\n };\n\n const { beforeReport } = this.cloudRef.current.telemetry;\n const report = beforeReport ? beforeReport(initial) : initial;\n if (!report) return;\n\n this.cloudRef.current.runs.report(report).catch(() => {});\n }\n}\n\nconst MAX_SPAN_CONTENT = 50_000;\n\nfunction truncateStr(value: string): string {\n if (value.length <= MAX_SPAN_CONTENT) return value;\n return value.slice(0, MAX_SPAN_CONTENT);\n}\n\nfunction safeStringify(value: unknown): string | undefined {\n if (value == null) return undefined;\n try {\n return truncateStr(JSON.stringify(value));\n } catch {\n return undefined;\n }\n}\n\ntype TelemetryToolCall = {\n tool_name: string;\n tool_call_id: string;\n tool_args?: string;\n tool_result?: string;\n tool_source?: \"mcp\" | \"frontend\" | \"backend\";\n};\n\nconst BASE64_PATTERN = /^[A-Za-z0-9+/]{100,}={0,2}$/;\n\nfunction summarizeMcpResult(value: unknown): string | undefined {\n if (value == null) return undefined;\n try {\n const parsed = typeof value === \"string\" ? JSON.parse(value) : value;\n if (Array.isArray(parsed)) {\n const summarized = parsed.map((item) => {\n if (item && typeof item === \"object\" && item.type) {\n if (\n (item.type === \"image\" || item.type === \"audio\") &&\n typeof item.data === \"string\" &&\n BASE64_PATTERN.test(item.data.slice(0, 200))\n ) {\n const sizeKB = ((item.data.length * 3) / 4 / 1024).toFixed(1);\n return { ...item, data: `[${item.type}: ${sizeKB}KB]` };\n }\n }\n return item;\n });\n return truncateStr(JSON.stringify(summarized));\n }\n } catch {\n // not JSON array, fall through\n }\n return safeStringify(value);\n}\n\nfunction buildToolCall(\n toolName: string,\n toolCallId: string,\n args: unknown,\n result: unknown,\n argsText?: string,\n toolSource?: \"mcp\" | \"frontend\" | \"backend\",\n): TelemetryToolCall {\n const call: TelemetryToolCall = {\n tool_name: toolName,\n tool_call_id: toolCallId,\n };\n const toolArgs = argsText ?? safeStringify(args);\n if (toolArgs !== undefined) call.tool_args = toolArgs;\n const toolResult =\n toolSource === \"mcp\" ? summarizeMcpResult(result) : safeStringify(result);\n if (toolResult !== undefined) call.tool_result = toolResult;\n if (toolSource) call.tool_source = toolSource;\n return call;\n}\n\ntype TelemetryStepData = {\n input_tokens?: number;\n output_tokens?: number;\n reasoning_tokens?: number;\n cached_input_tokens?: number;\n tool_calls?: TelemetryToolCall[];\n start_ms?: number;\n end_ms?: number;\n};\n\ntype StepTimestamp = { start_ms: number; end_ms: number };\n\nfunction mergeStepTimestamps(\n steps: TelemetryStepData[] | undefined,\n timestamps: StepTimestamp[] | undefined,\n): TelemetryStepData[] | undefined {\n if (!timestamps) return steps;\n if (!steps) return timestamps.map((t) => ({ ...t }));\n\n const len = Math.min(steps.length, timestamps.length);\n return steps.map((s, i) => ({\n ...s,\n ...(i < len ? timestamps[i] : undefined),\n }));\n}\n\ntype TelemetryData = {\n status: \"completed\" | \"incomplete\" | \"error\";\n toolCalls?: TelemetryToolCall[];\n totalSteps?: number;\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n outputText?: string;\n metadata?: Record<string, unknown>;\n steps?: TelemetryStepData[];\n modelId?: string;\n};\n\nfunction extractTelemetry<T>(format: string, content: T): TelemetryData | null {\n switch (format) {\n case \"aui/v0\":\n return extractAuiV0(content);\n case \"ai-sdk/v6\":\n return extractAiSdkV6(content);\n default:\n return null;\n }\n}\n\nfunction extractRunTelemetry<T>(\n format: string,\n runMessages: T[],\n): TelemetryData | null {\n if (format === \"ai-sdk/v6\") {\n return aggregateAiSdkV6RunSteps(runMessages);\n }\n for (let i = runMessages.length - 1; i >= 0; i--) {\n const result = extractTelemetry(format, runMessages[i]!);\n if (result) return result;\n }\n return null;\n}\n\nconst AUI_STATUS_MAP: Record<string, TelemetryData[\"status\"]> = {\n error: \"error\",\n incomplete: \"incomplete\",\n};\n\nfunction 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\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 const [adapter] = useState(\n () => new AssistantCloudThreadHistoryAdapter(cloudRef, aui),\n );\n return adapter;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AssistantCloudThreadHistoryAdapter.js","names":["RefObject","useState","GenericThreadHistoryAdapter","ThreadHistoryAdapter","MessageFormatAdapter","MessageFormatItem","MessageFormatRepository","ExportedMessageRepositoryItem","AssistantCloud","CloudMessagePersistence","createFormattedPersistence","auiV0Decode","auiV0Encode","AssistantClient","useAui","ThreadListItemMethods","globalPersistence","WeakMap","AssistantCloudThreadHistoryAdapter","cloudRef","aui","constructor","_persistence","key","threadListItem","has","set","current","get","withFormat","Record","formatAdapter","TMessage","TStorageFormat","adapter","formatted","append","item","remoteId","initialize","update","localMessageId","getState","delete","Error","reportTelemetry","items","options","durationMs","stepTimestamps","StepTimestamp","encodedRunMessages","map","encode","_reportRunTelemetry","format","load","Promise","messages","parentId","message","encoded","id","telemetry","enabled","_maybeReportRun","isPersisted","filter","m","reverse","runMessages","T","extracted","extractRunTelemetry","_sendReport","content","extractTelemetry","data","TelemetryData","mergedSteps","mergeStepTimestamps","steps","initial","Parameters","this","runs","report","thread_id","status","totalSteps","total_steps","undefined","toolCalls","tool_calls","inputTokens","input_tokens","outputTokens","output_tokens","reasoningTokens","reasoning_tokens","cachedInputTokens","cached_input_tokens","duration_ms","outputText","output_text","metadata","modelId","model_id","beforeReport","catch","MAX_SPAN_CONTENT","truncateStr","value","length","slice","safeStringify","JSON","stringify","TelemetryToolCall","tool_name","tool_call_id","tool_args","tool_result","tool_source","BASE64_PATTERN","summarizeMcpResult","parsed","parse","Array","isArray","summarized","type","test","sizeKB","toFixed","buildToolCall","toolName","toolCallId","args","result","argsText","toolSource","call","toolArgs","toolResult","TelemetryStepData","start_ms","end_ms","timestamps","t","len","Math","min","s","i","extractAuiV0","extractAiSdkV6","aggregateAiSdkV6RunSteps","AUI_STATUS_MAP","error","incomplete","msg","role","text","usage","custom","p","textParts","join","totalInput","totalOutput","totalReasoning","totalCachedInput","hasInput","hasOutput","hasReasoning","hasCachedInput","step","statusType","telemetrySteps","AiSdkV6Part","input","output","AiSdkV6Message","parts","isToolCallPart","startsWith","isDynamicToolPart","partToToolCall","collectAiSdkV6Parts","stepsData","currentStepToolCalls","push","tc","extractModelId","buildAiSdkV6Result","hasText","UsageFields","promptTokens","completionTokens","normalizeUsage","u","extractAiSdkV6Usage","normalized","hasAny","n","stepMessages","allTextParts","allToolCalls","allStepsData","hasAssistant","useAssistantCloudThreadHistoryAdapter","$","_c","t0"],"sources":["../../../../src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts"],"sourcesContent":["import { type RefObject, 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, useAui } from \"@assistant-ui/store\";\nimport type { ThreadListItemMethods } from \"../../../store/scopes/thread-list-item\";\n\nconst globalPersistence = new WeakMap<\n ThreadListItemMethods,\n CloudMessagePersistence\n>();\n\nclass AssistantCloudThreadHistoryAdapter implements ThreadHistoryAdapter {\n private cloudRef: RefObject<AssistantCloud>;\n private aui: AssistantClient;\n\n constructor(cloudRef: RefObject<AssistantCloud>, aui: AssistantClient) {\n this.cloudRef = cloudRef;\n this.aui = aui;\n }\n\n private get _persistence(): CloudMessagePersistence {\n const key = this.aui.threadListItem();\n if (!globalPersistence.has(key)) {\n globalPersistence.set(\n key,\n new CloudMessagePersistence(() => this.cloudRef.current),\n );\n }\n return globalPersistence.get(key)!;\n }\n\n withFormat<TMessage, TStorageFormat extends Record<string, unknown>>(\n formatAdapter: MessageFormatAdapter<TMessage, TStorageFormat>,\n ): GenericThreadHistoryAdapter<TMessage> {\n const adapter = this;\n const formatted = createFormattedPersistence(\n this._persistence,\n formatAdapter,\n );\n return {\n // Note: callers must also call reportTelemetry() for run tracking\n async append(item: MessageFormatItem<TMessage>) {\n const { remoteId } = await adapter.aui.threadListItem().initialize();\n await formatted.append(remoteId, item);\n },\n async update(item: MessageFormatItem<TMessage>, localMessageId: string) {\n const remoteId = adapter.aui.threadListItem().getState().remoteId;\n if (!remoteId) return;\n await formatted.update?.(remoteId, item, localMessageId);\n },\n async delete() {\n throw new Error(\n \"Assistant Cloud does not support deleting thread messages yet.\",\n );\n },\n reportTelemetry(\n items: MessageFormatItem<TMessage>[],\n options?: {\n durationMs?: number;\n stepTimestamps?: StepTimestamp[];\n },\n ) {\n const encodedRunMessages = items.map((item) =>\n formatAdapter.encode(item),\n );\n adapter._reportRunTelemetry(\n formatAdapter.format,\n encodedRunMessages,\n options,\n );\n },\n async load(): Promise<MessageFormatRepository<TMessage>> {\n const remoteId = adapter.aui.threadListItem().getState().remoteId;\n if (!remoteId) return { messages: [] };\n return formatted.load(remoteId);\n },\n };\n }\n\n async append({ parentId, message }: ExportedMessageRepositoryItem) {\n const { remoteId } = await this.aui.threadListItem().initialize();\n const encoded = auiV0Encode(message);\n await this._persistence.append(\n remoteId,\n message.id,\n parentId,\n \"aui/v0\",\n encoded,\n );\n\n if (this.cloudRef.current.telemetry.enabled) {\n this._maybeReportRun(remoteId, \"aui/v0\", encoded);\n }\n }\n\n async update(item: ExportedMessageRepositoryItem) {\n if (!this._persistence.isPersisted(item.message.id)) {\n return this.append(item);\n }\n const { message } = item;\n const remoteId = this.aui.threadListItem().getState().remoteId;\n if (!remoteId) return;\n const encoded = auiV0Encode(message);\n await this._persistence.update(remoteId, message.id, \"aui/v0\", encoded);\n\n if (this.cloudRef.current.telemetry.enabled) {\n this._maybeReportRun(remoteId, \"aui/v0\", encoded);\n }\n }\n\n async delete() {\n throw new Error(\n \"Assistant Cloud does not support deleting thread messages yet.\",\n );\n }\n\n async load() {\n const remoteId = this.aui.threadListItem().getState().remoteId;\n if (!remoteId) return { messages: [] };\n const messages = await this._persistence.load(remoteId, \"aui/v0\");\n return {\n messages: messages\n .filter(\n (m): m is typeof m & { format: \"aui/v0\" } => m.format === \"aui/v0\",\n )\n .map(auiV0Decode)\n .reverse(),\n };\n }\n\n private _reportRunTelemetry<T>(\n format: string,\n runMessages: T[],\n options?: {\n durationMs?: number;\n stepTimestamps?: StepTimestamp[];\n },\n ) {\n if (!this.cloudRef.current.telemetry.enabled) return;\n\n const remoteId = this.aui.threadListItem().getState().remoteId;\n if (!remoteId) return;\n\n const extracted = extractRunTelemetry(format, runMessages);\n if (!extracted) return;\n\n this._sendReport(\n remoteId,\n extracted,\n options?.durationMs,\n options?.stepTimestamps,\n );\n }\n\n private _maybeReportRun<T>(remoteId: string, format: string, content: T) {\n const extracted = extractTelemetry(format, content);\n if (!extracted) return;\n\n this._sendReport(remoteId, extracted);\n }\n\n private _sendReport(\n remoteId: string,\n data: TelemetryData,\n durationMs?: number,\n stepTimestamps?: StepTimestamp[],\n ) {\n const mergedSteps = mergeStepTimestamps(data.steps, stepTimestamps);\n // Keep in sync with assistant-cloud createRunSchema\n // (apps/aui-cloud-api/src/endpoints/runs/create.ts).\n const initial: Parameters<typeof this.cloudRef.current.runs.report>[0] = {\n thread_id: remoteId,\n status: data.status,\n ...(data.totalSteps != null\n ? { total_steps: data.totalSteps }\n : undefined),\n ...(data.toolCalls ? { tool_calls: data.toolCalls } : undefined),\n ...(mergedSteps ? { steps: mergedSteps } : undefined),\n ...(data.inputTokens != null\n ? { input_tokens: data.inputTokens }\n : undefined),\n ...(data.outputTokens != null\n ? { output_tokens: data.outputTokens }\n : undefined),\n ...(data.reasoningTokens != null\n ? { reasoning_tokens: data.reasoningTokens }\n : undefined),\n ...(data.cachedInputTokens != null\n ? { cached_input_tokens: data.cachedInputTokens }\n : undefined),\n ...(durationMs != null ? { duration_ms: durationMs } : undefined),\n ...(data.outputText != null\n ? { output_text: data.outputText }\n : undefined),\n ...(data.metadata ? { metadata: data.metadata } : undefined),\n ...(data.modelId ? { model_id: data.modelId } : undefined),\n };\n\n const { beforeReport } = this.cloudRef.current.telemetry;\n const report = beforeReport ? beforeReport(initial) : initial;\n if (!report) return;\n\n this.cloudRef.current.runs.report(report).catch(() => {});\n }\n}\n\nconst MAX_SPAN_CONTENT = 50_000;\n\nfunction truncateStr(value: string): string {\n if (value.length <= MAX_SPAN_CONTENT) return value;\n return value.slice(0, MAX_SPAN_CONTENT);\n}\n\nfunction safeStringify(value: unknown): string | undefined {\n if (value == null) return undefined;\n try {\n return truncateStr(JSON.stringify(value));\n } catch {\n return undefined;\n }\n}\n\ntype TelemetryToolCall = {\n tool_name: string;\n tool_call_id: string;\n tool_args?: string;\n tool_result?: string;\n tool_source?: \"mcp\" | \"frontend\" | \"backend\";\n};\n\nconst BASE64_PATTERN = /^[A-Za-z0-9+/]{100,}={0,2}$/;\n\nfunction summarizeMcpResult(value: unknown): string | undefined {\n if (value == null) return undefined;\n try {\n const parsed = typeof value === \"string\" ? JSON.parse(value) : value;\n if (Array.isArray(parsed)) {\n const summarized = parsed.map((item) => {\n if (item && typeof item === \"object\" && item.type) {\n if (\n (item.type === \"image\" || item.type === \"audio\") &&\n typeof item.data === \"string\" &&\n BASE64_PATTERN.test(item.data.slice(0, 200))\n ) {\n const sizeKB = ((item.data.length * 3) / 4 / 1024).toFixed(1);\n return { ...item, data: `[${item.type}: ${sizeKB}KB]` };\n }\n }\n return item;\n });\n return truncateStr(JSON.stringify(summarized));\n }\n } catch {\n // not JSON array, fall through\n }\n return safeStringify(value);\n}\n\nfunction buildToolCall(\n toolName: string,\n toolCallId: string,\n args: unknown,\n result: unknown,\n argsText?: string,\n toolSource?: \"mcp\" | \"frontend\" | \"backend\",\n): TelemetryToolCall {\n const call: TelemetryToolCall = {\n tool_name: toolName,\n tool_call_id: toolCallId,\n };\n const toolArgs = argsText ?? safeStringify(args);\n if (toolArgs !== undefined) call.tool_args = toolArgs;\n const toolResult =\n toolSource === \"mcp\" ? summarizeMcpResult(result) : safeStringify(result);\n if (toolResult !== undefined) call.tool_result = toolResult;\n if (toolSource) call.tool_source = toolSource;\n return call;\n}\n\ntype TelemetryStepData = {\n input_tokens?: number;\n output_tokens?: number;\n reasoning_tokens?: number;\n cached_input_tokens?: number;\n tool_calls?: TelemetryToolCall[];\n start_ms?: number;\n end_ms?: number;\n};\n\ntype StepTimestamp = { start_ms: number; end_ms: number };\n\nfunction mergeStepTimestamps(\n steps: TelemetryStepData[] | undefined,\n timestamps: StepTimestamp[] | undefined,\n): TelemetryStepData[] | undefined {\n if (!timestamps) return steps;\n if (!steps) return timestamps.map((t) => ({ ...t }));\n\n const len = Math.min(steps.length, timestamps.length);\n return steps.map((s, i) => ({\n ...s,\n ...(i < len ? timestamps[i] : undefined),\n }));\n}\n\ntype TelemetryData = {\n status: \"completed\" | \"incomplete\" | \"error\";\n toolCalls?: TelemetryToolCall[];\n totalSteps?: number;\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n outputText?: string;\n metadata?: Record<string, unknown>;\n steps?: TelemetryStepData[];\n modelId?: string;\n};\n\nfunction extractTelemetry<T>(format: string, content: T): TelemetryData | null {\n switch (format) {\n case \"aui/v0\":\n return extractAuiV0(content);\n case \"ai-sdk/v6\":\n return extractAiSdkV6(content);\n default:\n return null;\n }\n}\n\nfunction extractRunTelemetry<T>(\n format: string,\n runMessages: T[],\n): TelemetryData | null {\n if (format === \"ai-sdk/v6\") {\n return aggregateAiSdkV6RunSteps(runMessages);\n }\n for (let i = runMessages.length - 1; i >= 0; i--) {\n const result = extractTelemetry(format, runMessages[i]!);\n if (result) return result;\n }\n return null;\n}\n\nconst AUI_STATUS_MAP: Record<string, TelemetryData[\"status\"]> = {\n error: \"error\",\n incomplete: \"incomplete\",\n};\n\nexport function extractAuiV0<T>(content: T): TelemetryData | null {\n const msg = content as {\n role?: string;\n status?: { type: string };\n content?: readonly {\n type: string;\n text?: string;\n toolName?: string;\n toolCallId?: string;\n args?: unknown;\n argsText?: string;\n result?: unknown;\n }[];\n metadata?: {\n modelId?: string;\n steps?: readonly {\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n };\n }[];\n custom?: Record<string, unknown> & { modelId?: string };\n };\n };\n\n if (msg.role !== \"assistant\") return null;\n // A paused (requires-action) write is not a finished run; reporting it would\n // mislabel it \"completed\" and double-count steps once the terminal write reports.\n if (msg.status?.type === \"requires-action\") return null;\n\n const toolCalls = msg.content\n ?.filter((p) => p.type === \"tool-call\" && p.toolName && p.toolCallId)\n .map((p) =>\n buildToolCall(p.toolName!, p.toolCallId!, p.args, p.result, p.argsText),\n );\n\n const textParts = msg.content?.filter((p) => p.type === \"text\" && p.text);\n const outputText =\n textParts && textParts.length > 0\n ? truncateStr(textParts.map((p) => p.text).join(\"\"))\n : undefined;\n\n const steps = msg.metadata?.steps;\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let reasoningTokens: number | undefined;\n let cachedInputTokens: number | undefined;\n if (steps && steps.length > 0) {\n let totalInput = 0;\n let totalOutput = 0;\n let totalReasoning = 0;\n let totalCachedInput = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n for (const step of steps) {\n if (step.usage?.inputTokens != null) {\n totalInput += step.usage.inputTokens;\n hasInput = true;\n }\n if (step.usage?.outputTokens != null) {\n totalOutput += step.usage.outputTokens;\n hasOutput = true;\n }\n if (step.usage?.reasoningTokens != null) {\n totalReasoning += step.usage.reasoningTokens;\n hasReasoning = true;\n }\n if (step.usage?.cachedInputTokens != null) {\n totalCachedInput += step.usage.cachedInputTokens;\n hasCachedInput = true;\n }\n }\n inputTokens = hasInput ? totalInput : undefined;\n outputTokens = hasOutput ? totalOutput : undefined;\n reasoningTokens = hasReasoning ? totalReasoning : undefined;\n cachedInputTokens = hasCachedInput ? totalCachedInput : undefined;\n }\n\n const statusType = msg.status?.type;\n const status: TelemetryData[\"status\"] =\n (statusType && AUI_STATUS_MAP[statusType]) || \"completed\";\n\n const metadata = msg.metadata?.custom as Record<string, unknown> | undefined;\n const modelId =\n msg.metadata?.modelId ??\n (typeof msg.metadata?.custom?.modelId === \"string\"\n ? msg.metadata.custom.modelId\n : undefined);\n\n const telemetrySteps: TelemetryStepData[] | undefined =\n steps && steps.length > 1\n ? steps.map((s) => ({\n ...(s.usage?.inputTokens != null\n ? { input_tokens: s.usage.inputTokens }\n : undefined),\n ...(s.usage?.outputTokens != null\n ? { output_tokens: s.usage.outputTokens }\n : undefined),\n ...(s.usage?.reasoningTokens != null\n ? { reasoning_tokens: s.usage.reasoningTokens }\n : undefined),\n ...(s.usage?.cachedInputTokens != null\n ? { cached_input_tokens: s.usage.cachedInputTokens }\n : undefined),\n }))\n : undefined;\n\n return {\n status,\n ...(toolCalls && toolCalls.length > 0 ? { toolCalls } : undefined),\n ...(steps?.length ? { totalSteps: steps.length } : undefined),\n ...(inputTokens != null ? { inputTokens } : undefined),\n ...(outputTokens != null ? { outputTokens } : undefined),\n ...(reasoningTokens != null ? { reasoningTokens } : undefined),\n ...(cachedInputTokens != null ? { cachedInputTokens } : undefined),\n ...(outputText != null ? { outputText } : undefined),\n ...(metadata ? { metadata } : undefined),\n ...(telemetrySteps ? { steps: telemetrySteps } : undefined),\n ...(modelId ? { modelId } : undefined),\n };\n}\n\ntype AiSdkV6Part = {\n type: string;\n text?: string;\n toolName?: string;\n toolCallId?: string;\n args?: unknown;\n result?: unknown;\n input?: unknown;\n output?: unknown;\n};\n\ntype AiSdkV6Message = {\n role?: string;\n parts?: readonly AiSdkV6Part[];\n metadata?: Record<string, unknown>;\n};\n\nfunction isToolCallPart(p: AiSdkV6Part): boolean {\n if (!p.toolCallId) return false;\n if (p.type === \"tool-call\" || p.type === \"dynamic-tool\") return !!p.toolName;\n return p.type.startsWith(\"tool-\") || p.type.startsWith(\"dynamic-tool-\");\n}\n\nfunction isDynamicToolPart(p: AiSdkV6Part): boolean {\n return p.type === \"dynamic-tool\" || p.type.startsWith(\"dynamic-tool-\");\n}\n\nfunction partToToolCall(p: AiSdkV6Part): TelemetryToolCall {\n const toolSource: \"mcp\" | undefined = isDynamicToolPart(p)\n ? \"mcp\"\n : undefined;\n return buildToolCall(\n p.toolName ?? p.type.slice(5),\n p.toolCallId!,\n p.args ?? p.input,\n p.result ?? p.output,\n undefined,\n toolSource,\n );\n}\n\nfunction collectAiSdkV6Parts(parts: readonly AiSdkV6Part[]): {\n textParts: string[];\n toolCalls: TelemetryToolCall[];\n stepsData: { tool_calls: TelemetryToolCall[] }[];\n} {\n const textParts: string[] = [];\n const toolCalls: TelemetryToolCall[] = [];\n const stepsData: { tool_calls: TelemetryToolCall[] }[] = [];\n let currentStepToolCalls: TelemetryToolCall[] | null = null;\n\n for (const p of parts) {\n if (p.type === \"step-start\") {\n if (currentStepToolCalls !== null) {\n stepsData.push({ tool_calls: currentStepToolCalls });\n }\n currentStepToolCalls = [];\n } else if (p.type === \"text\" && p.text) {\n textParts.push(p.text);\n } else if (isToolCallPart(p)) {\n const tc = partToToolCall(p);\n toolCalls.push(tc);\n if (currentStepToolCalls !== null) {\n currentStepToolCalls.push(tc);\n }\n }\n }\n\n if (currentStepToolCalls !== null) {\n stepsData.push({ tool_calls: currentStepToolCalls });\n }\n\n return { textParts, toolCalls, stepsData };\n}\n\nfunction extractModelId(\n metadata?: Record<string, unknown>,\n): string | undefined {\n if (!metadata) return undefined;\n if (typeof metadata.modelId === \"string\") return metadata.modelId;\n const custom = metadata.custom as Record<string, unknown> | undefined;\n if (typeof custom?.modelId === \"string\") return custom.modelId;\n return undefined;\n}\n\nfunction buildAiSdkV6Result(\n textParts: string[],\n toolCalls: TelemetryToolCall[],\n totalSteps: number,\n metadata?: Record<string, unknown>,\n stepsData?: { tool_calls: TelemetryToolCall[] }[],\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n },\n): TelemetryData {\n const hasText = textParts.length > 0;\n const outputText = hasText ? truncateStr(textParts.join(\"\")) : undefined;\n const modelId = extractModelId(metadata);\n\n const steps: TelemetryStepData[] | undefined =\n stepsData && stepsData.length > 1\n ? stepsData.map((s) => ({\n ...(s.tool_calls.length > 0\n ? { tool_calls: s.tool_calls }\n : undefined),\n }))\n : undefined;\n\n return {\n status: hasText ? \"completed\" : \"incomplete\",\n ...(toolCalls.length > 0 ? { toolCalls } : undefined),\n ...(totalSteps > 0 ? { totalSteps } : undefined),\n ...(usage?.inputTokens != null\n ? { inputTokens: usage.inputTokens }\n : undefined),\n ...(usage?.outputTokens != null\n ? { outputTokens: usage.outputTokens }\n : undefined),\n ...(usage?.reasoningTokens != null\n ? { reasoningTokens: usage.reasoningTokens }\n : undefined),\n ...(usage?.cachedInputTokens != null\n ? { cachedInputTokens: usage.cachedInputTokens }\n : undefined),\n ...(outputText != null ? { outputText } : undefined),\n ...(metadata ? { metadata } : undefined),\n ...(steps ? { steps } : undefined),\n ...(modelId ? { modelId } : undefined),\n };\n}\n\ntype UsageFields = {\n inputTokens?: number;\n outputTokens?: number;\n promptTokens?: number;\n completionTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n};\n\nfunction normalizeUsage(u: UsageFields):\n | {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n }\n | undefined {\n const input = u.inputTokens ?? u.promptTokens;\n const output = u.outputTokens ?? u.completionTokens;\n if (\n input == null &&\n output == null &&\n u.reasoningTokens == null &&\n u.cachedInputTokens == null\n ) {\n return undefined;\n }\n\n return {\n ...(input != null ? { inputTokens: input } : undefined),\n ...(output != null ? { outputTokens: output } : undefined),\n ...(u.reasoningTokens != null\n ? { reasoningTokens: u.reasoningTokens }\n : undefined),\n ...(u.cachedInputTokens != null\n ? { cachedInputTokens: u.cachedInputTokens }\n : undefined),\n };\n}\n\nfunction extractAiSdkV6Usage(metadata?: Record<string, unknown>):\n | {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n }\n | undefined {\n // Try top-level metadata.usage\n const usage = metadata?.usage as UsageFields | undefined;\n if (usage) {\n const normalized = normalizeUsage(usage);\n if (normalized) return normalized;\n }\n\n // Try aggregating from metadata.steps[].usage\n const steps = metadata?.steps as\n | readonly { usage?: UsageFields }[]\n | undefined;\n if (steps && steps.length > 0) {\n let inputTokens = 0;\n let outputTokens = 0;\n let reasoningTokens = 0;\n let cachedInputTokens = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n let hasAny = false;\n for (const s of steps) {\n if (!s.usage) continue;\n const n = normalizeUsage(s.usage);\n if (n) {\n if (n.inputTokens != null) {\n inputTokens += n.inputTokens;\n hasInput = true;\n }\n if (n.outputTokens != null) {\n outputTokens += n.outputTokens;\n hasOutput = true;\n }\n if (n.reasoningTokens != null) {\n reasoningTokens += n.reasoningTokens;\n hasReasoning = true;\n }\n if (n.cachedInputTokens != null) {\n cachedInputTokens += n.cachedInputTokens;\n hasCachedInput = true;\n }\n hasAny = true;\n }\n }\n if (hasAny) {\n return {\n ...(hasInput ? { inputTokens } : undefined),\n ...(hasOutput ? { outputTokens } : undefined),\n ...(hasReasoning ? { reasoningTokens } : undefined),\n ...(hasCachedInput ? { cachedInputTokens } : undefined),\n };\n }\n }\n\n return undefined;\n}\n\nfunction extractAiSdkV6<T>(content: T): TelemetryData | null {\n const msg = content as AiSdkV6Message;\n if (msg.role !== \"assistant\") return null;\n\n const { textParts, toolCalls, stepsData } = collectAiSdkV6Parts(\n msg.parts ?? [],\n );\n return buildAiSdkV6Result(\n textParts,\n toolCalls,\n stepsData.length,\n msg.metadata,\n stepsData,\n extractAiSdkV6Usage(msg.metadata),\n );\n}\n\nfunction aggregateAiSdkV6RunSteps<T>(stepMessages: T[]): TelemetryData | null {\n const allTextParts: string[] = [];\n const allToolCalls: TelemetryToolCall[] = [];\n const allStepsData: { tool_calls: TelemetryToolCall[] }[] = [];\n let hasAssistant = false;\n let metadata: Record<string, unknown> | undefined;\n let inputTokens = 0;\n let outputTokens = 0;\n let reasoningTokens = 0;\n let cachedInputTokens = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n\n for (const content of stepMessages) {\n const msg = content as AiSdkV6Message;\n if (msg.role !== \"assistant\") continue;\n hasAssistant = true;\n\n const { textParts, toolCalls, stepsData } = collectAiSdkV6Parts(\n msg.parts ?? [],\n );\n allTextParts.push(...textParts);\n allToolCalls.push(...toolCalls);\n allStepsData.push(...stepsData);\n if (msg.metadata) metadata = msg.metadata;\n\n const usage = extractAiSdkV6Usage(msg.metadata);\n if (usage) {\n if (usage.inputTokens != null) {\n inputTokens += usage.inputTokens;\n hasInput = true;\n }\n if (usage.outputTokens != null) {\n outputTokens += usage.outputTokens;\n hasOutput = true;\n }\n if (usage.reasoningTokens != null) {\n reasoningTokens += usage.reasoningTokens;\n hasReasoning = true;\n }\n if (usage.cachedInputTokens != null) {\n cachedInputTokens += usage.cachedInputTokens;\n hasCachedInput = true;\n }\n }\n }\n\n if (!hasAssistant) return null;\n return buildAiSdkV6Result(\n allTextParts,\n allToolCalls,\n allStepsData.length,\n metadata,\n allStepsData,\n {\n ...(hasInput ? { inputTokens } : undefined),\n ...(hasOutput ? { outputTokens } : undefined),\n ...(hasReasoning ? { reasoningTokens } : undefined),\n ...(hasCachedInput ? { cachedInputTokens } : undefined),\n },\n );\n}\n\nexport function useAssistantCloudThreadHistoryAdapter(\n cloudRef: RefObject<AssistantCloud>,\n): ThreadHistoryAdapter {\n const aui = useAui();\n const [adapter] = useState(\n () => new AssistantCloudThreadHistoryAdapter(cloudRef, aui),\n );\n return adapter;\n}\n"],"mappings":"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"}
@@ -3,8 +3,8 @@ import { AttachmentAdapter } from "../../../adapters/attachment.js";
3
3
  import { AssistantCloud } from "assistant-cloud";
4
4
  //#region src/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts
5
5
  declare class CloudFileAttachmentAdapter implements AttachmentAdapter {
6
- private cloud;
7
6
  accept: string;
7
+ private cloud;
8
8
  constructor(cloud: AssistantCloud);
9
9
  private uploadedUrls;
10
10
  add({ file }: {
@@ -1 +1 @@
1
- {"version":3,"file":"CloudFileAttachmentAdapter.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts"],"mappings":";;;;cAkBa,sCAAsC;UAG7B;EAFb;EAEa,YAAA,OAAO;UAEnB;EAEM,MACZ;IAEA,MAAM;MACJ,eAAe;EAmDN,OAAO,YAAY,aAAa;EAIhC,KACX,YAAY,oBACX,QAAQ"}
1
+ {"version":3,"file":"CloudFileAttachmentAdapter.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts"],"mappings":";;;;cAkBa,sCAAsC;EAC1C;UAEC;EAEI,YAAA,OAAO;UAIX;EAEM,MACZ;IAEA,MAAM;MACJ,eAAe;EAmDN,OAAO,YAAY,aAAa;EAIhC,KACX,YAAY,oBACX,QAAQ"}
@@ -6,8 +6,8 @@ const guessAttachmentType = (contentType) => {
6
6
  return "file";
7
7
  };
8
8
  var CloudFileAttachmentAdapter = class {
9
- cloud;
10
9
  accept = "*";
10
+ cloud;
11
11
  constructor(cloud) {
12
12
  this.cloud = cloud;
13
13
  }
@@ -1 +1 @@
1
- {"version":3,"file":"CloudFileAttachmentAdapter.js","names":["AssistantCloud","Attachment","PendingAttachment","CompleteAttachment","ThreadUserMessagePart","AttachmentAdapter","generateId","guessAttachmentType","contentType","startsWith","CloudFileAttachmentAdapter","accept","constructor","cloud","uploadedUrls","Map","add","file","File","AsyncGenerator","id","type","attachment","name","status","reason","progress","signedUrl","publicUrl","files","generatePresignedUploadUrl","filename","res","fetch","method","body","headers","mode","ok","Error","statusText","set","error","console","message","String","remove","Promise","delete","send","url","get","content","image","data","mimeType"],"sources":["../../../../src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts"],"sourcesContent":["import type { AssistantCloud } from \"assistant-cloud\";\nimport type {\n Attachment,\n PendingAttachment,\n CompleteAttachment,\n} from \"../../../types/attachment\";\nimport type { ThreadUserMessagePart } from \"../../../types/message\";\nimport type { AttachmentAdapter } from \"../../../adapters/attachment\";\nimport { generateId } from \"../../../utils/id\";\n\nconst guessAttachmentType = (\n contentType: string,\n): \"image\" | \"document\" | \"file\" => {\n if (contentType.startsWith(\"image/\")) return \"image\";\n if (contentType.startsWith(\"text/\")) return \"document\";\n return \"file\";\n};\n\nexport class CloudFileAttachmentAdapter implements AttachmentAdapter {\n public accept = \"*\";\n\n constructor(private cloud: AssistantCloud) {}\n\n private uploadedUrls = new Map<string, string>();\n\n public async *add({\n file,\n }: {\n file: File;\n }): AsyncGenerator<PendingAttachment, void> {\n const id = generateId();\n const type = guessAttachmentType(file.type);\n let attachment: PendingAttachment = {\n id,\n type,\n name: file.name,\n contentType: file.type,\n file,\n status: { type: \"running\", reason: \"uploading\", progress: 0 },\n };\n yield attachment;\n\n try {\n const { signedUrl, publicUrl } =\n await this.cloud.files.generatePresignedUploadUrl({\n filename: file.name,\n });\n const res = await fetch(signedUrl, {\n method: \"PUT\",\n body: file,\n headers: {\n \"Content-Type\": file.type,\n },\n mode: \"cors\",\n });\n if (!res.ok) {\n throw new Error(\n `Failed to upload file: ${res.status} ${res.statusText}`,\n );\n }\n this.uploadedUrls.set(id, publicUrl);\n attachment = {\n ...attachment,\n status: { type: \"requires-action\", reason: \"composer-send\" },\n };\n yield attachment;\n } catch (error) {\n console.error(\"[assistant-ui] Failed to upload attachment:\", error);\n attachment = {\n ...attachment,\n status: {\n type: \"incomplete\",\n reason: \"error\",\n message: error instanceof Error ? error.message : String(error),\n },\n };\n yield attachment;\n }\n }\n\n public async remove(attachment: Attachment): Promise<void> {\n this.uploadedUrls.delete(attachment.id);\n }\n\n public async send(\n attachment: PendingAttachment,\n ): Promise<CompleteAttachment> {\n const url = this.uploadedUrls.get(attachment.id);\n if (!url) throw new Error(\"Attachment not uploaded\");\n this.uploadedUrls.delete(attachment.id);\n\n let content: ThreadUserMessagePart[];\n if (attachment.type === \"image\") {\n content = [{ type: \"image\", image: url, filename: attachment.name }];\n } else {\n content = [\n {\n type: \"file\",\n data: url,\n mimeType: attachment.contentType ?? \"\",\n filename: attachment.name,\n },\n ];\n }\n\n return {\n ...attachment,\n status: { type: \"complete\" },\n content,\n };\n }\n}\n"],"mappings":";;AAUA,MAAMO,uBACJC,gBACkC;CAClC,IAAIA,YAAYC,WAAW,QAAQ,GAAG,OAAO;CAC7C,IAAID,YAAYC,WAAW,OAAO,GAAG,OAAO;CAC5C,OAAO;AACT;AAEA,IAAaC,6BAAb,MAAqE;CAG/CG;CAFpB,SAAgB;CAEhBD,YAAY,OAA+B;EAAvBC,KAAAA,QAAAA;CAAwB;CAE5C,+BAAuB,IAAIE,IAAoB;CAE/C,OAAcC,IAAI,EAChBC,QAG0C;EAC1C,MAAMG,KAAKd,WAAW;EAEtB,IAAIgB,aAAgC;GAClCF;GACAC,MAHWd,oBAAoBU,KAAKI,IAGpCA;GACAE,MAAMN,KAAKM;GACXf,aAAaS,KAAKI;GAClBJ;GACAO,QAAQ;IAAEH,MAAM;IAAWI,QAAQ;IAAaC,UAAU;GAAE;EAC9D;EACA,MAAMJ;EAEN,IAAI;GACF,MAAM,EAAEK,WAAWC,cACjB,MAAM,KAAKf,MAAMgB,MAAMC,2BAA2B,EAChDC,UAAUd,KAAKM,KACjB,CAAC;GACH,MAAMS,MAAM,MAAMC,MAAMN,WAAW;IACjCO,QAAQ;IACRC,MAAMlB;IACNmB,SAAS,EACP,gBAAgBnB,KAAKI,KACvB;IACAgB,MAAM;GACR,CAAC;GACD,IAAI,CAACL,IAAIM,IACP,MAAM,IAAIC,MACR,0BAA0BP,IAAIR,OAAM,GAAIQ,IAAIQ,YAC9C;GAEF,KAAK1B,aAAa2B,IAAIrB,IAAIQ,SAAS;GACnCN,aAAa;IACX,GAAGA;IACHE,QAAQ;KAAEH,MAAM;KAAmBI,QAAQ;IAAgB;GAC7D;GACA,MAAMH;EACR,SAASoB,OAAO;GACdC,QAAQD,MAAM,+CAA+CA,KAAK;GAClEpB,aAAa;IACX,GAAGA;IACHE,QAAQ;KACNH,MAAM;KACNI,QAAQ;KACRmB,SAASF,iBAAiBH,QAAQG,MAAME,UAAUC,OAAOH,KAAK;IAChE;GACF;GACA,MAAMpB;EACR;CACF;CAEA,MAAawB,OAAOxB,YAAuC;EACzD,KAAKR,aAAakC,OAAO1B,WAAWF,EAAE;CACxC;CAEA,MAAa6B,KACX3B,YAC6B;EAC7B,MAAM4B,MAAM,KAAKpC,aAAaqC,IAAI7B,WAAWF,EAAE;EAC/C,IAAI,CAAC8B,KAAK,MAAM,IAAIX,MAAM,yBAAyB;EACnD,KAAKzB,aAAakC,OAAO1B,WAAWF,EAAE;EAEtC,IAAIgC;EACJ,IAAI9B,WAAWD,SAAS,SACtB+B,UAAU,CAAC;GAAE/B,MAAM;GAASgC,OAAOH;GAAKnB,UAAUT,WAAWC;EAAK,CAAC;OAEnE6B,UAAU,CACR;GACE/B,MAAM;GACNiC,MAAMJ;GACNK,UAAUjC,WAAWd,eAAe;GACpCuB,UAAUT,WAAWC;EACvB,CAAC;EAIL,OAAO;GACL,GAAGD;GACHE,QAAQ,EAAEH,MAAM,WAAW;GAC3B+B;EACF;CACF;AACF"}
1
+ {"version":3,"file":"CloudFileAttachmentAdapter.js","names":["AssistantCloud","Attachment","PendingAttachment","CompleteAttachment","ThreadUserMessagePart","AttachmentAdapter","generateId","guessAttachmentType","contentType","startsWith","CloudFileAttachmentAdapter","accept","cloud","constructor","uploadedUrls","Map","add","file","File","AsyncGenerator","id","type","attachment","name","status","reason","progress","signedUrl","publicUrl","files","generatePresignedUploadUrl","filename","res","fetch","method","body","headers","mode","ok","Error","statusText","set","error","console","message","String","remove","Promise","delete","send","url","get","content","image","data","mimeType"],"sources":["../../../../src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts"],"sourcesContent":["import type { AssistantCloud } from \"assistant-cloud\";\nimport type {\n Attachment,\n PendingAttachment,\n CompleteAttachment,\n} from \"../../../types/attachment\";\nimport type { ThreadUserMessagePart } from \"../../../types/message\";\nimport type { AttachmentAdapter } from \"../../../adapters/attachment\";\nimport { generateId } from \"../../../utils/id\";\n\nconst guessAttachmentType = (\n contentType: string,\n): \"image\" | \"document\" | \"file\" => {\n if (contentType.startsWith(\"image/\")) return \"image\";\n if (contentType.startsWith(\"text/\")) return \"document\";\n return \"file\";\n};\n\nexport class CloudFileAttachmentAdapter implements AttachmentAdapter {\n public accept = \"*\";\n\n private cloud: AssistantCloud;\n\n constructor(cloud: AssistantCloud) {\n this.cloud = cloud;\n }\n\n private uploadedUrls = new Map<string, string>();\n\n public async *add({\n file,\n }: {\n file: File;\n }): AsyncGenerator<PendingAttachment, void> {\n const id = generateId();\n const type = guessAttachmentType(file.type);\n let attachment: PendingAttachment = {\n id,\n type,\n name: file.name,\n contentType: file.type,\n file,\n status: { type: \"running\", reason: \"uploading\", progress: 0 },\n };\n yield attachment;\n\n try {\n const { signedUrl, publicUrl } =\n await this.cloud.files.generatePresignedUploadUrl({\n filename: file.name,\n });\n const res = await fetch(signedUrl, {\n method: \"PUT\",\n body: file,\n headers: {\n \"Content-Type\": file.type,\n },\n mode: \"cors\",\n });\n if (!res.ok) {\n throw new Error(\n `Failed to upload file: ${res.status} ${res.statusText}`,\n );\n }\n this.uploadedUrls.set(id, publicUrl);\n attachment = {\n ...attachment,\n status: { type: \"requires-action\", reason: \"composer-send\" },\n };\n yield attachment;\n } catch (error) {\n console.error(\"[assistant-ui] Failed to upload attachment:\", error);\n attachment = {\n ...attachment,\n status: {\n type: \"incomplete\",\n reason: \"error\",\n message: error instanceof Error ? error.message : String(error),\n },\n };\n yield attachment;\n }\n }\n\n public async remove(attachment: Attachment): Promise<void> {\n this.uploadedUrls.delete(attachment.id);\n }\n\n public async send(\n attachment: PendingAttachment,\n ): Promise<CompleteAttachment> {\n const url = this.uploadedUrls.get(attachment.id);\n if (!url) throw new Error(\"Attachment not uploaded\");\n this.uploadedUrls.delete(attachment.id);\n\n let content: ThreadUserMessagePart[];\n if (attachment.type === \"image\") {\n content = [{ type: \"image\", image: url, filename: attachment.name }];\n } else {\n content = [\n {\n type: \"file\",\n data: url,\n mimeType: attachment.contentType ?? \"\",\n filename: attachment.name,\n },\n ];\n }\n\n return {\n ...attachment,\n status: { type: \"complete\" },\n content,\n };\n }\n}\n"],"mappings":";;AAUA,MAAMO,uBACJC,gBACkC;CAClC,IAAIA,YAAYC,WAAW,QAAQ,GAAG,OAAO;CAC7C,IAAID,YAAYC,WAAW,OAAO,GAAG,OAAO;CAC5C,OAAO;AACT;AAEA,IAAaC,6BAAb,MAAqE;CACnE,SAAgB;CAEhB;CAEAG,YAAYD,OAAuB;EACjC,KAAKA,QAAQA;CACf;CAEA,+BAAuB,IAAIG,IAAoB;CAE/C,OAAcC,IAAI,EAChBC,QAG0C;EAC1C,MAAMG,KAAKd,WAAW;EAEtB,IAAIgB,aAAgC;GAClCF;GACAC,MAHWd,oBAAoBU,KAAKI,IAGpCA;GACAE,MAAMN,KAAKM;GACXf,aAAaS,KAAKI;GAClBJ;GACAO,QAAQ;IAAEH,MAAM;IAAWI,QAAQ;IAAaC,UAAU;GAAE;EAC9D;EACA,MAAMJ;EAEN,IAAI;GACF,MAAM,EAAEK,WAAWC,cACjB,MAAM,KAAKhB,MAAMiB,MAAMC,2BAA2B,EAChDC,UAAUd,KAAKM,KACjB,CAAC;GACH,MAAMS,MAAM,MAAMC,MAAMN,WAAW;IACjCO,QAAQ;IACRC,MAAMlB;IACNmB,SAAS,EACP,gBAAgBnB,KAAKI,KACvB;IACAgB,MAAM;GACR,CAAC;GACD,IAAI,CAACL,IAAIM,IACP,MAAM,IAAIC,MACR,0BAA0BP,IAAIR,OAAM,GAAIQ,IAAIQ,YAC9C;GAEF,KAAK1B,aAAa2B,IAAIrB,IAAIQ,SAAS;GACnCN,aAAa;IACX,GAAGA;IACHE,QAAQ;KAAEH,MAAM;KAAmBI,QAAQ;IAAgB;GAC7D;GACA,MAAMH;EACR,SAASoB,OAAO;GACdC,QAAQD,MAAM,+CAA+CA,KAAK;GAClEpB,aAAa;IACX,GAAGA;IACHE,QAAQ;KACNH,MAAM;KACNI,QAAQ;KACRmB,SAASF,iBAAiBH,QAAQG,MAAME,UAAUC,OAAOH,KAAK;IAChE;GACF;GACA,MAAMpB;EACR;CACF;CAEA,MAAawB,OAAOxB,YAAuC;EACzD,KAAKR,aAAakC,OAAO1B,WAAWF,EAAE;CACxC;CAEA,MAAa6B,KACX3B,YAC6B;EAC7B,MAAM4B,MAAM,KAAKpC,aAAaqC,IAAI7B,WAAWF,EAAE;EAC/C,IAAI,CAAC8B,KAAK,MAAM,IAAIX,MAAM,yBAAyB;EACnD,KAAKzB,aAAakC,OAAO1B,WAAWF,EAAE;EAEtC,IAAIgC;EACJ,IAAI9B,WAAWD,SAAS,SACtB+B,UAAU,CAAC;GAAE/B,MAAM;GAASgC,OAAOH;GAAKnB,UAAUT,WAAWC;EAAK,CAAC;OAEnE6B,UAAU,CACR;GACE/B,MAAM;GACNiC,MAAMJ;GACNK,UAAUjC,WAAWd,eAAe;GACpCuB,UAAUT,WAAWC;EACvB,CAAC;EAIL,OAAO;GACL,GAAGD;GACHE,QAAQ,EAAEH,MAAM,WAAW;GAC3B+B;EACF;CACF;AACF"}
@@ -1,9 +1,18 @@
1
- import { DataMessagePart, FileMessagePart, ImageMessagePart, MessageStatus, SourceProviderMetadata, TextMessagePart, ThreadMessage, Unstable_AudioMessagePart } from "../../../types/message.js";
1
+ import { DataMessagePart, FileMessagePart, ImageMessagePart, MessageStatus, SourceProviderMetadata, TextMessagePart, ThreadMessage, ToolApprovalOption, Unstable_AudioMessagePart } from "../../../types/message.js";
2
2
  import { CompleteAttachment } from "../../../types/attachment.js";
3
3
  import { ExportedMessageRepositoryItem } from "../../../runtime/utils/message-repository.js";
4
4
  import { ReadonlyJSONObject, ReadonlyJSONValue } from "assistant-stream/utils";
5
5
  import { CloudMessage } from "assistant-cloud";
6
6
  //#region src/react/runtimes/cloud/auiV0.d.ts
7
+ type AuiV0ToolApproval = {
8
+ readonly id: string;
9
+ readonly approved?: boolean;
10
+ readonly reason?: string;
11
+ readonly isAutomatic?: boolean;
12
+ readonly options?: readonly ToolApprovalOption[];
13
+ readonly optionId?: string;
14
+ readonly resolution?: "cancelled" | "expired";
15
+ };
7
16
  type AuiV0MessagePart = {
8
17
  readonly type: "text";
9
18
  readonly text: string;
@@ -32,6 +41,7 @@ type AuiV0MessagePart = {
32
41
  readonly args: ReadonlyJSONObject;
33
42
  readonly result?: ReadonlyJSONValue;
34
43
  readonly isError?: true;
44
+ readonly approval?: AuiV0ToolApproval;
35
45
  } | {
36
46
  readonly type: "tool-call";
37
47
  readonly toolCallId: string;
@@ -39,6 +49,7 @@ type AuiV0MessagePart = {
39
49
  readonly argsText: string;
40
50
  readonly result?: ReadonlyJSONValue;
41
51
  readonly isError?: true;
52
+ readonly approval?: AuiV0ToolApproval;
42
53
  } | {
43
54
  readonly type: "image";
44
55
  readonly image: string;