@copilotkit/vue 2.0.0-rc.3 → 2.0.0-rc.30

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 (343) hide show
  1. package/CONTRIBUTOR_GUIDE.md +1 -1
  2. package/PARITY.md +3 -3
  3. package/dist/hooks/use-copilot-action.d.ts.map +1 -1
  4. package/dist/hooks/use-frontend-tool.d.ts +1 -1
  5. package/dist/hooks/use-frontend-tool.d.ts.map +1 -1
  6. package/dist/hooks/zod-parameters.d.ts +14 -0
  7. package/dist/hooks/zod-parameters.d.ts.map +1 -0
  8. package/dist/index.cjs +1 -73
  9. package/dist/index.cjs.map +1 -1
  10. package/dist/index.mjs +365 -16920
  11. package/dist/index.mjs.map +1 -1
  12. package/dist/use-render-activity-message-BZJ33B_r.cjs +113 -0
  13. package/dist/use-render-activity-message-BZJ33B_r.cjs.map +1 -0
  14. package/dist/use-render-activity-message-DrR407LQ.js +15901 -0
  15. package/dist/use-render-activity-message-DrR407LQ.js.map +1 -0
  16. package/dist/v2/components/A2UIMessageRenderer.d.ts +14 -0
  17. package/dist/v2/components/A2UIMessageRenderer.d.ts.map +1 -1
  18. package/dist/v2/components/A2UISurfaceActivityRenderer.vue.d.ts +10 -3
  19. package/dist/v2/components/A2UISurfaceActivityRenderer.vue.d.ts.map +1 -1
  20. package/dist/v2/components/CopilotKitInspector.vue.d.ts +5 -1
  21. package/dist/v2/components/CopilotKitInspector.vue.d.ts.map +1 -1
  22. package/dist/v2/components/InlineFeatureWarning.vue.d.ts.map +1 -1
  23. package/dist/v2/components/LicenseWarningBanner.vue.d.ts +2 -2
  24. package/dist/v2/components/LicenseWarningBanner.vue.d.ts.map +1 -1
  25. package/dist/v2/components/MCPAppsActivityRenderer.d.ts.map +1 -1
  26. package/dist/v2/components/OpenGenerativeUIRenderer.d.ts +13 -59
  27. package/dist/v2/components/OpenGenerativeUIRenderer.d.ts.map +1 -1
  28. package/dist/v2/components/a2ui/A2UIBuiltInToolCallRenderer.d.ts +3 -11
  29. package/dist/v2/components/a2ui/A2UIBuiltInToolCallRenderer.d.ts.map +1 -1
  30. package/dist/v2/components/a2ui/A2UICatalogContext.d.ts +10 -15
  31. package/dist/v2/components/a2ui/A2UICatalogContext.d.ts.map +1 -1
  32. package/dist/v2/components/a2ui/A2UIRecoveryStates.d.ts +14 -130
  33. package/dist/v2/components/a2ui/A2UIRecoveryStates.d.ts.map +1 -1
  34. package/dist/v2/components/a2ui/catalog.d.ts.map +1 -1
  35. package/dist/v2/components/a2ui/utils.d.ts +3 -15
  36. package/dist/v2/components/a2ui/utils.d.ts.map +1 -1
  37. package/dist/v2/components/a2ui.d.ts +9 -8
  38. package/dist/v2/components/a2ui.d.ts.map +1 -1
  39. package/dist/v2/components/chat/CopilotChat.vue.d.ts +2 -2
  40. package/dist/v2/components/chat/CopilotChat.vue.d.ts.map +1 -1
  41. package/dist/v2/components/chat/CopilotChatAssistantMessage.vue.d.ts.map +1 -1
  42. package/dist/v2/components/chat/CopilotChatAttachmentQueue.vue.d.ts.map +1 -1
  43. package/dist/v2/components/chat/CopilotChatAttachmentRenderer.vue.d.ts.map +1 -1
  44. package/dist/v2/components/chat/CopilotChatAudioRecorder.vue.d.ts +4 -8
  45. package/dist/v2/components/chat/CopilotChatAudioRecorder.vue.d.ts.map +1 -1
  46. package/dist/v2/components/chat/CopilotChatFeedbackCommentPopover.vue.d.ts +1 -1
  47. package/dist/v2/components/chat/CopilotChatFeedbackCommentPopover.vue.d.ts.map +1 -1
  48. package/dist/v2/components/chat/CopilotChatInput.vue.d.ts +7 -286
  49. package/dist/v2/components/chat/CopilotChatInput.vue.d.ts.map +1 -1
  50. package/dist/v2/components/chat/CopilotChatInspectorButton.vue.d.ts.map +1 -1
  51. package/dist/v2/components/chat/CopilotChatLightbox.vue.d.ts.map +1 -1
  52. package/dist/v2/components/chat/CopilotChatMessageView.vue.d.ts +1 -1
  53. package/dist/v2/components/chat/CopilotChatMessageView.vue.d.ts.map +1 -1
  54. package/dist/v2/components/chat/CopilotChatReasoningMessage.vue.d.ts.map +1 -1
  55. package/dist/v2/components/chat/CopilotChatToolCallGroup.vue.d.ts +1 -1
  56. package/dist/v2/components/chat/CopilotChatToolCallGroup.vue.d.ts.map +1 -1
  57. package/dist/v2/components/chat/CopilotChatToolCallItem.vue.d.ts.map +1 -1
  58. package/dist/v2/components/chat/CopilotChatToolCallsView.vue.d.ts +1 -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 +3 -3
  62. package/dist/v2/components/chat/CopilotChatView.vue.d.ts.map +1 -1
  63. package/dist/v2/components/chat/CopilotChatWorkSummary.vue.d.ts.map +1 -1
  64. package/dist/v2/components/chat/CopilotModalHeader.vue.d.ts.map +1 -1
  65. package/dist/v2/components/chat/CopilotPopup.vue.d.ts +8 -3
  66. package/dist/v2/components/chat/CopilotPopup.vue.d.ts.map +1 -1
  67. package/dist/v2/components/chat/CopilotPopupView.vue.d.ts +5 -3
  68. package/dist/v2/components/chat/CopilotPopupView.vue.d.ts.map +1 -1
  69. package/dist/v2/components/chat/CopilotPopupViewInternal.vue.d.ts +5 -3
  70. package/dist/v2/components/chat/CopilotPopupViewInternal.vue.d.ts.map +1 -1
  71. package/dist/v2/components/chat/CopilotSidebar.vue.d.ts +8 -3
  72. package/dist/v2/components/chat/CopilotSidebar.vue.d.ts.map +1 -1
  73. package/dist/v2/components/chat/CopilotSidebarView.vue.d.ts +6 -4
  74. package/dist/v2/components/chat/CopilotSidebarView.vue.d.ts.map +1 -1
  75. package/dist/v2/components/chat/CopilotSidebarViewInternal.vue.d.ts +6 -4
  76. package/dist/v2/components/chat/CopilotSidebarViewInternal.vue.d.ts.map +1 -1
  77. package/dist/v2/components/chat/CopilotThreadsDrawer.vue.d.ts.map +1 -1
  78. package/dist/v2/components/chat/StreamingMarkdownDefault.vue.d.ts +1 -0
  79. package/dist/v2/components/chat/StreamingMarkdownDefault.vue.d.ts.map +1 -1
  80. package/dist/v2/components/chat/audioRecorder.d.ts +3 -4
  81. package/dist/v2/components/chat/audioRecorder.d.ts.map +1 -1
  82. package/dist/v2/components/chat/copilotChatToolCallItemRender.d.ts +4 -4
  83. package/dist/v2/components/chat/copilotChatToolCallItemRender.d.ts.map +1 -1
  84. package/dist/v2/components/chat/forwarded-slots.d.ts +12 -0
  85. package/dist/v2/components/chat/forwarded-slots.d.ts.map +1 -0
  86. package/dist/v2/components/chat/index.d.ts +34 -31
  87. package/dist/v2/components/chat/index.d.ts.map +1 -1
  88. package/dist/v2/components/chat/inspector-shortcuts.d.ts +2 -1
  89. package/dist/v2/components/chat/inspector-shortcuts.d.ts.map +1 -1
  90. package/dist/v2/components/chat/message-feedback.d.ts +38 -49
  91. package/dist/v2/components/chat/message-feedback.d.ts.map +1 -1
  92. package/dist/v2/components/chat/tool-call-display-context.d.ts +4 -19
  93. package/dist/v2/components/chat/tool-call-display-context.d.ts.map +1 -1
  94. package/dist/v2/components/chat/tool-call-group-parts.d.ts +7 -20
  95. package/dist/v2/components/chat/tool-call-group-parts.d.ts.map +1 -1
  96. package/dist/v2/components/chat/turn-work.d.ts +0 -2
  97. package/dist/v2/components/chat/turn-work.d.ts.map +1 -1
  98. package/dist/v2/components/chat/types.d.ts +9 -4
  99. package/dist/v2/components/chat/types.d.ts.map +1 -1
  100. package/dist/v2/components/chat/use-chat-labels.d.ts +8 -0
  101. package/dist/v2/components/chat/use-chat-labels.d.ts.map +1 -0
  102. package/dist/v2/components/chat/use-copy-feedback.d.ts +11 -0
  103. package/dist/v2/components/chat/use-copy-feedback.d.ts.map +1 -0
  104. package/dist/v2/components/chat/use-lightbox.d.ts.map +1 -1
  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 +1 -1
  108. package/dist/v2/components/ui/CopilotDropdownMenuContent.vue.d.ts.map +1 -1
  109. package/dist/v2/hooks/use-agent-context.d.ts +2 -3
  110. package/dist/v2/hooks/use-agent-context.d.ts.map +1 -1
  111. package/dist/v2/hooks/use-agent.d.ts +4 -1
  112. package/dist/v2/hooks/use-agent.d.ts.map +1 -1
  113. package/dist/v2/hooks/use-attachments.d.ts +7 -0
  114. package/dist/v2/hooks/use-attachments.d.ts.map +1 -1
  115. package/dist/v2/hooks/use-capabilities.d.ts.map +1 -1
  116. package/dist/v2/hooks/use-component.d.ts +1 -0
  117. package/dist/v2/hooks/use-component.d.ts.map +1 -1
  118. package/dist/v2/hooks/use-configure-suggestions.d.ts +4 -9
  119. package/dist/v2/hooks/use-configure-suggestions.d.ts.map +1 -1
  120. package/dist/v2/hooks/use-default-render-tool.d.ts +2 -7
  121. package/dist/v2/hooks/use-default-render-tool.d.ts.map +1 -1
  122. package/dist/v2/hooks/use-frontend-tool.d.ts +5 -0
  123. package/dist/v2/hooks/use-frontend-tool.d.ts.map +1 -1
  124. package/dist/v2/hooks/use-human-in-the-loop.d.ts +2 -1
  125. package/dist/v2/hooks/use-human-in-the-loop.d.ts.map +1 -1
  126. package/dist/v2/hooks/use-interrupt.d.ts +0 -1
  127. package/dist/v2/hooks/use-interrupt.d.ts.map +1 -1
  128. package/dist/v2/hooks/use-keyboard-height.d.ts +1 -1
  129. package/dist/v2/hooks/use-keyboard-height.d.ts.map +1 -1
  130. package/dist/v2/hooks/use-pin-to-send.d.ts +4 -12
  131. package/dist/v2/hooks/use-pin-to-send.d.ts.map +1 -1
  132. package/dist/v2/hooks/use-render-activity-message.d.ts +13 -9
  133. package/dist/v2/hooks/use-render-activity-message.d.ts.map +1 -1
  134. package/dist/v2/hooks/use-render-custom-messages.d.ts +5 -7
  135. package/dist/v2/hooks/use-render-custom-messages.d.ts.map +1 -1
  136. package/dist/v2/hooks/use-render-tool.d.ts +1 -1
  137. package/dist/v2/hooks/use-render-tool.d.ts.map +1 -1
  138. package/dist/v2/hooks/use-suggestions.d.ts.map +1 -1
  139. package/dist/v2/hooks/use-threads.d.ts +6 -23
  140. package/dist/v2/hooks/use-threads.d.ts.map +1 -1
  141. package/dist/v2/index.cjs +1 -1
  142. package/dist/v2/index.mjs +197 -200
  143. package/dist/v2/index.mjs.map +1 -1
  144. package/dist/v2/lib/processPartialHtml.d.ts +1 -2
  145. package/dist/v2/lib/processPartialHtml.d.ts.map +1 -1
  146. package/dist/v2/lib/shallow-stable.d.ts.map +1 -1
  147. package/dist/v2/lib/vue-core.d.ts +33 -19
  148. package/dist/v2/lib/vue-core.d.ts.map +1 -1
  149. package/dist/v2/providers/CopilotChatConfigurationProvider.vue.d.ts.map +1 -1
  150. package/dist/v2/providers/CopilotKitProvider.types.d.ts +9 -129
  151. package/dist/v2/providers/CopilotKitProvider.types.d.ts.map +1 -1
  152. package/dist/v2/providers/CopilotKitProvider.vue.d.ts +9 -10
  153. package/dist/v2/providers/CopilotKitProvider.vue.d.ts.map +1 -1
  154. package/dist/v2/providers/chat-configuration-store-key.d.ts +8 -0
  155. package/dist/v2/providers/chat-configuration-store-key.d.ts.map +1 -0
  156. package/dist/v2/providers/markdown-renderer.d.ts +4 -2
  157. package/dist/v2/providers/markdown-renderer.d.ts.map +1 -1
  158. package/dist/v2/providers/types.d.ts +3 -46
  159. package/dist/v2/providers/types.d.ts.map +1 -1
  160. package/dist/v2/providers/use-inspector-thread-override.d.ts +5 -0
  161. package/dist/v2/providers/use-inspector-thread-override.d.ts.map +1 -1
  162. package/dist/v2/types/defineToolCallRenderer.d.ts +1 -1
  163. package/dist/v2/types/defineToolCallRenderer.d.ts.map +1 -1
  164. package/dist/v2/types/human-in-the-loop.d.ts +8 -29
  165. package/dist/v2/types/human-in-the-loop.d.ts.map +1 -1
  166. package/dist/v2/types/interrupt.d.ts +1 -22
  167. package/dist/v2/types/interrupt.d.ts.map +1 -1
  168. package/dist/v2/types/vue-activity-message-renderer.d.ts +16 -15
  169. package/dist/v2/types/vue-activity-message-renderer.d.ts.map +1 -1
  170. package/dist/v2/types/vue-custom-message-renderer.d.ts +7 -16
  171. package/dist/v2/types/vue-custom-message-renderer.d.ts.map +1 -1
  172. package/dist/v2/types/vue-tool-call-renderer.d.ts +16 -35
  173. package/dist/v2/types/vue-tool-call-renderer.d.ts.map +1 -1
  174. package/package.json +12 -13
  175. package/src/__tests__/build-entries.test.ts +29 -0
  176. package/src/hooks/__tests__/zod-parameters.test.ts +520 -0
  177. package/src/hooks/use-copilot-action.ts +2 -1
  178. package/src/hooks/use-frontend-tool.ts +3 -6
  179. package/src/hooks/zod-parameters.ts +162 -0
  180. package/src/v2/__tests__/exports.test.ts +10 -0
  181. package/src/v2/__tests__/mocks/web-inspector.ts +6 -0
  182. package/src/v2/__tests__/utils/test-helpers.ts +34 -4
  183. package/src/v2/components/A2UIMessageRenderer.ts +98 -68
  184. package/src/v2/components/A2UISurfaceActivityRenderer.vue +68 -103
  185. package/src/v2/components/CopilotKitInspector.vue +104 -51
  186. package/src/v2/components/InlineFeatureWarning.vue +20 -21
  187. package/src/v2/components/LicenseWarningBanner.vue +27 -135
  188. package/src/v2/components/MCPAppsActivityRenderer.ts +75 -201
  189. package/src/v2/components/OpenGenerativeUIRenderer.ts +122 -446
  190. package/src/v2/components/__tests__/A2UIMessageRenderer.test.ts +171 -8
  191. package/src/v2/components/__tests__/CopilotKitInspector.test.ts +42 -0
  192. package/src/v2/components/__tests__/LicenseWarningBanner.test.ts +60 -0
  193. package/src/v2/components/__tests__/OpenGenerativeUIRenderer.test.ts +64 -8
  194. package/src/v2/components/__tests__/OpenGenerativeUIToolRenderer.test.ts +38 -0
  195. package/src/v2/components/a2ui/A2UIBuiltInToolCallRenderer.ts +6 -26
  196. package/src/v2/components/a2ui/A2UICatalogContext.ts +27 -185
  197. package/src/v2/components/a2ui/A2UIRecoveryStates.ts +127 -327
  198. package/src/v2/components/a2ui/catalog.ts +3 -3
  199. package/src/v2/components/a2ui/utils.ts +13 -65
  200. package/src/v2/components/a2ui.ts +15 -22
  201. package/src/v2/components/chat/CopilotChat.vue +121 -498
  202. package/src/v2/components/chat/CopilotChatAssistantMessage.vue +47 -184
  203. package/src/v2/components/chat/CopilotChatAttachmentQueue.vue +36 -55
  204. package/src/v2/components/chat/CopilotChatAttachmentRenderer.vue +14 -6
  205. package/src/v2/components/chat/CopilotChatAudioRecorder.vue +19 -246
  206. package/src/v2/components/chat/CopilotChatFeedbackCommentPopover.vue +12 -77
  207. package/src/v2/components/chat/CopilotChatInput.vue +139 -654
  208. package/src/v2/components/chat/CopilotChatInspectorButton.vue +45 -108
  209. package/src/v2/components/chat/CopilotChatLightbox.vue +10 -31
  210. package/src/v2/components/chat/CopilotChatMessageView.vue +96 -274
  211. package/src/v2/components/chat/CopilotChatReasoningMessage.vue +27 -62
  212. package/src/v2/components/chat/CopilotChatToolCallGroup.vue +63 -71
  213. package/src/v2/components/chat/CopilotChatToolCallItem.vue +8 -6
  214. package/src/v2/components/chat/CopilotChatToolCallsView.vue +31 -32
  215. package/src/v2/components/chat/CopilotChatUserMessage.vue +24 -112
  216. package/src/v2/components/chat/CopilotChatView.vue +123 -161
  217. package/src/v2/components/chat/CopilotChatWorkSummary.vue +26 -36
  218. package/src/v2/components/chat/CopilotModalHeader.vue +11 -23
  219. package/src/v2/components/chat/CopilotPopup.vue +23 -25
  220. package/src/v2/components/chat/CopilotPopupView.vue +10 -39
  221. package/src/v2/components/chat/CopilotPopupViewInternal.vue +49 -185
  222. package/src/v2/components/chat/CopilotSidebar.vue +23 -25
  223. package/src/v2/components/chat/CopilotSidebarView.vue +10 -39
  224. package/src/v2/components/chat/CopilotSidebarViewInternal.vue +56 -100
  225. package/src/v2/components/chat/CopilotThreadsDrawer.vue +43 -105
  226. package/src/v2/components/chat/StreamingMarkdownDefault.vue +15 -28
  227. package/src/v2/components/chat/__tests__/CopilotChat.labels.test.ts +19 -4
  228. package/src/v2/components/chat/__tests__/CopilotChat.test.ts +12 -10
  229. package/src/v2/components/chat/__tests__/CopilotChatActivityRendering.e2e.test.ts +26 -9
  230. package/src/v2/components/chat/__tests__/CopilotChatAssistantMessage.learningFeedback.test.ts +5 -5
  231. package/src/v2/components/chat/__tests__/CopilotChatAttachmentQueue.test.ts +28 -0
  232. package/src/v2/components/chat/__tests__/CopilotChatInput.test.ts +132 -1
  233. package/src/v2/components/chat/__tests__/CopilotChatMessageView.test.ts +247 -403
  234. package/src/v2/components/chat/__tests__/CopilotChatMessageView.toolCallDisplay.test.ts +1 -99
  235. package/src/v2/components/chat/__tests__/CopilotChatView.pinToSend.test.ts +43 -1
  236. package/src/v2/components/chat/__tests__/CopilotPopup.test.ts +90 -1
  237. package/src/v2/components/chat/__tests__/CopilotPopupView.test.ts +19 -0
  238. package/src/v2/components/chat/__tests__/CopilotSidebar.test.ts +90 -1
  239. package/src/v2/components/chat/__tests__/CopilotSidebarView.position.test.ts +32 -8
  240. package/src/v2/components/chat/__tests__/CopilotSidebarView.test.ts +2 -1
  241. package/src/v2/components/chat/__tests__/StreamingMarkdownDefault.test.ts +54 -0
  242. package/src/v2/components/chat/audioRecorder.ts +4 -7
  243. package/src/v2/components/chat/copilotChatToolCallItemRender.ts +25 -90
  244. package/src/v2/components/chat/forwarded-slots.ts +17 -0
  245. package/src/v2/components/chat/index.ts +0 -1
  246. package/src/v2/components/chat/inspector-shortcuts.ts +10 -16
  247. package/src/v2/components/chat/message-feedback.ts +92 -195
  248. package/src/v2/components/chat/tool-call-display-context.ts +6 -22
  249. package/src/v2/components/chat/tool-call-group-parts.ts +47 -108
  250. package/src/v2/components/chat/turn-work.ts +0 -9
  251. package/src/v2/components/chat/types.ts +12 -4
  252. package/src/v2/components/chat/use-chat-labels.ts +16 -0
  253. package/src/v2/components/chat/use-copy-feedback.ts +21 -0
  254. package/src/v2/components/chat/use-lightbox.ts +15 -33
  255. package/src/v2/components/icons/__tests__/icons.test.ts +72 -68
  256. package/src/v2/components/icons/index.ts +109 -27
  257. package/src/v2/hooks/__tests__/use-agent-error-state.test.ts +5 -3
  258. package/src/v2/hooks/__tests__/use-agent-stability.test.ts +25 -4
  259. package/src/v2/hooks/__tests__/use-agent-throttle.test.ts +5 -1
  260. package/src/v2/hooks/__tests__/use-agent.test.ts +6 -3
  261. package/src/v2/hooks/__tests__/use-component.test.ts +21 -0
  262. package/src/v2/hooks/__tests__/use-configure-suggestions.test.ts +30 -1
  263. package/src/v2/hooks/__tests__/use-default-render-tool.test.ts +10 -10
  264. package/src/v2/hooks/__tests__/use-frontend-tool.e2e.test.ts +66 -1
  265. package/src/v2/hooks/__tests__/use-human-in-the-loop.e2e.test.ts +6 -1
  266. package/src/v2/hooks/__tests__/use-human-in-the-loop.test.ts +187 -12
  267. package/src/v2/hooks/__tests__/use-interrupt.test.ts +97 -0
  268. package/src/v2/hooks/__tests__/use-render-activity-message.test.ts +106 -0
  269. package/src/v2/hooks/__tests__/use-render-tool.test.ts +3 -6
  270. package/src/v2/hooks/__tests__/use-threads.test.ts +48 -6
  271. package/src/v2/hooks/__tests__/zod-regression.test.ts +5 -4
  272. package/src/v2/hooks/use-agent-context.ts +4 -10
  273. package/src/v2/hooks/use-agent.ts +86 -290
  274. package/src/v2/hooks/use-attachments.ts +48 -168
  275. package/src/v2/hooks/use-capabilities.ts +2 -7
  276. package/src/v2/hooks/use-component.ts +7 -4
  277. package/src/v2/hooks/use-configure-suggestions.ts +29 -220
  278. package/src/v2/hooks/use-default-render-tool.ts +31 -152
  279. package/src/v2/hooks/use-frontend-tool.ts +15 -25
  280. package/src/v2/hooks/use-human-in-the-loop.ts +11 -80
  281. package/src/v2/hooks/use-interrupt.ts +29 -308
  282. package/src/v2/hooks/use-keyboard-height.ts +17 -40
  283. package/src/v2/hooks/use-pin-to-send.ts +15 -99
  284. package/src/v2/hooks/use-render-activity-message.ts +35 -57
  285. package/src/v2/hooks/use-render-custom-messages.ts +24 -88
  286. package/src/v2/hooks/use-render-tool.ts +2 -4
  287. package/src/v2/hooks/use-suggestions.ts +17 -36
  288. package/src/v2/hooks/use-threads.ts +49 -288
  289. package/src/v2/lib/__tests__/shallow-stable.test.ts +54 -0
  290. package/src/v2/lib/__tests__/vue-core-renderers.test.ts +42 -0
  291. package/src/v2/lib/processPartialHtml.ts +6 -21
  292. package/src/v2/lib/shallow-stable.ts +2 -16
  293. package/src/v2/lib/vue-core.ts +90 -85
  294. package/src/v2/providers/CopilotChatConfigurationProvider.vue +48 -186
  295. package/src/v2/providers/CopilotKitProvider.types.ts +12 -132
  296. package/src/v2/providers/CopilotKitProvider.vue +291 -641
  297. package/src/v2/providers/__tests__/CopilotChatConfigurationProvider.test.ts +22 -2
  298. package/src/v2/providers/__tests__/CopilotKitProvider.a2ui.test.ts +38 -2
  299. package/src/v2/providers/__tests__/CopilotKitProvider.config.test.ts +124 -0
  300. package/src/v2/providers/__tests__/CopilotKitProvider.headersAtSendTime.test.ts +3 -3
  301. package/src/v2/providers/__tests__/CopilotKitProvider.learning.test.ts +3 -1
  302. package/src/v2/providers/__tests__/CopilotKitProvider.sandboxFunctions.test.ts +4 -1
  303. package/src/v2/providers/__tests__/CopilotKitProvider.test.ts +88 -28
  304. package/src/v2/providers/chat-configuration-store-key.ts +9 -0
  305. package/src/v2/providers/markdown-renderer.ts +8 -2
  306. package/src/v2/providers/types.ts +3 -49
  307. package/src/v2/providers/use-inspector-thread-override.ts +22 -80
  308. package/src/v2/types/__tests__/defineToolCallRenderer.test.ts +28 -33
  309. package/src/v2/types/defineToolCallRenderer.ts +7 -6
  310. package/src/v2/types/human-in-the-loop.ts +8 -32
  311. package/src/v2/types/interrupt.ts +7 -31
  312. package/src/v2/types/vue-activity-message-renderer.ts +24 -15
  313. package/src/v2/types/vue-custom-message-renderer.ts +12 -16
  314. package/src/v2/types/vue-tool-call-renderer.ts +23 -38
  315. package/tsconfig.json +0 -1
  316. package/vite.config.ts +8 -5
  317. package/vitest.config.ts +12 -7
  318. package/dist/v2/components/chat/BasicMarkdown.vue.d.ts +0 -9
  319. package/dist/v2/components/chat/BasicMarkdown.vue.d.ts.map +0 -1
  320. package/dist/v2/components/chat/normalize-auto-scroll.d.ts +0 -3
  321. package/dist/v2/components/chat/normalize-auto-scroll.d.ts.map +0 -1
  322. package/dist/v2/components/chat/tool-call-layout.d.ts +0 -115
  323. package/dist/v2/components/chat/tool-call-layout.d.ts.map +0 -1
  324. package/dist/v2/lib/is-mobile-viewport.d.ts +0 -15
  325. package/dist/v2/lib/is-mobile-viewport.d.ts.map +0 -1
  326. package/dist/v2/lib/message-feedback.d.ts +0 -33
  327. package/dist/v2/lib/message-feedback.d.ts.map +0 -1
  328. package/dist/v2/lib/transcription-client.d.ts +0 -19
  329. package/dist/v2/lib/transcription-client.d.ts.map +0 -1
  330. package/src/v2/components/__tests__/A2UICatalogContext.test.ts +0 -63
  331. package/src/v2/components/a2ui/__tests__/A2UIRecoveryStates.test.ts +0 -175
  332. package/src/v2/components/chat/BasicMarkdown.vue +0 -160
  333. package/src/v2/components/chat/__tests__/BasicMarkdown.test.ts +0 -69
  334. package/src/v2/components/chat/__tests__/normalize-auto-scroll.test.ts +0 -39
  335. package/src/v2/components/chat/normalize-auto-scroll.ts +0 -17
  336. package/src/v2/components/chat/tool-call-layout.ts +0 -304
  337. package/src/v2/lib/__tests__/is-mobile-viewport.test.ts +0 -48
  338. package/src/v2/lib/__tests__/message-feedback.test.ts +0 -152
  339. package/src/v2/lib/__tests__/processPartialHtml.test.ts +0 -84
  340. package/src/v2/lib/__tests__/transcription-client.test.ts +0 -67
  341. package/src/v2/lib/is-mobile-viewport.ts +0 -23
  342. package/src/v2/lib/message-feedback.ts +0 -120
  343. package/src/v2/lib/transcription-client.ts +0 -151
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@copilotkit/vue",
3
- "version": "2.0.0-rc.3",
3
+ "version": "2.0.0-rc.30",
4
4
  "private": false,
