@assistant-ui/core 0.2.10 → 0.2.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (362) hide show
  1. package/dist/adapters/attachment.d.ts.map +1 -1
  2. package/dist/adapters/attachment.js +22 -12
  3. package/dist/adapters/attachment.js.map +1 -1
  4. package/dist/adapters/directive-formatter.js.map +1 -1
  5. package/dist/adapters/speech.js.map +1 -1
  6. package/dist/index.d.ts +3 -1
  7. package/dist/index.js +2 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/internal.js +1 -1
  10. package/dist/model-context/frame/host.js.map +1 -1
  11. package/dist/model-context/frame/provider.js.map +1 -1
  12. package/dist/model-context/registry.js.map +1 -1
  13. package/dist/model-context/types.js.map +1 -1
  14. package/dist/react/AssistantProvider.js +1 -1
  15. package/dist/react/AssistantRuntimeProvider.d.ts +1 -1
  16. package/dist/react/AssistantRuntimeProvider.d.ts.map +1 -1
  17. package/dist/react/AssistantRuntimeProvider.js +1 -1
  18. package/dist/react/RuntimeAdapter.js +4 -2
  19. package/dist/react/RuntimeAdapter.js.map +1 -1
  20. package/dist/react/adapters/LocalStorageThreadListAdapter.js +1 -1
  21. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  22. package/dist/react/client/DataRenderers.d.ts.map +1 -1
  23. package/dist/react/client/DataRenderers.js +6 -5
  24. package/dist/react/client/DataRenderers.js.map +1 -1
  25. package/dist/react/client/Interactables.d.ts.map +1 -1
  26. package/dist/react/client/Interactables.js +30 -29
  27. package/dist/react/client/Interactables.js.map +1 -1
  28. package/dist/react/client/Tools.d.ts.map +1 -1
  29. package/dist/react/client/Tools.js +10 -9
  30. package/dist/react/client/Tools.js.map +1 -1
  31. package/dist/react/index.d.ts +5 -4
  32. package/dist/react/index.js +3 -2
  33. package/dist/react/model-context/define-mcp-toolkit.js.map +1 -1
  34. package/dist/react/model-context/define-toolkit.d.ts +9 -12
  35. package/dist/react/model-context/define-toolkit.d.ts.map +1 -1
  36. package/dist/react/model-context/define-toolkit.js +1 -1
  37. package/dist/react/model-context/define-toolkit.js.map +1 -1
  38. package/dist/react/model-context/external-tool.d.ts +14 -0
  39. package/dist/react/model-context/external-tool.d.ts.map +1 -0
  40. package/dist/react/model-context/external-tool.js +17 -0
  41. package/dist/react/model-context/external-tool.js.map +1 -0
  42. package/dist/react/model-context/human-tool.d.ts +27 -0
  43. package/dist/react/model-context/human-tool.d.ts.map +1 -0
  44. package/dist/react/model-context/human-tool.js +30 -0
  45. package/dist/react/model-context/human-tool.js.map +1 -0
  46. package/dist/react/model-context/toolbox.d.ts +3 -3
  47. package/dist/react/model-context/toolbox.js.map +1 -1
  48. package/dist/react/model-context/useAssistantContext.js +1 -1
  49. package/dist/react/model-context/useAssistantContext.js.map +1 -1
  50. package/dist/react/model-context/useAssistantDataUI.js +1 -1
  51. package/dist/react/model-context/useAssistantDataUI.js.map +1 -1
  52. package/dist/react/model-context/useAssistantInstructions.js +1 -1
  53. package/dist/react/model-context/useAssistantInstructions.js.map +1 -1
  54. package/dist/react/model-context/useAssistantInteractable.js +1 -1
  55. package/dist/react/model-context/useAssistantInteractable.js.map +1 -1
  56. package/dist/react/model-context/useAssistantTool.js +1 -1
  57. package/dist/react/model-context/useAssistantTool.js.map +1 -1
  58. package/dist/react/model-context/useAssistantToolUI.js +1 -1
  59. package/dist/react/model-context/useAssistantToolUI.js.map +1 -1
  60. package/dist/react/model-context/useAuiToolOverrides.js +1 -1
  61. package/dist/react/model-context/useAuiToolOverrides.js.map +1 -1
  62. package/dist/react/model-context/useInlineRender.js +1 -1
  63. package/dist/react/model-context/useInlineRender.js.map +1 -1
  64. package/dist/react/model-context/useInteractableState.js +1 -1
  65. package/dist/react/model-context/useInteractableState.js.map +1 -1
  66. package/dist/react/model-context/useToolArgsStatus.js +1 -1
  67. package/dist/react/primitive-hooks/useActionBarCopy.js +1 -1
  68. package/dist/react/primitive-hooks/useActionBarCopy.js.map +1 -1
  69. package/dist/react/primitive-hooks/useActionBarEdit.js +1 -1
  70. package/dist/react/primitive-hooks/useActionBarEdit.js.map +1 -1
  71. package/dist/react/primitive-hooks/useActionBarFeedback.js +1 -1
  72. package/dist/react/primitive-hooks/useActionBarFeedback.js.map +1 -1
  73. package/dist/react/primitive-hooks/useActionBarReload.js +1 -1
  74. package/dist/react/primitive-hooks/useActionBarReload.js.map +1 -1
  75. package/dist/react/primitive-hooks/useActionBarSpeak.js +1 -1
  76. package/dist/react/primitive-hooks/useActionBarSpeak.js.map +1 -1
  77. package/dist/react/primitive-hooks/useActionBarStopSpeaking.js +1 -1
  78. package/dist/react/primitive-hooks/useActionBarStopSpeaking.js.map +1 -1
  79. package/dist/react/primitive-hooks/useBranchPickerNext.js +1 -1
  80. package/dist/react/primitive-hooks/useBranchPickerNext.js.map +1 -1
  81. package/dist/react/primitive-hooks/useBranchPickerPrevious.js +1 -1
  82. package/dist/react/primitive-hooks/useBranchPickerPrevious.js.map +1 -1
  83. package/dist/react/primitive-hooks/useComposerAddAttachment.js +1 -1
  84. package/dist/react/primitive-hooks/useComposerAddAttachment.js.map +1 -1
  85. package/dist/react/primitive-hooks/useComposerCancel.js +1 -1
  86. package/dist/react/primitive-hooks/useComposerCancel.js.map +1 -1
  87. package/dist/react/primitive-hooks/useComposerDictate.js +1 -1
  88. package/dist/react/primitive-hooks/useComposerDictate.js.map +1 -1
  89. package/dist/react/primitive-hooks/useComposerSend.js +1 -1
  90. package/dist/react/primitive-hooks/useComposerSend.js.map +1 -1
  91. package/dist/react/primitive-hooks/useEditComposerCancel.js +1 -1
  92. package/dist/react/primitive-hooks/useEditComposerCancel.js.map +1 -1
  93. package/dist/react/primitive-hooks/useEditComposerSend.js +1 -1
  94. package/dist/react/primitive-hooks/useEditComposerSend.js.map +1 -1
  95. package/dist/react/primitive-hooks/useMessageBranching.js +1 -1
  96. package/dist/react/primitive-hooks/useMessageBranching.js.map +1 -1
  97. package/dist/react/primitive-hooks/useMessageReload.js +1 -1
  98. package/dist/react/primitive-hooks/useMessageReload.js.map +1 -1
  99. package/dist/react/primitive-hooks/useSuggestionTrigger.js +1 -1
  100. package/dist/react/primitive-hooks/useSuggestionTrigger.js.map +1 -1
  101. package/dist/react/primitive-hooks/useThreadListItemArchive.js +1 -1
  102. package/dist/react/primitive-hooks/useThreadListItemArchive.js.map +1 -1
  103. package/dist/react/primitive-hooks/useThreadListItemDelete.js +1 -1
  104. package/dist/react/primitive-hooks/useThreadListItemDelete.js.map +1 -1
  105. package/dist/react/primitive-hooks/useThreadListItemTrigger.js +1 -1
  106. package/dist/react/primitive-hooks/useThreadListItemTrigger.js.map +1 -1
  107. package/dist/react/primitive-hooks/useThreadListItemUnarchive.js +1 -1
  108. package/dist/react/primitive-hooks/useThreadListItemUnarchive.js.map +1 -1
  109. package/dist/react/primitive-hooks/useThreadListLoadMore.js +1 -1
  110. package/dist/react/primitive-hooks/useThreadListLoadMore.js.map +1 -1
  111. package/dist/react/primitive-hooks/useThreadListNew.js +1 -1
  112. package/dist/react/primitive-hooks/useThreadListNew.js.map +1 -1
  113. package/dist/react/primitive-hooks/useVoice.js +1 -1
  114. package/dist/react/primitive-hooks/useVoice.js.map +1 -1
  115. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.d.ts +1 -1
  116. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js +1 -1
  117. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js.map +1 -1
  118. package/dist/react/primitives/composer/ComposerAttachments.js +1 -1
  119. package/dist/react/primitives/composer/ComposerAttachments.js.map +1 -1
  120. package/dist/react/primitives/composer/ComposerQueue.js +1 -1
  121. package/dist/react/primitives/composer/ComposerQueue.js.map +1 -1
  122. package/dist/react/primitives/generativeUI/GenerativeUI.js +1 -1
  123. package/dist/react/primitives/generativeUI/GenerativeUI.js.map +1 -1
  124. package/dist/react/primitives/message/MessageAttachments.js +1 -1
  125. package/dist/react/primitives/message/MessageAttachments.js.map +1 -1
  126. package/dist/react/primitives/message/MessageGroupedParts.js +1 -1
  127. package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
  128. package/dist/react/primitives/message/MessageParts.d.ts +1 -1
  129. package/dist/react/primitives/message/MessageParts.js +1 -1
  130. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  131. package/dist/react/primitives/message/MessageQuote.js +1 -1
  132. package/dist/react/primitives/part/PartMessages.d.ts +2 -2
  133. package/dist/react/primitives/part/PartMessages.js +3 -3
  134. package/dist/react/primitives/part/PartMessages.js.map +1 -1
  135. package/dist/react/primitives/thread/ThreadMessages.js +1 -1
  136. package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
  137. package/dist/react/primitives/thread/ThreadSuggestions.js +1 -1
  138. package/dist/react/primitives/thread/ThreadSuggestions.js.map +1 -1
  139. package/dist/react/primitives/threadList/ThreadListItems.js +1 -1
  140. package/dist/react/primitives/threadList/ThreadListItems.js.map +1 -1
  141. package/dist/react/providers/AttachmentByIndexProvider.js.map +1 -1
  142. package/dist/react/providers/ChainOfThoughtByIndicesProvider.js.map +1 -1
  143. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.js.map +1 -1
  144. package/dist/react/providers/MessageByIndexProvider.js.map +1 -1
  145. package/dist/react/providers/PartByIndexProvider.js.map +1 -1
  146. package/dist/react/providers/QueueItemByIndexProvider.js.map +1 -1
  147. package/dist/react/providers/ReadonlyThreadProvider.js +1 -1
  148. package/dist/react/providers/ReadonlyThreadProvider.js.map +1 -1
  149. package/dist/react/providers/SuggestionByIndexProvider.js.map +1 -1
  150. package/dist/react/providers/TextMessagePartProvider.d.ts.map +1 -1
  151. package/dist/react/providers/TextMessagePartProvider.js +4 -3
  152. package/dist/react/providers/TextMessagePartProvider.js.map +1 -1
  153. package/dist/react/providers/ThreadListItemByIndexProvider.js.map +1 -1
  154. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +7 -0
  155. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  156. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +1 -1
  157. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  158. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +7 -0
  159. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  160. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +1 -1
  161. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  162. package/dist/react/runtimes/RuntimeAdapterProvider.js +1 -1
  163. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +1 -1
  164. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  165. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +1 -1
  166. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  167. package/dist/react/runtimes/createMessageConverter.d.ts +2 -2
  168. package/dist/react/runtimes/createMessageConverter.d.ts.map +1 -1
  169. package/dist/react/runtimes/createMessageConverter.js.map +1 -1
  170. package/dist/react/runtimes/external-message-converter.d.ts +4 -3
  171. package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
  172. package/dist/react/runtimes/external-message-converter.js +1 -1
  173. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  174. package/dist/react/runtimes/useExternalStoreRuntime.js +1 -1
  175. package/dist/react/runtimes/useExternalStoreSharedOptions.js +1 -1
  176. package/dist/react/runtimes/useLocalRuntime.d.ts +2 -1
  177. package/dist/react/runtimes/useLocalRuntime.d.ts.map +1 -1
  178. package/dist/react/runtimes/useLocalRuntime.js +4 -3
  179. package/dist/react/runtimes/useLocalRuntime.js.map +1 -1
  180. package/dist/react/runtimes/useRemoteThreadListRuntime.js +1 -1
  181. package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
  182. package/dist/react/utils/groupParts.d.ts +1 -1
  183. package/dist/react/utils/groupParts.js.map +1 -1
  184. package/dist/runtime/api/attachment-runtime.js.map +1 -1
  185. package/dist/runtime/api/composer-runtime.d.ts +8 -2
  186. package/dist/runtime/api/composer-runtime.d.ts.map +1 -1
  187. package/dist/runtime/api/composer-runtime.js +14 -0
  188. package/dist/runtime/api/composer-runtime.js.map +1 -1
  189. package/dist/runtime/api/message-part-runtime.js.map +1 -1
  190. package/dist/runtime/api/message-runtime.js +1 -1
  191. package/dist/runtime/api/message-runtime.js.map +1 -1
  192. package/dist/runtime/api/thread-list-item-runtime.js.map +1 -1
  193. package/dist/runtime/api/thread-runtime.d.ts +7 -0
  194. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  195. package/dist/runtime/api/thread-runtime.js.map +1 -1
  196. package/dist/runtime/base/base-composer-runtime-core.d.ts +4 -0
  197. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  198. package/dist/runtime/base/base-composer-runtime-core.js +7 -1
  199. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  200. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  201. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +4 -0
  202. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
  203. package/dist/runtime/base/default-thread-composer-runtime-core.js +17 -1
  204. package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
  205. package/dist/runtime/interfaces/composer-runtime-core.d.ts +6 -1
  206. package/dist/runtime/interfaces/composer-runtime-core.d.ts.map +1 -1
  207. package/dist/runtime/interfaces/thread-runtime-core.d.ts +4 -0
  208. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  209. package/dist/runtime/queue/external-thread-queue-adapter.d.ts +20 -0
  210. package/dist/runtime/queue/external-thread-queue-adapter.d.ts.map +1 -0
  211. package/dist/runtime/queue/external-thread-queue-adapter.js +0 -0
  212. package/dist/runtime/queue/message-queue.d.ts +20 -0
  213. package/dist/runtime/queue/message-queue.d.ts.map +1 -0
  214. package/dist/runtime/queue/message-queue.js +97 -0
  215. package/dist/runtime/queue/message-queue.js.map +1 -0
  216. package/dist/runtime/utils/message-repository.js.map +1 -1
  217. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  218. package/dist/runtimes/external-store/external-store-adapter.d.ts +3 -1
  219. package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
  220. package/dist/runtimes/external-store/external-store-runtime-core.js.map +1 -1
  221. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +4 -0
  222. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  223. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +20 -2
  224. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  225. package/dist/runtimes/local/local-runtime-core.js.map +1 -1
  226. package/dist/runtimes/local/local-runtime-options.d.ts +5 -0
  227. package/dist/runtimes/local/local-runtime-options.d.ts.map +1 -1
  228. package/dist/runtimes/local/local-thread-runtime-core.d.ts +7 -0
  229. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  230. package/dist/runtimes/local/local-thread-runtime-core.js +45 -0
  231. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  232. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +3 -0
  233. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
  234. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js +3 -0
  235. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js.map +1 -1
  236. package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts.map +1 -1
  237. package/dist/runtimes/remote-thread-list/empty-thread-core.js +3 -0
  238. package/dist/runtimes/remote-thread-list/empty-thread-core.js.map +1 -1
  239. package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
  240. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  241. package/dist/store/clients/chain-of-thought-client.d.ts.map +1 -1
  242. package/dist/store/clients/chain-of-thought-client.js +6 -5
  243. package/dist/store/clients/chain-of-thought-client.js.map +1 -1
  244. package/dist/store/clients/model-context-client.d.ts.map +1 -1
  245. package/dist/store/clients/model-context-client.js +6 -5
  246. package/dist/store/clients/model-context-client.js.map +1 -1
  247. package/dist/store/clients/no-op-composer-client.d.ts.map +1 -1
  248. package/dist/store/clients/no-op-composer-client.js +4 -3
  249. package/dist/store/clients/no-op-composer-client.js.map +1 -1
  250. package/dist/store/clients/runtime-adapter.d.ts.map +1 -1
  251. package/dist/store/clients/runtime-adapter.js +7 -6
  252. package/dist/store/clients/runtime-adapter.js.map +1 -1
  253. package/dist/store/clients/suggestions.d.ts.map +1 -1
  254. package/dist/store/clients/suggestions.js +7 -6
  255. package/dist/store/clients/suggestions.js.map +1 -1
  256. package/dist/store/clients/thread-message-client.d.ts.map +1 -1
  257. package/dist/store/clients/thread-message-client.js +13 -12
  258. package/dist/store/clients/thread-message-client.js.map +1 -1
  259. package/dist/store/index.d.ts +1 -1
  260. package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -1
  261. package/dist/store/runtime-clients/attachment-runtime-client.js +3 -3
  262. package/dist/store/runtime-clients/attachment-runtime-client.js.map +1 -1
  263. package/dist/store/runtime-clients/composer-runtime-client.d.ts +12 -5
  264. package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
  265. package/dist/store/runtime-clients/composer-runtime-client.js +32 -16
  266. package/dist/store/runtime-clients/composer-runtime-client.js.map +1 -1
  267. package/dist/store/runtime-clients/message-part-runtime-client.d.ts.map +1 -1
  268. package/dist/store/runtime-clients/message-part-runtime-client.js +3 -3
  269. package/dist/store/runtime-clients/message-part-runtime-client.js.map +1 -1
  270. package/dist/store/runtime-clients/message-runtime-client.d.ts +6 -3
  271. package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
  272. package/dist/store/runtime-clients/message-runtime-client.js +17 -16
  273. package/dist/store/runtime-clients/message-runtime-client.js.map +1 -1
  274. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  275. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +8 -7
  276. package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
  277. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  278. package/dist/store/runtime-clients/thread-list-runtime-client.js +11 -10
  279. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  280. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  281. package/dist/store/runtime-clients/thread-runtime-client.js +15 -14
  282. package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
  283. package/dist/store/runtime-clients/useSubscribable.d.ts +7 -0
  284. package/dist/store/runtime-clients/useSubscribable.d.ts.map +1 -0
  285. package/dist/store/runtime-clients/useSubscribable.js +16 -0
  286. package/dist/store/runtime-clients/useSubscribable.js.map +1 -0
  287. package/dist/store/scope-registration.d.ts +1 -1
  288. package/dist/store/scopes/composer.d.ts +1 -1
  289. package/dist/store/scopes/queue-item.d.ts +2 -1
  290. package/dist/store/scopes/queue-item.d.ts.map +1 -1
  291. package/dist/store/scopes/queue-item.js +6 -0
  292. package/dist/store/scopes/queue-item.js.map +1 -0
  293. package/dist/store/scopes/thread.d.ts +1 -1
  294. package/dist/store/scopes/threads.d.ts +1 -1
  295. package/dist/types/message.d.ts +2 -1
  296. package/dist/types/message.d.ts.map +1 -1
  297. package/dist/types/message.js.map +1 -1
  298. package/dist/utils/composite-context-provider.d.ts +1 -1
  299. package/dist/utils/composite-context-provider.js +3 -1
  300. package/dist/utils/composite-context-provider.js.map +1 -1
  301. package/dist/utils/json/is-json.js.map +1 -1
  302. package/dist/utils/text.js.map +1 -1
  303. package/package.json +14 -10
  304. package/src/adapters/attachment.ts +24 -4
  305. package/src/index.ts +8 -0
  306. package/src/react/RuntimeAdapter.ts +6 -4
  307. package/src/react/client/DataRenderers.ts +48 -42
  308. package/src/react/client/Interactables.ts +263 -267
  309. package/src/react/client/Tools.ts +122 -129
  310. package/src/react/index.ts +3 -1
  311. package/src/react/model-context/define-toolkit.test.ts +14 -7
  312. package/src/react/model-context/define-toolkit.ts +18 -19
  313. package/src/react/model-context/external-tool.ts +16 -0
  314. package/src/react/model-context/{hitl.ts → human-tool.ts} +13 -8
  315. package/src/react/model-context/toolbox.ts +3 -3
  316. package/src/react/primitives/message/MessageGroupedParts.tsx +1 -1
  317. package/src/react/primitives/part/PartMessages.tsx +2 -2
  318. package/src/react/providers/TextMessagePartProvider.tsx +31 -32
  319. package/src/react/runtimes/createMessageConverter.ts +2 -1
  320. package/src/react/runtimes/external-message-converter.ts +5 -3
  321. package/src/react/runtimes/useLocalRuntime.ts +2 -0
  322. package/src/runtime/api/composer-runtime.ts +26 -0
  323. package/src/runtime/base/base-composer-runtime-core.ts +11 -0
  324. package/src/runtime/base/default-thread-composer-runtime-core.ts +22 -0
  325. package/src/runtime/interfaces/composer-runtime-core.ts +7 -0
  326. package/src/runtime/interfaces/thread-runtime-core.ts +5 -0
  327. package/src/runtime/queue/external-thread-queue-adapter.ts +14 -0
  328. package/src/runtime/queue/message-queue.ts +128 -0
  329. package/src/runtimes/external-store/external-store-adapter.ts +3 -0
  330. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +31 -2
  331. package/src/runtimes/local/local-runtime-options.ts +6 -0
  332. package/src/runtimes/local/local-thread-runtime-core.ts +70 -0
  333. package/src/runtimes/readonly/ReadonlyThreadRuntimeCore.ts +4 -0
  334. package/src/runtimes/remote-thread-list/empty-thread-core.ts +4 -0
  335. package/src/store/clients/chain-of-thought-client.ts +24 -25
  336. package/src/store/clients/model-context-client.ts +22 -19
  337. package/src/store/clients/no-op-composer-client.ts +69 -66
  338. package/src/store/clients/runtime-adapter.ts +9 -6
  339. package/src/store/clients/suggestions.ts +41 -40
  340. package/src/store/clients/thread-message-client.ts +127 -132
  341. package/src/store/runtime-clients/attachment-runtime-client.ts +7 -3
  342. package/src/store/runtime-clients/composer-runtime-client.ts +142 -113
  343. package/src/store/runtime-clients/message-part-runtime-client.ts +16 -14
  344. package/src/store/runtime-clients/message-runtime-client.ts +124 -122
  345. package/src/store/runtime-clients/thread-list-item-runtime-client.ts +44 -45
  346. package/src/store/runtime-clients/thread-list-runtime-client.ts +83 -80
  347. package/src/store/runtime-clients/thread-runtime-client.ts +113 -119
  348. package/src/store/runtime-clients/{tap-subscribable.ts → useSubscribable.ts} +4 -4
  349. package/src/store/scopes/queue-item.ts +2 -0
  350. package/src/tests/attachment-adapters.test.ts +86 -0
  351. package/src/tests/external-store-thread-runtime-core.test.ts +125 -0
  352. package/src/tests/message-queue.test.ts +168 -0
  353. package/src/types/message.ts +2 -0
  354. package/src/utils/composite-context-provider.ts +3 -1
  355. package/dist/react/model-context/hitl.d.ts +0 -23
  356. package/dist/react/model-context/hitl.d.ts.map +0 -1
  357. package/dist/react/model-context/hitl.js +0 -26
  358. package/dist/react/model-context/hitl.js.map +0 -1
  359. package/dist/store/runtime-clients/tap-subscribable.d.ts +0 -7
  360. package/dist/store/runtime-clients/tap-subscribable.d.ts.map +0 -1
  361. package/dist/store/runtime-clients/tap-subscribable.js +0 -16
  362. package/dist/store/runtime-clients/tap-subscribable.js.map +0 -1
