@copilotkit/react-core 1.57.3 → 1.57.4

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 (266) hide show
  1. package/LICENSE +21 -0
  2. package/package.json +12 -13
  3. package/skills/react-core/SKILL.md +108 -0
  4. package/skills/react-core/references/agent-access.md +288 -0
  5. package/skills/react-core/references/attachments.md +291 -0
  6. package/skills/react-core/references/capabilities.md +138 -0
  7. package/skills/react-core/references/chat-components.md +221 -0
  8. package/skills/react-core/references/client-side-tools.md +358 -0
  9. package/skills/react-core/references/custom-message-renderers.md +226 -0
  10. package/skills/react-core/references/debug-mode.md +153 -0
  11. package/skills/react-core/references/human-in-the-loop.md +312 -0
  12. package/skills/react-core/references/provider-setup.md +326 -0
  13. package/skills/react-core/references/rendering-activity-messages.md +207 -0
  14. package/skills/react-core/references/rendering-tool-calls.md +319 -0
  15. package/skills/react-core/references/suggestions.md +211 -0
  16. package/skills/react-core/references/switching-agents-recipes.md +160 -0
  17. package/skills/react-core/references/switching-agents.md +231 -0
  18. package/skills/react-core/references/threads.md +226 -0
  19. package/.attw.json +0 -3
  20. package/CHANGELOG.md +0 -5043
  21. package/scripts/scope-preflight.mjs +0 -100
  22. package/src/components/CopilotListeners.tsx +0 -137
  23. package/src/components/__tests__/CopilotListeners.test.tsx +0 -38
  24. package/src/components/copilot-provider/__tests__/copilot-messages-key.test.tsx +0 -92
  25. package/src/components/copilot-provider/__tests__/copilotkit-error.test.tsx +0 -77
  26. package/src/components/copilot-provider/__tests__/error-visibility-prod.test.tsx +0 -70
  27. package/src/components/copilot-provider/__tests__/v1-explicit-threadid-bridge.test.tsx +0 -107
  28. package/src/components/copilot-provider/copilot-messages.tsx +0 -314
  29. package/src/components/copilot-provider/copilotkit-props.tsx +0 -214
  30. package/src/components/copilot-provider/copilotkit.tsx +0 -853
  31. package/src/components/copilot-provider/index.ts +0 -3
  32. package/src/components/dev-console/console-trigger.tsx +0 -283
  33. package/src/components/dev-console/developer-console-modal.tsx +0 -1016
  34. package/src/components/dev-console/icons.tsx +0 -106
  35. package/src/components/error-boundary/error-boundary.tsx +0 -99
  36. package/src/components/error-boundary/error-utils.tsx +0 -105
  37. package/src/components/index.ts +0 -1
  38. package/src/components/toast/exclamation-mark-icon.tsx +0 -27
  39. package/src/components/toast/toast-provider.tsx +0 -448
  40. package/src/components/usage-banner.tsx +0 -266
  41. package/src/context/__tests__/threads-context.test.tsx +0 -141
  42. package/src/context/coagent-state-renders-context.tsx +0 -89
  43. package/src/context/copilot-context.tsx +0 -365
  44. package/src/context/copilot-messages-context.tsx +0 -35
  45. package/src/context/index.ts +0 -22
  46. package/src/context/threads-context.tsx +0 -69
  47. package/src/hooks/__tests__/use-coagent-config.test.ts +0 -352
  48. package/src/hooks/__tests__/use-coagent-state-render-bridge.helpers.test.ts +0 -107
  49. package/src/hooks/__tests__/use-coagent-state-render.e2e.test.tsx +0 -1209
  50. package/src/hooks/__tests__/use-coagent-state-render.test.tsx +0 -356
  51. package/src/hooks/__tests__/use-copilot-chat-internal-connect.test.tsx +0 -241
  52. package/src/hooks/__tests__/use-frontend-tool-available.test.tsx +0 -72
  53. package/src/hooks/__tests__/use-frontend-tool-remount.e2e.test.tsx +0 -102
  54. package/src/hooks/index.ts +0 -33
  55. package/src/hooks/use-agent-nodename.ts +0 -33
  56. package/src/hooks/use-coagent-state-render-bridge.helpers.ts +0 -345
  57. package/src/hooks/use-coagent-state-render-bridge.tsx +0 -222
  58. package/src/hooks/use-coagent-state-render-registry.ts +0 -230
  59. package/src/hooks/use-coagent-state-render.ts +0 -163
  60. package/src/hooks/use-coagent.ts +0 -377
  61. package/src/hooks/use-configure-chat-suggestions.tsx +0 -96
  62. package/src/hooks/use-copilot-action.ts +0 -245
  63. package/src/hooks/use-copilot-additional-instructions.ts +0 -98
  64. package/src/hooks/use-copilot-authenticated-action.ts +0 -73
  65. package/src/hooks/use-copilot-chat-headless_c.ts +0 -264
  66. package/src/hooks/use-copilot-chat-suggestions.tsx +0 -134
  67. package/src/hooks/use-copilot-chat.ts +0 -132
  68. package/src/hooks/use-copilot-chat_internal.ts +0 -875
  69. package/src/hooks/use-copilot-readable.ts +0 -135
  70. package/src/hooks/use-copilot-runtime-client.ts +0 -178
  71. package/src/hooks/use-default-tool.ts +0 -13
  72. package/src/hooks/use-flat-category-store.ts +0 -109
  73. package/src/hooks/use-frontend-tool.ts +0 -113
  74. package/src/hooks/use-human-in-the-loop.ts +0 -138
  75. package/src/hooks/use-langgraph-interrupt.ts +0 -103
  76. package/src/hooks/use-lazy-tool-renderer.tsx +0 -30
  77. package/src/hooks/use-make-copilot-document-readable.ts +0 -30
  78. package/src/hooks/use-render-tool-call.ts +0 -89
  79. package/src/hooks/use-tree.ts +0 -222
  80. package/src/index.tsx +0 -7
  81. package/src/lib/copilot-task.ts +0 -215
  82. package/src/lib/index.ts +0 -1
  83. package/src/lib/status-checker.ts +0 -67
  84. package/src/setupTests.ts +0 -37
  85. package/src/test-helpers/copilot-context.ts +0 -91
  86. package/src/types/chat-suggestion-configuration.ts +0 -23
  87. package/src/types/coagent-action.ts +0 -35
  88. package/src/types/coagent-state.ts +0 -13
  89. package/src/types/crew.ts +0 -89
  90. package/src/types/document-pointer.ts +0 -7
  91. package/src/types/frontend-action.ts +0 -213
  92. package/src/types/index.ts +0 -17
  93. package/src/types/interrupt-action.ts +0 -58
  94. package/src/types/system-message.ts +0 -4
  95. package/src/utils/dev-console.ts +0 -19
  96. package/src/utils/index.ts +0 -2
  97. package/src/utils/suggestions-constants.ts +0 -8
  98. package/src/utils/utils.test.ts +0 -7
  99. package/src/utils/utils.ts +0 -6
  100. package/src/v2/__tests__/A2UIMessageRenderer.test.tsx +0 -240
  101. package/src/v2/__tests__/globalSetup.ts +0 -14
  102. package/src/v2/__tests__/setup.ts +0 -93
  103. package/src/v2/__tests__/utils/test-helpers.tsx +0 -570
  104. package/src/v2/a2ui/A2UICatalogContext.tsx +0 -79
  105. package/src/v2/a2ui/A2UIMessageRenderer.tsx +0 -294
  106. package/src/v2/a2ui/A2UIToolCallRenderer.tsx +0 -290
  107. package/src/v2/components/CopilotKitInspector.tsx +0 -52
  108. package/src/v2/components/MCPAppsActivityRenderer.tsx +0 -815
  109. package/src/v2/components/OpenGenerativeUIRenderer.tsx +0 -598
  110. package/src/v2/components/WildcardToolCallRender.tsx +0 -86
  111. package/src/v2/components/__tests__/OpenGenerativeUIRenderer.test.tsx +0 -665
  112. package/src/v2/components/chat/CopilotChat.tsx +0 -664
  113. package/src/v2/components/chat/CopilotChatAssistantMessage.tsx +0 -393
  114. package/src/v2/components/chat/CopilotChatAttachmentQueue.tsx +0 -374
  115. package/src/v2/components/chat/CopilotChatAttachmentRenderer.tsx +0 -159
  116. package/src/v2/components/chat/CopilotChatAudioRecorder.tsx +0 -350
  117. package/src/v2/components/chat/CopilotChatInput.tsx +0 -1412
  118. package/src/v2/components/chat/CopilotChatMessageView.tsx +0 -716
  119. package/src/v2/components/chat/CopilotChatReasoningMessage.tsx +0 -265
  120. package/src/v2/components/chat/CopilotChatSuggestionPill.tsx +0 -59
  121. package/src/v2/components/chat/CopilotChatSuggestionView.tsx +0 -134
  122. package/src/v2/components/chat/CopilotChatToggleButton.tsx +0 -171
  123. package/src/v2/components/chat/CopilotChatToolCallsView.tsx +0 -40
  124. package/src/v2/components/chat/CopilotChatUserMessage.tsx +0 -445
  125. package/src/v2/components/chat/CopilotChatView.tsx +0 -890
  126. package/src/v2/components/chat/CopilotModalHeader.tsx +0 -129
  127. package/src/v2/components/chat/CopilotPopup.tsx +0 -81
  128. package/src/v2/components/chat/CopilotPopupView.tsx +0 -317
  129. package/src/v2/components/chat/CopilotSidebar.tsx +0 -80
  130. package/src/v2/components/chat/CopilotSidebarView.tsx +0 -269
  131. package/src/v2/components/chat/Lightbox.tsx +0 -103
  132. package/src/v2/components/chat/__tests__/CopilotChat.absentThreadConnect.test.tsx +0 -66
  133. package/src/v2/components/chat/__tests__/CopilotChat.attachments.test.tsx +0 -168
  134. package/src/v2/components/chat/__tests__/CopilotChat.e2e.test.tsx +0 -1239
  135. package/src/v2/components/chat/__tests__/CopilotChat.onError.test.tsx +0 -73
  136. package/src/v2/components/chat/__tests__/CopilotChat.slots.e2e.test.tsx +0 -432
  137. package/src/v2/components/chat/__tests__/CopilotChat.suggestionsAlways.test.tsx +0 -183
  138. package/src/v2/components/chat/__tests__/CopilotChat.welcomeGate.test.tsx +0 -184
  139. package/src/v2/components/chat/__tests__/CopilotChatActivityRendering.e2e.test.tsx +0 -649
  140. package/src/v2/components/chat/__tests__/CopilotChatAssistantMessage.slots.e2e.test.tsx +0 -624
  141. package/src/v2/components/chat/__tests__/CopilotChatAssistantMessage.test.tsx +0 -702
  142. package/src/v2/components/chat/__tests__/CopilotChatAssistantMessage.thumbs.test.tsx +0 -72
  143. package/src/v2/components/chat/__tests__/CopilotChatCopyButton.clipboard.test.tsx +0 -241
  144. package/src/v2/components/chat/__tests__/CopilotChatCssClasses.test.tsx +0 -107
  145. package/src/v2/components/chat/__tests__/CopilotChatInput.slots.e2e.test.tsx +0 -929
  146. package/src/v2/components/chat/__tests__/CopilotChatInput.test.tsx +0 -1567
  147. package/src/v2/components/chat/__tests__/CopilotChatMessageView.slots.e2e.test.tsx +0 -1004
  148. package/src/v2/components/chat/__tests__/CopilotChatMessageView.test.tsx +0 -279
  149. package/src/v2/components/chat/__tests__/CopilotChatPerf.e2e.test.tsx +0 -336
  150. package/src/v2/components/chat/__tests__/CopilotChatPropsRerender.e2e.test.tsx +0 -249
  151. package/src/v2/components/chat/__tests__/CopilotChatSuggestionView.slots.e2e.test.tsx +0 -530
  152. package/src/v2/components/chat/__tests__/CopilotChatToolRendering.e2e.test.tsx +0 -785
  153. package/src/v2/components/chat/__tests__/CopilotChatToolRerenders.e2e.test.tsx +0 -2416
  154. package/src/v2/components/chat/__tests__/CopilotChatUserMessage.slots.e2e.test.tsx +0 -621
  155. package/src/v2/components/chat/__tests__/CopilotChatView.connectingGate.test.tsx +0 -56
  156. package/src/v2/components/chat/__tests__/CopilotChatView.inputOverlay.test.tsx +0 -264
  157. package/src/v2/components/chat/__tests__/CopilotChatView.onClick.e2e.test.tsx +0 -853
  158. package/src/v2/components/chat/__tests__/CopilotChatView.pinToSend.test.tsx +0 -94
  159. package/src/v2/components/chat/__tests__/CopilotChatView.slots.e2e.test.tsx +0 -1050
  160. package/src/v2/components/chat/__tests__/CopilotModalHeader.slots.e2e.test.tsx +0 -484
  161. package/src/v2/components/chat/__tests__/CopilotPopupView.slots.e2e.test.tsx +0 -612
  162. package/src/v2/components/chat/__tests__/CopilotSidebarView.position.test.tsx +0 -159
  163. package/src/v2/components/chat/__tests__/CopilotSidebarView.slots.e2e.test.tsx +0 -502
  164. package/src/v2/components/chat/__tests__/MCPAppsActivityRenderer.e2e.test.tsx +0 -1068
  165. package/src/v2/components/chat/__tests__/MCPAppsProxy.e2e.test.tsx +0 -589
  166. package/src/v2/components/chat/__tests__/MCPAppsUiMessage.e2e.test.tsx +0 -403
  167. package/src/v2/components/chat/__tests__/copilot-chat-throttle.test.tsx +0 -137
  168. package/src/v2/components/chat/__tests__/normalize-auto-scroll.test.ts +0 -37
  169. package/src/v2/components/chat/__tests__/setup.ts +0 -1
  170. package/src/v2/components/chat/index.ts +0 -90
  171. package/src/v2/components/chat/last-user-message-context.ts +0 -21
  172. package/src/v2/components/chat/normalize-auto-scroll.ts +0 -17
  173. package/src/v2/components/chat/scroll-element-context.ts +0 -13
  174. package/src/v2/components/index.ts +0 -8
  175. package/src/v2/components/intelligence-indicator/IntelligenceIndicator.tsx +0 -286
  176. package/src/v2/components/intelligence-indicator/__tests__/IntelligenceIndicator.e2e.test.tsx +0 -464
  177. package/src/v2/components/intelligence-indicator/index.ts +0 -2
  178. package/src/v2/components/license-warning-banner.tsx +0 -217
  179. package/src/v2/components/ui/button.tsx +0 -124
  180. package/src/v2/components/ui/dropdown-menu.tsx +0 -258
  181. package/src/v2/components/ui/tooltip.tsx +0 -60
  182. package/src/v2/context.ts +0 -62
  183. package/src/v2/headless.ts +0 -64
  184. package/src/v2/hooks/__tests__/standard-schema-types.test.tsx +0 -152
  185. package/src/v2/hooks/__tests__/standard-schema.test.tsx +0 -282
  186. package/src/v2/hooks/__tests__/use-agent-context-timing.e2e.test.tsx +0 -140
  187. package/src/v2/hooks/__tests__/use-agent-context.test.tsx +0 -401
  188. package/src/v2/hooks/__tests__/use-agent-error-state.test.tsx +0 -44
  189. package/src/v2/hooks/__tests__/use-agent-stability.test.tsx +0 -211
  190. package/src/v2/hooks/__tests__/use-agent-throttle.test.tsx +0 -1029
  191. package/src/v2/hooks/__tests__/use-agent.e2e.test.tsx +0 -159
  192. package/src/v2/hooks/__tests__/use-attachments.test.tsx +0 -169
  193. package/src/v2/hooks/__tests__/use-capabilities.test.tsx +0 -76
  194. package/src/v2/hooks/__tests__/use-component.test.tsx +0 -126
  195. package/src/v2/hooks/__tests__/use-configure-suggestions.e2e.test.tsx +0 -696
  196. package/src/v2/hooks/__tests__/use-default-render-tool.test.tsx +0 -153
  197. package/src/v2/hooks/__tests__/use-frontend-tool-available.test.tsx +0 -167
  198. package/src/v2/hooks/__tests__/use-frontend-tool.e2e.test.tsx +0 -2148
  199. package/src/v2/hooks/__tests__/use-human-in-the-loop.e2e.test.tsx +0 -1261
  200. package/src/v2/hooks/__tests__/use-interrupt.test.tsx +0 -397
  201. package/src/v2/hooks/__tests__/use-katex-styles.test.tsx +0 -56
  202. package/src/v2/hooks/__tests__/use-keyboard-height.test.tsx +0 -192
  203. package/src/v2/hooks/__tests__/use-pin-to-send.test.tsx +0 -219
  204. package/src/v2/hooks/__tests__/use-render-custom-messages.test.tsx +0 -55
  205. package/src/v2/hooks/__tests__/use-render-tool.test.tsx +0 -259
  206. package/src/v2/hooks/__tests__/use-suggestions.e2e.test.tsx +0 -524
  207. package/src/v2/hooks/__tests__/use-threads.test.tsx +0 -757
  208. package/src/v2/hooks/__tests__/zod-regression.test.tsx +0 -311
  209. package/src/v2/hooks/index.ts +0 -24
  210. package/src/v2/hooks/use-agent-context.tsx +0 -45
  211. package/src/v2/hooks/use-agent.tsx +0 -227
  212. package/src/v2/hooks/use-attachments.tsx +0 -269
  213. package/src/v2/hooks/use-capabilities.tsx +0 -25
  214. package/src/v2/hooks/use-component.tsx +0 -91
  215. package/src/v2/hooks/use-configure-suggestions.tsx +0 -236
  216. package/src/v2/hooks/use-default-render-tool.tsx +0 -271
  217. package/src/v2/hooks/use-frontend-tool.tsx +0 -46
  218. package/src/v2/hooks/use-human-in-the-loop.tsx +0 -81
  219. package/src/v2/hooks/use-interrupt.tsx +0 -305
  220. package/src/v2/hooks/use-keyboard-height.tsx +0 -67
  221. package/src/v2/hooks/use-pin-to-send.ts +0 -94
  222. package/src/v2/hooks/use-render-activity-message.tsx +0 -72
  223. package/src/v2/hooks/use-render-custom-messages.tsx +0 -93
  224. package/src/v2/hooks/use-render-tool-call.tsx +0 -208
  225. package/src/v2/hooks/use-render-tool.tsx +0 -184
  226. package/src/v2/hooks/use-suggestions.tsx +0 -91
  227. package/src/v2/hooks/use-threads.tsx +0 -325
  228. package/src/v2/hooks/useKatexStyles.ts +0 -27
  229. package/src/v2/index.css +0 -1
  230. package/src/v2/index.ts +0 -27
  231. package/src/v2/lib/__tests__/completePartialMarkdown.test.ts +0 -495
  232. package/src/v2/lib/__tests__/processPartialHtml.test.ts +0 -112
  233. package/src/v2/lib/__tests__/renderSlot.test.tsx +0 -588
  234. package/src/v2/lib/__tests__/slots.test.ts +0 -56
  235. package/src/v2/lib/processPartialHtml.ts +0 -45
  236. package/src/v2/lib/react-core.ts +0 -156
  237. package/src/v2/lib/slots.tsx +0 -184
  238. package/src/v2/lib/transcription-client.ts +0 -184
  239. package/src/v2/lib/utils.ts +0 -8
  240. package/src/v2/providers/CopilotChatConfigurationProvider.tsx +0 -196
  241. package/src/v2/providers/CopilotKitProvider.tsx +0 -800
  242. package/src/v2/providers/SandboxFunctionsContext.ts +0 -10
  243. package/src/v2/providers/__tests__/CopilotChatConfigurationProvider.test.tsx +0 -652
  244. package/src/v2/providers/__tests__/CopilotKitProvider.license.test.tsx +0 -101
  245. package/src/v2/providers/__tests__/CopilotKitProvider.onError.test.tsx +0 -69
  246. package/src/v2/providers/__tests__/CopilotKitProvider.renderCustomMessages.e2e.test.tsx +0 -881
  247. package/src/v2/providers/__tests__/CopilotKitProvider.sandboxFunctions.test.tsx +0 -198
  248. package/src/v2/providers/__tests__/CopilotKitProvider.stability.test.tsx +0 -740
  249. package/src/v2/providers/__tests__/CopilotKitProvider.test.tsx +0 -713
  250. package/src/v2/providers/__tests__/CopilotKitProvider.wildcard.test.tsx +0 -294
  251. package/src/v2/providers/index.ts +0 -21
  252. package/src/v2/styles/globals.css +0 -349
  253. package/src/v2/types/__tests__/defineToolCallRenderer.test.tsx +0 -525
  254. package/src/v2/types/defineToolCallRenderer.ts +0 -68
  255. package/src/v2/types/frontend-tool.ts +0 -8
  256. package/src/v2/types/human-in-the-loop.ts +0 -33
  257. package/src/v2/types/index.ts +0 -8
  258. package/src/v2/types/interrupt.ts +0 -15
  259. package/src/v2/types/react-activity-message-renderer.ts +0 -27
  260. package/src/v2/types/react-custom-message-renderer.ts +0 -17
  261. package/src/v2/types/react-tool-call-renderer.ts +0 -35
  262. package/src/v2/types/sandbox-function.ts +0 -11
  263. package/tsconfig.json +0 -8
  264. package/tsdown.config.ts +0 -193
  265. package/typedoc.json +0 -4
  266. package/vitest.config.mjs +0 -31
