@assistant-ui/core 0.2.10 → 0.2.11

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 (362) hide show
  1. package/dist/adapters/attachment.d.ts.map +1 -1
  2. package/dist/adapters/attachment.js +22 -12
  3. package/dist/adapters/attachment.js.map +1 -1
  4. package/dist/adapters/directive-formatter.js.map +1 -1
  5. package/dist/adapters/speech.js.map +1 -1
  6. package/dist/index.d.ts +3 -1
  7. package/dist/index.js +2 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/internal.js +1 -1
  10. package/dist/model-context/frame/host.js.map +1 -1
  11. package/dist/model-context/frame/provider.js.map +1 -1
  12. package/dist/model-context/registry.js.map +1 -1
  13. package/dist/model-context/types.js.map +1 -1
  14. package/dist/react/AssistantProvider.js +1 -1
  15. package/dist/react/AssistantRuntimeProvider.d.ts +1 -1
  16. package/dist/react/AssistantRuntimeProvider.d.ts.map +1 -1
  17. package/dist/react/AssistantRuntimeProvider.js +1 -1
  18. package/dist/react/RuntimeAdapter.js +4 -2
  19. package/dist/react/RuntimeAdapter.js.map +1 -1
  20. package/dist/react/adapters/LocalStorageThreadListAdapter.js +1 -1
  21. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  22. package/dist/react/client/DataRenderers.d.ts.map +1 -1
  23. package/dist/react/client/DataRenderers.js +6 -5
  24. package/dist/react/client/DataRenderers.js.map +1 -1
  25. package/dist/react/client/Interactables.d.ts.map +1 -1
  26. package/dist/react/client/Interactables.js +30 -29
  27. package/dist/react/client/Interactables.js.map +1 -1
  28. package/dist/react/client/Tools.d.ts.map +1 -1
  29. package/dist/react/client/Tools.js +10 -9
  30. package/dist/react/client/Tools.js.map +1 -1
  31. package/dist/react/index.d.ts +5 -4
  32. package/dist/react/index.js +3 -2
  33. package/dist/react/model-context/define-mcp-toolkit.js.map +1 -1
  34. package/dist/react/model-context/define-toolkit.d.ts +9 -12
  35. package/dist/react/model-context/define-toolkit.d.ts.map +1 -1
  36. package/dist/react/model-context/define-toolkit.js +1 -1
  37. package/dist/react/model-context/define-toolkit.js.map +1 -1
  38. package/dist/react/model-context/external-tool.d.ts +14 -0
  39. package/dist/react/model-context/external-tool.d.ts.map +1 -0
  40. package/dist/react/model-context/external-tool.js +17 -0
  41. package/dist/react/model-context/external-tool.js.map +1 -0
  42. package/dist/react/model-context/human-tool.d.ts +27 -0
  43. package/dist/react/model-context/human-tool.d.ts.map +1 -0
  44. package/dist/react/model-context/human-tool.js +30 -0
  45. package/dist/react/model-context/human-tool.js.map +1 -0
  46. package/dist/react/model-context/toolbox.d.ts +3 -3
  47. package/dist/react/model-context/toolbox.js.map +1 -1
  48. package/dist/react/model-context/useAssistantContext.js +1 -1
  49. package/dist/react/model-context/useAssistantContext.js.map +1 -1
  50. package/dist/react/model-context/useAssistantDataUI.js +1 -1
  51. package/dist/react/model-context/useAssistantDataUI.js.map +1 -1
  52. package/dist/react/model-context/useAssistantInstructions.js +1 -1
  53. package/dist/react/model-context/useAssistantInstructions.js.map +1 -1
  54. package/dist/react/model-context/useAssistantInteractable.js +1 -1
  55. package/dist/react/model-context/useAssistantInteractable.js.map +1 -1
  56. package/dist/react/model-context/useAssistantTool.js +1 -1
  57. package/dist/react/model-context/useAssistantTool.js.map +1 -1
  58. package/dist/react/model-context/useAssistantToolUI.js +1 -1
  59. package/dist/react/model-context/useAssistantToolUI.js.map +1 -1
  60. package/dist/react/model-context/useAuiToolOverrides.js +1 -1
  61. package/dist/react/model-context/useAuiToolOverrides.js.map +1 -1
  62. package/dist/react/model-context/useInlineRender.js +1 -1
  63. package/dist/react/model-context/useInlineRender.js.map +1 -1
  64. package/dist/react/model-context/useInteractableState.js +1 -1
  65. package/dist/react/model-context/useInteractableState.js.map +1 -1
  66. package/dist/react/model-context/useToolArgsStatus.js +1 -1
  67. package/dist/react/primitive-hooks/useActionBarCopy.js +1 -1
  68. package/dist/react/primitive-hooks/useActionBarCopy.js.map +1 -1
  69. package/dist/react/primitive-hooks/useActionBarEdit.js +1 -1
  70. package/dist/react/primitive-hooks/useActionBarEdit.js.map +1 -1
  71. package/dist/react/primitive-hooks/useActionBarFeedback.js +1 -1
  72. package/dist/react/primitive-hooks/useActionBarFeedback.js.map +1 -1
  73. package/dist/react/primitive-hooks/useActionBarReload.js +1 -1
  74. package/dist/react/primitive-hooks/useActionBarReload.js.map +1 -1
  75. package/dist/react/primitive-hooks/useActionBarSpeak.js +1 -1
  76. package/dist/react/primitive-hooks/useActionBarSpeak.js.map +1 -1
  77. package/dist/react/primitive-hooks/useActionBarStopSpeaking.js +1 -1
  78. package/dist/react/primitive-hooks/useActionBarStopSpeaking.js.map +1 -1
  79. package/dist/react/primitive-hooks/useBranchPickerNext.js +1 -1
  80. package/dist/react/primitive-hooks/useBranchPickerNext.js.map +1 -1
  81. package/dist/react/primitive-hooks/useBranchPickerPrevious.js +1 -1
  82. package/dist/react/primitive-hooks/useBranchPickerPrevious.js.map +1 -1
  83. package/dist/react/primitive-hooks/useComposerAddAttachment.js +1 -1
  84. package/dist/react/primitive-hooks/useComposerAddAttachment.js.map +1 -1
  85. package/dist/react/primitive-hooks/useComposerCancel.js +1 -1
  86. package/dist/react/primitive-hooks/useComposerCancel.js.map +1 -1
  87. package/dist/react/primitive-hooks/useComposerDictate.js +1 -1
  88. package/dist/react/primitive-hooks/useComposerDictate.js.map +1 -1
  89. package/dist/react/primitive-hooks/useComposerSend.js +1 -1
  90. package/dist/react/primitive-hooks/useComposerSend.js.map +1 -1
  91. package/dist/react/primitive-hooks/useEditComposerCancel.js +1 -1
  92. package/dist/react/primitive-hooks/useEditComposerCancel.js.map +1 -1
  93. package/dist/react/primitive-hooks/useEditComposerSend.js +1 -1
  94. package/dist/react/primitive-hooks/useEditComposerSend.js.map +1 -1
  95. package/dist/react/primitive-hooks/useMessageBranching.js +1 -1
  96. package/dist/react/primitive-hooks/useMessageBranching.js.map +1 -1
  97. package/dist/react/primitive-hooks/useMessageReload.js +1 -1
  98. package/dist/react/primitive-hooks/useMessageReload.js.map +1 -1
  99. package/dist/react/primitive-hooks/useSuggestionTrigger.js +1 -1
  100. package/dist/react/primitive-hooks/useSuggestionTrigger.js.map +1 -1
  101. package/dist/react/primitive-hooks/useThreadListItemArchive.js +1 -1
  102. package/dist/react/primitive-hooks/useThreadListItemArchive.js.map +1 -1
  103. package/dist/react/primitive-hooks/useThreadListItemDelete.js +1 -1
  104. package/dist/react/primitive-hooks/useThreadListItemDelete.js.map +1 -1
  105. package/dist/react/primitive-hooks/useThreadListItemTrigger.js +1 -1
  106. package/dist/react/primitive-hooks/useThreadListItemTrigger.js.map +1 -1
  107. package/dist/react/primitive-hooks/useThreadListItemUnarchive.js +1 -1
  108. package/dist/react/primitive-hooks/useThreadListItemUnarchive.js.map +1 -1
  109. package/dist/react/primitive-hooks/useThreadListLoadMore.js +1 -1
  110. package/dist/react/primitive-hooks/useThreadListLoadMore.js.map +1 -1
  111. package/dist/react/primitive-hooks/useThreadListNew.js +1 -1
  112. package/dist/react/primitive-hooks/useThreadListNew.js.map +1 -1
  113. package/dist/react/primitive-hooks/useVoice.js +1 -1
  114. package/dist/react/primitive-hooks/useVoice.js.map +1 -1
  115. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.d.ts +1 -1
  116. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js +1 -1
  117. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js.map +1 -1
  118. package/dist/react/primitives/composer/ComposerAttachments.js +1 -1
  119. package/dist/react/primitives/composer/ComposerAttachments.js.map +1 -1
  120. package/dist/react/primitives/composer/ComposerQueue.js +1 -1
  121. package/dist/react/primitives/composer/ComposerQueue.js.map +1 -1
  122. package/dist/react/primitives/generativeUI/GenerativeUI.js +1 -1
  123. package/dist/react/primitives/generativeUI/GenerativeUI.js.map +1 -1
  124. package/dist/react/primitives/message/MessageAttachments.js +1 -1
  125. package/dist/react/primitives/message/MessageAttachments.js.map +1 -1
  126. package/dist/react/primitives/message/MessageGroupedParts.js +1 -1
  127. package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
  128. package/dist/react/primitives/message/MessageParts.d.ts +1 -1
  129. package/dist/react/primitives/message/MessageParts.js +1 -1
  130. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  131. package/dist/react/primitives/message/MessageQuote.js +1 -1
  132. package/dist/react/primitives/part/PartMessages.d.ts +2 -2
  133. package/dist/react/primitives/part/PartMessages.js +3 -3
  134. package/dist/react/primitives/part/PartMessages.js.map +1 -1
  135. package/dist/react/primitives/thread/ThreadMessages.js +1 -1
  136. package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
  137. package/dist/react/primitives/thread/ThreadSuggestions.js +1 -1
  138. package/dist/react/primitives/thread/ThreadSuggestions.js.map +1 -1
  139. package/dist/react/primitives/threadList/ThreadListItems.js +1 -1
  140. package/dist/react/primitives/threadList/ThreadListItems.js.map +1 -1
  141. package/dist/react/providers/AttachmentByIndexProvider.js.map +1 -1
  142. package/dist/react/providers/ChainOfThoughtByIndicesProvider.js.map +1 -1
  143. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.js.map +1 -1
  144. package/dist/react/providers/MessageByIndexProvider.js.map +1 -1
  145. package/dist/react/providers/PartByIndexProvider.js.map +1 -1
  146. package/dist/react/providers/QueueItemByIndexProvider.js.map +1 -1
  147. package/dist/react/providers/ReadonlyThreadProvider.js +1 -1
  148. package/dist/react/providers/ReadonlyThreadProvider.js.map +1 -1
  149. package/dist/react/providers/SuggestionByIndexProvider.js.map +1 -1
  150. package/dist/react/providers/TextMessagePartProvider.d.ts.map +1 -1
  151. package/dist/react/providers/TextMessagePartProvider.js +4 -3
  152. package/dist/react/providers/TextMessagePartProvider.js.map +1 -1
  153. package/dist/react/providers/ThreadListItemByIndexProvider.js.map +1 -1
  154. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +7 -0
  155. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  156. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +1 -1
  157. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  158. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +7 -0
  159. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  160. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +1 -1
  161. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  162. package/dist/react/runtimes/RuntimeAdapterProvider.js +1 -1
  163. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +1 -1
  164. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  165. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +1 -1
  166. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  167. package/dist/react/runtimes/createMessageConverter.d.ts +2 -2
  168. package/dist/react/runtimes/createMessageConverter.d.ts.map +1 -1
  169. package/dist/react/runtimes/createMessageConverter.js.map +1 -1
  170. package/dist/react/runtimes/external-message-converter.d.ts +4 -3
  171. package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
  172. package/dist/react/runtimes/external-message-converter.js +1 -1
  173. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  174. package/dist/react/runtimes/useExternalStoreRuntime.js +1 -1
  175. package/dist/react/runtimes/useExternalStoreSharedOptions.js +1 -1
  176. package/dist/react/runtimes/useLocalRuntime.d.ts +2 -1
  177. package/dist/react/runtimes/useLocalRuntime.d.ts.map +1 -1
  178. package/dist/react/runtimes/useLocalRuntime.js +4 -3
  179. package/dist/react/runtimes/useLocalRuntime.js.map +1 -1
  180. package/dist/react/runtimes/useRemoteThreadListRuntime.js +1 -1
  181. package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
  182. package/dist/react/utils/groupParts.d.ts +1 -1
  183. package/dist/react/utils/groupParts.js.map +1 -1
  184. package/dist/runtime/api/attachment-runtime.js.map +1 -1
  185. package/dist/runtime/api/composer-runtime.d.ts +8 -2
  186. package/dist/runtime/api/composer-runtime.d.ts.map +1 -1
  187. package/dist/runtime/api/composer-runtime.js +14 -0
  188. package/dist/runtime/api/composer-runtime.js.map +1 -1
  189. package/dist/runtime/api/message-part-runtime.js.map +1 -1
  190. package/dist/runtime/api/message-runtime.js +1 -1
  191. package/dist/runtime/api/message-runtime.js.map +1 -1
  192. package/dist/runtime/api/thread-list-item-runtime.js.map +1 -1
  193. package/dist/runtime/api/thread-runtime.d.ts +7 -0
  194. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  195. package/dist/runtime/api/thread-runtime.js.map +1 -1
  196. package/dist/runtime/base/base-composer-runtime-core.d.ts +4 -0
  197. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  198. package/dist/runtime/base/base-composer-runtime-core.js +7 -1
  199. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  200. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  201. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +4 -0
  202. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
  203. package/dist/runtime/base/default-thread-composer-runtime-core.js +17 -1
  204. package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
  205. package/dist/runtime/interfaces/composer-runtime-core.d.ts +6 -1
  206. package/dist/runtime/interfaces/composer-runtime-core.d.ts.map +1 -1
  207. package/dist/runtime/interfaces/thread-runtime-core.d.ts +4 -0
  208. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  209. package/dist/runtime/queue/external-thread-queue-adapter.d.ts +20 -0
  210. package/dist/runtime/queue/external-thread-queue-adapter.d.ts.map +1 -0
  211. package/dist/runtime/queue/external-thread-queue-adapter.js +0 -0
  212. package/dist/runtime/queue/message-queue.d.ts +20 -0
  213. package/dist/runtime/queue/message-queue.d.ts.map +1 -0
  214. package/dist/runtime/queue/message-queue.js +97 -0
  215. package/dist/runtime/queue/message-queue.js.map +1 -0
  216. package/dist/runtime/utils/message-repository.js.map +1 -1
  217. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  218. package/dist/runtimes/external-store/external-store-adapter.d.ts +3 -1
  219. package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
  220. package/dist/runtimes/external-store/external-store-runtime-core.js.map +1 -1
  221. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +4 -0
  222. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  223. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +20 -2
  224. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  225. package/dist/runtimes/local/local-runtime-core.js.map +1 -1
  226. package/dist/runtimes/local/local-runtime-options.d.ts +5 -0
  227. package/dist/runtimes/local/local-runtime-options.d.ts.map +1 -1
  228. package/dist/runtimes/local/local-thread-runtime-core.d.ts +7 -0
  229. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  230. package/dist/runtimes/local/local-thread-runtime-core.js +45 -0
  231. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  232. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +3 -0
  233. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
  234. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js +3 -0
  235. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js.map +1 -1
  236. package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts.map +1 -1
  237. package/dist/runtimes/remote-thread-list/empty-thread-core.js +3 -0
  238. package/dist/runtimes/remote-thread-list/empty-thread-core.js.map +1 -1
  239. package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
  240. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  241. package/dist/store/clients/chain-of-thought-client.d.ts.map +1 -1
  242. package/dist/store/clients/chain-of-thought-client.js +6 -5
  243. package/dist/store/clients/chain-of-thought-client.js.map +1 -1
  244. package/dist/store/clients/model-context-client.d.ts.map +1 -1
  245. package/dist/store/clients/model-context-client.js +6 -5
  246. package/dist/store/clients/model-context-client.js.map +1 -1
  247. package/dist/store/clients/no-op-composer-client.d.ts.map +1 -1
  248. package/dist/store/clients/no-op-composer-client.js +4 -3
  249. package/dist/store/clients/no-op-composer-client.js.map +1 -1
  250. package/dist/store/clients/runtime-adapter.d.ts.map +1 -1
  251. package/dist/store/clients/runtime-adapter.js +7 -6
  252. package/dist/store/clients/runtime-adapter.js.map +1 -1
  253. package/dist/store/clients/suggestions.d.ts.map +1 -1
  254. package/dist/store/clients/suggestions.js +7 -6
  255. package/dist/store/clients/suggestions.js.map +1 -1
  256. package/dist/store/clients/thread-message-client.d.ts.map +1 -1
  257. package/dist/store/clients/thread-message-client.js +13 -12
  258. package/dist/store/clients/thread-message-client.js.map +1 -1
  259. package/dist/store/index.d.ts +1 -1
  260. package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -1
  261. package/dist/store/runtime-clients/attachment-runtime-client.js +3 -3
  262. package/dist/store/runtime-clients/attachment-runtime-client.js.map +1 -1
  263. package/dist/store/runtime-clients/composer-runtime-client.d.ts +12 -5
  264. package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
  265. package/dist/store/runtime-clients/composer-runtime-client.js +32 -16
  266. package/dist/store/runtime-clients/composer-runtime-client.js.map +1 -1
  267. package/dist/store/runtime-clients/message-part-runtime-client.d.ts.map +1 -1
  268. package/dist/store/runtime-clients/message-part-runtime-client.js +3 -3
  269. package/dist/store/runtime-clients/message-part-runtime-client.js.map +1 -1
  270. package/dist/store/runtime-clients/message-runtime-client.d.ts +6 -3
  271. package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
  272. package/dist/store/runtime-clients/message-runtime-client.js +17 -16
  273. package/dist/store/runtime-clients/message-runtime-client.js.map +1 -1
  274. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  275. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +8 -7
  276. package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
  277. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  278. package/dist/store/runtime-clients/thread-list-runtime-client.js +11 -10
  279. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  280. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  281. package/dist/store/runtime-clients/thread-runtime-client.js +15 -14
  282. package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
  283. package/dist/store/runtime-clients/useSubscribable.d.ts +7 -0
  284. package/dist/store/runtime-clients/useSubscribable.d.ts.map +1 -0
  285. package/dist/store/runtime-clients/useSubscribable.js +16 -0
  286. package/dist/store/runtime-clients/useSubscribable.js.map +1 -0
  287. package/dist/store/scope-registration.d.ts +1 -1
  288. package/dist/store/scopes/composer.d.ts +1 -1
  289. package/dist/store/scopes/queue-item.d.ts +2 -1
  290. package/dist/store/scopes/queue-item.d.ts.map +1 -1
  291. package/dist/store/scopes/queue-item.js +6 -0
  292. package/dist/store/scopes/queue-item.js.map +1 -0
  293. package/dist/store/scopes/thread.d.ts +1 -1
  294. package/dist/store/scopes/threads.d.ts +1 -1
  295. package/dist/types/message.d.ts +2 -1
  296. package/dist/types/message.d.ts.map +1 -1
  297. package/dist/types/message.js.map +1 -1
  298. package/dist/utils/composite-context-provider.d.ts +1 -1
  299. package/dist/utils/composite-context-provider.js +3 -1
  300. package/dist/utils/composite-context-provider.js.map +1 -1
  301. package/dist/utils/json/is-json.js.map +1 -1
  302. package/dist/utils/text.js.map +1 -1
  303. package/package.json +14 -10
  304. package/src/adapters/attachment.ts +24 -4
  305. package/src/index.ts +8 -0
  306. package/src/react/RuntimeAdapter.ts +6 -4
  307. package/src/react/client/DataRenderers.ts +48 -42
  308. package/src/react/client/Interactables.ts +263 -267
  309. package/src/react/client/Tools.ts +122 -129
  310. package/src/react/index.ts +3 -1
  311. package/src/react/model-context/define-toolkit.test.ts +14 -7
  312. package/src/react/model-context/define-toolkit.ts +18 -19
  313. package/src/react/model-context/external-tool.ts +16 -0
  314. package/src/react/model-context/{hitl.ts → human-tool.ts} +13 -8
  315. package/src/react/model-context/toolbox.ts +3 -3
  316. package/src/react/primitives/message/MessageGroupedParts.tsx +1 -1
  317. package/src/react/primitives/part/PartMessages.tsx +2 -2
  318. package/src/react/providers/TextMessagePartProvider.tsx +31 -32
  319. package/src/react/runtimes/createMessageConverter.ts +2 -1
  320. package/src/react/runtimes/external-message-converter.ts +5 -3
  321. package/src/react/runtimes/useLocalRuntime.ts +2 -0
  322. package/src/runtime/api/composer-runtime.ts +26 -0
  323. package/src/runtime/base/base-composer-runtime-core.ts +11 -0
  324. package/src/runtime/base/default-thread-composer-runtime-core.ts +22 -0
  325. package/src/runtime/interfaces/composer-runtime-core.ts +7 -0
  326. package/src/runtime/interfaces/thread-runtime-core.ts +5 -0
  327. package/src/runtime/queue/external-thread-queue-adapter.ts +14 -0
  328. package/src/runtime/queue/message-queue.ts +128 -0
  329. package/src/runtimes/external-store/external-store-adapter.ts +3 -0
  330. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +31 -2
  331. package/src/runtimes/local/local-runtime-options.ts +6 -0
  332. package/src/runtimes/local/local-thread-runtime-core.ts +70 -0
  333. package/src/runtimes/readonly/ReadonlyThreadRuntimeCore.ts +4 -0
  334. package/src/runtimes/remote-thread-list/empty-thread-core.ts +4 -0
  335. package/src/store/clients/chain-of-thought-client.ts +24 -25
  336. package/src/store/clients/model-context-client.ts +22 -19
  337. package/src/store/clients/no-op-composer-client.ts +69 -66
  338. package/src/store/clients/runtime-adapter.ts +9 -6
  339. package/src/store/clients/suggestions.ts +41 -40
  340. package/src/store/clients/thread-message-client.ts +127 -132
  341. package/src/store/runtime-clients/attachment-runtime-client.ts +7 -3
  342. package/src/store/runtime-clients/composer-runtime-client.ts +142 -113
  343. package/src/store/runtime-clients/message-part-runtime-client.ts +16 -14
  344. package/src/store/runtime-clients/message-runtime-client.ts +124 -122
  345. package/src/store/runtime-clients/thread-list-item-runtime-client.ts +44 -45
  346. package/src/store/runtime-clients/thread-list-runtime-client.ts +83 -80
  347. package/src/store/runtime-clients/thread-runtime-client.ts +113 -119
  348. package/src/store/runtime-clients/{tap-subscribable.ts → useSubscribable.ts} +4 -4
  349. package/src/store/scopes/queue-item.ts +2 -0
  350. package/src/tests/attachment-adapters.test.ts +86 -0
  351. package/src/tests/external-store-thread-runtime-core.test.ts +125 -0
  352. package/src/tests/message-queue.test.ts +168 -0
  353. package/src/types/message.ts +2 -0
  354. package/src/utils/composite-context-provider.ts +3 -1
  355. package/dist/react/model-context/hitl.d.ts +0 -23
  356. package/dist/react/model-context/hitl.d.ts.map +0 -1
  357. package/dist/react/model-context/hitl.js +0 -26
  358. package/dist/react/model-context/hitl.js.map +0 -1
  359. package/dist/store/runtime-clients/tap-subscribable.d.ts +0 -7
  360. package/dist/store/runtime-clients/tap-subscribable.d.ts.map +0 -1
  361. package/dist/store/runtime-clients/tap-subscribable.js +0 -16
  362. package/dist/store/runtime-clients/tap-subscribable.js.map +0 -1