@@ -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":";;;;;;AAwBA,MAAM,0BAA0B;AAEhC,MAAa,gBAAgB,eAA8C;CACzE,MAAM,CAAC,OAAO,YAAY,gBAAoC;EAC5D,aAAa,CAAC;EACd,aAAa,CAAC;CAChB,EAAE;CAEF,MAAM,YAAY,sBAAsB;CAExC,MAAM,WAAW,OAAO,KAAK;CAC7B,gBAAgB;EACd,SAAS,UAAU;CACrB,GAAG,CAAC,KAAK,CAAC;CAEV,MAAM,iBAAiB,uBAAO,IAAI,IAAgB,CAAC;CACnD,MAAM,wBAAwB,uBAC5B,IAAI,IAAqC,CAC3C;CACA,MAAM,mBAAmB,uBAAO,IAAI,IAAqB,CAAC;CAE1D,MAAM,aAAa,OACjB,KAAA,CACF;CACA,MAAM,mBAAmB,OACvB,KAAA,CACF;CACA,MAAM,aAAa,OAAO,CAAC;CAC3B,MAAM,2BAA2B,OAAO,KAAK;CAC7C,MAAM,oBAAoB,OAA0B,CAAC,CAAC;CACtD,MAAM,cAAc,uBAAO,IAAI,IAAY,CAAC;CAE5C,MAAM,iBAAiB,YAAY,YAAY;EAC7C,MAAM,UAAU,WAAW;EAC3B,IAAI,CAAC,SAAS;GACZ,KAAK,MAAM,WAAW,kBAAkB,SAAS,QAAQ;GACzD,kBAAkB,UAAU,CAAC;GAC7B;EACF;EAEA,MAAM,MAAM,EAAE,WAAW;EACzB,MAAM,WAAW,IAAI,IAAI,YAAY,OAAO;EAC5C,YAAY,QAAQ,MAAM;EAC1B,yBAAyB,UAAU;EAGnC,MAAM,WAAW,SAAS,QAAQ;EAClC,MAAM,UAAsC,CAAC;EAC7C,KAAK,MAAM,CAAC,IAAI,QAAQ,OAAO,QAAQ,QAAQ,GAC7C,QAAQ,MAAM;GAAE,MAAM,IAAI;GAAM,OAAO,IAAI;EAAM;EAGnD,UAAU,UAAU;GAClB,GAAG;GACH,aAAa;IACX,GAAG,KAAK;IACR,GAAG,OAAO,YACR,CAAC,GAAG,QAAQ,EAAE,KAAK,OAAO,CACxB,IACA;KAAE,WAAW;KAAM,OAAO,KAAA;IAAU,CACtC,CAAC,CACH;GACF;EACF,EAAE;EAEF,IAAI;GACF,MAAM,QAAQ,KAAK,OAAO;GAC1B,IAAI,WAAW,YAAY,KAAK;IAC9B,yBAAyB,UAAU;IACnC,UAAU,SAAS;KACjB,MAAM,cAAc,EAAE,GAAG,KAAK,YAAY;KAC1C,KAAK,MAAM,MAAM,UAAU,OAAO,YAAY;KAC9C,OAAO;MAAE,GAAG;MAAM;KAAY;IAChC,CAAC;GACH;EACF,SAAS,GAAG;GACV,IAAI,WAAW,YAAY,KAAK;IAC9B,yBAAyB,UAAU;IACnC,UAAU,UAAU;KAClB,GAAG;KACH,aAAa;MACX,GAAG,KAAK;MACR,GAAG,OAAO,YACR,CAAC,GAAG,QAAQ,EAAE,KAAK,OAAO,CAAC,IAAI;OAAE,WAAW;OAAO,OAAO;MAAE,CAAC,CAAC,CAChE;KACF;IACF,EAAE;GACJ;EACF,UAAU;GACR,IAAI,YAAY,QAAQ,OAAO,KAAK,WAAW,SAC7C,eAAe;QACV;IACL,KAAK,MAAM,WAAW,kBAAkB,SAAS,QAAQ;IACzD,kBAAkB,UAAU,CAAC;GAC/B;EACF;CACF,GAAG,CAAC,CAAC;CAEL,MAAM,sBAAsB,aACzB,OAAe;EACd,IAAI,CAAC,WAAW,SAAS;EACzB,YAAY,QAAQ,IAAI,EAAE;EAC1B,IAAI,iBAAiB,YAAY,KAAA,GAC/B,aAAa,iBAAiB,OAAO;EAEvC,iBAAiB,UAAU,iBAAiB;GAC1C,iBAAiB,UAAU,KAAA;GAC3B,IAAI,CAAC,yBAAyB,SAC5B,eAAe;QAEf,iBAAiB,UAAU,iBAAiB;IAC1C,iBAAiB,UAAU,KAAA;IAC3B,eAAe;GACjB,GAAG,uBAAuB;EAE9B,GAAG,uBAAuB;CAC5B,GACA,CAAC,cAAc,CACjB;CAEA,MAAM,cAAc,kBAA8C;EAChE,MAAM,SAAqC,CAAC;EAC5C,KAAK,MAAM,CAAC,IAAI,QAAQ,OAAO,QAAQ,SAAS,QAAQ,WAAW,GACjE,OAAO,MAAM;GAAE,MAAM,IAAI;GAAM,OAAO,IAAI;EAAM;EAElD,OAAO;CACT,GAAG,CAAC,CAAC;CAEL,MAAM,cAAc,aAAa,UAAsC;EACrE,KAAK,MAAM,CAAC,IAAI,UAAU,OAAO,QAAQ,KAAK,GAC5C,iBAAiB,QAAQ,IAAI,IAAI,MAAM,KAAK;EAE9C,UAAU,SAAS;GACjB,IAAI,UAAU;GACd,MAAM,cAAc,EAAE,GAAG,KAAK,YAAY;GAC1C,KAAK,MAAM,CAAC,IAAI,UAAU,OAAO,QAAQ,KAAK,GAC5C,IAAI,YAAY,KAAK;IACnB,YAAY,MAAM;KAAE,GAAG,YAAY;KAAK,OAAO,MAAM;IAAM;IAC3D,UAAU;GACZ;GAEF,OAAO,UAAU;IAAE,GAAG;IAAM;GAAY,IAAI;EAC9C,CAAC;CACH,GAAG,CAAC,CAAC;CAEL,MAAM,wBAAwB,aAC3B,YAAwD;EACvD,WAAW,UAAU;CACvB,GACA,CAAC,CACH;CAEA,MAAM,QAAQ,YAAY,YAAY;EACpC,IAAI,iBAAiB,YAAY,KAAA,GAAW;GAC1C,aAAa,iBAAiB,OAAO;GACrC,iBAAiB,UAAU,KAAA;EAC7B;EACA,IAAI,CAAC,WAAW,SAAS;EACzB,IAAI,CAAC,yBAAyB,WAAW,YAAY,QAAQ,SAAS,GACpE;EACF,MAAM,IAAI,IAAI,SAAe,YAAY;GACvC,kBAAkB,QAAQ,KAAK,OAAO;EACxC,CAAC;EACD,IAAI,CAAC,yBAAyB,SAC5B,eAAe;EAEjB,OAAO;CACT,GAAG,CAAC,cAAc,CAAC;CAEnB,MAAM,iBAAiB,kBAAkB;EACvC,IAAI,WAAW,WAAW,iBAAiB,YAAY,KAAA,GAAW;GAChE,aAAa,iBAAiB,OAAO;GACrC,iBAAiB,UAAU,KAAA;GAC3B,eAAe;EACjB;CACF,GAAG,CAAC,cAAc,CAAC;CAEnB,MAAM,cAAc,aACjB,IAAY,YAAwC;EACnD,UAAU,SAAS;GACjB,MAAM,WAAW,KAAK,YAAY;GAClC,IAAI,CAAC,UAAU,OAAO;GACtB,OAAO;IACL,GAAG;IACH,aAAa;KACX,GAAG,KAAK;MACP,KAAK;MAAE,GAAG;MAAU,OAAO,QAAQ,SAAS,KAAK;KAAE;IACtD;GACF;EACF,CAAC;EACD,IAAI,SAAS,QAAQ,YAAY,KAAK,oBAAoB,EAAE;CAC9D,GACA,CAAC,mBAAmB,CACtB;CAEA,MAAM,iBAAiB,aAAa,IAAY,aAAsB;EACpE,UAAU,SAAS;GACjB,MAAM,WAAW,KAAK,YAAY;GAClC,IAAI,CAAC,UAAU,OAAO;GACtB,OAAO;IACL,GAAG;IACH,aAAa;KACX,GAAG,KAAK;MACP,KAAK;MAAE,GAAG;MAAU;KAAS;IAChC;GACF;EACF,CAAC;CACH,GAAG,CAAC,CAAC;CAEL,MAAM,WAAW,eACR;EACL,uBAAuB;GACrB,MAAM,OAAO,SAAS,QAAQ;GAC9B,OACE,8BACE,MACA,sBAAsB,SACtB,WACF,KAAK,CAAC;EAEV;EACA,YAAY,aAAyB;GACnC,eAAe,QAAQ,IAAI,QAAQ;GACnC,aAAa;IACX,eAAe,QAAQ,OAAO,QAAQ;GACxC;EACF;CACF,IACA,CAAC,WAAW,CACd;CAEA,gBAAgB;EACd,KAAK,MAAM,MAAM,eAAe,SAAS,GAAG;CAC9C,GAAG,CAAC,KAAK,CAAC;CAEV,gBAAgB;EACd,OAAO,UAAU,QAAS,aAAa,EAAE,SAAS,QAAQ;CAC5D,GAAG,CAAC,WAAW,QAAQ,CAAC;CAqDxB,OAAO;EACL,gBAAgB;EAChB,UArDe,aACd,QAAkC;GACjC,IAAI;IACF,MAAM,aAAa,aAAa,IAAI,WAAW;IAC/C,sBAAsB,QAAQ,IAC5B,IAAI,IACJ,oBAAoB,UAAU,CAChC;GACF,SAAS,GAAG;IACV,QAAQ,KACN,wDAAwD,IAAI,KAAK,8CACjE,CACF;GACF;GAEA,MAAM,WAAW,iBAAiB,QAAQ,IAAI,IAAI,EAAE;GACpD,iBAAiB,QAAQ,OAAO,IAAI,EAAE;GAEtC,UAAU,UAAU;IAClB,GAAG;IACH,aAAa;KACX,GAAG,KAAK;MACP,IAAI,KAAK;MACR,IAAI,IAAI;MACR,MAAM,IAAI;MACV,aAAa,IAAI;MACjB,aAAa,IAAI;MACjB,OACE,KAAK,YAAY,IAAI,KAAK,SAAS,YAAY,IAAI;MACrD,UAAU,IAAI;KAChB;IACF;GACF,EAAE;GAEF,aAAa;IACX,eAAe;IACf,UAAU,SAAS;KACjB,MAAM,WAAW,KAAK,YAAY,IAAI;KACtC,IAAI,UACF,iBAAiB,QAAQ,IAAI,IAAI,IAAI,SAAS,KAAK;KAErD,sBAAsB,QAAQ,OAAO,IAAI,EAAE;KAC3C,MAAM,GAAG,IAAI,KAAK,GAAG,GAAG,SAAS,KAAK;KACtC,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,oBAAoB,KAAK;KAClD,OAAO;MAAE,GAAG;MAAM,aAAa;MAAM,aAAa;KAAgB;IACpE,CAAC;GACH;EACF,GACA,CAAC,cAAc,CAKR;EACP,UAAU;EACV,aAAa;EACb;EACA;EACA;EACA;CACF;AACF,CAAC;AAED,sBAAsB,gBAAgB,QAAQ,WAAW;CACvD,IAAI,CAAC,OAAO,gBAAgB,OAAO,aAAa,WAAW,MACzD,OAAO,eAAe,aAAa;AAEvC,CAAC"}
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":";;;;;;;AAmCA;;;;;;;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
2
  import { isStandaloneToolDisplay, makeToolCallTextComponent } 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";
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,7 +42,7 @@ 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
48
  for (const [toolName, tool] of Object.entries(toolkit)) {
@@ -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 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(\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 const toolRender = \"render\" in tool ? tool.render : undefined;\n const toolRenderText =\n \"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);\n\nattachTransformScopes(Tools, (scopes, parent) => {\n if (!scopes.modelContext && parent.modelContext.source === null) {\n scopes.modelContext = ModelContext();\n }\n});\n"],"mappings":";;;;;;;;;;;;;AAmCA,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,GAAG;GACtD,MAAM,aAAa,YAAY,OAAO,KAAK,SAAS,KAAA;GACpD,MAAM,iBACJ,gBAAgB,OAAO,KAAK,aAAa,KAAA;GAC3C,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,EAAE,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,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";
@@ -24,8 +25,9 @@ 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
27
  import { stubTool } from "./model-context/stub-tool.js";
28
+ import { externalTool } from "./model-context/external-tool.js";
27
29
  import { useAuiToolOverrides } from "./model-context/useAuiToolOverrides.js";
28
- import { hitl, hitlTool } from "./model-context/hitl.js";
30
+ import { hitl, hitlTool, humanTool } from "./model-context/human-tool.js";
29
31
  import { ProviderToolConfig, providerTool } from "./model-context/provider-tool.js";
30
32
  import { McpToolkitDefinition, defineMcpToolkit } from "./model-context/define-mcp-toolkit.js";
31
33
  import { AssistantInteractableProps, useAssistantInteractable } from "./model-context/useAssistantInteractable.js";
@@ -46,7 +48,7 @@ import { ReadonlyThreadProvider } from "./providers/ReadonlyThreadProvider.js";
46
48
  import { RuntimeAdapterProvider, RuntimeAdapters, useRuntimeAdapters } from "./runtimes/RuntimeAdapterProvider.js";
47
49
  import { useExternalStoreRuntime } from "./runtimes/useExternalStoreRuntime.js";
48
50
  import { useExternalStoreSharedOptions } from "./runtimes/useExternalStoreSharedOptions.js";
49
- import { convertExternalMessages, useExternalMessageConverter } from "./runtimes/external-message-converter.js";
51
+ import { JoinStrategy, convertExternalMessages, useExternalMessageConverter } from "./runtimes/external-message-converter.js";
50
52
  import { createMessageConverter } from "./runtimes/createMessageConverter.js";
51
53
  import { RemoteThreadListHookInstanceManager } from "./runtimes/RemoteThreadListHookInstanceManager.js";
52
54
  import { RemoteThreadListThreadListRuntimeCore } from "./runtimes/RemoteThreadListThreadListRuntimeCore.js";
@@ -54,7 +56,6 @@ import { useRemoteThreadListRuntime } from "./runtimes/useRemoteThreadListRuntim
54
56
  import { useCloudThreadListAdapter } from "./runtimes/cloud/useCloudThreadListAdapter.js";
55
57
  import { useAssistantCloudThreadHistoryAdapter } from "./runtimes/cloud/AssistantCloudThreadHistoryAdapter.js";
56
58
  import { CloudFileAttachmentAdapter } from "./runtimes/cloud/CloudFileAttachmentAdapter.js";
57
- import { PartState } from "../store/scopes/part.js";
58
59
  import { ThreadPrimitiveMessageByIndex, ThreadPrimitiveMessages, ThreadPrimitiveMessagesImpl } from "./primitives/thread/ThreadMessages.js";
59
60
  import { EnrichedPartState, MessagePartComponent, MessagePrimitivePartByIndex, MessagePrimitiveParts, defaultComponents } from "./primitives/message/MessageParts.js";
60
61
  import { GroupByContext, groupPartByType } from "./utils/groupParts.js";
@@ -101,4 +102,4 @@ import { useEditComposerCancel } from "./primitive-hooks/useEditComposerCancel.j
101
102
  import { useEditComposerSend } from "./primitive-hooks/useEditComposerSend.js";
102
103
  import { useMessageError } from "./primitive-hooks/useMessageError.js";
103
104
  import { LocalRuntimeOptions, splitLocalRuntimeOptions, useLocalRuntime } from "./runtimes/useLocalRuntime.js";
104
- 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, 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, getMessageQuote, getRenderComponent, groupPartByType, hitl, hitlTool, 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 };
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 };
@@ -14,8 +14,9 @@ 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
16
  import { stubTool } from "./model-context/stub-tool.js";
