@assistant-ui/core 0.2.14 → 0.2.15

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 (319) hide show
  1. package/dist/adapters/attachment.js.map +1 -1
  2. package/dist/adapters/directive-formatter.js.map +1 -1
  3. package/dist/adapters/speech.js.map +1 -1
  4. package/dist/adapters/voice.js.map +1 -1
  5. package/dist/index.d.ts +2 -2
  6. package/dist/index.js.map +1 -1
  7. package/dist/internal/duplicate-detection.js.map +1 -1
  8. package/dist/internal.d.ts +2 -1
  9. package/dist/internal.js +2 -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/frame/types.js.map +1 -1
  13. package/dist/model-context/registry.js.map +1 -1
  14. package/dist/model-context/tool.js.map +1 -1
  15. package/dist/model-context/types.d.ts +1 -0
  16. package/dist/model-context/types.d.ts.map +1 -1
  17. package/dist/model-context/types.js.map +1 -1
  18. package/dist/react/AssistantProvider.js +1 -0
  19. package/dist/react/AssistantProvider.js.map +1 -1
  20. package/dist/react/AssistantRuntimeProvider.js +18 -6
  21. package/dist/react/AssistantRuntimeProvider.js.map +1 -1
  22. package/dist/react/RuntimeAdapter.js +26 -7
  23. package/dist/react/RuntimeAdapter.js.map +1 -1
  24. package/dist/react/adapters/LocalStorageThreadListAdapter.js +29 -7
  25. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  26. package/dist/react/adapters/TitleGenerationAdapter.js.map +1 -1
  27. package/dist/react/client/DataRenderers.js +54 -35
  28. package/dist/react/client/DataRenderers.js.map +1 -1
  29. package/dist/react/client/Interactables.js +67 -67
  30. package/dist/react/client/Interactables.js.map +1 -1
  31. package/dist/react/client/Tools.d.ts.map +1 -1
  32. package/dist/react/client/Tools.js +118 -55
  33. package/dist/react/client/Tools.js.map +1 -1
  34. package/dist/react/client/interactable-model-context.js.map +1 -1
  35. package/dist/react/model-context/define-mcp-toolkit.js.map +1 -1
  36. package/dist/react/model-context/define-toolkit.js.map +1 -1
  37. package/dist/react/model-context/external-tool.js.map +1 -1
  38. package/dist/react/model-context/human-tool.js.map +1 -1
  39. package/dist/react/model-context/makeAssistantDataUI.js.map +1 -1
  40. package/dist/react/model-context/makeAssistantTool.js.map +1 -1
  41. package/dist/react/model-context/makeAssistantToolUI.js.map +1 -1
  42. package/dist/react/model-context/provider-tool.js.map +1 -1
  43. package/dist/react/model-context/stub-tool.js.map +1 -1
  44. package/dist/react/model-context/toolbox.js.map +1 -1
  45. package/dist/react/model-context/useAssistantContext.js.map +1 -1
  46. package/dist/react/model-context/useAssistantDataUI.js +27 -8
  47. package/dist/react/model-context/useAssistantDataUI.js.map +1 -1
  48. package/dist/react/model-context/useAssistantInstructions.js +33 -10
  49. package/dist/react/model-context/useAssistantInstructions.js.map +1 -1
  50. package/dist/react/model-context/useAssistantInteractable.js.map +1 -1
  51. package/dist/react/model-context/useAssistantTool.js +59 -17
  52. package/dist/react/model-context/useAssistantTool.js.map +1 -1
  53. package/dist/react/model-context/useAssistantToolUI.js +30 -9
  54. package/dist/react/model-context/useAssistantToolUI.js.map +1 -1
  55. package/dist/react/model-context/useAuiToolOverrides.js.map +1 -1
  56. package/dist/react/model-context/useInlineRender.js +35 -8
  57. package/dist/react/model-context/useInlineRender.js.map +1 -1
  58. package/dist/react/model-context/useInteractableState.js +65 -19
  59. package/dist/react/model-context/useInteractableState.js.map +1 -1
  60. package/dist/react/model-context/useToolArgsStatus.js +42 -14
  61. package/dist/react/model-context/useToolArgsStatus.js.map +1 -1
  62. package/dist/react/primitive-hooks/useActionBarCopy.js +59 -22
  63. package/dist/react/primitive-hooks/useActionBarCopy.js.map +1 -1
  64. package/dist/react/primitive-hooks/useActionBarEdit.js +25 -7
  65. package/dist/react/primitive-hooks/useActionBarEdit.js.map +1 -1
  66. package/dist/react/primitive-hooks/useActionBarFeedback.js +49 -13
  67. package/dist/react/primitive-hooks/useActionBarFeedback.js.map +1 -1
  68. package/dist/react/primitive-hooks/useActionBarReload.js +25 -7
  69. package/dist/react/primitive-hooks/useActionBarReload.js.map +1 -1
  70. package/dist/react/primitive-hooks/useActionBarSpeak.js +28 -9
  71. package/dist/react/primitive-hooks/useActionBarSpeak.js.map +1 -1
  72. package/dist/react/primitive-hooks/useActionBarStopSpeaking.js +25 -7
  73. package/dist/react/primitive-hooks/useActionBarStopSpeaking.js.map +1 -1
  74. package/dist/react/primitive-hooks/useBranchPickerNext.js +27 -11
  75. package/dist/react/primitive-hooks/useBranchPickerNext.js.map +1 -1
  76. package/dist/react/primitive-hooks/useBranchPickerPrevious.js +27 -11
  77. package/dist/react/primitive-hooks/useBranchPickerPrevious.js.map +1 -1
  78. package/dist/react/primitive-hooks/useComposerAddAttachment.js +24 -8
  79. package/dist/react/primitive-hooks/useComposerAddAttachment.js.map +1 -1
  80. package/dist/react/primitive-hooks/useComposerCancel.js +25 -7
  81. package/dist/react/primitive-hooks/useComposerCancel.js.map +1 -1
  82. package/dist/react/primitive-hooks/useComposerDictate.js +25 -7
  83. package/dist/react/primitive-hooks/useComposerDictate.js.map +1 -1
  84. package/dist/react/primitive-hooks/useComposerSend.js +25 -7
  85. package/dist/react/primitive-hooks/useComposerSend.js.map +1 -1
  86. package/dist/react/primitive-hooks/useEditComposerCancel.js +18 -4
  87. package/dist/react/primitive-hooks/useEditComposerCancel.js.map +1 -1
  88. package/dist/react/primitive-hooks/useEditComposerSend.js +25 -7
  89. package/dist/react/primitive-hooks/useEditComposerSend.js.map +1 -1
  90. package/dist/react/primitive-hooks/useMessageBranching.js +41 -9
  91. package/dist/react/primitive-hooks/useMessageBranching.js.map +1 -1
  92. package/dist/react/primitive-hooks/useMessageError.js +4 -1
  93. package/dist/react/primitive-hooks/useMessageError.js.map +1 -1
  94. package/dist/react/primitive-hooks/useMessageReload.js +25 -7
  95. package/dist/react/primitive-hooks/useMessageReload.js.map +1 -1
  96. package/dist/react/primitive-hooks/useSuggestionTrigger.js +31 -13
  97. package/dist/react/primitive-hooks/useSuggestionTrigger.js.map +1 -1
  98. package/dist/react/primitive-hooks/useThreadIsEmpty.js +4 -1
  99. package/dist/react/primitive-hooks/useThreadIsEmpty.js.map +1 -1
  100. package/dist/react/primitive-hooks/useThreadIsRunning.js +4 -1
  101. package/dist/react/primitive-hooks/useThreadIsRunning.js.map +1 -1
  102. package/dist/react/primitive-hooks/useThreadListItemArchive.js +18 -4
  103. package/dist/react/primitive-hooks/useThreadListItemArchive.js.map +1 -1
  104. package/dist/react/primitive-hooks/useThreadListItemDelete.js +18 -4
  105. package/dist/react/primitive-hooks/useThreadListItemDelete.js.map +1 -1
  106. package/dist/react/primitive-hooks/useThreadListItemTrigger.js +18 -4
  107. package/dist/react/primitive-hooks/useThreadListItemTrigger.js.map +1 -1
  108. package/dist/react/primitive-hooks/useThreadListItemUnarchive.js +18 -4
  109. package/dist/react/primitive-hooks/useThreadListItemUnarchive.js.map +1 -1
  110. package/dist/react/primitive-hooks/useThreadListLoadMore.js +25 -7
  111. package/dist/react/primitive-hooks/useThreadListLoadMore.js.map +1 -1
  112. package/dist/react/primitive-hooks/useThreadListNew.js +18 -4
  113. package/dist/react/primitive-hooks/useThreadListNew.js.map +1 -1
  114. package/dist/react/primitive-hooks/useThreadMessages.js +4 -1
  115. package/dist/react/primitive-hooks/useThreadMessages.js.map +1 -1
  116. package/dist/react/primitive-hooks/useVoice.js +63 -13
  117. package/dist/react/primitive-hooks/useVoice.js.map +1 -1
  118. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js +42 -7
  119. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js.map +1 -1
  120. package/dist/react/primitives/composer/ComposerAttachments.js +67 -16
  121. package/dist/react/primitives/composer/ComposerAttachments.js.map +1 -1
  122. package/dist/react/primitives/composer/ComposerIf.js +30 -9
  123. package/dist/react/primitives/composer/ComposerIf.js.map +1 -1
  124. package/dist/react/primitives/composer/ComposerQueue.js.map +1 -1
  125. package/dist/react/primitives/generativeUI/GenerativeUI.js +55 -13
  126. package/dist/react/primitives/generativeUI/GenerativeUI.js.map +1 -1
  127. package/dist/react/primitives/message/MessageAttachments.js +68 -16
  128. package/dist/react/primitives/message/MessageAttachments.js.map +1 -1
  129. package/dist/react/primitives/message/MessageGroupedParts.js +3 -3
  130. package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
  131. package/dist/react/primitives/message/MessageParts.js +649 -181
  132. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  133. package/dist/react/primitives/message/MessageQuote.js +18 -2
  134. package/dist/react/primitives/message/MessageQuote.js.map +1 -1
  135. package/dist/react/primitives/messagePart/MessagePartInProgress.js +6 -2
  136. package/dist/react/primitives/messagePart/MessagePartInProgress.js.map +1 -1
  137. package/dist/react/primitives/part/PartMessages.js +46 -14
  138. package/dist/react/primitives/part/PartMessages.js.map +1 -1
  139. package/dist/react/primitives/thread/ThreadMessages.js +67 -10
  140. package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
  141. package/dist/react/primitives/thread/ThreadSuggestions.js +50 -10
  142. package/dist/react/primitives/thread/ThreadSuggestions.js.map +1 -1
  143. package/dist/react/primitives/threadList/ThreadListItems.js +55 -14
  144. package/dist/react/primitives/threadList/ThreadListItems.js.map +1 -1
  145. package/dist/react/primitives/threadListItem/ThreadListItemTitle.js +15 -2
  146. package/dist/react/primitives/threadListItem/ThreadListItemTitle.js.map +1 -1
  147. package/dist/react/providers/AttachmentByIndexProvider.js +57 -12
  148. package/dist/react/providers/AttachmentByIndexProvider.js.map +1 -1
  149. package/dist/react/providers/ChainOfThoughtByIndicesProvider.js +33 -11
  150. package/dist/react/providers/ChainOfThoughtByIndicesProvider.js.map +1 -1
  151. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.js +29 -6
  152. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.js.map +1 -1
  153. package/dist/react/providers/MessageByIndexProvider.js +49 -19
  154. package/dist/react/providers/MessageByIndexProvider.js.map +1 -1
  155. package/dist/react/providers/PartByIndexProvider.js +29 -6
  156. package/dist/react/providers/PartByIndexProvider.js.map +1 -1
  157. package/dist/react/providers/QueueItemByIndexProvider.js +29 -6
  158. package/dist/react/providers/QueueItemByIndexProvider.js.map +1 -1
  159. package/dist/react/providers/ReadonlyThreadProvider.js +83 -28
  160. package/dist/react/providers/ReadonlyThreadProvider.js.map +1 -1
  161. package/dist/react/providers/SuggestionByIndexProvider.js +29 -6
  162. package/dist/react/providers/SuggestionByIndexProvider.js.map +1 -1
  163. package/dist/react/providers/TextMessagePartProvider.js +73 -25
  164. package/dist/react/providers/TextMessagePartProvider.js.map +1 -1
  165. package/dist/react/providers/ThreadListItemByIndexProvider.js +30 -6
  166. package/dist/react/providers/ThreadListItemByIndexProvider.js.map +1 -1
  167. package/dist/react/providers/ThreadListItemRuntimeProvider.js +28 -5
  168. package/dist/react/providers/ThreadListItemRuntimeProvider.js.map +1 -1
  169. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +19 -4
  170. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  171. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  172. package/dist/react/runtimes/RuntimeAdapterProvider.js +27 -10
  173. package/dist/react/runtimes/RuntimeAdapterProvider.js.map +1 -1
  174. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +10 -1
  175. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  176. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js.map +1 -1
  177. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  178. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +17 -17
  179. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  180. package/dist/react/runtimes/createMessageConverter.js.map +1 -1
  181. package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
  182. package/dist/react/runtimes/external-message-converter.js +67 -30
  183. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  184. package/dist/react/runtimes/useExternalStoreRuntime.js +44 -10
  185. package/dist/react/runtimes/useExternalStoreRuntime.js.map +1 -1
  186. package/dist/react/runtimes/useExternalStoreSharedOptions.js +17 -12
  187. package/dist/react/runtimes/useExternalStoreSharedOptions.js.map +1 -1
  188. package/dist/react/runtimes/useLocalRuntime.js.map +1 -1
  189. package/dist/react/runtimes/useRemoteThreadListRuntime.js +34 -6
  190. package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
  191. package/dist/react/types/MessagePartComponentTypes.d.ts +5 -6
  192. package/dist/react/types/MessagePartComponentTypes.d.ts.map +1 -1
  193. package/dist/react/utils/getMessageQuote.js.map +1 -1
  194. package/dist/react/utils/groupParts.js.map +1 -1
  195. package/dist/runtime/api/assistant-runtime.js.map +1 -1
  196. package/dist/runtime/api/attachment-runtime.js.map +1 -1
  197. package/dist/runtime/api/composer-runtime.js.map +1 -1
  198. package/dist/runtime/api/message-part-runtime.d.ts +3 -9
  199. package/dist/runtime/api/message-part-runtime.d.ts.map +1 -1
  200. package/dist/runtime/api/message-part-runtime.js +3 -6
  201. package/dist/runtime/api/message-part-runtime.js.map +1 -1
  202. package/dist/runtime/api/message-runtime.js.map +1 -1
  203. package/dist/runtime/api/thread-list-item-runtime.js.map +1 -1
  204. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  205. package/dist/runtime/api/thread-runtime.js.map +1 -1
  206. package/dist/runtime/base/base-assistant-runtime-core.js.map +1 -1
  207. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  208. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  209. package/dist/runtime/base/default-edit-composer-runtime-core.js.map +1 -1
  210. package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
  211. package/dist/runtime/interfaces/thread-runtime-core.d.ts +2 -1
  212. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  213. package/dist/runtime/queue/message-queue.js.map +1 -1
  214. package/dist/runtime/utils/auto-status.js.map +1 -1
  215. package/dist/runtime/utils/external-store-message.js.map +1 -1
  216. package/dist/runtime/utils/message-repository.js.map +1 -1
  217. package/dist/runtime/utils/resolveToolApprovalResponse.d.ts +15 -0
  218. package/dist/runtime/utils/resolveToolApprovalResponse.d.ts.map +1 -0
  219. package/dist/runtime/utils/resolveToolApprovalResponse.js +35 -0
  220. package/dist/runtime/utils/resolveToolApprovalResponse.js.map +1 -0
  221. package/dist/runtime/utils/thread-message-like.d.ts +5 -1
  222. package/dist/runtime/utils/thread-message-like.d.ts.map +1 -1
  223. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  224. package/dist/runtimes/assistant-transport/utils.js.map +1 -1
  225. package/dist/runtimes/external-store/external-store-runtime-core.js.map +1 -1
  226. package/dist/runtimes/external-store/external-store-shared-options.js.map +1 -1
  227. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  228. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  229. package/dist/runtimes/external-store/thread-message-converter.js.map +1 -1
  230. package/dist/runtimes/local/local-runtime-core.js.map +1 -1
  231. package/dist/runtimes/local/local-thread-list-runtime-core.js.map +1 -1
  232. package/dist/runtimes/local/local-thread-runtime-core.d.ts +1 -0
  233. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  234. package/dist/runtimes/local/local-thread-runtime-core.js +9 -7
  235. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  236. package/dist/runtimes/local/should-continue.js +1 -1
  237. package/dist/runtimes/local/should-continue.js.map +1 -1
  238. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js.map +1 -1
  239. package/dist/runtimes/remote-thread-list/adapter/in-memory.js.map +1 -1
  240. package/dist/runtimes/remote-thread-list/empty-thread-core.js.map +1 -1
  241. package/dist/runtimes/remote-thread-list/optimistic-state.js.map +1 -1
  242. package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
  243. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  244. package/dist/store/clients/chain-of-thought-client.js +37 -19
  245. package/dist/store/clients/chain-of-thought-client.js.map +1 -1
  246. package/dist/store/clients/model-context-client.js +64 -14
  247. package/dist/store/clients/model-context-client.js.map +1 -1
  248. package/dist/store/clients/no-op-composer-client.js +94 -53
  249. package/dist/store/clients/no-op-composer-client.js.map +1 -1
  250. package/dist/store/clients/runtime-adapter.js.map +1 -1
  251. package/dist/store/clients/suggestions.d.ts.map +1 -1
  252. package/dist/store/clients/suggestions.js +59 -21
  253. package/dist/store/clients/suggestions.js.map +1 -1
  254. package/dist/store/clients/thread-message-client.d.ts.map +1 -1
  255. package/dist/store/clients/thread-message-client.js +176 -69
  256. package/dist/store/clients/thread-message-client.js.map +1 -1
  257. package/dist/store/runtime-clients/attachment-runtime-client.js +29 -6
  258. package/dist/store/runtime-clients/attachment-runtime-client.js.map +1 -1
  259. package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
  260. package/dist/store/runtime-clients/composer-runtime-client.js +188 -68
  261. package/dist/store/runtime-clients/composer-runtime-client.js.map +1 -1
  262. package/dist/store/runtime-clients/liveRef.d.ts +7 -0
  263. package/dist/store/runtime-clients/liveRef.d.ts.map +1 -0
  264. package/dist/store/runtime-clients/liveRef.js +8 -0
  265. package/dist/store/runtime-clients/liveRef.js.map +1 -0
  266. package/dist/store/runtime-clients/message-part-runtime-client.js +47 -8
  267. package/dist/store/runtime-clients/message-part-runtime-client.js.map +1 -1
  268. package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
  269. package/dist/store/runtime-clients/message-runtime-client.js +214 -52
  270. package/dist/store/runtime-clients/message-runtime-client.js.map +1 -1
  271. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +69 -25
  272. package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
  273. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  274. package/dist/store/runtime-clients/thread-list-runtime-client.js +137 -34
  275. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  276. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  277. package/dist/store/runtime-clients/thread-runtime-client.js +192 -71
  278. package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
  279. package/dist/store/runtime-clients/useSubscribable.js +2 -9
  280. package/dist/store/runtime-clients/useSubscribable.js.map +1 -1
  281. package/dist/store/scopes/part.d.ts +5 -6
  282. package/dist/store/scopes/part.d.ts.map +1 -1
  283. package/dist/store/scopes/queue-item.js.map +1 -1
  284. package/dist/subscribable/subscribable.js.map +1 -1
  285. package/dist/tests/remote-thread-list-test-helpers.js.map +1 -1
  286. package/dist/types/message.d.ts +38 -5
  287. package/dist/types/message.d.ts.map +1 -1
  288. package/dist/types/message.js.map +1 -1
  289. package/dist/utils/composite-context-provider.js.map +1 -1
  290. package/dist/utils/id.js.map +1 -1
  291. package/dist/utils/json/is-json-equal.js.map +1 -1
  292. package/dist/utils/json/is-json.js.map +1 -1
  293. package/dist/utils/text.js.map +1 -1
  294. package/package.json +6 -6
  295. package/src/index.ts +4 -0
  296. package/src/internal.ts +1 -0
  297. package/src/model-context/types.ts +1 -0
  298. package/src/react/AssistantProvider.tsx +7 -0
  299. package/src/react/client/Tools.ts +3 -5
  300. package/src/react/runtimes/external-message-converter.ts +3 -1
  301. package/src/react/types/MessagePartComponentTypes.ts +5 -5
  302. package/src/runtime/api/message-part-runtime.ts +14 -11
  303. package/src/runtime/interfaces/thread-runtime-core.ts +2 -0
  304. package/src/runtime/utils/resolveToolApprovalResponse.test.ts +91 -0
  305. package/src/runtime/utils/resolveToolApprovalResponse.ts +55 -0
  306. package/src/runtime/utils/thread-message-like.ts +10 -1
  307. package/src/runtimes/local/local-thread-runtime-core.test.ts +61 -2
  308. package/src/runtimes/local/local-thread-runtime-core.ts +17 -8
  309. package/src/runtimes/local/should-continue.ts +2 -1
  310. package/src/store/clients/suggestions.ts +3 -5
  311. package/src/store/clients/thread-message-client.ts +13 -14
  312. package/src/store/runtime-clients/composer-runtime-client.ts +18 -21
  313. package/src/store/runtime-clients/liveRef.ts +5 -0
  314. package/src/store/runtime-clients/message-runtime-client.ts +16 -21
  315. package/src/store/runtime-clients/thread-list-runtime-client.ts +3 -5
  316. package/src/store/runtime-clients/thread-runtime-client.ts +9 -10
  317. package/src/store/runtime-clients/useSubscribable.ts +2 -10
  318. package/src/store/scopes/part.ts +5 -2
  319. package/src/types/message.ts +45 -3
