@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
@@ -1,6 +1,6 @@
1
1
  import { RuntimeAdapterProvider } from "../runtimes/RuntimeAdapterProvider.js";
2
2
  import { createAssistantStream } from "assistant-stream";
3
- import { useMemo } from "react";
3
+ import { useMemo } from "@assistant-ui/tap/react-shim";
4
4
  import { useAui } from "@assistant-ui/store";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  //#region src/react/adapters/LocalStorageThreadListAdapter.tsx
@@ -64,7 +64,8 @@ const createLocalStorageAdapter = (options) => {
64
64
  remoteId: t.remoteId,
65
65
  externalId: t.externalId,
66
66
  status: t.status,
67
- title: t.title
67
+ title: t.title,
68
+ custom: t.custom
68
69
  })) };
69
70
  },
70
71
  async initialize(threadId) {
@@ -90,6 +91,14 @@ const createLocalStorageAdapter = (options) => {
90
91
  await saveThreadMetadata(threads);
91
92
  }
92
93
  },
94
+ async updateCustom(remoteId, custom) {
95
+ const threads = await loadThreadMetadata();
96
+ const thread = threads.find((t) => t.remoteId === remoteId);
97
+ if (thread) {
98
+ thread.custom = custom;
99
+ await saveThreadMetadata(threads);
100
+ }
101
+ },
93
102
  async archive(remoteId) {
94
103
  const threads = await loadThreadMetadata();
95
104
  const thread = threads.find((t) => t.remoteId === remoteId);
@@ -117,7 +126,8 @@ const createLocalStorageAdapter = (options) => {
117
126
  remoteId: thread.remoteId,
118
127
  externalId: thread.externalId,
119
128
  status: thread.status,
120
- title: thread.title
129
+ title: thread.title,
130
+ custom: thread.custom
121
131
  };
122
132
  },
