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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (343) hide show
  1. package/CONTRIBUTOR_GUIDE.md +1 -1
  2. package/PARITY.md +3 -3
  3. package/dist/hooks/use-copilot-action.d.ts.map +1 -1
  4. package/dist/hooks/use-frontend-tool.d.ts +1 -1
  5. package/dist/hooks/use-frontend-tool.d.ts.map +1 -1
  6. package/dist/hooks/zod-parameters.d.ts +14 -0
  7. package/dist/hooks/zod-parameters.d.ts.map +1 -0
  8. package/dist/index.cjs +1 -73
  9. package/dist/index.cjs.map +1 -1
  10. package/dist/index.mjs +365 -16920
  11. package/dist/index.mjs.map +1 -1
  12. package/dist/use-render-activity-message-BZJ33B_r.cjs +113 -0
  13. package/dist/use-render-activity-message-BZJ33B_r.cjs.map +1 -0
  14. package/dist/use-render-activity-message-DrR407LQ.js +15901 -0
  15. package/dist/use-render-activity-message-DrR407LQ.js.map +1 -0
  16. package/dist/v2/components/A2UIMessageRenderer.d.ts +14 -0
  17. package/dist/v2/components/A2UIMessageRenderer.d.ts.map +1 -1
  18. package/dist/v2/components/A2UISurfaceActivityRenderer.vue.d.ts +10 -3
  19. package/dist/v2/components/A2UISurfaceActivityRenderer.vue.d.ts.map +1 -1
  20. package/dist/v2/components/CopilotKitInspector.vue.d.ts +5 -1
  21. package/dist/v2/components/CopilotKitInspector.vue.d.ts.map +1 -1
  22. package/dist/v2/components/InlineFeatureWarning.vue.d.ts.map +1 -1
  23. package/dist/v2/components/LicenseWarningBanner.vue.d.ts +2 -2
  24. package/dist/v2/components/LicenseWarningBanner.vue.d.ts.map +1 -1
  25. package/dist/v2/components/MCPAppsActivityRenderer.d.ts.map +1 -1
  26. package/dist/v2/components/OpenGenerativeUIRenderer.d.ts +13 -59
  27. package/dist/v2/components/OpenGenerativeUIRenderer.d.ts.map +1 -1
  28. package/dist/v2/components/a2ui/A2UIBuiltInToolCallRenderer.d.ts +3 -11
  29. package/dist/v2/components/a2ui/A2UIBuiltInToolCallRenderer.d.ts.map +1 -1
  30. package/dist/v2/components/a2ui/A2UICatalogContext.d.ts +10 -15
  31. package/dist/v2/components/a2ui/A2UICatalogContext.d.ts.map +1 -1
  32. package/dist/v2/components/a2ui/A2UIRecoveryStates.d.ts +14 -130
  33. package/dist/v2/components/a2ui/A2UIRecoveryStates.d.ts.map +1 -1
  34. package/dist/v2/components/a2ui/catalog.d.ts.map +1 -1
  35. package/dist/v2/components/a2ui/utils.d.ts +3 -15
  36. package/dist/v2/components/a2ui/utils.d.ts.map +1 -1
  37. package/dist/v2/components/a2ui.d.ts +9 -8
  38. package/dist/v2/components/a2ui.d.ts.map +1 -1
  39. package/dist/v2/components/chat/CopilotChat.vue.d.ts +2 -2
  40. package/dist/v2/components/chat/CopilotChat.vue.d.ts.map +1 -1
  41. package/dist/v2/components/chat/CopilotChatAssistantMessage.vue.d.ts.map +1 -1
  42. package/dist/v2/components/chat/CopilotChatAttachmentQueue.vue.d.ts.map +1 -1
  43. package/dist/v2/components/chat/CopilotChatAttachmentRenderer.vue.d.ts.map +1 -1
  44. package/dist/v2/components/chat/CopilotChatAudioRecorder.vue.d.ts +4 -8
  45. package/dist/v2/components/chat/CopilotChatAudioRecorder.vue.d.ts.map +1 -1
  46. package/dist/v2/components/chat/CopilotChatFeedbackCommentPopover.vue.d.ts +1 -1
  47. package/dist/v2/components/chat/CopilotChatFeedbackCommentPopover.vue.d.ts.map +1 -1
  48. package/dist/v2/components/chat/CopilotChatInput.vue.d.ts +7 -286
  49. package/dist/v2/components/chat/CopilotChatInput.vue.d.ts.map +1 -1
  50. package/dist/v2/components/chat/CopilotChatInspectorButton.vue.d.ts.map +1 -1
  51. package/dist/v2/components/chat/CopilotChatLightbox.vue.d.ts.map +1 -1
  52. package/dist/v2/components/chat/CopilotChatMessageView.vue.d.ts +1 -1
  53. package/dist/v2/components/chat/CopilotChatMessageView.vue.d.ts.map +1 -1
  54. package/dist/v2/components/chat/CopilotChatReasoningMessage.vue.d.ts.map +1 -1
  55. package/dist/v2/components/chat/CopilotChatToolCallGroup.vue.d.ts +1 -1
  56. package/dist/v2/components/chat/CopilotChatToolCallGroup.vue.d.ts.map +1 -1
  57. package/dist/v2/components/chat/CopilotChatToolCallItem.vue.d.ts.map +1 -1
  58. package/dist/v2/components/chat/CopilotChatToolCallsView.vue.d.ts +1 -1
  59. package/dist/v2/components/chat/CopilotChatToolCallsView.vue.d.ts.map +1 -1
  60. package/dist/v2/components/chat/CopilotChatUserMessage.vue.d.ts.map +1 -1
  61. package/dist/v2/components/chat/CopilotChatView.vue.d.ts +3 -3
  62. package/dist/v2/components/chat/CopilotChatView.vue.d.ts.map +1 -1
  63. package/dist/v2/components/chat/CopilotChatWorkSummary.vue.d.ts.map +1 -1
  64. package/dist/v2/components/chat/CopilotModalHeader.vue.d.ts.map +1 -1
  65. package/dist/v2/components/chat/CopilotPopup.vue.d.ts +8 -3
  66. package/dist/v2/components/chat/CopilotPopup.vue.d.ts.map +1 -1
  67. package/dist/v2/components/chat/CopilotPopupView.vue.d.ts +5 -3
  68. package/dist/v2/components/chat/CopilotPopupView.vue.d.ts.map +1 -1
  69. package/dist/v2/components/chat/CopilotPopupViewInternal.vue.d.ts +5 -3
  70. package/dist/v2/components/chat/CopilotPopupViewInternal.vue.d.ts.map +1 -1
  71. package/dist/v2/components/chat/CopilotSidebar.vue.d.ts +8 -3
  72. package/dist/v2/components/chat/CopilotSidebar.vue.d.ts.map +1 -1
  73. package/dist/v2/components/chat/CopilotSidebarView.vue.d.ts +6 -4
  74. package/dist/v2/components/chat/CopilotSidebarView.vue.d.ts.map +1 -1
  75. package/dist/v2/components/chat/CopilotSidebarViewInternal.vue.d.ts +6 -4
  76. package/dist/v2/components/chat/CopilotSidebarViewInternal.vue.d.ts.map +1 -1
  77. package/dist/v2/components/chat/CopilotThreadsDrawer.vue.d.ts.map +1 -1
  78. package/dist/v2/components/chat/StreamingMarkdownDefault.vue.d.ts +1 -0
  79. package/dist/v2/components/chat/StreamingMarkdownDefault.vue.d.ts.map +1 -1
  80. package/dist/v2/components/chat/audioRecorder.d.ts +3 -4
  81. package/dist/v2/components/chat/audioRecorder.d.ts.map +1 -1
  82. package/dist/v2/components/chat/copilotChatToolCallItemRender.d.ts +4 -4
  83. package/dist/v2/components/chat/copilotChatToolCallItemRender.d.ts.map +1 -1
  84. package/dist/v2/components/chat/forwarded-slots.d.ts +12 -0
  85. package/dist/v2/components/chat/forwarded-slots.d.ts.map +1 -0
  86. package/dist/v2/components/chat/index.d.ts +34 -31
  87. package/dist/v2/components/chat/index.d.ts.map +1 -1
  88. package/dist/v2/components/chat/inspector-shortcuts.d.ts +2 -1
  89. package/dist/v2/components/chat/inspector-shortcuts.d.ts.map +1 -1
  90. package/dist/v2/components/chat/message-feedback.d.ts +38 -49
  91. package/dist/v2/components/chat/message-feedback.d.ts.map +1 -1
  92. package/dist/v2/components/chat/tool-call-display-context.d.ts +4 -19
  93. package/dist/v2/components/chat/tool-call-display-context.d.ts.map +1 -1
  94. package/dist/v2/components/chat/tool-call-group-parts.d.ts +7 -20
  95. package/dist/v2/components/chat/tool-call-group-parts.d.ts.map +1 -1
  96. package/dist/v2/components/chat/turn-work.d.ts +0 -2
  97. package/dist/v2/components/chat/turn-work.d.ts.map +1 -1
  98. package/dist/v2/components/chat/types.d.ts +9 -4
  99. package/dist/v2/components/chat/types.d.ts.map +1 -1
  100. package/dist/v2/components/chat/use-chat-labels.d.ts +8 -0
  101. package/dist/v2/components/chat/use-chat-labels.d.ts.map +1 -0
  102. package/dist/v2/components/chat/use-copy-feedback.d.ts +11 -0
  103. package/dist/v2/components/chat/use-copy-feedback.d.ts.map +1 -0
  104. package/dist/v2/components/chat/use-lightbox.d.ts.map +1 -1
  105. package/dist/v2/components/icons/index.d.ts +968 -1
  106. package/dist/v2/components/icons/index.d.ts.map +1 -1
  107. package/dist/v2/components/ui/CopilotDropdownMenuContent.vue.d.ts +1 -1
  108. package/dist/v2/components/ui/CopilotDropdownMenuContent.vue.d.ts.map +1 -1
  109. package/dist/v2/hooks/use-agent-context.d.ts +2 -3
  110. package/dist/v2/hooks/use-agent-context.d.ts.map +1 -1
  111. package/dist/v2/hooks/use-agent.d.ts +4 -1
  112. package/dist/v2/hooks/use-agent.d.ts.map +1 -1
  113. package/dist/v2/hooks/use-attachments.d.ts +7 -0
  114. package/dist/v2/hooks/use-attachments.d.ts.map +1 -1
  115. package/dist/v2/hooks/use-capabilities.d.ts.map +1 -1
  116. package/dist/v2/hooks/use-component.d.ts +1 -0
  117. package/dist/v2/hooks/use-component.d.ts.map +1 -1
  118. package/dist/v2/hooks/use-configure-suggestions.d.ts +4 -9
  119. package/dist/v2/hooks/use-configure-suggestions.d.ts.map +1 -1
  120. package/dist/v2/hooks/use-default-render-tool.d.ts +2 -7
  121. package/dist/v2/hooks/use-default-render-tool.d.ts.map +1 -1
  122. package/dist/v2/hooks/use-frontend-tool.d.ts +5 -0
  123. package/dist/v2/hooks/use-frontend-tool.d.ts.map +1 -1
  124. package/dist/v2/hooks/use-human-in-the-loop.d.ts +2 -1
  125. package/dist/v2/hooks/use-human-in-the-loop.d.ts.map +1 -1
  126. package/dist/v2/hooks/use-interrupt.d.ts +0 -1
  127. package/dist/v2/hooks/use-interrupt.d.ts.map +1 -1
  128. package/dist/v2/hooks/use-keyboard-height.d.ts +1 -1
  129. package/dist/v2/hooks/use-keyboard-height.d.ts.map +1 -1
  130. package/dist/v2/hooks/use-pin-to-send.d.ts +4 -12
  131. package/dist/v2/hooks/use-pin-to-send.d.ts.map +1 -1
  132. package/dist/v2/hooks/use-render-activity-message.d.ts +13 -9
  133. package/dist/v2/hooks/use-render-activity-message.d.ts.map +1 -1
  134. package/dist/v2/hooks/use-render-custom-messages.d.ts +5 -7
  135. package/dist/v2/hooks/use-render-custom-messages.d.ts.map +1 -1
  136. package/dist/v2/hooks/use-render-tool.d.ts +1 -1
  137. package/dist/v2/hooks/use-render-tool.d.ts.map +1 -1
  138. package/dist/v2/hooks/use-suggestions.d.ts.map +1 -1
  139. package/dist/v2/hooks/use-threads.d.ts +6 -23
  140. package/dist/v2/hooks/use-threads.d.ts.map +1 -1
  141. package/dist/v2/index.cjs +1 -1
  142. package/dist/v2/index.mjs +197 -200
  143. package/dist/v2/index.mjs.map +1 -1
  144. package/dist/v2/lib/processPartialHtml.d.ts +1 -2
  145. package/dist/v2/lib/processPartialHtml.d.ts.map +1 -1
  146. package/dist/v2/lib/shallow-stable.d.ts.map +1 -1
  147. package/dist/v2/lib/vue-core.d.ts +33 -19
  148. package/dist/v2/lib/vue-core.d.ts.map +1 -1
  149. package/dist/v2/providers/CopilotChatConfigurationProvider.vue.d.ts.map +1 -1
  150. package/dist/v2/providers/CopilotKitProvider.types.d.ts +9 -129
  151. package/dist/v2/providers/CopilotKitProvider.types.d.ts.map +1 -1
  152. package/dist/v2/providers/CopilotKitProvider.vue.d.ts +9 -10
  153. package/dist/v2/providers/CopilotKitProvider.vue.d.ts.map +1 -1
  154. package/dist/v2/providers/chat-configuration-store-key.d.ts +8 -0
  155. package/dist/v2/providers/chat-configuration-store-key.d.ts.map +1 -0
  156. package/dist/v2/providers/markdown-renderer.d.ts +4 -2
  157. package/dist/v2/providers/markdown-renderer.d.ts.map +1 -1
  158. package/dist/v2/providers/types.d.ts +3 -46
  159. package/dist/v2/providers/types.d.ts.map +1 -1
  160. package/dist/v2/providers/use-inspector-thread-override.d.ts +5 -0
  161. package/dist/v2/providers/use-inspector-thread-override.d.ts.map +1 -1
  162. package/dist/v2/types/defineToolCallRenderer.d.ts +1 -1
  163. package/dist/v2/types/defineToolCallRenderer.d.ts.map +1 -1
  164. package/dist/v2/types/human-in-the-loop.d.ts +8 -29
  165. package/dist/v2/types/human-in-the-loop.d.ts.map +1 -1
  166. package/dist/v2/types/interrupt.d.ts +1 -22
  167. package/dist/v2/types/interrupt.d.ts.map +1 -1
  168. package/dist/v2/types/vue-activity-message-renderer.d.ts +16 -15
  169. package/dist/v2/types/vue-activity-message-renderer.d.ts.map +1 -1
  170. package/dist/v2/types/vue-custom-message-renderer.d.ts +7 -16
  171. package/dist/v2/types/vue-custom-message-renderer.d.ts.map +1 -1
  172. package/dist/v2/types/vue-tool-call-renderer.d.ts +16 -35
  173. package/dist/v2/types/vue-tool-call-renderer.d.ts.map +1 -1
  174. package/package.json +12 -13
  175. package/src/__tests__/build-entries.test.ts +29 -0
  176. package/src/hooks/__tests__/zod-parameters.test.ts +520 -0
  177. package/src/hooks/use-copilot-action.ts +2 -1
  178. package/src/hooks/use-frontend-tool.ts +3 -6
  179. package/src/hooks/zod-parameters.ts +162 -0
  180. package/src/v2/__tests__/exports.test.ts +10 -0
  181. package/src/v2/__tests__/mocks/web-inspector.ts +6 -0
  182. package/src/v2/__tests__/utils/test-helpers.ts +34 -4
  183. package/src/v2/components/A2UIMessageRenderer.ts +98 -68
  184. package/src/v2/components/A2UISurfaceActivityRenderer.vue +68 -103
  185. package/src/v2/components/CopilotKitInspector.vue +104 -51
  186. package/src/v2/components/InlineFeatureWarning.vue +20 -21
  187. package/src/v2/components/LicenseWarningBanner.vue +27 -135
  188. package/src/v2/components/MCPAppsActivityRenderer.ts +75 -201
  189. package/src/v2/components/OpenGenerativeUIRenderer.ts +122 -446
  190. package/src/v2/components/__tests__/A2UIMessageRenderer.test.ts +171 -8
  191. package/src/v2/components/__tests__/CopilotKitInspector.test.ts +42 -0
  192. package/src/v2/components/__tests__/LicenseWarningBanner.test.ts +60 -0
  193. package/src/v2/components/__tests__/OpenGenerativeUIRenderer.test.ts +64 -8
  194. package/src/v2/components/__tests__/OpenGenerativeUIToolRenderer.test.ts +38 -0
  195. package/src/v2/components/a2ui/A2UIBuiltInToolCallRenderer.ts +6 -26
  196. package/src/v2/components/a2ui/A2UICatalogContext.ts +27 -185
  197. package/src/v2/components/a2ui/A2UIRecoveryStates.ts +127 -327
  198. package/src/v2/components/a2ui/catalog.ts +3 -3
  199. package/src/v2/components/a2ui/utils.ts +13 -65
  200. package/src/v2/components/a2ui.ts +15 -22
  201. package/src/v2/components/chat/CopilotChat.vue +121 -498
  202. package/src/v2/components/chat/CopilotChatAssistantMessage.vue +47 -184
  203. package/src/v2/components/chat/CopilotChatAttachmentQueue.vue +36 -55
  204. package/src/v2/components/chat/CopilotChatAttachmentRenderer.vue +14 -6
  205. package/src/v2/components/chat/CopilotChatAudioRecorder.vue +19 -246
  206. package/src/v2/components/chat/CopilotChatFeedbackCommentPopover.vue +12 -77
  207. package/src/v2/components/chat/CopilotChatInput.vue +139 -654
  208. package/src/v2/components/chat/CopilotChatInspectorButton.vue +45 -108
  209. package/src/v2/components/chat/CopilotChatLightbox.vue +10 -31
  210. package/src/v2/components/chat/CopilotChatMessageView.vue +96 -274
  211. package/src/v2/components/chat/CopilotChatReasoningMessage.vue +27 -62
  212. package/src/v2/components/chat/CopilotChatToolCallGroup.vue +63 -71
  213. package/src/v2/components/chat/CopilotChatToolCallItem.vue +8 -6
  214. package/src/v2/components/chat/CopilotChatToolCallsView.vue +31 -32
  215. package/src/v2/components/chat/CopilotChatUserMessage.vue +24 -112
  216. package/src/v2/components/chat/CopilotChatView.vue +123 -161
  217. package/src/v2/components/chat/CopilotChatWorkSummary.vue +26 -36
  218. package/src/v2/components/chat/CopilotModalHeader.vue +11 -23
  219. package/src/v2/components/chat/CopilotPopup.vue +23 -25
  220. package/src/v2/components/chat/CopilotPopupView.vue +10 -39
  221. package/src/v2/components/chat/CopilotPopupViewInternal.vue +49 -185
  222. package/src/v2/components/chat/CopilotSidebar.vue +23 -25
  223. package/src/v2/components/chat/CopilotSidebarView.vue +10 -39
  224. package/src/v2/components/chat/CopilotSidebarViewInternal.vue +56 -100
  225. package/src/v2/components/chat/CopilotThreadsDrawer.vue +43 -105
  226. package/src/v2/components/chat/StreamingMarkdownDefault.vue +15 -28
  227. package/src/v2/components/chat/__tests__/CopilotChat.labels.test.ts +19 -4
  228. package/src/v2/components/chat/__tests__/CopilotChat.test.ts +12 -10
  229. package/src/v2/components/chat/__tests__/CopilotChatActivityRendering.e2e.test.ts +26 -9
  230. package/src/v2/components/chat/__tests__/CopilotChatAssistantMessage.learningFeedback.test.ts +5 -5
  231. package/src/v2/components/chat/__tests__/CopilotChatAttachmentQueue.test.ts +28 -0
  232. package/src/v2/components/chat/__tests__/CopilotChatInput.test.ts +132 -1
  233. package/src/v2/components/chat/__tests__/CopilotChatMessageView.test.ts +247 -403
  234. package/src/v2/components/chat/__tests__/CopilotChatMessageView.toolCallDisplay.test.ts +1 -99
  235. package/src/v2/components/chat/__tests__/CopilotChatView.pinToSend.test.ts +43 -1
  236. package/src/v2/components/chat/__tests__/CopilotPopup.test.ts +90 -1
  237. package/src/v2/components/chat/__tests__/CopilotPopupView.test.ts +19 -0
  238. package/src/v2/components/chat/__tests__/CopilotSidebar.test.ts +90 -1
  239. package/src/v2/components/chat/__tests__/CopilotSidebarView.position.test.ts +32 -8
  240. package/src/v2/components/chat/__tests__/CopilotSidebarView.test.ts +2 -1
  241. package/src/v2/components/chat/__tests__/StreamingMarkdownDefault.test.ts +54 -0
  242. package/src/v2/components/chat/audioRecorder.ts +4 -7
  243. package/src/v2/components/chat/copilotChatToolCallItemRender.ts +25 -90
  244. package/src/v2/components/chat/forwarded-slots.ts +17 -0
  245. package/src/v2/components/chat/index.ts +0 -1
  246. package/src/v2/components/chat/inspector-shortcuts.ts +10 -16
  247. package/src/v2/components/chat/message-feedback.ts +92 -195
  248. package/src/v2/components/chat/tool-call-display-context.ts +6 -22
  249. package/src/v2/components/chat/tool-call-group-parts.ts +47 -108
  250. package/src/v2/components/chat/turn-work.ts +0 -9
  251. package/src/v2/components/chat/types.ts +12 -4
  252. package/src/v2/components/chat/use-chat-labels.ts +16 -0
  253. package/src/v2/components/chat/use-copy-feedback.ts +21 -0
  254. package/src/v2/components/chat/use-lightbox.ts +15 -33
  255. package/src/v2/components/icons/__tests__/icons.test.ts +72 -68
  256. package/src/v2/components/icons/index.ts +109 -27
  257. package/src/v2/hooks/__tests__/use-agent-error-state.test.ts +5 -3
  258. package/src/v2/hooks/__tests__/use-agent-stability.test.ts +25 -4
  259. package/src/v2/hooks/__tests__/use-agent-throttle.test.ts +5 -1
  260. package/src/v2/hooks/__tests__/use-agent.test.ts +6 -3
  261. package/src/v2/hooks/__tests__/use-component.test.ts +21 -0
  262. package/src/v2/hooks/__tests__/use-configure-suggestions.test.ts +30 -1
  263. package/src/v2/hooks/__tests__/use-default-render-tool.test.ts +10 -10
  264. package/src/v2/hooks/__tests__/use-frontend-tool.e2e.test.ts +66 -1
  265. package/src/v2/hooks/__tests__/use-human-in-the-loop.e2e.test.ts +6 -1
  266. package/src/v2/hooks/__tests__/use-human-in-the-loop.test.ts +187 -12
  267. package/src/v2/hooks/__tests__/use-interrupt.test.ts +97 -0
  268. package/src/v2/hooks/__tests__/use-render-activity-message.test.ts +106 -0
  269. package/src/v2/hooks/__tests__/use-render-tool.test.ts +3 -6
  270. package/src/v2/hooks/__tests__/use-threads.test.ts +48 -6
  271. package/src/v2/hooks/__tests__/zod-regression.test.ts +5 -4
  272. package/src/v2/hooks/use-agent-context.ts +4 -10
  273. package/src/v2/hooks/use-agent.ts +86 -290
  274. package/src/v2/hooks/use-attachments.ts +48 -168
  275. package/src/v2/hooks/use-capabilities.ts +2 -7
  276. package/src/v2/hooks/use-component.ts +7 -4
  277. package/src/v2/hooks/use-configure-suggestions.ts +29 -220
  278. package/src/v2/hooks/use-default-render-tool.ts +31 -152
  279. package/src/v2/hooks/use-frontend-tool.ts +15 -25
  280. package/src/v2/hooks/use-human-in-the-loop.ts +11 -80
  281. package/src/v2/hooks/use-interrupt.ts +29 -308
  282. package/src/v2/hooks/use-keyboard-height.ts +17 -40
  283. package/src/v2/hooks/use-pin-to-send.ts +15 -99
  284. package/src/v2/hooks/use-render-activity-message.ts +35 -57
  285. package/src/v2/hooks/use-render-custom-messages.ts +24 -88
  286. package/src/v2/hooks/use-render-tool.ts +2 -4
  287. package/src/v2/hooks/use-suggestions.ts +17 -36
  288. package/src/v2/hooks/use-threads.ts +49 -288
  289. package/src/v2/lib/__tests__/shallow-stable.test.ts +54 -0
  290. package/src/v2/lib/__tests__/vue-core-renderers.test.ts +42 -0
  291. package/src/v2/lib/processPartialHtml.ts +6 -21
  292. package/src/v2/lib/shallow-stable.ts +2 -16
  293. package/src/v2/lib/vue-core.ts +90 -85
  294. package/src/v2/providers/CopilotChatConfigurationProvider.vue +48 -186
  295. package/src/v2/providers/CopilotKitProvider.types.ts +12 -132
  296. package/src/v2/providers/CopilotKitProvider.vue +291 -641
  297. package/src/v2/providers/__tests__/CopilotChatConfigurationProvider.test.ts +22 -2
  298. package/src/v2/providers/__tests__/CopilotKitProvider.a2ui.test.ts +38 -2
  299. package/src/v2/providers/__tests__/CopilotKitProvider.config.test.ts +124 -0
  300. package/src/v2/providers/__tests__/CopilotKitProvider.headersAtSendTime.test.ts +3 -3
  301. package/src/v2/providers/__tests__/CopilotKitProvider.learning.test.ts +3 -1
  302. package/src/v2/providers/__tests__/CopilotKitProvider.sandboxFunctions.test.ts +4 -1
  303. package/src/v2/providers/__tests__/CopilotKitProvider.test.ts +88 -28
  304. package/src/v2/providers/chat-configuration-store-key.ts +9 -0
  305. package/src/v2/providers/markdown-renderer.ts +8 -2
  306. package/src/v2/providers/types.ts +3 -49
  307. package/src/v2/providers/use-inspector-thread-override.ts +22 -80
  308. package/src/v2/types/__tests__/defineToolCallRenderer.test.ts +28 -33
  309. package/src/v2/types/defineToolCallRenderer.ts +7 -6
  310. package/src/v2/types/human-in-the-loop.ts +8 -32
  311. package/src/v2/types/interrupt.ts +7 -31
  312. package/src/v2/types/vue-activity-message-renderer.ts +24 -15
  313. package/src/v2/types/vue-custom-message-renderer.ts +12 -16
  314. package/src/v2/types/vue-tool-call-renderer.ts +23 -38
  315. package/tsconfig.json +0 -1
  316. package/vite.config.ts +8 -5
  317. package/vitest.config.ts +12 -7
  318. package/dist/v2/components/chat/BasicMarkdown.vue.d.ts +0 -9
  319. package/dist/v2/components/chat/BasicMarkdown.vue.d.ts.map +0 -1
  320. package/dist/v2/components/chat/normalize-auto-scroll.d.ts +0 -3
  321. package/dist/v2/components/chat/normalize-auto-scroll.d.ts.map +0 -1
  322. package/dist/v2/components/chat/tool-call-layout.d.ts +0 -115
  323. package/dist/v2/components/chat/tool-call-layout.d.ts.map +0 -1
  324. package/dist/v2/lib/is-mobile-viewport.d.ts +0 -15
  325. package/dist/v2/lib/is-mobile-viewport.d.ts.map +0 -1
  326. package/dist/v2/lib/message-feedback.d.ts +0 -33
  327. package/dist/v2/lib/message-feedback.d.ts.map +0 -1
  328. package/dist/v2/lib/transcription-client.d.ts +0 -19
  329. package/dist/v2/lib/transcription-client.d.ts.map +0 -1
  330. package/src/v2/components/__tests__/A2UICatalogContext.test.ts +0 -63
  331. package/src/v2/components/a2ui/__tests__/A2UIRecoveryStates.test.ts +0 -175
  332. package/src/v2/components/chat/BasicMarkdown.vue +0 -160
  333. package/src/v2/components/chat/__tests__/BasicMarkdown.test.ts +0 -69
  334. package/src/v2/components/chat/__tests__/normalize-auto-scroll.test.ts +0 -39
  335. package/src/v2/components/chat/normalize-auto-scroll.ts +0 -17
  336. package/src/v2/components/chat/tool-call-layout.ts +0 -304
  337. package/src/v2/lib/__tests__/is-mobile-viewport.test.ts +0 -48
  338. package/src/v2/lib/__tests__/message-feedback.test.ts +0 -152
  339. package/src/v2/lib/__tests__/processPartialHtml.test.ts +0 -84
  340. package/src/v2/lib/__tests__/transcription-client.test.ts +0 -67
  341. package/src/v2/lib/is-mobile-viewport.ts +0 -23
  342. package/src/v2/lib/message-feedback.ts +0 -120
  343. package/src/v2/lib/transcription-client.ts +0 -151