5
5
  "description": "Vue 3 components and composables for CopilotKit",
6
6
  "keywords": [
@@ -59,18 +59,16 @@
59
59
  },
60
60
  "dependencies": {
61
61
  "@a2ui/web_core": "0.10.4",
62
- "@ag-ui/client": "1.0.2",
63
- "@ag-ui/core": "1.0.2",
64
- "@copilotkit/core": "2.0.0-rc.3",
65
- "@copilotkit/markdown-renderer": "2.0.0-rc.3",
66
- "@copilotkit/mcp-apps-renderer": "2.0.0-rc.3",
67
- "@copilotkit/shared": "2.0.0-rc.3",
68
- "@copilotkit/web-components": "2.0.0-rc.3",
69
- "@copilotkit/web-inspector": "2.0.0-rc.3",
70
- "@jetbrains/websandbox": "^1.1.3",
71
- "lucide-vue-next": "^0.525.0",
72
- "zod": "^3.25.75",
73
- "zod-to-json-schema": "^3.24.5"
62
+ "@ag-ui/client": "1.0.4",
63
+ "@ag-ui/core": "1.0.4",
64
+ "@copilotkit/a2ui-renderer": "2.0.0-rc.30",
65
+ "@copilotkit/core": "2.0.0-rc.30",
66
+ "@copilotkit/markdown": "2.0.0-rc.30",
67
+ "@copilotkit/mcp-apps-renderer": "2.0.0-rc.30",
68
+ "@copilotkit/shared": "2.0.0-rc.30",
69
+ "@copilotkit/web-components": "2.0.0-rc.30",
70
+ "@copilotkit/web-inspector": "2.0.0-rc.30",
71
+ "zod": "^4.2.0"
74
72
  },
