@copilotkit/react-core 1.10.6-next.3 → 1.10.6-next.5

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 (98) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/{chunk-Q3MCVRO3.mjs → chunk-6ESSSQ7Q.mjs} +8 -21
  3. package/dist/chunk-6ESSSQ7Q.mjs.map +1 -0
  4. package/dist/{chunk-X5GRTEAW.mjs → chunk-6GPVUMBU.mjs} +2 -2
  5. package/dist/{chunk-H4AHA2Y7.mjs → chunk-AKR2SSUJ.mjs} +2 -2
  6. package/dist/{chunk-HPENLSA7.mjs → chunk-BXXJQ2BL.mjs} +8 -8
  7. package/dist/{chunk-M37URBJS.mjs → chunk-C6IANC2R.mjs} +6 -6
  8. package/dist/{chunk-CUWOXXM5.mjs → chunk-DXEQPN43.mjs} +2 -2
  9. package/dist/{chunk-O23SRQP6.mjs → chunk-E3624YDU.mjs} +2 -2
  10. package/dist/{chunk-GOYHJKDZ.mjs → chunk-EDBI5PCJ.mjs} +4 -4
  11. package/dist/{chunk-R4Y45UGQ.mjs → chunk-EVVO67QO.mjs} +2 -2
  12. package/dist/{chunk-U6EFKGUQ.mjs → chunk-GGLAHG3I.mjs} +13 -13
  13. package/dist/{chunk-3WUDRJTT.mjs → chunk-GT5WI3AF.mjs} +4 -4
  14. package/dist/{chunk-OXHA67SG.mjs → chunk-MIXSWZSB.mjs} +5 -5
  15. package/dist/{chunk-E6ER5C5U.mjs → chunk-MQYWH4E6.mjs} +2 -2
  16. package/dist/{chunk-L3I57GMV.mjs → chunk-N4VN2B5S.mjs} +4 -4
  17. package/dist/{chunk-E3DNTN4X.mjs → chunk-NSBAWITG.mjs} +8 -8
  18. package/dist/{chunk-K5CYESBQ.mjs → chunk-OAGAFMUM.mjs} +2 -2
  19. package/dist/{chunk-TUTNHDM3.mjs → chunk-OKCYPO4I.mjs} +4 -4
  20. package/dist/{chunk-R4YSN6OK.mjs → chunk-OT5NHMEC.mjs} +6 -6
  21. package/dist/{chunk-HI6SPUOX.mjs → chunk-T3376SZS.mjs} +4 -4
  22. package/dist/{chunk-GIGUZ2OK.mjs → chunk-U7QULEVO.mjs} +2 -2
  23. package/dist/components/copilot-provider/copilot-messages.mjs +3 -3
  24. package/dist/components/copilot-provider/copilotkit.js +7 -17
  25. package/dist/components/copilot-provider/copilotkit.js.map +1 -1
  26. package/dist/components/copilot-provider/copilotkit.mjs +10 -10
  27. package/dist/components/copilot-provider/index.js +7 -17
  28. package/dist/components/copilot-provider/index.js.map +1 -1
  29. package/dist/components/copilot-provider/index.mjs +10 -10
  30. package/dist/components/dev-console/console-trigger.mjs +3 -3
  31. package/dist/components/dev-console/developer-console-modal.mjs +2 -2
  32. package/dist/components/error-boundary/error-boundary.mjs +2 -2
  33. package/dist/components/index.js +7 -17
  34. package/dist/components/index.js.map +1 -1
  35. package/dist/components/index.mjs +10 -10
  36. package/dist/context/index.mjs +4 -4
  37. package/dist/hooks/index.js +7 -32
  38. package/dist/hooks/index.js.map +1 -1
  39. package/dist/hooks/index.mjs +42 -42
  40. package/dist/hooks/use-chat.js +7 -32
  41. package/dist/hooks/use-chat.js.map +1 -1
  42. package/dist/hooks/use-chat.mjs +3 -4
  43. package/dist/hooks/use-coagent-state-render.mjs +2 -2
  44. package/dist/hooks/use-coagent.js +7 -32
  45. package/dist/hooks/use-coagent.js.map +1 -1
  46. package/dist/hooks/use-coagent.mjs +15 -15
  47. package/dist/hooks/use-copilot-action.mjs +2 -2
  48. package/dist/hooks/use-copilot-authenticated-action.mjs +3 -3
  49. package/dist/hooks/use-copilot-chat-headless_c.js +7 -32
  50. package/dist/hooks/use-copilot-chat-headless_c.js.map +1 -1
  51. package/dist/hooks/use-copilot-chat-headless_c.mjs +15 -15
  52. package/dist/hooks/use-copilot-chat.js +7 -32
  53. package/dist/hooks/use-copilot-chat.js.map +1 -1
  54. package/dist/hooks/use-copilot-chat.mjs +15 -15
  55. package/dist/hooks/use-copilot-chat_internal.js +7 -32
  56. package/dist/hooks/use-copilot-chat_internal.js.map +1 -1
  57. package/dist/hooks/use-copilot-chat_internal.mjs +14 -14
  58. package/dist/hooks/use-copilot-runtime-client.js +7 -32
  59. package/dist/hooks/use-copilot-runtime-client.js.map +1 -1
  60. package/dist/hooks/use-copilot-runtime-client.mjs +1 -2
  61. package/dist/hooks/use-default-tool.mjs +3 -3
  62. package/dist/hooks/use-frontend-tool.mjs +3 -3
  63. package/dist/hooks/use-human-in-the-loop.mjs +3 -3
  64. package/dist/hooks/use-langgraph-interrupt-render.mjs +1 -1
  65. package/dist/hooks/use-langgraph-interrupt.js +7 -32
  66. package/dist/hooks/use-langgraph-interrupt.js.map +1 -1
  67. package/dist/hooks/use-langgraph-interrupt.mjs +15 -15
  68. package/dist/hooks/use-render-tool-call.mjs +3 -3
  69. package/dist/index.js +7 -17
  70. package/dist/index.js.map +1 -1
  71. package/dist/index.mjs +47 -47
  72. package/dist/lib/copilot-task.mjs +12 -12
  73. package/dist/lib/index.mjs +12 -12
  74. package/dist/utils/extract.mjs +10 -10
  75. package/dist/utils/index.mjs +12 -12
  76. package/dist/utils/suggestions.mjs +10 -10
  77. package/package.json +3 -3
  78. package/src/hooks/use-copilot-runtime-client.ts +10 -21
  79. package/dist/chunk-Q3MCVRO3.mjs.map +0 -1
  80. /package/dist/{chunk-X5GRTEAW.mjs.map → chunk-6GPVUMBU.mjs.map} +0 -0
  81. /package/dist/{chunk-H4AHA2Y7.mjs.map → chunk-AKR2SSUJ.mjs.map} +0 -0
  82. /package/dist/{chunk-HPENLSA7.mjs.map → chunk-BXXJQ2BL.mjs.map} +0 -0
  83. /package/dist/{chunk-M37URBJS.mjs.map → chunk-C6IANC2R.mjs.map} +0 -0
  84. /package/dist/{chunk-CUWOXXM5.mjs.map → chunk-DXEQPN43.mjs.map} +0 -0
  85. /package/dist/{chunk-O23SRQP6.mjs.map → chunk-E3624YDU.mjs.map} +0 -0
  86. /package/dist/{chunk-GOYHJKDZ.mjs.map → chunk-EDBI5PCJ.mjs.map} +0 -0
  87. /package/dist/{chunk-R4Y45UGQ.mjs.map → chunk-EVVO67QO.mjs.map} +0 -0
  88. /package/dist/{chunk-U6EFKGUQ.mjs.map → chunk-GGLAHG3I.mjs.map} +0 -0
  89. /package/dist/{chunk-3WUDRJTT.mjs.map → chunk-GT5WI3AF.mjs.map} +0 -0
  90. /package/dist/{chunk-OXHA67SG.mjs.map → chunk-MIXSWZSB.mjs.map} +0 -0
  91. /package/dist/{chunk-E6ER5C5U.mjs.map → chunk-MQYWH4E6.mjs.map} +0 -0
  92. /package/dist/{chunk-L3I57GMV.mjs.map → chunk-N4VN2B5S.mjs.map} +0 -0
  93. /package/dist/{chunk-E3DNTN4X.mjs.map → chunk-NSBAWITG.mjs.map} +0 -0
  94. /package/dist/{chunk-K5CYESBQ.mjs.map → chunk-OAGAFMUM.mjs.map} +0 -0
  95. /package/dist/{chunk-TUTNHDM3.mjs.map → chunk-OKCYPO4I.mjs.map} +0 -0
  96. /package/dist/{chunk-R4YSN6OK.mjs.map → chunk-OT5NHMEC.mjs.map} +0 -0
  97. /package/dist/{chunk-HI6SPUOX.mjs.map → chunk-T3376SZS.mjs.map} +0 -0
  98. /package/dist/{chunk-GIGUZ2OK.mjs.map → chunk-U7QULEVO.mjs.map} +0 -0
