@assistant-ui/react 0.15.16 → 0.15.18

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 (297) hide show
  1. package/README.md +4 -4
  2. package/dist/index.d.ts +8 -4
  3. package/dist/index.js +4 -2
  4. package/dist/mcp-apps/McpAppRenderer.d.ts +36 -9
  5. package/dist/mcp-apps/McpAppRenderer.d.ts.map +1 -1
  6. package/dist/mcp-apps/McpAppRenderer.js +108 -57
  7. package/dist/mcp-apps/McpAppRenderer.js.map +1 -1
  8. package/dist/mcp-apps/McpAppsRemoteHost.d.ts.map +1 -1
  9. package/dist/mcp-apps/McpAppsRemoteHost.js +20 -17
  10. package/dist/mcp-apps/McpAppsRemoteHost.js.map +1 -1
  11. package/dist/mcp-apps/app-frame.d.ts.map +1 -1
  12. package/dist/mcp-apps/app-frame.js +229 -115
  13. package/dist/mcp-apps/app-frame.js.map +1 -1
  14. package/dist/mcp-apps/bridge.js +2 -3
  15. package/dist/mcp-apps/bridge.js.map +1 -1
  16. package/dist/mcp-apps/index.d.ts +3 -3
  17. package/dist/model-context/frame/useAssistantFrameHost.d.ts +1 -1
  18. package/dist/model-context/frame/useAssistantFrameHost.js +10 -11
  19. package/dist/model-context/frame/useAssistantFrameHost.js.map +1 -1
  20. package/dist/model-context/makeAssistantVisible.js +1 -1
  21. package/dist/model-context/makeAssistantVisible.js.map +1 -1
  22. package/dist/primitives/actionBar/ActionBarCopy.js +3 -3
  23. package/dist/primitives/actionBar/ActionBarCopy.js.map +1 -1
  24. package/dist/primitives/actionBar/ActionBarExportMarkdown.js +3 -3
  25. package/dist/primitives/actionBar/ActionBarExportMarkdown.js.map +1 -1
  26. package/dist/primitives/actionBar/ActionBarFeedbackNegative.js +3 -3
  27. package/dist/primitives/actionBar/ActionBarFeedbackNegative.js.map +1 -1
  28. package/dist/primitives/actionBar/ActionBarFeedbackPositive.js +3 -3
  29. package/dist/primitives/actionBar/ActionBarFeedbackPositive.js.map +1 -1
  30. package/dist/primitives/actionBar/ActionBarRoot.js.map +1 -1
  31. package/dist/primitives/actionBar/ActionBarStopSpeaking.js +3 -3
  32. package/dist/primitives/actionBar/ActionBarStopSpeaking.js.map +1 -1
  33. package/dist/primitives/actionBarMore/ActionBarMoreContent.js.map +1 -1
  34. package/dist/primitives/actionBarMore/ActionBarMoreItem.js.map +1 -1
  35. package/dist/primitives/actionBarMore/ActionBarMoreRoot.js.map +1 -1
  36. package/dist/primitives/actionBarMore/ActionBarMoreSeparator.js.map +1 -1
  37. package/dist/primitives/actionBarMore/ActionBarMoreTrigger.js.map +1 -1
  38. package/dist/primitives/actionBarMore/scope.d.ts +2 -2
  39. package/dist/primitives/actionBarMore/scope.d.ts.map +1 -1
  40. package/dist/primitives/actionBarMore/scope.js.map +1 -1
  41. package/dist/primitives/assistantModal/AssistantModalAnchor.js.map +1 -1
  42. package/dist/primitives/assistantModal/AssistantModalContent.js +1 -1
  43. package/dist/primitives/assistantModal/AssistantModalContent.js.map +1 -1
  44. package/dist/primitives/assistantModal/AssistantModalRoot.js.map +1 -1
  45. package/dist/primitives/assistantModal/AssistantModalTrigger.js.map +1 -1
  46. package/dist/primitives/assistantModal/scope.d.ts +2 -2
  47. package/dist/primitives/assistantModal/scope.d.ts.map +1 -1
  48. package/dist/primitives/assistantModal/scope.js.map +1 -1
  49. package/dist/primitives/branchPicker/BranchPickerRoot.js.map +1 -1
  50. package/dist/primitives/composer/ComposerAttachmentDropzone.js +1 -1
  51. package/dist/primitives/composer/ComposerAttachmentDropzone.js.map +1 -1
  52. package/dist/primitives/composer/ComposerDictationTranscript.js.map +1 -1
  53. package/dist/primitives/composer/ComposerInput.js +1 -3
  54. package/dist/primitives/composer/ComposerInput.js.map +1 -1
  55. package/dist/primitives/composer/ComposerInputPluginContext.d.ts +1 -2
  56. package/dist/primitives/composer/ComposerInputPluginContext.d.ts.map +1 -1
  57. package/dist/primitives/composer/ComposerInputPluginContext.js +1 -6
  58. package/dist/primitives/composer/ComposerInputPluginContext.js.map +1 -1
  59. package/dist/primitives/composer/ComposerQuote.js +5 -5
  60. package/dist/primitives/composer/ComposerQuote.js.map +1 -1
  61. package/dist/primitives/composer/ComposerRoot.js +3 -3
  62. package/dist/primitives/composer/ComposerRoot.js.map +1 -1
  63. package/dist/primitives/composer/trigger/TriggerPopover.d.ts +5 -0
  64. package/dist/primitives/composer/trigger/TriggerPopover.d.ts.map +1 -1
  65. package/dist/primitives/composer/trigger/TriggerPopover.js +157 -130
  66. package/dist/primitives/composer/trigger/TriggerPopover.js.map +1 -1
  67. package/dist/primitives/composer/trigger/TriggerPopoverAction.js +46 -15
  68. package/dist/primitives/composer/trigger/TriggerPopoverAction.js.map +1 -1
  69. package/dist/primitives/composer/trigger/TriggerPopoverBack.js +3 -3
  70. package/dist/primitives/composer/trigger/TriggerPopoverBack.js.map +1 -1
  71. package/dist/primitives/composer/trigger/TriggerPopoverCategories.js +4 -4
  72. package/dist/primitives/composer/trigger/TriggerPopoverCategories.js.map +1 -1
  73. package/dist/primitives/composer/trigger/TriggerPopoverDirective.js +40 -10
  74. package/dist/primitives/composer/trigger/TriggerPopoverDirective.js.map +1 -1
  75. package/dist/primitives/composer/trigger/TriggerPopoverItems.js +4 -4
  76. package/dist/primitives/composer/trigger/TriggerPopoverItems.js.map +1 -1
  77. package/dist/primitives/composer/trigger/TriggerPopoverResource.d.ts +2 -0
  78. package/dist/primitives/composer/trigger/TriggerPopoverResource.d.ts.map +1 -1
  79. package/dist/primitives/composer/trigger/TriggerPopoverResource.js +63 -61
  80. package/dist/primitives/composer/trigger/TriggerPopoverResource.js.map +1 -1
  81. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.d.ts +2 -0
  82. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.d.ts.map +1 -1
  83. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.js.map +1 -1
  84. package/dist/primitives/composer/trigger/detectTrigger.d.ts +21 -1
  85. package/dist/primitives/composer/trigger/detectTrigger.d.ts.map +1 -0
  86. package/dist/primitives/composer/trigger/detectTrigger.js +17 -3
  87. package/dist/primitives/composer/trigger/detectTrigger.js.map +1 -1
  88. package/dist/primitives/composer/trigger/index.d.ts +3 -1
  89. package/dist/primitives/composer/trigger/index.d.ts.map +1 -1
  90. package/dist/primitives/composer/trigger/index.js.map +1 -1
  91. package/dist/primitives/composer/trigger/matchesTriggerItemQuery.d.ts +6 -0
  92. package/dist/primitives/composer/trigger/matchesTriggerItemQuery.d.ts.map +1 -0
  93. package/dist/primitives/composer/trigger/matchesTriggerItemQuery.js +9 -0
  94. package/dist/primitives/composer/trigger/matchesTriggerItemQuery.js.map +1 -0
  95. package/dist/primitives/composer/trigger/triggerDetectionResource.d.ts +3 -4
  96. package/dist/primitives/composer/trigger/triggerDetectionResource.d.ts.map +1 -1
  97. package/dist/primitives/composer/trigger/triggerDetectionResource.js +15 -14
  98. package/dist/primitives/composer/trigger/triggerDetectionResource.js.map +1 -1
  99. package/dist/primitives/composer/trigger/triggerNavigationResource.d.ts.map +1 -1
  100. package/dist/primitives/composer/trigger/triggerNavigationResource.js +3 -5
  101. package/dist/primitives/composer/trigger/triggerNavigationResource.js.map +1 -1
  102. package/dist/primitives/composer/trigger/triggerSelectionResource.d.ts.map +1 -1
  103. package/dist/primitives/composer/trigger/triggerSelectionResource.js +18 -19
  104. package/dist/primitives/composer/trigger/triggerSelectionResource.js.map +1 -1
  105. package/dist/primitives/composer.d.ts +3 -2
  106. package/dist/primitives/composer.js.map +1 -1
  107. package/dist/primitives/error/ErrorMessage.js.map +1 -1
  108. package/dist/primitives/message/MessageIf.js.map +1 -1
  109. package/dist/primitives/message/MessageParts.js.map +1 -1
  110. package/dist/primitives/message/MessagePartsGrouped.js.map +1 -1
  111. package/dist/primitives/message/MessageRoot.js +4 -4
  112. package/dist/primitives/message/MessageRoot.js.map +1 -1
  113. package/dist/primitives/messagePart/MessagePartText.d.ts +1 -1
  114. package/dist/primitives/messagePart/MessagePartText.js.map +1 -1
  115. package/dist/primitives/selectionToolbar/SelectionToolbarQuote.js +3 -3
  116. package/dist/primitives/selectionToolbar/SelectionToolbarQuote.js.map +1 -1
  117. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.js +3 -3
  118. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.js.map +1 -1
  119. package/dist/primitives/thread/ThreadIf.js.map +1 -1
  120. package/dist/primitives/thread/ThreadViewport.js +3 -3
  121. package/dist/primitives/thread/ThreadViewport.js.map +1 -1
  122. package/dist/primitives/thread/ThreadViewportFooter.js +3 -3
  123. package/dist/primitives/thread/ThreadViewportFooter.js.map +1 -1
  124. package/dist/primitives/thread/useThreadViewportAutoScroll.d.ts.map +1 -1
  125. package/dist/primitives/thread/useThreadViewportAutoScroll.js +4 -4
  126. package/dist/primitives/thread/useThreadViewportAutoScroll.js.map +1 -1
  127. package/dist/primitives/threadList/ThreadListNew.js +3 -3
  128. package/dist/primitives/threadList/ThreadListNew.js.map +1 -1
  129. package/dist/primitives/threadListFocusGroup.d.ts +2 -1
  130. package/dist/primitives/threadListFocusGroup.d.ts.map +1 -1
  131. package/dist/primitives/threadListFocusGroup.js +2 -2
  132. package/dist/primitives/threadListFocusGroup.js.map +1 -1
  133. package/dist/primitives/threadListItem/ThreadListItemRoot.js +3 -3
  134. package/dist/primitives/threadListItem/ThreadListItemRoot.js.map +1 -1
  135. package/dist/primitives/threadListItem/ThreadListItemTrigger.js +1 -1
  136. package/dist/primitives/threadListItem/ThreadListItemTrigger.js.map +1 -1
  137. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.js +1 -1
  138. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.js.map +1 -1
  139. package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.js.map +1 -1
  140. package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.js +1 -1
  141. package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.js.map +1 -1
  142. package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.js.map +1 -1
  143. package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.js +1 -2
  144. package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.js.map +1 -1
  145. package/dist/primitives/threadListItemMore/scope.d.ts +2 -2
  146. package/dist/primitives/threadListItemMore/scope.d.ts.map +1 -1
  147. package/dist/primitives/threadListItemMore/scope.js.map +1 -1
  148. package/dist/sandbox-host/SandboxHost.d.ts.map +1 -1
  149. package/dist/sandbox-host/SandboxHost.js +148 -72
  150. package/dist/sandbox-host/SandboxHost.js.map +1 -1
  151. package/dist/unstable/useLiveCompletionAdapter.js +3 -1
  152. package/dist/unstable/useLiveCompletionAdapter.js.map +1 -1
  153. package/dist/unstable/useMentionAdapter.d.ts +9 -3
  154. package/dist/unstable/useMentionAdapter.d.ts.map +1 -1
  155. package/dist/unstable/useMentionAdapter.js +50 -43
  156. package/dist/unstable/useMentionAdapter.js.map +1 -1
  157. package/dist/unstable/useModelContextSnapshot.d.ts +34 -0
  158. package/dist/unstable/useModelContextSnapshot.d.ts.map +1 -0
  159. package/dist/unstable/useModelContextSnapshot.js +61 -0
  160. package/dist/unstable/useModelContextSnapshot.js.map +1 -0
  161. package/dist/unstable/useSlashCommandAdapter.d.ts.map +1 -1
  162. package/dist/unstable/useSlashCommandAdapter.js +37 -29
  163. package/dist/unstable/useSlashCommandAdapter.js.map +1 -1
  164. package/dist/unstable/webmcp/WebMcpRegistrationResource.d.ts +14 -0
  165. package/dist/unstable/webmcp/WebMcpRegistrationResource.d.ts.map +1 -0
  166. package/dist/unstable/webmcp/WebMcpRegistrationResource.js +85 -0
  167. package/dist/unstable/webmcp/WebMcpRegistrationResource.js.map +1 -0
  168. package/dist/unstable/webmcp/convertTools.d.ts +21 -0
  169. package/dist/unstable/webmcp/convertTools.d.ts.map +1 -0
  170. package/dist/unstable/webmcp/convertTools.js +110 -0
  171. package/dist/unstable/webmcp/convertTools.js.map +1 -0
  172. package/dist/unstable/webmcp/useWebMcpProvider.d.ts +21 -0
  173. package/dist/unstable/webmcp/useWebMcpProvider.d.ts.map +1 -0
  174. package/dist/unstable/webmcp/useWebMcpProvider.js +105 -0
  175. package/dist/unstable/webmcp/useWebMcpProvider.js.map +1 -0
  176. package/dist/unstable/webmcp/webmcp-host.d.ts +39 -0
  177. package/dist/unstable/webmcp/webmcp-host.d.ts.map +1 -0
  178. package/dist/unstable/webmcp/webmcp-host.js +29 -0
  179. package/dist/unstable/webmcp/webmcp-host.js.map +1 -0
  180. package/dist/utils/Primitive.d.ts +6 -6
  181. package/dist/utils/Primitive.js +2 -2
  182. package/dist/utils/Primitive.js.map +1 -1
  183. package/dist/utils/createActionButton.js +3 -3
  184. package/dist/utils/createActionButton.js.map +1 -1
  185. package/dist/utils/hooks/useOnResizeContent.js +1 -1
  186. package/dist/utils/hooks/useOnResizeContent.js.map +1 -1
  187. package/dist/utils/hooks/useOnScrollToBottom.js +1 -1
  188. package/dist/utils/hooks/useOnScrollToBottom.js.map +1 -1
  189. package/dist/utils/smooth/SmoothContext.d.ts +24 -0
  190. package/dist/utils/smooth/SmoothContext.d.ts.map +1 -1
  191. package/dist/utils/smooth/useSmooth.js +1 -1
  192. package/dist/utils/smooth/useSmooth.js.map +1 -1
  193. package/package.json +14 -22
  194. package/src/index.ts +22 -1
  195. package/src/mcp-apps/McpAppRenderer.test.tsx +386 -9
  196. package/src/mcp-apps/McpAppRenderer.tsx +171 -69
  197. package/src/mcp-apps/McpAppsRemoteHost.concurrent.test.tsx +215 -0
  198. package/src/mcp-apps/McpAppsRemoteHost.ts +28 -12
  199. package/src/mcp-apps/app-frame.test.tsx +349 -0
  200. package/src/mcp-apps/app-frame.tsx +68 -9
  201. package/src/mcp-apps/bridge.ts +7 -2
  202. package/src/mcp-apps/index.ts +6 -1
  203. package/src/model-context/frame/AssistantFrame.test.ts +3 -3
  204. package/src/model-context/frame/SPEC_AssistantFrame.md +1 -1
  205. package/src/model-context/frame/useAssistantFrameHost.ts +2 -2
  206. package/src/model-context/makeAssistantVisible.tsx +1 -1
  207. package/src/primitives/actionBar/ActionBarCopy.tsx +1 -1
  208. package/src/primitives/actionBar/ActionBarExportMarkdown.tsx +1 -1
  209. package/src/primitives/actionBar/ActionBarFeedbackNegative.tsx +1 -1
  210. package/src/primitives/actionBar/ActionBarFeedbackPositive.tsx +1 -1
  211. package/src/primitives/actionBar/ActionBarStopSpeaking.tsx +1 -1
  212. package/src/primitives/actionBarMore/scope.ts +2 -2
  213. package/src/primitives/assistantModal/AssistantModalContent.tsx +1 -1
  214. package/src/primitives/assistantModal/scope.ts +2 -2
  215. package/src/primitives/composer/ComposerAttachmentDropzone.tsx +1 -1
  216. package/src/primitives/composer/ComposerInput.test.tsx +2 -1
  217. package/src/primitives/composer/ComposerInput.tsx +3 -3
  218. package/src/primitives/composer/ComposerInputPluginContext.tsx +0 -10
  219. package/src/primitives/composer/ComposerQuote.tsx +1 -1
  220. package/src/primitives/composer/ComposerRoot.tsx +1 -1
  221. package/src/primitives/composer/trigger/TriggerPopover.tsx +16 -1
  222. package/src/primitives/composer/trigger/TriggerPopoverAction.tsx +4 -2
  223. package/src/primitives/composer/trigger/TriggerPopoverBack.tsx +1 -1
  224. package/src/primitives/composer/trigger/TriggerPopoverBehavior.test.tsx +109 -0
  225. package/src/primitives/composer/trigger/TriggerPopoverCategories.tsx +1 -1
  226. package/src/primitives/composer/trigger/TriggerPopoverDirective.tsx +4 -2
  227. package/src/primitives/composer/trigger/TriggerPopoverItems.tsx +1 -1
  228. package/src/primitives/composer/trigger/TriggerPopoverResource.ts +4 -1
  229. package/src/primitives/composer/trigger/TriggerPopoverRootContext.tsx +2 -0
  230. package/src/primitives/composer/trigger/detectTrigger.test.ts +88 -5
  231. package/src/primitives/composer/trigger/detectTrigger.ts +50 -9
  232. package/src/primitives/composer/trigger/index.ts +1 -0
  233. package/src/primitives/composer/trigger/matchesTriggerItemQuery.test.ts +52 -0
  234. package/src/primitives/composer/trigger/matchesTriggerItemQuery.ts +13 -0
  235. package/src/primitives/composer/trigger/triggerDetectionResource.ts +10 -7
  236. package/src/primitives/composer/trigger/triggerNavigationResource.ts +3 -10
  237. package/src/primitives/composer/trigger/triggerSelectionResource.test.ts +15 -3
  238. package/src/primitives/composer/trigger/triggerSelectionResource.ts +1 -4
  239. package/src/primitives/composer.ts +1 -0
  240. package/src/primitives/message/MessageRoot.tsx +1 -1
  241. package/src/primitives/selectionToolbar/SelectionToolbarQuote.tsx +1 -1
  242. package/src/primitives/selectionToolbar/SelectionToolbarRoot.tsx +1 -1
  243. package/src/primitives/thread/ThreadViewport.tsx +1 -1
  244. package/src/primitives/thread/ThreadViewportFooter.tsx +1 -1
  245. package/src/primitives/thread/useThreadViewportAutoScroll.ts +8 -7
  246. package/src/primitives/threadList/ThreadListNew.tsx +1 -1
  247. package/src/primitives/threadListFocusGroup.ts +2 -2
  248. package/src/primitives/threadListItem/ThreadListItemRoot.tsx +1 -1
  249. package/src/primitives/threadListItem/ThreadListItemTrigger.tsx +1 -1
  250. package/src/primitives/threadListItemMore/ThreadListItemMoreContent.tsx +1 -1
  251. package/src/primitives/threadListItemMore/ThreadListItemMoreRoot.tsx +1 -1
  252. package/src/primitives/threadListItemMore/ThreadListItemMoreTrigger.tsx +2 -2
  253. package/src/primitives/threadListItemMore/scope.ts +2 -2
  254. package/src/sandbox-host/SandboxHost.test.tsx +165 -3
  255. package/src/sandbox-host/SandboxHost.tsx +42 -9
  256. package/src/tests/RemoteThreadListRuntime.adapterProvider.test.tsx +31 -1
  257. package/src/unstable/useComposerInputHistory.test.tsx +2 -1
  258. package/src/unstable/useLiveCompletionAdapter.test.tsx +60 -1
  259. package/src/unstable/useLiveCompletionAdapter.ts +4 -1
  260. package/src/unstable/useMentionAdapter.test.tsx +337 -0
  261. package/src/unstable/useMentionAdapter.ts +94 -57
  262. package/src/unstable/useModelContextSnapshot.test.tsx +132 -0
  263. package/src/unstable/useModelContextSnapshot.ts +67 -0
  264. package/src/unstable/useSlashCommandAdapter.test.tsx +141 -0
  265. package/src/unstable/useSlashCommandAdapter.ts +47 -19
  266. package/src/unstable/webmcp/WebMcpRegistrationResource.ts +92 -0
  267. package/src/unstable/webmcp/__tests__/webmcp.fake.tsx +168 -0
  268. package/src/unstable/webmcp/convertTools.test.ts +393 -0
  269. package/src/unstable/webmcp/convertTools.ts +180 -0
  270. package/src/unstable/webmcp/useWebMcpProvider.test.tsx +466 -0
  271. package/src/unstable/webmcp/useWebMcpProvider.ts +150 -0
  272. package/src/unstable/webmcp/webmcp-host.test.ts +142 -0
  273. package/src/unstable/webmcp/webmcp-host.ts +83 -0
  274. package/src/utils/Primitive.tsx +2 -2
  275. package/src/utils/createActionButton.tsx +1 -1
  276. package/src/utils/hooks/useOnResizeContent.ts +1 -1
  277. package/src/utils/hooks/useOnScrollToBottom.ts +1 -1
  278. package/src/utils/smooth/useSmooth.ts +1 -1
  279. package/dist/legacy-runtime/runtime/MessagePartRuntime.d.ts +0 -3
  280. package/dist/legacy-runtime/runtime/MessagePartRuntime.js +0 -2
  281. package/dist/legacy-runtime/runtime/MessageRuntime.d.ts +0 -3
  282. package/dist/legacy-runtime/runtime/MessageRuntime.js +0 -2
  283. package/dist/legacy-runtime/runtime/ThreadListRuntime.d.ts +0 -3
  284. package/dist/legacy-runtime/runtime/ThreadListRuntime.js +0 -2
  285. package/dist/utils/invokeCallbackSafely.d.ts +0 -5
  286. package/dist/utils/invokeCallbackSafely.d.ts.map +0 -1
  287. package/dist/utils/invokeCallbackSafely.js +0 -15
  288. package/dist/utils/invokeCallbackSafely.js.map +0 -1
  289. package/dist/utils/useToolArgsFieldStatus.d.ts +0 -15
  290. package/dist/utils/useToolArgsFieldStatus.d.ts.map +0 -1
  291. package/dist/utils/useToolArgsFieldStatus.js +0 -23
  292. package/dist/utils/useToolArgsFieldStatus.js.map +0 -1
  293. package/src/legacy-runtime/runtime/MessagePartRuntime.ts +0 -2
  294. package/src/legacy-runtime/runtime/MessageRuntime.ts +0 -3
  295. package/src/legacy-runtime/runtime/ThreadListRuntime.ts +0 -4
  296. package/src/utils/invokeCallbackSafely.ts +0 -11
  297. package/src/utils/useToolArgsFieldStatus.ts +0 -18
