@copilotkit/vue 2.0.0-rc.2 → 2.0.0-rc.21

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 (335) hide show
  1. package/PARITY.md +3 -3
  2. package/dist/hooks/use-copilot-action.d.ts.map +1 -1
  3. package/dist/hooks/use-frontend-tool.d.ts +1 -1
  4. package/dist/hooks/use-frontend-tool.d.ts.map +1 -1
  5. package/dist/hooks/zod-parameters.d.ts +14 -0
  6. package/dist/hooks/zod-parameters.d.ts.map +1 -0
  7. package/dist/index.cjs +1 -73
  8. package/dist/index.cjs.map +1 -1
  9. package/dist/index.mjs +365 -16920
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/use-render-activity-message-BAhbpSDh.js +16200 -0
  12. package/dist/use-render-activity-message-BAhbpSDh.js.map +1 -0
  13. package/dist/use-render-activity-message-DJ6q1qHV.cjs +114 -0
  14. package/dist/use-render-activity-message-DJ6q1qHV.cjs.map +1 -0
  15. package/dist/v2/components/A2UIMessageRenderer.d.ts +14 -0
  16. package/dist/v2/components/A2UIMessageRenderer.d.ts.map +1 -1
  17. package/dist/v2/components/A2UISurfaceActivityRenderer.vue.d.ts +10 -3
  18. package/dist/v2/components/A2UISurfaceActivityRenderer.vue.d.ts.map +1 -1
  19. package/dist/v2/components/CopilotKitInspector.vue.d.ts +5 -1
  20. package/dist/v2/components/CopilotKitInspector.vue.d.ts.map +1 -1
  21. package/dist/v2/components/InlineFeatureWarning.vue.d.ts.map +1 -1
  22. package/dist/v2/components/LicenseWarningBanner.vue.d.ts +2 -2
  23. package/dist/v2/components/LicenseWarningBanner.vue.d.ts.map +1 -1
  24. package/dist/v2/components/MCPAppsActivityRenderer.d.ts.map +1 -1
  25. package/dist/v2/components/OpenGenerativeUIRenderer.d.ts +13 -59
  26. package/dist/v2/components/OpenGenerativeUIRenderer.d.ts.map +1 -1
  27. package/dist/v2/components/a2ui/A2UIBuiltInToolCallRenderer.d.ts +0 -5
  28. package/dist/v2/components/a2ui/A2UIBuiltInToolCallRenderer.d.ts.map +1 -1
  29. package/dist/v2/components/a2ui/A2UICatalogContext.d.ts +10 -15
  30. package/dist/v2/components/a2ui/A2UICatalogContext.d.ts.map +1 -1
  31. package/dist/v2/components/a2ui/A2UIRecoveryStates.d.ts +14 -130
  32. package/dist/v2/components/a2ui/A2UIRecoveryStates.d.ts.map +1 -1
  33. package/dist/v2/components/a2ui/catalog.d.ts.map +1 -1
  34. package/dist/v2/components/a2ui/utils.d.ts +3 -15
  35. package/dist/v2/components/a2ui/utils.d.ts.map +1 -1
  36. package/dist/v2/components/a2ui.d.ts +9 -8
  37. package/dist/v2/components/a2ui.d.ts.map +1 -1
  38. package/dist/v2/components/chat/CopilotChat.vue.d.ts +2 -2
  39. package/dist/v2/components/chat/CopilotChat.vue.d.ts.map +1 -1
  40. package/dist/v2/components/chat/CopilotChatAssistantMessage.vue.d.ts.map +1 -1
  41. package/dist/v2/components/chat/CopilotChatAttachmentQueue.vue.d.ts.map +1 -1
  42. package/dist/v2/components/chat/CopilotChatAttachmentRenderer.vue.d.ts.map +1 -1
  43. package/dist/v2/components/chat/CopilotChatAudioRecorder.vue.d.ts +4 -8
  44. package/dist/v2/components/chat/CopilotChatAudioRecorder.vue.d.ts.map +1 -1
  45. package/dist/v2/components/chat/CopilotChatFeedbackCommentPopover.vue.d.ts +1 -1
  46. package/dist/v2/components/chat/CopilotChatFeedbackCommentPopover.vue.d.ts.map +1 -1
  47. package/dist/v2/components/chat/CopilotChatInput.vue.d.ts +6 -270
  48. package/dist/v2/components/chat/CopilotChatInput.vue.d.ts.map +1 -1
  49. package/dist/v2/components/chat/CopilotChatInspectorButton.vue.d.ts.map +1 -1
  50. package/dist/v2/components/chat/CopilotChatLightbox.vue.d.ts.map +1 -1
  51. package/dist/v2/components/chat/CopilotChatMessageView.vue.d.ts +1 -1
  52. package/dist/v2/components/chat/CopilotChatMessageView.vue.d.ts.map +1 -1
  53. package/dist/v2/components/chat/CopilotChatReasoningMessage.vue.d.ts.map +1 -1
  54. package/dist/v2/components/chat/CopilotChatToolCallGroup.vue.d.ts +1 -1
  55. package/dist/v2/components/chat/CopilotChatToolCallGroup.vue.d.ts.map +1 -1
  56. package/dist/v2/components/chat/CopilotChatToolCallItem.vue.d.ts.map +1 -1
  57. package/dist/v2/components/chat/CopilotChatToolCallsView.vue.d.ts +1 -1
  58. package/dist/v2/components/chat/CopilotChatToolCallsView.vue.d.ts.map +1 -1
  59. package/dist/v2/components/chat/CopilotChatUserMessage.vue.d.ts.map +1 -1
  60. package/dist/v2/components/chat/CopilotChatView.vue.d.ts +3 -3
  61. package/dist/v2/components/chat/CopilotChatView.vue.d.ts.map +1 -1
  62. package/dist/v2/components/chat/CopilotChatWorkSummary.vue.d.ts.map +1 -1
  63. package/dist/v2/components/chat/CopilotModalHeader.vue.d.ts.map +1 -1
  64. package/dist/v2/components/chat/CopilotPopup.vue.d.ts +8 -3
  65. package/dist/v2/components/chat/CopilotPopup.vue.d.ts.map +1 -1
  66. package/dist/v2/components/chat/CopilotPopupView.vue.d.ts +5 -3
  67. package/dist/v2/components/chat/CopilotPopupView.vue.d.ts.map +1 -1
  68. package/dist/v2/components/chat/CopilotPopupViewInternal.vue.d.ts +5 -3
  69. package/dist/v2/components/chat/CopilotPopupViewInternal.vue.d.ts.map +1 -1
  70. package/dist/v2/components/chat/CopilotSidebar.vue.d.ts +8 -3
  71. package/dist/v2/components/chat/CopilotSidebar.vue.d.ts.map +1 -1
  72. package/dist/v2/components/chat/CopilotSidebarView.vue.d.ts +6 -4
  73. package/dist/v2/components/chat/CopilotSidebarView.vue.d.ts.map +1 -1
  74. package/dist/v2/components/chat/CopilotSidebarViewInternal.vue.d.ts +6 -4
  75. package/dist/v2/components/chat/CopilotSidebarViewInternal.vue.d.ts.map +1 -1
  76. package/dist/v2/components/chat/CopilotThreadsDrawer.vue.d.ts.map +1 -1
  77. package/dist/v2/components/chat/StreamingMarkdownDefault.vue.d.ts +1 -0
  78. package/dist/v2/components/chat/StreamingMarkdownDefault.vue.d.ts.map +1 -1
  79. package/dist/v2/components/chat/audioRecorder.d.ts +3 -4
  80. package/dist/v2/components/chat/audioRecorder.d.ts.map +1 -1
  81. package/dist/v2/components/chat/copilotChatToolCallItemRender.d.ts +3 -3
  82. package/dist/v2/components/chat/copilotChatToolCallItemRender.d.ts.map +1 -1
  83. package/dist/v2/components/chat/forwarded-slots.d.ts +12 -0
  84. package/dist/v2/components/chat/forwarded-slots.d.ts.map +1 -0
  85. package/dist/v2/components/chat/index.d.ts +34 -31
  86. package/dist/v2/components/chat/index.d.ts.map +1 -1
  87. package/dist/v2/components/chat/inspector-shortcuts.d.ts +2 -1
  88. package/dist/v2/components/chat/inspector-shortcuts.d.ts.map +1 -1
  89. package/dist/v2/components/chat/message-feedback.d.ts +18 -49
  90. package/dist/v2/components/chat/message-feedback.d.ts.map +1 -1
  91. package/dist/v2/components/chat/tool-call-display-context.d.ts +4 -19
  92. package/dist/v2/components/chat/tool-call-display-context.d.ts.map +1 -1
  93. package/dist/v2/components/chat/tool-call-group-parts.d.ts +7 -20
  94. package/dist/v2/components/chat/tool-call-group-parts.d.ts.map +1 -1
  95. package/dist/v2/components/chat/turn-work.d.ts +0 -2
  96. package/dist/v2/components/chat/turn-work.d.ts.map +1 -1
  97. package/dist/v2/components/chat/types.d.ts +9 -4
  98. package/dist/v2/components/chat/types.d.ts.map +1 -1
  99. package/dist/v2/components/chat/use-chat-labels.d.ts +8 -0
  100. package/dist/v2/components/chat/use-chat-labels.d.ts.map +1 -0
  101. package/dist/v2/components/chat/use-copy-feedback.d.ts +11 -0
  102. package/dist/v2/components/chat/use-copy-feedback.d.ts.map +1 -0
  103. package/dist/v2/components/chat/use-lightbox.d.ts.map +1 -1
  104. package/dist/v2/components/icons/index.d.ts +968 -1
  105. package/dist/v2/components/icons/index.d.ts.map +1 -1
  106. package/dist/v2/components/ui/CopilotDropdownMenuContent.vue.d.ts +1 -1
  107. package/dist/v2/components/ui/CopilotDropdownMenuContent.vue.d.ts.map +1 -1
  108. package/dist/v2/hooks/use-agent-context.d.ts +2 -3
  109. package/dist/v2/hooks/use-agent-context.d.ts.map +1 -1
  110. package/dist/v2/hooks/use-agent.d.ts +4 -1
  111. package/dist/v2/hooks/use-agent.d.ts.map +1 -1
  112. package/dist/v2/hooks/use-attachments.d.ts +7 -0
  113. package/dist/v2/hooks/use-attachments.d.ts.map +1 -1
  114. package/dist/v2/hooks/use-capabilities.d.ts.map +1 -1
  115. package/dist/v2/hooks/use-component.d.ts +1 -0
  116. package/dist/v2/hooks/use-component.d.ts.map +1 -1
  117. package/dist/v2/hooks/use-configure-suggestions.d.ts +4 -9
  118. package/dist/v2/hooks/use-configure-suggestions.d.ts.map +1 -1
  119. package/dist/v2/hooks/use-default-render-tool.d.ts.map +1 -1
  120. package/dist/v2/hooks/use-frontend-tool.d.ts +5 -0
  121. package/dist/v2/hooks/use-frontend-tool.d.ts.map +1 -1
  122. package/dist/v2/hooks/use-human-in-the-loop.d.ts +2 -1
  123. package/dist/v2/hooks/use-human-in-the-loop.d.ts.map +1 -1
  124. package/dist/v2/hooks/use-interrupt.d.ts +0 -1
  125. package/dist/v2/hooks/use-interrupt.d.ts.map +1 -1
  126. package/dist/v2/hooks/use-keyboard-height.d.ts +1 -1
  127. package/dist/v2/hooks/use-keyboard-height.d.ts.map +1 -1
  128. package/dist/v2/hooks/use-pin-to-send.d.ts +4 -12
  129. package/dist/v2/hooks/use-pin-to-send.d.ts.map +1 -1
  130. package/dist/v2/hooks/use-render-activity-message.d.ts +13 -9
  131. package/dist/v2/hooks/use-render-activity-message.d.ts.map +1 -1
  132. package/dist/v2/hooks/use-render-custom-messages.d.ts +5 -7
  133. package/dist/v2/hooks/use-render-custom-messages.d.ts.map +1 -1
  134. package/dist/v2/hooks/use-suggestions.d.ts.map +1 -1
  135. package/dist/v2/hooks/use-threads.d.ts +0 -8
  136. package/dist/v2/hooks/use-threads.d.ts.map +1 -1
  137. package/dist/v2/index.cjs +1 -1
  138. package/dist/v2/index.mjs +197 -200
  139. package/dist/v2/index.mjs.map +1 -1
  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/shallow-stable.d.ts.map +1 -1
  143. package/dist/v2/lib/vue-core.d.ts +12 -12
  144. package/dist/v2/lib/vue-core.d.ts.map +1 -1
  145. package/dist/v2/providers/CopilotChatConfigurationProvider.vue.d.ts.map +1 -1
  146. package/dist/v2/providers/CopilotKitProvider.types.d.ts +9 -129
  147. package/dist/v2/providers/CopilotKitProvider.types.d.ts.map +1 -1
  148. package/dist/v2/providers/CopilotKitProvider.vue.d.ts +9 -10
  149. package/dist/v2/providers/CopilotKitProvider.vue.d.ts.map +1 -1
  150. package/dist/v2/providers/chat-configuration-store-key.d.ts +8 -0
  151. package/dist/v2/providers/chat-configuration-store-key.d.ts.map +1 -0
  152. package/dist/v2/providers/markdown-renderer.d.ts +4 -2
  153. package/dist/v2/providers/markdown-renderer.d.ts.map +1 -1
  154. package/dist/v2/providers/types.d.ts +3 -46
  155. package/dist/v2/providers/types.d.ts.map +1 -1
  156. package/dist/v2/providers/use-inspector-thread-override.d.ts +5 -0
  157. package/dist/v2/providers/use-inspector-thread-override.d.ts.map +1 -1
  158. package/dist/v2/types/human-in-the-loop.d.ts +8 -29
  159. package/dist/v2/types/human-in-the-loop.d.ts.map +1 -1
  160. package/dist/v2/types/interrupt.d.ts +1 -22
  161. package/dist/v2/types/interrupt.d.ts.map +1 -1
  162. package/dist/v2/types/vue-activity-message-renderer.d.ts +16 -15
  163. package/dist/v2/types/vue-activity-message-renderer.d.ts.map +1 -1
  164. package/dist/v2/types/vue-custom-message-renderer.d.ts +7 -16
  165. package/dist/v2/types/vue-custom-message-renderer.d.ts.map +1 -1
  166. package/dist/v2/types/vue-tool-call-renderer.d.ts +16 -35
  167. package/dist/v2/types/vue-tool-call-renderer.d.ts.map +1 -1
  168. package/package.json +10 -11
  169. package/src/__tests__/build-entries.test.ts +27 -0
  170. package/src/hooks/__tests__/zod-parameters.test.ts +520 -0
  171. package/src/hooks/use-copilot-action.ts +2 -1
  172. package/src/hooks/use-frontend-tool.ts +3 -6
  173. package/src/hooks/zod-parameters.ts +162 -0
  174. package/src/v2/__tests__/exports.test.ts +10 -0
  175. package/src/v2/__tests__/mocks/web-inspector.ts +6 -0
  176. package/src/v2/__tests__/utils/test-helpers.ts +34 -4
  177. package/src/v2/components/A2UIMessageRenderer.ts +98 -68
  178. package/src/v2/components/A2UISurfaceActivityRenderer.vue +68 -103
  179. package/src/v2/components/CopilotKitInspector.vue +104 -51
  180. package/src/v2/components/InlineFeatureWarning.vue +20 -21
  181. package/src/v2/components/LicenseWarningBanner.vue +27 -135
  182. package/src/v2/components/MCPAppsActivityRenderer.ts +75 -201
  183. package/src/v2/components/OpenGenerativeUIRenderer.ts +122 -446
  184. package/src/v2/components/__tests__/A2UIMessageRenderer.test.ts +171 -8
  185. package/src/v2/components/__tests__/CopilotKitInspector.test.ts +42 -0
  186. package/src/v2/components/__tests__/LicenseWarningBanner.test.ts +60 -0
  187. package/src/v2/components/__tests__/OpenGenerativeUIRenderer.test.ts +64 -8
  188. package/src/v2/components/__tests__/OpenGenerativeUIToolRenderer.test.ts +38 -0
  189. package/src/v2/components/a2ui/A2UIBuiltInToolCallRenderer.ts +2 -7
  190. package/src/v2/components/a2ui/A2UICatalogContext.ts +27 -185
  191. package/src/v2/components/a2ui/A2UIRecoveryStates.ts +127 -327
  192. package/src/v2/components/a2ui/catalog.ts +3 -3
  193. package/src/v2/components/a2ui/utils.ts +13 -65
  194. package/src/v2/components/a2ui.ts +15 -22
  195. package/src/v2/components/chat/CopilotChat.vue +147 -356
  196. package/src/v2/components/chat/CopilotChatAssistantMessage.vue +19 -43
  197. package/src/v2/components/chat/CopilotChatAttachmentQueue.vue +36 -55
  198. package/src/v2/components/chat/CopilotChatAttachmentRenderer.vue +14 -6
  199. package/src/v2/components/chat/CopilotChatAudioRecorder.vue +19 -246
  200. package/src/v2/components/chat/CopilotChatFeedbackCommentPopover.vue +2 -2
  201. package/src/v2/components/chat/CopilotChatInput.vue +108 -436
  202. package/src/v2/components/chat/CopilotChatInspectorButton.vue +45 -108
  203. package/src/v2/components/chat/CopilotChatLightbox.vue +10 -31
  204. package/src/v2/components/chat/CopilotChatMessageView.vue +82 -210
  205. package/src/v2/components/chat/CopilotChatReasoningMessage.vue +7 -15
  206. package/src/v2/components/chat/CopilotChatToolCallGroup.vue +63 -71
  207. package/src/v2/components/chat/CopilotChatToolCallItem.vue +8 -6
  208. package/src/v2/components/chat/CopilotChatToolCallsView.vue +31 -32
  209. package/src/v2/components/chat/CopilotChatUserMessage.vue +24 -112
  210. package/src/v2/components/chat/CopilotChatView.vue +33 -28
  211. package/src/v2/components/chat/CopilotChatWorkSummary.vue +26 -36
  212. package/src/v2/components/chat/CopilotModalHeader.vue +11 -23
  213. package/src/v2/components/chat/CopilotPopup.vue +23 -25
  214. package/src/v2/components/chat/CopilotPopupView.vue +10 -39
  215. package/src/v2/components/chat/CopilotPopupViewInternal.vue +35 -131
  216. package/src/v2/components/chat/CopilotSidebar.vue +23 -25
  217. package/src/v2/components/chat/CopilotSidebarView.vue +10 -39
  218. package/src/v2/components/chat/CopilotSidebarViewInternal.vue +38 -59
  219. package/src/v2/components/chat/CopilotThreadsDrawer.vue +37 -102
  220. package/src/v2/components/chat/StreamingMarkdownDefault.vue +15 -28
  221. package/src/v2/components/chat/__tests__/CopilotChat.labels.test.ts +19 -4
  222. package/src/v2/components/chat/__tests__/CopilotChat.test.ts +12 -10
  223. package/src/v2/components/chat/__tests__/CopilotChatActivityRendering.e2e.test.ts +26 -9
  224. package/src/v2/components/chat/__tests__/CopilotChatAssistantMessage.learningFeedback.test.ts +5 -5
  225. package/src/v2/components/chat/__tests__/CopilotChatAttachmentQueue.test.ts +28 -0
  226. package/src/v2/components/chat/__tests__/CopilotChatInput.test.ts +89 -1
  227. package/src/v2/components/chat/__tests__/CopilotChatMessageView.test.ts +247 -403
  228. package/src/v2/components/chat/__tests__/CopilotChatMessageView.toolCallDisplay.test.ts +1 -99
  229. package/src/v2/components/chat/__tests__/CopilotPopup.test.ts +90 -1
  230. package/src/v2/components/chat/__tests__/CopilotPopupView.test.ts +19 -0
  231. package/src/v2/components/chat/__tests__/CopilotSidebar.test.ts +90 -1
  232. package/src/v2/components/chat/__tests__/CopilotSidebarView.position.test.ts +32 -8
  233. package/src/v2/components/chat/__tests__/CopilotSidebarView.test.ts +2 -1
  234. package/src/v2/components/chat/__tests__/StreamingMarkdownDefault.test.ts +54 -0
  235. package/src/v2/components/chat/audioRecorder.ts +4 -7
  236. package/src/v2/components/chat/copilotChatToolCallItemRender.ts +24 -89
  237. package/src/v2/components/chat/forwarded-slots.ts +17 -0
  238. package/src/v2/components/chat/index.ts +0 -1
  239. package/src/v2/components/chat/inspector-shortcuts.ts +10 -16
  240. package/src/v2/components/chat/message-feedback.ts +62 -197
  241. package/src/v2/components/chat/tool-call-display-context.ts +6 -22
  242. package/src/v2/components/chat/tool-call-group-parts.ts +47 -108
  243. package/src/v2/components/chat/turn-work.ts +0 -9
  244. package/src/v2/components/chat/types.ts +12 -4
  245. package/src/v2/components/chat/use-chat-labels.ts +16 -0
  246. package/src/v2/components/chat/use-copy-feedback.ts +21 -0
  247. package/src/v2/components/chat/use-lightbox.ts +15 -33
  248. package/src/v2/components/icons/__tests__/icons.test.ts +72 -68
  249. package/src/v2/components/icons/index.ts +109 -27
  250. package/src/v2/hooks/__tests__/use-agent-error-state.test.ts +5 -3
  251. package/src/v2/hooks/__tests__/use-agent-stability.test.ts +25 -4
  252. package/src/v2/hooks/__tests__/use-agent-throttle.test.ts +5 -1
  253. package/src/v2/hooks/__tests__/use-agent.test.ts +6 -3
  254. package/src/v2/hooks/__tests__/use-component.test.ts +21 -0
  255. package/src/v2/hooks/__tests__/use-configure-suggestions.test.ts +30 -1
  256. package/src/v2/hooks/__tests__/use-default-render-tool.test.ts +10 -10
  257. package/src/v2/hooks/__tests__/use-frontend-tool.e2e.test.ts +66 -1
  258. package/src/v2/hooks/__tests__/use-human-in-the-loop.e2e.test.ts +6 -1
  259. package/src/v2/hooks/__tests__/use-human-in-the-loop.test.ts +187 -12
  260. package/src/v2/hooks/__tests__/use-interrupt.test.ts +97 -0
  261. package/src/v2/hooks/__tests__/use-render-activity-message.test.ts +106 -0
  262. package/src/v2/hooks/__tests__/use-render-tool.test.ts +3 -6
  263. package/src/v2/hooks/__tests__/use-threads.test.ts +48 -6
  264. package/src/v2/hooks/__tests__/zod-regression.test.ts +5 -4
  265. package/src/v2/hooks/use-agent-context.ts +4 -10
  266. package/src/v2/hooks/use-agent.ts +86 -290
  267. package/src/v2/hooks/use-attachments.ts +48 -168
  268. package/src/v2/hooks/use-capabilities.ts +2 -7
  269. package/src/v2/hooks/use-component.ts +7 -4
  270. package/src/v2/hooks/use-configure-suggestions.ts +28 -218
  271. package/src/v2/hooks/use-default-render-tool.ts +34 -94
  272. package/src/v2/hooks/use-frontend-tool.ts +10 -10
  273. package/src/v2/hooks/use-human-in-the-loop.ts +11 -80
  274. package/src/v2/hooks/use-interrupt.ts +29 -308
  275. package/src/v2/hooks/use-keyboard-height.ts +17 -40
  276. package/src/v2/hooks/use-pin-to-send.ts +15 -99
  277. package/src/v2/hooks/use-render-activity-message.ts +31 -55
  278. package/src/v2/hooks/use-render-custom-messages.ts +24 -88
  279. package/src/v2/hooks/use-suggestions.ts +9 -33
  280. package/src/v2/hooks/use-threads.ts +43 -273
  281. package/src/v2/lib/__tests__/shallow-stable.test.ts +54 -0
  282. package/src/v2/lib/__tests__/vue-core-renderers.test.ts +42 -0
  283. package/src/v2/lib/processPartialHtml.ts +6 -21
  284. package/src/v2/lib/shallow-stable.ts +2 -16
  285. package/src/v2/lib/vue-core.ts +69 -78
  286. package/src/v2/providers/CopilotChatConfigurationProvider.vue +48 -186
  287. package/src/v2/providers/CopilotKitProvider.types.ts +12 -132
  288. package/src/v2/providers/CopilotKitProvider.vue +237 -510
  289. package/src/v2/providers/__tests__/CopilotChatConfigurationProvider.test.ts +22 -2
  290. package/src/v2/providers/__tests__/CopilotKitProvider.a2ui.test.ts +20 -2
  291. package/src/v2/providers/__tests__/CopilotKitProvider.config.test.ts +124 -0
  292. package/src/v2/providers/__tests__/CopilotKitProvider.headersAtSendTime.test.ts +3 -3
  293. package/src/v2/providers/__tests__/CopilotKitProvider.learning.test.ts +3 -1
  294. package/src/v2/providers/__tests__/CopilotKitProvider.sandboxFunctions.test.ts +4 -1
  295. package/src/v2/providers/__tests__/CopilotKitProvider.test.ts +53 -26
  296. package/src/v2/providers/chat-configuration-store-key.ts +9 -0
  297. package/src/v2/providers/markdown-renderer.ts +8 -2
  298. package/src/v2/providers/types.ts +3 -49
  299. package/src/v2/providers/use-inspector-thread-override.ts +22 -80
  300. package/src/v2/types/__tests__/defineToolCallRenderer.test.ts +28 -33
  301. package/src/v2/types/defineToolCallRenderer.ts +5 -4
  302. package/src/v2/types/human-in-the-loop.ts +8 -32
  303. package/src/v2/types/interrupt.ts +7 -31
  304. package/src/v2/types/vue-activity-message-renderer.ts +24 -15
  305. package/src/v2/types/vue-custom-message-renderer.ts +12 -16
  306. package/src/v2/types/vue-tool-call-renderer.ts +23 -38
  307. package/tsconfig.json +0 -1
  308. package/vite.config.ts +8 -5
  309. package/vitest.config.ts +12 -7
  310. package/dist/v2/components/chat/BasicMarkdown.vue.d.ts +0 -9
  311. package/dist/v2/components/chat/BasicMarkdown.vue.d.ts.map +0 -1
  312. package/dist/v2/components/chat/normalize-auto-scroll.d.ts +0 -3
  313. package/dist/v2/components/chat/normalize-auto-scroll.d.ts.map +0 -1
  314. package/dist/v2/components/chat/tool-call-layout.d.ts +0 -115
  315. package/dist/v2/components/chat/tool-call-layout.d.ts.map +0 -1
  316. package/dist/v2/lib/is-mobile-viewport.d.ts +0 -15
  317. package/dist/v2/lib/is-mobile-viewport.d.ts.map +0 -1
  318. package/dist/v2/lib/message-feedback.d.ts +0 -33
  319. package/dist/v2/lib/message-feedback.d.ts.map +0 -1
  320. package/dist/v2/lib/transcription-client.d.ts +0 -19
  321. package/dist/v2/lib/transcription-client.d.ts.map +0 -1
  322. package/src/v2/components/__tests__/A2UICatalogContext.test.ts +0 -63
  323. package/src/v2/components/a2ui/__tests__/A2UIRecoveryStates.test.ts +0 -175
  324. package/src/v2/components/chat/BasicMarkdown.vue +0 -160
  325. package/src/v2/components/chat/__tests__/BasicMarkdown.test.ts +0 -69
  326. package/src/v2/components/chat/__tests__/normalize-auto-scroll.test.ts +0 -39
  327. package/src/v2/components/chat/normalize-auto-scroll.ts +0 -17
  328. package/src/v2/components/chat/tool-call-layout.ts +0 -304
  329. package/src/v2/lib/__tests__/is-mobile-viewport.test.ts +0 -48
  330. package/src/v2/lib/__tests__/message-feedback.test.ts +0 -152
  331. package/src/v2/lib/__tests__/processPartialHtml.test.ts +0 -84
  332. package/src/v2/lib/__tests__/transcription-client.test.ts +0 -67
  333. package/src/v2/lib/is-mobile-viewport.ts +0 -23
  334. package/src/v2/lib/message-feedback.ts +0 -120
  335. package/src/v2/lib/transcription-client.ts +0 -151