@@ -1,29 +1,29 @@
1
1
  import {
2
2
  defaultSystemMessage,
3
3
  useCopilotChat
4
- } from "../chunk-E3DNTN4X.mjs";
4
+ } from "../chunk-NSBAWITG.mjs";
5
5
  import "../chunk-ZVOLWJCY.mjs";
6
- import "../chunk-YPSGKPDA.mjs";
7
- import "../chunk-U6EFKGUQ.mjs";
8
- import "../chunk-CUWOXXM5.mjs";
9
- import "../chunk-TUTNHDM3.mjs";
6
+ import "../chunk-OT5NHMEC.mjs";
7
+ import "../chunk-4CEQJ2X6.mjs";
8
+ import "../chunk-GGLAHG3I.mjs";
9
+ import "../chunk-DXEQPN43.mjs";
10
+ import "../chunk-OKCYPO4I.mjs";
10
11
  import "../chunk-PIF5KJYI.mjs";
11
- import "../chunk-L3I57GMV.mjs";
12
+ import "../chunk-N4VN2B5S.mjs";
12
13
  import "../chunk-2IDV5OHF.mjs";
13
- import "../chunk-M37URBJS.mjs";
14
+ import "../chunk-C6IANC2R.mjs";
15
+ import "../chunk-ICIK2BSB.mjs";
14
16
  import "../chunk-RKTVJRK7.mjs";
15
17
  import "../chunk-PMAFHQ7P.mjs";
16
18
  import "../chunk-5FHSUKQL.mjs";
17
- import "../chunk-ZLQVRPDS.mjs";
18
- import "../chunk-6ZLPNY7X.mjs";
19
- import "../chunk-R4YSN6OK.mjs";
20
- import "../chunk-4CEQJ2X6.mjs";
19
+ import "../chunk-6ESSSQ7Q.mjs";
21
20
  import "../chunk-N4WEHORG.mjs";
22
21
  import "../chunk-O7ARI5CV.mjs";
23
- import "../chunk-Q3MCVRO3.mjs";
24
- import "../chunk-ICIK2BSB.mjs";
25
- import "../chunk-EUX2P2E7.mjs";
26
22
  import "../chunk-EFL5OBKN.mjs";
23
+ import "../chunk-6ZLPNY7X.mjs";
24
+ import "../chunk-YPSGKPDA.mjs";
25
+ import "../chunk-EUX2P2E7.mjs";
26
+ import "../chunk-ZLQVRPDS.mjs";
27
27
  import "../chunk-SKC7AJIV.mjs";
28
28
  export {
29
29
  defaultSystemMessage,
@@ -90,21 +90,6 @@ function useToast() {
90
90
  // src/hooks/use-copilot-runtime-client.ts
91
91
  var import_react2 = require("react");
92
92
  var import_shared2 = require("@copilotkit/shared");
93
-
94
- // src/utils/dev-console.ts
95
- function isLocalhost() {
96
- if (typeof window === "undefined")
97
- return false;
98
- return window.location.hostname === "localhost" || window.location.hostname === "127.0.0.1" || window.location.hostname === "0.0.0.0";
99
- }
100
- function shouldShowDevConsole(showDevConsole) {
101
- if (showDevConsole !== void 0) {
102
- return showDevConsole;
103
- }
104
- return isLocalhost();
105
- }
106
-
107
- // src/hooks/use-copilot-runtime-client.ts
108
93
  var useCopilotRuntimeClient = (options) => {
109
94
  const { setBannerError } = useToast();
110
95
  const _a = options, { showDevConsole, onError } = _a, runtimeOptions = __objRest(_a, ["showDevConsole", "onError"]);
@@ -143,15 +128,10 @@ var useCopilotRuntimeClient = (options) => {
143
128
  const routeError = (gqlError) => {
144
129
  const extensions = gqlError.extensions;
145
130
  const visibility = extensions == null ? void 0 : extensions.visibility;
146
- const isDev = shouldShowDevConsole(showDevConsole != null ? showDevConsole : false);
147
131
  if (visibility === import_shared2.ErrorVisibility.SILENT) {
148
132
  console.error("CopilotKit Silent Error:", gqlError.message);
149
133
  return;
150
134
  }
151
- if (!isDev) {
152
- console.error("CopilotKit Error (hidden in production):", gqlError.message);
153
- return;
154
- }
155
135
  const now = Date.now();
156
136
  const errorMessage = gqlError.message;
157
137
  if (lastStructuredErrorRef.current && lastStructuredErrorRef.current.message === errorMessage && now - lastStructuredErrorRef.current.timestamp < 150) {
@@ -173,17 +153,12 @@ var useCopilotRuntimeClient = (options) => {
173
153
  };
174
154
  graphQLErrors.forEach(routeError);
175
155
  } else {
176
- const isDev = shouldShowDevConsole(showDevConsole != null ? showDevConsole : false);
177
- if (!isDev) {
178
- console.error("CopilotKit Error (hidden in production):", error);
179
- } else {
180
- const fallbackError = new import_shared2.CopilotKitError({
181
- message: (error == null ? void 0 : error.message) || String(error),
182
- code: import_shared2.CopilotKitErrorCode.UNKNOWN
183
- });
184
- setBannerError(fallbackError);
185
- traceUIError(fallbackError, error);
186
- }
156
+ const fallbackError = new import_shared2.CopilotKitError({
157
+ message: (error == null ? void 0 : error.message) || String(error),
158
+ code: import_shared2.CopilotKitErrorCode.UNKNOWN
159
+ });
160
+ setBannerError(fallbackError);
161
+ traceUIError(fallbackError, error);
187
162
  }
188
163
  },
189
164
  handleGQLWarning: (message) => {
@@ -195,7 +170,7 @@ var useCopilotRuntimeClient = (options) => {
195
170
  setBannerError(warningError);
196
171
  }
197
172
  }));
198
- }, [runtimeOptions, setBannerError, showDevConsole, onError]);
173
+ }, [runtimeOptions, setBannerError, onError]);
199
174
  return runtimeClient;
