@copilotkit/vue 1.57.1

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 (437) hide show
  1. package/AGENTS.md +50 -0
  2. package/CHANGELOG.md +13 -0
  3. package/PARITY.md +434 -0
  4. package/README.md +396 -0
  5. package/dist/components/copilot-provider/CopilotKit.vue.d.ts +20 -0
  6. package/dist/components/copilot-provider/CopilotKit.vue.d.ts.map +1 -0
  7. package/dist/components/copilot-provider/index.d.ts +3 -0
  8. package/dist/components/copilot-provider/index.d.ts.map +1 -0
  9. package/dist/components/copilot-provider/types.d.ts +22 -0
  10. package/dist/components/copilot-provider/types.d.ts.map +1 -0
  11. package/dist/hooks/index.d.ts +7 -0
  12. package/dist/hooks/index.d.ts.map +1 -0
  13. package/dist/hooks/use-copilot-action.d.ts +27 -0
  14. package/dist/hooks/use-copilot-action.d.ts.map +1 -0
  15. package/dist/hooks/use-copilot-readable.d.ts +20 -0
  16. package/dist/hooks/use-copilot-readable.d.ts.map +1 -0
  17. package/dist/hooks/use-frontend-tool.d.ts +21 -0
  18. package/dist/hooks/use-frontend-tool.d.ts.map +1 -0
  19. package/dist/index.cjs +2 -0
  20. package/dist/index.cjs.map +1 -0
  21. package/dist/index.d.cts +10 -0
  22. package/dist/index.d.mts +10 -0
  23. package/dist/index.d.ts +10 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.mjs +252 -0
  26. package/dist/index.mjs.map +1 -0
  27. package/dist/styles.css +2 -0
  28. package/dist/use-render-activity-message-BRL1Rpl-.cjs +85 -0
  29. package/dist/use-render-activity-message-BRL1Rpl-.cjs.map +1 -0
  30. package/dist/use-render-activity-message-CqtxiFSs.js +8927 -0
  31. package/dist/use-render-activity-message-CqtxiFSs.js.map +1 -0
  32. package/dist/v2/components/A2UIMessageRenderer.d.ts +9 -0
  33. package/dist/v2/components/A2UIMessageRenderer.d.ts.map +1 -0
  34. package/dist/v2/components/A2UISurfaceActivityRenderer.vue.d.ts +16 -0
  35. package/dist/v2/components/A2UISurfaceActivityRenderer.vue.d.ts.map +1 -0
  36. package/dist/v2/components/CopilotKitInspector.vue.d.ts +7 -0
  37. package/dist/v2/components/CopilotKitInspector.vue.d.ts.map +1 -0
  38. package/dist/v2/components/InlineFeatureWarning.vue.d.ts +6 -0
  39. package/dist/v2/components/InlineFeatureWarning.vue.d.ts.map +1 -0
  40. package/dist/v2/components/LicenseWarningBanner.vue.d.ts +18 -0
  41. package/dist/v2/components/LicenseWarningBanner.vue.d.ts.map +1 -0
  42. package/dist/v2/components/MCPAppsActivityRenderer.d.ts +88 -0
  43. package/dist/v2/components/MCPAppsActivityRenderer.d.ts.map +1 -0
  44. package/dist/v2/components/OpenGenerativeUIRenderer.d.ts +154 -0
  45. package/dist/v2/components/OpenGenerativeUIRenderer.d.ts.map +1 -0
  46. package/dist/v2/components/a2ui/A2UIBuiltInToolCallRenderer.d.ts +19 -0
  47. package/dist/v2/components/a2ui/A2UIBuiltInToolCallRenderer.d.ts.map +1 -0
  48. package/dist/v2/components/a2ui/A2UICatalogContext.d.ts +16 -0
  49. package/dist/v2/components/a2ui/A2UICatalogContext.d.ts.map +1 -0
  50. package/dist/v2/components/a2ui/VueSurface.d.ts +62 -0
  51. package/dist/v2/components/a2ui/VueSurface.d.ts.map +1 -0
  52. package/dist/v2/components/a2ui/adapter.d.ts +38 -0
  53. package/dist/v2/components/a2ui/adapter.d.ts.map +1 -0
  54. package/dist/v2/components/a2ui/catalog.d.ts +29 -0
  55. package/dist/v2/components/a2ui/catalog.d.ts.map +1 -0
  56. package/dist/v2/components/a2ui/index.d.ts +5 -0
  57. package/dist/v2/components/a2ui/index.d.ts.map +1 -0
  58. package/dist/v2/components/a2ui/utils.d.ts +18 -0
  59. package/dist/v2/components/a2ui/utils.d.ts.map +1 -0
  60. package/dist/v2/components/a2ui.d.ts +12 -0
  61. package/dist/v2/components/a2ui.d.ts.map +1 -0
  62. package/dist/v2/components/chat/CopilotChat.vue.d.ts +50 -0
  63. package/dist/v2/components/chat/CopilotChat.vue.d.ts.map +1 -0
  64. package/dist/v2/components/chat/CopilotChatAssistantMessage.vue.d.ts +164 -0
  65. package/dist/v2/components/chat/CopilotChatAssistantMessage.vue.d.ts.map +1 -0
  66. package/dist/v2/components/chat/CopilotChatAttachmentQueue.vue.d.ts +12 -0
  67. package/dist/v2/components/chat/CopilotChatAttachmentQueue.vue.d.ts.map +1 -0
  68. package/dist/v2/components/chat/CopilotChatAttachmentRenderer.vue.d.ts +7 -0
  69. package/dist/v2/components/chat/CopilotChatAttachmentRenderer.vue.d.ts.map +1 -0
  70. package/dist/v2/components/chat/CopilotChatAudioRecorder.vue.d.ts +12 -0
  71. package/dist/v2/components/chat/CopilotChatAudioRecorder.vue.d.ts.map +1 -0
  72. package/dist/v2/components/chat/CopilotChatInput.vue.d.ts +290 -0
  73. package/dist/v2/components/chat/CopilotChatInput.vue.d.ts.map +1 -0
  74. package/dist/v2/components/chat/CopilotChatMessageView.vue.d.ts +72 -0
  75. package/dist/v2/components/chat/CopilotChatMessageView.vue.d.ts.map +1 -0
  76. package/dist/v2/components/chat/CopilotChatReasoningMessage.vue.d.ts +65 -0
  77. package/dist/v2/components/chat/CopilotChatReasoningMessage.vue.d.ts.map +1 -0
  78. package/dist/v2/components/chat/CopilotChatSuggestionPill.vue.d.ts +27 -0
  79. package/dist/v2/components/chat/CopilotChatSuggestionPill.vue.d.ts.map +1 -0
  80. package/dist/v2/components/chat/CopilotChatSuggestionView.vue.d.ts +26 -0
  81. package/dist/v2/components/chat/CopilotChatSuggestionView.vue.d.ts.map +1 -0
  82. package/dist/v2/components/chat/CopilotChatToggleButton.vue.d.ts +17 -0
  83. package/dist/v2/components/chat/CopilotChatToggleButton.vue.d.ts.map +1 -0
  84. package/dist/v2/components/chat/CopilotChatToggleButtonCloseIcon.d.ts +5 -0
  85. package/dist/v2/components/chat/CopilotChatToggleButtonCloseIcon.d.ts.map +1 -0
  86. package/dist/v2/components/chat/CopilotChatToggleButtonOpenIcon.d.ts +5 -0
  87. package/dist/v2/components/chat/CopilotChatToggleButtonOpenIcon.d.ts.map +1 -0
  88. package/dist/v2/components/chat/CopilotChatToolCallsView.vue.d.ts +21 -0
  89. package/dist/v2/components/chat/CopilotChatToolCallsView.vue.d.ts.map +1 -0
  90. package/dist/v2/components/chat/CopilotChatUserMessage.vue.d.ts +34 -0
  91. package/dist/v2/components/chat/CopilotChatUserMessage.vue.d.ts.map +1 -0
  92. package/dist/v2/components/chat/CopilotChatView.vue.d.ts +106 -0
  93. package/dist/v2/components/chat/CopilotChatView.vue.d.ts.map +1 -0
  94. package/dist/v2/components/chat/CopilotModalHeader.vue.d.ts +15 -0
  95. package/dist/v2/components/chat/CopilotModalHeader.vue.d.ts.map +1 -0
  96. package/dist/v2/components/chat/CopilotModalHeaderCloseButton.d.ts +5 -0
  97. package/dist/v2/components/chat/CopilotModalHeaderCloseButton.d.ts.map +1 -0
  98. package/dist/v2/components/chat/CopilotModalHeaderTitle.d.ts +5 -0
  99. package/dist/v2/components/chat/CopilotModalHeaderTitle.d.ts.map +1 -0
  100. package/dist/v2/components/chat/CopilotPopup.vue.d.ts +50 -0
  101. package/dist/v2/components/chat/CopilotPopup.vue.d.ts.map +1 -0
  102. package/dist/v2/components/chat/CopilotPopupView.vue.d.ts +55 -0
  103. package/dist/v2/components/chat/CopilotPopupView.vue.d.ts.map +1 -0
  104. package/dist/v2/components/chat/CopilotPopupViewInternal.vue.d.ts +55 -0
  105. package/dist/v2/components/chat/CopilotPopupViewInternal.vue.d.ts.map +1 -0
  106. package/dist/v2/components/chat/CopilotPopupWelcomeScreen.vue.d.ts +28 -0
  107. package/dist/v2/components/chat/CopilotPopupWelcomeScreen.vue.d.ts.map +1 -0
  108. package/dist/v2/components/chat/CopilotSidebar.vue.d.ts +48 -0
  109. package/dist/v2/components/chat/CopilotSidebar.vue.d.ts.map +1 -0
  110. package/dist/v2/components/chat/CopilotSidebarView.vue.d.ts +62 -0
  111. package/dist/v2/components/chat/CopilotSidebarView.vue.d.ts.map +1 -0
  112. package/dist/v2/components/chat/CopilotSidebarViewInternal.vue.d.ts +53 -0
  113. package/dist/v2/components/chat/CopilotSidebarViewInternal.vue.d.ts.map +1 -0
  114. package/dist/v2/components/chat/CopilotSidebarWelcomeScreen.vue.d.ts +28 -0
  115. package/dist/v2/components/chat/CopilotSidebarWelcomeScreen.vue.d.ts.map +1 -0
  116. package/dist/v2/components/chat/audioRecorder.d.ts +11 -0
  117. package/dist/v2/components/chat/audioRecorder.d.ts.map +1 -0
  118. package/dist/v2/components/chat/index.d.ts +682 -0
  119. package/dist/v2/components/chat/index.d.ts.map +1 -0
  120. package/dist/v2/components/chat/last-user-message-context.d.ts +29 -0
  121. package/dist/v2/components/chat/last-user-message-context.d.ts.map +1 -0
  122. package/dist/v2/components/chat/normalize-auto-scroll.d.ts +3 -0
  123. package/dist/v2/components/chat/normalize-auto-scroll.d.ts.map +1 -0
  124. package/dist/v2/components/chat/types.d.ts +380 -0
  125. package/dist/v2/components/chat/types.d.ts.map +1 -0
  126. package/dist/v2/components/icons/index.d.ts +2 -0
  127. package/dist/v2/components/icons/index.d.ts.map +1 -0
  128. package/dist/v2/components/index.d.ts +8 -0
  129. package/dist/v2/components/index.d.ts.map +1 -0
  130. package/dist/v2/hooks/index.d.ts +24 -0
  131. package/dist/v2/hooks/index.d.ts.map +1 -0
  132. package/dist/v2/hooks/use-agent-context.d.ts +24 -0
  133. package/dist/v2/hooks/use-agent-context.d.ts.map +1 -0
  134. package/dist/v2/hooks/use-agent.d.ts +53 -0
  135. package/dist/v2/hooks/use-agent.d.ts.map +1 -0
  136. package/dist/v2/hooks/use-attachments.d.ts +21 -0
  137. package/dist/v2/hooks/use-attachments.d.ts.map +1 -0
  138. package/dist/v2/hooks/use-capabilities.d.ts +16 -0
  139. package/dist/v2/hooks/use-capabilities.d.ts.map +1 -0
  140. package/dist/v2/hooks/use-component.d.ts +13 -0
  141. package/dist/v2/hooks/use-component.d.ts.map +1 -0
  142. package/dist/v2/hooks/use-configure-suggestions.d.ts +24 -0
  143. package/dist/v2/hooks/use-configure-suggestions.d.ts.map +1 -0
  144. package/dist/v2/hooks/use-default-render-tool.d.ts +14 -0
  145. package/dist/v2/hooks/use-default-render-tool.d.ts.map +1 -0
  146. package/dist/v2/hooks/use-frontend-tool.d.ts +19 -0
  147. package/dist/v2/hooks/use-frontend-tool.d.ts.map +1 -0
  148. package/dist/v2/hooks/use-human-in-the-loop.d.ts +19 -0
  149. package/dist/v2/hooks/use-human-in-the-loop.d.ts.map +1 -0
  150. package/dist/v2/hooks/use-interrupt.d.ts +36 -0
  151. package/dist/v2/hooks/use-interrupt.d.ts.map +1 -0
  152. package/dist/v2/hooks/use-katex-styles.d.ts +22 -0
  153. package/dist/v2/hooks/use-katex-styles.d.ts.map +1 -0
  154. package/dist/v2/hooks/use-keyboard-height.d.ts +33 -0
  155. package/dist/v2/hooks/use-keyboard-height.d.ts.map +1 -0
  156. package/dist/v2/hooks/use-pin-to-send.d.ts +28 -0
  157. package/dist/v2/hooks/use-pin-to-send.d.ts.map +1 -0
  158. package/dist/v2/hooks/use-render-activity-message.d.ts +21 -0
  159. package/dist/v2/hooks/use-render-activity-message.d.ts.map +1 -0
  160. package/dist/v2/hooks/use-render-custom-messages.d.ts +27 -0
  161. package/dist/v2/hooks/use-render-custom-messages.d.ts.map +1 -0
  162. package/dist/v2/hooks/use-render-tool.d.ts +36 -0
  163. package/dist/v2/hooks/use-render-tool.d.ts.map +1 -0
  164. package/dist/v2/hooks/use-suggestions.d.ts +26 -0
  165. package/dist/v2/hooks/use-suggestions.d.ts.map +1 -0
  166. package/dist/v2/hooks/use-threads.d.ts +42 -0
  167. package/dist/v2/hooks/use-threads.d.ts.map +1 -0
  168. package/dist/v2/index.cjs +2 -0
  169. package/dist/v2/index.cjs.map +1 -0
  170. package/dist/v2/index.d.cts +9 -0
  171. package/dist/v2/index.d.mts +9 -0
  172. package/dist/v2/index.d.ts +9 -0
  173. package/dist/v2/index.d.ts.map +1 -0
  174. package/dist/v2/index.mjs +75 -0
  175. package/dist/v2/index.mjs.map +1 -0
  176. package/dist/v2/lib/processPartialHtml.d.ts +3 -0
  177. package/dist/v2/lib/processPartialHtml.d.ts.map +1 -0
  178. package/dist/v2/lib/shallow-stable.d.ts +7 -0
  179. package/dist/v2/lib/shallow-stable.d.ts.map +1 -0
  180. package/dist/v2/lib/transcription-client.d.ts +19 -0
  181. package/dist/v2/lib/transcription-client.d.ts.map +1 -0
  182. package/dist/v2/lib/vue-core.d.ts +47 -0
  183. package/dist/v2/lib/vue-core.d.ts.map +1 -0
  184. package/dist/v2/providers/CopilotChatConfigurationProvider.types.d.ts +15 -0
  185. package/dist/v2/providers/CopilotChatConfigurationProvider.types.d.ts.map +1 -0
  186. package/dist/v2/providers/CopilotChatConfigurationProvider.vue.d.ts +17 -0
  187. package/dist/v2/providers/CopilotChatConfigurationProvider.vue.d.ts.map +1 -0
  188. package/dist/v2/providers/CopilotKitProvider.types.d.ts +61 -0
  189. package/dist/v2/providers/CopilotKitProvider.types.d.ts.map +1 -0
  190. package/dist/v2/providers/CopilotKitProvider.vue.d.ts +37 -0
  191. package/dist/v2/providers/CopilotKitProvider.vue.d.ts.map +1 -0
  192. package/dist/v2/providers/SandboxFunctionsContext.d.ts +4 -0
  193. package/dist/v2/providers/SandboxFunctionsContext.d.ts.map +1 -0
  194. package/dist/v2/providers/index.d.ts +13 -0
  195. package/dist/v2/providers/index.d.ts.map +1 -0
  196. package/dist/v2/providers/keys.d.ts +17 -0
  197. package/dist/v2/providers/keys.d.ts.map +1 -0
  198. package/dist/v2/providers/license-context.d.ts +7 -0
  199. package/dist/v2/providers/license-context.d.ts.map +1 -0
  200. package/dist/v2/providers/types.d.ts +38 -0
  201. package/dist/v2/providers/types.d.ts.map +1 -0
  202. package/dist/v2/providers/useCopilotChatConfiguration.d.ts +4 -0
  203. package/dist/v2/providers/useCopilotChatConfiguration.d.ts.map +1 -0
  204. package/dist/v2/providers/useCopilotKit.d.ts +2 -0
  205. package/dist/v2/providers/useCopilotKit.d.ts.map +1 -0
  206. package/dist/v2/providers/useLicenseContext.d.ts +14 -0
  207. package/dist/v2/providers/useLicenseContext.d.ts.map +1 -0
  208. package/dist/v2/types/a2ui.d.ts +5 -0
  209. package/dist/v2/types/a2ui.d.ts.map +1 -0
  210. package/dist/v2/types/defineToolCallRenderer.d.ts +15 -0
  211. package/dist/v2/types/defineToolCallRenderer.d.ts.map +1 -0
  212. package/dist/v2/types/frontend-tool.d.ts +6 -0
  213. package/dist/v2/types/frontend-tool.d.ts.map +1 -0
  214. package/dist/v2/types/human-in-the-loop.d.ts +29 -0
  215. package/dist/v2/types/human-in-the-loop.d.ts.map +1 -0
  216. package/dist/v2/types/index.d.ts +10 -0
  217. package/dist/v2/types/index.d.ts.map +1 -0
  218. package/dist/v2/types/interrupt.d.ts +14 -0
  219. package/dist/v2/types/interrupt.d.ts.map +1 -0
  220. package/dist/v2/types/sandbox-function.d.ts +8 -0
  221. package/dist/v2/types/sandbox-function.d.ts.map +1 -0
  222. package/dist/v2/types/vue-activity-message-renderer.d.ts +18 -0
  223. package/dist/v2/types/vue-activity-message-renderer.d.ts.map +1 -0
  224. package/dist/v2/types/vue-custom-message-renderer.d.ts +19 -0
  225. package/dist/v2/types/vue-custom-message-renderer.d.ts.map +1 -0
  226. package/dist/v2/types/vue-tool-call-renderer.d.ts +37 -0
  227. package/dist/v2/types/vue-tool-call-renderer.d.ts.map +1 -0
  228. package/env.d.ts +7 -0
  229. package/eslint.config.mjs +42 -0
  230. package/package.json +130 -0
  231. package/scripts/scope-preflight.mjs +100 -0
  232. package/src/components/copilot-provider/CopilotKit.vue +18 -0
  233. package/src/components/copilot-provider/index.ts +2 -0
  234. package/src/components/copilot-provider/types.ts +24 -0
  235. package/src/hooks/index.ts +9 -0
  236. package/src/hooks/use-copilot-action.ts +168 -0
  237. package/src/hooks/use-copilot-readable.ts +75 -0
  238. package/src/hooks/use-frontend-tool.ts +76 -0
  239. package/src/index.ts +12 -0
  240. package/src/styles/globals.css +314 -0
  241. package/src/v2/__tests__/exports.test.ts +35 -0
  242. package/src/v2/__tests__/mocks/web-inspector.ts +5 -0
  243. package/src/v2/__tests__/setup.ts +141 -0
  244. package/src/v2/__tests__/utils/agents.ts +391 -0
  245. package/src/v2/__tests__/utils/mount.ts +83 -0
  246. package/src/v2/__tests__/utils/test-helpers.ts +712 -0
  247. package/src/v2/components/A2UIMessageRenderer.ts +125 -0
  248. package/src/v2/components/A2UISurfaceActivityRenderer.vue +186 -0
  249. package/src/v2/components/CopilotKitInspector.vue +42 -0
  250. package/src/v2/components/InlineFeatureWarning.vue +35 -0
  251. package/src/v2/components/LicenseWarningBanner.vue +196 -0
  252. package/src/v2/components/MCPAppsActivityRenderer.ts +778 -0
  253. package/src/v2/components/OpenGenerativeUIRenderer.ts +550 -0
  254. package/src/v2/components/__tests__/A2UIMessageRenderer.test.ts +271 -0
  255. package/src/v2/components/__tests__/CopilotKitInspector.test.ts +57 -0
  256. package/src/v2/components/__tests__/MCPAppsActivityRenderer.e2e.test.ts +851 -0
  257. package/src/v2/components/__tests__/MCPAppsActivityRenderer.test.ts +237 -0
  258. package/src/v2/components/__tests__/OpenGenerativeUIRenderer.test.ts +516 -0
  259. package/src/v2/components/a2ui/A2UIBuiltInToolCallRenderer.ts +295 -0
  260. package/src/v2/components/a2ui/A2UICatalogContext.ts +190 -0
  261. package/src/v2/components/a2ui/VueSurface.ts +144 -0
  262. package/src/v2/components/a2ui/adapter.ts +156 -0
  263. package/src/v2/components/a2ui/catalog.ts +858 -0
  264. package/src/v2/components/a2ui/index.ts +7 -0
  265. package/src/v2/components/a2ui/utils.ts +67 -0
  266. package/src/v2/components/a2ui.ts +30 -0
  267. package/src/v2/components/chat/CopilotChat.vue +777 -0
  268. package/src/v2/components/chat/CopilotChatAssistantMessage.vue +891 -0
  269. package/src/v2/components/chat/CopilotChatAttachmentQueue.vue +411 -0
  270. package/src/v2/components/chat/CopilotChatAttachmentRenderer.vue +87 -0
  271. package/src/v2/components/chat/CopilotChatAudioRecorder.vue +269 -0
  272. package/src/v2/components/chat/CopilotChatInput.vue +1271 -0
  273. package/src/v2/components/chat/CopilotChatMessageView.vue +476 -0
  274. package/src/v2/components/chat/CopilotChatReasoningMessage.vue +247 -0
  275. package/src/v2/components/chat/CopilotChatSuggestionPill.vue +56 -0
  276. package/src/v2/components/chat/CopilotChatSuggestionView.vue +93 -0
  277. package/src/v2/components/chat/CopilotChatToggleButton.vue +145 -0
  278. package/src/v2/components/chat/CopilotChatToggleButtonCloseIcon.ts +17 -0
  279. package/src/v2/components/chat/CopilotChatToggleButtonOpenIcon.ts +18 -0
  280. package/src/v2/components/chat/CopilotChatToolCallsView.vue +161 -0
  281. package/src/v2/components/chat/CopilotChatUserMessage.vue +322 -0
  282. package/src/v2/components/chat/CopilotChatView.vue +740 -0
  283. package/src/v2/components/chat/CopilotModalHeader.vue +73 -0
  284. package/src/v2/components/chat/CopilotModalHeaderCloseButton.ts +38 -0
  285. package/src/v2/components/chat/CopilotModalHeaderTitle.ts +22 -0
  286. package/src/v2/components/chat/CopilotPopup.vue +182 -0
  287. package/src/v2/components/chat/CopilotPopupView.vue +168 -0
  288. package/src/v2/components/chat/CopilotPopupViewInternal.vue +453 -0
  289. package/src/v2/components/chat/CopilotPopupWelcomeScreen.vue +140 -0
  290. package/src/v2/components/chat/CopilotSidebar.vue +178 -0
  291. package/src/v2/components/chat/CopilotSidebarView.vue +172 -0
  292. package/src/v2/components/chat/CopilotSidebarViewInternal.vue +366 -0
  293. package/src/v2/components/chat/CopilotSidebarWelcomeScreen.vue +142 -0
  294. package/src/v2/components/chat/__tests__/CopilotChat.attachments.test.ts +237 -0
  295. package/src/v2/components/chat/__tests__/CopilotChat.e2e.test.ts +1240 -0
  296. package/src/v2/components/chat/__tests__/CopilotChat.licenseWarning.test.ts +138 -0
  297. package/src/v2/components/chat/__tests__/CopilotChat.onError.test.ts +85 -0
  298. package/src/v2/components/chat/__tests__/CopilotChat.slots.e2e.test.ts +141 -0
  299. package/src/v2/components/chat/__tests__/CopilotChat.test.ts +652 -0
  300. package/src/v2/components/chat/__tests__/CopilotChatActivityRendering.e2e.test.ts +683 -0
  301. package/src/v2/components/chat/__tests__/CopilotChatAssistantMessage.slots.e2e.test.ts +768 -0
  302. package/src/v2/components/chat/__tests__/CopilotChatAssistantMessage.test.ts +1108 -0
  303. package/src/v2/components/chat/__tests__/CopilotChatAssistantMessage.thumbs.test.ts +87 -0
  304. package/src/v2/components/chat/__tests__/CopilotChatAttachmentQueue.test.ts +277 -0
  305. package/src/v2/components/chat/__tests__/CopilotChatAttachmentRenderer.test.ts +124 -0
  306. package/src/v2/components/chat/__tests__/CopilotChatCopyButton.clipboard.test.ts +230 -0
  307. package/src/v2/components/chat/__tests__/CopilotChatInput.bottomAnchored.test.ts +83 -0
  308. package/src/v2/components/chat/__tests__/CopilotChatInput.slots.e2e.test.ts +1139 -0
  309. package/src/v2/components/chat/__tests__/CopilotChatInput.test.ts +1051 -0
  310. package/src/v2/components/chat/__tests__/CopilotChatMessageView.slots.e2e.test.ts +141 -0
  311. package/src/v2/components/chat/__tests__/CopilotChatMessageView.test.ts +494 -0
  312. package/src/v2/components/chat/__tests__/CopilotChatPropsRerender.e2e.test.ts +181 -0
  313. package/src/v2/components/chat/__tests__/CopilotChatReasoningMessage.test.ts +73 -0
  314. package/src/v2/components/chat/__tests__/CopilotChatSuggestionPill.test.ts +73 -0
  315. package/src/v2/components/chat/__tests__/CopilotChatSuggestionView.slots.e2e.test.ts +674 -0
  316. package/src/v2/components/chat/__tests__/CopilotChatSuggestionView.test.ts +91 -0
  317. package/src/v2/components/chat/__tests__/CopilotChatToggleButton.test.ts +93 -0
  318. package/src/v2/components/chat/__tests__/CopilotChatToolCallsView.test.ts +382 -0
  319. package/src/v2/components/chat/__tests__/CopilotChatToolRendering.e2e.test.ts +1019 -0
  320. package/src/v2/components/chat/__tests__/CopilotChatToolRerenders.e2e.test.ts +516 -0
  321. package/src/v2/components/chat/__tests__/CopilotChatUserMessage.slots.e2e.test.ts +701 -0
  322. package/src/v2/components/chat/__tests__/CopilotChatUserMessage.test.ts +337 -0
  323. package/src/v2/components/chat/__tests__/CopilotChatView.connectingGate.test.ts +135 -0
  324. package/src/v2/components/chat/__tests__/CopilotChatView.inputOverlay.test.ts +278 -0
  325. package/src/v2/components/chat/__tests__/CopilotChatView.onClick.e2e.test.ts +1082 -0
  326. package/src/v2/components/chat/__tests__/CopilotChatView.pinToSend.test.ts +166 -0
  327. package/src/v2/components/chat/__tests__/CopilotChatView.slots.e2e.test.ts +1145 -0
  328. package/src/v2/components/chat/__tests__/CopilotChatView.test.ts +374 -0
  329. package/src/v2/components/chat/__tests__/CopilotModalHeader.slots.e2e.test.ts +636 -0
  330. package/src/v2/components/chat/__tests__/CopilotModalHeader.test.ts +112 -0
  331. package/src/v2/components/chat/__tests__/CopilotPopup.test.ts +58 -0
  332. package/src/v2/components/chat/__tests__/CopilotPopupView.slots.e2e.test.ts +725 -0
  333. package/src/v2/components/chat/__tests__/CopilotPopupView.test.ts +112 -0
  334. package/src/v2/components/chat/__tests__/CopilotSidebar.test.ts +58 -0
  335. package/src/v2/components/chat/__tests__/CopilotSidebarView.slots.e2e.test.ts +603 -0
  336. package/src/v2/components/chat/__tests__/CopilotSidebarView.test.ts +214 -0
  337. package/src/v2/components/chat/__tests__/MCPAppsUiMessage.e2e.test.ts +394 -0
  338. package/src/v2/components/chat/__tests__/copilot-chat-throttle.test.ts +82 -0
  339. package/src/v2/components/chat/__tests__/normalize-auto-scroll.test.ts +39 -0
  340. package/src/v2/components/chat/audioRecorder.ts +15 -0
  341. package/src/v2/components/chat/index.ts +52 -0
  342. package/src/v2/components/chat/last-user-message-context.ts +39 -0
  343. package/src/v2/components/chat/normalize-auto-scroll.ts +17 -0
  344. package/src/v2/components/chat/types.ts +481 -0
  345. package/src/v2/components/icons/__tests__/icons.test.ts +86 -0
  346. package/src/v2/components/icons/index.ts +22 -0
  347. package/src/v2/components/index.ts +7 -0
  348. package/src/v2/hooks/__tests__/standard-schema-types.test.ts +149 -0
  349. package/src/v2/hooks/__tests__/standard-schema.test.ts +315 -0
  350. package/src/v2/hooks/__tests__/use-agent-context-timing.e2e.test.ts +144 -0
  351. package/src/v2/hooks/__tests__/use-agent-context.test.ts +271 -0
  352. package/src/v2/hooks/__tests__/use-agent-error-state.test.ts +64 -0
  353. package/src/v2/hooks/__tests__/use-agent-stability.test.ts +268 -0
  354. package/src/v2/hooks/__tests__/use-agent-thread-isolation.test.ts +433 -0
  355. package/src/v2/hooks/__tests__/use-agent-throttle.test.ts +747 -0
  356. package/src/v2/hooks/__tests__/use-agent.e2e.test.ts +187 -0
  357. package/src/v2/hooks/__tests__/use-agent.test.ts +126 -0
  358. package/src/v2/hooks/__tests__/use-attachments.test.ts +181 -0
  359. package/src/v2/hooks/__tests__/use-component.test.ts +145 -0
  360. package/src/v2/hooks/__tests__/use-configure-suggestions.e2e.test.ts +527 -0
  361. package/src/v2/hooks/__tests__/use-configure-suggestions.test.ts +399 -0
  362. package/src/v2/hooks/__tests__/use-default-render-tool.test.ts +214 -0
  363. package/src/v2/hooks/__tests__/use-frontend-tool-available.test.ts +220 -0
  364. package/src/v2/hooks/__tests__/use-frontend-tool.e2e.test.ts +2320 -0
  365. package/src/v2/hooks/__tests__/use-frontend-tool.test.ts +648 -0
  366. package/src/v2/hooks/__tests__/use-human-in-the-loop.e2e.test.ts +1379 -0
  367. package/src/v2/hooks/__tests__/use-human-in-the-loop.test.ts +282 -0
  368. package/src/v2/hooks/__tests__/use-interrupt.test.ts +345 -0
  369. package/src/v2/hooks/__tests__/use-katex-styles.test.ts +69 -0
  370. package/src/v2/hooks/__tests__/use-keyboard-height.test.ts +199 -0
  371. package/src/v2/hooks/__tests__/use-pin-to-send.test.ts +363 -0
  372. package/src/v2/hooks/__tests__/use-render-tool.test.ts +329 -0
  373. package/src/v2/hooks/__tests__/use-suggestions.e2e.test.ts +397 -0
  374. package/src/v2/hooks/__tests__/use-suggestions.test.ts +198 -0
  375. package/src/v2/hooks/__tests__/use-threads.test.ts +1041 -0
  376. package/src/v2/hooks/__tests__/zod-regression.test.ts +339 -0
  377. package/src/v2/hooks/index.ts +29 -0
  378. package/src/v2/hooks/use-agent-context.ts +55 -0
  379. package/src/v2/hooks/use-agent.ts +345 -0
  380. package/src/v2/hooks/use-attachments.ts +261 -0
  381. package/src/v2/hooks/use-capabilities.ts +30 -0
  382. package/src/v2/hooks/use-component.ts +46 -0
  383. package/src/v2/hooks/use-configure-suggestions.ts +252 -0
  384. package/src/v2/hooks/use-default-render-tool.ts +130 -0
  385. package/src/v2/hooks/use-frontend-tool.ts +68 -0
  386. package/src/v2/hooks/use-human-in-the-loop.ts +90 -0
  387. package/src/v2/hooks/use-interrupt.ts +257 -0
  388. package/src/v2/hooks/use-katex-styles.ts +44 -0
  389. package/src/v2/hooks/use-keyboard-height.ts +87 -0
  390. package/src/v2/hooks/use-pin-to-send.ts +160 -0
  391. package/src/v2/hooks/use-render-activity-message.ts +92 -0
  392. package/src/v2/hooks/use-render-custom-messages.ts +129 -0
  393. package/src/v2/hooks/use-render-tool.ts +128 -0
  394. package/src/v2/hooks/use-suggestions.ts +98 -0
  395. package/src/v2/hooks/use-threads.ts +208 -0
  396. package/src/v2/index.ts +11 -0
  397. package/src/v2/lib/__tests__/processPartialHtml.test.ts +84 -0
  398. package/src/v2/lib/__tests__/transcription-client.test.ts +65 -0
  399. package/src/v2/lib/processPartialHtml.ts +21 -0
  400. package/src/v2/lib/shallow-stable.ts +54 -0
  401. package/src/v2/lib/transcription-client.ts +151 -0
  402. package/src/v2/lib/vue-core.ts +161 -0
  403. package/src/v2/providers/CopilotChatConfigurationProvider.types.ts +15 -0
  404. package/src/v2/providers/CopilotChatConfigurationProvider.vue +95 -0
  405. package/src/v2/providers/CopilotKitProvider.types.ts +66 -0
  406. package/src/v2/providers/CopilotKitProvider.vue +653 -0
  407. package/src/v2/providers/SandboxFunctionsContext.ts +11 -0
  408. package/src/v2/providers/__tests__/CopilotChatConfigurationProvider.test.ts +309 -0
  409. package/src/v2/providers/__tests__/CopilotKitProvider.debug.test.ts +295 -0
  410. package/src/v2/providers/__tests__/CopilotKitProvider.license.test.ts +110 -0
  411. package/src/v2/providers/__tests__/CopilotKitProvider.onError.test.ts +67 -0
  412. package/src/v2/providers/__tests__/CopilotKitProvider.renderCustomMessages.e2e.test.ts +901 -0
  413. package/src/v2/providers/__tests__/CopilotKitProvider.sandboxFunctions.test.ts +141 -0
  414. package/src/v2/providers/__tests__/CopilotKitProvider.stability.test.ts +871 -0
  415. package/src/v2/providers/__tests__/CopilotKitProvider.test.ts +603 -0
  416. package/src/v2/providers/__tests__/CopilotKitProvider.wildcard.test.ts +104 -0
  417. package/src/v2/providers/index.ts +21 -0
  418. package/src/v2/providers/keys.ts +25 -0
  419. package/src/v2/providers/license-context.ts +16 -0
  420. package/src/v2/providers/types.ts +40 -0
  421. package/src/v2/providers/useCopilotChatConfiguration.ts +11 -0
  422. package/src/v2/providers/useCopilotKit.ts +11 -0
  423. package/src/v2/providers/useLicenseContext.ts +21 -0
  424. package/src/v2/types/__tests__/defineToolCallRenderer.test.ts +157 -0
  425. package/src/v2/types/a2ui.ts +5 -0
  426. package/src/v2/types/defineToolCallRenderer.ts +32 -0
  427. package/src/v2/types/frontend-tool.ts +8 -0
  428. package/src/v2/types/human-in-the-loop.ts +38 -0
  429. package/src/v2/types/index.ts +9 -0
  430. package/src/v2/types/interrupt.ts +15 -0
  431. package/src/v2/types/sandbox-function.ts +8 -0
  432. package/src/v2/types/vue-activity-message-renderer.ts +22 -0
  433. package/src/v2/types/vue-custom-message-renderer.ts +24 -0
  434. package/src/v2/types/vue-tool-call-renderer.ts +44 -0
  435. package/tsconfig.json +27 -0
  436. package/vite.config.ts +49 -0
  437. package/vitest.config.ts +23 -0
