@copilotkit/react-core 1.57.2 → 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.
- package/LICENSE +21 -0
- package/package.json +12 -13
- package/skills/react-core/SKILL.md +108 -0
- package/skills/react-core/references/agent-access.md +288 -0
- package/skills/react-core/references/attachments.md +291 -0
- package/skills/react-core/references/capabilities.md +138 -0
- package/skills/react-core/references/chat-components.md +221 -0
- package/skills/react-core/references/client-side-tools.md +358 -0
- package/skills/react-core/references/custom-message-renderers.md +226 -0
- package/skills/react-core/references/debug-mode.md +153 -0
- package/skills/react-core/references/human-in-the-loop.md +312 -0
- package/skills/react-core/references/provider-setup.md +326 -0
- package/skills/react-core/references/rendering-activity-messages.md +207 -0
- package/skills/react-core/references/rendering-tool-calls.md +319 -0
- package/skills/react-core/references/suggestions.md +211 -0
- package/skills/react-core/references/switching-agents-recipes.md +160 -0
- package/skills/react-core/references/switching-agents.md +231 -0
- package/skills/react-core/references/threads.md +226 -0
- package/.attw.json +0 -3
- package/CHANGELOG.md +0 -5043
- package/scripts/scope-preflight.mjs +0 -100
- package/src/components/CopilotListeners.tsx +0 -137
- package/src/components/__tests__/CopilotListeners.test.tsx +0 -38
- package/src/components/copilot-provider/__tests__/copilot-messages-key.test.tsx +0 -92
- package/src/components/copilot-provider/__tests__/copilotkit-error.test.tsx +0 -77
- package/src/components/copilot-provider/__tests__/error-visibility-prod.test.tsx +0 -70
- package/src/components/copilot-provider/__tests__/v1-explicit-threadid-bridge.test.tsx +0 -107
- package/src/components/copilot-provider/copilot-messages.tsx +0 -314
- package/src/components/copilot-provider/copilotkit-props.tsx +0 -214
- package/src/components/copilot-provider/copilotkit.tsx +0 -853
- package/src/components/copilot-provider/index.ts +0 -3
- package/src/components/dev-console/console-trigger.tsx +0 -283
- package/src/components/dev-console/developer-console-modal.tsx +0 -1016
- package/src/components/dev-console/icons.tsx +0 -106
- package/src/components/error-boundary/error-boundary.tsx +0 -99
- package/src/components/error-boundary/error-utils.tsx +0 -105
- package/src/components/index.ts +0 -1
- package/src/components/toast/exclamation-mark-icon.tsx +0 -27
- package/src/components/toast/toast-provider.tsx +0 -448
- package/src/components/usage-banner.tsx +0 -266
- package/src/context/__tests__/threads-context.test.tsx +0 -141
- package/src/context/coagent-state-renders-context.tsx +0 -89
- package/src/context/copilot-context.tsx +0 -365
- package/src/context/copilot-messages-context.tsx +0 -35
- package/src/context/index.ts +0 -22
- package/src/context/threads-context.tsx +0 -69
- package/src/hooks/__tests__/use-coagent-config.test.ts +0 -352
- package/src/hooks/__tests__/use-coagent-state-render-bridge.helpers.test.ts +0 -107
- package/src/hooks/__tests__/use-coagent-state-render.e2e.test.tsx +0 -1209
- package/src/hooks/__tests__/use-coagent-state-render.test.tsx +0 -356
- package/src/hooks/__tests__/use-copilot-chat-internal-connect.test.tsx +0 -241
- package/src/hooks/__tests__/use-frontend-tool-available.test.tsx +0 -72
- package/src/hooks/__tests__/use-frontend-tool-remount.e2e.test.tsx +0 -102
- package/src/hooks/index.ts +0 -33
- package/src/hooks/use-agent-nodename.ts +0 -33
- package/src/hooks/use-coagent-state-render-bridge.helpers.ts +0 -345
- package/src/hooks/use-coagent-state-render-bridge.tsx +0 -222
- package/src/hooks/use-coagent-state-render-registry.ts +0 -230
- package/src/hooks/use-coagent-state-render.ts +0 -163
- package/src/hooks/use-coagent.ts +0 -377
- package/src/hooks/use-configure-chat-suggestions.tsx +0 -96
- package/src/hooks/use-copilot-action.ts +0 -245
- package/src/hooks/use-copilot-additional-instructions.ts +0 -98
- package/src/hooks/use-copilot-authenticated-action.ts +0 -73
- package/src/hooks/use-copilot-chat-headless_c.ts +0 -264
- package/src/hooks/use-copilot-chat-suggestions.tsx +0 -134
- package/src/hooks/use-copilot-chat.ts +0 -132
- package/src/hooks/use-copilot-chat_internal.ts +0 -875
- package/src/hooks/use-copilot-readable.ts +0 -135
- package/src/hooks/use-copilot-runtime-client.ts +0 -178
- package/src/hooks/use-default-tool.ts +0 -13
- package/src/hooks/use-flat-category-store.ts +0 -109
- package/src/hooks/use-frontend-tool.ts +0 -113
- package/src/hooks/use-human-in-the-loop.ts +0 -138
- package/src/hooks/use-langgraph-interrupt.ts +0 -103
- package/src/hooks/use-lazy-tool-renderer.tsx +0 -30
- package/src/hooks/use-make-copilot-document-readable.ts +0 -30
- package/src/hooks/use-render-tool-call.ts +0 -89
- package/src/hooks/use-tree.ts +0 -222
- package/src/index.tsx +0 -7
- package/src/lib/copilot-task.ts +0 -215
- package/src/lib/index.ts +0 -1
- package/src/lib/status-checker.ts +0 -67
- package/src/setupTests.ts +0 -37
- package/src/test-helpers/copilot-context.ts +0 -91
- package/src/types/chat-suggestion-configuration.ts +0 -23
- package/src/types/coagent-action.ts +0 -35
- package/src/types/coagent-state.ts +0 -13
- package/src/types/crew.ts +0 -89
- package/src/types/document-pointer.ts +0 -7
- package/src/types/frontend-action.ts +0 -213
- package/src/types/index.ts +0 -17
- package/src/types/interrupt-action.ts +0 -58
- package/src/types/system-message.ts +0 -4
- package/src/utils/dev-console.ts +0 -19
- package/src/utils/index.ts +0 -2
- package/src/utils/suggestions-constants.ts +0 -8
- package/src/utils/utils.test.ts +0 -7
- package/src/utils/utils.ts +0 -6
- package/src/v2/__tests__/A2UIMessageRenderer.test.tsx +0 -240
- package/src/v2/__tests__/globalSetup.ts +0 -14
- package/src/v2/__tests__/setup.ts +0 -93
- package/src/v2/__tests__/utils/test-helpers.tsx +0 -570
- package/src/v2/a2ui/A2UICatalogContext.tsx +0 -79
- package/src/v2/a2ui/A2UIMessageRenderer.tsx +0 -294
- package/src/v2/a2ui/A2UIToolCallRenderer.tsx +0 -290
- package/src/v2/components/CopilotKitInspector.tsx +0 -52
- package/src/v2/components/MCPAppsActivityRenderer.tsx +0 -815
- package/src/v2/components/OpenGenerativeUIRenderer.tsx +0 -598
- package/src/v2/components/WildcardToolCallRender.tsx +0 -86
- package/src/v2/components/__tests__/OpenGenerativeUIRenderer.test.tsx +0 -665
- package/src/v2/components/chat/CopilotChat.tsx +0 -664
- package/src/v2/components/chat/CopilotChatAssistantMessage.tsx +0 -393
- package/src/v2/components/chat/CopilotChatAttachmentQueue.tsx +0 -374
- package/src/v2/components/chat/CopilotChatAttachmentRenderer.tsx +0 -159
- package/src/v2/components/chat/CopilotChatAudioRecorder.tsx +0 -350
- package/src/v2/components/chat/CopilotChatInput.tsx +0 -1412
- package/src/v2/components/chat/CopilotChatMessageView.tsx +0 -716
- package/src/v2/components/chat/CopilotChatReasoningMessage.tsx +0 -265
- package/src/v2/components/chat/CopilotChatSuggestionPill.tsx +0 -59
- package/src/v2/components/chat/CopilotChatSuggestionView.tsx +0 -134
- package/src/v2/components/chat/CopilotChatToggleButton.tsx +0 -171
- package/src/v2/components/chat/CopilotChatToolCallsView.tsx +0 -40
- package/src/v2/components/chat/CopilotChatUserMessage.tsx +0 -445
- package/src/v2/components/chat/CopilotChatView.tsx +0 -890
- package/src/v2/components/chat/CopilotModalHeader.tsx +0 -129
- package/src/v2/components/chat/CopilotPopup.tsx +0 -81
- package/src/v2/components/chat/CopilotPopupView.tsx +0 -317
- package/src/v2/components/chat/CopilotSidebar.tsx +0 -80
- package/src/v2/components/chat/CopilotSidebarView.tsx +0 -269
- package/src/v2/components/chat/Lightbox.tsx +0 -103
- package/src/v2/components/chat/__tests__/CopilotChat.absentThreadConnect.test.tsx +0 -66
- package/src/v2/components/chat/__tests__/CopilotChat.attachments.test.tsx +0 -168
- package/src/v2/components/chat/__tests__/CopilotChat.e2e.test.tsx +0 -1239
- package/src/v2/components/chat/__tests__/CopilotChat.onError.test.tsx +0 -73
- package/src/v2/components/chat/__tests__/CopilotChat.slots.e2e.test.tsx +0 -432
- package/src/v2/components/chat/__tests__/CopilotChat.suggestionsAlways.test.tsx +0 -183
- package/src/v2/components/chat/__tests__/CopilotChat.welcomeGate.test.tsx +0 -184
- package/src/v2/components/chat/__tests__/CopilotChatActivityRendering.e2e.test.tsx +0 -649
- package/src/v2/components/chat/__tests__/CopilotChatAssistantMessage.slots.e2e.test.tsx +0 -624
- package/src/v2/components/chat/__tests__/CopilotChatAssistantMessage.test.tsx +0 -702
- package/src/v2/components/chat/__tests__/CopilotChatAssistantMessage.thumbs.test.tsx +0 -72
- package/src/v2/components/chat/__tests__/CopilotChatCopyButton.clipboard.test.tsx +0 -241
- package/src/v2/components/chat/__tests__/CopilotChatCssClasses.test.tsx +0 -107
- package/src/v2/components/chat/__tests__/CopilotChatInput.slots.e2e.test.tsx +0 -929
- package/src/v2/components/chat/__tests__/CopilotChatInput.test.tsx +0 -1567
- package/src/v2/components/chat/__tests__/CopilotChatMessageView.slots.e2e.test.tsx +0 -1004
- package/src/v2/components/chat/__tests__/CopilotChatMessageView.test.tsx +0 -279
- package/src/v2/components/chat/__tests__/CopilotChatPerf.e2e.test.tsx +0 -296
- package/src/v2/components/chat/__tests__/CopilotChatPropsRerender.e2e.test.tsx +0 -249
- package/src/v2/components/chat/__tests__/CopilotChatSuggestionView.slots.e2e.test.tsx +0 -530
- package/src/v2/components/chat/__tests__/CopilotChatToolRendering.e2e.test.tsx +0 -785
- package/src/v2/components/chat/__tests__/CopilotChatToolRerenders.e2e.test.tsx +0 -2416
- package/src/v2/components/chat/__tests__/CopilotChatUserMessage.slots.e2e.test.tsx +0 -621
- package/src/v2/components/chat/__tests__/CopilotChatView.connectingGate.test.tsx +0 -56
- package/src/v2/components/chat/__tests__/CopilotChatView.inputOverlay.test.tsx +0 -264
- package/src/v2/components/chat/__tests__/CopilotChatView.onClick.e2e.test.tsx +0 -853
- package/src/v2/components/chat/__tests__/CopilotChatView.pinToSend.test.tsx +0 -94
- package/src/v2/components/chat/__tests__/CopilotChatView.slots.e2e.test.tsx +0 -1050
- package/src/v2/components/chat/__tests__/CopilotModalHeader.slots.e2e.test.tsx +0 -484
- package/src/v2/components/chat/__tests__/CopilotPopupView.slots.e2e.test.tsx +0 -612
- package/src/v2/components/chat/__tests__/CopilotSidebarView.position.test.tsx +0 -159
- package/src/v2/components/chat/__tests__/CopilotSidebarView.slots.e2e.test.tsx +0 -502
- package/src/v2/components/chat/__tests__/MCPAppsActivityRenderer.e2e.test.tsx +0 -1068
- package/src/v2/components/chat/__tests__/MCPAppsProxy.e2e.test.tsx +0 -589
- package/src/v2/components/chat/__tests__/MCPAppsUiMessage.e2e.test.tsx +0 -403
- package/src/v2/components/chat/__tests__/copilot-chat-throttle.test.tsx +0 -137
- package/src/v2/components/chat/__tests__/normalize-auto-scroll.test.ts +0 -37
- package/src/v2/components/chat/__tests__/setup.ts +0 -1
- package/src/v2/components/chat/index.ts +0 -90
- package/src/v2/components/chat/last-user-message-context.ts +0 -21
- package/src/v2/components/chat/normalize-auto-scroll.ts +0 -17
- package/src/v2/components/chat/scroll-element-context.ts +0 -13
- package/src/v2/components/index.ts +0 -8
- package/src/v2/components/intelligence-indicator/IntelligenceIndicator.tsx +0 -286
- package/src/v2/components/intelligence-indicator/__tests__/IntelligenceIndicator.e2e.test.tsx +0 -464
- package/src/v2/components/intelligence-indicator/index.ts +0 -2
- package/src/v2/components/license-warning-banner.tsx +0 -217
- package/src/v2/components/ui/button.tsx +0 -124
- package/src/v2/components/ui/dropdown-menu.tsx +0 -258
- package/src/v2/components/ui/tooltip.tsx +0 -60
- package/src/v2/context.ts +0 -62
- package/src/v2/headless.ts +0 -64
- package/src/v2/hooks/__tests__/standard-schema-types.test.tsx +0 -152
- package/src/v2/hooks/__tests__/standard-schema.test.tsx +0 -282
- package/src/v2/hooks/__tests__/use-agent-context-timing.e2e.test.tsx +0 -140
- package/src/v2/hooks/__tests__/use-agent-context.test.tsx +0 -401
- package/src/v2/hooks/__tests__/use-agent-error-state.test.tsx +0 -44
- package/src/v2/hooks/__tests__/use-agent-stability.test.tsx +0 -211
- package/src/v2/hooks/__tests__/use-agent-throttle.test.tsx +0 -1029
- package/src/v2/hooks/__tests__/use-agent.e2e.test.tsx +0 -159
- package/src/v2/hooks/__tests__/use-attachments.test.tsx +0 -169
- package/src/v2/hooks/__tests__/use-capabilities.test.tsx +0 -76
- package/src/v2/hooks/__tests__/use-component.test.tsx +0 -126
- package/src/v2/hooks/__tests__/use-configure-suggestions.e2e.test.tsx +0 -696
- package/src/v2/hooks/__tests__/use-default-render-tool.test.tsx +0 -153
- package/src/v2/hooks/__tests__/use-frontend-tool-available.test.tsx +0 -167
- package/src/v2/hooks/__tests__/use-frontend-tool.e2e.test.tsx +0 -2148
- package/src/v2/hooks/__tests__/use-human-in-the-loop.e2e.test.tsx +0 -1261
- package/src/v2/hooks/__tests__/use-interrupt.test.tsx +0 -397
- package/src/v2/hooks/__tests__/use-katex-styles.test.tsx +0 -56
- package/src/v2/hooks/__tests__/use-keyboard-height.test.tsx +0 -192
- package/src/v2/hooks/__tests__/use-pin-to-send.test.tsx +0 -219
- package/src/v2/hooks/__tests__/use-render-custom-messages.test.tsx +0 -55
- package/src/v2/hooks/__tests__/use-render-tool.test.tsx +0 -259
- package/src/v2/hooks/__tests__/use-suggestions.e2e.test.tsx +0 -524
- package/src/v2/hooks/__tests__/use-threads.test.tsx +0 -757
- package/src/v2/hooks/__tests__/zod-regression.test.tsx +0 -311
- package/src/v2/hooks/index.ts +0 -24
- package/src/v2/hooks/use-agent-context.tsx +0 -45
- package/src/v2/hooks/use-agent.tsx +0 -227
- package/src/v2/hooks/use-attachments.tsx +0 -269
- package/src/v2/hooks/use-capabilities.tsx +0 -25
- package/src/v2/hooks/use-component.tsx +0 -91
- package/src/v2/hooks/use-configure-suggestions.tsx +0 -236
- package/src/v2/hooks/use-default-render-tool.tsx +0 -271
- package/src/v2/hooks/use-frontend-tool.tsx +0 -46
- package/src/v2/hooks/use-human-in-the-loop.tsx +0 -81
- package/src/v2/hooks/use-interrupt.tsx +0 -305
- package/src/v2/hooks/use-keyboard-height.tsx +0 -67
- package/src/v2/hooks/use-pin-to-send.ts +0 -94
- package/src/v2/hooks/use-render-activity-message.tsx +0 -72
- package/src/v2/hooks/use-render-custom-messages.tsx +0 -93
- package/src/v2/hooks/use-render-tool-call.tsx +0 -208
- package/src/v2/hooks/use-render-tool.tsx +0 -184
- package/src/v2/hooks/use-suggestions.tsx +0 -91
- package/src/v2/hooks/use-threads.tsx +0 -325
- package/src/v2/hooks/useKatexStyles.ts +0 -27
- package/src/v2/index.css +0 -1
- package/src/v2/index.ts +0 -27
- package/src/v2/lib/__tests__/completePartialMarkdown.test.ts +0 -495
- package/src/v2/lib/__tests__/processPartialHtml.test.ts +0 -112
- package/src/v2/lib/__tests__/renderSlot.test.tsx +0 -588
- package/src/v2/lib/__tests__/slots.test.ts +0 -56
- package/src/v2/lib/processPartialHtml.ts +0 -45
- package/src/v2/lib/react-core.ts +0 -156
- package/src/v2/lib/slots.tsx +0 -184
- package/src/v2/lib/transcription-client.ts +0 -184
- package/src/v2/lib/utils.ts +0 -8
- package/src/v2/providers/CopilotChatConfigurationProvider.tsx +0 -196
- package/src/v2/providers/CopilotKitProvider.tsx +0 -800
- package/src/v2/providers/SandboxFunctionsContext.ts +0 -10
- package/src/v2/providers/__tests__/CopilotChatConfigurationProvider.test.tsx +0 -652
- package/src/v2/providers/__tests__/CopilotKitProvider.license.test.tsx +0 -101
- package/src/v2/providers/__tests__/CopilotKitProvider.onError.test.tsx +0 -69
- package/src/v2/providers/__tests__/CopilotKitProvider.renderCustomMessages.e2e.test.tsx +0 -881
- package/src/v2/providers/__tests__/CopilotKitProvider.sandboxFunctions.test.tsx +0 -198
- package/src/v2/providers/__tests__/CopilotKitProvider.stability.test.tsx +0 -740
- package/src/v2/providers/__tests__/CopilotKitProvider.test.tsx +0 -713
- package/src/v2/providers/__tests__/CopilotKitProvider.wildcard.test.tsx +0 -294
- package/src/v2/providers/index.ts +0 -21
- package/src/v2/styles/globals.css +0 -349
- package/src/v2/types/__tests__/defineToolCallRenderer.test.tsx +0 -525
- package/src/v2/types/defineToolCallRenderer.ts +0 -68
- package/src/v2/types/frontend-tool.ts +0 -8
- package/src/v2/types/human-in-the-loop.ts +0 -33
- package/src/v2/types/index.ts +0 -8
- package/src/v2/types/interrupt.ts +0 -15
- package/src/v2/types/react-activity-message-renderer.ts +0 -27
- package/src/v2/types/react-custom-message-renderer.ts +0 -17
- package/src/v2/types/react-tool-call-renderer.ts +0 -35
- package/src/v2/types/sandbox-function.ts +0 -11
- package/tsconfig.json +0 -8
- package/tsdown.config.ts +0 -193
- package/typedoc.json +0 -4
- package/vitest.config.mjs +0 -31
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
3
|
-
import { render, screen, fireEvent } from "@testing-library/react";
|
|
4
|
-
import { AssistantMessage } from "@ag-ui/core";
|
|
5
|
-
import { CopilotChatAssistantMessage } from "../CopilotChatAssistantMessage";
|
|
6
|
-
import { CopilotChatConfigurationProvider } from "../../../providers/CopilotChatConfigurationProvider";
|
|
7
|
-
import { CopilotKitProvider } from "../../../providers/CopilotKitProvider";
|
|
8
|
-
|
|
9
|
-
const TEST_THREAD_ID = "test-thread";
|
|
10
|
-
|
|
11
|
-
const renderWithProvider = (component: React.ReactElement) => {
|
|
12
|
-
return render(
|
|
13
|
-
<CopilotKitProvider>
|
|
14
|
-
<CopilotChatConfigurationProvider threadId={TEST_THREAD_ID}>
|
|
15
|
-
{component}
|
|
16
|
-
</CopilotChatConfigurationProvider>
|
|
17
|
-
</CopilotKitProvider>,
|
|
18
|
-
);
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
describe("CopilotChatAssistantMessage thumbs callbacks (#3457)", () => {
|
|
22
|
-
const message: AssistantMessage = {
|
|
23
|
-
id: "msg-1",
|
|
24
|
-
role: "assistant",
|
|
25
|
-
content: "Hello from the assistant",
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
it("onThumbsUp receives AssistantMessage, not SyntheticEvent", () => {
|
|
29
|
-
const onThumbsUp = vi.fn();
|
|
30
|
-
|
|
31
|
-
renderWithProvider(
|
|
32
|
-
<CopilotChatAssistantMessage message={message} onThumbsUp={onThumbsUp} />,
|
|
33
|
-
);
|
|
34
|
-
|
|
35
|
-
const thumbsUpButton = screen.getByRole("button", {
|
|
36
|
-
name: /good response/i,
|
|
37
|
-
});
|
|
38
|
-
fireEvent.click(thumbsUpButton);
|
|
39
|
-
|
|
40
|
-
expect(onThumbsUp).toHaveBeenCalledTimes(1);
|
|
41
|
-
const arg = onThumbsUp.mock.calls[0][0];
|
|
42
|
-
// Should receive AssistantMessage
|
|
43
|
-
expect(arg).toHaveProperty("id", "msg-1");
|
|
44
|
-
expect(arg).toHaveProperty("role", "assistant");
|
|
45
|
-
expect(arg).toHaveProperty("content", "Hello from the assistant");
|
|
46
|
-
// Should NOT receive a SyntheticEvent (which has nativeEvent, target, etc.)
|
|
47
|
-
expect(arg).not.toHaveProperty("nativeEvent");
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
it("onThumbsDown receives AssistantMessage, not SyntheticEvent", () => {
|
|
51
|
-
const onThumbsDown = vi.fn();
|
|
52
|
-
|
|
53
|
-
renderWithProvider(
|
|
54
|
-
<CopilotChatAssistantMessage
|
|
55
|
-
message={message}
|
|
56
|
-
onThumbsDown={onThumbsDown}
|
|
57
|
-
/>,
|
|
58
|
-
);
|
|
59
|
-
|
|
60
|
-
const thumbsDownButton = screen.getByRole("button", {
|
|
61
|
-
name: /bad response/i,
|
|
62
|
-
});
|
|
63
|
-
fireEvent.click(thumbsDownButton);
|
|
64
|
-
|
|
65
|
-
expect(onThumbsDown).toHaveBeenCalledTimes(1);
|
|
66
|
-
const arg = onThumbsDown.mock.calls[0][0];
|
|
67
|
-
expect(arg).toHaveProperty("id", "msg-1");
|
|
68
|
-
expect(arg).toHaveProperty("role", "assistant");
|
|
69
|
-
expect(arg).toHaveProperty("content", "Hello from the assistant");
|
|
70
|
-
expect(arg).not.toHaveProperty("nativeEvent");
|
|
71
|
-
});
|
|
72
|
-
});
|
|
@@ -1,241 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { render, screen, fireEvent, waitFor } from "@testing-library/react";
|
|
3
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
4
|
-
import { CopilotChatAssistantMessage } from "../CopilotChatAssistantMessage";
|
|
5
|
-
import { CopilotChatUserMessage } from "../CopilotChatUserMessage";
|
|
6
|
-
import { CopilotKitProvider } from "../../../providers/CopilotKitProvider";
|
|
7
|
-
import { CopilotChatConfigurationProvider } from "../../../providers/CopilotChatConfigurationProvider";
|
|
8
|
-
import { AssistantMessage, UserMessage } from "@ag-ui/core";
|
|
9
|
-
|
|
10
|
-
const TestWrapper: React.FC<{ children: React.ReactNode }> = ({ children }) => (
|
|
11
|
-
<CopilotKitProvider>
|
|
12
|
-
<CopilotChatConfigurationProvider threadId="test-thread">
|
|
13
|
-
{children}
|
|
14
|
-
</CopilotChatConfigurationProvider>
|
|
15
|
-
</CopilotKitProvider>
|
|
16
|
-
);
|
|
17
|
-
|
|
18
|
-
const createAssistantMessage = (content: string): AssistantMessage => ({
|
|
19
|
-
id: "msg-assistant-1",
|
|
20
|
-
role: "assistant",
|
|
21
|
-
content,
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
const createUserMessage = (content: string): UserMessage => ({
|
|
25
|
-
id: "msg-user-1",
|
|
26
|
-
role: "user",
|
|
27
|
-
content,
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
describe("CopyButton clipboard behavior", () => {
|
|
31
|
-
let originalClipboard: Clipboard;
|
|
32
|
-
|
|
33
|
-
beforeEach(() => {
|
|
34
|
-
originalClipboard = navigator.clipboard;
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
afterEach(() => {
|
|
38
|
-
Object.defineProperty(navigator, "clipboard", {
|
|
39
|
-
value: originalClipboard,
|
|
40
|
-
writable: true,
|
|
41
|
-
configurable: true,
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
describe("AssistantMessage CopyButton", () => {
|
|
46
|
-
it("shows copied state only after successful clipboard write", async () => {
|
|
47
|
-
const writeTextMock = vi.fn().mockResolvedValue(undefined);
|
|
48
|
-
Object.defineProperty(navigator, "clipboard", {
|
|
49
|
-
value: { writeText: writeTextMock },
|
|
50
|
-
writable: true,
|
|
51
|
-
configurable: true,
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
const message = createAssistantMessage("Hello assistant");
|
|
55
|
-
render(
|
|
56
|
-
<TestWrapper>
|
|
57
|
-
<CopilotChatAssistantMessage message={message} />
|
|
58
|
-
</TestWrapper>,
|
|
59
|
-
);
|
|
60
|
-
|
|
61
|
-
const copyButton = screen.getByTestId("copilot-copy-button");
|
|
62
|
-
fireEvent.click(copyButton);
|
|
63
|
-
|
|
64
|
-
await waitFor(() => {
|
|
65
|
-
expect(writeTextMock).toHaveBeenCalledWith("Hello assistant");
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
// After successful write, should show check icon
|
|
69
|
-
await waitFor(() => {
|
|
70
|
-
const checkIcon = copyButton.querySelector(".lucide-check");
|
|
71
|
-
expect(checkIcon).not.toBeNull();
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
it("does NOT show copied state when clipboard API is unavailable", async () => {
|
|
76
|
-
Object.defineProperty(navigator, "clipboard", {
|
|
77
|
-
value: undefined,
|
|
78
|
-
writable: true,
|
|
79
|
-
configurable: true,
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
const message = createAssistantMessage("Hello assistant");
|
|
83
|
-
render(
|
|
84
|
-
<TestWrapper>
|
|
85
|
-
<CopilotChatAssistantMessage message={message} />
|
|
86
|
-
</TestWrapper>,
|
|
87
|
-
);
|
|
88
|
-
|
|
89
|
-
const copyButton = screen.getByTestId("copilot-copy-button");
|
|
90
|
-
fireEvent.click(copyButton);
|
|
91
|
-
|
|
92
|
-
// Wait a tick for any async handlers
|
|
93
|
-
await new Promise((r) => setTimeout(r, 50));
|
|
94
|
-
|
|
95
|
-
// Should still show copy icon (not check icon)
|
|
96
|
-
const checkIcon = copyButton.querySelector(".lucide-check");
|
|
97
|
-
expect(checkIcon).toBeNull();
|
|
98
|
-
const copyIcon = copyButton.querySelector(".lucide-copy");
|
|
99
|
-
expect(copyIcon).not.toBeNull();
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
it("logs error when clipboard write rejects", async () => {
|
|
103
|
-
const writeTextMock = vi
|
|
104
|
-
.fn()
|
|
105
|
-
.mockRejectedValue(new Error("Permission denied"));
|
|
106
|
-
Object.defineProperty(navigator, "clipboard", {
|
|
107
|
-
value: { writeText: writeTextMock },
|
|
108
|
-
writable: true,
|
|
109
|
-
configurable: true,
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
const consoleSpy = vi
|
|
113
|
-
.spyOn(console, "error")
|
|
114
|
-
.mockImplementation(() => {});
|
|
115
|
-
|
|
116
|
-
const message = createAssistantMessage("Hello assistant");
|
|
117
|
-
render(
|
|
118
|
-
<TestWrapper>
|
|
119
|
-
<CopilotChatAssistantMessage message={message} />
|
|
120
|
-
</TestWrapper>,
|
|
121
|
-
);
|
|
122
|
-
|
|
123
|
-
const copyButton = screen.getByTestId("copilot-copy-button");
|
|
124
|
-
fireEvent.click(copyButton);
|
|
125
|
-
|
|
126
|
-
await waitFor(() => {
|
|
127
|
-
expect(writeTextMock).toHaveBeenCalled();
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
await waitFor(() => {
|
|
131
|
-
expect(consoleSpy).toHaveBeenCalledWith(
|
|
132
|
-
"Failed to copy to clipboard:",
|
|
133
|
-
expect.any(Error),
|
|
134
|
-
);
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
// Should NOT show copied state when write failed
|
|
138
|
-
const checkIcon = copyButton.querySelector(".lucide-check");
|
|
139
|
-
expect(checkIcon).toBeNull();
|
|
140
|
-
|
|
141
|
-
consoleSpy.mockRestore();
|
|
142
|
-
});
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
describe("UserMessage CopyButton", () => {
|
|
146
|
-
it("shows copied state only after successful clipboard write", async () => {
|
|
147
|
-
const writeTextMock = vi.fn().mockResolvedValue(undefined);
|
|
148
|
-
Object.defineProperty(navigator, "clipboard", {
|
|
149
|
-
value: { writeText: writeTextMock },
|
|
150
|
-
writable: true,
|
|
151
|
-
configurable: true,
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
const message = createUserMessage("Hello user");
|
|
155
|
-
render(
|
|
156
|
-
<TestWrapper>
|
|
157
|
-
<CopilotChatUserMessage message={message} />
|
|
158
|
-
</TestWrapper>,
|
|
159
|
-
);
|
|
160
|
-
|
|
161
|
-
const copyButton = screen.getByTestId("copilot-user-copy-button");
|
|
162
|
-
fireEvent.click(copyButton);
|
|
163
|
-
|
|
164
|
-
await waitFor(() => {
|
|
165
|
-
expect(writeTextMock).toHaveBeenCalledWith("Hello user");
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
await waitFor(() => {
|
|
169
|
-
const checkIcon = copyButton.querySelector(".lucide-check");
|
|
170
|
-
expect(checkIcon).not.toBeNull();
|
|
171
|
-
});
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
it("does NOT show copied state when clipboard API is unavailable", async () => {
|
|
175
|
-
Object.defineProperty(navigator, "clipboard", {
|
|
176
|
-
value: undefined,
|
|
177
|
-
writable: true,
|
|
178
|
-
configurable: true,
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
const message = createUserMessage("Hello user");
|
|
182
|
-
render(
|
|
183
|
-
<TestWrapper>
|
|
184
|
-
<CopilotChatUserMessage message={message} />
|
|
185
|
-
</TestWrapper>,
|
|
186
|
-
);
|
|
187
|
-
|
|
188
|
-
const copyButton = screen.getByTestId("copilot-user-copy-button");
|
|
189
|
-
fireEvent.click(copyButton);
|
|
190
|
-
|
|
191
|
-
await new Promise((r) => setTimeout(r, 50));
|
|
192
|
-
|
|
193
|
-
const checkIcon = copyButton.querySelector(".lucide-check");
|
|
194
|
-
expect(checkIcon).toBeNull();
|
|
195
|
-
const copyIcon = copyButton.querySelector(".lucide-copy");
|
|
196
|
-
expect(copyIcon).not.toBeNull();
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
it("logs error when clipboard write rejects", async () => {
|
|
200
|
-
const writeTextMock = vi
|
|
201
|
-
.fn()
|
|
202
|
-
.mockRejectedValue(new Error("Permission denied"));
|
|
203
|
-
Object.defineProperty(navigator, "clipboard", {
|
|
204
|
-
value: { writeText: writeTextMock },
|
|
205
|
-
writable: true,
|
|
206
|
-
configurable: true,
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
const consoleSpy = vi
|
|
210
|
-
.spyOn(console, "error")
|
|
211
|
-
.mockImplementation(() => {});
|
|
212
|
-
|
|
213
|
-
const message = createUserMessage("Hello user");
|
|
214
|
-
render(
|
|
215
|
-
<TestWrapper>
|
|
216
|
-
<CopilotChatUserMessage message={message} />
|
|
217
|
-
</TestWrapper>,
|
|
218
|
-
);
|
|
219
|
-
|
|
220
|
-
const copyButton = screen.getByTestId("copilot-user-copy-button");
|
|
221
|
-
fireEvent.click(copyButton);
|
|
222
|
-
|
|
223
|
-
await waitFor(() => {
|
|
224
|
-
expect(writeTextMock).toHaveBeenCalled();
|
|
225
|
-
});
|
|
226
|
-
|
|
227
|
-
await waitFor(() => {
|
|
228
|
-
expect(consoleSpy).toHaveBeenCalledWith(
|
|
229
|
-
"Failed to copy to clipboard:",
|
|
230
|
-
expect.any(Error),
|
|
231
|
-
);
|
|
232
|
-
});
|
|
233
|
-
|
|
234
|
-
// Should NOT show copied state when write failed
|
|
235
|
-
const checkIcon = copyButton.querySelector(".lucide-check");
|
|
236
|
-
expect(checkIcon).toBeNull();
|
|
237
|
-
|
|
238
|
-
consoleSpy.mockRestore();
|
|
239
|
-
});
|
|
240
|
-
});
|
|
241
|
-
});
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { render, screen } from "@testing-library/react";
|
|
3
|
-
import { CopilotKitProvider } from "../../../providers/CopilotKitProvider";
|
|
4
|
-
import { CopilotChatConfigurationProvider } from "../../../providers/CopilotChatConfigurationProvider";
|
|
5
|
-
import CopilotChatMessageView from "../CopilotChatMessageView";
|
|
6
|
-
import { CopilotChatAssistantMessage } from "../CopilotChatAssistantMessage";
|
|
7
|
-
import { CopilotChatUserMessage } from "../CopilotChatUserMessage";
|
|
8
|
-
import { CopilotChatInput } from "../CopilotChatInput";
|
|
9
|
-
import { CopilotModalHeader } from "../CopilotModalHeader";
|
|
10
|
-
import { CopilotChatToggleButton } from "../CopilotChatToggleButton";
|
|
11
|
-
import { CopilotChatView } from "../CopilotChatView";
|
|
12
|
-
import { AssistantMessage, Message, UserMessage } from "@ag-ui/core";
|
|
13
|
-
|
|
14
|
-
const TEST_THREAD_ID = "test-thread";
|
|
15
|
-
|
|
16
|
-
const renderWithProvider = (component: React.ReactElement) => {
|
|
17
|
-
return render(
|
|
18
|
-
<CopilotKitProvider>
|
|
19
|
-
<CopilotChatConfigurationProvider threadId={TEST_THREAD_ID}>
|
|
20
|
-
{component}
|
|
21
|
-
</CopilotChatConfigurationProvider>
|
|
22
|
-
</CopilotKitProvider>,
|
|
23
|
-
);
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
describe("v2 CopilotChat CSS class compatibility with v1", () => {
|
|
27
|
-
describe("CopilotChatMessageView", () => {
|
|
28
|
-
it("includes copilotKitMessages class", () => {
|
|
29
|
-
const messages: Message[] = [];
|
|
30
|
-
|
|
31
|
-
renderWithProvider(<CopilotChatMessageView messages={messages} />);
|
|
32
|
-
|
|
33
|
-
const messageList = screen.getByTestId("copilot-message-list");
|
|
34
|
-
expect(messageList.className).toContain("copilotKitMessages");
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
describe("CopilotChatAssistantMessage", () => {
|
|
39
|
-
it("includes copilotKitMessage and copilotKitAssistantMessage classes", () => {
|
|
40
|
-
const message: AssistantMessage = {
|
|
41
|
-
role: "assistant",
|
|
42
|
-
content: "Hello from the assistant",
|
|
43
|
-
id: "test-assistant-1",
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
renderWithProvider(<CopilotChatAssistantMessage message={message} />);
|
|
47
|
-
|
|
48
|
-
const el = screen.getByTestId("copilot-assistant-message");
|
|
49
|
-
expect(el.className).toContain("copilotKitMessage");
|
|
50
|
-
expect(el.className).toContain("copilotKitAssistantMessage");
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
describe("CopilotChatUserMessage", () => {
|
|
55
|
-
it("includes copilotKitMessage and copilotKitUserMessage classes", () => {
|
|
56
|
-
const message: UserMessage = {
|
|
57
|
-
role: "user",
|
|
58
|
-
content: "Hello from the user",
|
|
59
|
-
id: "test-user-1",
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
renderWithProvider(<CopilotChatUserMessage message={message} />);
|
|
63
|
-
|
|
64
|
-
const el = screen.getByTestId("copilot-user-message");
|
|
65
|
-
expect(el.className).toContain("copilotKitMessage");
|
|
66
|
-
expect(el.className).toContain("copilotKitUserMessage");
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
describe("CopilotChatInput", () => {
|
|
71
|
-
it("includes copilotKitInput class", () => {
|
|
72
|
-
renderWithProvider(<CopilotChatInput />);
|
|
73
|
-
|
|
74
|
-
const el = screen.getByTestId("copilot-chat-input");
|
|
75
|
-
expect(el.className).toContain("copilotKitInput");
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
describe("CopilotModalHeader", () => {
|
|
80
|
-
it("includes copilotKitHeader class", () => {
|
|
81
|
-
renderWithProvider(<CopilotModalHeader />);
|
|
82
|
-
|
|
83
|
-
const el = screen.getByTestId("copilot-modal-header");
|
|
84
|
-
expect(el.className).toContain("copilotKitHeader");
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
describe("CopilotChatToggleButton", () => {
|
|
89
|
-
it("includes copilotKitButton class", () => {
|
|
90
|
-
renderWithProvider(<CopilotChatToggleButton />);
|
|
91
|
-
|
|
92
|
-
const el = screen.getByTestId("copilot-chat-toggle");
|
|
93
|
-
expect(el.className).toContain("copilotKitButton");
|
|
94
|
-
});
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
describe("CopilotChatView", () => {
|
|
98
|
-
it("includes copilotKitChat class", () => {
|
|
99
|
-
renderWithProvider(
|
|
100
|
-
<CopilotChatView messages={[]} welcomeScreen={false} />,
|
|
101
|
-
);
|
|
102
|
-
|
|
103
|
-
const el = screen.getByTestId("copilot-chat");
|
|
104
|
-
expect(el.className).toContain("copilotKitChat");
|
|
105
|
-
});
|
|
106
|
-
});
|
|
107
|
-
});
|