200
175
  };
201
176
  function createStructuredError(gqlError) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/use-copilot-runtime-client.ts","../../src/components/toast/toast-provider.tsx","../../src/utils/dev-console.ts"],"sourcesContent":["import {\n CopilotRuntimeClient,\n CopilotRuntimeClientOptions,\n GraphQLError,\n} from \"@copilotkit/runtime-client-gql\";\nimport { useToast } from \"../components/toast/toast-provider\";\nimport { useMemo, useRef } from \"react\";\nimport {\n ErrorVisibility,\n CopilotKitApiDiscoveryError,\n CopilotKitRemoteEndpointDiscoveryError,\n CopilotKitAgentDiscoveryError,\n CopilotKitError,\n CopilotKitErrorCode,\n CopilotErrorHandler,\n CopilotErrorEvent,\n} from \"@copilotkit/shared\";\nimport { shouldShowDevConsole } from \"../utils/dev-console\";\n\nexport interface CopilotRuntimeClientHookOptions extends CopilotRuntimeClientOptions {\n showDevConsole?: boolean;\n onError: CopilotErrorHandler;\n}\n\nexport const useCopilotRuntimeClient = (options: CopilotRuntimeClientHookOptions) => {\n const { setBannerError } = useToast();\n const { showDevConsole, onError, ...runtimeOptions } = options;\n\n // Deduplication state for structured errors\n const lastStructuredErrorRef = useRef<{ message: string; timestamp: number } | null>(null);\n\n // Helper function to trace UI errors\n const traceUIError = async (error: CopilotKitError, originalError?: any) => {\n try {\n const errorEvent: CopilotErrorEvent = {\n type: \"error\",\n timestamp: Date.now(),\n context: {\n source: \"ui\",\n request: {\n operation: \"runtimeClient\",\n url: runtimeOptions.url,\n startTime: Date.now(),\n },\n technical: {\n environment: \"browser\",\n userAgent: typeof navigator !== \"undefined\" ? navigator.userAgent : undefined,\n stackTrace: originalError instanceof Error ? originalError.stack : undefined,\n },\n },\n error,\n };\n await onError(errorEvent);\n } catch (error) {\n console.error(\"Error in onError handler:\", error);\n }\n };\n\n const runtimeClient = useMemo(() => {\n return new CopilotRuntimeClient({\n ...runtimeOptions,\n handleGQLErrors: (error) => {\n if ((error as any).graphQLErrors?.length) {\n const graphQLErrors = (error as any).graphQLErrors as GraphQLError[];\n\n // Route all errors to banners for consistent UI\n const routeError = (gqlError: GraphQLError) => {\n const extensions = gqlError.extensions;\n const visibility = extensions?.visibility as ErrorVisibility;\n const isDev = shouldShowDevConsole(showDevConsole ?? false);\n\n // Silent errors - just log\n if (visibility === ErrorVisibility.SILENT) {\n console.error(\"CopilotKit Silent Error:\", gqlError.message);\n return;\n }\n\n if (!isDev) {\n console.error(\"CopilotKit Error (hidden in production):\", gqlError.message);\n return;\n }\n\n // All errors (including DEV_ONLY) show as banners for consistency\n // Deduplicate to prevent spam\n const now = Date.now();\n const errorMessage = gqlError.message;\n if (\n lastStructuredErrorRef.current &&\n lastStructuredErrorRef.current.message === errorMessage &&\n now - lastStructuredErrorRef.current.timestamp < 150\n ) {\n return; // Skip duplicate\n }\n lastStructuredErrorRef.current = { message: errorMessage, timestamp: now };\n\n const ckError = createStructuredError(gqlError);\n if (ckError) {\n setBannerError(ckError);\n // Trace the error\n traceUIError(ckError, gqlError);\n // TODO: if onError & renderError should work without key, insert here\n } else {\n // Fallback for unstructured errors\n const fallbackError = new CopilotKitError({\n message: gqlError.message,\n code: CopilotKitErrorCode.UNKNOWN,\n });\n setBannerError(fallbackError);\n // Trace the fallback error\n traceUIError(fallbackError, gqlError);\n // TODO: if onError & renderError should work without key, insert here\n }\n };\n\n // Process all errors as banners\n graphQLErrors.forEach(routeError);\n } else {\n const isDev = shouldShowDevConsole(showDevConsole ?? false);\n if (!isDev) {\n console.error(\"CopilotKit Error (hidden in production):\", error);\n } else {\n // Route non-GraphQL errors to banner as well\n const fallbackError = new CopilotKitError({\n message: error?.message || String(error),\n code: CopilotKitErrorCode.UNKNOWN,\n });\n setBannerError(fallbackError);\n // Trace the non-GraphQL error\n traceUIError(fallbackError, error);\n // TODO: if onError & renderError should work without key, insert here\n }\n }\n },\n handleGQLWarning: (message: string) => {\n console.warn(message);\n // Show warnings as banners too for consistency\n const warningError = new CopilotKitError({\n message,\n code: CopilotKitErrorCode.UNKNOWN,\n });\n setBannerError(warningError);\n },\n });\n }, [runtimeOptions, setBannerError, showDevConsole, onError]);\n\n return runtimeClient;\n};\n\n// Create appropriate structured error from GraphQL error\nfunction createStructuredError(gqlError: GraphQLError): CopilotKitError | null {\n const extensions = gqlError.extensions;\n const originalError = extensions?.originalError as any;\n const message = originalError?.message || gqlError.message;\n const code = extensions?.code as CopilotKitErrorCode;\n\n if (code) {\n return new CopilotKitError({ message, code });\n }\n\n // Legacy error detection by stack trace\n if (originalError?.stack?.includes(\"CopilotApiDiscoveryError\")) {\n return new CopilotKitApiDiscoveryError({ message });\n }\n if (originalError?.stack?.includes(\"CopilotKitRemoteEndpointDiscoveryError\")) {\n return new CopilotKitRemoteEndpointDiscoveryError({ message });\n }\n if (originalError?.stack?.includes(\"CopilotKitAgentDiscoveryError\")) {\n return new CopilotKitAgentDiscoveryError({\n agentName: \"\",\n availableAgents: [],\n });\n }\n\n return null;\n}\n","import { GraphQLError } from \"@copilotkit/runtime-client-gql\";\nimport React, { createContext, useContext, useState, useCallback } from \"react\";\nimport { PartialBy, CopilotKitError, Severity } from \"@copilotkit/shared\";\n\ninterface Toast {\n id: string;\n message: string | React.ReactNode;\n type: \"info\" | \"success\" | \"warning\" | \"error\";\n duration?: number;\n}\n\ninterface ToastContextValue {\n toasts: Toast[];\n addToast: (toast: PartialBy<Toast, \"id\">) => void;\n addGraphQLErrorsToast: (errors: GraphQLError[]) => void;\n removeToast: (id: string) => void;\n enabled: boolean;\n // Banner management\n bannerError: CopilotKitError | null;\n setBannerError: (error: CopilotKitError | null) => void;\n}\n\nconst ToastContext = createContext<ToastContextValue | undefined>(undefined);\n\n// Helper functions for error banner styling\ntype ErrorSeverity = \"critical\" | \"warning\" | \"info\";\n\ninterface ErrorColors {\n background: string;\n border: string;\n text: string;\n icon: string;\n}\n\nfunction getErrorSeverity(error: CopilotKitError): ErrorSeverity {\n // Use structured error severity if available\n if (error.severity) {\n switch (error.severity) {\n case Severity.CRITICAL:\n return \"critical\";\n case Severity.WARNING:\n return \"warning\";\n case Severity.INFO:\n return \"info\";\n default:\n return \"info\";\n }\n }\n\n // Fallback: Check for API key errors which should always be critical\n const message = error.message.toLowerCase();\n if (\n message.includes(\"api key\") ||\n message.includes(\"401\") ||\n message.includes(\"unauthorized\") ||\n message.includes(\"authentication\") ||\n message.includes(\"incorrect api key\")\n ) {\n return \"critical\";\n }\n\n // Default to info level\n return \"info\";\n}\n\nfunction getErrorColors(severity: ErrorSeverity): ErrorColors {\n switch (severity) {\n case \"critical\":\n return {\n background: \"#fee2e2\",\n border: \"#dc2626\",\n text: \"#7f1d1d\",\n icon: \"#dc2626\",\n };\n case \"warning\":\n return {\n background: \"#fef3c7\",\n border: \"#d97706\",\n text: \"#78350f\",\n icon: \"#d97706\",\n };\n case \"info\":\n return {\n background: \"#dbeafe\",\n border: \"#2563eb\",\n text: \"#1e3a8a\",\n icon: \"#2563eb\",\n };\n }\n}\n\nexport function useToast() {\n const context = useContext(ToastContext);\n if (!context) {\n throw new Error(\"useToast must be used within a ToastProvider\");\n }\n return context;\n}\n\nexport function ToastProvider({\n enabled,\n children,\n}: {\n enabled: boolean;\n children: React.ReactNode;\n}) {\n const [toasts, setToasts] = useState<Toast[]>([]);\n const [bannerError, setBannerErrorState] = useState<CopilotKitError | null>(null);\n\n const removeToast = useCallback((id: string) => {\n setToasts((prev) => prev.filter((toast) => toast.id !== id));\n }, []);\n\n const addToast = useCallback(\n (toast: PartialBy<Toast, \"id\">) => {\n // Respect the enabled flag for ALL toasts\n if (!enabled) {\n return;\n }\n\n const id = toast.id ?? Math.random().toString(36).substring(2, 9);\n\n setToasts((currentToasts) => {\n if (currentToasts.find((toast) => toast.id === id)) return currentToasts;\n return [...currentToasts, { ...toast, id }];\n });\n\n if (toast.duration) {\n setTimeout(() => {\n removeToast(id);\n }, toast.duration);\n }\n },\n [enabled, removeToast],\n );\n\n const setBannerError = useCallback(\n (error: CopilotKitError | null) => {\n // Respect the enabled flag for ALL errors\n if (!enabled && error !== null) {\n return;\n }\n setBannerErrorState(error);\n },\n [enabled],\n );\n\n const addGraphQLErrorsToast = useCallback((errors: GraphQLError[]) => {\n // DEPRECATED: All errors now route to banners for consistency\n console.warn(\"addGraphQLErrorsToast is deprecated. All errors now show as banners.\");\n // Function kept for backward compatibility - does nothing\n }, []);\n\n const value = {\n toasts,\n addToast,\n addGraphQLErrorsToast,\n removeToast,\n enabled,\n bannerError,\n setBannerError,\n };\n\n return (\n <ToastContext.Provider value={value}>\n {/* Banner Error Display */}\n {bannerError &&\n (() => {\n const severity = getErrorSeverity(bannerError);\n const colors = getErrorColors(severity);\n\n return (\n <div\n style={{\n position: \"fixed\",\n bottom: \"20px\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n zIndex: 9999,\n backgroundColor: colors.background,\n border: `1px solid ${colors.border}`,\n borderLeft: `4px solid ${colors.border}`,\n borderRadius: \"8px\",\n padding: \"12px 16px\",\n fontSize: \"13px\",\n boxShadow: \"0 4px 12px rgba(0, 0, 0, 0.15)\",\n backdropFilter: \"blur(8px)\",\n maxWidth: \"min(90vw, 700px)\",\n width: \"100%\",\n boxSizing: \"border-box\",\n overflow: \"hidden\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n gap: \"10px\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n flex: 1,\n minWidth: 0,\n }}\n >\n <div\n style={{\n width: \"12px\",\n height: \"12px\",\n borderRadius: \"50%\",\n backgroundColor: colors.border,\n flexShrink: 0,\n }}\n />\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"10px\",\n flex: 1,\n minWidth: 0,\n }}\n >\n <div\n style={{\n color: colors.text,\n lineHeight: \"1.4\",\n fontWeight: \"400\",\n fontSize: \"13px\",\n flex: 1,\n wordBreak: \"break-all\",\n overflowWrap: \"break-word\",\n maxWidth: \"550px\",\n overflow: \"hidden\",\n display: \"-webkit-box\",\n WebkitLineClamp: 10,\n WebkitBoxOrient: \"vertical\",\n }}\n >\n {(() => {\n let message = bannerError.message;\n\n // Try to extract the useful message from JSON first\n const jsonMatch = message.match(/'message':\\s*'([^']+)'/);\n if (jsonMatch) {\n return jsonMatch[1]; // Return the actual error message\n }\n\n // Strip technical garbage but keep the meaningful message\n message = message.split(\" - \")[0]; // Remove everything after \" - {\"\n message = message.split(\": Error code\")[0]; // Remove \": Error code: 401\"\n message = message.replace(/:\\s*\\d{3}$/, \"\"); // Remove trailing \": 401\"\n message = message.replace(/See more:.*$/g, \"\"); // Remove \"See more\" links\n message = message.trim();\n\n // If it's still garbage (contains { or '), use fallback\n // if (message.includes(\"{\") || message.includes(\"'\")) {\n // return \"Configuration error.... Please check your setup.\";\n // }\n\n return message || \"Configuration error occurred.\";\n })()}\n </div>\n\n {(() => {\n const message = bannerError.message;\n const markdownLinkRegex = /\\[([^\\]]+)\\]\\(([^)]+)\\)/g;\n const plainUrlRegex = /(https?:\\/\\/[^\\s)]+)/g;\n\n // Extract the first URL found\n let url = null;\n let buttonText = \"See More\";\n\n // Check for markdown links first\n const markdownMatch = markdownLinkRegex.exec(message);\n if (markdownMatch) {\n url = markdownMatch[2];\n buttonText = \"See More\";\n } else {\n // Check for plain URLs\n const urlMatch = plainUrlRegex.exec(message);\n if (urlMatch) {\n url = urlMatch[0].replace(/[.,;:'\"]*$/, \"\"); // Remove trailing punctuation\n buttonText = \"See More\";\n }\n }\n\n if (!url) return null;\n\n return (\n <button\n onClick={() => window.open(url, \"_blank\", \"noopener,noreferrer\")}\n style={{\n background: colors.border,\n color: \"white\",\n border: \"none\",\n borderRadius: \"5px\",\n padding: \"4px 10px\",\n fontSize: \"11px\",\n fontWeight: \"500\",\n cursor: \"pointer\",\n transition: \"all 0.2s ease\",\n flexShrink: 0,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.opacity = \"0.9\";\n e.currentTarget.style.transform = \"translateY(-1px)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.opacity = \"1\";\n e.currentTarget.style.transform = \"translateY(0)\";\n }}\n >\n {buttonText}\n </button>\n );\n })()}\n </div>\n </div>\n <button\n onClick={() => setBannerError(null)}\n style={{\n background: \"transparent\",\n border: \"none\",\n color: colors.text,\n cursor: \"pointer\",\n padding: \"2px\",\n borderRadius: \"3px\",\n fontSize: \"14px\",\n lineHeight: \"1\",\n opacity: 0.6,\n transition: \"all 0.2s ease\",\n flexShrink: 0,\n }}\n title=\"Dismiss\"\n onMouseEnter={(e) => {\n e.currentTarget.style.opacity = \"1\";\n e.currentTarget.style.background = \"rgba(0, 0, 0, 0.05)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.opacity = \"0.6\";\n e.currentTarget.style.background = \"transparent\";\n }}\n >\n ×\n </button>\n </div>\n </div>\n );\n })()}\n\n {/* Toast Display - Deprecated: All errors now show as banners */}\n {children}\n </ToastContext.Provider>\n );\n}\n\n// Toast component removed - all errors now show as banners for consistency\n","function isLocalhost(): boolean {\n if (typeof window === \"undefined\") return false;\n\n return (\n window.location.hostname === \"localhost\" ||\n window.location.hostname === \"127.0.0.1\" ||\n window.location.hostname === \"0.0.0.0\"\n );\n}\n\nexport function shouldShowDevConsole(showDevConsole?: boolean): boolean {\n // If explicitly set, use that value\n if (showDevConsole !== undefined) {\n return showDevConsole;\n }\n\n // If not set, default to true on localhost\n return isLocalhost();\n}\n"],"mappings":"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","names":["import_react","import_shared","error","_a"]}
