@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
@@ -1,8 +1,12 @@
1
1
  // @vitest-environment jsdom
2
2
 
3
- import { act, render } from "@testing-library/react";
3
+ import { act, render, waitFor } from "@testing-library/react";
4
4
  import { describe, expect, it, vi } from "vitest";
5
5
  import { AuiProvider, useAui, useAuiEvent } from "@assistant-ui/store";
6
+ import { AssistantRuntimeProvider } from "../react/AssistantRuntimeProvider";
7
+ import { useExternalStoreRuntime } from "../react/runtimes/useExternalStoreRuntime";
8
+ import { useRemoteThreadListRuntime } from "../react/runtimes/useRemoteThreadListRuntime";
9
+ import { makeAdapter } from "./remote-thread-list-test-helpers";
6
10
  import { RuntimeAdapter } from "../react/RuntimeAdapter";
7
11
  import { AssistantRuntimeImpl } from "../runtime/api/assistant-runtime";
8
12
  import { ExternalStoreRuntimeCore } from "../runtimes/external-store/external-store-runtime-core";
@@ -10,6 +14,15 @@ import type { ExternalStoreAdapter } from "../runtimes/external-store/external-s
10
14
 
11
15
  type DemoMessage = { id: string; role: "user" | "assistant"; text: string };
12
16
 