@@ -3,6 +3,7 @@ import { ExternalStoreThreadRuntimeCore } from "../runtimes/external-store/exter
3
3
  import type { ExternalStoreAdapter } from "../runtimes/external-store/external-store-adapter";
4
4
  import type { ModelContextProvider } from "../model-context/types";
5
5
  import type { ThreadMessageLike } from "../runtime/utils/thread-message-like";
6
+ import type { AppendMessage } from "../types/message";
6
7
 
7
8
  const mockContextProvider: ModelContextProvider = {
8
9
  getModelContext: () => ({}),
@@ -379,3 +380,127 @@ describe("ExternalStoreThreadRuntimeCore - initialize event replay", () => {
379
380
  expect(callback).not.toHaveBeenCalled();
380
381
  });
381
382
  });
383
+
384
+ describe("ExternalStoreThreadRuntimeCore - message queue", () => {
385
+ const makeQueue = () => ({
386
+ items: [] as never[],
387
+ enqueue: vi.fn(),
388
+ steer: vi.fn(),
389
+ remove: vi.fn(),
390
+ clear: vi.fn(),
391
+ });
392
+
393
+ const appendMessage = (
394
+ overrides?: Partial<AppendMessage>,
395
+ ): AppendMessage => ({
396
+ role: "user",
397
+ content: [{ type: "text", text: "hello" }],
398
+ attachments: [],
399
+ createdAt: new Date(0),
400
+ parentId: null,
401
+ sourceId: null,
402
+ runConfig: {},
403
+ metadata: { custom: {} },
404
+ ...overrides,
405
+ });
406
+
407
+ it("exposes capabilities.queue from adapter presence", () => {
408
+ const withQueue = new ExternalStoreThreadRuntimeCore(
409
+ mockContextProvider,
410
+ makeStore({ queue: makeQueue() }),
411
+ );
412
+ expect(withQueue.capabilities.queue).toBe(true);
413
+
414
+ const withoutQueue = new ExternalStoreThreadRuntimeCore(
415
+ mockContextProvider,
416
+ makeStore(),
417
+ );
418
+ expect(withoutQueue.capabilities.queue).toBe(false);
419
+ });
420
+
421
+ it("routes a tail append through queue.enqueue instead of onNew", async () => {
422
+ const queue = makeQueue();
423
+ const onNew = vi.fn();
424
+ const runtime = new ExternalStoreThreadRuntimeCore(
425
+ mockContextProvider,
426
+ makeStore({ queue, onNew }),
427
+ );
428
+
429
+ await runtime.append(appendMessage({ steer: true }));
430
+
431
+ expect(onNew).not.toHaveBeenCalled();
432
+ expect(queue.enqueue).toHaveBeenCalledTimes(1);
433
+ expect(queue.enqueue.mock.calls[0]![1]).toEqual({ steer: true });
434
+ });
435
+
436
+ it("does not abort in-flight tools when buffering a queued send", async () => {
437
+ const queue = makeQueue();
438
+ const runtime = new ExternalStoreThreadRuntimeCore(
439
+ mockContextProvider,
440
+ makeStore({ queue, onNew: vi.fn() }),
441
+ );
442
+ const abort = vi.fn();
443
+ (runtime as unknown as { _toolInvocations: unknown })._toolInvocations = {
444
+ abort,
445
+ };
446
+
447
+ await runtime.append(appendMessage());
448
+
449
+ expect(queue.enqueue).toHaveBeenCalledTimes(1);
450
+ expect(abort).not.toHaveBeenCalled();
451
+ });
452
+
453
+ it("aborts in-flight tools when a send actually starts a run", async () => {
454
+ const runtime = new ExternalStoreThreadRuntimeCore(
455
+ mockContextProvider,
456
+ makeStore({ onNew: vi.fn() }),
457
+ );
458
+ const abort = vi.fn();
459
+ (runtime as unknown as { _toolInvocations: unknown })._toolInvocations = {
460
+ abort,
461
+ };
462
+
463
+ await runtime.append(appendMessage());
464
+
465
+ expect(abort).toHaveBeenCalledTimes(1);
466
+ });
467
+
468
+ it("clears the queue on cancel, reload, and edit", async () => {
469
+ const queue = makeQueue();
470
+ const runtime = new ExternalStoreThreadRuntimeCore(
471
+ mockContextProvider,
472
+ makeStore({
473
+ queue,
474
+ onCancel: vi.fn(),
475
+ onReload: vi.fn(),
476
+ onEdit: vi.fn(),
477
+ }),
478
+ );
479
+
480
+ runtime.cancelRun();
481
+ expect(queue.clear).toHaveBeenCalledWith("cancel-run");
482
+
483
+ await runtime.startRun({ parentId: null, sourceId: null, runConfig: {} });
484
+ expect(queue.clear).toHaveBeenCalledWith("reload");
485
+
486
+ // a non-tail parentId routes to the edit branch
487
+ await runtime.append(appendMessage({ parentId: "not-the-tail" }));
488
+ expect(queue.clear).toHaveBeenCalledWith("edit");
489
+ });
490
+
491
+ it("delegates getQueueItems / steer / remove to the adapter", () => {
492
+ const queue = makeQueue();
493
+ const items = [{ id: "q1", prompt: "queued" }];
494
+ queue.items = items as never;
495
+ const runtime = new ExternalStoreThreadRuntimeCore(
496
+ mockContextProvider,
497
+ makeStore({ queue }),
498
+ );
499
+
500
+ expect(runtime.getQueueItems()).toBe(items);
501
+ runtime.steerQueueItem("q1");
502
+ runtime.removeQueueItem("q1");
503
+ expect(queue.steer).toHaveBeenCalledWith("q1");
504
+ expect(queue.remove).toHaveBeenCalledWith("q1");
505
+ });
506
+ });
@@ -0,0 +1,168 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { createMessageQueue } from "../runtime/queue/message-queue";
3
+ import type { AppendMessage } from "../types/message";
4
+
5
+ const msg = (text: string, extra?: Partial<AppendMessage>): AppendMessage => ({
6
+ role: "user",
7
+ content: [{ type: "text", text }],
8
+ attachments: [],
9
+ createdAt: new Date(0),
10
+ parentId: null,
11
+ sourceId: null,
12
+ runConfig: {},
13
+ metadata: { custom: {} },
14
+ ...extra,
15
+ });
16
+
17
+ describe("createMessageQueue", () => {
18
+ it("runs immediately when idle and holds while running", () => {
19
+ const run = vi.fn();
20
+ const { adapter, notifyIdle } = createMessageQueue({ run });
21
+
22
+ adapter.enqueue(msg("first"), { steer: false });
23
+ expect(run).toHaveBeenCalledTimes(1);
24
+ expect(adapter.items).toHaveLength(0);
25
+
26
+ adapter.enqueue(msg("second"), { steer: false });
27
+ expect(run).toHaveBeenCalledTimes(1);
28
+ expect(adapter.items.map((i) => i.prompt)).toEqual(["second"]);
29
+
30
+ notifyIdle();
31
+ expect(run).toHaveBeenCalledTimes(2);
32
+ expect(adapter.items).toHaveLength(0);
33
+ });
34
+
35
+ it("drains FIFO across multiple queued messages", () => {
36
+ const order: string[] = [];
37
+ const run = vi.fn((m: AppendMessage) =>
38
+ order.push((m.content[0] as { text: string }).text),
39
+ );
40
+ const { adapter, notifyIdle } = createMessageQueue({ run });
41
+
42
+ adapter.enqueue(msg("a"), { steer: false }); // runs now
43
+ adapter.enqueue(msg("b"), { steer: false });
44
+ adapter.enqueue(msg("c"), { steer: false });
45
+ expect(adapter.items.map((i) => i.prompt)).toEqual(["b", "c"]);
46
+
47
+ notifyIdle();
48
+ notifyIdle();
49
+ expect(order).toEqual(["a", "b", "c"]);
50
+ });
51
+
52
+ it("hands the full original AppendMessage to the driver", () => {
53
+ const run = vi.fn();
54
+ const { adapter, notifyIdle } = createMessageQueue({ run });
55
+ const attachments = [{ id: "x" }] as never;
56
+ const runConfig = { custom: { k: 1 } };
57
+
58
+ adapter.enqueue(msg("busy"), { steer: false });
59
+ adapter.enqueue(msg("queued", { attachments, runConfig }), {
60
+ steer: false,
61
+ });
62
+ notifyIdle();
63
+
64
+ expect(run).toHaveBeenLastCalledWith(
65
+ expect.objectContaining({ attachments, runConfig }),
66
+ { steer: false },
67
+ );
68
+ });
69
+
70
+ it("removes a queued message before it runs", () => {
71
+ const run = vi.fn();
72
+ const { adapter, notifyIdle } = createMessageQueue({ run });
73
+
74
+ adapter.enqueue(msg("a"), { steer: false }); // runs now
75
+ adapter.enqueue(msg("b"), { steer: false });
76
+ adapter.enqueue(msg("c"), { steer: false });
77
+
78
+ adapter.remove(adapter.items[0]!.id); // remove "b"
79
+ expect(adapter.items.map((i) => i.prompt)).toEqual(["c"]);
80
+
81
+ notifyIdle();
82
+ expect(run).toHaveBeenLastCalledWith(
83
+ expect.objectContaining({ content: [{ type: "text", text: "c" }] }),
84
+ { steer: false },
85
+ );
86
+ });
87
+
88
+ it("clear() empties pending items", () => {
89
+ const run = vi.fn();
90
+ const { adapter } = createMessageQueue({ run });
91
+ adapter.enqueue(msg("a"), { steer: false });
92
+ adapter.enqueue(msg("b"), { steer: false });
93
+ adapter.clear("cancel-run");
94
+ expect(adapter.items).toHaveLength(0);
95
+ });
96
+
97
+ it("steers via cancel and suppresses the cancelled run's idle (no double-dequeue)", () => {
98
+ const run = vi.fn();
99
+ const cancel = vi.fn();
100
+ const { adapter, notifyIdle } = createMessageQueue({ run, cancel });
101
+
102
+ adapter.enqueue(msg("a"), { steer: false }); // running
103
+ adapter.enqueue(msg("b"), { steer: false }); // queued
104
+ adapter.enqueue(msg("steer-me"), { steer: true });
105
+
106
+ expect(cancel).toHaveBeenCalledTimes(1);
107
+ expect(run).toHaveBeenLastCalledWith(
108
+ expect.objectContaining({
109
+ content: [{ type: "text", text: "steer-me" }],
110
+ }),
111
+ { steer: true },
112
+ );
113
+ const runsAfterSteer = run.mock.calls.length;
114
+
115
+ // the cancelled run's settle must NOT advance the queue
116
+ notifyIdle();
117
+ expect(run).toHaveBeenCalledTimes(runsAfterSteer);
118
+
119
+ // the steered run's real settle drains the rest
120
+ notifyIdle();
121
+ expect(run).toHaveBeenLastCalledWith(
122
+ expect.objectContaining({ content: [{ type: "text", text: "b" }] }),
123
+ { steer: false },
124
+ );
125
+ });
126
+
127
+ it("degrades steer to run-next when no cancel is available", () => {
128
+ const run = vi.fn();
129
+ const { adapter, notifyIdle } = createMessageQueue({ run }); // no cancel
130
+
131
+ adapter.enqueue(msg("a"), { steer: false }); // running
132
+ adapter.enqueue(msg("b"), { steer: false });
133
+ adapter.enqueue(msg("urgent"), { steer: true });
134
+
135
+ // no interrupt: "urgent" jumps the queue ahead of "b"
136
+ expect(adapter.items.map((i) => i.prompt)).toEqual(["urgent", "b"]);
137
+
138
+ notifyIdle();
139
+ expect(run).toHaveBeenLastCalledWith(
140
+ expect.objectContaining({ content: [{ type: "text", text: "urgent" }] }),
141
+ { steer: false },
142
+ );
143
+ });
144
+
145
+ it("notifies subscribers on item changes", () => {
146
+ const run = vi.fn();
147
+ const { adapter, subscribe } = createMessageQueue({ run });
148
+ const cb = vi.fn();
149
+ subscribe(cb);
150
+
151
+ adapter.enqueue(msg("a"), { steer: false }); // runs (1 setItems push + 1 pop)
152
+ expect(cb).toHaveBeenCalled();
153
+ });
154
+
155
+ it("buffers when a run started outside the queue is marked busy", () => {
156
+ const run = vi.fn();
157
+ const { adapter, notifyBusy, notifyIdle } = createMessageQueue({ run });
158
+
159
+ notifyBusy(); // e.g. a regenerate started without going through the queue
160
+ adapter.enqueue(msg("a"), { steer: false });
161
+ expect(run).not.toHaveBeenCalled();
162
+ expect(adapter.items.map((i) => i.prompt)).toEqual(["a"]);
163
+
164
+ notifyIdle(); // that run settled
165
+ expect(run).toHaveBeenCalledTimes(1);
166
+ expect(adapter.items).toHaveLength(0);
167
+ });
168
+ });
@@ -354,4 +354,6 @@ export type AppendMessage = Omit<ThreadMessage, "id"> & {
354
354
  sourceId: string | null;
355
355
  runConfig: RunConfig | undefined;
356
356
  startRun?: boolean | undefined;
357
+ /** Process this message next; only meaningful for queue-capable runtimes. */
358
+ steer?: boolean | undefined;
357
359
  };
