@copilotkit/react-core 1.10.0-next.1 → 1.10.0-next.11

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 (204) hide show
  1. package/CHANGELOG.md +94 -0
  2. package/dist/{chunk-KV25ZRMH.mjs → chunk-2TSNHEIS.mjs} +6 -6
  3. package/dist/chunk-2TSNHEIS.mjs.map +1 -0
  4. package/dist/{chunk-DF4YG4PF.mjs → chunk-3RHHNUVV.mjs} +2 -2
  5. package/dist/{chunk-LNAQ7JG3.mjs → chunk-6EKLRL7B.mjs} +2 -2
  6. package/dist/{chunk-JZQOCH4A.mjs → chunk-ADZDXHVC.mjs} +4 -4
  7. package/dist/{chunk-4CFY3CON.mjs → chunk-CLMDRYEN.mjs} +2 -2
  8. package/dist/{chunk-VM7CVIET.mjs → chunk-COEUPDRL.mjs} +20 -21
  9. package/dist/chunk-COEUPDRL.mjs.map +1 -0
  10. package/dist/{chunk-RGKZCCPA.mjs → chunk-DLEXVOQE.mjs} +5 -5
  11. package/dist/{chunk-YAF2LATQ.mjs → chunk-EFL5OBKN.mjs} +1 -1
  12. package/dist/chunk-EFL5OBKN.mjs.map +1 -0
  13. package/dist/{chunk-JWAXDYOW.mjs → chunk-FAUNHSQU.mjs} +3 -3
  14. package/dist/chunk-ICIK2BSB.mjs +17 -0
  15. package/dist/chunk-ICIK2BSB.mjs.map +1 -0
  16. package/dist/chunk-IHAZJF3V.mjs +34 -0
  17. package/dist/chunk-IHAZJF3V.mjs.map +1 -0
  18. package/dist/{chunk-Q6FZZJ5A.mjs → chunk-IN7GE4NO.mjs} +2 -2
  19. package/dist/{chunk-4XVBXDCX.mjs → chunk-JBLMXZ3O.mjs} +8 -8
  20. package/dist/{chunk-NXCJELW7.mjs → chunk-JJDXTTEN.mjs} +3 -3
  21. package/dist/chunk-KDAZGZ24.mjs +1 -0
  22. package/dist/{chunk-VOMGRGWT.mjs → chunk-L6HQIJ74.mjs} +33 -17
  23. package/dist/chunk-L6HQIJ74.mjs.map +1 -0
  24. package/dist/{chunk-OMVNJ7S3.mjs → chunk-LVWV62JZ.mjs} +37 -24
  25. package/dist/chunk-LVWV62JZ.mjs.map +1 -0
  26. package/dist/{chunk-3OQM3NEK.mjs → chunk-N4WEHORG.mjs} +2 -2
  27. package/dist/chunk-OKRZF3DD.mjs +225 -0
  28. package/dist/chunk-OKRZF3DD.mjs.map +1 -0
  29. package/dist/{chunk-SGF6C7I6.mjs → chunk-Q42NJFXR.mjs} +11 -16
  30. package/dist/chunk-Q42NJFXR.mjs.map +1 -0
  31. package/dist/chunk-QGE7U4NV.mjs +85 -0
  32. package/dist/chunk-QGE7U4NV.mjs.map +1 -0
  33. package/dist/{chunk-XGRBCWK6.mjs → chunk-TEMLWRRT.mjs} +3 -3
  34. package/dist/chunk-TEMLWRRT.mjs.map +1 -0
  35. package/dist/{chunk-PYULBXCD.mjs → chunk-TWYUYC4F.mjs} +44 -10
  36. package/dist/chunk-TWYUYC4F.mjs.map +1 -0
  37. package/dist/{chunk-WUORFPJ7.mjs → chunk-X2DNXTME.mjs} +6 -6
  38. package/dist/{chunk-DCTJZ742.mjs → chunk-ZLQVRPDS.mjs} +5 -2
  39. package/dist/chunk-ZLQVRPDS.mjs.map +1 -0
  40. package/dist/components/copilot-provider/copilot-messages.d.ts +17 -1
  41. package/dist/components/copilot-provider/copilot-messages.js +46 -7
  42. package/dist/components/copilot-provider/copilot-messages.js.map +1 -1
  43. package/dist/components/copilot-provider/copilot-messages.mjs +11 -7
  44. package/dist/components/copilot-provider/copilotkit-props.d.ts +5 -3
  45. package/dist/components/copilot-provider/copilotkit-props.js.map +1 -1
  46. package/dist/components/copilot-provider/copilotkit.d.ts +1 -2
  47. package/dist/components/copilot-provider/copilotkit.js +337 -555
  48. package/dist/components/copilot-provider/copilotkit.js.map +1 -1
  49. package/dist/components/copilot-provider/copilotkit.mjs +10 -10
  50. package/dist/components/copilot-provider/index.d.ts +1 -2
  51. package/dist/components/copilot-provider/index.js +337 -555
  52. package/dist/components/copilot-provider/index.js.map +1 -1
  53. package/dist/components/copilot-provider/index.mjs +10 -10
  54. package/dist/components/error-boundary/error-boundary.js +176 -323
  55. package/dist/components/error-boundary/error-boundary.js.map +1 -1
  56. package/dist/components/error-boundary/error-boundary.mjs +4 -4
  57. package/dist/components/error-boundary/error-utils.js.map +1 -1
  58. package/dist/components/error-boundary/error-utils.mjs +2 -2
  59. package/dist/components/index.d.ts +1 -2
  60. package/dist/components/index.js +337 -555
  61. package/dist/components/index.js.map +1 -1
  62. package/dist/components/index.mjs +10 -10
  63. package/dist/components/toast/toast-provider.js.map +1 -1
  64. package/dist/components/toast/toast-provider.mjs +1 -1
  65. package/dist/components/usage-banner.d.ts +10 -4
  66. package/dist/components/usage-banner.js +176 -302
  67. package/dist/components/usage-banner.js.map +1 -1
  68. package/dist/components/usage-banner.mjs +3 -1
  69. package/dist/context/copilot-context.d.ts +1 -2
  70. package/dist/context/copilot-context.js +2 -2
  71. package/dist/context/copilot-context.js.map +1 -1
  72. package/dist/context/copilot-context.mjs +1 -1
  73. package/dist/context/copilot-messages-context.d.ts +11 -15
  74. package/dist/context/copilot-messages-context.js +4 -1
  75. package/dist/context/copilot-messages-context.js.map +1 -1
  76. package/dist/context/copilot-messages-context.mjs +1 -1
  77. package/dist/context/index.d.ts +2 -2
  78. package/dist/context/index.js +6 -3
  79. package/dist/context/index.js.map +1 -1
  80. package/dist/context/index.mjs +5 -5
  81. package/dist/{copilot-context-bd88d30d.d.ts → copilot-context-256f9020.d.ts} +4 -22
  82. package/dist/hooks/index.d.ts +7 -5
  83. package/dist/hooks/index.js +250 -122
  84. package/dist/hooks/index.js.map +1 -1
  85. package/dist/hooks/index.mjs +42 -34
  86. package/dist/hooks/use-chat.d.ts +1 -2
  87. package/dist/hooks/use-chat.js +11 -3
  88. package/dist/hooks/use-chat.js.map +1 -1
  89. package/dist/hooks/use-chat.mjs +6 -6
  90. package/dist/hooks/use-coagent-state-render.js +2 -2
  91. package/dist/hooks/use-coagent-state-render.js.map +1 -1
  92. package/dist/hooks/use-coagent-state-render.mjs +3 -3
  93. package/dist/hooks/use-coagent.d.ts +3 -4
  94. package/dist/hooks/use-coagent.js +114 -81
  95. package/dist/hooks/use-coagent.js.map +1 -1
  96. package/dist/hooks/use-coagent.mjs +16 -16
  97. package/dist/hooks/use-copilot-action.js +2 -2
  98. package/dist/hooks/use-copilot-action.js.map +1 -1
  99. package/dist/hooks/use-copilot-action.mjs +4 -4
  100. package/dist/hooks/use-copilot-additional-instructions.js +2 -2
  101. package/dist/hooks/use-copilot-additional-instructions.js.map +1 -1
  102. package/dist/hooks/use-copilot-additional-instructions.mjs +2 -2
  103. package/dist/hooks/use-copilot-authenticated-action.js +2 -2
  104. package/dist/hooks/use-copilot-authenticated-action.js.map +1 -1
  105. package/dist/hooks/use-copilot-authenticated-action.mjs +5 -5
  106. package/dist/hooks/use-copilot-chat-headless_c.d.ts +33 -0
  107. package/dist/hooks/use-copilot-chat-headless_c.js +1837 -0
  108. package/dist/hooks/use-copilot-chat-headless_c.js.map +1 -0
  109. package/dist/hooks/use-copilot-chat-headless_c.mjs +31 -0
  110. package/dist/hooks/use-copilot-chat-headless_c.mjs.map +1 -0
  111. package/dist/hooks/use-copilot-chat.d.ts +52 -82
  112. package/dist/hooks/use-copilot-chat.js +60 -13
  113. package/dist/hooks/use-copilot-chat.js.map +1 -1
  114. package/dist/hooks/use-copilot-chat.mjs +16 -17
  115. package/dist/hooks/use-copilot-chat_internal.d.ts +177 -0
  116. package/dist/hooks/use-copilot-chat_internal.js +1770 -0
  117. package/dist/hooks/use-copilot-chat_internal.js.map +1 -0
  118. package/dist/hooks/use-copilot-chat_internal.mjs +29 -0
  119. package/dist/hooks/use-copilot-chat_internal.mjs.map +1 -0
  120. package/dist/hooks/use-copilot-readable.js +2 -2
  121. package/dist/hooks/use-copilot-readable.js.map +1 -1
  122. package/dist/hooks/use-copilot-readable.mjs +2 -2
  123. package/dist/hooks/use-copilot-runtime-client.js +9 -1
  124. package/dist/hooks/use-copilot-runtime-client.js.map +1 -1
  125. package/dist/hooks/use-copilot-runtime-client.mjs +3 -3
  126. package/dist/hooks/use-langgraph-interrupt-render.js +2 -2
  127. package/dist/hooks/use-langgraph-interrupt-render.js.map +1 -1
  128. package/dist/hooks/use-langgraph-interrupt-render.mjs +3 -3
  129. package/dist/hooks/use-langgraph-interrupt.d.ts +3 -4
  130. package/dist/hooks/use-langgraph-interrupt.js +32 -11
  131. package/dist/hooks/use-langgraph-interrupt.js.map +1 -1
  132. package/dist/hooks/use-langgraph-interrupt.mjs +16 -16
  133. package/dist/hooks/use-make-copilot-document-readable.js +2 -2
  134. package/dist/hooks/use-make-copilot-document-readable.js.map +1 -1
  135. package/dist/hooks/use-make-copilot-document-readable.mjs +2 -2
  136. package/dist/index-08c43df1.d.ts +36 -0
  137. package/dist/index.d.ts +5 -3
  138. package/dist/index.js +460 -471
  139. package/dist/index.js.map +1 -1
  140. package/dist/index.mjs +47 -39
  141. package/dist/lib/copilot-task.d.ts +1 -2
  142. package/dist/lib/copilot-task.js.map +1 -1
  143. package/dist/lib/copilot-task.mjs +12 -12
  144. package/dist/lib/index.d.ts +1 -2
  145. package/dist/lib/index.js.map +1 -1
  146. package/dist/lib/index.mjs +12 -12
  147. package/dist/types/interrupt-action.d.ts +2 -3
  148. package/dist/utils/dev-console.d.ts +1 -1
  149. package/dist/utils/dev-console.js +9 -1
  150. package/dist/utils/dev-console.js.map +1 -1
  151. package/dist/utils/dev-console.mjs +1 -1
  152. package/dist/utils/extract.d.ts +2 -2
  153. package/dist/utils/extract.js.map +1 -1
  154. package/dist/utils/extract.mjs +10 -10
  155. package/dist/utils/index.d.ts +3 -3
  156. package/dist/utils/index.js +9 -1
  157. package/dist/utils/index.js.map +1 -1
  158. package/dist/utils/index.mjs +11 -11
  159. package/dist/utils/suggestions.d.ts +2 -2
  160. package/dist/utils/suggestions.js.map +1 -1
  161. package/dist/utils/suggestions.mjs +10 -10
  162. package/package.json +3 -3
  163. package/src/components/copilot-provider/copilot-messages.tsx +57 -1
  164. package/src/components/copilot-provider/copilotkit-props.tsx +4 -1
  165. package/src/components/copilot-provider/copilotkit.tsx +20 -10
  166. package/src/components/error-boundary/error-boundary.tsx +5 -15
  167. package/src/components/toast/toast-provider.tsx +1 -3
  168. package/src/components/usage-banner.tsx +193 -316
  169. package/src/context/copilot-context.tsx +12 -6
  170. package/src/context/copilot-messages-context.tsx +7 -1
  171. package/src/hooks/__tests__/use-coagent-config.test.ts +8 -1
  172. package/src/hooks/index.ts +7 -2
  173. package/src/hooks/use-coagent.ts +17 -19
  174. package/src/hooks/use-copilot-chat-headless_c.ts +187 -0
  175. package/src/hooks/use-copilot-chat.ts +64 -495
  176. package/src/hooks/use-copilot-chat_internal.ts +543 -0
  177. package/src/hooks/use-langgraph-interrupt.ts +1 -1
  178. package/src/utils/dev-console.ts +18 -2
  179. package/dist/chunk-57K2ZJ5F.mjs +0 -348
  180. package/dist/chunk-57K2ZJ5F.mjs.map +0 -1
  181. package/dist/chunk-CQPYJIBH.mjs +0 -1
  182. package/dist/chunk-DCTJZ742.mjs.map +0 -1
  183. package/dist/chunk-GFJW4RIM.mjs +0 -9
  184. package/dist/chunk-GFJW4RIM.mjs.map +0 -1
  185. package/dist/chunk-KV25ZRMH.mjs.map +0 -1
  186. package/dist/chunk-OMVNJ7S3.mjs.map +0 -1
  187. package/dist/chunk-PYULBXCD.mjs.map +0 -1
  188. package/dist/chunk-SGF6C7I6.mjs.map +0 -1
  189. package/dist/chunk-VM7CVIET.mjs.map +0 -1
  190. package/dist/chunk-VOMGRGWT.mjs.map +0 -1
  191. package/dist/chunk-XGRBCWK6.mjs.map +0 -1
  192. package/dist/chunk-YAF2LATQ.mjs.map +0 -1
  193. /package/dist/{chunk-DF4YG4PF.mjs.map → chunk-3RHHNUVV.mjs.map} +0 -0
  194. /package/dist/{chunk-LNAQ7JG3.mjs.map → chunk-6EKLRL7B.mjs.map} +0 -0
  195. /package/dist/{chunk-JZQOCH4A.mjs.map → chunk-ADZDXHVC.mjs.map} +0 -0
  196. /package/dist/{chunk-4CFY3CON.mjs.map → chunk-CLMDRYEN.mjs.map} +0 -0
  197. /package/dist/{chunk-RGKZCCPA.mjs.map → chunk-DLEXVOQE.mjs.map} +0 -0
  198. /package/dist/{chunk-JWAXDYOW.mjs.map → chunk-FAUNHSQU.mjs.map} +0 -0
  199. /package/dist/{chunk-Q6FZZJ5A.mjs.map → chunk-IN7GE4NO.mjs.map} +0 -0
  200. /package/dist/{chunk-4XVBXDCX.mjs.map → chunk-JBLMXZ3O.mjs.map} +0 -0
  201. /package/dist/{chunk-NXCJELW7.mjs.map → chunk-JJDXTTEN.mjs.map} +0 -0
  202. /package/dist/{chunk-CQPYJIBH.mjs.map → chunk-KDAZGZ24.mjs.map} +0 -0
  203. /package/dist/{chunk-3OQM3NEK.mjs.map → chunk-N4WEHORG.mjs.map} +0 -0
  204. /package/dist/{chunk-WUORFPJ7.mjs.map → chunk-X2DNXTME.mjs.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/usage-banner.tsx"],"sourcesContent":["import {\n Severity,\n CopilotKitError,\n ErrorVisibility,\n CopilotKitErrorCode,\n} from \"@copilotkit/shared\";\nimport React from \"react\";\n\ninterface UsageBannerProps {\n severity?: Severity;\n message?: string | React.ReactNode;\n onClose?: () => void;\n actions?: {\n primary?: {\n label: string;\n onClick: () => void;\n };\n secondary?: {\n label: string;\n onClick: () => void;\n };\n };\n}\n\nexport function UsageBanner({\n severity = Severity.CRITICAL,\n message = \"\",\n onClose,\n actions,\n}: UsageBannerProps) {\n if (!message || !severity) {\n return null;\n }\n\n const themes = {\n [Severity.INFO]: {\n bg: \"#f8fafc\",\n border: \"#e2e8f0\",\n text: \"#475569\",\n accent: \"#3b82f6\",\n },\n [Severity.WARNING]: {\n bg: \"#fffbeb\",\n border: \"#fbbf24\",\n text: \"#92400e\",\n accent: \"#f59e0b\",\n },\n [Severity.CRITICAL]: {\n bg: \"#fef2f2\",\n border: \"#fecaca\",\n text: \"#dc2626\",\n accent: \"#ef4444\",\n },\n };\n\n const theme = themes[severity];\n\n return (\n <>\n <style>\n {`\n @keyframes slideUp {\n from { opacity: 0; transform: translateX(-50%) translateY(8px); }\n to { opacity: 1; transform: translateX(-50%) translateY(0); }\n }\n \n .usage-banner {\n position: fixed;\n bottom: 24px;\n left: 50%;\n transform: translateX(-50%);\n width: min(600px, calc(100vw - 32px));\n z-index: 10000;\n animation: slideUp 0.2s cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .banner-content {\n background: linear-gradient(135deg, ${theme.bg} 0%, ${theme.bg}f5 100%);\n border: 1px solid ${theme.border};\n border-radius: 12px;\n padding: 18px 20px;\n box-shadow: \n 0 4px 24px rgba(0, 0, 0, 0.08),\n 0 2px 8px rgba(0, 0, 0, 0.04),\n inset 0 1px 0 rgba(255, 255, 255, 0.7);\n display: flex;\n align-items: center;\n gap: 16px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;\n backdrop-filter: blur(12px);\n position: relative;\n overflow: hidden;\n }\n \n .banner-content::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 1px;\n background: linear-gradient(90deg, transparent, ${theme.accent}40, transparent);\n }\n \n .banner-message {\n color: ${theme.text};\n font-size: 14px;\n line-height: 1.5;\n font-weight: 500;\n flex: 1;\n letter-spacing: -0.01em;\n }\n \n .close-btn {\n background: rgba(0, 0, 0, 0.05);\n border: none;\n color: ${theme.text};\n cursor: pointer;\n padding: 0;\n border-radius: 6px;\n opacity: 0.6;\n transition: all 0.15s cubic-bezier(0.16, 1, 0.3, 1);\n font-size: 14px;\n line-height: 1;\n flex-shrink: 0;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n \n .close-btn:hover {\n opacity: 1;\n background: rgba(0, 0, 0, 0.08);\n transform: scale(1.05);\n }\n \n .btn-primary {\n background: linear-gradient(135deg, ${theme.accent} 0%, ${theme.accent}e6 100%);\n color: white;\n border: none;\n border-radius: 8px;\n padding: 10px 18px;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s cubic-bezier(0.16, 1, 0.3, 1);\n font-family: inherit;\n flex-shrink: 0;\n box-shadow: \n 0 2px 8px ${theme.accent}30,\n inset 0 1px 0 rgba(255, 255, 255, 0.2);\n letter-spacing: -0.01em;\n }\n \n .btn-primary:hover {\n transform: translateY(-1px) scale(1.02);\n box-shadow: \n 0 4px 12px ${theme.accent}40,\n inset 0 1px 0 rgba(255, 255, 255, 0.25);\n }\n \n .btn-primary:active {\n transform: translateY(0) scale(0.98);\n transition: all 0.08s cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n @media (max-width: 640px) {\n .usage-banner {\n width: calc(100vw - 24px);\n }\n \n .banner-content {\n padding: 16px;\n gap: 12px;\n }\n \n .banner-message {\n font-size: 13px;\n line-height: 1.45;\n }\n \n .btn-primary {\n padding: 8px 14px;\n font-size: 12px;\n }\n \n .close-btn {\n width: 22px;\n height: 22px;\n font-size: 12px;\n }\n }\n `}\n </style>\n\n <div className=\"usage-banner\">\n <div className=\"banner-content\">\n <div className=\"banner-message\">{message}</div>\n {actions?.primary && (\n <button className=\"btn-primary\" onClick={actions.primary.onClick}>\n {actions.primary.label}\n </button>\n )}\n {onClose && (\n <button className=\"close-btn\" onClick={onClose} title=\"Close\">\n ×\n </button>\n )}\n </div>\n </div>\n </>\n );\n}\n\n// Get action button based on error type\nexport const getErrorActions = (error: CopilotKitError) => {\n switch (error.code) {\n case CopilotKitErrorCode.MISSING_PUBLIC_API_KEY_ERROR:\n return {\n primary: {\n label: \"Show me how\",\n onClick: () =>\n window.open(\n \"https://docs.copilotkit.ai/docs/guides/subscription\",\n \"_blank\",\n \"noopener,noreferrer\",\n ),\n },\n };\n case CopilotKitErrorCode.UPGRADE_REQUIRED_ERROR:\n return {\n primary: {\n label: \"Upgrade\",\n onClick: () =>\n window.open(\"https://cloud.copilotkit.ai\", \"_blank\", \"noopener,noreferrer\"),\n },\n };\n default:\n return undefined;\n }\n};\n\nexport function renderCopilotKitUsage(error: CopilotKitError, onClose?: () => void) {\n // Route based on error visibility level\n if (error.visibility !== ErrorVisibility.BANNER) {\n return null;\n }\n\n return (\n <UsageBanner\n severity={error.severity || Severity.CRITICAL}\n message={error.message}\n onClose={onClose}\n actions={getErrorActions(error)}\n />\n );\n}\n"],"mappings":"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","names":[]}
