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

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-BMTHA_P2.js +15901 -0
  13. package/dist/use-render-activity-message-BMTHA_P2.js.map +1 -0
  14. package/dist/use-render-activity-message-CH3beu7z.cjs +113 -0
  15. package/dist/use-render-activity-message-CH3beu7z.cjs.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
@@ -1,17 +1,25 @@
1
- import { describe, expect, it } from "vitest";
1
+ import { afterEach, describe, expect, it, vi } from "vitest";
2
2
  import { defineComponent, h, ref } from "vue";
3
- import { render, waitFor } from "@testing-library/vue";
3
+ import { fireEvent, render, waitFor } from "@testing-library/vue";
4
+ import type { ɵA2UIActionInterceptor } from "@copilotkit/core";
4
5
  import { createA2UIMessageRenderer } from "../A2UIMessageRenderer";
5
6
  import { CopilotKitKey } from "../../providers/keys";
6
7
 
7
- function copilotKitProvide() {
8
+ function copilotKitProvide(
9
+ onRunAgent: (properties: Record<string, unknown>) => void = () => undefined,
10
+ ) {
11
+ const copilotkit = {
12
+ properties: {} as Record<string, unknown>,
13
+ setProperties(properties: Record<string, unknown>) {
14
+ copilotkit.properties = properties;
15
+ },
16
+ runAgent: async () => {
17
+ onRunAgent(copilotkit.properties);
18
+ },
19
+ };
8
20
  return {
9
21
  [CopilotKitKey as symbol]: {
10
- copilotkit: ref({
11
- properties: {},
12
- setProperties: () => undefined,
13
- runAgent: async () => undefined,
14
- }),
22
+ copilotkit: ref(copilotkit),
15
23
  executingToolCallIds: ref(new Set()),
16
24
  a2uiTheme: ref({}),
17
25
  a2uiCatalog: ref(undefined),
@@ -22,6 +30,10 @@ function copilotKitProvide() {
22
30
  }
23
31
 
24
32
  describe("createA2UIMessageRenderer", () => {
33
+ afterEach(() => {
34
+ vi.useRealTimers();
35
+ });
36
+
25
37
  const renderLifecycle = (
26
38
  content: Record<string, unknown>,
27
39
  options: Partial<Parameters<typeof createA2UIMessageRenderer>[0]> = {},
@@ -46,6 +58,43 @@ describe("createA2UIMessageRenderer", () => {
46
58
  expect(container.textContent).toContain("~97 tokens");
47
59
  });
48
60
 
61
+ it("keeps an early retry looking like building until showAfterMs passes", async () => {
62
+ vi.useFakeTimers();
63
+ const { container } = renderLifecycle(
64
+ { status: "retrying", attempt: 1, maxAttempts: 3 },
65
+ { recovery: { showAfterMs: 2000 } },
66
+ );
67
+ expect(container.textContent).toContain("Building interface");
68
+ await vi.advanceTimersByTimeAsync(2000);
69
+ expect(container.textContent).toContain(
70
+ "Retrying generation… (1/3 attempts)",
71
+ );
72
+ });
73
+
74
+ it("shows retry validation issues unless debugExposure is hidden", () => {
75
+ const retry = {
76
+ status: "retrying",
77
+ attempt: 2,
78
+ errors: [{ code: "missing_required_prop" }],
79
+ };
80
+ const shown = renderLifecycle(retry);
81
+ expect(shown.container.querySelector("details summary")?.textContent).toBe(
82
+ "validation issues",
83
+ );
84
+ expect(shown.container.textContent).toContain("missing_required_prop");
85
+ const hidden = renderLifecycle(retry, {
86
+ recovery: { debugExposure: "hidden" },
87
+ });
88
+ expect(hidden.container.querySelector("details")).toBeNull();
89
+ });
90
+
91
+ it("shows collapsed developer details on failure by default", () => {
92
+ const { container } = renderLifecycle({ status: "failed", error: "boom" });
93
+ const details = container.querySelector("details");
94
+ expect(details?.hasAttribute("open")).toBe(false);
95
+ expect(details?.textContent).toContain("boom");
96
+ });
97
+
49
98
  it("shows the retry state for status 'retrying'", () => {
50
99
  const { container } = renderLifecycle({
51
100
  status: "retrying",
@@ -295,4 +344,118 @@ describe("createA2UIMessageRenderer", () => {
295
344
  expect(container.querySelector("[data-surface-id='s2']")).not.toBeNull();
296
345
  });
297
346
  });
347
+
348
+ const buttonContent = {
349
+ a2ui_operations: [
350
+ {
351
+ version: "v0.9",
352
+ createSurface: {
353
+ surfaceId: "form",
354
+ catalogId: "https://a2ui.org/specification/v0_9/basic_catalog.json",
355
+ },
356
+ },
357
+ {
358
+ version: "v0.9",
359
+ updateComponents: {
360
+ surfaceId: "form",
361
+ components: [
362
+ {
363
+ id: "root",
364
+ component: "Button",
365
+ child: "label",
366
+ action: { event: { name: "confirm", context: { n: 1 } } },
367
+ },
368
+ { id: "label", component: "Text", text: "Confirm" },
369
+ ],
370
+ },
371
+ },
372
+ ],
373
+ };
374
+
375
+ /** Renders the button surface, clicks it, and returns what reached the agent. */
376
+ async function clickButton(onAction?: ɵA2UIActionInterceptor) {
377
+ const forwarded: Record<string, unknown>[] = [];
378
+ const renderer = createA2UIMessageRenderer({ theme: {}, onAction });
379
+ const { findByRole } = render(renderer.render, {
380
+ props: {
381
+ activityType: "a2ui-surface",
382
+ content: buttonContent,
383
+ message: {},
384
+ agent: { agentId: "a" },
385
+ },
386
+ global: {
387
+ provide: copilotKitProvide((properties) =>
388
+ forwarded.push({ ...properties }),
389
+ ),
390
+ },
391
+ });
392
+ await fireEvent.click(await findByRole("button", { hidden: true }));
393
+ return forwarded;
394
+ }
395
+
396
+ it("forwards a button click to the agent wrapped as an A2UI userAction envelope", async () => {
397
+ const forwarded = await clickButton();
398
+ await waitFor(() => expect(forwarded).toHaveLength(1));
399
+ expect(forwarded[0]).toEqual({
400
+ a2uiAction: {
401
+ userAction: {
402
+ name: "confirm",
403
+ surfaceId: "form",
404
+ sourceComponentId: "root",
405
+ context: { n: 1 },
406
+ timestamp: expect.any(String),
407
+ },
408
+ },
409
+ });
410
+ });
411
+
412
+ it("does not run the agent when onAction handles the action", async () => {
413
+ const onAction = vi.fn<ɵA2UIActionInterceptor>(() => null);
414
+ const forwarded = await clickButton(onAction);
415
+ await waitFor(() => expect(onAction).toHaveBeenCalledOnce());
416
+ expect(forwarded).toEqual([]);
417
+ });
418
+
419
+ it("keeps the loader over the hidden surface until the surface can paint", async () => {
420
+ const renderer = createA2UIMessageRenderer({ theme: {} });
421
+ const createOnly = {
422
+ a2ui_operations: [buttonContent.a2ui_operations[0]],
423
+ };
424
+ const mounted = render(renderer.render, {
425
+ props: {
426
+ activityType: "a2ui-surface",
427
+ content: { status: "building", progressTokens: 120 },
428
+ message: {},
429
+ agent: {},
430
+ },
431
+ global: { provide: copilotKitProvide() },
432
+ });
433
+
434
+ await mounted.rerender({
435
+ activityType: "a2ui-surface",
436
+ content: createOnly,
437
+ message: {},
438
+ agent: {},
439
+ });
440
+ // A surface without components cannot paint: the loader stays on top.
441
+ expect(mounted.container.textContent).toContain("~120 tokens");
442
+ expect(
443
+ mounted.container.querySelector(
444
+ "[aria-hidden='true'] [data-testid='a2ui-activity-renderer']",
445
+ ),
446
+ ).not.toBeNull();
447
+
448
+ await mounted.rerender({
449
+ activityType: "a2ui-surface",
450
+ content: buttonContent,
451
+ message: {},
452
+ agent: {},
453
+ });
454
+ await waitFor(() => {
455
+ expect(mounted.container.textContent).not.toContain("Building interface");
456
+ expect(
457
+ mounted.container.querySelector("[aria-hidden='true']"),
458
+ ).toBeNull();
459
+ });
460
+ });
298
461
  });
@@ -62,6 +62,48 @@ describe("CopilotKitInspector", () => {
62
62
  );
63
63
  });
64
64
 
65
+ it("forwards event listeners to the web inspector element", async () => {
66
+ const onVisibility = vi.fn();
67
+ const wrapper = mount(CopilotKitInspector, {
68
+ attrs: { onCpkInspectorVisibilityChange: onVisibility },
69
+ });
70
+ await settleInspectorLoad();
71
+
72
+ const event = new CustomEvent("cpk-inspector-visibility-change", {
73
+ detail: { visible: false },
74
+ });
75
+ wrapper.get("cpk-web-inspector").element.dispatchEvent(event);
76
+
77
+ expect(onVisibility).toHaveBeenCalledWith(event);
78
+ });
79
+
80
+ it("opens a request made before the web inspector module resolves", async () => {
81
+ const wrapper = mount(CopilotKitInspector);
82
+ const openRequest = { messageId: "message-early" };
83
+ await wrapper.setProps({ openRequest });
84
+
85
+ await settleInspectorLoad();
86
+
87
+ const inspector = wrapper.get("cpk-web-inspector")
88
+ .element as HTMLElement & {
89
+ openInspector: ReturnType<typeof vi.fn>;
90
+ };
91
+ expect(inspector.openInspector).toHaveBeenCalledExactlyOnceWith(
92
+ "message_toolbar",
93
+ openRequest,
94
+ );
95
+ });
96
+
97
+ it("emits Inspector visibility and removes the element on unmount", async () => {
98
+ const wrapper = mount(CopilotKitInspector, { attachTo: document.body });
99
+ await settleInspectorLoad();
100
+ expect(wrapper.emitted("visibility-change")).toEqual([[true]]);
101
+
102
+ wrapper.unmount();
103
+
104
+ expect(document.querySelector("cpk-web-inspector")).toBeNull();
105
+ });
106
+
65
107
  it("forwards Inspector open requests to the mounted element", async () => {
66
108
  const openRequest = { messageId: "message-1" };
67
109
  const wrapper = mount(CopilotKitInspector, {
@@ -1,7 +1,24 @@
1
1
  import { mount } from "@vue/test-utils";
2
2
  import { describe, expect, it, vi } from "vitest";
3
+ import { defineComponent, h } from "vue";
4
+ import type { CopilotChatLabels } from "@copilotkit/core";
5
+ import CopilotChatConfigurationProvider from "../../providers/CopilotChatConfigurationProvider.vue";
6
+ import InlineFeatureWarning from "../InlineFeatureWarning.vue";
3
7
  import LicenseWarningBanner from "../LicenseWarningBanner.vue";
4
8
 
9
+ /** Mounts `child` inside a chat configuration with `labels`. */
10
+ function mountWithLabels(
11
+ labels: Partial<CopilotChatLabels>,
12
+ child: () => ReturnType<typeof h>,
13
+ ) {
14
+ const Host = defineComponent({
15
+ setup: () => () =>
16
+ h(CopilotChatConfigurationProvider, { labels }, { default: child }),
17
+ });
18
+ return mount(Host);
19
+ }
20
+
21
+ // The banner text rules are covered next to core's ɵgetLicenseBannerSpec.
5
22
  describe("LicenseWarningBanner", () => {
6
23
  it("reactively renders and invokes the optional dismiss callback", async () => {
7
24
  const onDismiss = vi.fn();
@@ -20,4 +37,47 @@ describe("LicenseWarningBanner", () => {
20
37
 
21
38
  expect(wrapper.find("button").exists()).toBe(false);
22
39
  });
40
+
41
+ it("shows the core spec's text and link", () => {
42
+ const wrapper = mount(LicenseWarningBanner, {
43
+ props: { type: "expiring", graceRemaining: 1 },
44
+ });
45
+
46
+ expect(wrapper.get("span").text()).toBe(
47
+ "Your CopilotKit license expires in 1 day. Please renew.",
48
+ );
49
+ expect(wrapper.get("a").attributes("href")).toBe(
50
+ "https://dashboard.operations.copilotkit.ai",
51
+ );
52
+ });
53
+
54
+ it("uses the configured chat labels", () => {
55
+ const wrapper = mountWithLabels(
56
+ { licenseInvalidText: "Token ungültig" },
57
+ () => h(LicenseWarningBanner, { type: "invalid" }),
58
+ );
59
+
60
+ expect(wrapper.get("span").text()).toBe("Token ungültig");
61
+ });
62
+ });
63
+
64
+ describe("InlineFeatureWarning", () => {
65
+ it("shows the default feature-unlicensed label", () => {
66
+ const wrapper = mount(InlineFeatureWarning, {
67
+ props: { featureName: "Chat" },
68
+ });
69
+
70
+ expect(wrapper.text()).toContain(
71
+ '⚠ The "Chat" feature requires a CopilotKit license.',
72
+ );
73
+ });
74
+
75
+ it("uses the configured feature-unlicensed label", () => {
76
+ const wrapper = mountWithLabels(
77
+ { licenseFeatureUnlicensedText: "{feature} braucht eine Lizenz." },
78
+ () => h(InlineFeatureWarning, { featureName: "Chat" }),
79
+ );
80
+
81
+ expect(wrapper.text()).toContain("Chat braucht eine Lizenz.");
82
+ });
23
83
  });
@@ -1,4 +1,5 @@
1
1
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+ import type * as CoreModule from "@copilotkit/core";
2
3
  import { render } from "@testing-library/vue";
3
4
  import { ref } from "vue";
4
5
  import type { Ref } from "vue";
@@ -37,12 +38,25 @@ const mockCreate = vi.fn<MockCreateFn>(() => ({
37
38
  destroy: mockDestroy,
38
39
  }));
39
40
 
40
- vi.mock("@jetbrains/websandbox", () => ({
41
- default: {
42
- create: (localApi: Record<string, unknown>, options: SandboxOptions) =>
43
- mockCreate(localApi, options),
44
- },
45
- }));
41
+ // Run the real core controller against a fake websandbox
42
+ vi.mock("@copilotkit/core", async (importOriginal) => {
43
+ const actual = await importOriginal<typeof CoreModule>();
44
+ class TestOpenGenerativeUIController
45
+ extends actual.ɵOpenGenerativeUIController
46
+ {
47
+ constructor() {
48
+ super({
49
+ loadWebsandbox: async () => ({
50
+ create: (localApi, options) => mockCreate(localApi, options),
51
+ }),
52
+ });
53
+ }
54
+ }
55
+ return {
56
+ ...actual,
57
+ ɵOpenGenerativeUIController: TestOpenGenerativeUIController,
58
+ };
59
+ });
46
60
 
47
61
  async function flushImport() {
48
62
  await new Promise((resolve) => setTimeout(resolve, 0));
@@ -86,16 +100,23 @@ describe("OpenGenerativeUIRenderer", () => {
86
100
  vi.restoreAllMocks();
87
101
  });
88
102
 
89
- it("renders placeholder when no html", async () => {
103
+ it("shows the progress overlay with a spinner while generating", async () => {
90
104
  const { getByTestId, queryByTestId } = renderRenderer({
91
105
  initialHeight: 300,
92
106
  });
93
107
  await flushImport();
94
- expect(getByTestId("open-generative-ui-placeholder")).not.toBeNull();
108
+ expect(getByTestId("open-generative-ui-spinner")).not.toBeNull();
95
109
  expect(queryByTestId("open-generative-ui-final-sandbox")).toBeNull();
96
110
  expect(mockCreate).not.toHaveBeenCalled();
97
111
  });
98
112
 
113
+ it("shows no spinner or overlay once generation is done", async () => {
114
+ const { queryByTestId } = renderRenderer({ generating: false });
115
+ await flushImport();
116
+ expect(queryByTestId("open-generative-ui-progress-overlay")).toBeNull();
117
+ expect(queryByTestId("open-generative-ui-spinner")).toBeNull();
118
+ });
119
+
99
120
  it("creates final sandbox when html is complete", async () => {
100
121
  renderRenderer({
101
122
  html: ["<head></head><body><p>Hello</p></body>"],
@@ -178,6 +199,41 @@ describe("OpenGenerativeUIRenderer", () => {
178
199
  expect(options.frameContent).toContain("v2");
179
200
  });
180
201
 
202
+ it("sizes the container to the height the final sandbox reports", async () => {
203
+ const iframe = document.createElement("iframe");
204
+ mockCreate.mockImplementationOnce((_localApi, options) => {
205
+ (options.frameContainer as HTMLElement).appendChild(iframe);
206
+ return {
207
+ iframe,
208
+ promise: Promise.resolve(),
209
+ run: mockRun,
210
+ destroy: mockDestroy,
211
+ };
212
+ });
213
+ const { getByTestId } = renderRenderer({
214
+ initialHeight: 150,
215
+ html: ["<body><p>Chart</p></body>"],
216
+ htmlComplete: true,
217
+ generating: false,
218
+ });
219
+ await flushImport();
220
+ expect(getByTestId("open-generative-ui-renderer").style.height).toBe(
221
+ "150px",
222
+ );
223
+
224
+ window.dispatchEvent(
225
+ new MessageEvent("message", {
226
+ source: iframe.contentWindow,
227
+ data: { type: "__ck_resize", height: 420 },
228
+ }),
229
+ );
230
+ await flushImport();
231
+
232
+ expect(getByTestId("open-generative-ui-renderer").style.height).toBe(
233
+ "420px",
234
+ );
235
+ });
236
+
181
237
  it("destroys sandbox on unmount", async () => {
182
238
  const mounted = renderRenderer({
183
239
  html: ["<head></head><body>bye</body>"],
@@ -0,0 +1,38 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { render } from "@testing-library/vue";
3
+ import { ToolCallStatus } from "@copilotkit/core";
4
+ import { OpenGenerativeUIToolRenderer } from "../OpenGenerativeUIRenderer";
5
+
6
+ function toolProps(messages: string[], status = ToolCallStatus.InProgress) {
7
+ return {
8
+ name: "generateSandboxedUi",
9
+ args: { placeholderMessages: [...messages] },
10
+ status,
11
+ };
12
+ }
13
+
14
+ describe("OpenGenerativeUIToolRenderer", () => {
15
+ beforeEach(() => vi.useFakeTimers());
16
+ afterEach(() => vi.useRealTimers());
17
+
18
+ it("keeps rotating while streamed snapshots repeat the same messages", async () => {
19
+ const view = render(OpenGenerativeUIToolRenderer, {
20
+ props: toolProps(["Sketching", "Styling"]),
21
+ });
22
+ expect(view.container.textContent).toBe("Styling");
23
+
24
+ await vi.advanceTimersByTimeAsync(4000);
25
+ await view.rerender(toolProps(["Sketching", "Styling"]));
26
+ await vi.advanceTimersByTimeAsync(1000);
27
+
28
+ expect(view.container.textContent).toBe("Sketching");
29
+ });
30
+
31
+ it("renders nothing once the tool call is complete", async () => {
32
+ const view = render(OpenGenerativeUIToolRenderer, {
33
+ props: toolProps(["Sketching"]),
34
+ });
35
+ await view.rerender(toolProps(["Sketching"], ToolCallStatus.Complete));
36
+ expect(view.container.textContent).toBe("");
37
+ });
38
+ });
@@ -1,15 +1,10 @@
1
1
  import { watch } from "vue";
2
2
  import type { ShallowRef } from "vue";
3
- import { z } from "zod";
3
+ import * as z from "zod";
4
+ import { ɵRENDER_A2UI_TOOL_NAME as RENDER_A2UI_TOOL_NAME } from "@copilotkit/core";
4
5
  import type { CopilotKitCoreVue } from "../../lib/vue-core";
5
6
  import { defineToolCallRenderer } from "../../types/defineToolCallRenderer";
6
7
 
7
- /**
8
- * Tool name used by the dynamic A2UI generation secondary LLM.
9
- * This renderer is auto-registered when A2UI is enabled.
10
- */
11
- export const RENDER_A2UI_TOOL_NAME = "render_a2ui";
12
-
13
8
  /**
14
9
  * Registers a no-op renderer for the `render_a2ui` tool call so its raw
15
10
  * streamed args are never surfaced in the transcript, as React does.
@@ -20,12 +15,9 @@ export const RENDER_A2UI_TOOL_NAME = "render_a2ui";
20
15
  * by `createA2UIMessageRenderer`. A skeleton per tool call would duplicate on
21
16
  * retries and multi-call generations and linger after the surface painted.
22
17
  *
23
- * The renderer is registered via the props-based `setRenderToolCalls`
24
- * mechanism (not `useRenderTool`).
25
- *
26
- * This ensures user-registered `useRenderTool({ name: "render_a2ui", ... })`
27
- * hooks automatically override the built-in, since the merge logic in
28
- * vue-core.ts gives hook-based entries priority over prop-based entries.
18
+ * It is a built-in renderer, so a `renderToolCalls` entry or a
19
+ * `useRenderTool({ name: "render_a2ui" })` hook replaces it, and setting the
20
+ * provider's renderers never removes it.
29
21
  *
30
22
  * Call from the provider's setup function and pass a cleanup callback.
31
23
  */
@@ -45,19 +37,7 @@ export function registerA2UIBuiltInToolCallRenderer(
45
37
  render: () => null,
46
38
  });
47
39
 
48
- // Register via props-based mechanism so useRenderTool hooks take priority
49
- const existing = core.propRenderToolCalls;
50
- core.setRenderToolCalls([
51
- ...existing.filter((rc) => rc.name !== RENDER_A2UI_TOOL_NAME),
52
- renderer,
53
- ]);
54
-
55
- onCleanup(() => {
56
- const current = core.propRenderToolCalls;
57
- core.setRenderToolCalls(
58
- current.filter((rc) => rc.name !== RENDER_A2UI_TOOL_NAME),
59
- );
60
- });
40
+ onCleanup(core.ɵaddBuiltInRenderToolCall(renderer));
61
41
  },
62
42
  { immediate: true },
63
43
  );