17
+ import { externalTool } from "./model-context/external-tool.js";
17
18
  import { useAuiToolOverrides } from "./model-context/useAuiToolOverrides.js";
18
- import { hitl, hitlTool } from "./model-context/hitl.js";
19
+ import { hitl, hitlTool, humanTool } from "./model-context/human-tool.js";
19
20
  import { providerTool } from "./model-context/provider-tool.js";
20
21
  import { defineMcpToolkit } from "./model-context/define-mcp-toolkit.js";
21
22
  import { useAssistantInteractable } from "./model-context/useAssistantInteractable.js";
@@ -92,4 +93,4 @@ import { useEditComposerCancel } from "./primitive-hooks/useEditComposerCancel.j
92
93
  import { useEditComposerSend } from "./primitive-hooks/useEditComposerSend.js";
93
94
  import { useMessageError } from "./primitive-hooks/useMessageError.js";
94
95
  import { splitLocalRuntimeOptions, useLocalRuntime } from "./runtimes/useLocalRuntime.js";
95
- 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, getMessageQuote, getRenderComponent, groupPartByType, hitl, hitlTool, 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 };
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 };
@@ -1 +1 @@
1
- {"version":3,"file":"define-mcp-toolkit.js","names":[],"sources":["../../../src/react/model-context/define-mcp-toolkit.ts"],"sourcesContent":["import type { McpServerConfig } from \"assistant-stream\";\nimport type { Toolkit } from \"./toolbox\";\n\nexport type McpToolkitDefinition = Record<string, McpServerConfig>;\n\n/**\n * Defines MCP server tools as a spreadable toolkit fragment.\n */\nexport function defineMcpToolkit(definition: McpToolkitDefinition): Toolkit {\n return Object.fromEntries(\n Object.entries(definition).map(([name, server]) => [\n name,\n { type: \"mcp\", server },\n ]),\n ) as Toolkit;\n}\n"],"mappings":";;;;AAQA,SAAgB,iBAAiB,YAA2C;CAC1E,OAAO,OAAO,YACZ,OAAO,QAAQ,UAAU,EAAE,KAAK,CAAC,MAAM,YAAY,CACjD,MACA;EAAE,MAAM;EAAO;CAAO,CACxB,CAAC,CACH;AACF"}
1
+ {"version":3,"file":"define-mcp-toolkit.js","names":[],"sources":["../../../src/react/model-context/define-mcp-toolkit.ts"],"sourcesContent":["import type { McpServerConfig } from \"assistant-stream\";\nimport type { Toolkit } from \"./toolbox\";\n\nexport type McpToolkitDefinition = Record<string, McpServerConfig>;\n\n/**\n * Defines MCP server tools as a spreadable toolkit fragment.\n */\nexport function defineMcpToolkit(definition: McpToolkitDefinition): Toolkit {\n return Object.fromEntries(\n Object.entries(definition).map(([name, server]) => [\n name,\n { type: \"mcp\", server },\n ]),\n ) as Toolkit;\n}\n"],"mappings":";;;;AAQA,SAAgB,iBAAiB,YAA2C;CAC1E,OAAO,OAAO,YACZ,OAAO,QAAQ,UAAU,CAAC,CAAC,KAAK,CAAC,MAAM,YAAY,CACjD,MACA;EAAE,MAAM;EAAO;CAAO,CACxB,CAAC,CACH;AACF"}
@@ -2,20 +2,17 @@ import { Toolkit, ToolkitDefinition, ToolkitDefinitionEntryWithParameters } from
2
2
 
