@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,17 @@
1
+ import { AssistantTransportCommand, CommandQueueState, QueuedCommand } from "./types.js";
2
+ //#region src/react/runtimes/assistant-transport/commandQueue.d.ts
3
+ declare const createInitialQueueState: () => CommandQueueState;
4
+ declare const useCommandQueue: (opts: {
5
+ onQueue: () => void;
6
+ }) => {
7
+ readonly state: CommandQueueState;
8
+ enqueue: (command: AssistantTransportCommand, options?: {
9
+ schedule?: boolean;
10
+ }) => void;
11
+ flush: () => QueuedCommand[];
12
+ markDelivered: () => void;
13
+ reset: () => void;
14
+ };
15
+ //#endregion
16
+ export { createInitialQueueState, useCommandQueue };
17
+ //# sourceMappingURL=commandQueue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commandQueue.d.ts","names":[],"sources":["../../../../src/react/runtimes/assistant-transport/commandQueue.ts"],"mappings":";;cAOa,+BAA8B;cAK9B,kBAAmB;EAAQ;;;EAU3B,UAAA,SAAA,2BAAyB;IACtB;;EAWI,aAAA"}
@@ -0,0 +1,55 @@
1
+ import { useCallback, useEffect, useRef, useState } from "@assistant-ui/tap/react-shim";
2
+ //#region src/react/runtimes/assistant-transport/commandQueue.ts
3
+ const createInitialQueueState = () => ({
4
+ queued: [],
5
+ inTransit: []
6
+ });
7
+ const useCommandQueue = (opts) => {
8
+ const onQueueRef = useRef(opts.onQueue);
9
+ useEffect(() => {
10
+ onQueueRef.current = opts.onQueue;
11
+ });
12
+ const [, rerender] = useState(0);
13
+ const queueStateRef = useRef(createInitialQueueState());
14
+ const enqueue = (command, options) => {
15
+ queueStateRef.current = {
16
+ queued: [...queueStateRef.current.queued, command],
17
+ inTransit: queueStateRef.current.inTransit
18
+ };
19
+ rerender((prev) => prev + 1);
20
+ if (options?.schedule !== false) onQueueRef.current();
21
+ };
22
+ const flush = () => {
23
+ if (queueStateRef.current.queued.length === 0) return [];
24
+ const queued = queueStateRef.current.queued;
25
+ queueStateRef.current = {
26
+ queued: [],
27
+ inTransit: [...queueStateRef.current.inTransit, ...queued]
28
+ };
29
+ rerender((prev_0) => prev_0 + 1);
30
+ return queued;
31
+ };
32
+ const markDelivered = () => {
33
+ queueStateRef.current = {
34
+ ...queueStateRef.current,
35
+ inTransit: []
36
+ };
37
+ rerender((prev_1) => prev_1 + 1);
38
+ };
39
+ return {
40
+ get state() {
41
+ return queueStateRef.current;
42
+ },
43
+ enqueue,
44
+ flush,
45
+ markDelivered,
46
+ reset: useCallback(() => {
47
+ queueStateRef.current = createInitialQueueState();
48
+ rerender((prev_2) => prev_2 + 1);
49
+ }, [])
50
+ };
51
+ };
52
+ //#endregion
53
+ export { createInitialQueueState, useCommandQueue };
54
+
55
+ //# sourceMappingURL=commandQueue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commandQueue.js","names":["useState","useCallback","useRef","useEffect","AssistantTransportCommand","CommandQueueState","QueuedCommand","createInitialQueueState","queued","inTransit","useCommandQueue","opts","onQueue","onQueueRef","current","rerender","queueStateRef","enqueue","command","options","schedule","prev","flush","length","markDelivered","reset","state"],"sources":["../../../../src/react/runtimes/assistant-transport/commandQueue.ts"],"sourcesContent":["import { useState, useCallback, useRef, useEffect } from \"react\";\nimport type {\n AssistantTransportCommand,\n CommandQueueState,\n QueuedCommand,\n} from \"./types\";\n\nexport const createInitialQueueState = (): CommandQueueState => ({\n queued: [],\n inTransit: [],\n});\n\nexport const useCommandQueue = (opts: { onQueue: () => void }) => {\n const onQueueRef = useRef(opts.onQueue);\n useEffect(() => {\n onQueueRef.current = opts.onQueue;\n });\n\n const [, rerender] = useState(0);\n const queueStateRef = useRef<CommandQueueState>(createInitialQueueState());\n\n const enqueue = (\n command: AssistantTransportCommand,\n options?: { schedule?: boolean },\n ) => {\n queueStateRef.current = {\n queued: [...queueStateRef.current.queued, command],\n inTransit: queueStateRef.current.inTransit,\n };\n rerender((prev) => prev + 1);\n\n if (options?.schedule !== false) onQueueRef.current();\n };\n\n const flush = (): QueuedCommand[] => {\n if (queueStateRef.current.queued.length === 0) return [];\n\n const queued = queueStateRef.current.queued;\n queueStateRef.current = {\n queued: [],\n inTransit: [...queueStateRef.current.inTransit, ...queued],\n };\n rerender((prev) => prev + 1);\n\n return queued;\n };\n\n const markDelivered = () => {\n queueStateRef.current = { ...queueStateRef.current, inTransit: [] };\n rerender((prev) => prev + 1);\n };\n\n const reset = useCallback(() => {\n queueStateRef.current = createInitialQueueState();\n rerender((prev) => prev + 1);\n }, []);\n\n return {\n // live getter — callbacks firing between renders must not see a stale snapshot\n get state() {\n return queueStateRef.current;\n },\n enqueue,\n flush,\n markDelivered,\n reset,\n };\n};\n"],"mappings":";;AAOA,MAAaO,iCAAoD;CAC/DC,QAAQ,CAAA;CACRC,WAAW,CAAA;AACb;AAEA,MAAaC,mBAAmBC,SAAkC;CAChE,MAAME,aAAaX,OAAOS,KAAKC,OAAO;CACtCT,gBAAgB;EACdU,WAAWC,UAAUH,KAAKC;CAC5B,CAAC;CAED,MAAM,GAAGG,YAAYf,SAAS,CAAC;CAC/B,MAAMgB,gBAAgBd,OAA0BK,wBAAwB,CAAC;CAEzE,MAAMU,WACJC,SACAC,YACG;EACHH,cAAcF,UAAU;GACtBN,QAAQ,CAAC,GAAGQ,cAAcF,QAAQN,QAAQU,OAAO;GACjDT,WAAWO,cAAcF,QAAQL;EACnC;EACAM,UAAUM,SAASA,OAAO,CAAC;EAE3B,IAAIF,SAASC,aAAa,OAAOP,WAAWC,QAAQ;CACtD;CAEA,MAAMQ,cAA+B;EACnC,IAAIN,cAAcF,QAAQN,OAAOe,WAAW,GAAG,OAAO,CAAA;EAEtD,MAAMf,SAASQ,cAAcF,QAAQN;EACrCQ,cAAcF,UAAU;GACtBN,QAAQ,CAAA;GACRC,WAAW,CAAC,GAAGO,cAAcF,QAAQL,WAAW,GAAGD,MAAM;EAC3D;EACAO,UAAUM,WAASA,SAAO,CAAC;EAE3B,OAAOb;CACT;CAEA,MAAMgB,sBAAsB;EAC1BR,cAAcF,UAAU;GAAE,GAAGE,cAAcF;GAASL,WAAW,CAAA;EAAG;EAClEM,UAAUM,WAASA,SAAO,CAAC;CAC7B;CAOA,OAAO;EAEL,IAAIK,QAAQ;GACV,OAAOV,cAAcF;EACvB;EACAG;EACAK;EACAE;EACAC,OAbYxB,kBAAkB;GAC9Be,cAAcF,UAAUP,wBAAwB;GAChDQ,UAAUM,WAASA,SAAO,CAAC;EAC7B,GAAG,CAAA,CAUDI;CACF;AACF"}
@@ -0,0 +1,11 @@
1
+ //#region src/react/runtimes/assistant-transport/replayBoundaryStream.d.ts
2
+ declare const REPLAY_CONTENT_LENGTH_HEADER = "Aui-Replay-Content-Length";
3
+ type ReplayBoundaryStreamOptions = {
4
+ setReplaying: (value: boolean) => void;
5
+ waitForRender: () => Promise<void>;
6
+ };
7
+ declare const useReplayRenderWait: () => () => Promise<void>;
8
+ declare const createReplayBoundaryStream: (response: Response, { setReplaying, waitForRender: waitForReplayRender }: ReplayBoundaryStreamOptions) => Promise<ReadableStream<Uint8Array>>;
9
+ //#endregion
10
+ export { REPLAY_CONTENT_LENGTH_HEADER, createReplayBoundaryStream, useReplayRenderWait };
11
+ //# sourceMappingURL=replayBoundaryStream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replayBoundaryStream.d.ts","names":[],"sources":["../../../../src/react/runtimes/assistant-transport/replayBoundaryStream.ts"],"mappings":";cAIa;KAER;EACH,eAAe;EACf,qBAAqB;;cAGV,iCAAmB;cA6DnB,6BACX,UAAU,YACV,cAAA,eAAA,uBAGG,gCACF,QAAQ,eAAe"}
@@ -0,0 +1,165 @@
1
+ "use client";
2
+ import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
3
+ import { useEffect, useRef, useState } from "@assistant-ui/tap/react-shim";
4
+ //#region src/react/runtimes/assistant-transport/replayBoundaryStream.ts
5
+ const REPLAY_CONTENT_LENGTH_HEADER = "Aui-Replay-Content-Length";
6
+ const useReplayRenderWait = () => {
7
+ const $ = c(8);
8
+ const [renderTicket, setRenderTicket] = useState(0);
9
+ const mountedRef = useRef(true);
10
+ const nextTicketRef = useRef(0);
11
+ let t0;
12
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
13
+ t0 = [];
14
+ $[0] = t0;
15
+ } else t0 = $[0];
16
+ const waitersRef = useRef(t0);
17
+ let t1;
18
+ if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
19
+ t1 = (committedTicket) => {
20
+ const pendingWaiters = [];
21
+ for (const waiter of waitersRef.current) if (committedTicket === void 0 || waiter.ticket <= committedTicket) waiter.resolve();
22
+ else pendingWaiters.push(waiter);
23
+ waitersRef.current = pendingWaiters;
24
+ };
25
+ $[1] = t1;
26
+ } else t1 = $[1];
27
+ const resolveWaiters = t1;
28
+ let t2;
29
+ let t3;
30
+ if ($[2] !== renderTicket) {
31
+ t2 = () => {
32
+ mountedRef.current = true;
33
+ resolveWaiters(renderTicket);
34
+ };
35
+ t3 = [renderTicket, resolveWaiters];
36
+ $[2] = renderTicket;
37
+ $[3] = t2;
38
+ $[4] = t3;
39
+ } else {
40
+ t2 = $[3];
41
+ t3 = $[4];
42
+ }
43
+ useEffect(t2, t3);
44
+ let t4;
45
+ let t5;
46
+ if ($[5] === Symbol.for("react.memo_cache_sentinel")) {
47
+ t4 = () => () => {
48
+ mountedRef.current = false;
49
+ resolveWaiters();
50
+ };
51
+ t5 = [resolveWaiters];
52
+ $[5] = t4;
53
+ $[6] = t5;
54
+ } else {
55
+ t4 = $[5];
56
+ t5 = $[6];
57
+ }
58
+ useEffect(t4, t5);
59
+ let t6;
60
+ if ($[7] === Symbol.for("react.memo_cache_sentinel")) {
61
+ t6 = () => new Promise((resolve) => {
62
+ setTimeout(() => {
63
+ if (!mountedRef.current) {
64
+ resolve();
65
+ return;
66
+ }
67
+ const ticket = nextTicketRef.current + 1;
68
+ nextTicketRef.current = ticket;
69
+ waitersRef.current.push({
70
+ ticket,
71
+ resolve
72
+ });
73
+ setRenderTicket(ticket);
74
+ }, 0);
75
+ });
76
+ $[7] = t6;
77
+ } else t6 = $[7];
78
+ return t6;
79
+ };
80
+ const parseReplayContentLength = (headers) => {
81
+ const raw = headers.get(REPLAY_CONTENT_LENGTH_HEADER);
82
+ if (raw == null) return 0;
83
+ const boundary = Number(raw);
84
+ return Number.isSafeInteger(boundary) && boundary > 0 ? boundary : 0;
85
+ };
86
+ const createReplayBoundaryStream = async (response, { setReplaying, waitForRender: waitForReplayRender }) => {
87
+ const body = response.body;
88
+ const replayContentLength = parseReplayContentLength(response.headers);
89
+ if (replayContentLength <= 0) return body;
90
+ setReplaying(true);
91
+ await waitForReplayRender();
92
+ const reader = body.getReader();
93
+ let bytesForwarded = 0;
94
+ let replayFinished = false;
95
+ let readerCleanup;
96
+ const releaseReader = () => {
97
+ if (readerCleanup) return readerCleanup;
98
+ reader.releaseLock();
99
+ readerCleanup = Promise.resolve();
100
+ return readerCleanup;
101
+ };
102
+ const cancelReader = (reason) => {
103
+ if (readerCleanup) return readerCleanup;
104
+ readerCleanup = (async () => {
105
+ try {
106
+ await reader.cancel(reason);
107
+ } finally {
108
+ reader.releaseLock();
109
+ }
110
+ })();
111
+ return readerCleanup;
112
+ };
113
+ const finishReplay = async () => {
114
+ if (replayFinished) return;
115
+ replayFinished = true;
116
+ await waitForReplayRender();
117
+ setReplaying(false);
118
+ await waitForReplayRender();
119
+ };
120
+ return new ReadableStream({
121
+ async pull(controller) {
122
+ try {
123
+ const { done, value } = await reader.read();
124
+ if (done) {
125
+ await releaseReader();
126
+ await finishReplay();
127
+ controller.close();
128
+ return;
129
+ }
130
+ if (replayFinished) {
131
+ controller.enqueue(value);
132
+ return;
133
+ }
134
+ const nextBytesForwarded = bytesForwarded + value.byteLength;
135
+ if (nextBytesForwarded < replayContentLength) {
136
+ bytesForwarded = nextBytesForwarded;
137
+ controller.enqueue(value);
138
+ return;
139
+ }
140
+ if (nextBytesForwarded === replayContentLength) {
141
+ controller.enqueue(value);
142
+ await finishReplay();
143
+ return;
144
+ }
145
+ const replayBytesInChunk = replayContentLength - bytesForwarded;
146
+ controller.enqueue(value.subarray(0, replayBytesInChunk));
147
+ await finishReplay();
148
+ controller.enqueue(value.subarray(replayBytesInChunk));
149
+ } catch (error) {
150
+ await cancelReader(error).catch(() => {});
151
+ throw error;
152
+ }
153
+ },
154
+ async cancel(reason) {
155
+ const wasFinished = replayFinished;
156
+ replayFinished = true;
157
+ if (!wasFinished) setReplaying(false);
158
+ await cancelReader(reason);
159
+ }
160
+ });
161
+ };
162
+ //#endregion
163
+ export { REPLAY_CONTENT_LENGTH_HEADER, createReplayBoundaryStream, useReplayRenderWait };
164
+
165
+ //# sourceMappingURL=replayBoundaryStream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replayBoundaryStream.js","names":["c","_c","useCallback","useEffect","useRef","useState","REPLAY_CONTENT_LENGTH_HEADER","ReplayBoundaryStreamOptions","setReplaying","value","waitForRender","Promise","useReplayRenderWait","$","renderTicket","setRenderTicket","mountedRef","nextTicketRef","t0","Symbol","for","waitersRef","t1","committedTicket","pendingWaiters","waiter","current","undefined","ticket","resolve","push","resolveWaiters","t2","t3","t4","t5","t6","setTimeout","parseReplayContentLength","headers","Headers","raw","get","boundary","Number","isSafeInteger","createReplayBoundaryStream","response","Response","waitForReplayRender","ReadableStream","Uint8Array","body","replayContentLength","reader","getReader","bytesForwarded","replayFinished","readerCleanup","releaseReader","releaseLock","cancelReader","reason","cancel","finishReplay","pull","controller","done","read","close","enqueue","nextBytesForwarded","byteLength","replayBytesInChunk","subarray","error","catch","wasFinished"],"sources":["../../../../src/react/runtimes/assistant-transport/replayBoundaryStream.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport const REPLAY_CONTENT_LENGTH_HEADER = \"Aui-Replay-Content-Length\";\n\ntype ReplayBoundaryStreamOptions = {\n setReplaying: (value: boolean) => void;\n waitForRender: () => Promise<void>;\n};\n\nexport const useReplayRenderWait = () => {\n const [renderTicket, setRenderTicket] = useState(0);\n const mountedRef = useRef(true);\n const nextTicketRef = useRef(0);\n const waitersRef = useRef<Array<{ ticket: number; resolve: () => void }>>([]);\n\n const resolveWaiters = useCallback((committedTicket?: number) => {\n const pendingWaiters = [];\n\n for (const waiter of waitersRef.current) {\n if (committedTicket === undefined || waiter.ticket <= committedTicket) {\n waiter.resolve();\n } else {\n pendingWaiters.push(waiter);\n }\n }\n\n waitersRef.current = pendingWaiters;\n }, []);\n\n useEffect(() => {\n mountedRef.current = true;\n resolveWaiters(renderTicket);\n }, [renderTicket, resolveWaiters]);\n\n useEffect(\n () => () => {\n mountedRef.current = false;\n resolveWaiters();\n },\n [resolveWaiters],\n );\n\n return useCallback(\n () =>\n new Promise<void>((resolve) => {\n setTimeout(() => {\n if (!mountedRef.current) {\n resolve();\n return;\n }\n\n const ticket = nextTicketRef.current + 1;\n nextTicketRef.current = ticket;\n waitersRef.current.push({ ticket, resolve });\n setRenderTicket(ticket);\n }, 0);\n }),\n [],\n );\n};\n\nconst parseReplayContentLength = (headers: Headers): number => {\n const raw = headers.get(REPLAY_CONTENT_LENGTH_HEADER);\n if (raw == null) return 0;\n\n const boundary = Number(raw);\n return Number.isSafeInteger(boundary) && boundary > 0 ? boundary : 0;\n};\n\n// Gates replay bytes until isReplaying:true renders, then releases live bytes after isReplaying:false renders.\nexport const createReplayBoundaryStream = async (\n response: Response,\n {\n setReplaying,\n waitForRender: waitForReplayRender,\n }: ReplayBoundaryStreamOptions,\n): Promise<ReadableStream<Uint8Array>> => {\n const body = response.body as ReadableStream<Uint8Array>;\n const replayContentLength = parseReplayContentLength(response.headers);\n\n if (replayContentLength <= 0) {\n return body;\n }\n\n setReplaying(true);\n await waitForReplayRender();\n\n const reader = body.getReader();\n let bytesForwarded = 0;\n let replayFinished = false;\n let readerCleanup: Promise<void> | undefined;\n\n const releaseReader = () => {\n if (readerCleanup) return readerCleanup;\n reader.releaseLock();\n readerCleanup = Promise.resolve();\n return readerCleanup;\n };\n\n const cancelReader = (reason?: unknown) => {\n if (readerCleanup) return readerCleanup;\n readerCleanup = (async () => {\n try {\n await reader.cancel(reason);\n } finally {\n reader.releaseLock();\n }\n })();\n return readerCleanup;\n };\n\n const finishReplay = async () => {\n if (replayFinished) return;\n replayFinished = true;\n\n // Let replay bytes drain before rendering live mode, then render live mode before releasing live bytes.\n await waitForReplayRender();\n setReplaying(false);\n await waitForReplayRender();\n };\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const { done, value } = await reader.read();\n\n if (done) {\n await releaseReader();\n await finishReplay();\n controller.close();\n return;\n }\n\n if (replayFinished) {\n controller.enqueue(value);\n return;\n }\n\n const nextBytesForwarded = bytesForwarded + value.byteLength;\n\n if (nextBytesForwarded < replayContentLength) {\n bytesForwarded = nextBytesForwarded;\n controller.enqueue(value);\n return;\n }\n\n if (nextBytesForwarded === replayContentLength) {\n controller.enqueue(value);\n await finishReplay();\n return;\n }\n\n const replayBytesInChunk = replayContentLength - bytesForwarded;\n\n controller.enqueue(value.subarray(0, replayBytesInChunk));\n await finishReplay();\n controller.enqueue(value.subarray(replayBytesInChunk));\n } catch (error) {\n await cancelReader(error).catch(() => {});\n throw error;\n }\n },\n async cancel(reason) {\n const wasFinished = replayFinished;\n replayFinished = true;\n if (!wasFinished) setReplaying(false);\n await cancelReader(reason);\n },\n });\n};\n"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ //#region src/react/runtimes/assistant-transport/runManager.d.ts
2
+ type RunManager = Readonly<{
3
+ isRunning: boolean;
4
+ schedule: () => void;
5
+ cancel: () => void;
6
+ }>;
7
+ declare function useRunManager(config: {
8
+ onRun: (signal: AbortSignal) => Promise<void>;
9
+ onFinish?: (() => void) | undefined;
10
+ onCancel?: (() => void) | undefined;
11
+ onError?: ((error: Error) => void | Promise<void>) | undefined;
12
+ }): RunManager;
13
+ //#endregion
14
+ export { RunManager, useRunManager };
15
+ //# sourceMappingURL=runManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runManager.d.ts","names":[],"sources":["../../../../src/react/runtimes/assistant-transport/runManager.ts"],"mappings":";KAGY,aAAa;EACvB;EACA;EACA;;iBA2Bc,cAAc;EAC5B,QAAQ,QAAQ,gBAAgB;EAChC;EACA;EACA,YAAY,OAAO,iBAAiB;IAClC"}
@@ -0,0 +1,86 @@
1
+ import { useLatestRef } from "./useLatestRef.js";
2
+ import { useCallback, useEffect, useRef, useState } from "@assistant-ui/tap/react-shim";
3
+ //#region src/react/runtimes/assistant-transport/runManager.ts
4
+ const disposeReason = Symbol("assistant-transport-dispose");
5
+ const reportCallbackError = (name, error) => {
6
+ console.error(`[assistant-ui] Assistant transport ${name} callback threw an error`, error);
7
+ };
8
+ const invokeCallback = async (name, callback) => {
9
+ try {
10
+ await callback?.();
11
+ } catch (error) {
12
+ try {
13
+ reportCallbackError(name, error);
14
+ } catch {}
15
+ }
16
+ };
17
+ function useRunManager(config) {
18
+ const [isRunning, setIsRunning] = useState(false);
19
+ const stateRef = useRef({
20
+ pending: false,
21
+ disposed: false,
22
+ abortController: null
23
+ });
24
+ const onRunRef = useLatestRef(config.onRun);
25
+ const onFinishRef = useLatestRef(config.onFinish);
26
+ const onCancelRef = useLatestRef(config.onCancel);
27
+ const onErrorRef = useLatestRef(config.onError);
28
+ const startRun = useCallback(() => {
29
+ setIsRunning(true);
30
+ stateRef.current.pending = false;
31
+ const ac = new AbortController();
32
+ stateRef.current.abortController = ac;
33
+ const disposeAborted = () => ac.signal.reason === disposeReason;
34
+ queueMicrotask(async () => {
35
+ try {
36
+ if (!disposeAborted()) await onRunRef.current(ac.signal);
37
+ } catch (error) {
38
+ if (!disposeAborted() && !stateRef.current.disposed) {
39
+ stateRef.current.pending = false;
40
+ if (ac.signal.aborted) invokeCallback("onCancel", onCancelRef.current);
41
+ else await invokeCallback("onError", () => onErrorRef.current?.(error));
42
+ }
43
+ } finally {
44
+ if (!disposeAborted() && !stateRef.current.disposed) invokeCallback("onFinish", onFinishRef.current);
45
+ if (!stateRef.current.disposed && stateRef.current.pending) startRun();
46
+ else {
47
+ setIsRunning(false);
48
+ if (stateRef.current.abortController === ac) stateRef.current.abortController = null;
49
+ }
50
+ }
51
+ });
52
+ }, [
53
+ onRunRef,
54
+ onFinishRef,
55
+ onErrorRef,
56
+ onCancelRef
57
+ ]);
58
+ const schedule = useCallback(() => {
59
+ if (stateRef.current.disposed) return;
60
+ if (stateRef.current.abortController) {
61
+ stateRef.current.pending = true;
62
+ return;
63
+ }
64
+ startRun();
65
+ }, [startRun]);
66
+ useEffect(() => {
67
+ stateRef.current.disposed = false;
68
+ return () => {
69
+ stateRef.current.disposed = true;
70
+ stateRef.current.pending = false;
71
+ stateRef.current.abortController?.abort(disposeReason);
72
+ };
73
+ }, []);
74
+ return {
75
+ isRunning,
76
+ schedule,
77
+ cancel: useCallback(() => {
78
+ stateRef.current.pending = false;
79
+ stateRef.current.abortController?.abort();
80
+ }, [])
81
+ };
82
+ }
83
+ //#endregion
84
+ export { useRunManager };
85
+
86
+ //# sourceMappingURL=runManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runManager.js","names":["useCallback","useEffect","useRef","useState","useLatestRef","RunManager","Readonly","isRunning","schedule","cancel","disposeReason","Symbol","LifecycleCallbackName","reportCallbackError","name","error","console","invokeCallback","callback","Promise","useRunManager","config","onRun","signal","AbortSignal","onFinish","onCancel","onError","Error","setIsRunning","stateRef","pending","disposed","abortController","AbortController","onRunRef","onFinishRef","onCancelRef","onErrorRef","startRun","current","ac","disposeAborted","reason","queueMicrotask","aborted","abort"],"sources":["../../../../src/react/runtimes/assistant-transport/runManager.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useLatestRef } from \"./useLatestRef\";\n\nexport type RunManager = Readonly<{\n isRunning: boolean;\n schedule: () => void;\n cancel: () => void;\n}>;\n\nconst disposeReason = Symbol(\"assistant-transport-dispose\");\n\ntype LifecycleCallbackName = \"onCancel\" | \"onError\" | \"onFinish\";\n\nconst reportCallbackError = (name: LifecycleCallbackName, error: unknown) => {\n console.error(\n `[assistant-ui] Assistant transport ${name} callback threw an error`,\n error,\n );\n};\n\nconst invokeCallback = async (\n name: LifecycleCallbackName,\n callback: (() => unknown) | undefined,\n): Promise<void> => {\n try {\n await callback?.();\n } catch (error) {\n try {\n reportCallbackError(name, error);\n } catch {}\n }\n};\n\nexport function useRunManager(config: {\n onRun: (signal: AbortSignal) => Promise<void>;\n onFinish?: (() => void) | undefined;\n onCancel?: (() => void) | undefined;\n onError?: ((error: Error) => void | Promise<void>) | undefined;\n}): RunManager {\n const [isRunning, setIsRunning] = useState(false);\n const stateRef = useRef({\n pending: false,\n disposed: false,\n abortController: null as AbortController | null,\n });\n const onRunRef = useLatestRef(config.onRun);\n const onFinishRef = useLatestRef(config.onFinish);\n const onCancelRef = useLatestRef(config.onCancel);\n const onErrorRef = useLatestRef(config.onError);\n\n const startRun = useCallback(() => {\n setIsRunning(true);\n stateRef.current.pending = false;\n const ac = new AbortController();\n stateRef.current.abortController = ac;\n\n // The dispose marker rides on the abort reason so a settling run detects\n // its own disposal even after an effect cycle re-arms the manager.\n const disposeAborted = () => ac.signal.reason === disposeReason;\n\n queueMicrotask(async () => {\n try {\n if (!disposeAborted()) {\n await onRunRef.current(ac.signal);\n }\n } catch (error) {\n if (!disposeAborted() && !stateRef.current.disposed) {\n stateRef.current.pending = false;\n if (ac.signal.aborted) {\n void invokeCallback(\"onCancel\", onCancelRef.current);\n } else {\n await invokeCallback(\"onError\", () =>\n onErrorRef.current?.(error as Error),\n );\n }\n }\n } finally {\n if (!disposeAborted() && !stateRef.current.disposed) {\n void invokeCallback(\"onFinish\", onFinishRef.current);\n }\n if (!stateRef.current.disposed && stateRef.current.pending) {\n startRun();\n } else {\n setIsRunning(false);\n if (stateRef.current.abortController === ac) {\n stateRef.current.abortController = null;\n }\n }\n }\n });\n }, [onRunRef, onFinishRef, onErrorRef, onCancelRef]);\n\n const schedule = useCallback(() => {\n if (stateRef.current.disposed) return;\n if (stateRef.current.abortController) {\n // Coalesce multiple schedules while running into a single follow-up run.\n stateRef.current.pending = true;\n return;\n }\n startRun();\n }, [startRun]);\n\n // Strict-mode effects run setup / cleanup / setup on the same instance;\n // arming on setup undoes the cleanup's dispose.\n useEffect(() => {\n stateRef.current.disposed = false;\n return () => {\n stateRef.current.disposed = true;\n stateRef.current.pending = false;\n stateRef.current.abortController?.abort(disposeReason);\n };\n }, []);\n\n const cancel = useCallback(() => {\n stateRef.current.pending = false;\n stateRef.current.abortController?.abort();\n }, []);\n\n return {\n isRunning,\n schedule,\n cancel,\n };\n}\n"],"mappings":";;;AASA,MAAMU,gBAAgBC,OAAO,6BAA6B;AAI1D,MAAME,uBAAuBC,MAA6BC,UAAmB;CAC3EC,QAAQD,MACN,sCAAsCD,KAAI,2BAC1CC,KACF;AACF;AAEA,MAAME,iBAAiB,OACrBH,MACAI,aACkB;CAClB,IAAI;EACF,MAAMA,WAAW;CACnB,SAASH,OAAO;EACd,IAAI;GACFF,oBAAoBC,MAAMC,KAAK;EACjC,QAAQ,CAAC;CACX;AACF;AAEA,SAAgBK,cAAcC,QAKf;CACb,MAAM,CAACd,WAAWsB,gBAAgB1B,SAAS,KAAK;CAChD,MAAM2B,WAAW5B,OAAO;EACtB6B,SAAS;EACTC,UAAU;EACVC,iBAAiB;CACnB,CAAC;CACD,MAAME,WAAW/B,aAAaiB,OAAOC,KAAK;CAC1C,MAAMc,cAAchC,aAAaiB,OAAOI,QAAQ;CAChD,MAAMY,cAAcjC,aAAaiB,OAAOK,QAAQ;CAChD,MAAMY,aAAalC,aAAaiB,OAAOM,OAAO;CAE9C,MAAMY,WAAWvC,kBAAkB;EACjC6B,aAAa,IAAI;EACjBC,SAASU,QAAQT,UAAU;EAC3B,MAAMU,KAAK,IAAIP,gBAAgB;EAC/BJ,SAASU,QAAQP,kBAAkBQ;EAInC,MAAMC,uBAAuBD,GAAGlB,OAAOoB,WAAWjC;EAElDkC,eAAe,YAAY;GACzB,IAAI;IACF,IAAI,CAACF,eAAe,GAClB,MAAMP,SAASK,QAAQC,GAAGlB,MAAM;GAEpC,SAASR,OAAO;IACd,IAAI,CAAC2B,eAAe,KAAK,CAACZ,SAASU,QAAQR,UAAU;KACnDF,SAASU,QAAQT,UAAU;KAC3B,IAAIU,GAAGlB,OAAOsB,SACZ,eAAoB,YAAYR,YAAYG,OAAO;UAEnD,MAAMvB,eAAe,iBACnBqB,WAAWE,UAAUzB,KAAc,CACrC;IAEJ;GACF,UAAU;IACR,IAAI,CAAC2B,eAAe,KAAK,CAACZ,SAASU,QAAQR,UACzC,eAAoB,YAAYI,YAAYI,OAAO;IAErD,IAAI,CAACV,SAASU,QAAQR,YAAYF,SAASU,QAAQT,SACjDQ,SAAS;SACJ;KACLV,aAAa,KAAK;KAClB,IAAIC,SAASU,QAAQP,oBAAoBQ,IACvCX,SAASU,QAAQP,kBAAkB;IAEvC;GACF;EACF,CAAC;CACH,GAAG;EAACE;EAAUC;EAAaE;EAAYD;CAAW,CAAC;CAEnD,MAAM7B,WAAWR,kBAAkB;EACjC,IAAI8B,SAASU,QAAQR,UAAU;EAC/B,IAAIF,SAASU,QAAQP,iBAAiB;GAEpCH,SAASU,QAAQT,UAAU;GAC3B;EACF;EACAQ,SAAS;CACX,GAAG,CAACA,QAAQ,CAAC;CAIbtC,gBAAgB;EACd6B,SAASU,QAAQR,WAAW;EAC5B,aAAa;GACXF,SAASU,QAAQR,WAAW;GAC5BF,SAASU,QAAQT,UAAU;GAC3BD,SAASU,QAAQP,iBAAiBa,MAAMpC,aAAa;EACvD;CACF,GAAG,CAAA,CAAE;CAOL,OAAO;EACLH;EACAC;EACAC,QARaT,kBAAkB;GAC/B8B,SAASU,QAAQT,UAAU;GAC3BD,SAASU,QAAQP,iBAAiBa,MAAM;EAC1C,GAAG,CAAA,CAKDrC;CACF;AACF"}
@@ -0,0 +1,130 @@
1
+ import { ThreadMessage } from "../../../types/message.js";
2
+ import { AttachmentAdapter } from "../../../adapters/attachment.js";
3
+ import { LanguageModelConfig, LanguageModelV1CallSettings } from "../../../model-context/types.js";
4
+ import { ThreadHistoryAdapter } from "../../../adapters/thread-history.js";
5
+ import { UserCommands } from "../../../types/augmentations.js";
6
+ import { ToolExecutionStatus } from "../../../runtimes/tool-invocations/ToolInvocationTracker.js";
7
+ import { ToolModelContentPart } from "assistant-stream";
8
+ import { ReadonlyJSONValue } from "assistant-stream/utils";
9
+ //#region src/react/runtimes/assistant-transport/types.d.ts
10
+ type TextPart = {
11
+ readonly type: "text";
12
+ readonly text: string;
13
+ };
14
+ type ImagePart = {
15
+ readonly type: "image";
16
+ readonly image: string;
17
+ };
18
+ type UserMessagePart = TextPart | ImagePart;
19
+ type UserMessage = {
20
+ readonly role: "user";
21
+ readonly parts: readonly UserMessagePart[];
22
+ };
23
+ type AssistantMessage = {
24
+ readonly role: "assistant";
25
+ readonly parts: readonly TextPart[];
26
+ };
27
+ type AddMessageCommand = {
28
+ readonly type: "add-message";
29
+ readonly message: UserMessage | AssistantMessage;
30
+ readonly parentId: string | null;
31
+ readonly sourceId: string | null;
32
+ };
33
+ type AddToolResultCommand = {
34
+ readonly type: "add-tool-result";
35
+ readonly toolCallId: string;
36
+ readonly toolName: string;
37
+ readonly result: ReadonlyJSONValue;
38
+ readonly isError: boolean;
39
+ readonly artifact?: ReadonlyJSONValue;
40
+ readonly modelContent?: readonly ToolModelContentPart[];
41
+ };
42
+ type AssistantTransportCommand = AddMessageCommand | AddToolResultCommand | UserCommands;
43
+ type AssistantTransportState = {
44
+ readonly messages: readonly ThreadMessage[];
45
+ readonly state?: ReadonlyJSONValue;
46
+ readonly isRunning: boolean;
47
+ };
48
+ type AssistantTransportConnectionMetadata = {
49
+ pendingCommands: AssistantTransportCommand[];
50
+ isSending: boolean;
51
+ toolStatuses: Record<string, ToolExecutionStatus>;
52
+ };
53
+ type AssistantTransportStateConverter<T> = (state: T, connectionMetadata: AssistantTransportConnectionMetadata) => AssistantTransportState;
54
+ type CommandQueueState = {
55
+ queued: AssistantTransportCommand[];
56
+ inTransit: AssistantTransportCommand[];
57
+ };
58
+ type QueuedCommand = AssistantTransportCommand;
59
+ type HeadersValue = Record<string, string> | Headers;
60
+ type AssistantTransportProtocol = "data-stream" | "assistant-transport";
61
+ type SendCommandsRequestBody = {
62
+ commands: QueuedCommand[];
63
+ /** Absent on a resume with `resumeStateApi`; the server replays from its retained snapshot. */
64
+ state?: unknown;
65
+ runId?: string;
66
+ system: string | undefined;
67
+ tools: Record<string, unknown> | undefined;
68
+ callSettings: LanguageModelV1CallSettings | undefined;
69
+ config: LanguageModelConfig | undefined;
70
+ threadId: string | null;
71
+ parentId?: string | null;
72
+ [key: string]: unknown;
73
+ };
74
+ type AssistantTransportOptions<T> = {
75
+ initialState: T;
76
+ api: string;
77
+ resumeApi?: string;
78
+ /** Endpoint that returns the retained initial state and run ID for a resume stream. A 204 response means no run is active and the resume is skipped. */
79
+ resumeStateApi?: string;
80
+ protocol?: AssistantTransportProtocol;
81
+ /**
82
+ * When `false`, stream decoding and state reconciliation tolerate malformed
83
+ * input (invalid chunks are dropped with a console log) instead of throwing.
84
+ * Resume runs always decode leniently. Defaults to `true`.
85
+ */
86
+ strict?: boolean;
87
+ converter: AssistantTransportStateConverter<T>;
88
+ headers: HeadersValue | (() => Promise<HeadersValue>);
89
+ body?: object | (() => Promise<object | undefined>);
90
+ /**
91
+ * Transform the request body before it is sent to the API.
92
+ * Receives the fully assembled body and returns the (potentially transformed) body.
93
+ *
94
+ * @example
95
+ * ```ts
96
+ * prepareSendCommandsRequest: (body) => ({
97
+ * ...body,
98
+ * trackingId: crypto.randomUUID(),
99
+ * })
100
+ * ```
101
+ */
102
+ prepareSendCommandsRequest?: (body: SendCommandsRequestBody) => Record<string, unknown> | Promise<Record<string, unknown>>;
103
+ onResponse?: (response: Response) => void | Promise<void>;
104
+ onFinish?: () => void;
105
+ onError?: (error: Error, params: {
106
+ commands: AssistantTransportCommand[];
107
+ updateState: (updater: (state: T) => T) => void;
108
+ }) => void | Promise<void>;
109
+ /**
110
+ * Called when commands are cancelled.
111
+ *
112
+ * When an error occurs, queued commands are automatically cancelled after `onError` settles.
113
+ * In this case, the `error` parameter contains the error that caused the cancellation.
114
+ */
115
+ onCancel?: (params: {
116
+ commands: AssistantTransportCommand[];
117
+ updateState: (updater: (state: T) => T) => void;
118
+ error?: Error;
119
+ }) => void;
120
+ capabilities?: {
121
+ edit?: boolean;
122
+ };
123
+ adapters?: {
124
+ attachments?: AttachmentAdapter | undefined;
125
+ history?: ThreadHistoryAdapter | undefined;
126
+ };
127
+ };
128
+ //#endregion
129
+ export { AddMessageCommand, AddToolResultCommand, AssistantMessage, AssistantTransportCommand, AssistantTransportConnectionMetadata, AssistantTransportOptions, AssistantTransportProtocol, AssistantTransportState, AssistantTransportStateConverter, CommandQueueState, HeadersValue, ImagePart, QueuedCommand, SendCommandsRequestBody, TextPart, UserMessage, UserMessagePart };
130
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../../../src/react/runtimes/assistant-transport/types.ts"],"mappings":";;;;;;;;;KAaY;WACD;WACA;;KAGC;WACD;WACA;;KAGC,kBAAkB,WAAW;KAE7B;WACD;WACA,gBAAgB;;KAGf;WACD;WACA,gBAAgB;;KAIf;WACD;WACA,SAAS,cAAc;WACvB;WACA;;KAGC;WACD;WACA;WACA;WACA,QAAQ;WACR;WACA,WAAW;WACX,wBAAwB;;KAGvB,4BACR,oBACA,uBACA;KAGQ;WACD,mBAAmB;WACnB,QAAQ;WACR;;KAGC;EACV,iBAAiB;EACjB;EACA,cAAc,eAAe;;KAGnB,iCAAiC,MAC3C,OAAO,GACP,oBAAoB,yCACjB;KAGO;EACV,QAAQ;EACR,WAAW;;KAID,gBAAgB;KAKhB,eAAe,yBAAyB;KAExC;KAEA;EACV,UAAU;;EAEV;EACA;EACA;EACA,OAAO;EACP,cAAc;EACd,QAAQ;EACR;EACA;GAIC;;KAGS,0BAA0B;EACpC,cAAc;EACd;EACA;;EAEA;EACA,WAAW;;;;;;EAMX;EACA,WAAW,iCAAiC;EAC5C,SAAS,sBAAsB,QAAQ;EACvC,uBAAuB;;;;;;;;;;;;;EAavB,8BACE,MAAM,4BACH,0BAA0B,QAAQ;EACvC,cAAc,UAAU,oBAAoB;EAC5C;EACA,WACE,OAAO,OACP;IACE,UAAU;IACV,cAAc,UAAU,OAAO,MAAM;eAE7B;;;;;;;EAOZ,YAAY;IACV,UAAU;IACV,cAAc,UAAU,OAAO,MAAM;IACrC,QAAQ;;EAEV;IACE;;EAEF;IACE,cAAc;IACd,UAAU"}
@@ -0,0 +1,14 @@
1
+ import { UserExternalState } from "../../../types/augmentations.js";
2
+ import { AssistantRuntime } from "../../../runtime/api/assistant-runtime.js";
3
+ import { AssistantTransportCommand, AssistantTransportOptions } from "./types.js";
4
+ //#region src/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts
5
+ declare const useAssistantTransportSendCommand: () => (command: AssistantTransportCommand) => void;
6
+ declare function useAssistantTransportState(): UserExternalState;
7
+ declare function useAssistantTransportState<T>(selector: (state: UserExternalState) => T): T;
8
+ /**
9
+ * @alpha This is an experimental API that is subject to change.
10
+ */
11
+ declare const useAssistantTransportRuntime: <T>(options: AssistantTransportOptions<T>) => AssistantRuntime;
12
+ //#endregion
13
+ export { useAssistantTransportRuntime, useAssistantTransportSendCommand, useAssistantTransportState };
14
+ //# sourceMappingURL=useAssistantTransportRuntime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAssistantTransportRuntime.d.ts","names":[],"sources":["../../../../src/react/runtimes/assistant-transport/useAssistantTransportRuntime.ts"],"mappings":";;;;cA8Ha,yCAGH,SAAS;iBAOH,8BAA8B;iBAC9B,2BAA2B,GACzC,WAAW,OAAO,sBAAsB,IACvC;;;;cA0UU,+BAAgC,GAC3C,SAAS,0BAA0B,OAClC"}