@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,182 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { makeToolCallTextComponent } from "./toolbox";
3
+
4
+ describe("makeToolCallTextComponent", () => {
5
+ it("renders static running and complete text", () => {
6
+ const Render = makeToolCallTextComponent({
7
+ running: "Searching...",
8
+ complete: "Done searching",
9
+ });
10
+
11
+ expect(
12
+ Render({
13
+ type: "tool-call",
14
+ toolCallId: "call-1",
15
+ toolName: "search",
16
+ args: {},
17
+ argsText: "{}",
18
+ status: { type: "running" },
19
+ addResult: () => {},
20
+ resume: () => {},
21
+ respondToApproval: () => {},
22
+ }),
23
+ ).toBe("Searching...");
24
+
25
+ expect(
26
+ Render({
27
+ type: "tool-call",
28
+ toolCallId: "call-1",
29
+ toolName: "search",
30
+ args: {},
31
+ argsText: "{}",
32
+ result: "ok",
33
+ status: { type: "complete" },
34
+ addResult: () => {},
35
+ resume: () => {},
36
+ respondToApproval: () => {},
37
+ }),
38
+ ).toBe("Done searching");
39
+ });
40
+
41
+ it("passes args and result to dynamic text functions", () => {
42
+ const Render = makeToolCallTextComponent<
43
+ { query: string },
44
+ { count: number }
45
+ >({
46
+ running: ({ args }) => `Searching ${args.query}...`,
47
+ complete: ({ args, result }) =>
48
+ `Found ${result?.count ?? 0} results for ${args.query}`,
49
+ });
50
+
51
+ expect(
52
+ Render({
53
+ type: "tool-call",
54
+ toolCallId: "call-1",
55
+ toolName: "search",
56
+ args: { query: "docs" },
57
+ argsText: '{"query":"docs"}',
58
+ status: { type: "running" },
59
+ addResult: () => {},
60
+ resume: () => {},
61
+ respondToApproval: () => {},
62
+ }),
63
+ ).toBe("Searching docs...");
64
+
65
+ expect(
66
+ Render({
67
+ type: "tool-call",
68
+ toolCallId: "call-1",
69
+ toolName: "search",
70
+ args: { query: "docs" },
71
+ argsText: '{"query":"docs"}',
72
+ result: { count: 3 },
73
+ status: { type: "complete" },
74
+ addResult: () => {},
75
+ resume: () => {},
76
+ respondToApproval: () => {},
77
+ }),
78
+ ).toBe("Found 3 results for docs");
79
+ });
80
+
81
+ it("treats missing status as complete", () => {
82
+ const Render = makeToolCallTextComponent({
83
+ running: "Running",
84
+ complete: "Complete",
85
+ });
86
+
87
+ expect(
88
+ Render({
89
+ type: "tool-call",
90
+ toolCallId: "call-1",
91
+ toolName: "search",
92
+ args: {},
93
+ argsText: "{}",
94
+ addResult: () => {},
95
+ resume: () => {},
96
+ respondToApproval: () => {},
97
+ }),
98
+ ).toBe("Complete");
99
+ });
100
+
101
+ it("treats incomplete status as a terminal state", () => {
102
+ const Render = makeToolCallTextComponent({
103
+ running: "Searching...",
104
+ complete: "Finished",
105
+ });
106
+
107
+ expect(
108
+ Render({
109
+ type: "tool-call",
110
+ toolCallId: "call-1",
111
+ toolName: "search",
112
+ args: {},
113
+ argsText: "{}",
114
+ status: { type: "incomplete", reason: "error" },
115
+ addResult: () => {},
116
+ resume: () => {},
117
+ respondToApproval: () => {},
118
+ }),
119
+ ).toBe("Finished");
120
+ });
121
+
122
+ it("treats requires-action status as running", () => {
123
+ const Render = makeToolCallTextComponent({
124
+ running: "Waiting for approval...",
125
+ complete: "Done",
126
+ });
127
+
128
+ expect(
129
+ Render({
130
+ type: "tool-call",
131
+ toolCallId: "call-1",
132
+ toolName: "confirm",
133
+ args: {},
134
+ argsText: "{}",
135
+ status: { type: "requires-action", reason: "interrupt" },
136
+ addResult: () => {},
137
+ resume: () => {},
138
+ respondToApproval: () => {},
139
+ }),
140
+ ).toBe("Waiting for approval...");
141
+ });
142
+
143
+ it("renders null for terminal status when only running text is provided", () => {
144
+ const Render = makeToolCallTextComponent({
145
+ running: "Searching...",
146
+ });
147
+
148
+ expect(
149
+ Render({
150
+ type: "tool-call",
151
+ toolCallId: "call-1",
152
+ toolName: "search",
153
+ args: {},
154
+ argsText: "{}",
155
+ status: { type: "complete" },
156
+ addResult: () => {},
157
+ resume: () => {},
158
+ respondToApproval: () => {},
159
+ }),
160
+ ).toBeNull();
161
+ });
162
+
163
+ it("renders null for running status when only complete text is provided", () => {
164
+ const Render = makeToolCallTextComponent({
165
+ complete: "Done",
166
+ });
167
+
168
+ expect(
169
+ Render({
170
+ type: "tool-call",
171
+ toolCallId: "call-1",
172
+ toolName: "search",
173
+ args: {},
174
+ argsText: "{}",
175
+ status: { type: "running" },
176
+ addResult: () => {},
177
+ resume: () => {},
178
+ respondToApproval: () => {},
179
+ }),
180
+ ).toBeNull();
181
+ });
182
+ });
@@ -1,5 +1,14 @@
1
- import type { Tool, ToolDeclaration } from "assistant-stream";
2
- import type { ToolCallMessagePartComponent } from "../types/MessagePartComponentTypes";
1
+ import type {
2
+ Tool,
3
+ ToolCallReader,
4
+ ToolDeclaration,
5
+ ToolModelOutputFunction,
6
+ } from "assistant-stream";
7
+ import type { ReactNode } from "react";
8
+ import type {
9
+ ToolCallMessagePartComponent,
10
+ ToolCallMessagePartProps,
11
+ } from "../types/MessagePartComponentTypes";
3
12
 