75
73
  "devDependencies": {
76
74
  "@eslint/js": "^9.39.2",
@@ -94,6 +92,7 @@
94
92
  "vue": "^3.5.28",
95
93
  "vue-eslint-parser": "^10.4.0",
96
94
  "vue-tsc": "^2.1.10",
95
+ "zod-v3": "npm:zod@^3.25.76",
97
96
  "@copilotkit/typescript-config": "1.55.0-next.8"
98
97
  },
99
98
  "peerDependencies": {
@@ -0,0 +1,29 @@
1
+ // @vitest-environment node
2
+ import { describe, expect, it } from "vitest";
3
+ import type { LibraryOptions } from "vite";
4
+ import config from "../../vite.config";
5
+ import { useFrontendTool as v1UseFrontendTool } from "../hooks/use-frontend-tool";
6
+ import { useFrontendTool as v2UseFrontendTool } from "../v2/hooks/use-frontend-tool";
7
+
8
+ // The package's "./v2" export points at the build's "v2/index" entry, and "."
9
+ // at "index". Each entry must build from the module that matches its export.
10
+ const entries = (config.build?.lib as LibraryOptions).entry as Record<
11
+ string,
12
+ string
13
+ >;
14
+
15
+ // The first import transforms the whole entry from source, which takes more
16
+ // than the 5s default when the suite runs next to other packages.
17
+ describe("library build entries", { timeout: 30_000 }, () => {
18
+ it("builds @copilotkit/vue/v2 from the v2 module, with the v2 hooks", async () => {
19
+ const v2 = await import(/* @vite-ignore */ entries["v2/index"]!);
20
+
21
+ expect(v2.useFrontendTool).toBe(v2UseFrontendTool);
22
+ });
23
+
24
+ it("builds @copilotkit/vue from the root module, with the v1-compatible hooks", async () => {
25
+ const root = await import(/* @vite-ignore */ entries.index!);
26
+
27
+ expect(root.useFrontendTool).toBe(v1UseFrontendTool);
28
+ });
29
+ });
@@ -0,0 +1,520 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { z } from "zod";
3
+ import type { Parameter } from "@copilotkit/shared";
4
+ import {
5
+ convertJsonSchemaToZodSchema,
6
+ getZodParameters,
7
+ } from "../zod-parameters";
8
+
9
+ describe("convertJsonSchemaToZodSchema", () => {
10
+ it("should convert a simple JSON schema to a Zod schema", () => {
11
+ const jsonSchema = {
12
+ type: "object",
13
+ properties: {
14
+ name: { type: "string" },
15
+ age: { type: "number" },
16
+ },
17
+ required: ["name", "age"],
18
+ };
19
+
20
+ const expectedSchema = z.object({
21
+ name: z.string(),
22
+ age: z.number(),
23
+ });
24
+
25
+ const result = convertJsonSchemaToZodSchema(jsonSchema, true);
26
+ const resultSchemaJson = z.toJSONSchema(result);
27
+ const expectedSchemaJson = z.toJSONSchema(expectedSchema);
28
+
29
+ expect(resultSchemaJson).toStrictEqual(expectedSchemaJson);
30
+ });
31
+
32
+ it("should convert a JSON schema with nested objects to a Zod schema", () => {
33
+ const jsonSchema = {
34
+ type: "object",
35
+ properties: {
36
+ name: { type: "string" },
37
+ address: {
38
+ type: "object",
39
+ properties: {
40
+ street: { type: "string" },
41
+ city: { type: "string" },
42
+ },
43
+ required: ["street", "city"],
44
+ },
45
+ },
46
+ required: ["name", "address"],
47
+ };
48
+
49
+ const expectedSchema = z.object({
50
+ name: z.string(),
51
+ address: z.object({
52
+ street: z.string(),
53
+ city: z.string(),
54
+ }),
55
+ });
56
+
57
+ const result = convertJsonSchemaToZodSchema(jsonSchema, true);
58
+ const resultSchemaJson = z.toJSONSchema(result);
59
+ const expectedSchemaJson = z.toJSONSchema(expectedSchema);
60
+
61
+ expect(resultSchemaJson).toStrictEqual(expectedSchemaJson);
62
+ });
63
+
64
+ it("should convert a JSON schema with arrays to a Zod schema", () => {
65
+ const jsonSchema = {
66
+ type: "object",
67
+ properties: {
68
+ names: {
69
+ type: "array",
70
+ items: { type: "string" },
71
+ },
72
+ },
73
+ required: ["names"],
74
+ };
75
+
76
+ const expectedSchema = z.object({
77
+ names: z.array(z.string()),
78
+ });
79
+
80
+ const result = convertJsonSchemaToZodSchema(jsonSchema, true);
81
+ const resultSchemaJson = z.toJSONSchema(result);
82
+ const expectedSchemaJson = z.toJSONSchema(expectedSchema);
83
+
84
+ expect(resultSchemaJson).toStrictEqual(expectedSchemaJson);
85
+ });
86
+
87
+ it("should convert a JSON schema with optional properties to a Zod schema", () => {
88
+ const jsonSchema = {
89
+ type: "object",
90
+ properties: {
91
+ name: { type: "string" },
92
+ age: { type: "number", required: false },
93
+ },
94
+ };
95
+
96
+ const expectedSchema = z
97
+ .object({
98
+ name: z.string().optional(),
99
+ age: z.number().optional(),
100
+ })
101
+ .optional();
102
+
103
+ const result = convertJsonSchemaToZodSchema(jsonSchema, false);
104
+
105
+ const resultSchemaJson = z.toJSONSchema(result);
106
+ const expectedSchemaJson = z.toJSONSchema(expectedSchema);
107
+
108
+ expect(resultSchemaJson).toStrictEqual(expectedSchemaJson);
109
+ });
110
+
111
+ it("should convert a JSON schema with different types to a Zod schema", () => {
112
+ const jsonSchema = {
113
+ type: "object",
114
+ properties: {
115
+ name: { type: "string" },
116
+ age: { type: "number" },
117
+ isAdmin: { type: "boolean" },
118
+ },
119
+ required: ["name", "age", "isAdmin"],
120
+ };
121
+
122
+ const expectedSchema = z.object({
123
+ name: z.string(),
124
+ age: z.number(),
125
+ isAdmin: z.boolean(),
126
+ });
127
+
128
+ const result = convertJsonSchemaToZodSchema(jsonSchema, true);
129
+ const resultSchemaJson = z.toJSONSchema(result);
130
+ const expectedSchemaJson = z.toJSONSchema(expectedSchema);
131
+
132
+ expect(resultSchemaJson).toStrictEqual(expectedSchemaJson);
133
+ });
134
+
135
+ it("should handle edge case where JSON schema has no properties", () => {
136
+ const jsonSchema = {
137
+ type: "object",
138
+ };
139
+
140
+ const expectedSchema = z.object({});
141
+
142
+ const result = convertJsonSchemaToZodSchema(jsonSchema, true);
143
+ const resultSchemaJson = z.toJSONSchema(result);
144
+ const expectedSchemaJson = z.toJSONSchema(expectedSchema);
145
+
146
+ expect(resultSchemaJson).toStrictEqual(expectedSchemaJson);
147
+ });
148
+
149
+ it("should preserve string enum constraints", () => {
150
+ const jsonSchema = {
151
+ type: "object",
152
+ properties: {
153
+ status: {
154
+ type: "string",
155
+ description: "The status",
156
+ enum: ["todo", "done"],
157
+ },
158
+ },
159
+ required: ["status"],
160
+ };
161
+ const result = convertJsonSchemaToZodSchema(jsonSchema, true);
162
+ const statusSchema = (result as z.ZodObject<any>).shape.status;
163
+ expect(statusSchema).toBeInstanceOf(z.ZodEnum);
164
+ expect(statusSchema.options).toEqual(["todo", "done"]);
165
+ });
166
+
167
+ it("should handle null-union type ['string', 'null'] as nullable", () => {
168
+ const jsonSchema = {
169
+ type: "object",
170
+ properties: {
171
+ nickname: {
172
+ type: ["string", "null"],
173
+ description: "Optional nickname",
174
+ },
175
+ },
176
+ required: ["nickname"],
177
+ };
178
+
179
+ const result = convertJsonSchemaToZodSchema(jsonSchema, true);
180
+ const shape = (result as z.ZodObject<any>).shape;
181
+
182
+ // The nickname field should accept both string and null
183
+ expect(shape.nickname.safeParse("hello").success).toBe(true);
184
+ expect(shape.nickname.safeParse(null).success).toBe(true);
185
+ expect(shape.nickname.safeParse(42).success).toBe(false);
186
+ });
187
+
188
+ it("should handle null-union type ['number', 'null'] as nullable number", () => {
189
+ const jsonSchema = {
190
+ type: "object",
191
+ properties: {
192
+ score: {
193
+ type: ["number", "null"],
194
+ },
195
+ },
196
+ required: ["score"],
197
+ };
198
+
199
+ const result = convertJsonSchemaToZodSchema(jsonSchema, true);
200
+ const shape = (result as z.ZodObject<any>).shape;
201
+
202
+ expect(shape.score.safeParse(42).success).toBe(true);
203
+ expect(shape.score.safeParse(null).success).toBe(true);
204
+ expect(shape.score.safeParse("hello").success).toBe(false);
205
+ });
206
+
207
+ it("should handle edge case where JSON schema has no required properties", () => {
208
+ const jsonSchema = {
209
+ type: "object",
210
+ properties: {
211
+ name: { type: "string" },
212
+ age: { type: "number" },
213
+ },
214
+ };
215
+
216
+ const expectedSchema = z
217
+ .object({
218
+ name: z.string().optional(),
219
+ age: z.number().optional(),
220
+ })
221
+ .optional();
222
+
223
+ const result = convertJsonSchemaToZodSchema(jsonSchema, false);
224
+ const resultSchemaJson = z.toJSONSchema(result);
225
+ const expectedSchemaJson = z.toJSONSchema(expectedSchema);
226
+
227
+ expect(resultSchemaJson).toStrictEqual(expectedSchemaJson);
228
+ });
229
+
230
+ it("should resolve non-circular $ref definitions correctly", () => {
231
+ const jsonSchema = {
232
+ type: "object",
233
+ properties: {
234
+ address: { $ref: "#/$defs/Address" },
235
+ },
236
+ required: ["address"],
237
+ $defs: {
238
+ Address: {
239
+ type: "object",
240
+ properties: {
241
+ street: { type: "string", description: "Street name" },
242
+ city: { type: "string", description: "City name" },
243
+ },
244
+ required: ["street", "city"],
245
+ description: "A postal address",
246
+ },
247
+ },
248
+ };
249
+
250
+ const result = convertJsonSchemaToZodSchema(jsonSchema, true);
251
+ const resultJson = z.toJSONSchema(result);
252
+
253
+ const expectedSchema = z.object({
254
+ address: z
255
+ .object({
256
+ street: z.string().describe("Street name"),
257
+ city: z.string().describe("City name"),
258
+ })
259
+ .describe("A postal address"),
260
+ });
261
+ const expectedJson = z.toJSONSchema(expectedSchema);
262
+
263
+ expect(resultJson).toStrictEqual(expectedJson);
264
+ });
265
+
266
+ it("should handle circular $ref without crashing and return z.any()", () => {
267
+ // A schema where Node references itself — this would cause infinite
268
+ // recursion without cycle detection.
269
+ const jsonSchema = {
270
+ type: "object",
271
+ properties: {
272
+ root: { $ref: "#/$defs/Node" },
273
+ },
274
+ required: ["root"],
275
+ $defs: {
276
+ Node: {
277
+ type: "object",
278
+ properties: {
279
+ value: { type: "string", description: "Node value" },
280
+ child: { $ref: "#/$defs/Node" },
281
+ },
282
+ required: ["value"],
283
+ description: "A tree node",
284
+ },
285
+ },
286
+ };
287
+
288
+ const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {});
289
+
290
+ // Must not throw or hang
291
+ const result = convertJsonSchemaToZodSchema(jsonSchema, true);
292
+ expect(result).toBeDefined();
293
+
294
+ // The circular ref should have produced a console.warn
295
+ expect(warnSpy).toHaveBeenCalledWith(
296
+ expect.stringContaining("Circular $ref detected"),
297
+ );
298
+
299
+ // The top-level shape should still have a "root" key that is an object
300
+ const shape = (result as z.ZodObject<any>).shape;
301
+ expect(shape.root).toBeDefined();
302
+
303
+ // Inside root, "value" should be a string and "child" should be z.any()
304
+ // (child is optional since it's not in required[], so unwrap ZodOptional)
305
+ const rootShape = (shape.root as z.ZodObject<any>).shape;
306
+ expect(rootShape.value).toBeInstanceOf(z.ZodString);
307
+ const child = rootShape.child;
308
+ if (child instanceof z.ZodOptional) {
309
+ expect(child.unwrap()).toBeInstanceOf(z.ZodAny);
310
+ } else {
311
+ expect(child).toBeInstanceOf(z.ZodAny);
312
+ }
313
+
314
+ warnSpy.mockRestore();
315
+ });
316
+
317
+ it("should resolve the same $ref used by multiple sibling properties", () => {
318
+ // Two properties reference the same $def — the visited set must NOT
319
+ // mark the second usage as circular.
320
+ const jsonSchema = {
321
+ type: "object",
322
+ properties: {
323
+ billing: { $ref: "#/$defs/Address" },
324
+ shipping: { $ref: "#/$defs/Address" },
325
+ },
326
+ required: ["billing", "shipping"],
327
+ $defs: {
328
+ Address: {
329
+ type: "object",
330
+ properties: {
331
+ street: { type: "string", description: "Street" },
332
+ city: { type: "string", description: "City" },
333
+ },
334
+ required: ["street", "city"],
335
+ description: "An address",
336
+ },
337
+ },
338
+ };
339
+
340
+ const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {});
341
+
342
+ const result = convertJsonSchemaToZodSchema(jsonSchema, true);
343
+ const shape = (result as z.ZodObject<any>).shape;
344
+
345
+ // Both should be fully resolved objects, NOT z.any()
346
+ expect(shape.billing).toBeInstanceOf(z.ZodObject);
347
+ expect(shape.shipping).toBeInstanceOf(z.ZodObject);
348
+
349
+ // No circular-ref warning should have been emitted
350
+ expect(warnSpy).not.toHaveBeenCalled();
351
+
352
+ warnSpy.mockRestore();
353
+ });
354
+
355
+ it("should resolve a shared $ref used in different branches of a $ref chain", () => {
356
+ // Wrapper -> Container (via $ref) which has two children both using $ref to Leaf.
357
+ // Without set cloning, the second Leaf ref in Container would be wrongly flagged
358
+ // as circular because the first Leaf resolution already added it to the set.
359
+ const jsonSchema = {
360
+ type: "object",
361
+ properties: {
362
+ wrapper: { $ref: "#/$defs/Container" },
363
+ },
364
+ required: ["wrapper"],
365
+ $defs: {
366
+ Container: {
367
+ type: "object",
368
+ properties: {
369
+ first: { $ref: "#/$defs/Leaf" },
370
+ second: { $ref: "#/$defs/Leaf" },
371
+ },
372
+ required: ["first", "second"],
373
+ description: "A container with two leaves",
374
+ },
375
+ Leaf: {
376
+ type: "object",
377
+ properties: {
378
+ label: { type: "string", description: "Leaf label" },
379
+ },
380
+ required: ["label"],
381
+ description: "A leaf node",
382
+ },
383
+ },
384
+ };
385
+
386
+ const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {});
387
+
388
+ const result = convertJsonSchemaToZodSchema(jsonSchema, true);
389
+ const wrapperShape = (
390
+ (result as z.ZodObject<any>).shape.wrapper as z.ZodObject<any>
391
+ ).shape;
392
+
393
+ // Both first and second should be fully resolved Leaf objects
394
+ expect(wrapperShape.first).toBeInstanceOf(z.ZodObject);
395
+ expect(wrapperShape.second).toBeInstanceOf(z.ZodObject);
396
+
397
+ // No circular-ref warning should have been emitted
398
+ expect(warnSpy).not.toHaveBeenCalled();
399
+
400
+ warnSpy.mockRestore();
401
+ });
402
+
403
+ it("should handle anyOf with $ref variants", () => {
404
+ const jsonSchema = {
405
+ type: "object",
406
+ properties: {
407
+ pet: {
408
+ anyOf: [{ $ref: "#/$defs/Cat" }, { $ref: "#/$defs/Dog" }],
409
+ description: "A pet",
410
+ },
411
+ },
412
+ required: ["pet"],
413
+ $defs: {
414
+ Cat: {
415
+ type: "object",
416
+ properties: { meow: { type: "boolean" } },
417
+ required: ["meow"],
418
+ },
419
+ Dog: {
420
+ type: "object",
421
+ properties: { bark: { type: "boolean" } },
422
+ required: ["bark"],
423
+ },
424
+ },
425
+ };
426
+
427
+ const result = convertJsonSchemaToZodSchema(jsonSchema, true);
428
+ expect(result).toBeDefined();
429
+
430
+ // Should produce a union inside the "pet" property
431
+ const petSchema = (result as z.ZodObject<any>).shape.pet;
432
+ expect(petSchema).toBeInstanceOf(z.ZodUnion);
433
+ });
434
+
435
+ it("should handle integer type as z.number()", () => {
436
+ const jsonSchema = {
437
+ type: "object",
438
+ properties: {
439
+ count: { type: "integer", description: "A count" },
440
+ },
441
+ required: ["count"],
442
+ };
443
+
444
+ const result = convertJsonSchemaToZodSchema(jsonSchema, true);
445
+ const shape = (result as z.ZodObject<any>).shape;
446
+ expect(shape.count).toBeInstanceOf(z.ZodNumber);
447
+ });
448
+
449
+ it("should handle null type", () => {
450
+ const jsonSchema = {
451
+ type: "object",
452
+ properties: {
453
+ empty: { type: "null", description: "Always null" },
454
+ },
455
+ required: ["empty"],
456
+ };
457
+
458
+ const result = convertJsonSchemaToZodSchema(jsonSchema, true);
459
+ const shape = (result as z.ZodObject<any>).shape;
460
+ expect(shape.empty).toBeInstanceOf(z.ZodNull);
461
+ });
462
+
463
+ it("should warn and return z.any() for unsupported schema types", () => {
464
+ const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {});
465
+
466
+ const jsonSchema = { type: "custom_unsupported" };
467
+ const result = convertJsonSchemaToZodSchema(jsonSchema, true);
468
+
469
+ expect(result).toBeInstanceOf(z.ZodAny);
470
+ expect(warnSpy).toHaveBeenCalledWith(
471
+ expect.stringContaining(
472
+ 'Unsupported JSON schema type "custom_unsupported"',
473
+ ),
474
+ );
475
+
476
+ warnSpy.mockRestore();
477
+ });
478
+ });
479
+
480
+ describe("getZodParameters", () => {
481
+ it("returns an empty object schema without parameters", () => {
482
+ expect(z.toJSONSchema(getZodParameters(undefined))).toStrictEqual(
483
+ z.toJSONSchema(z.object({})),
484
+ );
485
+ });
486
+
487
+ it("converts v1 parameters to a Zod object schema", () => {
488
+ const parameters: Parameter[] = [
489
+ { name: "name", type: "string", description: "User name" },
490
+ { name: "age", type: "number", required: false },
491
+ { name: "role", type: "string", enum: ["admin", "user"] },
492
+ {
493
+ name: "address",
494
+ type: "object",
495
+ attributes: [{ name: "city", type: "string" }],
496
+ },
497
+ { name: "tags", type: "string[]" },
498
+ ];
499
+
500
+ const schema = getZodParameters(parameters);
501
+
502
+ expect(
503
+ schema.safeParse({
504
+ name: "Ada",
505
+ role: "admin",
506
+ address: { city: "London" },
507
+ tags: ["a"],
508
+ }).success,
509
+ ).toBe(true);
510
+ expect(
511
+ schema.safeParse({
512
+ name: "Ada",
513
+ role: "owner",
514
+ address: { city: "London" },
515
+ tags: [],
516
+ }).success,
517
+ ).toBe(false);
518
+ expect(schema.safeParse({ role: "user" }).success).toBe(false);
519
+ });
520
+ });
@@ -7,7 +7,8 @@
7
7
  import type { WatchSource } from "vue";
