@assistant-ui/core 0.3.13 → 0.3.14

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 (396) hide show
  1. package/dist/adapters/speech.d.ts.map +1 -1
  2. package/dist/adapters/speech.js +9 -15
  3. package/dist/adapters/speech.js.map +1 -1
  4. package/dist/adapters/thread-history.d.ts +2 -0
  5. package/dist/adapters/thread-history.d.ts.map +1 -1
  6. package/dist/adapters/voice.d.ts.map +1 -1
  7. package/dist/adapters/voice.js +27 -15
  8. package/dist/adapters/voice.js.map +1 -1
  9. package/dist/index.d.ts +2 -2
  10. package/dist/index.js.map +1 -1
  11. package/dist/internal.d.ts +1 -1
  12. package/dist/internal.js +6 -6
  13. package/dist/model-context/frame/host.d.ts.map +1 -1
  14. package/dist/model-context/frame/host.js +2 -1
  15. package/dist/model-context/frame/host.js.map +1 -1
  16. package/dist/model-context/registry.d.ts.map +1 -1
  17. package/dist/model-context/registry.js +16 -4
  18. package/dist/model-context/registry.js.map +1 -1
  19. package/dist/react/RuntimeAdapter.d.ts +8 -1
  20. package/dist/react/RuntimeAdapter.d.ts.map +1 -1
  21. package/dist/react/RuntimeAdapter.js +23 -18
  22. package/dist/react/RuntimeAdapter.js.map +1 -1
  23. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
  24. package/dist/react/adapters/LocalStorageThreadListAdapter.js +28 -12
  25. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  26. package/dist/react/client/AdaptedRemoteThread.d.ts +11 -0
  27. package/dist/react/client/AdaptedRemoteThread.d.ts.map +1 -0
  28. package/dist/react/client/AdaptedRemoteThread.js +27 -0
  29. package/dist/react/client/AdaptedRemoteThread.js.map +1 -0
  30. package/dist/react/client/InMemoryThreadList.d.ts +19 -0
  31. package/dist/react/client/InMemoryThreadList.d.ts.map +1 -0
  32. package/dist/react/client/InMemoryThreadList.js +418 -0
  33. package/dist/react/client/InMemoryThreadList.js.map +1 -0
  34. package/dist/react/client/Interactables.d.ts.map +1 -1
  35. package/dist/react/client/Interactables.js +159 -102
  36. package/dist/react/client/Interactables.js.map +1 -1
  37. package/dist/react/client/RemoteThreadList.d.ts +34 -0
  38. package/dist/react/client/RemoteThreadList.d.ts.map +1 -0
  39. package/dist/react/client/RemoteThreadList.js +826 -0
  40. package/dist/react/client/RemoteThreadList.js.map +1 -0
  41. package/dist/react/client/Tools.d.ts.map +1 -1
  42. package/dist/react/client/Tools.js +38 -27
  43. package/dist/react/client/Tools.js.map +1 -1
  44. package/dist/react/index.d.ts +7 -2
  45. package/dist/react/index.js +5 -2
  46. package/dist/react/interactables-legacy/Interactables.d.ts.map +1 -1
  47. package/dist/react/interactables-legacy/Interactables.js +145 -110
  48. package/dist/react/interactables-legacy/Interactables.js.map +1 -1
  49. package/dist/react/primitive-hooks/useActionBarCopy.d.ts.map +1 -1
  50. package/dist/react/primitive-hooks/useActionBarCopy.js +13 -18
  51. package/dist/react/primitive-hooks/useActionBarCopy.js.map +1 -1
  52. package/dist/react/primitive-hooks/useActionBarEdit.d.ts.map +1 -1
  53. package/dist/react/primitive-hooks/useActionBarEdit.js +2 -4
  54. package/dist/react/primitive-hooks/useActionBarEdit.js.map +1 -1
  55. package/dist/react/primitive-hooks/useActionBarReload.d.ts.map +1 -1
  56. package/dist/react/primitive-hooks/useActionBarReload.js +2 -4
  57. package/dist/react/primitive-hooks/useActionBarReload.js.map +1 -1
  58. package/dist/react/primitive-hooks/useBranchPickerNext.d.ts.map +1 -1
  59. package/dist/react/primitive-hooks/useBranchPickerNext.js +2 -6
  60. package/dist/react/primitive-hooks/useBranchPickerNext.js.map +1 -1
  61. package/dist/react/primitive-hooks/useBranchPickerPrevious.d.ts.map +1 -1
  62. package/dist/react/primitive-hooks/useBranchPickerPrevious.js +2 -6
  63. package/dist/react/primitive-hooks/useBranchPickerPrevious.js.map +1 -1
  64. package/dist/react/primitive-hooks/useComposerCancel.d.ts.map +1 -1
  65. package/dist/react/primitive-hooks/useComposerCancel.js +2 -4
  66. package/dist/react/primitive-hooks/useComposerCancel.js.map +1 -1
  67. package/dist/react/primitive-hooks/useComposerSend.d.ts.map +1 -1
  68. package/dist/react/primitive-hooks/useComposerSend.js +2 -4
  69. package/dist/react/primitive-hooks/useComposerSend.js.map +1 -1
  70. package/dist/react/primitive-hooks/useSuggestionTrigger.d.ts.map +1 -1
  71. package/dist/react/primitive-hooks/useSuggestionTrigger.js +6 -2
  72. package/dist/react/primitive-hooks/useSuggestionTrigger.js.map +1 -1
  73. package/dist/react/primitives/message/MessageParts.d.ts +13 -0
  74. package/dist/react/primitives/message/MessageParts.d.ts.map +1 -1
  75. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  76. package/dist/react/primitives/thread/ThreadMessages.d.ts.map +1 -1
  77. package/dist/react/primitives/thread/ThreadMessages.js +1 -1
  78. package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
  79. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +22 -10
  80. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  81. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +109 -71
  82. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  83. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +8 -2
  84. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  85. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +40 -13
  86. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  87. package/dist/react/runtimes/RemoteThreadResource.d.ts +30 -0
  88. package/dist/react/runtimes/RemoteThreadResource.d.ts.map +1 -0
  89. package/dist/react/runtimes/RemoteThreadResource.js +134 -0
  90. package/dist/react/runtimes/RemoteThreadResource.js.map +1 -0
  91. package/dist/react/runtimes/RuntimeAdapterProvider.d.ts +3 -10
  92. package/dist/react/runtimes/RuntimeAdapterProvider.d.ts.map +1 -1
  93. package/dist/react/runtimes/RuntimeAdapterProvider.js +3 -6
  94. package/dist/react/runtimes/RuntimeAdapterProvider.js.map +1 -1
  95. package/dist/react/runtimes/assistant-transport/commandQueue.d.ts +17 -0
  96. package/dist/react/runtimes/assistant-transport/commandQueue.d.ts.map +1 -0
  97. package/dist/react/runtimes/assistant-transport/commandQueue.js +55 -0
  98. package/dist/react/runtimes/assistant-transport/commandQueue.js.map +1 -0
  99. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.d.ts +11 -0
  100. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.d.ts.map +1 -0
  101. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.js +165 -0
  102. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.js.map +1 -0
  103. package/dist/react/runtimes/assistant-transport/runManager.d.ts +15 -0
  104. package/dist/react/runtimes/assistant-transport/runManager.d.ts.map +1 -0
  105. package/dist/react/runtimes/assistant-transport/runManager.js +86 -0
  106. package/dist/react/runtimes/assistant-transport/runManager.js.map +1 -0
  107. package/dist/react/runtimes/assistant-transport/types.d.ts +130 -0
  108. package/dist/react/runtimes/assistant-transport/types.d.ts.map +1 -0
  109. package/dist/react/runtimes/assistant-transport/types.js +0 -0
  110. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts +14 -0
  111. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts.map +1 -0
  112. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.js +296 -0
  113. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.js.map +1 -0
  114. package/dist/react/runtimes/assistant-transport/useConvertedState.d.ts +7 -0
  115. package/dist/react/runtimes/assistant-transport/useConvertedState.d.ts.map +1 -0
  116. package/dist/react/runtimes/assistant-transport/useConvertedState.js +25 -0
  117. package/dist/react/runtimes/assistant-transport/useConvertedState.js.map +1 -0
  118. package/dist/react/runtimes/assistant-transport/useLatestRef.d.ts +7 -0
  119. package/dist/react/runtimes/assistant-transport/useLatestRef.d.ts.map +1 -0
  120. package/dist/react/runtimes/assistant-transport/useLatestRef.js +27 -0
  121. package/dist/react/runtimes/assistant-transport/useLatestRef.js.map +1 -0
  122. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  123. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +39 -13
  124. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  125. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts +2 -1
  126. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts.map +1 -1
  127. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js +3 -3
  128. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js.map +1 -1
  129. package/dist/react/runtimes/cloud/auiV0.d.ts +4 -0
  130. package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
  131. package/dist/react/runtimes/cloud/auiV0.js +7 -0
  132. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  133. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
  134. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +22 -12
  135. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  136. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.d.ts +16 -0
  137. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.d.ts.map +1 -0
  138. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.js +36 -0
  139. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.js.map +1 -0
  140. package/dist/react/runtimes/external-message-converter.js +14 -14
  141. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  142. package/dist/react/runtimes/useExternalStoreRuntime.d.ts.map +1 -1
  143. package/dist/react/runtimes/useExternalStoreRuntime.js +44 -28
  144. package/dist/react/runtimes/useExternalStoreRuntime.js.map +1 -1
  145. package/dist/react/runtimes/useExternalStoreSharedOptions.js.map +1 -1
  146. package/dist/react/runtimes/useLocalRuntime.js +1 -1
  147. package/dist/react/runtimes/useRuntimeAdapters.d.ts +9 -0
  148. package/dist/react/runtimes/useRuntimeAdapters.d.ts.map +1 -0
  149. package/dist/react/runtimes/useRuntimeAdapters.js +20 -0
  150. package/dist/react/runtimes/useRuntimeAdapters.js.map +1 -0
  151. package/dist/runtime/api/composer-runtime.d.ts +5 -0
  152. package/dist/runtime/api/composer-runtime.d.ts.map +1 -1
  153. package/dist/runtime/api/composer-runtime.js.map +1 -1
  154. package/dist/runtime/api/message-runtime.js +1 -1
  155. package/dist/runtime/api/thread-list-runtime.d.ts +1 -0
  156. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  157. package/dist/runtime/api/thread-list-runtime.js +4 -2
  158. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  159. package/dist/runtime/api/thread-runtime.d.ts +12 -2
  160. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  161. package/dist/runtime/api/thread-runtime.js +8 -2
  162. package/dist/runtime/api/thread-runtime.js.map +1 -1
  163. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  164. package/dist/runtime/base/base-composer-runtime-core.js +8 -7
  165. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  166. package/dist/runtime/base/base-thread-runtime-core.d.ts +1 -0
  167. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  168. package/dist/runtime/base/base-thread-runtime-core.js +3 -3
  169. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  170. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +0 -1
  171. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
  172. package/dist/runtime/base/default-thread-composer-runtime-core.js +10 -4
  173. package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
  174. package/dist/runtime/interfaces/thread-runtime-core.d.ts +6 -0
  175. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  176. package/dist/runtime/internal.js +5 -5
  177. package/dist/runtime/queue/message-queue.d.ts.map +1 -1
  178. package/dist/runtime/queue/message-queue.js +2 -1
  179. package/dist/runtime/queue/message-queue.js.map +1 -1
  180. package/dist/runtime/utils/thread-runtime-lifecycle.d.ts +8 -0
  181. package/dist/runtime/utils/thread-runtime-lifecycle.d.ts.map +1 -0
  182. package/dist/runtime/utils/thread-runtime-lifecycle.js +11 -0
  183. package/dist/runtime/utils/thread-runtime-lifecycle.js.map +1 -0
  184. package/dist/runtimes/external-store/external-store-shared-options.js.map +1 -1
  185. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  186. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +4 -1
  187. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  188. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +8 -0
  189. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  190. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +35 -13
  191. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  192. package/dist/runtimes/internal.d.ts +1 -1
  193. package/dist/runtimes/local/local-thread-runtime-core.d.ts +3 -0
  194. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  195. package/dist/runtimes/local/local-thread-runtime-core.js +53 -13
  196. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  197. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +1 -0
  198. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
  199. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js +3 -0
  200. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js.map +1 -1
  201. package/dist/runtimes/remote-thread-list/empty-thread-core.js +3 -0
  202. package/dist/runtimes/remote-thread-list/empty-thread-core.js.map +1 -1
  203. package/dist/runtimes/remote-thread-list/types.d.ts +29 -1
  204. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  205. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts +1 -12
  206. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
  207. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +67 -38
  208. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  209. package/dist/store/clients/suggestions.js +2 -2
  210. package/dist/store/clients/suggestions.js.map +1 -1
  211. package/dist/store/clients/thread-selection-events.d.ts +10 -0
  212. package/dist/store/clients/thread-selection-events.d.ts.map +1 -0
  213. package/dist/store/clients/thread-selection-events.js +40 -0
  214. package/dist/store/clients/thread-selection-events.js.map +1 -0
  215. package/dist/store/env.d.ts +5 -0
  216. package/dist/store/env.d.ts.map +1 -0
  217. package/dist/store/env.js +12 -0
  218. package/dist/store/env.js.map +1 -0
  219. package/dist/store/index.d.ts +5 -3
  220. package/dist/store/index.js +4 -2
  221. package/dist/store/internal.d.ts +4 -1
  222. package/dist/store/internal.js +4 -1
  223. package/dist/store/primitive-predicates.d.ts +19 -0
  224. package/dist/store/primitive-predicates.d.ts.map +1 -0
  225. package/dist/store/primitive-predicates.js +19 -0
  226. package/dist/store/primitive-predicates.js.map +1 -0
  227. package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -1
  228. package/dist/store/runtime-clients/attachment-runtime-client.js +18 -11
  229. package/dist/store/runtime-clients/attachment-runtime-client.js.map +1 -1
  230. package/dist/store/runtime-clients/handle-runtime-action.d.ts +5 -0
  231. package/dist/store/runtime-clients/handle-runtime-action.d.ts.map +1 -0
  232. package/dist/store/runtime-clients/handle-runtime-action.js +12 -0
  233. package/dist/store/runtime-clients/handle-runtime-action.js.map +1 -0
  234. package/dist/store/runtime-clients/handle-thread-list-action.d.ts +5 -0
  235. package/dist/store/runtime-clients/handle-thread-list-action.d.ts.map +1 -0
  236. package/dist/store/runtime-clients/handle-thread-list-action.js +7 -0
  237. package/dist/store/runtime-clients/handle-thread-list-action.js.map +1 -0
  238. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  239. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +62 -29
  240. package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
  241. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  242. package/dist/store/runtime-clients/thread-list-runtime-client.js +5 -6
  243. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  244. package/dist/store/scopes/composer.d.ts +9 -4
  245. package/dist/store/scopes/composer.d.ts.map +1 -1
  246. package/dist/store/scopes/thread-list-item.d.ts +7 -6
  247. package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
  248. package/dist/store/scopes/thread.d.ts +8 -7
  249. package/dist/store/scopes/thread.d.ts.map +1 -1
  250. package/dist/store/scopes/threads.d.ts +17 -1
  251. package/dist/store/scopes/threads.d.ts.map +1 -1
  252. package/dist/subscribable/subscribable.d.ts +2 -1
  253. package/dist/subscribable/subscribable.d.ts.map +1 -1
  254. package/dist/subscribable/subscribable.js +23 -18
  255. package/dist/subscribable/subscribable.js.map +1 -1
  256. package/dist/utils/composite-context-provider.d.ts +1 -0
  257. package/dist/utils/composite-context-provider.d.ts.map +1 -1
  258. package/dist/utils/composite-context-provider.js +25 -9
  259. package/dist/utils/composite-context-provider.js.map +1 -1
  260. package/dist/utils/notify-event-listeners.d.ts +2 -2
  261. package/dist/utils/notify-event-listeners.d.ts.map +1 -1
  262. package/dist/utils/notify-event-listeners.js +2 -2
  263. package/dist/utils/notify-event-listeners.js.map +1 -1
  264. package/package.json +7 -7
  265. package/src/adapters/speech.test.ts +118 -1
  266. package/src/adapters/speech.ts +21 -22
  267. package/src/adapters/thread-history.ts +2 -0
  268. package/src/adapters/voice.test.ts +69 -0
  269. package/src/adapters/voice.ts +27 -27
  270. package/src/index.ts +1 -0
  271. package/src/model-context/frame/host.test.ts +23 -0
  272. package/src/model-context/frame/host.ts +2 -1
  273. package/src/model-context/registry.test.ts +131 -0
  274. package/src/model-context/registry.ts +16 -6
  275. package/src/react/RuntimeAdapter.test.ts +2 -0
  276. package/src/react/RuntimeAdapter.ts +20 -8
  277. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +34 -17
  278. package/src/react/client/AdaptedRemoteThread.ts +41 -0
  279. package/src/react/client/InMemoryThreadList.test.tsx +148 -0
  280. package/src/react/client/InMemoryThreadList.ts +290 -0
  281. package/src/react/client/Interactables.test.ts +326 -2
  282. package/src/react/client/Interactables.ts +227 -110
  283. package/src/react/client/RemoteThreadList.test.ts +1026 -0
  284. package/src/react/client/RemoteThreadList.ts +1067 -0
  285. package/src/react/client/Tools.ts +36 -29
  286. package/src/react/index.ts +13 -0
  287. package/src/react/interactables-legacy/Interactables.test.ts +317 -0
  288. package/src/react/interactables-legacy/Interactables.ts +204 -128
  289. package/src/react/primitive-hooks/useActionBarCopy.ts +2 -7
  290. package/src/react/primitive-hooks/useActionBarEdit.ts +2 -1
  291. package/src/react/primitive-hooks/useActionBarReload.ts +2 -6
  292. package/src/react/primitive-hooks/useBranchPickerNext.ts +2 -7
  293. package/src/react/primitive-hooks/useBranchPickerPrevious.ts +2 -7
  294. package/src/react/primitive-hooks/useComposerCancel.ts +2 -1
  295. package/src/react/primitive-hooks/useComposerSend.ts +2 -5
  296. package/src/react/primitive-hooks/useSuggestionTrigger.test.ts +11 -0
  297. package/src/react/primitive-hooks/useSuggestionTrigger.ts +4 -5
  298. package/src/react/primitives/message/MessageParts.tsx +0 -1
  299. package/src/react/primitives/thread/ThreadMessages.tsx +2 -1
  300. package/src/react/runtimes/RemoteThreadListHookInstanceManager.retry.test.tsx +116 -0
  301. package/src/react/runtimes/RemoteThreadListHookInstanceManager.running.test.tsx +1 -1
  302. package/src/react/runtimes/RemoteThreadListHookInstanceManager.test.tsx +57 -6
  303. package/src/react/runtimes/RemoteThreadListHookInstanceManager.title.test.tsx +272 -0
  304. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +159 -124
  305. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +59 -20
  306. package/src/react/runtimes/RemoteThreadResource.test.ts +141 -0
  307. package/src/react/runtimes/RemoteThreadResource.ts +231 -0
  308. package/src/react/runtimes/RuntimeAdapterProvider.tsx +8 -20
  309. package/src/react/runtimes/assistant-transport/commandQueue.ts +68 -0
  310. package/src/react/runtimes/assistant-transport/replayBoundaryStream.test.ts +455 -0
  311. package/src/react/runtimes/assistant-transport/replayBoundaryStream.ts +172 -0
  312. package/src/react/runtimes/assistant-transport/runManager.ts +124 -0
  313. package/src/react/runtimes/assistant-transport/transport-delivery.test.tsx +79 -0
  314. package/src/react/runtimes/assistant-transport/transport-parentid.test.tsx +97 -0
  315. package/src/react/runtimes/assistant-transport/transport-scheduling.test.ts +414 -0
  316. package/src/react/runtimes/assistant-transport/types.ts +170 -0
  317. package/src/react/runtimes/assistant-transport/useAssistantTransport.spec.md +141 -0
  318. package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.test.tsx +625 -0
  319. package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.ts +481 -0
  320. package/src/react/runtimes/assistant-transport/useConvertedState.ts +20 -0
  321. package/src/react/runtimes/assistant-transport/useLatestRef.ts +9 -0
  322. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +131 -6
  323. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +61 -15
  324. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts +6 -4
  325. package/src/react/runtimes/cloud/auiV0.ts +17 -1
  326. package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +36 -21
  327. package/src/react/runtimes/cloud/useCloudThreadListRuntime.test.tsx +56 -0
  328. package/src/react/runtimes/cloud/useCloudThreadListRuntime.ts +31 -0
  329. package/src/react/runtimes/external-message-converter.test.ts +143 -0
  330. package/src/react/runtimes/external-message-converter.ts +41 -41
  331. package/src/react/runtimes/remote-thread-hook-on-tap.test.ts +58 -0
  332. package/src/react/runtimes/useExternalStoreRuntime.lifecycle.test.tsx +83 -0
  333. package/src/react/runtimes/useExternalStoreRuntime.suggestions.test.tsx +13 -3
  334. package/src/react/runtimes/useExternalStoreRuntime.ts +7 -0
  335. package/src/react/runtimes/useExternalStoreSharedOptions.ts +3 -1
  336. package/src/react/runtimes/useLocalRuntime.test.tsx +130 -4
  337. package/src/react/runtimes/useRuntimeAdapters.test.tsx +62 -0
  338. package/src/react/runtimes/useRuntimeAdapters.ts +28 -0
  339. package/src/runtime/api/composer-runtime.ts +5 -0
  340. package/src/runtime/api/thread-list-runtime.ts +3 -1
  341. package/src/runtime/api/thread-runtime.ts +20 -2
  342. package/src/runtime/base/base-composer-runtime-core.ts +6 -5
  343. package/src/runtime/base/base-thread-runtime-core.test.ts +191 -0
  344. package/src/runtime/base/base-thread-runtime-core.ts +11 -2
  345. package/src/runtime/base/default-thread-composer-runtime-core.ts +12 -4
  346. package/src/runtime/interfaces/thread-runtime-core.ts +6 -0
  347. package/src/runtime/queue/message-queue.ts +2 -1
  348. package/src/runtime/utils/thread-runtime-lifecycle.ts +18 -0
  349. package/src/runtimes/external-store/external-store-shared-options.ts +3 -1
  350. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +4 -1
  351. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +99 -34
  352. package/src/runtimes/local/local-thread-runtime-core.test.ts +373 -4
  353. package/src/runtimes/local/local-thread-runtime-core.ts +79 -14
  354. package/src/runtimes/readonly/ReadonlyThreadRuntimeCore.ts +4 -0
  355. package/src/runtimes/remote-thread-list/empty-thread-core.ts +4 -0
  356. package/src/runtimes/remote-thread-list/types.ts +30 -0
  357. package/src/runtimes/tool-invocations/EDGE_CASES.md +17 -6
  358. package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +243 -0
  359. package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +127 -61
  360. package/src/store/clients/model-context-client.test.ts +16 -8
  361. package/src/store/clients/suggestions.ts +2 -2
  362. package/src/store/clients/thread-selection-events.ts +21 -0
  363. package/src/store/env.ts +11 -0
  364. package/src/store/index.ts +14 -1
  365. package/src/store/internal.ts +13 -0
  366. package/src/store/primitive-predicates.test.ts +184 -0
  367. package/src/store/primitive-predicates.ts +43 -0
  368. package/src/store/runtime-clients/attachment-runtime-client.test.ts +41 -0
  369. package/src/store/runtime-clients/attachment-runtime-client.ts +2 -1
  370. package/src/store/runtime-clients/handle-runtime-action.ts +11 -0
  371. package/src/store/runtime-clients/handle-thread-list-action.test.ts +69 -0
  372. package/src/store/runtime-clients/handle-thread-list-action.ts +6 -0
  373. package/src/store/runtime-clients/thread-list-item-runtime-client.ts +15 -7
  374. package/src/store/runtime-clients/thread-list-runtime-client.ts +9 -6
  375. package/src/store/scopes/composer.ts +9 -4
  376. package/src/store/scopes/thread-list-item.ts +7 -6
  377. package/src/store/scopes/thread.ts +8 -7
  378. package/src/store/scopes/threads.ts +14 -0
  379. package/src/subscribable/subscribable.test.ts +77 -1
  380. package/src/subscribable/subscribable.ts +38 -23
  381. package/src/tests/RemoteThreadListThreadListRuntimeCore-switchToThread-unarchive.test.ts +25 -0
  382. package/src/tests/auiV0Encode.test.ts +66 -0
  383. package/src/tests/base-composer-runtime-core-send.test.ts +30 -0
  384. package/src/tests/base-composer-runtime-core.test.ts +28 -0
  385. package/src/tests/composer-can-cancel.test.ts +101 -0
  386. package/src/tests/external-store-thread-list-runtime-core.test.ts +101 -0
  387. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +191 -1
  388. package/src/tests/external-store-thread-runtime-core.test.ts +124 -0
  389. package/src/tests/interactables-toolui-migration.test.tsx +66 -0
  390. package/src/tests/message-queue.test.ts +28 -0
  391. package/src/tests/session-reset-notification.test.ts +145 -0
  392. package/src/tests/thread-switch-events.test.tsx +99 -1
  393. package/src/tests/tools-scope-migration.test.tsx +58 -0
  394. package/src/utils/composite-context-provider.test.ts +139 -0
  395. package/src/utils/composite-context-provider.ts +26 -8
  396. package/src/utils/notify-event-listeners.ts +10 -5