@@ -1,264 +1,37 @@
1
1
  <script setup lang="ts">
2
- import { onBeforeUnmount, ref, useAttrs, watch } from "vue";
3
- import { AudioRecorderError } from "./audioRecorder";
4
- import type { AudioRecorderState } from "./audioRecorder";
2
+ /**
3
+ * Records from the microphone and draws the live level as a scrolling
4
+ * waveform. The recording itself is `ɵAudioRecorder` from
5
+ * `@copilotkit/core`; control it through the exposed ref.
6
+ */
7
+ import { onBeforeUnmount, onMounted, ref, useAttrs } from "vue";
8
+ import { ɵAudioRecorder, ɵcreateWaveformRenderer } from "@copilotkit/core";
5
9
 
6
10
  defineOptions({ inheritAttrs: false });
7
11
 
8
12
  const attrs = useAttrs();
9
13
  const canvasRef = ref<HTMLCanvasElement | null>(null);
10
- const recorderState = ref<AudioRecorderState>("idle");
11
- const mediaRecorderRef = ref<MediaRecorder | null>(null);
12
- const streamRef = ref<MediaStream | null>(null);
13
- const analyserRef = ref<AnalyserNode | null>(null);
14
- const audioContextRef = ref<AudioContext | null>(null);
15
- const animationIdRef = ref<number | null>(null);
16
- const audioChunksRef = ref<Blob[]>([]);
17
- const amplitudeHistoryRef = ref<number[]>([]);
18
- const scrollOffsetRef = ref(0);
19
- const smoothedAmplitudeRef = ref(0);
20
- const fadeOpacityRef = ref(0);
14
+ const recorder = new ɵAudioRecorder();
15
+ let waveform: { dispose: () => void } | undefined;
21
16
 