3
3
  //#region src/react/model-context/define-toolkit.d.ts
4
4
  /**
5
- * Authoring helper for a `"use generative"` toolkit. Accepts the permissive
6
- * {@link ToolkitDefinition} (a `backend` tool may carry its server `execute`)
7
- * and types the result as the canonical {@link Toolkit}.
5
+ * Toolkit authoring helper. Accepts the permissive {@link ToolkitDefinition}
6
+ * (a generative `backend` tool may carry its server `execute`) and types the
7
+ * result as the canonical {@link Toolkit}.
8
8
  *
9
- * It has **no runtime implementation**. A `"use generative"` compiler (e.g.
10
- * `@assistant-ui/next` or `@assistant-ui/vite`) strips the `defineToolkit(...)`
11
- * wrapper (and its import) per build, so a correctly compiled
12
- * `export default defineToolkit({...})` never calls this. If it *does* run, the
13
- * module was not compiled by a use-generative loader — e.g. `defineToolkit` used
14
- * outside a `"use generative"` file — which would ship a backend `execute` to the
15
- * client. So it throws instead of silently leaking.
9
+ * In a `"use generative"` file, the compiler strips the wrapper per build so it
10
+ * can split schemas, renderers, and executors across the client/server boundary.
11
+ * Outside generative compilation, it returns the toolkit unchanged and can be
12
+ * used for plain frontend/backend/human toolkit objects.
16
13
  */