@@ -1,19 +1,15 @@
1
1
  import { computed } from "vue";
2
2
  import type { Component } from "vue";
3
3
  import type { ActivityMessage } from "@ag-ui/core";
4
- import type { AbstractAgent } from "@ag-ui/client";
4
+ import {
5
+ ɵdescribeActivityRendererFailure,
6
+ ɵfindActivityRenderer,
7
+ ɵmatchActivityRenderer,
8
+ } from "@copilotkit/core";
5
9
  import { DEFAULT_AGENT_ID } from "@copilotkit/shared";
6
10
  import { useCopilotKit } from "../providers/useCopilotKit";
7
11
  import { useCopilotChatConfiguration } from "../providers/useCopilotChatConfiguration";
8
- import type {
9
- VueActivityMessageRenderer,
10
- VueActivityMessageRendererProps,
11
- } from "../types";
12
-
13
- interface ActivityRendererResult {
14
- renderer: Component<VueActivityMessageRendererProps<unknown>>;
15
- props: VueActivityMessageRendererProps<unknown>;
16
- }
12
+ import type { VueActivityMessageRendererProps } from "../types";
17
13
 
18
14
  /**
19
15
  * Returns helpers for rendering activity messages.
@@ -21,70 +17,50 @@ interface ActivityRendererResult {
21
17
  * Matches the React `useRenderActivityMessage` API: `findRenderer` locates a
22
18
  * registered renderer by activity type (preferring agent-scoped over global,
23
19
  * with `"*"` as a wildcard fallback), and `renderActivityMessage` resolves the
24
- * renderer and validates the content schema.
20
+ * renderer and validates the content with the renderer's `content` schema
21
+ * (any Standard Schema, such as zod).
25
22
  */
