@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
@@ -9,6 +9,7 @@ import type { ClientOutput } from "@assistant-ui/store";
9
9
  import {
10
10
  attachTransformScopes,
11
11
  useAssistantClientRef,
12
+ useAssistantScopeEffect,
12
13
  } from "@assistant-ui/store/client";
13
14
  import type { McpAppResourceOutput, ToolsState } from "../types/scopes/tools";
14
15
  import type { Tool } from "assistant-stream";
@@ -109,38 +110,44 @@ const useTools = ({
109
110
  }
110
111
  }
111
112
 
112
- // Register tools with model context (exclude symbols). `render`,
113
- // `renderText`, and `display` are client-only presentation concerns and
114
- // never reach the model.
115
- const toolsWithoutRender = Object.entries(toolkit).reduce(
116
- (acc, [name, tool]) => {
117
- if (tool.type === "mcp") return acc;
118
- const {
119
- display: _display,
120
- render: _render,
121
- renderText: _renderText,
122
- ...rest
123
- } = tool as typeof tool & { renderText?: unknown };
124
- acc[name] = rest as Tool<any, any>;
125
- return acc;
126
- },
127
- {} as Record<string, Tool<any, any>>,
128
- );
129
-
130
- const modelContextProvider = {
131
- getModelContext: () => ({
132
- tools: toolsWithoutRender,
133
- }),
134
- };
135
-
136
- unsubscribes.push(
137
- clientRef.current!.modelContext().register(modelContextProvider),
138
- );
139
-
140
113
  return () => {
141
114
  unsubscribes.forEach((fn) => fn());
142
115
  };
143
- }, [toolkit, setToolUI, clientRef]);
116
+ }, [toolkit, setToolUI]);
117
+
118
+ useAssistantScopeEffect(
119
+ "modelContext",
120
+ () => {
121
+ if (!toolkit) return;
122
+
123
+ // Register tools with model context (exclude symbols). `render`,
124
+ // `renderText`, and `display` are client-only presentation concerns and
125
+ // never reach the model.
126
+ const toolsWithoutRender = Object.entries(toolkit).reduce(
127
+ (acc, [name, tool]) => {
128
+ if (tool.type === "mcp") return acc;
129
+ const {
130
+ display: _display,
131
+ render: _render,
132
+ renderText: _renderText,
133
+ ...rest
134
+ } = tool as typeof tool & { renderText?: unknown };
135
+ acc[name] = rest as Tool<any, any>;
136
+ return acc;
137
+ },
138
+ {} as Record<string, Tool<any, any>>,
139
+ );
140
+
141
+ const modelContextProvider = {
142
+ getModelContext: () => ({
143
+ tools: toolsWithoutRender,
144
+ }),
145
+ };
146
+
147
+ return clientRef.current!.modelContext().register(modelContextProvider);
148
+ },
149
+ [toolkit],
150
+ );
144
151
 