17
- declare function defineToolkit<TArgsByName extends { [K in keyof TArgsByName]: Record<string, unknown> }, TResultByName extends { [K in keyof TArgsByName]: unknown } = { [K in keyof TArgsByName]: unknown }>(_definition: { [K in keyof TArgsByName]: ToolkitDefinitionEntryWithParameters<TArgsByName[K], TResultByName[K]> }): Toolkit;
18
- declare function defineToolkit(_definition: ToolkitDefinition): Toolkit;
14
+ declare function defineToolkit<TArgsByName extends { [K in keyof TArgsByName]: Record<string, unknown> }, TResultByName extends { [K in keyof TArgsByName]: unknown } = { [K in keyof TArgsByName]: any }>(_definition: { [K in keyof TArgsByName]: ToolkitDefinitionEntryWithParameters<TArgsByName[K], TResultByName[K]> }): Toolkit & { [K in keyof TArgsByName]: ToolkitDefinitionEntryWithParameters<TArgsByName[K], TResultByName[K]> };
15
+ declare function defineToolkit<const TDefinition extends ToolkitDefinition>(_definition: TDefinition): Toolkit & TDefinition;
19
16
  //#endregion
20
17
  export { defineToolkit };
21
18
  //# sourceMappingURL=define-toolkit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"define-toolkit.d.ts","names":[],"sources":["../../../src/react/model-context/define-toolkit.ts"],"mappings":";;;;;AAmBA;;;;;;;;;;;iBAAgB,aAAA,mCAEA,WAAA,GAAc,MAAA,yDAEQ,WAAA,6BACtB,WAAA,cAEd,WAAA,gBACY,WAAA,GAAc,oCAAA,CACxB,WAAA,CAAY,CAAA,GACZ,aAAA,CAAc,CAAA,OAEd,OAAA;AAAA,iBACY,aAAA,CAAc,WAAA,EAAa,iBAAA,GAAoB,OAAO"}
