@assistant-ui/core 0.2.9 → 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 (437) 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/tool.d.ts +1 -1
  14. package/dist/model-context/tool.js +1 -1
  15. package/dist/model-context/tool.js.map +1 -1
  16. package/dist/model-context/types.js +17 -2
  17. package/dist/model-context/types.js.map +1 -1
  18. package/dist/react/AssistantProvider.js +1 -1
  19. package/dist/react/AssistantRuntimeProvider.d.ts +1 -1
  20. package/dist/react/AssistantRuntimeProvider.d.ts.map +1 -1
  21. package/dist/react/AssistantRuntimeProvider.js +1 -1
  22. package/dist/react/RuntimeAdapter.js +4 -2
  23. package/dist/react/RuntimeAdapter.js.map +1 -1
  24. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
  25. package/dist/react/adapters/LocalStorageThreadListAdapter.js +13 -3
  26. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  27. package/dist/react/client/DataRenderers.d.ts.map +1 -1
  28. package/dist/react/client/DataRenderers.js +6 -5
  29. package/dist/react/client/DataRenderers.js.map +1 -1
  30. package/dist/react/client/Interactables.d.ts.map +1 -1
  31. package/dist/react/client/Interactables.js +30 -29
  32. package/dist/react/client/Interactables.js.map +1 -1
  33. package/dist/react/client/Tools.d.ts.map +1 -1
  34. package/dist/react/client/Tools.js +19 -12
  35. package/dist/react/client/Tools.js.map +1 -1
  36. package/dist/react/index.d.ts +10 -5
  37. package/dist/react/index.js +7 -2
  38. package/dist/react/model-context/define-mcp-toolkit.d.ts +12 -0
  39. package/dist/react/model-context/define-mcp-toolkit.d.ts.map +1 -0
  40. package/dist/react/model-context/define-mcp-toolkit.js +14 -0
  41. package/dist/react/model-context/define-mcp-toolkit.js.map +1 -0
  42. package/dist/react/model-context/define-toolkit.d.ts +10 -12
  43. package/dist/react/model-context/define-toolkit.d.ts.map +1 -1
  44. package/dist/react/model-context/define-toolkit.js +2 -15
  45. package/dist/react/model-context/define-toolkit.js.map +1 -1
  46. package/dist/react/model-context/external-tool.d.ts +14 -0
  47. package/dist/react/model-context/external-tool.d.ts.map +1 -0
  48. package/dist/react/model-context/external-tool.js +17 -0
  49. package/dist/react/model-context/external-tool.js.map +1 -0
  50. package/dist/react/model-context/human-tool.d.ts +27 -0
  51. package/dist/react/model-context/human-tool.d.ts.map +1 -0
  52. package/dist/react/model-context/human-tool.js +30 -0
  53. package/dist/react/model-context/human-tool.js.map +1 -0
  54. package/dist/react/model-context/makeAssistantTool.d.ts +8 -0
  55. package/dist/react/model-context/makeAssistantTool.d.ts.map +1 -1
  56. package/dist/react/model-context/makeAssistantTool.js +4 -0
  57. package/dist/react/model-context/makeAssistantTool.js.map +1 -1
  58. package/dist/react/model-context/makeAssistantToolUI.d.ts +8 -0
  59. package/dist/react/model-context/makeAssistantToolUI.d.ts.map +1 -1
  60. package/dist/react/model-context/makeAssistantToolUI.js +4 -0
  61. package/dist/react/model-context/makeAssistantToolUI.js.map +1 -1
  62. package/dist/react/model-context/provider-tool.d.ts +15 -0
  63. package/dist/react/model-context/provider-tool.d.ts.map +1 -0
  64. package/dist/react/model-context/provider-tool.js +12 -0
  65. package/dist/react/model-context/provider-tool.js.map +1 -0
  66. package/dist/react/model-context/stub-tool.d.ts +12 -0
  67. package/dist/react/model-context/stub-tool.d.ts.map +1 -0
  68. package/dist/react/model-context/stub-tool.js +15 -0
  69. package/dist/react/model-context/stub-tool.js.map +1 -0
  70. package/dist/react/model-context/toolbox.d.ts +64 -17
  71. package/dist/react/model-context/toolbox.d.ts.map +1 -1
  72. package/dist/react/model-context/toolbox.js +19 -1
  73. package/dist/react/model-context/toolbox.js.map +1 -1
  74. package/dist/react/model-context/useAssistantContext.js +1 -1
  75. package/dist/react/model-context/useAssistantContext.js.map +1 -1
  76. package/dist/react/model-context/useAssistantDataUI.js +1 -1
  77. package/dist/react/model-context/useAssistantDataUI.js.map +1 -1
  78. package/dist/react/model-context/useAssistantInstructions.js +1 -1
  79. package/dist/react/model-context/useAssistantInstructions.js.map +1 -1
  80. package/dist/react/model-context/useAssistantInteractable.js +1 -1
  81. package/dist/react/model-context/useAssistantInteractable.js.map +1 -1
  82. package/dist/react/model-context/useAssistantTool.d.ts +11 -1
  83. package/dist/react/model-context/useAssistantTool.d.ts.map +1 -1
  84. package/dist/react/model-context/useAssistantTool.js +12 -6
  85. package/dist/react/model-context/useAssistantTool.js.map +1 -1
  86. package/dist/react/model-context/useAssistantToolUI.d.ts +13 -4
  87. package/dist/react/model-context/useAssistantToolUI.d.ts.map +1 -1
  88. package/dist/react/model-context/useAssistantToolUI.js +7 -4
  89. package/dist/react/model-context/useAssistantToolUI.js.map +1 -1
  90. package/dist/react/model-context/useAuiToolOverrides.d.ts +22 -0
  91. package/dist/react/model-context/useAuiToolOverrides.d.ts.map +1 -0
  92. package/dist/react/model-context/useAuiToolOverrides.js +31 -0
  93. package/dist/react/model-context/useAuiToolOverrides.js.map +1 -0
  94. package/dist/react/model-context/useInlineRender.js +1 -1
  95. package/dist/react/model-context/useInlineRender.js.map +1 -1
  96. package/dist/react/model-context/useInteractableState.js +1 -1
  97. package/dist/react/model-context/useInteractableState.js.map +1 -1
  98. package/dist/react/model-context/useToolArgsStatus.js +1 -1
  99. package/dist/react/primitive-hooks/useActionBarCopy.js +1 -1
  100. package/dist/react/primitive-hooks/useActionBarCopy.js.map +1 -1
  101. package/dist/react/primitive-hooks/useActionBarEdit.js +1 -1
  102. package/dist/react/primitive-hooks/useActionBarEdit.js.map +1 -1
  103. package/dist/react/primitive-hooks/useActionBarFeedback.js +1 -1
  104. package/dist/react/primitive-hooks/useActionBarFeedback.js.map +1 -1
  105. package/dist/react/primitive-hooks/useActionBarReload.js +1 -1
  106. package/dist/react/primitive-hooks/useActionBarReload.js.map +1 -1
  107. package/dist/react/primitive-hooks/useActionBarSpeak.js +1 -1
  108. package/dist/react/primitive-hooks/useActionBarSpeak.js.map +1 -1
  109. package/dist/react/primitive-hooks/useActionBarStopSpeaking.js +1 -1
  110. package/dist/react/primitive-hooks/useActionBarStopSpeaking.js.map +1 -1
  111. package/dist/react/primitive-hooks/useBranchPickerNext.js +1 -1
  112. package/dist/react/primitive-hooks/useBranchPickerNext.js.map +1 -1
  113. package/dist/react/primitive-hooks/useBranchPickerPrevious.js +1 -1
  114. package/dist/react/primitive-hooks/useBranchPickerPrevious.js.map +1 -1
  115. package/dist/react/primitive-hooks/useComposerAddAttachment.js +1 -1
  116. package/dist/react/primitive-hooks/useComposerAddAttachment.js.map +1 -1
  117. package/dist/react/primitive-hooks/useComposerCancel.js +1 -1
  118. package/dist/react/primitive-hooks/useComposerCancel.js.map +1 -1
  119. package/dist/react/primitive-hooks/useComposerDictate.js +1 -1
  120. package/dist/react/primitive-hooks/useComposerDictate.js.map +1 -1
  121. package/dist/react/primitive-hooks/useComposerSend.js +1 -1
  122. package/dist/react/primitive-hooks/useComposerSend.js.map +1 -1
  123. package/dist/react/primitive-hooks/useEditComposerCancel.js +1 -1
  124. package/dist/react/primitive-hooks/useEditComposerCancel.js.map +1 -1
  125. package/dist/react/primitive-hooks/useEditComposerSend.js +1 -1
  126. package/dist/react/primitive-hooks/useEditComposerSend.js.map +1 -1
  127. package/dist/react/primitive-hooks/useMessageBranching.js +1 -1
  128. package/dist/react/primitive-hooks/useMessageBranching.js.map +1 -1
  129. package/dist/react/primitive-hooks/useMessageReload.js +1 -1
  130. package/dist/react/primitive-hooks/useMessageReload.js.map +1 -1
  131. package/dist/react/primitive-hooks/useSuggestionTrigger.js +1 -1
  132. package/dist/react/primitive-hooks/useSuggestionTrigger.js.map +1 -1
  133. package/dist/react/primitive-hooks/useThreadListItemArchive.js +1 -1
  134. package/dist/react/primitive-hooks/useThreadListItemArchive.js.map +1 -1
  135. package/dist/react/primitive-hooks/useThreadListItemDelete.js +1 -1
  136. package/dist/react/primitive-hooks/useThreadListItemDelete.js.map +1 -1
  137. package/dist/react/primitive-hooks/useThreadListItemTrigger.js +1 -1
  138. package/dist/react/primitive-hooks/useThreadListItemTrigger.js.map +1 -1
  139. package/dist/react/primitive-hooks/useThreadListItemUnarchive.js +1 -1
  140. package/dist/react/primitive-hooks/useThreadListItemUnarchive.js.map +1 -1
  141. package/dist/react/primitive-hooks/useThreadListLoadMore.js +1 -1
  142. package/dist/react/primitive-hooks/useThreadListLoadMore.js.map +1 -1
  143. package/dist/react/primitive-hooks/useThreadListNew.js +1 -1
  144. package/dist/react/primitive-hooks/useThreadListNew.js.map +1 -1
  145. package/dist/react/primitive-hooks/useVoice.js +1 -1
  146. package/dist/react/primitive-hooks/useVoice.js.map +1 -1
  147. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.d.ts +1 -1
  148. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js +1 -1
  149. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js.map +1 -1
  150. package/dist/react/primitives/composer/ComposerAttachments.js +1 -1
  151. package/dist/react/primitives/composer/ComposerAttachments.js.map +1 -1
  152. package/dist/react/primitives/composer/ComposerQueue.js +1 -1
  153. package/dist/react/primitives/composer/ComposerQueue.js.map +1 -1
  154. package/dist/react/primitives/generativeUI/GenerativeUI.js +1 -1
  155. package/dist/react/primitives/generativeUI/GenerativeUI.js.map +1 -1
  156. package/dist/react/primitives/message/MessageAttachments.js +1 -1
  157. package/dist/react/primitives/message/MessageAttachments.js.map +1 -1
  158. package/dist/react/primitives/message/MessageGroupedParts.js +1 -1
  159. package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
  160. package/dist/react/primitives/message/MessageParts.d.ts +1 -1
  161. package/dist/react/primitives/message/MessageParts.js +1 -1
  162. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  163. package/dist/react/primitives/message/MessageQuote.js +1 -1
  164. package/dist/react/primitives/part/PartMessages.d.ts +12 -10
  165. package/dist/react/primitives/part/PartMessages.d.ts.map +1 -1
  166. package/dist/react/primitives/part/PartMessages.js +13 -11
  167. package/dist/react/primitives/part/PartMessages.js.map +1 -1
  168. package/dist/react/primitives/thread/ThreadMessages.js +1 -1
  169. package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
  170. package/dist/react/primitives/thread/ThreadSuggestions.js +1 -1
  171. package/dist/react/primitives/thread/ThreadSuggestions.js.map +1 -1
  172. package/dist/react/primitives/threadList/ThreadListItems.js +1 -1
  173. package/dist/react/primitives/threadList/ThreadListItems.js.map +1 -1
  174. package/dist/react/providers/AttachmentByIndexProvider.js.map +1 -1
  175. package/dist/react/providers/ChainOfThoughtByIndicesProvider.js.map +1 -1
  176. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.js.map +1 -1
  177. package/dist/react/providers/MessageByIndexProvider.js.map +1 -1
  178. package/dist/react/providers/PartByIndexProvider.js.map +1 -1
  179. package/dist/react/providers/QueueItemByIndexProvider.js.map +1 -1
  180. package/dist/react/providers/ReadonlyThreadProvider.js +1 -1
  181. package/dist/react/providers/ReadonlyThreadProvider.js.map +1 -1
  182. package/dist/react/providers/SuggestionByIndexProvider.js.map +1 -1
  183. package/dist/react/providers/TextMessagePartProvider.d.ts.map +1 -1
  184. package/dist/react/providers/TextMessagePartProvider.js +4 -3
  185. package/dist/react/providers/TextMessagePartProvider.js.map +1 -1
  186. package/dist/react/providers/ThreadListItemByIndexProvider.js.map +1 -1
  187. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +7 -0
  188. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  189. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +1 -1
  190. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  191. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +8 -0
  192. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  193. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +29 -1
  194. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  195. package/dist/react/runtimes/RuntimeAdapterProvider.js +1 -1
  196. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +1 -1
  197. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  198. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
  199. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +10 -3
  200. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  201. package/dist/react/runtimes/createMessageConverter.d.ts +2 -2
  202. package/dist/react/runtimes/createMessageConverter.d.ts.map +1 -1
  203. package/dist/react/runtimes/createMessageConverter.js.map +1 -1
  204. package/dist/react/runtimes/external-message-converter.d.ts +4 -3
  205. package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
  206. package/dist/react/runtimes/external-message-converter.js +1 -1
  207. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  208. package/dist/react/runtimes/useExternalStoreRuntime.js +1 -1
  209. package/dist/react/runtimes/useExternalStoreSharedOptions.js +1 -1
  210. package/dist/react/runtimes/useLocalRuntime.d.ts +2 -1
  211. package/dist/react/runtimes/useLocalRuntime.d.ts.map +1 -1
  212. package/dist/react/runtimes/useLocalRuntime.js +4 -3
  213. package/dist/react/runtimes/useLocalRuntime.js.map +1 -1
  214. package/dist/react/runtimes/useRemoteThreadListRuntime.js +1 -1
  215. package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
  216. package/dist/react/utils/groupParts.d.ts +1 -1
  217. package/dist/react/utils/groupParts.js.map +1 -1
  218. package/dist/runtime/api/attachment-runtime.js.map +1 -1
  219. package/dist/runtime/api/composer-runtime.d.ts +8 -2
  220. package/dist/runtime/api/composer-runtime.d.ts.map +1 -1
  221. package/dist/runtime/api/composer-runtime.js +14 -0
  222. package/dist/runtime/api/composer-runtime.js.map +1 -1
  223. package/dist/runtime/api/message-part-runtime.js.map +1 -1
  224. package/dist/runtime/api/message-runtime.js +1 -1
  225. package/dist/runtime/api/message-runtime.js.map +1 -1
  226. package/dist/runtime/api/thread-list-item-runtime.d.ts +2 -0
  227. package/dist/runtime/api/thread-list-item-runtime.d.ts.map +1 -1
  228. package/dist/runtime/api/thread-list-item-runtime.js +6 -0
  229. package/dist/runtime/api/thread-list-item-runtime.js.map +1 -1
  230. package/dist/runtime/api/thread-runtime.d.ts +7 -0
  231. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  232. package/dist/runtime/api/thread-runtime.js.map +1 -1
  233. package/dist/runtime/base/base-composer-runtime-core.d.ts +4 -0
  234. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  235. package/dist/runtime/base/base-composer-runtime-core.js +7 -1
  236. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  237. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  238. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +4 -0
  239. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
  240. package/dist/runtime/base/default-thread-composer-runtime-core.js +17 -1
  241. package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
  242. package/dist/runtime/interfaces/composer-runtime-core.d.ts +6 -1
  243. package/dist/runtime/interfaces/composer-runtime-core.d.ts.map +1 -1
  244. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +1 -0
  245. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
  246. package/dist/runtime/interfaces/thread-runtime-core.d.ts +4 -0
  247. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  248. package/dist/runtime/queue/external-thread-queue-adapter.d.ts +20 -0
  249. package/dist/runtime/queue/external-thread-queue-adapter.d.ts.map +1 -0
  250. package/dist/runtime/queue/external-thread-queue-adapter.js +0 -0
  251. package/dist/runtime/queue/message-queue.d.ts +20 -0
  252. package/dist/runtime/queue/message-queue.d.ts.map +1 -0
  253. package/dist/runtime/queue/message-queue.js +97 -0
  254. package/dist/runtime/queue/message-queue.js.map +1 -0
  255. package/dist/runtime/utils/message-repository.js.map +1 -1
  256. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  257. package/dist/runtimes/external-store/external-store-adapter.d.ts +5 -1
  258. package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
  259. package/dist/runtimes/external-store/external-store-runtime-core.js.map +1 -1
  260. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts +1 -0
  261. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  262. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +5 -0
  263. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  264. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +4 -0
  265. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  266. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +20 -2
  267. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  268. package/dist/runtimes/local/local-runtime-core.js.map +1 -1
  269. package/dist/runtimes/local/local-runtime-options.d.ts +5 -0
  270. package/dist/runtimes/local/local-runtime-options.d.ts.map +1 -1
  271. package/dist/runtimes/local/local-thread-runtime-core.d.ts +7 -0
  272. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  273. package/dist/runtimes/local/local-thread-runtime-core.js +45 -0
  274. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  275. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +3 -0
  276. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
  277. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js +3 -0
  278. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js.map +1 -1
  279. package/dist/runtimes/remote-thread-list/adapter/in-memory.d.ts +1 -0
  280. package/dist/runtimes/remote-thread-list/adapter/in-memory.d.ts.map +1 -1
  281. package/dist/runtimes/remote-thread-list/adapter/in-memory.js +3 -0
  282. package/dist/runtimes/remote-thread-list/adapter/in-memory.js.map +1 -1
  283. package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts.map +1 -1
  284. package/dist/runtimes/remote-thread-list/empty-thread-core.js +3 -0
  285. package/dist/runtimes/remote-thread-list/empty-thread-core.js.map +1 -1
  286. package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
  287. package/dist/runtimes/remote-thread-list/types.d.ts +1 -0
  288. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  289. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  290. package/dist/store/clients/chain-of-thought-client.d.ts.map +1 -1
  291. package/dist/store/clients/chain-of-thought-client.js +6 -5
  292. package/dist/store/clients/chain-of-thought-client.js.map +1 -1
  293. package/dist/store/clients/model-context-client.d.ts.map +1 -1
  294. package/dist/store/clients/model-context-client.js +6 -5
  295. package/dist/store/clients/model-context-client.js.map +1 -1
  296. package/dist/store/clients/no-op-composer-client.d.ts.map +1 -1
  297. package/dist/store/clients/no-op-composer-client.js +4 -3
  298. package/dist/store/clients/no-op-composer-client.js.map +1 -1
  299. package/dist/store/clients/runtime-adapter.d.ts.map +1 -1
  300. package/dist/store/clients/runtime-adapter.js +7 -6
  301. package/dist/store/clients/runtime-adapter.js.map +1 -1
  302. package/dist/store/clients/suggestions.d.ts.map +1 -1
  303. package/dist/store/clients/suggestions.js +7 -6
  304. package/dist/store/clients/suggestions.js.map +1 -1
  305. package/dist/store/clients/thread-message-client.d.ts.map +1 -1
  306. package/dist/store/clients/thread-message-client.js +13 -12
  307. package/dist/store/clients/thread-message-client.js.map +1 -1
  308. package/dist/store/index.d.ts +1 -1
  309. package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -1
  310. package/dist/store/runtime-clients/attachment-runtime-client.js +3 -3
  311. package/dist/store/runtime-clients/attachment-runtime-client.js.map +1 -1
  312. package/dist/store/runtime-clients/composer-runtime-client.d.ts +12 -5
  313. package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
  314. package/dist/store/runtime-clients/composer-runtime-client.js +32 -16
  315. package/dist/store/runtime-clients/composer-runtime-client.js.map +1 -1
  316. package/dist/store/runtime-clients/message-part-runtime-client.d.ts.map +1 -1
  317. package/dist/store/runtime-clients/message-part-runtime-client.js +3 -3
  318. package/dist/store/runtime-clients/message-part-runtime-client.js.map +1 -1
  319. package/dist/store/runtime-clients/message-runtime-client.d.ts +6 -3
  320. package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
  321. package/dist/store/runtime-clients/message-runtime-client.js +17 -16
  322. package/dist/store/runtime-clients/message-runtime-client.js.map +1 -1
  323. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  324. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +9 -7
  325. package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
  326. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  327. package/dist/store/runtime-clients/thread-list-runtime-client.js +11 -10
  328. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  329. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  330. package/dist/store/runtime-clients/thread-runtime-client.js +15 -14
  331. package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
  332. package/dist/store/runtime-clients/useSubscribable.d.ts +7 -0
  333. package/dist/store/runtime-clients/useSubscribable.d.ts.map +1 -0
  334. package/dist/store/runtime-clients/useSubscribable.js +16 -0
  335. package/dist/store/runtime-clients/useSubscribable.js.map +1 -0
  336. package/dist/store/scope-registration.d.ts +1 -1
  337. package/dist/store/scopes/composer.d.ts +1 -1
  338. package/dist/store/scopes/queue-item.d.ts +2 -1
  339. package/dist/store/scopes/queue-item.d.ts.map +1 -1
  340. package/dist/store/scopes/queue-item.js +6 -0
  341. package/dist/store/scopes/queue-item.js.map +1 -0
  342. package/dist/store/scopes/thread-list-item.d.ts +1 -0
  343. package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
  344. package/dist/store/scopes/thread.d.ts +1 -1
  345. package/dist/store/scopes/threads.d.ts +1 -1
  346. package/dist/types/message.d.ts +2 -1
  347. package/dist/types/message.d.ts.map +1 -1
  348. package/dist/types/message.js.map +1 -1
  349. package/dist/utils/composite-context-provider.d.ts +1 -1
  350. package/dist/utils/composite-context-provider.js +3 -1
  351. package/dist/utils/composite-context-provider.js.map +1 -1
  352. package/dist/utils/json/is-json.js.map +1 -1
  353. package/dist/utils/text.js.map +1 -1
  354. package/package.json +15 -11
  355. package/src/adapters/attachment.ts +24 -4
  356. package/src/index.ts +8 -0
  357. package/src/model-context/tool.ts +1 -1
  358. package/src/model-context/types.ts +21 -3
  359. package/src/react/RuntimeAdapter.ts +6 -4
  360. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +15 -2
  361. package/src/react/client/DataRenderers.ts +48 -42
  362. package/src/react/client/Interactables.ts +263 -267
  363. package/src/react/client/Tools.ts +123 -115
  364. package/src/react/index.ts +16 -3
  365. package/src/react/model-context/define-mcp-toolkit.ts +16 -0
  366. package/src/react/model-context/define-toolkit.test.ts +101 -6
  367. package/src/react/model-context/define-toolkit.ts +35 -18
  368. package/src/react/model-context/external-tool.ts +16 -0
  369. package/src/react/model-context/human-tool.ts +32 -0
  370. package/src/react/model-context/makeAssistantTool.ts +8 -0
  371. package/src/react/model-context/makeAssistantToolUI.ts +8 -0
  372. package/src/react/model-context/provider-tool.ts +30 -0
  373. package/src/react/model-context/stub-tool.ts +14 -0
  374. package/src/react/model-context/toolbox.test.ts +182 -0
  375. package/src/react/model-context/toolbox.ts +191 -23
  376. package/src/react/model-context/useAssistantTool.ts +28 -8
  377. package/src/react/model-context/useAssistantToolUI.ts +13 -4
  378. package/src/react/model-context/useAuiToolOverrides.ts +38 -0
  379. package/src/react/primitives/message/MessageGroupedParts.tsx +1 -1
  380. package/src/react/primitives/part/PartMessages.tsx +12 -10
  381. package/src/react/providers/TextMessagePartProvider.tsx +31 -32
  382. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +43 -0
  383. package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +9 -0
  384. package/src/react/runtimes/createMessageConverter.ts +2 -1
  385. package/src/react/runtimes/external-message-converter.ts +5 -3
  386. package/src/react/runtimes/useLocalRuntime.ts +2 -0
  387. package/src/runtime/api/composer-runtime.ts +26 -0
  388. package/src/runtime/api/thread-list-item-runtime.ts +15 -0
  389. package/src/runtime/base/base-composer-runtime-core.ts +11 -0
  390. package/src/runtime/base/default-thread-composer-runtime-core.ts +22 -0
  391. package/src/runtime/interfaces/composer-runtime-core.ts +7 -0
  392. package/src/runtime/interfaces/thread-list-runtime-core.ts +4 -0
  393. package/src/runtime/interfaces/thread-runtime-core.ts +5 -0
  394. package/src/runtime/queue/external-thread-queue-adapter.ts +14 -0
  395. package/src/runtime/queue/message-queue.ts +128 -0
  396. package/src/runtimes/external-store/external-store-adapter.ts +10 -0
  397. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +13 -0
  398. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +31 -2
  399. package/src/runtimes/local/local-runtime-options.ts +6 -0
  400. package/src/runtimes/local/local-thread-runtime-core.ts +70 -0
  401. package/src/runtimes/readonly/ReadonlyThreadRuntimeCore.ts +4 -0
  402. package/src/runtimes/remote-thread-list/adapter/in-memory.ts +4 -0
  403. package/src/runtimes/remote-thread-list/empty-thread-core.ts +4 -0
  404. package/src/runtimes/remote-thread-list/types.ts +4 -0
  405. package/src/store/clients/chain-of-thought-client.ts +24 -25
  406. package/src/store/clients/model-context-client.test.ts +87 -2
  407. package/src/store/clients/model-context-client.ts +22 -19
  408. package/src/store/clients/no-op-composer-client.ts +69 -66
  409. package/src/store/clients/runtime-adapter.ts +9 -6
  410. package/src/store/clients/suggestions.ts +41 -40
  411. package/src/store/clients/thread-message-client.ts +127 -132
  412. package/src/store/runtime-clients/attachment-runtime-client.ts +7 -3
  413. package/src/store/runtime-clients/composer-runtime-client.ts +142 -113
  414. package/src/store/runtime-clients/message-part-runtime-client.ts +16 -14
  415. package/src/store/runtime-clients/message-runtime-client.ts +124 -122
  416. package/src/store/runtime-clients/thread-list-item-runtime-client.ts +44 -44
  417. package/src/store/runtime-clients/thread-list-runtime-client.ts +83 -80
  418. package/src/store/runtime-clients/thread-runtime-client.ts +113 -119
  419. package/src/store/runtime-clients/{tap-subscribable.ts → useSubscribable.ts} +4 -4
  420. package/src/store/scopes/queue-item.ts +2 -0
  421. package/src/store/scopes/thread-list-item.ts +1 -0
  422. package/src/tests/RemoteThreadListThreadListRuntimeCore-custom-metadata.test.ts +69 -1
  423. package/src/tests/attachment-adapters.test.ts +86 -0
  424. package/src/tests/external-store-thread-runtime-core.test.ts +125 -0
  425. package/src/tests/message-queue.test.ts +168 -0
  426. package/src/tests/thread-list-runtime-getLoadThreadsPromise.test.ts +1 -0
  427. package/src/types/message.ts +2 -0
  428. package/src/utils/composite-context-provider.ts +3 -1
  429. package/dist/react/model-context/hitl.d.ts +0 -19
  430. package/dist/react/model-context/hitl.d.ts.map +0 -1
  431. package/dist/react/model-context/hitl.js +0 -22
  432. package/dist/react/model-context/hitl.js.map +0 -1
  433. package/dist/store/runtime-clients/tap-subscribable.d.ts +0 -7
  434. package/dist/store/runtime-clients/tap-subscribable.d.ts.map +0 -1
  435. package/dist/store/runtime-clients/tap-subscribable.js +0 -16
  436. package/dist/store/runtime-clients/tap-subscribable.js.map +0 -1
  437. package/src/react/model-context/hitl.ts +0 -22