1
+ {"version":3,"sources":["../../src/hooks/use-copilot-runtime-client.ts","../../src/components/toast/toast-provider.tsx"],"sourcesContent":["import {\n CopilotRuntimeClient,\n CopilotRuntimeClientOptions,\n GraphQLError,\n} from \"@copilotkit/runtime-client-gql\";\nimport { useToast } from \"../components/toast/toast-provider\";\nimport { useMemo, useRef } from \"react\";\nimport {\n ErrorVisibility,\n CopilotKitApiDiscoveryError,\n CopilotKitRemoteEndpointDiscoveryError,\n CopilotKitAgentDiscoveryError,\n CopilotKitError,\n CopilotKitErrorCode,\n CopilotErrorHandler,\n CopilotErrorEvent,\n} from \"@copilotkit/shared\";\nimport { shouldShowDevConsole } from \"../utils/dev-console\";\n\nexport interface CopilotRuntimeClientHookOptions extends CopilotRuntimeClientOptions {\n showDevConsole?: boolean;\n onError: CopilotErrorHandler;\n}\n\nexport const useCopilotRuntimeClient = (options: CopilotRuntimeClientHookOptions) => {\n const { setBannerError } = useToast();\n const { showDevConsole, onError, ...runtimeOptions } = options;\n\n // Deduplication state for structured errors\n const lastStructuredErrorRef = useRef<{ message: string; timestamp: number } | null>(null);\n\n // Helper function to trace UI errors\n const traceUIError = async (error: CopilotKitError, originalError?: any) => {\n try {\n const errorEvent: CopilotErrorEvent = {\n type: \"error\",\n timestamp: Date.now(),\n context: {\n source: \"ui\",\n request: {\n operation: \"runtimeClient\",\n url: runtimeOptions.url,\n startTime: Date.now(),\n },\n technical: {\n environment: \"browser\",\n userAgent: typeof navigator !== \"undefined\" ? navigator.userAgent : undefined,\n stackTrace: originalError instanceof Error ? originalError.stack : undefined,\n },\n },\n error,\n };\n await onError(errorEvent);\n } catch (error) {\n console.error(\"Error in onError handler:\", error);\n }\n };\n\n const runtimeClient = useMemo(() => {\n return new CopilotRuntimeClient({\n ...runtimeOptions,\n handleGQLErrors: (error) => {\n if ((error as any).graphQLErrors?.length) {\n const graphQLErrors = (error as any).graphQLErrors as GraphQLError[];\n\n // Route all errors to banners for consistent UI\n const routeError = (gqlError: GraphQLError) => {\n const extensions = gqlError.extensions;\n const visibility = extensions?.visibility as ErrorVisibility;\n\n // Silent errors - just log\n if (visibility === ErrorVisibility.SILENT) {\n console.error(\"CopilotKit Silent Error:\", gqlError.message);\n return;\n }\n\n // All errors (including DEV_ONLY) show as banners for consistency\n // Deduplicate to prevent spam\n const now = Date.now();\n const errorMessage = gqlError.message;\n if (\n lastStructuredErrorRef.current &&\n lastStructuredErrorRef.current.message === errorMessage &&\n now - lastStructuredErrorRef.current.timestamp < 150\n ) {\n return; // Skip duplicate\n }\n lastStructuredErrorRef.current = { message: errorMessage, timestamp: now };\n\n const ckError = createStructuredError(gqlError);\n if (ckError) {\n setBannerError(ckError);\n // Trace the error\n traceUIError(ckError, gqlError);\n // TODO: if onError & renderError should work without key, insert here\n } else {\n // Fallback for unstructured errors\n const fallbackError = new CopilotKitError({\n message: gqlError.message,\n code: CopilotKitErrorCode.UNKNOWN,\n });\n setBannerError(fallbackError);\n // Trace the fallback error\n traceUIError(fallbackError, gqlError);\n // TODO: if onError & renderError should work without key, insert here\n }\n };\n\n // Process all errors as banners\n graphQLErrors.forEach(routeError);\n } else {\n // Route non-GraphQL errors to banner as well\n const fallbackError = new CopilotKitError({\n message: error?.message || String(error),\n code: CopilotKitErrorCode.UNKNOWN,\n });\n setBannerError(fallbackError);\n // Trace the non-GraphQL error\n traceUIError(fallbackError, error);\n // TODO: if onError & renderError should work without key, insert here\n }\n },\n handleGQLWarning: (message: string) => {\n console.warn(message);\n // Show warnings as banners too for consistency\n const warningError = new CopilotKitError({\n message,\n code: CopilotKitErrorCode.UNKNOWN,\n });\n setBannerError(warningError);\n },\n });\n }, [runtimeOptions, setBannerError, onError]);\n\n return runtimeClient;\n};\n\n// Create appropriate structured error from GraphQL error\nfunction createStructuredError(gqlError: GraphQLError): CopilotKitError | null {\n const extensions = gqlError.extensions;\n const originalError = extensions?.originalError as any;\n const message = originalError?.message || gqlError.message;\n const code = extensions?.code as CopilotKitErrorCode;\n\n if (code) {\n return new CopilotKitError({ message, code });\n }\n\n // Legacy error detection by stack trace\n if (originalError?.stack?.includes(\"CopilotApiDiscoveryError\")) {\n return new CopilotKitApiDiscoveryError({ message });\n }\n if (originalError?.stack?.includes(\"CopilotKitRemoteEndpointDiscoveryError\")) {\n return new CopilotKitRemoteEndpointDiscoveryError({ message });\n }\n if (originalError?.stack?.includes(\"CopilotKitAgentDiscoveryError\")) {\n return new CopilotKitAgentDiscoveryError({\n agentName: \"\",\n availableAgents: [],\n });\n }\n\n return null;\n}\n","import { GraphQLError } from \"@copilotkit/runtime-client-gql\";\nimport React, { createContext, useContext, useState, useCallback } from \"react\";\nimport { PartialBy, CopilotKitError, Severity } from \"@copilotkit/shared\";\n\ninterface Toast {\n id: string;\n message: string | React.ReactNode;\n type: \"info\" | \"success\" | \"warning\" | \"error\";\n duration?: number;\n}\n\ninterface ToastContextValue {\n toasts: Toast[];\n addToast: (toast: PartialBy<Toast, \"id\">) => void;\n addGraphQLErrorsToast: (errors: GraphQLError[]) => void;\n removeToast: (id: string) => void;\n enabled: boolean;\n // Banner management\n bannerError: CopilotKitError | null;\n setBannerError: (error: CopilotKitError | null) => void;\n}\n\nconst ToastContext = createContext<ToastContextValue | undefined>(undefined);\n\n// Helper functions for error banner styling\ntype ErrorSeverity = \"critical\" | \"warning\" | \"info\";\n\ninterface ErrorColors {\n background: string;\n border: string;\n text: string;\n icon: string;\n}\n\nfunction getErrorSeverity(error: CopilotKitError): ErrorSeverity {\n // Use structured error severity if available\n if (error.severity) {\n switch (error.severity) {\n case Severity.CRITICAL:\n return \"critical\";\n case Severity.WARNING:\n return \"warning\";\n case Severity.INFO:\n return \"info\";\n default:\n return \"info\";\n }\n }\n\n // Fallback: Check for API key errors which should always be critical\n const message = error.message.toLowerCase();\n if (\n message.includes(\"api key\") ||\n message.includes(\"401\") ||\n message.includes(\"unauthorized\") ||\n message.includes(\"authentication\") ||\n message.includes(\"incorrect api key\")\n ) {\n return \"critical\";\n }\n\n // Default to info level\n return \"info\";\n}\n\nfunction getErrorColors(severity: ErrorSeverity): ErrorColors {\n switch (severity) {\n case \"critical\":\n return {\n background: \"#fee2e2\",\n border: \"#dc2626\",\n text: \"#7f1d1d\",\n icon: \"#dc2626\",\n };\n case \"warning\":\n return {\n background: \"#fef3c7\",\n border: \"#d97706\",\n text: \"#78350f\",\n icon: \"#d97706\",\n };\n case \"info\":\n return {\n background: \"#dbeafe\",\n border: \"#2563eb\",\n text: \"#1e3a8a\",\n icon: \"#2563eb\",\n };\n }\n}\n\nexport function useToast() {\n const context = useContext(ToastContext);\n if (!context) {\n throw new Error(\"useToast must be used within a ToastProvider\");\n }\n return context;\n}\n\nexport function ToastProvider({\n enabled,\n children,\n}: {\n enabled: boolean;\n children: React.ReactNode;\n}) {\n const [toasts, setToasts] = useState<Toast[]>([]);\n const [bannerError, setBannerErrorState] = useState<CopilotKitError | null>(null);\n\n const removeToast = useCallback((id: string) => {\n setToasts((prev) => prev.filter((toast) => toast.id !== id));\n }, []);\n\n const addToast = useCallback(\n (toast: PartialBy<Toast, \"id\">) => {\n // Respect the enabled flag for ALL toasts\n if (!enabled) {\n return;\n }\n\n const id = toast.id ?? Math.random().toString(36).substring(2, 9);\n\n setToasts((currentToasts) => {\n if (currentToasts.find((toast) => toast.id === id)) return currentToasts;\n return [...currentToasts, { ...toast, id }];\n });\n\n if (toast.duration) {\n setTimeout(() => {\n removeToast(id);\n }, toast.duration);\n }\n },\n [enabled, removeToast],\n );\n\n const setBannerError = useCallback(\n (error: CopilotKitError | null) => {\n // Respect the enabled flag for ALL errors\n if (!enabled && error !== null) {\n return;\n }\n setBannerErrorState(error);\n },\n [enabled],\n );\n\n const addGraphQLErrorsToast = useCallback((errors: GraphQLError[]) => {\n // DEPRECATED: All errors now route to banners for consistency\n console.warn(\"addGraphQLErrorsToast is deprecated. All errors now show as banners.\");\n // Function kept for backward compatibility - does nothing\n }, []);\n\n const value = {\n toasts,\n addToast,\n addGraphQLErrorsToast,\n removeToast,\n enabled,\n bannerError,\n setBannerError,\n };\n\n return (\n <ToastContext.Provider value={value}>\n {/* Banner Error Display */}\n {bannerError &&\n (() => {\n const severity = getErrorSeverity(bannerError);\n const colors = getErrorColors(severity);\n\n return (\n <div\n style={{\n position: \"fixed\",\n bottom: \"20px\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n zIndex: 9999,\n backgroundColor: colors.background,\n border: `1px solid ${colors.border}`,\n borderLeft: `4px solid ${colors.border}`,\n borderRadius: \"8px\",\n padding: \"12px 16px\",\n fontSize: \"13px\",\n boxShadow: \"0 4px 12px rgba(0, 0, 0, 0.15)\",\n backdropFilter: \"blur(8px)\",\n maxWidth: \"min(90vw, 700px)\",\n width: \"100%\",\n boxSizing: \"border-box\",\n overflow: \"hidden\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n gap: \"10px\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n flex: 1,\n minWidth: 0,\n }}\n >\n <div\n style={{\n width: \"12px\",\n height: \"12px\",\n borderRadius: \"50%\",\n backgroundColor: colors.border,\n flexShrink: 0,\n }}\n />\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"10px\",\n flex: 1,\n minWidth: 0,\n }}\n >\n <div\n style={{\n color: colors.text,\n lineHeight: \"1.4\",\n fontWeight: \"400\",\n fontSize: \"13px\",\n flex: 1,\n wordBreak: \"break-all\",\n overflowWrap: \"break-word\",\n maxWidth: \"550px\",\n overflow: \"hidden\",\n display: \"-webkit-box\",\n WebkitLineClamp: 10,\n WebkitBoxOrient: \"vertical\",\n }}\n >\n {(() => {\n let message = bannerError.message;\n\n // Try to extract the useful message from JSON first\n const jsonMatch = message.match(/'message':\\s*'([^']+)'/);\n if (jsonMatch) {\n return jsonMatch[1]; // Return the actual error message\n }\n\n // Strip technical garbage but keep the meaningful message\n message = message.split(\" - \")[0]; // Remove everything after \" - {\"\n message = message.split(\": Error code\")[0]; // Remove \": Error code: 401\"\n message = message.replace(/:\\s*\\d{3}$/, \"\"); // Remove trailing \": 401\"\n message = message.replace(/See more:.*$/g, \"\"); // Remove \"See more\" links\n message = message.trim();\n\n // If it's still garbage (contains { or '), use fallback\n // if (message.includes(\"{\") || message.includes(\"'\")) {\n // return \"Configuration error.... Please check your setup.\";\n // }\n\n return message || \"Configuration error occurred.\";\n })()}\n </div>\n\n {(() => {\n const message = bannerError.message;\n const markdownLinkRegex = /\\[([^\\]]+)\\]\\(([^)]+)\\)/g;\n const plainUrlRegex = /(https?:\\/\\/[^\\s)]+)/g;\n\n // Extract the first URL found\n let url = null;\n let buttonText = \"See More\";\n\n // Check for markdown links first\n const markdownMatch = markdownLinkRegex.exec(message);\n if (markdownMatch) {\n url = markdownMatch[2];\n buttonText = \"See More\";\n } else {\n // Check for plain URLs\n const urlMatch = plainUrlRegex.exec(message);\n if (urlMatch) {\n url = urlMatch[0].replace(/[.,;:'\"]*$/, \"\"); // Remove trailing punctuation\n buttonText = \"See More\";\n }\n }\n\n if (!url) return null;\n\n return (\n <button\n onClick={() => window.open(url, \"_blank\", \"noopener,noreferrer\")}\n style={{\n background: colors.border,\n color: \"white\",\n border: \"none\",\n borderRadius: \"5px\",\n padding: \"4px 10px\",\n fontSize: \"11px\",\n fontWeight: \"500\",\n cursor: \"pointer\",\n transition: \"all 0.2s ease\",\n flexShrink: 0,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.opacity = \"0.9\";\n e.currentTarget.style.transform = \"translateY(-1px)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.opacity = \"1\";\n e.currentTarget.style.transform = \"translateY(0)\";\n }}\n >\n {buttonText}\n </button>\n );\n })()}\n </div>\n </div>\n <button\n onClick={() => setBannerError(null)}\n style={{\n background: \"transparent\",\n border: \"none\",\n color: colors.text,\n cursor: \"pointer\",\n padding: \"2px\",\n borderRadius: \"3px\",\n fontSize: \"14px\",\n lineHeight: \"1\",\n opacity: 0.6,\n transition: \"all 0.2s ease\",\n flexShrink: 0,\n }}\n title=\"Dismiss\"\n onMouseEnter={(e) => {\n e.currentTarget.style.opacity = \"1\";\n e.currentTarget.style.background = \"rgba(0, 0, 0, 0.05)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.opacity = \"0.6\";\n e.currentTarget.style.background = \"transparent\";\n }}\n >\n ×\n </button>\n </div>\n </div>\n );\n })()}\n\n {/* Toast Display - Deprecated: All errors now show as banners */}\n {children}\n </ToastContext.Provider>\n );\n}\n\n// Toast component removed - all errors now show as banners for consistency\n"],"mappings":"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","names":["import_react","import_shared","error","_a"]}
@@ -1,7 +1,6 @@
1
1
  import {
2
2
  useCopilotRuntimeClient
3
- } from "../chunk-Q3MCVRO3.mjs";
4
- import "../chunk-ICIK2BSB.mjs";
3
+ } from "../chunk-6ESSSQ7Q.mjs";
5
4
  import "../chunk-EFL5OBKN.mjs";
