@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
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
# CopilotKit Debug Mode (React)
|
|
2
|
+
|
|
3
|
+
This skill builds on `copilotkit/provider-setup`. Both debug surfaces are
|
|
4
|
+
props on `CopilotKitProvider`.
|
|
5
|
+
|
|
6
|
+
Two independent knobs:
|
|
7
|
+
|
|
8
|
+
1. `showDevConsole` mounts the visual web inspector (floating panel).
|
|
9
|
+
2. `debug` controls console logging for the event pipeline.
|
|
10
|
+
|
|
11
|
+
Both should be `'auto'` / off in production.
|
|
12
|
+
|
|
13
|
+
## Setup
|
|
14
|
+
|
|
15
|
+
```tsx
|
|
16
|
+
"use client";
|
|
17
|
+
import { CopilotKitProvider } from "@copilotkit/react-core/v2";
|
|
18
|
+
|
|
19
|
+
export function Providers({ children }: { children: React.ReactNode }) {
|
|
20
|
+
return (
|
|
21
|
+
<CopilotKitProvider
|
|
22
|
+
runtimeUrl="/api/copilotkit"
|
|
23
|
+
showDevConsole="auto"
|
|
24
|
+
debug={{ events: true, lifecycle: true, verbose: false }}
|
|
25
|
+
>
|
|
26
|
+
{children}
|
|
27
|
+
</CopilotKitProvider>
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
`showDevConsole="auto"` enables the inspector only on `localhost` and
|
|
33
|
+
`127.0.0.1`. In production it evaluates to `false`.
|
|
34
|
+
|
|
35
|
+
## Core Patterns
|
|
36
|
+
|
|
37
|
+
### Full payload logging during a repro
|
|
38
|
+
|
|
39
|
+
`debug: true` enables `events + lifecycle` but keeps `verbose` off to avoid
|
|
40
|
+
leaking PII by default. For a bug repro, explicitly set `verbose: true` to
|
|
41
|
+
dump full message/tool-call payloads.
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
<CopilotKitProvider
|
|
45
|
+
runtimeUrl="/api/copilotkit"
|
|
46
|
+
debug={{ events: true, lifecycle: true, verbose: true }}
|
|
47
|
+
/>
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Anchor the inspector on narrow viewports
|
|
51
|
+
|
|
52
|
+
```tsx
|
|
53
|
+
<CopilotKitProvider
|
|
54
|
+
runtimeUrl="/api/copilotkit"
|
|
55
|
+
showDevConsole="auto"
|
|
56
|
+
inspectorDefaultAnchor="bottom-left"
|
|
57
|
+
/>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Env-gate the inspector
|
|
61
|
+
|
|
62
|
+
```tsx
|
|
63
|
+
<CopilotKitProvider
|
|
64
|
+
runtimeUrl="/api/copilotkit"
|
|
65
|
+
showDevConsole={process.env.NODE_ENV !== "production"}
|
|
66
|
+
/>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Common Mistakes
|
|
70
|
+
|
|
71
|
+
### HIGH — Shipping `showDevConsole={true}` to production
|
|
72
|
+
|
|
73
|
+
Wrong:
|
|
74
|
+
|
|
75
|
+
```tsx
|
|
76
|
+
<CopilotKitProvider runtimeUrl="/api/copilotkit" showDevConsole={true} />
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Correct:
|
|
80
|
+
|
|
81
|
+
```tsx
|
|
82
|
+
<CopilotKitProvider runtimeUrl="/api/copilotkit" showDevConsole="auto" />
|
|
83
|
+
// "auto" enables only on localhost / 127.0.0.1
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
A hard `true` ships the Lit + markdown bundle to every end user and exposes
|
|
87
|
+
a developer panel in production. `"auto"` is the right default.
|
|
88
|
+
|
|
89
|
+
Source: `packages/react-core/src/v2/providers/CopilotKitProvider.tsx:301-321`
|
|
90
|
+
|
|
91
|
+
### MEDIUM — Expecting `debug: true` to log full payloads
|
|
92
|
+
|
|
93
|
+
Wrong:
|
|
94
|
+
|
|
95
|
+
```tsx
|
|
96
|
+
<CopilotKitProvider debug={true} />
|
|
97
|
+
// Then wondering why message contents aren't in the console
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Correct:
|
|
101
|
+
|
|
102
|
+
```tsx
|
|
103
|
+
<CopilotKitProvider debug={{ events: true, lifecycle: true, verbose: true }} />
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
`debug: true` is shorthand for `{ events: true, lifecycle: true, verbose: false }`.
|
|
107
|
+
`verbose` defaults to `false` to avoid logging user message bodies / tool
|
|
108
|
+
arguments / state snapshots — it must be opted into explicitly.
|
|
109
|
+
|
|
110
|
+
Source: `docs/snippets/shared/troubleshooting/debug-mode.mdx:85-93`
|
|
111
|
+
|
|
112
|
+
### MEDIUM — Passing fields that aren't in `DebugConfig`
|
|
113
|
+
|
|
114
|
+
Wrong:
|
|
115
|
+
|
|
116
|
+
```tsx
|
|
117
|
+
<CopilotKitProvider debug={{ events: true, network: true, errors: true }} />
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Correct:
|
|
121
|
+
|
|
122
|
+
```tsx
|
|
123
|
+
<CopilotKitProvider debug={{ events: true, lifecycle: true, verbose: true }} />
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
`DebugConfig` has exactly three fields: `events`, `lifecycle`, `verbose`.
|
|
127
|
+
Anything else is silently ignored by the type-narrowing at the provider.
|
|
128
|
+
|
|
129
|
+
Source: `packages/react-core/src/v2/providers/CopilotKitProvider.tsx` (DebugConfig type)
|
|
130
|
+
|
|
131
|
+
### MEDIUM — Inspector crashing in sandboxed iframes
|
|
132
|
+
|
|
133
|
+
Wrong:
|
|
134
|
+
|
|
135
|
+
```tsx
|
|
136
|
+
// App embedded in a sandboxed iframe with showDevConsole on
|
|
137
|
+
<CopilotKitProvider runtimeUrl="..." showDevConsole="auto" />
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Correct:
|
|
141
|
+
|
|
142
|
+
```tsx
|
|
143
|
+
<CopilotKitProvider
|
|
144
|
+
runtimeUrl="..."
|
|
145
|
+
showDevConsole={typeof window !== "undefined" && window.self === window.top}
|
|
146
|
+
/>
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
The inspector persists its anchor via `localStorage`. In sandboxed iframes
|
|
150
|
+
without storage access, the component throws on mount. Either disable in
|
|
151
|
+
iframes or whitelist storage in the sandbox attrs.
|
|
152
|
+
|
|
153
|
+
Source: `packages/react-core/src/v2/components/CopilotKitInspector.tsx:16-53`
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
# CopilotKit Human-in-the-Loop (React)
|
|
2
|
+
|
|
3
|
+
This skill builds on `copilotkit/provider-setup`, `copilotkit/client-side-tools`,
|
|
4
|
+
and `copilotkit/rendering-tool-calls`.
|
|
5
|
+
|
|
6
|
+
`useHumanInTheLoop` is `useFrontendTool` minus the `handler` plus a
|
|
7
|
+
`render` that receives a `respond` function. The hook synthesizes a
|
|
8
|
+
Promise-based handler — the Promise resolves when `respond(result)` is
|
|
9
|
+
called. No `respond` call → infinite hang.
|
|
10
|
+
|
|
11
|
+
Status is camelCase: `"inProgress" | "executing" | "complete"`. `respond`
|
|
12
|
+
is `undefined` except during `"executing"`.
|
|
13
|
+
|
|
14
|
+
## UI-kit detection rule
|
|
15
|
+
|
|
16
|
+
Before writing the approval UI, check the consumer's `package.json` for a
|
|
17
|
+
UI kit (shadcn `AlertDialog`, MUI `Dialog`, Chakra `Modal`, Ant `Modal`,
|
|
18
|
+
Mantine `Modal`) and reuse it. Don't hand-roll an overlay.
|
|
19
|
+
|
|
20
|
+
## Setup
|
|
21
|
+
|
|
22
|
+
```tsx
|
|
23
|
+
"use client";
|
|
24
|
+
import { useHumanInTheLoop } from "@copilotkit/react-core/v2";
|
|
25
|
+
import { z } from "zod";
|
|
26
|
+
import {
|
|
27
|
+
AlertDialog,
|
|
28
|
+
AlertDialogAction,
|
|
29
|
+
AlertDialogCancel,
|
|
30
|
+
AlertDialogContent,
|
|
31
|
+
AlertDialogDescription,
|
|
32
|
+
AlertDialogFooter,
|
|
33
|
+
AlertDialogHeader,
|
|
34
|
+
AlertDialogTitle,
|
|
35
|
+
} from "@/components/ui/alert-dialog";
|
|
36
|
+
|
|
37
|
+
export function DeleteConfirmHITL() {
|
|
38
|
+
useHumanInTheLoop({
|
|
39
|
+
name: "confirmDelete",
|
|
40
|
+
description: "Confirm a destructive delete with the user",
|
|
41
|
+
parameters: z.object({ id: z.string(), label: z.string() }),
|
|
42
|
+
render: ({ status, args, respond }) => (
|
|
43
|
+
<AlertDialog open>
|
|
44
|
+
<AlertDialogContent>
|
|
45
|
+
<AlertDialogHeader>
|
|
46
|
+
<AlertDialogTitle>Delete {args.label}?</AlertDialogTitle>
|
|
47
|
+
<AlertDialogDescription>
|
|
48
|
+
This action cannot be undone.
|
|
49
|
+
</AlertDialogDescription>
|
|
50
|
+
</AlertDialogHeader>
|
|
51
|
+
<AlertDialogFooter>
|
|
52
|
+
<AlertDialogCancel
|
|
53
|
+
disabled={status !== "executing"}
|
|
54
|
+
onClick={() => respond?.("denied")}
|
|
55
|
+
>
|
|
56
|
+
Cancel
|
|
57
|
+
</AlertDialogCancel>
|
|
58
|
+
<AlertDialogAction
|
|
59
|
+
disabled={status !== "executing"}
|
|
60
|
+
onClick={() => respond?.("approved")}
|
|
61
|
+
>
|
|
62
|
+
Delete
|
|
63
|
+
</AlertDialogAction>
|
|
64
|
+
</AlertDialogFooter>
|
|
65
|
+
</AlertDialogContent>
|
|
66
|
+
</AlertDialog>
|
|
67
|
+
),
|
|
68
|
+
});
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Core Patterns
|
|
74
|
+
|
|
75
|
+
### Always call `respond` in every branch
|
|
76
|
+
|
|
77
|
+
```tsx
|
|
78
|
+
render: ({ status, args, respond }) => {
|
|
79
|
+
if (status !== "executing" || !respond) {
|
|
80
|
+
return <div>Awaiting decision…</div>;
|
|
81
|
+
}
|
|
82
|
+
return (
|
|
83
|
+
<div>
|
|
84
|
+
<button onClick={() => respond("approved")}>Approve</button>
|
|
85
|
+
<button onClick={() => respond("denied")}>Reject</button>
|
|
86
|
+
<button onClick={() => respond({ action: "skip", reason: "timeout" })}>
|
|
87
|
+
Skip
|
|
88
|
+
</button>
|
|
89
|
+
</div>
|
|
90
|
+
);
|
|
91
|
+
};
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Abort the run on unmount so threads unlock
|
|
95
|
+
|
|
96
|
+
```tsx
|
|
97
|
+
import { useAgent, UseAgentUpdate } from "@copilotkit/react-core/v2";
|
|
98
|
+
import { useEffect, useRef } from "react";
|
|
99
|
+
|
|
100
|
+
function HITLHost() {
|
|
101
|
+
const { agent } = useAgent({
|
|
102
|
+
agentId: "default",
|
|
103
|
+
updates: [UseAgentUpdate.OnRunStatusChanged],
|
|
104
|
+
});
|
|
105
|
+
// Track isRunning in a ref so the unmount cleanup reads the latest value
|
|
106
|
+
// without re-firing on every transition.
|
|
107
|
+
const runningRef = useRef(false);
|
|
108
|
+
useEffect(() => {
|
|
109
|
+
runningRef.current = agent.isRunning;
|
|
110
|
+
}, [agent.isRunning]);
|
|
111
|
+
|
|
112
|
+
useEffect(() => {
|
|
113
|
+
return () => {
|
|
114
|
+
if (runningRef.current) agent.abortRun();
|
|
115
|
+
};
|
|
116
|
+
}, [agent]);
|
|
117
|
+
|
|
118
|
+
return <DeleteConfirmHITL />;
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
`useAgent` returns `{ agent }` only — run status lives on `agent.isRunning`.
|
|
123
|
+
Depending the cleanup effect directly on `agent.isRunning` would fire the
|
|
124
|
+
cleanup on every status flip (not just unmount), aborting active runs.
|
|
125
|
+
The ref pattern captures the latest value while the cleanup runs only
|
|
126
|
+
when the host component truly unmounts.
|
|
127
|
+
|
|
128
|
+
### Collect structured user input mid-run
|
|
129
|
+
|
|
130
|
+
```tsx
|
|
131
|
+
useHumanInTheLoop({
|
|
132
|
+
name: "askUserForPriority",
|
|
133
|
+
parameters: z.object({ taskId: z.string() }),
|
|
134
|
+
render: ({ status, args, respond }) => {
|
|
135
|
+
if (status !== "executing" || !respond) return <div>Waiting…</div>;
|
|
136
|
+
return (
|
|
137
|
+
<div>
|
|
138
|
+
{["low", "medium", "high"].map((p) => (
|
|
139
|
+
<button
|
|
140
|
+
key={p}
|
|
141
|
+
onClick={() => respond({ taskId: args.taskId, priority: p })}
|
|
142
|
+
>
|
|
143
|
+
{p}
|
|
144
|
+
</button>
|
|
145
|
+
))}
|
|
146
|
+
</div>
|
|
147
|
+
);
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## Common Mistakes
|
|
153
|
+
|
|
154
|
+
### CRITICAL — Never calling `respond()`
|
|
155
|
+
|
|
156
|
+
Wrong:
|
|
157
|
+
|
|
158
|
+
```tsx
|
|
159
|
+
useHumanInTheLoop({
|
|
160
|
+
name: "confirmDelete",
|
|
161
|
+
parameters: z.object({ id: z.string() }),
|
|
162
|
+
render: ({ args, status, respond }) => (
|
|
163
|
+
<div>
|
|
164
|
+
<p>Delete {args.id}?</p>
|
|
165
|
+
<button>OK</button>
|
|
166
|
+
</div>
|
|
167
|
+
),
|
|
168
|
+
});
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Correct:
|
|
172
|
+
|
|
173
|
+
```tsx
|
|
174
|
+
useHumanInTheLoop({
|
|
175
|
+
name: "confirmDelete",
|
|
176
|
+
parameters: z.object({ id: z.string() }),
|
|
177
|
+
render: ({ args, status, respond }) => (
|
|
178
|
+
<div>
|
|
179
|
+
<p>Delete {args.id}?</p>
|
|
180
|
+
<button onClick={() => respond?.("approved")}>OK</button>
|
|
181
|
+
<button onClick={() => respond?.("denied")}>Cancel</button>
|
|
182
|
+
</div>
|
|
183
|
+
),
|
|
184
|
+
});
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
The synthesized handler returns a Promise that resolves only when `respond`
|
|
188
|
+
is called. Never calling it (including reject / cancel paths) hangs the
|
|
189
|
+
run indefinitely and leaves the thread locked on the server.
|
|
190
|
+
|
|
191
|
+
Source: `packages/react-core/src/v2/hooks/use-human-in-the-loop.tsx:13-26`
|
|
192
|
+
|
|
193
|
+
### CRITICAL — Writing a custom overlay when the app has a Dialog primitive
|
|
194
|
+
|
|
195
|
+
Wrong:
|
|
196
|
+
|
|
197
|
+
```tsx
|
|
198
|
+
render: ({ respond }) => (
|
|
199
|
+
<div style={{ position: "fixed", inset: 0, background: "rgba(0,0,0,0.5)" }}>
|
|
200
|
+
…
|
|
201
|
+
</div>
|
|
202
|
+
);
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
Correct:
|
|
206
|
+
|
|
207
|
+
```tsx
|
|
208
|
+
import {
|
|
209
|
+
AlertDialog,
|
|
210
|
+
AlertDialogContent,
|
|
211
|
+
AlertDialogAction,
|
|
212
|
+
} from "@/components/ui/alert-dialog";
|
|
213
|
+
|
|
214
|
+
render: ({ respond }) => (
|
|
215
|
+
<AlertDialog open>
|
|
216
|
+
<AlertDialogContent>
|
|
217
|
+
…
|
|
218
|
+
<AlertDialogAction onClick={() => respond?.("approved")}>
|
|
219
|
+
OK
|
|
220
|
+
</AlertDialogAction>
|
|
221
|
+
</AlertDialogContent>
|
|
222
|
+
</AlertDialog>
|
|
223
|
+
);
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
Check `package.json` for shadcn / MUI / Chakra / Ant / Mantine before
|
|
227
|
+
writing an overlay. Their dialog primitives handle focus trapping,
|
|
228
|
+
escape-to-close, and accessibility — raw JSX skips all of that.
|
|
229
|
+
|
|
230
|
+
Source: maintainer interview (Phase 2c)
|
|
231
|
+
|
|
232
|
+
### HIGH — Calling `respond` during `inProgress` or `complete`
|
|
233
|
+
|
|
234
|
+
Wrong:
|
|
235
|
+
|
|
236
|
+
```tsx
|
|
237
|
+
render: ({ status, respond }) => (
|
|
238
|
+
<button onClick={() => (respond as any)("yes")}>Yes</button>
|
|
239
|
+
);
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
Correct:
|
|
243
|
+
|
|
244
|
+
```tsx
|
|
245
|
+
render: ({ status, respond }) =>
|
|
246
|
+
status === "executing" && respond ? (
|
|
247
|
+
<button onClick={() => respond("yes")}>Yes</button>
|
|
248
|
+
) : (
|
|
249
|
+
<p>Waiting…</p>
|
|
250
|
+
);
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
`respond` is `undefined` outside `status === "executing"`. Widening it to
|
|
254
|
+
`any` silently no-ops — the button click appears to work, but nothing
|
|
255
|
+
resolves the Promise.
|
|
256
|
+
|
|
257
|
+
Source: `packages/react-core/src/v2/types/human-in-the-loop.ts:8-32`
|
|
258
|
+
|
|
259
|
+
### HIGH — Unmounting the render mid-executing
|
|
260
|
+
|
|
261
|
+
Wrong:
|
|
262
|
+
|
|
263
|
+
```tsx
|
|
264
|
+
// User clicks away to a different route while the agent is waiting on respond()
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
Correct:
|
|
268
|
+
|
|
269
|
+
```tsx
|
|
270
|
+
// Keep the HITL prompt at a layout level that persists across route changes, OR abort on unmount:
|
|
271
|
+
const { agent } = useAgent({
|
|
272
|
+
agentId: "default",
|
|
273
|
+
updates: [UseAgentUpdate.OnRunStatusChanged],
|
|
274
|
+
});
|
|
275
|
+
const runningRef = useRef(false);
|
|
276
|
+
useEffect(() => {
|
|
277
|
+
runningRef.current = agent.isRunning;
|
|
278
|
+
}, [agent.isRunning]);
|
|
279
|
+
useEffect(
|
|
280
|
+
() => () => {
|
|
281
|
+
if (runningRef.current) agent.abortRun();
|
|
282
|
+
},
|
|
283
|
+
[agent],
|
|
284
|
+
);
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
`useHumanInTheLoop` removes its renderer on unmount (unlike
|
|
288
|
+
`useFrontendTool`, which keeps renderers for history). If the renderer
|
|
289
|
+
unmounts mid-`executing`, the pending Promise is abandoned and the run
|
|
290
|
+
hangs. Either lift the HITL UI to a layout-level component, or abort the
|
|
291
|
+
run on unmount.
|
|
292
|
+
|
|
293
|
+
Source: `packages/react-core/src/v2/hooks/use-human-in-the-loop.tsx:76-80`
|
|
294
|
+
|
|
295
|
+
### MEDIUM — Using hyphenated `"in-progress"` status
|
|
296
|
+
|
|
297
|
+
Wrong:
|
|
298
|
+
|
|
299
|
+
```tsx
|
|
300
|
+
render: ({ status }) => (status === "in-progress" ? <Spinner /> : <Form />);
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
Correct:
|
|
304
|
+
|
|
305
|
+
```tsx
|
|
306
|
+
render: ({ status }) => (status === "inProgress" ? <Spinner /> : <Form />);
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
Same camelCase rule as `rendering-tool-calls`: the discriminated union
|
|
310
|
+
only matches `"inProgress" | "executing" | "complete"`.
|
|
311
|
+
|
|
312
|
+
Source: `packages/react-core/src/v2/types/human-in-the-loop.ts:8-32`
|