@copilotkit/react-core 1.54.1 → 1.55.0-next.7

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 (183) hide show
  1. package/CHANGELOG.md +117 -116
  2. package/dist/copilotkit-B3Mb1yVE.cjs +7975 -0
  3. package/dist/copilotkit-B3Mb1yVE.cjs.map +1 -0
  4. package/dist/copilotkit-DBzgOMby.d.cts +2182 -0
  5. package/dist/copilotkit-DBzgOMby.d.cts.map +1 -0
  6. package/dist/copilotkit-DNYSFuz5.mjs +7562 -0
  7. package/dist/copilotkit-DNYSFuz5.mjs.map +1 -0
  8. package/dist/copilotkit-Dy5w3qEV.d.mts +2182 -0
  9. package/dist/copilotkit-Dy5w3qEV.d.mts.map +1 -0
  10. package/dist/index.cjs +27 -28
  11. package/dist/index.cjs.map +1 -1
  12. package/dist/index.d.cts +3 -3
  13. package/dist/index.d.cts.map +1 -1
  14. package/dist/index.d.mts +3 -3
  15. package/dist/index.d.mts.map +1 -1
  16. package/dist/index.mjs +4 -5
  17. package/dist/index.mjs.map +1 -1
  18. package/dist/index.umd.js +1941 -35
  19. package/dist/index.umd.js.map +1 -1
  20. package/dist/v2/index.cjs +77 -7
  21. package/dist/v2/index.css +1 -2
  22. package/dist/v2/index.d.cts +6 -4
  23. package/dist/v2/index.d.mts +6 -4
  24. package/dist/v2/index.mjs +7 -4
  25. package/dist/v2/index.umd.js +5725 -24
  26. package/dist/v2/index.umd.js.map +1 -1
  27. package/package.json +37 -9
  28. package/scripts/scope-preflight.mjs +101 -0
  29. package/src/components/CopilotListeners.tsx +2 -6
  30. package/src/components/copilot-provider/copilot-messages.tsx +1 -1
  31. package/src/components/copilot-provider/copilotkit-props.tsx +1 -1
  32. package/src/components/copilot-provider/copilotkit.tsx +4 -4
  33. package/src/context/copilot-messages-context.tsx +1 -1
  34. package/src/hooks/__tests__/use-coagent-config.test.ts +2 -2
  35. package/src/hooks/__tests__/use-coagent-state-render.e2e.test.tsx +2 -2
  36. package/src/hooks/__tests__/use-copilot-chat-internal-connect.test.tsx +3 -7
  37. package/src/hooks/__tests__/use-frontend-tool-available.test.tsx +1 -1
  38. package/src/hooks/__tests__/use-frontend-tool-remount.e2e.test.tsx +4 -4
  39. package/src/hooks/use-agent-nodename.ts +1 -1
  40. package/src/hooks/use-coagent-state-render-bridge.tsx +1 -4
  41. package/src/hooks/use-coagent.ts +1 -1
  42. package/src/hooks/use-configure-chat-suggestions.tsx +2 -2
  43. package/src/hooks/use-copilot-chat-suggestions.tsx +2 -2
  44. package/src/hooks/use-copilot-chat_internal.ts +2 -2
  45. package/src/hooks/use-copilot-readable.ts +1 -1
  46. package/src/hooks/use-frontend-tool.ts +2 -2
  47. package/src/hooks/use-human-in-the-loop.ts +2 -2
  48. package/src/hooks/use-langgraph-interrupt.ts +2 -5
  49. package/src/hooks/use-lazy-tool-renderer.tsx +1 -1
  50. package/src/hooks/use-render-tool-call.ts +1 -1
  51. package/src/lib/copilot-task.ts +1 -1
  52. package/src/setupTests.ts +18 -14
  53. package/src/v2/__tests__/A2UIMessageRenderer.test.tsx +176 -0
  54. package/src/v2/__tests__/globalSetup.ts +14 -0
  55. package/src/v2/__tests__/setup.ts +93 -0
  56. package/src/v2/__tests__/utils/test-helpers.tsx +470 -0
  57. package/src/v2/a2ui/A2UIMessageRenderer.tsx +206 -0
  58. package/src/v2/components/CopilotKitInspector.tsx +50 -0
  59. package/src/v2/components/MCPAppsActivityRenderer.tsx +785 -0
  60. package/src/v2/components/WildcardToolCallRender.tsx +86 -0
  61. package/src/v2/components/__tests__/license-warning-banner.test.tsx +46 -0
  62. package/src/v2/components/chat/CopilotChat.tsx +431 -0
  63. package/src/v2/components/chat/CopilotChatAssistantMessage.tsx +375 -0
  64. package/src/v2/components/chat/CopilotChatAudioRecorder.tsx +350 -0
  65. package/src/v2/components/chat/CopilotChatInput.tsx +1302 -0
  66. package/src/v2/components/chat/CopilotChatMessageView.tsx +556 -0
  67. package/src/v2/components/chat/CopilotChatReasoningMessage.tsx +252 -0
  68. package/src/v2/components/chat/CopilotChatSuggestionPill.tsx +59 -0
  69. package/src/v2/components/chat/CopilotChatSuggestionView.tsx +133 -0
  70. package/src/v2/components/chat/CopilotChatToggleButton.tsx +171 -0
  71. package/src/v2/components/chat/CopilotChatToolCallsView.tsx +40 -0
  72. package/src/v2/components/chat/CopilotChatUserMessage.tsx +388 -0
  73. package/src/v2/components/chat/CopilotChatView.tsx +598 -0
  74. package/src/v2/components/chat/CopilotModalHeader.tsx +129 -0
  75. package/src/v2/components/chat/CopilotPopup.tsx +81 -0
  76. package/src/v2/components/chat/CopilotPopupView.tsx +317 -0
  77. package/src/v2/components/chat/CopilotSidebar.tsx +76 -0
  78. package/src/v2/components/chat/CopilotSidebarView.tsx +255 -0
  79. package/src/v2/components/chat/__tests__/CopilotChat.e2e.test.tsx +1113 -0
  80. package/src/v2/components/chat/__tests__/CopilotChat.onError.test.tsx +73 -0
  81. package/src/v2/components/chat/__tests__/CopilotChat.slots.e2e.test.tsx +432 -0
  82. package/src/v2/components/chat/__tests__/CopilotChatActivityRendering.e2e.test.tsx +150 -0
  83. package/src/v2/components/chat/__tests__/CopilotChatAssistantMessage.slots.e2e.test.tsx +624 -0
  84. package/src/v2/components/chat/__tests__/CopilotChatAssistantMessage.test.tsx +702 -0
  85. package/src/v2/components/chat/__tests__/CopilotChatCssClasses.test.tsx +107 -0
  86. package/src/v2/components/chat/__tests__/CopilotChatInput.slots.e2e.test.tsx +929 -0
  87. package/src/v2/components/chat/__tests__/CopilotChatInput.test.tsx +986 -0
  88. package/src/v2/components/chat/__tests__/CopilotChatMessageView.slots.e2e.test.tsx +1004 -0
  89. package/src/v2/components/chat/__tests__/CopilotChatMessageView.test.tsx +169 -0
  90. package/src/v2/components/chat/__tests__/CopilotChatSuggestionView.slots.e2e.test.tsx +530 -0
  91. package/src/v2/components/chat/__tests__/CopilotChatToolRendering.e2e.test.tsx +782 -0
  92. package/src/v2/components/chat/__tests__/CopilotChatToolRerenders.e2e.test.tsx +2413 -0
  93. package/src/v2/components/chat/__tests__/CopilotChatUserMessage.slots.e2e.test.tsx +621 -0
  94. package/src/v2/components/chat/__tests__/CopilotChatView.onClick.e2e.test.tsx +853 -0
  95. package/src/v2/components/chat/__tests__/CopilotChatView.slots.e2e.test.tsx +1050 -0
  96. package/src/v2/components/chat/__tests__/CopilotModalHeader.slots.e2e.test.tsx +484 -0
  97. package/src/v2/components/chat/__tests__/CopilotPopupView.slots.e2e.test.tsx +612 -0
  98. package/src/v2/components/chat/__tests__/CopilotSidebarView.slots.e2e.test.tsx +502 -0
  99. package/src/v2/components/chat/__tests__/MCPAppsActivityRenderer.e2e.test.tsx +1011 -0
  100. package/src/v2/components/chat/__tests__/setup.ts +1 -0
  101. package/src/v2/components/chat/index.ts +79 -0
  102. package/src/v2/components/index.ts +7 -0
  103. package/src/v2/components/license-warning-banner.tsx +198 -0
  104. package/src/v2/components/ui/button.tsx +123 -0
  105. package/src/v2/components/ui/dropdown-menu.tsx +258 -0
  106. package/src/v2/components/ui/tooltip.tsx +60 -0
  107. package/src/v2/hooks/__tests__/standard-schema-types.test.tsx +152 -0
  108. package/src/v2/hooks/__tests__/standard-schema.test.tsx +282 -0
  109. package/src/v2/hooks/__tests__/use-agent-context-timing.e2e.test.tsx +132 -0
  110. package/src/v2/hooks/__tests__/use-agent-context.test.tsx +401 -0
  111. package/src/v2/hooks/__tests__/use-agent-error-state.test.tsx +44 -0
  112. package/src/v2/hooks/__tests__/use-agent-stability.test.tsx +205 -0
  113. package/src/v2/hooks/__tests__/use-agent.e2e.test.tsx +148 -0
  114. package/src/v2/hooks/__tests__/use-component.test.tsx +123 -0
  115. package/src/v2/hooks/__tests__/use-configure-suggestions.e2e.test.tsx +696 -0
  116. package/src/v2/hooks/__tests__/use-default-render-tool.test.tsx +153 -0
  117. package/src/v2/hooks/__tests__/use-frontend-tool-available.test.tsx +167 -0
  118. package/src/v2/hooks/__tests__/use-frontend-tool.e2e.test.tsx +2129 -0
  119. package/src/v2/hooks/__tests__/use-human-in-the-loop.e2e.test.tsx +1261 -0
  120. package/src/v2/hooks/__tests__/use-interrupt.test.tsx +397 -0
  121. package/src/v2/hooks/__tests__/use-katex-styles.test.tsx +56 -0
  122. package/src/v2/hooks/__tests__/use-keyboard-height.test.tsx +192 -0
  123. package/src/v2/hooks/__tests__/use-render-tool.test.tsx +259 -0
  124. package/src/v2/hooks/__tests__/use-suggestions.e2e.test.tsx +524 -0
  125. package/src/v2/hooks/__tests__/use-threads.test.tsx +433 -0
  126. package/src/v2/hooks/__tests__/zod-regression.test.tsx +311 -0
  127. package/src/v2/hooks/index.ts +18 -0
  128. package/src/v2/hooks/use-agent-context.tsx +45 -0
  129. package/src/v2/hooks/use-agent.tsx +155 -0
  130. package/src/v2/hooks/use-component.tsx +89 -0
  131. package/src/v2/hooks/use-configure-suggestions.tsx +187 -0
  132. package/src/v2/hooks/use-default-render-tool.tsx +254 -0
  133. package/src/v2/hooks/use-frontend-tool.tsx +43 -0
  134. package/src/v2/hooks/use-human-in-the-loop.tsx +81 -0
  135. package/src/v2/hooks/use-interrupt.tsx +305 -0
  136. package/src/v2/hooks/use-keyboard-height.tsx +67 -0
  137. package/src/v2/hooks/use-render-activity-message.tsx +73 -0
  138. package/src/v2/hooks/use-render-custom-messages.tsx +93 -0
  139. package/src/v2/hooks/use-render-tool-call.tsx +175 -0
  140. package/src/v2/hooks/use-render-tool.tsx +181 -0
  141. package/src/v2/hooks/use-suggestions.tsx +91 -0
  142. package/src/v2/hooks/use-threads.tsx +256 -0
  143. package/src/v2/hooks/useKatexStyles.ts +27 -0
  144. package/src/v2/index.css +1 -1
  145. package/src/v2/index.ts +18 -2
  146. package/src/v2/lib/__tests__/completePartialMarkdown.test.ts +495 -0
  147. package/src/v2/lib/__tests__/renderSlot.test.tsx +588 -0
  148. package/src/v2/lib/react-core.ts +156 -0
  149. package/src/v2/lib/slots.tsx +143 -0
  150. package/src/v2/lib/transcription-client.ts +184 -0
  151. package/src/v2/lib/utils.ts +8 -0
  152. package/src/v2/providers/CopilotChatConfigurationProvider.tsx +162 -0
  153. package/src/v2/providers/CopilotKitProvider.tsx +600 -0
  154. package/src/v2/providers/__tests__/CopilotChatConfigurationProvider.test.tsx +546 -0
  155. package/src/v2/providers/__tests__/CopilotKitProvider.license.test.tsx +101 -0
  156. package/src/v2/providers/__tests__/CopilotKitProvider.onError.test.tsx +69 -0
  157. package/src/v2/providers/__tests__/CopilotKitProvider.renderCustomMessages.e2e.test.tsx +881 -0
  158. package/src/v2/providers/__tests__/CopilotKitProvider.stability.test.tsx +740 -0
  159. package/src/v2/providers/__tests__/CopilotKitProvider.test.tsx +642 -0
  160. package/src/v2/providers/__tests__/CopilotKitProvider.wildcard.test.tsx +294 -0
  161. package/src/v2/providers/index.ts +14 -0
  162. package/src/v2/styles/globals.css +230 -0
  163. package/src/v2/types/__tests__/defineToolCallRenderer.test.tsx +525 -0
  164. package/src/v2/types/defineToolCallRenderer.ts +65 -0
  165. package/src/v2/types/frontend-tool.ts +8 -0
  166. package/src/v2/types/human-in-the-loop.ts +33 -0
  167. package/src/v2/types/index.ts +7 -0
  168. package/src/v2/types/interrupt.ts +15 -0
  169. package/src/v2/types/react-activity-message-renderer.ts +27 -0
  170. package/src/v2/types/react-custom-message-renderer.ts +17 -0
  171. package/src/v2/types/react-tool-call-renderer.ts +32 -0
  172. package/tsdown.config.ts +34 -10
  173. package/vitest.config.mjs +4 -3
  174. package/LICENSE +0 -21
  175. package/dist/copilotkit-BRPQ2sqS.d.cts +0 -670
  176. package/dist/copilotkit-BRPQ2sqS.d.cts.map +0 -1
  177. package/dist/copilotkit-C94ayZbs.cjs +0 -2161
  178. package/dist/copilotkit-C94ayZbs.cjs.map +0 -1
  179. package/dist/copilotkit-CwZMFmSK.d.mts +0 -670
  180. package/dist/copilotkit-CwZMFmSK.d.mts.map +0 -1
  181. package/dist/copilotkit-Yh_Ld_FX.mjs +0 -2031
  182. package/dist/copilotkit-Yh_Ld_FX.mjs.map +0 -1
  183. package/dist/v2/index.css.map +0 -1
