@copilotkit/react-core 1.57.3 → 1.58.0-canary.thread-id-propagation
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/dist/{copilotkit-CtXcs1ea.cjs → copilotkit-B4ouY7qC.cjs} +14 -3
- package/dist/copilotkit-B4ouY7qC.cjs.map +1 -0
- package/dist/copilotkit-BK9CVq9A.d.cts.map +1 -1
- package/dist/{copilotkit-CC8DjOiC.mjs → copilotkit-L4mM_JqG.mjs} +14 -3
- package/dist/copilotkit-L4mM_JqG.mjs.map +1 -0
- package/dist/copilotkit-WlmeVijs.d.mts.map +1 -1
- package/dist/index.cjs +3 -77
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +3 -77
- package/dist/index.mjs.map +1 -1
- package/dist/index.umd.js +15 -78
- package/dist/index.umd.js.map +1 -1
- package/dist/v2/headless.cjs +11 -0
- package/dist/v2/headless.cjs.map +1 -1
- package/dist/v2/headless.d.cts.map +1 -1
- package/dist/v2/headless.d.mts.map +1 -1
- package/dist/v2/headless.mjs +11 -0
- package/dist/v2/headless.mjs.map +1 -1
- package/dist/v2/index.cjs +1 -1
- package/dist/v2/index.mjs +1 -1
- package/dist/v2/index.umd.js +13 -2
- package/dist/v2/index.umd.js.map +1 -1
- 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/dist/copilotkit-CC8DjOiC.mjs.map +0 -1
- package/dist/copilotkit-CtXcs1ea.cjs.map +0 -1
- 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 -336
- 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,403 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for MCP Apps ui/message handler behavior.
|
|
3
|
-
*
|
|
4
|
-
* Verifies the followUp logic that controls whether the agent is invoked
|
|
5
|
-
* after an MCP app sends a ui/message request via JSON-RPC:
|
|
6
|
-
*
|
|
7
|
-
* shouldFollowUp = params.followUp ?? role === "user"
|
|
8
|
-
*
|
|
9
|
-
* - User-role messages invoke runAgent (default followUp = true)
|
|
10
|
-
* - Assistant-role messages do NOT invoke runAgent (default followUp = false)
|
|
11
|
-
* - followUp: false skips runAgent regardless of role
|
|
12
|
-
* - followUp: true forces runAgent regardless of role
|
|
13
|
-
* - addMessage is always called when textContent is present
|
|
14
|
-
*/
|
|
15
|
-
import { fireEvent, screen, waitFor, act } from "@testing-library/react";
|
|
16
|
-
import { vi } from "vitest";
|
|
17
|
-
import {
|
|
18
|
-
activitySnapshotEvent,
|
|
19
|
-
renderWithCopilotKit,
|
|
20
|
-
runFinishedEvent,
|
|
21
|
-
runStartedEvent,
|
|
22
|
-
testId,
|
|
23
|
-
} from "../../../__tests__/utils/test-helpers";
|
|
24
|
-
import { MCPAppsActivityType } from "../../../components/MCPAppsActivityRenderer";
|
|
25
|
-
import {
|
|
26
|
-
AbstractAgent,
|
|
27
|
-
RunAgentInput,
|
|
28
|
-
RunAgentResult,
|
|
29
|
-
BaseEvent,
|
|
30
|
-
EventType,
|
|
31
|
-
} from "@ag-ui/client";
|
|
32
|
-
import { Observable, Subject } from "rxjs";
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* MockMCPProxyAgent with spying support for ui/message tests.
|
|
36
|
-
*/
|
|
37
|
-
class MockMCPProxyAgent extends AbstractAgent {
|
|
38
|
-
private subject = new Subject<BaseEvent>();
|
|
39
|
-
public runAgentCalls: Array<{ input: Partial<RunAgentInput> }> = [];
|
|
40
|
-
public addMessageCalls: Array<{
|
|
41
|
-
id: string;
|
|
42
|
-
role: string;
|
|
43
|
-
content: string;
|
|
44
|
-
}> = [];
|
|
45
|
-
|
|
46
|
-
private runAgentResponses: Map<string, unknown> = new Map();
|
|
47
|
-
|
|
48
|
-
setRunAgentResponse(method: string, response: unknown) {
|
|
49
|
-
this.runAgentResponses.set(method, response);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
addMessage(msg: Parameters<AbstractAgent["addMessage"]>[0]) {
|
|
53
|
-
this.addMessageCalls.push(msg as any);
|
|
54
|
-
return super.addMessage(msg);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
emit(event: BaseEvent) {
|
|
58
|
-
if (event.type === EventType.RUN_STARTED) {
|
|
59
|
-
this.isRunning = true;
|
|
60
|
-
} else if (
|
|
61
|
-
event.type === EventType.RUN_FINISHED ||
|
|
62
|
-
event.type === EventType.RUN_ERROR
|
|
63
|
-
) {
|
|
64
|
-
this.isRunning = false;
|
|
65
|
-
}
|
|
66
|
-
act(() => {
|
|
67
|
-
this.subject.next(event);
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
complete() {
|
|
72
|
-
this.isRunning = false;
|
|
73
|
-
act(() => {
|
|
74
|
-
this.subject.complete();
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
async detachActiveRun(): Promise<void> {}
|
|
79
|
-
|
|
80
|
-
run(_input: RunAgentInput): Observable<BaseEvent> {
|
|
81
|
-
return this.subject.asObservable();
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
async runAgent(input?: Partial<RunAgentInput>): Promise<RunAgentResult> {
|
|
85
|
-
const proxiedRequest = input?.forwardedProps?.__proxiedMCPRequest as
|
|
86
|
-
| {
|
|
87
|
-
serverHash?: string;
|
|
88
|
-
serverId?: string;
|
|
89
|
-
method: string;
|
|
90
|
-
params?: Record<string, unknown>;
|
|
91
|
-
}
|
|
92
|
-
| undefined;
|
|
93
|
-
|
|
94
|
-
if (proxiedRequest) {
|
|
95
|
-
if (input) {
|
|
96
|
-
this.runAgentCalls.push({ input });
|
|
97
|
-
}
|
|
98
|
-
const method = proxiedRequest.method;
|
|
99
|
-
const response = this.runAgentResponses.get(method);
|
|
100
|
-
if (response !== undefined) {
|
|
101
|
-
return { result: response, newMessages: [] };
|
|
102
|
-
}
|
|
103
|
-
if (method === "resources/read") {
|
|
104
|
-
return {
|
|
105
|
-
result: {
|
|
106
|
-
contents: [
|
|
107
|
-
{
|
|
108
|
-
uri: proxiedRequest.params?.uri,
|
|
109
|
-
mimeType: "text/html",
|
|
110
|
-
text: "<html><body>Test content</body></html>",
|
|
111
|
-
},
|
|
112
|
-
],
|
|
113
|
-
},
|
|
114
|
-
newMessages: [],
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
return { result: {}, newMessages: [] };
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
return super.runAgent(input);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
function mcpAppsActivityContent(overrides: {
|
|
125
|
-
resourceUri?: string;
|
|
126
|
-
serverHash?: string;
|
|
127
|
-
}) {
|
|
128
|
-
return {
|
|
129
|
-
resourceUri: overrides.resourceUri ?? "ui://test-server/test-resource",
|
|
130
|
-
serverHash: overrides.serverHash ?? "abc123hash",
|
|
131
|
-
toolInput: {},
|
|
132
|
-
result: {
|
|
133
|
-
content: [{ type: "text", text: "Tool output" }],
|
|
134
|
-
isError: false,
|
|
135
|
-
},
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* Set up the agent, render, emit MCP activity, wait for iframe creation,
|
|
141
|
-
* then simulate sandbox-proxy-ready so the message handler gets installed.
|
|
142
|
-
*/
|
|
143
|
-
async function setupMCPActivity(
|
|
144
|
-
agent: MockMCPProxyAgent,
|
|
145
|
-
agentId: string,
|
|
146
|
-
userMessage: string,
|
|
147
|
-
): Promise<HTMLIFrameElement> {
|
|
148
|
-
agent.setRunAgentResponse("resources/read", {
|
|
149
|
-
contents: [
|
|
150
|
-
{
|
|
151
|
-
uri: "ui://test/app",
|
|
152
|
-
mimeType: "text/html",
|
|
153
|
-
text: "<html><body>App</body></html>",
|
|
154
|
-
},
|
|
155
|
-
],
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
// Use a unique threadId per test to avoid module-level mcpAppsRequestQueue
|
|
159
|
-
// state leaking between tests (the queue keys by threadId).
|
|
160
|
-
const threadId = testId("thread");
|
|
161
|
-
|
|
162
|
-
renderWithCopilotKit({
|
|
163
|
-
agents: { [agentId]: agent },
|
|
164
|
-
agentId,
|
|
165
|
-
threadId,
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
const input = await screen.findByRole("textbox");
|
|
169
|
-
fireEvent.change(input, { target: { value: userMessage } });
|
|
170
|
-
fireEvent.keyDown(input, { key: "Enter", code: "Enter" });
|
|
171
|
-
|
|
172
|
-
await waitFor(() => {
|
|
173
|
-
expect(screen.getByText(userMessage)).toBeDefined();
|
|
174
|
-
});
|
|
175
|
-
|
|
176
|
-
agent.emit(runStartedEvent());
|
|
177
|
-
agent.emit(
|
|
178
|
-
activitySnapshotEvent({
|
|
179
|
-
messageId: testId("mcp-activity"),
|
|
180
|
-
activityType: MCPAppsActivityType,
|
|
181
|
-
content: mcpAppsActivityContent({
|
|
182
|
-
resourceUri: "ui://test/app",
|
|
183
|
-
serverHash: "test-hash",
|
|
184
|
-
}),
|
|
185
|
-
}),
|
|
186
|
-
);
|
|
187
|
-
agent.emit(runFinishedEvent());
|
|
188
|
-
|
|
189
|
-
// Wait for iframe to be created
|
|
190
|
-
let iframe: HTMLIFrameElement | null = null;
|
|
191
|
-
await waitFor(
|
|
192
|
-
() => {
|
|
193
|
-
iframe = document.querySelector("iframe[srcdoc]");
|
|
194
|
-
expect(iframe).not.toBeNull();
|
|
195
|
-
},
|
|
196
|
-
{ timeout: 3000 },
|
|
197
|
-
);
|
|
198
|
-
|
|
199
|
-
// Simulate sandbox-proxy-ready notification from the iframe.
|
|
200
|
-
// The message handler checks event.source === iframe.contentWindow.
|
|
201
|
-
// In jsdom, iframe.contentWindow exists for srcdoc iframes.
|
|
202
|
-
const readyEvent = new MessageEvent("message", {
|
|
203
|
-
data: {
|
|
204
|
-
jsonrpc: "2.0",
|
|
205
|
-
method: "ui/notifications/sandbox-proxy-ready",
|
|
206
|
-
},
|
|
207
|
-
source: iframe!.contentWindow,
|
|
208
|
-
origin: "",
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
await act(async () => {
|
|
212
|
-
window.dispatchEvent(readyEvent);
|
|
213
|
-
// Give async setup() time to install the messageHandler
|
|
214
|
-
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
215
|
-
});
|
|
216
|
-
|
|
217
|
-
return iframe!;
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
/**
|
|
221
|
-
* Send a ui/message JSON-RPC request as if coming from the iframe.
|
|
222
|
-
*/
|
|
223
|
-
async function sendUiMessage(
|
|
224
|
-
iframe: HTMLIFrameElement,
|
|
225
|
-
params: {
|
|
226
|
-
role?: string;
|
|
227
|
-
content?: Array<{ type: string; text?: string }>;
|
|
228
|
-
followUp?: boolean;
|
|
229
|
-
},
|
|
230
|
-
) {
|
|
231
|
-
const msg = new MessageEvent("message", {
|
|
232
|
-
data: {
|
|
233
|
-
jsonrpc: "2.0",
|
|
234
|
-
id: testId("req"),
|
|
235
|
-
method: "ui/message",
|
|
236
|
-
params,
|
|
237
|
-
},
|
|
238
|
-
source: iframe.contentWindow,
|
|
239
|
-
origin: "",
|
|
240
|
-
});
|
|
241
|
-
|
|
242
|
-
await act(async () => {
|
|
243
|
-
window.dispatchEvent(msg);
|
|
244
|
-
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
245
|
-
});
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
describe("MCP Apps ui/message followUp behavior", () => {
|
|
249
|
-
beforeEach(() => {
|
|
250
|
-
vi.clearAllMocks();
|
|
251
|
-
});
|
|
252
|
-
|
|
253
|
-
it("user-role message: addMessage IS called and runAgent IS invoked", async () => {
|
|
254
|
-
const agent = new MockMCPProxyAgent();
|
|
255
|
-
agent.agentId = "ui-msg-agent-user";
|
|
256
|
-
|
|
257
|
-
const iframe = await setupMCPActivity(
|
|
258
|
-
agent,
|
|
259
|
-
"ui-msg-agent-user",
|
|
260
|
-
"User role test",
|
|
261
|
-
);
|
|
262
|
-
|
|
263
|
-
const runSpy = vi.spyOn(agent, "run");
|
|
264
|
-
|
|
265
|
-
await sendUiMessage(iframe, {
|
|
266
|
-
role: "user",
|
|
267
|
-
content: [{ type: "text", text: "Hello from MCP app" }],
|
|
268
|
-
});
|
|
269
|
-
|
|
270
|
-
// addMessage should have been called
|
|
271
|
-
const userMsgCalls = agent.addMessageCalls.filter(
|
|
272
|
-
(c) => c.content === "Hello from MCP app" && c.role === "user",
|
|
273
|
-
);
|
|
274
|
-
expect(userMsgCalls.length).toBeGreaterThanOrEqual(1);
|
|
275
|
-
|
|
276
|
-
// runAgent should have been invoked (user role defaults to followUp: true)
|
|
277
|
-
expect(runSpy.mock.calls.length).toBeGreaterThan(0);
|
|
278
|
-
});
|
|
279
|
-
|
|
280
|
-
it("assistant-role message: addMessage IS called but runAgent is NOT invoked", async () => {
|
|
281
|
-
const agent = new MockMCPProxyAgent();
|
|
282
|
-
agent.agentId = "ui-msg-agent-assist";
|
|
283
|
-
|
|
284
|
-
const iframe = await setupMCPActivity(
|
|
285
|
-
agent,
|
|
286
|
-
"ui-msg-agent-assist",
|
|
287
|
-
"Assist role test",
|
|
288
|
-
);
|
|
289
|
-
|
|
290
|
-
const runSpy = vi.spyOn(agent, "run");
|
|
291
|
-
|
|
292
|
-
await sendUiMessage(iframe, {
|
|
293
|
-
role: "assistant",
|
|
294
|
-
content: [{ type: "text", text: "Response from MCP" }],
|
|
295
|
-
});
|
|
296
|
-
|
|
297
|
-
// addMessage should have been called
|
|
298
|
-
const assistCalls = agent.addMessageCalls.filter(
|
|
299
|
-
(c) => c.content === "Response from MCP" && c.role === "assistant",
|
|
300
|
-
);
|
|
301
|
-
expect(assistCalls.length).toBeGreaterThanOrEqual(1);
|
|
302
|
-
|
|
303
|
-
// run() should NOT have been called
|
|
304
|
-
expect(runSpy.mock.calls.length).toBe(0);
|
|
305
|
-
});
|
|
306
|
-
|
|
307
|
-
it("followUp: false on user-role message: addMessage IS called but runAgent is NOT invoked", async () => {
|
|
308
|
-
const agent = new MockMCPProxyAgent();
|
|
309
|
-
agent.agentId = "ui-msg-agent-nofollowup";
|
|
310
|
-
|
|
311
|
-
const iframe = await setupMCPActivity(
|
|
312
|
-
agent,
|
|
313
|
-
"ui-msg-agent-nofollowup",
|
|
314
|
-
"No followUp test",
|
|
315
|
-
);
|
|
316
|
-
|
|
317
|
-
const runSpy = vi.spyOn(agent, "run");
|
|
318
|
-
|
|
319
|
-
await sendUiMessage(iframe, {
|
|
320
|
-
role: "user",
|
|
321
|
-
content: [{ type: "text", text: "Display only message" }],
|
|
322
|
-
followUp: false,
|
|
323
|
-
});
|
|
324
|
-
|
|
325
|
-
// addMessage should have been called
|
|
326
|
-
const calls = agent.addMessageCalls.filter(
|
|
327
|
-
(c) => c.content === "Display only message",
|
|
328
|
-
);
|
|
329
|
-
expect(calls.length).toBeGreaterThanOrEqual(1);
|
|
330
|
-
|
|
331
|
-
// run() should NOT have been called
|
|
332
|
-
expect(runSpy.mock.calls.length).toBe(0);
|
|
333
|
-
});
|
|
334
|
-
|
|
335
|
-
it("followUp: true on assistant-role message: addMessage IS called AND runAgent IS invoked", async () => {
|
|
336
|
-
const agent = new MockMCPProxyAgent();
|
|
337
|
-
agent.agentId = "ui-msg-agent-force";
|
|
338
|
-
|
|
339
|
-
const iframe = await setupMCPActivity(
|
|
340
|
-
agent,
|
|
341
|
-
"ui-msg-agent-force",
|
|
342
|
-
"Force followUp test",
|
|
343
|
-
);
|
|
344
|
-
|
|
345
|
-
const runSpy = vi.spyOn(agent, "run");
|
|
346
|
-
|
|
347
|
-
await sendUiMessage(iframe, {
|
|
348
|
-
role: "assistant",
|
|
349
|
-
content: [{ type: "text", text: "Assistant with followUp" }],
|
|
350
|
-
followUp: true,
|
|
351
|
-
});
|
|
352
|
-
|
|
353
|
-
// addMessage should have been called
|
|
354
|
-
const calls = agent.addMessageCalls.filter(
|
|
355
|
-
(c) => c.content === "Assistant with followUp",
|
|
356
|
-
);
|
|
357
|
-
expect(calls.length).toBeGreaterThanOrEqual(1);
|
|
358
|
-
|
|
359
|
-
// run() should have been called
|
|
360
|
-
expect(runSpy.mock.calls.length).toBeGreaterThan(0);
|
|
361
|
-
});
|
|
362
|
-
|
|
363
|
-
it("message with text content always adds to agent messages regardless of followUp", async () => {
|
|
364
|
-
const agent = new MockMCPProxyAgent();
|
|
365
|
-
agent.agentId = "ui-msg-agent-all";
|
|
366
|
-
|
|
367
|
-
const iframe = await setupMCPActivity(
|
|
368
|
-
agent,
|
|
369
|
-
"ui-msg-agent-all",
|
|
370
|
-
"All messages test",
|
|
371
|
-
);
|
|
372
|
-
|
|
373
|
-
await sendUiMessage(iframe, {
|
|
374
|
-
role: "user",
|
|
375
|
-
content: [{ type: "text", text: "User msg" }],
|
|
376
|
-
});
|
|
377
|
-
|
|
378
|
-
await sendUiMessage(iframe, {
|
|
379
|
-
role: "assistant",
|
|
380
|
-
content: [{ type: "text", text: "Assistant msg" }],
|
|
381
|
-
});
|
|
382
|
-
|
|
383
|
-
await sendUiMessage(iframe, {
|
|
384
|
-
role: "user",
|
|
385
|
-
content: [{ type: "text", text: "No followUp msg" }],
|
|
386
|
-
followUp: false,
|
|
387
|
-
});
|
|
388
|
-
|
|
389
|
-
const userCalls = agent.addMessageCalls.filter(
|
|
390
|
-
(c) => c.content === "User msg",
|
|
391
|
-
);
|
|
392
|
-
const assistCalls = agent.addMessageCalls.filter(
|
|
393
|
-
(c) => c.content === "Assistant msg",
|
|
394
|
-
);
|
|
395
|
-
const noFollowCalls = agent.addMessageCalls.filter(
|
|
396
|
-
(c) => c.content === "No followUp msg",
|
|
397
|
-
);
|
|
398
|
-
|
|
399
|
-
expect(userCalls.length).toBeGreaterThanOrEqual(1);
|
|
400
|
-
expect(assistCalls.length).toBeGreaterThanOrEqual(1);
|
|
401
|
-
expect(noFollowCalls.length).toBeGreaterThanOrEqual(1);
|
|
402
|
-
});
|
|
403
|
-
});
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { render } from "@testing-library/react";
|
|
3
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
4
|
-
import { CopilotChat } from "../CopilotChat";
|
|
5
|
-
import { useAgent } from "../../../hooks/use-agent";
|
|
6
|
-
import { useCopilotKit } from "../../../providers/CopilotKitProvider";
|
|
7
|
-
import { MockStepwiseAgent } from "../../../__tests__/utils/test-helpers";
|
|
8
|
-
import { CopilotKitCoreRuntimeConnectionStatus } from "@copilotkit/core";
|
|
9
|
-
|
|
10
|
-
// Mock useAgent to inspect the props it receives
|
|
11
|
-
vi.mock("../../../hooks/use-agent", () => ({
|
|
12
|
-
useAgent: vi.fn(() => ({
|
|
13
|
-
agent: new MockStepwiseAgent(),
|
|
14
|
-
})),
|
|
15
|
-
}));
|
|
16
|
-
|
|
17
|
-
vi.mock("../../../providers/CopilotKitProvider", () => ({
|
|
18
|
-
useCopilotKit: vi.fn(),
|
|
19
|
-
useLicenseContext: vi.fn(() => ({
|
|
20
|
-
checkFeature: () => true,
|
|
21
|
-
})),
|
|
22
|
-
}));
|
|
23
|
-
|
|
24
|
-
vi.mock(
|
|
25
|
-
"../../../providers/CopilotChatConfigurationProvider",
|
|
26
|
-
async (importOriginal) => {
|
|
27
|
-
const actual =
|
|
28
|
-
await importOriginal<
|
|
29
|
-
typeof import("../../../providers/CopilotChatConfigurationProvider")
|
|
30
|
-
>();
|
|
31
|
-
return {
|
|
32
|
-
...actual,
|
|
33
|
-
useCopilotChatConfiguration: vi.fn(() => undefined),
|
|
34
|
-
CopilotChatConfigurationProvider: ({
|
|
35
|
-
children,
|
|
36
|
-
}: {
|
|
37
|
-
children: React.ReactNode;
|
|
38
|
-
}) => <>{children}</>,
|
|
39
|
-
};
|
|
40
|
-
},
|
|
41
|
-
);
|
|
42
|
-
|
|
43
|
-
// Mock suggestions hook
|
|
44
|
-
vi.mock("../../../hooks/use-suggestions", () => ({
|
|
45
|
-
useSuggestions: vi.fn(() => ({ suggestions: [] })),
|
|
46
|
-
}));
|
|
47
|
-
|
|
48
|
-
// Mock attachments hook
|
|
49
|
-
vi.mock("../../../hooks/use-attachments", () => ({
|
|
50
|
-
useAttachments: vi.fn(() => ({
|
|
51
|
-
attachments: [],
|
|
52
|
-
enabled: false,
|
|
53
|
-
dragOver: false,
|
|
54
|
-
fileInputRef: { current: null },
|
|
55
|
-
containerRef: { current: null },
|
|
56
|
-
handleFileUpload: vi.fn(),
|
|
57
|
-
handleDragOver: vi.fn(),
|
|
58
|
-
handleDragLeave: vi.fn(),
|
|
59
|
-
handleDrop: vi.fn(),
|
|
60
|
-
removeAttachment: vi.fn(),
|
|
61
|
-
consumeAttachments: vi.fn(() => []),
|
|
62
|
-
})),
|
|
63
|
-
}));
|
|
64
|
-
|
|
65
|
-
const mockUseAgent = useAgent as ReturnType<typeof vi.fn>;
|
|
66
|
-
const mockUseCopilotKit = useCopilotKit as ReturnType<typeof vi.fn>;
|
|
67
|
-
|
|
68
|
-
/** Factory for the mock return value of useCopilotKit in CopilotChat tests */
|
|
69
|
-
function createMockChatContext(agent: MockStepwiseAgent) {
|
|
70
|
-
return {
|
|
71
|
-
copilotkit: {
|
|
72
|
-
getAgent: () => agent,
|
|
73
|
-
runtimeUrl: "http://localhost:3000/api/copilot",
|
|
74
|
-
runtimeConnectionStatus: CopilotKitCoreRuntimeConnectionStatus.Connected,
|
|
75
|
-
runtimeTransport: "rest",
|
|
76
|
-
headers: {},
|
|
77
|
-
agents: { [String(agent.agentId)]: agent },
|
|
78
|
-
connectAgent: vi.fn().mockResolvedValue(undefined),
|
|
79
|
-
subscribe: vi.fn(() => ({ unsubscribe: vi.fn() })),
|
|
80
|
-
audioFileTranscriptionEnabled: false,
|
|
81
|
-
},
|
|
82
|
-
executingToolCallIds: new Set(),
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
describe("CopilotChat throttleMs prop", () => {
|
|
87
|
-
let mockAgent: MockStepwiseAgent;
|
|
88
|
-
|
|
89
|
-
beforeEach(() => {
|
|
90
|
-
mockAgent = new MockStepwiseAgent();
|
|
91
|
-
mockAgent.agentId = "default";
|
|
92
|
-
|
|
93
|
-
mockUseAgent.mockReturnValue({ agent: mockAgent });
|
|
94
|
-
mockUseCopilotKit.mockReturnValue(createMockChatContext(mockAgent));
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
afterEach(() => {
|
|
98
|
-
vi.restoreAllMocks();
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
it("passes throttleMs prop to useAgent", () => {
|
|
102
|
-
render(<CopilotChat throttleMs={500} />);
|
|
103
|
-
|
|
104
|
-
expect(mockUseAgent).toHaveBeenCalledWith(
|
|
105
|
-
expect.objectContaining({
|
|
106
|
-
throttleMs: 500,
|
|
107
|
-
}),
|
|
108
|
-
);
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
it("passes undefined throttleMs when prop is not set", () => {
|
|
112
|
-
render(<CopilotChat />);
|
|
113
|
-
|
|
114
|
-
expect(mockUseAgent).toHaveBeenCalledWith(
|
|
115
|
-
expect.objectContaining({
|
|
116
|
-
throttleMs: undefined,
|
|
117
|
-
}),
|
|
118
|
-
);
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
describe("throttleMs type inheritance", () => {
|
|
123
|
-
it("CopilotSidebarProps includes throttleMs via CopilotChatProps", () => {
|
|
124
|
-
// Type-level assertion — if this compiles, the type includes throttleMs.
|
|
125
|
-
const sidebarProps: import("../CopilotSidebar").CopilotSidebarProps = {
|
|
126
|
-
throttleMs: 1000,
|
|
127
|
-
};
|
|
128
|
-
expect(sidebarProps.throttleMs).toBe(1000);
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
it("CopilotPopupProps includes throttleMs via CopilotChatProps", () => {
|
|
132
|
-
const popupProps: import("../CopilotPopup").CopilotPopupProps = {
|
|
133
|
-
throttleMs: 2000,
|
|
134
|
-
};
|
|
135
|
-
expect(popupProps.throttleMs).toBe(2000);
|
|
136
|
-
});
|
|
137
|
-
});
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from "vitest";
|
|
2
|
-
import {
|
|
3
|
-
normalizeAutoScroll,
|
|
4
|
-
type AutoScrollMode,
|
|
5
|
-
} from "../normalize-auto-scroll";
|
|
6
|
-
|
|
7
|
-
describe("normalizeAutoScroll", () => {
|
|
8
|
-
it("returns 'pin-to-bottom' for undefined (default)", () => {
|
|
9
|
-
expect(normalizeAutoScroll(undefined)).toBe("pin-to-bottom");
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
it("maps true -> 'pin-to-bottom'", () => {
|
|
13
|
-
expect(normalizeAutoScroll(true)).toBe("pin-to-bottom");
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
it("maps false -> 'none'", () => {
|
|
17
|
-
expect(normalizeAutoScroll(false)).toBe("none");
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
it("passes 'pin-to-bottom' through", () => {
|
|
21
|
-
expect(normalizeAutoScroll("pin-to-bottom")).toBe("pin-to-bottom");
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
it("passes 'pin-to-send' through", () => {
|
|
25
|
-
expect(normalizeAutoScroll("pin-to-send")).toBe("pin-to-send");
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
it("passes 'none' through", () => {
|
|
29
|
-
expect(normalizeAutoScroll("none")).toBe("none");
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
it("falls back to 'pin-to-bottom' for unknown strings", () => {
|
|
33
|
-
expect(normalizeAutoScroll("bogus" as AutoScrollMode)).toBe(
|
|
34
|
-
"pin-to-bottom",
|
|
35
|
-
);
|
|
36
|
-
});
|
|
37
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import "@testing-library/jest-dom";
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
export {
|
|
2
|
-
default as CopilotChatInput,
|
|
3
|
-
type CopilotChatInputProps,
|
|
4
|
-
type ToolsMenuItem,
|
|
5
|
-
} from "./CopilotChatInput";
|
|
6
|
-
|
|
7
|
-
export {
|
|
8
|
-
default as CopilotChatAssistantMessage,
|
|
9
|
-
type CopilotChatAssistantMessageProps,
|
|
10
|
-
} from "./CopilotChatAssistantMessage";
|
|
11
|
-
|
|
12
|
-
export {
|
|
13
|
-
default as CopilotChatUserMessage,
|
|
14
|
-
type CopilotChatUserMessageProps,
|
|
15
|
-
} from "./CopilotChatUserMessage";
|
|
16
|
-
|
|
17
|
-
export {
|
|
18
|
-
default as CopilotChatReasoningMessage,
|
|
19
|
-
type CopilotChatReasoningMessageProps,
|
|
20
|
-
} from "./CopilotChatReasoningMessage";
|
|
21
|
-
|
|
22
|
-
export {
|
|
23
|
-
CopilotChatAudioRecorder,
|
|
24
|
-
type AudioRecorderState,
|
|
25
|
-
AudioRecorderError,
|
|
26
|
-
} from "./CopilotChatAudioRecorder";
|
|
27
|
-
|
|
28
|
-
export {
|
|
29
|
-
default as CopilotChatSuggestionPill,
|
|
30
|
-
type CopilotChatSuggestionPillProps,
|
|
31
|
-
} from "./CopilotChatSuggestionPill";
|
|
32
|
-
|
|
33
|
-
export {
|
|
34
|
-
default as CopilotChatSuggestionView,
|
|
35
|
-
type CopilotChatSuggestionViewProps,
|
|
36
|
-
} from "./CopilotChatSuggestionView";
|
|
37
|
-
|
|
38
|
-
export {
|
|
39
|
-
default as CopilotChatMessageView,
|
|
40
|
-
type CopilotChatMessageViewProps,
|
|
41
|
-
} from "./CopilotChatMessageView";
|
|
42
|
-
|
|
43
|
-
export {
|
|
44
|
-
default as CopilotChatToolCallsView,
|
|
45
|
-
type CopilotChatToolCallsViewProps,
|
|
46
|
-
} from "./CopilotChatToolCallsView";
|
|
47
|
-
|
|
48
|
-
export {
|
|
49
|
-
default as CopilotChatView,
|
|
50
|
-
type CopilotChatViewProps,
|
|
51
|
-
} from "./CopilotChatView";
|
|
52
|
-
|
|
53
|
-
export { CopilotChat, type CopilotChatProps } from "./CopilotChat";
|
|
54
|
-
|
|
55
|
-
export {
|
|
56
|
-
CopilotChatToggleButton,
|
|
57
|
-
type CopilotChatToggleButtonProps,
|
|
58
|
-
CopilotChatToggleButtonOpenIcon,
|
|
59
|
-
CopilotChatToggleButtonCloseIcon,
|
|
60
|
-
} from "./CopilotChatToggleButton";
|
|
61
|
-
|
|
62
|
-
export {
|
|
63
|
-
CopilotSidebarView,
|
|
64
|
-
type CopilotSidebarViewProps,
|
|
65
|
-
} from "./CopilotSidebarView";
|
|
66
|
-
|
|
67
|
-
export {
|
|
68
|
-
CopilotPopupView,
|
|
69
|
-
type CopilotPopupViewProps,
|
|
70
|
-
} from "./CopilotPopupView";
|
|
71
|
-
|
|
72
|
-
export {
|
|
73
|
-
CopilotModalHeader,
|
|
74
|
-
type CopilotModalHeaderProps,
|
|
75
|
-
} from "./CopilotModalHeader";
|
|
76
|
-
|
|
77
|
-
export { CopilotSidebar, type CopilotSidebarProps } from "./CopilotSidebar";
|
|
78
|
-
|
|
79
|
-
export { CopilotPopup, type CopilotPopupProps } from "./CopilotPopup";
|
|
80
|
-
|
|
81
|
-
export { CopilotChatAttachmentQueue } from "./CopilotChatAttachmentQueue";
|
|
82
|
-
export { CopilotChatAttachmentRenderer } from "./CopilotChatAttachmentRenderer";
|
|
83
|
-
|
|
84
|
-
export type {
|
|
85
|
-
Attachment,
|
|
86
|
-
AttachmentsConfig,
|
|
87
|
-
AttachmentModality,
|
|
88
|
-
} from "@copilotkit/shared";
|
|
89
|
-
|
|
90
|
-
export type { AutoScrollMode } from "./normalize-auto-scroll";
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Context used by `CopilotChatView` to announce the latest user message
|
|
5
|
-
* to descendants (notably `usePinToSend`), so scroll logic can anchor
|
|
6
|
-
* the viewport to the most recent user turn in "pin-to-send" mode.
|
|
7
|
-
*
|
|
8
|
-
* `sendNonce` increments on each new send so repeated IDs (e.g., message
|
|
9
|
-
* edits that preserve the ID) still trigger dependent effects.
|
|
10
|
-
*/
|
|
11
|
-
export type LastUserMessageState = {
|
|
12
|
-
id: string | null;
|
|
13
|
-
sendNonce: number;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
export const LastUserMessageContext = React.createContext<LastUserMessageState>(
|
|
17
|
-
{
|
|
18
|
-
id: null,
|
|
19
|
-
sendNonce: 0,
|
|
20
|
-
},
|
|
21
|
-
);
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
export type AutoScrollMode = "pin-to-bottom" | "pin-to-send" | "none";
|
|
2
|
-
|
|
3
|
-
const VALID: readonly AutoScrollMode[] = [
|
|
4
|
-
"pin-to-bottom",
|
|
5
|
-
"pin-to-send",
|
|
6
|
-
"none",
|
|
7
|
-
];
|
|
8
|
-
|
|
9
|
-
export function normalizeAutoScroll(
|
|
10
|
-
value: AutoScrollMode | boolean | undefined,
|
|
11
|
-
): AutoScrollMode {
|
|
12
|
-
if (value === undefined) return "pin-to-bottom";
|
|
13
|
-
if (value === true) return "pin-to-bottom";
|
|
14
|
-
if (value === false) return "none";
|
|
15
|
-
if ((VALID as readonly string[]).includes(value)) return value;
|
|
16
|
-
return "pin-to-bottom";
|
|
17
|
-
}
|