17
+ const EMPTY_MESSAGES: readonly never[] = [];
18
+
19
+ const useTestThreadRuntime = () =>
20
+ useExternalStoreRuntime({
21
+ messages: EMPTY_MESSAGES,
22
+ isRunning: false,
23
+ onNew: async () => {},
24
+ });
25
+
13
26
  const createRuntime = () => {
14
27
  const threads = [
15
28
  {
@@ -110,6 +123,57 @@ describe("thread switch events", () => {
110
123
  expect(switchedAwayStar).toHaveBeenLastCalledWith({ threadId: "t2" });
111
124
  });
112
125
 
126
+ it("delivers threads.selectionChanged with the new and previous thread ids", async () => {
127
+ const runtime = createRuntime();
128
+ const selectionChanged = vi.fn();
129
+ const auiOn = vi.fn();
130
+ let aui!: ReturnType<typeof useAui>;
131
+ const Consumer = () => {
132
+ useAuiEvent(
133
+ "threads.selectionChanged" as never,
134
+ selectionChanged as never,
135
+ );
136
+ return null;
137
+ };
138
+ const Harness = () => {
139
+ aui = useAui({ threads: RuntimeAdapter(runtime) } as never);
140
+ return (
141
+ <AuiProvider value={aui}>
142
+ <Consumer />
143
+ </AuiProvider>
144
+ );
145
+ };
146
+ render(<Harness />);
147
+ await act(async () => {});
148
+
149
+ aui.on("threads.selectionChanged" as never, auiOn as never);
150
+
151
+ await act(async () => {
152
+ aui.threads.item({ index: 1 }).switchTo();
153
+ });
154
+ await act(async () => {});
155
+
156
+ expect(selectionChanged).toHaveBeenCalledExactlyOnceWith({
157
+ threadId: "t2",
158
+ previousThreadId: "t1",
159
+ });
160
+ expect(auiOn).toHaveBeenCalledExactlyOnceWith({
161
+ threadId: "t2",
162
+ previousThreadId: "t1",
163
+ });
164
+
165
+ await act(async () => {
166
+ aui.threads.item({ index: 0 }).switchTo();
167
+ });
168
+ await act(async () => {});
169
+
170
+ expect(selectionChanged).toHaveBeenCalledTimes(2);
171
+ expect(selectionChanged).toHaveBeenLastCalledWith({
172
+ threadId: "t1",
173
+ previousThreadId: "t2",
174
+ });
175
+ });
176
+
113
177
  it("does not emit for the initially selected thread on mount", async () => {
114
178
  const runtime = createRuntime();
115
179
  const anySwitch = vi.fn();
@@ -118,6 +182,10 @@ describe("thread switch events", () => {
118
182
  { scope: "*", event: "threadListItem.switchedTo" } as never,
119
183
  anySwitch as never,
120
184
  );
185
+ useAuiEvent(
186
+ { scope: "*", event: "threads.selectionChanged" } as never,
187
+ anySwitch as never,
188
+ );
121
189
  return null;
122
190
  };
123
191
  const Harness = () => {
@@ -133,4 +201,34 @@ describe("thread switch events", () => {
133
201
 
134
202
  expect(anySwitch).not.toHaveBeenCalled();
135
203
  });
204
+
205
+ it("emits when a deep-linked initial thread resolves after mount", async () => {
206
+ const adapter = makeAdapter();
207
+ const selectionChanged = vi.fn();
208
+ const Listener = () => {
209
+ useAuiEvent("threads.selectionChanged", selectionChanged);
210
+ return null;
211
+ };
212
+ const Harness = () => {
213
+ const runtime = useRemoteThreadListRuntime({
214
+ adapter,
215
+ initialThreadId: "thread-a",
216
+ runtimeHook: useTestThreadRuntime,
217
+ });
218
+ return (
219
+ <AssistantRuntimeProvider runtime={runtime}>
220
+ <Listener />
221
+ </AssistantRuntimeProvider>
222
+ );
223
+ };
224
+ render(<Harness />);
225
+
226
+ await waitFor(() => expect(selectionChanged).toHaveBeenCalledTimes(1));
227
+ const payload = selectionChanged.mock.calls[0]![0] as {
228
+ threadId: string;
229
+ previousThreadId: string;
230
+ };
231
+ expect(payload.threadId).toBe("thread-a");
232
+ expect(payload.previousThreadId).toMatch(/^__LOCALID_/);
233
+ });
136
234
  });
@@ -0,0 +1,58 @@
1
+ // @vitest-environment jsdom
2
+
3
+ import { act, cleanup, render } from "@testing-library/react";
4
+ import { afterEach, describe, expect, it, vi } from "vitest";
5
+ import { withKey } from "@assistant-ui/tap";
6
+ import { useAui } from "@assistant-ui/store";
7
+ import { Tools } from "../react/client/Tools";
8
+ import { ModelContext } from "../store/clients/model-context-client";
9
+ import type { Toolkit } from "../react/model-context/toolbox";
10
+
11
+ type AnyClient = Record<string, any>;
12
+
13
+ const toolkit = {
14
+ lookup: {
15
+ description: "look something up",
16
+ parameters: { type: "object", properties: {} },
17
+ execute: async () => "ok",
18
+ },
19
+ } as unknown as Toolkit;
20
+
21
+ afterEach(() => {
22
+ cleanup();
23
+ });
24
+
25
+ describe("Tools model-context registration", () => {
26
+ it("migrates to a structurally replaced modelContext scope", async () => {
27
+ let aui!: AnyClient;
28
+ const Harness = ({ generation }: { generation: number }) => {
29
+ aui = useAui({
30
+ tools: Tools({ toolkit }),
31
+ modelContext: withKey(String(generation), ModelContext()),
32
+ } as never);
33
+ return null;
34
+ };
35
+ const view = render(<Harness generation={0} />);
36
+
37
+ expect(
38
+ Object.keys(aui.modelContext().getModelContext().tools ?? {}),
39
+ ).toContain("lookup");
40
+
41
+ // A rerender inside an outer act would not land until that act exits,
42
+ // so the swap happens first and only the scheduler wait is wrapped
43
+ view.rerender(<Harness generation={1} />);
44
+
45
+ // The registration lands one scheduler macrotask after the swap: the
46
+ // mount-time register marks the tap scheduler dirty, which defers the
47
+ // structural publish to the scheduler's drain. The remounted scope
48
+ // starts from fresh state, so the tools reappearing proves the
49
+ // registration migrated to the replacement instance.
50
+ await act(async () => {
51
+ await vi.waitFor(() =>
52
+ expect(
53
+ Object.keys(aui.modelContext().getModelContext().tools ?? {}),
54
+ ).toContain("lookup"),
55
+ );
56
+ });
57
+ });
58
+ });
@@ -0,0 +1,139 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import { CompositeContextProvider } from "./composite-context-provider";
3
+
4
+ describe("CompositeContextProvider", () => {
5
+ it("notifies every subscriber and rethrows when a registration subscriber throws", () => {
6
+ const composite = new CompositeContextProvider();
7
+ const error = new Error("subscriber failed");
8
+ const laterSubscriber = vi.fn();
9
+
10
+ composite.subscribe(() => {
11
+ throw error;
12
+ });
13
+ composite.subscribe(laterSubscriber);
14
+
15
+ expect(() =>
16
+ composite.registerModelContextProvider({
17
+ getModelContext: () => ({ system: "provider instructions" }),
18
+ }),
19
+ ).toThrow(error);
20
+
21
+ expect(composite.getModelContext().system).toBe("provider instructions");
22
+ expect(laterSubscriber).toHaveBeenCalledTimes(1);
23
+ });
24
+
25
+ it("rolls back providers that fail to subscribe", () => {
26
+ const composite = new CompositeContextProvider();
27
+ const error = new Error("subscription failed");
28
+ const observedSystems: Array<string | undefined> = [];
29
+
30
+ composite.subscribe(() => {
31
+ observedSystems.push(composite.getModelContext().system);
32
+ });
33
+
34
+ expect(() =>
35
+ composite.registerModelContextProvider({
36
+ getModelContext: () => ({ system: "provider instructions" }),
37
+ subscribe: (callback) => {
38
+ callback();
39
+ throw error;
40
+ },
41
+ }),
42
+ ).toThrow(error);
43
+
44
+ expect(composite.getModelContext().system).toBeUndefined();
45
+ expect(observedSystems).toEqual(["provider instructions", undefined]);
46
+ });
47
+
48
+ it("rethrows the provider subscription failure when a rollback subscriber throws", () => {
49
+ const composite = new CompositeContextProvider();
50
+ const subscriptionError = new Error("subscription failed");
51
+ const subscriberError = new Error("subscriber failed");
52
+ const consoleError = vi
53
+ .spyOn(console, "error")
54
+ .mockImplementation(() => {});
55
+
56
+ composite.subscribe(() => {
57
+ throw subscriberError;
58
+ });
59
+
60
+ try {
61
+ expect(() =>
62
+ composite.registerModelContextProvider({
63
+ getModelContext: () => ({ system: "provider instructions" }),
64
+ subscribe: () => {
65
+ throw subscriptionError;
66
+ },
67
+ }),
68
+ ).toThrow(subscriptionError);
69
+
70
+ expect(composite.getModelContext().system).toBeUndefined();
71
+ expect(consoleError).toHaveBeenCalledWith(subscriberError);
72
+ } finally {
73
+ consoleError.mockRestore();
74
+ }
75
+ });
76
+
77
+ it("preserves an earlier registration when a duplicate fails to subscribe", () => {
78
+ const composite = new CompositeContextProvider();
79
+ const error = new Error("subscription failed");
80
+ let subscriptionCount = 0;
81
+ const provider = {
82
+ getModelContext: () => ({ system: "provider instructions" }),
83
+ subscribe: () => {
84
+ subscriptionCount++;
85
+ if (subscriptionCount === 2) throw error;
86
+ return () => {};
87
+ },
88
+ };
89
+
90
+ const unregister = composite.registerModelContextProvider(provider);
91
+
92
+ expect(() => composite.registerModelContextProvider(provider)).toThrow(
93
+ error,
94
+ );
95
+ expect(composite.getModelContext().system).toBe("provider instructions");
96
+
97
+ unregister();
98
+ expect(composite.getModelContext().system).toBeUndefined();
99
+ });
100
+
101
+ it("keeps duplicate registrations independent", () => {
102
+ const composite = new CompositeContextProvider();
103
+ const provider = {
104
+ getModelContext: () => ({ system: "provider instructions" }),
105
+ };
106
+
107
+ const unregisterFirst = composite.registerModelContextProvider(provider);
108
+ const unregisterSecond = composite.registerModelContextProvider(provider);
109
+
110
+ unregisterFirst();
111
+ expect(composite.getModelContext().system).toBe("provider instructions");
112
+
113
+ unregisterSecond();
114
+ expect(composite.getModelContext().system).toBeUndefined();
115
+ });
116
+
117
+ it("notifies every subscriber and rethrows on provider updates", () => {
118
+ const composite = new CompositeContextProvider();
119
+ const error = new Error("subscriber failed");
120
+ const laterSubscriber = vi.fn();
121
+ let publishUpdate = () => {};
122
+
123
+ composite.registerModelContextProvider({
124
+ getModelContext: () => ({ system: "provider instructions" }),
125
+ subscribe: (callback) => {
126
+ publishUpdate = callback;
127
+ return () => {};
128
+ },
129
+ });
130
+
131
+ composite.subscribe(() => {
132
+ throw error;
133
+ });
134
+ composite.subscribe(laterSubscriber);
135
+
136
+ expect(() => publishUpdate()).toThrow(error);
137
+ expect(laterSubscriber).toHaveBeenCalledTimes(1);
138
+ });
139
+ });
@@ -2,23 +2,41 @@ import {
2
2
  type ModelContextProvider,
3
3
  mergeModelContexts,
4
4
  } from "../model-context/types";
5
+ import { notifySubscribers as notifyStateSubscribers } from "../subscribable/subscribable";
6
+ import type { Unsubscribe } from "../types/unsubscribe";
5
7
 
6
8
  export class CompositeContextProvider implements ModelContextProvider {
7
- private _providers = new Set<ModelContextProvider>();
9
+ private _providers = new Map<symbol, ModelContextProvider>();
10
+ private _providerUnsubscribes = new Map<symbol, Unsubscribe | undefined>();
8
11
 
9
12
  getModelContext() {
10
- return mergeModelContexts(this._providers);
13
+ return mergeModelContexts(new Set(this._providers.values()));
11
14
  }
12
15
 
13
16
  registerModelContextProvider(provider: ModelContextProvider) {
14
- this._providers.add(provider);
15
- const unsubscribe = provider.subscribe?.(() => {
16
- this.notifySubscribers();
17
- });
17
+ const id = Symbol();
18
+ this._providers.set(id, provider);
19
+ let unsubscribe: Unsubscribe | undefined;
20
+ try {
21
+ unsubscribe = provider.subscribe?.(() => {
22
+ this.notifySubscribers();
23
+ });
24
+ } catch (error) {
25
+ this._providers.delete(id);
26
+ try {
27
+ this.notifySubscribers();
28
+ } catch (notifyError) {
29
+ console.error(notifyError);
30
+ }
31
+ throw error;
32
+ }
33
+ this._providerUnsubscribes.set(id, unsubscribe);
18
34
  this.notifySubscribers();
19
35
  return () => {
20
- this._providers.delete(provider);
36
+ this._providers.delete(id);
37
+ const unsubscribe = this._providerUnsubscribes.get(id);
21
38
  unsubscribe?.();
39
+ this._providerUnsubscribes.delete(id);
22
40
  this.notifySubscribers();
23
41
  };
24
42
  }
@@ -26,7 +44,7 @@ export class CompositeContextProvider implements ModelContextProvider {
26
44
  private _subscribers = new Set<() => void>();
27
45
 
28
46
  notifySubscribers() {
29
- for (const callback of this._subscribers) callback();
47
+ notifyStateSubscribers(this._subscribers);
30
48
  }
31
49
 
32
50
  subscribe(callback: () => void) {
@@ -1,8 +1,9 @@
1
- type EventListener = (payload?: unknown) => void;
1
+ type EventListener<T> = (payload: T) => unknown;
2
2
 
3
- export const notifyEventListeners = (
4
- listeners: Iterable<EventListener>,
5
- payload: unknown,
3
+ // A function payload is indistinguishable from a factory and gets invoked; wrap a function-typed payload in a factory.
4
+ export const notifyEventListeners = <T>(
5
+ listeners: Iterable<EventListener<T>>,
6
+ payloadOrFactory: T | (() => T),
6
7
  errorContext: string,
7
8
  ) => {
8
9
  const reportError = (error: unknown) => {
@@ -14,7 +15,11 @@ export const notifyEventListeners = (
14
15
 
15
16
  for (const listener of listeners) {
16
17
  try {
17
- const result = listener(payload) as unknown;
18
+ const result = listener(
19
+ typeof payloadOrFactory === "function"
20
+ ? (payloadOrFactory as () => T)()
21
+ : payloadOrFactory,
22
+ );
18
23
  if (
19
24
  result !== null &&
20
25
  (typeof result === "object" || typeof result === "function") &&