1
+ {"version":3,"file":"define-toolkit.d.ts","names":[],"sources":["../../../src/react/model-context/define-toolkit.ts"],"mappings":";;;;;AAgBA;;;;;;;;iBAAgB,aAAA,mCAEA,WAAA,GAAc,MAAA,yDAEQ,WAAA,6BACtB,WAAA,UAEd,WAAA,gBACY,WAAA,GAAc,oCAAA,CACxB,WAAA,CAAY,CAAA,GACZ,aAAA,CAAc,CAAA,OAEd,OAAA,iBACU,WAAA,GAAc,oCAAA,CACxB,WAAA,CAAY,CAAA,GACZ,aAAA,CAAc,CAAA;AAAA,iBAGF,aAAA,2BAAwC,iBAAA,EACtD,WAAA,EAAa,WAAA,GACZ,OAAA,GAAU,WAAA"}
@@ -1,6 +1,6 @@
1
1
  //#region src/react/model-context/define-toolkit.ts
2
2
  function defineToolkit(_definition) {
3
- throw new Error("[assistant-ui] defineToolkit() has no runtime implementation — it is stripped at build time by the use-generative compiler. Reaching it means this module was not compiled (e.g. defineToolkit used outside a \"use generative\" file). Add the directive, or do not use defineToolkit here.");
3
+ return _definition;
4
4
  }
