@copilotkit/react-core 1.55.3-canary.1776243725 → 1.55.3-canary.1776979102

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.
Files changed (58) hide show
  1. package/dist/{copilotkit-opur-20s.d.mts → copilotkit-3mXoM0Hd.d.mts} +9 -29
  2. package/dist/copilotkit-3mXoM0Hd.d.mts.map +1 -0
  3. package/dist/{copilotkit-EfopO2gn.d.cts → copilotkit-BDDjvB-p.d.cts} +9 -29
  4. package/dist/copilotkit-BDDjvB-p.d.cts.map +1 -0
  5. package/dist/{copilotkit-BoOnQHlE.cjs → copilotkit-BkcqmpWt.cjs} +162 -280
  6. package/dist/copilotkit-BkcqmpWt.cjs.map +1 -0
  7. package/dist/{copilotkit-Bm4ox8G0.mjs → copilotkit-C7n8Umv9.mjs} +164 -276
  8. package/dist/copilotkit-C7n8Umv9.mjs.map +1 -0
  9. package/dist/index.cjs +4 -9
  10. package/dist/index.cjs.map +1 -1
  11. package/dist/index.d.cts +1 -1
  12. package/dist/index.d.mts +1 -1
  13. package/dist/index.mjs +4 -9
  14. package/dist/index.mjs.map +1 -1
  15. package/dist/index.umd.js +143 -230
  16. package/dist/index.umd.js.map +1 -1
  17. package/dist/v2/index.cjs +1 -2
  18. package/dist/v2/index.d.cts +2 -2
  19. package/dist/v2/index.d.mts +2 -2
  20. package/dist/v2/index.mjs +2 -2
  21. package/dist/v2/index.umd.js +165 -279
  22. package/dist/v2/index.umd.js.map +1 -1
  23. package/package.json +6 -6
  24. package/src/components/copilot-provider/copilot-messages.tsx +24 -39
  25. package/src/components/copilot-provider/copilotkit-props.tsx +5 -9
  26. package/src/components/copilot-provider/copilotkit.tsx +1 -4
  27. package/src/hooks/__tests__/use-copilot-chat-internal-connect.test.tsx +16 -27
  28. package/src/hooks/use-copilot-chat_internal.ts +4 -15
  29. package/src/v2/__tests__/utils/test-helpers.tsx +7 -40
  30. package/src/v2/components/chat/CopilotChat.tsx +1 -1
  31. package/src/v2/components/chat/CopilotChatAssistantMessage.tsx +15 -18
  32. package/src/v2/components/chat/CopilotChatMessageView.tsx +2 -7
  33. package/src/v2/components/chat/CopilotChatReasoningMessage.tsx +4 -17
  34. package/src/v2/components/chat/CopilotChatUserMessage.tsx +10 -13
  35. package/src/v2/components/chat/__tests__/CopilotChat.e2e.test.tsx +5 -131
  36. package/src/v2/components/chat/__tests__/CopilotChatActivityRendering.e2e.test.tsx +0 -60
  37. package/src/v2/components/chat/__tests__/CopilotChatAssistantMessage.test.tsx +1 -1
  38. package/src/v2/components/chat/__tests__/CopilotChatToolRendering.e2e.test.tsx +2 -5
  39. package/src/v2/components/chat/__tests__/CopilotChatToolRerenders.e2e.test.tsx +2 -5
  40. package/src/v2/components/chat/__tests__/MCPAppsActivityRenderer.e2e.test.tsx +1 -55
  41. package/src/v2/hooks/__tests__/use-agent-context-timing.e2e.test.tsx +0 -8
  42. package/src/v2/hooks/__tests__/use-agent-throttle.test.tsx +10 -10
  43. package/src/v2/hooks/__tests__/use-agent.e2e.test.tsx +2 -13
  44. package/src/v2/hooks/__tests__/use-frontend-tool.e2e.test.tsx +4 -23
  45. package/src/v2/hooks/index.ts +0 -1
  46. package/src/v2/hooks/use-agent.tsx +10 -157
  47. package/src/v2/hooks/use-render-activity-message.tsx +3 -9
  48. package/src/v2/hooks/use-render-custom-messages.tsx +1 -6
  49. package/src/v2/providers/CopilotKitProvider.tsx +2 -6
  50. package/dist/copilotkit-Bm4ox8G0.mjs.map +0 -1
  51. package/dist/copilotkit-BoOnQHlE.cjs.map +0 -1
  52. package/dist/copilotkit-EfopO2gn.d.cts.map +0 -1
  53. package/dist/copilotkit-opur-20s.d.mts.map +0 -1
  54. package/src/components/copilot-provider/__tests__/error-visibility-prod.test.tsx +0 -70
  55. package/src/v2/components/chat/__tests__/CopilotChatCopyButton.clipboard.test.tsx +0 -241
  56. package/src/v2/hooks/__tests__/use-agent-thread-isolation.test.tsx +0 -327
  57. package/src/v2/hooks/__tests__/use-capabilities.test.tsx +0 -76
  58. package/src/v2/hooks/use-capabilities.tsx +0 -25