@@ -0,0 +1,653 @@
1
+ <script setup lang="ts">
2
+ import {
3
+ computed,
4
+ onMounted,
5
+ provide,
6
+ ref,
7
+ shallowRef,
8
+ triggerRef,
9
+ watch,
10
+ } from "vue";
11
+ import { z } from "zod";
12
+ import type { AbstractAgent } from "@ag-ui/client";
13
+ import type {
14
+ CopilotKitCoreErrorCode,
15
+ CopilotKitCoreSubscriber,
16
+ FrontendTool,
17
+ } from "@copilotkit/core";
18
+ import { schemaToJsonSchema } from "@copilotkit/shared";
19
+ import { zodToJsonSchema } from "zod-to-json-schema";
20
+ import { CopilotKitCoreVue } from "../lib/vue-core";
21
+ import { createA2UIMessageRenderer } from "../components/A2UIMessageRenderer";
22
+ import { registerA2UIBuiltInToolCallRenderer } from "../components/a2ui/A2UIBuiltInToolCallRenderer";
23
+ import { registerA2UICatalogContext } from "../components/a2ui/A2UICatalogContext";
24
+ import {
25
+ GenerateSandboxedUiArgsSchema,
26
+ OpenGenerativeUIActivityRenderer,
27
+ OpenGenerativeUIActivityType,
28
+ OpenGenerativeUIContentSchema,
29
+ OpenGenerativeUIToolRenderer,
30
+ } from "../components/OpenGenerativeUIRenderer";
31
+ import {
32
+ MCPAppsActivityContentSchema,
33
+ MCPAppsActivityRenderer,
34
+ MCPAppsActivityType,
35
+ } from "../components/MCPAppsActivityRenderer";
36
+ import { CopilotKitKey, SandboxFunctionsKey } from "./keys";
37
+ import {
38
+ LicenseContextKey,
39
+ createLicenseContextValue,
40
+ type LicenseContextValue,
41
+ } from "./license-context";
42
+ import CopilotKitInspector from "../components/CopilotKitInspector.vue";
43
+ import LicenseWarningBanner from "../components/LicenseWarningBanner.vue";
44
+ import type { CopilotKitProviderProps } from "./CopilotKitProvider.types";
45
+ import type {
46
+ SandboxFunction,
47
+ VueActivityMessageRenderer,
48
+ VueFrontendTool,
49
+ VueHumanInTheLoop,
50
+ VueToolCallRenderer,
51
+ } from "../types";
52
+
53
+ const HEADER_NAME = "X-CopilotCloud-Public-Api-Key";
54
+ const COPILOT_CLOUD_CHAT_URL = "https://api.cloud.copilotkit.ai/copilotkit/v1";
55
+
56
+ // Canonical A2UI viewer theme default (matches @copilotkit/a2ui-renderer).
57
+ // Defined locally to avoid pulling React dependencies from a2ui-renderer.
58
+ const viewerTheme: Record<string, unknown> = {};
59
+
60
+ const FRONTEND_TOOLS_STABLE_WARNING =
61
+ "frontendTools must be a stable array. If you want to dynamically add or remove tools, use `useFrontendTool` instead.";
62
+ const HUMAN_IN_THE_LOOP_STABLE_WARNING =
63
+ "humanInTheLoop must be a stable array. If you want to dynamically add or remove human-in-the-loop tools, use `useHumanInTheLoop` instead.";
64
+ const RENDER_CUSTOM_MESSAGES_STABLE_WARNING =
65
+ "renderCustomMessages must be a stable array.";
66
+ const RENDER_ACTIVITY_MESSAGES_STABLE_WARNING =
67
+ "renderActivityMessages must be a stable array.";
68
+ const SANDBOX_FUNCTIONS_STABLE_WARNING =
69
+ "openGenerativeUI.sandboxFunctions must be a stable array.";
70
+ const DEFAULT_DESIGN_SKILL = `When generating UI with generateSandboxedUi, follow these design principles inspired by shadcn/ui:
71
+
72
+ - Use a minimal, flat aesthetic. Avoid drop shadows and gradients — rely on subtle borders (1px solid, light gray like #e5e7eb) to define surfaces.
73
+ - Neutral base palette: white backgrounds, zinc/slate gray text (#09090b for headings, #71717a for secondary text). One accent color for interactive elements.
74
+ - Use system font stacks (system-ui, -apple-system, sans-serif) at readable sizes (14px body, 600 weight for headings). Tight line-heights.
75
+ - Small, consistent border-radius (6–8px). Cards and containers use border, not shadow, for separation.
76
+ - Buttons: solid fill for primary (dark bg, white text), outline for secondary (border + transparent bg). Subtle hover state (slight opacity or background shift).
77
+ - Use CSS Grid or Flexbox for layout. Ensure the UI looks good at any width.
78
+ - Minimal transitions (150ms) for hover/focus states only. No decorative animations.
79
+ - Keep the UI focused and dense — avoid excessive padding. Use compact spacing (8–12px gaps, 10–14px padding in controls).`;
80
+
81
+ const GENERATE_SANDBOXED_UI_DESCRIPTION =
82
+ "Generate sandboxed UI. " +
83
+ "IMPORTANT: The generated code runs in a sandboxed iframe WITHOUT same-origin access. " +
84
+ "Do NOT use localStorage, sessionStorage, document.cookie, IndexedDB, or fetch/XMLHttpRequest to same-origin URLs. " +
85
+ "To communicate with the host application, use Websandbox.connection.remote.<functionName>(args) which returns a Promise.\n\n" +
86
+ "You CAN use external libraries from CDNs by including <script> or <link> tags in the HTML <head> (e.g., Chart.js, D3, Three.js, x-data-spreadsheet, etc.). " +
87
+ "CDN resources load normally inside the sandbox.\n\n" +
88
+ "PARAMETER ORDER IS CRITICAL — generate parameters in exactly this order:\n" +
89
+ "1. initialHeight + placeholderMessages (shown to user while generating)\n" +
90
+ "2. css (all styles FIRST — the user sees a placeholder until CSS is complete)\n" +
91
+ "3. html (streams in live — the user watches the UI build as HTML is generated)\n" +
92
+ "4. jsFunctions (reusable helper functions)\n" +
93
+ "5. jsExpressions (applied one-by-one — the user sees each expression take effect)";
94
+
95
+ const props = withDefaults(defineProps<CopilotKitProviderProps>(), {
96
+ headers: () => ({}),
97
+ properties: () => ({}),
98
+ agents__unsafe_dev_only: () => ({}),
99
+ selfManagedAgents: () => ({}),
100
+ frontendTools: () => [],
101
+ humanInTheLoop: () => [],
102
+ renderCustomMessages: () => [],
103
+ renderActivityMessages: () => [],
104
+ openGenerativeUI: undefined,
105
+ showDevConsole: false,
106
+ useSingleEndpoint: undefined,
107
+ a2ui: undefined,
108
+ });
109
+
110
+ const shouldRenderInspector = ref(false);
111
+
112
+ const updateInspectorVisibility = () => {
113
+ if (props.showDevConsole === true) {
114
+ shouldRenderInspector.value = true;
115
+ return;
116
+ }
117
+ if (props.showDevConsole === "auto") {
118
+ if (typeof window === "undefined") {
119
+ shouldRenderInspector.value = false;
120
+ return;
121
+ }
122
+ const localhostHosts = new Set(["localhost", "127.0.0.1"]);
123
+ shouldRenderInspector.value = localhostHosts.has(window.location.hostname);
124
+ return;
125
+ }
126
+ shouldRenderInspector.value = false;
127
+ };
128
+
129
+ watch(() => props.showDevConsole, updateInspectorVisibility, {
130
+ immediate: true,
131
+ });
132
+
133
+ const initialFrontendTools = props.frontendTools;
134
+ const initialHumanInTheLoop = props.humanInTheLoop;
135
+ const initialRenderCustomMessages = props.renderCustomMessages;
136
+ const initialRenderActivityMessages = props.renderActivityMessages;
137
+ const initialSandboxFunctions = props.openGenerativeUI?.sandboxFunctions;
138
+
139
+ watch(
140
+ () => props.frontendTools,
141
+ (next) => {
142
+ if (next !== initialFrontendTools) {
143
+ console.error(FRONTEND_TOOLS_STABLE_WARNING);
144
+ }
145
+ },
146
+ );
147
+
148
+ watch(
149
+ () => props.humanInTheLoop,
150
+ (next) => {
151
+ if (next !== initialHumanInTheLoop) {
152
+ console.error(HUMAN_IN_THE_LOOP_STABLE_WARNING);
153
+ }
154
+ },
155
+ );
156
+
157
+ watch(
158
+ () => props.renderCustomMessages,
159
+ (next) => {
160
+ if (next !== initialRenderCustomMessages) {
161
+ console.error(RENDER_CUSTOM_MESSAGES_STABLE_WARNING);
162
+ }
163
+ },
164
+ );
165
+
166
+ watch(
167
+ () => props.renderActivityMessages,
168
+ (next) => {
169
+ if (next !== initialRenderActivityMessages) {
170
+ console.error(RENDER_ACTIVITY_MESSAGES_STABLE_WARNING);
171
+ }
172
+ },
173
+ );
174
+
175
+ watch(
176
+ () => props.openGenerativeUI?.sandboxFunctions,
177
+ (next) => {
178
+ if (next !== initialSandboxFunctions) {
179
+ console.error(SANDBOX_FUNCTIONS_STABLE_WARNING);
180
+ }
181
+ },
182
+ );
183
+
184
+ const resolvedPublicKey = computed(
185
+ () => props.publicApiKey ?? props.publicLicenseKey,
186
+ );
187
+ const mergedAgents = computed(() => ({
188
+ ...props.agents__unsafe_dev_only,
189
+ ...props.selfManagedAgents,
190
+ }));
191
+ const hasLocalAgents = computed(
192
+ () => Object.keys(mergedAgents.value).length > 0,
193
+ );
194
+
195
+ const resolvedHeaders = computed(() =>
196
+ typeof props.headers === "function" ? props.headers() : props.headers,
197
+ );
198
+
199
+ const mergedHeaders = computed(() => {
200
+ const headers = resolvedHeaders.value;
201
+ if (!resolvedPublicKey.value) return headers;
202
+ if (headers[HEADER_NAME]) return headers;
203
+ return { ...headers, [HEADER_NAME]: resolvedPublicKey.value };
204
+ });
205
+
206
+ const chatApiEndpoint = computed(
207
+ () =>
208
+ props.runtimeUrl ??
209
+ (resolvedPublicKey.value ? COPILOT_CLOUD_CHAT_URL : undefined),
210
+ );
211
+
212
+ watch(
213
+ [chatApiEndpoint, resolvedPublicKey, hasLocalAgents],
214
+ ([endpoint, publicKey, localAgents]) => {
215
+ if (endpoint || publicKey || localAgents) return;
216
+ const msg =
217
+ "Missing required prop: 'runtimeUrl' or 'publicApiKey' or 'publicLicenseKey'";
218
+ if (process.env.NODE_ENV === "production") {
219
+ throw new Error(msg);
220
+ }
221
+ console.warn(msg);
222
+ },
223
+ { immediate: true },
224
+ );
225
+
226
+ const processedHumanInTheLoop = computed(() => {
227
+ const tools: FrontendTool[] = [];
228
+ const renderToolCalls: VueToolCallRenderer<unknown>[] = [];
229
+
230
+ for (const tool of props.humanInTheLoop) {
231
+ tools.push({
232
+ name: tool.name,
233
+ description: tool.description,
234
+ parameters: tool.parameters,
235
+ followUp: tool.followUp,
236
+ ...(tool.agentId && { agentId: tool.agentId }),
237
+ handler: async () => {
238
+ console.warn(
239
+ `Human-in-the-loop tool '${tool.name}' called but no interactive handler is set up.`,
240
+ );
241
+ return undefined;
242
+ },
243
+ });
244
+ if (tool.render) {
245
+ renderToolCalls.push({
246
+ name: tool.name,
247
+ args: tool.parameters ?? z.any(),
248
+ render: tool.render,
249
+ ...(tool.agentId && { agentId: tool.agentId }),
250
+ } as VueToolCallRenderer<unknown>);
251
+ }
252
+ }
253
+ return { tools, renderToolCalls };
254
+ });
255
+
256
+ const allTools = computed(() => {
257
+ const tools: FrontendTool[] = [];
258
+ for (const t of props.frontendTools) {
259
+ tools.push(t as FrontendTool);
260
+ }
261
+ for (const t of builtInFrontendTools.value) {
262
+ tools.push(t as FrontendTool);
263
+ }
264
+ tools.push(...processedHumanInTheLoop.value.tools);
265
+ return tools;
266
+ });
267
+
268
+ const allRenderToolCalls = computed(() => {
269
+ const combined: VueToolCallRenderer<unknown>[] = [
270
+ ...(props.renderToolCalls ?? []),
271
+ ];
272
+ for (const tool of [...props.frontendTools, ...builtInFrontendTools.value]) {
273
+ if (tool.render) {
274
+ const args = tool.parameters ?? (tool.name === "*" ? z.any() : undefined);
275
+ if (args) {
276
+ combined.push({
277
+ name: tool.name,
278
+ args,
279
+ render: tool.render,
280
+ } as VueToolCallRenderer<unknown>);
281
+ }
282
+ }
283
+ }
284
+ combined.push(...processedHumanInTheLoop.value.renderToolCalls);
285
+ return combined;
286
+ });
287
+
288
+ const allRenderCustomMessages = computed(
289
+ () => props.renderCustomMessages ?? [],
290
+ );
291
+ const runtimeA2UIEnabled = ref(false);
292
+ const runtimeOpenGenerativeUIEnabled = ref(false);
293
+ const runtimeLicenseStatus = ref<string | undefined>(undefined);
294
+ const openGenerativeUIActive = computed(
295
+ () => runtimeOpenGenerativeUIEnabled.value || !!props.openGenerativeUI,
296
+ );
297
+ const sandboxFunctions = computed<readonly SandboxFunction[]>(
298
+ () => props.openGenerativeUI?.sandboxFunctions ?? [],
299
+ );
300
+ const zodToJsonSchemaCompat = (
301
+ schema: unknown,
302
+ options?: { $refStrategy?: string },
303
+ ): Record<string, unknown> =>
304
+ zodToJsonSchema(
305
+ schema as z.ZodTypeAny,
306
+ options as { $refStrategy?: "none" | "relative" | "root" | "seen" },
307
+ ) as Record<string, unknown>;
308
+
309
+ const builtInFrontendTools = computed<VueFrontendTool[]>(() => {
310
+ if (!openGenerativeUIActive.value) return [];
311
+ return [
312
+ {
313
+ name: "generateSandboxedUi",
314
+ description: GENERATE_SANDBOXED_UI_DESCRIPTION,
315
+ parameters: GenerateSandboxedUiArgsSchema,
316
+ handler: async () => "UI generated",
317
+ followUp: true,
318
+ render: OpenGenerativeUIToolRenderer as unknown as VueFrontendTool["render"],
319
+ } as VueFrontendTool,
320
+ ];
321
+ });
322
+
323
+ const builtInActivityRenderers = computed<
324
+ VueActivityMessageRenderer<unknown>[]
325
+ >(() => {
326
+ const renderers: VueActivityMessageRenderer<unknown>[] = [
327
+ {
328
+ activityType: MCPAppsActivityType,
329
+ content: MCPAppsActivityContentSchema as unknown as z.ZodSchema<unknown>,
330
+ render: MCPAppsActivityRenderer as unknown as VueActivityMessageRenderer<unknown>["render"],
331
+ },
332
+ ];
333
+
334
+ if (openGenerativeUIActive.value) {
335
+ renderers.push({
336
+ activityType: OpenGenerativeUIActivityType,
337
+ content: OpenGenerativeUIContentSchema as unknown as z.ZodSchema<unknown>,
338
+ render: OpenGenerativeUIActivityRenderer as unknown as VueActivityMessageRenderer<unknown>["render"],
339
+ });
340
+ }
341
+
342
+ if (runtimeA2UIEnabled.value) {
343
+ renderers.unshift(
344
+ createA2UIMessageRenderer({
345
+ theme: props.a2ui?.theme ?? viewerTheme,
346
+ catalog: props.a2ui?.catalog,
347
+ loadingComponent: props.a2ui?.loadingComponent,
348
+ }),
349
+ );
350
+ }
351
+
352
+ return renderers;
353
+ });
354
+
355
+ const allRenderActivityMessages = computed(() => [
356
+ ...(props.renderActivityMessages ?? []),
357
+ ...builtInActivityRenderers.value,
358
+ ]);
359
+
360
+ const applyDefaultThrottleMs = (core: CopilotKitCoreVue) => {
361
+ if (
362
+ props.defaultThrottleMs !== undefined &&
363
+ (!Number.isFinite(props.defaultThrottleMs) || props.defaultThrottleMs < 0)
364
+ ) {
365
+ console.error(
366
+ `CopilotKitProvider: defaultThrottleMs must be a non-negative finite number, got ${props.defaultThrottleMs}. useAgent hooks without an explicit throttleMs will fall back to unthrottled.`,
367
+ );
368
+ }
369
+ core.setDefaultThrottleMs(props.defaultThrottleMs);
370
+ };
371
+
372
+ const createCopilotKit = () => {
373
+ const core = new CopilotKitCoreVue({
374
+ runtimeUrl: chatApiEndpoint.value,
375
+ runtimeTransport:
376
+ props.useSingleEndpoint === true
377
+ ? "single"
378
+ : props.useSingleEndpoint === false
379
+ ? "rest"
380
+ : "auto",
381
+ headers: mergedHeaders.value,
382
+ credentials: props.credentials,
383
+ properties: props.properties,
384
+ agents__unsafe_dev_only: mergedAgents.value,
385
+ tools: allTools.value,
386
+ renderToolCalls: allRenderToolCalls.value,
387
+ renderActivityMessages: allRenderActivityMessages.value,
388
+ renderCustomMessages: allRenderCustomMessages.value,
389
+ debug: props.debug,
390
+ });
391
+ // Initialize synchronously so child hooks can read the value on first render.
392
+ applyDefaultThrottleMs(core);
393
+ return core;
394
+ };
395
+
396
+ const copilotkit = shallowRef<CopilotKitCoreVue>(createCopilotKit());
397
+ const didMountRef = ref(false);
398
+
399
+ const executingToolCallIds = ref<ReadonlySet<string>>(new Set());
400
+
401
+ watch(
402
+ copilotkit,
403
+ (core, _, onCleanup) => {
404
+ const sub1 = core.subscribe({
405
+ onToolExecutionStart: ({
406
+ toolCallId,
407
+ }: Parameters<
408
+ NonNullable<CopilotKitCoreSubscriber["onToolExecutionStart"]>
409
+ >[0]) => {
410
+ executingToolCallIds.value = new Set(executingToolCallIds.value).add(
411
+ toolCallId,
412
+ );
413
+ },
414
+ onToolExecutionEnd: ({
415
+ toolCallId,
416
+ }: Parameters<
417
+ NonNullable<CopilotKitCoreSubscriber["onToolExecutionEnd"]>
418
+ >[0]) => {
419
+ setTimeout(() => {
420
+ const next = new Set(executingToolCallIds.value);
421
+ next.delete(toolCallId);
422
+ executingToolCallIds.value = next;
423
+ triggerRef(copilotkit);
424
+ }, 0);
425
+ },
426
+ });
427
+ const sub2 = core.subscribe({
428
+ onRenderToolCallsChanged: () => {
429
+ triggerRef(copilotkit);
430
+ },
431
+ });
432
+ const sub3 = core.subscribe({
433
+ onRenderCustomMessagesChanged: () => {
434
+ triggerRef(copilotkit);
435
+ },
436
+ });
437
+ const sub4 = core.subscribe({
438
+ onRuntimeConnectionStatusChanged: () => {
439
+ runtimeA2UIEnabled.value = core.a2uiEnabled;
440
+ runtimeOpenGenerativeUIEnabled.value = core.openGenerativeUIEnabled;
441
+ runtimeLicenseStatus.value = core.licenseStatus;
442
+ triggerRef(copilotkit);
443
+ },
444
+ });
445
+ const sub5 = core.subscribe({
446
+ onError: (event: {
447
+ error: Error;
448
+ code: CopilotKitCoreErrorCode;
449
+ context: Record<string, any>;
450
+ }) => {
451
+ void props.onError?.({
452
+ error: event.error,
453
+ code: event.code,
454
+ context: event.context,
455
+ });
456
+ },
457
+ });
458
+ onCleanup(() => {
459
+ sub1.unsubscribe();
460
+ sub2.unsubscribe();
461
+ sub3.unsubscribe();
462
+ sub4.unsubscribe();
463
+ sub5.unsubscribe();
464
+ });
465
+ },
466
+ { immediate: true },
467
+ );
468
+
469
+ watch([allTools], ([tools]) => {
470
+ if (!didMountRef.value) return;
471
+ copilotkit.value.setTools(tools);
472
+ });
473
+
474
+ watch([allRenderToolCalls], ([renderToolCalls]) => {
475
+ if (!didMountRef.value) return;
476
+ copilotkit.value.setRenderToolCalls(renderToolCalls);
477
+ });
478
+
479
+ watch([allRenderCustomMessages], ([renderCustomMessages]) => {
480
+ if (!didMountRef.value) return;
481
+ copilotkit.value.setRenderCustomMessages(renderCustomMessages);
482
+ triggerRef(copilotkit);
483
+ });
484
+
485
+ watch([allRenderActivityMessages], ([renderActivityMessages]) => {
486
+ if (!didMountRef.value) return;
487
+ copilotkit.value.setRenderActivityMessages(renderActivityMessages);
488
+ triggerRef(copilotkit);
489
+ });
490
+
491
+ function syncRuntimeConfig() {
492
+ copilotkit.value.setRuntimeUrl(chatApiEndpoint.value);
493
+ copilotkit.value.setRuntimeTransport(
494
+ props.useSingleEndpoint === true
495
+ ? "single"
496
+ : props.useSingleEndpoint === false
497
+ ? "rest"
498
+ : "auto",
499
+ );
500
+ copilotkit.value.setHeaders(mergedHeaders.value);
501
+ copilotkit.value.setCredentials(props.credentials);
502
+ copilotkit.value.setProperties(props.properties);
503
+ copilotkit.value.setAgents__unsafe_dev_only(mergedAgents.value);
504
+ copilotkit.value.setDebug(props.debug);
505
+ applyDefaultThrottleMs(copilotkit.value);
506
+ }
507
+
508
+ watch(
509
+ [
510
+ () => chatApiEndpoint.value,
511
+ () => mergedHeaders.value,
512
+ () => props.credentials,
513
+ () => props.properties,
514
+ () => mergedAgents.value,
515
+ () => props.useSingleEndpoint,
516
+ () => props.debug,
517
+ ],
518
+ () => {
519
+ if (!didMountRef.value) return;
520
+ syncRuntimeConfig();
521
+ },
522
+ );
523
+
524
+ watch(
525
+ () => props.defaultThrottleMs,
526
+ () => {
527
+ if (!didMountRef.value) return;
528
+ applyDefaultThrottleMs(copilotkit.value);
529
+ triggerRef(copilotkit);
530
+ },
531
+ );
532
+
533
+ onMounted(() => {
534
+ syncRuntimeConfig();
535
+ runtimeA2UIEnabled.value = copilotkit.value.a2uiEnabled;
536
+ runtimeOpenGenerativeUIEnabled.value =
537
+ copilotkit.value.openGenerativeUIEnabled;
538
+ runtimeLicenseStatus.value = copilotkit.value.licenseStatus;
539
+ didMountRef.value = true;
540
+ });
541
+
542
+ const a2uiTheme = computed(() => props.a2ui?.theme);
543
+ const a2uiCatalog = computed(() => props.a2ui?.catalog);
544
+ const a2uiLoadingComponent = computed(() => props.a2ui?.loadingComponent);
545
+ const a2uiIncludeSchema = computed(() => props.a2ui?.includeSchema ?? true);
546
+
547
+ // A2UI tool call renderer (progress indicator) — auto-registered when A2UI enabled
548
+ registerA2UIBuiltInToolCallRenderer(
549
+ copilotkit,
550
+ () => runtimeA2UIEnabled.value,
551
+ );
552
+
553
+ // A2UI catalog context, schema, and generation/design guidelines
554
+ registerA2UICatalogContext(copilotkit, {
555
+ enabled: () => runtimeA2UIEnabled.value,
556
+ catalog: () => props.a2ui?.catalog,
557
+ includeSchema: () => props.a2ui?.includeSchema ?? true,
558
+ });
559
+
560
+ const providerContextIds = ref<string[]>([]);
561
+ watch(
562
+ [
563
+ openGenerativeUIActive,
564
+ sandboxFunctions,
565
+ () => props.openGenerativeUI?.designSkill,
566
+ ],
567
+ ([active, functions, designSkill], _previous, onCleanup) => {
568
+ if (!active) return;
569
+
570
+ const ids: string[] = [];
571
+ ids.push(
572
+ copilotkit.value.addContext({
573
+ description:
574
+ "Design guidelines for the generateSandboxedUi tool. Follow these when building UI.",
575
+ value: designSkill ?? DEFAULT_DESIGN_SKILL,
576
+ }),
577
+ );
578
+
579
+ if (functions.length > 0) {
580
+ const descriptors = JSON.stringify(
581
+ functions.map((fn) => ({
582
+ name: fn.name,
583
+ description: fn.description,
584
+ parameters: schemaToJsonSchema(fn.parameters, {
585
+ zodToJsonSchema: zodToJsonSchemaCompat,
586
+ }),
587
+ })),
588
+ );
589
+ ids.push(
590
+ copilotkit.value.addContext({
591
+ description:
592
+ "Sandbox functions available in generated sandboxed UI code. Call via Websandbox.connection.remote.<functionName>(args).",
593
+ value: descriptors,
594
+ }),
595
+ );
596
+ }
597
+
598
+ providerContextIds.value = ids;
599
+ onCleanup(() => {
600
+ for (const id of ids) {
601
+ copilotkit.value.removeContext(id);
602
+ }
603
+ });
604
+ },
605
+ { immediate: true },
606
+ );
607
+
608
+ provide(CopilotKitKey, {
609
+ copilotkit,
610
+ executingToolCallIds,
611
+ a2uiTheme,
612
+ a2uiCatalog,
613
+ a2uiLoadingComponent,
614
+ a2uiIncludeSchema,
615
+ });
616
+ provide(SandboxFunctionsKey, sandboxFunctions);
617
+
618
+ // License context — driven by server-reported `/info` license status.
619
+ // Stays at the permissive default (`createLicenseContextValue(null)`)
620
+ // to mirror React's current provider behavior; banner rendering below
621
+ // is the sole consumer of `runtimeLicenseStatus`.
622
+ const licenseContextValue = computed<LicenseContextValue>(() =>
623
+ createLicenseContextValue(null),
624
+ );
625
+ provide(LicenseContextKey, licenseContextValue);
626
+
627
+ const showNoLicenseBanner = computed(
628
+ () => runtimeLicenseStatus.value === "none" && !resolvedPublicKey.value,
629
+ );
630
+ const showExpiredBanner = computed(
631
+ () => runtimeLicenseStatus.value === "expired",
632
+ );
633
+ const showInvalidBanner = computed(
634
+ () => runtimeLicenseStatus.value === "invalid",
635
+ );
636
+ const showExpiringBanner = computed(
637
+ () => runtimeLicenseStatus.value === "expiring",
638
+ );
639
+ </script>
640
+
641
+ <template>
642
+ <slot />
643
+ <CopilotKitInspector
644
+ v-if="shouldRenderInspector"
645
+ :core="copilotkit"
646
+ :default-anchor="props.inspectorDefaultAnchor"
647
+ />
648
+ <!-- License warnings — driven by server-reported status -->
649
+ <LicenseWarningBanner v-if="showNoLicenseBanner" type="no_license" />
650
+ <LicenseWarningBanner v-if="showExpiredBanner" type="expired" />
651
+ <LicenseWarningBanner v-if="showInvalidBanner" type="invalid" />
652
+ <LicenseWarningBanner v-if="showExpiringBanner" type="expiring" />
653
+ </template>
@@ -0,0 +1,11 @@
1
+ import { computed, inject, type ComputedRef, type Ref } from "vue";
2
+ import type { SandboxFunction } from "../types";
3
+ import { SandboxFunctionsKey } from "./keys";
4
+
5
+ export function useSandboxFunctions(): ComputedRef<readonly SandboxFunction[]> {
6
+ const functionsRef = inject<Ref<readonly SandboxFunction[]>>(
7
+ SandboxFunctionsKey,
8
+ computed(() => []),
9
+ );
10
+ return computed(() => functionsRef.value);
11
+ }