@@ -1,17 +1,17 @@
1
1
  import {
2
2
  StatusChecker
3
3
  } from "./chunk-PMAFHQ7P.mjs";
4
- import {
5
- useErrorToast
6
- } from "./chunk-3OQM3NEK.mjs";
7
4
  import {
8
5
  UsageBanner,
9
- renderCopilotKitUsage
10
- } from "./chunk-57K2ZJ5F.mjs";
6
+ getErrorActions
7
+ } from "./chunk-OKRZF3DD.mjs";
8
+ import {
9
+ useErrorToast
10
+ } from "./chunk-N4WEHORG.mjs";
11
11
 
12
12
  // src/components/error-boundary/error-boundary.tsx
13
13
  import React, { useEffect } from "react";
14
- import { CopilotKitError, ErrorVisibility } from "@copilotkit/shared";
14
+ import { CopilotKitError } from "@copilotkit/shared";
15
15
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
16
16
  var statusChecker = new StatusChecker();
17
17
  var CopilotErrorBoundary = class extends React.Component {
@@ -44,22 +44,17 @@ var CopilotErrorBoundary = class extends React.Component {
44
44
  console.error("CopilotKit Error:", error, errorInfo);
45
45
  }
46
46
  render() {
47
- var _a, _b;
47
+ var _a, _b, _c, _d;
48
48
  if (this.state.hasError) {
49
49
  if (this.state.error instanceof CopilotKitError) {
50
- if (this.state.error.visibility === ErrorVisibility.BANNER) {
51
- return /* @__PURE__ */ jsx(ErrorToast, { error: this.state.error, children: renderCopilotKitUsage(
52
- this.state.error,
53
- () => this.setState({ hasError: false, error: void 0 })
54
- ) });
55
- }
56
50
  return /* @__PURE__ */ jsxs(Fragment, { children: [
57
51
  this.props.children,
58
52
  this.props.showUsageBanner && /* @__PURE__ */ jsx(
59
53
  UsageBanner,
60
54
  {
61
- severity: (_a = this.state.status) == null ? void 0 : _a.severity,
62
- message: (_b = this.state.status) == null ? void 0 : _b.message
55
+ severity: (_b = (_a = this.state.status) == null ? void 0 : _a.severity) != null ? _b : this.state.error.severity,
56
+ message: (_d = (_c = this.state.status) == null ? void 0 : _c.message) != null ? _d : this.state.error.message,
57
+ actions: getErrorActions(this.state.error)
63
58
  }
64
59
  )
65
60
  ] });
@@ -85,4 +80,4 @@ export {
85
80
  CopilotErrorBoundary,
86
81
  ErrorToast
87
82
  };
88
- //# sourceMappingURL=chunk-SGF6C7I6.mjs.map
83
+ //# sourceMappingURL=chunk-Q42NJFXR.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/error-boundary/error-boundary.tsx"],"sourcesContent":["import React, { useEffect } from \"react\";\nimport { Severity, CopilotKitError } from \"@copilotkit/shared\";\nimport { StatusChecker } from \"../../lib/status-checker\";\nimport { getErrorActions, UsageBanner } from \"../usage-banner\";\nimport { useErrorToast } from \"./error-utils\";\n\nconst statusChecker = new StatusChecker();\n\ninterface Props {\n children: React.ReactNode;\n publicApiKey?: string;\n showUsageBanner?: boolean;\n}\n\ninterface State {\n hasError: boolean;\n error?: CopilotKitError;\n status?: {\n severity: Severity;\n message: string;\n };\n}\n\nexport class CopilotErrorBoundary extends React.Component<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = {\n hasError: false,\n };\n }\n\n static getDerivedStateFromError(error: CopilotKitError): State {\n return { hasError: true, error };\n }\n\n componentDidMount() {\n if (this.props.publicApiKey) {\n statusChecker.start(this.props.publicApiKey, (newStatus) => {\n this.setState((prevState) => {\n if (newStatus?.severity !== prevState.status?.severity) {\n return { status: newStatus ?? undefined };\n }\n return null;\n });\n });\n }\n }\n\n componentWillUnmount() {\n statusChecker.stop();\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n console.error(\"CopilotKit Error:\", error, errorInfo);\n }\n\n render() {\n if (this.state.hasError) {\n if (this.state.error instanceof CopilotKitError) {\n return (\n <>\n {this.props.children}\n {this.props.showUsageBanner && (\n <UsageBanner\n severity={this.state.status?.severity ?? this.state.error.severity}\n message={this.state.status?.message ?? this.state.error.message}\n actions={getErrorActions(this.state.error)}\n />\n )}\n </>\n );\n }\n throw this.state.error;\n }\n\n return this.props.children;\n }\n}\n\nexport function ErrorToast({ error, children }: { error?: Error; children: React.ReactNode }) {\n const addErrorToast = useErrorToast();\n\n useEffect(() => {\n if (error) {\n addErrorToast([error]);\n }\n }, [error, addErrorToast]);\n\n if (!error) throw error;\n return children;\n}\n"],"mappings":";;;;;;;;;;;;AAAA,OAAO,SAAS,iBAAiB;AACjC,SAAmB,uBAAuB;AA2DhC,mBAGI,KAHJ;AAtDV,IAAM,gBAAgB,IAAI,cAAc;AAiBjC,IAAM,uBAAN,cAAmC,MAAM,UAAwB;AAAA,EACtE,YAAY,OAAc;AACxB,UAAM,KAAK;AACX,SAAK,QAAQ;AAAA,MACX,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EAEA,OAAO,yBAAyB,OAA+B;AAC7D,WAAO,EAAE,UAAU,MAAM,MAAM;AAAA,EACjC;AAAA,EAEA,oBAAoB;AAClB,QAAI,KAAK,MAAM,cAAc;AAC3B,oBAAc,MAAM,KAAK,MAAM,cAAc,CAAC,cAAc;AAC1D,aAAK,SAAS,CAAC,cAAc;AAtCrC;AAuCU,eAAI,uCAAW,gBAAa,eAAU,WAAV,mBAAkB,WAAU;AACtD,mBAAO,EAAE,QAAQ,gCAAa,OAAU;AAAA,UAC1C;AACA,iBAAO;AAAA,QACT,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,uBAAuB;AACrB,kBAAc,KAAK;AAAA,EACrB;AAAA,EAEA,kBAAkB,OAAc,WAA4B;AAC1D,YAAQ,MAAM,qBAAqB,OAAO,SAAS;AAAA,EACrD;AAAA,EAEA,SAAS;AAxDX;AAyDI,QAAI,KAAK,MAAM,UAAU;AACvB,UAAI,KAAK,MAAM,iBAAiB,iBAAiB;AAC/C,eACE,iCACG;AAAA,eAAK,MAAM;AAAA,UACX,KAAK,MAAM,mBACV;AAAA,YAAC;AAAA;AAAA,cACC,WAAU,gBAAK,MAAM,WAAX,mBAAmB,aAAnB,YAA+B,KAAK,MAAM,MAAM;AAAA,cAC1D,UAAS,gBAAK,MAAM,WAAX,mBAAmB,YAAnB,YAA8B,KAAK,MAAM,MAAM;AAAA,cACxD,SAAS,gBAAgB,KAAK,MAAM,KAAK;AAAA;AAAA,UAC3C;AAAA,WAEJ;AAAA,MAEJ;AACA,YAAM,KAAK,MAAM;AAAA,IACnB;AAEA,WAAO,KAAK,MAAM;AAAA,EACpB;AACF;AAEO,SAAS,WAAW,EAAE,OAAO,SAAS,GAAiD;AAC5F,QAAM,gBAAgB,cAAc;AAEpC,YAAU,MAAM;AACd,QAAI,OAAO;AACT,oBAAc,CAAC,KAAK,CAAC;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,OAAO,aAAa,CAAC;AAEzB,MAAI,CAAC;AAAO,UAAM;AAClB,SAAO;AACT;","names":[]}
@@ -0,0 +1,85 @@
1
+ import {
2
+ useCopilotChat
3
+ } from "./chunk-L6HQIJ74.mjs";
4
+ import {
5
+ useCopilotContext
6
+ } from "./chunk-TEMLWRRT.mjs";
7
+ import {
8
+ __async
9
+ } from "./chunk-SKC7AJIV.mjs";
10
+
11
+ // src/hooks/use-copilot-chat-headless_c.ts
12
+ import { useEffect } from "react";
13
+ import {
14
+ ErrorVisibility,
15
+ Severity,
16
+ CopilotKitError,
17
+ CopilotKitErrorCode,
18
+ styledConsole
19
+ } from "@copilotkit/shared";
20
+ var createNonFunctionalReturn = () => ({
21
+ visibleMessages: [],
22
+ messages: [],
23
+ sendMessage: () => __async(void 0, null, function* () {
24
+ }),
25
+ appendMessage: () => __async(void 0, null, function* () {
26
+ }),
27
+ setMessages: () => {
28
+ },
29
+ deleteMessage: () => {
30
+ },
31
+ reloadMessages: () => __async(void 0, null, function* () {
32
+ }),
33
+ stopGeneration: () => {
34
+ },
35
+ reset: () => {
36
+ },
37
+ isLoading: false,
38
+ runChatCompletion: () => __async(void 0, null, function* () {
39
+ return [];
40
+ }),
41
+ mcpServers: [],
42
+ setMcpServers: () => {
43
+ },
44
+ suggestions: [],
45
+ setSuggestions: () => {
46
+ },
47
+ generateSuggestions: () => __async(void 0, null, function* () {
48
+ }),
49
+ resetSuggestions: () => {
50
+ },
51
+ isLoadingSuggestions: false,
52
+ interrupt: null
53
+ });
54
+ function useCopilotChatHeadless_c(options = {}) {
55
+ const { copilotApiConfig, setBannerError } = useCopilotContext();
56
+ const hasPublicApiKey = Boolean(copilotApiConfig.publicApiKey);
57
+ const internalResult = useCopilotChat(options);
58
+ useEffect(() => {
59
+ if (!hasPublicApiKey) {
60
+ setBannerError(
61
+ new CopilotKitError({
62
+ message: (
63
+ // add link to documentation here
64
+ "You're using useCopilotChatHeadless_c, a subscription-only feature, which offers extensive headless chat capabilities. To continue, you'll need to provide a free subscription key."
65
+ ),
66
+ code: CopilotKitErrorCode.MISSING_PUBLIC_API_KEY_ERROR,
67
+ severity: Severity.WARNING,
68
+ visibility: ErrorVisibility.BANNER
69
+ })
70
+ );
71
+ styledConsole.logCopilotKitPlatformMessage();
72
+ } else {
73
+ setBannerError(null);
74
+ }
75
+ }, [hasPublicApiKey]);
76
+ if (hasPublicApiKey) {
77
+ return internalResult;
78
+ }
79
+ return createNonFunctionalReturn();
80
+ }
81
+
82
+ export {
83
+ useCopilotChatHeadless_c
84
+ };
85
+ //# sourceMappingURL=chunk-QGE7U4NV.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/use-copilot-chat-headless_c.ts"],"sourcesContent":["/**\n * `useCopilotChatHeadless_c` is for building fully custom UI (headless UI) implementations.\n *\n * <Callout type=\"info\" title=\"This is a premium feature\">\n * Use of `useCopilotchatHeadless_c` requires a public license key.\n *\n * Sign up for free at https://cloud.copilotkit.ai/ to get your public license key.\n *\n * Usage is generous, free to get started, and easily slots into existing applications, either self-hosted or using Copilot Cloud.\n * </Callout>\n *\n * ## Key Features:\n *\n * - **Fully headless**: Build your own fully custom UI's for your agentic applications.\n * - **Advanced Suggestions**: Direct access to suggestions array with full control\n * - **Interrupt Handling**: Support for advanced interrupt functionality\n * - **MCP Server Support**: Model Context Protocol server configurations\n * - **Chat Controls**: Complete set of chat management functions\n * - **Loading States**: Comprehensive loading state management\n *\n * ## Usage:\n *\n * ### Basic Setup\n *\n * ```tsx\n * import { CopilotKit } from \"@copilotkit/react-core\";\n * import { useCopilotChatHeadless_c } from \"@copilotkit/react-core\";\n *\n * export function App() {\n * return (\n * <CopilotKit publicApiKey=\"your-free-subscription-key\">\n * <YourComponent />\n * </CopilotKit>\n * );\n * }\n *\n * export function YourComponent() {\n * const { messages, sendMessage, isLoading } = useCopilotChatHeadless_c();\n *\n * const handleSendMessage = async () => {\n * await sendMessage({\n * id: \"123\",\n * role: \"user\",\n * content: \"Hello World\",\n * });\n * };\n *\n * return (\n * <div>\n * {messages.map(msg => <div key={msg.id}>{msg.content}</div>)}\n * <button onClick={handleSendMessage} disabled={isLoading}>\n * Send Message\n * </button>\n * </div>\n * );\n * }\n * ```\n *\n * ### Working with Suggestions\n *\n * ```tsx\n * import { useCopilotChatHeadless_c, useCopilotChatSuggestions } from \"@copilotkit/react-core\";\n *\n * export function SuggestionExample() {\n * const {\n * suggestions,\n * setSuggestions,\n * generateSuggestions,\n * isLoadingSuggestions\n * } = useCopilotChatHeadless_c();\n *\n * // Configure AI suggestion generation\n * useCopilotChatSuggestions({\n * instructions: \"Suggest helpful actions based on the current context\",\n * maxSuggestions: 3\n * });\n *\n * return (\n * <div>\n * {suggestions.map(suggestion => (\n * <button key={suggestion.title}>{suggestion.title}</button>\n * ))}\n * <button onClick={generateSuggestions} disabled={isLoadingSuggestions}>\n * Generate Suggestions\n * </button>\n * </div>\n * );\n * }\n * ```\n */\nimport { useEffect } from \"react\";\nimport { useCopilotContext } from \"../context/copilot-context\";\nimport {\n useCopilotChat as useCopilotChatInternal,\n defaultSystemMessage,\n UseCopilotChatOptions as UseCopilotChatOptions_c,\n UseCopilotChatReturn as UseCopilotChatReturn_c,\n MCPServerConfig,\n} from \"./use-copilot-chat_internal\";\n\nimport {\n ErrorVisibility,\n Severity,\n CopilotKitError,\n CopilotKitErrorCode,\n styledConsole,\n} from \"@copilotkit/shared\";\n\n// Non-functional fallback implementation\nconst createNonFunctionalReturn = (): UseCopilotChatReturn_c => ({\n visibleMessages: [],\n messages: [],\n sendMessage: async () => {},\n appendMessage: async () => {},\n setMessages: () => {},\n deleteMessage: () => {},\n reloadMessages: async () => {},\n stopGeneration: () => {},\n reset: () => {},\n isLoading: false,\n runChatCompletion: async () => [],\n mcpServers: [],\n setMcpServers: () => {},\n suggestions: [],\n setSuggestions: () => {},\n generateSuggestions: async () => {},\n resetSuggestions: () => {},\n isLoadingSuggestions: false,\n interrupt: null,\n});\n/**\n * Enterprise React hook that provides complete chat functionality for fully custom UI implementations.\n * Includes all advanced features like direct message access, suggestions array, interrupt handling, and MCP support.\n *\n * **Requires a publicApiKey** - Sign up for free at https://cloud.copilotkit.ai/\n *\n * @param options - Configuration options for the chat\n * @returns Complete chat interface with all enterprise features\n *\n * @example\n * ```tsx\n * const { messages, sendMessage, suggestions, interrupt } = useCopilotChatHeadless_c();\n * ```\n */\nfunction useCopilotChatHeadless_c(options: UseCopilotChatOptions_c = {}): UseCopilotChatReturn_c {\n const { copilotApiConfig, setBannerError } = useCopilotContext();\n\n // Check if publicApiKey is available\n const hasPublicApiKey = Boolean(copilotApiConfig.publicApiKey);\n\n // Always call the internal hook (follows rules of hooks)\n const internalResult = useCopilotChatInternal(options);\n\n // Set banner error when no public API key is provided\n useEffect(() => {\n if (!hasPublicApiKey) {\n setBannerError(\n new CopilotKitError({\n message:\n // add link to documentation here\n \"You're using useCopilotChatHeadless_c, a subscription-only feature, which offers extensive headless chat capabilities. To continue, you'll need to provide a free subscription key.\",\n code: CopilotKitErrorCode.MISSING_PUBLIC_API_KEY_ERROR,\n severity: Severity.WARNING,\n visibility: ErrorVisibility.BANNER,\n }),\n );\n styledConsole.logCopilotKitPlatformMessage();\n } else {\n setBannerError(null); // Clear banner when API key is provided\n }\n }, [hasPublicApiKey]); // Removed setBannerError dependency\n\n // Return internal result if publicApiKey is available, otherwise return fallback\n if (hasPublicApiKey) {\n return internalResult;\n }\n\n // Return non-functional fallback when no publicApiKey\n return createNonFunctionalReturn();\n}\n\nexport { defaultSystemMessage, useCopilotChatHeadless_c };\nexport type { UseCopilotChatOptions_c, UseCopilotChatReturn_c, MCPServerConfig };\n\nconst noKeyWarning = () => {\n styledConsole.logCopilotKitPlatformMessage();\n};\n"],"mappings":";;;;;;;;;;;AA0FA,SAAS,iBAAiB;AAU1B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,IAAM,4BAA4B,OAA+B;AAAA,EAC/D,iBAAiB,CAAC;AAAA,EAClB,UAAU,CAAC;AAAA,EACX,aAAa,MAAY;AAAA,EAAC;AAAA,EAC1B,eAAe,MAAY;AAAA,EAAC;AAAA,EAC5B,aAAa,MAAM;AAAA,EAAC;AAAA,EACpB,eAAe,MAAM;AAAA,EAAC;AAAA,EACtB,gBAAgB,MAAY;AAAA,EAAC;AAAA,EAC7B,gBAAgB,MAAM;AAAA,EAAC;AAAA,EACvB,OAAO,MAAM;AAAA,EAAC;AAAA,EACd,WAAW;AAAA,EACX,mBAAmB,MAAS;AAAG,YAAC;AAAA;AAAA,EAChC,YAAY,CAAC;AAAA,EACb,eAAe,MAAM;AAAA,EAAC;AAAA,EACtB,aAAa,CAAC;AAAA,EACd,gBAAgB,MAAM;AAAA,EAAC;AAAA,EACvB,qBAAqB,MAAY;AAAA,EAAC;AAAA,EAClC,kBAAkB,MAAM;AAAA,EAAC;AAAA,EACzB,sBAAsB;AAAA,EACtB,WAAW;AACb;AAeA,SAAS,yBAAyB,UAAmC,CAAC,GAA2B;AAC/F,QAAM,EAAE,kBAAkB,eAAe,IAAI,kBAAkB;AAG/D,QAAM,kBAAkB,QAAQ,iBAAiB,YAAY;AAG7D,QAAM,iBAAiB,eAAuB,OAAO;AAGrD,YAAU,MAAM;AACd,QAAI,CAAC,iBAAiB;AACpB;AAAA,QACE,IAAI,gBAAgB;AAAA,UAClB;AAAA;AAAA,YAEE;AAAA;AAAA,UACF,MAAM,oBAAoB;AAAA,UAC1B,UAAU,SAAS;AAAA,UACnB,YAAY,gBAAgB;AAAA,QAC9B,CAAC;AAAA,MACH;AACA,oBAAc,6BAA6B;AAAA,IAC7C,OAAO;AACL,qBAAe,IAAI;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,eAAe,CAAC;AAGpB,MAAI,iBAAiB;AACnB,WAAO;AAAA,EACT;AAGA,SAAO,0BAA0B;AACnC;","names":[]}
@@ -77,8 +77,8 @@ var emptyCopilotContext = {
77
77
  setLangGraphInterruptAction: () => null,
78
78
  removeLangGraphInterruptAction: () => null,
79
79
  onError: void 0,
80
- suggestions: [],
81
- setSuggestions: () => {
80
+ bannerError: null,
81
+ setBannerError: () => {
82
82
  }
83
83
  };
84
84
  var CopilotContext = React.createContext(emptyCopilotContext);
@@ -97,4 +97,4 @@ export {
97
97
  CopilotContext,
98
98
  useCopilotContext
99
99
  };
100
- //# sourceMappingURL=chunk-XGRBCWK6.mjs.map
100
+ //# sourceMappingURL=chunk-TEMLWRRT.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/context/copilot-context.tsx"],"sourcesContent":["import {\n CopilotCloudConfig,\n FunctionCallHandler,\n CopilotErrorHandler,\n CopilotKitError,\n} from \"@copilotkit/shared\";\nimport {\n ActionRenderProps,\n CatchAllActionRenderProps,\n FrontendAction,\n} from \"../types/frontend-action\";\nimport React from \"react\";\nimport { TreeNodeId, Tree } from \"../hooks/use-tree\";\nimport { DocumentPointer } from \"../types\";\nimport { CopilotChatSuggestionConfiguration } from \"../types/chat-suggestion-configuration\";\nimport { CoAgentStateRender, CoAgentStateRenderProps } from \"../types/coagent-action\";\nimport { CoagentState } from \"../types/coagent-state\";\nimport {\n CopilotRuntimeClient,\n ExtensionsInput,\n ForwardedParametersInput,\n} from \"@copilotkit/runtime-client-gql\";\nimport { Agent } from \"@copilotkit/runtime-client-gql\";\nimport {\n LangGraphInterruptAction,\n LangGraphInterruptActionSetter,\n} from \"../types/interrupt-action\";\nimport { SuggestionItem } from \"../utils/suggestions\";\n\n/**\n * Interface for the configuration of the Copilot API.\n */\nexport interface CopilotApiConfig {\n /**\n * The public API key for Copilot Cloud.\n */\n publicApiKey?: string;\n\n /**\n * The configuration for Copilot Cloud.\n */\n cloud?: CopilotCloudConfig;\n\n /**\n * The endpoint for the chat API.\n */\n chatApiEndpoint: string;\n\n /**\n * The endpoint for the Copilot transcribe audio service.\n */\n transcribeAudioUrl?: string;\n\n /**\n * The endpoint for the Copilot text to speech service.\n */\n textToSpeechUrl?: string;\n\n /**\n * additional headers to be sent with the request\n * @default {}\n * @example\n * ```\n * {\n * 'Authorization': 'Bearer your_token_here'\n * }\n * ```\n */\n headers: Record<string, string>;\n\n /**\n * Custom properties to be sent with the request\n * @default {}\n * @example\n * ```\n * {\n * 'user_id': 'user_id'\n * }\n * ```\n */\n properties?: Record<string, any>;\n\n /**\n * Indicates whether the user agent should send or receive cookies from the other domain\n * in the case of cross-origin requests.\n */\n credentials?: RequestCredentials;\n\n /**\n * Optional configuration for connecting to Model Context Protocol (MCP) servers.\n * This is typically derived from the CopilotKitProps and used internally.\n * @experimental\n */\n mcpServers?: Array<{ endpoint: string; apiKey?: string }>;\n}\n\nexport type InChatRenderFunction<TProps = ActionRenderProps<any> | CatchAllActionRenderProps<any>> =\n (props: TProps) => string | JSX.Element;\nexport type CoagentInChatRenderFunction = (\n props: CoAgentStateRenderProps<any>,\n) => string | JSX.Element | undefined | null;\n\nexport interface ChatComponentsCache {\n actions: Record<string, InChatRenderFunction | string>;\n coAgentStateRenders: Record<string, CoagentInChatRenderFunction | string>;\n}\n\nexport interface AgentSession {\n agentName: string;\n threadId?: string;\n nodeName?: string;\n}\n\nexport interface AuthState {\n status: \"authenticated\" | \"unauthenticated\";\n authHeaders: Record<string, string>;\n userId?: string;\n metadata?: Record<string, any>;\n}\n\nexport type ActionName = string;\nexport type ContextTree = Tree;\n\nexport interface CopilotContextParams {\n // function-calling\n actions: Record<string, FrontendAction<any>>;\n setAction: (id: string, action: FrontendAction<any>) => void;\n removeAction: (id: string) => void;\n\n // coagent actions\n coAgentStateRenders: Record<string, CoAgentStateRender<any>>;\n setCoAgentStateRender: (id: string, stateRender: CoAgentStateRender<any>) => void;\n removeCoAgentStateRender: (id: string) => void;\n\n chatComponentsCache: React.RefObject<ChatComponentsCache>;\n\n getFunctionCallHandler: (\n customEntryPoints?: Record<string, FrontendAction<any>>,\n ) => FunctionCallHandler;\n\n // text context\n addContext: (context: string, parentId?: string, categories?: string[]) => TreeNodeId;\n removeContext: (id: TreeNodeId) => void;\n getAllContext: () => Tree;\n getContextString: (documents: DocumentPointer[], categories: string[]) => string;\n\n // document context\n addDocumentContext: (documentPointer: DocumentPointer, categories?: string[]) => TreeNodeId;\n removeDocumentContext: (documentId: string) => void;\n getDocumentsContext: (categories: string[]) => DocumentPointer[];\n\n isLoading: boolean;\n setIsLoading: React.Dispatch<React.SetStateAction<boolean>>;\n\n chatSuggestionConfiguration: { [key: string]: CopilotChatSuggestionConfiguration };\n addChatSuggestionConfiguration: (\n id: string,\n suggestion: CopilotChatSuggestionConfiguration,\n ) => void;\n removeChatSuggestionConfiguration: (id: string) => void;\n\n chatInstructions: string;\n setChatInstructions: React.Dispatch<React.SetStateAction<string>>;\n\n additionalInstructions?: string[];\n setAdditionalInstructions: React.Dispatch<React.SetStateAction<string[]>>;\n\n // api endpoints\n copilotApiConfig: CopilotApiConfig;\n\n showDevConsole: boolean;\n\n // agents\n coagentStates: Record<string, CoagentState>;\n setCoagentStates: React.Dispatch<React.SetStateAction<Record<string, CoagentState>>>;\n coagentStatesRef: React.RefObject<Record<string, CoagentState>>;\n setCoagentStatesWithRef: (\n value:\n | Record<string, CoagentState>\n | ((prev: Record<string, CoagentState>) => Record<string, CoagentState>),\n ) => void;\n\n agentSession: AgentSession | null;\n setAgentSession: React.Dispatch<React.SetStateAction<AgentSession | null>>;\n\n agentLock: string | null;\n\n threadId: string;\n setThreadId: React.Dispatch<React.SetStateAction<string>>;\n\n runId: string | null;\n setRunId: React.Dispatch<React.SetStateAction<string | null>>;\n\n // The chat abort controller can be used to stop generation globally,\n // i.e. when using `stop()` from `useChat`\n chatAbortControllerRef: React.MutableRefObject<AbortController | null>;\n\n // runtime\n runtimeClient: CopilotRuntimeClient;\n\n /**\n * The forwarded parameters to use for the task.\n */\n forwardedParameters?: Partial<Pick<ForwardedParametersInput, \"temperature\">>;\n availableAgents: Agent[];\n\n /**\n * The auth states for the CopilotKit.\n */\n authStates_c?: Record<ActionName, AuthState>;\n setAuthStates_c?: React.Dispatch<React.SetStateAction<Record<ActionName, AuthState>>>;\n\n /**\n * The auth config for the CopilotKit.\n */\n authConfig_c?: {\n SignInComponent: React.ComponentType<{\n onSignInComplete: (authState: AuthState) => void;\n }>;\n };\n\n extensions: ExtensionsInput;\n setExtensions: React.Dispatch<React.SetStateAction<ExtensionsInput>>;\n langGraphInterruptAction: LangGraphInterruptAction | null;\n setLangGraphInterruptAction: LangGraphInterruptActionSetter;\n removeLangGraphInterruptAction: () => void;\n\n /**\n * Optional trace handler for comprehensive debugging and observability.\n */\n onError?: CopilotErrorHandler;\n\n // banner error state\n bannerError: CopilotKitError | null;\n setBannerError: React.Dispatch<React.SetStateAction<CopilotKitError | null>>;\n}\n\nconst emptyCopilotContext: CopilotContextParams = {\n actions: {},\n setAction: () => {},\n removeAction: () => {},\n\n coAgentStateRenders: {},\n setCoAgentStateRender: () => {},\n removeCoAgentStateRender: () => {},\n\n chatComponentsCache: { current: { actions: {}, coAgentStateRenders: {} } },\n getContextString: (documents: DocumentPointer[], categories: string[]) =>\n returnAndThrowInDebug(\"\"),\n addContext: () => \"\",\n removeContext: () => {},\n getAllContext: () => [],\n\n getFunctionCallHandler: () => returnAndThrowInDebug(async () => {}),\n\n isLoading: false,\n setIsLoading: () => returnAndThrowInDebug(false),\n\n chatInstructions: \"\",\n setChatInstructions: () => returnAndThrowInDebug(\"\"),\n\n additionalInstructions: [],\n setAdditionalInstructions: () => returnAndThrowInDebug([]),\n\n getDocumentsContext: (categories: string[]) => returnAndThrowInDebug([]),\n addDocumentContext: () => returnAndThrowInDebug(\"\"),\n removeDocumentContext: () => {},\n runtimeClient: {} as any,\n\n copilotApiConfig: new (class implements CopilotApiConfig {\n get chatApiEndpoint(): string {\n throw new Error(\"Remember to wrap your app in a `<CopilotKit> {...} </CopilotKit>` !!!\");\n }\n\n get headers(): Record<string, string> {\n return {};\n }\n get body(): Record<string, any> {\n return {};\n }\n })(),\n\n chatSuggestionConfiguration: {},\n addChatSuggestionConfiguration: () => {},\n removeChatSuggestionConfiguration: () => {},\n showDevConsole: false,\n coagentStates: {},\n setCoagentStates: () => {},\n coagentStatesRef: { current: {} },\n setCoagentStatesWithRef: () => {},\n agentSession: null,\n setAgentSession: () => {},\n forwardedParameters: {},\n agentLock: null,\n threadId: \"\",\n setThreadId: () => {},\n runId: null,\n setRunId: () => {},\n chatAbortControllerRef: { current: null },\n availableAgents: [],\n extensions: {},\n setExtensions: () => {},\n langGraphInterruptAction: null,\n setLangGraphInterruptAction: () => null,\n removeLangGraphInterruptAction: () => null,\n onError: undefined,\n bannerError: null,\n setBannerError: () => {},\n};\n\nexport const CopilotContext = React.createContext<CopilotContextParams>(emptyCopilotContext);\n\nexport function useCopilotContext(): CopilotContextParams {\n const context = React.useContext(CopilotContext);\n if (context === emptyCopilotContext) {\n throw new Error(\"Remember to wrap your app in a `<CopilotKit> {...} </CopilotKit>` !!!\");\n }\n return context;\n}\n\nfunction returnAndThrowInDebug<T>(_value: T): T {\n throw new Error(\"Remember to wrap your app in a `<CopilotKit> {...} </CopilotKit>` !!!\");\n}\n"],"mappings":";;;;;AAWA,OAAO,WAAW;AAkOlB,IAAM,sBAA4C;AAAA,EAChD,SAAS,CAAC;AAAA,EACV,WAAW,MAAM;AAAA,EAAC;AAAA,EAClB,cAAc,MAAM;AAAA,EAAC;AAAA,EAErB,qBAAqB,CAAC;AAAA,EACtB,uBAAuB,MAAM;AAAA,EAAC;AAAA,EAC9B,0BAA0B,MAAM;AAAA,EAAC;AAAA,EAEjC,qBAAqB,EAAE,SAAS,EAAE,SAAS,CAAC,GAAG,qBAAqB,CAAC,EAAE,EAAE;AAAA,EACzE,kBAAkB,CAAC,WAA8B,eAC/C,sBAAsB,EAAE;AAAA,EAC1B,YAAY,MAAM;AAAA,EAClB,eAAe,MAAM;AAAA,EAAC;AAAA,EACtB,eAAe,MAAM,CAAC;AAAA,EAEtB,wBAAwB,MAAM,sBAAsB,MAAY;AAAA,EAAC,EAAC;AAAA,EAElE,WAAW;AAAA,EACX,cAAc,MAAM,sBAAsB,KAAK;AAAA,EAE/C,kBAAkB;AAAA,EAClB,qBAAqB,MAAM,sBAAsB,EAAE;AAAA,EAEnD,wBAAwB,CAAC;AAAA,EACzB,2BAA2B,MAAM,sBAAsB,CAAC,CAAC;AAAA,EAEzD,qBAAqB,CAAC,eAAyB,sBAAsB,CAAC,CAAC;AAAA,EACvE,oBAAoB,MAAM,sBAAsB,EAAE;AAAA,EAClD,uBAAuB,MAAM;AAAA,EAAC;AAAA,EAC9B,eAAe,CAAC;AAAA,EAEhB,kBAAkB,IAAK,MAAkC;AAAA,IACvD,IAAI,kBAA0B;AAC5B,YAAM,IAAI,MAAM,uEAAuE;AAAA,IACzF;AAAA,IAEA,IAAI,UAAkC;AACpC,aAAO,CAAC;AAAA,IACV;AAAA,IACA,IAAI,OAA4B;AAC9B,aAAO,CAAC;AAAA,IACV;AAAA,EACF,EAAG;AAAA,EAEH,6BAA6B,CAAC;AAAA,EAC9B,gCAAgC,MAAM;AAAA,EAAC;AAAA,EACvC,mCAAmC,MAAM;AAAA,EAAC;AAAA,EAC1C,gBAAgB;AAAA,EAChB,eAAe,CAAC;AAAA,EAChB,kBAAkB,MAAM;AAAA,EAAC;AAAA,EACzB,kBAAkB,EAAE,SAAS,CAAC,EAAE;AAAA,EAChC,yBAAyB,MAAM;AAAA,EAAC;AAAA,EAChC,cAAc;AAAA,EACd,iBAAiB,MAAM;AAAA,EAAC;AAAA,EACxB,qBAAqB,CAAC;AAAA,EACtB,WAAW;AAAA,EACX,UAAU;AAAA,EACV,aAAa,MAAM;AAAA,EAAC;AAAA,EACpB,OAAO;AAAA,EACP,UAAU,MAAM;AAAA,EAAC;AAAA,EACjB,wBAAwB,EAAE,SAAS,KAAK;AAAA,EACxC,iBAAiB,CAAC;AAAA,EAClB,YAAY,CAAC;AAAA,EACb,eAAe,MAAM;AAAA,EAAC;AAAA,EACtB,0BAA0B;AAAA,EAC1B,6BAA6B,MAAM;AAAA,EACnC,gCAAgC,MAAM;AAAA,EACtC,SAAS;AAAA,EACT,aAAa;AAAA,EACb,gBAAgB,MAAM;AAAA,EAAC;AACzB;AAEO,IAAM,iBAAiB,MAAM,cAAoC,mBAAmB;AAEpF,SAAS,oBAA0C;AACxD,QAAM,UAAU,MAAM,WAAW,cAAc;AAC/C,MAAI,YAAY,qBAAqB;AACnC,UAAM,IAAI,MAAM,uEAAuE;AAAA,EACzF;AACA,SAAO;AACT;AAEA,SAAS,sBAAyB,QAAc;AAC9C,QAAM,IAAI,MAAM,uEAAuE;AACzF;","names":[]}
@@ -1,21 +1,29 @@
1
1
  import {
2
- shouldShowDevConsole
3
- } from "./chunk-GFJW4RIM.mjs";
2
+ CopilotMessagesContext
3
+ } from "./chunk-ZLQVRPDS.mjs";
4
4
  import {
5
- useToast
6
- } from "./chunk-YAF2LATQ.mjs";
5
+ shouldShowDevConsole
6
+ } from "./chunk-ICIK2BSB.mjs";
7
7
  import {
8
8
  useCopilotContext
9
- } from "./chunk-XGRBCWK6.mjs";
9
+ } from "./chunk-TEMLWRRT.mjs";
10
10
  import {
11
- CopilotMessagesContext
12
- } from "./chunk-DCTJZ742.mjs";
11
+ useToast
12
+ } from "./chunk-EFL5OBKN.mjs";
13
13
  import {
14
14
  __async
15
15
  } from "./chunk-SKC7AJIV.mjs";
16
16
 
17
17
  // src/components/copilot-provider/copilot-messages.tsx
18
- import { useEffect, useState, useRef, useCallback, useMemo } from "react";
18
+ import {
19
+ useEffect,
20
+ useState,
21
+ useRef,
22
+ useCallback,
23
+ useMemo,
24
+ createContext,
25
+ useContext
26
+ } from "react";
19
27
  import {
20
28
  loadMessagesFromJsonRepresentation
21
29
  } from "@copilotkit/runtime-client-gql";
@@ -28,11 +36,29 @@ import {
28
36
  CopilotKitErrorCode
29
37
  } from "@copilotkit/shared";
30
38
  import { jsx } from "react/jsx-runtime";
39
+ var MessagesTapContext = createContext(null);
40
+ function useMessagesTap() {
41
+ const tap = useContext(MessagesTapContext);
42
+ if (!tap)
43
+ throw new Error("useMessagesTap must be used inside <MessagesTapProvider>");
44
+ return tap;
45
+ }
46
+ function MessagesTapProvider({ children }) {
47
+ const messagesRef = useRef([]);
48
+ const tapRef = useRef({
49
+ getMessagesFromTap: () => messagesRef.current,
50
+ updateTapMessages: (messages) => {
51
+ messagesRef.current = messages;
52
+ }
53
+ });
54
+ return /* @__PURE__ */ jsx(MessagesTapContext.Provider, { value: tapRef.current, children });
55
+ }
31
56
  function CopilotMessages({ children }) {
32
57
  const [messages, setMessages] = useState([]);
33
58
  const lastLoadedThreadId = useRef();
34
59
  const lastLoadedAgentName = useRef();
35
60
  const lastLoadedMessages = useRef();
61
+ const { updateTapMessages } = useMessagesTap();
36
62
  const { threadId, agentSession, runtimeClient, showDevConsole, onError, copilotApiConfig } = useCopilotContext();
37
63
  const { setBannerError } = useToast();
38
64
  const traceUIError = useCallback(
@@ -169,13 +195,19 @@ function CopilotMessages({ children }) {
169
195
  });
170
196
  void fetchMessages();
171
197
  }, [threadId, agentSession == null ? void 0 : agentSession.agentName]);