package/dist/index.umd.js CHANGED
@@ -1954,7 +1954,7 @@ window.parent.postMessage({jsonrpc:"2.0",method:"ui/notifications/sandbox-proxy-
1954
1954
  }, [value, warningMessage]);
1955
1955
  return value;
1956
1956
  }
1957
- const CopilotKitProvider = ({ children, runtimeUrl, headers: headersProp = {}, credentials, publicApiKey, publicLicenseKey, licenseToken, properties = {}, agents__unsafe_dev_only: agents = {}, selfManagedAgents = {}, renderToolCalls, renderActivityMessages, renderCustomMessages, frontendTools, humanInTheLoop, openGenerativeUI, showDevConsole = false, useSingleEndpoint, onError, a2ui, defaultThrottleMs, inspectorDefaultAnchor }) => {
1957
+ const CopilotKitProvider = ({ children, runtimeUrl, headers = {}, credentials, publicApiKey, publicLicenseKey, licenseToken, properties = {}, agents__unsafe_dev_only: agents = {}, selfManagedAgents = {}, renderToolCalls, renderActivityMessages, renderCustomMessages, frontendTools, humanInTheLoop, openGenerativeUI, showDevConsole = false, useSingleEndpoint, onError, a2ui, defaultThrottleMs, inspectorDefaultAnchor }) => {
1958
1958
  var _openGenerativeUI$des;
1959
1959
  const [shouldRenderInspector, setShouldRenderInspector] = (0, react.useState)(false);
1960
1960
  const [runtimeA2UIEnabled, setRuntimeA2UIEnabled] = (0, react.useState)(false);
@@ -2016,7 +2016,6 @@ window.parent.postMessage({jsonrpc:"2.0",method:"ui/notifications/sandbox-proxy-
2016
2016
  ...selfManagedAgents
2017
2017
  }), [agents, selfManagedAgents]);
2018
2018
  const hasLocalAgents = mergedAgents && Object.keys(mergedAgents).length > 0;
2019
- const headers = typeof headersProp === "function" ? headersProp() : headersProp;
2020
2019
  const mergedHeaders = (0, react.useMemo)(() => {
2021
2020
  if (!resolvedPublicKey) return headers;
2022
2021
  if (headers[HEADER_NAME]) return headers;
@@ -2378,204 +2377,6 @@ window.parent.postMessage({jsonrpc:"2.0",method:"ui/notifications/sandbox-proxy-
2378
2377
  ]);
2379
2378
  }
2380
2379
 
2381
- //#endregion
2382
- //#region src/v2/hooks/use-agent.tsx
2383
- let UseAgentUpdate = /* @__PURE__ */ function(UseAgentUpdate) {
2384
- UseAgentUpdate["OnMessagesChanged"] = "OnMessagesChanged";
2385
- UseAgentUpdate["OnStateChanged"] = "OnStateChanged";
2386
- UseAgentUpdate["OnRunStatusChanged"] = "OnRunStatusChanged";
2387
- return UseAgentUpdate;
2388
- }({});
2389
- const ALL_UPDATES = [
2390
- UseAgentUpdate.OnMessagesChanged,
2391
- UseAgentUpdate.OnStateChanged,
2392
- UseAgentUpdate.OnRunStatusChanged
2393
- ];
2394
- /**
2395
- * Clone a registry agent for per-thread isolation.
2396
- * Copies agent configuration (transport, headers, etc.) but resets conversation
2397
- * state (messages, threadId, state) so each thread starts fresh.
2398
- */
2399
- function cloneForThread(source, threadId, headers) {
2400
- const clone = source.clone();
2401
- if (clone === source) throw new Error(`useAgent: ${source.constructor.name}.clone() returned the same instance. clone() must return a new, independent object.`);
2402
- clone.threadId = threadId;
2403
- clone.setMessages([]);
2404
- clone.setState({});
2405
- if (clone instanceof _ag_ui_client.HttpAgent) clone.headers = { ...headers };
2406
- return clone;
2407
- }
2408
- /**
2409
- * Module-level WeakMap: registryAgent → (threadId → clone).
2410
- * Shared across all useAgent() calls so that every component using the same
2411
- * (agentId, threadId) pair receives the same agent instance. Using WeakMap
2412
- * ensures the clone map is garbage-collected when the registry agent is
2413
- * replaced (e.g. after reconnect or hot-reload).
2414
- */
2415
- const globalThreadCloneMap = /* @__PURE__ */ new WeakMap();
2416
- /**
2417
- * Look up an existing per-thread clone without creating one.
2418
- * Returns undefined when no clone has been created yet for this pair.
2419
- */
2420
- function getThreadClone(registryAgent, threadId) {
2421
- var _globalThreadCloneMap;
2422
- if (!registryAgent || !threadId) return void 0;
2423
- return (_globalThreadCloneMap = globalThreadCloneMap.get(registryAgent)) === null || _globalThreadCloneMap === void 0 ? void 0 : _globalThreadCloneMap.get(threadId);
2424
- }
2425
- function getOrCreateThreadClone(existing, threadId, headers) {
2426
- let byThread = globalThreadCloneMap.get(existing);
2427
- if (!byThread) {
2428
- byThread = /* @__PURE__ */ new Map();
2429
- globalThreadCloneMap.set(existing, byThread);
2430
- }
2431
- const cached = byThread.get(threadId);
2432
- if (cached) return cached;
2433
- const clone = cloneForThread(existing, threadId, headers);
2434
- byThread.set(threadId, clone);
2435
- return clone;
2436
- }
2437
- function useAgent({ agentId, threadId, updates, throttleMs } = {}) {
2438
- var _agentId, _threadId;
2439
- (_agentId = agentId) !== null && _agentId !== void 0 || (agentId = _copilotkit_shared.DEFAULT_AGENT_ID);
2440
- const { copilotkit } = useCopilotKit();
2441
- const providerThrottleMs = copilotkit.defaultThrottleMs;
2442
- const chatConfig = useCopilotChatConfiguration();
2443
- (_threadId = threadId) !== null && _threadId !== void 0 || (threadId = chatConfig === null || chatConfig === void 0 ? void 0 : chatConfig.threadId);
2444
- const effectiveThrottleMs = (0, react.useMemo)(() => {
2445
- var _ref;
2446
- const resolved = (_ref = throttleMs !== null && throttleMs !== void 0 ? throttleMs : providerThrottleMs) !== null && _ref !== void 0 ? _ref : 0;
2447
- if (!Number.isFinite(resolved) || resolved < 0) {
2448
- const source = throttleMs !== void 0 ? "hook-level throttleMs" : "provider-level defaultThrottleMs";
2449
- console.error(`useAgent: ${source} must be a non-negative finite number, got ${resolved}. Falling back to unthrottled.`);
2450
- return 0;
2451
- }
2452
- return resolved;
2453
- }, [throttleMs, providerThrottleMs]);
2454
- const [, forceUpdate] = (0, react.useReducer)((x) => x + 1, 0);
2455
- const updateFlags = (0, react.useMemo)(() => updates !== null && updates !== void 0 ? updates : ALL_UPDATES, [JSON.stringify(updates)]);
2456
- const provisionalAgentCache = (0, react.useRef)(/* @__PURE__ */ new Map());
2457
- const agent = (0, react.useMemo)(() => {
2458
- var _copilotkit$agents;
2459
- const cacheKey = threadId ? `${agentId}:${threadId}` : agentId;
2460
- const existing = copilotkit.getAgent(agentId);
2461
- if (existing) {
2462
- provisionalAgentCache.current.delete(cacheKey);
2463
- provisionalAgentCache.current.delete(agentId);
2464
- if (!threadId) return existing;
2465
- return getOrCreateThreadClone(existing, threadId, copilotkit.headers);
2466
- }
2467
- const isRuntimeConfigured = copilotkit.runtimeUrl !== void 0;
2468
- const status = copilotkit.runtimeConnectionStatus;
2469
- if (isRuntimeConfigured && (status === _copilotkit_core.CopilotKitCoreRuntimeConnectionStatus.Disconnected || status === _copilotkit_core.CopilotKitCoreRuntimeConnectionStatus.Connecting)) {
2470
- const cached = provisionalAgentCache.current.get(cacheKey);
2471
- if (cached) {
2472
- cached.headers = { ...copilotkit.headers };
2473
- return cached;
2474
- }
2475
- const provisional = new _copilotkit_core.ProxiedCopilotRuntimeAgent({
2476
- runtimeUrl: copilotkit.runtimeUrl,
2477
- agentId,
2478
- transport: copilotkit.runtimeTransport,
2479
- runtimeMode: "pending"
2480
- });
2481
- provisional.headers = { ...copilotkit.headers };
2482
- if (threadId) provisional.threadId = threadId;
2483
- provisionalAgentCache.current.set(cacheKey, provisional);
2484
- return provisional;
2485
- }
2486
- if (isRuntimeConfigured && status === _copilotkit_core.CopilotKitCoreRuntimeConnectionStatus.Error) {
2487
- const cached = provisionalAgentCache.current.get(cacheKey);
2488
- if (cached) {
2489
- cached.headers = { ...copilotkit.headers };
2490
- return cached;
2491
- }
2492
- const provisional = new _copilotkit_core.ProxiedCopilotRuntimeAgent({
2493
- runtimeUrl: copilotkit.runtimeUrl,
2494
- agentId,
2495
- transport: copilotkit.runtimeTransport,
2496
- runtimeMode: "pending"
2497
- });
2498
- provisional.headers = { ...copilotkit.headers };
2499
- if (threadId) provisional.threadId = threadId;
2500
- provisionalAgentCache.current.set(cacheKey, provisional);
2501
- return provisional;
2502
- }
2503
- const knownAgents = Object.keys((_copilotkit$agents = copilotkit.agents) !== null && _copilotkit$agents !== void 0 ? _copilotkit$agents : {});
2504
- const runtimePart = isRuntimeConfigured ? `runtimeUrl=${copilotkit.runtimeUrl}` : "no runtimeUrl";
2505
- throw new Error(`useAgent: Agent '${agentId}' not found after runtime sync (${runtimePart}). ` + (knownAgents.length ? `Known agents: [${knownAgents.join(", ")}]` : "No agents registered.") + " Verify your runtime /info and/or agents__unsafe_dev_only.");
2506
- }, [
2507
- agentId,
2508
- threadId,
2509
- copilotkit.agents,
2510
- copilotkit.runtimeConnectionStatus,
2511
- copilotkit.runtimeUrl,
2512
- copilotkit.runtimeTransport,
2513
- JSON.stringify(copilotkit.headers)
2514
- ]);
2515
- (0, react.useEffect)(() => {
2516
- if (updateFlags.length === 0) return;
2517
- const handlers = {};
2518
- let timerId = null;
2519
- let active = true;
2520
- let batchScheduled = false;
2521
- const batchedForceUpdate = () => {
2522
- if (!active) return;
2523
- if (!batchScheduled) {
2524
- batchScheduled = true;
2525
- queueMicrotask(() => {
2526
- batchScheduled = false;
2527
- if (active) forceUpdate();
2528
- });
2529
- }
2530
- };
2531
- if (updateFlags.includes(UseAgentUpdate.OnMessagesChanged)) {
2532
- const ms = effectiveThrottleMs;
2533
- if (ms > 0) {
2534
- let throttleActive = false;
2535
- let pending = false;
2536
- const throttledNotify = () => {
2537
- if (!active) return;
2538
- if (!throttleActive) {
2539
- throttleActive = true;
2540
- pending = false;
2541
- forceUpdate();
2542
- timerId = setTimeout(function trailingEdge() {
2543
- timerId = null;
2544
- if (active && pending) {
2545
- pending = false;
2546
- forceUpdate();
2547
- timerId = setTimeout(trailingEdge, ms);
2548
- } else throttleActive = false;
2549
- }, ms);
2550
- } else pending = true;
2551
- };
2552
- handlers.onMessagesChanged = throttledNotify;
2553
- } else handlers.onMessagesChanged = forceUpdate;
2554
- }
2555
- if (updateFlags.includes(UseAgentUpdate.OnStateChanged)) handlers.onStateChanged = batchedForceUpdate;
2556
- if (updateFlags.includes(UseAgentUpdate.OnRunStatusChanged)) {
2557
- handlers.onRunInitialized = batchedForceUpdate;
2558
- handlers.onRunFinalized = batchedForceUpdate;
2559
- handlers.onRunFailed = batchedForceUpdate;
2560
- }
2561
- const subscription = agent.subscribe(handlers);
2562
- return () => {
2563
- active = false;
2564
- if (timerId !== null) clearTimeout(timerId);
2565
- subscription.unsubscribe();
2566
- };
2567
- }, [
2568
- agent,
2569
- forceUpdate,
2570
- effectiveThrottleMs,
2571
- updateFlags
2572
- ]);
2573
- (0, react.useEffect)(() => {
2574
- if (agent instanceof _ag_ui_client.HttpAgent) agent.headers = { ...copilotkit.headers };
2575
- }, [agent, JSON.stringify(copilotkit.headers)]);
2576
- return { agent };
2577
- }
2578
-
2579
2380
  //#endregion
2580
2381
  //#region src/v2/hooks/use-render-custom-messages.tsx
2581
2382
  function useRenderCustomMessages() {
@@ -2589,13 +2390,12 @@ window.parent.postMessage({jsonrpc:"2.0",method:"ui/notifications/sandbox-proxy-
2589
2390
  return aHasAgent ? -1 : 1;
2590
2391
  });
2591
2392
  return function(params) {
2592
- var _copilotkit$getRunIdF, _getThreadClone;
2393
+ var _copilotkit$getRunIdF;
2593
2394
  if (!customMessageRenderers.length) return null;
2594
2395
  const { message, position } = params;
2595
2396
  const resolvedRunId = (_copilotkit$getRunIdF = copilotkit.getRunIdForMessage(agentId, threadId, message.id)) !== null && _copilotkit$getRunIdF !== void 0 ? _copilotkit$getRunIdF : copilotkit.getRunIdsForThread(agentId, threadId).slice(-1)[0];
2596
2397
  const runId = resolvedRunId !== null && resolvedRunId !== void 0 ? resolvedRunId : `missing-run-id:${message.id}`;
2597
- const registryAgent = copilotkit.getAgent(agentId);
2598
- const agent = (_getThreadClone = getThreadClone(registryAgent, threadId)) !== null && _getThreadClone !== void 0 ? _getThreadClone : registryAgent;
2398
+ const agent = copilotkit.getAgent(agentId);
2599
2399
  if (!agent) throw new Error("Agent not found");
2600
2400
  const messagesIdsInRun = resolvedRunId ? agent.messages.filter((msg) => copilotkit.getRunIdForMessage(agentId, threadId, msg.id) === resolvedRunId).map((msg) => msg.id) : [message.id];
2601
2401
  const rawMessageIndex = agent.messages.findIndex((msg) => msg.id === message.id);
@@ -2723,6 +2523,133 @@ window.parent.postMessage({jsonrpc:"2.0",method:"ui/notifications/sandbox-proxy-
2723
2523
  ]);
2724
2524
  }
2725
2525
 
2526
+ //#endregion
2527
+ //#region src/v2/hooks/use-agent.tsx
2528
+ let UseAgentUpdate = /* @__PURE__ */ function(UseAgentUpdate) {
2529
+ UseAgentUpdate["OnMessagesChanged"] = "OnMessagesChanged";
2530
+ UseAgentUpdate["OnStateChanged"] = "OnStateChanged";
2531
+ UseAgentUpdate["OnRunStatusChanged"] = "OnRunStatusChanged";
2532
+ return UseAgentUpdate;
2533
+ }({});
2534
+ const ALL_UPDATES = [
2535
+ UseAgentUpdate.OnMessagesChanged,
2536
+ UseAgentUpdate.OnStateChanged,
2537
+ UseAgentUpdate.OnRunStatusChanged
2538
+ ];
2539
+ function useAgent({ agentId, updates, throttleMs } = {}) {
2540
+ var _agentId;
2541
+ (_agentId = agentId) !== null && _agentId !== void 0 || (agentId = _copilotkit_shared.DEFAULT_AGENT_ID);
2542
+ const { copilotkit } = useCopilotKit();
2543
+ const providerThrottleMs = copilotkit.defaultThrottleMs;
2544
+ const effectiveThrottleMs = (0, react.useMemo)(() => {
2545
+ var _ref;
2546
+ const resolved = (_ref = throttleMs !== null && throttleMs !== void 0 ? throttleMs : providerThrottleMs) !== null && _ref !== void 0 ? _ref : 0;
2547
+ if (!Number.isFinite(resolved) || resolved < 0) {
2548
+ const source = throttleMs !== void 0 ? "hook-level throttleMs" : "provider-level defaultThrottleMs";
2549
+ console.error(`useAgent: ${source} must be a non-negative finite number, got ${resolved}. Falling back to unthrottled.`);
2550
+ return 0;
2551
+ }
2552
+ return resolved;
2553
+ }, [throttleMs, providerThrottleMs]);
2554
+ const [, forceUpdate] = (0, react.useReducer)((x) => x + 1, 0);
2555
+ const updateFlags = (0, react.useMemo)(() => updates !== null && updates !== void 0 ? updates : ALL_UPDATES, [JSON.stringify(updates)]);
2556
+ const provisionalAgentCache = (0, react.useRef)(/* @__PURE__ */ new Map());
2557
+ const agent = (0, react.useMemo)(() => {
2558
+ var _copilotkit$agents;
2559
+ const existing = copilotkit.getAgent(agentId);
2560
+ if (existing) {
2561
+ provisionalAgentCache.current.delete(agentId);
2562
+ return existing;
2563
+ }
2564
+ const isRuntimeConfigured = copilotkit.runtimeUrl !== void 0;
2565
+ const status = copilotkit.runtimeConnectionStatus;
2566
+ if (isRuntimeConfigured && (status === _copilotkit_core.CopilotKitCoreRuntimeConnectionStatus.Disconnected || status === _copilotkit_core.CopilotKitCoreRuntimeConnectionStatus.Connecting)) {
2567
+ const cached = provisionalAgentCache.current.get(agentId);
2568
+ if (cached) {
2569
+ cached.headers = { ...copilotkit.headers };
2570
+ return cached;
2571
+ }
2572
+ const provisional = new _copilotkit_core.ProxiedCopilotRuntimeAgent({
2573
+ runtimeUrl: copilotkit.runtimeUrl,
2574
+ agentId,
2575
+ transport: copilotkit.runtimeTransport,
2576
+ runtimeMode: "pending"
2577
+ });
2578
+ provisional.headers = { ...copilotkit.headers };
2579
+ provisionalAgentCache.current.set(agentId, provisional);
2580
+ return provisional;
2581
+ }
2582
+ if (isRuntimeConfigured && status === _copilotkit_core.CopilotKitCoreRuntimeConnectionStatus.Error) {
2583
+ const provisional = new _copilotkit_core.ProxiedCopilotRuntimeAgent({
2584
+ runtimeUrl: copilotkit.runtimeUrl,
2585
+ agentId,
2586
+ transport: copilotkit.runtimeTransport,
2587
+ runtimeMode: "pending"
2588
+ });
2589
+ provisional.headers = { ...copilotkit.headers };
2590
+ return provisional;
2591
+ }
2592
+ const knownAgents = Object.keys((_copilotkit$agents = copilotkit.agents) !== null && _copilotkit$agents !== void 0 ? _copilotkit$agents : {});
2593
+ const runtimePart = isRuntimeConfigured ? `runtimeUrl=${copilotkit.runtimeUrl}` : "no runtimeUrl";
2594
+ throw new Error(`useAgent: Agent '${agentId}' not found after runtime sync (${runtimePart}). ` + (knownAgents.length ? `Known agents: [${knownAgents.join(", ")}]` : "No agents registered.") + " Verify your runtime /info and/or agents__unsafe_dev_only.");
2595
+ }, [
2596
+ agentId,
2597
+ copilotkit.agents,
2598
+ copilotkit.runtimeConnectionStatus,
2599
+ copilotkit.runtimeUrl,
2600
+ copilotkit.runtimeTransport,
2601
+ JSON.stringify(copilotkit.headers)
2602
+ ]);
2603
+ (0, react.useEffect)(() => {
2604
+ if (updateFlags.length === 0) return;
2605
+ const handlers = {};
2606
+ let timerId = null;
2607
+ let active = true;
2608
+ if (updateFlags.includes(UseAgentUpdate.OnMessagesChanged)) {
2609
+ const ms = effectiveThrottleMs;
2610
+ if (ms > 0) {
2611
+ let throttleActive = false;
2612
+ let pending = false;
2613
+ const throttledNotify = () => {
2614
+ if (!active) return;
2615
+ if (!throttleActive) {
2616
+ throttleActive = true;
2617
+ pending = false;
2618
+ forceUpdate();
2619
+ timerId = setTimeout(function trailingEdge() {
2620
+ timerId = null;
2621
+ if (active && pending) {
2622
+ pending = false;
2623
+ forceUpdate();
2624
+ timerId = setTimeout(trailingEdge, ms);
2625
+ } else throttleActive = false;
2626
+ }, ms);
2627
+ } else pending = true;
2628
+ };
2629
+ handlers.onMessagesChanged = throttledNotify;
2630
+ } else handlers.onMessagesChanged = forceUpdate;
2631
+ }
2632
+ if (updateFlags.includes(UseAgentUpdate.OnStateChanged)) handlers.onStateChanged = forceUpdate;
2633
+ if (updateFlags.includes(UseAgentUpdate.OnRunStatusChanged)) {
2634
+ handlers.onRunInitialized = forceUpdate;
2635
+ handlers.onRunFinalized = forceUpdate;
2636
+ handlers.onRunFailed = forceUpdate;
2637
+ }
2638
+ const subscription = agent.subscribe(handlers);
2639
+ return () => {
2640
+ active = false;
2641
+ if (timerId !== null) clearTimeout(timerId);
2642
+ subscription.unsubscribe();
2643
+ };
2644
+ }, [
2645
+ agent,
2646
+ forceUpdate,
2647
+ effectiveThrottleMs,
2648
+ updateFlags
2649
+ ]);
2650
+ return { agent };
2651
+ }
2652
+
2726
2653
  //#endregion
2727
2654
  //#region src/v2/hooks/use-suggestions.tsx
2728
2655
  function useSuggestions({ agentId } = {}) {
@@ -3680,20 +3607,6 @@ window.parent.postMessage({jsonrpc:"2.0",method:"ui/notifications/sandbox-proxy-
3680
3607
  /**
3681
3608
  * An internal context to separate the messages state (which is constantly changing) from the rest of CopilotKit context
3682
3609
  */
3683
- /**
3684
- * Determine whether a GraphQL error should be suppressed based on its visibility
3685
- * and whether the dev console is active.
3686
- *
3687
- * Returns `null` when the error should be surfaced to the UI, or a log prefix
3688
- * string when the error should be suppressed (logged to console only).
3689
- *
3690
- * Exported for unit testing.
3691
- */
3692
- function getErrorSuppression(visibility, isDev) {
3693
- if (visibility === _copilotkit_shared.ErrorVisibility.SILENT) return "CopilotKit Silent Error:";
3694
- if (!isDev && visibility === _copilotkit_shared.ErrorVisibility.DEV_ONLY) return "CopilotKit Error (hidden in production):";
3695
- return null;
3696
- }
3697
3610
  const MessagesTapContext = (0, react.createContext)(null);
3698
3611
  function useMessagesTap() {
3699
3612
  const tap = (0, react.useContext)(MessagesTapContext);
@@ -3778,9 +3691,13 @@ window.parent.postMessage({jsonrpc:"2.0",method:"ui/notifications/sandbox-proxy-
3778
3691
  const graphQLErrors = error.graphQLErrors;
3779
3692
  const routeError = (gqlError) => {
3780
3693
  const extensions = gqlError.extensions;
3781
- const suppression = getErrorSuppression(extensions === null || extensions === void 0 ? void 0 : extensions.visibility, shouldShowDevConsole(showDevConsole));
3782
- if (suppression) {
3783
- console.error(suppression, gqlError.message);
3694
+ const visibility = extensions === null || extensions === void 0 ? void 0 : extensions.visibility;
3695
+ if (!shouldShowDevConsole(showDevConsole)) {
3696
+ console.error("CopilotKit Error (hidden in production):", gqlError.message);
3697
+ return;
3698
+ }
3699
+ if (visibility === _copilotkit_shared.ErrorVisibility.SILENT) {
3700
+ console.error("CopilotKit Silent Error:", gqlError.message);
3784
3701
  return;
3785
3702
  }
3786
3703
  const ckError = createStructuredError(gqlError);
@@ -3797,7 +3714,8 @@ window.parent.postMessage({jsonrpc:"2.0",method:"ui/notifications/sandbox-proxy-
3797
3714
  }
3798
3715
  };
3799
3716
  graphQLErrors.forEach(routeError);
3800
- } else {
3717
+ } else if (!shouldShowDevConsole(showDevConsole)) console.error("CopilotKit Error (hidden in production):", error);
3718
+ else {
3801
3719
  const fallbackError = new _copilotkit_shared.CopilotKitError({
3802
3720
  message: (error === null || error === void 0 ? void 0 : error.message) || String(error),
3803
3721
  code: _copilotkit_shared.CopilotKitErrorCode.UNKNOWN
@@ -4899,7 +4817,7 @@ window.parent.postMessage({jsonrpc:"2.0",method:"ui/notifications/sandbox-proxy-
4899
4817
  publicApiKey,
4900
4818
  ...cloud ? { cloud } : {},
4901
4819
  chatApiEndpoint,
4902
- headers: typeof props.headers === "function" ? props.headers() : props.headers || {},
4820
+ headers: props.headers || {},
4903
4821
  properties: props.properties || {},
4904
4822
  transcribeAudioUrl: props.transcribeAudioUrl,
4905
4823
  textToSpeechUrl: props.textToSpeechUrl,
@@ -5277,11 +5195,7 @@ window.parent.postMessage({jsonrpc:"2.0",method:"ui/notifications/sandbox-proxy-
5277
5195
  const existingConfig = useCopilotChatConfiguration();
5278
5196
  const [agentAvailable, setAgentAvailable] = (0, react.useState)(false);
5279
5197
  const resolvedAgentId = (_existingConfig$agent = existingConfig === null || existingConfig === void 0 ? void 0 : existingConfig.agentId) !== null && _existingConfig$agent !== void 0 ? _existingConfig$agent : "default";
5280
- const { agent } = useAgent({
5281
- agentId: resolvedAgentId,
5282
- threadId: existingConfig === null || existingConfig === void 0 ? void 0 : existingConfig.threadId
5283
- });
5284
- const lastConnectedAgentRef = (0, react.useRef)(null);
5198
+ const { agent } = useAgent({ agentId: resolvedAgentId });
5285
5199
  (0, react.useEffect)(() => {
5286
5200
  let detached = false;
5287
5201
  const connectAbortController = new AbortController();
@@ -5296,12 +5210,11 @@ window.parent.postMessage({jsonrpc:"2.0",method:"ui/notifications/sandbox-proxy-
5296
5210
  if (error instanceof _ag_ui_client.AGUIConnectNotImplementedError) {} else console.error("CopilotChat: connectAgent failed", error);
5297
5211
  }
5298
5212
  };
5299
- if (agent && agent !== lastConnectedAgentRef.current && copilotkit.runtimeConnectionStatus === _copilotkit_core.CopilotKitCoreRuntimeConnectionStatus.Connected) {
5300
- lastConnectedAgentRef.current = agent;
5213
+ if (agent && (existingConfig === null || existingConfig === void 0 ? void 0 : existingConfig.threadId) && agent.threadId !== existingConfig.threadId && copilotkit.runtimeConnectionStatus === _copilotkit_core.CopilotKitCoreRuntimeConnectionStatus.Connected) {
5214
+ agent.threadId = existingConfig.threadId;
5301
5215
  connect(agent);
5302
5216
  }
5303
5217
  return () => {
5304
- lastConnectedAgentRef.current = null;
5305
5218
  detached = true;
5306
5219
  connectAbortController.abort();
5307
5220
  agent === null || agent === void 0 || agent.detachActiveRun();