22
- function cleanup() {
23
- if (animationIdRef.value !== null) {
24
- cancelAnimationFrame(animationIdRef.value);
25
- animationIdRef.value = null;
17
+ onMounted(() => {
18
+ if (canvasRef.value) {
19
+ waveform = ɵcreateWaveformRenderer(canvasRef.value, recorder);
26
20
  }
27
-
28
- const recorder = mediaRecorderRef.value;
29
- if (recorder && recorder.state !== "inactive") {
30
- try {
31
- recorder.stop();
32
- } catch {
33
- // ignore cleanup stop failures
34
- }
35
- }
36
-
37
- if (streamRef.value) {
38
- streamRef.value.getTracks().forEach((track) => track.stop());
39
- streamRef.value = null;
40
- }
41
-
42
- const audioContext = audioContextRef.value;
43
- if (audioContext && audioContext.state !== "closed") {
44
- audioContext.close().catch(() => {
45
- // ignore close errors
46
- });
47
- }
48
-
49
- mediaRecorderRef.value = null;
50
- analyserRef.value = null;
51
- audioContextRef.value = null;
52
- audioChunksRef.value = [];
53
- amplitudeHistoryRef.value = [];
54
- scrollOffsetRef.value = 0;
55
- smoothedAmplitudeRef.value = 0;
56
- fadeOpacityRef.value = 0;
57
- }
58
-
59
- async function start() {
60
- if (recorderState.value !== "idle") {
61
- throw new AudioRecorderError("Recorder is already active");
62
- }
63
-
64
- try {
65
- const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
66
- streamRef.value = stream;
67
-
68
- const audioContext = new AudioContext();
69
- audioContextRef.value = audioContext;
70
- const source = audioContext.createMediaStreamSource(stream);
71
- const analyser = audioContext.createAnalyser();
72
- analyser.fftSize = 2048;
73
- source.connect(analyser);
74
- analyserRef.value = analyser;
75
-
76
- const mimeType = MediaRecorder.isTypeSupported("audio/webm;codecs=opus")
77
- ? "audio/webm;codecs=opus"
78
- : MediaRecorder.isTypeSupported("audio/webm")
79
- ? "audio/webm"
80
- : MediaRecorder.isTypeSupported("audio/mp4")
81
- ? "audio/mp4"
82
- : "";
83
-
84
- const options = mimeType ? { mimeType } : {};
85
- const recorder = new MediaRecorder(stream, options);
86
- mediaRecorderRef.value = recorder;
87
- audioChunksRef.value = [];
88
-
89
- recorder.ondataavailable = (event) => {
90
- if (event.data.size > 0) {
91
- audioChunksRef.value.push(event.data);
92
- }
93
- };
94
-
95
- recorder.start(100);
96
- recorderState.value = "recording";
97
- } catch (error) {
98
- cleanup();
99
- if (error instanceof Error && error.name === "NotAllowedError") {
100
- throw new AudioRecorderError("Microphone permission denied");
101
- }
102
- if (error instanceof Error && error.name === "NotFoundError") {
103
- throw new AudioRecorderError("No microphone found");
104
- }
105
- throw new AudioRecorderError(
106
- error instanceof Error ? error.message : "Failed to start recording",
107
- );
108
- }
109
- }
110
-
111
- function stop() {
112
- return new Promise<Blob>((resolve, reject) => {
113
- const recorder = mediaRecorderRef.value;
114
- if (!recorder || recorderState.value !== "recording") {
115
- reject(new AudioRecorderError("No active recording"));
116
- return;
117
- }
118
-
119
- recorderState.value = "processing";
120
- recorder.onstop = () => {
121
- const audioBlob = new Blob(audioChunksRef.value, {
122
- type: recorder.mimeType || "audio/webm",
123
- });
124
- cleanup();
125
- recorderState.value = "idle";
126
- resolve(audioBlob);
127
- };
128
- recorder.onerror = () => {
129
- cleanup();
130
- recorderState.value = "idle";
131
- reject(new AudioRecorderError("Recording failed"));
132
- };
133
- recorder.stop();
134
- });
135
- }
136
-
137
- function calculateAmplitude(dataArray: Uint8Array) {
138
- let sum = 0;
139
- for (let index = 0; index < dataArray.length; index += 1) {
140
- const sample = (dataArray[index] ?? 128) / 128 - 1;
141
- sum += sample * sample;
142
- }
143
- return Math.sqrt(sum / dataArray.length);
144
- }
145
-
146
- function drawFrame() {
147
- const canvas = canvasRef.value;
148
- if (!canvas) {
149
- return;
150
- }
151
-
152
- const context = canvas.getContext("2d");
153
- if (!context) {
154
- return;
155
- }
156
-
157
- const rect = canvas.getBoundingClientRect();
158
- const dpr = window.devicePixelRatio || 1;
159
- if (
160
- canvas.width !== rect.width * dpr ||
161
- canvas.height !== rect.height * dpr
162
- ) {
163
- canvas.width = rect.width * dpr;
164
- canvas.height = rect.height * dpr;
165
- context.scale(dpr, dpr);
166
- }
167
-
168
- const barWidth = 2;
169
- const barGap = 1;
170
- const barSpacing = barWidth + barGap;
171
- const maxBars = Math.floor(rect.width / barSpacing) + 2;
172
-
173
- if (analyserRef.value && recorderState.value === "recording") {
174
- if (amplitudeHistoryRef.value.length === 0) {
175
- amplitudeHistoryRef.value = Array.from({ length: maxBars }, () => 0);
176
- }
177
-
178
- if (fadeOpacityRef.value < 1) {
179
- fadeOpacityRef.value = Math.min(1, fadeOpacityRef.value + 0.03);
180
- }
181
-
182
- scrollOffsetRef.value += 1 / 3;
183
- const bufferLength = analyserRef.value.fftSize;
184
- const dataArray = new Uint8Array(bufferLength);
185
- analyserRef.value.getByteTimeDomainData(dataArray);
186
- const rawAmplitude = calculateAmplitude(dataArray);
187
- const attackSpeed = 0.12;
188
- const decaySpeed = 0.08;
189
- const speed =
190
- rawAmplitude > smoothedAmplitudeRef.value ? attackSpeed : decaySpeed;
191
- smoothedAmplitudeRef.value +=
192
- (rawAmplitude - smoothedAmplitudeRef.value) * speed;
193
-
194
- if (scrollOffsetRef.value >= barSpacing) {
195
- scrollOffsetRef.value -= barSpacing;
196
- amplitudeHistoryRef.value.push(smoothedAmplitudeRef.value);
197
- if (amplitudeHistoryRef.value.length > maxBars) {
198
- amplitudeHistoryRef.value = amplitudeHistoryRef.value.slice(-maxBars);
199
- }
200
- }
201
- }
202
-
203
- context.clearRect(0, 0, rect.width, rect.height);
204
- const computedStyle = window.getComputedStyle(canvas);
205
- context.fillStyle = computedStyle.color;
206
- context.globalAlpha = fadeOpacityRef.value;
207
-
208
- const centerY = rect.height / 2;
209
- const maxAmplitude = rect.height / 2 - 2;
210
- const edgeFadeWidth = 12;
211
-
212
- for (let index = 0; index < amplitudeHistoryRef.value.length; index += 1) {
213
- const amplitude = amplitudeHistoryRef.value[index] ?? 0;
214
- const scaledAmplitude = Math.min(amplitude * 4, 1);
215
- const barHeight = Math.max(2, scaledAmplitude * maxAmplitude * 2);
216
- const x =
217
- rect.width -
218
- (amplitudeHistoryRef.value.length - index) * barSpacing -
219
- scrollOffsetRef.value;
220
- const y = centerY - barHeight / 2;
221
- if (x + barWidth <= 0 || x >= rect.width) {
222
- continue;
223
- }
224
-
225
- let edgeOpacity = 1;
226
- if (x < edgeFadeWidth) {
227
- edgeOpacity = Math.max(0, x / edgeFadeWidth);
228
- } else if (x > rect.width - edgeFadeWidth) {
229
- edgeOpacity = Math.max(0, (rect.width - x) / edgeFadeWidth);
230
- }
231
-
232
- context.globalAlpha = fadeOpacityRef.value * edgeOpacity;
233
- context.fillRect(x, y, barWidth, barHeight);
234
- }
235
-
236
- animationIdRef.value = requestAnimationFrame(drawFrame);
237
- }
238
-
239
- watch(
240
- recorderState,
241
- () => {
242
- if (animationIdRef.value !== null) {
243
- cancelAnimationFrame(animationIdRef.value);
244
- animationIdRef.value = null;
245
- }
246
- animationIdRef.value = requestAnimationFrame(drawFrame);
247
- },
248
- { immediate: true },
249
- );
21
+ });
250
22
 
251
23
  onBeforeUnmount(() => {
252
- cleanup();
24
+ waveform?.dispose();
25
+ recorder.dispose();
253
26
  });
254
27
 
255
28
  defineExpose({
256
29
  get state() {
257
- return recorderState.value;
30
+ return recorder.getSnapshot();
258
31
  },
259
- start,
260
- stop,
261
- dispose: cleanup,
32
+ start: () => recorder.start(),
33
+ stop: () => recorder.stop(),
34
+ dispose: () => recorder.dispose(),
262
35
  });
263
36
  </script>
264
37
 
@@ -12,8 +12,11 @@
12
12
  import { computed, nextTick, ref, watch } from "vue";
13
13
  import { useCopilotChatConfiguration } from "../../providers/useCopilotChatConfiguration";
14
14
  import { CopilotChatDefaultLabels } from "../../providers/types";
15
- import { MESSAGE_FEEDBACK_MAX_COMMENT_LENGTH } from "../../lib/message-feedback";
16
- import type { MessageFeedbackRating } from "../../lib/message-feedback";
15
+ import {
16
+ ɵMESSAGE_FEEDBACK_MAX_COMMENT_LENGTH as MESSAGE_FEEDBACK_MAX_COMMENT_LENGTH,
17
+ ɵisOwnFeedbackThumb,
18
+ } from "@copilotkit/core";
19
+ import type { ɵMessageFeedbackRating as MessageFeedbackRating } from "@copilotkit/core";
17
20
  import CopilotPopover from "../ui/CopilotPopover.vue";
18
21
  import { IconArrowUp } from "../icons";
19
22
  import type { FeedbackComment } from "./message-feedback";
@@ -38,60 +41,13 @@ const labels = computed(() => config.value?.labels ?? CopilotChatDefaultLabels);
38
41
  const popover = ref<{ content: HTMLElement | null } | null>(null);
39
42
  const contentElement = () => popover.value?.content ?? null;
40
43
 
41
- // Elements Tab stops at.
42
- const FOCUSABLE = [
43
- "a[href]",
44
- "button:not([disabled])",
45
- "input:not([disabled])",
46
- "select:not([disabled])",
47
- "textarea:not([disabled])",
48
- "[tabindex]",
49
- ]
50
- .map((selector) => `${selector}:not([tabindex="-1"])`)
51
- .join(", ");
52
-
53
- /** Approximately the element Tab reaches after `element`, outside `skip`. */
54
- function nextFocusable(
55
- element: Element,
56
- skip: Element | null,
57
- ): HTMLElement | null {
58
- const all = Array.from(
59
- element.ownerDocument.querySelectorAll<HTMLElement>(FOCUSABLE),
60
- ).filter(
61
- (candidate) =>
62
- candidate === element ||
63
- (!skip?.contains(candidate) && !candidate.closest("[hidden], [inert]")),
64
- );
65
- const index = all.indexOf(element as HTMLElement);
66
- return index === -1 ? null : (all[index + 1] ?? null);
67
- }
68
-
69
- const focusInside = () =>
70
- contentElement()?.contains(document.activeElement) ?? false;
71
-
72
- /** Whether `target` is a thumb of this message, whose click decides itself. */
73
- const isOwnThumb = (target: EventTarget | null) => {
74
- const thumb =
75
- target instanceof Element
76
- ? target.closest("[data-copilotkit-rating]")
77
- : null;
78
- return (
79
- thumb?.closest("[data-message-id]")?.getAttribute("data-message-id") ===
80
- props.messageId
81
- );
82
- };
83
-
84
44
  // A keyboard rating moves focus into the field, as the popover opens or, when
85
45
  // it was open already, as the field for the new rating renders.
86
- const focusField = () => {
87
- const input = props.comment.input.value;
88
- if (input && props.comment.takeFocusRequest()) input.focus();
89
- };
90
46
  watch(
91
47
  () => [props.comment.focusRequest.value, props.comment.open.value],
92
48
  async () => {
93
49
  await nextTick();
94
- focusField();
50
+ props.comment.focusField();
95
51
  },
96
52
  // Immediate: the popover mounts as it opens, after the request was made.
97
53
  { flush: "post", immediate: true },
@@ -107,43 +63,25 @@ const changed = computed(
107
63
  );
108
64
 
109
65
  function onEscape(event: KeyboardEvent) {
110
- const returnFocus = focusInside();
111
66
  // Escape in the comment closes only the comment, not a chat popup around
112
67
  // it; with focus elsewhere it also reaches that control.
113
- if (returnFocus) event.stopPropagation();
68
+ if (props.comment.popoverEscape(contentElement())) event.stopPropagation();
114
69
  event.preventDefault();
115
- props.comment.close({ save: false });
116
- if (returnFocus) props.comment.returnFocus(props.anchor);
117
70
  }
118
71
 
119
72
  function onInteractOutside(event: Event) {
120
73
  // A click on a thumb removes or switches the rating, so closing must not
121
74
  // first save the draft as the answer to the rating it replaces.
122
- if (isOwnThumb(event.target)) event.preventDefault();
75
+ if (ɵisOwnFeedbackThumb(event.target, props.messageId))
76
+ event.preventDefault();
123
77
  }
124
78
 
125
79
  function onKeyDown(event: KeyboardEvent) {
126
- if (event.key !== "Tab") return;
127
- const focusables = Array.from(
128
- contentElement()?.querySelectorAll<HTMLElement>(FOCUSABLE) ?? [],
129
- );
130
- const leaving = event.shiftKey
131
- ? document.activeElement === focusables[0]
132
- : document.activeElement === focusables[focusables.length - 1];
133
- const anchor = props.anchor;
134
- if (!leaving || !anchor?.isConnected) return;
135
- event.preventDefault();
136
- const target = event.shiftKey
137
- ? anchor
138
- : (nextFocusable(anchor, contentElement()) ?? anchor);
139
- props.comment.close();
140
- if (target === anchor) props.comment.returnFocus(target);
141
- else target.focus();
80
+ props.comment.popoverKeyDown(event, contentElement());
142
81
  }
143
82
 
144
83
  function onSubmit() {
145
- props.comment.close();
146
- props.comment.returnFocus(props.anchor);
84
+ props.comment.submit();
147
85
  }
148
86
 
149
87
  function onEditingChange(editing: boolean) {
@@ -151,10 +89,7 @@ function onEditingChange(editing: boolean) {
151
89
  }
152
90
 
153
91
  function onLeave(next: Element | null) {
154
- // Focus moving within the popover or to a thumb, which the pointer is
155
- // still on, does not close it.
156
- if (next && (contentElement()?.contains(next) || isOwnThumb(next))) return;
157
- props.comment.leave();
92
+ props.comment.popoverFocusLeave(next, contentElement(), props.messageId);
158
93
  }
159
94
 
160
95
  function onFormFocusOut(event: FocusEvent) {