@copilotkit/vue 2.0.0-rc.1 → 2.0.0-rc.11

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 (317) hide show
  1. package/PARITY.md +13 -12
  2. package/README.md +1 -2
  3. package/dist/components/copilot-provider/CopilotKit.vue.d.ts +3 -1
  4. package/dist/components/copilot-provider/CopilotKit.vue.d.ts.map +1 -1
  5. package/dist/hooks/use-copilot-action.d.ts.map +1 -1
  6. package/dist/hooks/use-frontend-tool.d.ts +1 -1
  7. package/dist/hooks/use-frontend-tool.d.ts.map +1 -1
  8. package/dist/hooks/zod-parameters.d.ts +14 -0
  9. package/dist/hooks/zod-parameters.d.ts.map +1 -0
  10. package/dist/index.cjs +1 -76
  11. package/dist/index.cjs.map +1 -1
  12. package/dist/index.mjs +384 -14275
  13. package/dist/index.mjs.map +1 -1
  14. package/dist/use-render-activity-message-2np7y4Qt.cjs +92 -0
  15. package/dist/use-render-activity-message-2np7y4Qt.cjs.map +1 -0
  16. package/dist/use-render-activity-message-D59E9t0x.js +18097 -0
  17. package/dist/use-render-activity-message-D59E9t0x.js.map +1 -0
  18. package/dist/v2/components/A2UIMessageRenderer.d.ts +7 -0
  19. package/dist/v2/components/A2UIMessageRenderer.d.ts.map +1 -1
  20. package/dist/v2/components/A2UISurfaceActivityRenderer.vue.d.ts.map +1 -1
  21. package/dist/v2/components/LicenseWarningBanner.vue.d.ts.map +1 -1
  22. package/dist/v2/components/OpenGenerativeUIRenderer.d.ts +13 -45
  23. package/dist/v2/components/OpenGenerativeUIRenderer.d.ts.map +1 -1
  24. package/dist/v2/components/a2ui/A2UIBuiltInToolCallRenderer.d.ts +11 -2
  25. package/dist/v2/components/a2ui/A2UIBuiltInToolCallRenderer.d.ts.map +1 -1
  26. package/dist/v2/components/a2ui/A2UICatalogContext.d.ts +1 -1
  27. package/dist/v2/components/a2ui/A2UICatalogContext.d.ts.map +1 -1
  28. package/dist/v2/components/a2ui/A2UIRecoveryStates.d.ts +144 -0
  29. package/dist/v2/components/a2ui/A2UIRecoveryStates.d.ts.map +1 -0
  30. package/dist/v2/components/a2ui.d.ts +3 -7
  31. package/dist/v2/components/a2ui.d.ts.map +1 -1
  32. package/dist/v2/components/chat/CopilotChat.vue.d.ts +1 -0
  33. package/dist/v2/components/chat/CopilotChat.vue.d.ts.map +1 -1
  34. package/dist/v2/components/chat/CopilotChatAssistantMessage.vue.d.ts +3 -1
  35. package/dist/v2/components/chat/CopilotChatAssistantMessage.vue.d.ts.map +1 -1
  36. package/dist/v2/components/chat/CopilotChatAssistantToolbarButton.vue.d.ts +16 -0
  37. package/dist/v2/components/chat/CopilotChatAssistantToolbarButton.vue.d.ts.map +1 -0
  38. package/dist/v2/components/chat/CopilotChatAttachmentQueue.vue.d.ts.map +1 -1
  39. package/dist/v2/components/chat/CopilotChatAttachmentRenderer.vue.d.ts.map +1 -1
  40. package/dist/v2/components/chat/CopilotChatAudioRecorder.vue.d.ts.map +1 -1
  41. package/dist/v2/components/chat/CopilotChatFeedbackCommentPopover.vue.d.ts +22 -0
  42. package/dist/v2/components/chat/CopilotChatFeedbackCommentPopover.vue.d.ts.map +1 -0
  43. package/dist/v2/components/chat/CopilotChatInput.vue.d.ts +21 -232
  44. package/dist/v2/components/chat/CopilotChatInput.vue.d.ts.map +1 -1
  45. package/dist/v2/components/chat/CopilotChatInspectorButton.vue.d.ts +12 -0
  46. package/dist/v2/components/chat/CopilotChatInspectorButton.vue.d.ts.map +1 -0
  47. package/dist/v2/components/chat/CopilotChatLightbox.vue.d.ts +22 -0
  48. package/dist/v2/components/chat/CopilotChatLightbox.vue.d.ts.map +1 -0
  49. package/dist/v2/components/chat/CopilotChatMessageView.vue.d.ts +20 -0
  50. package/dist/v2/components/chat/CopilotChatMessageView.vue.d.ts.map +1 -1
  51. package/dist/v2/components/chat/CopilotChatReasoningMessage.vue.d.ts.map +1 -1
  52. package/dist/v2/components/chat/CopilotChatSuggestionPill.vue.d.ts.map +1 -1
  53. package/dist/v2/components/chat/CopilotChatSuggestionView.vue.d.ts.map +1 -1
  54. package/dist/v2/components/chat/CopilotChatToggleButton.vue.d.ts.map +1 -1
  55. package/dist/v2/components/chat/CopilotChatToolCallGroup.vue.d.ts +32 -0
  56. package/dist/v2/components/chat/CopilotChatToolCallGroup.vue.d.ts.map +1 -0
  57. package/dist/v2/components/chat/CopilotChatToolCallItem.vue.d.ts.map +1 -1
  58. package/dist/v2/components/chat/CopilotChatToolCallsView.vue.d.ts +11 -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 +1 -0
  62. package/dist/v2/components/chat/CopilotChatView.vue.d.ts.map +1 -1
  63. package/dist/v2/components/chat/CopilotChatWorkSummary.vue.d.ts +5 -0
  64. package/dist/v2/components/chat/CopilotChatWorkSummary.vue.d.ts.map +1 -0
  65. package/dist/v2/components/chat/CopilotModalHeader.vue.d.ts.map +1 -1
  66. package/dist/v2/components/chat/CopilotModalHeaderCloseButton.d.ts.map +1 -1
  67. package/dist/v2/components/chat/CopilotModalHeaderTitle.d.ts.map +1 -1
  68. package/dist/v2/components/chat/CopilotPopup.vue.d.ts +1 -0
  69. package/dist/v2/components/chat/CopilotPopup.vue.d.ts.map +1 -1
  70. package/dist/v2/components/chat/CopilotPopupView.vue.d.ts +1 -0
  71. package/dist/v2/components/chat/CopilotPopupView.vue.d.ts.map +1 -1
  72. package/dist/v2/components/chat/CopilotPopupViewInternal.vue.d.ts +1 -0
  73. package/dist/v2/components/chat/CopilotPopupViewInternal.vue.d.ts.map +1 -1
  74. package/dist/v2/components/chat/CopilotPopupWelcomeScreen.vue.d.ts.map +1 -1
  75. package/dist/v2/components/chat/CopilotSidebar.vue.d.ts +2 -0
  76. package/dist/v2/components/chat/CopilotSidebar.vue.d.ts.map +1 -1
  77. package/dist/v2/components/chat/CopilotSidebarView.vue.d.ts +2 -0
  78. package/dist/v2/components/chat/CopilotSidebarView.vue.d.ts.map +1 -1
  79. package/dist/v2/components/chat/CopilotSidebarViewInternal.vue.d.ts +2 -0
  80. package/dist/v2/components/chat/CopilotSidebarViewInternal.vue.d.ts.map +1 -1
  81. package/dist/v2/components/chat/CopilotSidebarWelcomeScreen.vue.d.ts.map +1 -1
  82. package/dist/v2/components/chat/StreamingMarkdownDefault.vue.d.ts.map +1 -1
  83. package/dist/v2/components/chat/copilotChatToolCallItemRender.d.ts +0 -1
  84. package/dist/v2/components/chat/copilotChatToolCallItemRender.d.ts.map +1 -1
  85. package/dist/v2/components/chat/index.d.ts +17 -1
  86. package/dist/v2/components/chat/index.d.ts.map +1 -1
  87. package/dist/v2/components/chat/inspector-shortcuts.d.ts +12 -0
  88. package/dist/v2/components/chat/inspector-shortcuts.d.ts.map +1 -0
  89. package/dist/v2/components/chat/message-feedback.d.ts +89 -0
  90. package/dist/v2/components/chat/message-feedback.d.ts.map +1 -0
  91. package/dist/v2/components/chat/tool-call-capture.d.ts +39 -0
  92. package/dist/v2/components/chat/tool-call-capture.d.ts.map +1 -0
  93. package/dist/v2/components/chat/tool-call-display-context.d.ts +22 -0
  94. package/dist/v2/components/chat/tool-call-display-context.d.ts.map +1 -0
  95. package/dist/v2/components/chat/tool-call-group-parts.d.ts +131 -0
  96. package/dist/v2/components/chat/tool-call-group-parts.d.ts.map +1 -0
  97. package/dist/v2/components/chat/turn-work.d.ts +33 -0
  98. package/dist/v2/components/chat/turn-work.d.ts.map +1 -0
  99. package/dist/v2/components/chat/types.d.ts +104 -5
  100. package/dist/v2/components/chat/types.d.ts.map +1 -1
  101. package/dist/v2/components/chat/use-chat-labels.d.ts +8 -0
  102. package/dist/v2/components/chat/use-chat-labels.d.ts.map +1 -0
  103. package/dist/v2/components/chat/use-lightbox.d.ts +18 -0
  104. package/dist/v2/components/chat/use-lightbox.d.ts.map +1 -0
  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 +55 -0
  108. package/dist/v2/components/ui/CopilotDropdownMenuContent.vue.d.ts.map +1 -0
  109. package/dist/v2/components/ui/CopilotPopover.vue.d.ts +40 -0
  110. package/dist/v2/components/ui/CopilotPopover.vue.d.ts.map +1 -0
  111. package/dist/v2/components/ui/CopilotTooltip.vue.d.ts +37 -0
  112. package/dist/v2/components/ui/CopilotTooltip.vue.d.ts.map +1 -0
  113. package/dist/v2/components/ui/dropdown-menu.d.ts +14 -0
  114. package/dist/v2/components/ui/dropdown-menu.d.ts.map +1 -0
  115. package/dist/v2/components/ui/floating.d.ts +84 -0
  116. package/dist/v2/components/ui/floating.d.ts.map +1 -0
  117. package/dist/v2/components/ui/presence.d.ts +9 -0
  118. package/dist/v2/components/ui/presence.d.ts.map +1 -0
  119. package/dist/v2/components/ui/use-id.d.ts +9 -0
  120. package/dist/v2/components/ui/use-id.d.ts.map +1 -0
  121. package/dist/v2/hooks/use-default-render-tool.d.ts +6 -0
  122. package/dist/v2/hooks/use-default-render-tool.d.ts.map +1 -1
  123. package/dist/v2/hooks/use-frontend-tool.d.ts +5 -0
  124. package/dist/v2/hooks/use-frontend-tool.d.ts.map +1 -1
  125. package/dist/v2/hooks/use-render-activity-message.d.ts +13 -9
  126. package/dist/v2/hooks/use-render-activity-message.d.ts.map +1 -1
  127. package/dist/v2/hooks/use-render-custom-messages.d.ts +5 -7
  128. package/dist/v2/hooks/use-render-custom-messages.d.ts.map +1 -1
  129. package/dist/v2/hooks/use-render-tool.d.ts +4 -0
  130. package/dist/v2/hooks/use-render-tool.d.ts.map +1 -1
  131. package/dist/v2/index.cjs +1 -1
  132. package/dist/v2/index.d.cts +3 -0
  133. package/dist/v2/index.d.mts +3 -0
  134. package/dist/v2/index.d.ts +3 -0
  135. package/dist/v2/index.d.ts.map +1 -1
  136. package/dist/v2/index.mjs +197 -197
  137. package/dist/v2/index.mjs.map +1 -1
  138. package/dist/v2/lib/message-feedback.d.ts +33 -0
  139. package/dist/v2/lib/message-feedback.d.ts.map +1 -0
  140. package/dist/v2/lib/processPartialHtml.d.ts +1 -2
  141. package/dist/v2/lib/processPartialHtml.d.ts.map +1 -1
  142. package/dist/v2/lib/vue-core.d.ts +0 -1
  143. package/dist/v2/lib/vue-core.d.ts.map +1 -1
  144. package/dist/v2/providers/CopilotChatConfigurationProvider.vue.d.ts.map +1 -1
  145. package/dist/v2/providers/CopilotKitProvider.types.d.ts +56 -6
  146. package/dist/v2/providers/CopilotKitProvider.types.d.ts.map +1 -1
  147. package/dist/v2/providers/CopilotKitProvider.vue.d.ts +6 -2
  148. package/dist/v2/providers/CopilotKitProvider.vue.d.ts.map +1 -1
  149. package/dist/v2/providers/index.d.ts +1 -1
  150. package/dist/v2/providers/index.d.ts.map +1 -1
  151. package/dist/v2/providers/keys.d.ts +8 -0
  152. package/dist/v2/providers/keys.d.ts.map +1 -1
  153. package/dist/v2/providers/types.d.ts +3 -37
  154. package/dist/v2/providers/types.d.ts.map +1 -1
  155. package/dist/v2/styles/CopilotKitStyles.d.ts +18 -0
  156. package/dist/v2/styles/CopilotKitStyles.d.ts.map +1 -0
  157. package/dist/v2/types/defineToolCallRenderer.d.ts +2 -0
  158. package/dist/v2/types/defineToolCallRenderer.d.ts.map +1 -1
  159. package/dist/v2/types/human-in-the-loop.d.ts +8 -29
  160. package/dist/v2/types/human-in-the-loop.d.ts.map +1 -1
  161. package/dist/v2/types/interrupt.d.ts +1 -22
  162. package/dist/v2/types/interrupt.d.ts.map +1 -1
  163. package/dist/v2/types/vue-activity-message-renderer.d.ts +16 -15
  164. package/dist/v2/types/vue-activity-message-renderer.d.ts.map +1 -1
  165. package/dist/v2/types/vue-custom-message-renderer.d.ts +7 -16
  166. package/dist/v2/types/vue-custom-message-renderer.d.ts.map +1 -1
  167. package/dist/v2/types/vue-tool-call-renderer.d.ts +16 -28
  168. package/dist/v2/types/vue-tool-call-renderer.d.ts.map +1 -1
  169. package/package.json +14 -27
  170. package/src/__tests__/build-entries.test.ts +27 -0
  171. package/src/components/copilot-provider/CopilotKit.vue +4 -1
  172. package/src/hooks/__tests__/zod-parameters.test.ts +520 -0
  173. package/src/hooks/use-copilot-action.ts +2 -1
  174. package/src/hooks/use-frontend-tool.ts +3 -6
  175. package/src/hooks/zod-parameters.ts +162 -0
  176. package/src/v2/__tests__/exports.test.ts +4 -2
  177. package/src/v2/components/A2UIMessageRenderer.ts +56 -68
  178. package/src/v2/components/A2UISurfaceActivityRenderer.vue +11 -23
  179. package/src/v2/components/LicenseWarningBanner.vue +31 -15
  180. package/src/v2/components/OpenGenerativeUIRenderer.ts +51 -373
  181. package/src/v2/components/__tests__/A2UIBasicCatalogColors.test.ts +8 -9
  182. package/src/v2/components/__tests__/A2UICatalogContext.test.ts +1 -1
  183. package/src/v2/components/__tests__/A2UIMessageRenderer.test.ts +63 -36
  184. package/src/v2/components/__tests__/LicenseWarningBanner.test.ts +20 -0
  185. package/src/v2/components/__tests__/OpenGenerativeUIRenderer.test.ts +55 -6
  186. package/src/v2/components/a2ui/A2UIBuiltInToolCallRenderer.ts +15 -258
  187. package/src/v2/components/a2ui/A2UICatalogContext.ts +10 -102
  188. package/src/v2/components/a2ui/A2UIRecoveryStates.ts +444 -0
  189. package/src/v2/components/a2ui/__tests__/A2UIRecoveryStates.test.ts +175 -0
  190. package/src/v2/components/a2ui.ts +1 -1
  191. package/src/v2/components/chat/CopilotChat.vue +26 -40
  192. package/src/v2/components/chat/CopilotChatAssistantMessage.vue +267 -67
  193. package/src/v2/components/chat/CopilotChatAssistantToolbarButton.vue +46 -0
  194. package/src/v2/components/chat/CopilotChatAttachmentQueue.vue +150 -173
  195. package/src/v2/components/chat/CopilotChatAttachmentRenderer.vue +77 -20
  196. package/src/v2/components/chat/CopilotChatAudioRecorder.vue +2 -2
  197. package/src/v2/components/chat/CopilotChatFeedbackCommentPopover.vue +240 -0
  198. package/src/v2/components/chat/CopilotChatInput.vue +250 -191
  199. package/src/v2/components/chat/CopilotChatInspectorButton.vue +331 -0
  200. package/src/v2/components/chat/CopilotChatLightbox.vue +105 -0
  201. package/src/v2/components/chat/CopilotChatMessageView.vue +262 -87
  202. package/src/v2/components/chat/CopilotChatReasoningMessage.vue +52 -35
  203. package/src/v2/components/chat/CopilotChatSuggestionPill.vue +5 -14
  204. package/src/v2/components/chat/CopilotChatSuggestionView.vue +1 -4
  205. package/src/v2/components/chat/CopilotChatToggleButton.vue +3 -9
  206. package/src/v2/components/chat/CopilotChatToggleButtonCloseIcon.ts +1 -1
  207. package/src/v2/components/chat/CopilotChatToggleButtonOpenIcon.ts +1 -1
  208. package/src/v2/components/chat/CopilotChatToolCallGroup.vue +353 -0
  209. package/src/v2/components/chat/CopilotChatToolCallItem.vue +24 -14
  210. package/src/v2/components/chat/CopilotChatToolCallsView.vue +194 -21
  211. package/src/v2/components/chat/CopilotChatUserMessage.vue +105 -42
  212. package/src/v2/components/chat/CopilotChatView.vue +37 -42
  213. package/src/v2/components/chat/CopilotChatWorkSummary.vue +111 -0
  214. package/src/v2/components/chat/CopilotModalHeader.vue +10 -8
  215. package/src/v2/components/chat/CopilotModalHeaderCloseButton.ts +7 -6
  216. package/src/v2/components/chat/CopilotModalHeaderTitle.ts +1 -4
  217. package/src/v2/components/chat/CopilotPopup.vue +3 -0
  218. package/src/v2/components/chat/CopilotPopupView.vue +1 -0
  219. package/src/v2/components/chat/CopilotPopupViewInternal.vue +9 -19
  220. package/src/v2/components/chat/CopilotPopupWelcomeScreen.vue +5 -8
  221. package/src/v2/components/chat/CopilotSidebar.vue +5 -0
  222. package/src/v2/components/chat/CopilotSidebarView.vue +2 -0
  223. package/src/v2/components/chat/CopilotSidebarViewInternal.vue +24 -17
  224. package/src/v2/components/chat/CopilotSidebarWelcomeScreen.vue +7 -10
  225. package/src/v2/components/chat/StreamingMarkdownDefault.vue +3 -5
  226. package/src/v2/components/chat/__tests__/CopilotChat.labels.test.ts +19 -4
  227. package/src/v2/components/chat/__tests__/CopilotChatActivityRendering.e2e.test.ts +26 -9
  228. package/src/v2/components/chat/__tests__/CopilotChatAssistantMessage.inspector.test.ts +269 -0
  229. package/src/v2/components/chat/__tests__/CopilotChatAssistantMessage.learningFeedback.test.ts +760 -0
  230. package/src/v2/components/chat/__tests__/CopilotChatAssistantMessage.slots.e2e.test.ts +3 -5
  231. package/src/v2/components/chat/__tests__/CopilotChatAssistantMessage.test.ts +2 -2
  232. package/src/v2/components/chat/__tests__/CopilotChatInput.addMenu.test.ts +328 -0
  233. package/src/v2/components/chat/__tests__/CopilotChatInput.slots.e2e.test.ts +6 -3
  234. package/src/v2/components/chat/__tests__/CopilotChatInput.test.ts +55 -14
  235. package/src/v2/components/chat/__tests__/CopilotChatLightbox.test.ts +160 -0
  236. package/src/v2/components/chat/__tests__/CopilotChatMessageView.test.ts +247 -403
  237. package/src/v2/components/chat/__tests__/CopilotChatMessageView.toolCallDisplay.test.ts +637 -0
  238. package/src/v2/components/chat/__tests__/CopilotChatSuggestionPill.test.ts +1 -1
  239. package/src/v2/components/chat/__tests__/CopilotChatSuggestionView.slots.e2e.test.ts +3 -1
  240. package/src/v2/components/chat/__tests__/CopilotChatToolCallsView.learning.test.ts +75 -0
  241. package/src/v2/components/chat/__tests__/CopilotChatUserMessage.attachments.test.ts +143 -0
  242. package/src/v2/components/chat/__tests__/CopilotChatView.inputOverlay.test.ts +5 -4
  243. package/src/v2/components/chat/__tests__/CopilotChatView.rootWidth.test.ts +7 -33
  244. package/src/v2/components/chat/__tests__/CopilotModalHeader.slots.e2e.test.ts +1 -1
  245. package/src/v2/components/chat/__tests__/CopilotPopupView.slots.e2e.test.ts +3 -3
  246. package/src/v2/components/chat/__tests__/CopilotSidebarView.position.test.ts +126 -0
  247. package/src/v2/components/chat/__tests__/messageFeedbackDefaults.test.ts +33 -0
  248. package/src/v2/components/chat/__tests__/modalChatDisplayProps.test.ts +44 -0
  249. package/src/v2/components/chat/copilotChatToolCallItemRender.ts +3 -19
  250. package/src/v2/components/chat/index.ts +2 -1
  251. package/src/v2/components/chat/inspector-shortcuts.ts +34 -0
  252. package/src/v2/components/chat/message-feedback.ts +291 -0
  253. package/src/v2/components/chat/tool-call-capture.ts +55 -0
  254. package/src/v2/components/chat/tool-call-display-context.ts +28 -0
  255. package/src/v2/components/chat/tool-call-group-parts.ts +251 -0
  256. package/src/v2/components/chat/turn-work.ts +52 -0
  257. package/src/v2/components/chat/types.ts +114 -4
  258. package/src/v2/components/chat/use-chat-labels.ts +16 -0
  259. package/src/v2/components/chat/use-lightbox.ts +64 -0
  260. package/src/v2/components/icons/__tests__/icons.test.ts +72 -68
  261. package/src/v2/components/icons/index.ts +109 -23
  262. package/src/v2/components/ui/CopilotDropdownMenuContent.vue +465 -0
  263. package/src/v2/components/ui/CopilotPopover.vue +138 -0
  264. package/src/v2/components/ui/CopilotTooltip.vue +237 -0
  265. package/src/v2/components/ui/__tests__/CopilotTooltip.test.ts +168 -0
  266. package/src/v2/components/ui/dropdown-menu.ts +15 -0
  267. package/src/v2/components/ui/floating.ts +321 -0
  268. package/src/v2/components/ui/presence.ts +54 -0
  269. package/src/v2/components/ui/use-id.ts +16 -0
  270. package/src/v2/hooks/__tests__/use-frontend-tool.e2e.test.ts +62 -1
  271. package/src/v2/hooks/__tests__/use-render-activity-message.test.ts +105 -0
  272. package/src/v2/hooks/__tests__/use-render-tool.test.ts +3 -6
  273. package/src/v2/hooks/__tests__/zod-regression.test.ts +5 -4
  274. package/src/v2/hooks/use-default-render-tool.ts +123 -62
  275. package/src/v2/hooks/use-frontend-tool.ts +10 -10
  276. package/src/v2/hooks/use-render-activity-message.ts +27 -48
  277. package/src/v2/hooks/use-render-custom-messages.ts +14 -35
  278. package/src/v2/hooks/use-render-tool.ts +8 -0
  279. package/src/v2/index.ts +3 -0
  280. package/src/v2/lib/__tests__/message-feedback.test.ts +152 -0
  281. package/src/v2/lib/message-feedback.ts +120 -0
  282. package/src/v2/lib/processPartialHtml.ts +6 -21
  283. package/src/v2/lib/vue-core.ts +3 -5
  284. package/src/v2/providers/CopilotChatConfigurationProvider.vue +29 -2
  285. package/src/v2/providers/CopilotKitProvider.types.ts +57 -5
  286. package/src/v2/providers/CopilotKitProvider.vue +177 -114
  287. package/src/v2/providers/__tests__/CopilotChatConfigurationProvider.openThread.test.ts +69 -0
  288. package/src/v2/providers/__tests__/CopilotKitProvider.a2ui.test.ts +1 -1
  289. package/src/v2/providers/__tests__/CopilotKitProvider.headersAtSendTime.test.ts +3 -3
  290. package/src/v2/providers/__tests__/CopilotKitProvider.learning.test.ts +536 -0
  291. package/src/v2/providers/__tests__/CopilotKitProvider.test.ts +17 -33
  292. package/src/v2/providers/index.ts +4 -1
  293. package/src/v2/providers/keys.ts +12 -0
  294. package/src/v2/providers/types.ts +3 -38
  295. package/src/v2/styles/CopilotKitStyles.ts +95 -0
  296. package/src/v2/styles/__tests__/CopilotKitStyles.client.test.ts +149 -0
  297. package/src/v2/styles/__tests__/CopilotKitStyles.ssr.test.ts +71 -0
  298. package/src/v2/types/__tests__/defineToolCallRenderer.test.ts +28 -33
  299. package/src/v2/types/defineToolCallRenderer.ts +9 -4
  300. package/src/v2/types/human-in-the-loop.ts +8 -32
  301. package/src/v2/types/interrupt.ts +7 -31
  302. package/src/v2/types/vue-activity-message-renderer.ts +24 -15
  303. package/src/v2/types/vue-custom-message-renderer.ts +12 -16
  304. package/src/v2/types/vue-tool-call-renderer.ts +23 -31
  305. package/vite.config.ts +5 -5
  306. package/dist/styles.css +0 -2
  307. package/dist/v2/components/chat/BasicMarkdown.vue.d.ts +0 -9
  308. package/dist/v2/components/chat/BasicMarkdown.vue.d.ts.map +0 -1
  309. package/dist/v2/lib/transcription-client.d.ts +0 -19
  310. package/dist/v2/lib/transcription-client.d.ts.map +0 -1
  311. package/scripts/scope-preflight.mjs +0 -100
  312. package/src/styles/globals.css +0 -233
  313. package/src/v2/components/chat/BasicMarkdown.vue +0 -158
  314. package/src/v2/components/chat/__tests__/BasicMarkdown.test.ts +0 -69
  315. package/src/v2/lib/__tests__/processPartialHtml.test.ts +0 -84
  316. package/src/v2/lib/__tests__/transcription-client.test.ts +0 -67
  317. package/src/v2/lib/transcription-client.ts +0 -151
