@assistant-ui/core 0.3.16 → 0.3.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (474) hide show
  1. package/dist/adapters/attachment.d.ts.map +1 -1
  2. package/dist/adapters/attachment.js +5 -4
  3. package/dist/adapters/attachment.js.map +1 -1
  4. package/dist/index.d.ts +3 -3
  5. package/dist/index.js +2 -2
  6. package/dist/index.js.map +1 -1
  7. package/dist/internal.d.ts +4 -2
  8. package/dist/internal.js +4 -2
  9. package/dist/model-context/frame/host.d.ts.map +1 -1
  10. package/dist/model-context/frame/host.js +10 -4
  11. package/dist/model-context/frame/host.js.map +1 -1
  12. package/dist/model-context/frame/provider.d.ts +5 -0
  13. package/dist/model-context/frame/provider.d.ts.map +1 -1
  14. package/dist/model-context/frame/provider.js +101 -28
  15. package/dist/model-context/frame/provider.js.map +1 -1
  16. package/dist/model-context/interactable-composer-metadata.d.ts.map +1 -1
  17. package/dist/model-context/interactable-composer-metadata.js +16 -9
  18. package/dist/model-context/interactable-composer-metadata.js.map +1 -1
  19. package/dist/model-context/registry.d.ts.map +1 -1
  20. package/dist/model-context/registry.js +3 -5
  21. package/dist/model-context/registry.js.map +1 -1
  22. package/dist/model-context/tool-call-text.d.ts +26 -0
  23. package/dist/model-context/tool-call-text.d.ts.map +1 -0
  24. package/dist/model-context/tool-call-text.js +18 -0
  25. package/dist/model-context/tool-call-text.js.map +1 -0
  26. package/dist/model-context/types.d.ts.map +1 -1
  27. package/dist/model-context/types.js +5 -4
  28. package/dist/model-context/types.js.map +1 -1
  29. package/dist/react/RuntimeAdapter.js +1 -1
  30. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
  31. package/dist/react/adapters/LocalStorageThreadListAdapter.js +1 -1
  32. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  33. package/dist/react/client/AdaptedRemoteThread.js +1 -1
  34. package/dist/react/client/InMemoryThreadList.d.ts.map +1 -1
  35. package/dist/react/client/InMemoryThreadList.js +63 -57
  36. package/dist/react/client/InMemoryThreadList.js.map +1 -1
  37. package/dist/react/client/Interactables.d.ts.map +1 -1
  38. package/dist/react/client/Interactables.js +25 -28
  39. package/dist/react/client/Interactables.js.map +1 -1
  40. package/dist/react/client/RemoteThreadList.d.ts +16 -0
  41. package/dist/react/client/RemoteThreadList.d.ts.map +1 -1
  42. package/dist/react/client/RemoteThreadList.js +354 -242
  43. package/dist/react/client/RemoteThreadList.js.map +1 -1
  44. package/dist/react/client/Tools.d.ts.map +1 -1
  45. package/dist/react/client/Tools.js +24 -18
  46. package/dist/react/client/Tools.js.map +1 -1
  47. package/dist/react/index.d.ts +2 -1
  48. package/dist/react/index.js +2 -1
  49. package/dist/react/interactables-legacy/Interactables.js +246 -125
  50. package/dist/react/interactables-legacy/Interactables.js.map +1 -1
  51. package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts.map +1 -1
  52. package/dist/react/interactables-shared/useInteractablePersistenceQueue.js +11 -9
  53. package/dist/react/interactables-shared/useInteractablePersistenceQueue.js.map +1 -1
  54. package/dist/react/model-context/makeAssistantTool.d.ts +2 -2
  55. package/dist/react/model-context/makeAssistantTool.js +1 -1
  56. package/dist/react/model-context/makeAssistantTool.js.map +1 -1
  57. package/dist/react/model-context/toolbox.d.ts +2 -14
  58. package/dist/react/model-context/toolbox.d.ts.map +1 -1
  59. package/dist/react/model-context/toolbox.js +1 -13
  60. package/dist/react/model-context/toolbox.js.map +1 -1
  61. package/dist/react/model-context/useAssistantContext.js +37 -7
  62. package/dist/react/model-context/useAssistantContext.js.map +1 -1
  63. package/dist/react/model-context/useAssistantTool.d.ts +2 -2
  64. package/dist/react/model-context/useAssistantTool.js +1 -1
  65. package/dist/react/model-context/useAssistantTool.js.map +1 -1
  66. package/dist/react/model-context/useAuiToolOverrides.js +31 -5
  67. package/dist/react/model-context/useAuiToolOverrides.js.map +1 -1
  68. package/dist/react/model-context/useInlineRender.d.ts.map +1 -1
  69. package/dist/react/model-context/useInlineRender.js +10 -36
  70. package/dist/react/model-context/useInlineRender.js.map +1 -1
  71. package/dist/react/model-context/useToolArgsStatus.d.ts.map +1 -1
  72. package/dist/react/model-context/useToolArgsStatus.js +2 -1
  73. package/dist/react/model-context/useToolArgsStatus.js.map +1 -1
  74. package/dist/react/primitive-hooks/useMessageError.d.ts.map +1 -1
  75. package/dist/react/primitive-hooks/useMessageError.js +2 -8
  76. package/dist/react/primitive-hooks/useMessageError.js.map +1 -1
  77. package/dist/react/primitive-hooks/useThreadListLoadMore.d.ts.map +1 -1
  78. package/dist/react/primitive-hooks/useThreadListLoadMore.js +2 -4
  79. package/dist/react/primitive-hooks/useThreadListLoadMore.js.map +1 -1
  80. package/dist/react/primitives/composer/ComposerAttachments.d.ts.map +1 -1
  81. package/dist/react/primitives/composer/ComposerAttachments.js +4 -3
  82. package/dist/react/primitives/composer/ComposerAttachments.js.map +1 -1
  83. package/dist/react/primitives/composer/ComposerQueue.d.ts.map +1 -1
  84. package/dist/react/primitives/composer/ComposerQueue.js +4 -3
  85. package/dist/react/primitives/composer/ComposerQueue.js.map +1 -1
  86. package/dist/react/primitives/message/MessageAttachments.d.ts.map +1 -1
  87. package/dist/react/primitives/message/MessageAttachments.js +7 -6
  88. package/dist/react/primitives/message/MessageAttachments.js.map +1 -1
  89. package/dist/react/primitives/message/MessageGroupedParts.js +2 -2
  90. package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
  91. package/dist/react/primitives/message/MessageParts.js +3 -3
  92. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  93. package/dist/react/primitives/threadList/ThreadListItems.d.ts.map +1 -1
  94. package/dist/react/primitives/threadList/ThreadListItems.js +5 -4
  95. package/dist/react/primitives/threadList/ThreadListItems.js.map +1 -1
  96. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +6 -4
  97. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  98. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +59 -29
  99. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  100. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +11 -6
  101. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  102. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +160 -143
  103. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  104. package/dist/react/runtimes/RemoteThreadResource.d.ts +2 -6
  105. package/dist/react/runtimes/RemoteThreadResource.d.ts.map +1 -1
  106. package/dist/react/runtimes/RemoteThreadResource.js +15 -13
  107. package/dist/react/runtimes/RemoteThreadResource.js.map +1 -1
  108. package/dist/react/runtimes/assistant-transport/useLatestRef.js +2 -2
  109. package/dist/react/runtimes/assistant-transport/useLatestRef.js.map +1 -1
  110. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +4 -1
  111. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  112. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +424 -52
  113. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  114. package/dist/react/runtimes/cloud/auiV0.d.ts +5 -1
  115. package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
  116. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  117. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts +29 -0
  118. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts.map +1 -0
  119. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.js +160 -0
  120. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.js.map +1 -0
  121. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts +1 -9
  122. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
  123. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +16 -153
  124. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  125. package/dist/react/runtimes/external-message-converter.js +1 -1
  126. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  127. package/dist/react/runtimes/useExternalStoreRuntime.js +75 -46
  128. package/dist/react/runtimes/useExternalStoreRuntime.js.map +1 -1
  129. package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts.map +1 -1
  130. package/dist/react/runtimes/useRemoteThreadListRuntime.js +77 -29
  131. package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
  132. package/dist/react/types/MessagePartComponentTypes.d.ts +7 -3
  133. package/dist/react/types/MessagePartComponentTypes.d.ts.map +1 -1
  134. package/dist/react/types/scopes/tools.d.ts +2 -0
  135. package/dist/react/types/scopes/tools.d.ts.map +1 -1
  136. package/dist/runtime/api/message-part-runtime.d.ts +2 -2
  137. package/dist/runtime/api/message-part-runtime.d.ts.map +1 -1
  138. package/dist/runtime/api/message-part-runtime.js +1 -1
  139. package/dist/runtime/api/message-part-runtime.js.map +1 -1
  140. package/dist/runtime/api/thread-list-item-runtime.d.ts +7 -3
  141. package/dist/runtime/api/thread-list-item-runtime.d.ts.map +1 -1
  142. package/dist/runtime/api/thread-list-item-runtime.js +2 -2
  143. package/dist/runtime/api/thread-list-item-runtime.js.map +1 -1
  144. package/dist/runtime/api/thread-list-runtime.d.ts +12 -1
  145. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  146. package/dist/runtime/api/thread-list-runtime.js +23 -14
  147. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  148. package/dist/runtime/api/thread-runtime.d.ts +5 -1
  149. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  150. package/dist/runtime/api/thread-runtime.js +1 -1
  151. package/dist/runtime/api/thread-runtime.js.map +1 -1
  152. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  153. package/dist/runtime/base/base-composer-runtime-core.js +16 -12
  154. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  155. package/dist/runtime/base/base-thread-runtime-core.d.ts +2 -2
  156. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  157. package/dist/runtime/base/base-thread-runtime-core.js +8 -7
  158. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  159. package/dist/runtime/interfaces/composer-runtime-core.d.ts +12 -5
  160. package/dist/runtime/interfaces/composer-runtime-core.d.ts.map +1 -1
  161. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +18 -3
  162. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
  163. package/dist/runtime/interfaces/thread-runtime-core.d.ts +15 -1
  164. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  165. package/dist/runtime/utils/auto-status.d.ts +1 -1
  166. package/dist/runtime/utils/auto-status.d.ts.map +1 -1
  167. package/dist/runtime/utils/auto-status.js +6 -2
  168. package/dist/runtime/utils/auto-status.js.map +1 -1
  169. package/dist/runtime/utils/external-message-conversion.d.ts +3 -2
  170. package/dist/runtime/utils/external-message-conversion.d.ts.map +1 -1
  171. package/dist/runtime/utils/external-message-conversion.js +5 -4
  172. package/dist/runtime/utils/external-message-conversion.js.map +1 -1
  173. package/dist/runtime/utils/message-repository.d.ts +1 -0
  174. package/dist/runtime/utils/message-repository.d.ts.map +1 -1
  175. package/dist/runtime/utils/message-repository.js +15 -6
  176. package/dist/runtime/utils/message-repository.js.map +1 -1
  177. package/dist/runtime/utils/resolveToolApprovalResponse.d.ts +6 -3
  178. package/dist/runtime/utils/resolveToolApprovalResponse.d.ts.map +1 -1
  179. package/dist/runtime/utils/resolveToolApprovalResponse.js +12 -3
  180. package/dist/runtime/utils/resolveToolApprovalResponse.js.map +1 -1
  181. package/dist/runtime/utils/thread-message-like.d.ts +2 -10
  182. package/dist/runtime/utils/thread-message-like.d.ts.map +1 -1
  183. package/dist/runtime/utils/thread-message-like.js +1 -1
  184. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  185. package/dist/runtime/utils/tool-call-tree.d.ts +39 -0
  186. package/dist/runtime/utils/tool-call-tree.d.ts.map +1 -0
  187. package/dist/runtime/utils/tool-call-tree.js +85 -0
  188. package/dist/runtime/utils/tool-call-tree.js.map +1 -0
  189. package/dist/runtimes/external-store/external-store-adapter.d.ts +29 -2
  190. package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
  191. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  192. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +21 -27
  193. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  194. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +2 -1
  195. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  196. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +34 -28
  197. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  198. package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts +1 -1
  199. package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts.map +1 -1
  200. package/dist/runtimes/inert/InertThreadRuntimeCore.js.map +1 -1
  201. package/dist/runtimes/internal.d.ts +2 -2
  202. package/dist/runtimes/internal.js +2 -2
  203. package/dist/runtimes/local/local-thread-runtime-core.d.ts +1 -1
  204. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  205. package/dist/runtimes/local/local-thread-runtime-core.js +3 -1
  206. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  207. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +18 -1
  208. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -1
  209. package/dist/runtimes/remote-thread-list/remote-thread-state.js +148 -43
  210. package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
  211. package/dist/runtimes/remote-thread-list/title-generation.d.ts +49 -0
  212. package/dist/runtimes/remote-thread-list/title-generation.d.ts.map +1 -0
  213. package/dist/runtimes/remote-thread-list/title-generation.js +197 -0
  214. package/dist/runtimes/remote-thread-list/title-generation.js.map +1 -0
  215. package/dist/runtimes/remote-thread-list/title.d.ts +11 -0
  216. package/dist/runtimes/remote-thread-list/title.d.ts.map +1 -0
  217. package/dist/runtimes/remote-thread-list/title.js +14 -0
  218. package/dist/runtimes/remote-thread-list/title.js.map +1 -0
  219. package/dist/runtimes/remote-thread-list/types.d.ts +16 -5
  220. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  221. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts +31 -8
  222. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
  223. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +97 -60
  224. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  225. package/dist/store/clients/external-thread.d.ts +1 -1
  226. package/dist/store/clients/external-thread.d.ts.map +1 -1
  227. package/dist/store/clients/external-thread.js +30 -7
  228. package/dist/store/clients/external-thread.js.map +1 -1
  229. package/dist/store/clients/model-context-client.d.ts.map +1 -1
  230. package/dist/store/clients/model-context-client.js +2 -1
  231. package/dist/store/clients/model-context-client.js.map +1 -1
  232. package/dist/store/clients/single-thread-list.d.ts.map +1 -1
  233. package/dist/store/clients/single-thread-list.js +2 -1
  234. package/dist/store/clients/single-thread-list.js.map +1 -1
  235. package/dist/store/clients/suggestions.d.ts.map +1 -1
  236. package/dist/store/clients/suggestions.js +19 -6
  237. package/dist/store/clients/suggestions.js.map +1 -1
  238. package/dist/store/clients/thread-message-client.js +1 -1
  239. package/dist/store/clients/thread-selection-events.js +1 -1
  240. package/dist/store/index.d.ts +2 -1
  241. package/dist/store/index.js +2 -1
  242. package/dist/store/internal.d.ts +2 -2
  243. package/dist/store/internal.js +2 -2
  244. package/dist/store/primitive-predicates.d.ts +4 -1
  245. package/dist/store/primitive-predicates.d.ts.map +1 -1
  246. package/dist/store/primitive-predicates.js +9 -1
  247. package/dist/store/primitive-predicates.js.map +1 -1
  248. package/dist/store/runtime-clients/composer-runtime-client.d.ts +1 -0
  249. package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
  250. package/dist/store/runtime-clients/composer-runtime-client.js +98 -62
  251. package/dist/store/runtime-clients/composer-runtime-client.js.map +1 -1
  252. package/dist/store/runtime-clients/message-runtime-client.d.ts +1 -0
  253. package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
  254. package/dist/store/runtime-clients/message-runtime-client.js +221 -144
  255. package/dist/store/runtime-clients/message-runtime-client.js.map +1 -1
  256. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  257. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +2 -2
  258. package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
  259. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  260. package/dist/store/runtime-clients/thread-list-runtime-client.js +128 -107
  261. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  262. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  263. package/dist/store/runtime-clients/thread-runtime-client.js +194 -122
  264. package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
  265. package/dist/store/runtime-clients/useSubscribable.d.ts +3 -1
  266. package/dist/store/runtime-clients/useSubscribable.d.ts.map +1 -1
  267. package/dist/store/runtime-clients/useSubscribable.js +1 -1
  268. package/dist/store/runtime-clients/useSubscribable.js.map +1 -1
  269. package/dist/store/scopes/composer.d.ts +10 -2
  270. package/dist/store/scopes/composer.d.ts.map +1 -1
  271. package/dist/store/scopes/message.d.ts +30 -1
  272. package/dist/store/scopes/message.d.ts.map +1 -1
  273. package/dist/store/scopes/part.d.ts +6 -3
  274. package/dist/store/scopes/part.d.ts.map +1 -1
  275. package/dist/store/scopes/thread-list-item.d.ts +2 -2
  276. package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
  277. package/dist/store/scopes/thread.d.ts +8 -0
  278. package/dist/store/scopes/thread.d.ts.map +1 -1
  279. package/dist/store/scopes/threads.d.ts +1 -0
  280. package/dist/store/scopes/threads.d.ts.map +1 -1
  281. package/dist/subscribable/subscribable.d.ts +8 -1
  282. package/dist/subscribable/subscribable.d.ts.map +1 -1
  283. package/dist/subscribable/subscribable.js +24 -16
  284. package/dist/subscribable/subscribable.js.map +1 -1
  285. package/dist/types/attachment.d.ts +2 -1
  286. package/dist/types/attachment.d.ts.map +1 -1
  287. package/dist/types/attachment.js +2 -1
  288. package/dist/types/attachment.js.map +1 -1
  289. package/dist/types/message.d.ts +40 -1
  290. package/dist/types/message.d.ts.map +1 -1
  291. package/dist/types/message.js +7 -1
  292. package/dist/types/message.js.map +1 -1
  293. package/dist/utils/abortable-iterable.d.ts +19 -0
  294. package/dist/utils/abortable-iterable.d.ts.map +1 -0
  295. package/dist/utils/abortable-iterable.js +72 -0
  296. package/dist/utils/abortable-iterable.js.map +1 -0
  297. package/dist/utils/composite-context-provider.d.ts.map +1 -1
  298. package/dist/utils/composite-context-provider.js +20 -2
  299. package/dist/utils/composite-context-provider.js.map +1 -1
  300. package/dist/utils/record.d.ts +11 -0
  301. package/dist/utils/record.d.ts.map +1 -0
  302. package/dist/utils/record.js +12 -0
  303. package/dist/utils/record.js.map +1 -0
  304. package/package.json +12 -17
  305. package/src/adapters/attachment.test.ts +50 -1
  306. package/src/adapters/attachment.ts +7 -4
  307. package/src/index.ts +7 -1
  308. package/src/internal.ts +12 -0
  309. package/src/model-context/frame/host.test.ts +24 -0
  310. package/src/model-context/frame/host.ts +10 -4
  311. package/src/model-context/frame/provider.test.ts +288 -1
  312. package/src/model-context/frame/provider.ts +148 -30
  313. package/src/model-context/interactable-composer-metadata.test.ts +28 -0
  314. package/src/model-context/interactable-composer-metadata.ts +9 -3
  315. package/src/model-context/registry.test.ts +12 -0
  316. package/src/model-context/registry.ts +3 -2
  317. package/src/model-context/tool-call-text.test.ts +67 -0
  318. package/src/model-context/tool-call-text.ts +67 -0
  319. package/src/model-context/types.test.ts +25 -0
  320. package/src/model-context/types.ts +9 -4
  321. package/src/react/AssistantRuntimeProvider.test.tsx +66 -2
  322. package/src/react/RuntimeAdapter.test.ts +34 -0
  323. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +1 -3
  324. package/src/react/client/InMemoryThreadList.ts +1 -0
  325. package/src/react/client/Interactables.test.ts +28 -0
  326. package/src/react/client/Interactables.ts +15 -13
  327. package/src/react/client/RemoteThreadList.background.test.ts +526 -0
  328. package/src/react/client/RemoteThreadList.concurrent.test.tsx +315 -0
  329. package/src/react/client/RemoteThreadList.test.ts +617 -3
  330. package/src/react/client/RemoteThreadList.ts +433 -167
  331. package/src/react/client/Tools.ts +29 -12
  332. package/src/react/index.ts +4 -0
  333. package/src/react/interactables-legacy/Interactables.ts +16 -16
  334. package/src/react/interactables-shared/useInteractablePersistenceQueue.ts +9 -10
  335. package/src/react/model-context/makeAssistantTool.ts +2 -2
  336. package/src/react/model-context/modelContextHooks.test.tsx +131 -0
  337. package/src/react/model-context/toolbox.test.ts +9 -9
  338. package/src/react/model-context/toolbox.ts +9 -36
  339. package/src/react/model-context/useAssistantContext.ts +4 -2
  340. package/src/react/model-context/useAssistantTool.ts +2 -2
  341. package/src/react/model-context/useAuiToolOverrides.ts +4 -2
  342. package/src/react/model-context/useInlineRender.test.tsx +48 -0
  343. package/src/react/model-context/useInlineRender.ts +14 -10
  344. package/src/react/model-context/useToolArgsStatus.test.tsx +30 -0
  345. package/src/react/model-context/useToolArgsStatus.ts +2 -1
  346. package/src/react/primitive-hooks/useMessageError.ts +2 -19
  347. package/src/react/primitive-hooks/useThreadListLoadMore.ts +2 -3
  348. package/src/react/primitives/composer/ComposerAttachments.test.tsx +76 -0
  349. package/src/react/primitives/composer/ComposerAttachments.tsx +9 -4
  350. package/src/react/primitives/composer/ComposerQueue.test.tsx +72 -0
  351. package/src/react/primitives/composer/ComposerQueue.tsx +7 -4
  352. package/src/react/primitives/message/MessageAttachments.test.tsx +107 -37
  353. package/src/react/primitives/message/MessageAttachments.tsx +10 -7
  354. package/src/react/primitives/message/MessageGroupedParts.tsx +2 -2
  355. package/src/react/primitives/message/MessageParts.tsx +3 -3
  356. package/src/react/primitives/threadList/ThreadListItems.test.tsx +99 -0
  357. package/src/react/primitives/threadList/ThreadListItems.tsx +8 -5
  358. package/src/react/runtimes/RemoteThreadListHookInstanceManager.destroy.test.tsx +172 -0
  359. package/src/react/runtimes/RemoteThreadListHookInstanceManager.running.test.tsx +127 -1
  360. package/src/react/runtimes/RemoteThreadListHookInstanceManager.test.tsx +7 -1
  361. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +99 -35
  362. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.load-error.test.ts +132 -0
  363. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.switch-delete.test.ts +274 -0
  364. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +223 -152
  365. package/src/react/runtimes/RemoteThreadResource.test.ts +9 -0
  366. package/src/react/runtimes/RemoteThreadResource.ts +20 -16
  367. package/src/react/runtimes/assistant-transport/transport-scheduling.test.ts +51 -2
  368. package/src/react/runtimes/assistant-transport/useLatestRef.ts +2 -2
  369. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.ts +45 -0
  370. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +546 -5
  371. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +546 -103
  372. package/src/react/runtimes/cloud/auiV0.ts +5 -0
  373. package/src/react/runtimes/cloud/createCloudThreadListAdapter.test.ts +103 -0
  374. package/src/react/runtimes/cloud/createCloudThreadListAdapter.ts +237 -0
  375. package/src/react/runtimes/cloud/useCloudThreadListAdapter.test.tsx +90 -1
  376. package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +33 -238
  377. package/src/react/runtimes/external-message-converter.ts +1 -0
  378. package/src/react/runtimes/useExternalStoreRuntime.lifecycle.test.tsx +41 -0
  379. package/src/react/runtimes/useExternalStoreRuntime.ts +10 -4
  380. package/src/react/runtimes/useLocalRuntime.test.tsx +20 -0
  381. package/src/react/runtimes/useRemoteThreadListRuntime.concurrent.test.tsx +216 -0
  382. package/src/react/runtimes/useRemoteThreadListRuntime.load-error.test.tsx +108 -0
  383. package/src/react/runtimes/useRemoteThreadListRuntime.ts +57 -6
  384. package/src/react/types/MessagePartComponentTypes.ts +7 -3
  385. package/src/react/types/scopes/tools.ts +2 -0
  386. package/src/runtime/api/message-part-runtime.ts +3 -3
  387. package/src/runtime/api/message-runtime.test.ts +75 -0
  388. package/src/runtime/api/thread-list-item-runtime.ts +10 -3
  389. package/src/runtime/api/thread-list-runtime.ts +46 -12
  390. package/src/runtime/api/thread-runtime.test.ts +78 -0
  391. package/src/runtime/api/thread-runtime.ts +8 -1
  392. package/src/runtime/base/base-composer-runtime-core.ts +36 -8
  393. package/src/runtime/base/base-thread-runtime-core.test.ts +149 -4
  394. package/src/runtime/base/base-thread-runtime-core.ts +16 -8
  395. package/src/runtime/interfaces/composer-runtime-core.ts +10 -5
  396. package/src/runtime/interfaces/thread-list-runtime-core.ts +25 -2
  397. package/src/runtime/interfaces/thread-runtime-core.ts +17 -1
  398. package/src/runtime/utils/auto-status.test.ts +57 -0
  399. package/src/runtime/utils/auto-status.ts +13 -1
  400. package/src/runtime/utils/external-message-conversion.test.ts +165 -0
  401. package/src/runtime/utils/external-message-conversion.ts +18 -2
  402. package/src/runtime/utils/message-repository.ts +29 -17
  403. package/src/runtime/utils/resolveToolApprovalResponse.test.ts +73 -0
  404. package/src/runtime/utils/resolveToolApprovalResponse.ts +27 -6
  405. package/src/runtime/utils/thread-message-like.ts +3 -11
  406. package/src/runtime/utils/tool-call-tree.test.ts +191 -0
  407. package/src/runtime/utils/tool-call-tree.ts +97 -0
  408. package/src/runtimes/external-store/external-store-adapter.ts +38 -2
  409. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +18 -13
  410. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +56 -33
  411. package/src/runtimes/inert/InertThreadRuntimeCore.ts +1 -1
  412. package/src/runtimes/internal.ts +1 -0
  413. package/src/runtimes/local/local-thread-runtime-core.test.ts +29 -3
  414. package/src/runtimes/local/local-thread-runtime-core.ts +5 -1
  415. package/src/runtimes/remote-thread-list/remote-thread-state.test.ts +238 -0
  416. package/src/runtimes/remote-thread-list/remote-thread-state.ts +223 -44
  417. package/src/runtimes/remote-thread-list/title-generation.test.ts +602 -0
  418. package/src/runtimes/remote-thread-list/title-generation.ts +329 -0
  419. package/src/runtimes/remote-thread-list/title.test.ts +62 -0
  420. package/src/runtimes/remote-thread-list/title.ts +16 -0
  421. package/src/runtimes/remote-thread-list/types.ts +16 -5
  422. package/src/runtimes/tool-invocations/EDGE_CASES.md +110 -5
  423. package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +750 -136
  424. package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +144 -91
  425. package/src/store/clients/external-thread.ts +62 -11
  426. package/src/store/clients/model-context-client.ts +5 -1
  427. package/src/store/clients/single-thread-list.ts +1 -0
  428. package/src/store/clients/suggestions.test.ts +195 -1
  429. package/src/store/clients/suggestions.ts +45 -34
  430. package/src/store/index.ts +4 -0
  431. package/src/store/internal.ts +2 -0
  432. package/src/store/primitive-predicates.ts +35 -0
  433. package/src/store/runtime-clients/composer-runtime-client.ts +42 -9
  434. package/src/store/runtime-clients/message-runtime-client.ts +54 -6
  435. package/src/store/runtime-clients/thread-list-item-runtime-client.ts +4 -2
  436. package/src/store/runtime-clients/thread-list-runtime-client.ts +17 -2
  437. package/src/store/runtime-clients/thread-runtime-client.ts +58 -10
  438. package/src/store/runtime-clients/useSubscribable.ts +8 -2
  439. package/src/store/scopes/composer.ts +16 -4
  440. package/src/store/scopes/message.ts +14 -0
  441. package/src/store/scopes/part.ts +6 -3
  442. package/src/store/scopes/thread-list-item.ts +5 -2
  443. package/src/store/scopes/thread.ts +4 -0
  444. package/src/store/scopes/threads.ts +1 -0
  445. package/src/subscribable/subscribable.test.ts +50 -0
  446. package/src/subscribable/subscribable.ts +33 -21
  447. package/src/tests/MessageRepository.test.ts +116 -0
  448. package/src/tests/OptimisticState-list-race.test.ts +1 -0
  449. package/src/tests/RemoteThreadListThreadListRuntimeCore-initialize-adapter-change.test.ts +38 -0
  450. package/src/tests/RemoteThreadListThreadListRuntimeCore-load-race.test.ts +158 -0
  451. package/src/tests/RemoteThreadListThreadListRuntimeCore-loadMore.test.ts +78 -0
  452. package/src/tests/RemoteThreadListThreadListRuntimeCore-reload.test.ts +52 -0
  453. package/src/tests/RemoteThreadListThreadListRuntimeCore-title-race.test.ts +89 -0
  454. package/src/tests/attachment-adapters.test.ts +14 -0
  455. package/src/tests/base-composer-runtime-core.test.ts +39 -0
  456. package/src/tests/external-store-optimistic-id.test.ts +79 -0
  457. package/src/tests/external-store-repository-instance.test.ts +166 -0
  458. package/src/tests/external-store-thread-list-runtime-core.test.ts +83 -0
  459. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +49 -34
  460. package/src/tests/external-thread-attachments.test.tsx +224 -1
  461. package/src/tests/external-thread-parity.test.tsx +23 -0
  462. package/src/tests/remote-thread-list-adapter-switch.test.ts +66 -1
  463. package/src/tests/remote-thread-list-isLoading.test.ts +1 -0
  464. package/src/tests/thread-list-runtime-getLoadThreadsPromise.test.ts +1 -0
  465. package/src/tests/thread-switch-events.test.tsx +475 -2
  466. package/src/tests/tools-scope-migration.test.tsx +28 -0
  467. package/src/types/attachment.ts +4 -0
  468. package/src/types/message.ts +50 -2
  469. package/src/utils/abortable-iterable.test.ts +213 -0
  470. package/src/utils/abortable-iterable.ts +93 -0
  471. package/src/utils/composite-context-provider.test.ts +25 -0
  472. package/src/utils/composite-context-provider.ts +23 -2
  473. package/src/utils/record.test.ts +48 -0
  474. package/src/utils/record.ts +11 -0