198
+ useEffect(() => {
199
+ updateTapMessages(messages);
200
+ }, [messages, updateTapMessages]);
172
201
  const memoizedChildren = useMemo(() => children, [children]);
202
+ const [suggestions, setSuggestions] = useState([]);
173
203
  return /* @__PURE__ */ jsx(
174
204
  CopilotMessagesContext.Provider,
175
205
  {
176
206
  value: {
177
207
  messages,
178
- setMessages
208
+ setMessages,
209
+ suggestions,
210
+ setSuggestions
179
211
  },
180
212
  children: memoizedChildren
181
213
  }
@@ -183,6 +215,8 @@ function CopilotMessages({ children }) {
183
215
  }
184
216
 
185
217
  export {
218
+ useMessagesTap,
219
+ MessagesTapProvider,
186
220
  CopilotMessages
187
221
  };
188
- //# sourceMappingURL=chunk-PYULBXCD.mjs.map
222
+ //# sourceMappingURL=chunk-TWYUYC4F.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/copilot-provider/copilot-messages.tsx"],"sourcesContent":["/**\n * An internal context to separate the messages state (which is constantly changing) from the rest of CopilotKit context\n */\n\nimport {\n ReactNode,\n useEffect,\n useState,\n useRef,\n useCallback,\n useMemo,\n createContext,\n useContext,\n} from \"react\";\nimport { CopilotMessagesContext } from \"../../context/copilot-messages-context\";\nimport {\n loadMessagesFromJsonRepresentation,\n Message,\n GraphQLError,\n} from \"@copilotkit/runtime-client-gql\";\nimport { useCopilotContext } from \"../../context/copilot-context\";\nimport { useToast } from \"../toast/toast-provider\";\nimport { shouldShowDevConsole } from \"../../utils/dev-console\";\nimport {\n ErrorVisibility,\n CopilotKitApiDiscoveryError,\n CopilotKitRemoteEndpointDiscoveryError,\n CopilotKitAgentDiscoveryError,\n CopilotKitError,\n CopilotKitErrorCode,\n} from \"@copilotkit/shared\";\nimport { SuggestionItem } from \"../../utils/suggestions\";\n\n// Helper to determine if error should show as banner based on visibility and legacy patterns\nfunction shouldShowAsBanner(gqlError: GraphQLError): boolean {\n const extensions = gqlError.extensions;\n if (!extensions) return false;\n\n // Priority 1: Check error code for discovery errors (these should always be banners)\n const code = extensions.code as CopilotKitErrorCode;\n if (\n code === CopilotKitErrorCode.AGENT_NOT_FOUND ||\n code === CopilotKitErrorCode.API_NOT_FOUND ||\n code === CopilotKitErrorCode.REMOTE_ENDPOINT_NOT_FOUND ||\n code === CopilotKitErrorCode.CONFIGURATION_ERROR ||\n code === CopilotKitErrorCode.MISSING_PUBLIC_API_KEY_ERROR ||\n code === CopilotKitErrorCode.UPGRADE_REQUIRED_ERROR\n ) {\n return true;\n }\n\n // Priority 2: Check banner visibility\n if (extensions.visibility === ErrorVisibility.BANNER) {\n return true;\n }\n\n // Priority 3: Check for critical errors that should be banners regardless of formal classification\n const errorMessage = gqlError.message.toLowerCase();\n if (\n errorMessage.includes(\"api key\") ||\n errorMessage.includes(\"401\") ||\n errorMessage.includes(\"unauthorized\") ||\n errorMessage.includes(\"authentication\") ||\n errorMessage.includes(\"incorrect api key\")\n ) {\n return true;\n }\n\n // Priority 4: Legacy stack trace detection for discovery errors\n const originalError = extensions.originalError as any;\n if (originalError?.stack) {\n return (\n originalError.stack.includes(\"CopilotApiDiscoveryError\") ||\n originalError.stack.includes(\"CopilotKitRemoteEndpointDiscoveryError\") ||\n originalError.stack.includes(\"CopilotKitAgentDiscoveryError\")\n );\n }\n\n return false;\n}\n\n/**\n * MessagesTap is used to mitigate performance issues when we only need\n * a snapshot of the messages, not a continuously updating stream of messages.\n */\n\nexport type MessagesTap = {\n getMessagesFromTap: () => Message[];\n updateTapMessages: (messages: Message[]) => void;\n};\n\nconst MessagesTapContext = createContext<MessagesTap | null>(null);\n\nexport function useMessagesTap() {\n const tap = useContext(MessagesTapContext);\n if (!tap) throw new Error(\"useMessagesTap must be used inside <MessagesTapProvider>\");\n return tap;\n}\n\nexport function MessagesTapProvider({ children }: { children: React.ReactNode }) {\n const messagesRef = useRef<Message[]>([]);\n\n const tapRef = useRef<MessagesTap>({\n getMessagesFromTap: () => messagesRef.current,\n updateTapMessages: (messages: Message[]) => {\n messagesRef.current = messages;\n },\n });\n\n return (\n <MessagesTapContext.Provider value={tapRef.current}>{children}</MessagesTapContext.Provider>\n );\n}\n\n/**\n * CopilotKit messages context.\n */\n\nexport function CopilotMessages({ children }: { children: ReactNode }) {\n const [messages, setMessages] = useState<Message[]>([]);\n const lastLoadedThreadId = useRef<string>();\n const lastLoadedAgentName = useRef<string>();\n const lastLoadedMessages = useRef<string>();\n\n const { updateTapMessages } = useMessagesTap();\n\n const { threadId, agentSession, runtimeClient, showDevConsole, onError, copilotApiConfig } =\n useCopilotContext();\n const { setBannerError } = useToast();\n\n // Helper function to trace UI errors (similar to useCopilotRuntimeClient)\n const traceUIError = useCallback(\n async (error: CopilotKitError, originalError?: any) => {\n // Just check if onError and publicApiKey are defined\n if (!onError || !copilotApiConfig.publicApiKey) return;\n\n try {\n const traceEvent = {\n type: \"error\" as const,\n timestamp: Date.now(),\n context: {\n source: \"ui\" as const,\n request: {\n operation: \"loadAgentState\",\n url: copilotApiConfig.chatApiEndpoint,\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(traceEvent);\n } catch (traceError) {\n console.error(\"Error in CopilotMessages onError handler:\", traceError);\n }\n },\n [onError, copilotApiConfig.publicApiKey, copilotApiConfig.chatApiEndpoint],\n );\n\n const createStructuredError = (gqlError: GraphQLError): CopilotKitError | null => {\n const extensions = gqlError.extensions;\n const originalError = extensions?.originalError as any;\n\n // Priority: Check stack trace for discovery errors first\n if (originalError?.stack) {\n if (originalError.stack.includes(\"CopilotApiDiscoveryError\")) {\n return new CopilotKitApiDiscoveryError({ message: originalError.message });\n }\n if (originalError.stack.includes(\"CopilotKitRemoteEndpointDiscoveryError\")) {\n return new CopilotKitRemoteEndpointDiscoveryError({ message: originalError.message });\n }\n if (originalError.stack.includes(\"CopilotKitAgentDiscoveryError\")) {\n return new CopilotKitAgentDiscoveryError({\n agentName: \"\",\n availableAgents: [],\n });\n }\n }\n\n // Fallback: Use the formal error code if available\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 return null;\n };\n\n const handleGraphQLErrors = useCallback(\n (error: any) => {\n if (error.graphQLErrors?.length) {\n const graphQLErrors = error.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);\n\n if (!isDev) {\n console.error(\"CopilotKit Error (hidden in production):\", gqlError.message);\n return;\n }\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 other errors (including DEV_ONLY) show as banners for consistency\n const ckError = createStructuredError(gqlError);\n if (ckError) {\n setBannerError(ckError);\n // Trace the structured error\n traceUIError(ckError, gqlError);\n } else {\n // Fallback: create a generic error for unstructured GraphQL 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 }\n };\n\n // Process all errors as banners\n graphQLErrors.forEach(routeError);\n } else {\n const isDev = shouldShowDevConsole(showDevConsole);\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 }\n }\n },\n [setBannerError, showDevConsole, traceUIError],\n );\n\n useEffect(() => {\n if (!threadId || threadId === lastLoadedThreadId.current) return;\n if (\n threadId === lastLoadedThreadId.current &&\n agentSession?.agentName === lastLoadedAgentName.current\n ) {\n return;\n }\n\n const fetchMessages = async () => {\n if (!agentSession?.agentName) return;\n\n const result = await runtimeClient.loadAgentState({\n threadId,\n agentName: agentSession?.agentName,\n });\n\n // Check for GraphQL errors and manually trigger error handling\n if (result.error) {\n // Update refs to prevent infinite retries of the same failed request\n lastLoadedThreadId.current = threadId;\n lastLoadedAgentName.current = agentSession?.agentName;\n handleGraphQLErrors(result.error);\n return; // Don't try to process the data if there's an error\n }\n\n const newMessages = result.data?.loadAgentState?.messages;\n if (newMessages === lastLoadedMessages.current) return;\n\n if (result.data?.loadAgentState?.threadExists) {\n lastLoadedMessages.current = newMessages;\n lastLoadedThreadId.current = threadId;\n lastLoadedAgentName.current = agentSession?.agentName;\n\n const messages = loadMessagesFromJsonRepresentation(JSON.parse(newMessages || \"[]\"));\n setMessages(messages);\n }\n };\n void fetchMessages();\n }, [threadId, agentSession?.agentName]);\n\n useEffect(() => {\n updateTapMessages(messages);\n }, [messages, updateTapMessages]);\n\n const memoizedChildren = useMemo(() => children, [children]);\n const [suggestions, setSuggestions] = useState<SuggestionItem[]>([]);\n\n return (\n <CopilotMessagesContext.Provider\n value={{\n messages,\n setMessages,\n suggestions,\n setSuggestions,\n }}\n >\n {memoizedChildren}\n </CopilotMessagesContext.Provider>\n );\n}\n"],"mappings":"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","names":["messages"]}
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  useAsyncCallback
3
- } from "./chunk-3OQM3NEK.mjs";
4
- import {
5
- useToast
6
- } from "./chunk-YAF2LATQ.mjs";
3
+ } from "./chunk-N4WEHORG.mjs";
7
4
  import {
8
5
  useCopilotContext
9
- } from "./chunk-XGRBCWK6.mjs";
6
+ } from "./chunk-TEMLWRRT.mjs";
7
+ import {
8
+ useToast
9
+ } from "./chunk-EFL5OBKN.mjs";
10
10
  import {
11
11
  __async,
12
12
  __spreadValues
@@ -139,4 +139,4 @@ function isFrontendAction(action) {
139
139
  export {
140
140
  useCopilotAction
141
141
  };
142
- //# sourceMappingURL=chunk-WUORFPJ7.mjs.map
142
+ //# sourceMappingURL=chunk-X2DNXTME.mjs.map
@@ -2,7 +2,10 @@
2
2
  import React from "react";
3
3
  var emptyCopilotContext = {
4
4
  messages: [],
5
- setMessages: () => []
5
+ setMessages: () => [],
6
+ // suggestions state
7
+ suggestions: [],
8
+ setSuggestions: () => []
6
9
  };
7
10
  var CopilotMessagesContext = React.createContext(emptyCopilotContext);
8
11
  function useCopilotMessagesContext() {
@@ -19,4 +22,4 @@ export {
19
22
  CopilotMessagesContext,
20
23
  useCopilotMessagesContext
21
24
  };
22
- //# sourceMappingURL=chunk-DCTJZ742.mjs.map
25
+ //# sourceMappingURL=chunk-ZLQVRPDS.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/context/copilot-messages-context.tsx"],"sourcesContent":["/**\n * An internal context to separate the messages state (which is constantly changing) from the rest of CopilotKit context\n */\n\nimport { Message } from \"@copilotkit/runtime-client-gql\";\nimport React from \"react\";\nimport { SuggestionItem } from \"../utils/suggestions\";\n\nexport interface CopilotMessagesContextParams {\n messages: Message[];\n setMessages: React.Dispatch<React.SetStateAction<Message[]>>; // suggestions state\n suggestions: SuggestionItem[];\n setSuggestions: React.Dispatch<React.SetStateAction<SuggestionItem[]>>;\n}\n\nconst emptyCopilotContext: CopilotMessagesContextParams = {\n messages: [],\n setMessages: () => [],\n // suggestions state\n suggestions: [],\n setSuggestions: () => [],\n};\n\nexport const CopilotMessagesContext =\n React.createContext<CopilotMessagesContextParams>(emptyCopilotContext);\n\nexport function useCopilotMessagesContext(): CopilotMessagesContextParams {\n const context = React.useContext(CopilotMessagesContext);\n if (context === emptyCopilotContext) {\n throw new Error(\n \"A messages consuming component was not wrapped with `<CopilotMessages> {...} </CopilotMessages>`\",\n );\n }\n return context;\n}\n"],"mappings":";AAKA,OAAO,WAAW;AAUlB,IAAM,sBAAoD;AAAA,EACxD,UAAU,CAAC;AAAA,EACX,aAAa,MAAM,CAAC;AAAA;AAAA,EAEpB,aAAa,CAAC;AAAA,EACd,gBAAgB,MAAM,CAAC;AACzB;AAEO,IAAM,yBACX,MAAM,cAA4C,mBAAmB;AAEhE,SAAS,4BAA0D;AACxE,QAAM,UAAU,MAAM,WAAW,sBAAsB;AACvD,MAAI,YAAY,qBAAqB;AACnC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;","names":[]}
@@ -1,8 +1,24 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { ReactNode } from 'react';
3
+ import { Message } from '@copilotkit/runtime-client-gql';
3
4
 
5
+ /**
6
+ * MessagesTap is used to mitigate performance issues when we only need
7
+ * a snapshot of the messages, not a continuously updating stream of messages.
8
+ */
9
+ type MessagesTap = {
10
+ getMessagesFromTap: () => Message[];
11
+ updateTapMessages: (messages: Message[]) => void;
12
+ };
13
+ declare function useMessagesTap(): MessagesTap;
14
+ declare function MessagesTapProvider({ children }: {
15
+ children: React.ReactNode;
16
+ }): react_jsx_runtime.JSX.Element;
17
+ /**
18
+ * CopilotKit messages context.
19
+ */
4
20
  declare function CopilotMessages({ children }: {
5
21
  children: ReactNode;
6
22
  }): react_jsx_runtime.JSX.Element;
7
23
 
8
- export { CopilotMessages };
24
+ export { CopilotMessages, MessagesTap, MessagesTapProvider, useMessagesTap };
@@ -50,7 +50,9 @@ var __async = (__this, __arguments, generator) => {
50
50
  // src/components/copilot-provider/copilot-messages.tsx
51
51
  var copilot_messages_exports = {};
52
52
  __export(copilot_messages_exports, {
53
- CopilotMessages: () => CopilotMessages
53
+ CopilotMessages: () => CopilotMessages,
54
+ MessagesTapProvider: () => MessagesTapProvider,
55
+ useMessagesTap: () => useMessagesTap
54
56
  });
55
57
  module.exports = __toCommonJS(copilot_messages_exports);
56
58
  var import_react4 = require("react");
@@ -59,7 +61,10 @@ var import_react4 = require("react");
59
61
  var import_react = __toESM(require("react"));
60
62
  var emptyCopilotContext = {
61
63
  messages: [],
62
- setMessages: () => []
64
+ setMessages: () => [],
65
+ // suggestions state
66
+ suggestions: [],
67
+ setSuggestions: () => []
63
68
  };
64
69
  var CopilotMessagesContext = import_react.default.createContext(emptyCopilotContext);
65
70
 
@@ -141,8 +146,8 @@ var emptyCopilotContext2 = {
141
146
  setLangGraphInterruptAction: () => null,
142
147
  removeLangGraphInterruptAction: () => null,
143
148
  onError: void 0,
144
- suggestions: [],
145
- setSuggestions: () => {
149
+ bannerError: null,
150
+ setBannerError: () => {
146
151
  }
147
152
  };
148
153
  var CopilotContext = import_react2.default.createContext(emptyCopilotContext2);
@@ -171,18 +176,44 @@ function useToast() {
171
176
  }
172
177
 
173
178
  // src/utils/dev-console.ts
179
+ function isLocalhost() {
180
+ if (typeof window === "undefined")
181
+ return false;
182
+ return window.location.hostname === "localhost" || window.location.hostname === "127.0.0.1" || window.location.hostname === "0.0.0.0";
183
+ }
174
184
  function shouldShowDevConsole(showDevConsole) {
175
- return showDevConsole;
185
+ if (showDevConsole !== void 0) {
186
+ return showDevConsole;
187
+ }
188
+ return isLocalhost();
176
189
  }
177
190
 
178
191
  // src/components/copilot-provider/copilot-messages.tsx
179
192
  var import_shared2 = require("@copilotkit/shared");
180
193
  var import_jsx_runtime2 = require("react/jsx-runtime");
194
+ var MessagesTapContext = (0, import_react4.createContext)(null);
195
+ function useMessagesTap() {
196
+ const tap = (0, import_react4.useContext)(MessagesTapContext);
197
+ if (!tap)
198
+ throw new Error("useMessagesTap must be used inside <MessagesTapProvider>");
199
+ return tap;
200
+ }
201
+ function MessagesTapProvider({ children }) {
202
+ const messagesRef = (0, import_react4.useRef)([]);
203
+ const tapRef = (0, import_react4.useRef)({
204
+ getMessagesFromTap: () => messagesRef.current,
205
+ updateTapMessages: (messages) => {
206
+ messagesRef.current = messages;
207
+ }
208
+ });
209
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(MessagesTapContext.Provider, { value: tapRef.current, children });
210
+ }
181
211
  function CopilotMessages({ children }) {
182
212
  const [messages, setMessages] = (0, import_react4.useState)([]);
183
213
  const lastLoadedThreadId = (0, import_react4.useRef)();
184
214
  const lastLoadedAgentName = (0, import_react4.useRef)();
185
215
  const lastLoadedMessages = (0, import_react4.useRef)();
216
+ const { updateTapMessages } = useMessagesTap();
186
217
  const { threadId, agentSession, runtimeClient, showDevConsole, onError, copilotApiConfig } = useCopilotContext();
187
218
  const { setBannerError } = useToast();
188
219
  const traceUIError = (0, import_react4.useCallback)(
@@ -319,13 +350,19 @@ function CopilotMessages({ children }) {
319
350
  });
320
351
  void fetchMessages();
321
352
  }, [threadId, agentSession == null ? void 0 : agentSession.agentName]);
353
+ (0, import_react4.useEffect)(() => {
354
+ updateTapMessages(messages);
355
+ }, [messages, updateTapMessages]);
322
356
  const memoizedChildren = (0, import_react4.useMemo)(() => children, [children]);
357
+ const [suggestions, setSuggestions] = (0, import_react4.useState)([]);
323
358
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
324
359
  CopilotMessagesContext.Provider,
325
360
  {
326
361
  value: {
327
362
  messages,
328
- setMessages
363
+ setMessages,
364
+ suggestions,
365
+ setSuggestions
329
366
  },
330
367
  children: memoizedChildren
331
368
  }
@@ -333,6 +370,8 @@ function CopilotMessages({ children }) {
333
370
  }
334
371
  // Annotate the CommonJS export names for ESM import in node:
335
372
  0 && (module.exports = {
336
- CopilotMessages
373
+ CopilotMessages,
374
+ MessagesTapProvider,
375
+ useMessagesTap
337
376
  });
338
377
  //# sourceMappingURL=copilot-messages.js.map