@copilotkit/react-core 0.0.0-fix-coagent-state-render-bridge-20260127202902 → 0.0.0-fix-1-50-post-request-handler-get-20260128165645
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/CHANGELOG.md +14 -5
- package/dist/{chunk-UFOBV3X3.mjs → chunk-37JRY3TC.mjs} +16 -65
- package/dist/{chunk-UFOBV3X3.mjs.map → chunk-37JRY3TC.mjs.map} +1 -1
- package/dist/chunk-3X3I7OJV.mjs +172 -0
- package/dist/chunk-3X3I7OJV.mjs.map +1 -0
- package/dist/{chunk-VPZWS7NP.mjs → chunk-AR533FGY.mjs} +2 -2
- package/dist/{chunk-QD7EID4N.mjs → chunk-FDOMAPJY.mjs} +1 -1
- package/dist/chunk-FDOMAPJY.mjs.map +1 -0
- package/dist/{chunk-2CGLFECF.mjs → chunk-K2GJI3PT.mjs} +2 -2
- package/dist/{chunk-25432SOK.mjs → chunk-LWJIFZWN.mjs} +2 -2
- package/dist/{chunk-SXB3KZ4V.mjs → chunk-THCOOWDH.mjs} +3 -3
- package/dist/{chunk-VKNLTZJE.mjs → chunk-YTQHRJUA.mjs} +2 -2
- package/dist/components/copilot-provider/copilotkit.js +150 -397
- package/dist/components/copilot-provider/copilotkit.js.map +1 -1
- package/dist/components/copilot-provider/copilotkit.mjs +3 -5
- package/dist/components/copilot-provider/index.js +150 -397
- package/dist/components/copilot-provider/index.js.map +1 -1
- package/dist/components/copilot-provider/index.mjs +3 -5
- package/dist/components/index.js +150 -397
- package/dist/components/index.js.map +1 -1
- package/dist/components/index.mjs +3 -5
- package/dist/context/coagent-state-renders-context.d.ts +0 -1
- package/dist/context/coagent-state-renders-context.js.map +1 -1
- package/dist/context/coagent-state-renders-context.mjs +1 -1
- package/dist/context/index.js.map +1 -1
- package/dist/context/index.mjs +1 -1
- package/dist/hooks/index.js +210 -506
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/index.mjs +17 -19
- package/dist/hooks/use-coagent-state-render-bridge.js +72 -334
- package/dist/hooks/use-coagent-state-render-bridge.js.map +1 -1
- package/dist/hooks/use-coagent-state-render-bridge.mjs +2 -4
- package/dist/hooks/use-coagent-state-render.js.map +1 -1
- package/dist/hooks/use-coagent-state-render.mjs +2 -2
- package/dist/hooks/use-copilot-chat-headless_c.js +112 -408
- package/dist/hooks/use-copilot-chat-headless_c.js.map +1 -1
- package/dist/hooks/use-copilot-chat-headless_c.mjs +5 -7
- package/dist/hooks/use-copilot-chat.js +104 -400
- package/dist/hooks/use-copilot-chat.js.map +1 -1
- package/dist/hooks/use-copilot-chat.mjs +5 -7
- package/dist/hooks/use-copilot-chat_internal.js +104 -400
- package/dist/hooks/use-copilot-chat_internal.js.map +1 -1
- package/dist/hooks/use-copilot-chat_internal.mjs +4 -6
- package/dist/hooks/use-langgraph-interrupt-render.mjs +1 -1
- package/dist/index.js +309 -605
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +20 -22
- package/dist/lib/copilot-task.mjs +4 -6
- package/dist/lib/index.mjs +4 -6
- package/dist/setupTests.js +0 -1
- package/dist/setupTests.js.map +1 -1
- package/dist/setupTests.mjs +0 -1
- package/dist/setupTests.mjs.map +1 -1
- package/dist/types/index.mjs +1 -1
- package/package.json +7 -7
- package/src/context/coagent-state-renders-context.tsx +0 -1
- package/src/hooks/__tests__/use-coagent-state-render.e2e.test.tsx +37 -892
- package/src/hooks/use-coagent-state-render-bridge.tsx +120 -25
- package/src/hooks/use-copilot-chat_internal.ts +32 -84
- package/src/setupTests.ts +0 -1
- package/dist/chunk-77IVITG3.mjs +0 -158
- package/dist/chunk-77IVITG3.mjs.map +0 -1
- package/dist/chunk-BKMJ4LC7.mjs +0 -119
- package/dist/chunk-BKMJ4LC7.mjs.map +0 -1
- package/dist/chunk-C3YJYDK4.mjs +0 -189
- package/dist/chunk-C3YJYDK4.mjs.map +0 -1
- package/dist/chunk-QD7EID4N.mjs.map +0 -1
- package/dist/hooks/use-coagent-state-render-bridge.helpers.d.ts +0 -92
- package/dist/hooks/use-coagent-state-render-bridge.helpers.js +0 -231
- package/dist/hooks/use-coagent-state-render-bridge.helpers.js.map +0 -1
- package/dist/hooks/use-coagent-state-render-bridge.helpers.mjs +0 -24
- package/dist/hooks/use-coagent-state-render-bridge.helpers.mjs.map +0 -1
- package/dist/hooks/use-coagent-state-render-registry.d.ts +0 -25
- package/dist/hooks/use-coagent-state-render-registry.js +0 -358
- package/dist/hooks/use-coagent-state-render-registry.js.map +0 -1
- package/dist/hooks/use-coagent-state-render-registry.mjs +0 -9
- package/dist/hooks/use-coagent-state-render-registry.mjs.map +0 -1
- package/dist/test-helpers/copilot-context.d.ts +0 -14
- package/dist/test-helpers/copilot-context.js +0 -128
- package/dist/test-helpers/copilot-context.js.map +0 -1
- package/dist/test-helpers/copilot-context.mjs +0 -74
- package/dist/test-helpers/copilot-context.mjs.map +0 -1
- package/src/hooks/__tests__/use-coagent-state-render-bridge.helpers.test.ts +0 -100
- package/src/hooks/__tests__/use-coagent-state-render.test.tsx +0 -334
- package/src/hooks/use-coagent-state-render-bridge.helpers.ts +0 -311
- package/src/hooks/use-coagent-state-render-registry.ts +0 -215
- package/src/test-helpers/copilot-context.ts +0 -91
- /package/dist/{chunk-VPZWS7NP.mjs.map → chunk-AR533FGY.mjs.map} +0 -0
- /package/dist/{chunk-2CGLFECF.mjs.map → chunk-K2GJI3PT.mjs.map} +0 -0
- /package/dist/{chunk-25432SOK.mjs.map → chunk-LWJIFZWN.mjs.map} +0 -0
- /package/dist/{chunk-SXB3KZ4V.mjs.map → chunk-THCOOWDH.mjs.map} +0 -0
- /package/dist/{chunk-VKNLTZJE.mjs.map → chunk-YTQHRJUA.mjs.map} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,15 +1,24 @@
|
|
|
1
1
|
# ui
|
|
2
2
|
|
|
3
|
-
## 0.0.0-fix-
|
|
3
|
+
## 0.0.0-fix-1-50-post-request-handler-get-20260128165645
|
|
4
4
|
|
|
5
5
|
### Patch Changes
|
|
6
6
|
|
|
7
7
|
- d655e75: fix: update ag-ui dependencies
|
|
8
8
|
- Updated dependencies [d655e75]
|
|
9
|
-
- @copilotkit/shared@0.0.0-fix-
|
|
10
|
-
- @copilotkit/runtime-client-gql@0.0.0-fix-
|
|
11
|
-
- @copilotkitnext/core@0.0.0-fix-
|
|
12
|
-
- @copilotkitnext/react@0.0.0-fix-
|
|
9
|
+
- @copilotkit/shared@0.0.0-fix-1-50-post-request-handler-get-20260128165645
|
|
10
|
+
- @copilotkit/runtime-client-gql@0.0.0-fix-1-50-post-request-handler-get-20260128165645
|
|
11
|
+
- @copilotkitnext/core@0.0.0-fix-1-50-post-request-handler-get-20260128165645
|
|
12
|
+
- @copilotkitnext/react@0.0.0-fix-1-50-post-request-handler-get-20260128165645
|
|
13
|
+
|
|
14
|
+
## 1.51.3-next.4
|
|
15
|
+
|
|
16
|
+
### Patch Changes
|
|
17
|
+
|
|
18
|
+
- @copilotkit/runtime-client-gql@1.51.3-next.4
|
|
19
|
+
- @copilotkit/shared@1.51.3-next.4
|
|
20
|
+
- @copilotkitnext/core@1.51.3-next.4
|
|
21
|
+
- @copilotkitnext/react@1.51.3-next.4
|
|
13
22
|
|
|
14
23
|
## 1.51.3-next.3
|
|
15
24
|
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
useLazyToolRenderer
|
|
3
|
-
} from "./chunk-ZVF5Q6IH.mjs";
|
|
4
1
|
import {
|
|
5
2
|
useLangGraphInterruptRender
|
|
6
3
|
} from "./chunk-VV56AVPB.mjs";
|
|
4
|
+
import {
|
|
5
|
+
useLazyToolRenderer
|
|
6
|
+
} from "./chunk-ZVF5Q6IH.mjs";
|
|
7
7
|
import {
|
|
8
8
|
useAsyncCallback
|
|
9
9
|
} from "./chunk-BVBFFI7K.mjs";
|
|
10
10
|
import {
|
|
11
11
|
CoAgentStateRenderBridge
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-3X3I7OJV.mjs";
|
|
13
13
|
import {
|
|
14
14
|
useCopilotContext
|
|
15
15
|
} from "./chunk-AFNWX62Q.mjs";
|
|
@@ -205,7 +205,6 @@ function useCopilotChatInternal({
|
|
|
205
205
|
});
|
|
206
206
|
const allMessages = (_c = agent == null ? void 0 : agent.messages) != null ? _c : [];
|
|
207
207
|
const resolvedMessages = useMemo(() => {
|
|
208
|
-
var _a2, _b2;
|
|
209
208
|
let processedMessages = allMessages.map((message) => {
|
|
210
209
|
if (message.role !== "assistant") {
|
|
211
210
|
return message;
|
|
@@ -218,76 +217,29 @@ function useCopilotChatInternal({
|
|
|
218
217
|
}
|
|
219
218
|
}
|
|
220
219
|
const bridgeRenderer = legacyCustomMessageRenderer || renderCustomMessage ? () => {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
return
|
|
227
|
-
} catch (error) {
|
|
228
|
-
console.warn(
|
|
229
|
-
"[CopilotKit] renderCustomMessages failed, falling back to legacy renderer",
|
|
230
|
-
error
|
|
231
|
-
);
|
|
232
|
-
return null;
|
|
220
|
+
const customRender = renderCustomMessage == null ? void 0 : renderCustomMessage({
|
|
221
|
+
message,
|
|
222
|
+
position: "before"
|
|
223
|
+
});
|
|
224
|
+
if (customRender) {
|
|
225
|
+
return customRender;
|
|
233
226
|
}
|
|
227
|
+
return legacyCustomMessageRenderer == null ? void 0 : legacyCustomMessageRenderer({ message, position: "before" });
|
|
234
228
|
} : null;
|
|
235
229
|
if (bridgeRenderer) {
|
|
236
|
-
return __spreadProps(__spreadValues({}, message), {
|
|
237
|
-
generativeUI: bridgeRenderer,
|
|
238
|
-
generativeUIPosition: "before"
|
|
239
|
-
});
|
|
230
|
+
return __spreadProps(__spreadValues({}, message), { generativeUI: bridgeRenderer });
|
|
240
231
|
}
|
|
241
232
|
return message;
|
|
242
233
|
});
|
|
243
234
|
const hasAssistantMessages = processedMessages.some((msg) => msg.role === "assistant");
|
|
244
|
-
const canUseCustomRenderer = Boolean(
|
|
245
|
-
renderCustomMessage && ((_a2 = copilotkit == null ? void 0 : copilotkit.getAgent) == null ? void 0 : _a2.call(copilotkit, resolvedAgentId))
|
|
246
|
-
);
|
|
247
|
-
const placeholderRenderer = legacyCustomMessageRenderer ? legacyCustomMessageRenderer : canUseCustomRenderer ? renderCustomMessage : null;
|
|
248
|
-
const shouldRenderPlaceholder = Boolean(agent == null ? void 0 : agent.isRunning) || Boolean((agent == null ? void 0 : agent.state) && Object.keys(agent.state).length);
|
|
249
|
-
const effectiveThreadId = (_b2 = threadId != null ? threadId : agent == null ? void 0 : agent.threadId) != null ? _b2 : "default";
|
|
250
|
-
let latestUserIndex = -1;
|
|
251
|
-
for (let i = processedMessages.length - 1; i >= 0; i -= 1) {
|
|
252
|
-
if (processedMessages[i].role === "user") {
|
|
253
|
-
latestUserIndex = i;
|
|
254
|
-
break;
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
const latestUserMessageId = latestUserIndex >= 0 ? processedMessages[latestUserIndex].id : void 0;
|
|
258
|
-
const currentRunId = latestUserMessageId ? copilotkit.getRunIdForMessage(resolvedAgentId, effectiveThreadId, latestUserMessageId) || `pending:${latestUserMessageId}` : void 0;
|
|
259
|
-
const hasAssistantForCurrentRun = latestUserIndex >= 0 ? processedMessages.slice(latestUserIndex + 1).some((msg) => msg.role === "assistant") : hasAssistantMessages;
|
|
260
|
-
if (placeholderRenderer && shouldRenderPlaceholder && !hasAssistantForCurrentRun) {
|
|
261
|
-
const placeholderId = currentRunId ? `coagent-state-render-${resolvedAgentId}-${currentRunId}` : `coagent-state-render-${resolvedAgentId}`;
|
|
262
|
-
const placeholderMessage = {
|
|
263
|
-
id: placeholderId,
|
|
264
|
-
role: "assistant",
|
|
265
|
-
content: "",
|
|
266
|
-
name: "coagent-state-render",
|
|
267
|
-
runId: currentRunId
|
|
268
|
-
};
|
|
269
|
-
processedMessages = [
|
|
270
|
-
...processedMessages,
|
|
271
|
-
__spreadProps(__spreadValues({}, placeholderMessage), {
|
|
272
|
-
generativeUIPosition: "before",
|
|
273
|
-
generativeUI: () => placeholderRenderer({
|
|
274
|
-
message: placeholderMessage,
|
|
275
|
-
position: "before"
|
|
276
|
-
})
|
|
277
|
-
})
|
|
278
|
-
];
|
|
279
|
-
}
|
|
280
235
|
return processedMessages;
|
|
281
236
|
}, [
|
|
282
237
|
agent == null ? void 0 : agent.messages,
|
|
283
238
|
lazyToolRendered,
|
|
284
239
|
allMessages,
|
|
285
240
|
renderCustomMessage,
|
|
286
|
-
legacyCustomMessageRenderer,
|
|
287
|
-
resolvedAgentId
|
|
288
|
-
copilotkit,
|
|
289
|
-
agent == null ? void 0 : agent.isRunning,
|
|
290
|
-
agent == null ? void 0 : agent.state
|
|
241
|
+
// legacyCustomMessageRenderer,
|
|
242
|
+
resolvedAgentId
|
|
291
243
|
]);
|
|
292
244
|
const renderedSuggestions = useMemo(() => {
|
|
293
245
|
if (Array.isArray(suggestions)) {
|
|
@@ -343,8 +295,7 @@ function useLegacyCoagentRenderer({
|
|
|
343
295
|
return ({ message, position }) => {
|
|
344
296
|
var _a;
|
|
345
297
|
const effectiveThreadId = (_a = threadId != null ? threadId : agent.threadId) != null ? _a : "default";
|
|
346
|
-
const
|
|
347
|
-
const existingRunId = providedRunId ? providedRunId : copilotkit.getRunIdForMessage(agentId, effectiveThreadId, message.id);
|
|
298
|
+
const existingRunId = copilotkit.getRunIdForMessage(agentId, effectiveThreadId, message.id);
|
|
348
299
|
const runId = existingRunId || `pending:${message.id}`;
|
|
349
300
|
const messageIndex = Math.max(
|
|
350
301
|
agent.messages.findIndex((msg) => msg.id === message.id),
|
|
@@ -395,4 +346,4 @@ export {
|
|
|
395
346
|
useCopilotChatInternal,
|
|
396
347
|
defaultSystemMessage
|
|
397
348
|
};
|
|
398
|
-
//# sourceMappingURL=chunk-
|
|
349
|
+
//# sourceMappingURL=chunk-37JRY3TC.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/use-copilot-chat_internal.ts"],"sourcesContent":["import { useRef, useEffect, useCallback, useMemo, useState, createElement } from \"react\";\nimport { useCopilotContext } from \"../context/copilot-context\";\nimport { SystemMessageFunction } from \"../types\";\nimport { useAsyncCallback } from \"../components/error-boundary/error-utils\";\nimport { Message } from \"@copilotkit/shared\";\nimport { gqlToAGUI, Message as DeprecatedGqlMessage } from \"@copilotkit/runtime-client-gql\";\nimport { useLangGraphInterruptRender } from \"./use-langgraph-interrupt-render\";\nimport {\n useAgent,\n useCopilotChatConfiguration,\n useCopilotKit,\n useRenderCustomMessages,\n useSuggestions,\n} from \"@copilotkitnext/react\";\nimport { Suggestion } from \"@copilotkitnext/core\";\nimport { useLazyToolRenderer } from \"./use-lazy-tool-renderer\";\nimport { AbstractAgent, AGUIConnectNotImplementedError } from \"@ag-ui/client\";\nimport {\n CoAgentStateRenderBridge,\n type CoAgentStateRenderBridgeProps,\n} from \"./use-coagent-state-render-bridge\";\n\n/**\n * The type of suggestions to use in the chat.\n *\n * `auto` - Suggestions are generated automatically.\n * `manual` - Suggestions are controlled programmatically.\n * `SuggestionItem[]` - Static suggestions array.\n */\nexport type ChatSuggestions = \"auto\" | \"manual\" | Omit<Suggestion, \"isLoading\">[];\n\nexport interface AppendMessageOptions {\n /**\n * Whether to run the chat completion after appending the message. Defaults to `true`.\n */\n followUp?: boolean;\n /**\n * Whether to clear the suggestions after appending the message. Defaults to `true`.\n */\n clearSuggestions?: boolean;\n}\n\nexport interface OnStopGenerationArguments {\n /**\n * The name of the currently executing agent.\n */\n currentAgentName: string | undefined;\n\n /**\n * The messages in the chat.\n */\n messages: Message[];\n}\n\nexport type OnReloadMessagesArguments = OnStopGenerationArguments & {\n /**\n * The message on which \"regenerate\" was pressed\n */\n messageId: string;\n};\n\nexport type OnStopGeneration = (args: OnStopGenerationArguments) => void;\n\nexport type OnReloadMessages = (args: OnReloadMessagesArguments) => void;\n\nexport interface UseCopilotChatOptions {\n /**\n * A unique identifier for the chat. If not provided, a random one will be\n * generated. When provided, the `useChat` hook with the same `id` will\n * have shared states across components.\n */\n id?: string;\n\n /**\n * HTTP headers to be sent with the API request.\n */\n headers?: Record<string, string> | Headers;\n\n /**\n * Initial messages to populate the chat with.\n */\n initialMessages?: Message[];\n\n /**\n * A function to generate the system message. Defaults to `defaultSystemMessage`.\n */\n makeSystemMessage?: SystemMessageFunction;\n\n /**\n * Disables inclusion of CopilotKit’s default system message. When true, no system message is sent (this also suppresses any custom message from <code>makeSystemMessage</code>).\n */\n disableSystemMessage?: boolean;\n /**\n * Controls the behavior of suggestions in the chat interface.\n *\n * `auto` (default) - Suggestions are generated automatically:\n * - When the chat is first opened (empty state)\n * - After each message exchange completes\n * - Uses configuration from `useCopilotChatSuggestions` hooks\n *\n * `manual` - Suggestions are controlled programmatically:\n * - Use `setSuggestions()` to set custom suggestions\n * - Use `generateSuggestions()` to trigger AI generation\n * - Access via `useCopilotChat` hook\n *\n * `SuggestionItem[]` - Static suggestions array:\n * - Always shows the same suggestions\n * - No AI generation involved\n */\n suggestions?: ChatSuggestions;\n\n onInProgress?: (isLoading: boolean) => void;\n onSubmitMessage?: (messageContent: string) => Promise<void> | void;\n onStopGeneration?: OnStopGeneration;\n onReloadMessages?: OnReloadMessages;\n}\n\nexport interface MCPServerConfig {\n endpoint: string;\n apiKey?: string;\n}\n\n// Old suggestion item interface, for returning from useCopilotChatInternal\ninterface SuggestionItem {\n title: string;\n message: string;\n partial?: boolean;\n className?: string;\n}\n\nexport interface UseCopilotChatReturn {\n /**\n * @deprecated use `messages` instead, this is an old non ag-ui version of the messages\n * Array of messages currently visible in the chat interface\n *\n * This is the visible messages, not the raw messages from the runtime client.\n */\n visibleMessages: DeprecatedGqlMessage[];\n\n /**\n * The messages that are currently in the chat in AG-UI format.\n */\n messages: Message[];\n\n /** @deprecated use `sendMessage` in `useCopilotChatHeadless_c` instead. This will be removed in a future major version. */\n appendMessage: (message: DeprecatedGqlMessage, options?: AppendMessageOptions) => Promise<void>;\n\n /**\n * Send a new message to the chat\n *\n * ```tsx\n * await sendMessage({\n * id: \"123\",\n * role: \"user\",\n * content: \"Hello, process this request\",\n * });\n * ```\n */\n sendMessage: (message: Message, options?: AppendMessageOptions) => Promise<void>;\n\n /**\n * Replace all messages in the chat\n *\n * ```tsx\n * setMessages([\n * { id: \"123\", role: \"user\", content: \"Hello, process this request\" },\n * { id: \"456\", role: \"assistant\", content: \"Hello, I'm the assistant\" },\n * ]);\n * ```\n *\n * **Deprecated** non-ag-ui version:\n *\n * ```tsx\n * setMessages([\n * new TextMessage({\n * content: \"Hello, process this request\",\n * role: gqlRole.User,\n * }),\n * new TextMessage({\n * content: \"Hello, I'm the assistant\",\n * role: gqlRole.Assistant,\n * ]);\n * ```\n *\n */\n setMessages: (messages: Message[] | DeprecatedGqlMessage[]) => void;\n\n /**\n * Remove a specific message by ID\n *\n * ```tsx\n * deleteMessage(\"123\");\n * ```\n */\n deleteMessage: (messageId: string) => void;\n\n /**\n * Regenerate the response for a specific message\n *\n * ```tsx\n * reloadMessages(\"123\");\n * ```\n */\n reloadMessages: (messageId: string) => Promise<void>;\n\n /**\n * Stop the current message generation\n *\n * ```tsx\n * if (isLoading) {\n * stopGeneration();\n * }\n * ```\n */\n stopGeneration: () => void;\n\n /**\n * Clear all messages and reset chat state\n *\n * ```tsx\n * reset();\n * console.log(messages); // []\n * ```\n */\n reset: () => void;\n\n /**\n * Whether the chat is currently generating a response\n *\n * ```tsx\n * if (isLoading) {\n * console.log(\"Loading...\");\n * } else {\n * console.log(\"Not loading\");\n * }\n */\n isLoading: boolean;\n\n /**\n * Whether the chat agent is available to generate responses\n *\n * ```tsx\n * if (isAvailable) {\n * console.log(\"Loading...\");\n * } else {\n * console.log(\"Not loading\");\n * }\n */\n isAvailable: boolean;\n\n /** Manually trigger chat completion (advanced usage) */\n runChatCompletion: () => Promise<Message[]>;\n\n /** MCP (Model Context Protocol) server configurations */\n mcpServers: MCPServerConfig[];\n\n /** Update MCP server configurations */\n setMcpServers: (mcpServers: MCPServerConfig[]) => void;\n\n /**\n * Current suggestions array\n * Use this to read the current suggestions or in conjunction with setSuggestions for manual control\n */\n suggestions: Suggestion[];\n\n /**\n * Manually set suggestions\n * Useful for manual mode or custom suggestion workflows\n */\n setSuggestions: (suggestions: Omit<Suggestion, \"isLoading\">[]) => void;\n\n /**\n * Trigger AI-powered suggestion generation\n * Uses configurations from useCopilotChatSuggestions hooks\n * Respects global debouncing - only one generation can run at a time\n *\n * ```tsx\n * generateSuggestions();\n * console.log(suggestions); // [suggestion1, suggestion2, suggestion3]\n * ```\n */\n generateSuggestions: () => Promise<void>;\n\n /**\n * Clear all current suggestions\n * Also resets suggestion generation state\n */\n resetSuggestions: () => void;\n\n /** Whether suggestions are currently being generated */\n isLoadingSuggestions: boolean;\n\n /** Interrupt content for human-in-the-loop workflows */\n interrupt: string | React.ReactElement | null;\n\n agent?: ReturnType<typeof useAgent>[\"agent\"];\n\n threadId?: string;\n}\n\nexport function useCopilotChatInternal({\n suggestions,\n onInProgress,\n onSubmitMessage,\n onStopGeneration,\n onReloadMessages,\n}: UseCopilotChatOptions = {}): UseCopilotChatReturn {\n const { copilotkit } = useCopilotKit();\n const { threadId, agentSession } = useCopilotContext();\n const existingConfig = useCopilotChatConfiguration();\n const [agentAvailable, setAgentAvailable] = useState(false);\n\n // Apply priority: props > existing config > defaults\n const resolvedAgentId = existingConfig?.agentId ?? \"default\";\n const { agent } = useAgent({ agentId: resolvedAgentId });\n\n useEffect(() => {\n const connect = async (agent: AbstractAgent) => {\n setAgentAvailable(false);\n try {\n await copilotkit.connectAgent({ agent });\n setAgentAvailable(true);\n } catch (error) {\n if (error instanceof AGUIConnectNotImplementedError) {\n // connect not implemented, ignore\n } else {\n throw error;\n }\n }\n };\n if (agent && existingConfig?.threadId && agent.threadId !== existingConfig.threadId) {\n agent.threadId = existingConfig.threadId;\n connect(agent);\n }\n return () => {};\n }, [existingConfig?.threadId, agent, copilotkit, resolvedAgentId]);\n\n useEffect(() => {\n onInProgress?.(Boolean(agent?.isRunning));\n }, [agent?.isRunning, onInProgress]);\n\n const interrupt = useLangGraphInterruptRender(agent);\n\n const reset = () => {\n agent?.setMessages([]);\n agent?.setState(null);\n };\n\n const deleteMessage = useCallback(\n (messageId: string) => {\n const filteredMessages = (agent?.messages ?? []).filter(\n (message) => message.id !== messageId,\n );\n agent?.setMessages(filteredMessages);\n },\n [agent?.setMessages, agent?.messages],\n );\n\n const latestDelete = useUpdatedRef(deleteMessage);\n const latestDeleteFunc = useCallback(\n (messageId: string) => {\n return latestDelete.current(messageId);\n },\n [latestDelete],\n );\n\n const currentSuggestions = useSuggestions({ agentId: resolvedAgentId });\n\n const reload = useAsyncCallback(\n async (reloadMessageId: string): Promise<void> => {\n const messages = agent?.messages ?? [];\n // TODO: get isLoading\n const isLoading = false;\n if (isLoading || messages.length === 0) {\n return;\n }\n\n const reloadMessageIndex = messages.findIndex((msg) => msg.id === reloadMessageId);\n if (reloadMessageIndex === -1) {\n console.warn(`Message with id ${reloadMessageId} not found`);\n return;\n }\n\n const reloadMessageRole = messages[reloadMessageIndex].role;\n if (reloadMessageRole !== \"assistant\") {\n console.warn(`Regenerate cannot be performed on ${reloadMessageRole} role`);\n return;\n }\n let historyCutoff: Message[] = [messages[0]];\n\n if (messages.length > 2 && reloadMessageIndex !== 0) {\n // message to regenerate from is now first.\n // Work backwards to find the first the closest user message\n const lastUserMessageBeforeRegenerate = messages\n .slice(0, reloadMessageIndex)\n .reverse()\n .find((msg) => msg.role === \"user\");\n\n if (!lastUserMessageBeforeRegenerate) {\n historyCutoff = [messages[0]];\n } else {\n const indexOfLastUserMessageBeforeRegenerate = messages.findIndex(\n (msg) => msg.id === lastUserMessageBeforeRegenerate.id,\n );\n // Include the user message, remove everything after it\n historyCutoff = messages.slice(0, indexOfLastUserMessageBeforeRegenerate + 1);\n }\n } else if (messages.length > 2 && reloadMessageIndex === 0) {\n historyCutoff = [messages[0], messages[1]];\n }\n\n agent?.setMessages(historyCutoff);\n\n if (agent) {\n copilotkit.runAgent({ agent });\n }\n return;\n },\n [agent?.setMessages, copilotkit?.runAgent],\n );\n\n const latestSendMessageFunc = useAsyncCallback(\n async (message: Message, options?: AppendMessageOptions) => {\n if (!agent) return;\n const followUp = options?.followUp ?? true;\n if (options?.clearSuggestions) {\n copilotkit.clearSuggestions(resolvedAgentId);\n }\n agent?.addMessage(message);\n if (followUp) {\n try {\n await copilotkit.runAgent({ agent });\n } catch (error) {\n console.error(\"CopilotChat: runAgent failed\", error);\n }\n }\n if (onSubmitMessage) {\n const content =\n typeof message.content === \"string\"\n ? message.content\n : message.content && \"text\" in message.content\n ? message.content.text\n : message.content && \"filename\" in message.content\n ? message.content.filename\n : \"\";\n onSubmitMessage(content);\n }\n },\n [agent, copilotkit, resolvedAgentId, onSubmitMessage],\n );\n\n const latestAppendFunc = useAsyncCallback(\n async (message: DeprecatedGqlMessage, options?: AppendMessageOptions) => {\n return latestSendMessageFunc(gqlToAGUI([message])[0], options);\n },\n [latestSendMessageFunc],\n );\n\n const latestSetMessagesFunc = useCallback(\n (messages: Message[] | DeprecatedGqlMessage[]) => {\n if (messages.every((message) => message instanceof DeprecatedGqlMessage)) {\n return agent?.setMessages?.(gqlToAGUI(messages));\n }\n return agent?.setMessages?.(messages);\n },\n [agent?.setMessages, agent],\n );\n\n const latestReload = useUpdatedRef(reload);\n const latestReloadFunc = useAsyncCallback(\n async (messageId: string) => {\n onReloadMessages?.({\n messageId,\n currentAgentName: agent?.agentId,\n messages: agent?.messages ?? [],\n });\n return await latestReload.current(messageId);\n },\n [latestReload, agent, onReloadMessages],\n );\n\n const latestStopFunc = useCallback(() => {\n onStopGeneration?.({\n currentAgentName: agent?.agentId,\n messages: agent?.messages ?? [],\n });\n return agent?.abortRun?.();\n }, [onStopGeneration, agent]);\n\n const latestReset = useUpdatedRef(reset);\n const latestResetFunc = useCallback(() => {\n return latestReset.current();\n }, [latestReset]);\n\n const lazyToolRendered = useLazyToolRenderer();\n const renderCustomMessage = useRenderCustomMessages();\n const legacyCustomMessageRenderer = useLegacyCoagentRenderer({\n copilotkit,\n agent,\n agentId: resolvedAgentId,\n threadId: existingConfig?.threadId ?? threadId,\n });\n const allMessages = agent?.messages ?? [];\n const resolvedMessages = useMemo(() => {\n let processedMessages = allMessages.map((message) => {\n if (message.role !== \"assistant\") {\n return message;\n }\n\n const lazyRendered = lazyToolRendered(message, allMessages);\n if (lazyRendered) {\n const renderedGenUi = lazyRendered();\n if (renderedGenUi) {\n return { ...message, generativeUI: () => renderedGenUi };\n }\n }\n\n const bridgeRenderer =\n legacyCustomMessageRenderer || renderCustomMessage\n ? () => {\n if (legacyCustomMessageRenderer) {\n return legacyCustomMessageRenderer({ message, position: \"before\" });\n }\n try {\n return renderCustomMessage?.({ message, position: \"before\" }) ?? null;\n } catch (error) {\n console.warn(\n \"[CopilotKit] renderCustomMessages failed, falling back to legacy renderer\",\n error,\n );\n return null;\n }\n }\n : null;\n\n if (bridgeRenderer) {\n // Attach a position so react-ui can render the custom UI above the assistant content.\n return {\n ...message,\n generativeUI: bridgeRenderer,\n generativeUIPosition: \"before\" as const,\n };\n }\n return message;\n });\n\n const hasAssistantMessages = processedMessages.some((msg) => msg.role === \"assistant\");\n const canUseCustomRenderer = Boolean(\n renderCustomMessage && copilotkit?.getAgent?.(resolvedAgentId),\n );\n const placeholderRenderer = legacyCustomMessageRenderer\n ? legacyCustomMessageRenderer\n : canUseCustomRenderer\n ? renderCustomMessage\n : null;\n\n const shouldRenderPlaceholder =\n Boolean(agent?.isRunning) || Boolean(agent?.state && Object.keys(agent.state).length);\n\n const effectiveThreadId = threadId ?? agent?.threadId ?? \"default\";\n let latestUserIndex = -1;\n for (let i = processedMessages.length - 1; i >= 0; i -= 1) {\n if (processedMessages[i].role === \"user\") {\n latestUserIndex = i;\n break;\n }\n }\n const latestUserMessageId =\n latestUserIndex >= 0 ? processedMessages[latestUserIndex].id : undefined;\n const currentRunId = latestUserMessageId\n ? copilotkit.getRunIdForMessage(resolvedAgentId, effectiveThreadId, latestUserMessageId) ||\n `pending:${latestUserMessageId}`\n : undefined;\n const hasAssistantForCurrentRun =\n latestUserIndex >= 0\n ? processedMessages\n .slice(latestUserIndex + 1)\n .some((msg) => msg.role === \"assistant\")\n : hasAssistantMessages;\n\n // Insert a placeholder assistant message so state snapshots can render before any\n // assistant text exists for the current run.\n if (placeholderRenderer && shouldRenderPlaceholder && !hasAssistantForCurrentRun) {\n const placeholderId = currentRunId\n ? `coagent-state-render-${resolvedAgentId}-${currentRunId}`\n : `coagent-state-render-${resolvedAgentId}`;\n const placeholderMessage: Message = {\n id: placeholderId,\n role: \"assistant\",\n content: \"\",\n name: \"coagent-state-render\",\n runId: currentRunId,\n };\n processedMessages = [\n ...processedMessages,\n {\n ...placeholderMessage,\n generativeUIPosition: \"before\" as const,\n generativeUI: () =>\n placeholderRenderer({\n message: placeholderMessage,\n position: \"before\",\n }),\n } as Message,\n ];\n }\n\n return processedMessages;\n }, [\n agent?.messages,\n lazyToolRendered,\n allMessages,\n renderCustomMessage,\n legacyCustomMessageRenderer,\n resolvedAgentId,\n copilotkit,\n agent?.isRunning,\n agent?.state,\n ]);\n\n const renderedSuggestions = useMemo(() => {\n if (Array.isArray(suggestions)) {\n return {\n suggestions: suggestions.map((s) => ({ ...s, isLoading: false })),\n isLoading: false,\n };\n }\n return currentSuggestions;\n }, [suggestions, currentSuggestions]);\n\n // @ts-ignore\n return {\n messages: resolvedMessages,\n sendMessage: latestSendMessageFunc,\n appendMessage: latestAppendFunc,\n setMessages: latestSetMessagesFunc,\n reloadMessages: latestReloadFunc,\n stopGeneration: latestStopFunc,\n reset: latestResetFunc,\n deleteMessage: latestDeleteFunc,\n isAvailable: agentAvailable,\n isLoading: Boolean(agent?.isRunning),\n // mcpServers,\n // setMcpServers,\n suggestions: renderedSuggestions.suggestions,\n setSuggestions: (suggestions: Omit<Suggestion, \"isLoading\">[]) =>\n copilotkit.addSuggestionsConfig({ suggestions }),\n generateSuggestions: async () => copilotkit.reloadSuggestions(resolvedAgentId),\n resetSuggestions: () => copilotkit.clearSuggestions(resolvedAgentId),\n isLoadingSuggestions: renderedSuggestions.isLoading,\n interrupt,\n agent,\n threadId,\n };\n}\n\n// store `value` in a ref and update\n// it whenever it changes.\nfunction useUpdatedRef<T>(value: T) {\n const ref = useRef(value);\n\n useEffect(() => {\n ref.current = value;\n }, [value]);\n\n return ref;\n}\n\ntype LegacyRenderParams = {\n message: Message;\n position: \"before\" | \"after\";\n};\n\ntype LegacyRenderer = ((args: LegacyRenderParams) => any) | null;\n\nfunction useLegacyCoagentRenderer({\n copilotkit,\n agent,\n agentId,\n threadId,\n}: {\n copilotkit: ReturnType<typeof useCopilotKit>[\"copilotkit\"];\n agent?: AbstractAgent;\n agentId: string;\n threadId?: string;\n}): LegacyRenderer {\n return useMemo(() => {\n if (!copilotkit || !agent) {\n return null;\n }\n\n return ({ message, position }: LegacyRenderParams) => {\n const effectiveThreadId = threadId ?? agent.threadId ?? \"default\";\n const providedRunId = (message as any).runId as string | undefined;\n const existingRunId = providedRunId\n ? providedRunId\n : copilotkit.getRunIdForMessage(agentId, effectiveThreadId, message.id);\n const runId = existingRunId || `pending:${message.id}`;\n const messageIndex = Math.max(\n agent.messages.findIndex((msg) => msg.id === message.id),\n 0,\n );\n\n const bridgeProps: CoAgentStateRenderBridgeProps = {\n message: message as any,\n position,\n runId,\n messageIndex,\n messageIndexInRun: 0,\n numberOfMessagesInRun: 1,\n agentId,\n stateSnapshot: (message as any).state,\n };\n\n return createElement(CoAgentStateRenderBridge, bridgeProps) as any;\n };\n }, [agent, agentId, copilotkit, threadId]);\n}\n\nexport function defaultSystemMessage(\n contextString: string,\n additionalInstructions?: string,\n): string {\n return (\n `\nPlease act as an efficient, competent, conscientious, and industrious professional assistant.\n\nHelp the user achieve their goals, and you do so in a way that is as efficient as possible, without unnecessary fluff, but also without sacrificing professionalism.\nAlways be polite and respectful, and prefer brevity over verbosity.\n\nThe user has provided you with the following context:\n\\`\\`\\`\n${contextString}\n\\`\\`\\`\n\nThey have also provided you with functions you can call to initiate actions on their behalf, or functions you can call to receive more information.\n\nPlease assist them as best you can.\n\nYou can ask them for clarifying questions if needed, but don't be annoying about it. If you can reasonably 'fill in the blanks' yourself, do so.\n\nIf you would like to call a function, call it without saying anything else.\nIn case of a function error:\n- If this error stems from incorrect function parameters or syntax, you may retry with corrected arguments.\n- If the error's source is unclear or seems unrelated to your input, do not attempt further retries.\n` + (additionalInstructions ? `\\n\\n${additionalInstructions}` : \"\")\n );\n}\n"],"mappings":"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","names":["agent","_a","_b","suggestions"]}
|
|
1
|
+
{"version":3,"sources":["../src/hooks/use-copilot-chat_internal.ts"],"sourcesContent":["import { useRef, useEffect, useCallback, useMemo, useState, createElement } from \"react\";\nimport { useCopilotContext } from \"../context/copilot-context\";\nimport { SystemMessageFunction } from \"../types\";\nimport { useAsyncCallback } from \"../components/error-boundary/error-utils\";\nimport { Message } from \"@copilotkit/shared\";\nimport { gqlToAGUI, Message as DeprecatedGqlMessage } from \"@copilotkit/runtime-client-gql\";\nimport { useLangGraphInterruptRender } from \"./use-langgraph-interrupt-render\";\nimport {\n useAgent,\n useCopilotChatConfiguration,\n useCopilotKit,\n useRenderCustomMessages,\n useSuggestions,\n} from \"@copilotkitnext/react\";\nimport { Suggestion } from \"@copilotkitnext/core\";\nimport { useLazyToolRenderer } from \"./use-lazy-tool-renderer\";\nimport { AbstractAgent, AGUIConnectNotImplementedError } from \"@ag-ui/client\";\nimport {\n CoAgentStateRenderBridge,\n type CoAgentStateRenderBridgeProps,\n} from \"./use-coagent-state-render-bridge\";\n\n/**\n * The type of suggestions to use in the chat.\n *\n * `auto` - Suggestions are generated automatically.\n * `manual` - Suggestions are controlled programmatically.\n * `SuggestionItem[]` - Static suggestions array.\n */\nexport type ChatSuggestions = \"auto\" | \"manual\" | Omit<Suggestion, \"isLoading\">[];\n\nexport interface AppendMessageOptions {\n /**\n * Whether to run the chat completion after appending the message. Defaults to `true`.\n */\n followUp?: boolean;\n /**\n * Whether to clear the suggestions after appending the message. Defaults to `true`.\n */\n clearSuggestions?: boolean;\n}\n\nexport interface OnStopGenerationArguments {\n /**\n * The name of the currently executing agent.\n */\n currentAgentName: string | undefined;\n\n /**\n * The messages in the chat.\n */\n messages: Message[];\n}\n\nexport type OnReloadMessagesArguments = OnStopGenerationArguments & {\n /**\n * The message on which \"regenerate\" was pressed\n */\n messageId: string;\n};\n\nexport type OnStopGeneration = (args: OnStopGenerationArguments) => void;\n\nexport type OnReloadMessages = (args: OnReloadMessagesArguments) => void;\n\nexport interface UseCopilotChatOptions {\n /**\n * A unique identifier for the chat. If not provided, a random one will be\n * generated. When provided, the `useChat` hook with the same `id` will\n * have shared states across components.\n */\n id?: string;\n\n /**\n * HTTP headers to be sent with the API request.\n */\n headers?: Record<string, string> | Headers;\n\n /**\n * Initial messages to populate the chat with.\n */\n initialMessages?: Message[];\n\n /**\n * A function to generate the system message. Defaults to `defaultSystemMessage`.\n */\n makeSystemMessage?: SystemMessageFunction;\n\n /**\n * Disables inclusion of CopilotKit’s default system message. When true, no system message is sent (this also suppresses any custom message from <code>makeSystemMessage</code>).\n */\n disableSystemMessage?: boolean;\n /**\n * Controls the behavior of suggestions in the chat interface.\n *\n * `auto` (default) - Suggestions are generated automatically:\n * - When the chat is first opened (empty state)\n * - After each message exchange completes\n * - Uses configuration from `useCopilotChatSuggestions` hooks\n *\n * `manual` - Suggestions are controlled programmatically:\n * - Use `setSuggestions()` to set custom suggestions\n * - Use `generateSuggestions()` to trigger AI generation\n * - Access via `useCopilotChat` hook\n *\n * `SuggestionItem[]` - Static suggestions array:\n * - Always shows the same suggestions\n * - No AI generation involved\n */\n suggestions?: ChatSuggestions;\n\n onInProgress?: (isLoading: boolean) => void;\n onSubmitMessage?: (messageContent: string) => Promise<void> | void;\n onStopGeneration?: OnStopGeneration;\n onReloadMessages?: OnReloadMessages;\n}\n\nexport interface MCPServerConfig {\n endpoint: string;\n apiKey?: string;\n}\n\n// Old suggestion item interface, for returning from useCopilotChatInternal\ninterface SuggestionItem {\n title: string;\n message: string;\n partial?: boolean;\n className?: string;\n}\n\nexport interface UseCopilotChatReturn {\n /**\n * @deprecated use `messages` instead, this is an old non ag-ui version of the messages\n * Array of messages currently visible in the chat interface\n *\n * This is the visible messages, not the raw messages from the runtime client.\n */\n visibleMessages: DeprecatedGqlMessage[];\n\n /**\n * The messages that are currently in the chat in AG-UI format.\n */\n messages: Message[];\n\n /** @deprecated use `sendMessage` in `useCopilotChatHeadless_c` instead. This will be removed in a future major version. */\n appendMessage: (message: DeprecatedGqlMessage, options?: AppendMessageOptions) => Promise<void>;\n\n /**\n * Send a new message to the chat\n *\n * ```tsx\n * await sendMessage({\n * id: \"123\",\n * role: \"user\",\n * content: \"Hello, process this request\",\n * });\n * ```\n */\n sendMessage: (message: Message, options?: AppendMessageOptions) => Promise<void>;\n\n /**\n * Replace all messages in the chat\n *\n * ```tsx\n * setMessages([\n * { id: \"123\", role: \"user\", content: \"Hello, process this request\" },\n * { id: \"456\", role: \"assistant\", content: \"Hello, I'm the assistant\" },\n * ]);\n * ```\n *\n * **Deprecated** non-ag-ui version:\n *\n * ```tsx\n * setMessages([\n * new TextMessage({\n * content: \"Hello, process this request\",\n * role: gqlRole.User,\n * }),\n * new TextMessage({\n * content: \"Hello, I'm the assistant\",\n * role: gqlRole.Assistant,\n * ]);\n * ```\n *\n */\n setMessages: (messages: Message[] | DeprecatedGqlMessage[]) => void;\n\n /**\n * Remove a specific message by ID\n *\n * ```tsx\n * deleteMessage(\"123\");\n * ```\n */\n deleteMessage: (messageId: string) => void;\n\n /**\n * Regenerate the response for a specific message\n *\n * ```tsx\n * reloadMessages(\"123\");\n * ```\n */\n reloadMessages: (messageId: string) => Promise<void>;\n\n /**\n * Stop the current message generation\n *\n * ```tsx\n * if (isLoading) {\n * stopGeneration();\n * }\n * ```\n */\n stopGeneration: () => void;\n\n /**\n * Clear all messages and reset chat state\n *\n * ```tsx\n * reset();\n * console.log(messages); // []\n * ```\n */\n reset: () => void;\n\n /**\n * Whether the chat is currently generating a response\n *\n * ```tsx\n * if (isLoading) {\n * console.log(\"Loading...\");\n * } else {\n * console.log(\"Not loading\");\n * }\n */\n isLoading: boolean;\n\n /**\n * Whether the chat agent is available to generate responses\n *\n * ```tsx\n * if (isAvailable) {\n * console.log(\"Loading...\");\n * } else {\n * console.log(\"Not loading\");\n * }\n */\n isAvailable: boolean;\n\n /** Manually trigger chat completion (advanced usage) */\n runChatCompletion: () => Promise<Message[]>;\n\n /** MCP (Model Context Protocol) server configurations */\n mcpServers: MCPServerConfig[];\n\n /** Update MCP server configurations */\n setMcpServers: (mcpServers: MCPServerConfig[]) => void;\n\n /**\n * Current suggestions array\n * Use this to read the current suggestions or in conjunction with setSuggestions for manual control\n */\n suggestions: Suggestion[];\n\n /**\n * Manually set suggestions\n * Useful for manual mode or custom suggestion workflows\n */\n setSuggestions: (suggestions: Omit<Suggestion, \"isLoading\">[]) => void;\n\n /**\n * Trigger AI-powered suggestion generation\n * Uses configurations from useCopilotChatSuggestions hooks\n * Respects global debouncing - only one generation can run at a time\n *\n * ```tsx\n * generateSuggestions();\n * console.log(suggestions); // [suggestion1, suggestion2, suggestion3]\n * ```\n */\n generateSuggestions: () => Promise<void>;\n\n /**\n * Clear all current suggestions\n * Also resets suggestion generation state\n */\n resetSuggestions: () => void;\n\n /** Whether suggestions are currently being generated */\n isLoadingSuggestions: boolean;\n\n /** Interrupt content for human-in-the-loop workflows */\n interrupt: string | React.ReactElement | null;\n\n agent?: ReturnType<typeof useAgent>[\"agent\"];\n\n threadId?: string;\n}\n\nexport function useCopilotChatInternal({\n suggestions,\n onInProgress,\n onSubmitMessage,\n onStopGeneration,\n onReloadMessages,\n}: UseCopilotChatOptions = {}): UseCopilotChatReturn {\n const { copilotkit } = useCopilotKit();\n const { threadId, agentSession } = useCopilotContext();\n const existingConfig = useCopilotChatConfiguration();\n const [agentAvailable, setAgentAvailable] = useState(false);\n\n // Apply priority: props > existing config > defaults\n const resolvedAgentId = existingConfig?.agentId ?? \"default\";\n const { agent } = useAgent({ agentId: resolvedAgentId });\n\n useEffect(() => {\n const connect = async (agent: AbstractAgent) => {\n setAgentAvailable(false);\n try {\n await copilotkit.connectAgent({ agent });\n setAgentAvailable(true);\n } catch (error) {\n if (error instanceof AGUIConnectNotImplementedError) {\n // connect not implemented, ignore\n } else {\n throw error;\n }\n }\n };\n if (agent && existingConfig?.threadId && agent.threadId !== existingConfig.threadId) {\n agent.threadId = existingConfig.threadId;\n connect(agent);\n }\n return () => {};\n }, [existingConfig?.threadId, agent, copilotkit, resolvedAgentId]);\n\n useEffect(() => {\n onInProgress?.(Boolean(agent?.isRunning));\n }, [agent?.isRunning, onInProgress]);\n\n const interrupt = useLangGraphInterruptRender(agent);\n\n const reset = () => {\n agent?.setMessages([]);\n agent?.setState(null);\n };\n\n const deleteMessage = useCallback(\n (messageId: string) => {\n const filteredMessages = (agent?.messages ?? []).filter(\n (message) => message.id !== messageId,\n );\n agent?.setMessages(filteredMessages);\n },\n [agent?.setMessages, agent?.messages],\n );\n\n const latestDelete = useUpdatedRef(deleteMessage);\n const latestDeleteFunc = useCallback(\n (messageId: string) => {\n return latestDelete.current(messageId);\n },\n [latestDelete],\n );\n\n const currentSuggestions = useSuggestions({ agentId: resolvedAgentId });\n\n const reload = useAsyncCallback(\n async (reloadMessageId: string): Promise<void> => {\n const messages = agent?.messages ?? [];\n // TODO: get isLoading\n const isLoading = false;\n if (isLoading || messages.length === 0) {\n return;\n }\n\n const reloadMessageIndex = messages.findIndex((msg) => msg.id === reloadMessageId);\n if (reloadMessageIndex === -1) {\n console.warn(`Message with id ${reloadMessageId} not found`);\n return;\n }\n\n const reloadMessageRole = messages[reloadMessageIndex].role;\n if (reloadMessageRole !== \"assistant\") {\n console.warn(`Regenerate cannot be performed on ${reloadMessageRole} role`);\n return;\n }\n let historyCutoff: Message[] = [messages[0]];\n\n if (messages.length > 2 && reloadMessageIndex !== 0) {\n // message to regenerate from is now first.\n // Work backwards to find the first the closest user message\n const lastUserMessageBeforeRegenerate = messages\n .slice(0, reloadMessageIndex)\n .reverse()\n .find((msg) => msg.role === \"user\");\n\n if (!lastUserMessageBeforeRegenerate) {\n historyCutoff = [messages[0]];\n } else {\n const indexOfLastUserMessageBeforeRegenerate = messages.findIndex(\n (msg) => msg.id === lastUserMessageBeforeRegenerate.id,\n );\n // Include the user message, remove everything after it\n historyCutoff = messages.slice(0, indexOfLastUserMessageBeforeRegenerate + 1);\n }\n } else if (messages.length > 2 && reloadMessageIndex === 0) {\n historyCutoff = [messages[0], messages[1]];\n }\n\n agent?.setMessages(historyCutoff);\n\n if (agent) {\n copilotkit.runAgent({ agent });\n }\n return;\n },\n [agent?.setMessages, copilotkit?.runAgent],\n );\n\n const latestSendMessageFunc = useAsyncCallback(\n async (message: Message, options?: AppendMessageOptions) => {\n if (!agent) return;\n const followUp = options?.followUp ?? true;\n if (options?.clearSuggestions) {\n copilotkit.clearSuggestions(resolvedAgentId);\n }\n agent?.addMessage(message);\n if (followUp) {\n try {\n await copilotkit.runAgent({ agent });\n } catch (error) {\n console.error(\"CopilotChat: runAgent failed\", error);\n }\n }\n if (onSubmitMessage) {\n const content =\n typeof message.content === \"string\"\n ? message.content\n : message.content && \"text\" in message.content\n ? message.content.text\n : message.content && \"filename\" in message.content\n ? message.content.filename\n : \"\";\n onSubmitMessage(content);\n }\n },\n [agent, copilotkit, resolvedAgentId, onSubmitMessage],\n );\n\n const latestAppendFunc = useAsyncCallback(\n async (message: DeprecatedGqlMessage, options?: AppendMessageOptions) => {\n return latestSendMessageFunc(gqlToAGUI([message])[0], options);\n },\n [latestSendMessageFunc],\n );\n\n const latestSetMessagesFunc = useCallback(\n (messages: Message[] | DeprecatedGqlMessage[]) => {\n if (messages.every((message) => message instanceof DeprecatedGqlMessage)) {\n return agent?.setMessages?.(gqlToAGUI(messages));\n }\n return agent?.setMessages?.(messages);\n },\n [agent?.setMessages, agent],\n );\n\n const latestReload = useUpdatedRef(reload);\n const latestReloadFunc = useAsyncCallback(\n async (messageId: string) => {\n onReloadMessages?.({\n messageId,\n currentAgentName: agent?.agentId,\n messages: agent?.messages ?? [],\n });\n return await latestReload.current(messageId);\n },\n [latestReload, agent, onReloadMessages],\n );\n\n const latestStopFunc = useCallback(() => {\n onStopGeneration?.({\n currentAgentName: agent?.agentId,\n messages: agent?.messages ?? [],\n });\n return agent?.abortRun?.();\n }, [onStopGeneration, agent]);\n\n const latestReset = useUpdatedRef(reset);\n const latestResetFunc = useCallback(() => {\n return latestReset.current();\n }, [latestReset]);\n\n const lazyToolRendered = useLazyToolRenderer();\n const renderCustomMessage = useRenderCustomMessages();\n const legacyCustomMessageRenderer = useLegacyCoagentRenderer({\n copilotkit,\n agent,\n agentId: resolvedAgentId,\n threadId: existingConfig?.threadId ?? threadId,\n });\n const allMessages = agent?.messages ?? [];\n const resolvedMessages = useMemo(() => {\n let processedMessages = allMessages.map((message) => {\n if (message.role !== \"assistant\") {\n return message;\n }\n\n const lazyRendered = lazyToolRendered(message, allMessages);\n if (lazyRendered) {\n const renderedGenUi = lazyRendered();\n if (renderedGenUi) {\n return { ...message, generativeUI: () => renderedGenUi };\n }\n }\n\n const bridgeRenderer =\n legacyCustomMessageRenderer || renderCustomMessage\n ? () => {\n const customRender = renderCustomMessage?.({\n message,\n position: \"before\",\n });\n if (customRender) {\n return customRender;\n }\n return legacyCustomMessageRenderer?.({ message, position: \"before\" });\n }\n : null;\n\n if (bridgeRenderer) {\n return { ...message, generativeUI: bridgeRenderer };\n }\n return message;\n });\n\n const hasAssistantMessages = processedMessages.some((msg) => msg.role === \"assistant\");\n\n // TODO: what is this?\n // if (legacyCustomMessageRenderer && !hasAssistantMessages) {\n // const placeholderId = `coagent-state-render-${resolvedAgentId}`;\n // const placeholderMessage: Message = {\n // id: placeholderId,\n // role: \"assistant\",\n // content: \"\",\n // name: \"coagent-state-render\",\n // };\n // processedMessages = [\n // ...processedMessages,\n // {\n // ...placeholderMessage,\n // generativeUI: () =>\n // legacyCustomMessageRenderer({\n // message: placeholderMessage,\n // position: \"before\",\n // }),\n // } as Message,\n // ];\n // }\n\n return processedMessages;\n }, [\n agent?.messages,\n lazyToolRendered,\n allMessages,\n renderCustomMessage,\n // legacyCustomMessageRenderer,\n resolvedAgentId,\n ]);\n\n const renderedSuggestions = useMemo(() => {\n if (Array.isArray(suggestions)) {\n return {\n suggestions: suggestions.map((s) => ({ ...s, isLoading: false })),\n isLoading: false,\n };\n }\n return currentSuggestions;\n }, [suggestions, currentSuggestions]);\n\n // @ts-ignore\n return {\n messages: resolvedMessages,\n sendMessage: latestSendMessageFunc,\n appendMessage: latestAppendFunc,\n setMessages: latestSetMessagesFunc,\n reloadMessages: latestReloadFunc,\n stopGeneration: latestStopFunc,\n reset: latestResetFunc,\n deleteMessage: latestDeleteFunc,\n isAvailable: agentAvailable,\n isLoading: Boolean(agent?.isRunning),\n // mcpServers,\n // setMcpServers,\n suggestions: renderedSuggestions.suggestions,\n setSuggestions: (suggestions: Omit<Suggestion, \"isLoading\">[]) =>\n copilotkit.addSuggestionsConfig({ suggestions }),\n generateSuggestions: async () => copilotkit.reloadSuggestions(resolvedAgentId),\n resetSuggestions: () => copilotkit.clearSuggestions(resolvedAgentId),\n isLoadingSuggestions: renderedSuggestions.isLoading,\n interrupt,\n agent,\n threadId,\n };\n}\n\n// store `value` in a ref and update\n// it whenever it changes.\nfunction useUpdatedRef<T>(value: T) {\n const ref = useRef(value);\n\n useEffect(() => {\n ref.current = value;\n }, [value]);\n\n return ref;\n}\n\ntype LegacyRenderParams = {\n message: Message;\n position: \"before\" | \"after\";\n};\n\ntype LegacyRenderer = ((args: LegacyRenderParams) => any) | null;\n\nfunction useLegacyCoagentRenderer({\n copilotkit,\n agent,\n agentId,\n threadId,\n}: {\n copilotkit: ReturnType<typeof useCopilotKit>[\"copilotkit\"];\n agent?: AbstractAgent;\n agentId: string;\n threadId?: string;\n}): LegacyRenderer {\n return useMemo(() => {\n if (!copilotkit || !agent) {\n return null;\n }\n\n return ({ message, position }: LegacyRenderParams) => {\n const effectiveThreadId = threadId ?? agent.threadId ?? \"default\";\n const existingRunId = copilotkit.getRunIdForMessage(agentId, effectiveThreadId, message.id);\n const runId = existingRunId || `pending:${message.id}`;\n const messageIndex = Math.max(\n agent.messages.findIndex((msg) => msg.id === message.id),\n 0,\n );\n\n const bridgeProps: CoAgentStateRenderBridgeProps = {\n message: message as any,\n position,\n runId,\n messageIndex,\n messageIndexInRun: 0,\n numberOfMessagesInRun: 1,\n agentId,\n stateSnapshot: (message as any).state,\n };\n\n return createElement(CoAgentStateRenderBridge, bridgeProps) as any;\n };\n }, [agent, agentId, copilotkit, threadId]);\n}\n\nexport function defaultSystemMessage(\n contextString: string,\n additionalInstructions?: string,\n): string {\n return (\n `\nPlease act as an efficient, competent, conscientious, and industrious professional assistant.\n\nHelp the user achieve their goals, and you do so in a way that is as efficient as possible, without unnecessary fluff, but also without sacrificing professionalism.\nAlways be polite and respectful, and prefer brevity over verbosity.\n\nThe user has provided you with the following context:\n\\`\\`\\`\n${contextString}\n\\`\\`\\`\n\nThey have also provided you with functions you can call to initiate actions on their behalf, or functions you can call to receive more information.\n\nPlease assist them as best you can.\n\nYou can ask them for clarifying questions if needed, but don't be annoying about it. If you can reasonably 'fill in the blanks' yourself, do so.\n\nIf you would like to call a function, call it without saying anything else.\nIn case of a function error:\n- If this error stems from incorrect function parameters or syntax, you may retry with corrected arguments.\n- If the error's source is unclear or seems unrelated to your input, do not attempt further retries.\n` + (additionalInstructions ? `\\n\\n${additionalInstructions}` : \"\")\n );\n}\n"],"mappings":"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","names":["agent","_a","_b","suggestions"]}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import {
|
|
2
|
+
useCoAgentStateRenders
|
|
3
|
+
} from "./chunk-FDOMAPJY.mjs";
|
|
4
|
+
import {
|
|
5
|
+
__objRest
|
|
6
|
+
} from "./chunk-SKC7AJIV.mjs";
|
|
7
|
+
|
|
8
|
+
// src/hooks/use-coagent-state-render-bridge.tsx
|
|
9
|
+
import { useAgent } from "@copilotkitnext/react";
|
|
10
|
+
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
11
|
+
import { dataToUUID, parseJson } from "@copilotkit/shared";
|
|
12
|
+
function getStateWithoutConstantKeys(state) {
|
|
13
|
+
if (!state)
|
|
14
|
+
return {};
|
|
15
|
+
const _a = state, { messages, tools, copilotkit } = _a, stateWithoutConstantKeys = __objRest(_a, ["messages", "tools", "copilotkit"]);
|
|
16
|
+
return stateWithoutConstantKeys;
|
|
17
|
+
}
|
|
18
|
+
function areStatesEquals(a, b) {
|
|
19
|
+
if (a && !b || !a && b)
|
|
20
|
+
return false;
|
|
21
|
+
const _a = a, { messages, tools, copilotkit } = _a, aWithoutConstantKeys = __objRest(_a, ["messages", "tools", "copilotkit"]);
|
|
22
|
+
const _b = b, {
|
|
23
|
+
messages: bMessages,
|
|
24
|
+
tools: bTools,
|
|
25
|
+
copilotkit: bCopilotkit
|
|
26
|
+
} = _b, bWithoutConstantKeys = __objRest(_b, [
|
|
27
|
+
"messages",
|
|
28
|
+
"tools",
|
|
29
|
+
"copilotkit"
|
|
30
|
+
]);
|
|
31
|
+
return JSON.stringify(aWithoutConstantKeys) === JSON.stringify(bWithoutConstantKeys);
|
|
32
|
+
}
|
|
33
|
+
function useCoagentStateRenderBridge(agentId, props) {
|
|
34
|
+
var _a;
|
|
35
|
+
const { stateSnapshot, messageIndexInRun, message } = props;
|
|
36
|
+
const { coAgentStateRenders, claimsRef } = useCoAgentStateRenders();
|
|
37
|
+
const { agent } = useAgent({ agentId });
|
|
38
|
+
const [nodeName, setNodeName] = useState(void 0);
|
|
39
|
+
const [, forceUpdate] = useState(0);
|
|
40
|
+
const runId = (_a = props.runId) != null ? _a : message.runId;
|
|
41
|
+
const effectiveRunId = runId || "pending";
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
if (!agent)
|
|
44
|
+
return;
|
|
45
|
+
const subscriber = {
|
|
46
|
+
onStateChanged: () => {
|
|
47
|
+
forceUpdate((value) => value + 1);
|
|
48
|
+
},
|
|
49
|
+
onStepStartedEvent: ({ event }) => {
|
|
50
|
+
if (event.stepName !== nodeName) {
|
|
51
|
+
setNodeName(event.stepName);
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
onStepFinishedEvent: ({ event }) => {
|
|
55
|
+
if (event.stepName === nodeName) {
|
|
56
|
+
setNodeName(void 0);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
const { unsubscribe } = agent.subscribe(subscriber);
|
|
61
|
+
return () => {
|
|
62
|
+
unsubscribe();
|
|
63
|
+
};
|
|
64
|
+
}, [agentId, nodeName]);
|
|
65
|
+
const getStateRender = useCallback(
|
|
66
|
+
(messageId) => {
|
|
67
|
+
return Object.entries(coAgentStateRenders).find(([stateRenderId, stateRender]) => {
|
|
68
|
+
if (claimsRef.current[messageId]) {
|
|
69
|
+
return stateRenderId === claimsRef.current[messageId].stateRenderId;
|
|
70
|
+
}
|
|
71
|
+
const matchingAgentName = stateRender.name === agentId;
|
|
72
|
+
const matchesNodeContext = stateRender.nodeName ? stateRender.nodeName === nodeName : true;
|
|
73
|
+
return matchingAgentName && matchesNodeContext;
|
|
74
|
+
});
|
|
75
|
+
},
|
|
76
|
+
[coAgentStateRenders, nodeName, agentId]
|
|
77
|
+
);
|
|
78
|
+
const handleRenderRequest = ({
|
|
79
|
+
stateRenderId,
|
|
80
|
+
messageId,
|
|
81
|
+
runId: runId2,
|
|
82
|
+
stateSnapshot: renderSnapshot
|
|
83
|
+
}) => {
|
|
84
|
+
if (claimsRef.current[messageId]) {
|
|
85
|
+
const canRender = claimsRef.current[messageId].stateRenderId === stateRenderId;
|
|
86
|
+
if (canRender && runId2 && (!claimsRef.current[messageId].runId || claimsRef.current[messageId].runId === "pending")) {
|
|
87
|
+
claimsRef.current[messageId].runId = runId2;
|
|
88
|
+
}
|
|
89
|
+
return canRender;
|
|
90
|
+
}
|
|
91
|
+
const renderClaimedByOtherMessage = Object.values(claimsRef.current).find(
|
|
92
|
+
(c) => c.stateRenderId === stateRenderId && dataToUUID(getStateWithoutConstantKeys(c.stateSnapshot)) === dataToUUID(getStateWithoutConstantKeys(renderSnapshot))
|
|
93
|
+
);
|
|
94
|
+
if (renderClaimedByOtherMessage) {
|
|
95
|
+
if (renderSnapshot && renderClaimedByOtherMessage.stateSnapshot && !areStatesEquals(renderClaimedByOtherMessage.stateSnapshot, renderSnapshot)) {
|
|
96
|
+
claimsRef.current[messageId] = { stateRenderId, runId: runId2 };
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
if (!runId2) {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
claimsRef.current[messageId] = { stateRenderId, runId: runId2 };
|
|
105
|
+
return true;
|
|
106
|
+
};
|
|
107
|
+
return useMemo(() => {
|
|
108
|
+
var _a2, _b, _c;
|
|
109
|
+
if (messageIndexInRun !== 0) {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
const [stateRenderId, stateRender] = (_a2 = getStateRender(message.id)) != null ? _a2 : [];
|
|
113
|
+
if (!stateRender || !stateRenderId) {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
const snapshot = stateSnapshot ? parseJson(stateSnapshot, stateSnapshot) : agent == null ? void 0 : agent.state;
|
|
117
|
+
const canRender = handleRenderRequest({
|
|
118
|
+
stateRenderId,
|
|
119
|
+
messageId: message.id,
|
|
120
|
+
runId: effectiveRunId,
|
|
121
|
+
stateSnapshot: snapshot
|
|
122
|
+
});
|
|
123
|
+
if (!canRender) {
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
if (snapshot) {
|
|
127
|
+
const existingSnapshot = claimsRef.current[message.id].stateSnapshot;
|
|
128
|
+
const snapshotChanged = stateSnapshot && existingSnapshot !== void 0 && !areStatesEquals(existingSnapshot, snapshot);
|
|
129
|
+
if (!claimsRef.current[message.id].locked || snapshotChanged) {
|
|
130
|
+
claimsRef.current[message.id].stateSnapshot = snapshot;
|
|
131
|
+
if (stateSnapshot) {
|
|
132
|
+
claimsRef.current[message.id].locked = true;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (stateRender.handler) {
|
|
137
|
+
stateRender.handler({
|
|
138
|
+
state: stateSnapshot ? parseJson(stateSnapshot, stateSnapshot) : (_b = agent == null ? void 0 : agent.state) != null ? _b : {},
|
|
139
|
+
nodeName: nodeName != null ? nodeName : ""
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
if (stateRender.render) {
|
|
143
|
+
const status = (agent == null ? void 0 : agent.isRunning) ? "inProgress" : "complete";
|
|
144
|
+
if (typeof stateRender.render === "string")
|
|
145
|
+
return stateRender.render;
|
|
146
|
+
return stateRender.render({
|
|
147
|
+
status,
|
|
148
|
+
// Always use state from claim, to make sure the state does not seem "wiped" for a fraction of a second
|
|
149
|
+
state: (_c = claimsRef.current[message.id].stateSnapshot) != null ? _c : {},
|
|
150
|
+
nodeName: nodeName != null ? nodeName : ""
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
}, [
|
|
154
|
+
getStateRender,
|
|
155
|
+
stateSnapshot,
|
|
156
|
+
agent == null ? void 0 : agent.state,
|
|
157
|
+
agent == null ? void 0 : agent.isRunning,
|
|
158
|
+
nodeName,
|
|
159
|
+
effectiveRunId,
|
|
160
|
+
message.id,
|
|
161
|
+
messageIndexInRun
|
|
162
|
+
]);
|
|
163
|
+
}
|
|
164
|
+
function CoAgentStateRenderBridge(props) {
|
|
165
|
+
return useCoagentStateRenderBridge(props.agentId, props);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export {
|
|
169
|
+
useCoagentStateRenderBridge,
|
|
170
|
+
CoAgentStateRenderBridge
|
|
171
|
+
};
|
|
172
|
+
//# sourceMappingURL=chunk-3X3I7OJV.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/use-coagent-state-render-bridge.tsx"],"sourcesContent":["import { ReactCustomMessageRendererPosition, useAgent } from \"@copilotkitnext/react\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { AgentSubscriber } from \"@ag-ui/client\";\nimport { useCoAgentStateRenders } from \"../context\";\nimport { dataToUUID, parseJson } from \"@copilotkit/shared\";\n\nfunction getStateWithoutConstantKeys(state: any) {\n if (!state) return {};\n const { messages, tools, copilotkit, ...stateWithoutConstantKeys } = state;\n return stateWithoutConstantKeys;\n}\n\n// Function that compares states, without the constant keys\nfunction areStatesEquals(a: any, b: any) {\n if ((a && !b) || (!a && b)) return false;\n const { messages, tools, copilotkit, ...aWithoutConstantKeys } = a;\n const {\n messages: bMessages,\n tools: bTools,\n copilotkit: bCopilotkit,\n ...bWithoutConstantKeys\n } = b;\n\n return JSON.stringify(aWithoutConstantKeys) === JSON.stringify(bWithoutConstantKeys);\n}\n\n/**\n * Bridge hook that connects agent state renders to chat messages.\n *\n * ## Purpose\n * This hook finds matching state render configurations (registered via useCoAgentStateRender)\n * and returns UI to render in chat.\n * It ensures each state render appears bound to a specific message, preventing duplicates while\n * allowing re-binding when the underlying state changes significantly.\n *\n * ## Message-ID-Based Claiming System\n *\n * ### The Problem\n * Multiple bridge component instances render simultaneously (one per message). Without coordination,\n * they would all try to render the same state render, causing duplicates.\n *\n * ### The Solution: Message-ID Claims with State Comparison\n * Each state render is \"claimed\" by exactly one **message ID** (not runId):\n *\n * **Claim Structure**: `claimsRef.current[messageId] = { stateRenderId, runId, stateSnapshot, locked }`\n *\n * **Primary binding is by messageId because**:\n * - runId is not always available immediately (starts as \"pending\")\n * - messageId is the stable identifier throughout the message lifecycle\n * - Claims persist across component remounts via context ref\n *\n * ### Claiming Logic Flow\n *\n * 1. **Message already has a claim**:\n * - Check if the claim matches the current stateRenderId\n * - If yes → render (this message owns this render)\n * - Update runId if it was \"pending\" and now available\n *\n * 2. **State render claimed by another message**:\n * - Compare state snapshots (ignoring constant keys: messages, tools, copilotkit)\n * - If states are identical → block rendering (duplicate)\n * - **If states are different → allow claiming** (new data, new message)\n * - This handles cases where the same render type shows different states in different messages\n *\n * 3. **Unclaimed state render**:\n * - Only allow claiming if runId is \"pending\" (initial render)\n * - If runId is real but no claim exists → block (edge case protection)\n * - Create new claim: `claimsRef.current[messageId] = { stateRenderId, runId }`\n *\n * ### State Snapshot Locking\n *\n * Once a state snapshot is captured and locked for a message:\n * - The UI always renders with the locked snapshot (not live agent.state)\n * - Prevents UI from appearing \"wiped\" during state transitions\n * - Locked when: stateSnapshot prop is available (from message persistence)\n * - Unlocked state: can still update from live agent.state\n *\n * ### Synchronous Claiming (Ref-based)\n *\n * Claims are stored in a context-level ref (not React state):\n * - Multiple bridges render in the same tick\n * - State updates are async - would allow duplicates before update completes\n * - Ref provides immediate, synchronous claim checking\n * - Survives component remounts (stored in context, not component)\n *\n * ## Flow Example\n *\n * ```\n * Time 1: Message A renders, runId=undefined, state={progress: 50%}\n * → effectiveRunId = \"pending\"\n * → Claims: claimsRef[\"msgA\"] = { stateRenderId: \"tasks\", runId: \"pending\", stateSnapshot: {progress: 50%} }\n * → Renders UI with 50% progress\n *\n * Time 2: Message B renders, runId=undefined, same state\n * → Checks: \"tasks\" already claimed by msgA with same state\n * → Returns null (blocked - duplicate)\n *\n * Time 3: Real runId appears (e.g., \"run-123\")\n * → Updates claim: claimsRef[\"msgA\"].runId = \"run-123\"\n * → Message A continues rendering\n *\n * Time 4: Agent processes more, state={progress: 100%}\n * → Message A: locked to 50% (stateSnapshot locked)\n * → Message C renders with state={progress: 100%}\n * → Checks: \"tasks\" claimed by msgA but state is DIFFERENT (50% vs 100%)\n * → Allows new claim: claimsRef[\"msgC\"] = { stateRenderId: \"tasks\", runId: \"run-123\", stateSnapshot: {progress: 100%} }\n * → Both messages render independently with their own snapshots\n * ```\n */\nexport interface CoAgentStateRenderBridgeProps {\n message: any;\n position: ReactCustomMessageRendererPosition;\n runId: string;\n messageIndex: number;\n messageIndexInRun: number;\n numberOfMessagesInRun: number;\n agentId: string;\n stateSnapshot: any;\n}\n\nexport function useCoagentStateRenderBridge(agentId: string, props: CoAgentStateRenderBridgeProps) {\n const { stateSnapshot, messageIndexInRun, message } = props;\n const { coAgentStateRenders, claimsRef } = useCoAgentStateRenders();\n const { agent } = useAgent({ agentId });\n const [nodeName, setNodeName] = useState<string | undefined>(undefined);\n const [, forceUpdate] = useState(0);\n\n const runId = props.runId ?? message.runId;\n const effectiveRunId = runId || \"pending\";\n\n useEffect(() => {\n if (!agent) return;\n const subscriber: AgentSubscriber = {\n onStateChanged: () => {\n forceUpdate((value) => value + 1);\n },\n onStepStartedEvent: ({ event }) => {\n if (event.stepName !== nodeName) {\n setNodeName(event.stepName);\n }\n },\n onStepFinishedEvent: ({ event }) => {\n if (event.stepName === nodeName) {\n setNodeName(undefined);\n }\n },\n };\n\n const { unsubscribe } = agent.subscribe(subscriber);\n return () => {\n unsubscribe();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [agentId, nodeName]);\n\n const getStateRender = useCallback(\n (messageId: string) => {\n return Object.entries(coAgentStateRenders).find(([stateRenderId, stateRender]) => {\n if (claimsRef.current[messageId]) {\n return stateRenderId === claimsRef.current[messageId].stateRenderId;\n }\n const matchingAgentName = stateRender.name === agentId;\n const matchesNodeContext = stateRender.nodeName ? stateRender.nodeName === nodeName : true;\n return matchingAgentName && matchesNodeContext;\n });\n },\n [coAgentStateRenders, nodeName, agentId],\n );\n\n // Message ID-based claim system - A state render can only be claimed by one message ID\n const handleRenderRequest = ({\n stateRenderId,\n messageId,\n runId,\n stateSnapshot: renderSnapshot,\n }: {\n stateRenderId: string;\n messageId: string;\n runId?: string;\n stateSnapshot?: any;\n }): boolean => {\n // Check if this message has already claimed this state render\n if (claimsRef.current[messageId]) {\n const canRender = claimsRef.current[messageId].stateRenderId === stateRenderId;\n\n // Update runId if it doesn't exist\n if (\n canRender &&\n runId &&\n (!claimsRef.current[messageId].runId || claimsRef.current[messageId].runId === \"pending\")\n ) {\n claimsRef.current[messageId].runId = runId;\n }\n\n return canRender;\n }\n\n // Do not allow render if any other message has claimed this state render\n const renderClaimedByOtherMessage = Object.values(claimsRef.current).find(\n (c) =>\n c.stateRenderId === stateRenderId &&\n dataToUUID(getStateWithoutConstantKeys(c.stateSnapshot)) ===\n dataToUUID(getStateWithoutConstantKeys(renderSnapshot)),\n );\n if (renderClaimedByOtherMessage) {\n // If:\n // - state render already claimed\n // - snapshot exists in the claiming object and is different from current,\n if (\n renderSnapshot &&\n renderClaimedByOtherMessage.stateSnapshot &&\n !areStatesEquals(renderClaimedByOtherMessage.stateSnapshot, renderSnapshot)\n ) {\n claimsRef.current[messageId] = { stateRenderId, runId };\n return true;\n }\n return false;\n }\n\n // No existing claim anywhere yet – allow this message to claim even if we already know the runId.\n if (!runId) {\n return false;\n }\n\n claimsRef.current[messageId] = { stateRenderId, runId };\n return true;\n };\n\n return useMemo(() => {\n if (messageIndexInRun !== 0) {\n return null;\n }\n\n const [stateRenderId, stateRender] = getStateRender(message.id) ?? [];\n\n if (!stateRender || !stateRenderId) {\n return null;\n }\n\n // Is there any state we can use?\n const snapshot = stateSnapshot ? parseJson(stateSnapshot, stateSnapshot) : agent?.state;\n\n // Synchronously check/claim - returns true if this message can render\n const canRender = handleRenderRequest({\n stateRenderId,\n messageId: message.id,\n runId: effectiveRunId,\n stateSnapshot: snapshot,\n });\n if (!canRender) {\n return null;\n }\n\n // If we found state, and given that now there's a claim for the current message, let's save it in the claim\n if (snapshot) {\n const existingSnapshot = claimsRef.current[message.id].stateSnapshot;\n const snapshotChanged =\n stateSnapshot &&\n existingSnapshot !== undefined &&\n !areStatesEquals(existingSnapshot, snapshot);\n\n if (!claimsRef.current[message.id].locked || snapshotChanged) {\n claimsRef.current[message.id].stateSnapshot = snapshot;\n if (stateSnapshot) {\n claimsRef.current[message.id].locked = true;\n }\n }\n }\n\n if (stateRender.handler) {\n stateRender.handler({\n state: stateSnapshot ? parseJson(stateSnapshot, stateSnapshot) : (agent?.state ?? {}),\n nodeName: nodeName ?? \"\",\n });\n }\n\n if (stateRender.render) {\n const status = agent?.isRunning ? \"inProgress\" : \"complete\";\n\n if (typeof stateRender.render === \"string\") return stateRender.render;\n\n return stateRender.render({\n status,\n // Always use state from claim, to make sure the state does not seem \"wiped\" for a fraction of a second\n state: claimsRef.current[message.id].stateSnapshot ?? {},\n nodeName: nodeName ?? \"\",\n });\n }\n }, [\n getStateRender,\n stateSnapshot,\n agent?.state,\n agent?.isRunning,\n nodeName,\n effectiveRunId,\n message.id,\n messageIndexInRun,\n ]);\n}\n\nexport function CoAgentStateRenderBridge(props: CoAgentStateRenderBridgeProps) {\n return useCoagentStateRenderBridge(props.agentId, props);\n}\n"],"mappings":"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","names":["runId","_a"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
useCopilotChatInternal
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-37JRY3TC.mjs";
|
|
4
4
|
import {
|
|
5
5
|
useCopilotContext
|
|
6
6
|
} from "./chunk-AFNWX62Q.mjs";
|
|
@@ -83,4 +83,4 @@ function useCopilotChatHeadless_c(options = {}) {
|
|
|
83
83
|
export {
|
|
84
84
|
useCopilotChatHeadless_c
|
|
85
85
|
};
|
|
86
|
-
//# sourceMappingURL=chunk-
|
|
86
|
+
//# sourceMappingURL=chunk-AR533FGY.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/context/coagent-state-renders-context.tsx"],"sourcesContent":["import React, {\n createContext,\n useContext,\n useCallback,\n useState,\n useRef,\n ReactNode,\n RefObject,\n} from \"react\";\nimport { CoAgentStateRender } from \"../types/coagent-action\";\n\ninterface StateRenderClaim {\n stateRenderId: string;\n stateSnapshot?: any;\n runId?: string;\n locked?: boolean;\n}\n\ntype ClaimsRef = Record<string, StateRenderClaim>;\n\nexport interface CoAgentStateRendersContextValue {\n coAgentStateRenders: Record<string, CoAgentStateRender<any>>;\n setCoAgentStateRender: (id: string, stateRender: CoAgentStateRender<any>) => void;\n removeCoAgentStateRender: (id: string) => void;\n claimsRef: RefObject<ClaimsRef>;\n}\n\nconst CoAgentStateRendersContext = createContext<CoAgentStateRendersContextValue | undefined>(\n undefined,\n);\n\nexport function CoAgentStateRendersProvider({ children }: { children: ReactNode }) {\n const [coAgentStateRenders, setCoAgentStateRenders] = useState<\n Record<string, CoAgentStateRender<any>>\n >({});\n\n const setCoAgentStateRender = useCallback((id: string, stateRender: CoAgentStateRender<any>) => {\n setCoAgentStateRenders((prevPoints) => ({\n ...prevPoints,\n [id]: stateRender,\n }));\n }, []);\n\n const removeCoAgentStateRender = useCallback((id: string) => {\n setCoAgentStateRenders((prevPoints) => {\n const newPoints = { ...prevPoints };\n delete newPoints[id];\n return newPoints;\n });\n }, []);\n\n const claimsRef = useRef<ClaimsRef>({});\n\n return (\n <CoAgentStateRendersContext.Provider\n value={{\n coAgentStateRenders,\n setCoAgentStateRender,\n removeCoAgentStateRender,\n claimsRef,\n }}\n >\n {children}\n </CoAgentStateRendersContext.Provider>\n );\n}\n\nexport function useCoAgentStateRenders() {\n const context = useContext(CoAgentStateRendersContext);\n if (!context) {\n throw new Error(\"useCoAgentStateRenders must be used within CoAgentStateRendersProvider\");\n }\n return context;\n}\n\nexport { CoAgentStateRendersContext };\n"],"mappings":";;;;;;AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AA8CH;AA3BJ,IAAM,6BAA6B;AAAA,EACjC;AACF;AAEO,SAAS,4BAA4B,EAAE,SAAS,GAA4B;AACjF,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,SAEpD,CAAC,CAAC;AAEJ,QAAM,wBAAwB,YAAY,CAAC,IAAY,gBAAyC;AAC9F,2BAAuB,CAAC,eAAgB,iCACnC,aADmC;AAAA,MAEtC,CAAC,EAAE,GAAG;AAAA,IACR,EAAE;AAAA,EACJ,GAAG,CAAC,CAAC;AAEL,QAAM,2BAA2B,YAAY,CAAC,OAAe;AAC3D,2BAAuB,CAAC,eAAe;AACrC,YAAM,YAAY,mBAAK;AACvB,aAAO,UAAU,EAAE;AACnB,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,YAAY,OAAkB,CAAC,CAAC;AAEtC,SACE;AAAA,IAAC,2BAA2B;AAAA,IAA3B;AAAA,MACC,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AAEO,SAAS,yBAAyB;AACvC,QAAM,UAAU,WAAW,0BAA0B;AACrD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,wEAAwE;AAAA,EAC1F;AACA,SAAO;AACT;","names":[]}
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-4CEQJ2X6.mjs";
|
|
4
4
|
import {
|
|
5
5
|
defaultCopilotContextCategories
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-THCOOWDH.mjs";
|
|
7
7
|
import {
|
|
8
8
|
__async,
|
|
9
9
|
__spreadValues
|
|
@@ -117,4 +117,4 @@ ${instructions}
|
|
|
117
117
|
export {
|
|
118
118
|
CopilotTask
|
|
119
119
|
};
|
|
120
|
-
//# sourceMappingURL=chunk-
|
|
120
|
+
//# sourceMappingURL=chunk-K2GJI3PT.mjs.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
useCopilotChatInternal
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-37JRY3TC.mjs";
|
|
4
4
|
|
|
5
5
|
// src/hooks/use-copilot-chat.ts
|
|
6
6
|
function useCopilotChat(options = {}) {
|
|
@@ -33,4 +33,4 @@ function useCopilotChat(options = {}) {
|
|
|
33
33
|
export {
|
|
34
34
|
useCopilotChat
|
|
35
35
|
};
|
|
36
|
-
//# sourceMappingURL=chunk-
|
|
36
|
+
//# sourceMappingURL=chunk-LWJIFZWN.mjs.map
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
} from "./chunk-YYN33GSG.mjs";
|
|
17
17
|
import {
|
|
18
18
|
CoAgentStateRenderBridge
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-3X3I7OJV.mjs";
|
|
20
20
|
import {
|
|
21
21
|
ThreadsProvider,
|
|
22
22
|
useThreads
|
|
@@ -33,7 +33,7 @@ import {
|
|
|
33
33
|
} from "./chunk-6ZLPNY7X.mjs";
|
|
34
34
|
import {
|
|
35
35
|
CoAgentStateRendersProvider
|
|
36
|
-
} from "./chunk-
|
|
36
|
+
} from "./chunk-FDOMAPJY.mjs";
|
|
37
37
|
import {
|
|
38
38
|
CopilotContext
|
|
39
39
|
} from "./chunk-AFNWX62Q.mjs";
|
|
@@ -548,4 +548,4 @@ export {
|
|
|
548
548
|
CopilotKitInternal,
|
|
549
549
|
defaultCopilotContextCategories
|
|
550
550
|
};
|
|
551
|
-
//# sourceMappingURL=chunk-
|
|
551
|
+
//# sourceMappingURL=chunk-THCOOWDH.mjs.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-EFL5OBKN.mjs";
|
|
4
4
|
import {
|
|
5
5
|
useCoAgentStateRenders
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-FDOMAPJY.mjs";
|
|
7
7
|
import {
|
|
8
8
|
CopilotContext
|
|
9
9
|
} from "./chunk-AFNWX62Q.mjs";
|
|
@@ -83,4 +83,4 @@ function useCoAgentStateRender(action, dependencies) {
|
|
|
83
83
|
export {
|
|
84
84
|
useCoAgentStateRender
|
|
85
85
|
};
|
|
86
|
-
//# sourceMappingURL=chunk-
|
|
86
|
+
//# sourceMappingURL=chunk-YTQHRJUA.mjs.map
|