@@ -0,0 +1,86 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import type { PendingAttachment } from "../types/attachment";
3
+ import {
4
+ type AttachmentAdapter,
5
+ SimpleImageAttachmentAdapter,
6
+ SimpleTextAttachmentAdapter,
7
+ } from "../adapters/attachment";
8
+
9
+ describe("SimpleTextAttachmentAdapter", () => {
10
+ const makeFile = (contents: string, name = "notes.md") =>
11
+ new File([contents], name, { type: "text/markdown" });
12
+
13
+ it("adds a file as a pending document attachment", async () => {
14
+ const pending = (await new SimpleTextAttachmentAdapter().add({
15
+ file: makeFile("hello"),
16
+ })) as PendingAttachment;
17
+
18
+ expect(pending).toMatchObject({
19
+ id: "notes.md",
20
+ type: "document",
21
+ name: "notes.md",
22
+ contentType: "text/markdown",
23
+ status: { type: "requires-action", reason: "composer-send" },
24
+ });
25
+ });
26
+
27
+ it("sends the file contents as a text part without FileReader", async () => {
28
+ expect(typeof FileReader).toBe("undefined");
29
+
30
+ const adapter = new SimpleTextAttachmentAdapter();
31
+ const pending = (await adapter.add({
32
+ file: makeFile("- retry with backoff\n- cap attempts at 3"),
33
+ })) as PendingAttachment;
34
+ const complete = await adapter.send(pending);
35
+
36
+ expect(complete.status).toEqual({ type: "complete" });
37
+ expect(complete.content).toEqual([
38
+ {
39
+ type: "text",
40
+ text: "<attachment name=notes.md>\n- retry with backoff\n- cap attempts at 3\n</attachment>",
41
+ },
42
+ ]);
43
+ });
44
+
45
+ it("remove resolves without error", async () => {
46
+ const adapter: AttachmentAdapter = new SimpleTextAttachmentAdapter();
47
+ const pending = (await adapter.add({
48
+ file: makeFile("hello"),
49
+ })) as PendingAttachment;
50
+ await expect(adapter.remove(pending)).resolves.toBeUndefined();
51
+ });
52
+ });
53
+
54
+ describe("SimpleImageAttachmentAdapter", () => {
55
+ const makeImage = (bytes: number[], name = "pixel.png") =>
56
+ new File([new Uint8Array(bytes)], name, { type: "image/png" });
57
+
58
+ it("adds a file as a pending image attachment", async () => {
59
+ const pending = (await new SimpleImageAttachmentAdapter().add({
60
+ file: makeImage([1, 2, 3]),
61
+ })) as PendingAttachment;
62
+
63
+ expect(pending).toMatchObject({
64
+ id: "pixel.png",
65
+ type: "image",
66
+ name: "pixel.png",
67
+ contentType: "image/png",
68
+ status: { type: "requires-action", reason: "composer-send" },
69
+ });
70
+ });
71
+
72
+ it("sends the file as a base64 data URL without FileReader", async () => {
73
+ expect(typeof FileReader).toBe("undefined");
74
+
75
+ const adapter = new SimpleImageAttachmentAdapter();
76
+ const pending = (await adapter.add({
77
+ file: makeImage([137, 80, 78, 71]),
78
+ })) as PendingAttachment;
79
+ const complete = await adapter.send(pending);
80
+
81
+ expect(complete.status).toEqual({ type: "complete" });
82
+ expect(complete.content).toEqual([
83
+ { type: "image", image: "data:image/png;base64,iVBORw==" },
84
+ ]);
85
+ });
86
+ });
@@ -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
+ });
@@ -41,6 +41,7 @@ const createMockCore = (
41
41
  getLoadThreadsPromise: () => loadPromise,
42
42
  detach: () => Promise.resolve(),
43
43
  rename: () => Promise.resolve(),
44
+ updateCustom: () => Promise.resolve(),
44
45
  archive: () => Promise.resolve(),
45
46
  unarchive: () => Promise.resolve(),
46
47
  delete: () => Promise.resolve(),
@@ -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,19 +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: hitl(), 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: hitl()`, 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 hitl(): never;
17
- //#endregion
18
- export { hitl };
19
- //# 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;;;;AAAoB;;;;;;;;;iBAAJ,IAAA"}
@@ -1,22 +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: hitl(), 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: hitl()`, 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 hitl() {
17
- throw new Error("[assistant-ui] hitl() 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. hitl() used outside a \"use generative\" file).");
18
- }
19
- //#endregion
20
- export { hitl };
21
-
22
- //# 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: hitl(), 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: hitl()`, 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 hitl(): never {\n throw new Error(\n \"[assistant-ui] hitl() 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. hitl() used outside a \"use generative\" file).',\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;AAcA,SAAgB,OAAc;CAC5B,MAAM,IAAI,MACR,4PAIF;AACF"}
@@ -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"}
@@ -1,22 +0,0 @@
1
- /**
2
- * Marks a tool as **human-in-the-loop**: the agent pauses and the UI (`render`)
3
- * supplies the result instead of code. Use it as the tool's `execute`:
4
- *
5
- * ```tsx
6
- * confirm: { execute: hitl(), render: (props) => <Confirm {...props} /> }
7
- * ```
8
- *
9
- * Like {@link defineToolkit}, it has **no runtime implementation**: a
10
- * `"use generative"` compiler (e.g. `@assistant-ui/next` or `@assistant-ui/vite`)
11
- * detects `execute: hitl()`, drops it, and stamps the tool `type: "human"`.
12
- * Reaching it at runtime means the module wasn't compiled (used outside a
13
- * `"use generative"` file), so it throws.
14
- */
15
- export function hitl(): never {
16
- throw new Error(
17
- "[assistant-ui] hitl() has no runtime implementation — it marks a " +
18
- "human-in-the-loop tool and is stripped at build time by the " +
19
- "use-generative compiler. Reaching it means this module was not compiled " +
20
- '(e.g. hitl() used outside a "use generative" file).',
21
- );
22
- }