8
8
  import type { WebMCPToolConfig } from "@copilotkit/core";
9
9
  import type { Parameter, MappedParameterTypes } from "@copilotkit/shared";
10
- import { getZodParameters, parseJson } from "@copilotkit/shared";
10
+ import { parseJson } from "@copilotkit/shared";
11
+ import { getZodParameters } from "./zod-parameters";
11
12
  import { useFrontendTool as useFrontendToolV2 } from "../v2/hooks/use-frontend-tool";
12
13
  import { useHumanInTheLoop as useHumanInTheLoopV2 } from "../v2/hooks/use-human-in-the-loop";
13
14
  import { useRenderTool as useRenderToolV2 } from "../v2/hooks/use-render-tool";
@@ -6,12 +6,9 @@
6
6
  */
7
7
  import type { WatchSource } from "vue";
8
8
  import type { WebMCPToolConfig } from "@copilotkit/core";
9
- import {
10
- type Parameter,
11
- type MappedParameterTypes,
12
- getZodParameters,
13
- parseJson,
14
- } from "@copilotkit/shared";
9
+ import { parseJson } from "@copilotkit/shared";
10
+ import type { Parameter, MappedParameterTypes } from "@copilotkit/shared";
11
+ import { getZodParameters } from "./zod-parameters";
15
12
  import { useFrontendTool as useFrontendToolV2 } from "../v2/hooks/use-frontend-tool";
16
13
  import type { VueFrontendTool } from "../v2/types";
17
14