4
13
  /**
5
14
  * Resolves whether a tool's UI should be presented standalone (outside the
@@ -20,23 +29,96 @@ export const isStandaloneToolDisplay = (
20
29
  type WithRender<T, TArgs extends Record<string, unknown>, TResult> = T extends {
21
30
  type: "frontend" | "human";
22
31
  }
23
- ? T & { render: ToolCallMessagePartComponent<TArgs, TResult> }
32
+ ? T &
33
+ (T extends { type: "frontend" }
34
+ ?
35
+ | { render: ToolCallMessagePartComponent<TArgs, TResult> }
36
+ | {
37
+ render?: ToolCallMessagePartComponent<TArgs, TResult>;
38
+ renderText: ToolCallText<TArgs, TResult>;
39
+ }
40
+ : { render: ToolCallMessagePartComponent<TArgs, TResult> })
24
41
  : T & {
25
42
  render?: ToolCallMessagePartComponent<TArgs, TResult> | undefined;
43
+ renderText?: ToolCallText<TArgs, TResult> | undefined;
26
44
  };
27
45
 
46
+ type ToolParameters<TArgs extends Record<string, unknown>> =
47
+ ToolDeclaration<TArgs>["parameters"];
48
+
49
+ // ToolExecutionContext is not re-exported from assistant-stream's public entry.
50
+ type ToolExecuteContext = Parameters<
51
+ NonNullable<ToolDeclaration["execute"]>
52
+ >[1];
53
+
54
+ type ToolExecute<TArgs extends Record<string, unknown>, TResult> = (
55
+ args: TArgs,
56
+ context: ToolExecuteContext,
57
+ ) => TResult | Promise<TResult>;
58
+
59
+ type ToolStreamCall<TArgs extends Record<string, unknown>, TResult> = (
60
+ reader: ToolCallReader<TArgs, TResult>,
61
+ context: ToolExecuteContext,
62
+ ) => void;
63
+
64
+ type ToolCallRunningText<TArgs extends Record<string, unknown>> =
65
+ | ReactNode
66
+ | ((options: { args: TArgs }) => ReactNode);
67
+
68
+ type ToolCallCompleteText<TArgs extends Record<string, unknown>, TResult> =
69
+ | ReactNode
70
+ | ((options: { args: TArgs; result: TResult | undefined }) => ReactNode);
71
+
72
+ export type ToolCallText<TArgs extends Record<string, unknown>, TResult> =
73
+ | {
74
+ running: ToolCallRunningText<TArgs>;
75
+ complete?: ToolCallCompleteText<TArgs, TResult> | undefined;
76
+ }
77
+ | {
78
+ running?: ToolCallRunningText<TArgs> | undefined;
79
+ complete: ToolCallCompleteText<TArgs, TResult>;
80
+ };
81
+
82
+ const resolveToolCallText = <TArgs extends Record<string, unknown>, TResult>(
83
+ text: ToolCallText<TArgs, TResult>,
84
+ part: ToolCallMessagePartProps<TArgs, TResult>,
85
+ ): ReactNode => {
86
+ const isRunning =
87
+ part.status?.type === "running" || part.status?.type === "requires-action";
88
+
89
+ if (!isRunning) {
90
+ const value = text.complete;
91
+ if (typeof value !== "function") return value ?? null;
92
+ return value({ args: part.args, result: part.result });
93
+ }
94
+
95
+ const value = text.running;
96
+ if (typeof value !== "function") return value ?? null;
97
+ return value({ args: part.args });
98
+ };
99
+
100
+ export const makeToolCallTextComponent = <
101
+ TArgs extends Record<string, unknown>,
102
+ TResult,
103
+ >(
104
+ text: ToolCallText<TArgs, TResult>,
105
+ ): ToolCallMessagePartComponent<TArgs, TResult> => {
106
+ return function ToolCallTextComponent(part) {
107
+ return resolveToolCallText(text, part);
108
+ };
109
+ };
110
+
28
111
  /**
29
112
  * Tool definition accepted by the React tool registry.
30
113
  *
31
- * Extends the core tool contract with a render component. Human tools rely on
32
- * the renderer to collect input from the user. Frontend tools execute in the
33
- * browser and require a UI surface for their progress and result. Backend
34
- * tools execute server-side and may omit a renderer. The `render` component is
35
- * required for frontend and human tools and optional for backend tools.
114
+ * Extends the core tool contract with tool-call display options. Human tools
115
+ * rely on `render` to collect input from the user. Frontend tools execute in
116
+ * the browser and require either `render` or `renderText` for their progress
117
+ * and result. Backend tools execute server-side and may omit a renderer.
36
118
  */
