@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,249 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Regression tests for FOR-75: messageView / labels props freeze
|
|
3
|
-
*
|
|
4
|
-
* These tests prove that passing `messageView` or `labels` as inline props
|
|
5
|
-
* to CopilotChat does NOT cause completed assistant messages to re-render on
|
|
6
|
-
* every keystroke.
|
|
7
|
-
*
|
|
8
|
-
* Tests FAIL on unfixed code (reproducing the bug).
|
|
9
|
-
* Tests PASS after the fix is applied.
|
|
10
|
-
*
|
|
11
|
-
* Render counts are deterministic regardless of hardware — the bug is about
|
|
12
|
-
* reference instability, not wall-clock timing.
|
|
13
|
-
*/
|
|
14
|
-
import React from "react";
|
|
15
|
-
import {
|
|
16
|
-
render,
|
|
17
|
-
screen,
|
|
18
|
-
fireEvent,
|
|
19
|
-
waitFor,
|
|
20
|
-
act,
|
|
21
|
-
} from "@testing-library/react";
|
|
22
|
-
import {
|
|
23
|
-
AbstractAgent,
|
|
24
|
-
EventType,
|
|
25
|
-
type BaseEvent,
|
|
26
|
-
type RunAgentInput,
|
|
27
|
-
} from "@ag-ui/client";
|
|
28
|
-
import { Observable, Subject } from "rxjs";
|
|
29
|
-
import { CopilotKitProvider } from "../../../providers/CopilotKitProvider";
|
|
30
|
-
import { CopilotChat } from "../CopilotChat";
|
|
31
|
-
import { CopilotChatAssistantMessage } from "../CopilotChatAssistantMessage";
|
|
32
|
-
import { useCopilotChatConfiguration } from "../../../providers/CopilotChatConfigurationProvider";
|
|
33
|
-
|
|
34
|
-
// ---------------------------------------------------------------------------
|
|
35
|
-
// Shared mock agent (same pattern as CopilotChatToolRerenders.e2e.test.tsx)
|
|
36
|
-
// ---------------------------------------------------------------------------
|
|
37
|
-
class MockStepwiseAgent extends AbstractAgent {
|
|
38
|
-
private subject = new Subject<BaseEvent>();
|
|
39
|
-
|
|
40
|
-
emit(event: BaseEvent) {
|
|
41
|
-
if (event.type === EventType.RUN_STARTED) {
|
|
42
|
-
this.isRunning = true;
|
|
43
|
-
} else if (
|
|
44
|
-
event.type === EventType.RUN_FINISHED ||
|
|
45
|
-
event.type === EventType.RUN_ERROR
|
|
46
|
-
) {
|
|
47
|
-
this.isRunning = false;
|
|
48
|
-
}
|
|
49
|
-
act(() => {
|
|
50
|
-
this.subject.next(event);
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
complete() {
|
|
55
|
-
this.isRunning = false;
|
|
56
|
-
this.subject.complete();
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
clone(): MockStepwiseAgent {
|
|
60
|
-
const cloned = new MockStepwiseAgent();
|
|
61
|
-
cloned.agentId = this.agentId;
|
|
62
|
-
(cloned as unknown as { subject: Subject<BaseEvent> }).subject =
|
|
63
|
-
this.subject;
|
|
64
|
-
return cloned;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
async detachActiveRun(): Promise<void> {}
|
|
68
|
-
|
|
69
|
-
run(_input: RunAgentInput): Observable<BaseEvent> {
|
|
70
|
-
return this.subject.asObservable();
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// ---------------------------------------------------------------------------
|
|
75
|
-
// Helper: submit a user message (triggers agent.run()), then emit a complete
|
|
76
|
-
// assistant response and wait for the counting component to appear in the DOM.
|
|
77
|
-
//
|
|
78
|
-
// Uses data-testid rather than text content to avoid false positives from
|
|
79
|
-
// components that render fixed strings regardless of the message payload.
|
|
80
|
-
// ---------------------------------------------------------------------------
|
|
81
|
-
async function submitAndReceiveAssistantMessage(
|
|
82
|
-
agent: MockStepwiseAgent,
|
|
83
|
-
messageId: string,
|
|
84
|
-
) {
|
|
85
|
-
const input = await screen.findByRole("textbox");
|
|
86
|
-
fireEvent.change(input, { target: { value: "hello" } });
|
|
87
|
-
fireEvent.keyDown(input, { key: "Enter", code: "Enter" });
|
|
88
|
-
|
|
89
|
-
await waitFor(() => {
|
|
90
|
-
expect(screen.getByText("hello")).toBeDefined();
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
agent.emit({ type: EventType.RUN_STARTED } as BaseEvent);
|
|
94
|
-
agent.emit({
|
|
95
|
-
type: EventType.TEXT_MESSAGE_CHUNK,
|
|
96
|
-
messageId,
|
|
97
|
-
delta: "assistant reply",
|
|
98
|
-
} as BaseEvent);
|
|
99
|
-
agent.emit({ type: EventType.RUN_FINISHED } as BaseEvent);
|
|
100
|
-
|
|
101
|
-
await waitFor(() => {
|
|
102
|
-
expect(screen.getByTestId("counting-assistant")).toBeDefined();
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
await act(async () => {
|
|
106
|
-
agent.complete();
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// ---------------------------------------------------------------------------
|
|
111
|
-
// Test 1 — messageView inline object
|
|
112
|
-
//
|
|
113
|
-
// Counting component defined OUTSIDE the test so its function reference is
|
|
114
|
-
// stable. The outer messageView object is inline (new ref on every render),
|
|
115
|
-
// which is what triggers the bug.
|
|
116
|
-
// ---------------------------------------------------------------------------
|
|
117
|
-
let assistantRenderCount = 0;
|
|
118
|
-
function CountingAssistantMessage(
|
|
119
|
-
_props: React.ComponentProps<typeof CopilotChatAssistantMessage>,
|
|
120
|
-
) {
|
|
121
|
-
assistantRenderCount++;
|
|
122
|
-
return <div data-testid="counting-assistant" />;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// ---------------------------------------------------------------------------
|
|
126
|
-
// Test 2 — labels inline object
|
|
127
|
-
//
|
|
128
|
-
// Reads directly from useCopilotChatConfiguration() so that context churn
|
|
129
|
-
// (caused by the labels fix being absent) is observable independently of
|
|
130
|
-
// whether the messageView slot is re-rendered. Context consumers re-render
|
|
131
|
-
// when their context value changes regardless of parent memoization, so this
|
|
132
|
-
// is a genuine guard for the labels stabilization fix.
|
|
133
|
-
// ---------------------------------------------------------------------------
|
|
134
|
-
let labelConsumerRenderCount = 0;
|
|
135
|
-
function LabelConsumerMessage(
|
|
136
|
-
_props: React.ComponentProps<typeof CopilotChatAssistantMessage>,
|
|
137
|
-
) {
|
|
138
|
-
useCopilotChatConfiguration(); // subscribe to CopilotChatConfiguration context
|
|
139
|
-
labelConsumerRenderCount++;
|
|
140
|
-
return <div data-testid="counting-assistant" />;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// ---------------------------------------------------------------------------
|
|
144
|
-
// Tests
|
|
145
|
-
// ---------------------------------------------------------------------------
|
|
146
|
-
|
|
147
|
-
describe("FOR-75: messageView / labels props — no re-renders on input change", () => {
|
|
148
|
-
beforeEach(() => {
|
|
149
|
-
assistantRenderCount = 0;
|
|
150
|
-
labelConsumerRenderCount = 0;
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
/**
|
|
154
|
-
* Test 1: messageView inline object
|
|
155
|
-
*
|
|
156
|
-
* When `messageView` is passed as an inline object prop (e.g.
|
|
157
|
-
* `messageView={{ assistantMessage: Cmp }}`), a new object reference is
|
|
158
|
-
* created on every parent render. Without the fix, ts-deepmerge clones the
|
|
159
|
-
* value, producing a new reference that defeats MemoizedSlotWrapper's
|
|
160
|
-
* shallow equality check → the whole message list re-renders on every
|
|
161
|
-
* keystroke.
|
|
162
|
-
*
|
|
163
|
-
* Fix: useShallowStableRef in CopilotChat.tsx keeps the same object
|
|
164
|
-
* reference as long as the slot props are shallowly equal.
|
|
165
|
-
*/
|
|
166
|
-
it("messageView inline object: completed messages do not re-render on keystroke", async () => {
|
|
167
|
-
const agent = new MockStepwiseAgent();
|
|
168
|
-
|
|
169
|
-
render(
|
|
170
|
-
<CopilotKitProvider agents__unsafe_dev_only={{ default: agent }}>
|
|
171
|
-
<div style={{ height: 400 }}>
|
|
172
|
-
<CopilotChat
|
|
173
|
-
messageView={{
|
|
174
|
-
assistantMessage:
|
|
175
|
-
CountingAssistantMessage as unknown as typeof CopilotChatAssistantMessage,
|
|
176
|
-
}}
|
|
177
|
-
/>
|
|
178
|
-
</div>
|
|
179
|
-
</CopilotKitProvider>,
|
|
180
|
-
);
|
|
181
|
-
|
|
182
|
-
await submitAndReceiveAssistantMessage(agent, "msg-1");
|
|
183
|
-
|
|
184
|
-
const renderCountAfterMessage = assistantRenderCount;
|
|
185
|
-
expect(renderCountAfterMessage).toBeGreaterThan(0);
|
|
186
|
-
|
|
187
|
-
// Type into the input — only inputValue state changes; messages unchanged.
|
|
188
|
-
// Completed messages must NOT re-render.
|
|
189
|
-
const input = screen.getByRole("textbox");
|
|
190
|
-
fireEvent.change(input, { target: { value: "a" } });
|
|
191
|
-
fireEvent.change(input, { target: { value: "ab" } });
|
|
192
|
-
fireEvent.change(input, { target: { value: "abc" } });
|
|
193
|
-
|
|
194
|
-
await act(async () => {});
|
|
195
|
-
|
|
196
|
-
expect(assistantRenderCount).toBe(renderCountAfterMessage);
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
/**
|
|
200
|
-
* Test 2: labels inline object
|
|
201
|
-
*
|
|
202
|
-
* When `labels` is passed as an inline object, it is a new reference every
|
|
203
|
-
* render. Without the fix, this invalidates the mergedLabels useMemo in
|
|
204
|
-
* CopilotChatConfigurationProvider → new context value → all context
|
|
205
|
-
* consumers re-render on every keystroke.
|
|
206
|
-
*
|
|
207
|
-
* LabelConsumerMessage reads directly from useCopilotChatConfiguration(),
|
|
208
|
-
* making it a genuine guard for this fix: context consumers re-render when
|
|
209
|
-
* their context value changes regardless of parent memo boundaries, so
|
|
210
|
-
* labelConsumerRenderCount increases if the labels fix is regressed.
|
|
211
|
-
*
|
|
212
|
-
* Fix: useJsonStable in CopilotChatConfigurationProvider stabilizes the
|
|
213
|
-
* labels reference so the context value doesn't change when the caller
|
|
214
|
-
* passes an inline object.
|
|
215
|
-
*/
|
|
216
|
-
it("labels inline object: context consumers do not re-render on keystroke", async () => {
|
|
217
|
-
const agent = new MockStepwiseAgent();
|
|
218
|
-
|
|
219
|
-
render(
|
|
220
|
-
<CopilotKitProvider agents__unsafe_dev_only={{ default: agent }}>
|
|
221
|
-
<div style={{ height: 400 }}>
|
|
222
|
-
<CopilotChat
|
|
223
|
-
messageView={{
|
|
224
|
-
assistantMessage:
|
|
225
|
-
LabelConsumerMessage as unknown as typeof CopilotChatAssistantMessage,
|
|
226
|
-
}}
|
|
227
|
-
// Inline labels object — new reference on every render of the
|
|
228
|
-
// parent. Without the fix, this churns the context value.
|
|
229
|
-
labels={{ chatInputPlaceholder: "Type here..." }}
|
|
230
|
-
/>
|
|
231
|
-
</div>
|
|
232
|
-
</CopilotKitProvider>,
|
|
233
|
-
);
|
|
234
|
-
|
|
235
|
-
await submitAndReceiveAssistantMessage(agent, "msg-labels-1");
|
|
236
|
-
|
|
237
|
-
const renderCountAfterMessage = labelConsumerRenderCount;
|
|
238
|
-
expect(renderCountAfterMessage).toBeGreaterThan(0);
|
|
239
|
-
|
|
240
|
-
const input = screen.getByRole("textbox");
|
|
241
|
-
fireEvent.change(input, { target: { value: "a" } });
|
|
242
|
-
fireEvent.change(input, { target: { value: "ab" } });
|
|
243
|
-
fireEvent.change(input, { target: { value: "abc" } });
|
|
244
|
-
|
|
245
|
-
await act(async () => {});
|
|
246
|
-
|
|
247
|
-
expect(labelConsumerRenderCount).toBe(renderCountAfterMessage);
|
|
248
|
-
});
|
|
249
|
-
});
|