@@ -0,0 +1,148 @@
1
+ import React from "react";
2
+ import { screen, fireEvent, waitFor } from "@testing-library/react";
3
+ import { describe, it, expect } from "vitest";
4
+ import { type BaseEvent, type RunAgentInput } from "@ag-ui/client";
5
+ import { Observable } from "rxjs";
6
+ import {
7
+ MockStepwiseAgent,
8
+ renderWithCopilotKit,
9
+ runStartedEvent,
10
+ runFinishedEvent,
11
+ textChunkEvent,
12
+ testId,
13
+ } from "../../__tests__/utils/test-helpers";
14
+ import { useAgent } from "../use-agent";
15
+ import { useCopilotKit } from "../../providers/CopilotKitProvider";
16
+ import { CopilotChat } from "../../components/chat/CopilotChat";
17
+
18
+ /**
19
+ * Mock agent that captures RunAgentInput to verify state is passed correctly
20
+ */
21
+ class StateCapturingMockAgent extends MockStepwiseAgent {
22
+ public lastRunInput?: RunAgentInput;
23
+
24
+ run(input: RunAgentInput): Observable<BaseEvent> {
25
+ this.lastRunInput = input;
26
+ return super.run(input);
27
+ }
28
+ }
29
+
30
+ describe("useAgent e2e", () => {
31
+ describe("setState passes state to agent run", () => {
32
+ it("agent receives state set via setState when runAgent is called", async () => {
33
+ const agent = new StateCapturingMockAgent();
34
+
35
+ /**
36
+ * Test component that:
37
+ * 1. Gets agent via useAgent()
38
+ * 2. Gets copilotkit via useCopilotKit()
39
+ * 3. Sets state on agent and calls runAgent
40
+ */
41
+ function StateTestComponent() {
42
+ const { agent: hookAgent } = useAgent();
43
+ const { copilotkit } = useCopilotKit();
44
+
45
+ const handleSetStateAndRun = async () => {
46
+ hookAgent.setState({ testKey: "testValue", counter: 42 });
47
+ await copilotkit.runAgent({ agent: hookAgent });
48
+ };
49
+
50
+ return (
51
+ <button data-testid="trigger-btn" onClick={handleSetStateAndRun}>
52
+ Set State and Run
53
+ </button>
54
+ );
55
+ }
56
+
57
+ renderWithCopilotKit({
58
+ agent,
59
+ children: <StateTestComponent />,
60
+ });
61
+
62
+ // Click the button to set state and trigger runAgent
63
+ const triggerBtn = await screen.findByTestId("trigger-btn");
64
+ fireEvent.click(triggerBtn);
65
+
66
+ // Wait for the agent's run method to be called
67
+ await waitFor(() => {
68
+ expect(agent.lastRunInput).toBeDefined();
69
+ });
70
+
71
+ // Complete the agent run
72
+ agent.emit(runStartedEvent());
73
+ agent.emit(runFinishedEvent());
74
+ agent.complete();
75
+
76
+ // Verify the state was passed to the agent
77
+ expect(agent.lastRunInput?.state).toEqual({
78
+ testKey: "testValue",
79
+ counter: 42,
80
+ });
81
+ });
82
+ });
83
+
84
+ describe("addMessage + runAgent displays in CopilotChat", () => {
85
+ it("messages added via useAgent show up in CopilotChat", async () => {
86
+ const agent = new MockStepwiseAgent();
87
+
88
+ /**
89
+ * Test component that:
90
+ * 1. Gets agent via useAgent()
91
+ * 2. Gets copilotkit via useCopilotKit()
92
+ * 3. Adds a user message and calls runAgent
93
+ */
94
+ function MessageTestComponent() {
95
+ const { agent: hookAgent } = useAgent();
96
+ const { copilotkit } = useCopilotKit();
97
+
98
+ const handleAddMessageAndRun = async () => {
99
+ hookAgent.addMessage({
100
+ id: testId("user-msg"),
101
+ role: "user",
102
+ content: "Hello from useAgent!",
103
+ });
104
+ await copilotkit.runAgent({ agent: hookAgent });
105
+ };
106
+
107
+ return (
108
+ <div>
109
+ <button data-testid="send-btn" onClick={handleAddMessageAndRun}>
110
+ Send Message
111
+ </button>
112
+ <div style={{ height: 400 }}>
113
+ <CopilotChat />
114
+ </div>
115
+ </div>
116
+ );
117
+ }
118
+
119
+ renderWithCopilotKit({
120
+ agent,
121
+ children: <MessageTestComponent />,
122
+ });
123
+
124
+ // Click the button to add message and trigger runAgent
125
+ const sendBtn = await screen.findByTestId("send-btn");
126
+ fireEvent.click(sendBtn);
127
+
128
+ // User message should appear in the chat
129
+ await waitFor(() => {
130
+ expect(screen.getByText("Hello from useAgent!")).toBeDefined();
131
+ });
132
+
133
+ // Simulate agent response
134
+ const responseId = testId("assistant-msg");
135
+ agent.emit(runStartedEvent());
136
+ agent.emit(textChunkEvent(responseId, "Hello! I received your message."));
137
+ agent.emit(runFinishedEvent());
138
+ agent.complete();
139
+
140
+ // Assistant response should appear in the chat
141
+ await waitFor(() => {
142
+ expect(
143
+ screen.getByText("Hello! I received your message."),
144
+ ).toBeDefined();
145
+ });
146
+ });
147
+ });
148
+ });
@@ -0,0 +1,123 @@
1
+ import React from "react";
2
+ import { render } from "@testing-library/react";
3
+ import { describe, it, expect, beforeEach, vi } from "vitest";
4
+ import { z } from "zod";
5
+ import { useComponent } from "../use-component";
6
+ import { useFrontendTool } from "../use-frontend-tool";
7
+
8
+ vi.mock("../use-frontend-tool", () => ({
9
+ useFrontendTool: vi.fn(),
10
+ }));
11
+
12
+ const mockUseFrontendTool = useFrontendTool as ReturnType<typeof vi.fn>;
13
+
14
+ describe("useComponent", () => {
15
+ beforeEach(() => {
16
+ vi.clearAllMocks();
17
+ });
18
+
19
+ it("registers a component tool with generated default description", () => {
20
+ const DemoComponent: React.FC<{ city: string }> = ({ city }) => (
21
+ <div>{city}</div>
22
+ );
23
+
24
+ const Harness: React.FC = () => {
25
+ useComponent({
26
+ name: "showWeatherCard",
27
+ render: DemoComponent,
28
+ });
29
+ return null;
30
+ };
31
+
32
+ render(<Harness />);
33
+
34
+ expect(mockUseFrontendTool).toHaveBeenCalledTimes(1);
35
+ const [toolConfig] = mockUseFrontendTool.mock.calls[0] as [
36
+ {
37
+ name: string;
38
+ description: string;
39
+ },
40
+ ];
41
+
42
+ expect(toolConfig.name).toBe("showWeatherCard");
43
+ expect(toolConfig.description).toContain(
44
+ 'Use this tool to display the "showWeatherCard" component in the chat.',
45
+ );
46
+ });
47
+
48
+ it("appends custom description and forwards parameters, agentId, and deps", () => {
49
+ const weatherSchema = z.object({
50
+ city: z.string(),
51
+ unit: z.enum(["c", "f"]),
52
+ });
53
+
54
+ const DemoComponent: React.FC<z.infer<typeof weatherSchema>> = ({
55
+ city,
56
+ }) => <div>{city}</div>;
57
+
58
+ const deps = ["v1"] as const;
59
+
60
+ const Harness: React.FC = () => {
61
+ useComponent(
62
+ {
63
+ name: "showWeatherCard",
64
+ description: "Render a weather card for the selected city.",
65
+ parameters: weatherSchema,
66
+ render: DemoComponent,
67
+ agentId: "weather-agent",
68
+ },
69
+ deps,
70
+ );
71
+ return null;
72
+ };
73
+
74
+ render(<Harness />);
75
+
76
+ expect(mockUseFrontendTool).toHaveBeenCalledTimes(1);
77
+ const [toolConfig, forwardedDeps] = mockUseFrontendTool.mock.calls[0] as [
78
+ {
79
+ description: string;
80
+ parameters: typeof weatherSchema;
81
+ agentId?: string;
82
+ },
83
+ ReadonlyArray<unknown>,
84
+ ];
85
+
86
+ expect(toolConfig.description).toContain(
87
+ 'Use this tool to display the "showWeatherCard" component in the chat.',
88
+ );
89
+ expect(toolConfig.description).toContain(
90
+ "Render a weather card for the selected city.",
91
+ );
92
+ expect(toolConfig.parameters).toBe(weatherSchema);
93
+ expect(toolConfig.agentId).toBe("weather-agent");
94
+ expect(forwardedDeps).toBe(deps);
95
+ });
96
+
97
+ it("creates a render function that passes args into the component", () => {
98
+ const DemoComponent: React.FC<{ city: string }> = ({ city }) => (
99
+ <div data-testid="city">{city}</div>
100
+ );
101
+
102
+ const Harness: React.FC = () => {
103
+ useComponent({
104
+ name: "showWeatherCard",
105
+ render: DemoComponent,
106
+ });
107
+ return null;
108
+ };
109
+
110
+ render(<Harness />);
111
+
112
+ const [toolConfig] = mockUseFrontendTool.mock.calls[0] as [
113
+ {
114
+ render: (props: { args: { city: string } }) => React.ReactElement;
115
+ },
116
+ ];
117
+
118
+ const { getByTestId } = render(
119
+ toolConfig.render({ args: { city: "Paris" } }),
120
+ );
121
+ expect(getByTestId("city").textContent).toBe("Paris");
122
+ });
123
+ });