37
119
  export type ToolDefinition<
38
- TArgs extends Record<string, unknown>,
39
- TResult,
120
+ TArgs extends Record<string, unknown> = Record<string, unknown>,
121
+ TResult = unknown,
40
122
  > = WithRender<Tool<TArgs, TResult>, TArgs, TResult>;
41
123
 
42
124
  /**
@@ -46,7 +128,7 @@ export type ToolDefinition<
46
128
  *
47
129
  * @example
48
130
  * ```tsx
49
- * const toolkit = {
131
+ * const toolkit = defineToolkit({
50
132
  * get_weather: {
51
133
  * type: "frontend",
52
134
  * description: "Get the weather for a city.",
@@ -54,7 +136,7 @@ export type ToolDefinition<
54
136
  * execute: async ({ city }: { city: string }) => fetchWeather(city),
55
137
  * render: WeatherToolUI,
56
138
  * },
57
- * } satisfies Toolkit;
139
+ * });
58
140
  * ```
59
141
  */
60
142
  export type Toolkit = Record<string, ToolDefinition<any, any>>;
@@ -63,19 +145,96 @@ export type Toolkit = Record<string, ToolDefinition<any, any>>;
63
145
  * A tool as authored, before the build splits it: like {@link ToolDefinition}
64
146
  * but it may declare `description`, `parameters`, and a server-side `execute`
65
147
  * alongside its `render`. The `type` field is **not** authored — the
66
- * `"use generative"` compiler infers it (`execute: hitl()` → human; `execute`
67
- * with a `"use client"` directive frontend; otherwise backend) and writes it
68
- * back so declaring it here is a type error.
148
+ * `"use generative"` compiler infers it (`execute: humanTool()` → human;
149
+ * `execute: providerTool(...)` → provider; `execute` with a `"use client"`
150
+ * directive frontend; otherwise backend) and writes it back so declaring it
151
+ * here is a type error.
69
152
  */