@@ -0,0 +1,150 @@
1
+ "use client";
2
+
3
+ import { useEffect, useState, useSyncExternalStore } from "react";
4
+ import { useResources, useTapRoot, withKey } from "@assistant-ui/tap";
5
+ import { useAui, type AssistantClient } from "@assistant-ui/store";
6
+ import type { Tool } from "assistant-stream";
7
+ import { getDefaultWebMcpHost, type WebMcpHost } from "./webmcp-host";
8
+ import { defaultWebMcpFilter, toWebMcpInputSchema } from "./convertTools";
9
+ import { WebMcpRegistrationResource } from "./WebMcpRegistrationResource";
10
+ import {
11
+ useModelContextSnapshot,
12
+ type ModelContextSnapshotSource,
13
+ } from "../useModelContextSnapshot";
14
+
15
+ export type Unstable_WebMcpProviderOptions = {
16
+ filter?: (name: string, tool: Tool<any, any>) => boolean;
17
+ };
18
+
19
+ export type Unstable_WebMcpProviderResult = {
20
+ status: "unsupported" | "active";
21
+ registeredToolNames: readonly string[];
22
+ };
23
+
24
+ const EMPTY_NAMES: readonly string[] = Object.freeze([]);
25
+ const EMPTY_TOOLS: Record<string, Tool<any, any>> = Object.freeze({});
26
+
27
+ // The description is re-read on every sync so mutating it in place is
28
+ // observed; the schema is converted only when the tool object itself changes.
29
+ // Keyed on the tool so a schema or filter that throws warns once instead of
30
+ // on every model-context notify.
31
+ const warned = new WeakSet<Tool<any, any>>();
32
+
33
+ const signatures = new WeakMap<
34
+ Tool<any, any>,
35
+ { description: string | undefined; signature: string }
36
+ >();
37
+
38
+ const signatureOf = (tool: Tool<any, any>) => {
39
+ const cached = signatures.get(tool);
40
+ if (cached && cached.description === tool.description)
41
+ return cached.signature;
42
+ const signature = `${tool.description ?? ""}\u0000${JSON.stringify(
43
+ toWebMcpInputSchema(tool),
44
+ )}`;
45
+ signatures.set(tool, { description: tool.description, signature });
46
+ return signature;
47
+ };
48
+
49
+ const NO_SUBSCRIPTION = () => {};
50
+
51
+ // No `isEqual`: a caller republishing an unchanged tool set is how it asks for
52
+ // a re-sync, which is what re-attempts a tool whose filter has stopped throwing
53
+ // and what picks up a description edited in place on a stable tool object.
54
+ const modelContextToolSource: ModelContextSnapshotSource<
55
+ Record<string, Tool<any, any>>
56
+ > = {
57
+ empty: EMPTY_TOOLS,
58
+ read: (aui) => aui.modelContext.getModelContext().tools ?? EMPTY_TOOLS,
59
+ subscribe: (aui, onChange) =>
60
+ aui.modelContext.subscribe?.(onChange) ?? NO_SUBSCRIPTION,
61
+ };
62
+
63
+ const useStableNames = (names: readonly (string | null)[]) => {
64
+ const [cell] = useState(() => ({ names: EMPTY_NAMES }));
65
+ const next = names.filter((name): name is string => name !== null).sort();
66
+ const previous = cell.names;
67
+ if (
68
+ previous.length === next.length &&
69
+ previous.every((name, index) => name === next[index])
70
+ ) {
71
+ return previous;
72
+ }
73
+ cell.names = next;
74
+ return next;
75
+ };
76
+
77
+ const useWebMcpRegistry = ({
78
+ aui,
79
+ host,
80
+ filter,
81
+ }: {
82
+ aui: AssistantClient;
83
+ host: WebMcpHost;
84
+ filter: (name: string, tool: Tool<any, any>) => boolean;
85
+ }) => {
86
+ const tools = useModelContextSnapshot(
87
+ aui,
88
+ host.available,
89
+ modelContextToolSource,
90
+ );
91
+
92
+ const elements = [];
93
+ for (const [name, tool] of Object.entries(tools)) {
94
+ try {
95
+ if (!filter(name, tool)) continue;
96
+ const signature = signatureOf(tool);
97
+ elements.push(
98
+ withKey(
99
+ name,
100
+ WebMcpRegistrationResource({ host, name, signature, tool }),
101
+ [host, name, signature, tool],
102
+ ),
103
+ );
104
+ } catch (error) {
105
+ if (warned.has(tool)) continue;
106
+ warned.add(tool);
107
+ console.warn(
108
+ `[assistant-ui] Skipping WebMCP registration for tool "${name}": filter or schema conversion failed.`,
109
+ error,
110
+ );
111
+ }
112
+ }
113
+
114
+ return useStableNames(useResources(elements));
115
+ };
116
+
117
+ /**
118
+ * Publishes the frontend tools in the model context to a WebMCP-capable
119
+ * browser, so the user's own browser agent can call them.
120
+ *
121
+ * Returns `status: "unsupported"` when the page exposes no
122
+ * `document.modelContext` (or `navigator.modelContext`), and the sorted names
123
+ * of the tools currently registered with the host.
124
+ */
125
+ export const unstable_useWebMcpProvider = (
126
+ options: Unstable_WebMcpProviderOptions = {},
127
+ ): Unstable_WebMcpProviderResult => {
128
+ const aui = useAui();
129
+ const [host] = useState(getDefaultWebMcpHost);
130
+ const filter = options.filter ?? defaultWebMcpFilter;
131
+
132
+ const root = useTapRoot(function WebMcpProviderRoot() {
133
+ return useWebMcpRegistry({ aui, host, filter });
134
+ });
135
+ const registeredToolNames = useSyncExternalStore(
136
+ root.subscribe,
137
+ root.getValue,
138
+ () => EMPTY_NAMES,
139
+ );
140
+
141
+ const [published, setPublished] = useState(false);
142
+ useEffect(() => {
143
+ if (host.available) setPublished(true);
144
+ }, [host]);
145
+
146
+ return {
147
+ status: published ? "active" : "unsupported",
148
+ registeredToolNames,
149
+ };
150
+ };
@@ -0,0 +1,142 @@
1
+ // @vitest-environment jsdom
2
+ import { afterEach, describe, expect, it, vi } from "vitest";
3
+ import {
4
+ getDefaultWebMcpHost,
5
+ type WebMcpModelContext,
6
+ type WebMcpToolDescriptor,
7
+ } from "./webmcp-host";
8
+
9
+ type Host = { modelContext?: WebMcpModelContext };
10
+
11
+ const descriptor: WebMcpToolDescriptor = {
12
+ name: "get_weather",
13
+ description: "",
14
+ inputSchema: {},
15
+ execute: async () => ({ content: [] }),
16
+ };
17
+
18
+ const install = (
19
+ context: Partial<WebMcpModelContext>,
20
+ on: "document" | "navigator" = "document",
21
+ ) => {
22
+ const host = (on === "document" ? document : navigator) as Host;
23
+ host.modelContext = context as WebMcpModelContext;
24
+ return context;
25
+ };
26
+
27
+ afterEach(() => {
28
+ delete (document as Host).modelContext;
29
+ delete (navigator as Host).modelContext;
30
+ });
31
+
32
+ describe("getDefaultWebMcpHost", () => {
33
+ it("reports unavailable when the page exposes no model context", () => {
34
+ const host = getDefaultWebMcpHost();
35
+ expect(host.available).toBe(false);
36
+ expect(() => host.registerTool(descriptor)()).not.toThrow();
37
+ });
38
+
39
+ it("reports unavailable and warns when the platform property has no registerTool", () => {
40
+ const warn = vi.spyOn(console, "warn").mockImplementation(() => {});
41
+ try {
42
+ install({} as Partial<WebMcpModelContext>);
43
+ const host = getDefaultWebMcpHost();
44
+ expect(host.available).toBe(false);
45
+ expect(() => host.registerTool(descriptor)()).not.toThrow();
46
+ expect(warn).toHaveBeenCalledWith(
47
+ expect.stringContaining("no callable registerTool"),
48
+ );
49
+ } finally {
50
+ warn.mockRestore();
51
+ }
52
+ });
53
+
54
+ it("falls back to navigator.modelContext, preferring document when both exist", () => {
55
+ const fromNavigator = vi.fn();
56
+ install({ registerTool: fromNavigator }, "navigator");
57
+ expect(getDefaultWebMcpHost().available).toBe(true);
58
+ getDefaultWebMcpHost().registerTool(descriptor);
59
+ expect(fromNavigator).toHaveBeenCalledOnce();
60
+
61
+ const fromDocument = vi.fn();
62
+ install({ registerTool: fromDocument });
63
+ getDefaultWebMcpHost().registerTool(descriptor);
64
+ expect(fromDocument).toHaveBeenCalledOnce();
65
+ expect(fromNavigator).toHaveBeenCalledOnce();
66
+ });
67
+
68
+ it("registers with an abort signal and aborts it on dispose", () => {
69
+ const registerTool = vi.fn();
70
+ install({ registerTool });
71
+
72
+ const dispose = getDefaultWebMcpHost().registerTool(descriptor);
73
+ const options = registerTool.mock.calls[0]![1];
74
+ expect(registerTool).toHaveBeenCalledWith(descriptor, expect.anything());
75
+ expect(options.signal.aborted).toBe(false);
76
+
77
+ dispose();
78
+ expect(options.signal.aborted).toBe(true);
79
+ expect(() => dispose()).not.toThrow();
80
+ });
81
+
82
+ it("reports a rejected registration to the caller", async () => {
83
+ install({
84
+ registerTool: () => Promise.reject(new Error("already registered")),
85
+ });
86
+
87
+ const onError = vi.fn();
88
+ getDefaultWebMcpHost().registerTool(descriptor, onError);
89
+ await vi.waitFor(() => expect(onError).toHaveBeenCalledOnce());
90
+ expect(onError.mock.calls[0]![0]).toBeInstanceOf(Error);
91
+ });
92
+
93
+ it("aborts the signal even when the registration was rejected", async () => {
94
+ let options: { signal?: AbortSignal } | undefined;
95
+ install({
96
+ registerTool: (_def, registerOptions) => {
97
+ options = registerOptions;
98
+ return Promise.reject(new Error("already registered"));
99
+ },
100
+ });
101
+
102
+ const onError = vi.fn();
103
+ const dispose = getDefaultWebMcpHost().registerTool(descriptor, onError);
104
+ await vi.waitFor(() => expect(onError).toHaveBeenCalledOnce());
105
+
106
+ dispose();
107
+ expect(options?.signal?.aborted).toBe(true);
108
+ });
109
+
110
+ it("lets a synchronous registration failure propagate", () => {
111
+ install({
112
+ registerTool: () => {
113
+ throw new Error("already registered");
114
+ },
115
+ });
116
+
117
+ expect(() => getDefaultWebMcpHost().registerTool(descriptor)).toThrow(
118
+ "already registered",
119
+ );
120
+ });
121
+
122
+ it("survives a registration that returns a bare thenable", () => {
123
+ install({
124
+ registerTool: () =>
125
+ ({
126
+ then: (resolve: () => void) => resolve(),
127
+ }) as unknown as Promise<void>,
128
+ });
129
+
130
+ const dispose = getDefaultWebMcpHost().registerTool(descriptor);
131
+ expect(() => dispose()).not.toThrow();
132
+ });
133
+
134
+ it("survives a registration that returns nothing", () => {
135
+ const registerTool = vi.fn();
136
+ install({ registerTool });
137
+
138
+ const dispose = getDefaultWebMcpHost().registerTool(descriptor);
139
+ dispose();
140
+ expect(registerTool.mock.calls[0]![1].signal.aborted).toBe(true);
141
+ });
142
+ });
@@ -0,0 +1,83 @@
1
+ export type WebMcpContent =
2
+ | { type: "text"; text: string }
3
+ | { type: "image"; data: string; mimeType: string };
4
+
5
+ export type WebMcpCallToolResult = {
6
+ content: WebMcpContent[];
7
+ isError?: boolean;
8
+ };
9
+
10
+ export type WebMcpToolDescriptor = {
11
+ name: string;
12
+ description: string;
13
+ inputSchema: unknown;
14
+ execute: (
15
+ args: unknown,
16
+ context?: { signal?: AbortSignal },
17
+ ) => Promise<WebMcpCallToolResult>;
18
+ };
19
+
20
+ export type WebMcpModelContext = {
21
+ /**
22
+ * Aborting `options.signal` is what unregisters the tool. The explainer
23
+ * defines no other removal method, and a name-keyed one could not be used
24
+ * safely: a later registration may already hold the name.
25
+ */
26
+ registerTool(
27
+ tool: WebMcpToolDescriptor,
28
+ options?: { signal?: AbortSignal },
29
+ ): Promise<void> | void;
30
+ };
31
+
32
+ export type WebMcpHost = {
33
+ available: boolean;
34
+ registerTool(
35
+ def: WebMcpToolDescriptor,
36
+ onError?: (error: unknown) => void,
37
+ ): () => void;
38
+ };
39
+
40
+ type ModelContextHost = { modelContext?: WebMcpModelContext } | undefined;
41
+
42
+ const isThenable = (value: unknown): value is Promise<unknown> =>
43
+ typeof (value as { then?: unknown } | null | undefined)?.then === "function";
44
+
45
+ // The explainer puts modelContext on document; navigator is tolerated for
46
+ // older drafts and extensions that still inject it there.
47
+ const resolveModelContext = (): WebMcpModelContext | undefined => {
48
+ const context =
49
+ (globalThis.document as ModelContextHost)?.modelContext ??
50
+ (globalThis.navigator as ModelContextHost)?.modelContext;
51
+ if (!context) return undefined;
52
+ if (typeof context.registerTool === "function") return context;
53
+ console.warn(
54
+ "[assistant-ui] Ignoring a modelContext with no callable registerTool; WebMCP reports unsupported.",
55
+ );
56
+ return undefined;
57
+ };
58
+
59
+ const createHost = (context: WebMcpModelContext): WebMcpHost => ({
60
+ available: true,
61
+ registerTool: (def, onError) => {
62
+ const controller = new AbortController();
63
+ const handle = context.registerTool(def, { signal: controller.signal });
64
+ if (isThenable(handle)) {
65
+ handle.then(
66
+ () => {},
67
+ (error) => onError?.(error),
68
+ );
69
+ }
70
+ return () => controller.abort();
71
+ },
72
+ });
73
+
74
+ export const getDefaultWebMcpHost = (): WebMcpHost => {
75
+ const context = resolveModelContext();
76
+ if (!context) {
77
+ return {
78
+ available: false,
79
+ registerTool: () => () => {},
80
+ };
81
+ }
82
+ return createHost(context);
83
+ };
@@ -11,10 +11,10 @@ import {
11
11
  forwardRef,
12
12
  isValidElement,
13
13
  } from "react";