@@ -1,525 +0,0 @@
1
- import { CopilotKitProvider } from "../../providers/CopilotKitProvider";
2
- import type { AbstractAgent } from "@ag-ui/client";
3
- import { ToolCallStatus } from "@copilotkit/core";
4
- import { render, screen } from "@testing-library/react";
5
- import type React from "react";
6
- import { describe, expect, it, vi } from "vitest";
7
- import { z } from "zod";
8
- import { defineToolCallRenderer } from "../defineToolCallRenderer";
9
- import type { ReactToolCallRenderer } from "../react-tool-call-renderer";
10
-
11
- describe("defineToolCallRenderer", () => {
12
- describe("Array compatibility", () => {
13
- it("should work with multiple tool renders in an array", () => {
14
- // This test verifies that multiple tool renders with different arg types
15
- // can be used together in the renderToolCalls array
16
- const WildCardRender = defineToolCallRenderer({
17
- name: "*",
18
- render: ({ args, result, name, status }) => {
19
- return <div>Wildcard: {name}</div>;
20
- },
21
- });
22
-
23
- const OtherToolRender = defineToolCallRenderer({
24
- name: "get_weather",
25
- args: z.object({
26
- location: z.string(),
27
- }),
28
- render: ({ args, result, name, status }) => {
29
- return <div>Weather in {args.location}</div>;
30
- },
31
- });
32
-
33
- // This should compile without errors
34
- // Testing that mixed types can be used together
35
- const renderToolCalls = [WildCardRender, OtherToolRender];
36
-
37
- expect(renderToolCalls).toHaveLength(2);
38
- expect(renderToolCalls[0]!.name).toBe("*");
39
- expect(renderToolCalls[1]!.name).toBe("get_weather");
40
-
41
- // Verify they have the expected structure
42
- expect(renderToolCalls[0]!.render).toBeDefined();
43
- expect(renderToolCalls[1]!.render).toBeDefined();
44
- expect(renderToolCalls[1]!.args).toBeDefined();
45
- });
46
-
47
- it("should work with CopilotKitProvider accepting mixed tool renders", () => {
48
- // This is the exact scenario the user reported
49
- const WildCardRender = defineToolCallRenderer({
50
- name: "*",
51
- render: ({ args, result, name, status }) => {
52
- return <div data-testid="wildcard">TODO: {name}</div>;
53
- },
54
- });
55
-
56
- const OtherToolRender = defineToolCallRenderer({
57
- name: "get_weather",
58
- args: z.object({
59
- location: z.string(),
60
- }),
61
- render: ({ args, result, name, status }) => {
62
- return <div data-testid="weather">Weather for {args.location}</div>;
63
- },
64
- });
65
-
66
- // This should compile without type errors
67
- const TestComponent = () => {
68
- const renderToolCalls = [WildCardRender, OtherToolRender];
69
-
70
- // In real usage, this would be passed to CopilotKitProvider
71
- // We're just checking that the type is compatible
72
- const providerProps: {
73
- renderToolCalls?: ReactToolCallRenderer<any>[];
74
- } = {
75
- renderToolCalls: renderToolCalls,
76
- };
77
-
78
- return <div data-testid="test">Test</div>;
79
- };
80
-
81
- const { getByTestId } = render(<TestComponent />);
82
- expect(getByTestId("test")).toBeDefined();
83
- });
84
-
85
- it("should work with actual CopilotKitProvider - replicating user's exact scenario", () => {
86
- // Exact replication of the user's code that was causing type errors
87
- const WildCardRender = defineToolCallRenderer({
88
- name: "*",
89
- render: ({ args, result, name, status }) => {
90
- return <div>TODO</div>;
91
- },
92
- });
93
-
94
- const OtherToolRender = defineToolCallRenderer({
95
- name: "get_weather",
96
- args: z.object({
97
- location: z.string(),
98
- }),
99
- render: ({ args, result, name, status }) => {
100
- return <div>TODO</div>;
101
- },
102
- });
103
-
104
- // Create a mock agent for testing
105
- const mockAgent = {
106
- clone: vi.fn(),
107
- run: vi.fn(),
108
- subscribe: vi.fn(() => ({ unsubscribe: () => {} })),
109
- } as unknown as AbstractAgent;
110
-
111
- // This is the exact code pattern the user wanted to use
112
- // Previously this would cause a type error, now it should compile
113
- const TestApp = () => (
114
- <CopilotKitProvider
115
- agents__unsafe_dev_only={{
116
- default: mockAgent,
117
- }}
118
- renderToolCalls={[WildCardRender, OtherToolRender]}
119
- >
120
- <div data-testid="app">App content</div>
121
- </CopilotKitProvider>
122
- );
123
-
124
- // If this renders without TypeScript errors, the fix is working
125
- const { getByTestId } = render(<TestApp />);
126
- expect(getByTestId("app")).toBeDefined();
127
- expect(getByTestId("app").textContent).toBe("App content");
128
- });
129
- });
130
- describe("Type inference and rendering", () => {
131
- it("should properly infer types for regular tools", () => {
132
- const weatherRender = defineToolCallRenderer({
133
- name: "get_weather",
134
- args: z.object({
135
- location: z.string(),
136
- units: z.enum(["celsius", "fahrenheit"]).optional(),
137
- }),
138
- render: ({ args, status, name, result }) => {
139
- // Test that types are properly inferred
140
- if (status === ToolCallStatus.InProgress) {
141
- // args should be Partial
142
- const loc: string | undefined = args.location;
143
- return <div data-testid="progress">Loading {loc || "..."}...</div>;
144
- }
145
-
146
- if (status === ToolCallStatus.Executing) {
147
- // args should be complete
148
- const loc: string = args.location;
149
- return (
150
- <div data-testid="executing">Fetching weather for {loc}</div>
151
- );
152
- }
153
-
154
- // Complete status
155
- return (
156
- <div data-testid="complete">
157
- Weather in {args.location}: {result}
158
- </div>
159
- );
160
- },
161
- });
162
-
163
- // Test InProgress state
164
- const ProgressComponent = weatherRender.render as React.FC<any>;
165
- const { rerender } = render(
166
- <ProgressComponent
167
- name="get_weather"
168
- args={{ location: "Paris" }}
169
- status={ToolCallStatus.InProgress}
170
- result={undefined}
171
- />,
172
- );
173
- expect(screen.getByTestId("progress").textContent).toBe(
174
- "Loading Paris...",
175
- );
176
-
177
- // Test Executing state
178
- rerender(
179
- <ProgressComponent
180
- name="get_weather"
181
- args={{ location: "London", units: "celsius" }}
182
- status={ToolCallStatus.Executing}
183
- result={undefined}
184
- />,
185
- );
186
- expect(screen.getByTestId("executing").textContent).toBe(
187
- "Fetching weather for London",
188
- );
189
-
190
- // Test Complete state
191
- rerender(
192
- <ProgressComponent
193
- name="get_weather"
194
- args={{ location: "Tokyo", units: "fahrenheit" }}
195
- status={ToolCallStatus.Complete}
196
- result="Sunny, 75°F"
197
- />,
198
- );
199
- expect(screen.getByTestId("complete").textContent).toBe(
200
- "Weather in Tokyo: Sunny, 75°F",
201
- );
202
- });
203
-
204
- it("should work with wildcard tool without args definition", () => {
205
- // No args field - should default to z.any()
206
- const wildcardRender = defineToolCallRenderer({
207
- name: "*",
208
- render: ({ name, args, status }) => (
209
- <div data-testid="wildcard">
210
- <span data-testid="tool-name">{name}</span>
211
- <span data-testid="status">{status}</span>
212
- <span data-testid="args">{JSON.stringify(args)}</span>
213
- </div>
214
- ),
215
- });
216
-
217
- const WildcardComponent = wildcardRender.render as React.FC<any>;
218
-
219
- // Test that wildcard receives actual tool name, not "*"
220
- render(
221
- <WildcardComponent
222
- name="customTool"
223
- args={{ param1: "value1", param2: 42 }}
224
- status={ToolCallStatus.Executing}
225
- result={undefined}
226
- />,
227
- );
228
-
229
- expect(screen.getByTestId("tool-name").textContent).toBe("customTool");
230
- expect(screen.getByTestId("tool-name").textContent).not.toBe("*");
231
- expect(screen.getByTestId("status").textContent).toBe("executing");
232
-
233
- const argsText = screen.getByTestId("args").textContent || "";
234
- expect(argsText).toContain("value1");
235
- expect(argsText).toContain("42");
236
- });
237
-
238
- it("should handle complex nested schemas", () => {
239
- const complexRender = defineToolCallRenderer({
240
- name: "complex_tool",
241
- args: z.object({
242
- user: z.object({
243
- id: z.number(),
244
- name: z.string(),
245
- email: z.string().email(),
246
- }),
247
- options: z.array(z.string()),
248
- metadata: z.record(z.unknown()).optional(),
249
- }),
250
- render: ({ args, status }) => {
251
- if (status === ToolCallStatus.Executing) {
252
- return (
253
- <div data-testid="complex">
254
- <div data-testid="user-info">
255
- User: {args.user.name} ({args.user.email})
256
- </div>
257
- <div data-testid="options">
258
- Options: {args.options.join(", ")}
259
- </div>
260
- {args.metadata && (
261
- <div data-testid="metadata">
262
- Metadata keys: {Object.keys(args.metadata).join(", ")}
263
- </div>
264
- )}
265
- </div>
266
- );
267
- }
268
- return <div>Processing...</div>;
269
- },
270
- });
271
-
272
- const ComplexComponent = complexRender.render as React.FC<any>;
273
- render(
274
- <ComplexComponent
275
- name="complex_tool"
276
- args={{
277
- user: { id: 1, name: "John Doe", email: "john@example.com" },
278
- options: ["option1", "option2", "option3"],
279
- metadata: { key1: "value1", key2: "value2" },
280
- }}
281
- status={ToolCallStatus.Executing}
282
- result={undefined}
283
- />,
284
- );
285
-
286
- expect(screen.getByTestId("user-info").textContent).toBe(
287
- "User: John Doe (john@example.com)",
288
- );
289
- expect(screen.getByTestId("options").textContent).toBe(
290
- "Options: option1, option2, option3",
291
- );
292
- expect(screen.getByTestId("metadata").textContent).toBe(
293
- "Metadata keys: key1, key2",
294
- );
295
- });
296
-
297
- it("should properly handle all status states in union", () => {
298
- const unionTestRender = defineToolCallRenderer({
299
- name: "union_test",
300
- args: z.object({
301
- value: z.string(),
302
- }),
303
- render: (props) => {
304
- switch (props.status) {
305
- case ToolCallStatus.InProgress:
306
- return (
307
- <div data-testid="in-progress">
308
- In Progress: {props.args.value || "..."}
309
- </div>
310
- );
311
- case ToolCallStatus.Executing:
312
- return (
313
- <div data-testid="executing">Executing: {props.args.value}</div>
314
- );
315
- case ToolCallStatus.Complete:
316
- return (
317
- <div data-testid="complete">
318
- Complete: {props.args.value} = {props.result}
319
- </div>
320
- );
321
- default:
322
- return <div data-testid="unknown">Unknown status</div>;
323
- }
324
- },
325
- });
326
-
327
- const UnionComponent = unionTestRender.render as React.FC<any>;
328
- const { rerender } = render(
329
- <UnionComponent
330
- name="union_test"
331
- args={{ value: "partial" }}
332
- status={ToolCallStatus.InProgress}
333
- result={undefined}
334
- />,
335
- );
336
- expect(screen.getByTestId("in-progress").textContent).toBe(
337
- "In Progress: partial",
338
- );
339
-
340
- rerender(
341
- <UnionComponent
342
- name="union_test"
343
- args={{ value: "test" }}
344
- status={ToolCallStatus.Executing}
345
- result={undefined}
346
- />,
347
- );
348
- expect(screen.getByTestId("executing").textContent).toBe(
349
- "Executing: test",
350
- );
351
-
352
- rerender(
353
- <UnionComponent
354
- name="union_test"
355
- args={{ value: "test" }}
356
- status={ToolCallStatus.Complete}
357
- result="success"
358
- />,
359
- );
360
- expect(screen.getByTestId("complete").textContent).toBe(
361
- "Complete: test = success",
362
- );
363
- });
364
-
365
- it("should support agentId parameter", () => {
366
- const agentSpecificRender = defineToolCallRenderer({
367
- name: "agent_tool",
368
- args: z.object({ message: z.string() }),
369
- agentId: "special-agent",
370
- render: ({ args }) => <div data-testid="agent">{args.message}</div>,
371
- });
372
-
373
- expect(agentSpecificRender.agentId).toBe("special-agent");
374
- expect(agentSpecificRender.name).toBe("agent_tool");
375
- });
376
-
377
- it("should work with wildcard and agentId", () => {
378
- const agentWildcard = defineToolCallRenderer({
379
- name: "*",
380
- agentId: "fallback-agent",
381
- render: ({ name }) => (
382
- <div data-testid="wildcard-agent">Unknown: {name}</div>
383
- ),
384
- });
385
-
386
- expect(agentWildcard.agentId).toBe("fallback-agent");
387
- expect(agentWildcard.name).toBe("*");
388
-
389
- const Component = agentWildcard.render as React.FC<any>;
390
- render(
391
- <Component
392
- name="unknownTool"
393
- args={{ anything: "goes" }}
394
- status={ToolCallStatus.Executing}
395
- result={undefined}
396
- />,
397
- );
398
-
399
- expect(screen.getByTestId("wildcard-agent").textContent).toBe(
400
- "Unknown: unknownTool",
401
- );
402
- });
403
- });
404
-
405
- describe("Real-world use cases", () => {
406
- it("should handle the user's original weather example without type errors", () => {
407
- // This is the exact code the user reported was causing errors
408
- const weatherRender = defineToolCallRenderer({
409
- name: "get_weather",
410
- args: z.object({
411
- location: z.string(),
412
- }),
413
- render: ({ args }) => {
414
- // No type casting needed - TypeScript infers correctly
415
- return <div data-testid="weather">Weather: {args.location}</div>;
416
- },
417
- });
418
-
419
- const Component = weatherRender.render as React.FC<any>;
420
- render(
421
- <Component
422
- name="get_weather"
423
- args={{ location: "San Francisco" }}
424
- status={ToolCallStatus.Executing}
425
- result={undefined}
426
- />,
427
- );
428
-
429
- expect(screen.getByTestId("weather").textContent).toBe(
430
- "Weather: San Francisco",
431
- );
432
- });
433
-
434
- it("should allow wildcard as fallback for undefined tools", () => {
435
- const renders = [
436
- defineToolCallRenderer({
437
- name: "known_tool",
438
- args: z.object({ id: z.number() }),
439
- render: ({ args }) => (
440
- <div data-testid="known">Known tool: {args.id}</div>
441
- ),
442
- }),
443
- defineToolCallRenderer({
444
- name: "*",
445
- render: ({ name, args }) => (
446
- <div data-testid="fallback">
447
- Fallback for {name}: {JSON.stringify(args)}
448
- </div>
449
- ),
450
- }),
451
- ];
452
-
453
- // Test known tool
454
- const KnownComponent = renders[0]!.render as React.FC<any>;
455
- const { rerender } = render(
456
- <KnownComponent
457
- name="known_tool"
458
- args={{ id: 123 }}
459
- status={ToolCallStatus.Executing}
460
- result={undefined}
461
- />,
462
- );
463
- expect(screen.getByTestId("known").textContent).toBe("Known tool: 123");
464
-
465
- // Test wildcard fallback
466
- const WildcardComponent = renders[1]!.render as React.FC<any>;
467
- rerender(
468
- <WildcardComponent
469
- name="unknown_tool"
470
- args={{ data: "test" }}
471
- status={ToolCallStatus.Executing}
472
- result={undefined}
473
- />,
474
- );
475
- expect(screen.getByTestId("fallback").textContent).toBe(
476
- 'Fallback for unknown_tool: {"data":"test"}',
477
- );
478
- });
479
-
480
- it("should handle optional fields correctly", () => {
481
- const optionalRender = defineToolCallRenderer({
482
- name: "optional_test",
483
- args: z.object({
484
- required: z.string(),
485
- optional: z.string().optional(),
486
- nullable: z.string().nullable(),
487
- defaulted: z.string().default("default_value"),
488
- }),
489
- render: ({ args, status }) => {
490
- if (status === ToolCallStatus.Executing) {
491
- return (
492
- <div data-testid="optional">
493
- <div>Required: {args.required}</div>
494
- <div>Optional: {args.optional || "not provided"}</div>
495
- <div>Nullable: {args.nullable || "null"}</div>
496
- <div>Defaulted: {args.defaulted}</div>
497
- </div>
498
- );
499
- }
500
- return <div>Loading...</div>;
501
- },
502
- });
503
-
504
- const Component = optionalRender.render as React.FC<any>;
505
- render(
506
- <Component
507
- name="optional_test"
508
- args={{
509
- required: "test",
510
- nullable: null,
511
- defaulted: "custom",
512
- }}
513
- status={ToolCallStatus.Executing}
514
- result={undefined}
515
- />,
516
- );
517
-
518
- const element = screen.getByTestId("optional");
519
- expect(element.textContent).toContain("Required: test");
520
- expect(element.textContent).toContain("Optional: not provided");
521
- expect(element.textContent).toContain("Nullable: null");
522
- expect(element.textContent).toContain("Defaulted: custom");
523
- });
524
- });
525
- });
@@ -1,68 +0,0 @@
1
- import React from "react";
2
- import { z } from "zod";
3
- import type { StandardSchemaV1, InferSchemaOutput } from "@copilotkit/shared";
4
- import { ReactToolCallRenderer } from "./react-tool-call-renderer";
5
- import { ToolCallStatus } from "@copilotkit/core";
6
-
7
- /**
8
- * Helper to define a type-safe tool call renderer entry.
9
- * - Accepts a single object whose keys match ReactToolCallRenderer's fields: { name, args, render, agentId? }.
10
- * - Derives `args` type from the provided schema (any Standard Schema V1 compatible library).
11
- * - Ensures the render function param type exactly matches ReactToolCallRenderer<T>["render"]'s param.
12
- * - For wildcard tools (name: "*"), args is optional and defaults to z.any()
13
- */
14
- type RenderProps<T> =
15
- | {
16
- name: string;
17
- toolCallId: string;
18
- args: Partial<T>;
19
- status: ToolCallStatus.InProgress;
20
- result: undefined;
21
- }
22
- | {
23
- name: string;
24
- toolCallId: string;
25
- args: T;
26
- status: ToolCallStatus.Executing;
27
- result: undefined;
28
- }
29
- | {
30
- name: string;
31
- toolCallId: string;
32
- args: T;
33
- status: ToolCallStatus.Complete;
34
- result: string;
35
- };
36
-
37
- // Overload for wildcard tools without args
38
- export function defineToolCallRenderer(def: {
39
- name: "*";
40
- render: (props: RenderProps<any>) => React.ReactElement;
41
- agentId?: string;
42
- }): ReactToolCallRenderer<any>;
43
-
44
- // Overload for regular tools with args
45
- export function defineToolCallRenderer<S extends StandardSchemaV1>(def: {
46
- name: string;
47
- args: S;
48
- render: (props: RenderProps<InferSchemaOutput<S>>) => React.ReactElement;
49
- agentId?: string;
50
- }): ReactToolCallRenderer<InferSchemaOutput<S>>;
51
-
52
- // Implementation
53
- export function defineToolCallRenderer<S extends StandardSchemaV1>(def: {
54
- name: string;
55
- args?: S;
56
- render: (props: any) => React.ReactElement;
57
- agentId?: string;
58
- }): ReactToolCallRenderer<any> {
59
- // For wildcard tools, default to z.any() if no args provided
60
- const argsSchema = def.name === "*" && !def.args ? z.any() : def.args;
61
-
62
- return {
63
- name: def.name,
64
- args: argsSchema,
65
- render: def.render as React.ComponentType<any>,
66
- ...(def.agentId ? { agentId: def.agentId } : {}),
67
- };
68
- }
@@ -1,8 +0,0 @@
1
- import { FrontendTool } from "@copilotkit/core";
2
- import { ReactToolCallRenderer } from "./react-tool-call-renderer";
3
-
4
- export type ReactFrontendTool<
5
- T extends Record<string, unknown> = Record<string, unknown>,
6
- > = FrontendTool<T> & {
7
- render?: ReactToolCallRenderer<T>["render"];
8
- };
@@ -1,33 +0,0 @@
1
- import { FrontendTool, ToolCallStatus } from "@copilotkit/core";
2
- import React from "react";
3
-
4
- export type ReactHumanInTheLoop<
5
- T extends Record<string, unknown> = Record<string, unknown>,
6
- > = Omit<FrontendTool<T>, "handler"> & {
7
- render: React.ComponentType<
8
- | {
9
- name: string;
10
- description: string;
11
- args: Partial<T>;
12
- status: ToolCallStatus.InProgress;
13
- result: undefined;
14
- respond: undefined;
15
- }
16
- | {
17
- name: string;
18
- description: string;
19
- args: T;
20
- status: ToolCallStatus.Executing;
21
- result: undefined;
22
- respond: (result: unknown) => Promise<void>;
23
- }
24
- | {
25
- name: string;
26
- description: string;
27
- args: T;
28
- status: ToolCallStatus.Complete;
29
- result: string;
30
- respond: undefined;
31
- }
32
- >;
33
- };
@@ -1,8 +0,0 @@
1
- export * from "./react-tool-call-renderer";
2
- export * from "./react-activity-message-renderer";
3
- export * from "./react-custom-message-renderer";
4
- export * from "./frontend-tool";
5
- export * from "./human-in-the-loop";
6
- export * from "./defineToolCallRenderer";
7
- export * from "./interrupt";
8
- export * from "./sandbox-function";
@@ -1,15 +0,0 @@
1
- export interface InterruptEvent<TValue = unknown> {
2
- name: string;
3
- value: TValue;
4
- }
5
-
6
- export interface InterruptHandlerProps<TValue = unknown> {
7
- event: InterruptEvent<TValue>;
8
- resolve: (response: unknown) => void;
9
- }
10
-
11
- export interface InterruptRenderProps<TValue = unknown, TResult = unknown> {
12
- event: InterruptEvent<TValue>;
13
- result: TResult;
14
- resolve: (response: unknown) => void;
15
- }
@@ -1,27 +0,0 @@
1
- import { ActivityMessage } from "@ag-ui/core";
2
- import type { AbstractAgent } from "@ag-ui/client";
3
- import type { StandardSchemaV1 } from "@copilotkit/shared";
4
-
5
- export interface ReactActivityMessageRenderer<TActivityContent> {
6
- /**
7
- * Activity type to match when rendering. Use "*" as a wildcard renderer.
8
- */
9
- activityType: string;
10
- /**
11
- * Optional agent ID to scope the renderer to a particular agent.
12
- */
13
- agentId?: string;
14
- /**
15
- * Schema describing the activity content payload.
16
- */
17
- content: StandardSchemaV1<any, TActivityContent>;
18
- /**
19
- * React component invoked to render the activity message.
20
- */
21
- render: React.ComponentType<{
22
- activityType: string;
23
- content: TActivityContent;
24
- message: ActivityMessage;
25
- agent: AbstractAgent | undefined;
26
- }>;
27
- }