70
- export type ToolkitDeclarationDefinition<
153
+ type OverrideOptionalField<
154
+ T,
155
+ TKey extends keyof T,
156
+ TValue,
157
+ > = undefined extends T[TKey]
158
+ ? // Preserve `?: undefined` fields (for variants that explicitly disallow a
159
+ // callback) instead of widening them to accept the override value.
160
+ Exclude<T[TKey], undefined> extends never
161
+ ? { [K in TKey]?: undefined }
162
+ : { [K in TKey]?: TValue | undefined }
163
+ : { [K in TKey]: TValue };
164
+
165
+ type OverrideToolDeclarationCallbacks<
166
+ T extends { streamCall?: unknown },
167
+ TArgs extends Record<string, unknown>,
168
+ TResult,
169
+ > = Omit<
170
+ T,
171
+ | "type"
172
+ | "execute"
173
+ | "toModelOutput"
174
+ | "experimental_onSchemaValidationError"
175
+ | "streamCall"
176
+ > & {
177
+ type?: never;
178
+ } & ("execute" extends keyof T
179
+ ? OverrideOptionalField<T, "execute", ToolExecute<NoInfer<TArgs>, TResult>>
180
+ : {}) &
181
+ ("toModelOutput" extends keyof T
182
+ ? OverrideOptionalField<
183
+ T,
184
+ "toModelOutput",
185
+ ToolModelOutputFunction<NoInfer<TArgs>, NoInfer<TResult>>
186
+ >
187
+ : {}) &
188
+ ("experimental_onSchemaValidationError" extends keyof T
189
+ ? OverrideOptionalField<
190
+ T,
191
+ "experimental_onSchemaValidationError",
192
+ (
193
+ args: unknown,
194
+ context: ToolExecuteContext,
195
+ ) => NoInfer<TResult> | Promise<NoInfer<TResult>>
196
+ >
197
+ : {}) &
198
+ OverrideOptionalField<
199
+ T,
200
+ "streamCall",
201
+ ToolStreamCall<TArgs, NoInfer<TResult>>
202
+ >;
203
+
204
+ // Keep the authored shape tied to ToolDeclaration's union variants while
205
+ // overriding callback fields to avoid inference pollution.
206
+ type ToolkitDefinitionInput<
71
207
  TArgs extends Record<string, unknown>,
72
208
  TResult,
73
209
  > = WithRender<
74
- Omit<ToolDeclaration<TArgs, TResult>, "type">,
210
+ ToolDeclaration<TArgs, TResult> extends infer T
211
+ ? T extends { streamCall?: unknown }
212
+ ? OverrideToolDeclarationCallbacks<T, TArgs, TResult>
213
+ : never
214
+ : never,
75
215
  TArgs,
76
216
  TResult