@@ -0,0 +1,296 @@
1
+ "use client";
2
+ import { InMemoryThreadListAdapter } from "../../../runtimes/remote-thread-list/adapter/in-memory.js";
3
+ import { createRequestHeaders } from "../../../runtimes/assistant-transport/utils.js";
4
+ import { useExternalStoreRuntime } from "../useExternalStoreRuntime.js";
5
+ import { useRemoteThreadListRuntime } from "../useRemoteThreadListRuntime.js";
6
+ import { useCommandQueue } from "./commandQueue.js";
7
+ import { createReplayBoundaryStream, useReplayRenderWait } from "./replayBoundaryStream.js";
8
+ import { useRunManager } from "./runManager.js";
9
+ import { useConvertedState } from "./useConvertedState.js";
10
+ import { AssistantMessageAccumulator, AssistantTransportDecoder, DataStreamDecoder, toToolsJSONSchema, unstable_createInitialMessage } from "assistant-stream";
11
+ import { asAsyncIterableStream } from "assistant-stream/utils";
12
+ import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
13
+ import { useMemo, useRef, useState } from "@assistant-ui/tap/react-shim";
14
+ import { useAui, useAuiState } from "@assistant-ui/store";
15
+ //#region src/react/runtimes/assistant-transport/useAssistantTransportRuntime.ts
16
+ const convertAppendMessageToCommand = (message) => {
17
+ if (message.role !== "user") throw new Error("Only user messages are supported");
18
+ const parts = [];
19
+ const content = [...message.content, ...message.attachments?.flatMap((a) => a.content) ?? []];
20
+ for (const contentPart of content) if (contentPart.type === "text") parts.push({
21
+ type: "text",
22
+ text: contentPart.text
23
+ });
24
+ else if (contentPart.type === "image") parts.push({
25
+ type: "image",
26
+ image: contentPart.image
27
+ });
28
+ if (parts.length === 0) return null;
29
+ return {
30
+ type: "add-message",
31
+ message: {
32
+ role: "user",
33
+ parts
34
+ },
35
+ parentId: message.parentId,
36
+ sourceId: message.sourceId
37
+ };
38
+ };
39
+ const readResumeState = async (response) => {
40
+ if (response.status === 204) return null;
41
+ if (!response.ok) throw new Error(`Resume state request failed with status ${response.status}: ${await response.text()}`);
42
+ let value;
43
+ try {
44
+ value = await response.json();
45
+ } catch {
46
+ throw new Error("Resume state response was not valid JSON");
47
+ }
48
+ if (typeof value !== "object" || value === null || !("state" in value) || !("runId" in value) || typeof value.runId !== "string") throw new Error("Resume state response must contain state and runId");
49
+ return {
50
+ runId: value.runId,
51
+ state: value.state
52
+ };
53
+ };
54
+ const symbolAssistantTransportExtras = Symbol("assistant-transport-extras");
55
+ const asAssistantTransportExtras = (extras) => {
56
+ if (typeof extras !== "object" || extras == null || !(symbolAssistantTransportExtras in extras)) throw new Error("This method can only be called when you are using useAssistantTransportRuntime");
57
+ return extras;
58
+ };
59
+ const useAssistantTransportSendCommand = () => {
60
+ const $ = c(2);
61
+ const aui = useAui();
62
+ let t0;
63
+ if ($[0] !== aui.thread) {
64
+ t0 = (command) => {
65
+ const extras = aui.thread.getState().extras;
66
+ asAssistantTransportExtras(extras).sendCommand(command);
67
+ };
68
+ $[0] = aui.thread;
69
+ $[1] = t0;
70
+ } else t0 = $[1];
71
+ return t0;
72
+ };
73
+ function useAssistantTransportState(selector = (t) => t) {
74
+ return useAuiState((s) => selector(asAssistantTransportExtras(s.thread.extras).state));
75
+ }
76
+ const useAssistantTransportThreadRuntime = (options) => {
77
+ const agentStateRef = useRef(options.initialState);
78
+ const [, rerender] = useState(0);
79
+ const resumeFlagRef = useRef(false);
80
+ const [isReplaying, setIsReplaying] = useState(false);
81
+ const waitForReplayRender = useReplayRenderWait();
82
+ const parentIdRef = useRef(void 0);
83
+ const commandQueue = useCommandQueue({ onQueue: () => runManager.schedule() });
84
+ const enqueueAppendMessage = (message) => {
85
+ const command = convertAppendMessageToCommand(message);
86
+ if (!command) {
87
+ console.warn("[assistant-ui] Skipped add-message command with no supported parts");
88
+ return;
89
+ }
90
+ parentIdRef.current = message.parentId;
91
+ commandQueue.enqueue(command, { schedule: message.startRun ?? message.role === "user" });
92
+ };
93
+ const threadId = useAuiState((s) => s.threadListItem.remoteId);
94
+ const runManager = useRunManager({
95
+ onRun: async (signal) => {
96
+ const isResume = resumeFlagRef.current;
97
+ resumeFlagRef.current = false;
98
+ setIsReplaying(false);
99
+ const commands = isResume ? [] : commandQueue.flush();
100
+ if (commands.length === 0 && !isResume) return;
101
+ const parentId = isResume ? void 0 : parentIdRef.current;
102
+ if (!isResume) parentIdRef.current = void 0;
103
+ const headers = await createRequestHeaders(options.headers);
104
+ let resumeState;
105
+ if (isResume && options.resumeStateApi) {
106
+ const resumeStateResponse = await fetch(options.resumeStateApi, {
107
+ method: "POST",
108
+ headers,
109
+ body: JSON.stringify({ threadId }),
110
+ signal
111
+ });
112
+ const retained = await readResumeState(resumeStateResponse);
113
+ if (retained === null) {
114
+ if (commandQueue.state.queued.length > 0) runManager.schedule();
115
+ return;
116
+ }
117
+ resumeState = retained;
118
+ }
119
+ const bodyValue = typeof options.body === "function" ? await options.body() : options.body;
120
+ const context = runtime.thread.getModelContext();
121
+ let requestBody = {
122
+ commands,
123
+ ...resumeState === void 0 && { state: agentStateRef.current },
124
+ system: context.system,
125
+ tools: context.tools ? toToolsJSONSchema(context.tools) : void 0,
126
+ threadId,
127
+ ...parentId !== void 0 && { parentId },
128
+ callSettings: context.callSettings,
129
+ config: context.config,
130
+ ...context.callSettings,
131
+ ...context.config,
132
+ ...bodyValue ?? {}
133
+ };
134
+ if (options.prepareSendCommandsRequest) requestBody = await options.prepareSendCommandsRequest(requestBody);
135
+ if (resumeState !== void 0) {
136
+ requestBody = {
137
+ ...requestBody,
138
+ runId: resumeState.runId
139
+ };
140
+ delete requestBody["state"];
141
+ }
142
+ const response = await fetch(isResume ? options.resumeApi : options.api, {
143
+ method: "POST",
144
+ headers,
145
+ body: JSON.stringify(requestBody),
146
+ signal
147
+ });
148
+ try {
149
+ await options.onResponse?.(response);
150
+ } catch (error) {
151
+ response.body?.cancel().catch(() => {});
152
+ throw error;
153
+ }
154
+ if (!response.ok) throw new Error(`Status ${response.status}: ${await response.text()}`);
155
+ if (!response.body) throw new Error("Response body is null");
156
+ if (resumeState !== void 0) {
157
+ agentStateRef.current = resumeState.state;
158
+ rerender((prev) => prev + 1);
159
+ }
160
+ const body = await createReplayBoundaryStream(response, {
161
+ setReplaying: setIsReplaying,
162
+ waitForRender: waitForReplayRender
163
+ });
164
+ const protocol = options.protocol ?? "data-stream";
165
+ const strict = isResume ? false : options.strict ?? true;
166
+ const decoder = protocol === "assistant-transport" ? new AssistantTransportDecoder({ strict }) : new DataStreamDecoder({ strict });
167
+ let err;
168
+ const stream = body.pipeThrough(decoder).pipeThrough(new AssistantMessageAccumulator({
169
+ initialMessage: unstable_createInitialMessage({ unstable_state: agentStateRef.current ?? null }),
170
+ throttle: isResume,
171
+ strict,
172
+ onError: (error_0) => {
173
+ err = error_0;
174
+ }
175
+ }));
176
+ let markedDelivered = false;
177
+ for await (const chunk of asAsyncIterableStream(stream)) {
178
+ if (chunk.metadata.unstable_state === agentStateRef.current) continue;
179
+ if (!markedDelivered) {
180
+ commandQueue.markDelivered();
181
+ markedDelivered = true;
182
+ }
183
+ agentStateRef.current = chunk.metadata.unstable_state;
184
+ rerender((prev) => prev + 1);
185
+ }
186
+ if (err) throw new Error(err);
187
+ if (!markedDelivered) commandQueue.markDelivered();
188
+ if (isResume && commandQueue.state.queued.length > 0) runManager.schedule();
189
+ },
190
+ onFinish: options.onFinish,
191
+ onCancel: () => {
192
+ setIsReplaying(false);
193
+ const cmds = [...commandQueue.state.inTransit, ...commandQueue.state.queued];
194
+ commandQueue.reset();
195
+ options.onCancel?.({
196
+ commands: cmds,
197
+ updateState: (updater) => {
198
+ agentStateRef.current = updater(agentStateRef.current);
199
+ rerender((prev_0) => prev_0 + 1);
200
+ }
201
+ });
202
+ },
203
+ onError: async (error_1) => {
204
+ resumeFlagRef.current = false;
205
+ setIsReplaying(false);
206
+ const inTransitCmds = [...commandQueue.state.inTransit];
207
+ const queuedCmds = [...commandQueue.state.queued];
208
+ commandQueue.reset();
209
+ try {
210
+ await options.onError?.(error_1, {
211
+ commands: inTransitCmds,
212
+ updateState: (updater) => {
213
+ agentStateRef.current = updater(agentStateRef.current);
214
+ rerender((prev) => prev + 1);
215
+ }
216
+ });
217
+ } finally {
218
+ options.onCancel?.({
219
+ commands: queuedCmds,
220
+ updateState: (updater) => {
221
+ agentStateRef.current = updater(agentStateRef.current);
222
+ rerender((prev) => prev + 1);
223
+ },
224
+ error: error_1
225
+ });
226
+ }
227
+ }
228
+ });
229
+ const [toolStatuses, setToolStatuses] = useState({});
230
+ const pendingCommands = useMemo(() => [...commandQueue.state.inTransit, ...commandQueue.state.queued], [commandQueue.state]);
231
+ const converted = useConvertedState(options.converter, agentStateRef.current, pendingCommands, runManager.isRunning, toolStatuses);
232
+ const runtime = useExternalStoreRuntime({
233
+ messages: converted.messages,
234
+ state: converted.state,
235
+ isRunning: converted.isRunning,
236
+ isLoading: isReplaying,
237
+ adapters: options.adapters,
238
+ unstable_enableToolInvocations: true,
239
+ setToolStatuses,
240
+ extras: {
241
+ [symbolAssistantTransportExtras]: true,
242
+ sendCommand: (command_0) => {
243
+ commandQueue.enqueue(command_0);
244
+ },
245
+ state: agentStateRef.current
246
+ },
247
+ onNew: async (message_0) => enqueueAppendMessage(message_0),
248
+ ...options.capabilities?.edit && { onEdit: async (message_1) => enqueueAppendMessage(message_1) },
249
+ ...commandQueue.state.queued.length > 0 && { onReload: async (parentId_0) => {
250
+ parentIdRef.current = parentId_0;
251
+ runManager.schedule();
252
+ } },
253
+ onCancel: async () => {
254
+ resumeFlagRef.current = false;
255
+ runManager.cancel();
256
+ },
257
+ onResume: async () => {
258
+ if (!options.resumeApi) throw new Error("Must pass resumeApi to options to resume runs");
259
+ resumeFlagRef.current = true;
260
+ runManager.schedule();
261
+ },
262
+ onAddToolResult: async (toolOptions) => {
263
+ const command_1 = {
264
+ type: "add-tool-result",
265
+ toolCallId: toolOptions.toolCallId,
266
+ result: toolOptions.result,
267
+ toolName: toolOptions.toolName,
268
+ isError: toolOptions.isError,
269
+ ...toolOptions.artifact && { artifact: toolOptions.artifact },
270
+ ...toolOptions.modelContent !== void 0 && { modelContent: toolOptions.modelContent }
271
+ };
272
+ commandQueue.enqueue(command_1);
273
+ },
274
+ onLoadExternalState: async (state) => {
275
+ agentStateRef.current = state;
276
+ rerender((prev_1) => prev_1 + 1);
277
+ }
278
+ });
279
+ return runtime;
280
+ };
281
+ /**
282
+ * @alpha This is an experimental API that is subject to change.
283
+ */
284
+ const useAssistantTransportRuntime = (options) => {
285
+ return useRemoteThreadListRuntime({
286
+ runtimeHook: function RuntimeHook() {
287
+ return useAssistantTransportThreadRuntime(options);
288
+ },
289
+ adapter: new InMemoryThreadListAdapter(),
290
+ allowNesting: true
291
+ });
292
+ };
293
+ //#endregion
294
+ export { useAssistantTransportRuntime, useAssistantTransportSendCommand, useAssistantTransportState };
295
+
296
+ //# sourceMappingURL=useAssistantTransportRuntime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAssistantTransportRuntime.js","names":["c","_c","AppendMessage","ReadonlyJSONObject","ReadonlyJSONValue","asAsyncIterableStream","useExternalStoreRuntime","AssistantRuntime","AddToolResultOptions","useMemo","useRef","useState","AssistantMessageAccumulator","DataStreamDecoder","AssistantTransportDecoder","unstable_createInitialMessage","createInitialMessage","toToolsJSONSchema","AssistantTransportOptions","AddMessageCommand","AddToolResultCommand","UserMessagePart","QueuedCommand","AssistantTransportCommand","SendCommandsRequestBody","useCommandQueue","createReplayBoundaryStream","useReplayRenderWait","useRunManager","useConvertedState","ToolExecutionStatus","createRequestHeaders","useRemoteThreadListRuntime","InMemoryThreadListAdapter","useAui","useAuiState","UserExternalState","convertAppendMessageToCommand","message","role","Error","parts","content","attachments","flatMap","a","contentPart","type","push","text","image","length","parentId","sourceId","readResumeState","response","Response","Promise","runId","state","T","status","ok","value","json","symbolAssistantTransportExtras","Symbol","AssistantTransportExtras","sendCommand","command","asAssistantTransportExtras","extras","useAssistantTransportSendCommand","$","aui","t0","thread","getState","transportExtras","useAssistantTransportState","selector","t","s","useAssistantTransportThreadRuntime","options","agentStateRef","initialState","rerender","resumeFlagRef","isReplaying","setIsReplaying","waitForReplayRender","parentIdRef","undefined","commandQueue","onQueue","runManager","schedule","enqueueAppendMessage","console","warn","current","enqueue","startRun","threadId","threadListItem","remoteId","onRun","signal","AbortSignal","isResume","commands","flush","headers","resumeState","resumeStateApi","resumeStateResponse","fetch","method","body","JSON","stringify","retained","queued","bodyValue","context","runtime","getModelContext","requestBody","Record","system","tools","callSettings","config","prepareSendCommandsRequest","resumeApi","api","onResponse","error","cancel","catch","prev","setReplaying","waitForRender","protocol","strict","decoder","err","stream","pipeThrough","initialMessage","unstable_state","throttle","onError","markedDelivered","chunk","metadata","markDelivered","onFinish","onCancel","cmds","inTransit","reset","updateState","updater","inTransitCmds","queuedCmds","toolStatuses","setToolStatuses","pendingCommands","converted","converter","isRunning","messages","isLoading","adapters","unstable_enableToolInvocations","onNew","capabilities","edit","onEdit","onReload","onResume","onAddToolResult","toolOptions","toolCallId","result","toolName","isError","artifact","modelContent","onLoadExternalState","useAssistantTransportRuntime","runtimeHook","RuntimeHook","adapter","allowNesting"],"sources":["../../../../src/react/runtimes/assistant-transport/useAssistantTransportRuntime.ts"],"sourcesContent":["\"use client\";\n\nimport type { AppendMessage } from \"../../../types/message\";\nimport {\n type ReadonlyJSONObject,\n type ReadonlyJSONValue,\n asAsyncIterableStream,\n} from \"assistant-stream/utils\";\nimport { useExternalStoreRuntime } from \"../useExternalStoreRuntime\";\nimport type { AssistantRuntime } from \"../../../runtime/api/assistant-runtime\";\nimport type { AddToolResultOptions } from \"../../../runtime/interfaces/thread-runtime-core\";\nimport { useMemo, useRef, useState } from \"react\";\nimport {\n AssistantMessageAccumulator,\n DataStreamDecoder,\n AssistantTransportDecoder,\n unstable_createInitialMessage as createInitialMessage,\n toToolsJSONSchema,\n} from \"assistant-stream\";\nimport type {\n AssistantTransportOptions,\n AddMessageCommand,\n AddToolResultCommand,\n UserMessagePart,\n QueuedCommand,\n AssistantTransportCommand,\n SendCommandsRequestBody,\n} from \"./types\";\nimport { useCommandQueue } from \"./commandQueue\";\nimport {\n createReplayBoundaryStream,\n useReplayRenderWait,\n} from \"./replayBoundaryStream\";\nimport { useRunManager } from \"./runManager\";\nimport { useConvertedState } from \"./useConvertedState\";\nimport type { ToolExecutionStatus } from \"../../../runtimes/tool-invocations/ToolInvocationTracker\";\nimport { createRequestHeaders } from \"../../../runtimes/assistant-transport/utils\";\nimport { useRemoteThreadListRuntime } from \"../useRemoteThreadListRuntime\";\nimport { InMemoryThreadListAdapter } from \"../../../runtimes/remote-thread-list/adapter/in-memory\";\nimport { useAui, useAuiState } from \"@assistant-ui/store\";\nimport type { UserExternalState } from \"../../../types/augmentations\";\n\nconst convertAppendMessageToCommand = (\n message: AppendMessage,\n): AddMessageCommand | null => {\n if (message.role !== \"user\")\n throw new Error(\"Only user messages are supported\");\n\n const parts: UserMessagePart[] = [];\n const content = [\n ...message.content,\n ...(message.attachments?.flatMap((a) => a.content) ?? []),\n ];\n for (const contentPart of content) {\n if (contentPart.type === \"text\") {\n parts.push({ type: \"text\", text: contentPart.text });\n } else if (contentPart.type === \"image\") {\n parts.push({ type: \"image\", image: contentPart.image });\n }\n }\n\n if (parts.length === 0) return null;\n\n return {\n type: \"add-message\",\n message: {\n role: \"user\",\n parts,\n },\n parentId: message.parentId,\n sourceId: message.sourceId,\n };\n};\n\nconst readResumeState = async <T>(\n response: Response,\n): Promise<{ runId: string; state: T } | null> => {\n if (response.status === 204) return null;\n if (!response.ok) {\n throw new Error(\n `Resume state request failed with status ${response.status}: ${await response.text()}`,\n );\n }\n\n let value: unknown;\n try {\n value = await response.json();\n } catch {\n throw new Error(\"Resume state response was not valid JSON\");\n }\n\n if (\n typeof value !== \"object\" ||\n value === null ||\n !(\"state\" in value) ||\n !(\"runId\" in value) ||\n typeof value.runId !== \"string\"\n ) {\n throw new Error(\"Resume state response must contain state and runId\");\n }\n\n return { runId: value.runId, state: value.state as T };\n};\n\nconst symbolAssistantTransportExtras = Symbol(\"assistant-transport-extras\");\ntype AssistantTransportExtras = {\n [symbolAssistantTransportExtras]: true;\n sendCommand: (command: AssistantTransportCommand) => void;\n state: UserExternalState;\n};\n\nconst asAssistantTransportExtras = (\n extras: unknown,\n): AssistantTransportExtras => {\n if (\n typeof extras !== \"object\" ||\n extras == null ||\n !(symbolAssistantTransportExtras in extras)\n )\n throw new Error(\n \"This method can only be called when you are using useAssistantTransportRuntime\",\n );\n\n return extras as AssistantTransportExtras;\n};\n\nexport const useAssistantTransportSendCommand = () => {\n const aui = useAui();\n\n return (command: AssistantTransportCommand) => {\n const extras = aui.thread.getState().extras;\n const transportExtras = asAssistantTransportExtras(extras);\n transportExtras.sendCommand(command);\n };\n};\n\nexport function useAssistantTransportState(): UserExternalState;\nexport function useAssistantTransportState<T>(\n selector: (state: UserExternalState) => T,\n): T;\nexport function useAssistantTransportState<T>(\n selector: (state: UserExternalState) => T = (t) => t as T,\n): T | UserExternalState {\n return useAuiState((s) =>\n selector(asAssistantTransportExtras(s.thread.extras).state),\n );\n}\n\nconst useAssistantTransportThreadRuntime = <T>(\n options: AssistantTransportOptions<T>,\n): AssistantRuntime => {\n const agentStateRef = useRef(options.initialState);\n const [, rerender] = useState(0);\n const resumeFlagRef = useRef(false);\n const [isReplaying, setIsReplaying] = useState(false);\n const waitForReplayRender = useReplayRenderWait();\n const parentIdRef = useRef<string | null | undefined>(undefined);\n const commandQueue = useCommandQueue({\n onQueue: () => runManager.schedule(),\n });\n\n const enqueueAppendMessage = (message: AppendMessage) => {\n const command = convertAppendMessageToCommand(message);\n if (!command) {\n console.warn(\n \"[assistant-ui] Skipped add-message command with no supported parts\",\n );\n return;\n }\n parentIdRef.current = message.parentId;\n commandQueue.enqueue(command, {\n schedule: message.startRun ?? message.role === \"user\",\n });\n };\n\n const threadId = useAuiState((s) => s.threadListItem.remoteId);\n\n const runManager = useRunManager({\n onRun: async (signal: AbortSignal) => {\n const isResume = resumeFlagRef.current;\n resumeFlagRef.current = false;\n setIsReplaying(false);\n const commands: QueuedCommand[] = isResume ? [] : commandQueue.flush();\n if (commands.length === 0 && !isResume) return;\n\n // The flushed batch consumes the parentId; read it alongside the flush\n // (before any awaits) so a mid-run append keeps its own value. Resume\n // runs send no commands, so they neither send nor consume it.\n const parentId = isResume ? undefined : parentIdRef.current;\n if (!isResume) parentIdRef.current = undefined;\n\n const headers = await createRequestHeaders(options.headers);\n let resumeState: { runId: string; state: T } | undefined;\n if (isResume && options.resumeStateApi) {\n const resumeStateResponse = await fetch(options.resumeStateApi, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ threadId }),\n signal,\n });\n const retained = await readResumeState<T>(resumeStateResponse);\n if (retained === null) {\n if (commandQueue.state.queued.length > 0) {\n runManager.schedule();\n }\n return;\n }\n resumeState = retained;\n }\n\n const bodyValue =\n typeof options.body === \"function\"\n ? await options.body()\n : options.body;\n const context = runtime.thread.getModelContext();\n\n let requestBody: Record<string, unknown> = {\n commands,\n ...(resumeState === undefined && { state: agentStateRef.current }),\n system: context.system,\n tools: context.tools ? toToolsJSONSchema(context.tools) : undefined,\n threadId,\n ...(parentId !== undefined && {\n parentId,\n }),\n // nested (new format, aligned with AssistantChatTransport)\n callSettings: context.callSettings,\n config: context.config,\n // @deprecated spread at top level — use nested `callSettings`/`config` instead. Will be removed in a future version.\n ...context.callSettings,\n ...context.config,\n ...(bodyValue ?? {}),\n };\n\n if (options.prepareSendCommandsRequest) {\n requestBody = await options.prepareSendCommandsRequest(\n requestBody as SendCommandsRequestBody,\n );\n }\n\n if (resumeState !== undefined) {\n // The server replays a resume from the snapshot it retained for this\n // runId. Body overrides and prepare hooks can neither substitute a\n // state nor drop the ID the server validates against.\n requestBody = { ...requestBody, runId: resumeState.runId };\n delete requestBody[\"state\"];\n }\n\n const response = await fetch(\n isResume ? options.resumeApi! : options.api,\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(requestBody),\n signal,\n },\n );\n\n try {\n await options.onResponse?.(response);\n } catch (error) {\n void response.body?.cancel().catch(() => {});\n throw error;\n }\n\n if (!response.ok) {\n throw new Error(`Status ${response.status}: ${await response.text()}`);\n }\n\n if (!response.body) {\n throw new Error(\"Response body is null\");\n }\n\n if (resumeState !== undefined) {\n agentStateRef.current = resumeState.state;\n rerender((prev) => prev + 1);\n }\n\n const body = await createReplayBoundaryStream(response, {\n setReplaying: setIsReplaying,\n waitForRender: waitForReplayRender,\n });\n\n // Select decoder based on protocol option\n const protocol = options.protocol ?? \"data-stream\";\n // Resume replays a best-effort buffer; always reconcile leniently.\n const strict = isResume ? false : (options.strict ?? true);\n const decoder =\n protocol === \"assistant-transport\"\n ? new AssistantTransportDecoder({ strict })\n : new DataStreamDecoder({ strict });\n\n let err: string | undefined;\n const stream = body.pipeThrough(decoder).pipeThrough(\n new AssistantMessageAccumulator({\n initialMessage: createInitialMessage({\n unstable_state:\n (agentStateRef.current as ReadonlyJSONValue) ?? null,\n }),\n throttle: isResume,\n strict,\n onError: (error) => {\n err = error;\n },\n }),\n );\n\n let markedDelivered = false;\n\n for await (const chunk of asAsyncIterableStream(stream)) {\n if (chunk.metadata.unstable_state === agentStateRef.current) continue;\n\n if (!markedDelivered) {\n commandQueue.markDelivered();\n markedDelivered = true;\n }\n\n agentStateRef.current = chunk.metadata.unstable_state as T;\n rerender((prev) => prev + 1);\n }\n\n if (err) {\n throw new Error(err);\n }\n\n // A successful run confirms delivery even when no state-changing\n // chunk was observed.\n if (!markedDelivered) {\n commandQueue.markDelivered();\n }\n\n // commands that coalesced into this resume run must not starve\n if (isResume && commandQueue.state.queued.length > 0) {\n runManager.schedule();\n }\n },\n onFinish: options.onFinish,\n onCancel: () => {\n setIsReplaying(false);\n const cmds = [\n ...commandQueue.state.inTransit,\n ...commandQueue.state.queued,\n ];\n\n commandQueue.reset();\n\n options.onCancel?.({\n commands: cmds,\n updateState: (updater) => {\n agentStateRef.current = updater(agentStateRef.current);\n rerender((prev) => prev + 1);\n },\n });\n },\n onError: async (error) => {\n resumeFlagRef.current = false;\n setIsReplaying(false);\n const inTransitCmds = [...commandQueue.state.inTransit];\n const queuedCmds = [...commandQueue.state.queued];\n\n commandQueue.reset();\n\n try {\n await options.onError?.(error as Error, {\n commands: inTransitCmds,\n updateState: (updater) => {\n agentStateRef.current = updater(agentStateRef.current);\n rerender((prev) => prev + 1);\n },\n });\n } finally {\n options.onCancel?.({\n commands: queuedCmds,\n updateState: (updater) => {\n agentStateRef.current = updater(agentStateRef.current);\n rerender((prev) => prev + 1);\n },\n error: error as Error,\n });\n }\n },\n });\n\n // Tool execution status state\n const [toolStatuses, setToolStatuses] = useState<\n Record<string, ToolExecutionStatus>\n >({});\n\n // Reactive conversion of agent state + connection metadata → UI state\n const pendingCommands = useMemo(\n () => [...commandQueue.state.inTransit, ...commandQueue.state.queued],\n [commandQueue.state],\n );\n const converted = useConvertedState(\n options.converter,\n agentStateRef.current,\n pendingCommands,\n runManager.isRunning,\n toolStatuses,\n );\n\n // Create runtime\n const runtime = useExternalStoreRuntime({\n messages: converted.messages,\n state: converted.state,\n isRunning: converted.isRunning,\n isLoading: isReplaying,\n adapters: options.adapters,\n unstable_enableToolInvocations: true,\n setToolStatuses,\n extras: {\n [symbolAssistantTransportExtras]: true,\n sendCommand: (command: AssistantTransportCommand) => {\n commandQueue.enqueue(command);\n },\n state: agentStateRef.current as UserExternalState,\n } satisfies AssistantTransportExtras,\n onNew: async (message: AppendMessage): Promise<void> =>\n enqueueAppendMessage(message),\n ...(options.capabilities?.edit && {\n onEdit: async (message: AppendMessage): Promise<void> =>\n enqueueAppendMessage(message),\n }),\n ...(commandQueue.state.queued.length > 0 && {\n onReload: async (parentId: string | null) => {\n parentIdRef.current = parentId;\n runManager.schedule();\n },\n }),\n onCancel: async () => {\n resumeFlagRef.current = false;\n runManager.cancel();\n },\n onResume: async () => {\n if (!options.resumeApi)\n throw new Error(\"Must pass resumeApi to options to resume runs\");\n\n resumeFlagRef.current = true;\n runManager.schedule();\n },\n onAddToolResult: async (\n toolOptions: AddToolResultOptions,\n ): Promise<void> => {\n const command: AddToolResultCommand = {\n type: \"add-tool-result\",\n toolCallId: toolOptions.toolCallId,\n result: toolOptions.result as ReadonlyJSONObject,\n toolName: toolOptions.toolName,\n isError: toolOptions.isError,\n ...(toolOptions.artifact && { artifact: toolOptions.artifact }),\n ...(toolOptions.modelContent !== undefined && {\n modelContent: toolOptions.modelContent,\n }),\n };\n\n commandQueue.enqueue(command);\n },\n onLoadExternalState: async (state) => {\n agentStateRef.current = state as T;\n rerender((prev) => prev + 1);\n },\n });\n\n return runtime;\n};\n\n/**\n * @alpha This is an experimental API that is subject to change.\n */\nexport const useAssistantTransportRuntime = <T>(\n options: AssistantTransportOptions<T>,\n): AssistantRuntime => {\n const runtime = useRemoteThreadListRuntime({\n runtimeHook: function RuntimeHook() {\n return useAssistantTransportThreadRuntime(options);\n },\n adapter: new InMemoryThreadListAdapter(),\n allowNesting: true,\n });\n return runtime;\n};\n"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { ToolExecutionStatus } from "../../../runtimes/tool-invocations/ToolInvocationTracker.js";
2
+ import { AssistantTransportCommand, AssistantTransportState, AssistantTransportStateConverter } from "./types.js";
3
+ //#region src/react/runtimes/assistant-transport/useConvertedState.d.ts
4
+ declare function useConvertedState<T>(converter: AssistantTransportStateConverter<T>, agentState: T, pendingCommands: AssistantTransportCommand[], isSending: boolean, toolStatuses: Record<string, ToolExecutionStatus>): AssistantTransportState;
5
+ //#endregion
6
+ export { useConvertedState };
7
+ //# sourceMappingURL=useConvertedState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useConvertedState.d.ts","names":[],"sources":["../../../../src/react/runtimes/assistant-transport/useConvertedState.ts"],"mappings":";;;iBAQgB,kBAAkB,GAChC,WAAW,iCAAiC,IAC5C,YAAY,GACZ,iBAAiB,6BACjB,oBACA,cAAc,eAAe,uBAC5B"}
@@ -0,0 +1,25 @@
1
+ import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
2
+ import "@assistant-ui/tap/react-shim";
3
+ //#region src/react/runtimes/assistant-transport/useConvertedState.ts
4
+ function useConvertedState(converter, agentState, pendingCommands, isSending, toolStatuses) {
5
+ const $ = c(6);
6
+ let t0;
7
+ if ($[0] !== agentState || $[1] !== converter || $[2] !== isSending || $[3] !== pendingCommands || $[4] !== toolStatuses) {
8
+ t0 = converter(agentState, {
9
+ pendingCommands,
10
+ isSending,
11
+ toolStatuses
12
+ });
13
+ $[0] = agentState;
14
+ $[1] = converter;
15
+ $[2] = isSending;
16
+ $[3] = pendingCommands;
17
+ $[4] = toolStatuses;
18
+ $[5] = t0;
19
+ } else t0 = $[5];
20
+ return t0;
21
+ }
22
+ //#endregion
23
+ export { useConvertedState };
24
+
25
+ //# sourceMappingURL=useConvertedState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useConvertedState.js","names":["useMemo","AssistantTransportCommand","AssistantTransportState","AssistantTransportStateConverter","ToolExecutionStatus","useConvertedState","converter","agentState","pendingCommands","isSending","toolStatuses","$","_c","t0"],"sources":["../../../../src/react/runtimes/assistant-transport/useConvertedState.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport type {\n AssistantTransportCommand,\n AssistantTransportState,\n AssistantTransportStateConverter,\n} from \"./types\";\nimport type { ToolExecutionStatus } from \"../../../runtimes/tool-invocations/ToolInvocationTracker\";\n\nexport function useConvertedState<T>(\n converter: AssistantTransportStateConverter<T>,\n agentState: T,\n pendingCommands: AssistantTransportCommand[],\n isSending: boolean,\n toolStatuses: Record<string, ToolExecutionStatus>,\n): AssistantTransportState {\n return useMemo(\n () => converter(agentState, { pendingCommands, isSending, toolStatuses }),\n [converter, agentState, pendingCommands, isSending, toolStatuses],\n );\n}\n"],"mappings":";;;AAQA,SAAOK,kBAAAC,WAAAC,YAAAC,iBAAAC,WAAAC,cAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAA,IAAAC;CAAA,IAAAF,EAAA,OAAAJ,cAAAI,EAAA,OAAAL,aAAAK,EAAA,OAAAF,aAAAE,EAAA,OAAAH,mBAAAG,EAAA,OAAAD,cAAA;EAQGG,KAAAP,UAAUC,YAAY;GAAAC;GAAAC;GAAAC;EAA2C,CAAC;EAACC,EAAA,KAAAJ;EAAAI,EAAA,KAAAL;EAAAK,EAAA,KAAAF;EAAAE,EAAA,KAAAH;EAAAG,EAAA,KAAAD;EAAAC,EAAA,KAAAE;CAAA,OAAAA,KAAAF,EAAA;CAAA,OAAnEE;AAAmE"}
@@ -0,0 +1,7 @@
1
+ //#region src/react/runtimes/assistant-transport/useLatestRef.d.ts
2
+ declare function useLatestRef<T>(value: T): {
3
+ current: T;
4
+ };
5
+ //#endregion
6
+ export { useLatestRef };
7
+ //# sourceMappingURL=useLatestRef.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLatestRef.d.ts","names":[],"sources":["../../../../src/react/runtimes/assistant-transport/useLatestRef.ts"],"mappings":";iBAEgB,aAAa,GAAG,OAAO;EAKrB,SAAS"}
@@ -0,0 +1,27 @@
1
+ import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
2
+ import { useEffect, useRef } from "@assistant-ui/tap/react-shim";
3
+ //#region src/react/runtimes/assistant-transport/useLatestRef.ts
4
+ function useLatestRef(value) {
5
+ const $ = c(3);
6
+ const ref = useRef(value);
7
+ let t0;
8
+ let t1;
9
+ if ($[0] !== value) {
10
+ t0 = () => {
11
+ ref.current = value;
12
+ };
13
+ t1 = [value];
14
+ $[0] = value;
15
+ $[1] = t0;
16
+ $[2] = t1;
17
+ } else {
18
+ t0 = $[1];
19
+ t1 = $[2];
20
+ }
21
+ useEffect(t0, t1);
22
+ return ref;
23
+ }
24
+ //#endregion
25
+ export { useLatestRef };
26
+
27
+ //# sourceMappingURL=useLatestRef.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLatestRef.js","names":["useEffect","useRef","useLatestRef","value","$","_c","ref","t0","t1","current","T"],"sources":["../../../../src/react/runtimes/assistant-transport/useLatestRef.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\n\nexport function useLatestRef<T>(value: T) {\n const ref = useRef(value);\n useEffect(() => {\n ref.current = value;\n }, [value]);\n return ref as { current: T };\n}\n"],"mappings":";;;AAEA,SAAOE,aAAAC,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CACL,MAAAC,MAAYL,OAAOE,KAAK;CAAE,IAAAI;CAAA,IAAAC;CAAA,IAAAJ,EAAA,OAAAD,OAAA;EAChBI,WAAA;GACRD,IAAGG,UAAWN;EAAH;EACVK,KAAA,CAACL,KAAK;EAACC,EAAA,KAAAD;EAAAC,EAAA,KAAAG;EAAAH,EAAA,KAAAI;CAAA,OAAA;EAAAD,KAAAH,EAAA;EAAAI,KAAAJ,EAAA;CAAA;CAFVJ,UAAUO,IAEPC,EAAO;CAAC,OACJF;AAAqB"}
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantCloudThreadHistoryAdapter.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts"],"mappings":";;;;KAgPK;EACH;EACA;EACA;EACA;EACA;;KAoDG;EACH;EACA;EACA;EACA;EACA,aAAa;EACb;EACA;;KAmBG;EACH;EACA,YAAY;EACZ;EACA;EACA;EACA;EACA;EACA;EACA,WAAW;EACX,QAAQ;EACR;;iBAiCc,aAAa,GAAG,SAAS,IAAI;iBA+b7B,sCACd,UAAU,UAAU,kBACnB"}
1
+ {"version":3,"file":"AssistantCloudThreadHistoryAdapter.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts"],"mappings":";;;;KA8RK;EACH;EACA;EACA;EACA;EACA;;KAoDG;EACH;EACA;EACA;EACA;EACA,aAAa;EACb;EACA;;KAmBG;EACH;EACA,YAAY;EACZ;EACA;EACA;EACA;EACA;EACA;EACA,WAAW;EACX,QAAQ;EACR;;iBAiCc,aAAa,GAAG,SAAS,IAAI;iBA+b7B,sCACd,UAAU,UAAU,kBACnB"}
@@ -14,35 +14,61 @@ var AssistantCloudThreadHistoryAdapter = class {
14
14
  get aui() {
15
15
  return this.getAui();
16
16
  }
17
- get _persistence() {
18
- const key = getClientId(this.aui.threadListItem);
17
+ getPersistence(threadListItem = this.aui.threadListItem) {
18
+ const key = getClientId(threadListItem);
19
19
  if (!globalPersistence.has(key)) globalPersistence.set(key, new CloudMessagePersistence(() => this.cloudRef.current));
20
20
  return globalPersistence.get(key);
21
21
  }
22
+ get _persistence() {
23
+ return this.getPersistence();
24
+ }
25
+ tryGetKeyedThreadListItem() {
26
+ const live = this.aui.threadListItem;
27
+ if (!live.source) return void 0;
28
+ const id = live.getState().id;
29
+ if (id === void 0) return void 0;
30
+ return this.aui.threads.item({ id });
31
+ }
22
32
  withFormat(formatAdapter) {
23
33
  const adapter = this;
24
- const formatted = createFormattedPersistence(this._persistence, formatAdapter);
34
+ let threadListItem;
35
+ const pinCurrent = () => {
36
+ const next = adapter.tryGetKeyedThreadListItem();
37
+ if (next) threadListItem = next;
38
+ return threadListItem;
39
+ };
40
+ const resolvePinned = () => threadListItem ?? pinCurrent();
41
+ const getFormatted = () => createFormattedPersistence(adapter._persistence, formatAdapter);
42
+ const getTargetFormatted = (item) => createFormattedPersistence(adapter.getPersistence(item), formatAdapter);
25
43
  return {
44
+ pin() {
45
+ pinCurrent();
46
+ },
26
47
  async append(item) {
27
- const { remoteId } = await adapter.aui.threadListItem.initialize();
28
- await formatted.append(remoteId, item);
48
+ const pinned = resolvePinned();
49
+ if (!pinned) throw new Error("Cannot persist cloud history without a thread list item.");
50
+ const remoteId = pinned.getState().remoteId ?? (await pinned.initialize()).remoteId;
51
+ await getTargetFormatted(pinned).append(remoteId, item);
29
52
  },
30
53
  async update(item, localMessageId) {
31
- const remoteId = adapter.aui.threadListItem.getState().remoteId;
32
- if (!remoteId) return;
33
- await formatted.update?.(remoteId, item, localMessageId);
54
+ const pinned = resolvePinned();
55
+ const remoteId = pinned?.getState().remoteId;
56
+ if (!remoteId || !pinned) return;
57
+ await getTargetFormatted(pinned).update?.(remoteId, item, localMessageId);
34
58
  },
35
59
  async delete() {
36
60
  throw new Error("Assistant Cloud does not support deleting thread messages yet.");
37
61
  },
38
62
  reportTelemetry(items, options) {
39
63
  const encodedRunMessages = items.map((item) => formatAdapter.encode(item));
40
- adapter._reportRunTelemetry(formatAdapter.format, encodedRunMessages, options);
64
+ adapter._reportRunTelemetry(formatAdapter.format, encodedRunMessages, options, resolvePinned());
41
65
  },
42
66
  async load() {
43
- const remoteId = adapter.aui.threadListItem.getState().remoteId;
67
+ pinCurrent();
68
+ const live = adapter.aui.threadListItem;
69
+ const remoteId = live.source ? live.getState().remoteId : void 0;
44
70
  if (!remoteId) return { messages: [] };
45
- return formatted.load(remoteId);
71
+ return getFormatted().load(remoteId);
46
72
  }
47
73
  };
48
74
  }
@@ -69,9 +95,9 @@ var AssistantCloudThreadHistoryAdapter = class {
69
95
  if (!remoteId) return { messages: [] };
70
96
  return { messages: (await this._persistence.load(remoteId, "aui/v0")).filter((m) => m.format === "aui/v0").map(auiV0Decode).reverse() };
71
97
  }
72
- _reportRunTelemetry(format, runMessages, options) {
98
+ _reportRunTelemetry(format, runMessages, options, threadListItem) {
73
99
  if (!this.cloudRef.current.telemetry.enabled) return;
74
- const remoteId = this.aui.threadListItem.getState().remoteId;
100
+ const remoteId = (threadListItem ?? this.aui.threadListItem).getState().remoteId;
75
101
  if (!remoteId) return;
76
102
  const extracted = extractRunTelemetry(format, runMessages);
77
103
  if (!extracted) return;