26
23
  export function useRenderActivityMessage() {
27
24
  const { copilotkit } = useCopilotKit();
28
25
  const config = useCopilotChatConfiguration();
29
26
  const agentId = computed(() => config.value?.agentId ?? DEFAULT_AGENT_ID);
30
27
 
31
- const renderers = computed(() => [
32
- ...copilotkit.value.renderActivityMessages,
33
- ]);
34
-
35
- function findRenderer(
36
- activityType: string,
37
- ): VueActivityMessageRenderer<unknown> | null {
38
- const list = renderers.value;
39
- if (!list.length) {
40
- return null;
41
- }
42
-
43
- const matches = list.filter(
44
- (renderer) => renderer.activityType === activityType,
45
- );
46
-
47
- return (
48
- matches.find((candidate) => candidate.agentId === agentId.value) ??
49
- matches.find((candidate) => candidate.agentId === undefined) ??
50
- list.find((candidate) => candidate.activityType === "*") ??
51
- null
52
- );
28
+ function findRenderer(activityType: string) {
29
+ return ɵfindActivityRenderer(copilotkit.value.renderActivityMessages, {
30
+ activityType,
31
+ agentId: agentId.value,
32
+ });
53
33
  }
54
34
 
55
- function renderActivityMessage(
56
- message: ActivityMessage,
57
- ): ActivityRendererResult | null {
58
- const renderer = findRenderer(message.activityType);
59
-
60
- if (!renderer) {
61
- return null;
62
- }
63
-
64
- const parseResult = renderer.content.safeParse(message.content);
35
+ function renderActivityMessage(message: ActivityMessage) {
36
+ const match = ɵmatchActivityRenderer(
37
+ copilotkit.value.renderActivityMessages,
38
+ {
39
+ activityType: message.activityType,
40
+ agentId: agentId.value,
41
+ content: message.content,
42
+ },
43
+ );
65
44
 
66
- if (!parseResult.success) {
67
- console.warn(
68
- `Failed to parse content for activity message ` +
69
- `'${message.activityType}':`,
70
- parseResult.error,
45
+ if (!match.ok) {
46
+ // Explain why a message that has a renderer drew nothing.
47
+ const warning = ɵdescribeActivityRendererFailure(
48
+ message.activityType,
49
+ match,
71
50
  );
51
+ if (warning) console.warn(warning.message, ...warning.details);
72
52
  return null;
73
53
  }
74
54
 
75
- const agent: AbstractAgent | undefined = copilotkit.value.getAgent(
76
- agentId.value,
77
- );
78
-
79
55
  return {
80
- renderer: renderer.render as Component<
56
+ renderer: match.renderer.render as Component<
81
57
  VueActivityMessageRendererProps<unknown>
82
58
  >,
83
59
  props: {
84
60
  activityType: message.activityType,
85
- content: parseResult.data,
61
+ content: match.content,
86
62
  message,
87
- agent,
63
+ agent: copilotkit.value.getAgent(agentId.value),
88
64
  },
89
65
  };
90
66
  }
@@ -1,6 +1,8 @@
1
- import type { Component, VNodeChild } from "vue";
2
1
  import type { Message } from "@ag-ui/core";
3
- import { DEFAULT_AGENT_ID } from "@copilotkit/shared";
2
+ import {
3
+ ɵgetCustomMessageRenderProps,
4
+ ɵresolveCustomMessageRenderContext,
5
+ } from "@copilotkit/core";
4
6
  import { useCopilotKit } from "../providers/useCopilotKit";
5
7
  import { useCopilotChatConfiguration } from "../providers/useCopilotChatConfiguration";
6
8
  import type {
@@ -13,13 +15,6 @@ interface UseRenderCustomMessagesParams {
13
15
  position: VueCustomMessageRendererPosition;
14
16
  }
15
17
 
16
- interface CustomMessageRendererResult {
17
- renderer:
18
- | Component<VueCustomMessageRendererProps>
19
- | ((props: VueCustomMessageRendererProps) => VNodeChild);
20
- props: VueCustomMessageRendererProps;
21
- }
22
-
23
18
  /**
24
19
  * Returns a function that resolves the appropriate custom message renderer for
25
20
  * a given message and position.
@@ -37,93 +32,34 @@ export function useRenderCustomMessages() {
37
32
  const { copilotkit } = useCopilotKit();
38
33
  const config = useCopilotChatConfiguration();
39
34
 
40
- return function renderCustomMessage(
41
- params: UseRenderCustomMessagesParams,
42
- ): CustomMessageRendererResult | null {
35
+ return function renderCustomMessage(params: UseRenderCustomMessagesParams) {
43
36
  const configValue = config.value;
44
37
  if (!configValue) return null;
45
38
 
46
- const agentId = configValue.agentId || DEFAULT_AGENT_ID;
47
- const { threadId } = configValue;
48
39
  const core = copilotkit.value;
40
+ const { agentId, renderers } = ɵresolveCustomMessageRenderContext(
41
+ core.renderCustomMessages,
42
+ configValue.agentId,
43
+ );
44
+ // Agent-scoped renderers come first. Use the first one that has a
45
+ // render function.
46
+ const selected = renderers.find((candidate) => candidate.render);
47
+ if (!selected) return null;
49
48
 
50
- const customMessageRenderers = [...core.renderCustomMessages]
51
- .filter(
52
- (renderer) =>
53
- renderer.agentId === undefined || renderer.agentId === agentId,
54
- )
55
- .sort((a, b) => {
56
- const aHasAgent = a.agentId !== undefined;
57
- const bHasAgent = b.agentId !== undefined;
58
- if (aHasAgent === bHasAgent) return 0;
59
- return aHasAgent ? -1 : 1;
60
- });
61
-
62
- if (!customMessageRenderers.length) {
63
- return null;
64
- }
65
-
66
- const { message, position } = params;
67
- const resolvedRunId =
68
- core.getRunIdForMessage(agentId, threadId, message.id) ??
69
- core.getRunIdsForThread(agentId, threadId).slice(-1)[0];
70
- const runId = resolvedRunId ?? `missing-run-id:${message.id}`;
71
49
  const agent = core.getAgent(agentId);
72
- if (!agent) {
73
- return null;
74
- }
75
-
76
- const messagesIdsInRun = resolvedRunId
77
- ? agent.messages
78
- .filter(
79
- (msg) =>
80
- core.getRunIdForMessage(agentId, threadId, msg.id) ===
81
- resolvedRunId,
82
- )
83
- .map((msg) => msg.id)
84
- : [message.id];
50
+ if (!agent) return null;
85
51
 
86
- const rawMessageIndex = agent.messages.findIndex(
87
- (msg) => msg.id === message.id,
52
+ const props: VueCustomMessageRendererProps = ɵgetCustomMessageRenderProps(
53
+ core,
54
+ {
55
+ agentId,
56
+ threadId: configValue.threadId,
57
+ agent,
58
+ message: params.message,
59
+ position: params.position,
60
+ },
88
61
  );
89
- if (rawMessageIndex < 0) {
90
- console.warn(
91
- `[CopilotKit] useRenderCustomMessages: message "${message.id}" ` +
92
- `not found in agent "${agentId}" messages`,
93
- );
94
- }
95
- const messageIndex = Math.max(0, rawMessageIndex);
96
- const messageIndexInRun = resolvedRunId
97
- ? Math.max(messagesIdsInRun.indexOf(message.id), 0)
98
- : 0;
99
- const numberOfMessagesInRun = resolvedRunId ? messagesIdsInRun.length : 1;
100
- const stateSnapshot = resolvedRunId
101
- ? core.getStateByRun(agentId, threadId, resolvedRunId)
102
- : undefined;
103
-
104
- const props: CustomMessageRendererResult["props"] = {
105
- message,
106
- position,
107
- runId,
108
- messageIndex,
109
- messageIndexInRun,
110
- numberOfMessagesInRun,
111
- agentId,
112
- stateSnapshot,
113
- };
114
-
115
- // Iterate renderers like React: try each one and use the first that
116
- // returns a non-null render function.
117
- for (const candidate of customMessageRenderers) {
118
- if (!candidate.render) {
119
- continue;
120
- }
121
- return {
122
- renderer: candidate.render as CustomMessageRendererResult["renderer"],
123
- props,
124
- };
125
- }
126
62
 
127
- return null;
63
+ return { renderer: selected.render, props };
128
64
  };
129
65
  }
@@ -1,6 +1,10 @@
1
1
  import { computed, ref, toValue, watch } from "vue";
2
2
  import type { MaybeRefOrGetter, Ref } from "vue";
3
- import type { Suggestion } from "@copilotkit/core";
3
+ import { ɵsubscribeToAgentSuggestions } from "@copilotkit/core";
4
+ import type {
5
+ CopilotKitCoreGetSuggestionsResult,
6
+ Suggestion,
7
+ } from "@copilotkit/core";
4
8
  import { useCopilotKit } from "../providers/useCopilotKit";
5
9
  import { useCopilotChatConfiguration } from "../providers/useCopilotChatConfiguration";
6
10
  import { DEFAULT_AGENT_ID } from "@copilotkit/shared";
@@ -40,44 +44,16 @@ export function useSuggestions(
40
44
 
41
45
  const suggestions = ref<Suggestion[]>([]);
42
46
  const isLoading = ref(false);
43
-
44
- const initState = () => {
45
- const result = copilotkit.value.getSuggestions(resolvedAgentId.value);
47
+ const apply = (result: CopilotKitCoreGetSuggestionsResult) => {
46
48
  suggestions.value = result.suggestions;
47
49
  isLoading.value = result.isLoading;
48
50
  };
49
51
 
50
- watch([() => copilotkit.value, resolvedAgentId], () => initState(), {
51
- immediate: true,
52
- });
53
-
54
52
  watch(
55
53
  [() => copilotkit.value, resolvedAgentId],
56
- (_newValues, _old, onCleanup) => {
57
- const core = copilotkit.value;
58
- const agentId = resolvedAgentId.value;
59
- const sub = core.subscribe({
60
- onSuggestionsChanged: ({ agentId: changedAgentId, suggestions: s }) => {
61
- if (changedAgentId !== agentId) return;
62
- suggestions.value = s;
63
- const result = core.getSuggestions(agentId);
64
- isLoading.value = result.isLoading;
65
- },
66
- onSuggestionsStartedLoading: ({ agentId: changedAgentId }) => {
67
- if (changedAgentId !== agentId) return;
68
- isLoading.value = true;
69
- },
70
- onSuggestionsFinishedLoading: ({ agentId: changedAgentId }) => {
71
- if (changedAgentId !== agentId) return;
72
- isLoading.value = false;
73
- },
74
- onSuggestionsConfigChanged: () => {
75
- const result = core.getSuggestions(agentId);
76
- suggestions.value = result.suggestions;
77
- isLoading.value = result.isLoading;
78
- },
79
- });
80
- onCleanup(() => sub.unsubscribe());
54
+ ([core, agentId], _old, onCleanup) => {
55
+ apply(core.getSuggestions(agentId));
56
+ onCleanup(ɵsubscribeToAgentSuggestions(core, agentId, apply));
81
57
  },
82
58
  { immediate: true },
83
59
  );
@@ -1,17 +1,6 @@
1
- import { computed, onScopeDispose, ref, toValue, watch } from "vue";
1
+ import { computed, onScopeDispose, shallowRef, toValue, watch } from "vue";
2
2
  import type { MaybeRefOrGetter, Ref } from "vue";
3
- import {
4
- CopilotKitCoreRuntimeConnectionStatus,
5
- ɵcreateThreadStore,
6
- ɵselectHasNextPage,
7
- ɵselectIsFetchingNextPage,
8
- ɵselectIsMutating,
9
- ɵselectThreads,
10
- ɵselectThreadsError,
11
- ɵselectFetchMoreError,
12
- ɵselectThreadsIsLoading,
13
- } from "@copilotkit/core";
14
- import type { ɵThreadRuntimeContext, ɵThreadStore } from "@copilotkit/core";
3
+ import { ɵThreadsController, ɵcreateThreadStore } from "@copilotkit/core";
15
4
  import { useCopilotKit } from "../providers/useCopilotKit";
16
5
 
17
6
  export interface Thread {
@@ -67,283 +56,64 @@ export interface UseThreadsResult {
67
56
  deleteThread: (threadId: string) => Promise<void>;
68
57
  }
69
58
 
70
- function bindThreadStoreSelector<T>(
71
- store: ɵThreadStore,
72
- selector: (state: ReturnType<ɵThreadStore["getState"]>) => T,
73
- target: Ref<T>,
74
- ): void {
75
- target.value = selector(store.getState());
76
- const subscription = store.select(selector).subscribe(() => {
77
- target.value = selector(store.getState());
78
- });
79
- onScopeDispose(() => subscription.unsubscribe());
80
- }
81
-
82
- /**
83
- * Vue composable for listing and managing CopilotKit Intelligence threads.
84
- *
85
- * The hook fetches threads for the runtime-authenticated user and the given
86
- * `agentId`, then keeps the result in sync via the core thread store's realtime
87
- * channel when available. Inputs accept refs/computeds to make thread context
88
- * changes reactive.
89
- */
90
59
  export function useThreads(input: UseThreadsInput): UseThreadsResult {
91
60
  const { copilotkit } = useCopilotKit();
92
- const store = ɵcreateThreadStore({
93
- fetch: copilotkit.value.ɵruntimeFetch,
61
+ const readInput = () => ({
62
+ core: copilotkit.value,
63
+ agentId: toValue(input.agentId),
64
+ includeArchived: toValue(input.includeArchived),
65
+ limit: toValue(input.limit),
66
+ enabled: toValue(input.enabled) ?? true,
94
67
  });
95
68
 
96
- const resolvedAgentId = computed(() => toValue(input.agentId));
97
- const resolvedIncludeArchived = computed(() =>
98
- toValue(input.includeArchived),
99
- );
100
- const resolvedLimit = computed(() => toValue(input.limit));
101
- const resolvedEnabled = computed(() => toValue(input.enabled) ?? true);
102
-
103
- // Thread-endpoint capability, derived from the runtime's `/info` payload.
104
- // `threadEndpoints` is `undefined` on legacy runtimes that don't advertise
105
- // the capability, so we treat "not explicitly false" as supported (matching
106
- // React's `!== false` semantics) to preserve legacy thread behavior.
107
- const threadListEndpointSupported = computed(
108
- () => copilotkit.value.threadEndpoints?.list !== false,
109
- );
110
- const threadMutationsSupported = computed(
111
- () => copilotkit.value.threadEndpoints?.mutations !== false,
112
- );
113
- // Connected, but the runtime explicitly does not serve the list endpoint.
114
- const threadEndpointsUnavailable = computed(
115
- () =>
116
- !!copilotkit.value.runtimeUrl &&
117
- copilotkit.value.runtimeConnectionStatus ===
118
- CopilotKitCoreRuntimeConnectionStatus.Connected &&
119
- !threadListEndpointSupported.value,
120
- );
121
- const threadEndpointsError = computed<Error | null>(() =>
122
- threadEndpointsUnavailable.value
123
- ? new Error(
124
- "Thread endpoints are not available on this CopilotKit runtime",
125
- )
126
- : null,
127
- );
128
- const threadMutationsError = computed<Error | null>(() =>
129
- threadMutationsSupported.value
130
- ? null
131
- : new Error(
132
- "Thread mutations are not available on this CopilotKit runtime",
133
- ),
69
+ // Core's ɵThreadsController owns the view model: thread projection, the
70
+ // configuration errors, the gated and de-duplicated context dispatch, the
71
+ // registry claim and the mutation guard. This composable feeds it and
72
+ // projects its snapshot.
73
+ const controller = new ɵThreadsController(
74
+ ɵcreateThreadStore({ fetch: copilotkit.value.ɵruntimeFetch }),
75
+ readInput(),
134
76
  );
135
-
136
- // Keyed on the source's generation, not on header VALUES: a builder's
137
- // returned token can change on every resolution without a new source ever
138
- // being set, and this must not re-dispatch the thread context on that (see
139
- // #1937).
140
- const headersKey = computed(() => copilotkit.value.ɵheadersGeneration);
141
-
142
- const threads = ref<Thread[]>([]);
143
- const storeIsLoading = ref(false);
144
- const storeError = ref<Error | null>(null);
145
- const fetchMoreError = ref<Error | null>(null);
146
- const hasMoreThreads = ref(false);
147
- const isFetchingMoreThreads = ref(false);
148
- const isMutating = ref(false);
149
-
150
- bindThreadStoreSelector(store, ɵselectThreads, threads as Ref<Thread[]>);
151
- bindThreadStoreSelector(store, ɵselectThreadsIsLoading, storeIsLoading);
152
- bindThreadStoreSelector(store, ɵselectThreadsError, storeError);
153
- bindThreadStoreSelector(store, ɵselectFetchMoreError, fetchMoreError);
154
- bindThreadStoreSelector(store, ɵselectHasNextPage, hasMoreThreads);
155
- bindThreadStoreSelector(
156
- store,
157
- ɵselectIsFetchingNextPage,
158
- isFetchingMoreThreads,
159
- );
160
- bindThreadStoreSelector(store, ɵselectIsMutating, isMutating);
161
-
162
- store.start();
77
+ const snapshot = shallowRef(controller.getSnapshot());
78
+ const unsubscribe = controller.subscribe(() => {
79
+ snapshot.value = controller.getSnapshot();
80
+ });
81
+ const stop = controller.start();
163
82
  onScopeDispose(() => {
164
- store.stop();
83
+ stop();
84
+ unsubscribe();
85
+ controller.dispose();
165
86
  });
166
87
 
167
- // Register this store in core's single-slot thread-store registry so other
168
- // surfaces (e.g. the chat view) can resolve the same store for the agent.
169
- //
170
- // Gated on `resolvedEnabled`: a disabled (e.g. unlicensed) drawer must not
171
- // claim the agentId slot. The registry is single-slot/last-writer-wins, so
172
- // registering an inert store would evict — and on unmount tear down — a
173
- // co-mounted live store for the same agent. Staying unregistered while
174
- // disabled leaves the live store's registration intact.
175
- watch(
176
- [resolvedEnabled, resolvedAgentId],
177
- ([enabled, agentId], _prev, onCleanup) => {
178
- if (!enabled) return;
179
- copilotkit.value.registerThreadStore(agentId, store);
180
- onCleanup(() => {
181
- copilotkit.value.unregisterThreadStore(agentId);
182
- });
183
- },
184
- { immediate: true },
185
- );
186
-
187
- // Tracks whether we've dispatched the first real context to the store.
188
- // The store itself starts with `isLoading: false`, so before we dispatch
189
- // consumers would otherwise see an empty, non-loading state (empty-list
190
- // flash). While runtimeUrl is set and we haven't dispatched yet, we
191
- // synthesize `isLoading: true` so the UI keeps its loading indicator until
192
- // the first fetch is in flight (at which point the store's own
193
- // isLoading takes over).
194
- const hasDispatchedContext = ref(false);
195
-
196
- // Defer setting the context until the runtime reports Connected. Before
197
- // `/info` resolves we don't know `intelligence.wsUrl`, so dispatching the
198
- // context early would issue a list fetch with `wsUrl: undefined`, then a
199
- // second list fetch (and a `/threads/subscribe`) once the flag lands.
200
- // Waiting lets the hook issue just one `/threads?…` + one `/threads/subscribe`.
201
- //
202
- // When `runtimeUrl` is absent we dispatch `null` to clear the store. For
203
- // transient states (Disconnected/Connecting/Error with a URL still set) we
204
- // leave the previously-dispatched context in place — any in-flight
205
- // realtime subscription or cached thread list stays usable while the
206
- // runtime recovers, and we don't re-trigger a fetch storm on transitions.
207
88
  watch(
208
89
  [
90
+ readInput,
209
91
  () => copilotkit.value.runtimeUrl,
210
92
  () => copilotkit.value.runtimeConnectionStatus,
211
- headersKey,
93
+ () => copilotkit.value.ɵheadersGeneration,
212
94
  () => copilotkit.value.intelligence?.wsUrl,
213
- resolvedAgentId,
214
- resolvedIncludeArchived,
215
- resolvedLimit,
216
- resolvedEnabled,
217
- threadListEndpointSupported,
95
+ () => copilotkit.value.threadEndpoints?.list,
96
+ () => copilotkit.value.threadEndpoints?.mutations,
218
97
  ],
219
- ([
220
- runtimeUrl,
221
- runtimeStatus,
222
- ,
223
- wsUrl,
224
- agentId,
225
- includeArchived,
226
- limit,
227
- enabled,
228
- listEndpointSupported,
229
- ]) => {
230
- if (!runtimeUrl || !enabled) {
231
- store.setContext(null);
232
- hasDispatchedContext.value = false;
233
- return;
234
- }
235
-
236
- if (runtimeStatus !== CopilotKitCoreRuntimeConnectionStatus.Connected) {
237
- return;
238
- }
239
-
240
- // Connected, but the runtime explicitly does not serve the list
241
- // endpoint: stay inert so no `/threads` fetch fires. The
242
- // `threadEndpointsError` surfaces via `error` instead.
243
- if (!listEndpointSupported) {
244
- store.setContext(null);
245
- hasDispatchedContext.value = false;
246
- return;
247
- }
248
-
249
- // No `headers` here: the store's `fetch` is `copilotkit.value.ɵruntimeFetch`,
250
- // which already resolves and overlays the current core headers at send
251
- // time (#1937) — a snapshot here would go stale the moment the builder
252
- // returns something new.
253
- const context: ɵThreadRuntimeContext = {
254
- runtimeUrl,
255
- wsUrl,
256
- agentId,
257
- includeArchived,
258
- limit,
259
- };
260
-
261
- store.setContext(context);
262
- hasDispatchedContext.value = true;
263
- },
98
+ ([next]) => controller.update(next),
264
99
  { immediate: true },
265
100
  );
266
101
 
267
- const runtimeError = computed<Error | null>(() =>
268
- copilotkit.value.runtimeUrl
269
- ? null
270
- : new Error("Runtime URL is not configured"),
271
- );
272
-
273
- const preConnectLoading = computed(
274
- () =>
275
- !!copilotkit.value.runtimeUrl &&
276
- resolvedEnabled.value &&
277
- !threadEndpointsUnavailable.value &&
278
- !hasDispatchedContext.value,
279
- );
280
-
281
- const isLoading = computed(() =>
282
- runtimeError.value || threadEndpointsError.value
283
- ? false
284
- : preConnectLoading.value || storeIsLoading.value,
285
- );
286
-
287
- // Folds developer/config errors (missing runtime URL, runtime without
288
- // thread endpoints) together with genuine store errors. `listError` below
289
- // deliberately excludes the config errors.
290
- const error = computed<Error | null>(
291
- () => runtimeError.value ?? threadEndpointsError.value ?? storeError.value,
292
- );
293
-
294
- // Genuine store errors only. Unlike `error`, this omits the dev/config
295
- // `runtimeError`/`threadEndpointsError` strings so they are never shown in
296
- // user-facing error UI.
297
- const listError = computed<Error | null>(() => storeError.value);
298
-
299
- // Reject mutations locally (before touching the network) when the runtime
300
- // reports mutations are unsupported, matching React's `guardMutation`.
301
- function guardMutation<TArgs extends unknown[]>(
302
- mutation: (...args: TArgs) => Promise<void>,
303
- ): (...args: TArgs) => Promise<void> {
304
- return (...args: TArgs) => {
305
- if (threadMutationsError.value) {
306
- return Promise.reject(threadMutationsError.value);
307
- }
308
- return mutation(...args);
309
- };
310
- }
311
-
312
102
  return {
313
- threads: computed(() =>
314
- threads.value.map(
315
- ({ id, agentId, name, archived, createdAt, updatedAt, lastRunAt }) => ({
316
- id,
317
- agentId,
318
- name,
319
- archived,
320
- createdAt,
321
- updatedAt,
322
- ...(lastRunAt !== undefined ? { lastRunAt } : {}),
323
- }),
324
- ),
325
- ),
326
- isLoading,
327
- error,
328
- listError,
329
- fetchMoreError,
330
- hasMoreThreads,
331
- isFetchingMoreThreads,
332
- isMutating,
333
- fetchMoreThreads: () => store.fetchNextPage(),
334
- refetchThreads: () => store.refetchThreads(),
335
- startNewThread: () => store.startNewThread(),
336
- renameThread: guardMutation((threadId: string, name: string) =>
337
- store.renameThread(threadId, name),
338
- ),
339
- archiveThread: guardMutation((threadId: string) =>
340
- store.archiveThread(threadId),
341
- ),
342
- unarchiveThread: guardMutation((threadId: string) =>
343
- store.unarchiveThread(threadId),
344
- ),
345
- deleteThread: guardMutation((threadId: string) =>
346
- store.deleteThread(threadId),
347
- ),
103
+ threads: computed(() => snapshot.value.threads),
104
+ isLoading: computed(() => snapshot.value.isLoading),
105
+ error: computed(() => snapshot.value.error),
106
+ listError: computed(() => snapshot.value.listError),
107
+ fetchMoreError: computed(() => snapshot.value.fetchMoreError),
108
+ hasMoreThreads: computed(() => snapshot.value.hasMoreThreads),
109
+ isFetchingMoreThreads: computed(() => snapshot.value.isFetchingMoreThreads),
110
+ isMutating: computed(() => snapshot.value.isMutating),
111
+ fetchMoreThreads: controller.fetchMoreThreads,
112
+ refetchThreads: controller.refetchThreads,
113
+ startNewThread: controller.startNewThread,
114
+ renameThread: controller.renameThread,
115
+ archiveThread: controller.archiveThread,
116
+ unarchiveThread: controller.unarchiveThread,
117
+ deleteThread: controller.deleteThread,
348
118
  };
349
119
  }