@@ -1,188 +1,172 @@
1
- import { defineComponent } from "vue";
1
+ import { defineComponent, h } from "vue";
2
2
  import { render, screen } from "@testing-library/vue";
3
3
  import { describe, expect, it } from "vitest";
4
4
  import { z } from "zod";
5
- import type {
6
- ActivityMessage,
7
- AssistantMessage,
8
- Message,
9
- UserMessage,
10
- } from "@ag-ui/core";
5
+ import type { Message, ToolCall } from "@ag-ui/core";
11
6
  import CopilotKitProvider from "../../../providers/CopilotKitProvider.vue";
12
7
  import CopilotChatConfigurationProvider from "../../../providers/CopilotChatConfigurationProvider.vue";
13
8
  import CopilotChatMessageView from "../CopilotChatMessageView.vue";
9
+ import type { VueActivityMessageRenderer } from "../../../types";
10
+
11
+ const agentId = "default";
12
+ const threadId = "thread-test";
13
+
14
+ /** Slot templates that print what the view hands each message slot. */
15
+ const assistantContentSlot = `
16
+ <template #assistant-message="{ message }">
17
+ <div data-testid="assistant-content">{{ message.content }}</div>
18
+ </template>`;
19
+ const assistantToolCallsSlot = `
20
+ <template #assistant-message="{ message }">
21
+ <div data-testid="assistant-tool-calls-count">{{ message.toolCalls?.length ?? 0 }}</div>
22
+ <div data-testid="assistant-tool-call-args">{{ (message.toolCalls ?? []).map((call) => call.function.arguments).join("|") }}</div>
23
+ <div data-testid="assistant-content">{{ message.content }}</div>
24
+ </template>`;
25
+ const userContentSlot = `
26
+ <template #user-message="{ message }">
27
+ <div data-testid="user-content">{{ message.content }}</div>
28
+ </template>`;
29
+
30
+ /**
31
+ * Renders a message view inside the providers.
32
+ *
33
+ * @param options.slots - Slot templates placed inside the message view.
34
+ * @param options.renderActivityMessages - Activity renderers to register.
35
+ */
36
+ function renderMessageView(options: {
37
+ messages: Message[];
38
+ slots?: string;
39
+ renderActivityMessages?: VueActivityMessageRenderer<unknown>[];
40
+ }) {
41
+ const { messages, slots = "", renderActivityMessages = [] } = options;
42
+ const Host = defineComponent({
43
+ components: {
44
+ CopilotKitProvider,
45
+ CopilotChatConfigurationProvider,
46
+ CopilotChatMessageView,
47
+ },
48
+ setup() {
49
+ return { messages, agentId, threadId, renderActivityMessages };
50
+ },
51
+ template: `
52
+ <CopilotKitProvider
53
+ runtime-url="/api/copilotkit"
54
+ :render-activity-messages="renderActivityMessages"
55
+ >
56
+ <CopilotChatConfigurationProvider :agent-id="agentId" :thread-id="threadId">
57
+ <CopilotChatMessageView :messages="messages">${slots}</CopilotChatMessageView>
58
+ </CopilotChatConfigurationProvider>
59
+ </CopilotKitProvider>
60
+ `,
61
+ });
14
62
 
15
- describe("CopilotChatMessageView activity rendering", () => {
16
- const agentId = "default";
17
- const threadId = "thread-test";
18
-
19
- function renderMessageView({
20
- messages,
21
- hostTemplate = `<CopilotChatMessageView :messages="messages" />`,
22
- }: {
23
- messages: Message[];
24
- hostTemplate?: string;
25
- }) {
26
- const ActivityRenderer = defineComponent({
27
- name: "ActivityRenderer",
28
- props: {
29
- content: { type: Object, required: true },
30
- },
31
- setup(props) {
32
- return {
33
- percent: (props.content as { percent: number }).percent,
34
- };
35
- },
36
- template: `
37
- <div data-testid="activity-renderer">
38
- Progress: {{ percent }}%
39
- </div>
40
- `,
41
- });
42
-
43
- const Host = defineComponent({
44
- components: {
45
- CopilotKitProvider,
46
- CopilotChatConfigurationProvider,
47
- CopilotChatMessageView,
48
- ActivityRenderer,
49
- },
50
- setup() {
51
- return { messages, agentId, threadId };
52
- },
53
- template: `
54
- <CopilotKitProvider runtime-url="/api/copilotkit">
55
- <CopilotChatConfigurationProvider :agent-id="agentId" :thread-id="threadId">
56
- ${hostTemplate}
57
- </CopilotChatConfigurationProvider>
58
- </CopilotKitProvider>
59
- `,
60
- });
63
+ return render(Host);
64
+ }
61
65
 
62
- return render(Host);
63
- }
64
-
65
- it("renders activity messages via matching custom renderer", () => {
66
- const messages: Message[] = [
67
- {
68
- id: "act-1",
69
- role: "activity",
70
- activityType: "search-progress",
71
- content: { percent: 42 },
72
- } as ActivityMessage,
73
- ];
74
-
75
- const renderers = [
76
- {
77
- activityType: "search-progress",
78
- content: z.object({ percent: z.number() }),
79
- },
80
- ];
81
- expect(renderers).toHaveLength(1);
66
+ function toolCall(id: string, name: string, args = "{}"): ToolCall {
67
+ return { id, type: "function", function: { name, arguments: args } };
68
+ }
82
69
 
70
+ describe("CopilotChatMessageView activity rendering", () => {
71
+ const progress: Message = {
72
+ id: "act-1",
73
+ role: "activity",
74
+ activityType: "search-progress",
75
+ content: { percent: 42 },
76
+ };
77
+
78
+ /** A `"*"` renderer that prints the content it was given. */
79
+ const wildcardRenderer: VueActivityMessageRenderer<unknown> = {
80
+ activityType: "*",
81
+ content: z.object({ percent: z.number() }),
82
+ render: (props) =>
83
+ h(
84
+ "div",
85
+ { "data-testid": "wildcard-activity" },
86
+ JSON.stringify(props.content),
87
+ ),
88
+ };
89
+
90
+ it("renders activity messages through their activity-<type> slot", () => {
83
91
  renderMessageView({
84
- messages,
85
- hostTemplate: `
86
- <CopilotChatMessageView :messages="messages">
87
- <template #activity-search-progress="{ content }">
88
- <ActivityRenderer :content="content" />
89
- </template>
90
- </CopilotChatMessageView>
91
- `,
92
+ messages: [progress],
93
+ slots: `
94
+ <template #activity-search-progress="{ content }">
95
+ <div data-testid="activity-renderer">Progress: {{ content.percent }}%</div>
96
+ </template>`,
92
97
  });
93
98
 
94
99
  expect(screen.getByTestId("activity-renderer").textContent).toContain("42");
95
100
  });
96
101
 
97
102
  it("skips rendering when no activity renderer matches", () => {
98
- const messages: Message[] = [
99
- {
100
- id: "act-2",
101
- role: "activity",
102
- activityType: "unknown-type",
103
- content: { message: "should not render" },
104
- } as ActivityMessage,
105
- ];
103
+ renderMessageView({
104
+ messages: [
105
+ {
106
+ id: "act-2",
107
+ role: "activity",
108
+ activityType: "unknown-type",
109
+ content: { message: "should not render" },
110
+ },
111
+ ],
112
+ });
113
+
114
+ expect(screen.queryByText("should not render")).toBeNull();
115
+ });
106
116
 
117
+ it("falls back to the * renderer for a type with no renderer of its own", () => {
107
118
  renderMessageView({
108
- messages,
109
- hostTemplate: `<CopilotChatMessageView :messages="messages" />`,
119
+ messages: [progress],
120
+ renderActivityMessages: [wildcardRenderer],
110
121
  });
111
122
 
112
- expect(screen.queryByTestId("activity-renderer")).toBeNull();
123
+ expect(screen.getByTestId("wildcard-activity").textContent).toBe(
124
+ '{"percent":42}',
125
+ );
113
126
  });
114
- });
115
127
 
116
- describe("CopilotChatMessageView duplicate message deduplication", () => {
117
- const agentId = "default";
118
- const threadId = "thread-test";
119
-
120
- function renderMessageView({ messages }: { messages: Message[] }) {
121
- const Host = defineComponent({
122
- components: {
123
- CopilotKitProvider,
124
- CopilotChatConfigurationProvider,
125
- CopilotChatMessageView,
126
- },
127
- setup() {
128
- return { messages, agentId, threadId };
129
- },
130
- template: `
131
- <CopilotKitProvider runtime-url="/api/copilotkit">
132
- <CopilotChatConfigurationProvider :agent-id="agentId" :thread-id="threadId">
133
- <CopilotChatMessageView :messages="messages" />
134
- </CopilotChatConfigurationProvider>
135
- </CopilotKitProvider>
136
- `,
128
+ it("uses an activity-<type> slot before the * renderer", () => {
129
+ renderMessageView({
130
+ messages: [progress],
131
+ renderActivityMessages: [wildcardRenderer],
132
+ slots: `
133
+ <template #activity-search-progress>
134
+ <div data-testid="activity-slot">slot</div>
135
+ </template>`,
137
136
  });
138
137
 
139
- return render(Host);
140
- }
138
+ expect(screen.getByTestId("activity-slot")).toBeTruthy();
139
+ expect(screen.queryByTestId("wildcard-activity")).toBeNull();
140
+ });
141
+ });
141
142
 
143
+ describe("CopilotChatMessageView duplicate message deduplication", () => {
142
144
  it("preserves assistant text content when later duplicate has empty content (multi-tool-call scenario)", () => {
143
- const messages: Message[] = [
144
- {
145
- id: "user-1",
146
- role: "user",
147
- content: "Record a headache",
148
- } as UserMessage,
149
- {
150
- id: "assistant-1",
151
- role: "assistant",
152
- content: "Let me record that...",
153
- } as AssistantMessage,
154
- {
155
- id: "assistant-1",
156
- role: "assistant",
157
- content: "",
158
- toolCalls: [
159
- {
160
- id: "tc-1",
161
- type: "function",
162
- function: { name: "captureData", arguments: "{}" },
163
- },
164
- ],
165
- } as AssistantMessage,
166
- {
167
- id: "assistant-1",
168
- role: "assistant",
169
- content: "",
170
- toolCalls: [
171
- {
172
- id: "tc-1",
173
- type: "function",
174
- function: { name: "captureData", arguments: "{}" },
175
- },
176
- {
177
- id: "tc-2",
178
- type: "function",
179
- function: { name: "updateMemory", arguments: "{}" },
180
- },
181
- ],
182
- } as AssistantMessage,
183
- ];
184
-
185
- renderMessageView({ messages });
145
+ renderMessageView({
146
+ messages: [
147
+ { id: "user-1", role: "user", content: "Record a headache" },
148
+ {
149
+ id: "assistant-1",
150
+ role: "assistant",
151
+ content: "Let me record that...",
152
+ },
153
+ {
154
+ id: "assistant-1",
155
+ role: "assistant",
156
+ content: "",
157
+ toolCalls: [toolCall("tc-1", "captureData")],
158
+ },
159
+ {
160
+ id: "assistant-1",
161
+ role: "assistant",
162
+ content: "",
163
+ toolCalls: [
164
+ toolCall("tc-1", "captureData"),
165
+ toolCall("tc-2", "updateMemory"),
166
+ ],
167
+ },
168
+ ],
169
+ });
186
170
 
187
171
  const assistantMessages = screen.getAllByTestId(
188
172
  "copilot-assistant-message",
@@ -194,25 +178,21 @@ describe("CopilotChatMessageView duplicate message deduplication", () => {
194
178
  });
195
179
 
196
180
  it("uses latest content when all assistant duplicates have non-empty content", () => {
197
- const messages: Message[] = [
198
- {
199
- id: "user-1",
200
- role: "user",
201
- content: "Hello",
202
- } as UserMessage,
203
- {
204
- id: "assistant-1",
205
- role: "assistant",
206
- content: "Partial response...",
207
- } as AssistantMessage,
208
- {
209
- id: "assistant-1",
210
- role: "assistant",
211
- content: "Full response from the assistant.",
212
- } as AssistantMessage,
213
- ];
214
-
215
- renderMessageView({ messages });
181
+ renderMessageView({
182
+ messages: [
183
+ { id: "user-1", role: "user", content: "Hello" },
184
+ {
185
+ id: "assistant-1",
186
+ role: "assistant",
187
+ content: "Partial response...",
188
+ },
189
+ {
190
+ id: "assistant-1",
191
+ role: "assistant",
192
+ content: "Full response from the assistant.",
193
+ },
194
+ ],
195
+ });
216
196
 
217
197
  const assistantMessages = screen.getAllByTestId(
218
198
  "copilot-assistant-message",
@@ -221,100 +201,45 @@ describe("CopilotChatMessageView duplicate message deduplication", () => {
221
201
  expect(assistantMessages[0]?.textContent).toContain(
222
202
  "Full response from the assistant.",
223
203
  );
224
-
225
- const userMessages = screen.getAllByTestId("copilot-user-message");
226
- expect(userMessages).toHaveLength(1);
204
+ expect(screen.getAllByTestId("copilot-user-message")).toHaveLength(1);
227
205
  });
228
206
 
229
207
  it("uses later content when earlier content is empty", () => {
230
- const messages: Message[] = [
231
- {
232
- id: "assistant-1",
233
- role: "assistant",
234
- content: "",
235
- } as AssistantMessage,
236
- {
237
- id: "assistant-1",
238
- role: "assistant",
239
- content: "Here is the result.",
240
- } as AssistantMessage,
241
- ];
242
-
243
- const Host = defineComponent({
244
- components: {
245
- CopilotKitProvider,
246
- CopilotChatConfigurationProvider,
247
- CopilotChatMessageView,
248
- },
249
- setup() {
250
- return { messages, agentId, threadId };
251
- },
252
- template: `
253
- <CopilotKitProvider runtime-url="/api/copilotkit">
254
- <CopilotChatConfigurationProvider :agent-id="agentId" :thread-id="threadId">
255
- <CopilotChatMessageView :messages="messages">
256
- <template #assistant-message="{ message }">
257
- <div data-testid="assistant-content">{{ message.content }}</div>
258
- </template>
259
- </CopilotChatMessageView>
260
- </CopilotChatConfigurationProvider>
261
- </CopilotKitProvider>
262
- `,
208
+ renderMessageView({
209
+ messages: [
210
+ { id: "assistant-1", role: "assistant", content: "" },
211
+ {
212
+ id: "assistant-1",
213
+ role: "assistant",
214
+ content: "Here is the result.",
215
+ },
216
+ ],
217
+ slots: assistantContentSlot,
263
218
  });
264
219
 
265
- render(Host);
266
-
267
220
  expect(screen.getByTestId("assistant-content").textContent).toContain(
268
221
  "Here is the result.",
269
222
  );
270
223
  });
271
224
 
272
225
  it("recovers toolCalls when later duplicate has content but undefined toolCalls", () => {
273
- const messages: Message[] = [
274
- {
275
- id: "assistant-1",
276
- role: "assistant",
277
- content: "",
278
- toolCalls: [
279
- {
280
- id: "tc-1",
281
- type: "function",
282
- function: { name: "captureData", arguments: "{}" },
283
- },
284
- ],
285
- } as AssistantMessage,
286
- {
287
- id: "assistant-1",
288
- role: "assistant",
289
- content: "Here is the result.",
290
- } as AssistantMessage,
291
- ];
292
-
293
- const Host = defineComponent({
294
- components: {
295
- CopilotKitProvider,
296
- CopilotChatConfigurationProvider,
297
- CopilotChatMessageView,
298
- },
299
- setup() {
300
- return { messages, agentId, threadId };
301
- },
302
- template: `
303
- <CopilotKitProvider runtime-url="/api/copilotkit">
304
- <CopilotChatConfigurationProvider :agent-id="agentId" :thread-id="threadId">
305
- <CopilotChatMessageView :messages="messages">
306
- <template #assistant-message="{ message }">
307
- <div data-testid="assistant-tool-calls-count">{{ message.toolCalls?.length ?? 0 }}</div>
308
- <div data-testid="assistant-content">{{ message.content }}</div>
309
- </template>
310
- </CopilotChatMessageView>
311
- </CopilotChatConfigurationProvider>
312
- </CopilotKitProvider>
313
- `,
226
+ renderMessageView({
227
+ messages: [
228
+ {
229
+ id: "assistant-1",
230
+ role: "assistant",
231
+ content: "",
232
+ toolCalls: [toolCall("tc-1", "captureData")],
233
+ },
234
+ {
235
+ id: "assistant-1",
236
+ role: "assistant",
237
+ content: "Here is the result.",
238
+ },
239
+ ],
240
+ slots: assistantToolCallsSlot,
314
241
  });
315
242
 
316
- render(Host);
317
-
318
243
  expect(screen.getByTestId("assistant-content").textContent).toContain(
319
244
  "Here is the result.",
320
245
  );
@@ -324,171 +249,90 @@ describe("CopilotChatMessageView duplicate message deduplication", () => {
324
249
  });
325
250
 
326
251
  it("keeps empty toolCalls array from later chunk", () => {
327
- const messages: Message[] = [
328
- {
329
- id: "assistant-1",
330
- role: "assistant",
331
- content: "",
332
- toolCalls: [
333
- {
334
- id: "tc-1",
335
- type: "function",
336
- function: { name: "captureData", arguments: "{}" },
337
- },
338
- ],
339
- } as AssistantMessage,
340
- {
341
- id: "assistant-1",
342
- role: "assistant",
343
- content: "Done.",
344
- toolCalls: [],
345
- } as AssistantMessage,
346
- ];
347
-
348
- const Host = defineComponent({
349
- components: {
350
- CopilotKitProvider,
351
- CopilotChatConfigurationProvider,
352
- CopilotChatMessageView,
353
- },
354
- setup() {
355
- return { messages, agentId, threadId };
356
- },
357
- template: `
358
- <CopilotKitProvider runtime-url="/api/copilotkit">
359
- <CopilotChatConfigurationProvider :agent-id="agentId" :thread-id="threadId">
360
- <CopilotChatMessageView :messages="messages">
361
- <template #assistant-message="{ message }">
362
- <div data-testid="assistant-tool-calls-count">{{ message.toolCalls?.length ?? 0 }}</div>
363
- </template>
364
- </CopilotChatMessageView>
365
- </CopilotChatConfigurationProvider>
366
- </CopilotKitProvider>
367
- `,
252
+ renderMessageView({
253
+ messages: [
254
+ {
255
+ id: "assistant-1",
256
+ role: "assistant",
257
+ content: "",
258
+ toolCalls: [toolCall("tc-1", "captureData")],
259
+ },
260
+ {
261
+ id: "assistant-1",
262
+ role: "assistant",
263
+ content: "Done.",
264
+ toolCalls: [],
265
+ },
266
+ ],
267
+ slots: assistantToolCallsSlot,
368
268
  });
369
269
 
370
- render(Host);
371
-
372
270
  expect(screen.getByTestId("assistant-tool-calls-count").textContent).toBe(
373
271
  "0",
374
272
  );
375
273
  });
376
274
 
377
- it("handles undefined content on both occurrences", () => {
378
- const messages: Message[] = [
379
- {
380
- id: "assistant-1",
381
- role: "assistant",
382
- content: undefined,
383
- } as AssistantMessage,
384
- {
385
- id: "assistant-1",
386
- role: "assistant",
387
- content: undefined,
388
- } as AssistantMessage,
389
- ];
390
-
391
- const Host = defineComponent({
392
- components: {
393
- CopilotKitProvider,
394
- CopilotChatConfigurationProvider,
395
- CopilotChatMessageView,
396
- },
397
- setup() {
398
- return { messages, agentId, threadId };
399
- },
400
- template: `
401
- <CopilotKitProvider runtime-url="/api/copilotkit">
402
- <CopilotChatConfigurationProvider :agent-id="agentId" :thread-id="threadId">
403
- <CopilotChatMessageView :messages="messages">
404
- <template #assistant-message="{ message }">
405
- <div data-testid="assistant-content">{{ message.content }}</div>
406
- </template>
407
- </CopilotChatMessageView>
408
- </CopilotChatConfigurationProvider>
409
- </CopilotKitProvider>
410
- `,
275
+ it("collapses a tool call that repeats in one message, keeping the copy with arguments", () => {
276
+ renderMessageView({
277
+ messages: [
278
+ {
279
+ id: "assistant-1",
280
+ role: "assistant",
281
+ content: "",
282
+ toolCalls: [
283
+ toolCall("tc-1", "getWeather", '{"city":"Paris"}'),
284
+ toolCall("tc-1", "getWeather", ""),
285
+ ],
286
+ },
287
+ ],
288
+ slots: assistantToolCallsSlot,
411
289
  });
412
290
 
413
- render(Host);
291
+ expect(screen.getByTestId("assistant-tool-calls-count").textContent).toBe(
292
+ "1",
293
+ );
294
+ expect(screen.getByTestId("assistant-tool-call-args").textContent).toBe(
295
+ '{"city":"Paris"}',
296
+ );
297
+ });
298
+
299
+ it("handles undefined content on both occurrences", () => {
300
+ renderMessageView({
301
+ messages: [
302
+ { id: "assistant-1", role: "assistant", content: undefined },
303
+ { id: "assistant-1", role: "assistant", content: undefined },
304
+ ],
305
+ slots: assistantContentSlot,
306
+ });
414
307
 
415
308
  expect(screen.getByTestId("assistant-content").textContent).toBe("");
416
309
  });
417
310
 
418
311
  it("keeps last entry for non-assistant roles", () => {
419
- const messages: Message[] = [
420
- {
421
- id: "user-1",
422
- role: "user",
423
- content: "Hello",
424
- } as UserMessage,
425
- {
426
- id: "user-1",
427
- role: "user",
428
- content: "Hello (updated)",
429
- } as UserMessage,
430
- ];
431
-
432
- const Host = defineComponent({
433
- components: {
434
- CopilotKitProvider,
435
- CopilotChatConfigurationProvider,
436
- CopilotChatMessageView,
437
- },
438
- setup() {
439
- return { messages, agentId, threadId };
440
- },
441
- template: `
442
- <CopilotKitProvider runtime-url="/api/copilotkit">
443
- <CopilotChatConfigurationProvider :agent-id="agentId" :thread-id="threadId">
444
- <CopilotChatMessageView :messages="messages">
445
- <template #user-message="{ message }">
446
- <div data-testid="user-content">{{ message.content }}</div>
447
- </template>
448
- </CopilotChatMessageView>
449
- </CopilotChatConfigurationProvider>
450
- </CopilotKitProvider>
451
- `,
312
+ renderMessageView({
313
+ messages: [
314
+ { id: "user-1", role: "user", content: "Hello" },
315
+ { id: "user-1", role: "user", content: "Hello (updated)" },
316
+ ],
317
+ slots: userContentSlot,
452
318
  });
453
319
 
454
- render(Host);
455
-
456
320
  expect(screen.getByTestId("user-content").textContent).toBe(
457
321
  "Hello (updated)",
458
322
  );
459
323
  });
460
324
 
461
325
  it("preserves order of unique messages", () => {
462
- const messages: Message[] = [
463
- {
464
- id: "user-1",
465
- role: "user",
466
- content: "First question",
467
- } as UserMessage,
468
- {
469
- id: "assistant-1",
470
- role: "assistant",
471
- content: "First answer",
472
- } as AssistantMessage,
473
- {
474
- id: "user-2",
475
- role: "user",
476
- content: "Second question",
477
- } as UserMessage,
478
- {
479
- id: "assistant-2",
480
- role: "assistant",
481
- content: "Second answer",
482
- } as AssistantMessage,
483
- ];
484
-
485
- renderMessageView({ messages });
486
-
487
- const userMessages = screen.getAllByTestId("copilot-user-message");
488
- const assistantMessages = screen.getAllByTestId(
489
- "copilot-assistant-message",
490
- );
491
- expect(userMessages).toHaveLength(2);
492
- expect(assistantMessages).toHaveLength(2);
326
+ renderMessageView({
327
+ messages: [
328
+ { id: "user-1", role: "user", content: "First question" },
329
+ { id: "assistant-1", role: "assistant", content: "First answer" },
330
+ { id: "user-2", role: "user", content: "Second question" },
331
+ { id: "assistant-2", role: "assistant", content: "Second answer" },
332
+ ],
333
+ });
334
+
335
+ expect(screen.getAllByTestId("copilot-user-message")).toHaveLength(2);
336
+ expect(screen.getAllByTestId("copilot-assistant-message")).toHaveLength(2);
493
337
  });
494
338
  });