14
- import { Primitive as RadixPrimitive } from "@radix-ui/react-primitive";
14
+ import { Primitive as RadixPrimitive } from "radix-ui/internal";
15
15
 
16
16
  /**
17
- * Thin wrapper around `@radix-ui/react-primitive` that adds `render` prop support.
17
+ * Thin wrapper around Radix `Primitive` that adds `render` prop support.
18
18
  *
19
19
  * When `render` is provided, it is converted to the equivalent `asChild` pattern:
20
20
  * render={<Comp props />} + children → asChild + <Comp props>{children}</Comp>
@@ -5,7 +5,7 @@ import {
5
5
  type MouseEventHandler,
6
6
  } from "react";
7
7
  import { Primitive } from "./Primitive";
8
- import { composeEventHandlers } from "@radix-ui/primitive";
8
+ import { composeEventHandlers } from "radix-ui/internal";
9
9
 
10
10
  type ActionButtonCallback<TProps> = (
11
11
  props: TProps,
@@ -1,4 +1,4 @@
1
- import { useCallbackRef } from "@radix-ui/react-use-callback-ref";
1
+ import { useCallbackRef } from "radix-ui/internal";
2
2
  import { useCallback } from "react";
3
3
  import { useManagedRef } from "./useManagedRef";
4
4
 
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { useCallbackRef } from "@radix-ui/react-use-callback-ref";
3
+ import { useCallbackRef } from "radix-ui/internal";
4
4
  import { useEffect } from "react";
5
5
  import { useThreadViewport } from "../../context/react/ThreadViewportContext";
6
6
 
@@ -8,7 +8,7 @@ import type {
8
8
  TextMessagePart,
9
9
  MessagePartState,
10
10
  } from "@assistant-ui/core";
11
- import { useCallbackRef } from "@radix-ui/react-use-callback-ref";
11
+ import { useCallbackRef } from "radix-ui/internal";
12
12
  import { useMediaQuery } from "../hooks/useMediaQuery";
13
13
  import { useSmoothStatusStore } from "./SmoothContext";
14
14
  import { writableStore } from "../../context/ReadonlyStore";
@@ -1,3 +0,0 @@
1
- import { MessagePartRuntime, MessagePartState } from "@assistant-ui/core";
2
- import { MessagePartRuntimeImpl } from "@assistant-ui/core/internal";
3
- export { type MessagePartRuntime, MessagePartRuntimeImpl, type MessagePartState };
@@ -1,2 +0,0 @@
1
- import { MessagePartRuntimeImpl } from "@assistant-ui/core/internal";
2
- export { MessagePartRuntimeImpl };
@@ -1,3 +0,0 @@
1
- import { MessageRuntime, MessageState } from "@assistant-ui/core";
2
- import { MessageRuntimeImpl, MessageStateBinding } from "@assistant-ui/core/internal";
3
- export { type MessageRuntime, MessageRuntimeImpl, type MessageState, type MessageStateBinding };
@@ -1,2 +0,0 @@
1
- import { MessageRuntimeImpl } from "@assistant-ui/core/internal";
2
- export { MessageRuntimeImpl };
@@ -1,3 +0,0 @@
1
- import { ThreadListRuntime, ThreadListState } from "@assistant-ui/core";
2
- import { ThreadListRuntimeCoreBinding, ThreadListRuntimeImpl } from "@assistant-ui/core/internal";
3
- export { type ThreadListRuntime, type ThreadListRuntimeCoreBinding, ThreadListRuntimeImpl, type ThreadListState };
@@ -1,2 +0,0 @@
1
- import { ThreadListRuntimeImpl } from "@assistant-ui/core/internal";
2
- export { ThreadListRuntimeImpl };
@@ -1,5 +0,0 @@
1
- //#region src/utils/invokeCallbackSafely.d.ts
2
- declare const invokeCallbackSafely: (invoke: () => unknown, name: string) => void;
3
- //#endregion
4
- export { invokeCallbackSafely };
5
- //# sourceMappingURL=invokeCallbackSafely.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"invokeCallbackSafely.d.ts","names":[],"sources":["../../src/utils/invokeCallbackSafely.ts"],"mappings":";cAAa,uBAAwB,uBAAuB"}
@@ -1,15 +0,0 @@
1
- //#region src/utils/invokeCallbackSafely.ts
2
- const invokeCallbackSafely = (invoke, name) => {
3
- const reportFailure = (error) => {
4
- console.error(`[assistant-ui] ${name} callback threw an error`, error);
5
- };
6
- try {
7
- Promise.resolve(invoke()).catch(reportFailure);
8
- } catch (error) {
9
- reportFailure(error);
10
- }
11
- };
12
- //#endregion
13
- export { invokeCallbackSafely };
14
-
15
- //# sourceMappingURL=invokeCallbackSafely.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"invokeCallbackSafely.js","names":["invokeCallbackSafely","invoke","name","reportFailure","error","console","Promise","resolve","catch"],"sources":["../../src/utils/invokeCallbackSafely.ts"],"sourcesContent":["export const invokeCallbackSafely = (invoke: () => unknown, name: string) => {\n const reportFailure = (error: unknown) => {\n console.error(`[assistant-ui] ${name} callback threw an error`, error);\n };\n\n try {\n void Promise.resolve(invoke()).catch(reportFailure);\n } catch (error) {\n reportFailure(error);\n }\n};\n"],"mappings":";AAAA,MAAaA,wBAAwBC,QAAuBC,SAAiB;CAC3E,MAAMC,iBAAiBC,UAAmB;EACxCC,QAAQD,MAAM,kBAAkBF,KAAI,2BAA4BE,KAAK;CACvE;CAEA,IAAI;EACF,QAAaG,QAAQN,OAAO,CAAC,CAAC,CAACO,MAAML,aAAa;CACpD,SAASC,OAAO;EACdD,cAAcC,KAAK;CACrB;AACF"}
@@ -1,15 +0,0 @@
1
- //#region src/utils/useToolArgsFieldStatus.d.ts
2
- declare const useToolArgsFieldStatus: (fieldPath: (string | number)[]) => {
3
- readonly type: "running";
4
- } | {
5
- readonly type: "complete";
6
- } | {
7
- readonly type: "incomplete";
8
- readonly reason: "cancelled" | "length" | "content-filter" | "other" | "error";
9
- readonly error?: unknown;
10
- } | {
11
- type: string;
12
- };
13
- //#endregion
14
- export { useToolArgsFieldStatus };
15
- //# sourceMappingURL=useToolArgsFieldStatus.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useToolArgsFieldStatus.d.ts","names":[],"sources":["../../src/utils/useToolArgsFieldStatus.ts"],"mappings":";cAKa,yBAA0B"}
@@ -1,23 +0,0 @@
1
- import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
2
- import { useAuiState } from "@assistant-ui/store";
3
- import { getPartialJsonObjectFieldState } from "assistant-stream/utils";
4
- //#region src/utils/useToolArgsFieldStatus.ts
5
- const COMPLETE_STATUS = { type: "complete" };
6
- const useToolArgsFieldStatus = (fieldPath) => {
7
- const $ = c(2);
8
- let t0;
9
- if ($[0] !== fieldPath) {
10
- t0 = (s) => {
11
- if (s.part.type !== "tool-call") throw new Error("useToolArgsFieldStatus can only be used inside tool-call message parts");
12
- if (getPartialJsonObjectFieldState(s.part.args, fieldPath) === "complete" || s.part.status?.type === "requires-action") return COMPLETE_STATUS;
13
- return s.part.status;
14
- };
15
- $[0] = fieldPath;
16
- $[1] = t0;
17
- } else t0 = $[1];
18
- return useAuiState(t0);
19
- };
20
- //#endregion
21
- export { useToolArgsFieldStatus };
22
-
23
- //# sourceMappingURL=useToolArgsFieldStatus.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useToolArgsFieldStatus.js","names":["getPartialJsonObjectFieldState","useAuiState","COMPLETE_STATUS","type","useToolArgsFieldStatus","fieldPath","$","_c","t0","s","part","Error","state","args","status"],"sources":["../../src/utils/useToolArgsFieldStatus.ts"],"sourcesContent":["import { getPartialJsonObjectFieldState } from \"assistant-stream/utils\";\nimport { useAuiState } from \"@assistant-ui/store\";\n\nconst COMPLETE_STATUS = { type: \"complete\" };\n\nexport const useToolArgsFieldStatus = (fieldPath: (string | number)[]) => {\n return useAuiState((s) => {\n if (s.part.type !== \"tool-call\")\n throw new Error(\n \"useToolArgsFieldStatus can only be used inside tool-call message parts\",\n );\n\n const state = getPartialJsonObjectFieldState(s.part.args, fieldPath);\n if (state === \"complete\" || s.part.status?.type === \"requires-action\")\n return COMPLETE_STATUS;\n return s.part.status;\n });\n};\n"],"mappings":";;;;AAGA,MAAME,kBAAkB,EAAEC,MAAM,WAAW;AAE3C,MAAaC,0BAAyBC,cAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAA,IAAAC;CAAA,IAAAF,EAAA,OAAAD,WAAA;EACjBG,MAAAC,MAAA;GACjB,IAAIA,EAACC,KAAKP,SAAU,aAClB,MAAM,IAAIQ,MACR,wEACF;GAGF,IADcX,+BAA+BS,EAACC,KAAKG,MAAOR,SACtDO,MAAU,cAAcH,EAACC,KAAKI,QAAaX,SAAK,mBAAiB,OAC5DD;GAAgB,OAClBO,EAACC,KAAKI;EAAO;EACrBR,EAAA,KAAAD;EAAAC,EAAA,KAAAE;CAAA,OAAAA,KAAAF,EAAA;CAAA,OAVML,YAAYO,EAUlB;AAAC"}
@@ -1,2 +0,0 @@
1
- export type { MessagePartState, MessagePartRuntime } from "@assistant-ui/core";
2
- export { MessagePartRuntimeImpl } from "@assistant-ui/core/internal";
@@ -1,3 +0,0 @@
1
- export type { MessageState, MessageRuntime } from "@assistant-ui/core";
2
- export type { MessageStateBinding } from "@assistant-ui/core/internal";
3
- export { MessageRuntimeImpl } from "@assistant-ui/core/internal";
@@ -1,4 +0,0 @@
1
- export type { ThreadListState, ThreadListRuntime } from "@assistant-ui/core";
2
-
3
- export type { ThreadListRuntimeCoreBinding } from "@assistant-ui/core/internal";
4
- export { ThreadListRuntimeImpl } from "@assistant-ui/core/internal";
@@ -1,11 +0,0 @@
1
- export const invokeCallbackSafely = (invoke: () => unknown, name: string) => {
2
- const reportFailure = (error: unknown) => {
3
- console.error(`[assistant-ui] ${name} callback threw an error`, error);
4
- };
5
-
6
- try {
7
- void Promise.resolve(invoke()).catch(reportFailure);
8
- } catch (error) {
9
- reportFailure(error);
10
- }
11
- };
@@ -1,18 +0,0 @@
1
- import { getPartialJsonObjectFieldState } from "assistant-stream/utils";
2
- import { useAuiState } from "@assistant-ui/store";
3
-
4
- const COMPLETE_STATUS = { type: "complete" };
5
-
6
- export const useToolArgsFieldStatus = (fieldPath: (string | number)[]) => {
7
- return useAuiState((s) => {
8
- if (s.part.type !== "tool-call")
9
- throw new Error(
10
- "useToolArgsFieldStatus can only be used inside tool-call message parts",
11
- );
12
-
13
- const state = getPartialJsonObjectFieldState(s.part.args, fieldPath);
14
- if (state === "complete" || s.part.status?.type === "requires-action")
15
- return COMPLETE_STATUS;
16
- return s.part.status;
17
- });
18
- };