6
5
  import "../chunk-SKC7AJIV.mjs";
7
6
  export {
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  useDefaultTool
3
- } from "../chunk-E6ER5C5U.mjs";
4
- import "../chunk-HI6SPUOX.mjs";
3
+ } from "../chunk-MQYWH4E6.mjs";
4
+ import "../chunk-T3376SZS.mjs";
5
5
  import "../chunk-N4WEHORG.mjs";
6
6
  import "../chunk-O7ARI5CV.mjs";
7
- import "../chunk-EUX2P2E7.mjs";
8
7
  import "../chunk-EFL5OBKN.mjs";
8
+ import "../chunk-EUX2P2E7.mjs";
9
9
  import "../chunk-SKC7AJIV.mjs";
10
10
  export {
11
11
  useDefaultTool
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  useFrontendTool
3
- } from "../chunk-X5GRTEAW.mjs";
4
- import "../chunk-HI6SPUOX.mjs";
3
+ } from "../chunk-6GPVUMBU.mjs";
4
+ import "../chunk-T3376SZS.mjs";
5
5
  import "../chunk-N4WEHORG.mjs";
6
6
  import "../chunk-O7ARI5CV.mjs";
7
- import "../chunk-EUX2P2E7.mjs";
8
7
  import "../chunk-EFL5OBKN.mjs";