145
152
  return {
146
153
  getState: () => state,
@@ -235,6 +235,19 @@ export { RemoteThreadListHookInstanceManager } from "./runtimes/RemoteThreadList
235
235
  export { RemoteThreadListThreadListRuntimeCore } from "./runtimes/RemoteThreadListThreadListRuntimeCore";
236
236
  export { useRemoteThreadListRuntime } from "./runtimes/useRemoteThreadListRuntime";
237
237
  export { useCloudThreadListAdapter } from "./runtimes/cloud/useCloudThreadListAdapter";
238
+ export { useCloudThreadListRuntime } from "./runtimes/cloud/useCloudThreadListRuntime";
239
+ export {
240
+ useAssistantTransportRuntime,
241
+ useAssistantTransportSendCommand,
242
+ useAssistantTransportState,
243
+ } from "./runtimes/assistant-transport/useAssistantTransportRuntime";
244
+ export type {
245
+ AssistantTransportConnectionMetadata,
246
+ AssistantTransportCommand,
247
+ AssistantTransportOptions,
248
+ AssistantTransportProtocol,
249
+ SendCommandsRequestBody,
250
+ } from "./runtimes/assistant-transport/types";
238
251
  export { useAssistantCloudThreadHistoryAdapter } from "./runtimes/cloud/AssistantCloudThreadHistoryAdapter";
239
252
  export { CloudFileAttachmentAdapter } from "./runtimes/cloud/CloudFileAttachmentAdapter";
240
253
  export {
@@ -0,0 +1,317 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { createTapRoot, flushTapSync, useResource } from "@assistant-ui/tap";
3
+ import type {
4
+ InteractablePersistenceAdapter,
5
+ InteractableRegistration,
6
+ } from "./scopes";
7
+
8
+ const clientHolder: { client: unknown } = { client: null };
9
+ const clientListeners = new Set<() => void>();
10
+ let registeredModelContextProvider:
11
+ | { subscribe?: (callback: () => void) => () => void }
12
+ | undefined;
13
+
14
+ vi.mock("@assistant-ui/store", async (importOriginal) => {
15
+ const actual = await importOriginal<typeof import("@assistant-ui/store")>();
16
+ return {
17
+ ...actual,
18
+ useAssistantClientRef: () => ({
19
+ get current() {
20
+ return clientHolder.client;
21
+ },
22
+ }),
23
+ };
24
+ });
25
+
26
+ vi.mock("@assistant-ui/store/client", async (importOriginal) => {
27
+ const actual =
28
+ await importOriginal<typeof import("@assistant-ui/store/client")>();
29
+ const { useEffect } = await import("react");
30
+ const useScopeEffectShim = (
31
+ scope: string,
32
+ effect: () => (() => void) | void,
33
+ deps: readonly unknown[],
34
+ ) => {
35
+ useEffect(() => {
36
+ let cleanup: (() => void) | undefined;
37
+ const apply = () => {
38
+ cleanup?.();
39
+ cleanup = undefined;
40
+ const accessor = (
41
+ clientHolder.client as Record<string, { source?: unknown }> | null
42
+ )?.[scope];
43
+ if (accessor?.source == null) return;
44
+ const result = effect();
45
+ cleanup = typeof result === "function" ? result : undefined;
46
+ };
47
+
48
+ apply();
49
+ clientListeners.add(apply);
50
+ return () => {
51
+ clientListeners.delete(apply);
52
+ cleanup?.();
53
+ };
54
+ // oxlint-disable-next-line react-hooks/exhaustive-deps -- caller-provided deps, mirrors the real hook
55
+ }, deps);
56
+ };
57
+ return {
58
+ ...actual,
59
+ useAssistantScopeEffect: useScopeEffectShim,
60
+ };
61
+ });
62
+
63
+ const { Interactables } = await import("./Interactables");
64
+
65
+ const makeClient = () => ({
66
+ modelContext: Object.assign(
67
+ () => ({
68
+ register: (
69
+ provider: NonNullable<typeof registeredModelContextProvider>,
70
+ ) => {
71
+ registeredModelContextProvider = provider;
72
+ return () => {
73
+ registeredModelContextProvider = undefined;
74
+ };
75
+ },
76
+ }),
77
+ { source: "root" },
78
+ ),
79
+ });
80
+
81
+ const mount = () => {
82
+ clientHolder.client = makeClient();
83
+ return createTapRoot(function InteractablesRoot() {
84
+ return useResource(Interactables());
85
+ });
86
+ };
87
+
88
+ const reg = (id: string): InteractableRegistration => ({
89
+ id,
90
+ name: "note",
91
+ description: "a note",
92
+ stateSchema: { type: "object", properties: {} } as never,
93
+ initialState: { v: 0 },
94
+ });
95
+
96
+ const flushMicrotasks = () => vi.advanceTimersByTimeAsync(0);
97
+
98
+ let root: ReturnType<typeof mount> | undefined;
99
+
100
+ beforeEach(() => {
101
+ vi.useFakeTimers();
102
+ registeredModelContextProvider = undefined;
103
+ });
104
+
105
+ afterEach(() => {
106
+ root?.unmount();
107
+ root = undefined;
108
+ clientListeners.clear();
109
+ vi.useRealTimers();
110
+ vi.restoreAllMocks();
111
+ });
112
+
113
+ describe("legacy Interactables persistence", () => {
114
+ it("notifies every model-context subscriber when one throws", async () => {
115
+ root = mount();
116
+ await flushMicrotasks();
117
+ const listenerError = new Error("listener failed");
118
+ const laterListener = vi.fn();
119
+
120
+ const provider = registeredModelContextProvider;
121
+ expect(provider).toBeDefined();
122
+ provider?.subscribe?.(() => {
123
+ throw listenerError;
124
+ });
125
+ provider?.subscribe?.(laterListener);
126
+
127
+ expect(() =>
128
+ flushTapSync(() => root?.getValue().register(reg("n1"))),
129
+ ).toThrow(listenerError);
130
+ expect(laterListener).toHaveBeenCalledOnce();
131
+ });
132
+
133
+ it("saves queued changes with the adapter that observed them", async () => {
134
+ const firstSave = vi.fn();
135
+ const secondSave = vi.fn();
136
+ root = mount();
137
+ await flushMicrotasks();
138
+ root.getValue().setPersistenceAdapter({
139
+ save: firstSave,
140
+ } satisfies InteractablePersistenceAdapter);
141
+ root.getValue().register(reg("n1"));
142
+
143
+ root.getValue().setState("n1", () => ({ v: 1 }));
144
+ root.getValue().setPersistenceAdapter({
145
+ save: secondSave,
146
+ } satisfies InteractablePersistenceAdapter);
147
+ await vi.advanceTimersByTimeAsync(500);
148
+
149
+ expect(firstSave).toHaveBeenCalledWith({
150
+ n1: { name: "note", state: { v: 1 } },
151
+ });
152
+ expect(secondSave).not.toHaveBeenCalled();
153
+ });
154
+
155
+ it("keeps edits queued during an in-flight flush with the outgoing adapter", async () => {
156
+ const saveResolvers: Array<() => void> = [];
157
+ const firstSave = vi.fn(
158
+ () =>
159
+ new Promise<void>((resolve) => {
160
+ saveResolvers.push(resolve);
161
+ }),
162
+ );
163
+ const secondSave = vi.fn();
164
+ root = mount();
165
+ await flushMicrotasks();
166
+ root.getValue().setPersistenceAdapter({ save: firstSave });
167
+ root.getValue().register(reg("n1"));
168
+
169
+ root.getValue().setState("n1", () => ({ v: 1 }));
170
+ await vi.advanceTimersByTimeAsync(500);
171
+ root.getValue().setState("n1", () => ({ v: 2 }));
172
+ root.getValue().setPersistenceAdapter({ save: secondSave });
173
+
174
+ expect(firstSave).toHaveBeenCalledTimes(1);
175
+ expect(secondSave).not.toHaveBeenCalled();
176
+
177
+ saveResolvers[0]!();
178
+ await flushMicrotasks();
179
+ expect(firstSave).toHaveBeenCalledTimes(2);
180
+ expect(firstSave.mock.calls[1]![0]).toEqual({
181
+ n1: { name: "note", state: { v: 2 } },
182
+ });
183
+ expect(firstSave.mock.calls.at(-1)?.[0]).toEqual({
184
+ n1: { name: "note", state: { v: 2 } },
185
+ });
186
+ expect(secondSave).not.toHaveBeenCalled();
187
+
188
+ saveResolvers[1]!();
189
+ await flushMicrotasks();
190
+ expect(secondSave).not.toHaveBeenCalled();
191
+ });
192
+
193
+ it("cancels an empty retry timer when replacing the adapter", async () => {
194
+ let resolveFirstSave!: () => void;
195
+ const firstSave = vi
196
+ .fn()
197
+ .mockImplementationOnce(
198
+ () =>
199
+ new Promise<void>((resolve) => {
200
+ resolveFirstSave = resolve;
201
+ }),
202
+ )
203
+ .mockResolvedValue(undefined);
204
+ const secondSave = vi.fn();
205
+ root = mount();
206
+ await flushMicrotasks();
207
+ root.getValue().setPersistenceAdapter({ save: firstSave });
208
+ root.getValue().register(reg("n1"));
209
+
210
+ root.getValue().setState("n1", () => ({ v: 1 }));
211
+ await vi.advanceTimersByTimeAsync(500);
212
+ root.getValue().setState("n1", () => ({ v: 2 }));
213
+ await vi.advanceTimersByTimeAsync(500);
214
+
215
+ resolveFirstSave();
216
+ await flushMicrotasks();
217
+ expect(firstSave).toHaveBeenCalledTimes(2);
218
+
219
+ root.getValue().setPersistenceAdapter({ save: secondSave });
220
+ await vi.advanceTimersByTimeAsync(500);
221
+
222
+ expect(firstSave).toHaveBeenCalledTimes(2);
223
+ expect(secondSave).not.toHaveBeenCalled();
224
+ });
225
+
226
+ it("cancels the retry timer after starting the queued batch", async () => {
227
+ let resolveFirstSave!: () => void;
228
+ const save = vi
229
+ .fn()
230
+ .mockImplementationOnce(
231
+ () =>
232
+ new Promise<void>((resolve) => {
233
+ resolveFirstSave = resolve;
234
+ }),
235
+ )
236
+ .mockResolvedValue(undefined);
237
+ root = mount();
238
+ await flushMicrotasks();
239
+ root.getValue().setPersistenceAdapter({ save });
240
+ root.getValue().register(reg("n1"));
241
+
242
+ root.getValue().setState("n1", () => ({ v: 1 }));
243
+ await vi.advanceTimersByTimeAsync(500);
244
+ root.getValue().setState("n1", () => ({ v: 2 }));
245
+ await vi.advanceTimersByTimeAsync(500);
246
+
247
+ resolveFirstSave();
248
+ await flushMicrotasks();
249
+ expect(save).toHaveBeenCalledTimes(2);
250
+
251
+ await vi.advanceTimersByTimeAsync(500);
252
+ expect(save).toHaveBeenCalledTimes(2);
253
+ });
254
+
255
+ it("settles overlapping persistence batches per interactable", async () => {
256
+ let resolveFirstSave!: () => void;
257
+ const firstSave = vi
258
+ .fn()
259
+ .mockImplementationOnce(
260
+ () =>
261
+ new Promise<void>((resolve) => {
262
+ resolveFirstSave = resolve;
263
+ }),
264
+ )
265
+ .mockResolvedValue(undefined);
266
+ root = mount();
267
+ await flushMicrotasks();
268
+ root.getValue().setPersistenceAdapter({ save: firstSave });
269
+ root.getValue().register(reg("n1"));
270
+ root.getValue().register(reg("n2"));
271
+
272
+ root.getValue().setState("n1", () => ({ v: 1 }));
273
+ await vi.advanceTimersByTimeAsync(500);
274
+ root.getValue().setState("n2", () => ({ v: 2 }));
275
+ root.getValue().setPersistenceAdapter({ save: vi.fn() });
276
+ await flushMicrotasks();
277
+
278
+ expect(root.getValue().getState().persistence["n1"]?.isPending).toBe(true);
279
+ expect(root.getValue().getState().persistence["n2"]).toBeUndefined();
280
+
281
+ resolveFirstSave();
282
+ await flushMicrotasks();
283
+ expect(root.getValue().getState().persistence["n1"]).toBeUndefined();
284
+ });
285
+
286
+ it("keeps an interactable pending while its newer edit is queued", async () => {
287
+ const saveResolvers: Array<() => void> = [];
288
+ const firstSave = vi.fn(
289
+ () =>
290
+ new Promise<void>((resolve) => {
291
+ saveResolvers.push(resolve);
292
+ }),
293
+ );
294
+ const secondSave = vi.fn();
295
+ root = mount();
296
+ await flushMicrotasks();
297
+ root.getValue().setPersistenceAdapter({ save: firstSave });
298
+ root.getValue().register(reg("n1"));
299
+ root.getValue().register(reg("n2"));
300
+
301
+ root.getValue().setState("n1", () => ({ v: 1 }));
302
+ await vi.advanceTimersByTimeAsync(500);
303
+ root.getValue().setState("n2", () => ({ v: 2 }));
304
+ root.getValue().setPersistenceAdapter({ save: secondSave });
305
+ root.getValue().setState("n1", () => ({ v: 3 }));
306
+
307
+ saveResolvers[0]!();
308
+ await flushMicrotasks();
309
+ expect(root.getValue().getState().persistence["n1"]?.isPending).toBe(true);
310
+ expect(secondSave).not.toHaveBeenCalled();
311
+
312
+ saveResolvers[1]!();
313
+ await flushMicrotasks();
314
+ expect(secondSave).toHaveBeenCalledTimes(1);
315
+ expect(root.getValue().getState().persistence["n1"]).toBeUndefined();
316
+ });
317
+ });