77
- > & {
78
- type?: never;
217
+ >;
218
+
219
+ /**
220
+ * A single entry in a {@link ToolkitDefinition}.
221
+ *
222
+ * Either authored inline (whose `type` the compiler infers) or an already-formed
223
+ * {@link ToolDefinition} produced by a factory whose own build splits it across
224
+ * targets — e.g. `new JSONGenerativeUI({ library }).present()`. The factory case
225
+ * carries a `type`, so it can only match the {@link ToolDefinition} arm of this
226
+ * union.
227
+ */
228
+ export type ToolkitDefinitionEntry<
229
+ TArgs extends Record<string, unknown> = Record<string, unknown>,
230
+ TResult = unknown,
231
+ > = ToolkitDefinitionInput<TArgs, TResult> | ToolDefinition<any, any>;
232
+
233
+ export type ToolkitDefinitionEntryWithParameters<
234
+ TArgs extends Record<string, unknown> = Record<string, unknown>,
235
+ TResult = unknown,
236
+ > = ToolkitDefinitionInput<TArgs, TResult> & {
237
+ parameters: NonNullable<ToolParameters<TArgs>>;
79
238
  };
80
239
 
81
240
  /**
@@ -83,10 +242,19 @@ export type ToolkitDeclarationDefinition<
83
242
  * {@link defineToolkit}. Backend entries may carry their server `execute` here;
84
243
  * the canonical {@link Toolkit} keeps those fields `undefined`.
85
244
  */
86
- export type ToolkitDeclaration = Record<
87
- string,
88
- ToolkitDeclarationDefinition<any, any>
89
- >;
245
+ export type ToolkitDefinition<
246
+ TArgsByName extends {
247
+ [K in keyof TArgsByName]: Record<string, unknown>;
248
+ } = Record<string, any>,
249
+ TResultByName extends { [K in keyof TArgsByName]: unknown } = {
250
+ [K in keyof TArgsByName]: any;
251
+ },
252
+ > = {
253
+ [K in keyof TArgsByName]: ToolkitDefinitionEntry<
254
+ TArgsByName[K],
255
+ TResultByName[K]
256
+ >;
257
+ };
90
258
 
91
259
  /** Configuration for the {@link Tools} resource. */
92
260
  export type ToolsConfig = {
@@ -1,11 +1,19 @@
1
- import { useEffect } from "react";
1
+ import { useEffect, useMemo } from "react";
2
2
  import { useAui } from "@assistant-ui/store";
3
3
  import type { ToolCallMessagePartComponent } from "../types/MessagePartComponentTypes";
4
4
  import type { AssistantToolProps as CoreAssistantToolProps } from "../..";
5
- import { isStandaloneToolDisplay } from "./toolbox";
5
+ import {
6
+ isStandaloneToolDisplay,
7
+ makeToolCallTextComponent,
8
+ type ToolCallText,
9
+ } from "./toolbox";
6
10
 
7
11
  /**
8
12
  * Props used to register a tool from React.
13
+ *
14
+ * @deprecated Use a toolkit with `Tools({ toolkit })` and register it via
15
+ * `useAui({ tools: Tools({ toolkit }) })` instead. See
16
+ * https://assistant-ui.com/docs/migrations/toolkit-tools.
9
17
  */
10
18
  export type AssistantToolProps<
11
19
  TArgs extends Record<string, unknown>,
@@ -13,6 +21,8 @@ export type AssistantToolProps<
13
21
  > = CoreAssistantToolProps<TArgs, TResult> & {
14
22
  /** Component used to render calls to this tool in assistant messages. */
15
23
  render?: ToolCallMessagePartComponent<TArgs, TResult> | undefined;
24
+ /** Lightweight text rendered while a tool call is running or complete. */
25
+ renderText?: ToolCallText<TArgs, TResult> | undefined;
16
26
  };
17
27
 
18
28
  /**
@@ -28,6 +38,10 @@ export type AssistantToolProps<
28
38
  *
29
39
  * @param tool - Tool definition and name to register.
30
40
  *
41
+ * @deprecated Use a toolkit with `Tools({ toolkit })` and register it via
42
+ * `useAui({ tools: Tools({ toolkit }) })` instead. See
43
+ * https://assistant-ui.com/docs/migrations/toolkit-tools.
44
+ *
31
45
  * @example
32
46
  * ```tsx
33
47
  * const weatherTool = {
@@ -54,16 +68,22 @@ export const useAssistantTool = <
54
68
  const aui = useAui();
55
69
 
56
70
  const standalone = isStandaloneToolDisplay(tool);
71
+ const renderTextComponent = useMemo(
72
+ () =>
73
+ tool.renderText ? makeToolCallTextComponent(tool.renderText) : undefined,
74
+ [tool.renderText],
75
+ );
76
+ const render = tool.render ?? renderTextComponent;
57
77
 
58
78
  useEffect(() => {
59
- if (!tool.render) return undefined;
60
- return aui.tools().setToolUI(tool.toolName, tool.render, { standalone });
61
- }, [aui, tool.toolName, tool.render, standalone]);
79
+ if (!render) return undefined;
80
+ return aui.tools().setToolUI(tool.toolName, render, { standalone });
81
+ }, [aui, tool.toolName, render, standalone]);
62
82
 
63
83
  useEffect(() => {
64
- // `render` and `display` are client-only presentation concerns and never
65
- // reach the model.
66
- const { toolName, render, display, ...rest } = tool;
84
+ // `render`, `renderText`, and `display` are client-only presentation
85
+ // concerns and never reach the model.
86
+ const { toolName, render, renderText, display, ...rest } = tool;
67
87
  const context = {
68
88
  tools: {
69
89
  [toolName]: rest,
@@ -2,7 +2,13 @@ import { useEffect } from "react";
2
2
  import { useAui } from "@assistant-ui/store";
3
3
  import type { ToolCallMessagePartComponent } from "../types/MessagePartComponentTypes";
4
4
 
5
- /** Props used to register a renderer for tool-call message parts. */
5
+ /**
6
+ * Props used to register a renderer for tool-call message parts.
7
+ *
8
+ * @deprecated Put `render`/`renderText` on the matching toolkit entry, or use
9
+ * `MessagePrimitive.Parts` inline tool render overrides for per-message UI.
10
+ * See https://assistant-ui.com/docs/migrations/toolkit-tools.
11
+ */
6
12
  export type AssistantToolUIProps<TArgs, TResult> = {
7
13
  /** Name of the tool whose calls should use this renderer. */
8
14
  toolName: string;
@@ -19,11 +25,14 @@ export type AssistantToolUIProps<TArgs, TResult> = {
19
25
  /**
20
26
  * Registers a tool-call renderer while the component is mounted.
21
27
  *
22
- * This only affects rendering. Pair it with {@link useAssistantTool},
23
- * {@link Tools}, or a backend tool registry to expose the actual tool
24
- * definition to the model.
28
+ * This only affects rendering. Pair it with {@link Tools} or a backend tool
29
+ * registry to expose the actual tool definition to the model.
25
30
  *
26
31
  * @param tool - Tool renderer registration, or `null` to skip registration.
32
+ *
33
+ * @deprecated Put `render`/`renderText` on the matching toolkit entry, or use
34
+ * `MessagePrimitive.Parts` inline tool render overrides for per-message UI.
35
+ * See https://assistant-ui.com/docs/migrations/toolkit-tools.
27
36
  */
28
37
  export const useAssistantToolUI = (
29
38
  tool: AssistantToolUIProps<any, any> | null,
@@ -0,0 +1,38 @@
1
+ import { useEffect, useRef } from "react";
2
+ import { useAui } from "@assistant-ui/store";
3
+ import type { Tool } from "assistant-stream";
4
+
5
+ type AuiToolOverride<
6
+ TArgs extends Record<string, unknown> = Record<string, unknown>,
7
+ TResult = unknown,
8
+ > = Partial<Tool<TArgs, TResult>>;
9
+
10
+ type AuiToolOverrides = Record<string, AuiToolOverride<any, any>>;
11
+
12
+ /**
13
+ * Overrides toolkit entries for the current assistant scope.
14
+ *
15
+ * This is intended for dynamic local-state tools whose model-facing contract is
16
+ * declared in a `"use generative"` toolkit file with `execute: stubTool()`, but
17
+ * whose actual executor must close over React state in the mounted component.
18
+ * Keep the override keys stable after mount; dynamic key addition/removal is not
19
+ * currently observed.
20
+ * Overrides are registered at priority 1000, above toolkit defaults. Only one
21
+ * mounted override provider may define a given tool name at a time.
22
+ *
23
+ * @deprecated Experimental, API may change.
24
+ */
25
+ export function useAuiToolOverrides(overrides: AuiToolOverrides): void {
26
+ const aui = useAui();
27
+ const overridesRef = useRef(overrides);
28
+ overridesRef.current = overrides;
29
+
30
+ useEffect(() => {
31
+ return aui.modelContext().register({
32
+ getModelContext: () => ({
33
+ priority: 1000,
34
+ tools: overridesRef.current as Record<string, Tool<any, any>>,
35
+ }),
36
+ });
37
+ }, [aui]);
38
+ }
@@ -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,16 +34,18 @@ const usePartMessages = (): readonly ThreadMessage[] | undefined => {
34
34
  *
35
35
  * @example
36
36
  * ```tsx
37
- * const SubAgentToolUI = makeAssistantToolUI({
38
- * toolName: "invoke_sub_agent",
39
- * render: () => (
40
- * <PartPrimitive.Messages>
41
- * {({ message }) => {
42
- * if (message.role === "user") return <MyUserMessage />;
43
- * return <MyAssistantMessage />;
44
- * }}
45
- * </PartPrimitive.Messages>
46
- * ),
37
+ * const toolkit = defineToolkit({
38
+ * invoke_sub_agent: {
39
+ * type: "backend",
40
+ * render: () => (
41
+ * <PartPrimitive.Messages>
42
+ * {({ message }) => {
43
+ * if (message.role === "user") return <MyUserMessage />;
44
+ * return <MyAssistantMessage />;
45
+ * }}
46
+ * </PartPrimitive.Messages>
47
+ * ),
48
+ * },
47
49
  * });
48
50
  * ```
49
51
  */