123
133
  async generateTitle(remoteId, messages) {
@@ -1 +1 @@
1
- {"version":3,"file":"LocalStorageThreadListAdapter.js","names":[],"sources":["../../../src/react/adapters/LocalStorageThreadListAdapter.tsx"],"sourcesContent":["import { type AssistantStream, createAssistantStream } from \"assistant-stream\";\nimport { type FC, type PropsWithChildren, useMemo } from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport type {\n RemoteThreadInitializeResponse,\n RemoteThreadListAdapter,\n RemoteThreadListResponse,\n RemoteThreadMetadata,\n ThreadHistoryAdapter,\n ThreadMessage,\n} from \"../../index\";\nimport type {\n ExportedMessageRepository,\n ExportedMessageRepositoryItem,\n} from \"../../internal\";\nimport { RuntimeAdapterProvider } from \"../runtimes/RuntimeAdapterProvider\";\nimport type { TitleGenerationAdapter } from \"./TitleGenerationAdapter\";\n\nexport type AsyncStorageLike = {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n};\n\ntype LocalStorageAdapterOptions = {\n storage: AsyncStorageLike;\n prefix?: string | undefined;\n titleGenerator?: TitleGenerationAdapter | undefined;\n};\n\n// `RemoteThreadMetadata.custom` is intentionally not persisted; consumers that\n// need it across reloads should fork this adapter or use a remote backend.\ntype StoredThreadMetadata = {\n remoteId: string;\n externalId?: string;\n status: \"regular\" | \"archived\";\n title?: string;\n};\n\nclass AsyncStorageHistoryAdapter implements ThreadHistoryAdapter {\n constructor(\n private storage: AsyncStorageLike,\n private aui: ReturnType<typeof useAui>,\n private prefix: string,\n ) {}\n\n private _messagesKey(remoteId: string) {\n return `${this.prefix}messages:${remoteId}`;\n }\n\n async load(): Promise<ExportedMessageRepository> {\n const remoteId = this.aui.threadListItem().getState().remoteId;\n if (!remoteId) return { messages: [] };\n\n const raw = await this.storage.getItem(this._messagesKey(remoteId));\n if (!raw) return { messages: [] };\n return JSON.parse(raw) as ExportedMessageRepository;\n }\n\n async append(item: ExportedMessageRepositoryItem): Promise<void> {\n const { remoteId } = await this.aui.threadListItem().initialize();\n\n const key = this._messagesKey(remoteId);\n const raw = await this.storage.getItem(key);\n const repo: ExportedMessageRepository = raw\n ? (JSON.parse(raw) as ExportedMessageRepository)\n : { messages: [] };\n\n const idx = repo.messages.findIndex(\n (m) => m.message.id === item.message.id,\n );\n if (idx >= 0) {\n repo.messages[idx] = item;\n } else {\n repo.messages.push(item);\n }\n repo.headId = item.message.id;\n\n await this.storage.setItem(key, JSON.stringify(repo));\n }\n}\n\nconst createHistoryProvider = (\n storage: AsyncStorageLike,\n prefix: string,\n): FC<PropsWithChildren> => {\n const Provider: FC<PropsWithChildren> = ({ children }) => {\n const aui = useAui();\n const history = useMemo(\n () => new AsyncStorageHistoryAdapter(storage, aui, prefix),\n [aui],\n );\n const adapters = useMemo(() => ({ history }), [history]);\n\n return (\n <RuntimeAdapterProvider adapters={adapters}>\n {children}\n </RuntimeAdapterProvider>\n );\n };\n return Provider;\n};\n\nexport const createLocalStorageAdapter = (\n options: LocalStorageAdapterOptions,\n): RemoteThreadListAdapter => {\n const { storage, prefix = \"@assistant-ui:\", titleGenerator } = options;\n\n const threadsKey = `${prefix}threads`;\n const messagesKey = (threadId: string) => `${prefix}messages:${threadId}`;\n\n const loadThreadMetadata = async (): Promise<StoredThreadMetadata[]> => {\n const raw = await storage.getItem(threadsKey);\n return raw ? (JSON.parse(raw) as StoredThreadMetadata[]) : [];\n };\n\n const saveThreadMetadata = async (\n threads: StoredThreadMetadata[],\n ): Promise<void> => {\n await storage.setItem(threadsKey, JSON.stringify(threads));\n };\n\n const adapter: RemoteThreadListAdapter = {\n unstable_Provider: createHistoryProvider(storage, prefix),\n\n async list(): Promise<RemoteThreadListResponse> {\n const threads = await loadThreadMetadata();\n return {\n threads: threads.map((t) => ({\n remoteId: t.remoteId,\n externalId: t.externalId,\n status: t.status,\n title: t.title,\n })),\n };\n },\n\n async initialize(\n threadId: string,\n ): Promise<RemoteThreadInitializeResponse> {\n const remoteId = threadId;\n const threads = await loadThreadMetadata();\n\n // Only add if not already present\n if (!threads.some((t) => t.remoteId === remoteId)) {\n threads.unshift({\n remoteId,\n status: \"regular\",\n });\n await saveThreadMetadata(threads);\n }\n\n return { remoteId, externalId: undefined };\n },\n\n async rename(remoteId: string, newTitle: string): Promise<void> {\n const threads = await loadThreadMetadata();\n const thread = threads.find((t) => t.remoteId === remoteId);\n if (thread) {\n thread.title = newTitle;\n await saveThreadMetadata(threads);\n }\n },\n\n async archive(remoteId: string): Promise<void> {\n const threads = await loadThreadMetadata();\n const thread = threads.find((t) => t.remoteId === remoteId);\n if (thread) {\n thread.status = \"archived\";\n await saveThreadMetadata(threads);\n }\n },\n\n async unarchive(remoteId: string): Promise<void> {\n const threads = await loadThreadMetadata();\n const thread = threads.find((t) => t.remoteId === remoteId);\n if (thread) {\n thread.status = \"regular\";\n await saveThreadMetadata(threads);\n }\n },\n\n async delete(remoteId: string): Promise<void> {\n const threads = await loadThreadMetadata();\n const filtered = threads.filter((t) => t.remoteId !== remoteId);\n await saveThreadMetadata(filtered);\n await storage.removeItem(messagesKey(remoteId));\n },\n\n async fetch(threadId: string): Promise<RemoteThreadMetadata> {\n const threads = await loadThreadMetadata();\n const thread = threads.find((t) => t.remoteId === threadId);\n if (!thread) throw new Error(\"Thread not found\");\n return {\n remoteId: thread.remoteId,\n externalId: thread.externalId,\n status: thread.status,\n title: thread.title,\n };\n },\n\n async generateTitle(\n remoteId: string,\n messages: readonly ThreadMessage[],\n ): Promise<AssistantStream> {\n if (titleGenerator) {\n const title = await titleGenerator.generateTitle(messages);\n\n // Update the stored title\n const threads = await loadThreadMetadata();\n const thread = threads.find((t) => t.remoteId === remoteId);\n if (thread) {\n thread.title = title;\n await saveThreadMetadata(threads);\n }\n\n // Return a stream with a single text part\n return createAssistantStream((controller) => {\n controller.appendText(title);\n });\n }\n\n // No title generator — return empty stream\n return createAssistantStream(() => {});\n },\n };\n\n return adapter;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"LocalStorageThreadListAdapter.js","names":[],"sources":["../../../src/react/adapters/LocalStorageThreadListAdapter.tsx"],"sourcesContent":["import { type AssistantStream, createAssistantStream } from \"assistant-stream\";\nimport { type FC, type PropsWithChildren, useMemo } from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport type {\n RemoteThreadInitializeResponse,\n RemoteThreadListAdapter,\n RemoteThreadListResponse,\n RemoteThreadMetadata,\n ThreadHistoryAdapter,\n ThreadMessage,\n} from \"../../index\";\nimport type {\n ExportedMessageRepository,\n ExportedMessageRepositoryItem,\n} from \"../../internal\";\nimport { RuntimeAdapterProvider } from \"../runtimes/RuntimeAdapterProvider\";\nimport type { TitleGenerationAdapter } from \"./TitleGenerationAdapter\";\n\nexport type AsyncStorageLike = {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n};\n\ntype LocalStorageAdapterOptions = {\n storage: AsyncStorageLike;\n prefix?: string | undefined;\n titleGenerator?: TitleGenerationAdapter | undefined;\n};\n\ntype StoredThreadMetadata = {\n remoteId: string;\n externalId?: string;\n status: \"regular\" | \"archived\";\n title?: string;\n custom?: Record<string, unknown> | undefined;\n};\n\nclass AsyncStorageHistoryAdapter implements ThreadHistoryAdapter {\n constructor(\n private storage: AsyncStorageLike,\n private aui: ReturnType<typeof useAui>,\n private prefix: string,\n ) {}\n\n private _messagesKey(remoteId: string) {\n return `${this.prefix}messages:${remoteId}`;\n }\n\n async load(): Promise<ExportedMessageRepository> {\n const remoteId = this.aui.threadListItem().getState().remoteId;\n if (!remoteId) return { messages: [] };\n\n const raw = await this.storage.getItem(this._messagesKey(remoteId));\n if (!raw) return { messages: [] };\n return JSON.parse(raw) as ExportedMessageRepository;\n }\n\n async append(item: ExportedMessageRepositoryItem): Promise<void> {\n const { remoteId } = await this.aui.threadListItem().initialize();\n\n const key = this._messagesKey(remoteId);\n const raw = await this.storage.getItem(key);\n const repo: ExportedMessageRepository = raw\n ? (JSON.parse(raw) as ExportedMessageRepository)\n : { messages: [] };\n\n const idx = repo.messages.findIndex(\n (m) => m.message.id === item.message.id,\n );\n if (idx >= 0) {\n repo.messages[idx] = item;\n } else {\n repo.messages.push(item);\n }\n repo.headId = item.message.id;\n\n await this.storage.setItem(key, JSON.stringify(repo));\n }\n}\n\nconst createHistoryProvider = (\n storage: AsyncStorageLike,\n prefix: string,\n): FC<PropsWithChildren> => {\n const Provider: FC<PropsWithChildren> = ({ children }) => {\n const aui = useAui();\n const history = useMemo(\n () => new AsyncStorageHistoryAdapter(storage, aui, prefix),\n [aui],\n );\n const adapters = useMemo(() => ({ history }), [history]);\n\n return (\n <RuntimeAdapterProvider adapters={adapters}>\n {children}\n </RuntimeAdapterProvider>\n );\n };\n return Provider;\n};\n\nexport const createLocalStorageAdapter = (\n options: LocalStorageAdapterOptions,\n): RemoteThreadListAdapter => {\n const { storage, prefix = \"@assistant-ui:\", titleGenerator } = options;\n\n const threadsKey = `${prefix}threads`;\n const messagesKey = (threadId: string) => `${prefix}messages:${threadId}`;\n\n const loadThreadMetadata = async (): Promise<StoredThreadMetadata[]> => {\n const raw = await storage.getItem(threadsKey);\n return raw ? (JSON.parse(raw) as StoredThreadMetadata[]) : [];\n };\n\n const saveThreadMetadata = async (\n threads: StoredThreadMetadata[],\n ): Promise<void> => {\n await storage.setItem(threadsKey, JSON.stringify(threads));\n };\n\n const adapter: RemoteThreadListAdapter = {\n unstable_Provider: createHistoryProvider(storage, prefix),\n\n async list(): Promise<RemoteThreadListResponse> {\n const threads = await loadThreadMetadata();\n return {\n threads: threads.map((t) => ({\n remoteId: t.remoteId,\n externalId: t.externalId,\n status: t.status,\n title: t.title,\n custom: t.custom,\n })),\n };\n },\n\n async initialize(\n threadId: string,\n ): Promise<RemoteThreadInitializeResponse> {\n const remoteId = threadId;\n const threads = await loadThreadMetadata();\n\n // Only add if not already present\n if (!threads.some((t) => t.remoteId === remoteId)) {\n threads.unshift({\n remoteId,\n status: \"regular\",\n });\n await saveThreadMetadata(threads);\n }\n\n return { remoteId, externalId: undefined };\n },\n\n async rename(remoteId: string, newTitle: string): Promise<void> {\n const threads = await loadThreadMetadata();\n const thread = threads.find((t) => t.remoteId === remoteId);\n if (thread) {\n thread.title = newTitle;\n await saveThreadMetadata(threads);\n }\n },\n\n async updateCustom(\n remoteId: string,\n custom: Record<string, unknown> | undefined,\n ): Promise<void> {\n const threads = await loadThreadMetadata();\n const thread = threads.find((t) => t.remoteId === remoteId);\n if (thread) {\n thread.custom = custom;\n await saveThreadMetadata(threads);\n }\n },\n\n async archive(remoteId: string): Promise<void> {\n const threads = await loadThreadMetadata();\n const thread = threads.find((t) => t.remoteId === remoteId);\n if (thread) {\n thread.status = \"archived\";\n await saveThreadMetadata(threads);\n }\n },\n\n async unarchive(remoteId: string): Promise<void> {\n const threads = await loadThreadMetadata();\n const thread = threads.find((t) => t.remoteId === remoteId);\n if (thread) {\n thread.status = \"regular\";\n await saveThreadMetadata(threads);\n }\n },\n\n async delete(remoteId: string): Promise<void> {\n const threads = await loadThreadMetadata();\n const filtered = threads.filter((t) => t.remoteId !== remoteId);\n await saveThreadMetadata(filtered);\n await storage.removeItem(messagesKey(remoteId));\n },\n\n async fetch(threadId: string): Promise<RemoteThreadMetadata> {\n const threads = await loadThreadMetadata();\n const thread = threads.find((t) => t.remoteId === threadId);\n if (!thread) throw new Error(\"Thread not found\");\n return {\n remoteId: thread.remoteId,\n externalId: thread.externalId,\n status: thread.status,\n title: thread.title,\n custom: thread.custom,\n };\n },\n\n async generateTitle(\n remoteId: string,\n messages: readonly ThreadMessage[],\n ): Promise<AssistantStream> {\n if (titleGenerator) {\n const title = await titleGenerator.generateTitle(messages);\n\n // Update the stored title\n const threads = await loadThreadMetadata();\n const thread = threads.find((t) => t.remoteId === remoteId);\n if (thread) {\n thread.title = title;\n await saveThreadMetadata(threads);\n }\n\n // Return a stream with a single text part\n return createAssistantStream((controller) => {\n controller.appendText(title);\n });\n }\n\n // No title generator — return empty stream\n return createAssistantStream(() => {});\n },\n };\n\n return adapter;\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"DataRenderers.d.ts","names":[],"sources":["../../../src/react/client/DataRenderers.ts"],"mappings":";;;;;AAYA;;;;AAA0B;cAAb,aAAA,oCAAa,eAAA,CAAA,YAAA"}
1
+ {"version":3,"file":"DataRenderers.d.ts","names":[],"sources":["../../../src/react/client/DataRenderers.ts"],"mappings":";;;;;AAaA;;;;AAA0B;cAAb,aAAA,oCAAa,eAAA,CAAA,YAAA"}
@@ -1,4 +1,5 @@
1
- import { resource, tapCallback, tapState } from "@assistant-ui/tap";
1
+ import { useCallback, useState } from "@assistant-ui/tap/react-shim";
2
+ import { resource } from "@assistant-ui/tap";
2
3
  //#region src/react/client/DataRenderers.ts
3
4
  /**
4
5
  * Registers renderers for `data` message parts.
@@ -7,14 +8,14 @@ import { resource, tapCallback, tapState } from "@assistant-ui/tap";
7
8
  * directly for a renderer scope, or prefer {@link useAssistantDataUI} /
8
9
  * {@link makeAssistantDataUI} when registering from React components.
9
10
  */
10
- const DataRenderers = resource(() => {
11
- const [state, setState] = tapState(() => ({
11
+ const DataRenderers = resource(function DataRenderers() {
12
+ const [state, setState] = useState(() => ({
12
13
  renderers: {},
13
14
  fallbacks: []
14
15
  }));
15
16
  return {
16
17
  getState: () => state,
17
- setDataUI: tapCallback((name, render) => {
18
+ setDataUI: useCallback((name, render) => {
18
19
  setState((prev) => {
19
20
  return {
20
21
  ...prev,
@@ -36,7 +37,7 @@ const DataRenderers = resource(() => {
36
37
  });
37
38
  };
38
39
  }, []),
39
- setFallbackDataUI: tapCallback((render) => {
40
+ setFallbackDataUI: useCallback((render) => {
40
41
  setState((prev) => ({
41
42
  ...prev,
42
43
  fallbacks: [...prev.fallbacks, render]
@@ -1 +1 @@
1
- {"version":3,"file":"DataRenderers.js","names":[],"sources":["../../../src/react/client/DataRenderers.ts"],"sourcesContent":["import { resource, tapState, tapCallback } from \"@assistant-ui/tap\";\nimport type { ClientOutput } from \"@assistant-ui/store\";\nimport type { DataRenderersState } from \"../types/scopes/dataRenderers\";\nimport type { DataMessagePartComponent } from \"../types/MessagePartComponentTypes\";\n\n/**\n * Registers renderers for `data` message parts.\n *\n * Data renderers are looked up by the part's `name` field. Use this resource\n * directly for a renderer scope, or prefer {@link useAssistantDataUI} /\n * {@link makeAssistantDataUI} when registering from React components.\n */\nexport const DataRenderers = resource((): ClientOutput<\"dataRenderers\"> => {\n const [state, setState] = tapState<DataRenderersState>(() => ({\n renderers: {},\n fallbacks: [],\n }));\n\n const setDataUI = tapCallback(\n (name: string, render: DataMessagePartComponent) => {\n setState((prev) => {\n return {\n ...prev,\n renderers: {\n ...prev.renderers,\n [name]: [...(prev.renderers[name] ?? []), render],\n },\n };\n });\n\n return () => {\n setState((prev) => {\n return {\n ...prev,\n renderers: {\n ...prev.renderers,\n [name]: prev.renderers[name]?.filter((r) => r !== render) ?? [],\n },\n };\n });\n };\n },\n [],\n );\n\n const setFallbackDataUI = tapCallback((render: DataMessagePartComponent) => {\n setState((prev) => ({\n ...prev,\n fallbacks: [...prev.fallbacks, render],\n }));\n\n return () => {\n setState((prev) => ({\n ...prev,\n fallbacks: prev.fallbacks.filter((r) => r !== render),\n }));\n };\n }, []);\n\n return {\n getState: () => state,\n setDataUI,\n setFallbackDataUI,\n };\n});\n"],"mappings":";;;;;;;;;AAYA,MAAa,gBAAgB,eAA8C;CACzE,MAAM,CAAC,OAAO,YAAY,gBAAoC;EAC5D,WAAW,CAAC;EACZ,WAAW,CAAC;CACd,EAAE;CA2CF,OAAO;EACL,gBAAgB;EAChB,WA3CgB,aACf,MAAc,WAAqC;GAClD,UAAU,SAAS;IACjB,OAAO;KACL,GAAG;KACH,WAAW;MACT,GAAG,KAAK;OACP,OAAO,CAAC,GAAI,KAAK,UAAU,SAAS,CAAC,GAAI,MAAM;KAClD;IACF;GACF,CAAC;GAED,aAAa;IACX,UAAU,SAAS;KACjB,OAAO;MACL,GAAG;MACH,WAAW;OACT,GAAG,KAAK;QACP,OAAO,KAAK,UAAU,OAAO,QAAQ,MAAM,MAAM,MAAM,KAAK,CAAC;MAChE;KACF;IACF,CAAC;GACH;EACF,GACA,CAAC,CAmBO;EACR,mBAjBwB,aAAa,WAAqC;GAC1E,UAAU,UAAU;IAClB,GAAG;IACH,WAAW,CAAC,GAAG,KAAK,WAAW,MAAM;GACvC,EAAE;GAEF,aAAa;IACX,UAAU,UAAU;KAClB,GAAG;KACH,WAAW,KAAK,UAAU,QAAQ,MAAM,MAAM,MAAM;IACtD,EAAE;GACJ;EACF,GAAG,CAAC,CAKc;CAClB;AACF,CAAC"}
1
+ {"version":3,"file":"DataRenderers.js","names":[],"sources":["../../../src/react/client/DataRenderers.ts"],"sourcesContent":["import { useState, useCallback } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport type { ClientOutput } from \"@assistant-ui/store\";\nimport type { DataRenderersState } from \"../types/scopes/dataRenderers\";\nimport type { DataMessagePartComponent } from \"../types/MessagePartComponentTypes\";\n\n/**\n * Registers renderers for `data` message parts.\n *\n * Data renderers are looked up by the part's `name` field. Use this resource\n * directly for a renderer scope, or prefer {@link useAssistantDataUI} /\n * {@link makeAssistantDataUI} when registering from React components.\n */\nexport const DataRenderers = resource(\n function DataRenderers(): ClientOutput<\"dataRenderers\"> {\n const [state, setState] = useState<DataRenderersState>(() => ({\n renderers: {},\n fallbacks: [],\n }));\n\n const setDataUI = useCallback(\n (name: string, render: DataMessagePartComponent) => {\n setState((prev) => {\n return {\n ...prev,\n renderers: {\n ...prev.renderers,\n [name]: [...(prev.renderers[name] ?? []), render],\n },\n };\n });\n\n return () => {\n setState((prev) => {\n return {\n ...prev,\n renderers: {\n ...prev.renderers,\n [name]: prev.renderers[name]?.filter((r) => r !== render) ?? [],\n },\n };\n });\n };\n },\n [],\n );\n\n const setFallbackDataUI = useCallback(\n (render: DataMessagePartComponent) => {\n setState((prev) => ({\n ...prev,\n fallbacks: [...prev.fallbacks, render],\n }));\n\n return () => {\n setState((prev) => ({\n ...prev,\n fallbacks: prev.fallbacks.filter((r) => r !== render),\n }));\n };\n },\n [],\n );\n\n return {\n getState: () => state,\n setDataUI,\n setFallbackDataUI,\n };\n },\n);\n"],"mappings":";;;;;;;;;;AAaA,MAAa,gBAAgB,SAC3B,SAAS,gBAA+C;CACtD,MAAM,CAAC,OAAO,YAAY,gBAAoC;EAC5D,WAAW,CAAC;EACZ,WAAW,CAAC;CACd,EAAE;CA8CF,OAAO;EACL,gBAAgB;EAChB,WA9CgB,aACf,MAAc,WAAqC;GAClD,UAAU,SAAS;IACjB,OAAO;KACL,GAAG;KACH,WAAW;MACT,GAAG,KAAK;OACP,OAAO,CAAC,GAAI,KAAK,UAAU,SAAS,CAAC,GAAI,MAAM;KAClD;IACF;GACF,CAAC;GAED,aAAa;IACX,UAAU,SAAS;KACjB,OAAO;MACL,GAAG;MACH,WAAW;OACT,GAAG,KAAK;QACP,OAAO,KAAK,UAAU,KAAK,EAAE,QAAQ,MAAM,MAAM,MAAM,KAAK,CAAC;MAChE;KACF;IACF,CAAC;GACH;EACF,GACA,CAAC,CAsBO;EACR,mBApBwB,aACvB,WAAqC;GACpC,UAAU,UAAU;IAClB,GAAG;IACH,WAAW,CAAC,GAAG,KAAK,WAAW,MAAM;GACvC,EAAE;GAEF,aAAa;IACX,UAAU,UAAU;KAClB,GAAG;KACH,WAAW,KAAK,UAAU,QAAQ,MAAM,MAAM,MAAM;IACtD,EAAE;GACJ;EACF,GACA,CAAC,CAMe;CAClB;AACF,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"Interactables.d.ts","names":[],"sources":["../../../src/react/client/Interactables.ts"],"mappings":";;;cA0Ba,aAAA,oCAAa,eAAA,CAAA,YAAA"}
1
+ {"version":3,"file":"Interactables.d.ts","names":[],"sources":["../../../src/react/client/Interactables.ts"],"mappings":";;;cAoBa,aAAA,oCAAa,eAAA,CAAA,YAAA"}
@@ -1,30 +1,31 @@
1
1
  import { ModelContext } from "../../store/clients/model-context-client.js";
2
2
  import { buildInteractableModelContext } from "./interactable-model-context.js";
3
3
  import { toJSONSchema, toPartialJSONSchema } from "assistant-stream";
4
- import { attachTransformScopes, tapAssistantClientRef } from "@assistant-ui/store";
5
- import { resource, tapCallback, tapEffect, tapMemo, tapRef, tapState } from "@assistant-ui/tap";
4
+ import { useCallback, useEffect, useMemo, useRef, useState } from "@assistant-ui/tap/react-shim";
5
+ import { attachTransformScopes, useAssistantClientRef } from "@assistant-ui/store";
6
+ import { resource } from "@assistant-ui/tap";
6
7
  //#region src/react/client/Interactables.ts
7
8
  const PERSISTENCE_DEBOUNCE_MS = 500;
8
- const Interactables = resource(() => {
9
- const [state, setState] = tapState(() => ({
9
+ const Interactables = resource(function Interactables() {
10
+ const [state, setState] = useState(() => ({
10
11
  definitions: {},
11
12
  persistence: {}
12
13
  }));
13
- const clientRef = tapAssistantClientRef();
14
- const stateRef = tapRef(state);
15
- tapEffect(() => {
14
+ const clientRef = useAssistantClientRef();
15
+ const stateRef = useRef(state);
16
+ useEffect(() => {
16
17
  stateRef.current = state;
17
18
  }, [state]);
18
- const subscribersRef = tapRef(/* @__PURE__ */ new Set());
19
- const partialSchemaCacheRef = tapRef(/* @__PURE__ */ new Map());
20
- const detachedStateRef = tapRef(/* @__PURE__ */ new Map());
21
- const adapterRef = tapRef(void 0);
22
- const debounceTimerRef = tapRef(void 0);
23
- const syncSeqRef = tapRef(0);
24
- const hasPendingLocalChangeRef = tapRef(false);
25
- const flushResolversRef = tapRef([]);
26
- const dirtyIdsRef = tapRef(/* @__PURE__ */ new Set());
27
- const runPersistence = tapCallback(async () => {
19
+ const subscribersRef = useRef(/* @__PURE__ */ new Set());
20
+ const partialSchemaCacheRef = useRef(/* @__PURE__ */ new Map());
21
+ const detachedStateRef = useRef(/* @__PURE__ */ new Map());
22
+ const adapterRef = useRef(void 0);
23
+ const debounceTimerRef = useRef(void 0);
24
+ const syncSeqRef = useRef(0);
25
+ const hasPendingLocalChangeRef = useRef(false);
26
+ const flushResolversRef = useRef([]);
27
+ const dirtyIdsRef = useRef(/* @__PURE__ */ new Set());
28
+ const runPersistence = useCallback(async () => {
28
29
  const adapter = adapterRef.current;
29
30
  if (!adapter) {
30
31
  for (const resolve of flushResolversRef.current) resolve();
@@ -86,7 +87,7 @@ const Interactables = resource(() => {
86
87
  }
87
88
  }
88
89
  }, []);
89
- const schedulePersistence = tapCallback((id) => {
90
+ const schedulePersistence = useCallback((id) => {
90
91
  if (!adapterRef.current) return;
91
92
  dirtyIdsRef.current.add(id);
92
93
  if (debounceTimerRef.current !== void 0) clearTimeout(debounceTimerRef.current);
@@ -99,7 +100,7 @@ const Interactables = resource(() => {
99
100
  }, PERSISTENCE_DEBOUNCE_MS);
100
101
  }, PERSISTENCE_DEBOUNCE_MS);
101
102
  }, [runPersistence]);
102
- const exportState = tapCallback(() => {
103
+ const exportState = useCallback(() => {
103
104
  const result = {};
104
105
  for (const [id, def] of Object.entries(stateRef.current.definitions)) result[id] = {
105
106
  name: def.name,
@@ -107,7 +108,7 @@ const Interactables = resource(() => {
107
108
  };
108
109
  return result;
109
110
  }, []);
110
- const importState = tapCallback((saved) => {
111
+ const importState = useCallback((saved) => {
111
112
  for (const [id, entry] of Object.entries(saved)) detachedStateRef.current.set(id, entry.state);
112
113
  setState((prev) => {
113
114
  let changed = false;
@@ -125,10 +126,10 @@ const Interactables = resource(() => {
125
126
  } : prev;
126
127
  });
127
128
  }, []);
128
- const setPersistenceAdapter = tapCallback((adapter) => {
129
+ const setPersistenceAdapter = useCallback((adapter) => {
129
130
  adapterRef.current = adapter;
130
131
  }, []);
131
- const flush = tapCallback(async () => {
132
+ const flush = useCallback(async () => {
132
133
  if (debounceTimerRef.current !== void 0) {
133
134
  clearTimeout(debounceTimerRef.current);
134
135
  debounceTimerRef.current = void 0;
@@ -141,14 +142,14 @@ const Interactables = resource(() => {
141
142
  if (!hasPendingLocalChangeRef.current) runPersistence();
142
143
  return p;
143
144
  }, [runPersistence]);
144
- const flushIfPending = tapCallback(() => {
145
+ const flushIfPending = useCallback(() => {
145
146
  if (adapterRef.current && debounceTimerRef.current !== void 0) {
146
147
  clearTimeout(debounceTimerRef.current);
147
148
  debounceTimerRef.current = void 0;
148
149
  runPersistence();
149
150
  }
150
151
  }, [runPersistence]);
151
- const setDefState = tapCallback((id, updater) => {
152
+ const setDefState = useCallback((id, updater) => {
152
153
  setState((prev) => {
153
154
  const existing = prev.definitions[id];
154
155
  if (!existing) return prev;
@@ -165,7 +166,7 @@ const Interactables = resource(() => {
165
166
  });
166
167
  if (stateRef.current.definitions[id]) schedulePersistence(id);
167
168
  }, [schedulePersistence]);
168
- const setDefSelected = tapCallback((id, selected) => {
169
+ const setDefSelected = useCallback((id, selected) => {
169
170
  setState((prev) => {
170
171
  const existing = prev.definitions[id];
171
172
  if (!existing) return prev;
@@ -181,7 +182,7 @@ const Interactables = resource(() => {
181
182
  };
182
183
  });
183
184
  }, []);
184
- const provider = tapMemo(() => ({
185
+ const provider = useMemo(() => ({
185
186
  getModelContext: () => {
186
187
  const defs = stateRef.current.definitions;
187
188
  return buildInteractableModelContext(defs, partialSchemaCacheRef.current, setDefState) ?? {};
@@ -193,15 +194,15 @@ const Interactables = resource(() => {
193
194
  };
194
195
  }
195
196
  }), [setDefState]);
196
- tapEffect(() => {
197
+ useEffect(() => {
197
198
  for (const cb of subscribersRef.current) cb();
198
199
  }, [state]);
199
- tapEffect(() => {
200
+ useEffect(() => {
200
201
  return clientRef.current.modelContext().register(provider);
201
202
  }, [clientRef, provider]);
202
203
  return {
203
204
  getState: () => state,
204
- register: tapCallback((def) => {
205
+ register: useCallback((def) => {
205
206
  try {
206
207
  const jsonSchema = toJSONSchema(def.stateSchema);
207
208
  partialSchemaCacheRef.current.set(def.id, toPartialJSONSchema(jsonSchema));
@@ -1 +1 @@
1
- {"version":3,"file":"Interactables.js","names":[],"sources":["../../../src/react/client/Interactables.ts"],"sourcesContent":["import {\n resource,\n tapState,\n tapEffect,\n tapCallback,\n tapRef,\n tapMemo,\n} from \"@assistant-ui/tap\";\nimport {\n tapAssistantClientRef,\n type ClientOutput,\n attachTransformScopes,\n} from \"@assistant-ui/store\";\nimport type {\n InteractablesState,\n InteractableRegistration,\n InteractableStateSchema,\n InteractablePersistedState,\n InteractablePersistenceAdapter,\n} from \"../types/scopes/interactables\";\nimport { toJSONSchema, toPartialJSONSchema } from \"assistant-stream\";\nimport { ModelContext } from \"../../store\";\nimport { buildInteractableModelContext } from \"./interactable-model-context\";\n\nconst PERSISTENCE_DEBOUNCE_MS = 500;\n\nexport const Interactables = resource((): ClientOutput<\"interactables\"> => {\n const [state, setState] = tapState<InteractablesState>(() => ({\n definitions: {},\n persistence: {},\n }));\n\n const clientRef = tapAssistantClientRef();\n\n const stateRef = tapRef(state);\n tapEffect(() => {\n stateRef.current = state;\n }, [state]);\n\n const subscribersRef = tapRef(new Set<() => void>());\n const partialSchemaCacheRef = tapRef(\n new Map<string, InteractableStateSchema>(),\n );\n const detachedStateRef = tapRef(new Map<string, unknown>());\n\n const adapterRef = tapRef<InteractablePersistenceAdapter | undefined>(\n undefined,\n );\n const debounceTimerRef = tapRef<ReturnType<typeof setTimeout> | undefined>(\n undefined,\n );\n const syncSeqRef = tapRef(0);\n const hasPendingLocalChangeRef = tapRef(false);\n const flushResolversRef = tapRef<Array<() => void>>([]);\n const dirtyIdsRef = tapRef(new Set<string>());\n\n const runPersistence = tapCallback(async () => {\n const adapter = adapterRef.current;\n if (!adapter) {\n for (const resolve of flushResolversRef.current) resolve();\n flushResolversRef.current = [];\n return;\n }\n\n const seq = ++syncSeqRef.current;\n const dirtyIds = new Set(dirtyIdsRef.current);\n dirtyIdsRef.current.clear();\n hasPendingLocalChangeRef.current = true;\n\n // Snapshot before any await so unregistered definitions are still included.\n const exported = stateRef.current.definitions;\n const payload: InteractablePersistedState = {};\n for (const [id, def] of Object.entries(exported)) {\n payload[id] = { name: def.name, state: def.state };\n }\n\n setState((prev) => ({\n ...prev,\n persistence: {\n ...prev.persistence,\n ...Object.fromEntries(\n [...dirtyIds].map((id) => [\n id,\n { isPending: true, error: undefined },\n ]),\n ),\n },\n }));\n\n try {\n await adapter.save(payload);\n if (syncSeqRef.current === seq) {\n hasPendingLocalChangeRef.current = false;\n setState((prev) => {\n const persistence = { ...prev.persistence };\n for (const id of dirtyIds) delete persistence[id];\n return { ...prev, persistence };\n });\n }\n } catch (e) {\n if (syncSeqRef.current === seq) {\n hasPendingLocalChangeRef.current = false;\n setState((prev) => ({\n ...prev,\n persistence: {\n ...prev.persistence,\n ...Object.fromEntries(\n [...dirtyIds].map((id) => [id, { isPending: false, error: e }]),\n ),\n },\n }));\n }\n } finally {\n if (dirtyIdsRef.current.size > 0 && adapterRef.current) {\n runPersistence();\n } else {\n for (const resolve of flushResolversRef.current) resolve();\n flushResolversRef.current = [];\n }\n }\n }, []);\n\n const schedulePersistence = tapCallback(\n (id: string) => {\n if (!adapterRef.current) return;\n dirtyIdsRef.current.add(id);\n if (debounceTimerRef.current !== undefined) {\n clearTimeout(debounceTimerRef.current);\n }\n debounceTimerRef.current = setTimeout(() => {\n debounceTimerRef.current = undefined;\n if (!hasPendingLocalChangeRef.current) {\n runPersistence();\n } else {\n debounceTimerRef.current = setTimeout(() => {\n debounceTimerRef.current = undefined;\n runPersistence();\n }, PERSISTENCE_DEBOUNCE_MS);\n }\n }, PERSISTENCE_DEBOUNCE_MS);\n },\n [runPersistence],\n );\n\n const exportState = tapCallback((): InteractablePersistedState => {\n const result: InteractablePersistedState = {};\n for (const [id, def] of Object.entries(stateRef.current.definitions)) {\n result[id] = { name: def.name, state: def.state };\n }\n return result;\n }, []);\n\n const importState = tapCallback((saved: InteractablePersistedState) => {\n for (const [id, entry] of Object.entries(saved)) {\n detachedStateRef.current.set(id, entry.state);\n }\n setState((prev) => {\n let changed = false;\n const definitions = { ...prev.definitions };\n for (const [id, entry] of Object.entries(saved)) {\n if (definitions[id]) {\n definitions[id] = { ...definitions[id], state: entry.state };\n changed = true;\n }\n }\n return changed ? { ...prev, definitions } : prev;\n });\n }, []);\n\n const setPersistenceAdapter = tapCallback(\n (adapter: InteractablePersistenceAdapter | undefined) => {\n adapterRef.current = adapter;\n },\n [],\n );\n\n const flush = tapCallback(async () => {\n if (debounceTimerRef.current !== undefined) {\n clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = undefined;\n }\n if (!adapterRef.current) return;\n if (!hasPendingLocalChangeRef.current && dirtyIdsRef.current.size === 0)\n return;\n const p = new Promise<void>((resolve) => {\n flushResolversRef.current.push(resolve);\n });\n if (!hasPendingLocalChangeRef.current) {\n runPersistence();\n }\n return p;\n }, [runPersistence]);\n\n const flushIfPending = tapCallback(() => {\n if (adapterRef.current && debounceTimerRef.current !== undefined) {\n clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = undefined;\n runPersistence();\n }\n }, [runPersistence]);\n\n const setDefState = tapCallback(\n (id: string, updater: (prev: unknown) => unknown) => {\n setState((prev) => {\n const existing = prev.definitions[id];\n if (!existing) return prev;\n return {\n ...prev,\n definitions: {\n ...prev.definitions,\n [id]: { ...existing, state: updater(existing.state) },\n },\n };\n });\n if (stateRef.current.definitions[id]) schedulePersistence(id);\n },\n [schedulePersistence],\n );\n\n const setDefSelected = tapCallback((id: string, selected: boolean) => {\n setState((prev) => {\n const existing = prev.definitions[id];\n if (!existing) return prev;\n return {\n ...prev,\n definitions: {\n ...prev.definitions,\n [id]: { ...existing, selected },\n },\n };\n });\n }, []);\n\n const provider = tapMemo(\n () => ({\n getModelContext: () => {\n const defs = stateRef.current.definitions;\n return (\n buildInteractableModelContext(\n defs,\n partialSchemaCacheRef.current,\n setDefState,\n ) ?? {}\n );\n },\n subscribe: (callback: () => void) => {\n subscribersRef.current.add(callback);\n return () => {\n subscribersRef.current.delete(callback);\n };\n },\n }),\n [setDefState],\n );\n\n tapEffect(() => {\n for (const cb of subscribersRef.current) cb();\n }, [state]);\n\n tapEffect(() => {\n return clientRef.current!.modelContext().register(provider);\n }, [clientRef, provider]);\n\n const register = tapCallback(\n (def: InteractableRegistration) => {\n try {\n const jsonSchema = toJSONSchema(def.stateSchema);\n partialSchemaCacheRef.current.set(\n def.id,\n toPartialJSONSchema(jsonSchema),\n );\n } catch (e) {\n console.warn(\n `[Interactables] Failed to create partial schema for \"${def.name}\". The update tool will require all fields.`,\n e,\n );\n }\n\n const detached = detachedStateRef.current.get(def.id);\n detachedStateRef.current.delete(def.id);\n\n setState((prev) => ({\n ...prev,\n definitions: {\n ...prev.definitions,\n [def.id]: {\n id: def.id,\n name: def.name,\n description: def.description,\n stateSchema: def.stateSchema,\n state:\n prev.definitions[def.id]?.state ?? detached ?? def.initialState,\n selected: def.selected,\n },\n },\n }));\n\n return () => {\n flushIfPending();\n setState((prev) => {\n const existing = prev.definitions[def.id];\n if (existing) {\n detachedStateRef.current.set(def.id, existing.state);\n }\n partialSchemaCacheRef.current.delete(def.id);\n const { [def.id]: _, ...rest } = prev.definitions;\n const { [def.id]: __, ...restPersistence } = prev.persistence;\n return { ...prev, definitions: rest, persistence: restPersistence };\n });\n };\n },\n [flushIfPending],\n );\n\n return {\n getState: () => state,\n register,\n setState: setDefState,\n setSelected: setDefSelected,\n exportState,\n importState,\n setPersistenceAdapter,\n flush,\n };\n});\n\nattachTransformScopes(Interactables, (scopes, parent) => {\n if (!scopes.modelContext && parent.modelContext.source === null) {\n scopes.modelContext = ModelContext();\n }\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"Interactables.js","names":[],"sources":["../../../src/react/client/Interactables.ts"],"sourcesContent":["import { useState, useEffect, useCallback, useRef, useMemo } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport {\n useAssistantClientRef,\n type ClientOutput,\n attachTransformScopes,\n} from \"@assistant-ui/store\";\nimport type {\n InteractablesState,\n InteractableRegistration,\n InteractableStateSchema,\n InteractablePersistedState,\n InteractablePersistenceAdapter,\n} from \"../types/scopes/interactables\";\nimport { toJSONSchema, toPartialJSONSchema } from \"assistant-stream\";\nimport { ModelContext } from \"../../store\";\nimport { buildInteractableModelContext } from \"./interactable-model-context\";\n\nconst PERSISTENCE_DEBOUNCE_MS = 500;\n\nexport const Interactables = resource(\n function Interactables(): ClientOutput<\"interactables\"> {\n const [state, setState] = useState<InteractablesState>(() => ({\n definitions: {},\n persistence: {},\n }));\n\n const clientRef = useAssistantClientRef();\n\n const stateRef = useRef(state);\n useEffect(() => {\n stateRef.current = state;\n }, [state]);\n\n const subscribersRef = useRef(new Set<() => void>());\n const partialSchemaCacheRef = useRef(\n new Map<string, InteractableStateSchema>(),\n );\n const detachedStateRef = useRef(new Map<string, unknown>());\n\n const adapterRef = useRef<InteractablePersistenceAdapter | undefined>(\n undefined,\n );\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(\n undefined,\n );\n const syncSeqRef = useRef(0);\n const hasPendingLocalChangeRef = useRef(false);\n const flushResolversRef = useRef<Array<() => void>>([]);\n const dirtyIdsRef = useRef(new Set<string>());\n\n const runPersistence = useCallback(async () => {\n const adapter = adapterRef.current;\n if (!adapter) {\n for (const resolve of flushResolversRef.current) resolve();\n flushResolversRef.current = [];\n return;\n }\n\n const seq = ++syncSeqRef.current;\n const dirtyIds = new Set(dirtyIdsRef.current);\n dirtyIdsRef.current.clear();\n hasPendingLocalChangeRef.current = true;\n\n // Snapshot before any await so unregistered definitions are still included.\n const exported = stateRef.current.definitions;\n const payload: InteractablePersistedState = {};\n for (const [id, def] of Object.entries(exported)) {\n payload[id] = { name: def.name, state: def.state };\n }\n\n setState((prev) => ({\n ...prev,\n persistence: {\n ...prev.persistence,\n ...Object.fromEntries(\n [...dirtyIds].map((id) => [\n id,\n { isPending: true, error: undefined },\n ]),\n ),\n },\n }));\n\n try {\n await adapter.save(payload);\n if (syncSeqRef.current === seq) {\n hasPendingLocalChangeRef.current = false;\n setState((prev) => {\n const persistence = { ...prev.persistence };\n for (const id of dirtyIds) delete persistence[id];\n return { ...prev, persistence };\n });\n }\n } catch (e) {\n if (syncSeqRef.current === seq) {\n hasPendingLocalChangeRef.current = false;\n setState((prev) => ({\n ...prev,\n persistence: {\n ...prev.persistence,\n ...Object.fromEntries(\n [...dirtyIds].map((id) => [id, { isPending: false, error: e }]),\n ),\n },\n }));\n }\n } finally {\n if (dirtyIdsRef.current.size > 0 && adapterRef.current) {\n runPersistence();\n } else {\n for (const resolve of flushResolversRef.current) resolve();\n flushResolversRef.current = [];\n }\n }\n }, []);\n\n const schedulePersistence = useCallback(\n (id: string) => {\n if (!adapterRef.current) return;\n dirtyIdsRef.current.add(id);\n if (debounceTimerRef.current !== undefined) {\n clearTimeout(debounceTimerRef.current);\n }\n debounceTimerRef.current = setTimeout(() => {\n debounceTimerRef.current = undefined;\n if (!hasPendingLocalChangeRef.current) {\n runPersistence();\n } else {\n debounceTimerRef.current = setTimeout(() => {\n debounceTimerRef.current = undefined;\n runPersistence();\n }, PERSISTENCE_DEBOUNCE_MS);\n }\n }, PERSISTENCE_DEBOUNCE_MS);\n },\n [runPersistence],\n );\n\n const exportState = useCallback((): InteractablePersistedState => {\n const result: InteractablePersistedState = {};\n for (const [id, def] of Object.entries(stateRef.current.definitions)) {\n result[id] = { name: def.name, state: def.state };\n }\n return result;\n }, []);\n\n const importState = useCallback((saved: InteractablePersistedState) => {\n for (const [id, entry] of Object.entries(saved)) {\n detachedStateRef.current.set(id, entry.state);\n }\n setState((prev) => {\n let changed = false;\n const definitions = { ...prev.definitions };\n for (const [id, entry] of Object.entries(saved)) {\n if (definitions[id]) {\n definitions[id] = { ...definitions[id], state: entry.state };\n changed = true;\n }\n }\n return changed ? { ...prev, definitions } : prev;\n });\n }, []);\n\n const setPersistenceAdapter = useCallback(\n (adapter: InteractablePersistenceAdapter | undefined) => {\n adapterRef.current = adapter;\n },\n [],\n );\n\n const flush = useCallback(async () => {\n if (debounceTimerRef.current !== undefined) {\n clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = undefined;\n }\n if (!adapterRef.current) return;\n if (!hasPendingLocalChangeRef.current && dirtyIdsRef.current.size === 0)\n return;\n const p = new Promise<void>((resolve) => {\n flushResolversRef.current.push(resolve);\n });\n if (!hasPendingLocalChangeRef.current) {\n runPersistence();\n }\n return p;\n }, [runPersistence]);\n\n const flushIfPending = useCallback(() => {\n if (adapterRef.current && debounceTimerRef.current !== undefined) {\n clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = undefined;\n runPersistence();\n }\n }, [runPersistence]);\n\n const setDefState = useCallback(\n (id: string, updater: (prev: unknown) => unknown) => {\n setState((prev) => {\n const existing = prev.definitions[id];\n if (!existing) return prev;\n return {\n ...prev,\n definitions: {\n ...prev.definitions,\n [id]: { ...existing, state: updater(existing.state) },\n },\n };\n });\n if (stateRef.current.definitions[id]) schedulePersistence(id);\n },\n [schedulePersistence],\n );\n\n const setDefSelected = useCallback((id: string, selected: boolean) => {\n setState((prev) => {\n const existing = prev.definitions[id];\n if (!existing) return prev;\n return {\n ...prev,\n definitions: {\n ...prev.definitions,\n [id]: { ...existing, selected },\n },\n };\n });\n }, []);\n\n const provider = useMemo(\n () => ({\n getModelContext: () => {\n const defs = stateRef.current.definitions;\n return (\n buildInteractableModelContext(\n defs,\n partialSchemaCacheRef.current,\n setDefState,\n ) ?? {}\n );\n },\n subscribe: (callback: () => void) => {\n subscribersRef.current.add(callback);\n return () => {\n subscribersRef.current.delete(callback);\n };\n },\n }),\n [setDefState],\n );\n\n useEffect(() => {\n for (const cb of subscribersRef.current) cb();\n }, [state]);\n\n useEffect(() => {\n return clientRef.current!.modelContext().register(provider);\n }, [clientRef, provider]);\n\n const register = useCallback(\n (def: InteractableRegistration) => {\n try {\n const jsonSchema = toJSONSchema(def.stateSchema);\n partialSchemaCacheRef.current.set(\n def.id,\n toPartialJSONSchema(jsonSchema),\n );\n } catch (e) {\n console.warn(\n `[Interactables] Failed to create partial schema for \"${def.name}\". The update tool will require all fields.`,\n e,\n );\n }\n\n const detached = detachedStateRef.current.get(def.id);\n detachedStateRef.current.delete(def.id);\n\n setState((prev) => ({\n ...prev,\n definitions: {\n ...prev.definitions,\n [def.id]: {\n id: def.id,\n name: def.name,\n description: def.description,\n stateSchema: def.stateSchema,\n state:\n prev.definitions[def.id]?.state ?? detached ?? def.initialState,\n selected: def.selected,\n },\n },\n }));\n\n return () => {\n flushIfPending();\n setState((prev) => {\n const existing = prev.definitions[def.id];\n if (existing) {\n detachedStateRef.current.set(def.id, existing.state);\n }\n partialSchemaCacheRef.current.delete(def.id);\n const { [def.id]: _, ...rest } = prev.definitions;\n const { [def.id]: __, ...restPersistence } = prev.persistence;\n return { ...prev, definitions: rest, persistence: restPersistence };\n });\n };\n },\n [flushIfPending],\n );\n\n return {\n getState: () => state,\n register,\n setState: setDefState,\n setSelected: setDefSelected,\n exportState,\n importState,\n setPersistenceAdapter,\n flush,\n };\n },\n);\n\nattachTransformScopes(Interactables, (scopes, parent) => {\n if (!scopes.modelContext && parent.modelContext.source === null) {\n scopes.modelContext = ModelContext();\n }\n});\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Tools.d.ts","names":[],"sources":["../../../src/react/client/Tools.ts"],"mappings":";;;;;;;AAkCA;;;;;;;cAAa,KAAA,GAAK,KAAA;EAQW,gFAFf,OAAA;WAED,eAAA,CAAgB,oBAAA;AAAA;kFAFf,OAAA;WAED,eAAA,CAAgB,oBAAA;AAAA"}
1
+ {"version":3,"file":"Tools.d.ts","names":[],"sources":["../../../src/react/client/Tools.ts"],"mappings":";;;;;;;AAgCA;;;;;;;cAAa,KAAA,GAAK,KAAA;EAOS,gFAFf,OAAA;WAED,eAAA,CAAgB,oBAAA;AAAA;kFAFf,OAAA;WAED,eAAA,CAAgB,oBAAA;AAAA"}
@@ -1,7 +1,8 @@
1
1
  import { ModelContext } from "../../store/clients/model-context-client.js";
2
- import { isStandaloneToolDisplay } from "../model-context/toolbox.js";
3
- import { attachTransformScopes, tapAssistantClientRef } from "@assistant-ui/store";
4
- import { resource, tapCallback, tapEffect, tapMemo, tapResources, tapState, withKey } from "@assistant-ui/tap";
2
+ import { isStandaloneToolDisplay, makeToolCallTextComponent } from "../model-context/toolbox.js";
3
+ import { useCallback, useEffect, useMemo, useState } from "@assistant-ui/tap/react-shim";
4
+ import { attachTransformScopes, useAssistantClientRef } from "@assistant-ui/store";
5
+ import { resource, useResources, withKey } from "@assistant-ui/tap";
5
6
  //#region src/react/client/Tools.ts
6
7
  /**
7
8
  * Registers tools with model context and installs tool-call renderers.
@@ -11,16 +12,16 @@ import { resource, tapCallback, tapEffect, tapMemo, tapResources, tapState, with
11
12
  * context, while each tool renderer is registered with the tools scope for
12
13
  * message rendering.
13
14
  */
14
- const Tools = resource(({ toolkit, mcpApp }) => {
15
- const mcpAppOutput = tapResources(() => mcpApp ? [withKey("mcpApp", mcpApp)] : [], [mcpApp])[0];
16
- const [toolUIs, setToolUIs] = tapState(() => ({}));
17
- const state = tapMemo(() => ({
15
+ const Tools = resource(function Tools({ toolkit, mcpApp }) {
16
+ const mcpAppOutput = useResources(() => mcpApp ? [withKey("mcpApp", mcpApp)] : [], [mcpApp])[0];
17
+ const [toolUIs, setToolUIs] = useState(() => ({}));
18
+ const state = useMemo(() => ({
18
19
  toolUIs,
19
20
  mcpApp: mcpAppOutput,
20
21
  tools: Object.fromEntries(Object.entries(toolUIs).map(([name, regs]) => [name, regs.map((r) => r.render)]))
21
22
  }), [toolUIs, mcpAppOutput]);
22
- const clientRef = tapAssistantClientRef();
23
- const setToolUI = tapCallback((toolName, render, options) => {
23
+ const clientRef = useAssistantClientRef();
24
+ const setToolUI = useCallback((toolName, render, options) => {
24
25
  const registration = {
25
26
  render,
26
27
  standalone: options?.standalone ?? false
@@ -41,12 +42,18 @@ const Tools = resource(({ toolkit, mcpApp }) => {
41
42
  });
42
43
  };
43
44
  }, []);
44
- tapEffect(() => {
45
+ useEffect(() => {
45
46
  if (!toolkit) return;
46
47
  const unsubscribes = [];
47
- for (const [toolName, tool] of Object.entries(toolkit)) if (tool.render) unsubscribes.push(setToolUI(toolName, tool.render, { standalone: isStandaloneToolDisplay(tool) }));
48
+ for (const [toolName, tool] of Object.entries(toolkit)) {
49
+ const toolRender = "render" in tool ? tool.render : void 0;
50
+ const toolRenderText = "renderText" in tool ? tool.renderText : void 0;
51
+ const render = toolRender ?? (toolRenderText ? makeToolCallTextComponent(toolRenderText) : void 0);
52
+ if (render) unsubscribes.push(setToolUI(toolName, render, { standalone: isStandaloneToolDisplay(tool) }));
53
+ }
48
54
  const toolsWithoutRender = Object.entries(toolkit).reduce((acc, [name, tool]) => {
49
- const { render, display, ...rest } = tool;
55
+ if (tool.type === "mcp") return acc;
56
+ const { display: _display, render: _render, renderText: _renderText, ...rest } = tool;
50
57
  acc[name] = rest;
51
58
  return acc;
52
59
  }, {});
@@ -1 +1 @@
1
- {"version":3,"file":"Tools.js","names":[],"sources":["../../../src/react/client/Tools.ts"],"sourcesContent":["import {\n resource,\n tapState,\n tapEffect,\n tapCallback,\n tapMemo,\n tapResources,\n withKey,\n type ResourceElement,\n} from \"@assistant-ui/tap\";\nimport {\n tapAssistantClientRef,\n type ClientOutput,\n attachTransformScopes,\n} from \"@assistant-ui/store\";\nimport type { McpAppResourceOutput, ToolsState } from \"../types/scopes/tools\";\nimport type { Tool } from \"assistant-stream\";\nimport {\n isStandaloneToolDisplay,\n type Toolkit,\n} from \"../model-context/toolbox\";\nimport type { ToolCallMessagePartComponent } from \"../types/MessagePartComponentTypes\";\nimport { ModelContext } from \"../../store\";\n\nexport type { McpAppResourceOutput };\n\n/**\n * Registers tools with model context and installs tool-call renderers.\n *\n * Mount this resource near an assistant subtree when you want to expose a\n * group of tools declaratively. Tool definitions are registered with model\n * context, while each tool renderer is registered with the tools scope for\n * message rendering.\n */\nexport const Tools = resource(\n ({\n toolkit,\n mcpApp,\n }: {\n /** Tools to expose to the model and optional renderers to install. */\n toolkit?: Toolkit;\n /** Optional MCP app resource whose tools should be merged into context. */\n mcpApp?: ResourceElement<McpAppResourceOutput> | undefined;\n }): ClientOutput<\"tools\"> => {\n const mcpAppOutputs = tapResources(\n () => (mcpApp ? [withKey(\"mcpApp\", mcpApp)] : []),\n [mcpApp],\n );\n const mcpAppOutput = mcpAppOutputs[0];\n\n const [toolUIs, setToolUIs] = tapState<ToolsState[\"toolUIs\"]>(() => ({}));\n\n const state = tapMemo(\n (): ToolsState => ({\n toolUIs,\n mcpApp: mcpAppOutput,\n // Deprecated component-only view, derived from `toolUIs`. Removed in v0.15.\n tools: Object.fromEntries(\n Object.entries(toolUIs).map(([name, regs]) => [\n name,\n regs.map((r) => r.render),\n ]),\n ),\n }),\n [toolUIs, mcpAppOutput],\n );\n\n const clientRef = tapAssistantClientRef();\n\n const setToolUI = tapCallback(\n (\n toolName: string,\n render: ToolCallMessagePartComponent,\n options?: { standalone?: boolean },\n ) => {\n // One registration object per call; identity is the removal key, so\n // the per-name list stays correctly ref-counted across re-registers.\n const registration = {\n render,\n standalone: options?.standalone ?? false,\n };\n\n setToolUIs((prev) => ({\n ...prev,\n [toolName]: [...(prev[toolName] ?? []), registration],\n }));\n\n return () => {\n setToolUIs((prev) => {\n const next =\n prev[toolName]?.filter((r) => r !== registration) ?? [];\n if (next.length > 0) return { ...prev, [toolName]: next };\n // Drop the key entirely so repeatedly mounted/unmounted tools\n // don't leave empty arrays accumulating across a long session.\n const { [toolName]: _removed, ...rest } = prev;\n return rest;\n });\n };\n },\n [],\n );\n\n tapEffect(() => {\n if (!toolkit) return;\n const unsubscribes: (() => void)[] = [];\n\n // Register tool UIs (exclude symbols)\n for (const [toolName, tool] of Object.entries(toolkit)) {\n if (tool.render) {\n unsubscribes.push(\n setToolUI(toolName, tool.render, {\n standalone: isStandaloneToolDisplay(tool),\n }),\n );\n }\n }\n\n // Register tools with model context (exclude symbols). `render` and\n // `display` are client-only presentation concerns and never reach the\n // model.\n const toolsWithoutRender = Object.entries(toolkit).reduce(\n (acc, [name, tool]) => {\n const { render, display, ...rest } = tool;\n acc[name] = rest;\n return acc;\n },\n {} as Record<string, Tool<any, any>>,\n );\n\n const modelContextProvider = {\n getModelContext: () => ({\n tools: toolsWithoutRender,\n }),\n };\n\n unsubscribes.push(\n clientRef.current!.modelContext().register(modelContextProvider),\n );\n\n return () => {\n unsubscribes.forEach((fn) => fn());\n };\n }, [toolkit, setToolUI, clientRef]);\n\n return {\n getState: () => state,\n setToolUI,\n };\n },\n);\n\nattachTransformScopes(Tools, (scopes, parent) => {\n if (!scopes.modelContext && parent.modelContext.source === null) {\n scopes.modelContext = ModelContext();\n }\n});\n"],"mappings":";;;;;;;;;;;;;AAkCA,MAAa,QAAQ,UAClB,EACC,SACA,aAM2B;CAK3B,MAAM,eAJgB,mBACb,SAAS,CAAC,QAAQ,UAAU,MAAM,CAAC,IAAI,CAAC,GAC/C,CAAC,MAAM,CAEwB,EAAE;CAEnC,MAAM,CAAC,SAAS,cAAc,gBAAuC,CAAC,EAAE;CAExE,MAAM,QAAQ,eACO;EACjB;EACA,QAAQ;EAER,OAAO,OAAO,YACZ,OAAO,QAAQ,OAAO,EAAE,KAAK,CAAC,MAAM,UAAU,CAC5C,MACA,KAAK,KAAK,MAAM,EAAE,MAAM,CAC1B,CAAC,CACH;CACF,IACA,CAAC,SAAS,YAAY,CACxB;CAEA,MAAM,YAAY,sBAAsB;CAExC,MAAM,YAAY,aAEd,UACA,QACA,YACG;EAGH,MAAM,eAAe;GACnB;GACA,YAAY,SAAS,cAAc;EACrC;EAEA,YAAY,UAAU;GACpB,GAAG;IACF,WAAW,CAAC,GAAI,KAAK,aAAa,CAAC,GAAI,YAAY;EACtD,EAAE;EAEF,aAAa;GACX,YAAY,SAAS;IACnB,MAAM,OACJ,KAAK,WAAW,QAAQ,MAAM,MAAM,YAAY,KAAK,CAAC;IACxD,IAAI,KAAK,SAAS,GAAG,OAAO;KAAE,GAAG;MAAO,WAAW;IAAK;IAGxD,MAAM,GAAG,WAAW,UAAU,GAAG,SAAS;IAC1C,OAAO;GACT,CAAC;EACH;CACF,GACA,CAAC,CACH;CAEA,gBAAgB;EACd,IAAI,CAAC,SAAS;EACd,MAAM,eAA+B,CAAC;EAGtC,KAAK,MAAM,CAAC,UAAU,SAAS,OAAO,QAAQ,OAAO,GACnD,IAAI,KAAK,QACP,aAAa,KACX,UAAU,UAAU,KAAK,QAAQ,EAC/B,YAAY,wBAAwB,IAAI,EAC1C,CAAC,CACH;EAOJ,MAAM,qBAAqB,OAAO,QAAQ,OAAO,EAAE,QAChD,KAAK,CAAC,MAAM,UAAU;GACrB,MAAM,EAAE,QAAQ,SAAS,GAAG,SAAS;GACrC,IAAI,QAAQ;GACZ,OAAO;EACT,GACA,CAAC,CACH;EAQA,aAAa,KACX,UAAU,QAAS,aAAa,EAAE,SAAS,EAN3C,wBAAwB,EACtB,OAAO,mBACT,GAI8D,CAAC,CACjE;EAEA,aAAa;GACX,aAAa,SAAS,OAAO,GAAG,CAAC;EACnC;CACF,GAAG;EAAC;EAAS;EAAW;CAAS,CAAC;CAElC,OAAO;EACL,gBAAgB;EAChB;CACF;AACF,CACF;AAEA,sBAAsB,QAAQ,QAAQ,WAAW;CAC/C,IAAI,CAAC,OAAO,gBAAgB,OAAO,aAAa,WAAW,MACzD,OAAO,eAAe,aAAa;AAEvC,CAAC"}
1
+ {"version":3,"file":"Tools.js","names":[],"sources":["../../../src/react/client/Tools.ts"],"sourcesContent":["import { useState, useEffect, useCallback, useMemo } from \"react\";\nimport {\n useResources,\n resource,\n withKey,\n type ResourceElement,\n} from \"@assistant-ui/tap\";\nimport {\n useAssistantClientRef,\n type ClientOutput,\n attachTransformScopes,\n} from \"@assistant-ui/store\";\nimport type { McpAppResourceOutput, ToolsState } from \"../types/scopes/tools\";\nimport type { Tool } from \"assistant-stream\";\nimport {\n isStandaloneToolDisplay,\n makeToolCallTextComponent,\n type Toolkit,\n} from \"../model-context/toolbox\";\nimport type { ToolCallMessagePartComponent } from \"../types/MessagePartComponentTypes\";\nimport { ModelContext } from \"../../store\";\n\nexport type { McpAppResourceOutput };\n\n/**\n * Registers tools with model context and installs tool-call renderers.\n *\n * Mount this resource near an assistant subtree when you want to expose a\n * group of tools declaratively. Tool definitions are registered with model\n * context, while each tool renderer is registered with the tools scope for\n * message rendering.\n */\nexport const Tools = resource(function Tools({\n toolkit,\n mcpApp,\n}: {\n /** Tools to expose to the model and optional renderers to install. */\n toolkit?: Toolkit;\n /** Optional MCP app resource whose tools should be merged into context. */\n mcpApp?: ResourceElement<McpAppResourceOutput> | undefined;\n}): ClientOutput<\"tools\"> {\n const mcpAppOutputs = useResources(\n () => (mcpApp ? [withKey(\"mcpApp\", mcpApp)] : []),\n [mcpApp],\n );\n const mcpAppOutput = mcpAppOutputs[0];\n\n const [toolUIs, setToolUIs] = useState<ToolsState[\"toolUIs\"]>(() => ({}));\n\n const state = useMemo(\n (): ToolsState => ({\n toolUIs,\n mcpApp: mcpAppOutput,\n // Deprecated component-only view, derived from `toolUIs`. Removed in v0.15.\n tools: Object.fromEntries(\n Object.entries(toolUIs).map(([name, regs]) => [\n name,\n regs.map((r) => r.render),\n ]),\n ),\n }),\n [toolUIs, mcpAppOutput],\n );\n\n const clientRef = useAssistantClientRef();\n\n const setToolUI = useCallback(\n (\n toolName: string,\n render: ToolCallMessagePartComponent,\n options?: { standalone?: boolean },\n ) => {\n // One registration object per call; identity is the removal key, so\n // the per-name list stays correctly ref-counted across re-registers.\n const registration = {\n render,\n standalone: options?.standalone ?? false,\n };\n\n setToolUIs((prev) => ({\n ...prev,\n [toolName]: [...(prev[toolName] ?? []), registration],\n }));\n\n return () => {\n setToolUIs((prev) => {\n const next = prev[toolName]?.filter((r) => r !== registration) ?? [];\n if (next.length > 0) return { ...prev, [toolName]: next };\n // Drop the key entirely so repeatedly mounted/unmounted tools\n // don't leave empty arrays accumulating across a long session.\n const { [toolName]: _removed, ...rest } = prev;\n return rest;\n });\n };\n },\n [],\n );\n\n useEffect(() => {\n if (!toolkit) return;\n const unsubscribes: (() => void)[] = [];\n\n // Register tool UIs (exclude symbols)\n for (const [toolName, tool] of Object.entries(toolkit)) {\n const toolRender = \"render\" in tool ? tool.render : undefined;\n const toolRenderText = \"renderText\" in tool ? tool.renderText : undefined;\n const render =\n toolRender ??\n (toolRenderText\n ? makeToolCallTextComponent(toolRenderText)\n : undefined);\n if (render) {\n unsubscribes.push(\n setToolUI(toolName, render, {\n standalone: isStandaloneToolDisplay(tool),\n }),\n );\n }\n }\n\n // Register tools with model context (exclude symbols). `render`,\n // `renderText`, and `display` are client-only presentation concerns and\n // never reach the model.\n const toolsWithoutRender = Object.entries(toolkit).reduce(\n (acc, [name, tool]) => {\n if (tool.type === \"mcp\") return acc;\n const {\n display: _display,\n render: _render,\n renderText: _renderText,\n ...rest\n } = tool as typeof tool & { renderText?: unknown };\n acc[name] = rest as Tool<any, any>;\n return acc;\n },\n {} as Record<string, Tool<any, any>>,\n );\n\n const modelContextProvider = {\n getModelContext: () => ({\n tools: toolsWithoutRender,\n }),\n };\n\n unsubscribes.push(\n clientRef.current!.modelContext().register(modelContextProvider),\n );\n\n return () => {\n unsubscribes.forEach((fn) => fn());\n };\n }, [toolkit, setToolUI, clientRef]);\n\n return {\n getState: () => state,\n setToolUI,\n };\n});\n\nattachTransformScopes(Tools, (scopes, parent) => {\n if (!scopes.modelContext && parent.modelContext.source === null) {\n scopes.modelContext = ModelContext();\n }\n});\n"],"mappings":";;;;;;;;;;;;;;AAgCA,MAAa,QAAQ,SAAS,SAAS,MAAM,EAC3C,SACA,UAMwB;CAKxB,MAAM,eAJgB,mBACb,SAAS,CAAC,QAAQ,UAAU,MAAM,CAAC,IAAI,CAAC,GAC/C,CAAC,MAAM,CAEwB,CAAC,CAAC;CAEnC,MAAM,CAAC,SAAS,cAAc,gBAAuC,CAAC,EAAE;CAExE,MAAM,QAAQ,eACO;EACjB;EACA,QAAQ;EAER,OAAO,OAAO,YACZ,OAAO,QAAQ,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,UAAU,CAC5C,MACA,KAAK,KAAK,MAAM,EAAE,MAAM,CAC1B,CAAC,CACH;CACF,IACA,CAAC,SAAS,YAAY,CACxB;CAEA,MAAM,YAAY,sBAAsB;CAExC,MAAM,YAAY,aAEd,UACA,QACA,YACG;EAGH,MAAM,eAAe;GACnB;GACA,YAAY,SAAS,cAAc;EACrC;EAEA,YAAY,UAAU;GACpB,GAAG;IACF,WAAW,CAAC,GAAI,KAAK,aAAa,CAAC,GAAI,YAAY;EACtD,EAAE;EAEF,aAAa;GACX,YAAY,SAAS;IACnB,MAAM,OAAO,KAAK,SAAS,EAAE,QAAQ,MAAM,MAAM,YAAY,KAAK,CAAC;IACnE,IAAI,KAAK,SAAS,GAAG,OAAO;KAAE,GAAG;MAAO,WAAW;IAAK;IAGxD,MAAM,GAAG,WAAW,UAAU,GAAG,SAAS;IAC1C,OAAO;GACT,CAAC;EACH;CACF,GACA,CAAC,CACH;CAEA,gBAAgB;EACd,IAAI,CAAC,SAAS;EACd,MAAM,eAA+B,CAAC;EAGtC,KAAK,MAAM,CAAC,UAAU,SAAS,OAAO,QAAQ,OAAO,GAAG;GACtD,MAAM,aAAa,YAAY,OAAO,KAAK,SAAS,KAAA;GACpD,MAAM,iBAAiB,gBAAgB,OAAO,KAAK,aAAa,KAAA;GAChE,MAAM,SACJ,eACC,iBACG,0BAA0B,cAAc,IACxC,KAAA;GACN,IAAI,QACF,aAAa,KACX,UAAU,UAAU,QAAQ,EAC1B,YAAY,wBAAwB,IAAI,EAC1C,CAAC,CACH;EAEJ;EAKA,MAAM,qBAAqB,OAAO,QAAQ,OAAO,CAAC,CAAC,QAChD,KAAK,CAAC,MAAM,UAAU;GACrB,IAAI,KAAK,SAAS,OAAO,OAAO;GAChC,MAAM,EACJ,SAAS,UACT,QAAQ,SACR,YAAY,aACZ,GAAG,SACD;GACJ,IAAI,QAAQ;GACZ,OAAO;EACT,GACA,CAAC,CACH;EAQA,aAAa,KACX,UAAU,QAAS,aAAa,CAAC,CAAC,SAAS,EAN3C,wBAAwB,EACtB,OAAO,mBACT,GAI8D,CAAC,CACjE;EAEA,aAAa;GACX,aAAa,SAAS,OAAO,GAAG,CAAC;EACnC;CACF,GAAG;EAAC;EAAS;EAAW;CAAS,CAAC;CAElC,OAAO;EACL,gBAAgB;EAChB;CACF;AACF,CAAC;AAED,sBAAsB,QAAQ,QAAQ,WAAW;CAC/C,IAAI,CAAC,OAAO,gBAAgB,OAAO,aAAa,WAAW,MACzD,OAAO,eAAe,aAAa;AAEvC,CAAC"}
@@ -1,6 +1,7 @@
1
1
  /// <reference path="../store/scope-registration.d.ts" />
2
2
  /// <reference path="./types/store-augmentation.d.ts" />
3
3
  import { AssistantContextConfig } from "../model-context/types.js";
4
+ import { PartState } from "../store/scopes/part.js";
4
5
  import { AssistantProviderBase, AssistantProviderBaseProps, getRenderComponent } from "./AssistantProvider.js";
5
6
  import { AssistantRuntimeProvider } from "./AssistantRuntimeProvider.js";
6
7
  import { RuntimeAdapter } from "./RuntimeAdapter.js";
@@ -10,7 +11,7 @@ import { DataRenderers } from "./client/DataRenderers.js";
10
11
  import { Interactables } from "./client/Interactables.js";
11
12
  import { DataMessagePartComponent, DataMessagePartProps, EmptyMessagePartComponent, EmptyMessagePartProps, FileMessagePartComponent, FileMessagePartProps, GenerativeUIComponentRegistry, GenerativeUIMessagePartComponent, GenerativeUIMessagePartProps, GenerativeUIRenderProps, ImageMessagePartComponent, ImageMessagePartProps, QuoteMessagePartComponent, QuoteMessagePartProps, ReasoningGroupComponent, ReasoningGroupProps, ReasoningMessagePartComponent, ReasoningMessagePartProps, SourceMessagePartComponent, SourceMessagePartProps, TextMessagePartComponent, TextMessagePartProps, ToolCallMessagePartComponent, ToolCallMessagePartProps, Unstable_AudioMessagePartComponent, Unstable_AudioMessagePartProps } from "./types/MessagePartComponentTypes.js";
12
13
  import { McpAppResourceOutput, ToolsClientSchema, ToolsMethods, ToolsState } from "./types/scopes/tools.js";
13
- import { ToolDefinition, Toolkit, ToolkitDeclaration, ToolkitDeclarationDefinition } from "./model-context/toolbox.js";
14
+ import { ToolCallText, ToolDefinition, Toolkit, ToolkitDefinition, ToolkitDefinitionEntry } from "./model-context/toolbox.js";
14
15
  import { Tools } from "./client/Tools.js";
15
16
  import { InteractableDefinition, InteractablePersistedState, InteractablePersistenceAdapter, InteractablePersistenceStatus, InteractableRegistration, InteractableStateSchema, InteractablesClientSchema, InteractablesMethods, InteractablesState } from "./types/scopes/interactables.js";
16
17
  import { AssistantToolProps, useAssistantTool } from "./model-context/useAssistantTool.js";
@@ -23,7 +24,12 @@ import { useAssistantInstructions } from "./model-context/useAssistantInstructio
23
24
  import { useAssistantContext } from "./model-context/useAssistantContext.js";
24
25
  import { useInlineRender } from "./model-context/useInlineRender.js";
25
26
  import { defineToolkit } from "./model-context/define-toolkit.js";
26
- import { hitl } from "./model-context/hitl.js";
27
+ import { stubTool } from "./model-context/stub-tool.js";
28
+ import { externalTool } from "./model-context/external-tool.js";
29
+ import { useAuiToolOverrides } from "./model-context/useAuiToolOverrides.js";
30
+ import { hitl, hitlTool, humanTool } from "./model-context/human-tool.js";
31
+ import { ProviderToolConfig, providerTool } from "./model-context/provider-tool.js";
32
+ import { McpToolkitDefinition, defineMcpToolkit } from "./model-context/define-mcp-toolkit.js";
27
33
  import { AssistantInteractableProps, useAssistantInteractable } from "./model-context/useAssistantInteractable.js";
28
34
  import { useInteractableState } from "./model-context/useInteractableState.js";
29
35
  import { ToolArgsStatus, useToolArgsStatus } from "./model-context/useToolArgsStatus.js";
@@ -42,7 +48,7 @@ import { ReadonlyThreadProvider } from "./providers/ReadonlyThreadProvider.js";
42
48
  import { RuntimeAdapterProvider, RuntimeAdapters, useRuntimeAdapters } from "./runtimes/RuntimeAdapterProvider.js";
43
49
  import { useExternalStoreRuntime } from "./runtimes/useExternalStoreRuntime.js";
44
50
  import { useExternalStoreSharedOptions } from "./runtimes/useExternalStoreSharedOptions.js";
45
- import { convertExternalMessages, useExternalMessageConverter } from "./runtimes/external-message-converter.js";
51
+ import { JoinStrategy, convertExternalMessages, useExternalMessageConverter } from "./runtimes/external-message-converter.js";
46
52
  import { createMessageConverter } from "./runtimes/createMessageConverter.js";
47
53
  import { RemoteThreadListHookInstanceManager } from "./runtimes/RemoteThreadListHookInstanceManager.js";
48
54
  import { RemoteThreadListThreadListRuntimeCore } from "./runtimes/RemoteThreadListThreadListRuntimeCore.js";
@@ -50,7 +56,6 @@ import { useRemoteThreadListRuntime } from "./runtimes/useRemoteThreadListRuntim
50
56
  import { useCloudThreadListAdapter } from "./runtimes/cloud/useCloudThreadListAdapter.js";
51
57
  import { useAssistantCloudThreadHistoryAdapter } from "./runtimes/cloud/AssistantCloudThreadHistoryAdapter.js";
52
58
  import { CloudFileAttachmentAdapter } from "./runtimes/cloud/CloudFileAttachmentAdapter.js";
53
- import { PartState } from "../store/scopes/part.js";
54
59
  import { ThreadPrimitiveMessageByIndex, ThreadPrimitiveMessages, ThreadPrimitiveMessagesImpl } from "./primitives/thread/ThreadMessages.js";
55
60
  import { EnrichedPartState, MessagePartComponent, MessagePrimitivePartByIndex, MessagePrimitiveParts, defaultComponents } from "./primitives/message/MessageParts.js";
56
61
  import { GroupByContext, groupPartByType } from "./utils/groupParts.js";
@@ -97,4 +102,4 @@ import { useEditComposerCancel } from "./primitive-hooks/useEditComposerCancel.j
97
102
  import { useEditComposerSend } from "./primitive-hooks/useEditComposerSend.js";
98
103
  import { useMessageError } from "./primitive-hooks/useMessageError.js";
99
104
  import { LocalRuntimeOptions, splitLocalRuntimeOptions, useLocalRuntime } from "./runtimes/useLocalRuntime.js";
100
- export { type AssistantContextConfig, type AssistantDataUI, type AssistantDataUIProps, type AssistantInteractableProps, AssistantProviderBase, type AssistantProviderBaseProps, AssistantRuntimeProvider, type AssistantTool, type AssistantToolProps, type AssistantToolUI, type AssistantToolUIProps, type AsyncStorageLike, ChainOfThoughtByIndicesProvider, ChainOfThoughtPartByIndexProvider, ChainOfThoughtPrimitiveParts, CloudFileAttachmentAdapter, ComposerAttachmentByIndexProvider, ComposerPrimitiveAttachmentByIndex, ComposerPrimitiveAttachments, ComposerPrimitiveIf, ComposerPrimitiveQueue, type DataMessagePartComponent, type DataMessagePartProps, DataRenderers, type DataRenderersClientSchema, type DataRenderersMethods, type DataRenderersState, type EmptyMessagePartComponent, type EmptyMessagePartProps, type EnrichedPartState, type FileMessagePartComponent, type FileMessagePartProps, type GenerativeUIComponentRegistry, type GenerativeUIMessagePartComponent, type GenerativeUIMessagePartProps, GenerativeUIRender, GenerativeUIRenderError, type GenerativeUIRenderProps, type GroupByContext, type ImageMessagePartComponent, type ImageMessagePartProps, type InteractableDefinition, type InteractablePersistedState, type InteractablePersistenceAdapter, type InteractablePersistenceStatus, type InteractableRegistration, type InteractableStateSchema, Interactables, type InteractablesClientSchema, type InteractablesMethods, type InteractablesState, type LocalRuntimeOptions, type McpAppResourceOutput, MessageAttachmentByIndexProvider, MessageByIndexProvider, MessagePartComponent, MessagePartPrimitiveInProgress, MessagePrimitiveAttachmentByIndex, MessagePrimitiveAttachments, MessagePrimitiveGenerativeUI, MessagePrimitiveGroupedParts, MessagePrimitivePartByIndex, MessagePrimitiveParts, MessagePrimitiveQuote, PartByIndexProvider, PartPrimitiveMessages, PartPrimitiveMessagesImpl, type PartState, QueueItemByIndexProvider, type QueueItemByIndexProviderProps, type QuoteMessagePartComponent, type QuoteMessagePartProps, ReadonlyThreadProvider, type ReasoningGroupComponent, type ReasoningGroupProps, type ReasoningMessagePartComponent, type ReasoningMessagePartProps, RemoteThreadListHookInstanceManager, RemoteThreadListThreadListRuntimeCore, RuntimeAdapter, RuntimeAdapterProvider, type RuntimeAdapters, type SourceMessagePartComponent, type SourceMessagePartProps, SuggestionByIndexProvider, type SuggestionByIndexProviderProps, type TextMessagePartComponent, type TextMessagePartProps, TextMessagePartProvider, ThreadListItemByIndexProvider, ThreadListItemPrimitiveTitle, ThreadListItemRuntimeProvider, ThreadListPrimitiveItemByIndex, ThreadListPrimitiveItems, ThreadPrimitiveMessageByIndex, ThreadPrimitiveMessages, ThreadPrimitiveMessagesImpl, ThreadPrimitiveSuggestionByIndex, ThreadPrimitiveSuggestions, ThreadPrimitiveSuggestionsImpl, type TitleGenerationAdapter, type ToolArgsStatus, type ToolCallMessagePartComponent, type ToolCallMessagePartProps, type ToolDefinition, type Toolkit, type ToolkitDeclaration, type ToolkitDeclarationDefinition, Tools, type ToolsClientSchema, type ToolsMethods, type ToolsState, type Unstable_AudioMessagePartComponent, type Unstable_AudioMessagePartProps, type UseActionBarCopyOptions, type UseComposerIfProps, type UseSuggestionTriggerOptions, convertExternalMessages, createLocalStorageAdapter, createMessageConverter, createSimpleTitleAdapter, defineToolkit, getMessageQuote, getRenderComponent, groupPartByType, hitl, makeAssistantDataUI, makeAssistantTool, makeAssistantToolUI, defaultComponents as messagePartsDefaultComponents, splitLocalRuntimeOptions, useActionBarCopy, useActionBarEdit, useActionBarFeedbackNegative, useActionBarFeedbackPositive, useActionBarReload, useActionBarSpeak, useActionBarStopSpeaking, useAssistantCloudThreadHistoryAdapter, useAssistantContext, useAssistantDataUI, useAssistantInstructions, useAssistantInteractable, useAssistantTool, useAssistantToolUI, useBranchPickerNext, useBranchPickerPrevious, useCloudThreadListAdapter, useComposerAddAttachment, useComposerCancel, useComposerDictate, useComposerSend, useEditComposerCancel, useEditComposerSend, useExternalMessageConverter, useExternalStoreRuntime, useExternalStoreSharedOptions, useInlineRender, useInteractableState, useLocalRuntime, useMessageBranching, useMessageError, useMessageReload, useRemoteThreadListRuntime, useRuntimeAdapters, useSuggestionTrigger, useThreadIsEmpty, useThreadIsRunning, useThreadListItemArchive, useThreadListItemDelete, useThreadListItemTrigger, useThreadListItemUnarchive, useThreadListLoadMore, useThreadListNew, useThreadMessages, useToolArgsStatus, useVoiceControls, useVoiceState, useVoiceVolume };
105
+ export { type AssistantContextConfig, type AssistantDataUI, type AssistantDataUIProps, type AssistantInteractableProps, AssistantProviderBase, type AssistantProviderBaseProps, AssistantRuntimeProvider, type AssistantTool, type AssistantToolProps, type AssistantToolUI, type AssistantToolUIProps, type AsyncStorageLike, ChainOfThoughtByIndicesProvider, ChainOfThoughtPartByIndexProvider, ChainOfThoughtPrimitiveParts, CloudFileAttachmentAdapter, ComposerAttachmentByIndexProvider, ComposerPrimitiveAttachmentByIndex, ComposerPrimitiveAttachments, ComposerPrimitiveIf, ComposerPrimitiveQueue, type DataMessagePartComponent, type DataMessagePartProps, DataRenderers, type DataRenderersClientSchema, type DataRenderersMethods, type DataRenderersState, type EmptyMessagePartComponent, type EmptyMessagePartProps, type EnrichedPartState, type FileMessagePartComponent, type FileMessagePartProps, type GenerativeUIComponentRegistry, type GenerativeUIMessagePartComponent, type GenerativeUIMessagePartProps, GenerativeUIRender, GenerativeUIRenderError, type GenerativeUIRenderProps, type GroupByContext, type ImageMessagePartComponent, type ImageMessagePartProps, type InteractableDefinition, type InteractablePersistedState, type InteractablePersistenceAdapter, type InteractablePersistenceStatus, type InteractableRegistration, type InteractableStateSchema, Interactables, type InteractablesClientSchema, type InteractablesMethods, type InteractablesState, type JoinStrategy, type LocalRuntimeOptions, type McpAppResourceOutput, type McpToolkitDefinition, MessageAttachmentByIndexProvider, MessageByIndexProvider, MessagePartComponent, MessagePartPrimitiveInProgress, MessagePrimitiveAttachmentByIndex, MessagePrimitiveAttachments, MessagePrimitiveGenerativeUI, MessagePrimitiveGroupedParts, MessagePrimitivePartByIndex, MessagePrimitiveParts, MessagePrimitiveQuote, PartByIndexProvider, PartPrimitiveMessages, PartPrimitiveMessagesImpl, type PartState, type ProviderToolConfig, QueueItemByIndexProvider, type QueueItemByIndexProviderProps, type QuoteMessagePartComponent, type QuoteMessagePartProps, ReadonlyThreadProvider, type ReasoningGroupComponent, type ReasoningGroupProps, type ReasoningMessagePartComponent, type ReasoningMessagePartProps, RemoteThreadListHookInstanceManager, RemoteThreadListThreadListRuntimeCore, RuntimeAdapter, RuntimeAdapterProvider, type RuntimeAdapters, type SourceMessagePartComponent, type SourceMessagePartProps, SuggestionByIndexProvider, type SuggestionByIndexProviderProps, type TextMessagePartComponent, type TextMessagePartProps, TextMessagePartProvider, ThreadListItemByIndexProvider, ThreadListItemPrimitiveTitle, ThreadListItemRuntimeProvider, ThreadListPrimitiveItemByIndex, ThreadListPrimitiveItems, ThreadPrimitiveMessageByIndex, ThreadPrimitiveMessages, ThreadPrimitiveMessagesImpl, ThreadPrimitiveSuggestionByIndex, ThreadPrimitiveSuggestions, ThreadPrimitiveSuggestionsImpl, type TitleGenerationAdapter, type ToolArgsStatus, type ToolCallMessagePartComponent, type ToolCallMessagePartProps, type ToolCallText, type ToolDefinition, type Toolkit, type ToolkitDefinition, type ToolkitDefinitionEntry, Tools, type ToolsClientSchema, type ToolsMethods, type ToolsState, type Unstable_AudioMessagePartComponent, type Unstable_AudioMessagePartProps, type UseActionBarCopyOptions, type UseComposerIfProps, type UseSuggestionTriggerOptions, convertExternalMessages, createLocalStorageAdapter, createMessageConverter, createSimpleTitleAdapter, defineMcpToolkit, defineToolkit, externalTool, getMessageQuote, getRenderComponent, groupPartByType, hitl, hitlTool, humanTool, makeAssistantDataUI, makeAssistantTool, makeAssistantToolUI, defaultComponents as messagePartsDefaultComponents, providerTool, splitLocalRuntimeOptions, stubTool, useActionBarCopy, useActionBarEdit, useActionBarFeedbackNegative, useActionBarFeedbackPositive, useActionBarReload, useActionBarSpeak, useActionBarStopSpeaking, useAssistantCloudThreadHistoryAdapter, useAssistantContext, useAssistantDataUI, useAssistantInstructions, useAssistantInteractable, useAssistantTool, useAssistantToolUI, useAuiToolOverrides, useBranchPickerNext, useBranchPickerPrevious, useCloudThreadListAdapter, useComposerAddAttachment, useComposerCancel, useComposerDictate, useComposerSend, useEditComposerCancel, useEditComposerSend, useExternalMessageConverter, useExternalStoreRuntime, useExternalStoreSharedOptions, useInlineRender, useInteractableState, useLocalRuntime, useMessageBranching, useMessageError, useMessageReload, useRemoteThreadListRuntime, useRuntimeAdapters, useSuggestionTrigger, useThreadIsEmpty, useThreadIsRunning, useThreadListItemArchive, useThreadListItemDelete, useThreadListItemTrigger, useThreadListItemUnarchive, useThreadListLoadMore, useThreadListNew, useThreadMessages, useToolArgsStatus, useVoiceControls, useVoiceState, useVoiceVolume };
@@ -13,7 +13,12 @@ import { useAssistantInstructions } from "./model-context/useAssistantInstructio
13
13
  import { useAssistantContext } from "./model-context/useAssistantContext.js";
14
14
  import { useInlineRender } from "./model-context/useInlineRender.js";
15
15
  import { defineToolkit } from "./model-context/define-toolkit.js";
16
- import { hitl } from "./model-context/hitl.js";
16
+ import { stubTool } from "./model-context/stub-tool.js";
17
+ import { externalTool } from "./model-context/external-tool.js";
18
+ import { useAuiToolOverrides } from "./model-context/useAuiToolOverrides.js";
19
+ import { hitl, hitlTool, humanTool } from "./model-context/human-tool.js";
20
+ import { providerTool } from "./model-context/provider-tool.js";
21
+ import { defineMcpToolkit } from "./model-context/define-mcp-toolkit.js";
17
22
  import { useAssistantInteractable } from "./model-context/useAssistantInteractable.js";
18
23
  import { useInteractableState } from "./model-context/useInteractableState.js";
19
24
  import { useToolArgsStatus } from "./model-context/useToolArgsStatus.js";
@@ -88,4 +93,4 @@ import { useEditComposerCancel } from "./primitive-hooks/useEditComposerCancel.j
88
93
  import { useEditComposerSend } from "./primitive-hooks/useEditComposerSend.js";
89
94
  import { useMessageError } from "./primitive-hooks/useMessageError.js";
90
95
  import { splitLocalRuntimeOptions, useLocalRuntime } from "./runtimes/useLocalRuntime.js";
91
- export { AssistantProviderBase, AssistantRuntimeProvider, ChainOfThoughtByIndicesProvider, ChainOfThoughtPartByIndexProvider, ChainOfThoughtPrimitiveParts, CloudFileAttachmentAdapter, ComposerAttachmentByIndexProvider, ComposerPrimitiveAttachmentByIndex, ComposerPrimitiveAttachments, ComposerPrimitiveIf, ComposerPrimitiveQueue, DataRenderers, GenerativeUIRender, GenerativeUIRenderError, Interactables, MessageAttachmentByIndexProvider, MessageByIndexProvider, MessagePartComponent, MessagePartPrimitiveInProgress, MessagePrimitiveAttachmentByIndex, MessagePrimitiveAttachments, MessagePrimitiveGenerativeUI, MessagePrimitiveGroupedParts, MessagePrimitivePartByIndex, MessagePrimitiveParts, MessagePrimitiveQuote, PartByIndexProvider, PartPrimitiveMessages, PartPrimitiveMessagesImpl, QueueItemByIndexProvider, ReadonlyThreadProvider, RemoteThreadListHookInstanceManager, RemoteThreadListThreadListRuntimeCore, RuntimeAdapter, RuntimeAdapterProvider, SuggestionByIndexProvider, TextMessagePartProvider, ThreadListItemByIndexProvider, ThreadListItemPrimitiveTitle, ThreadListItemRuntimeProvider, ThreadListPrimitiveItemByIndex, ThreadListPrimitiveItems, ThreadPrimitiveMessageByIndex, ThreadPrimitiveMessages, ThreadPrimitiveMessagesImpl, ThreadPrimitiveSuggestionByIndex, ThreadPrimitiveSuggestions, ThreadPrimitiveSuggestionsImpl, Tools, convertExternalMessages, createLocalStorageAdapter, createMessageConverter, createSimpleTitleAdapter, defineToolkit, getMessageQuote, getRenderComponent, groupPartByType, hitl, makeAssistantDataUI, makeAssistantTool, makeAssistantToolUI, defaultComponents as messagePartsDefaultComponents, splitLocalRuntimeOptions, useActionBarCopy, useActionBarEdit, useActionBarFeedbackNegative, useActionBarFeedbackPositive, useActionBarReload, useActionBarSpeak, useActionBarStopSpeaking, useAssistantCloudThreadHistoryAdapter, useAssistantContext, useAssistantDataUI, useAssistantInstructions, useAssistantInteractable, useAssistantTool, useAssistantToolUI, useBranchPickerNext, useBranchPickerPrevious, useCloudThreadListAdapter, useComposerAddAttachment, useComposerCancel, useComposerDictate, useComposerSend, useEditComposerCancel, useEditComposerSend, useExternalMessageConverter, useExternalStoreRuntime, useExternalStoreSharedOptions, useInlineRender, useInteractableState, useLocalRuntime, useMessageBranching, useMessageError, useMessageReload, useRemoteThreadListRuntime, useRuntimeAdapters, useSuggestionTrigger, useThreadIsEmpty, useThreadIsRunning, useThreadListItemArchive, useThreadListItemDelete, useThreadListItemTrigger, useThreadListItemUnarchive, useThreadListLoadMore, useThreadListNew, useThreadMessages, useToolArgsStatus, useVoiceControls, useVoiceState, useVoiceVolume };
96
+ export { AssistantProviderBase, AssistantRuntimeProvider, ChainOfThoughtByIndicesProvider, ChainOfThoughtPartByIndexProvider, ChainOfThoughtPrimitiveParts, CloudFileAttachmentAdapter, ComposerAttachmentByIndexProvider, ComposerPrimitiveAttachmentByIndex, ComposerPrimitiveAttachments, ComposerPrimitiveIf, ComposerPrimitiveQueue, DataRenderers, GenerativeUIRender, GenerativeUIRenderError, Interactables, MessageAttachmentByIndexProvider, MessageByIndexProvider, MessagePartComponent, MessagePartPrimitiveInProgress, MessagePrimitiveAttachmentByIndex, MessagePrimitiveAttachments, MessagePrimitiveGenerativeUI, MessagePrimitiveGroupedParts, MessagePrimitivePartByIndex, MessagePrimitiveParts, MessagePrimitiveQuote, PartByIndexProvider, PartPrimitiveMessages, PartPrimitiveMessagesImpl, QueueItemByIndexProvider, ReadonlyThreadProvider, RemoteThreadListHookInstanceManager, RemoteThreadListThreadListRuntimeCore, RuntimeAdapter, RuntimeAdapterProvider, SuggestionByIndexProvider, TextMessagePartProvider, ThreadListItemByIndexProvider, ThreadListItemPrimitiveTitle, ThreadListItemRuntimeProvider, ThreadListPrimitiveItemByIndex, ThreadListPrimitiveItems, ThreadPrimitiveMessageByIndex, ThreadPrimitiveMessages, ThreadPrimitiveMessagesImpl, ThreadPrimitiveSuggestionByIndex, ThreadPrimitiveSuggestions, ThreadPrimitiveSuggestionsImpl, Tools, convertExternalMessages, createLocalStorageAdapter, createMessageConverter, createSimpleTitleAdapter, defineMcpToolkit, defineToolkit, externalTool, getMessageQuote, getRenderComponent, groupPartByType, hitl, hitlTool, humanTool, makeAssistantDataUI, makeAssistantTool, makeAssistantToolUI, defaultComponents as messagePartsDefaultComponents, providerTool, splitLocalRuntimeOptions, stubTool, useActionBarCopy, useActionBarEdit, useActionBarFeedbackNegative, useActionBarFeedbackPositive, useActionBarReload, useActionBarSpeak, useActionBarStopSpeaking, useAssistantCloudThreadHistoryAdapter, useAssistantContext, useAssistantDataUI, useAssistantInstructions, useAssistantInteractable, useAssistantTool, useAssistantToolUI, useAuiToolOverrides, useBranchPickerNext, useBranchPickerPrevious, useCloudThreadListAdapter, useComposerAddAttachment, useComposerCancel, useComposerDictate, useComposerSend, useEditComposerCancel, useEditComposerSend, useExternalMessageConverter, useExternalStoreRuntime, useExternalStoreSharedOptions, useInlineRender, useInteractableState, useLocalRuntime, useMessageBranching, useMessageError, useMessageReload, useRemoteThreadListRuntime, useRuntimeAdapters, useSuggestionTrigger, useThreadIsEmpty, useThreadIsRunning, useThreadListItemArchive, useThreadListItemDelete, useThreadListItemTrigger, useThreadListItemUnarchive, useThreadListLoadMore, useThreadListNew, useThreadMessages, useToolArgsStatus, useVoiceControls, useVoiceState, useVoiceVolume };
@@ -0,0 +1,12 @@
1
+ import { Toolkit } from "./toolbox.js";
2
+ import { McpServerConfig } from "assistant-stream";
3
+
4
+ //#region src/react/model-context/define-mcp-toolkit.d.ts
5
+ type McpToolkitDefinition = Record<string, McpServerConfig>;
6
+ /**
7
+ * Defines MCP server tools as a spreadable toolkit fragment.
8
+ */
9
+ declare function defineMcpToolkit(definition: McpToolkitDefinition): Toolkit;
10
+ //#endregion
11
+ export { McpToolkitDefinition, defineMcpToolkit };
12
+ //# sourceMappingURL=define-mcp-toolkit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-mcp-toolkit.d.ts","names":[],"sources":["../../../src/react/model-context/define-mcp-toolkit.ts"],"mappings":";;;;KAGY,oBAAA,GAAuB,MAAM,SAAS,eAAA;;AAAlD;;iBAKgB,gBAAA,CAAiB,UAAA,EAAY,oBAAA,GAAuB,OAAO"}