@@ -1,7 +1,8 @@
1
1
  import { auiV0Decode, auiV0Encode } from "./auiV0.js";
2
+ import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
2
3
  import { useEffect, useRef, useState } from "@assistant-ui/tap/react-shim";
3
4
  import { getClientId, useAui } from "@assistant-ui/store";
4
- import { CloudMessagePersistence, createFormattedPersistence, createRunTelemetryToolCall, normalizeRunTelemetryUsage, truncateRunTelemetryText } from "assistant-cloud";
5
+ import { CloudMessagePersistence, createFormattedPersistence, createRunReport, createRunTelemetryToolCall, deriveRunOutcome, describeRunError, extractRunTelemetryModelId, normalizeRunTelemetryUsage, truncateRunTelemetryText } from "assistant-cloud";
5
6
  //#region src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts
6
7
  const globalPersistence = /* @__PURE__ */ new WeakMap();
7
8
  var AssistantCloudThreadHistoryAdapter = class {
@@ -22,12 +23,54 @@ var AssistantCloudThreadHistoryAdapter = class {
22
23
  get _persistence() {
23
24
  return this.getPersistence();
24
25
  }
26
+ /**
27
+ * A send is the moment the runtime creates the remote thread, so that one
28
+ * event waits for the id; every other event reads the id that already
29
+ * exists, because initializing a thread nobody has written to would create
30
+ * an empty remote thread just to attribute an event.
31
+ */
32
+ async resolveEngagementEventIds(threadId, messageId, options) {
33
+ const threadListItem = this.getThreadListItem(threadId);
34
+ if (!threadListItem) return {};
35
+ let remoteThreadId = threadListItem.getState().remoteId;
36
+ if (!remoteThreadId && options?.awaitThread) remoteThreadId = await threadListItem.initialize().then((result) => result.remoteId).catch(() => void 0);
37
+ const remoteMessageId = messageId ? this.getPersistence(threadListItem).getResolvedRemoteId(messageId) : void 0;
38
+ return {
39
+ ...remoteThreadId ? { thread_id: remoteThreadId } : void 0,
40
+ ...remoteMessageId ? { message_id: remoteMessageId } : void 0
41
+ };
42
+ }
43
+ feedback = { submit: ({ message, type }) => {
44
+ (async () => {
45
+ const threadListItem = this.tryGetKeyedThreadListItem();
46
+ const remoteThreadId = threadListItem?.getState().remoteId;
47
+ if (!threadListItem || !remoteThreadId) {
48
+ console.warn(`[assistant-ui] Skipping feedback for message ${message.id}: the thread has no remote id.`);
49
+ return;
50
+ }
51
+ const cloudMessageId = await this.getPersistence(threadListItem).getRemoteId(message.id);
52
+ if (!cloudMessageId) {
53
+ console.warn(`[assistant-ui] Skipping feedback for message ${message.id}: no cloud message id is mapped.`);
54
+ return;
55
+ }
56
+ await this.cloudRef.current.threads.messages.feedback(remoteThreadId, cloudMessageId, { type });
57
+ })().catch((error) => {
58
+ console.error("[assistant-ui] Cloud feedback submission failed:", error);
59
+ });
60
+ } };
25
61
  tryGetKeyedThreadListItem() {
26
62
  const live = this.aui.threadListItem;
27
63
  if (!live.source) return void 0;
28
64
  const id = live.getState().id;
29
65
  if (id === void 0) return void 0;
30
- return this.aui.threads.item({ id });
66
+ return this.aui.threads.getState().threadItems.some((item) => item.id === id || item.remoteId === id) ? this.aui.threads.item({ id }) : live;
67
+ }
68
+ getThreadListItem(threadId) {
69
+ const current = this.aui.threadListItem;
70
+ const currentState = current.getState();
71
+ if (currentState.id === threadId || currentState.remoteId === threadId) return current;
72
+ const listed = this.aui.threads.getState().threadItems.find((item) => item.id === threadId || item.remoteId === threadId);
73
+ return listed ? this.aui.threads.item({ id: listed.id }) : void 0;
31
74
  }
32
75
  withFormat(formatAdapter) {
33
76
  const adapter = this;
@@ -38,7 +81,6 @@ var AssistantCloudThreadHistoryAdapter = class {
38
81
  return threadListItem;
39
82
  };
40
83
  const resolvePinned = () => threadListItem ?? pinCurrent();
41
- const getFormatted = () => createFormattedPersistence(adapter._persistence, formatAdapter);
42
84
  const getTargetFormatted = (item) => createFormattedPersistence(adapter.getPersistence(item), formatAdapter);
43
85
  return {
44
86
  pin() {
@@ -61,14 +103,14 @@ var AssistantCloudThreadHistoryAdapter = class {
61
103
  },
62
104
  reportTelemetry(items, options) {
63
105
  const encodedRunMessages = items.map((item) => formatAdapter.encode(item));
64
- adapter._reportRunTelemetry(formatAdapter.format, encodedRunMessages, options, resolvePinned());
106
+ adapter._reportRunTelemetry(formatAdapter.format, encodedRunMessages, options, resolvePinned(), extractLastRunMessageInfo(items, formatAdapter));
65
107
  },
66
108
  async load() {
67
- pinCurrent();
109
+ const pinned = pinCurrent();
68
110
  const live = adapter.aui.threadListItem;
69
111
  const remoteId = live.source ? live.getState().remoteId : void 0;
70
112
  if (!remoteId) return { messages: [] };
71
- return getFormatted().load(remoteId);
113
+ return getTargetFormatted(pinned ?? live).load(remoteId);
72
114
  }
73
115
  };
74
116
  }
@@ -76,7 +118,7 @@ var AssistantCloudThreadHistoryAdapter = class {
76
118
  const { remoteId } = await this.aui.threadListItem.initialize();
77
119
  const encoded = auiV0Encode(message);
78
120
  await this._persistence.append(remoteId, message.id, parentId, "aui/v0", encoded);
79
- if (this.cloudRef.current.telemetry.enabled) this._maybeReportRun(remoteId, "aui/v0", encoded);
121
+ if (this.cloudRef.current.telemetry.enabled) this._maybeReportRun(remoteId, "aui/v0", encoded, extractRunMessageInfo(message, "aui/v0"));
80
122
  }
81
123
  async update(item) {
82
124
  if (!this._persistence.isPersisted(item.message.id)) return this.append(item);
@@ -85,7 +127,7 @@ var AssistantCloudThreadHistoryAdapter = class {
85
127
  if (!remoteId) return;
86
128
  const encoded = auiV0Encode(message);
87
129
  await this._persistence.update(remoteId, message.id, "aui/v0", encoded);
88
- if (this.cloudRef.current.telemetry.enabled) this._maybeReportRun(remoteId, "aui/v0", encoded);
130
+ if (this.cloudRef.current.telemetry.enabled) this._maybeReportRun(remoteId, "aui/v0", encoded, extractRunMessageInfo(message, "aui/v0"));
89
131
  }
90
132
  async delete() {
91
133
  throw new Error("Assistant Cloud does not support deleting thread messages yet.");
@@ -95,42 +137,68 @@ var AssistantCloudThreadHistoryAdapter = class {
95
137
  if (!remoteId) return { messages: [] };
96
138
  return { messages: (await this._persistence.load(remoteId, "aui/v0")).filter((m) => m.format === "aui/v0").map(auiV0Decode).reverse() };
97
139
  }
98
- _reportRunTelemetry(format, runMessages, options, threadListItem) {
140
+ _reportRunTelemetry(format, runMessages, options, threadListItem, messageInfo) {
99
141
  if (!this.cloudRef.current.telemetry.enabled) return;
100
- const remoteId = (threadListItem ?? this.aui.threadListItem).getState().remoteId;
142
+ const item = threadListItem ?? this.aui.threadListItem;
143
+ const remoteId = item.getState().remoteId;
101
144
  if (!remoteId) return;
102
145
  const extracted = extractRunTelemetry(format, runMessages);
103
146
  if (!extracted) return;
104
- this._sendReport(remoteId, extracted, options?.durationMs, options?.stepTimestamps);
147
+ this._sendReport(remoteId, extracted, options?.durationMs, options?.stepTimestamps, messageInfo, this.getPersistence(item));
105
148
  }
106
- _maybeReportRun(remoteId, format, content) {
149
+ _maybeReportRun(remoteId, format, content, messageInfo) {
107
150
  const extracted = extractTelemetry(format, content);
108
151
  if (!extracted) return;
109
- this._sendReport(remoteId, extracted);
152
+ this._sendReport(remoteId, extracted, void 0, void 0, messageInfo);
110
153
  }
111
- _sendReport(remoteId, data, durationMs, stepTimestamps) {
154
+ _sendReport(remoteId, data, durationMs, stepTimestamps, messageInfo, persistence = this._persistence) {
112
155
  const mergedSteps = mergeStepTimestamps(data.steps, stepTimestamps);
113
- const initial = {
114
- thread_id: remoteId,
115
- status: data.status,
116
- ...data.totalSteps != null ? { total_steps: data.totalSteps } : void 0,
117
- ...data.toolCalls ? { tool_calls: data.toolCalls } : void 0,
118
- ...mergedSteps ? { steps: mergedSteps } : void 0,
119
- ...data.inputTokens != null ? { input_tokens: data.inputTokens } : void 0,
120
- ...data.outputTokens != null ? { output_tokens: data.outputTokens } : void 0,
121
- ...data.reasoningTokens != null ? { reasoning_tokens: data.reasoningTokens } : void 0,
122
- ...data.cachedInputTokens != null ? { cached_input_tokens: data.cachedInputTokens } : void 0,
123
- ...durationMs != null ? { duration_ms: durationMs } : void 0,
124
- ...data.outputText != null ? { output_text: data.outputText } : void 0,
125
- ...data.metadata ? { metadata: data.metadata } : void 0,
126
- ...data.modelId ? { model_id: data.modelId } : void 0
127
- };
156
+ const messageId = messageInfo?.localMessageId ? persistence.getResolvedRemoteId(messageInfo.localMessageId) : void 0;
157
+ const initial = createRunReport({
158
+ threadId: remoteId,
159
+ status: messageInfo?.status ?? data.status,
160
+ outcome: messageInfo?.outcomeType,
161
+ error: messageInfo?.error,
162
+ errorCode: messageInfo?.errorCode,
163
+ messageId,
164
+ traceId: messageInfo?.traceId,
165
+ modelId: data.modelId,
166
+ provider: messageInfo?.provider,
167
+ usage: {
168
+ inputTokens: data.inputTokens,
169
+ outputTokens: data.outputTokens,
170
+ reasoningTokens: data.reasoningTokens,
171
+ cachedInputTokens: data.cachedInputTokens
172
+ },
173
+ steps: toRunReportSteps(mergedSteps),
174
+ totalSteps: data.totalSteps,
175
+ toolCalls: data.toolCalls,
176
+ durationMs,
177
+ firstTokenMs: messageInfo?.firstTokenMs,
178
+ outputText: data.outputText,
179
+ metadata: data.metadata,
180
+ telemetry: this.cloudRef.current.telemetry
181
+ });
128
182
  const { beforeReport } = this.cloudRef.current.telemetry;
129
183
  const report = beforeReport ? beforeReport(initial) : initial;
130
184
  if (!report) return;
131
185
  this.cloudRef.current.runs.report(report).catch(() => {});
132
186
  }
133
187
  };
188
+ function toRunReportSteps(steps) {
189
+ if (!steps) return void 0;
190
+ return steps.map((step) => ({
191
+ usage: {
192
+ inputTokens: step.input_tokens,
193
+ outputTokens: step.output_tokens,
194
+ reasoningTokens: step.reasoning_tokens,
195
+ cachedInputTokens: step.cached_input_tokens
196
+ },
197
+ toolCalls: step.tool_calls,
198
+ startMs: step.start_ms,
199
+ endMs: step.end_ms
200
+ }));
201
+ }
134
202
  function mergeStepTimestamps(steps, timestamps) {
135
203
  if (!timestamps) return steps;
136
204
  if (!steps) return timestamps.map((t) => ({ ...t }));
@@ -140,6 +208,46 @@ function mergeStepTimestamps(steps, timestamps) {
140
208
  ...i < len ? timestamps[i] : void 0
141
209
  }));
142
210
  }
211
+ function extractLastRunMessageInfo(items, formatAdapter) {
212
+ for (let i = items.length - 1; i >= 0; i--) {
213
+ const item = items[i];
214
+ const info = extractRunMessageInfo(item.message, formatAdapter.format, formatAdapter.getId(item.message));
215
+ if (info) return info;
216
+ }
217
+ }
218
+ function extractRunMessageInfo(message, format, localMessageId) {
219
+ if (!isRecord(message) || message.role !== "assistant") return void 0;
220
+ const status = isRecord(message.status) ? message.status : void 0;
221
+ const metadata = isRecord(message.metadata) ? message.metadata : void 0;
222
+ const custom = isRecord(metadata?.custom) ? metadata.custom : void 0;
223
+ const timing = isRecord(metadata?.timing) ? metadata.timing : void 0;
224
+ const streamStartTime = timing?.streamStartTime;
225
+ const firstTokenTime = timing?.firstTokenTime;
226
+ const firstTokenMs = typeof streamStartTime === "number" && Number.isFinite(streamStartTime) && typeof firstTokenTime === "number" && Number.isFinite(firstTokenTime) ? Math.round(firstTokenTime - streamStartTime) : void 0;
227
+ const finishReason = status?.type === "incomplete" ? status.reason : typeof metadata?.finishReason === "string" ? metadata.finishReason : void 0;
228
+ const failed = status?.type === "incomplete" && status.reason === "error";
229
+ const outcome = deriveRunOutcome({
230
+ finishReason: typeof finishReason === "string" ? finishReason : void 0,
231
+ isError: failed
232
+ });
233
+ const outcomeType = outcome.outcome;
234
+ const failure = failed ? describeRunError(status.error) : {};
235
+ const messageId = localMessageId ?? (typeof message.id === "string" ? message.id : void 0);
236
+ const traceId = format === "aui/v0" ? custom?.traceId : format === "ai-sdk/v6" ? metadata?.traceId : void 0;
237
+ const provider = typeof custom?.provider === "string" ? custom.provider : typeof metadata?.provider === "string" ? metadata.provider : void 0;
238
+ return {
239
+ ...messageId ? { localMessageId: messageId } : void 0,
240
+ ...outcome.status === "error" ? { status: "error" } : void 0,
241
+ ...outcomeType ? { outcomeType } : void 0,
242
+ ...failure,
243
+ ...firstTokenMs != null && firstTokenMs >= 0 ? { firstTokenMs } : void 0,
244
+ ...typeof traceId === "string" ? { traceId } : void 0,
245
+ ...provider !== void 0 ? { provider } : void 0
246
+ };
247
+ }
248
+ function isRecord(value) {
249
+ return value !== null && typeof value === "object";
250
+ }
143
251
  function extractTelemetry(format, content) {
144
252
  switch (format) {
145
253
  case "aui/v0": return extractAuiV0(content);
@@ -187,20 +295,23 @@ function extractAuiV0(content) {
187
295
  let hasReasoning = false;
188
296
  let hasCachedInput = false;
189
297
  for (const step of steps) {
190
- if (step.usage?.inputTokens != null) {
191
- totalInput += step.usage.inputTokens;
298
+ if (!step.usage) continue;
299
+ const usage = normalizeRunTelemetryUsage(step.usage);
300
+ if (!usage) continue;
301
+ if (usage.inputTokens != null) {
302
+ totalInput += usage.inputTokens;
192
303
  hasInput = true;
193
304
  }
194
- if (step.usage?.outputTokens != null) {
195
- totalOutput += step.usage.outputTokens;
305
+ if (usage.outputTokens != null) {
306
+ totalOutput += usage.outputTokens;
196
307
  hasOutput = true;
197
308
  }
198
- if (step.usage?.reasoningTokens != null) {
199
- totalReasoning += step.usage.reasoningTokens;
309
+ if (usage.reasoningTokens != null) {
310
+ totalReasoning += usage.reasoningTokens;
200
311
  hasReasoning = true;
201
312
  }
202
- if (step.usage?.cachedInputTokens != null) {
203
- totalCachedInput += step.usage.cachedInputTokens;
313
+ if (usage.cachedInputTokens != null) {
314
+ totalCachedInput += usage.cachedInputTokens;
204
315
  hasCachedInput = true;
205
316
  }
206
317
  }
@@ -210,15 +321,18 @@ function extractAuiV0(content) {
210
321
  cachedInputTokens = hasCachedInput ? totalCachedInput : void 0;
211
322
  }
212
323
  const statusType = msg.status?.type;
213
- const status = statusType && AUI_STATUS_MAP[statusType] || "completed";
324
+ const status = statusType === "incomplete" && msg.status?.reason === "error" ? "error" : statusType && AUI_STATUS_MAP[statusType] || "completed";
214
325
  const metadata = msg.metadata?.custom;
215
- const modelId = msg.metadata?.modelId ?? (typeof msg.metadata?.custom?.modelId === "string" ? msg.metadata.custom.modelId : void 0);
216
- const telemetrySteps = steps && steps.length > 1 ? steps.map((s) => ({
217
- ...s.usage?.inputTokens != null ? { input_tokens: s.usage.inputTokens } : void 0,
218
- ...s.usage?.outputTokens != null ? { output_tokens: s.usage.outputTokens } : void 0,
219
- ...s.usage?.reasoningTokens != null ? { reasoning_tokens: s.usage.reasoningTokens } : void 0,
220
- ...s.usage?.cachedInputTokens != null ? { cached_input_tokens: s.usage.cachedInputTokens } : void 0
221
- })) : void 0;
326
+ const modelId = extractRunTelemetryModelId(msg.metadata);
327
+ const telemetrySteps = steps && steps.length > 1 ? steps.map((s) => {
328
+ const usage = s.usage ? normalizeRunTelemetryUsage(s.usage) : void 0;
329
+ return {
330
+ ...usage?.inputTokens != null ? { input_tokens: usage.inputTokens } : void 0,
331
+ ...usage?.outputTokens != null ? { output_tokens: usage.outputTokens } : void 0,
332
+ ...usage?.reasoningTokens != null ? { reasoning_tokens: usage.reasoningTokens } : void 0,
333
+ ...usage?.cachedInputTokens != null ? { cached_input_tokens: usage.cachedInputTokens } : void 0
334
+ };
335
+ }) : void 0;
222
336
  return {
223
337
  status,
224
338
  ...toolCalls && toolCalls.length > 0 ? { toolCalls } : void 0,
@@ -272,16 +386,10 @@ function collectAiSdkV6Parts(parts) {
272
386
  stepsData
273
387
  };
274
388
  }
275
- function extractModelId(metadata) {
276
- if (!metadata) return void 0;
277
- if (typeof metadata.modelId === "string") return metadata.modelId;
278
- const custom = metadata.custom;
279
- if (typeof custom?.modelId === "string") return custom.modelId;
280
- }
281
389
  function buildAiSdkV6Result(textParts, toolCalls, totalSteps, metadata, stepsData, usage) {
282
390
  const hasText = textParts.length > 0;
283
391
  const outputText = hasText ? truncateRunTelemetryText(textParts.join("")) : void 0;
284
- const modelId = extractModelId(metadata);
392
+ const modelId = extractRunTelemetryModelId(metadata);
285
393
  const steps = stepsData && stepsData.length > 1 ? stepsData.map((s) => ({ ...s.tool_calls.length > 0 ? { tool_calls: s.tool_calls } : void 0 })) : void 0;
286
394
  return {
287
395
  status: hasText ? "completed" : "incomplete",
@@ -409,8 +517,272 @@ function useAssistantCloudThreadHistoryAdapter(cloudRef) {
409
517
  auiRef.current = aui;
410
518
  });
411
519
  const [adapter] = useState(() => new AssistantCloudThreadHistoryAdapter(cloudRef, () => auiRef.current));
520
+ useAssistantCloudEngagementEvents(cloudRef, adapter, aui);
412
521
  return adapter;
413
522
  }
523
+ const rootEngagementTrackers = /* @__PURE__ */ new WeakMap();
524
+ /**
525
+ * Thread switches are a thread list event, so one subscription per assistant
526
+ * client reports them; every thread runtime mounted under it shares the
527
+ * subscription and the last one to unmount removes it.
528
+ */
529
+ const useRootEngagementEvents = (cloudRef, adapter, aui) => {
530
+ const $ = c(5);
531
+ let t0;
532
+ let t1;
533
+ if ($[0] !== adapter || $[1] !== aui || $[2] !== cloudRef) {
534
+ t0 = () => {
535
+ let tracker = rootEngagementTrackers.get(aui);
536
+ if (!tracker) {
537
+ const created = {
538
+ count: 0,
539
+ adapter,
540
+ cloudRef,
541
+ dispose: _temp
542
+ };
543
+ created.dispose = aui.on({
544
+ scope: "*",
545
+ event: "threads.selectionChanged"
546
+ }, (payload) => {
547
+ created.adapter.resolveEngagementEventIds(payload.threadId).then((ids) => {
548
+ if (!ids.thread_id) return;
549
+ created.cloudRef.current.events?.track({
550
+ kind: "thread_switched",
551
+ ...ids
552
+ });
553
+ }).catch(_temp2);
554
+ });
555
+ rootEngagementTrackers.set(aui, created);
556
+ tracker = created;
557
+ }
558
+ const active = tracker;
559
+ active.adapter = adapter;
560
+ active.cloudRef = cloudRef;
561
+ active.count = active.count + 1;
562
+ return () => {
563
+ active.count = active.count - 1;
564
+ if (active.count === 0) {
565
+ active.dispose();
566
+ rootEngagementTrackers.delete(aui);
567
+ }
568
+ };
569
+ };
570
+ t1 = [
571
+ adapter,
572
+ aui,
573
+ cloudRef
574
+ ];
575
+ $[0] = adapter;
576
+ $[1] = aui;
577
+ $[2] = cloudRef;
578
+ $[3] = t0;
579
+ $[4] = t1;
580
+ } else {
581
+ t0 = $[3];
582
+ t1 = $[4];
583
+ }
584
+ useEffect(t0, t1);
585
+ };
586
+ const useAssistantCloudEngagementEvents = (cloudRef, adapter, aui) => {
587
+ const $ = c(13);
588
+ useRootEngagementEvents(cloudRef, adapter, aui);
589
+ let t0;
590
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
591
+ t0 = /* @__PURE__ */ new Map();
592
+ $[0] = t0;
593
+ } else t0 = $[0];
594
+ const runStartedAt = useRef(t0);
595
+ let t1;
596
+ if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
597
+ t1 = /* @__PURE__ */ new Map();
598
+ $[1] = t1;
599
+ } else t1 = $[1];
600
+ const runEndedAt = useRef(t1);
601
+ let t2;
602
+ if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
603
+ t2 = /* @__PURE__ */ new Set();
604
+ $[2] = t2;
605
+ } else t2 = $[2];
606
+ const shownSuggestions = useRef(t2);
607
+ let t3;
608
+ let t4;
609
+ if ($[3] !== adapter || $[4] !== aui || $[5] !== cloudRef) {
610
+ t3 = () => {
611
+ const track = (event, threadId, messageId, options) => {
612
+ adapter.resolveEngagementEventIds(threadId, messageId, options).then((ids) => {
613
+ cloudRef.current.events?.track({
614
+ ...event,
615
+ ...ids
616
+ });
617
+ }).catch(_temp3);
618
+ };
619
+ const trackRunStopped = (threadId_0) => {
620
+ const startedAt = runStartedAt.current.get(threadId_0);
621
+ if (startedAt === void 0) return;
622
+ runStartedAt.current.delete(threadId_0);
623
+ track({
624
+ kind: "run_stopped",
625
+ value: Math.max(0, Date.now() - startedAt)
626
+ }, threadId_0);
627
+ };
628
+ const unsubscribers = [
629
+ aui.on({
630
+ scope: "thread",
631
+ event: "composer.send"
632
+ }, (payload) => {
633
+ const previousRunEndedAt = runEndedAt.current.get(payload.threadId);
634
+ track({
635
+ kind: payload.messageId ? "message_edited" : "message_sent",
636
+ ...payload.messageId ? { props: { chars: payload.chars } } : { props: {
637
+ chars: payload.chars,
638
+ attachments: payload.attachments
639
+ } },
640
+ ...!payload.messageId && previousRunEndedAt !== void 0 ? { value: Math.max(0, Date.now() - previousRunEndedAt) } : void 0
641
+ }, payload.threadId, payload.messageId, { awaitThread: !payload.messageId });
642
+ if (payload.suggestion) track({ kind: "suggestion_clicked" }, payload.threadId);
643
+ }),
644
+ aui.on({
645
+ scope: "thread",
646
+ event: "composer.attachmentAdd"
647
+ }, (payload_0) => {
648
+ track({
649
+ kind: "attachment_added",
650
+ ...payload_0.contentType ? { props: { type: payload_0.contentType } } : void 0
651
+ }, payload_0.threadId, payload_0.messageId);
652
+ }),
653
+ aui.on({
654
+ scope: "thread",
655
+ event: "composer.attachmentAddError"
656
+ }, (payload_1) => {
657
+ track({
658
+ kind: "attachment_failed",
659
+ ...payload_1.contentType ? { props: { type: payload_1.contentType } } : void 0
660
+ }, payload_1.threadId, payload_1.messageId);
661
+ }),
662
+ aui.on({
663
+ scope: "thread",
664
+ event: "composer.cancel"
665
+ }, (payload_2) => {
666
+ trackRunStopped(payload_2.threadId);
667
+ }),
668
+ aui.on({
669
+ scope: "thread",
670
+ event: "thread.runStart"
671
+ }, (payload_3) => {
672
+ runStartedAt.current.set(payload_3.threadId, Date.now());
673
+ }),
674
+ aui.on({
675
+ scope: "thread",
676
+ event: "thread.runEnd"
677
+ }, (payload_4) => {
678
+ runStartedAt.current.delete(payload_4.threadId);
679
+ runEndedAt.current.set(payload_4.threadId, Date.now());
680
+ }),
681
+ aui.on({
682
+ scope: "thread",
683
+ event: "thread.cancelRun"
684
+ }, (payload_5) => {
685
+ trackRunStopped(payload_5.threadId);
686
+ }),
687
+ aui.on({
688
+ scope: "thread",
689
+ event: "thread.voiceStarted"
690
+ }, (payload_6) => {
691
+ track({ kind: "voice_started" }, payload_6.threadId);
692
+ }),
693
+ aui.on({
694
+ scope: "thread",
695
+ event: "message.reload"
696
+ }, (payload_7) => {
697
+ track({ kind: "message_regenerated" }, payload_7.threadId, payload_7.messageId);
698
+ }),
699
+ aui.on({
700
+ scope: "thread",
701
+ event: "message.branchSwitched"
702
+ }, (payload_8) => {
703
+ track({ kind: "branch_switched" }, payload_8.threadId, payload_8.messageId);
704
+ }),
705
+ aui.on({
706
+ scope: "thread",
707
+ event: "message.copied"
708
+ }, (payload_9) => {
709
+ track({ kind: "message_copied" }, payload_9.threadId, payload_9.messageId);
710
+ }),
711
+ aui.on({
712
+ scope: "thread",
713
+ event: "message.speak"
714
+ }, (payload_10) => {
715
+ track({ kind: "speech_started" }, payload_10.threadId, payload_10.messageId);
716
+ }),
717
+ aui.on({
718
+ scope: "thread",
719
+ event: "message.error"
720
+ }, (payload_11) => {
721
+ track({
722
+ kind: "error_shown",
723
+ props: { reason: payload_11.reason }
724
+ }, payload_11.threadId, payload_11.messageId);
725
+ })
726
+ ];
727
+ return () => {
728
+ for (const unsubscribe of unsubscribers) unsubscribe();
729
+ };
730
+ };
731
+ t4 = [
732
+ adapter,
733
+ aui,
734
+ cloudRef
735
+ ];
736
+ $[3] = adapter;
737
+ $[4] = aui;
738
+ $[5] = cloudRef;
739
+ $[6] = t3;
740
+ $[7] = t4;
741
+ } else {
742
+ t3 = $[6];
743
+ t4 = $[7];
744
+ }
745
+ useEffect(t3, t4);
746
+ let t5;
747
+ let t6;
748
+ if ($[8] !== adapter || $[9] !== aui || $[10] !== cloudRef) {
749
+ t5 = () => {
750
+ const reportSuggestions = () => {
751
+ const { mainThreadId } = aui.threads.getState();
752
+ if (aui.threadListItem.getState().id !== mainThreadId) return;
753
+ const { isEmpty, suggestions } = aui.thread.getState();
754
+ if (!isEmpty || suggestions.length === 0 || shownSuggestions.current.has(mainThreadId)) return;
755
+ shownSuggestions.current.add(mainThreadId);
756
+ adapter.resolveEngagementEventIds(mainThreadId).then((ids_0) => {
757
+ cloudRef.current.events?.track({
758
+ kind: "suggestions_shown",
759
+ value: suggestions.length,
760
+ ...ids_0
761
+ });
762
+ });
763
+ };
764
+ reportSuggestions();
765
+ return aui.subscribe(reportSuggestions);
766
+ };
767
+ t6 = [
768
+ adapter,
769
+ aui,
770
+ cloudRef
771
+ ];
772
+ $[8] = adapter;
773
+ $[9] = aui;
774
+ $[10] = cloudRef;
775
+ $[11] = t5;
776
+ $[12] = t6;
777
+ } else {
778
+ t5 = $[11];
779
+ t6 = $[12];
780
+ }
781
+ useEffect(t5, t6);
782
+ };
783
+ function _temp() {}
784
+ function _temp2() {}
785
+ function _temp3() {}
414
786
  //#endregion
415
787
  export { extractAuiV0, useAssistantCloudThreadHistoryAdapter };
416
788