@assistant-ui/core 0.2.10 → 0.2.12

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
@@ -1,15 +1,12 @@
1
+ import { useState, useEffect, useCallback, useMemo } from "react";
1
2
  import {
3
+ useResources,
2
4
  resource,
3
- tapState,
4
- tapEffect,
5
- tapCallback,
6
- tapMemo,
7
- tapResources,
8
5
  withKey,
9
6
  type ResourceElement,
10
7
  } from "@assistant-ui/tap";
11
8
  import {
12
- tapAssistantClientRef,
9
+ useAssistantClientRef,
13
10
  type ClientOutput,
14
11
  attachTransformScopes,
15
12
  } from "@assistant-ui/store";
@@ -33,136 +30,132 @@ export type { McpAppResourceOutput };
33
30
  * context, while each tool renderer is registered with the tools scope for
34
31
  * message rendering.
35
32
  */
36
- export const Tools = resource(
37
- ({
38
- toolkit,
39
- mcpApp,
40
- }: {
41
- /** Tools to expose to the model and optional renderers to install. */
42
- toolkit?: Toolkit;
43
- /** Optional MCP app resource whose tools should be merged into context. */
44
- mcpApp?: ResourceElement<McpAppResourceOutput> | undefined;
45
- }): ClientOutput<"tools"> => {
46
- const mcpAppOutputs = tapResources(
47
- () => (mcpApp ? [withKey("mcpApp", mcpApp)] : []),
48
- [mcpApp],
49
- );
50
- const mcpAppOutput = mcpAppOutputs[0];
51
-
52
- const [toolUIs, setToolUIs] = tapState<ToolsState["toolUIs"]>(() => ({}));
53
-
54
- const state = tapMemo(
55
- (): ToolsState => ({
56
- toolUIs,
57
- mcpApp: mcpAppOutput,
58
- // Deprecated component-only view, derived from `toolUIs`. Removed in v0.15.
59
- tools: Object.fromEntries(
60
- Object.entries(toolUIs).map(([name, regs]) => [
61
- name,
62
- regs.map((r) => r.render),
63
- ]),
64
- ),
65
- }),
66
- [toolUIs, mcpAppOutput],
67
- );
68
-
69
- const clientRef = tapAssistantClientRef();
70
-
71
- const setToolUI = tapCallback(
72
- (
73
- toolName: string,
74
- render: ToolCallMessagePartComponent,
75
- options?: { standalone?: boolean },
76
- ) => {
77
- // One registration object per call; identity is the removal key, so
78
- // the per-name list stays correctly ref-counted across re-registers.
79
- const registration = {
80
- render,
81
- standalone: options?.standalone ?? false,
82
- };
83
-
84
- setToolUIs((prev) => ({
85
- ...prev,
86
- [toolName]: [...(prev[toolName] ?? []), registration],
87
- }));
88
-
89
- return () => {
90
- setToolUIs((prev) => {
91
- const next =
92
- prev[toolName]?.filter((r) => r !== registration) ?? [];
93
- if (next.length > 0) return { ...prev, [toolName]: next };
94
- // Drop the key entirely so repeatedly mounted/unmounted tools
95
- // don't leave empty arrays accumulating across a long session.
96
- const { [toolName]: _removed, ...rest } = prev;
97
- return rest;
98
- });
99
- };
100
- },
101
- [],
102
- );
103
-
104
- tapEffect(() => {
105
- if (!toolkit) return;
106
- const unsubscribes: (() => void)[] = [];
107
-
108
- // Register tool UIs (exclude symbols)
109
- for (const [toolName, tool] of Object.entries(toolkit)) {
110
- const toolRender = "render" in tool ? tool.render : undefined;
111
- const toolRenderText =
112
- "renderText" in tool ? tool.renderText : undefined;
113
- const render =
114
- toolRender ??
115
- (toolRenderText
116
- ? makeToolCallTextComponent(toolRenderText)
117
- : undefined);
118
- if (render) {
119
- unsubscribes.push(
120
- setToolUI(toolName, render, {
121
- standalone: isStandaloneToolDisplay(tool),
122
- }),
123
- );
124
- }
125
- }
126
-
127
- // Register tools with model context (exclude symbols). `render`,
128
- // `renderText`, and `display` are client-only presentation concerns and
129
- // never reach the model.
130
- const toolsWithoutRender = Object.entries(toolkit).reduce(
131
- (acc, [name, tool]) => {
132
- if (tool.type === "mcp") return acc;
133
- const {
134
- display: _display,
135
- render: _render,
136
- renderText: _renderText,
137
- ...rest
138
- } = tool as typeof tool & { renderText?: unknown };
139
- acc[name] = rest as Tool<any, any>;
140
- return acc;
141
- },
142
- {} as Record<string, Tool<any, any>>,
143
- );
144
-
145
- const modelContextProvider = {
146
- getModelContext: () => ({
147
- tools: toolsWithoutRender,
148
- }),
33
+ export const Tools = resource(function Tools({
34
+ toolkit,
35
+ mcpApp,
36
+ }: {
37
+ /** Tools to expose to the model and optional renderers to install. */
38
+ toolkit?: Toolkit;
39
+ /** Optional MCP app resource whose tools should be merged into context. */
40
+ mcpApp?: ResourceElement<McpAppResourceOutput> | undefined;
41
+ }): ClientOutput<"tools"> {
42
+ const mcpAppOutputs = useResources(
43
+ () => (mcpApp ? [withKey("mcpApp", mcpApp)] : []),
44
+ [mcpApp],
45
+ );
46
+ const mcpAppOutput = mcpAppOutputs[0];
47
+
48
+ const [toolUIs, setToolUIs] = useState<ToolsState["toolUIs"]>(() => ({}));
49
+
50
+ const state = useMemo(
51
+ (): ToolsState => ({
52
+ toolUIs,
53
+ mcpApp: mcpAppOutput,
54
+ // Deprecated component-only view, derived from `toolUIs`. Removed in v0.15.
55
+ tools: Object.fromEntries(
56
+ Object.entries(toolUIs).map(([name, regs]) => [
57
+ name,
58
+ regs.map((r) => r.render),
59
+ ]),
60
+ ),
61
+ }),
62
+ [toolUIs, mcpAppOutput],
63
+ );
64
+
65
+ const clientRef = useAssistantClientRef();
66
+
67
+ const setToolUI = useCallback(
68
+ (
69
+ toolName: string,
70
+ render: ToolCallMessagePartComponent,
71
+ options?: { standalone?: boolean },
72
+ ) => {
73
+ // One registration object per call; identity is the removal key, so
74
+ // the per-name list stays correctly ref-counted across re-registers.
75
+ const registration = {
76
+ render,
77
+ standalone: options?.standalone ?? false,
149
78
  };
150
79
 
151
- unsubscribes.push(
152
- clientRef.current!.modelContext().register(modelContextProvider),
153
- );
80
+ setToolUIs((prev) => ({
81
+ ...prev,
82
+ [toolName]: [...(prev[toolName] ?? []), registration],
83
+ }));
154
84
 
155
85
  return () => {
156
- unsubscribes.forEach((fn) => fn());
86
+ setToolUIs((prev) => {
87
+ const next = prev[toolName]?.filter((r) => r !== registration) ?? [];
88
+ if (next.length > 0) return { ...prev, [toolName]: next };
89
+ // Drop the key entirely so repeatedly mounted/unmounted tools
90
+ // don't leave empty arrays accumulating across a long session.
91
+ const { [toolName]: _removed, ...rest } = prev;
92
+ return rest;
93
+ });
157
94
  };
158
- }, [toolkit, setToolUI, clientRef]);
95
+ },
96
+ [],
97
+ );
98
+
99
+ useEffect(() => {
100
+ if (!toolkit) return;
101
+ const unsubscribes: (() => void)[] = [];
102
+
103
+ // Register tool UIs (exclude symbols)
104
+ for (const [toolName, tool] of Object.entries(toolkit)) {
105
+ const toolRender = "render" in tool ? tool.render : undefined;
106
+ const toolRenderText = "renderText" in tool ? tool.renderText : undefined;
107
+ const render =
108
+ toolRender ??
109
+ (toolRenderText
110
+ ? makeToolCallTextComponent(toolRenderText)
111
+ : undefined);
112
+ if (render) {
113
+ unsubscribes.push(
114
+ setToolUI(toolName, render, {
115
+ standalone: isStandaloneToolDisplay(tool),
116
+ }),
117
+ );
118
+ }
119
+ }
120
+
121
+ // Register tools with model context (exclude symbols). `render`,
122
+ // `renderText`, and `display` are client-only presentation concerns and
123
+ // never reach the model.
124
+ const toolsWithoutRender = Object.entries(toolkit).reduce(
125
+ (acc, [name, tool]) => {
126
+ if (tool.type === "mcp") return acc;
127
+ const {
128
+ display: _display,
129
+ render: _render,
130
+ renderText: _renderText,
131
+ ...rest
132
+ } = tool as typeof tool & { renderText?: unknown };
133
+ acc[name] = rest as Tool<any, any>;
134
+ return acc;
135
+ },
136
+ {} as Record<string, Tool<any, any>>,
137
+ );
159
138
 
160
- return {
161
- getState: () => state,
162
- setToolUI,
139
+ const modelContextProvider = {
140
+ getModelContext: () => ({
141
+ tools: toolsWithoutRender,
142
+ }),
163
143
  };
164
- },
165
- );
144
+
145
+ unsubscribes.push(
146
+ clientRef.current!.modelContext().register(modelContextProvider),
147
+ );
148
+
149
+ return () => {
150
+ unsubscribes.forEach((fn) => fn());
151
+ };
152
+ }, [toolkit, setToolUI, clientRef]);
153
+
154
+ return {
155
+ getState: () => state,
156
+ setToolUI,
157
+ };
158
+ });
166
159
 
167
160
  attachTransformScopes(Tools, (scopes, parent) => {
168
161
  if (!scopes.modelContext && parent.modelContext.source === null) {
@@ -41,8 +41,9 @@ export {
41
41
  } from "./model-context/toolbox";
42
42
  export { defineToolkit } from "./model-context/define-toolkit";
43
43
  export { stubTool } from "./model-context/stub-tool";
44
+ export { externalTool } from "./model-context/external-tool";
44
45
  export { useAuiToolOverrides } from "./model-context/useAuiToolOverrides";
45
- export { hitl, hitlTool } from "./model-context/hitl";
46
+ export { hitl, hitlTool, humanTool } from "./model-context/human-tool";
46
47
  export {
47
48
  providerTool,
48
49
  type ProviderToolConfig,
@@ -154,6 +155,7 @@ export {
154
155
  useExternalMessageConverter,
155
156
  convertExternalMessages,
156
157
  } from "./runtimes/external-message-converter";
158
+ export type { JoinStrategy } from "./runtimes/external-message-converter";
157
159
  export { createMessageConverter } from "./runtimes/createMessageConverter";
158
160
  export { RemoteThreadListHookInstanceManager } from "./runtimes/RemoteThreadListHookInstanceManager";
159
161
  export { RemoteThreadListThreadListRuntimeCore } from "./runtimes/RemoteThreadListThreadListRuntimeCore";
@@ -1,9 +1,10 @@
1
1
  import { describe, it, expect, expectTypeOf } from "vitest";
2
2
  import type { AsyncIterableStream } from "assistant-stream/utils";
3
3
  import { defineToolkit } from "./define-toolkit";
4
- import { hitl, hitlTool } from "./hitl";
4
+ import { hitl, hitlTool, humanTool } from "./human-tool";
5
5
  import { providerTool } from "./provider-tool";
6
6
  import { stubTool } from "./stub-tool";
7
+ import { externalTool } from "./external-tool";
7
8
  import type { ToolkitDefinition } from "./toolbox";
8
9
 
9
10
  type TestStandardSchema<T> = {
@@ -74,16 +75,18 @@ const checkToolkitDefinitionTypes = () => {
74
75
  expectTypeOf(checkToolkitDefinitionTypes).toEqualTypeOf<() => void>();
75
76
 
76
77
  describe("use-generative markers", () => {
77
- it("defineToolkit throws at runtime — it must be stripped by the compiler, never called", () => {
78
- expect(() => defineToolkit({})).toThrow(/no runtime implementation/);
78
+ it("defineToolkit returns the toolkit at runtime", () => {
79
+ const toolkit = {};
80
+ expect(defineToolkit(toolkit)).toBe(toolkit);
79
81
  });
80
82
 
81
- it("hitlTool throws at runtime — it must be stripped by the compiler, never called", () => {
82
- expect(() => hitlTool()).toThrow(/no runtime implementation/);
83
+ it("humanTool throws at runtime — it must be stripped by the compiler, never called", () => {
84
+ expect(() => humanTool()).toThrow(/no runtime implementation/);
83
85
  });
84
86
 
85
- it("hitl remains a compatibility alias", () => {
86
- expect(hitl).toBe(hitlTool);
87
+ it("hitlTool and hitl remain compatibility aliases", () => {
88
+ expect(hitlTool).toBe(humanTool);
89
+ expect(hitl).toBe(humanTool);
87
90
  });
88
91
 
89
92
  it("providerTool throws at runtime — it must be stripped by the compiler, never called", () => {
@@ -98,4 +101,8 @@ describe("use-generative markers", () => {
98
101
  it("stubTool throws at runtime — it must be stripped by the compiler, never called", () => {
99
102
  expect(() => stubTool()).toThrow(/no runtime implementation/);
100
103
  });
104
+
105
+ it("externalTool throws at runtime — it must be stripped by the compiler, never called", () => {
106
+ expect(() => externalTool()).toThrow(/no runtime implementation/);
107
+ });
101
108
  });
@@ -5,37 +5,36 @@ import type {
5
5
  } from "./toolbox";
6
6
 
7
7
  /**
8
- * Authoring helper for a `"use generative"` toolkit. Accepts the permissive
9
- * {@link ToolkitDefinition} (a `backend` tool may carry its server `execute`)
10
- * and types the result as the canonical {@link Toolkit}.
8
+ * Toolkit authoring helper. Accepts the permissive {@link ToolkitDefinition}
9
+ * (a generative `backend` tool may carry its server `execute`) and types the
10
+ * result as the canonical {@link Toolkit}.
11
11
  *
12
- * It has **no runtime implementation**. A `"use generative"` compiler (e.g.
13
- * `@assistant-ui/next` or `@assistant-ui/vite`) strips the `defineToolkit(...)`
14
- * wrapper (and its import) per build, so a correctly compiled
15
- * `export default defineToolkit({...})` never calls this. If it *does* run, the
16
- * module was not compiled by a use-generative loader — e.g. `defineToolkit` used
17
- * outside a `"use generative"` file — which would ship a backend `execute` to the
18
- * client. So it throws instead of silently leaking.
12
+ * In a `"use generative"` file, the compiler strips the wrapper per build so it
13
+ * can split schemas, renderers, and executors across the client/server boundary.
14
+ * Outside generative compilation, it returns the toolkit unchanged and can be
15
+ * used for plain frontend/backend/human toolkit objects.
19
16
  */
20
17
  export function defineToolkit<
21
18
  TArgsByName extends {
22
19
  [K in keyof TArgsByName]: Record<string, unknown>;
23
20
  },
24
21
  TResultByName extends { [K in keyof TArgsByName]: unknown } = {
25
- [K in keyof TArgsByName]: unknown;
22
+ [K in keyof TArgsByName]: any;
26
23
  },
27
24
  >(_definition: {
28
25
  [K in keyof TArgsByName]: ToolkitDefinitionEntryWithParameters<
29
26
  TArgsByName[K],
30
27
  TResultByName[K]
31
28
  >;
32
- }): Toolkit;
33
- export function defineToolkit(_definition: ToolkitDefinition): Toolkit;
29
+ }): Toolkit & {
30
+ [K in keyof TArgsByName]: ToolkitDefinitionEntryWithParameters<
31
+ TArgsByName[K],
32
+ TResultByName[K]
33
+ >;
34
+ };
35
+ export function defineToolkit<const TDefinition extends ToolkitDefinition>(
36
+ _definition: TDefinition,
37
+ ): Toolkit & TDefinition;
34
38
  export function defineToolkit(_definition: ToolkitDefinition): Toolkit {
35
- throw new Error(
36
- "[assistant-ui] defineToolkit() has no runtime implementation — it is " +
37
- "stripped at build time by the use-generative compiler. Reaching it means " +
38
- 'this module was not compiled (e.g. defineToolkit used outside a "use ' +
39
- 'generative" file). Add the directive, or do not use defineToolkit here.',
40
- );
39
+ return _definition as Toolkit;
41
40
  }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Marks a generative toolkit entry as an externally executed backend tool.
3
+ *
4
+ * Use this when another system (for example a backend route or LangGraph node)
5
+ * already defines and executes the tool, but assistant-ui should render its
6
+ * tool calls. The use-generative compiler omits `execute: externalTool()`
7
+ * entries from the server build and keeps a `type: "backend"` renderer on the
8
+ * client build.
9
+ */
10
+ export function externalTool(): never {
11
+ throw new Error(
12
+ "[assistant-ui] externalTool() has no runtime implementation - it marks a " +
13
+ "tool that executes outside assistant-ui and is stripped at build time " +
14
+ 'by the use-generative compiler. Make sure this module is compiled as "use generative".',
15
+ );
16
+ }
@@ -3,25 +3,30 @@
3
3
  * supplies the result instead of code. Use it as the tool's `execute`:
4
4
  *
5
5
  * ```tsx
6
- * confirm: { execute: hitlTool(), render: (props) => <Confirm {...props} /> }
6
+ * confirm: { execute: humanTool(), render: (props) => <Confirm {...props} /> }
7
7
  * ```
8
8
  *
9
- * Like {@link defineToolkit}, it has **no runtime implementation**: a
9
+ * Unlike {@link defineToolkit}, it has **no runtime implementation**: a
10
10
  * `"use generative"` compiler (e.g. `@assistant-ui/next` or `@assistant-ui/vite`)
11
- * detects `execute: hitlTool()`, drops it, and stamps the tool `type: "human"`.
11
+ * detects `execute: humanTool()`, drops it, and stamps the tool `type: "human"`.
12
12
  * Reaching it at runtime means the module wasn't compiled (used outside a
13
13
  * `"use generative"` file), so it throws.
14
14
  */
15
- export function hitlTool(): never {
15
+ export function humanTool(): never {
16
16
  throw new Error(
17
- "[assistant-ui] hitlTool() has no runtime implementation — it marks a " +
17
+ "[assistant-ui] humanTool() has no runtime implementation — it marks a " +
18
18
  "human-in-the-loop tool and is stripped at build time by the " +
19
19
  "use-generative compiler. Reaching it means this module was not compiled " +
20
- '(e.g. hitlTool() used outside a "use generative" file).',
20
+ '(e.g. humanTool() used outside a "use generative" file).',
21
21
  );
22
22
  }
23
23
 
24
24
  /**
25
- * @deprecated Use {@link hitlTool}.
25
+ * @deprecated Use {@link humanTool}.
26
26
  */
27
- export const hitl = hitlTool;
27
+ export const hitlTool = humanTool;
28
+
29
+ /**
30
+ * @deprecated Use {@link humanTool}.
31
+ */
32
+ export const hitl = humanTool;
@@ -128,7 +128,7 @@ export type ToolDefinition<
128
128
  *
129
129
  * @example
130
130
  * ```tsx
131
- * const toolkit = {
131
+ * const toolkit = defineToolkit({
132
132
  * get_weather: {
133
133
  * type: "frontend",
134
134
  * description: "Get the weather for a city.",
@@ -136,7 +136,7 @@ export type ToolDefinition<
136
136
  * execute: async ({ city }: { city: string }) => fetchWeather(city),
137
137
  * render: WeatherToolUI,
138
138
  * },
139
- * } satisfies Toolkit;
139
+ * });
140
140
  * ```
141
141
  */
142
142
  export type Toolkit = Record<string, ToolDefinition<any, any>>;
@@ -145,7 +145,7 @@ export type Toolkit = Record<string, ToolDefinition<any, any>>;
145
145
  * A tool as authored, before the build splits it: like {@link ToolDefinition}
146
146
  * but it may declare `description`, `parameters`, and a server-side `execute`
147
147
  * alongside its `render`. The `type` field is **not** authored — the
148
- * `"use generative"` compiler infers it (`execute: hitlTool()` → human;
148
+ * `"use generative"` compiler infers it (`execute: humanTool()` → human;
149
149
  * `execute: providerTool(...)` → provider; `execute` with a `"use client"`
150
150
  * directive → frontend; otherwise backend) and writes it back — so declaring it
151
151
  * here is a type error.
@@ -265,7 +265,7 @@ export const MessagePrimitiveGroupedParts = <TKey extends `group-${string}`>({
265
265
  const tree = useMemo(() => {
266
266
  const context: GroupByContext = { toolUIs };
267
267
  return buildGroupTree(parts.map((part) => groupBy(part, context) ?? []));
268
- // oxlint-disable-next-line tap-hooks/exhaustive-deps -- groupBy is captured via memoDep (either its identity or the helper's memoKey fingerprint); listing it directly would defeat the helper-tagged memo path
268
+ // oxlint-disable-next-line react/exhaustive-deps -- groupBy is captured via memoDep (either its identity or the helper's memoKey fingerprint); listing it directly would defeat the helper-tagged memo path
269
269
  }, [parts, memoDep, toolUIs]);
270
270
 
271
271
  return (
@@ -34,7 +34,7 @@ const usePartMessages = (): readonly ThreadMessage[] | undefined => {
34
34
  *
35
35
  * @example
36
36
  * ```tsx
37
- * const toolkit = {
37
+ * const toolkit = defineToolkit({
38
38
  * invoke_sub_agent: {
39
39
  * type: "backend",
40
40
  * render: () => (
@@ -46,7 +46,7 @@ const usePartMessages = (): readonly ThreadMessage[] | undefined => {
46
46
  * </PartPrimitive.Messages>
47
47
  * ),
48
48
  * },
49
- * } satisfies Toolkit;
49
+ * });
50
50
  * ```
51
51
  */
52
52
  export const PartPrimitiveMessagesImpl: FC<PartPrimitiveMessages.Props> = ({
@@ -1,39 +1,38 @@
1
- import type { FC, PropsWithChildren } from "react";
1
+ import { type FC, type PropsWithChildren, useMemo } from "react";
2
2
  import { useAui, AuiProvider, type ClientOutput } from "@assistant-ui/store";
3
3
  import type { PartState } from "../../store/scopes/part";
4
- import { resource, tapMemo } from "@assistant-ui/tap";
5
4
 
6
- const TextMessagePartClient = resource(
7
- ({
8
- text,
9
- isRunning,
10
- }: {
11
- text: string;
12
- isRunning: boolean;
13
- }): ClientOutput<"part"> => {
14
- const state = tapMemo<PartState>(
15
- () => ({
16
- type: "text",
17
- text,
18
- status: isRunning ? { type: "running" } : { type: "complete" },
19
- }),
20
- [text, isRunning],
21
- );
5
+ import { resource } from "@assistant-ui/tap";
6
+
7
+ const TextMessagePartClient = resource(function TextMessagePartClient({
8
+ text,
9
+ isRunning,
10
+ }: {
11
+ text: string;
12
+ isRunning: boolean;
13
+ }): ClientOutput<"part"> {
14
+ const state = useMemo<PartState>(
15
+ () => ({
16
+ type: "text",
17
+ text,
18
+ status: isRunning ? { type: "running" } : { type: "complete" },
19
+ }),
20
+ [text, isRunning],
21
+ );
22
22
 
23
- return {
24
- getState: () => state,
25
- addToolResult: () => {
26
- throw new Error("Not supported");
27
- },
28
- resumeToolCall: () => {
29
- throw new Error("Not supported");
30
- },
31
- respondToToolApproval: () => {
32
- throw new Error("Not supported");
33
- },
34
- };
35
- },
36
- );
23
+ return {
24
+ getState: () => state,
25
+ addToolResult: () => {
26
+ throw new Error("Not supported");
27
+ },
28
+ resumeToolCall: () => {
29
+ throw new Error("Not supported");
30
+ },
31
+ respondToToolApproval: () => {
32
+ throw new Error("Not supported");
33
+ },
34
+ };
35
+ });
37
36
 
38
37
  export const TextMessagePartProvider: FC<
39
38
  PropsWithChildren<{
@@ -5,6 +5,7 @@ import { useAui, useAuiState } from "@assistant-ui/store";
5
5
  import {
6
6
  useExternalMessageConverter,
7
7
  convertExternalMessages,
8
+ type JoinStrategy,
8
9
  } from "./external-message-converter";
9
10
  import { getExternalStoreMessages } from "../../runtime/utils/external-store-message";
10
11
 
@@ -20,7 +21,7 @@ export const createMessageConverter = <T extends object>(
20
21
  }: {
21
22
  messages: T[];
22
23
  isRunning: boolean;
23
- joinStrategy?: "concat-content" | "none" | undefined;
24
+ joinStrategy?: JoinStrategy | undefined;
24
25
  metadata?: useExternalMessageConverter.Metadata;
25
26
  }) => {
26
27
  return useExternalMessageConverter<T>({
@@ -22,6 +22,8 @@ import type {
22
22
  } from "../../types/message";
23
23
  import type { MessageTiming } from "../../types/message";
24
24
 
25
+ export type JoinStrategy = "concat-content" | "none";
26
+
25
27
  type ThreadMessageLikeContentItem = Exclude<
26
28
  ThreadMessageLike["content"],
27
29
  string
@@ -42,7 +44,7 @@ export namespace useExternalMessageConverter {
42
44
  export type Message =
43
45
  | (ThreadMessageLike & {
44
46
  readonly convertConfig?: {
45
- readonly joinStrategy?: "concat-content" | "none";
47
+ readonly joinStrategy?: JoinStrategy;
46
48
  };
47
49
  })
48
50
  | {
@@ -264,7 +266,7 @@ const joinExternalMessages = (
264
266
 
265
267
  const chunkExternalMessages = <T>(
266
268
  callbackResults: CallbackResult<T>[],
267
- joinStrategy?: "concat-content" | "none",
269
+ joinStrategy?: JoinStrategy,
268
270
  ) => {
269
271
  const results: ChunkResult<T>[] = [];
270
272
  let isAssistant = false;
@@ -397,7 +399,7 @@ export const useExternalMessageConverter = <T extends WeakKey>({
397
399
  callback: useExternalMessageConverter.Callback<T>;
398
400
  messages: T[];
399
401
  isRunning: boolean;
400
- joinStrategy?: "concat-content" | "none" | undefined;
402
+ joinStrategy?: JoinStrategy | undefined;
401
403
  metadata?: useExternalMessageConverter.Metadata | undefined;
402
404
  }) => {
403
405
  const state = useMemo(
@@ -71,6 +71,7 @@ export const splitLocalRuntimeOptions = <T extends LocalRuntimeOptions>(
71
71
  maxSteps,
72
72
  adapters,
73
73
  unstable_humanToolNames,
74
+ unstable_enableMessageQueue,
74
75
  ...rest
75
76
  } = options;
76
77
 
@@ -81,6 +82,7 @@ export const splitLocalRuntimeOptions = <T extends LocalRuntimeOptions>(
81
82
  maxSteps,
82
83
  adapters,
83
84
  unstable_humanToolNames,
85
+ unstable_enableMessageQueue,
84
86
  },
85
87
  otherOptions: rest,
86
88
  };