@@ -46,7 +46,7 @@ const useInteractables = () => {
46
46
  ...prev,
47
47
  persistence: {
48
48
  ...prev.persistence,
49
- ...Object.fromEntries([...dirtyIds].map((id) => [id, {
49
+ ...Object.fromEntries([...dirtyIds].map((id_0) => [id_0, {
50
50
  isPending: true,
51
51
  error: void 0
52
52
  }]))
@@ -56,11 +56,11 @@ const useInteractables = () => {
56
56
  await adapter.save(payload);
57
57
  if (syncSeqRef.current === seq) {
58
58
  hasPendingLocalChangeRef.current = false;
59
- setState((prev) => {
60
- const persistence = { ...prev.persistence };
61
- for (const id of dirtyIds) delete persistence[id];
59
+ setState((prev_1) => {
60
+ const persistence = { ...prev_1.persistence };
61
+ for (const id_2 of dirtyIds) delete persistence[id_2];
62
62
  return {
63
- ...prev,
63
+ ...prev_1,
64
64
  persistence
65
65
  };
66
66
  });
@@ -68,11 +68,11 @@ const useInteractables = () => {
68
68
  } catch (e) {
69
69
  if (syncSeqRef.current === seq) {
70
70
  hasPendingLocalChangeRef.current = false;
71
- setState((prev) => ({
72
- ...prev,
71
+ setState((prev_0) => ({
72
+ ...prev_0,
73
73
  persistence: {
74
- ...prev.persistence,
75
- ...Object.fromEntries([...dirtyIds].map((id) => [id, {
74
+ ...prev_0.persistence,
75
+ ...Object.fromEntries([...dirtyIds].map((id_1) => [id_1, {
76
76
  isPending: false,
77
77
  error: e
78
78
  }]))
@@ -87,9 +87,9 @@ const useInteractables = () => {
87
87
  }
88
88
  }
89
89
  }, []);
90
- const schedulePersistence = useCallback((id) => {
90
+ const schedulePersistence = useCallback((id_3) => {
91
91
  if (!adapterRef.current) return;
92
- dirtyIdsRef.current.add(id);
92
+ dirtyIdsRef.current.add(id_3);
93
93
  if (debounceTimerRef.current !== void 0) clearTimeout(debounceTimerRef.current);
94
94
  debounceTimerRef.current = setTimeout(() => {
95
95
  debounceTimerRef.current = void 0;
@@ -102,32 +102,32 @@ const useInteractables = () => {
102
102
  }, [runPersistence]);
103
103
  const exportState = useCallback(() => {
104
104
  const result = {};
105
- for (const [id, def] of Object.entries(stateRef.current.definitions)) result[id] = {
106
- name: def.name,
107
- state: def.state
105
+ for (const [id_4, def_0] of Object.entries(stateRef.current.definitions)) result[id_4] = {
106
+ name: def_0.name,
107
+ state: def_0.state
108
108
  };
109
109
  return result;
110
110
  }, []);
111
111
  const importState = useCallback((saved) => {
112
- for (const [id, entry] of Object.entries(saved)) detachedStateRef.current.set(id, entry.state);
113
- setState((prev) => {
112
+ for (const [id_5, entry] of Object.entries(saved)) detachedStateRef.current.set(id_5, entry.state);
113
+ setState((prev_2) => {
114
114
  let changed = false;
115
- const definitions = { ...prev.definitions };
116
- for (const [id, entry] of Object.entries(saved)) if (definitions[id]) {
117
- definitions[id] = {
118
- ...definitions[id],
119
- state: entry.state
115
+ const definitions = { ...prev_2.definitions };
116
+ for (const [id_6, entry_0] of Object.entries(saved)) if (definitions[id_6]) {
117
+ definitions[id_6] = {
118
+ ...definitions[id_6],
119
+ state: entry_0.state
120
120
  };
121
121
  changed = true;
122
122
  }
123
123
  return changed ? {
124
- ...prev,
124
+ ...prev_2,
125
125
  definitions
126
- } : prev;
126
+ } : prev_2;
127
127
  });
128
128
  }, []);
129
- const setPersistenceAdapter = useCallback((adapter) => {
130
- adapterRef.current = adapter;
129
+ const setPersistenceAdapter = useCallback((adapter_0) => {
130
+ adapterRef.current = adapter_0;
131
131
  }, []);
132
132
  const flush = useCallback(async () => {
133
133
  if (debounceTimerRef.current !== void 0) {
@@ -136,8 +136,8 @@ const useInteractables = () => {
136
136
  }
137
137
  if (!adapterRef.current) return;
138
138
  if (!hasPendingLocalChangeRef.current && dirtyIdsRef.current.size === 0) return;
139
- const p = new Promise((resolve) => {
140
- flushResolversRef.current.push(resolve);
139
+ const p = new Promise((resolve_0) => {
140
+ flushResolversRef.current.push(resolve_0);
141
141
  });
142
142
  if (!hasPendingLocalChangeRef.current) runPersistence();
143
143
  return p;
@@ -149,33 +149,33 @@ const useInteractables = () => {
149
149
  runPersistence();
150
150
  }
151
151
  }, [runPersistence]);
152
- const setDefState = useCallback((id, updater) => {
153
- setState((prev) => {
154
- const existing = prev.definitions[id];
155
- if (!existing) return prev;
152
+ const setDefState = useCallback((id_7, updater) => {
153
+ setState((prev_3) => {
154
+ const existing = prev_3.definitions[id_7];
155
+ if (!existing) return prev_3;
156
156
  return {
157
- ...prev,
157
+ ...prev_3,
158
158
  definitions: {
159
- ...prev.definitions,
160
- [id]: {
159
+ ...prev_3.definitions,
160
+ [id_7]: {
161
161
  ...existing,
162
162
  state: updater(existing.state)
163
163
  }
164
164
  }
165
165
  };
166
166
  });
167
- if (stateRef.current.definitions[id]) schedulePersistence(id);
167
+ if (stateRef.current.definitions[id_7]) schedulePersistence(id_7);
168
168
  }, [schedulePersistence]);
169
- const setDefSelected = useCallback((id, selected) => {
170
- setState((prev) => {
171
- const existing = prev.definitions[id];
172
- if (!existing) return prev;
169
+ const setDefSelected = useCallback((id_8, selected) => {
170
+ setState((prev_4) => {
171
+ const existing_0 = prev_4.definitions[id_8];
172
+ if (!existing_0) return prev_4;
173
173
  return {
174
- ...prev,
174
+ ...prev_4,
175
175
  definitions: {
176
- ...prev.definitions,
177
- [id]: {
178
- ...existing,
176
+ ...prev_4.definitions,
177
+ [id_8]: {
178
+ ...existing_0,
179
179
  selected
180
180
  }
181
181
  }
@@ -202,39 +202,39 @@ const useInteractables = () => {
202
202
  }, [clientRef, provider]);
203
203
  return {
204
204
  getState: () => state,
205
- register: useCallback((def) => {
205
+ register: useCallback((def_1) => {
206
206
  try {
207
- const jsonSchema = toJSONSchema(def.stateSchema);
208
- partialSchemaCacheRef.current.set(def.id, toPartialJSONSchema(jsonSchema));
209
- } catch (e) {
210
- console.warn(`[Interactables] Failed to create partial schema for "${def.name}". The update tool will require all fields.`, e);
207
+ const jsonSchema = toJSONSchema(def_1.stateSchema);
208
+ partialSchemaCacheRef.current.set(def_1.id, toPartialJSONSchema(jsonSchema));
209
+ } catch (e_0) {
210
+ console.warn(`[Interactables] Failed to create partial schema for "${def_1.name}". The update tool will require all fields.`, e_0);
211
211
  }
212
- const detached = detachedStateRef.current.get(def.id);
213
- detachedStateRef.current.delete(def.id);
214
- setState((prev) => ({
215
- ...prev,
212
+ const detached = detachedStateRef.current.get(def_1.id);
213
+ detachedStateRef.current.delete(def_1.id);
214
+ setState((prev_5) => ({
215
+ ...prev_5,
216
216
  definitions: {
217
- ...prev.definitions,
218
- [def.id]: {
219
- id: def.id,
220
- name: def.name,
221
- description: def.description,
222
- stateSchema: def.stateSchema,
223
- state: prev.definitions[def.id]?.state ?? detached ?? def.initialState,
224
- selected: def.selected
217
+ ...prev_5.definitions,
218
+ [def_1.id]: {
219
+ id: def_1.id,
220
+ name: def_1.name,
221
+ description: def_1.description,
222
+ stateSchema: def_1.stateSchema,
223
+ state: prev_5.definitions[def_1.id]?.state ?? detached ?? def_1.initialState,
224
+ selected: def_1.selected
225
225
  }
226
226
  }
227
227
  }));
228
228
  return () => {
229
229
  flushIfPending();
230
- setState((prev) => {
231
- const existing = prev.definitions[def.id];
232
- if (existing) detachedStateRef.current.set(def.id, existing.state);
233
- partialSchemaCacheRef.current.delete(def.id);
234
- const { [def.id]: _, ...rest } = prev.definitions;
235
- const { [def.id]: __, ...restPersistence } = prev.persistence;
230
+ setState((prev_6) => {
231
+ const existing_1 = prev_6.definitions[def_1.id];
232
+ if (existing_1) detachedStateRef.current.set(def_1.id, existing_1.state);
233
+ partialSchemaCacheRef.current.delete(def_1.id);
234
+ const { [def_1.id]: _, ...rest } = prev_6.definitions;
235
+ const { [def_1.id]: __, ...restPersistence } = prev_6.persistence;
236
236
  return {
237
- ...prev,
237
+ ...prev_6,
238
238
  definitions: rest,
239
239
  persistence: restPersistence
240
240
  };
@@ -1 +1 @@
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\nconst useInteractables = (): 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\nexport const Interactables = resource(useInteractables);\n\nattachTransformScopes(useInteractables, (scopes, parent) => {\n if (!scopes.modelContext && parent.modelContext.source === null) {\n scopes.modelContext = ModelContext();\n }\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"Interactables.js","names":["useState","useEffect","useCallback","useRef","useMemo","resource","useAssistantClientRef","ClientOutput","attachTransformScopes","InteractablesState","InteractableRegistration","InteractableStateSchema","InteractablePersistedState","InteractablePersistenceAdapter","toJSONSchema","toPartialJSONSchema","ModelContext","buildInteractableModelContext","PERSISTENCE_DEBOUNCE_MS","useInteractables","state","setState","definitions","persistence","clientRef","stateRef","current","subscribersRef","Set","partialSchemaCacheRef","Map","detachedStateRef","adapterRef","undefined","debounceTimerRef","ReturnType","setTimeout","syncSeqRef","hasPendingLocalChangeRef","flushResolversRef","Array","dirtyIdsRef","runPersistence","adapter","resolve","seq","dirtyIds","clear","exported","payload","id","def","Object","entries","name","prev","fromEntries","map","isPending","error","save","e","size","schedulePersistence","add","clearTimeout","exportState","result","importState","saved","entry","set","changed","setPersistenceAdapter","flush","p","Promise","push","flushIfPending","setDefState","updater","existing","setDefSelected","selected","provider","getModelContext","defs","subscribe","callback","delete","cb","modelContext","register","jsonSchema","stateSchema","console","warn","detached","get","description","initialState","_","rest","__","restPersistence","getState","setSelected","Interactables","scopes","parent","source"],"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\nconst useInteractables = (): 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\nexport const Interactables = resource(useInteractables);\n\nattachTransformScopes(useInteractables, (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":";;;;;;cA+Ja,KAAA,8BAAK,QAAA,CAAA,YAAA;EAAL,gFA1HD,OAAA;WAED,eAAA,CAAgB,oBAAA;AAAA"}
1
+ {"version":3,"file":"Tools.d.ts","names":[],"sources":["../../../src/react/client/Tools.ts"],"mappings":";;;;;;cA6Ja,KAAA,8BAAK,QAAA,CAAA,YAAA;EAAL,gFAxHD,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 { useCallback, useEffect, useMemo, useState } from "@assistant-ui/tap/react-shim";
3
+ import { useEffect, useState } from "@assistant-ui/tap/react-shim";
4
4
  import { attachTransformScopes, useAssistantClientRef } from "@assistant-ui/store";
5
+ import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
5
6
  import { resource, useResources, withKey } from "@assistant-ui/tap";
6
7
  //#region src/react/client/Tools.ts
7
8
  /**
@@ -12,69 +13,131 @@ import { resource, useResources, withKey } from "@assistant-ui/tap";
12
13
  * context, while each tool renderer is registered with the tools scope for
13
14
  * message rendering.
14
15
  */
15
- const useTools = ({ toolkit, mcpApp }) => {
16
- const mcpAppOutput = useResources(() => mcpApp ? [withKey("mcpApp", mcpApp)] : [], [mcpApp])[0];
17
- const [toolUIs, setToolUIs] = useState(() => ({}));
18
- const state = useMemo(() => ({
19
- toolUIs,
20
- mcpApp: mcpAppOutput,
21
- tools: Object.fromEntries(Object.entries(toolUIs).map(([name, regs]) => [name, regs.map((r) => r.render)]))
22
- }), [toolUIs, mcpAppOutput]);
16
+ const useTools = (t0) => {
17
+ const $ = c(15);
18
+ const { toolkit, mcpApp } = t0;
19
+ let t1;
20
+ if ($[0] !== mcpApp) {
21
+ t1 = mcpApp ? [withKey("mcpApp", mcpApp)] : [];
22
+ $[0] = mcpApp;
23
+ $[1] = t1;
24
+ } else t1 = $[1];
25
+ const mcpAppOutput = useResources(t1)[0];
26
+ const [toolUIs, setToolUIs] = useState(_temp);
27
+ let t2;
28
+ if ($[2] !== toolUIs) {
29
+ t2 = Object.fromEntries(Object.entries(toolUIs).map(_temp3));
30
+ $[2] = toolUIs;
31
+ $[3] = t2;
32
+ } else t2 = $[3];
33
+ let t3;
34
+ if ($[4] !== mcpAppOutput || $[5] !== t2 || $[6] !== toolUIs) {
35
+ t3 = {
36
+ toolUIs,
37
+ mcpApp: mcpAppOutput,
38
+ tools: t2
39
+ };
40
+ $[4] = mcpAppOutput;
41
+ $[5] = t2;
42
+ $[6] = toolUIs;
43
+ $[7] = t3;
44
+ } else t3 = $[7];
45
+ const state = t3;
23
46
  const clientRef = useAssistantClientRef();
24
- const setToolUI = useCallback((toolName, render, options) => {
25
- const registration = {
26
- render,
27
- standalone: options?.standalone ?? false
47
+ let t4;
48
+ if ($[8] === Symbol.for("react.memo_cache_sentinel")) {
49
+ t4 = (toolName, render, options) => {
50
+ const registration = {
51
+ render,
52
+ standalone: options?.standalone ?? false
53
+ };
54
+ setToolUIs((prev) => ({
55
+ ...prev,
56
+ [toolName]: [...prev[toolName] ?? [], registration]
57
+ }));
58
+ return () => {
59
+ setToolUIs((prev_0) => {
60
+ const next = prev_0[toolName]?.filter((r_0) => r_0 !== registration) ?? [];
61
+ if (next.length > 0) return {
62
+ ...prev_0,
63
+ [toolName]: next
64
+ };
65
+ const rest = { ...prev_0 };
66
+ delete rest[toolName];
67
+ return rest;
68
+ });
69
+ };
28
70
  };
29
- setToolUIs((prev) => ({
30
- ...prev,
31
- [toolName]: [...prev[toolName] ?? [], registration]
32
- }));
33
- return () => {
34
- setToolUIs((prev) => {
35
- const next = prev[toolName]?.filter((r) => r !== registration) ?? [];
36
- if (next.length > 0) return {
37
- ...prev,
38
- [toolName]: next
39
- };
40
- const { [toolName]: _removed, ...rest } = prev;
41
- return rest;
42
- });
71
+ $[8] = t4;
72
+ } else t4 = $[8];
73
+ const setToolUI = t4;
74
+ let t5;
75
+ let t6;
76
+ if ($[9] !== clientRef || $[10] !== toolkit) {
77
+ t5 = () => {
78
+ if (!toolkit) return;
79
+ const unsubscribes = [];
80
+ for (const [toolName_0, tool] of Object.entries(toolkit)) {
81
+ const toolRender = "render" in tool ? tool.render : void 0;
82
+ const toolRenderText = "renderText" in tool ? tool.renderText : void 0;
83
+ const render_0 = toolRender ?? (toolRenderText ? makeToolCallTextComponent(toolRenderText) : void 0);
84
+ if (render_0) unsubscribes.push(setToolUI(toolName_0, render_0, { standalone: isStandaloneToolDisplay(tool) }));
85
+ }
86
+ const toolsWithoutRender = Object.entries(toolkit).reduce(_temp4, {});
87
+ unsubscribes.push(clientRef.current.modelContext().register({ getModelContext: () => ({ tools: toolsWithoutRender }) }));
88
+ return () => {
89
+ unsubscribes.forEach(_temp5);
90
+ };
43
91
  };
44
- }, []);
45
- useEffect(() => {
46
- if (!toolkit) return;
47
- const unsubscribes = [];
48
- for (const [toolName, tool] of Object.entries(toolkit)) {
49
- const toolRender = "render" in tool ? tool.render : void 0;
50
- const toolRenderText = "renderText" in tool ? tool.renderText : void 0;
51
- const render = toolRender ?? (toolRenderText ? makeToolCallTextComponent(toolRenderText) : void 0);
52
- if (render) unsubscribes.push(setToolUI(toolName, render, { standalone: isStandaloneToolDisplay(tool) }));
53
- }
54
- const toolsWithoutRender = Object.entries(toolkit).reduce((acc, [name, tool]) => {
55
- if (tool.type === "mcp") return acc;
56
- const { display: _display, render: _render, renderText: _renderText, ...rest } = tool;
57
- acc[name] = rest;
58
- return acc;
59
- }, {});
60
- unsubscribes.push(clientRef.current.modelContext().register({ getModelContext: () => ({ tools: toolsWithoutRender }) }));
61
- return () => {
62
- unsubscribes.forEach((fn) => fn());
92
+ t6 = [
93
+ toolkit,
94
+ setToolUI,
95
+ clientRef
96
+ ];
97
+ $[9] = clientRef;
98
+ $[10] = toolkit;
99
+ $[11] = t5;
100
+ $[12] = t6;
101
+ } else {
102
+ t5 = $[11];
103
+ t6 = $[12];
104
+ }
105
+ useEffect(t5, t6);
106
+ let t7;
107
+ if ($[13] !== state) {
108
+ t7 = {
109
+ getState: () => state,
110
+ setToolUI
63
111
  };
64
- }, [
65
- toolkit,
66
- setToolUI,
67
- clientRef
68
- ]);
69
- return {
70
- getState: () => state,
71
- setToolUI
72
- };
112
+ $[13] = state;
113
+ $[14] = t7;
114
+ } else t7 = $[14];
115
+ return t7;
73
116
  };
74
117
  const Tools = resource(useTools);
75
118
  attachTransformScopes(useTools, (scopes, parent) => {
76
119
  if (!scopes.modelContext && parent.modelContext.source === null) scopes.modelContext = ModelContext();
77
120
  });
121
+ function _temp() {
122
+ return {};
123
+ }
124
+ function _temp2(r) {
125
+ return r.render;
126
+ }
127
+ function _temp3(t0) {
128
+ const [name, regs] = t0;
129
+ return [name, regs.map(_temp2)];
130
+ }
131
+ function _temp4(acc, t0) {
132
+ const [name_0, tool_0] = t0;
133
+ if (tool_0.type === "mcp") return acc;
134
+ const { display: _display, render: _render, renderText: _renderText, ...rest_0 } = tool_0;
135
+ acc[name_0] = rest_0;
136
+ return acc;
137
+ }
138
+ function _temp5(fn) {
139
+ return fn();
140
+ }
78
141
  //#endregion
79
142
  export { Tools };
80
143
 
@@ -1 +1 @@
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 */\nconst useTools = ({\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\nexport const Tools = resource(useTools);\n\nattachTransformScopes(useTools, (scopes, parent) => {\n if (!scopes.modelContext && parent.modelContext.source === null) {\n scopes.modelContext = ModelContext();\n }\n});\n"],"mappings":";;;;;;;;;;;;;;AAgCA,MAAM,YAAY,EAChB,SACA,aAM2B;CAK3B,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;AAEA,MAAa,QAAQ,SAAS,QAAQ;AAEtC,sBAAsB,WAAW,QAAQ,WAAW;CAClD,IAAI,CAAC,OAAO,gBAAgB,OAAO,aAAa,WAAW,MACzD,OAAO,eAAe,aAAa;AAEvC,CAAC"}
1
+ {"version":3,"file":"Tools.js","names":["useState","useEffect","useCallback","useMemo","useResources","resource","withKey","ResourceElement","useAssistantClientRef","ClientOutput","attachTransformScopes","McpAppResourceOutput","ToolsState","Tool","isStandaloneToolDisplay","makeToolCallTextComponent","Toolkit","ToolCallMessagePartComponent","ModelContext","useTools","t0","$","_c","toolkit","mcpApp","t1","mcpAppOutputs","mcpAppOutput","toolUIs","setToolUIs","_temp","t2","Object","fromEntries","entries","map","_temp3","t3","tools","state","clientRef","t4","Symbol","for","toolName","render","options","registration","standalone","prev","prev_0","next","filter","r_0","r","length","rest","setToolUI","t5","t6","unsubscribes","toolName_0","tool","toolRender","undefined","toolRenderText","renderText","render_0","push","toolsWithoutRender","reduce","_temp4","Record","modelContextProvider","getModelContext","current","modelContext","register","forEach","_temp5","t7","getState","Tools","scopes","parent","source","_temp2","name","regs","acc","name_0","tool_0","type","display","_display","_render","_renderText","rest_0","fn"],"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 */\nconst useTools = ({\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(mcpApp ? [withKey(\"mcpApp\", mcpApp)] : []);\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 rest = { ...prev };\n delete rest[toolName];\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\nexport const Tools = resource(useTools);\n\nattachTransformScopes(useTools, (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":"interactable-model-context.js","names":[],"sources":["../../../src/react/client/interactable-model-context.ts"],"sourcesContent":["import type { Tool } from \"assistant-stream\";\nimport type {\n InteractableDefinition,\n InteractableStateSchema,\n} from \"../types/scopes/interactables\";\n\nexport function shallowMerge(prev: unknown, partial: unknown): unknown {\n if (\n typeof prev !== \"object\" ||\n prev === null ||\n typeof partial !== \"object\" ||\n partial === null ||\n Array.isArray(prev) ||\n Array.isArray(partial)\n ) {\n return partial;\n }\n return {\n ...(prev as Record<string, unknown>),\n ...(partial as Record<string, unknown>),\n };\n}\n\nexport function buildInteractableModelContext(\n definitions: Record<string, InteractableDefinition>,\n partialSchemaCache: Map<string, InteractableStateSchema>,\n setDefState: (id: string, updater: (prev: unknown) => unknown) => void,\n): { system: string; tools: Record<string, Tool<any, any>> } | undefined {\n const entries = Object.values(definitions);\n if (entries.length === 0) return undefined;\n\n const byName = new Map<string, InteractableDefinition[]>();\n for (const def of entries) {\n const list = byName.get(def.name) ?? [];\n list.push(def);\n byName.set(def.name, list);\n }\n\n const systemParts: string[] = [];\n const tools: Record<string, Tool<any, any>> = {};\n\n for (const [name, instances] of byName) {\n const isMulti = instances.length > 1;\n\n for (const def of instances) {\n const selectedTag = def.selected ? \" (SELECTED)\" : \"\";\n const idTag = isMulti ? ` [id=\"${def.id}\"]` : \"\";\n\n systemParts.push(\n `Interactable component \"${name}\"${idTag}${selectedTag} (${def.description}). Current state: ${JSON.stringify(def.state)}`,\n );\n\n const safeName = name.replace(/[^a-zA-Z0-9_-]/g, \"_\");\n const safeId = def.id.replace(/[^a-zA-Z0-9_-]/g, \"_\");\n const toolName = isMulti\n ? `update_${safeName}_${safeId}`\n : `update_${safeName}`;\n\n const partialSchema = partialSchemaCache.get(def.id) ?? def.stateSchema;\n\n tools[toolName] = {\n type: \"frontend\" as const,\n description: `Update the state of interactable component \"${name}\"${isMulti ? ` (id: ${def.id})` : \"\"}. Only include the fields you want to change; omitted fields keep their current values. ${def.description}`,\n parameters: partialSchema,\n streamCall: async (reader) => {\n try {\n for await (const partialArgs of reader.args.streamValues()) {\n setDefState(def.id, (prev) => shallowMerge(prev, partialArgs));\n }\n } catch {\n // Non-fatal: execute handles the final state\n }\n },\n execute: async (partialState: unknown) => {\n setDefState(def.id, (prev) => shallowMerge(prev, partialState));\n return { success: true };\n },\n };\n }\n }\n\n return { system: systemParts.join(\"\\n\"), tools };\n}\n"],"mappings":";AAMA,SAAgB,aAAa,MAAe,SAA2B;CACrE,IACE,OAAO,SAAS,YAChB,SAAS,QACT,OAAO,YAAY,YACnB,YAAY,QACZ,MAAM,QAAQ,IAAI,KAClB,MAAM,QAAQ,OAAO,GAErB,OAAO;CAET,OAAO;EACL,GAAI;EACJ,GAAI;CACN;AACF;AAEA,SAAgB,8BACd,aACA,oBACA,aACuE;CACvE,MAAM,UAAU,OAAO,OAAO,WAAW;CACzC,IAAI,QAAQ,WAAW,GAAG,OAAO,KAAA;CAEjC,MAAM,yBAAS,IAAI,IAAsC;CACzD,KAAK,MAAM,OAAO,SAAS;EACzB,MAAM,OAAO,OAAO,IAAI,IAAI,IAAI,KAAK,CAAC;EACtC,KAAK,KAAK,GAAG;EACb,OAAO,IAAI,IAAI,MAAM,IAAI;CAC3B;CAEA,MAAM,cAAwB,CAAC;CAC/B,MAAM,QAAwC,CAAC;CAE/C,KAAK,MAAM,CAAC,MAAM,cAAc,QAAQ;EACtC,MAAM,UAAU,UAAU,SAAS;EAEnC,KAAK,MAAM,OAAO,WAAW;GAC3B,MAAM,cAAc,IAAI,WAAW,gBAAgB;GACnD,MAAM,QAAQ,UAAU,SAAS,IAAI,GAAG,MAAM;GAE9C,YAAY,KACV,2BAA2B,KAAK,GAAG,QAAQ,YAAY,IAAI,IAAI,YAAY,oBAAoB,KAAK,UAAU,IAAI,KAAK,GACzH;GAEA,MAAM,WAAW,KAAK,QAAQ,mBAAmB,GAAG;GACpD,MAAM,SAAS,IAAI,GAAG,QAAQ,mBAAmB,GAAG;GACpD,MAAM,WAAW,UACb,UAAU,SAAS,GAAG,WACtB,UAAU;GAEd,MAAM,gBAAgB,mBAAmB,IAAI,IAAI,EAAE,KAAK,IAAI;GAE5D,MAAM,YAAY;IAChB,MAAM;IACN,aAAa,+CAA+C,KAAK,GAAG,UAAU,SAAS,IAAI,GAAG,KAAK,GAAG,0FAA0F,IAAI;IACpM,YAAY;IACZ,YAAY,OAAO,WAAW;KAC5B,IAAI;MACF,WAAW,MAAM,eAAe,OAAO,KAAK,aAAa,GACvD,YAAY,IAAI,KAAK,SAAS,aAAa,MAAM,WAAW,CAAC;KAEjE,QAAQ,CAER;IACF;IACA,SAAS,OAAO,iBAA0B;KACxC,YAAY,IAAI,KAAK,SAAS,aAAa,MAAM,YAAY,CAAC;KAC9D,OAAO,EAAE,SAAS,KAAK;IACzB;GACF;EACF;CACF;CAEA,OAAO;EAAE,QAAQ,YAAY,KAAK,IAAI;EAAG;CAAM;AACjD"}
1
+ {"version":3,"file":"interactable-model-context.js","names":["Tool","InteractableDefinition","InteractableStateSchema","shallowMerge","prev","partial","Array","isArray","Record","buildInteractableModelContext","definitions","partialSchemaCache","Map","setDefState","id","updater","system","tools","entries","Object","values","length","undefined","byName","def","list","get","name","push","set","systemParts","instances","isMulti","selectedTag","selected","idTag","description","JSON","stringify","state","safeName","replace","safeId","toolName","partialSchema","stateSchema","type","const","parameters","streamCall","reader","partialArgs","args","streamValues","execute","partialState","success","join"],"sources":["../../../src/react/client/interactable-model-context.ts"],"sourcesContent":["import type { Tool } from \"assistant-stream\";\nimport type {\n InteractableDefinition,\n InteractableStateSchema,\n} from \"../types/scopes/interactables\";\n\nexport function shallowMerge(prev: unknown, partial: unknown): unknown {\n if (\n typeof prev !== \"object\" ||\n prev === null ||\n typeof partial !== \"object\" ||\n partial === null ||\n Array.isArray(prev) ||\n Array.isArray(partial)\n ) {\n return partial;\n }\n return {\n ...(prev as Record<string, unknown>),\n ...(partial as Record<string, unknown>),\n };\n}\n\nexport function buildInteractableModelContext(\n definitions: Record<string, InteractableDefinition>,\n partialSchemaCache: Map<string, InteractableStateSchema>,\n setDefState: (id: string, updater: (prev: unknown) => unknown) => void,\n): { system: string; tools: Record<string, Tool<any, any>> } | undefined {\n const entries = Object.values(definitions);\n if (entries.length === 0) return undefined;\n\n const byName = new Map<string, InteractableDefinition[]>();\n for (const def of entries) {\n const list = byName.get(def.name) ?? [];\n list.push(def);\n byName.set(def.name, list);\n }\n\n const systemParts: string[] = [];\n const tools: Record<string, Tool<any, any>> = {};\n\n for (const [name, instances] of byName) {\n const isMulti = instances.length > 1;\n\n for (const def of instances) {\n const selectedTag = def.selected ? \" (SELECTED)\" : \"\";\n const idTag = isMulti ? ` [id=\"${def.id}\"]` : \"\";\n\n systemParts.push(\n `Interactable component \"${name}\"${idTag}${selectedTag} (${def.description}). Current state: ${JSON.stringify(def.state)}`,\n );\n\n const safeName = name.replace(/[^a-zA-Z0-9_-]/g, \"_\");\n const safeId = def.id.replace(/[^a-zA-Z0-9_-]/g, \"_\");\n const toolName = isMulti\n ? `update_${safeName}_${safeId}`\n : `update_${safeName}`;\n\n const partialSchema = partialSchemaCache.get(def.id) ?? def.stateSchema;\n\n tools[toolName] = {\n type: \"frontend\" as const,\n description: `Update the state of interactable component \"${name}\"${isMulti ? ` (id: ${def.id})` : \"\"}. Only include the fields you want to change; omitted fields keep their current values. ${def.description}`,\n parameters: partialSchema,\n streamCall: async (reader) => {\n try {\n for await (const partialArgs of reader.args.streamValues()) {\n setDefState(def.id, (prev) => shallowMerge(prev, partialArgs));\n }\n } catch {\n // Non-fatal: execute handles the final state\n }\n },\n execute: async (partialState: unknown) => {\n setDefState(def.id, (prev) => shallowMerge(prev, partialState));\n return { success: true };\n },\n };\n }\n }\n\n return { system: systemParts.join(\"\\n\"), tools };\n}\n"],"mappings":";AAMA,SAAgBG,aAAaC,MAAeC,SAA2B;CACrE,IACE,OAAOD,SAAS,YAChBA,SAAS,QACT,OAAOC,YAAY,YACnBA,YAAY,QACZC,MAAMC,QAAQH,IAAI,KAClBE,MAAMC,QAAQF,OAAO,GAErB,OAAOA;CAET,OAAO;EACL,GAAID;EACJ,GAAIC;CACN;AACF;AAEA,SAAgBI,8BACdC,aACAC,oBACAE,aACuE;CACvE,MAAMK,UAAUC,OAAOC,OAAOV,WAAW;CACzC,IAAIQ,QAAQG,WAAW,GAAG,OAAOC,KAAAA;CAEjC,MAAMC,yBAAS,IAAIX,IAAsC;CACzD,KAAK,MAAMY,OAAON,SAAS;EACzB,MAAMO,OAAOF,OAAOG,IAAIF,IAAIG,IAAI,KAAK,CAAA;EACrCF,KAAKG,KAAKJ,GAAG;EACbD,OAAOM,IAAIL,IAAIG,MAAMF,IAAI;CAC3B;CAEA,MAAMK,cAAwB,CAAA;CAC9B,MAAMb,QAAwC,CAAC;CAE/C,KAAK,MAAM,CAACU,MAAMI,cAAcR,QAAQ;EACtC,MAAMS,UAAUD,UAAUV,SAAS;EAEnC,KAAK,MAAMG,OAAOO,WAAW;GAC3B,MAAME,cAAcT,IAAIU,WAAW,gBAAgB;GACnD,MAAMC,QAAQH,UAAU,SAASR,IAAIV,GAAE,MAAO;GAE9CgB,YAAYF,KACV,2BAA2BD,KAAI,GAAIQ,QAAQF,YAAW,IAAKT,IAAIY,YAAW,oBAAqBC,KAAKC,UAAUd,IAAIe,KAAK,GACzH;GAEA,MAAMC,WAAWb,KAAKc,QAAQ,mBAAmB,GAAG;GACpD,MAAMC,SAASlB,IAAIV,GAAG2B,QAAQ,mBAAmB,GAAG;GACpD,MAAME,WAAWX,UACb,UAAUQ,SAAQ,GAAIE,WACtB,UAAUF;GAEd,MAAMI,gBAAgBjC,mBAAmBe,IAAIF,IAAIV,EAAE,KAAKU,IAAIqB;GAE5D5B,MAAM0B,YAAY;IAChBG,MAAM;IACNV,aAAa,+CAA+CT,KAAI,GAAIK,UAAU,SAASR,IAAIV,GAAE,KAAM,GAAE,0FAA2FU,IAAIY;IACpMY,YAAYJ;IACZK,YAAY,OAAOC,WAAW;KAC5B,IAAI;MACF,WAAW,MAAMC,eAAeD,OAAOE,KAAKC,aAAa,GACvDxC,YAAYW,IAAIV,KAAKV,SAASD,aAAaC,MAAM+C,WAAW,CAAC;KAEjE,QAAQ,CACN;IAEJ;IACAG,SAAS,OAAOC,iBAA0B;KACxC1C,YAAYW,IAAIV,KAAKV,SAASD,aAAaC,MAAMmD,YAAY,CAAC;KAC9D,OAAO,EAAEC,SAAS,KAAK;IACzB;GACF;EACF;CACF;CAEA,OAAO;EAAExC,QAAQc,YAAY2B,KAAK,IAAI;EAAGxC;CAAM;AACjD"}
@@ -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,CAAC,CAAC,KAAK,CAAC,MAAM,YAAY,CACjD,MACA;EAAE,MAAM;EAAO;CAAO,CACxB,CAAC,CACH;AACF"}
1
+ {"version":3,"file":"define-mcp-toolkit.js","names":["McpServerConfig","Toolkit","McpToolkitDefinition","Record","defineMcpToolkit","definition","Object","fromEntries","entries","map","name","server","type"],"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,SAAgBI,iBAAiBC,YAA2C;CAC1E,OAAOC,OAAOC,YACZD,OAAOE,QAAQH,UAAU,CAAC,CAACI,KAAK,CAACC,MAAMC,YAAY,CACjDD,MACA;EAAEE,MAAM;EAAOD;CAAO,CAAC,CACxB,CACH;AACF"}
@@ -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 * 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"}
1
+ {"version":3,"file":"define-toolkit.js","names":["Toolkit","ToolkitDefinition","ToolkitDefinitionEntryWithParameters","defineToolkit","TArgsByName","Record","_definition","K","TResultByName","TDefinition"],"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,SAAgBG,cAAcG,aAAyC;CACrE,OAAOA;AACT"}
@@ -1 +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"}
1
+ {"version":3,"file":"external-tool.js","names":["externalTool","Error"],"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,SAAgBA,eAAsB;CACpC,MAAM,IAAIC,MACR,yOAGF;AACF"}