@copilotkit/vue 2.0.0-rc.1 → 2.0.0-rc.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (317) hide show
  1. package/PARITY.md +13 -12
  2. package/README.md +1 -2
  3. package/dist/components/copilot-provider/CopilotKit.vue.d.ts +3 -1
  4. package/dist/components/copilot-provider/CopilotKit.vue.d.ts.map +1 -1
  5. package/dist/hooks/use-copilot-action.d.ts.map +1 -1
  6. package/dist/hooks/use-frontend-tool.d.ts +1 -1
  7. package/dist/hooks/use-frontend-tool.d.ts.map +1 -1
  8. package/dist/hooks/zod-parameters.d.ts +14 -0
  9. package/dist/hooks/zod-parameters.d.ts.map +1 -0
  10. package/dist/index.cjs +1 -76
  11. package/dist/index.cjs.map +1 -1
  12. package/dist/index.mjs +384 -14275
  13. package/dist/index.mjs.map +1 -1
  14. package/dist/use-render-activity-message-2np7y4Qt.cjs +92 -0
  15. package/dist/use-render-activity-message-2np7y4Qt.cjs.map +1 -0
  16. package/dist/use-render-activity-message-D59E9t0x.js +18097 -0
  17. package/dist/use-render-activity-message-D59E9t0x.js.map +1 -0
  18. package/dist/v2/components/A2UIMessageRenderer.d.ts +7 -0
  19. package/dist/v2/components/A2UIMessageRenderer.d.ts.map +1 -1
  20. package/dist/v2/components/A2UISurfaceActivityRenderer.vue.d.ts.map +1 -1
  21. package/dist/v2/components/LicenseWarningBanner.vue.d.ts.map +1 -1
  22. package/dist/v2/components/OpenGenerativeUIRenderer.d.ts +13 -45
  23. package/dist/v2/components/OpenGenerativeUIRenderer.d.ts.map +1 -1
  24. package/dist/v2/components/a2ui/A2UIBuiltInToolCallRenderer.d.ts +11 -2
  25. package/dist/v2/components/a2ui/A2UIBuiltInToolCallRenderer.d.ts.map +1 -1
  26. package/dist/v2/components/a2ui/A2UICatalogContext.d.ts +1 -1
  27. package/dist/v2/components/a2ui/A2UICatalogContext.d.ts.map +1 -1
  28. package/dist/v2/components/a2ui/A2UIRecoveryStates.d.ts +144 -0
  29. package/dist/v2/components/a2ui/A2UIRecoveryStates.d.ts.map +1 -0
  30. package/dist/v2/components/a2ui.d.ts +3 -7
  31. package/dist/v2/components/a2ui.d.ts.map +1 -1
  32. package/dist/v2/components/chat/CopilotChat.vue.d.ts +1 -0
  33. package/dist/v2/components/chat/CopilotChat.vue.d.ts.map +1 -1
  34. package/dist/v2/components/chat/CopilotChatAssistantMessage.vue.d.ts +3 -1
  35. package/dist/v2/components/chat/CopilotChatAssistantMessage.vue.d.ts.map +1 -1
  36. package/dist/v2/components/chat/CopilotChatAssistantToolbarButton.vue.d.ts +16 -0
  37. package/dist/v2/components/chat/CopilotChatAssistantToolbarButton.vue.d.ts.map +1 -0
  38. package/dist/v2/components/chat/CopilotChatAttachmentQueue.vue.d.ts.map +1 -1
  39. package/dist/v2/components/chat/CopilotChatAttachmentRenderer.vue.d.ts.map +1 -1
  40. package/dist/v2/components/chat/CopilotChatAudioRecorder.vue.d.ts.map +1 -1
  41. package/dist/v2/components/chat/CopilotChatFeedbackCommentPopover.vue.d.ts +22 -0
  42. package/dist/v2/components/chat/CopilotChatFeedbackCommentPopover.vue.d.ts.map +1 -0
  43. package/dist/v2/components/chat/CopilotChatInput.vue.d.ts +21 -232
  44. package/dist/v2/components/chat/CopilotChatInput.vue.d.ts.map +1 -1
  45. package/dist/v2/components/chat/CopilotChatInspectorButton.vue.d.ts +12 -0
  46. package/dist/v2/components/chat/CopilotChatInspectorButton.vue.d.ts.map +1 -0
  47. package/dist/v2/components/chat/CopilotChatLightbox.vue.d.ts +22 -0
  48. package/dist/v2/components/chat/CopilotChatLightbox.vue.d.ts.map +1 -0
  49. package/dist/v2/components/chat/CopilotChatMessageView.vue.d.ts +20 -0
  50. package/dist/v2/components/chat/CopilotChatMessageView.vue.d.ts.map +1 -1
  51. package/dist/v2/components/chat/CopilotChatReasoningMessage.vue.d.ts.map +1 -1
  52. package/dist/v2/components/chat/CopilotChatSuggestionPill.vue.d.ts.map +1 -1
  53. package/dist/v2/components/chat/CopilotChatSuggestionView.vue.d.ts.map +1 -1
  54. package/dist/v2/components/chat/CopilotChatToggleButton.vue.d.ts.map +1 -1
  55. package/dist/v2/components/chat/CopilotChatToolCallGroup.vue.d.ts +32 -0
  56. package/dist/v2/components/chat/CopilotChatToolCallGroup.vue.d.ts.map +1 -0
  57. package/dist/v2/components/chat/CopilotChatToolCallItem.vue.d.ts.map +1 -1
  58. package/dist/v2/components/chat/CopilotChatToolCallsView.vue.d.ts +11 -1
  59. package/dist/v2/components/chat/CopilotChatToolCallsView.vue.d.ts.map +1 -1
  60. package/dist/v2/components/chat/CopilotChatUserMessage.vue.d.ts.map +1 -1
  61. package/dist/v2/components/chat/CopilotChatView.vue.d.ts +1 -0
  62. package/dist/v2/components/chat/CopilotChatView.vue.d.ts.map +1 -1
  63. package/dist/v2/components/chat/CopilotChatWorkSummary.vue.d.ts +5 -0
  64. package/dist/v2/components/chat/CopilotChatWorkSummary.vue.d.ts.map +1 -0
  65. package/dist/v2/components/chat/CopilotModalHeader.vue.d.ts.map +1 -1
  66. package/dist/v2/components/chat/CopilotModalHeaderCloseButton.d.ts.map +1 -1
  67. package/dist/v2/components/chat/CopilotModalHeaderTitle.d.ts.map +1 -1
  68. package/dist/v2/components/chat/CopilotPopup.vue.d.ts +1 -0
  69. package/dist/v2/components/chat/CopilotPopup.vue.d.ts.map +1 -1
  70. package/dist/v2/components/chat/CopilotPopupView.vue.d.ts +1 -0
  71. package/dist/v2/components/chat/CopilotPopupView.vue.d.ts.map +1 -1
  72. package/dist/v2/components/chat/CopilotPopupViewInternal.vue.d.ts +1 -0
  73. package/dist/v2/components/chat/CopilotPopupViewInternal.vue.d.ts.map +1 -1
  74. package/dist/v2/components/chat/CopilotPopupWelcomeScreen.vue.d.ts.map +1 -1
  75. package/dist/v2/components/chat/CopilotSidebar.vue.d.ts +2 -0
  76. package/dist/v2/components/chat/CopilotSidebar.vue.d.ts.map +1 -1
  77. package/dist/v2/components/chat/CopilotSidebarView.vue.d.ts +2 -0
  78. package/dist/v2/components/chat/CopilotSidebarView.vue.d.ts.map +1 -1
  79. package/dist/v2/components/chat/CopilotSidebarViewInternal.vue.d.ts +2 -0
  80. package/dist/v2/components/chat/CopilotSidebarViewInternal.vue.d.ts.map +1 -1
  81. package/dist/v2/components/chat/CopilotSidebarWelcomeScreen.vue.d.ts.map +1 -1
  82. package/dist/v2/components/chat/StreamingMarkdownDefault.vue.d.ts.map +1 -1
  83. package/dist/v2/components/chat/copilotChatToolCallItemRender.d.ts +0 -1
  84. package/dist/v2/components/chat/copilotChatToolCallItemRender.d.ts.map +1 -1
  85. package/dist/v2/components/chat/index.d.ts +17 -1
  86. package/dist/v2/components/chat/index.d.ts.map +1 -1
  87. package/dist/v2/components/chat/inspector-shortcuts.d.ts +12 -0
  88. package/dist/v2/components/chat/inspector-shortcuts.d.ts.map +1 -0
  89. package/dist/v2/components/chat/message-feedback.d.ts +89 -0
  90. package/dist/v2/components/chat/message-feedback.d.ts.map +1 -0
  91. package/dist/v2/components/chat/tool-call-capture.d.ts +39 -0
  92. package/dist/v2/components/chat/tool-call-capture.d.ts.map +1 -0
  93. package/dist/v2/components/chat/tool-call-display-context.d.ts +22 -0
  94. package/dist/v2/components/chat/tool-call-display-context.d.ts.map +1 -0
  95. package/dist/v2/components/chat/tool-call-group-parts.d.ts +131 -0
  96. package/dist/v2/components/chat/tool-call-group-parts.d.ts.map +1 -0
  97. package/dist/v2/components/chat/turn-work.d.ts +33 -0
  98. package/dist/v2/components/chat/turn-work.d.ts.map +1 -0
  99. package/dist/v2/components/chat/types.d.ts +104 -5
  100. package/dist/v2/components/chat/types.d.ts.map +1 -1
  101. package/dist/v2/components/chat/use-chat-labels.d.ts +8 -0
  102. package/dist/v2/components/chat/use-chat-labels.d.ts.map +1 -0
  103. package/dist/v2/components/chat/use-lightbox.d.ts +18 -0
  104. package/dist/v2/components/chat/use-lightbox.d.ts.map +1 -0
  105. package/dist/v2/components/icons/index.d.ts +968 -1
  106. package/dist/v2/components/icons/index.d.ts.map +1 -1
  107. package/dist/v2/components/ui/CopilotDropdownMenuContent.vue.d.ts +55 -0
  108. package/dist/v2/components/ui/CopilotDropdownMenuContent.vue.d.ts.map +1 -0
  109. package/dist/v2/components/ui/CopilotPopover.vue.d.ts +40 -0
  110. package/dist/v2/components/ui/CopilotPopover.vue.d.ts.map +1 -0
  111. package/dist/v2/components/ui/CopilotTooltip.vue.d.ts +37 -0
  112. package/dist/v2/components/ui/CopilotTooltip.vue.d.ts.map +1 -0
  113. package/dist/v2/components/ui/dropdown-menu.d.ts +14 -0
  114. package/dist/v2/components/ui/dropdown-menu.d.ts.map +1 -0
  115. package/dist/v2/components/ui/floating.d.ts +84 -0
  116. package/dist/v2/components/ui/floating.d.ts.map +1 -0
  117. package/dist/v2/components/ui/presence.d.ts +9 -0
  118. package/dist/v2/components/ui/presence.d.ts.map +1 -0
  119. package/dist/v2/components/ui/use-id.d.ts +9 -0
  120. package/dist/v2/components/ui/use-id.d.ts.map +1 -0
  121. package/dist/v2/hooks/use-default-render-tool.d.ts +6 -0
  122. package/dist/v2/hooks/use-default-render-tool.d.ts.map +1 -1
  123. package/dist/v2/hooks/use-frontend-tool.d.ts +5 -0
  124. package/dist/v2/hooks/use-frontend-tool.d.ts.map +1 -1
  125. package/dist/v2/hooks/use-render-activity-message.d.ts +13 -9
  126. package/dist/v2/hooks/use-render-activity-message.d.ts.map +1 -1
  127. package/dist/v2/hooks/use-render-custom-messages.d.ts +5 -7
  128. package/dist/v2/hooks/use-render-custom-messages.d.ts.map +1 -1
  129. package/dist/v2/hooks/use-render-tool.d.ts +4 -0
  130. package/dist/v2/hooks/use-render-tool.d.ts.map +1 -1
  131. package/dist/v2/index.cjs +1 -1
  132. package/dist/v2/index.d.cts +3 -0
  133. package/dist/v2/index.d.mts +3 -0
  134. package/dist/v2/index.d.ts +3 -0
  135. package/dist/v2/index.d.ts.map +1 -1
  136. package/dist/v2/index.mjs +197 -197
  137. package/dist/v2/index.mjs.map +1 -1
  138. package/dist/v2/lib/message-feedback.d.ts +33 -0
  139. package/dist/v2/lib/message-feedback.d.ts.map +1 -0
  140. package/dist/v2/lib/processPartialHtml.d.ts +1 -2
  141. package/dist/v2/lib/processPartialHtml.d.ts.map +1 -1
  142. package/dist/v2/lib/vue-core.d.ts +0 -1
  143. package/dist/v2/lib/vue-core.d.ts.map +1 -1
  144. package/dist/v2/providers/CopilotChatConfigurationProvider.vue.d.ts.map +1 -1
  145. package/dist/v2/providers/CopilotKitProvider.types.d.ts +56 -6
  146. package/dist/v2/providers/CopilotKitProvider.types.d.ts.map +1 -1
  147. package/dist/v2/providers/CopilotKitProvider.vue.d.ts +6 -2
  148. package/dist/v2/providers/CopilotKitProvider.vue.d.ts.map +1 -1
  149. package/dist/v2/providers/index.d.ts +1 -1
  150. package/dist/v2/providers/index.d.ts.map +1 -1
  151. package/dist/v2/providers/keys.d.ts +8 -0
  152. package/dist/v2/providers/keys.d.ts.map +1 -1
  153. package/dist/v2/providers/types.d.ts +3 -37
  154. package/dist/v2/providers/types.d.ts.map +1 -1
  155. package/dist/v2/styles/CopilotKitStyles.d.ts +18 -0
  156. package/dist/v2/styles/CopilotKitStyles.d.ts.map +1 -0
  157. package/dist/v2/types/defineToolCallRenderer.d.ts +2 -0
  158. package/dist/v2/types/defineToolCallRenderer.d.ts.map +1 -1
  159. package/dist/v2/types/human-in-the-loop.d.ts +8 -29
  160. package/dist/v2/types/human-in-the-loop.d.ts.map +1 -1
  161. package/dist/v2/types/interrupt.d.ts +1 -22
  162. package/dist/v2/types/interrupt.d.ts.map +1 -1
  163. package/dist/v2/types/vue-activity-message-renderer.d.ts +16 -15
  164. package/dist/v2/types/vue-activity-message-renderer.d.ts.map +1 -1
  165. package/dist/v2/types/vue-custom-message-renderer.d.ts +7 -16
  166. package/dist/v2/types/vue-custom-message-renderer.d.ts.map +1 -1
  167. package/dist/v2/types/vue-tool-call-renderer.d.ts +16 -28
  168. package/dist/v2/types/vue-tool-call-renderer.d.ts.map +1 -1
  169. package/package.json +14 -27
  170. package/src/__tests__/build-entries.test.ts +27 -0
  171. package/src/components/copilot-provider/CopilotKit.vue +4 -1
  172. package/src/hooks/__tests__/zod-parameters.test.ts +520 -0
  173. package/src/hooks/use-copilot-action.ts +2 -1
  174. package/src/hooks/use-frontend-tool.ts +3 -6
  175. package/src/hooks/zod-parameters.ts +162 -0
  176. package/src/v2/__tests__/exports.test.ts +4 -2
  177. package/src/v2/components/A2UIMessageRenderer.ts +56 -68
  178. package/src/v2/components/A2UISurfaceActivityRenderer.vue +11 -23
  179. package/src/v2/components/LicenseWarningBanner.vue +31 -15
  180. package/src/v2/components/OpenGenerativeUIRenderer.ts +51 -373
  181. package/src/v2/components/__tests__/A2UIBasicCatalogColors.test.ts +8 -9
  182. package/src/v2/components/__tests__/A2UICatalogContext.test.ts +1 -1
  183. package/src/v2/components/__tests__/A2UIMessageRenderer.test.ts +63 -36
  184. package/src/v2/components/__tests__/LicenseWarningBanner.test.ts +20 -0
  185. package/src/v2/components/__tests__/OpenGenerativeUIRenderer.test.ts +55 -6
  186. package/src/v2/components/a2ui/A2UIBuiltInToolCallRenderer.ts +15 -258
  187. package/src/v2/components/a2ui/A2UICatalogContext.ts +10 -102
  188. package/src/v2/components/a2ui/A2UIRecoveryStates.ts +444 -0
  189. package/src/v2/components/a2ui/__tests__/A2UIRecoveryStates.test.ts +175 -0
  190. package/src/v2/components/a2ui.ts +1 -1
  191. package/src/v2/components/chat/CopilotChat.vue +26 -40
  192. package/src/v2/components/chat/CopilotChatAssistantMessage.vue +267 -67
  193. package/src/v2/components/chat/CopilotChatAssistantToolbarButton.vue +46 -0
  194. package/src/v2/components/chat/CopilotChatAttachmentQueue.vue +150 -173
  195. package/src/v2/components/chat/CopilotChatAttachmentRenderer.vue +77 -20
  196. package/src/v2/components/chat/CopilotChatAudioRecorder.vue +2 -2
  197. package/src/v2/components/chat/CopilotChatFeedbackCommentPopover.vue +240 -0
  198. package/src/v2/components/chat/CopilotChatInput.vue +250 -191
  199. package/src/v2/components/chat/CopilotChatInspectorButton.vue +331 -0
  200. package/src/v2/components/chat/CopilotChatLightbox.vue +105 -0
  201. package/src/v2/components/chat/CopilotChatMessageView.vue +262 -87
  202. package/src/v2/components/chat/CopilotChatReasoningMessage.vue +52 -35
  203. package/src/v2/components/chat/CopilotChatSuggestionPill.vue +5 -14
  204. package/src/v2/components/chat/CopilotChatSuggestionView.vue +1 -4
  205. package/src/v2/components/chat/CopilotChatToggleButton.vue +3 -9
  206. package/src/v2/components/chat/CopilotChatToggleButtonCloseIcon.ts +1 -1
  207. package/src/v2/components/chat/CopilotChatToggleButtonOpenIcon.ts +1 -1
  208. package/src/v2/components/chat/CopilotChatToolCallGroup.vue +353 -0
  209. package/src/v2/components/chat/CopilotChatToolCallItem.vue +24 -14
  210. package/src/v2/components/chat/CopilotChatToolCallsView.vue +194 -21
  211. package/src/v2/components/chat/CopilotChatUserMessage.vue +105 -42
  212. package/src/v2/components/chat/CopilotChatView.vue +37 -42
  213. package/src/v2/components/chat/CopilotChatWorkSummary.vue +111 -0
  214. package/src/v2/components/chat/CopilotModalHeader.vue +10 -8
  215. package/src/v2/components/chat/CopilotModalHeaderCloseButton.ts +7 -6
  216. package/src/v2/components/chat/CopilotModalHeaderTitle.ts +1 -4
  217. package/src/v2/components/chat/CopilotPopup.vue +3 -0
  218. package/src/v2/components/chat/CopilotPopupView.vue +1 -0
  219. package/src/v2/components/chat/CopilotPopupViewInternal.vue +9 -19
  220. package/src/v2/components/chat/CopilotPopupWelcomeScreen.vue +5 -8
  221. package/src/v2/components/chat/CopilotSidebar.vue +5 -0
  222. package/src/v2/components/chat/CopilotSidebarView.vue +2 -0
  223. package/src/v2/components/chat/CopilotSidebarViewInternal.vue +24 -17
  224. package/src/v2/components/chat/CopilotSidebarWelcomeScreen.vue +7 -10
  225. package/src/v2/components/chat/StreamingMarkdownDefault.vue +3 -5
  226. package/src/v2/components/chat/__tests__/CopilotChat.labels.test.ts +19 -4
  227. package/src/v2/components/chat/__tests__/CopilotChatActivityRendering.e2e.test.ts +26 -9
  228. package/src/v2/components/chat/__tests__/CopilotChatAssistantMessage.inspector.test.ts +269 -0
  229. package/src/v2/components/chat/__tests__/CopilotChatAssistantMessage.learningFeedback.test.ts +760 -0
  230. package/src/v2/components/chat/__tests__/CopilotChatAssistantMessage.slots.e2e.test.ts +3 -5
  231. package/src/v2/components/chat/__tests__/CopilotChatAssistantMessage.test.ts +2 -2
  232. package/src/v2/components/chat/__tests__/CopilotChatInput.addMenu.test.ts +328 -0
  233. package/src/v2/components/chat/__tests__/CopilotChatInput.slots.e2e.test.ts +6 -3
  234. package/src/v2/components/chat/__tests__/CopilotChatInput.test.ts +55 -14
  235. package/src/v2/components/chat/__tests__/CopilotChatLightbox.test.ts +160 -0
  236. package/src/v2/components/chat/__tests__/CopilotChatMessageView.test.ts +247 -403
  237. package/src/v2/components/chat/__tests__/CopilotChatMessageView.toolCallDisplay.test.ts +637 -0
  238. package/src/v2/components/chat/__tests__/CopilotChatSuggestionPill.test.ts +1 -1
  239. package/src/v2/components/chat/__tests__/CopilotChatSuggestionView.slots.e2e.test.ts +3 -1
  240. package/src/v2/components/chat/__tests__/CopilotChatToolCallsView.learning.test.ts +75 -0
  241. package/src/v2/components/chat/__tests__/CopilotChatUserMessage.attachments.test.ts +143 -0
  242. package/src/v2/components/chat/__tests__/CopilotChatView.inputOverlay.test.ts +5 -4
  243. package/src/v2/components/chat/__tests__/CopilotChatView.rootWidth.test.ts +7 -33
  244. package/src/v2/components/chat/__tests__/CopilotModalHeader.slots.e2e.test.ts +1 -1
  245. package/src/v2/components/chat/__tests__/CopilotPopupView.slots.e2e.test.ts +3 -3
  246. package/src/v2/components/chat/__tests__/CopilotSidebarView.position.test.ts +126 -0
  247. package/src/v2/components/chat/__tests__/messageFeedbackDefaults.test.ts +33 -0
  248. package/src/v2/components/chat/__tests__/modalChatDisplayProps.test.ts +44 -0
  249. package/src/v2/components/chat/copilotChatToolCallItemRender.ts +3 -19
  250. package/src/v2/components/chat/index.ts +2 -1
  251. package/src/v2/components/chat/inspector-shortcuts.ts +34 -0
  252. package/src/v2/components/chat/message-feedback.ts +291 -0
  253. package/src/v2/components/chat/tool-call-capture.ts +55 -0
  254. package/src/v2/components/chat/tool-call-display-context.ts +28 -0
  255. package/src/v2/components/chat/tool-call-group-parts.ts +251 -0
  256. package/src/v2/components/chat/turn-work.ts +52 -0
  257. package/src/v2/components/chat/types.ts +114 -4
  258. package/src/v2/components/chat/use-chat-labels.ts +16 -0
  259. package/src/v2/components/chat/use-lightbox.ts +64 -0
  260. package/src/v2/components/icons/__tests__/icons.test.ts +72 -68
  261. package/src/v2/components/icons/index.ts +109 -23
  262. package/src/v2/components/ui/CopilotDropdownMenuContent.vue +465 -0
  263. package/src/v2/components/ui/CopilotPopover.vue +138 -0
  264. package/src/v2/components/ui/CopilotTooltip.vue +237 -0
  265. package/src/v2/components/ui/__tests__/CopilotTooltip.test.ts +168 -0
  266. package/src/v2/components/ui/dropdown-menu.ts +15 -0
  267. package/src/v2/components/ui/floating.ts +321 -0
  268. package/src/v2/components/ui/presence.ts +54 -0
  269. package/src/v2/components/ui/use-id.ts +16 -0
  270. package/src/v2/hooks/__tests__/use-frontend-tool.e2e.test.ts +62 -1
  271. package/src/v2/hooks/__tests__/use-render-activity-message.test.ts +105 -0
  272. package/src/v2/hooks/__tests__/use-render-tool.test.ts +3 -6
  273. package/src/v2/hooks/__tests__/zod-regression.test.ts +5 -4
  274. package/src/v2/hooks/use-default-render-tool.ts +123 -62
  275. package/src/v2/hooks/use-frontend-tool.ts +10 -10
  276. package/src/v2/hooks/use-render-activity-message.ts +27 -48
  277. package/src/v2/hooks/use-render-custom-messages.ts +14 -35
  278. package/src/v2/hooks/use-render-tool.ts +8 -0
  279. package/src/v2/index.ts +3 -0
  280. package/src/v2/lib/__tests__/message-feedback.test.ts +152 -0
  281. package/src/v2/lib/message-feedback.ts +120 -0
  282. package/src/v2/lib/processPartialHtml.ts +6 -21
  283. package/src/v2/lib/vue-core.ts +3 -5
  284. package/src/v2/providers/CopilotChatConfigurationProvider.vue +29 -2
  285. package/src/v2/providers/CopilotKitProvider.types.ts +57 -5
  286. package/src/v2/providers/CopilotKitProvider.vue +177 -114
  287. package/src/v2/providers/__tests__/CopilotChatConfigurationProvider.openThread.test.ts +69 -0
  288. package/src/v2/providers/__tests__/CopilotKitProvider.a2ui.test.ts +1 -1
  289. package/src/v2/providers/__tests__/CopilotKitProvider.headersAtSendTime.test.ts +3 -3
  290. package/src/v2/providers/__tests__/CopilotKitProvider.learning.test.ts +536 -0
  291. package/src/v2/providers/__tests__/CopilotKitProvider.test.ts +17 -33
  292. package/src/v2/providers/index.ts +4 -1
  293. package/src/v2/providers/keys.ts +12 -0
  294. package/src/v2/providers/types.ts +3 -38
  295. package/src/v2/styles/CopilotKitStyles.ts +95 -0
  296. package/src/v2/styles/__tests__/CopilotKitStyles.client.test.ts +149 -0
  297. package/src/v2/styles/__tests__/CopilotKitStyles.ssr.test.ts +71 -0
  298. package/src/v2/types/__tests__/defineToolCallRenderer.test.ts +28 -33
  299. package/src/v2/types/defineToolCallRenderer.ts +9 -4
  300. package/src/v2/types/human-in-the-loop.ts +8 -32
  301. package/src/v2/types/interrupt.ts +7 -31
  302. package/src/v2/types/vue-activity-message-renderer.ts +24 -15
  303. package/src/v2/types/vue-custom-message-renderer.ts +12 -16
  304. package/src/v2/types/vue-tool-call-renderer.ts +23 -31
  305. package/vite.config.ts +5 -5
  306. package/dist/styles.css +0 -2
  307. package/dist/v2/components/chat/BasicMarkdown.vue.d.ts +0 -9
  308. package/dist/v2/components/chat/BasicMarkdown.vue.d.ts.map +0 -1
  309. package/dist/v2/lib/transcription-client.d.ts +0 -19
  310. package/dist/v2/lib/transcription-client.d.ts.map +0 -1
  311. package/scripts/scope-preflight.mjs +0 -100
  312. package/src/styles/globals.css +0 -233
  313. package/src/v2/components/chat/BasicMarkdown.vue +0 -158
  314. package/src/v2/components/chat/__tests__/BasicMarkdown.test.ts +0 -69
  315. package/src/v2/lib/__tests__/processPartialHtml.test.ts +0 -84
  316. package/src/v2/lib/__tests__/transcription-client.test.ts +0 -67
  317. package/src/v2/lib/transcription-client.ts +0 -151
