@assistant-ui/core 0.3.13 → 0.3.15

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 (463) 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 +38 -15
  8. package/dist/adapters/voice.js.map +1 -1
  9. package/dist/index.d.ts +2 -2
  10. package/dist/index.js +1 -1
  11. package/dist/index.js.map +1 -1
  12. package/dist/internal.d.ts +3 -2
  13. package/dist/internal.js +8 -7
  14. package/dist/model-context/frame/host.d.ts +1 -1
  15. package/dist/model-context/frame/host.d.ts.map +1 -1
  16. package/dist/model-context/frame/host.js +19 -4
  17. package/dist/model-context/frame/host.js.map +1 -1
  18. package/dist/model-context/frame/provider.d.ts +4 -0
  19. package/dist/model-context/frame/provider.d.ts.map +1 -1
  20. package/dist/model-context/frame/provider.js +50 -3
  21. package/dist/model-context/frame/provider.js.map +1 -1
  22. package/dist/model-context/frame/types.d.ts +4 -1
  23. package/dist/model-context/frame/types.d.ts.map +1 -1
  24. package/dist/model-context/frame/types.js.map +1 -1
  25. package/dist/model-context/registry.d.ts.map +1 -1
  26. package/dist/model-context/registry.js +16 -4
  27. package/dist/model-context/registry.js.map +1 -1
  28. package/dist/react/RuntimeAdapter.d.ts +8 -1
  29. package/dist/react/RuntimeAdapter.d.ts.map +1 -1
  30. package/dist/react/RuntimeAdapter.js +23 -18
  31. package/dist/react/RuntimeAdapter.js.map +1 -1
  32. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
  33. package/dist/react/adapters/LocalStorageThreadListAdapter.js +28 -12
  34. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  35. package/dist/react/client/AdaptedRemoteThread.d.ts +11 -0
  36. package/dist/react/client/AdaptedRemoteThread.d.ts.map +1 -0
  37. package/dist/react/client/AdaptedRemoteThread.js +27 -0
  38. package/dist/react/client/AdaptedRemoteThread.js.map +1 -0
  39. package/dist/react/client/InMemoryThreadList.d.ts +19 -0
  40. package/dist/react/client/InMemoryThreadList.d.ts.map +1 -0
  41. package/dist/react/client/InMemoryThreadList.js +418 -0
  42. package/dist/react/client/InMemoryThreadList.js.map +1 -0
  43. package/dist/react/client/Interactables.d.ts.map +1 -1
  44. package/dist/react/client/Interactables.js +159 -102
  45. package/dist/react/client/Interactables.js.map +1 -1
  46. package/dist/react/client/RemoteThreadList.d.ts +34 -0
  47. package/dist/react/client/RemoteThreadList.d.ts.map +1 -0
  48. package/dist/react/client/RemoteThreadList.js +898 -0
  49. package/dist/react/client/RemoteThreadList.js.map +1 -0
  50. package/dist/react/client/Tools.d.ts.map +1 -1
  51. package/dist/react/client/Tools.js +38 -27
  52. package/dist/react/client/Tools.js.map +1 -1
  53. package/dist/react/index.d.ts +7 -2
  54. package/dist/react/index.js +5 -2
  55. package/dist/react/interactables-legacy/Interactables.d.ts.map +1 -1
  56. package/dist/react/interactables-legacy/Interactables.js +145 -110
  57. package/dist/react/interactables-legacy/Interactables.js.map +1 -1
  58. package/dist/react/primitive-hooks/useActionBarCopy.d.ts.map +1 -1
  59. package/dist/react/primitive-hooks/useActionBarCopy.js +20 -19
  60. package/dist/react/primitive-hooks/useActionBarCopy.js.map +1 -1
  61. package/dist/react/primitive-hooks/useActionBarEdit.d.ts.map +1 -1
  62. package/dist/react/primitive-hooks/useActionBarEdit.js +2 -4
  63. package/dist/react/primitive-hooks/useActionBarEdit.js.map +1 -1
  64. package/dist/react/primitive-hooks/useActionBarReload.d.ts.map +1 -1
  65. package/dist/react/primitive-hooks/useActionBarReload.js +2 -4
  66. package/dist/react/primitive-hooks/useActionBarReload.js.map +1 -1
  67. package/dist/react/primitive-hooks/useBranchPickerNext.d.ts.map +1 -1
  68. package/dist/react/primitive-hooks/useBranchPickerNext.js +2 -6
  69. package/dist/react/primitive-hooks/useBranchPickerNext.js.map +1 -1
  70. package/dist/react/primitive-hooks/useBranchPickerPrevious.d.ts.map +1 -1
  71. package/dist/react/primitive-hooks/useBranchPickerPrevious.js +2 -6
  72. package/dist/react/primitive-hooks/useBranchPickerPrevious.js.map +1 -1
  73. package/dist/react/primitive-hooks/useComposerCancel.d.ts.map +1 -1
  74. package/dist/react/primitive-hooks/useComposerCancel.js +2 -4
  75. package/dist/react/primitive-hooks/useComposerCancel.js.map +1 -1
  76. package/dist/react/primitive-hooks/useComposerSend.d.ts.map +1 -1
  77. package/dist/react/primitive-hooks/useComposerSend.js +2 -4
  78. package/dist/react/primitive-hooks/useComposerSend.js.map +1 -1
  79. package/dist/react/primitive-hooks/useSuggestionTrigger.d.ts.map +1 -1
  80. package/dist/react/primitive-hooks/useSuggestionTrigger.js +6 -2
  81. package/dist/react/primitive-hooks/useSuggestionTrigger.js.map +1 -1
  82. package/dist/react/primitive-hooks/useThreadIsEmpty.d.ts +3 -0
  83. package/dist/react/primitive-hooks/useThreadIsEmpty.d.ts.map +1 -1
  84. package/dist/react/primitive-hooks/useThreadIsEmpty.js +3 -0
  85. package/dist/react/primitive-hooks/useThreadIsEmpty.js.map +1 -1
  86. package/dist/react/primitive-hooks/useThreadIsRunning.d.ts +3 -0
  87. package/dist/react/primitive-hooks/useThreadIsRunning.d.ts.map +1 -1
  88. package/dist/react/primitive-hooks/useThreadIsRunning.js +3 -0
  89. package/dist/react/primitive-hooks/useThreadIsRunning.js.map +1 -1
  90. package/dist/react/primitives/message/MessageParts.d.ts +13 -0
  91. package/dist/react/primitives/message/MessageParts.d.ts.map +1 -1
  92. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  93. package/dist/react/primitives/thread/ThreadMessages.d.ts.map +1 -1
  94. package/dist/react/primitives/thread/ThreadMessages.js +1 -1
  95. package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
  96. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +24 -10
  97. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  98. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +115 -71
  99. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  100. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +14 -2
  101. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  102. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +232 -63
  103. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  104. package/dist/react/runtimes/RemoteThreadResource.d.ts +30 -0
  105. package/dist/react/runtimes/RemoteThreadResource.d.ts.map +1 -0
  106. package/dist/react/runtimes/RemoteThreadResource.js +136 -0
  107. package/dist/react/runtimes/RemoteThreadResource.js.map +1 -0
  108. package/dist/react/runtimes/RuntimeAdapterProvider.d.ts +3 -10
  109. package/dist/react/runtimes/RuntimeAdapterProvider.d.ts.map +1 -1
  110. package/dist/react/runtimes/RuntimeAdapterProvider.js +3 -6
  111. package/dist/react/runtimes/RuntimeAdapterProvider.js.map +1 -1
  112. package/dist/react/runtimes/assistant-transport/commandQueue.d.ts +17 -0
  113. package/dist/react/runtimes/assistant-transport/commandQueue.d.ts.map +1 -0
  114. package/dist/react/runtimes/assistant-transport/commandQueue.js +55 -0
  115. package/dist/react/runtimes/assistant-transport/commandQueue.js.map +1 -0
  116. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.d.ts +11 -0
  117. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.d.ts.map +1 -0
  118. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.js +165 -0
  119. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.js.map +1 -0
  120. package/dist/react/runtimes/assistant-transport/runManager.d.ts +15 -0
  121. package/dist/react/runtimes/assistant-transport/runManager.d.ts.map +1 -0
  122. package/dist/react/runtimes/assistant-transport/runManager.js +86 -0
  123. package/dist/react/runtimes/assistant-transport/runManager.js.map +1 -0
  124. package/dist/react/runtimes/assistant-transport/types.d.ts +130 -0
  125. package/dist/react/runtimes/assistant-transport/types.d.ts.map +1 -0
  126. package/dist/react/runtimes/assistant-transport/types.js +0 -0
  127. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts +14 -0
  128. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts.map +1 -0
  129. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.js +296 -0
  130. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.js.map +1 -0
  131. package/dist/react/runtimes/assistant-transport/useConvertedState.d.ts +7 -0
  132. package/dist/react/runtimes/assistant-transport/useConvertedState.d.ts.map +1 -0
  133. package/dist/react/runtimes/assistant-transport/useConvertedState.js +25 -0
  134. package/dist/react/runtimes/assistant-transport/useConvertedState.js.map +1 -0
  135. package/dist/react/runtimes/assistant-transport/useLatestRef.d.ts +7 -0
  136. package/dist/react/runtimes/assistant-transport/useLatestRef.d.ts.map +1 -0
  137. package/dist/react/runtimes/assistant-transport/useLatestRef.js +27 -0
  138. package/dist/react/runtimes/assistant-transport/useLatestRef.js.map +1 -0
  139. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  140. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +39 -13
  141. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  142. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts +2 -1
  143. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts.map +1 -1
  144. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js +3 -3
  145. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js.map +1 -1
  146. package/dist/react/runtimes/cloud/auiV0.d.ts +4 -0
  147. package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
  148. package/dist/react/runtimes/cloud/auiV0.js +7 -0
  149. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  150. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
  151. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +60 -17
  152. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  153. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.d.ts +16 -0
  154. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.d.ts.map +1 -0
  155. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.js +36 -0
  156. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.js.map +1 -0
  157. package/dist/react/runtimes/external-message-converter.js +14 -14
  158. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  159. package/dist/react/runtimes/useExternalStoreRuntime.d.ts.map +1 -1
  160. package/dist/react/runtimes/useExternalStoreRuntime.js +44 -28
  161. package/dist/react/runtimes/useExternalStoreRuntime.js.map +1 -1
  162. package/dist/react/runtimes/useExternalStoreSharedOptions.js.map +1 -1
  163. package/dist/react/runtimes/useLocalRuntime.js +1 -1
  164. package/dist/react/runtimes/useRuntimeAdapters.d.ts +9 -0
  165. package/dist/react/runtimes/useRuntimeAdapters.d.ts.map +1 -0
  166. package/dist/react/runtimes/useRuntimeAdapters.js +20 -0
  167. package/dist/react/runtimes/useRuntimeAdapters.js.map +1 -0
  168. package/dist/runtime/api/composer-runtime.d.ts +5 -0
  169. package/dist/runtime/api/composer-runtime.d.ts.map +1 -1
  170. package/dist/runtime/api/composer-runtime.js.map +1 -1
  171. package/dist/runtime/api/message-runtime.js +1 -1
  172. package/dist/runtime/api/thread-list-runtime.d.ts +1 -0
  173. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  174. package/dist/runtime/api/thread-list-runtime.js +4 -2
  175. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  176. package/dist/runtime/api/thread-runtime.d.ts +12 -2
  177. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  178. package/dist/runtime/api/thread-runtime.js +8 -2
  179. package/dist/runtime/api/thread-runtime.js.map +1 -1
  180. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  181. package/dist/runtime/base/base-composer-runtime-core.js +8 -7
  182. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  183. package/dist/runtime/base/base-thread-runtime-core.d.ts +1 -0
  184. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  185. package/dist/runtime/base/base-thread-runtime-core.js +3 -3
  186. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  187. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +0 -1
  188. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
  189. package/dist/runtime/base/default-thread-composer-runtime-core.js +10 -4
  190. package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
  191. package/dist/runtime/interfaces/thread-runtime-core.d.ts +6 -0
  192. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  193. package/dist/runtime/internal.js +5 -5
  194. package/dist/runtime/queue/message-queue.d.ts.map +1 -1
  195. package/dist/runtime/queue/message-queue.js +2 -1
  196. package/dist/runtime/queue/message-queue.js.map +1 -1
  197. package/dist/runtime/utils/message-repository.d.ts.map +1 -1
  198. package/dist/runtime/utils/message-repository.js +27 -18
  199. package/dist/runtime/utils/message-repository.js.map +1 -1
  200. package/dist/runtime/utils/thread-runtime-lifecycle.d.ts +8 -0
  201. package/dist/runtime/utils/thread-runtime-lifecycle.d.ts.map +1 -0
  202. package/dist/runtime/utils/thread-runtime-lifecycle.js +11 -0
  203. package/dist/runtime/utils/thread-runtime-lifecycle.js.map +1 -0
  204. package/dist/runtimes/external-store/external-store-shared-options.js.map +1 -1
  205. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  206. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +4 -1
  207. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  208. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +8 -0
  209. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  210. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +37 -13
  211. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  212. package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts +102 -0
  213. package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts.map +1 -0
  214. package/dist/runtimes/inert/InertThreadRuntimeCore.js +156 -0
  215. package/dist/runtimes/inert/InertThreadRuntimeCore.js.map +1 -0
  216. package/dist/runtimes/internal.d.ts +1 -1
  217. package/dist/runtimes/local/local-thread-runtime-core.d.ts +3 -0
  218. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  219. package/dist/runtimes/local/local-thread-runtime-core.js +78 -19
  220. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  221. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +12 -59
  222. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
  223. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js +10 -142
  224. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js.map +1 -1
  225. package/dist/runtimes/remote-thread-list/adapter-changed.d.ts +9 -0
  226. package/dist/runtimes/remote-thread-list/adapter-changed.d.ts.map +1 -0
  227. package/dist/runtimes/remote-thread-list/adapter-changed.js +13 -0
  228. package/dist/runtimes/remote-thread-list/adapter-changed.js.map +1 -0
  229. package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts.map +1 -1
  230. package/dist/runtimes/remote-thread-list/empty-thread-core.js +16 -152
  231. package/dist/runtimes/remote-thread-list/empty-thread-core.js.map +1 -1
  232. package/dist/runtimes/remote-thread-list/optimistic-state.d.ts +2 -0
  233. package/dist/runtimes/remote-thread-list/optimistic-state.d.ts.map +1 -1
  234. package/dist/runtimes/remote-thread-list/optimistic-state.js +11 -0
  235. package/dist/runtimes/remote-thread-list/optimistic-state.js.map +1 -1
  236. package/dist/runtimes/remote-thread-list/types.d.ts +32 -1
  237. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  238. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts +1 -12
  239. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
  240. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +67 -38
  241. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  242. package/dist/store/clients/external-thread.js +1 -1
  243. package/dist/store/clients/external-thread.js.map +1 -1
  244. package/dist/store/clients/suggestions.js +2 -2
  245. package/dist/store/clients/suggestions.js.map +1 -1
  246. package/dist/store/clients/thread-selection-events.d.ts +10 -0
  247. package/dist/store/clients/thread-selection-events.d.ts.map +1 -0
  248. package/dist/store/clients/thread-selection-events.js +40 -0
  249. package/dist/store/clients/thread-selection-events.js.map +1 -0
  250. package/dist/store/env.d.ts +5 -0
  251. package/dist/store/env.d.ts.map +1 -0
  252. package/dist/store/env.js +12 -0
  253. package/dist/store/env.js.map +1 -0
  254. package/dist/store/index.d.ts +5 -3
  255. package/dist/store/index.js +4 -2
  256. package/dist/store/internal.d.ts +4 -1
  257. package/dist/store/internal.js +4 -1
  258. package/dist/store/primitive-predicates.d.ts +19 -0
  259. package/dist/store/primitive-predicates.d.ts.map +1 -0
  260. package/dist/store/primitive-predicates.js +19 -0
  261. package/dist/store/primitive-predicates.js.map +1 -0
  262. package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -1
  263. package/dist/store/runtime-clients/attachment-runtime-client.js +18 -11
  264. package/dist/store/runtime-clients/attachment-runtime-client.js.map +1 -1
  265. package/dist/store/runtime-clients/handle-runtime-action.d.ts +5 -0
  266. package/dist/store/runtime-clients/handle-runtime-action.d.ts.map +1 -0
  267. package/dist/store/runtime-clients/handle-runtime-action.js +14 -0
  268. package/dist/store/runtime-clients/handle-runtime-action.js.map +1 -0
  269. package/dist/store/runtime-clients/handle-thread-list-action.d.ts +5 -0
  270. package/dist/store/runtime-clients/handle-thread-list-action.d.ts.map +1 -0
  271. package/dist/store/runtime-clients/handle-thread-list-action.js +7 -0
  272. package/dist/store/runtime-clients/handle-thread-list-action.js.map +1 -0
  273. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  274. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +62 -29
  275. package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
  276. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  277. package/dist/store/runtime-clients/thread-list-runtime-client.js +5 -6
  278. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  279. package/dist/store/scopes/composer.d.ts +9 -4
  280. package/dist/store/scopes/composer.d.ts.map +1 -1
  281. package/dist/store/scopes/thread-list-item.d.ts +7 -6
  282. package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
  283. package/dist/store/scopes/thread.d.ts +8 -7
  284. package/dist/store/scopes/thread.d.ts.map +1 -1
  285. package/dist/store/scopes/threads.d.ts +17 -1
  286. package/dist/store/scopes/threads.d.ts.map +1 -1
  287. package/dist/subscribable/subscribable.d.ts +2 -1
  288. package/dist/subscribable/subscribable.d.ts.map +1 -1
  289. package/dist/subscribable/subscribable.js +23 -18
  290. package/dist/subscribable/subscribable.js.map +1 -1
  291. package/dist/types/message.d.ts +1 -1
  292. package/dist/types/message.js.map +1 -1
  293. package/dist/utils/composite-context-provider.d.ts +1 -0
  294. package/dist/utils/composite-context-provider.d.ts.map +1 -1
  295. package/dist/utils/composite-context-provider.js +25 -9
  296. package/dist/utils/composite-context-provider.js.map +1 -1
  297. package/dist/utils/notify-event-listeners.d.ts +2 -2
  298. package/dist/utils/notify-event-listeners.d.ts.map +1 -1
  299. package/dist/utils/notify-event-listeners.js +2 -2
  300. package/dist/utils/notify-event-listeners.js.map +1 -1
  301. package/dist/utils/silent-runtime-action.d.ts +6 -0
  302. package/dist/utils/silent-runtime-action.d.ts.map +1 -0
  303. package/dist/utils/silent-runtime-action.js +7 -0
  304. package/dist/utils/silent-runtime-action.js.map +1 -0
  305. package/package.json +8 -8
  306. package/src/adapters/speech.test.ts +118 -1
  307. package/src/adapters/speech.ts +21 -22
  308. package/src/adapters/thread-history.ts +2 -0
  309. package/src/adapters/voice.test.ts +134 -0
  310. package/src/adapters/voice.ts +35 -27
  311. package/src/index.ts +1 -0
  312. package/src/internal.ts +1 -0
  313. package/src/model-context/frame/host.test.ts +87 -5
  314. package/src/model-context/frame/host.ts +18 -4
  315. package/src/model-context/frame/provider.test.ts +347 -20
  316. package/src/model-context/frame/provider.ts +58 -2
  317. package/src/model-context/frame/types.ts +5 -0
  318. package/src/model-context/registry.test.ts +131 -0
  319. package/src/model-context/registry.ts +16 -6
  320. package/src/react/RuntimeAdapter.test.ts +2 -0
  321. package/src/react/RuntimeAdapter.ts +20 -8
  322. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +34 -17
  323. package/src/react/client/AdaptedRemoteThread.ts +41 -0
  324. package/src/react/client/InMemoryThreadList.test.tsx +148 -0
  325. package/src/react/client/InMemoryThreadList.ts +290 -0
  326. package/src/react/client/Interactables.test.ts +326 -2
  327. package/src/react/client/Interactables.ts +227 -110
  328. package/src/react/client/RemoteThreadList.test.ts +1222 -0
  329. package/src/react/client/RemoteThreadList.ts +1136 -0
  330. package/src/react/client/Tools.ts +36 -29
  331. package/src/react/index.ts +13 -0
  332. package/src/react/interactables-legacy/Interactables.test.ts +317 -0
  333. package/src/react/interactables-legacy/Interactables.ts +204 -128
  334. package/src/react/primitive-hooks/useActionBarCopy.test.ts +15 -0
  335. package/src/react/primitive-hooks/useActionBarCopy.ts +15 -10
  336. package/src/react/primitive-hooks/useActionBarEdit.ts +2 -1
  337. package/src/react/primitive-hooks/useActionBarReload.ts +2 -6
  338. package/src/react/primitive-hooks/useBranchPickerNext.ts +2 -7
  339. package/src/react/primitive-hooks/useBranchPickerPrevious.ts +2 -7
  340. package/src/react/primitive-hooks/useComposerCancel.ts +2 -1
  341. package/src/react/primitive-hooks/useComposerSend.ts +2 -5
  342. package/src/react/primitive-hooks/useSuggestionTrigger.test.ts +11 -0
  343. package/src/react/primitive-hooks/useSuggestionTrigger.ts +4 -5
  344. package/src/react/primitive-hooks/useThreadIsEmpty.ts +3 -0
  345. package/src/react/primitive-hooks/useThreadIsRunning.ts +3 -0
  346. package/src/react/primitives/message/MessageParts.tsx +0 -1
  347. package/src/react/primitives/thread/ThreadMessages.tsx +2 -1
  348. package/src/react/runtimes/RemoteThreadListHookInstanceManager.retry.test.tsx +116 -0
  349. package/src/react/runtimes/RemoteThreadListHookInstanceManager.running.test.tsx +1 -1
  350. package/src/react/runtimes/RemoteThreadListHookInstanceManager.test.tsx +57 -6
  351. package/src/react/runtimes/RemoteThreadListHookInstanceManager.title.test.tsx +272 -0
  352. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +171 -124
  353. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.republish.test.ts +87 -0
  354. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +327 -83
  355. package/src/react/runtimes/RemoteThreadResource.test.ts +141 -0
  356. package/src/react/runtimes/RemoteThreadResource.ts +233 -0
  357. package/src/react/runtimes/RuntimeAdapterProvider.tsx +8 -20
  358. package/src/react/runtimes/assistant-transport/commandQueue.ts +68 -0
  359. package/src/react/runtimes/assistant-transport/replayBoundaryStream.test.ts +455 -0
  360. package/src/react/runtimes/assistant-transport/replayBoundaryStream.ts +172 -0
  361. package/src/react/runtimes/assistant-transport/runManager.ts +124 -0
  362. package/src/react/runtimes/assistant-transport/transport-delivery.test.tsx +79 -0
  363. package/src/react/runtimes/assistant-transport/transport-parentid.test.tsx +97 -0
  364. package/src/react/runtimes/assistant-transport/transport-scheduling.test.ts +414 -0
  365. package/src/react/runtimes/assistant-transport/types.ts +170 -0
  366. package/src/react/runtimes/assistant-transport/useAssistantTransport.spec.md +141 -0
  367. package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.test.tsx +683 -0
  368. package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.ts +483 -0
  369. package/src/react/runtimes/assistant-transport/useConvertedState.ts +20 -0
  370. package/src/react/runtimes/assistant-transport/useLatestRef.ts +9 -0
  371. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +131 -6
  372. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +61 -15
  373. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts +6 -4
  374. package/src/react/runtimes/cloud/auiV0.ts +17 -1
  375. package/src/react/runtimes/cloud/useCloudThreadListAdapter.test.tsx +98 -3
  376. package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +104 -27
  377. package/src/react/runtimes/cloud/useCloudThreadListRuntime.test.tsx +56 -0
  378. package/src/react/runtimes/cloud/useCloudThreadListRuntime.ts +31 -0
  379. package/src/react/runtimes/external-message-converter.test.ts +143 -0
  380. package/src/react/runtimes/external-message-converter.ts +41 -41
  381. package/src/react/runtimes/remote-thread-hook-on-tap.test.ts +58 -0
  382. package/src/react/runtimes/useExternalStoreRuntime.lifecycle.test.tsx +83 -0
  383. package/src/react/runtimes/useExternalStoreRuntime.suggestions.test.tsx +13 -3
  384. package/src/react/runtimes/useExternalStoreRuntime.ts +7 -0
  385. package/src/react/runtimes/useExternalStoreSharedOptions.ts +3 -1
  386. package/src/react/runtimes/useLocalRuntime.test.tsx +134 -8
  387. package/src/react/runtimes/useRuntimeAdapters.test.tsx +62 -0
  388. package/src/react/runtimes/useRuntimeAdapters.ts +28 -0
  389. package/src/runtime/api/composer-runtime.ts +5 -0
  390. package/src/runtime/api/thread-list-runtime.ts +3 -1
  391. package/src/runtime/api/thread-runtime.ts +20 -2
  392. package/src/runtime/base/base-composer-runtime-core.ts +6 -5
  393. package/src/runtime/base/base-thread-runtime-core.test.ts +191 -0
  394. package/src/runtime/base/base-thread-runtime-core.ts +11 -2
  395. package/src/runtime/base/default-thread-composer-runtime-core.ts +12 -4
  396. package/src/runtime/interfaces/thread-runtime-core.ts +6 -0
  397. package/src/runtime/queue/message-queue.ts +2 -1
  398. package/src/runtime/utils/message-repository.ts +26 -18
  399. package/src/runtime/utils/thread-runtime-lifecycle.ts +18 -0
  400. package/src/runtimes/external-store/external-store-shared-options.ts +3 -1
  401. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +4 -1
  402. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +103 -34
  403. package/src/runtimes/inert/InertThreadRuntimeCore.test.ts +253 -0
  404. package/src/runtimes/inert/InertThreadRuntimeCore.ts +232 -0
  405. package/src/runtimes/local/local-thread-runtime-core.test.ts +692 -4
  406. package/src/runtimes/local/local-thread-runtime-core.ts +117 -22
  407. package/src/runtimes/readonly/ReadonlyThreadRuntimeCore.ts +17 -205
  408. package/src/runtimes/remote-thread-list/adapter-changed.ts +10 -0
  409. package/src/runtimes/remote-thread-list/empty-thread-core.ts +28 -217
  410. package/src/runtimes/remote-thread-list/optimistic-state.test.ts +18 -0
  411. package/src/runtimes/remote-thread-list/optimistic-state.ts +13 -0
  412. package/src/runtimes/remote-thread-list/types.ts +34 -0
  413. package/src/runtimes/tool-invocations/EDGE_CASES.md +17 -6
  414. package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +243 -0
  415. package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +127 -61
  416. package/src/store/clients/external-thread.ts +1 -1
  417. package/src/store/clients/model-context-client.test.ts +16 -8
  418. package/src/store/clients/suggestions.ts +2 -2
  419. package/src/store/clients/thread-selection-events.ts +21 -0
  420. package/src/store/env.ts +11 -0
  421. package/src/store/index.ts +14 -1
  422. package/src/store/internal.ts +13 -0
  423. package/src/store/primitive-predicates.test.ts +184 -0
  424. package/src/store/primitive-predicates.ts +43 -0
  425. package/src/store/runtime-clients/attachment-runtime-client.test.ts +41 -0
  426. package/src/store/runtime-clients/attachment-runtime-client.ts +2 -1
  427. package/src/store/runtime-clients/handle-runtime-action.test.ts +40 -0
  428. package/src/store/runtime-clients/handle-runtime-action.ts +14 -0
  429. package/src/store/runtime-clients/handle-thread-list-action.test.ts +69 -0
  430. package/src/store/runtime-clients/handle-thread-list-action.ts +6 -0
  431. package/src/store/runtime-clients/thread-list-item-runtime-client.ts +15 -7
  432. package/src/store/runtime-clients/thread-list-runtime-client.ts +9 -6
  433. package/src/store/scopes/composer.ts +9 -4
  434. package/src/store/scopes/thread-list-item.ts +7 -6
  435. package/src/store/scopes/thread.ts +8 -7
  436. package/src/store/scopes/threads.ts +14 -0
  437. package/src/subscribable/subscribable.test.ts +77 -1
  438. package/src/subscribable/subscribable.ts +38 -23
  439. package/src/tests/MessageRepository.test.ts +48 -0
  440. package/src/tests/RemoteThreadListThreadListRuntimeCore-errors.test.ts +2 -2
  441. package/src/tests/RemoteThreadListThreadListRuntimeCore-loadMore.test.ts +8 -6
  442. package/src/tests/RemoteThreadListThreadListRuntimeCore-switchToThread-unarchive.test.ts +25 -0
  443. package/src/tests/auiV0Encode.test.ts +66 -0
  444. package/src/tests/base-composer-runtime-core-send.test.ts +30 -0
  445. package/src/tests/base-composer-runtime-core.test.ts +28 -0
  446. package/src/tests/composer-can-cancel.test.ts +101 -0
  447. package/src/tests/empty-thread-core.test.ts +6 -0
  448. package/src/tests/external-store-thread-list-runtime-core.test.ts +101 -0
  449. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +211 -1
  450. package/src/tests/external-store-thread-runtime-core.test.ts +124 -0
  451. package/src/tests/external-thread-isEmpty.test.tsx +100 -0
  452. package/src/tests/interactables-toolui-migration.test.tsx +66 -0
  453. package/src/tests/message-queue.test.ts +28 -0
  454. package/src/tests/remote-thread-list-adapter-switch.test.ts +383 -0
  455. package/src/tests/session-reset-notification.test.ts +145 -0
  456. package/src/tests/thread-switch-events.test.tsx +99 -1
  457. package/src/tests/tools-scope-migration.test.tsx +58 -0
  458. package/src/tests/useRemoteThreadListRuntime-controlled.test.tsx +67 -0
  459. package/src/types/message.ts +1 -1
  460. package/src/utils/composite-context-provider.test.ts +139 -0
  461. package/src/utils/composite-context-provider.ts +26 -8
  462. package/src/utils/notify-event-listeners.ts +10 -5
  463. package/src/utils/silent-runtime-action.ts +6 -0
@@ -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 !== void 0 && { 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 !== undefined && {\n artifact: toolOptions.artifact,\n }),\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;