@@ -31,6 +31,8 @@ export class CompositeContextProvider implements ModelContextProvider {
31
31
 
32
32
  subscribe(callback: () => void) {
33
33
  this._subscribers.add(callback);
34
- return () => this._subscribers.delete(callback);
34
+ return () => {
35
+ this._subscribers.delete(callback);
36
+ };
35
37
  }
36
38
  }
@@ -1,23 +0,0 @@
1
- //#region src/react/model-context/hitl.d.ts
2
- /**
3
- * Marks a tool as **human-in-the-loop**: the agent pauses and the UI (`render`)
4
- * supplies the result instead of code. Use it as the tool's `execute`:
5
- *
6
- * ```tsx
7
- * confirm: { execute: hitlTool(), render: (props) => <Confirm {...props} /> }
8
- * ```
9
- *
10
- * Like {@link defineToolkit}, it has **no runtime implementation**: a
11
- * `"use generative"` compiler (e.g. `@assistant-ui/next` or `@assistant-ui/vite`)
12
- * detects `execute: hitlTool()`, drops it, and stamps the tool `type: "human"`.
13
- * Reaching it at runtime means the module wasn't compiled (used outside a
14
- * `"use generative"` file), so it throws.
15
- */
16
- declare function hitlTool(): never;
17
- /**
18
- * @deprecated Use {@link hitlTool}.
19
- */
20
- declare const hitl: typeof hitlTool;
21
- //#endregion
22
- export { hitl, hitlTool };
23
- //# sourceMappingURL=hitl.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hitl.d.ts","names":[],"sources":["../../../src/react/model-context/hitl.ts"],"mappings":";;AAcA;;;;AAAwB;AAYxB;;;;AAA4B;;;;iBAZZ,QAAA;;;;cAYH,IAAA,SAAI,QAAW"}
@@ -1,26 +0,0 @@
1
- //#region src/react/model-context/hitl.ts
2
- /**
3
- * Marks a tool as **human-in-the-loop**: the agent pauses and the UI (`render`)
4
- * supplies the result instead of code. Use it as the tool's `execute`:
5
- *
6
- * ```tsx
7
- * confirm: { execute: hitlTool(), render: (props) => <Confirm {...props} /> }
8
- * ```
9
- *
10
- * Like {@link defineToolkit}, it has **no runtime implementation**: a
11
- * `"use generative"` compiler (e.g. `@assistant-ui/next` or `@assistant-ui/vite`)
12
- * detects `execute: hitlTool()`, drops it, and stamps the tool `type: "human"`.
13
- * Reaching it at runtime means the module wasn't compiled (used outside a
14
- * `"use generative"` file), so it throws.
15
- */
16
- function hitlTool() {
17
- throw new Error("[assistant-ui] hitlTool() has no runtime implementation — it marks a human-in-the-loop tool and is stripped at build time by the use-generative compiler. Reaching it means this module was not compiled (e.g. hitlTool() used outside a \"use generative\" file).");
18
- }
19
- /**
20
- * @deprecated Use {@link hitlTool}.
21
- */
22
- const hitl = hitlTool;
23
- //#endregion
24
- export { hitl, hitlTool };
25
-
26
- //# sourceMappingURL=hitl.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hitl.js","names":[],"sources":["../../../src/react/model-context/hitl.ts"],"sourcesContent":["/**\n * Marks a tool as **human-in-the-loop**: the agent pauses and the UI (`render`)\n * supplies the result instead of code. Use it as the tool's `execute`:\n *\n * ```tsx\n * confirm: { execute: hitlTool(), render: (props) => <Confirm {...props} /> }\n * ```\n *\n * Like {@link defineToolkit}, it has **no runtime implementation**: a\n * `\"use generative\"` compiler (e.g. `@assistant-ui/next` or `@assistant-ui/vite`)\n * detects `execute: hitlTool()`, drops it, and stamps the tool `type: \"human\"`.\n * Reaching it at runtime means the module wasn't compiled (used outside a\n * `\"use generative\"` file), so it throws.\n */\nexport function hitlTool(): never {\n throw new Error(\n \"[assistant-ui] hitlTool() has no runtime implementation — it marks a \" +\n \"human-in-the-loop tool and is stripped at build time by the \" +\n \"use-generative compiler. Reaching it means this module was not compiled \" +\n '(e.g. hitlTool() used outside a \"use generative\" file).',\n );\n}\n\n/**\n * @deprecated Use {@link hitlTool}.\n */\nexport const hitl = hitlTool;\n"],"mappings":";;;;;;;;;;;;;;;AAcA,SAAgB,WAAkB;CAChC,MAAM,IAAI,MACR,oQAIF;AACF;;;;AAKA,MAAa,OAAO"}
@@ -1,7 +0,0 @@
1
- import { SubscribableWithState } from "../../subscribable/subscribable.js";
2
-
3
- //#region src/store/runtime-clients/tap-subscribable.d.ts
4
- declare const tapSubscribable: <T>(subscribable: Omit<SubscribableWithState<T, any>, "path">) => T;
5
- //#endregion
6
- export { tapSubscribable };
7
- //# sourceMappingURL=tap-subscribable.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tap-subscribable.d.ts","names":[],"sources":["../../../src/store/runtime-clients/tap-subscribable.ts"],"mappings":";;;cAGa,eAAA,MACX,YAAA,EAAc,IAAA,CAAK,qBAAA,CAAsB,CAAA,oBAAgB,CAAA"}
@@ -1,16 +0,0 @@
1
- import { tapEffect, tapState } from "@assistant-ui/tap";
2
- //#region src/store/runtime-clients/tap-subscribable.ts
3
- const tapSubscribable = (subscribable) => {
4
- const [, setState] = tapState(subscribable.getState);
5
- tapEffect(() => {
6
- setState(subscribable.getState());
7
- return subscribable.subscribe(() => {
8
- setState(subscribable.getState());
9
- });
10
- }, [subscribable]);
11
- return subscribable.getState();
12
- };
13
- //#endregion
14
- export { tapSubscribable };
15
-
16
- //# sourceMappingURL=tap-subscribable.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tap-subscribable.js","names":[],"sources":["../../../src/store/runtime-clients/tap-subscribable.ts"],"sourcesContent":["import { tapState, tapEffect } from \"@assistant-ui/tap\";\nimport type { SubscribableWithState } from \"../../subscribable/subscribable\";\n\nexport const tapSubscribable = <T>(\n subscribable: Omit<SubscribableWithState<T, any>, \"path\">,\n) => {\n const [, setState] = tapState(subscribable.getState);\n tapEffect(() => {\n setState(subscribable.getState());\n return subscribable.subscribe(() => {\n setState(subscribable.getState());\n });\n }, [subscribable]);\n\n return subscribable.getState();\n};\n"],"mappings":";;AAGA,MAAa,mBACX,iBACG;CACH,MAAM,GAAG,YAAY,SAAS,aAAa,QAAQ;CACnD,gBAAgB;EACd,SAAS,aAAa,SAAS,CAAC;EAChC,OAAO,aAAa,gBAAgB;GAClC,SAAS,aAAa,SAAS,CAAC;EAClC,CAAC;CACH,GAAG,CAAC,YAAY,CAAC;CAEjB,OAAO,aAAa,SAAS;AAC/B"}