8
+ import "../chunk-EUX2P2E7.mjs";
9
9
  import "../chunk-SKC7AJIV.mjs";
10
10
  export {
11
11
  useFrontendTool
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  useHumanInTheLoop
3
- } from "../chunk-R4Y45UGQ.mjs";
4
- import "../chunk-HI6SPUOX.mjs";
3
+ } from "../chunk-EVVO67QO.mjs";
4
+ import "../chunk-T3376SZS.mjs";
5
5
  import "../chunk-N4WEHORG.mjs";
6
6
  import "../chunk-O7ARI5CV.mjs";
7
- import "../chunk-EUX2P2E7.mjs";
8
7
  import "../chunk-EFL5OBKN.mjs";
8
+ import "../chunk-EUX2P2E7.mjs";
9
9
  import "../chunk-SKC7AJIV.mjs";
10
10
  export {
11
11
  useHumanInTheLoop
@@ -2,8 +2,8 @@ import {
2
2
  useLangGraphInterruptRender
3
3
  } from "../chunk-ZVOLWJCY.mjs";
4
4
  import "../chunk-YPSGKPDA.mjs";
5
- import "../chunk-ZLQVRPDS.mjs";
6
5
  import "../chunk-EUX2P2E7.mjs";
6
+ import "../chunk-ZLQVRPDS.mjs";
7
7
  import "../chunk-SKC7AJIV.mjs";
8
8
  export {
9
9
  useLangGraphInterruptRender
@@ -256,21 +256,6 @@ function useToast() {
256
256
  // src/hooks/use-copilot-runtime-client.ts
257
257
  var import_react4 = require("react");
258
258
  var import_shared3 = require("@copilotkit/shared");
259
-
260
- // src/utils/dev-console.ts
261
- function isLocalhost() {
262
- if (typeof window === "undefined")
263
- return false;
264
- return window.location.hostname === "localhost" || window.location.hostname === "127.0.0.1" || window.location.hostname === "0.0.0.0";
265
- }
266
- function shouldShowDevConsole(showDevConsole) {
267
- if (showDevConsole !== void 0) {
268
- return showDevConsole;
269
- }
270
- return isLocalhost();
271
- }
272
-
273
- // src/hooks/use-copilot-runtime-client.ts
274
259
  var useCopilotRuntimeClient = (options) => {
275
260
  const { setBannerError } = useToast();
276
261
  const _a = options, { showDevConsole, onError } = _a, runtimeOptions = __objRest(_a, ["showDevConsole", "onError"]);
@@ -309,15 +294,10 @@ var useCopilotRuntimeClient = (options) => {
309
294
  const routeError = (gqlError) => {
310
295
  const extensions = gqlError.extensions;
311
296
  const visibility = extensions == null ? void 0 : extensions.visibility;
312
- const isDev = shouldShowDevConsole(showDevConsole != null ? showDevConsole : false);
313
297
  if (visibility === import_shared3.ErrorVisibility.SILENT) {
314
298
  console.error("CopilotKit Silent Error:", gqlError.message);
315
299
  return;
316
300
  }
317
- if (!isDev) {
318
- console.error("CopilotKit Error (hidden in production):", gqlError.message);
319
- return;
320
- }
321
301
  const now = Date.now();
322
302
  const errorMessage = gqlError.message;
323
303
  if (lastStructuredErrorRef.current && lastStructuredErrorRef.current.message === errorMessage && now - lastStructuredErrorRef.current.timestamp < 150) {
@@ -339,17 +319,12 @@ var useCopilotRuntimeClient = (options) => {
339
319
  };
340
320
  graphQLErrors.forEach(routeError);
341
321
  } else {
342
- const isDev = shouldShowDevConsole(showDevConsole != null ? showDevConsole : false);
343
- if (!isDev) {
344
- console.error("CopilotKit Error (hidden in production):", error);
345
- } else {
346
- const fallbackError = new import_shared3.CopilotKitError({
347
- message: (error == null ? void 0 : error.message) || String(error),
348
- code: import_shared3.CopilotKitErrorCode.UNKNOWN
349
- });
350
- setBannerError(fallbackError);
351
- traceUIError(fallbackError, error);
352
- }
322
+ const fallbackError = new import_shared3.CopilotKitError({
323
+ message: (error == null ? void 0 : error.message) || String(error),
324
+ code: import_shared3.CopilotKitErrorCode.UNKNOWN
325
+ });
326
+ setBannerError(fallbackError);
327
+ traceUIError(fallbackError, error);
353
328
  }
354
329
  },
355
330
  handleGQLWarning: (message) => {
@@ -361,7 +336,7 @@ var useCopilotRuntimeClient = (options) => {
361
336
  setBannerError(warningError);
362
337
  }
363
338
  }));
364
- }, [runtimeOptions, setBannerError, showDevConsole, onError]);
339
+ }, [runtimeOptions, setBannerError, onError]);
365
340
  return runtimeClient;
366
341
  };
367
342
  function createStructuredError(gqlError) {