@@ -0,0 +1,321 @@
1
+ import { onBeforeUnmount, ref, watch } from "vue";
2
+ import type { CSSProperties, Ref } from "vue";
3
+
4
+ /**
5
+ * Positions floating UI (tooltips, popovers, menus) next to an element, the
6
+ * way React's Radix primitives do: fixed to the viewport, flipped to the other
7
+ * side when it does not fit, and shifted along its side to stay on screen.
8
+ * Floating content sits in a wrapper that carries the position, so the
9
+ * content's own enter and exit animations can use `transform`.
10
+ * @internal
11
+ */
12
+
13
+ export type FloatingSide = "top" | "right" | "bottom" | "left";
14
+ export type FloatingAlign = "start" | "center" | "end";
15
+
16
+ export interface FloatingOptions {
17
+ side?: FloatingSide;
18
+ align?: FloatingAlign;
19
+ /** Distance from the reference element, in px. */
20
+ sideOffset?: number;
21
+ /** Shift along the side, in px, for `start` and `end`. */
22
+ alignOffset?: number;
23
+ /** Space kept between the content and the viewport edge, in px. */
24
+ collisionPadding?: number;
25
+ /** Size of an arrow drawn on the content, in px (added to the offset). */
26
+ arrowSize?: number;
27
+ }
28
+
29
+ export interface FloatingPlacement {
30
+ x: number;
31
+ y: number;
32
+ side: FloatingSide;
33
+ align: FloatingAlign;
34
+ /** Room left between the reference element and the viewport edge. */
35
+ availableWidth: number;
36
+ availableHeight: number;
37
+ /** The reference element's center on the content, for its arrow. */
38
+ arrowX?: number;
39
+ arrowY?: number;
40
+ transformOrigin: string;
41
+ }
42
+
43
+ const OPPOSITE: Record<FloatingSide, FloatingSide> = {
44
+ top: "bottom",
45
+ bottom: "top",
46
+ left: "right",
47
+ right: "left",
48
+ };
49
+
50
+ const clamp = (value: number, min: number, max: number) =>
51
+ Math.min(Math.max(value, min), Math.max(min, max));
52
+
53
+ /** Where content of `size` goes next to `reference` in a `viewport`. */
54
+ export function computeFloatingPlacement(
55
+ reference: Pick<
56
+ DOMRect,
57
+ "top" | "left" | "right" | "bottom" | "width" | "height"
58
+ >,
59
+ size: { width: number; height: number },
60
+ viewport: { width: number; height: number },
61
+ options: FloatingOptions = {},
62
+ ): FloatingPlacement {
63
+ const {
64
+ side: preferredSide = "bottom",
65
+ align = "center",
66
+ sideOffset = 0,
67
+ alignOffset = 0,
68
+ collisionPadding = 0,
69
+ arrowSize = 0,
70
+ } = options;
71
+ const offset = sideOffset + arrowSize;
72
+
73
+ const space = (side: FloatingSide) =>
74
+ ({
75
+ top: reference.top,
76
+ bottom: viewport.height - reference.bottom,
77
+ left: reference.left,
78
+ right: viewport.width - reference.right,
79
+ })[side] -
80
+ offset -
81
+ collisionPadding;
82
+ const needed = (side: FloatingSide) =>
83
+ side === "top" || side === "bottom" ? size.height : size.width;
84
+
85
+ let side = preferredSide;
86
+ const opposite = OPPOSITE[preferredSide];
87
+ if (
88
+ space(side) < needed(side) &&
89
+ space(opposite) >= needed(opposite) &&
90
+ space(opposite) > space(side)
91
+ ) {
92
+ side = opposite;
93
+ }
94
+
95
+ const vertical = side === "top" || side === "bottom";
96
+ let x: number;
97
+ let y: number;
98
+ if (vertical) {
99
+ y =
100
+ side === "top"
101
+ ? reference.top - size.height - offset
102
+ : reference.bottom + offset;
103
+ x =
104
+ align === "start"
105
+ ? reference.left + alignOffset
106
+ : align === "end"
107
+ ? reference.right - size.width - alignOffset
108
+ : reference.left + reference.width / 2 - size.width / 2;
109
+ x = clamp(
110
+ x,
111
+ collisionPadding,
112
+ viewport.width - size.width - collisionPadding,
113
+ );
114
+ } else {
115
+ x =
116
+ side === "left"
117
+ ? reference.left - size.width - offset
118
+ : reference.right + offset;
119
+ y =
120
+ align === "start"
121
+ ? reference.top + alignOffset
122
+ : align === "end"
123
+ ? reference.bottom - size.height - alignOffset
124
+ : reference.top + reference.height / 2 - size.height / 2;
125
+ y = clamp(
126
+ y,
127
+ collisionPadding,
128
+ viewport.height - size.height - collisionPadding,
129
+ );
130
+ }
131
+
132
+ const arrowX = vertical
133
+ ? clamp(reference.left + reference.width / 2 - x, 0, size.width)
134
+ : undefined;
135
+ const arrowY = vertical
136
+ ? undefined
137
+ : clamp(reference.top + reference.height / 2 - y, 0, size.height);
138
+ const transformOrigin = vertical
139
+ ? `${arrowX}px ${side === "top" ? `${size.height + arrowSize}px` : `${-arrowSize}px`}`
140
+ : `${side === "left" ? `${size.width + arrowSize}px` : `${-arrowSize}px`} ${arrowY}px`;
141
+
142
+ return {
143
+ x,
144
+ y,
145
+ side,
146
+ align,
147
+ availableWidth: vertical
148
+ ? viewport.width - 2 * collisionPadding
149
+ : Math.max(0, space(side)),
150
+ availableHeight: vertical
151
+ ? Math.max(0, space(side))
152
+ : viewport.height - 2 * collisionPadding,
153
+ arrowX,
154
+ arrowY,
155
+ transformOrigin,
156
+ };
157
+ }
158
+
159
+ /** Whether `element` is scrolled or clipped fully out of view. */
160
+ export function isElementClippedAway(element: Element): boolean {
161
+ const rect = element.getBoundingClientRect();
162
+ const view = element.ownerDocument.defaultView;
163
+ if (!view) return false;
164
+ let top = 0;
165
+ let left = 0;
166
+ let bottom = view.innerHeight;
167
+ let right = view.innerWidth;
168
+ for (
169
+ let parent = element.parentElement;
170
+ parent;
171
+ parent = parent.parentElement
172
+ ) {
173
+ const { overflowX, overflowY } = view.getComputedStyle(parent);
174
+ if (overflowX === "visible" && overflowY === "visible") continue;
175
+ const clip = parent.getBoundingClientRect();
176
+ top = Math.max(top, clip.top);
177
+ left = Math.max(left, clip.left);
178
+ bottom = Math.min(bottom, clip.bottom);
179
+ right = Math.min(right, clip.right);
180
+ }
181
+ // Strict, so an element that only touches the edge still counts as shown.
182
+ return (
183
+ rect.bottom < top ||
184
+ rect.top > bottom ||
185
+ rect.right < left ||
186
+ rect.left > right
187
+ );
188
+ }
189
+
190
+ /**
191
+ * Keeps `floating` placed next to `reference` while `open`: on scroll,
192
+ * resize, and size changes of either element.
193
+ */
194
+ export function useFloating(
195
+ reference: Ref<HTMLElement | null | undefined>,
196
+ floating: Ref<HTMLElement | null | undefined>,
197
+ open: Ref<boolean>,
198
+ options: () => FloatingOptions & { hideWhenDetached?: boolean },
199
+ ) {
200
+ const placement = ref<FloatingPlacement | null>(null);
201
+ const referenceHidden = ref(false);
202
+ let cleanup: (() => void) | undefined;
203
+
204
+ const update = () => {
205
+ const referenceElement = reference.value;
206
+ const floatingElement = floating.value;
207
+ if (!referenceElement || !floatingElement) return;
208
+ const view = floatingElement.ownerDocument.defaultView;
209
+ if (!view) return;
210
+ const opts = options();
211
+ placement.value = computeFloatingPlacement(
212
+ referenceElement.getBoundingClientRect(),
213
+ {
214
+ width: floatingElement.offsetWidth,
215
+ height: floatingElement.offsetHeight,
216
+ },
217
+ { width: view.innerWidth, height: view.innerHeight },
218
+ opts,
219
+ );
220
+ referenceHidden.value =
221
+ !!opts.hideWhenDetached &&
222
+ (!referenceElement.isConnected || isElementClippedAway(referenceElement));
223
+ };
224
+
225
+ const stop = () => {
226
+ cleanup?.();
227
+ cleanup = undefined;
228
+ };
229
+
230
+ watch(
231
+ [open, reference, floating],
232
+ ([isOpen, referenceElement, floatingElement]) => {
233
+ stop();
234
+ if (!isOpen || !referenceElement || !floatingElement) {
235
+ if (!isOpen) placement.value = null;
236
+ return;
237
+ }
238
+ update();
239
+ const view = floatingElement.ownerDocument.defaultView;
240
+ if (!view) return;
241
+ let frame = 0;
242
+ const schedule = () => {
243
+ if (frame) return;
244
+ frame = view.requestAnimationFrame(() => {
245
+ frame = 0;
246
+ update();
247
+ });
248
+ };
249
+ view.addEventListener("scroll", schedule, {
250
+ capture: true,
251
+ passive: true,
252
+ });
253
+ view.addEventListener("resize", schedule);
254
+ const observer =
255
+ typeof ResizeObserver === "undefined"
256
+ ? undefined
257
+ : new ResizeObserver(schedule);
258
+ observer?.observe(referenceElement);
259
+ observer?.observe(floatingElement);
260
+ cleanup = () => {
261
+ if (frame) view.cancelAnimationFrame(frame);
262
+ view.removeEventListener("scroll", schedule, { capture: true });
263
+ view.removeEventListener("resize", schedule);
264
+ observer?.disconnect();
265
+ };
266
+ },
267
+ { flush: "post", immediate: true },
268
+ );
269
+
270
+ onBeforeUnmount(stop);
271
+
272
+ /** Style for the wrapper around the floating content. */
273
+ const wrapperStyle = (zIndex?: string | number): CSSProperties => {
274
+ const current = placement.value;
275
+ return {
276
+ position: "fixed",
277
+ left: "0px",
278
+ top: "0px",
279
+ minWidth: "max-content",
280
+ zIndex: zIndex ?? 50,
281
+ // Off screen until measured, as Radix does.
282
+ transform: current
283
+ ? `translate(${Math.round(current.x)}px, ${Math.round(current.y)}px)`
284
+ : "translate(0, -200%)",
285
+ visibility: referenceHidden.value ? "hidden" : undefined,
286
+ pointerEvents: referenceHidden.value ? "none" : undefined,
287
+ };
288
+ };
289
+
290
+ return { placement, referenceHidden, update, wrapperStyle };
291
+ }
292
+
293
+ /**
294
+ * Style for an arrow wrapper on floating content, as Radix places it: on the
295
+ * edge facing the reference element, centered on it.
296
+ */
297
+ export function arrowWrapperStyle(
298
+ placement: FloatingPlacement | null,
299
+ ): CSSProperties {
300
+ if (!placement) return { position: "absolute", visibility: "hidden" };
301
+ const { side, arrowX, arrowY } = placement;
302
+ return {
303
+ position: "absolute",
304
+ left: arrowX !== undefined ? `${arrowX}px` : undefined,
305
+ top: arrowY !== undefined ? `${arrowY}px` : undefined,
306
+ [OPPOSITE[side]]: "0px",
307
+ transformOrigin: {
308
+ top: "",
309
+ right: "0 0",
310
+ bottom: "center 0",
311
+ left: "100% 0",
312
+ }[side],
313
+ transform: {
314
+ top: "translateY(100%)",
315
+ right: "translateY(50%) rotate(90deg) translateX(-50%)",
316
+ bottom: "rotate(180deg)",
317
+ left: "translateY(50%) rotate(-90deg) translateX(50%)",
318
+ }[side],
319
+ marginLeft: arrowX !== undefined ? "-5px" : undefined,
320
+ };
321
+ }
@@ -0,0 +1,54 @@
1
+ import { nextTick, onBeforeUnmount, ref, watch } from "vue";
2
+ import type { Ref } from "vue";
3
+
4
+ /**
5
+ * Keeps closing content mounted until its exit animation ends, like Radix's
6
+ * Presence: the content gets `data-state="closed"`, and its CSS animation
7
+ * (for example `cpk-tooltip-exit`) plays before it unmounts.
8
+ * @internal
9
+ */
10
+ export function usePresence(
11
+ open: Ref<boolean>,
12
+ element: Ref<HTMLElement | null | undefined>,
13
+ ) {
14
+ const present = ref(open.value);
15
+ let finish: (() => void) | undefined;
16
+
17
+ const stopWaiting = () => {
18
+ finish?.();
19
+ finish = undefined;
20
+ };
21
+
22
+ watch(open, async (isOpen) => {
23
+ stopWaiting();
24
+ if (isOpen) {
25
+ present.value = true;
26
+ return;
27
+ }
28
+ // Let `data-state="closed"` reach the DOM, so its animation starts.
29
+ await nextTick();
30
+ if (open.value) return;
31
+ const node = element.value;
32
+ const view = node?.ownerDocument.defaultView;
33
+ const animationName = node && view?.getComputedStyle(node).animationName;
34
+ if (!node || !view || !animationName || animationName === "none") {
35
+ present.value = false;
36
+ return;
37
+ }
38
+ const done = () => {
39
+ stopWaiting();
40
+ if (!open.value) present.value = false;
41
+ };
42
+ // A fallback, in case the animation is cancelled without an end event.
43
+ const timer = view.setTimeout(done, 400);
44
+ node.addEventListener("animationend", done, { once: true });
45
+ finish = () => {
46
+ view.clearTimeout(timer);
47
+ node.removeEventListener("animationend", done);
48
+ };
49
+ });
50
+
51
+ onBeforeUnmount(stopWaiting);
52
+
53
+ return present;
54
+ }
@@ -0,0 +1,16 @@
1
+ import * as vue from "vue";
2
+
3
+ let counter = 0;
4
+
5
+ /**
6
+ * A unique id for ARIA references. Uses Vue's SSR-safe `useId()` on Vue 3.5+;
7
+ * the peer range starts at 3.3, which has none, so older Vue gets a counter.
8
+ * Read through the namespace, so a Vue without the export does not fail to
9
+ * import this module.
10
+ * @internal
11
+ */
12
+ export function useCopilotId(prefix = "cpk"): string {
13
+ const vueUseId = (vue as { useId?: () => string }).useId;
14
+ const id = vueUseId?.();
15
+ return id ? `${prefix}-${id}` : `${prefix}-${++counter}`;
16
+ }
@@ -1,4 +1,12 @@
1
- import { computed, defineComponent, onMounted, ref, watch } from "vue";
1
+ import {
2
+ computed,
3
+ defineComponent,
4
+ h,
5
+ nextTick,
6
+ onMounted,
7
+ ref,
8
+ watch,
9
+ } from "vue";
2
10
  import type { PropType } from "vue";