5
5
  //#endregion
6
6
  export { defineToolkit };
@@ -1 +1 @@
1
- {"version":3,"file":"define-toolkit.js","names":[],"sources":["../../../src/react/model-context/define-toolkit.ts"],"sourcesContent":["import type {\n Toolkit,\n ToolkitDefinition,\n ToolkitDefinitionEntryWithParameters,\n} from \"./toolbox\";\n\n/**\n * Authoring helper for a `\"use generative\"` toolkit. Accepts the permissive\n * {@link ToolkitDefinition} (a `backend` tool may carry its server `execute`)\n * and types the result as the canonical {@link Toolkit}.\n *\n * It has **no runtime implementation**. A `\"use generative\"` compiler (e.g.\n * `@assistant-ui/next` or `@assistant-ui/vite`) strips the `defineToolkit(...)`\n * wrapper (and its import) per build, so a correctly compiled\n * `export default defineToolkit({...})` never calls this. If it *does* run, the\n * module was not compiled by a use-generative loader — e.g. `defineToolkit` used\n * outside a `\"use generative\"` file which would ship a backend `execute` to the\n * client. So it throws instead of silently leaking.\n */\nexport function defineToolkit<\n TArgsByName extends {\n [K in keyof TArgsByName]: Record<string, unknown>;\n },\n TResultByName extends { [K in keyof TArgsByName]: unknown } = {\n [K in keyof TArgsByName]: unknown;\n },\n>(_definition: {\n [K in keyof TArgsByName]: ToolkitDefinitionEntryWithParameters<\n TArgsByName[K],\n TResultByName[K]\n >;\n}): Toolkit;\nexport function defineToolkit(_definition: ToolkitDefinition): Toolkit;\nexport function defineToolkit(_definition: ToolkitDefinition): Toolkit {\n throw new Error(\n \"[assistant-ui] defineToolkit() has no runtime implementation — it is \" +\n \"stripped at build time by the use-generative compiler. Reaching it means \" +\n 'this module was not compiled (e.g. defineToolkit used outside a \"use ' +\n 'generative\" file). Add the directive, or do not use defineToolkit here.',\n );\n}\n"],"mappings":";AAiCA,SAAgB,cAAc,aAAyC;CACrE,MAAM,IAAI,MACR,8RAIF;AACF"}
1
+ {"version":3,"file":"define-toolkit.js","names":[],"sources":["../../../src/react/model-context/define-toolkit.ts"],"sourcesContent":["import type {\n Toolkit,\n ToolkitDefinition,\n ToolkitDefinitionEntryWithParameters,\n} from \"./toolbox\";\n\n/**\n * Toolkit authoring helper. Accepts the permissive {@link ToolkitDefinition}\n * (a generative `backend` tool may carry its server `execute`) and types the\n * result as the canonical {@link Toolkit}.\n *\n * In a `\"use generative\"` file, the compiler strips the wrapper per build so it\n * can split schemas, renderers, and executors across the client/server boundary.\n * Outside generative compilation, it returns the toolkit unchanged and can be\n * used for plain frontend/backend/human toolkit objects.\n */\nexport function defineToolkit<\n TArgsByName extends {\n [K in keyof TArgsByName]: Record<string, unknown>;\n },\n TResultByName extends { [K in keyof TArgsByName]: unknown } = {\n [K in keyof TArgsByName]: any;\n },\n>(_definition: {\n [K in keyof TArgsByName]: ToolkitDefinitionEntryWithParameters<\n TArgsByName[K],\n TResultByName[K]\n >;\n}): Toolkit & {\n [K in keyof TArgsByName]: ToolkitDefinitionEntryWithParameters<\n TArgsByName[K],\n TResultByName[K]\n >;\n};\nexport function defineToolkit<const TDefinition extends ToolkitDefinition>(\n _definition: TDefinition,\n): Toolkit & TDefinition;\nexport function defineToolkit(_definition: ToolkitDefinition): Toolkit {\n return _definition as Toolkit;\n}\n"],"mappings":";AAqCA,SAAgB,cAAc,aAAyC;CACrE,OAAO;AACT"}
@@ -0,0 +1,14 @@
1
+ //#region src/react/model-context/external-tool.d.ts
2
+ /**
3
+ * Marks a generative toolkit entry as an externally executed backend tool.
4
+ *
5
+ * Use this when another system (for example a backend route or LangGraph node)
6
+ * already defines and executes the tool, but assistant-ui should render its
7
+ * tool calls. The use-generative compiler omits `execute: externalTool()`
8
+ * entries from the server build and keeps a `type: "backend"` renderer on the
9
+ * client build.
10
+ */
11
+ declare function externalTool(): never;
12
+ //#endregion
13
+ export { externalTool };
14
+ //# sourceMappingURL=external-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-tool.d.ts","names":[],"sources":["../../../src/react/model-context/external-tool.ts"],"mappings":";;AASA;;;;AAA4B;;;;iBAAZ,YAAA"}
@@ -0,0 +1,17 @@
1
+ //#region src/react/model-context/external-tool.ts
2
+ /**
3
+ * Marks a generative toolkit entry as an externally executed backend tool.
4
+ *
5
+ * Use this when another system (for example a backend route or LangGraph node)
6
+ * already defines and executes the tool, but assistant-ui should render its
7
+ * tool calls. The use-generative compiler omits `execute: externalTool()`
8
+ * entries from the server build and keeps a `type: "backend"` renderer on the
9
+ * client build.
10
+ */
11
+ function externalTool() {
12
+ throw new Error("[assistant-ui] externalTool() has no runtime implementation - it marks a tool that executes outside assistant-ui and is stripped at build time by the use-generative compiler. Make sure this module is compiled as \"use generative\".");
13
+ }
14
+ //#endregion
15
+ export { externalTool };
16
+
17
+ //# sourceMappingURL=external-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-tool.js","names":[],"sources":["../../../src/react/model-context/external-tool.ts"],"sourcesContent":["/**\n * Marks a generative toolkit entry as an externally executed backend tool.\n *\n * Use this when another system (for example a backend route or LangGraph node)\n * already defines and executes the tool, but assistant-ui should render its\n * tool calls. The use-generative compiler omits `execute: externalTool()`\n * entries from the server build and keeps a `type: \"backend\"` renderer on the\n * client build.\n */\nexport function externalTool(): never {\n throw new Error(\n \"[assistant-ui] externalTool() has no runtime implementation - it marks a \" +\n \"tool that executes outside assistant-ui and is stripped at build time \" +\n 'by the use-generative compiler. Make sure this module is compiled as \"use generative\".',\n );\n}\n"],"mappings":";;;;;;;;;;AASA,SAAgB,eAAsB;CACpC,MAAM,IAAI,MACR,yOAGF;AACF"}
@@ -0,0 +1,27 @@
1
+ //#region src/react/model-context/human-tool.d.ts
2
+ /**
3
+ * Marks a tool as **human-in-the-loop**: the agent pauses and the UI (`render`)
4
+ * supplies the result instead of code. Use it as the tool's `execute`:
5
+ *
6
+ * ```tsx
7
+ * confirm: { execute: humanTool(), render: (props) => <Confirm {...props} /> }
8
+ * ```
9
+ *
10
+ * Unlike {@link defineToolkit}, it has **no runtime implementation**: a
11
+ * `"use generative"` compiler (e.g. `@assistant-ui/next` or `@assistant-ui/vite`)
12
+ * detects `execute: humanTool()`, drops it, and stamps the tool `type: "human"`.
13
+ * Reaching it at runtime means the module wasn't compiled (used outside a
14
+ * `"use generative"` file), so it throws.
15
+ */
16
+ declare function humanTool(): never;
17
+ /**
18
+ * @deprecated Use {@link humanTool}.
19
+ */
20
+ declare const hitlTool: typeof humanTool;
21
+ /**
22
+ * @deprecated Use {@link humanTool}.
23
+ */
24
+ declare const hitl: typeof humanTool;
25
+ //#endregion
26
+ export { hitl, hitlTool, humanTool };
27
+ //# sourceMappingURL=human-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"human-tool.d.ts","names":[],"sources":["../../../src/react/model-context/human-tool.ts"],"mappings":";;AAcA;;;;AAAyB;AAYzB;;;;AAAiC;AAKjC;;;iBAjBgB,SAAA;AAiBa;;;AAAA,cALhB,QAAA,SAAQ,SAAY;;;;cAKpB,IAAA,SAAI,SAAY"}