@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
@@ -11,12 +11,7 @@ import type { VueToolCallRenderer } from "../../../types";
11
11
  import { useDefaultRenderTool } from "../../../hooks/use-default-render-tool";
12
12
  import CopilotChatMessageView from "../CopilotChatMessageView.vue";
13
13
  import CopilotChatToolCallsView from "../CopilotChatToolCallsView.vue";
14
- import {
15
- getToolCallLayouts,
16
- getToolCallRendererNames,
17
- getTurnWork,
18
- } from "../tool-call-layout";
19
- import type { CopilotChatToolCallDisplay } from "../tool-call-layout";
14
+ import type { CopilotChatToolCallDisplay } from "@copilotkit/core";
20
15
 
21
16
  // Ported from React's CopilotChatMessageView.toolCallDisplay tests.
22
17
 
@@ -55,13 +50,6 @@ const weather = defineToolCallRenderer({
55
50
  render: () => h("div", { "data-testid": "weather-card" }, "Weather"),
56
51
  });
57
52
 
58
- const names = {
59
- named: new Set(["weather"]),
60
- groupedNames: new Set<string>(),
61
- wildcard: true,
62
- wildcardGroups: true,
63
- };
64
-
65
53
  interface ViewState {
66
54
  messages: Ref<Message[]>;
67
55
  isRunning: Ref<boolean>;
@@ -118,92 +106,6 @@ function renderView(
118
106
  const firstButton = (element: HTMLElement) =>
119
107
  within(element).getAllByRole("button")[0]!;
120
108
 
121
- describe("getToolCallLayouts", () => {
122
- it("groups calls made in a row across messages, owned by the first", () => {
123
- const messages = [
124
- question,
125
- callMessage("a"),
126
- result("a"),
127
- callMessage("b"),
128
- result("b"),
129
- ];
130
- const layouts = getToolCallLayouts(messages, messages, names);
131
-
132
- const first = layouts.get("m-a")!.segments;
133
- expect(first).toHaveLength(1);
134
- expect(first[0]).toMatchObject({ kind: "group", trailing: true });
135
- expect(
136
- first[0]!.kind === "group" && first[0]!.calls.map((c) => c.toolCall.id),
137
- ).toEqual(["a", "b"]);
138
- expect(layouts.get("m-b")!.segments).toEqual([]);
139
- });
140
-
141
- it("starts a new group after text or a call with its own renderer", () => {
142
- const messages = [
143
- question,
144
- callMessage("a"),
145
- say("t", "Checking more."),
146
- callMessage("b"),
147
- callMessage("w", "weather"),
148
- callMessage("c"),
149
- ];
150
- const layouts = getToolCallLayouts(messages, messages, names);
151
- const kinds = ["m-a", "m-b", "m-w", "m-c"].map((id) =>
152
- layouts.get(id)!.segments.map((segment) => segment.kind),
153
- );
154
- expect(kinds).toEqual([["group"], ["group"], ["call"], ["group"]]);
155
- });
156
-
157
- it("changes its signature when a result arrives for a call it holds", () => {
158
- const before = [question, callMessage("a"), callMessage("b")];
159
- const after = [...before, result("b")];
160
- const signature = (messages: Message[]) =>
161
- getToolCallLayouts(messages, messages, names).get("m-a")!.signature;
162
- expect(signature(after)).not.toBe(signature(before));
163
- });
164
- });
165
-
166
- describe("getTurnWork", () => {
167
- it("treats everything up to the last call as work, and the rest as the reply", () => {
168
- const messages = [
169
- question,
170
- say("t1", "Looking."),
171
- callMessage("a"),
172
- result("a"),
173
- say("t2", "The answer."),
174
- ];
175
- const layouts = getToolCallLayouts(messages, messages, names);
176
- const turn = getTurnWork(messages, layouts).get("u1")!;
177
- expect([...turn.workMessageIds]).toEqual(["t1", "m-a"]);
178
- expect(turn.firstMessageId).toBe("t1");
179
- expect(turn.calls).toHaveLength(1);
180
- });
181
- });
182
-
183
- describe("getToolCallRendererNames", () => {
184
- const renderers = [
185
- { name: "*", group: true },
186
- { name: "search", group: true },
187
- ];
188
-
189
- it("reads the renderers' group opt-in", () => {
190
- const result = getToolCallRendererNames(renderers);
191
- expect([...result.groupedNames]).toEqual(["search"]);
192
- expect(result.wildcardGroups).toBe(true);
193
- });
194
-
195
- it("never groups calls a tool-call slot draws", () => {
196
- const named = getToolCallRendererNames(renderers, ["tool-call-search"]);
197
- expect(named.named.has("search")).toBe(true);
198
- expect(named.groupedNames.has("search")).toBe(false);
199
- expect(named.wildcardGroups).toBe(true);
200
-
201
- const wildcard = getToolCallRendererNames(renderers, ["tool-call"]);
202
- expect(wildcard.groupedNames.size).toBe(0);
203
- expect(wildcard.wildcardGroups).toBe(false);
204
- });
205
- });
206
-
207
109
  describe("CopilotChatMessageView toolCallDisplay", () => {
208
110
  const burst = [
209
111
  question,
@@ -1,6 +1,6 @@
1
1
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
2
  import { defineComponent, h, provide, ref } from "vue";
3
- import { render, waitFor } from "@testing-library/vue";
3
+ import { fireEvent, render, waitFor } from "@testing-library/vue";
4
4
  import type { Message } from "@ag-ui/core";
5
5
  import CopilotKitProvider from "../../../providers/CopilotKitProvider.vue";
6
6
  import CopilotChatConfigurationProvider from "../../../providers/CopilotChatConfigurationProvider.vue";
@@ -75,6 +75,10 @@ async function waitForMount(screen: ReturnType<typeof render>) {
75
75
  await screen.findByTestId("copilot-chat-view");
76
76
  }
77
77
 
78
+ function rect(top: number, bottom: number) {
79
+ return { top, bottom, left: 0, right: 0, width: 0, height: bottom - top };
80
+ }
81
+
78
82
  describe("CopilotChatView pin-to-send mode", () => {
79
83
  it("renders the pin-to-send spacer element when autoScroll='pin-to-send'", async () => {
80
84
  const screen = renderView("pin-to-send");
@@ -163,4 +167,42 @@ describe("CopilotChatView pin-to-send mode", () => {
163
167
  expect(spacer.getAttribute("data-pin-to-send-spacer")).not.toBeNull(),
164
168
  );
165
169
  });
170
+ // The spacer under the messages is not content: the scroll-to-bottom
171
+ // button follows the end of the messages, as in React.
172
+ describe("scroll-to-bottom button", () => {
173
+ async function setup(contentBottom: number) {
174
+ const screen = renderView("pin-to-send");
175
+ await waitForMount(screen);
176
+ const scrollElement = screen.getByTestId("copilot-chat-view-scroll");
177
+ const contentElement = screen.getByTestId("copilot-scroll-content");
178
+ // The spacer makes the scroll height far larger than the view.
179
+ Object.defineProperty(scrollElement, "scrollHeight", {
180
+ configurable: true,
181
+ get: () => 2000,
182
+ });
183
+ Object.defineProperty(scrollElement, "clientHeight", {
184
+ configurable: true,
185
+ get: () => 400,
186
+ });
187
+ scrollElement.getBoundingClientRect = () => rect(0, 400) as DOMRect;
188
+ contentElement.getBoundingClientRect = () =>
189
+ rect(-200, contentBottom) as DOMRect;
190
+ await fireEvent.scroll(scrollElement);
191
+ return screen;
192
+ }
193
+
194
+ it("stays hidden when only the spacer is below the view", async () => {
195
+ const screen = await setup(390);
196
+ expect(
197
+ screen.queryByTestId("copilot-chat-view-scroll-to-bottom"),
198
+ ).toBeNull();
199
+ });
200
+
201
+ it("shows when messages sit below the view", async () => {
202
+ const screen = await setup(700);
203
+ expect(
204
+ await screen.findByTestId("copilot-chat-view-scroll-to-bottom"),
205
+ ).toBeDefined();
206
+ });
207
+ });
166
208
  });
@@ -1,8 +1,9 @@
1
1
  import { describe, expect, it } from "vitest";
2
- import { h } from "vue";
2
+ import { h, nextTick } from "vue";
3
3
  import { mount } from "@vue/test-utils";
4
4
  import CopilotKitProvider from "../../../providers/CopilotKitProvider.vue";
5
5
  import { StateCapturingAgent } from "../../../__tests__/utils/agents";
6
+ import { mountWithProvider } from "../../../__tests__/utils/mount";
6
7
  import CopilotPopup from "../CopilotPopup.vue";
7
8
 
8
9
  function mountPopup(
@@ -55,4 +56,92 @@ describe("CopilotPopup", () => {
55
56
  ).toBe(true);
56
57
  expect(wrapper.find("[data-copilot-popup]").exists()).toBe(false);
57
58
  });
59
+
60
+ it("forwards the scroll-view slot to the chat view", () => {
61
+ const wrapper = mountPopup(
62
+ { welcomeScreen: false },
63
+ {
64
+ "scroll-view": ({ messages }: { messages: unknown[] }) =>
65
+ h(
66
+ "div",
67
+ { "data-testid": "custom-popup-scroll-view" },
68
+ String(messages.length),
69
+ ),
70
+ },
71
+ );
72
+
73
+ expect(wrapper.get("[data-testid='custom-popup-scroll-view']").text()).toBe(
74
+ "0",
75
+ );
76
+ expect(
77
+ wrapper.find("[data-testid='copilot-chat-view-scroll']").exists(),
78
+ ).toBe(false);
79
+ });
80
+
81
+ it("forwards the interrupt slot to the chat view", async () => {
82
+ const { wrapper, getCore } = mountWithProvider(
83
+ () =>
84
+ h(
85
+ CopilotPopup,
86
+ { welcomeScreen: false },
87
+ {
88
+ interrupt: ({ event }: { event: { value: string } }) =>
89
+ h("div", { "data-testid": "popup-interrupt" }, event.value),
90
+ },
91
+ ),
92
+ {
93
+ runtimeUrl: undefined,
94
+ agents__unsafe_dev_only: { default: new StateCapturingAgent() },
95
+ },
96
+ );
97
+
98
+ getCore().setInterruptState({
99
+ event: { name: "on_interrupt", value: "slot-forwarded" },
100
+ result: null,
101
+ resolve: () => undefined,
102
+ });
103
+ await nextTick();
104
+
105
+ expect(wrapper.get("[data-testid='popup-interrupt']").text()).toBe(
106
+ "slot-forwarded",
107
+ );
108
+ });
109
+
110
+ it("forwards the assistant-message slot to the message view", () => {
111
+ const agent = new StateCapturingAgent();
112
+ agent.setMessages([
113
+ { id: "assistant-1", role: "assistant", content: "Hello from the agent" },
114
+ ]);
115
+
116
+ const { wrapper } = mountWithProvider(
117
+ () =>
118
+ h(
119
+ CopilotPopup,
120
+ { welcomeScreen: false },
121
+ {
122
+ "assistant-message": ({
123
+ message,
124
+ }: {
125
+ message: { content: string };
126
+ }) =>
127
+ h(
128
+ "div",
129
+ { "data-testid": "popup-assistant-message" },
130
+ message.content,
131
+ ),
132
+ },
133
+ ),
134
+ {
135
+ runtimeUrl: undefined,
136
+ agents__unsafe_dev_only: { default: agent },
137
+ },
138
+ );
139
+
140
+ expect(wrapper.get("[data-testid='popup-assistant-message']").text()).toBe(
141
+ "Hello from the agent",
142
+ );
143
+ expect(
144
+ wrapper.find("[data-testid='copilot-assistant-message']").exists(),
145
+ ).toBe(false);
146
+ });
58
147
  });
@@ -115,6 +115,25 @@ describe("CopilotPopupView", () => {
115
115
  expect(reopened.find("[data-copilot-popup]").exists()).toBe(false);
116
116
  });
117
117
 
118
+ it("stays open for a pointer down in a chat popover outside the panel", async () => {
119
+ const wrapper = mountPopupView({ clickOutsideToClose: true });
120
+ // Popovers, such as a reply rating's comment, render in a portal.
121
+ const popover = document.createElement("div");
122
+ popover.setAttribute("data-copilotkit-popover", "");
123
+ const field = document.createElement("textarea");
124
+ popover.append(field);
125
+ document.body.append(popover);
126
+
127
+ field.dispatchEvent(new Event("pointerdown", { bubbles: true }));
128
+ await nextTick();
129
+ vi.advanceTimersByTime(200);
130
+ await nextTick();
131
+
132
+ expect(wrapper.find("[data-copilot-popup]").exists()).toBe(true);
133
+ popover.remove();
134
+ wrapper.unmount();
135
+ });
136
+
118
137
  it("ignores outside-close detection when the toggle button is clicked and supports custom slots", async () => {
119
138
  const wrapper = mountPopupView(
120
139
  {
@@ -1,8 +1,9 @@
1
1
  import { describe, expect, it } from "vitest";
2
- import { h } from "vue";
2
+ import { h, nextTick } from "vue";
3
3
  import { mount } from "@vue/test-utils";
4
4
  import CopilotKitProvider from "../../../providers/CopilotKitProvider.vue";
5
5
  import { StateCapturingAgent } from "../../../__tests__/utils/agents";
6
+ import { mountWithProvider } from "../../../__tests__/utils/mount";
6
7
  import CopilotSidebar from "../CopilotSidebar.vue";
7
8
 
8
9
  function mountSidebar(
@@ -55,4 +56,92 @@ describe("CopilotSidebar", () => {
55
56
  ).toBe(true);
56
57
  expect(wrapper.find("[data-copilot-sidebar]").exists()).toBe(false);
57
58
  });
59
+
60
+ it("forwards the scroll-view slot to the chat view", () => {
61
+ const wrapper = mountSidebar(
62
+ { welcomeScreen: false },
63
+ {
64
+ "scroll-view": ({ messages }: { messages: unknown[] }) =>
65
+ h(
66
+ "div",
67
+ { "data-testid": "custom-sidebar-scroll-view" },
68
+ String(messages.length),
69
+ ),
70
+ },
71
+ );
72
+
73
+ expect(
74
+ wrapper.get("[data-testid='custom-sidebar-scroll-view']").text(),
75
+ ).toBe("0");
76
+ expect(
77
+ wrapper.find("[data-testid='copilot-chat-view-scroll']").exists(),
78
+ ).toBe(false);
79
+ });
80
+
81
+ it("forwards the interrupt slot to the chat view", async () => {
82
+ const { wrapper, getCore } = mountWithProvider(
83
+ () =>
84
+ h(
85
+ CopilotSidebar,
86
+ { welcomeScreen: false },
87
+ {
88
+ interrupt: ({ event }: { event: { value: string } }) =>
89
+ h("div", { "data-testid": "sidebar-interrupt" }, event.value),
90
+ },
91
+ ),
92
+ {
93
+ runtimeUrl: undefined,
94
+ agents__unsafe_dev_only: { default: new StateCapturingAgent() },
95
+ },
96
+ );
97
+
98
+ getCore().setInterruptState({
99
+ event: { name: "on_interrupt", value: "slot-forwarded" },
100
+ result: null,
101
+ resolve: () => undefined,
102
+ });
103
+ await nextTick();
104
+
105
+ expect(wrapper.get("[data-testid='sidebar-interrupt']").text()).toBe(
106
+ "slot-forwarded",
107
+ );
108
+ });
109
+
110
+ it("forwards the assistant-message slot to the message view", () => {
111
+ const agent = new StateCapturingAgent();
112
+ agent.setMessages([
113
+ { id: "assistant-1", role: "assistant", content: "Hello from the agent" },
114
+ ]);
115
+
116
+ const { wrapper } = mountWithProvider(
117
+ () =>
118
+ h(
119
+ CopilotSidebar,
120
+ { welcomeScreen: false },
121
+ {
122
+ "assistant-message": ({
123
+ message,
124
+ }: {
125
+ message: { content: string };
126
+ }) =>
127
+ h(
128
+ "div",
129
+ { "data-testid": "sidebar-assistant-message" },
130
+ message.content,
131
+ ),
132
+ },
133
+ ),
134
+ {
135
+ runtimeUrl: undefined,
136
+ agents__unsafe_dev_only: { default: agent },
137
+ },
138
+ );
139
+
140
+ expect(
141
+ wrapper.get("[data-testid='sidebar-assistant-message']").text(),
142
+ ).toBe("Hello from the agent");
143
+ expect(
144
+ wrapper.find("[data-testid='copilot-assistant-message']").exists(),
145
+ ).toBe(false);
146
+ });
58
147
  });
@@ -1,4 +1,4 @@
1
- import { describe, expect, it } from "vitest";
1
+ import { afterEach, describe, expect, it } from "vitest";
2
2
  import { h } from "vue";
3
3
  import { mount } from "@vue/test-utils";
4
4
  import type { Message } from "@ag-ui/core";
@@ -22,21 +22,31 @@ function cssRule(selector: string): string {
22
22
  return stylesheet.slice(body, stylesheet.indexOf("}", body));
23
23
  }
24
24
 
25
+ /** Mounted sidebars. Only one docked sidebar may own the page margin. */
26
+ const mounted: { unmount: () => void }[] = [];
27
+ afterEach(() => {
28
+ for (const wrapper of mounted.splice(0)) wrapper.unmount();
29
+ });
30
+
25
31
  function mountSidebarView(props: Record<string, unknown> = {}) {
26
- return mount(CopilotKitProvider, {
32
+ const wrapper = mount(CopilotKitProvider, {
27
33
  props: { runtimeUrl: "/api/copilotkit" },
28
34
  slots: {
29
35
  default: () =>
30
36
  h(CopilotSidebarView, { messages: sampleMessages, ...props }),
31
37
  },
32
38
  });
39
+ mounted.push(wrapper);
40
+ return wrapper;
33
41
  }
34
42
 
35
43
  function mountSidebar(props: Record<string, unknown> = {}) {
36
- return mount(CopilotKitProvider, {
44
+ const wrapper = mount(CopilotKitProvider, {
37
45
  props: { agents__unsafe_dev_only: { default: new StateCapturingAgent() } },
38
46
  slots: { default: () => h(CopilotSidebar, props) },
39
47
  });
48
+ mounted.push(wrapper);
49
+ return wrapper;
40
50
  }
41
51
 
42
52
  describe("CopilotSidebarView position prop", () => {
@@ -87,12 +97,26 @@ describe("CopilotSidebarView position prop", () => {
87
97
  });
88
98
 
89
99
  it("makes room for the sidebar on the edge it docks to", () => {
90
- const left = mountSidebarView({ position: "left", width: 400 });
91
- expect(left.html()).toContain("margin-inline-start: 400px");
92
- expect(left.html()).not.toContain("margin-inline-end");
100
+ const body = document.body.style;
101
+ mountSidebarView({ position: "left", width: 400 });
102
+ expect(body.marginInlineStart).toBe("400px");
103
+ expect(body.marginInlineEnd).toBe("");
104
+ mounted.pop()?.unmount();
105
+
106
+ mountSidebarView({ width: 400 });
107
+ expect(body.marginInlineEnd).toBe("400px");
108
+ });
109
+
110
+ it("gives the page its own margins back on unmount", () => {
111
+ const body = document.body.style;
112
+ body.marginInlineEnd = "16px";
113
+ mountSidebarView({ width: 400 });
114
+ expect(body.marginInlineEnd).toBe("400px");
115
+
116
+ mounted.pop()?.unmount();
93
117
 
94
- const right = mountSidebarView({ width: 400 });
95
- expect(right.html()).toContain("margin-inline-end: 400px");
118
+ expect(body.marginInlineEnd).toBe("16px");
119
+ body.marginInlineEnd = "";
96
120
  });
97
121
  });
98
122
 
@@ -91,7 +91,8 @@ describe("CopilotSidebarView", () => {
91
91
  const sidebar = wrapper.get("[data-copilot-sidebar]");
92
92
  expect(sidebar.attributes("aria-hidden")).toBe("false");
93
93
  expect(sidebar.attributes("style")).toContain("--sidebar-width: 612px");
94
- expect(wrapper.html()).toContain("margin-inline-end: 612px");
94
+ expect(document.body.style.marginInlineEnd).toBe("612px");
95
+ wrapper.unmount();
95
96
  });
96
97
 
97
98
  it("applies explicit width and renders default header and toggle button", () => {
@@ -0,0 +1,54 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { render, fireEvent } from "@testing-library/vue";
3
+ import StreamingMarkdownDefault from "../StreamingMarkdownDefault.vue";
4
+
5
+ function renderDefault(props: Record<string, unknown>) {
6
+ return render(StreamingMarkdownDefault, { props }).container;
7
+ }
8
+
9
+ describe("StreamingMarkdownDefault (vue)", () => {
10
+ it("renders nothing for empty content", () => {
11
+ expect(renderDefault({ content: "" }).innerHTML).toBe("<!--v-if-->");
12
+ });
13
+
14
+ it("renders fenced code with the shared code block class", () => {
15
+ const pre = renderDefault({ content: "```ts\nx\n```" }).querySelector(
16
+ "pre",
17
+ );
18
+ expect(pre?.classList.contains("cpk-markdown-code-block")).toBe(true);
19
+ expect(pre?.querySelector("code")?.getAttribute("data-code-info")).toBe(
20
+ "ts",
21
+ );
22
+ });
23
+
24
+ it("shows the caret only while streaming", () => {
25
+ const caret = "[data-streaming-markdown-caret]";
26
+ expect(
27
+ renderDefault({ content: "Hi", isStreaming: true }).querySelector(caret),
28
+ ).not.toBeNull();
29
+ expect(renderDefault({ content: "Hi" }).querySelector(caret)).toBeNull();
30
+ });
31
+
32
+ it("passes link and citation clicks to the callbacks", async () => {
33
+ const calls: string[] = [];
34
+ const container = renderDefault({
35
+ content:
36
+ "[link](https://example.com) cite [^ref]\n\n[^ref]: Ref https://example.org",
37
+ onLinkClick: (event: MouseEvent, url: string) => {
38
+ event.preventDefault();
39
+ calls.push(`link:${url}`);
40
+ },
41
+ onCitationClick: (event: MouseEvent, citation: { id: string }) => {
42
+ event.preventDefault();
43
+ calls.push(`cite:${citation.id}`);
44
+ },
45
+ });
46
+ await fireEvent.click(
47
+ container.querySelector('a[href="https://example.com"]')!,
48
+ );
49
+ await fireEvent.click(
50
+ container.querySelector('sup a[role="doc-noteref"]')!,
51
+ );
52
+ expect(calls).toEqual(["link:https://example.com", "cite:ref"]);
53
+ });
54
+ });
@@ -1,11 +1,8 @@
1
- export type AudioRecorderState = "idle" | "recording" | "processing";
1
+ import type { ɵAudioRecorderState } from "@copilotkit/core";
2
2
 
3
- export class AudioRecorderError extends Error {
4
- constructor(message: string) {
5
- super(message);
6
- this.name = "AudioRecorderError";
7
- }
8
- }
3
+ export type AudioRecorderState = ɵAudioRecorderState;
4
+
5
+ export { ɵAudioRecorderError as AudioRecorderError } from "@copilotkit/core";
9
6
 
10
7
  export interface CopilotChatAudioRecorderRef {
11
8
  state: AudioRecorderState;