3
11
  import { screen, fireEvent, waitFor, cleanup } from "@testing-library/vue";
4
12
  import { afterEach, describe, expect, it } from "vitest";
@@ -27,6 +35,11 @@ import {
27
35
  textChunkEvent,
28
36
  testId,
29
37
  } from "../../__tests__/utils/test-helpers";
38
+ import { mountWithProvider } from "../../__tests__/utils/mount";
39
+ import {
40
+ StateCapturingAgent,
41
+ toolCallMessage,
42
+ } from "../../__tests__/utils/agents";
30
43
 
31
44
  afterEach(() => {
32
45
  cleanup();
@@ -912,6 +925,54 @@ describe("useFrontendTool E2E - Dynamic Registration", () => {
912
925
  });
913
926
  });
914
927
 
928
+ describe("Overriding a provider tool", () => {
929
+ it("brings the provider tool back after the overriding component unmounts", async () => {
930
+ const calls: string[] = [];
931
+ const lookupTool = (owner: string): VueFrontendTool => ({
932
+ name: "lookup",
933
+ parameters: z.object({}),
934
+ followUp: false,
935
+ handler: async () => {
936
+ calls.push(owner);
937
+ return owner;
938
+ },
939
+ });
940
+
941
+ const OverridingTool = defineComponent({
942
+ setup() {
943
+ useFrontendTool(lookupTool("component"));
944
+ return () => null;
945
+ },
946
+ });
947
+
948
+ const showOverride = ref(true);
949
+ const agent = new StateCapturingAgent(
950
+ [
951
+ { newMessages: [toolCallMessage("lookup")] },
952
+ { newMessages: [toolCallMessage("lookup")] },
953
+ ],
954
+ "test-agent",
955
+ );
956
+ const { getCore, wrapper } = mountWithProvider(
957
+ () => (showOverride.value ? h(OverridingTool) : h("div")),
958
+ {
959
+ frontendTools: [lookupTool("provider")],
960
+ agents__unsafe_dev_only: { "test-agent": agent },
961
+ },
962
+ );
963
+
964
+ await nextTick();
965
+ await getCore().runAgent({ agent });
966
+
967
+ showOverride.value = false;
968
+ await nextTick();
969
+ await getCore().runAgent({ agent });
970
+
971
+ expect(calls).toEqual(["component", "provider"]);
972
+ wrapper.unmount();
973
+ });
974
+ });
975
+
915
976
  describe("Integration with Chat UI", () => {
916
977
  it("should render tool output correctly in chat interface", async () => {
917
978
  const agent = new MockStepwiseAgent();
@@ -0,0 +1,105 @@
1
+ import {
2
+ afterEach,
3
+ beforeEach,
4
+ describe,
5
+ expect,
6
+ expectTypeOf,
7
+ it,
8
+ vi,
9
+ } from "vitest";
10
+ import { defineComponent, h, toRaw } from "vue";
11
+ import { z } from "zod";
12
+ import type { ActivityMessage } from "@ag-ui/core";
13
+ import { useRenderActivityMessage } from "../use-render-activity-message";
14
+ import type {
15
+ VueActivityMessageRenderer,
16
+ VueActivityMessageRendererProps,
17
+ } from "../../types";
18
+ import { renderWithCopilotKit } from "../../__tests__/utils/mount";
19
+
20
+ const ProgressRenderer = defineComponent({
21
+ props: { content: { type: Object, required: true } },
22
+ setup: () => () => null,
23
+ });
24
+
25
+ const progressSchema = z.object({
26
+ label: z.string(),
27
+ percent: z.number().default(0),
28
+ });
29
+
30
+ // A zod schema is a Standard Schema, so it fits the `content` field, and the
31
+ // renderer's content type is the schema's output type.
32
+ const progressRenderer = {
33
+ activityType: "progress",
34
+ content: progressSchema,
35
+ render: ProgressRenderer,
36
+ } satisfies VueActivityMessageRenderer<z.output<typeof progressSchema>>;
37
+
38
+ function activityMessage(content: Record<string, unknown>): ActivityMessage {
39
+ return {
40
+ id: "activity-1",
41
+ role: "activity",
42
+ activityType: "progress",
43
+ content,
44
+ };
45
+ }
46
+
47
+ function renderWithProgressRenderer() {
48
+ let helpers: ReturnType<typeof useRenderActivityMessage> | undefined;
49
+ const Probe = defineComponent({
50
+ setup() {
51
+ helpers = useRenderActivityMessage();
52
+ return () => null;
53
+ },
54
+ });
55
+
56
+ renderWithCopilotKit(() => h(Probe), {
57
+ providerProps: { renderActivityMessages: [progressRenderer] },
58
+ });
59
+
60
+ if (!helpers) throw new Error("useRenderActivityMessage did not run");
61
+ return helpers;
62
+ }
63
+
64
+ describe("useRenderActivityMessage", () => {
65
+ let consoleWarnSpy: ReturnType<typeof vi.spyOn>;
66
+
67
+ beforeEach(() => {
68
+ consoleWarnSpy = vi.spyOn(console, "warn").mockImplementation(() => {});
69
+ });
70
+
71
+ afterEach(() => {
72
+ consoleWarnSpy.mockRestore();
73
+ });
74
+
75
+ it("types a zod content schema's output as the render props content", () => {
76
+ type Props = VueActivityMessageRendererProps<
77
+ z.output<typeof progressSchema>
78
+ >;
79
+ expectTypeOf<Props["content"]>().toEqualTypeOf<{
80
+ label: string;
81
+ percent: number;
82
+ }>();
83
+ });
84
+
85
+ it("passes the zod schema's parsed output to the renderer", () => {
86
+ const { renderActivityMessage } = renderWithProgressRenderer();
87
+
88
+ const result = renderActivityMessage(activityMessage({ label: "Upload" }));
89
+
90
+ // The provider stores renderers in reactive state, so compare the raw value.
91
+ expect(toRaw(result?.renderer)).toBe(ProgressRenderer);
92
+ expect(result?.props.content).toEqual({ label: "Upload", percent: 0 });
93
+ });
94
+
95
+ it("returns null and warns when the content fails the schema", () => {
96
+ const { renderActivityMessage } = renderWithProgressRenderer();
97
+
98
+ const result = renderActivityMessage(activityMessage({ label: 42 }));
99
+
100
+ expect(result).toBeNull();
101
+ expect(consoleWarnSpy).toHaveBeenCalledWith(
102
+ "Failed to validate content for activity message 'progress'.",
103
+ );
104
+ });
105
+ });
@@ -93,7 +93,7 @@ describe("useRenderTool", () => {
93
93
  expect(typeof renderer?.render).toBe("function");
94
94
  });
95
95
 
96
- it("registers wildcard renderer and defaults parameters schema to z.any", () => {
96
+ it("registers wildcard renderer and defaults parameters to a schema that accepts any value", () => {
97
97
  const core = createMockCore();
98
98
  mockUseCopilotKit.mockReturnValue({ copilotkit: { value: core } });
99
99
 
@@ -118,11 +118,8 @@ describe("useRenderTool", () => {
118
118
  const renderer = core.renderToolCalls.find((item) => item.name === "*");
119
119
  expect(renderer).toBeDefined();
120
120
  expect(typeof renderer?.render).toBe("function");
121
- const wildcardArgs = renderer?.args as
122
- | { safeParse: (v: unknown) => { success: boolean } }
123
- | undefined;
124
- expect(wildcardArgs).toBeDefined();
125
- expect(wildcardArgs!.safeParse({ arbitrary: true }).success).toBe(true);
121
+ const result = renderer?.args["~standard"].validate({ arbitrary: true });
122
+ expect(result).toEqual({ value: { arbitrary: true } });
126
123
  });
127
124
 
128
125
  it("accepts a Vue component renderer", () => {
@@ -4,7 +4,7 @@
4
4
  *
5
5
  * Covers:
6
6
  * 1. useRenderTool with complex Zod schemas
7
- * 2. defineToolCallRenderer with Zod (named + wildcard default z.any())
7
+ * 2. defineToolCallRenderer with Zod (named + wildcard default schema)
8
8
  * 3. useComponent with Zod schemas
9
9
  * 4. The registered schema object is the original Zod instance (identity check)
10
10
  */
@@ -134,7 +134,7 @@ describe("useRenderTool Zod regression", () => {
134
134
  const schema = z.object({
135
135
  action: z.discriminatedUnion("type", [
136
136
  z.object({ type: z.literal("search"), query: z.string() }),
137
- z.object({ type: z.literal("navigate"), url: z.string().url() }),
137
+ z.object({ type: z.literal("navigate"), url: z.url() }),
138
138
  ]),
139
139
  });
140
140
 
@@ -196,14 +196,15 @@ describe("useRenderTool Zod regression", () => {
196
196
  });
197
197
 
198
198
  describe("defineToolCallRenderer Zod regression", () => {
199
- it("wildcard tool defaults to z.any() for args", () => {
199
+ it("wildcard tool defaults to a schema that accepts any value", () => {
200
200
  const renderer = defineToolCallRenderer({
201
201
  name: "*",
202
202
  render: () => "wildcard",
203
203
  });
204
204
 
205
205
  expect(renderer.name).toBe("*");
206
- expect((renderer.args as any)["~standard"].vendor).toBe("zod");
206
+ const result = renderer.args["~standard"].validate({ city: "Paris" });
207
+ expect(result).toEqual({ value: { city: "Paris" } });
207
208
  });
208
209
 
209
210
  it("named tool with Zod args preserves schema identity", () => {