@copilotkit/react-core 0.0.0-fix-debug-infosys-20251107162427 → 0.0.0-fix-restore-handle-method-node-http-20260105204107

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 (355) hide show
  1. package/CHANGELOG.md +309 -4
  2. package/dist/chunk-36KQV2NA.mjs +1 -0
  3. package/dist/{chunk-OKCYPO4I.mjs → chunk-3MHWEKFN.mjs} +5 -5
  4. package/dist/chunk-4RRMC7L2.mjs +32 -0
  5. package/dist/chunk-4RRMC7L2.mjs.map +1 -0
  6. package/dist/{chunk-E3624YDU.mjs → chunk-53K6WNJG.mjs} +8 -6
  7. package/dist/{chunk-E3624YDU.mjs.map → chunk-53K6WNJG.mjs.map} +1 -1
  8. package/dist/{chunk-N4WEHORG.mjs → chunk-6PUNP7CD.mjs} +4 -4
  9. package/dist/chunk-6PUNP7CD.mjs.map +1 -0
  10. package/dist/chunk-7DTB7S5V.mjs +83 -0
  11. package/dist/chunk-7DTB7S5V.mjs.map +1 -0
  12. package/dist/{chunk-BBUQMG45.mjs → chunk-7IBF6RBW.mjs} +3 -3
  13. package/dist/{chunk-BBUQMG45.mjs.map → chunk-7IBF6RBW.mjs.map} +1 -1
  14. package/dist/chunk-A6NKSGH3.mjs +1 -0
  15. package/dist/{chunk-MGWRDFBE.mjs → chunk-ABWT4DRT.mjs} +2 -2
  16. package/dist/{chunk-EUX2P2E7.mjs → chunk-AFNWX62Q.mjs} +11 -9
  17. package/dist/chunk-AFNWX62Q.mjs.map +1 -0
  18. package/dist/{chunk-MQYWH4E6.mjs → chunk-BUSWSDYO.mjs} +2 -2
  19. package/dist/chunk-CDUIA2WM.mjs +60 -0
  20. package/dist/chunk-CDUIA2WM.mjs.map +1 -0
  21. package/dist/chunk-CYDWEPFL.mjs +1 -0
  22. package/dist/{chunk-ZLQVRPDS.mjs → chunk-DMLQZG75.mjs} +1 -1
  23. package/dist/chunk-DMLQZG75.mjs.map +1 -0
  24. package/dist/{chunk-U7QULEVO.mjs → chunk-E7SE25ZU.mjs} +3 -3
  25. package/dist/chunk-F555TVE4.mjs +33 -0
  26. package/dist/chunk-F555TVE4.mjs.map +1 -0
  27. package/dist/chunk-FD6FGKYY.mjs +1 -0
  28. package/dist/chunk-FDOMAPJY.mjs +59 -0
  29. package/dist/chunk-FDOMAPJY.mjs.map +1 -0
  30. package/dist/{chunk-OAGAFMUM.mjs → chunk-FQFXYAV7.mjs} +6 -5
  31. package/dist/{chunk-OAGAFMUM.mjs.map → chunk-FQFXYAV7.mjs.map} +1 -1
  32. package/dist/chunk-GPEJNVE5.mjs +80 -0
  33. package/dist/chunk-GPEJNVE5.mjs.map +1 -0
  34. package/dist/chunk-I76HKHPJ.mjs +32 -0
  35. package/dist/chunk-I76HKHPJ.mjs.map +1 -0
  36. package/dist/{chunk-C6IANC2R.mjs → chunk-INPM7YKW.mjs} +9 -45
  37. package/dist/chunk-INPM7YKW.mjs.map +1 -0
  38. package/dist/chunk-JD7BAH7U.mjs +1 -0
  39. package/dist/chunk-LSHFN2Y5.mjs +349 -0
  40. package/dist/chunk-LSHFN2Y5.mjs.map +1 -0
  41. package/dist/chunk-NB2FKV2V.mjs +1 -0
  42. package/dist/chunk-NBK4KBLX.mjs +54 -0
  43. package/dist/chunk-NBK4KBLX.mjs.map +1 -0
  44. package/dist/chunk-QNUAXSDP.mjs +166 -0
  45. package/dist/chunk-QNUAXSDP.mjs.map +1 -0
  46. package/dist/chunk-RB2TXKFP.mjs +551 -0
  47. package/dist/chunk-RB2TXKFP.mjs.map +1 -0
  48. package/dist/{chunk-EDBI5PCJ.mjs → chunk-RW2Y52HO.mjs} +2 -2
  49. package/dist/chunk-RW2Y52HO.mjs.map +1 -0
  50. package/dist/{chunk-N4VN2B5S.mjs → chunk-SNON4QA6.mjs} +4 -4
  51. package/dist/chunk-SPCZTZCY.mjs +1 -0
  52. package/dist/chunk-SPCZTZCY.mjs.map +1 -0
  53. package/dist/chunk-VV56AVPB.mjs +125 -0
  54. package/dist/chunk-VV56AVPB.mjs.map +1 -0
  55. package/dist/chunk-WF65O6HX.mjs +66 -0
  56. package/dist/chunk-WF65O6HX.mjs.map +1 -0
  57. package/dist/chunk-XDFVCQD3.mjs +27 -0
  58. package/dist/chunk-XDFVCQD3.mjs.map +1 -0
  59. package/dist/{chunk-GT5WI3AF.mjs → chunk-YTQHRJUA.mjs} +7 -9
  60. package/dist/chunk-YTQHRJUA.mjs.map +1 -0
  61. package/dist/{chunk-5FHSUKQL.mjs → chunk-YYN33GSG.mjs} +5 -2
  62. package/dist/chunk-YYN33GSG.mjs.map +1 -0
  63. package/dist/chunk-Z6JV2LRY.mjs +37 -0
  64. package/dist/chunk-Z6JV2LRY.mjs.map +1 -0
  65. package/dist/chunk-ZVF5Q6IH.mjs +29 -0
  66. package/dist/chunk-ZVF5Q6IH.mjs.map +1 -0
  67. package/dist/chunk-ZYTXB6HH.mjs +151 -0
  68. package/dist/chunk-ZYTXB6HH.mjs.map +1 -0
  69. package/dist/components/CopilotListeners.d.ts +3 -0
  70. package/dist/components/CopilotListeners.js +101 -0
  71. package/dist/components/CopilotListeners.js.map +1 -0
  72. package/dist/components/CopilotListeners.mjs +9 -0
  73. package/dist/components/CopilotListeners.mjs.map +1 -0
  74. package/dist/components/copilot-provider/copilot-messages.js +14 -48
  75. package/dist/components/copilot-provider/copilot-messages.js.map +1 -1
  76. package/dist/components/copilot-provider/copilot-messages.mjs +3 -3
  77. package/dist/components/copilot-provider/copilotkit-props.d.ts +15 -2
  78. package/dist/components/copilot-provider/copilotkit-props.js.map +1 -1
  79. package/dist/components/copilot-provider/copilotkit.d.ts +2 -1
  80. package/dist/components/copilot-provider/copilotkit.js +491 -1361
  81. package/dist/components/copilot-provider/copilotkit.js.map +1 -1
  82. package/dist/components/copilot-provider/copilotkit.mjs +15 -13
  83. package/dist/components/copilot-provider/index.d.ts +2 -1
  84. package/dist/components/copilot-provider/index.js +491 -1361
  85. package/dist/components/copilot-provider/index.js.map +1 -1
  86. package/dist/components/copilot-provider/index.mjs +16 -13
  87. package/dist/components/dev-console/console-trigger.js +10 -8
  88. package/dist/components/dev-console/console-trigger.js.map +1 -1
  89. package/dist/components/dev-console/console-trigger.mjs +226 -6
  90. package/dist/components/dev-console/console-trigger.mjs.map +1 -1
  91. package/dist/components/dev-console/developer-console-modal.js +10 -8
  92. package/dist/components/dev-console/developer-console-modal.js.map +1 -1
  93. package/dist/components/dev-console/developer-console-modal.mjs +3 -3
  94. package/dist/components/error-boundary/error-boundary.d.ts +7 -7
  95. package/dist/components/error-boundary/error-boundary.js +3 -3
  96. package/dist/components/error-boundary/error-boundary.js.map +1 -1
  97. package/dist/components/error-boundary/error-boundary.mjs +3 -3
  98. package/dist/components/error-boundary/error-utils.d.ts +1 -1
  99. package/dist/components/error-boundary/error-utils.js +3 -3
  100. package/dist/components/error-boundary/error-utils.js.map +1 -1
  101. package/dist/components/error-boundary/error-utils.mjs +1 -1
  102. package/dist/components/index.d.ts +2 -1
  103. package/dist/components/index.js +491 -1361
  104. package/dist/components/index.js.map +1 -1
  105. package/dist/components/index.mjs +17 -13
  106. package/dist/components/toast/exclamation-mark-icon.d.ts +2 -2
  107. package/dist/components/toast/toast-provider.d.ts +3 -3
  108. package/dist/components/usage-banner.d.ts +2 -2
  109. package/dist/context/coagent-state-renders-context.d.ts +24 -0
  110. package/dist/context/coagent-state-renders-context.js +91 -0
  111. package/dist/context/coagent-state-renders-context.js.map +1 -0
  112. package/dist/context/coagent-state-renders-context.mjs +12 -0
  113. package/dist/context/coagent-state-renders-context.mjs.map +1 -0
  114. package/dist/context/copilot-context.d.ts +1 -1
  115. package/dist/context/copilot-context.js +10 -8
  116. package/dist/context/copilot-context.js.map +1 -1
  117. package/dist/context/copilot-context.mjs +1 -1
  118. package/dist/context/copilot-messages-context.d.ts +18 -11
  119. package/dist/context/copilot-messages-context.js.map +1 -1
  120. package/dist/context/copilot-messages-context.mjs +1 -1
  121. package/dist/context/index.d.ts +6 -2
  122. package/dist/context/index.js +110 -10
  123. package/dist/context/index.js.map +1 -1
  124. package/dist/context/index.mjs +23 -7
  125. package/dist/context/threads-context.d.ts +16 -0
  126. package/dist/context/threads-context.js +59 -0
  127. package/dist/context/threads-context.js.map +1 -0
  128. package/dist/context/threads-context.mjs +12 -0
  129. package/dist/context/threads-context.mjs.map +1 -0
  130. package/dist/{copilot-context-cf9de848.d.ts → copilot-context-ec77e921.d.ts} +36 -32
  131. package/dist/hooks/index.d.ts +9 -6
  132. package/dist/hooks/index.js +1109 -1841
  133. package/dist/hooks/index.js.map +1 -1
  134. package/dist/hooks/index.mjs +45 -53
  135. package/dist/hooks/use-agent-nodename.d.ts +3 -0
  136. package/dist/hooks/use-agent-nodename.js +56 -0
  137. package/dist/hooks/use-agent-nodename.js.map +1 -0
  138. package/dist/hooks/use-agent-nodename.mjs +8 -0
  139. package/dist/hooks/use-agent-nodename.mjs.map +1 -0
  140. package/dist/hooks/use-coagent-state-render-bridge.d.ts +100 -0
  141. package/dist/hooks/use-coagent-state-render-bridge.js +214 -0
  142. package/dist/hooks/use-coagent-state-render-bridge.js.map +1 -0
  143. package/dist/hooks/use-coagent-state-render-bridge.mjs +15 -0
  144. package/dist/hooks/use-coagent-state-render-bridge.mjs.map +1 -0
  145. package/dist/hooks/use-coagent-state-render.js +31 -20
  146. package/dist/hooks/use-coagent-state-render.js.map +1 -1
  147. package/dist/hooks/use-coagent-state-render.mjs +3 -2
  148. package/dist/hooks/use-coagent.d.ts +2 -14
  149. package/dist/hooks/use-coagent.js +138 -1898
  150. package/dist/hooks/use-coagent.js.map +1 -1
  151. package/dist/hooks/use-coagent.mjs +2 -30
  152. package/dist/hooks/use-configure-chat-suggestions.d.ts +36 -0
  153. package/dist/hooks/use-configure-chat-suggestions.js +79 -0
  154. package/dist/hooks/use-configure-chat-suggestions.js.map +1 -0
  155. package/dist/hooks/use-configure-chat-suggestions.mjs +47 -0
  156. package/dist/hooks/use-configure-chat-suggestions.mjs.map +1 -0
  157. package/dist/hooks/use-copilot-action.d.ts +8 -45
  158. package/dist/hooks/use-copilot-action.js +219 -349
  159. package/dist/hooks/use-copilot-action.js.map +1 -1
  160. package/dist/hooks/use-copilot-action.mjs +4 -5
  161. package/dist/hooks/use-copilot-additional-instructions.js +10 -8
  162. package/dist/hooks/use-copilot-additional-instructions.js.map +1 -1
  163. package/dist/hooks/use-copilot-additional-instructions.mjs +2 -2
  164. package/dist/hooks/use-copilot-authenticated-action.js +236 -248
  165. package/dist/hooks/use-copilot-authenticated-action.js.map +1 -1
  166. package/dist/hooks/use-copilot-authenticated-action.mjs +6 -6
  167. package/dist/hooks/use-copilot-chat-headless_c.d.ts +2 -10
  168. package/dist/hooks/use-copilot-chat-headless_c.js +585 -1374
  169. package/dist/hooks/use-copilot-chat-headless_c.js.map +1 -1
  170. package/dist/hooks/use-copilot-chat-headless_c.mjs +12 -22
  171. package/dist/hooks/use-copilot-chat-suggestions.d.ts +35 -0
  172. package/dist/hooks/use-copilot-chat-suggestions.js +60 -0
  173. package/dist/hooks/use-copilot-chat-suggestions.js.map +1 -0
  174. package/dist/hooks/use-copilot-chat-suggestions.mjs +8 -0
  175. package/dist/hooks/use-copilot-chat-suggestions.mjs.map +1 -0
  176. package/dist/hooks/use-copilot-chat.d.ts +2 -10
  177. package/dist/hooks/use-copilot-chat.js +579 -1393
  178. package/dist/hooks/use-copilot-chat.js.map +1 -1
  179. package/dist/hooks/use-copilot-chat.mjs +12 -22
  180. package/dist/hooks/use-copilot-chat_internal.d.ts +77 -14
  181. package/dist/hooks/use-copilot-chat_internal.js +577 -1367
  182. package/dist/hooks/use-copilot-chat_internal.js.map +1 -1
  183. package/dist/hooks/use-copilot-chat_internal.mjs +13 -23
  184. package/dist/hooks/use-copilot-readable.d.ts +1 -1
  185. package/dist/hooks/use-copilot-readable.js +25 -152
  186. package/dist/hooks/use-copilot-readable.js.map +1 -1
  187. package/dist/hooks/use-copilot-readable.mjs +1 -2
  188. package/dist/hooks/use-default-tool.js +216 -349
  189. package/dist/hooks/use-default-tool.js.map +1 -1
  190. package/dist/hooks/use-default-tool.mjs +5 -6
  191. package/dist/hooks/use-flat-category-store.js +4 -1
  192. package/dist/hooks/use-flat-category-store.js.map +1 -1
  193. package/dist/hooks/use-flat-category-store.mjs +1 -1
  194. package/dist/hooks/use-frontend-tool.d.ts +3 -3
  195. package/dist/hooks/use-frontend-tool.js +42 -370
  196. package/dist/hooks/use-frontend-tool.js.map +1 -1
  197. package/dist/hooks/use-frontend-tool.mjs +1 -6
  198. package/dist/hooks/use-human-in-the-loop.d.ts +4 -3
  199. package/dist/hooks/use-human-in-the-loop.js +61 -393
  200. package/dist/hooks/use-human-in-the-loop.js.map +1 -1
  201. package/dist/hooks/use-human-in-the-loop.mjs +1 -6
  202. package/dist/hooks/use-langgraph-interrupt-render.d.ts +3 -2
  203. package/dist/hooks/use-langgraph-interrupt-render.js +157 -37
  204. package/dist/hooks/use-langgraph-interrupt-render.js.map +1 -1
  205. package/dist/hooks/use-langgraph-interrupt-render.mjs +7 -4
  206. package/dist/hooks/use-langgraph-interrupt.d.ts +1 -1
  207. package/dist/hooks/use-langgraph-interrupt.js +24 -1642
  208. package/dist/hooks/use-langgraph-interrupt.js.map +1 -1
  209. package/dist/hooks/use-langgraph-interrupt.mjs +2 -23
  210. package/dist/hooks/use-lazy-tool-renderer.d.ts +6 -0
  211. package/dist/hooks/use-lazy-tool-renderer.js +53 -0
  212. package/dist/hooks/use-lazy-tool-renderer.js.map +1 -0
  213. package/dist/hooks/use-lazy-tool-renderer.mjs +8 -0
  214. package/dist/hooks/use-lazy-tool-renderer.mjs.map +1 -0
  215. package/dist/hooks/use-make-copilot-document-readable.js +11 -9
  216. package/dist/hooks/use-make-copilot-document-readable.js.map +1 -1
  217. package/dist/hooks/use-make-copilot-document-readable.mjs +2 -2
  218. package/dist/hooks/use-render-tool-call.d.ts +7 -6
  219. package/dist/hooks/use-render-tool-call.js +36 -386
  220. package/dist/hooks/use-render-tool-call.js.map +1 -1
  221. package/dist/hooks/use-render-tool-call.mjs +1 -6
  222. package/dist/index.d.ts +11 -6
  223. package/dist/index.js +1456 -3033
  224. package/dist/index.js.map +1 -1
  225. package/dist/index.mjs +85 -68
  226. package/dist/lib/copilot-task.d.ts +2 -2
  227. package/dist/lib/copilot-task.js +1 -0
  228. package/dist/lib/copilot-task.js.map +1 -1
  229. package/dist/lib/copilot-task.mjs +18 -14
  230. package/dist/lib/index.d.ts +1 -1
  231. package/dist/lib/index.js +1 -0
  232. package/dist/lib/index.js.map +1 -1
  233. package/dist/lib/index.mjs +18 -14
  234. package/dist/setupTests.d.ts +2 -2
  235. package/dist/types/frontend-action.d.ts +5 -5
  236. package/dist/types/index.d.ts +4 -0
  237. package/dist/types/index.js.map +1 -1
  238. package/dist/types/index.mjs +2 -1
  239. package/dist/types/interrupt-action.d.ts +1 -1
  240. package/dist/types/interrupt-action.js.map +1 -1
  241. package/dist/types/interrupt-action.mjs +1 -0
  242. package/dist/utils/index.d.ts +0 -12
  243. package/dist/utils/index.js +6 -325
  244. package/dist/utils/index.js.map +1 -1
  245. package/dist/utils/index.mjs +1 -21
  246. package/dist/utils/utils.js.map +1 -1
  247. package/dist/v2/index.css +4 -0
  248. package/dist/v2/index.css.map +1 -0
  249. package/dist/v2/index.d.ts +2 -0
  250. package/dist/v2/index.js +27 -0
  251. package/dist/v2/index.js.map +1 -0
  252. package/dist/v2/index.mjs +6 -0
  253. package/dist/v2/index.mjs.map +1 -0
  254. package/jest.config.js +12 -0
  255. package/package.json +24 -10
  256. package/src/components/CopilotListeners.tsx +81 -0
  257. package/src/components/copilot-provider/copilot-messages.tsx +6 -48
  258. package/src/components/copilot-provider/copilotkit-props.tsx +15 -1
  259. package/src/components/copilot-provider/copilotkit.tsx +189 -148
  260. package/src/components/error-boundary/error-utils.tsx +3 -3
  261. package/src/context/coagent-state-renders-context.tsx +76 -0
  262. package/src/context/copilot-context.tsx +21 -21
  263. package/src/context/copilot-messages-context.tsx +3 -3
  264. package/src/context/index.ts +8 -0
  265. package/src/context/threads-context.tsx +41 -0
  266. package/src/hooks/__tests__/use-coagent-config.test.ts +189 -129
  267. package/src/hooks/index.ts +12 -3
  268. package/src/hooks/use-agent-nodename.ts +30 -0
  269. package/src/hooks/use-coagent-state-render-bridge.tsx +293 -0
  270. package/src/hooks/use-coagent-state-render.ts +4 -7
  271. package/src/hooks/use-coagent.ts +136 -247
  272. package/src/hooks/use-configure-chat-suggestions.tsx +86 -0
  273. package/src/hooks/use-copilot-action.ts +88 -199
  274. package/src/hooks/use-copilot-chat-headless_c.ts +2 -1
  275. package/src/hooks/use-copilot-chat-suggestions.tsx +124 -0
  276. package/src/hooks/use-copilot-chat.ts +4 -1
  277. package/src/hooks/use-copilot-chat_internal.ts +410 -263
  278. package/src/hooks/use-copilot-readable.ts +23 -25
  279. package/src/hooks/use-flat-category-store.ts +4 -3
  280. package/src/hooks/use-frontend-tool.ts +86 -8
  281. package/src/hooks/use-human-in-the-loop.ts +111 -13
  282. package/src/hooks/use-langgraph-interrupt-render.ts +108 -40
  283. package/src/hooks/use-langgraph-interrupt.ts +18 -48
  284. package/src/hooks/use-lazy-tool-renderer.tsx +30 -0
  285. package/src/hooks/use-make-copilot-document-readable.ts +1 -1
  286. package/src/hooks/use-render-tool-call.ts +73 -13
  287. package/src/lib/copilot-task.ts +1 -1
  288. package/src/types/index.ts +1 -0
  289. package/src/types/interrupt-action.ts +8 -7
  290. package/src/utils/index.ts +0 -3
  291. package/src/utils/utils.ts +7 -0
  292. package/src/v2/index.css +1 -0
  293. package/src/v2/index.ts +4 -0
  294. package/tsup.config.ts +1 -1
  295. package/dist/chunk-5FHSUKQL.mjs.map +0 -1
  296. package/dist/chunk-6GPVUMBU.mjs +0 -13
  297. package/dist/chunk-6GPVUMBU.mjs.map +0 -1
  298. package/dist/chunk-AKR2SSUJ.mjs +0 -22
  299. package/dist/chunk-AKR2SSUJ.mjs.map +0 -1
  300. package/dist/chunk-BXXJQ2BL.mjs +0 -239
  301. package/dist/chunk-BXXJQ2BL.mjs.map +0 -1
  302. package/dist/chunk-C6IANC2R.mjs.map +0 -1
  303. package/dist/chunk-DXEQPN43.mjs +0 -231
  304. package/dist/chunk-DXEQPN43.mjs.map +0 -1
  305. package/dist/chunk-DZTU6PGS.mjs +0 -1
  306. package/dist/chunk-EDBI5PCJ.mjs.map +0 -1
  307. package/dist/chunk-EUX2P2E7.mjs.map +0 -1
  308. package/dist/chunk-EVVO67QO.mjs +0 -25
  309. package/dist/chunk-EVVO67QO.mjs.map +0 -1
  310. package/dist/chunk-GGLAHG3I.mjs +0 -804
  311. package/dist/chunk-GGLAHG3I.mjs.map +0 -1
  312. package/dist/chunk-GT5WI3AF.mjs.map +0 -1
  313. package/dist/chunk-HDOG2RTM.mjs +0 -37
  314. package/dist/chunk-HDOG2RTM.mjs.map +0 -1
  315. package/dist/chunk-MIXSWZSB.mjs +0 -71
  316. package/dist/chunk-MIXSWZSB.mjs.map +0 -1
  317. package/dist/chunk-N4WEHORG.mjs.map +0 -1
  318. package/dist/chunk-NSBAWITG.mjs +0 -332
  319. package/dist/chunk-NSBAWITG.mjs.map +0 -1
  320. package/dist/chunk-OT5NHMEC.mjs +0 -723
  321. package/dist/chunk-OT5NHMEC.mjs.map +0 -1
  322. package/dist/chunk-T3376SZS.mjs +0 -142
  323. package/dist/chunk-T3376SZS.mjs.map +0 -1
  324. package/dist/chunk-YPBKY4KY.mjs +0 -1
  325. package/dist/chunk-YPSGKPDA.mjs +0 -1
  326. package/dist/chunk-ZLQVRPDS.mjs.map +0 -1
  327. package/dist/chunk-ZVOLWJCY.mjs +0 -47
  328. package/dist/chunk-ZVOLWJCY.mjs.map +0 -1
  329. package/dist/hooks/use-chat.d.ts +0 -145
  330. package/dist/hooks/use-chat.js +0 -1129
  331. package/dist/hooks/use-chat.js.map +0 -1
  332. package/dist/hooks/use-chat.mjs +0 -14
  333. package/dist/index-1f5b66ac.d.ts +0 -36
  334. package/dist/utils/extract.d.ts +0 -43
  335. package/dist/utils/extract.js +0 -208
  336. package/dist/utils/extract.js.map +0 -1
  337. package/dist/utils/extract.mjs +0 -25
  338. package/dist/utils/suggestions.d.ts +0 -11
  339. package/dist/utils/suggestions.js +0 -343
  340. package/dist/utils/suggestions.js.map +0 -1
  341. package/dist/utils/suggestions.mjs +0 -25
  342. package/src/hooks/use-chat.ts +0 -1142
  343. package/src/utils/extract.ts +0 -215
  344. package/src/utils/suggestions.ts +0 -208
  345. /package/dist/{chunk-DZTU6PGS.mjs.map → chunk-36KQV2NA.mjs.map} +0 -0
  346. /package/dist/{chunk-OKCYPO4I.mjs.map → chunk-3MHWEKFN.mjs.map} +0 -0
  347. /package/dist/{chunk-YPBKY4KY.mjs.map → chunk-A6NKSGH3.mjs.map} +0 -0
  348. /package/dist/{chunk-MGWRDFBE.mjs.map → chunk-ABWT4DRT.mjs.map} +0 -0
  349. /package/dist/{chunk-MQYWH4E6.mjs.map → chunk-BUSWSDYO.mjs.map} +0 -0
  350. /package/dist/{chunk-YPSGKPDA.mjs.map → chunk-CYDWEPFL.mjs.map} +0 -0
  351. /package/dist/{chunk-U7QULEVO.mjs.map → chunk-E7SE25ZU.mjs.map} +0 -0
  352. /package/dist/{hooks/use-chat.mjs.map → chunk-FD6FGKYY.mjs.map} +0 -0
  353. /package/dist/{utils/extract.mjs.map → chunk-JD7BAH7U.mjs.map} +0 -0
  354. /package/dist/{utils/suggestions.mjs.map → chunk-NB2FKV2V.mjs.map} +0 -0
  355. /package/dist/{chunk-N4VN2B5S.mjs.map → chunk-SNON4QA6.mjs.map} +0 -0
@@ -85,7 +85,8 @@ __export(copilotkit_exports, {
85
85
  defaultCopilotContextCategories: () => defaultCopilotContextCategories
86
86
  });
87
87
  module.exports = __toCommonJS(copilotkit_exports);
88
- var import_react11 = require("react");
88
+ var import_react14 = require("react");
89
+ var import_react15 = require("@copilotkitnext/react");
89
90
 
90
91
  // src/context/copilot-context.tsx
91
92
  var import_react = __toESM(require("react"));
@@ -95,10 +96,8 @@ var emptyCopilotContext = {
95
96
  },
96
97
  removeAction: () => {
97
98
  },
98
- coAgentStateRenders: {},
99
- setCoAgentStateRender: () => {
100
- },
101
- removeCoAgentStateRender: () => {
99
+ setRegisteredActions: () => "",
100
+ removeRegisteredAction: () => {
102
101
  },
103
102
  chatComponentsCache: { current: { actions: {}, coAgentStateRenders: {} } },
104
103
  getContextString: (documents, categories) => returnAndThrowInDebug(""),
@@ -118,7 +117,6 @@ var emptyCopilotContext = {
118
117
  addDocumentContext: () => returnAndThrowInDebug(""),
119
118
  removeDocumentContext: () => {
120
119
  },
121
- runtimeClient: {},
122
120
  copilotApiConfig: new class {
123
121
  get chatApiEndpoint() {
124
122
  throw new Error("Remember to wrap your app in a `<CopilotKit> {...} </CopilotKit>` !!!");
@@ -158,10 +156,15 @@ var emptyCopilotContext = {
158
156
  extensions: {},
159
157
  setExtensions: () => {
160
158
  },
161
- langGraphInterruptAction: null,
162
- setLangGraphInterruptAction: () => {
159
+ interruptActions: {},
160
+ setInterruptAction: () => {
161
+ },
162
+ removeInterruptAction: () => {
163
163
  },
164
- removeLangGraphInterruptAction: () => {
164
+ interruptEventQueue: {},
165
+ addInterruptEvent: () => {
166
+ },
167
+ resolveInterruptEvent: () => {
165
168
  },
166
169
  onError: () => {
167
170
  },
@@ -322,13 +325,16 @@ function setsHaveIntersection(setA, setB) {
322
325
 
323
326
  // src/components/copilot-provider/copilotkit.tsx
324
327
  var import_react_dom = require("react-dom");
325
- var import_shared10 = require("@copilotkit/shared");
328
+ var import_shared12 = require("@copilotkit/shared");
326
329
 
327
330
  // src/hooks/use-flat-category-store.ts
328
331
  var import_react3 = require("react");
329
332
  var import_shared2 = require("@copilotkit/shared");
330
333
  var useFlatCategoryStore = () => {
331
- const [elements, dispatch] = (0, import_react3.useReducer)(flatCategoryStoreReducer, /* @__PURE__ */ new Map());
334
+ const [elements, dispatch] = (0, import_react3.useReducer)(
335
+ flatCategoryStoreReducer,
336
+ /* @__PURE__ */ new Map()
337
+ );
332
338
  const addElement = (0, import_react3.useCallback)((value, categories) => {
333
339
  const newId = (0, import_shared2.randomId)();
334
340
  dispatch({
@@ -403,18 +409,6 @@ var emptyCopilotContext2 = {
403
409
  setSuggestions: () => []
404
410
  };
405
411
  var CopilotMessagesContext = import_react4.default.createContext(emptyCopilotContext2);
406
- function useCopilotMessagesContext() {
407
- const context = import_react4.default.useContext(CopilotMessagesContext);
408
- if (context === emptyCopilotContext2) {
409
- throw new Error(
410
- "A messages consuming component was not wrapped with `<CopilotMessages> {...} </CopilotMessages>`"
411
- );
412
- }
413
- return context;
414
- }
415
-
416
- // src/components/copilot-provider/copilot-messages.tsx
417
- var import_runtime_client_gql = require("@copilotkit/runtime-client-gql");
418
412
 
419
413
  // src/components/toast/toast-provider.tsx
420
414
  var import_react5 = require("react");
@@ -751,11 +745,11 @@ function MessagesTapProvider({ children }) {
751
745
  }
752
746
  function CopilotMessages({ children }) {
753
747
  const [messages, setMessages] = (0, import_react6.useState)([]);
754
- const lastLoadedThreadId = (0, import_react6.useRef)();
755
- const lastLoadedAgentName = (0, import_react6.useRef)();
756
- const lastLoadedMessages = (0, import_react6.useRef)();
748
+ const lastLoadedThreadId = (0, import_react6.useRef)(void 0);
749
+ const lastLoadedAgentName = (0, import_react6.useRef)(void 0);
750
+ const lastLoadedMessages = (0, import_react6.useRef)(void 0);
757
751
  const { updateTapMessages } = useMessagesTap();
758
- const { threadId, agentSession, runtimeClient, showDevConsole, onError, copilotApiConfig } = useCopilotContext();
752
+ const { threadId, agentSession, showDevConsole, onError, copilotApiConfig } = useCopilotContext();
759
753
  const { setBannerError } = useToast();
760
754
  const traceUIError = (0, import_react6.useCallback)(
761
755
  (error, originalError) => __async(this, null, function* () {
@@ -787,7 +781,7 @@ function CopilotMessages({ children }) {
787
781
  }),
788
782
  [onError, copilotApiConfig.publicApiKey, copilotApiConfig.chatApiEndpoint]
789
783
  );
790
- const createStructuredError2 = (gqlError) => {
784
+ const createStructuredError = (gqlError) => {
791
785
  const extensions = gqlError.extensions;
792
786
  const originalError = extensions == null ? void 0 : extensions.originalError;
793
787
  if (originalError == null ? void 0 : originalError.stack) {
@@ -828,7 +822,7 @@ function CopilotMessages({ children }) {
828
822
  console.error("CopilotKit Silent Error:", gqlError.message);
829
823
  return;
830
824
  }
831
- const ckError = createStructuredError2(gqlError);
825
+ const ckError = createStructuredError(gqlError);
832
826
  if (ckError) {
833
827
  setBannerError(ckError);
834
828
  traceUIError(ckError, gqlError);
@@ -858,39 +852,6 @@ function CopilotMessages({ children }) {
858
852
  },
859
853
  [setBannerError, showDevConsole, traceUIError]
860
854
  );
861
- (0, import_react6.useEffect)(() => {
862
- if (!threadId || threadId === lastLoadedThreadId.current)
863
- return;
864
- if (threadId === lastLoadedThreadId.current && (agentSession == null ? void 0 : agentSession.agentName) === lastLoadedAgentName.current) {
865
- return;
866
- }
867
- const fetchMessages = () => __async(this, null, function* () {
868
- var _a, _b, _c;
869
- if (!(agentSession == null ? void 0 : agentSession.agentName))
870
- return;
871
- const result = yield runtimeClient.loadAgentState({
872
- threadId,
873
- agentName: agentSession == null ? void 0 : agentSession.agentName
874
- });
875
- if (result.error) {
876
- lastLoadedThreadId.current = threadId;
877
- lastLoadedAgentName.current = agentSession == null ? void 0 : agentSession.agentName;
878
- handleGraphQLErrors(result.error);
879
- return;
880
- }
881
- const newMessages = (_b = (_a = result.data) == null ? void 0 : _a.loadAgentState) == null ? void 0 : _b.messages;
882
- if (newMessages === lastLoadedMessages.current)
883
- return;
884
- if ((_c = result.data) == null ? void 0 : _c.loadAgentState) {
885
- lastLoadedMessages.current = newMessages;
886
- lastLoadedThreadId.current = threadId;
887
- lastLoadedAgentName.current = agentSession == null ? void 0 : agentSession.agentName;
888
- const messages2 = (0, import_runtime_client_gql.loadMessagesFromJsonRepresentation)(JSON.parse(newMessages || "[]"));
889
- setMessages(messages2);
890
- }
891
- });
892
- void fetchMessages();
893
- }, [threadId, agentSession == null ? void 0 : agentSession.agentName]);
894
855
  (0, import_react6.useEffect)(() => {
895
856
  updateTapMessages(messages);
896
857
  }, [messages, updateTapMessages]);
@@ -1111,123 +1072,12 @@ var getErrorActions = (error) => {
1111
1072
  }
1112
1073
  };
1113
1074
 
1114
- // src/hooks/use-copilot-runtime-client.ts
1115
- var import_runtime_client_gql2 = require("@copilotkit/runtime-client-gql");
1116
- var import_react7 = require("react");
1117
- var import_shared6 = require("@copilotkit/shared");
1118
- var useCopilotRuntimeClient = (options) => {
1119
- const { setBannerError } = useToast();
1120
- const _a = options, { showDevConsole, onError } = _a, runtimeOptions = __objRest(_a, ["showDevConsole", "onError"]);
1121
- const lastStructuredErrorRef = (0, import_react7.useRef)(null);
1122
- const traceUIError = (error, originalError) => __async(void 0, null, function* () {
1123
- try {
1124
- const errorEvent = {
1125
- type: "error",
1126
- timestamp: Date.now(),
1127
- context: {
1128
- source: "ui",
1129
- request: {
1130
- operation: "runtimeClient",
1131
- url: runtimeOptions.url,
1132
- startTime: Date.now()
1133
- },
1134
- technical: {
1135
- environment: "browser",
1136
- userAgent: typeof navigator !== "undefined" ? navigator.userAgent : void 0,
1137
- stackTrace: originalError instanceof Error ? originalError.stack : void 0
1138
- }
1139
- },
1140
- error
1141
- };
1142
- yield onError(errorEvent);
1143
- } catch (error2) {
1144
- console.error("Error in onError handler:", error2);
1145
- }
1146
- });
1147
- const runtimeClient = (0, import_react7.useMemo)(() => {
1148
- return new import_runtime_client_gql2.CopilotRuntimeClient(__spreadProps(__spreadValues({}, runtimeOptions), {
1149
- handleGQLErrors: (error) => {
1150
- var _a2;
1151
- if ((_a2 = error.graphQLErrors) == null ? void 0 : _a2.length) {
1152
- const graphQLErrors = error.graphQLErrors;
1153
- const routeError = (gqlError) => {
1154
- const extensions = gqlError.extensions;
1155
- const visibility = extensions == null ? void 0 : extensions.visibility;
1156
- if (visibility === import_shared6.ErrorVisibility.SILENT) {
1157
- console.error("CopilotKit Silent Error:", gqlError.message);
1158
- return;
1159
- }
1160
- const now = Date.now();
1161
- const errorMessage = gqlError.message;
1162
- if (lastStructuredErrorRef.current && lastStructuredErrorRef.current.message === errorMessage && now - lastStructuredErrorRef.current.timestamp < 150) {
1163
- return;
1164
- }
1165
- lastStructuredErrorRef.current = { message: errorMessage, timestamp: now };
1166
- const ckError = createStructuredError(gqlError);
1167
- if (ckError) {
1168
- setBannerError(ckError);
1169
- traceUIError(ckError, gqlError);
1170
- } else {
1171
- const fallbackError = new import_shared6.CopilotKitError({
1172
- message: gqlError.message,
1173
- code: import_shared6.CopilotKitErrorCode.UNKNOWN
1174
- });
1175
- setBannerError(fallbackError);
1176
- traceUIError(fallbackError, gqlError);
1177
- }
1178
- };
1179
- graphQLErrors.forEach(routeError);
1180
- } else {
1181
- const fallbackError = new import_shared6.CopilotKitError({
1182
- message: (error == null ? void 0 : error.message) || String(error),
1183
- code: import_shared6.CopilotKitErrorCode.UNKNOWN
1184
- });
1185
- setBannerError(fallbackError);
1186
- traceUIError(fallbackError, error);
1187
- }
1188
- },
1189
- handleGQLWarning: (message) => {
1190
- console.warn(message);
1191
- const warningError = new import_shared6.CopilotKitError({
1192
- message,
1193
- code: import_shared6.CopilotKitErrorCode.UNKNOWN
1194
- });
1195
- setBannerError(warningError);
1196
- }
1197
- }));
1198
- }, [runtimeOptions, setBannerError, onError]);
1199
- return runtimeClient;
1200
- };
1201
- function createStructuredError(gqlError) {
1202
- var _a, _b, _c;
1203
- const extensions = gqlError.extensions;
1204
- const originalError = extensions == null ? void 0 : extensions.originalError;
1205
- const message = (originalError == null ? void 0 : originalError.message) || gqlError.message;
1206
- const code = extensions == null ? void 0 : extensions.code;
1207
- if (code) {
1208
- return new import_shared6.CopilotKitError({ message, code });
1209
- }
1210
- if ((_a = originalError == null ? void 0 : originalError.stack) == null ? void 0 : _a.includes("CopilotApiDiscoveryError")) {
1211
- return new import_shared6.CopilotKitApiDiscoveryError({ message });
1212
- }
1213
- if ((_b = originalError == null ? void 0 : originalError.stack) == null ? void 0 : _b.includes("CopilotKitRemoteEndpointDiscoveryError")) {
1214
- return new import_shared6.CopilotKitRemoteEndpointDiscoveryError({ message });
1215
- }
1216
- if ((_c = originalError == null ? void 0 : originalError.stack) == null ? void 0 : _c.includes("CopilotKitAgentDiscoveryError")) {
1217
- return new import_shared6.CopilotKitAgentDiscoveryError({
1218
- agentName: "",
1219
- availableAgents: []
1220
- });
1221
- }
1222
- return null;
1223
- }
1224
-
1225
1075
  // src/components/error-boundary/error-boundary.tsx
1226
- var import_react8 = __toESM(require("react"));
1227
- var import_shared8 = require("@copilotkit/shared");
1076
+ var import_react7 = __toESM(require("react"));
1077
+ var import_shared7 = require("@copilotkit/shared");
1228
1078
 
1229
1079
  // src/lib/status-checker.ts
1230
- var import_shared7 = require("@copilotkit/shared");
1080
+ var import_shared6 = require("@copilotkit/shared");
1231
1081
  var STATUS_CHECK_INTERVAL = 1e3 * 60 * 5;
1232
1082
  var StatusChecker = class {
1233
1083
  constructor() {
@@ -1245,10 +1095,10 @@ var StatusChecker = class {
1245
1095
  clearInterval(this.intervalId);
1246
1096
  const checkStatus = () => __async(this, null, function* () {
1247
1097
  try {
1248
- const response = yield fetch(`${import_shared7.COPILOT_CLOUD_API_URL}/ciu`, {
1098
+ const response = yield fetch(`${import_shared6.COPILOT_CLOUD_API_URL}/ciu`, {
1249
1099
  method: "GET",
1250
1100
  headers: {
1251
- [import_shared7.COPILOT_CLOUD_PUBLIC_API_KEY_HEADER]: publicApiKey
1101
+ [import_shared6.COPILOT_CLOUD_PUBLIC_API_KEY_HEADER]: publicApiKey
1252
1102
  }
1253
1103
  }).then((response2) => response2.json());
1254
1104
  this.lastResponse = response;
@@ -1283,7 +1133,7 @@ var StatusChecker = class {
1283
1133
  // src/components/error-boundary/error-boundary.tsx
1284
1134
  var import_jsx_runtime4 = require("react/jsx-runtime");
1285
1135
  var statusChecker = new StatusChecker();
1286
- var CopilotErrorBoundary = class extends import_react8.default.Component {
1136
+ var CopilotErrorBoundary = class extends import_react7.default.Component {
1287
1137
  constructor(props) {
1288
1138
  super(props);
1289
1139
  this.state = {
@@ -1315,7 +1165,7 @@ var CopilotErrorBoundary = class extends import_react8.default.Component {
1315
1165
  render() {
1316
1166
  var _a, _b, _c, _d;
1317
1167
  if (this.state.hasError) {
1318
- if (this.state.error instanceof import_shared8.CopilotKitError) {
1168
+ if (this.state.error instanceof import_shared7.CopilotKitError) {
1319
1169
  return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
1320
1170
  this.props.children,
1321
1171
  this.props.showUsageBanner && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
@@ -1334,1092 +1184,349 @@ var CopilotErrorBoundary = class extends import_react8.default.Component {
1334
1184
  }
1335
1185
  };
1336
1186
 
1337
- // src/components/dev-console/console-trigger.tsx
1338
- var import_react10 = require("react");
1339
-
1340
- // src/components/dev-console/icons.tsx
1187
+ // src/context/coagent-state-renders-context.tsx
1188
+ var import_react8 = require("react");
1341
1189
  var import_jsx_runtime5 = require("react/jsx-runtime");
1342
- var ExclamationMarkTriangleIcon = () => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1343
- "svg",
1344
- {
1345
- width: "13.3967723px",
1346
- height: "12px",
1347
- viewBox: "0 0 13.3967723 12",
1348
- version: "1.1",
1349
- xmlns: "http://www.w3.org/2000/svg",
1350
- children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("g", { id: "Page-1", stroke: "none", strokeWidth: "1", fill: "none", fillRule: "evenodd", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("g", { id: "exclamation-triangle", fill: "#CD2121", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1351
- "path",
1352
- {
1353
- d: "M5.39935802,0.75 C5.97670802,-0.25 7.42007802,-0.25 7.99742802,0.75 L13.193588,9.75 C13.770888,10.75 13.049288,12 11.894588,12 L1.50223802,12 C0.34753802,12 -0.37414898,10.75 0.20319802,9.75 L5.39935802,0.75 Z M6.69838802,2.5 C7.11260802,2.5 7.44838802,2.83579 7.44838802,3.25 L7.44838802,6.25 C7.44838802,6.66421 7.11260802,7 6.69838802,7 C6.28417802,7 5.94838802,6.66421 5.94838802,6.25 L5.94838802,3.25 C5.94838802,2.83579 6.28417802,2.5 6.69838802,2.5 Z M6.69838802,10.5 C7.25067802,10.5 7.69838802,10.0523 7.69838802,9.5 C7.69838802,8.9477 7.25067802,8.5 6.69838802,8.5 C6.14610802,8.5 5.69838802,8.9477 5.69838802,9.5 C5.69838802,10.0523 6.14610802,10.5 6.69838802,10.5 Z",
1354
- id: "Shape"
1355
- }
1356
- ) }) })
1357
- }
1358
- );
1359
- var CheckIcon = () => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1360
- "svg",
1361
- {
1362
- width: "14px",
1363
- height: "14px",
1364
- viewBox: "0 0 14 14",
1365
- version: "1.1",
1366
- xmlns: "http://www.w3.org/2000/svg",
1367
- children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("g", { id: "Page-1", stroke: "none", strokeWidth: "1", fill: "none", fillRule: "evenodd", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("g", { id: "Group-2", transform: "translate(-118, 0)", fill: "#1BC030", fillRule: "nonzero", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("g", { id: "Group", transform: "translate(118, 0)", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1368
- "path",
1369
- {
1370
- d: "M0,7 C0,3.13384615 3.13384615,0 7,0 C10.8661538,0 14,3.13384615 14,7 C14,10.8661538 10.8661538,14 7,14 C3.13384615,14 0,10.8661538 0,7 Z M9.59179487,5.69764103 C9.70905818,5.54139023 9.73249341,5.33388318 9.65303227,5.15541491 C9.57357113,4.97694665 9.40367989,4.85551619 9.20909814,4.83811118 C9.01451638,4.82070616 8.82577109,4.91005717 8.71589744,5.07158974 L6.39261538,8.32389744 L5.22666667,7.15794872 C5.01450582,6.96025518 4.68389046,6.9660885 4.47883563,7.17114332 C4.27378081,7.37619815 4.26794748,7.70681351 4.46564103,7.91897436 L6.08102564,9.53435897 C6.19289944,9.64614839 6.3482622,9.70310251 6.50588106,9.69010587 C6.66349993,9.67710922 6.80743532,9.59547613 6.89948718,9.46687179 L9.59179487,5.69764103 L9.59179487,5.69764103 Z",
1371
- id: "Shape"
1372
- }
1373
- ) }) }) })
1374
- }
1190
+ var CoAgentStateRendersContext = (0, import_react8.createContext)(
1191
+ void 0
1375
1192
  );
1376
- var CopilotKitIcon = () => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
1377
- "svg",
1378
- {
1379
- width: "33px",
1380
- height: "35px",
1381
- viewBox: "0 0 33 35",
1382
- version: "1.1",
1383
- xmlns: "http://www.w3.org/2000/svg",
1384
- children: [
1385
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("title", { children: "bd5c9079-929b-4d55-bdc9-16d1c8181b71" }),
1386
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("g", { id: "Page-1", stroke: "none", strokeWidth: "1", fill: "none", fillRule: "evenodd", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1387
- "image",
1388
- {
1389
- x: "0",
1390
- y: "0",
1391
- width: "33",
1392
- height: "35",
1393
- xlinkHref: "data:image/png;base64,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"
1394
- }
1395
- ) })
1396
- ]
1193
+ function CoAgentStateRendersProvider({ children }) {
1194
+ const [coAgentStateRenders, setCoAgentStateRenders] = (0, import_react8.useState)({});
1195
+ const setCoAgentStateRender = (0, import_react8.useCallback)((id, stateRender) => {
1196
+ setCoAgentStateRenders((prevPoints) => __spreadProps(__spreadValues({}, prevPoints), {
1197
+ [id]: stateRender
1198
+ }));
1199
+ }, []);
1200
+ const removeCoAgentStateRender = (0, import_react8.useCallback)((id) => {
1201
+ setCoAgentStateRenders((prevPoints) => {
1202
+ const newPoints = __spreadValues({}, prevPoints);
1203
+ delete newPoints[id];
1204
+ return newPoints;
1205
+ });
1206
+ }, []);
1207
+ const claimsRef = (0, import_react8.useRef)({});
1208
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1209
+ CoAgentStateRendersContext.Provider,
1210
+ {
1211
+ value: {
1212
+ coAgentStateRenders,
1213
+ setCoAgentStateRender,
1214
+ removeCoAgentStateRender,
1215
+ claimsRef
1216
+ },
1217
+ children
1218
+ }
1219
+ );
1220
+ }
1221
+ function useCoAgentStateRenders() {
1222
+ const context = (0, import_react8.useContext)(CoAgentStateRendersContext);
1223
+ if (!context) {
1224
+ throw new Error("useCoAgentStateRenders must be used within CoAgentStateRendersProvider");
1397
1225
  }
1398
- );
1226
+ return context;
1227
+ }
1399
1228
 
1400
- // src/components/dev-console/developer-console-modal.tsx
1401
- var import_shared9 = require("@copilotkit/shared");
1229
+ // src/hooks/use-coagent-state-render-bridge.tsx
1230
+ var import_react10 = require("@copilotkitnext/react");
1231
+ var import_react11 = require("react");
1232
+
1233
+ // src/context/threads-context.tsx
1402
1234
  var import_react9 = require("react");
1235
+ var import_shared8 = require("@copilotkit/shared");
1403
1236
  var import_jsx_runtime6 = require("react/jsx-runtime");
1404
- function DeveloperConsoleModal({ isOpen, onClose, hasApiKey }) {
1405
- const context = useCopilotContext();
1406
- const messagesContext = useCopilotMessagesContext();
1407
- const [activeTab, setActiveTab] = (0, import_react9.useState)("actions");
1408
- (0, import_react9.useEffect)(() => {
1409
- const handleEscape = (e) => {
1410
- if (e.key === "Escape") {
1411
- onClose();
1412
- }
1413
- };
1414
- if (isOpen) {
1415
- document.addEventListener("keydown", handleEscape);
1416
- document.body.style.overflow = "hidden";
1417
- }
1418
- return () => {
1419
- document.removeEventListener("keydown", handleEscape);
1420
- document.body.style.overflow = "unset";
1421
- };
1422
- }, [isOpen, onClose]);
1423
- if (!isOpen)
1424
- return null;
1425
- const displayContext = hasApiKey ? context : {
1426
- actions: {
1427
- search_web: { name: "search_web", description: "Search the web for information" },
1428
- send_email: { name: "send_email", description: "Send an email to a contact" },
1429
- create_document: { name: "create_document", description: "Create a new document" },
1430
- analyze_code: {
1431
- name: "analyze_code",
1432
- description: "Analyze code for issues and improvements"
1433
- },
1434
- generate_tests: {
1435
- name: "generate_tests",
1436
- description: "Generate unit tests for functions"
1437
- }
1438
- },
1439
- getAllContext: () => [
1440
- {
1441
- content: "User preferences: dark mode enabled, TypeScript preferred",
1442
- metadata: { source: "settings" }
1443
- },
1444
- {
1445
- content: "Current project: Building a React application with CopilotKit",
1446
- metadata: { source: "project" }
1447
- },
1448
- {
1449
- content: "Recent activity: Implemented authentication system",
1450
- metadata: { source: "activity" }
1451
- },
1452
- {
1453
- content: "Development environment: VS Code, Node.js 18, React 18",
1454
- metadata: { source: "environment" }
1455
- }
1456
- ],
1457
- coagentStates: {
1458
- "main-agent": { status: "active", lastUpdate: Date.now() },
1459
- "code-assistant": { status: "active", lastUpdate: Date.now() - 15e3 },
1460
- "search-agent": { status: "idle", lastUpdate: Date.now() - 6e4 }
1461
- },
1462
- getDocumentsContext: () => [
1463
- {
1464
- content: "README.md: Project setup and installation instructions",
1465
- metadata: { type: "documentation" }
1466
- },
1467
- {
1468
- content: "API Documentation: CopilotKit integration guide",
1469
- metadata: { type: "documentation" }
1470
- },
1471
- {
1472
- content: "package.json: Project dependencies and scripts",
1473
- metadata: { type: "configuration" }
1474
- }
1475
- ]
1476
- };
1477
- const displayMessagesContext = hasApiKey ? messagesContext : {
1478
- messages: [
1479
- {
1480
- id: "1",
1481
- role: "user",
1482
- content: "Help me implement a todo list with drag and drop functionality"
1483
- },
1484
- {
1485
- id: "2",
1486
- role: "assistant",
1487
- content: "I'll help you create a todo list with drag and drop. Let me start by setting up the basic components and then add the drag and drop functionality using React DnD."
1488
- },
1489
- { id: "3", role: "user", content: "Can you also add priority levels and due dates?" },
1490
- {
1491
- id: "4",
1492
- role: "assistant",
1493
- content: "Absolutely! I'll enhance the todo items with priority levels (high, medium, low) and due date functionality. This will make your todo list much more powerful for task management."
1494
- },
1495
- { id: "5", role: "user", content: "Perfect! How about adding categories or tags?" }
1496
- ]
1497
- };
1237
+ var ThreadsContext = (0, import_react9.createContext)(void 0);
1238
+ function ThreadsProvider({ children, threadId: explicitThreadId }) {
1239
+ const [internalThreadId, setThreadId] = (0, import_react9.useState)(explicitThreadId != null ? explicitThreadId : (0, import_shared8.randomUUID)());
1240
+ const threadId = internalThreadId;
1498
1241
  return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1499
- "div",
1242
+ ThreadsContext.Provider,
1500
1243
  {
1501
- style: {
1502
- position: "fixed",
1503
- top: 0,
1504
- left: 0,
1505
- right: 0,
1506
- bottom: 0,
1507
- zIndex: 9999,
1508
- backgroundColor: "rgba(0, 0, 0, 0.3)",
1509
- display: "flex",
1510
- alignItems: "center",
1511
- justifyContent: "center",
1512
- padding: "16px"
1244
+ value: {
1245
+ threadId,
1246
+ setThreadId
1513
1247
  },
1514
- onClick: onClose,
1515
- children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
1516
- "div",
1517
- {
1518
- style: {
1519
- width: "1152px",
1520
- maxWidth: "95vw",
1521
- height: "80vh",
1522
- backgroundColor: "white",
1523
- borderRadius: "12px",
1524
- boxShadow: "0 25px 50px -12px rgba(0, 0, 0, 0.25)",
1525
- display: "flex",
1526
- flexDirection: "column",
1527
- overflow: "hidden",
1528
- position: "relative"
1529
- },
1530
- onClick: (e) => e.stopPropagation(),
1531
- children: [
1532
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
1533
- "div",
1534
- {
1535
- style: {
1536
- display: "flex",
1537
- alignItems: "center",
1538
- justifyContent: "space-between",
1539
- padding: "24px",
1540
- borderBottom: "1px solid #e5e7eb",
1541
- minHeight: "73px",
1542
- flexShrink: 0,
1543
- filter: !hasApiKey ? "blur(0.3px)" : "none",
1544
- opacity: !hasApiKey ? 0.95 : 1
1545
- },
1546
- children: [
1547
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "12px" }, children: [
1548
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CopilotKitIcon, {}),
1549
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1550
- "h1",
1551
- {
1552
- style: {
1553
- fontWeight: "bold",
1554
- fontSize: "20px",
1555
- color: "#1f2937",
1556
- margin: 0
1557
- },
1558
- children: "Inspector"
1559
- }
1560
- ),
1561
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
1562
- "span",
1563
- {
1564
- style: {
1565
- fontSize: "14px",
1566
- color: "#6b7280",
1567
- backgroundColor: "#f3f4f6",
1568
- padding: "4px 8px",
1569
- borderRadius: "4px"
1570
- },
1571
- children: [
1572
- "v",
1573
- import_shared9.COPILOTKIT_VERSION
1574
- ]
1575
- }
1576
- )
1577
- ] }),
1578
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1579
- "button",
1580
- {
1581
- onClick: onClose,
1582
- style: {
1583
- color: "#9ca3af",
1584
- fontSize: "24px",
1585
- fontWeight: "300",
1586
- border: "none",
1587
- background: "none",
1588
- cursor: "pointer",
1589
- padding: "4px"
1590
- },
1591
- onMouseEnter: (e) => e.currentTarget.style.color = "#4b5563",
1592
- onMouseLeave: (e) => e.currentTarget.style.color = "#9ca3af",
1593
- children: "\xD7"
1594
- }
1595
- )
1596
- ]
1597
- }
1598
- ),
1599
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1600
- "div",
1601
- {
1602
- style: {
1603
- display: "flex",
1604
- borderBottom: "1px solid #e5e7eb",
1605
- backgroundColor: "#f9fafb",
1606
- minHeight: "50px",
1607
- flexShrink: 0,
1608
- filter: !hasApiKey ? "blur(0.3px)" : "none",
1609
- opacity: !hasApiKey ? 0.9 : 1
1610
- },
1611
- children: [
1612
- { id: "actions", label: "Actions", count: Object.keys(displayContext.actions).length },
1613
- { id: "readables", label: "Readables", count: displayContext.getAllContext().length },
1614
- {
1615
- id: "agent",
1616
- label: "Agent Status",
1617
- count: Object.keys(displayContext.coagentStates).length
1618
- },
1619
- { id: "messages", label: "Messages", count: displayMessagesContext.messages.length },
1620
- {
1621
- id: "context",
1622
- label: "Context",
1623
- count: displayContext.getDocumentsContext([]).length
1624
- }
1625
- ].map((tab) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
1626
- "button",
1627
- {
1628
- onClick: () => setActiveTab(tab.id),
1629
- style: {
1630
- padding: "12px 24px",
1631
- fontSize: "14px",
1632
- fontWeight: "500",
1633
- border: "none",
1634
- cursor: "pointer",
1635
- backgroundColor: activeTab === tab.id ? "white" : "transparent",
1636
- color: activeTab === tab.id ? "#2563eb" : "#6b7280",
1637
- borderBottom: activeTab === tab.id ? "2px solid #2563eb" : "none",
1638
- transition: "all 0.2s"
1639
- },
1640
- onMouseEnter: (e) => {
1641
- if (activeTab !== tab.id) {
1642
- e.currentTarget.style.color = "#1f2937";
1643
- e.currentTarget.style.backgroundColor = "#f3f4f6";
1644
- }
1645
- },
1646
- onMouseLeave: (e) => {
1647
- if (activeTab !== tab.id) {
1648
- e.currentTarget.style.color = "#6b7280";
1649
- e.currentTarget.style.backgroundColor = "transparent";
1650
- }
1651
- },
1652
- children: [
1653
- tab.label,
1654
- tab.count > 0 && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1655
- "span",
1656
- {
1657
- style: {
1658
- marginLeft: "8px",
1659
- backgroundColor: "#e5e7eb",
1660
- color: "#374151",
1661
- padding: "2px 8px",
1662
- borderRadius: "9999px",
1663
- fontSize: "12px"
1664
- },
1665
- children: tab.count
1666
- }
1667
- )
1668
- ]
1669
- },
1670
- tab.id
1671
- ))
1672
- }
1673
- ),
1674
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
1675
- "div",
1676
- {
1677
- style: {
1678
- height: "calc(100% - 142px)",
1679
- overflow: "auto",
1680
- padding: "24px",
1681
- backgroundColor: "#f9fafb",
1682
- filter: !hasApiKey ? "blur(0.3px)" : "none",
1683
- opacity: !hasApiKey ? 0.85 : 1
1684
- },
1685
- children: [
1686
- activeTab === "actions" && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ActionsTab, { context: displayContext }),
1687
- activeTab === "readables" && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ReadablesTab, { context: displayContext }),
1688
- activeTab === "agent" && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(AgentStatusTab, { context: displayContext }),
1689
- activeTab === "messages" && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MessagesTab, { messagesContext: displayMessagesContext }),
1690
- activeTab === "context" && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ContextTab, { context: displayContext })
1691
- ]
1692
- }
1693
- ),
1694
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
1695
- "div",
1696
- {
1697
- style: {
1698
- padding: "16px 24px",
1699
- borderTop: "1px solid #e5e7eb",
1700
- backgroundColor: "white",
1701
- display: "flex",
1702
- justifyContent: "space-between",
1703
- alignItems: "center",
1704
- minHeight: "57px",
1705
- flexShrink: 0,
1706
- filter: !hasApiKey ? "blur(0.3px)" : "none",
1707
- opacity: !hasApiKey ? 0.9 : 1
1708
- },
1709
- children: [
1710
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: { fontSize: "14px", color: "#6b7280" }, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1711
- "a",
1712
- {
1713
- href: "https://github.com/CopilotKit/CopilotKit/issues",
1714
- target: "_blank",
1715
- rel: "noopener noreferrer",
1716
- style: { color: "#2563eb", textDecoration: "none" },
1717
- onMouseEnter: (e) => e.currentTarget.style.textDecoration = "underline",
1718
- onMouseLeave: (e) => e.currentTarget.style.textDecoration = "none",
1719
- children: "Report an issue"
1720
- }
1721
- ) }),
1722
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: { fontSize: "14px", color: "#6b7280" }, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1723
- "a",
1724
- {
1725
- href: "https://mcp.copilotkit.ai/",
1726
- target: "_blank",
1727
- rel: "noopener noreferrer",
1728
- style: { color: "#2563eb", textDecoration: "none" },
1729
- onMouseEnter: (e) => e.currentTarget.style.textDecoration = "underline",
1730
- onMouseLeave: (e) => e.currentTarget.style.textDecoration = "none",
1731
- children: "Add MCP Server \u2192"
1732
- }
1733
- ) })
1734
- ]
1735
- }
1736
- ),
1737
- !hasApiKey && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1738
- "div",
1739
- {
1740
- style: {
1741
- position: "absolute",
1742
- top: 0,
1743
- left: 0,
1744
- right: 0,
1745
- bottom: 0,
1746
- backgroundColor: "rgba(255, 255, 255, 0.2)",
1747
- backdropFilter: "blur(2px)",
1748
- WebkitBackdropFilter: "blur(2px)",
1749
- display: "flex",
1750
- alignItems: "center",
1751
- justifyContent: "center",
1752
- borderRadius: "12px",
1753
- zIndex: 10
1754
- },
1755
- onClick: (e) => e.stopPropagation(),
1756
- children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
1757
- "button",
1758
- {
1759
- onClick: () => window.open("https://cloud.copilotkit.ai/sign-in", "_blank"),
1760
- style: {
1761
- // Following button system specifications
1762
- height: "48px",
1763
- padding: "12px 24px",
1764
- backgroundColor: "#030507",
1765
- // textPrimary token
1766
- color: "#FFFFFF",
1767
- borderRadius: "12px",
1768
- // Medium radius token
1769
- border: "none",
1770
- cursor: "pointer",
1771
- fontSize: "14px",
1772
- // Medium Semi Bold typography
1773
- fontWeight: "600",
1774
- fontFamily: "'Plus Jakarta Sans', -apple-system, BlinkMacSystemFont, sans-serif",
1775
- lineHeight: "22px",
1776
- boxShadow: "0 4px 16px rgba(3, 5, 7, 0.2), 0 1px 3px rgba(3, 5, 7, 0.1)",
1777
- transition: "all 200ms ease",
1778
- // 200ms ease as per specs
1779
- display: "inline-flex",
1780
- alignItems: "center",
1781
- gap: "8px",
1782
- textTransform: "uppercase",
1783
- letterSpacing: "0.5px"
1784
- },
1785
- onMouseEnter: (e) => {
1786
- e.currentTarget.style.backgroundColor = "#575758";
1787
- e.currentTarget.style.transform = "translateY(-1px)";
1788
- e.currentTarget.style.boxShadow = "0 6px 20px rgba(3, 5, 7, 0.25), 0 2px 4px rgba(3, 5, 7, 0.15)";
1789
- },
1790
- onMouseLeave: (e) => {
1791
- e.currentTarget.style.backgroundColor = "#030507";
1792
- e.currentTarget.style.transform = "translateY(0)";
1793
- e.currentTarget.style.boxShadow = "0 4px 16px rgba(3, 5, 7, 0.2), 0 1px 3px rgba(3, 5, 7, 0.1)";
1794
- },
1795
- onMouseDown: (e) => {
1796
- e.currentTarget.style.backgroundColor = "#858589";
1797
- e.currentTarget.style.transform = "translateY(0)";
1798
- },
1799
- onMouseUp: (e) => {
1800
- e.currentTarget.style.backgroundColor = "#575758";
1801
- e.currentTarget.style.transform = "translateY(-1px)";
1802
- },
1803
- onFocus: (e) => {
1804
- e.currentTarget.style.outline = "2px solid #BEC9FF";
1805
- e.currentTarget.style.outlineOffset = "2px";
1806
- },
1807
- onBlur: (e) => {
1808
- e.currentTarget.style.outline = "none";
1809
- },
1810
- children: [
1811
- "Get License Key",
1812
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { style: { fontSize: "16px", marginLeft: "-4px" }, children: "\u2192" })
1813
- ]
1814
- }
1815
- )
1816
- }
1817
- )
1818
- ]
1819
- }
1820
- )
1248
+ children
1821
1249
  }
1822
1250
  );
1823
1251
  }
1824
- function ActionsTab({ context }) {
1825
- const actions = Object.values(context.actions);
1826
- if (actions.length === 0) {
1827
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: { textAlign: "center", padding: "48px 0", color: "#6b7280" }, children: [
1828
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { style: { fontSize: "18px", margin: "0 0 8px 0" }, children: "No actions available" }),
1829
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { style: { fontSize: "14px", margin: 0 }, children: "Actions will appear here when registered" })
1830
- ] });
1831
- }
1832
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: { display: "flex", flexDirection: "column", gap: "16px" }, children: actions.map((action, index) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1833
- "div",
1834
- {
1835
- style: {
1836
- backgroundColor: "white",
1837
- padding: "16px",
1838
- borderRadius: "8px",
1839
- boxShadow: "0 1px 3px 0 rgba(0, 0, 0, 0.1)",
1840
- border: "1px solid #e5e7eb"
1841
- },
1842
- children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
1843
- "div",
1844
- {
1845
- style: { display: "flex", alignItems: "flex-start", justifyContent: "space-between" },
1846
- children: [
1847
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: { flex: 1 }, children: [
1848
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h3", { style: { fontWeight: "600", color: "#1f2937", margin: "0 0 4px 0" }, children: action.name }),
1849
- action.description && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { style: { fontSize: "14px", color: "#4b5563", margin: "0 0 12px 0" }, children: action.description }),
1850
- action.parameters && action.parameters.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: { marginTop: "12px" }, children: [
1851
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1852
- "p",
1853
- {
1854
- style: {
1855
- fontSize: "12px",
1856
- fontWeight: "500",
1857
- color: "#6b7280",
1858
- textTransform: "uppercase",
1859
- margin: "0 0 4px 0"
1860
- },
1861
- children: "Parameters:"
1862
- }
1863
- ),
1864
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: { display: "flex", flexDirection: "column", gap: "4px" }, children: action.parameters.map((param, pIndex) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: { fontSize: "14px" }, children: [
1865
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { style: { fontFamily: "monospace", color: "#374151" }, children: param.name }),
1866
- param.required && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { style: { marginLeft: "4px", fontSize: "12px", color: "#ef4444" }, children: "*required" }),
1867
- param.type && /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { style: { marginLeft: "8px", fontSize: "12px", color: "#6b7280" }, children: [
1868
- "(",
1869
- param.type,
1870
- ")"
1871
- ] })
1872
- ] }, pIndex)) })
1873
- ] })
1874
- ] }),
1875
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: { marginLeft: "16px" }, children: action.status === "available" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CheckIcon, {}) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ExclamationMarkTriangleIcon, {}) })
1876
- ]
1877
- }
1878
- )
1879
- },
1880
- index
1881
- )) });
1882
- }
1883
- function ReadablesTab({ context }) {
1884
- const readables = context.getAllContext();
1885
- if (readables.length === 0) {
1886
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: { textAlign: "center", padding: "48px 0", color: "#6b7280" }, children: [
1887
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { style: { fontSize: "18px", margin: "0 0 8px 0" }, children: "No readable context available" }),
1888
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { style: { fontSize: "14px", margin: 0 }, children: "Readable context will appear here when provided" })
1889
- ] });
1252
+ function useThreads() {
1253
+ const context = (0, import_react9.useContext)(ThreadsContext);
1254
+ if (!context) {
1255
+ throw new Error("useThreads must be used within ThreadsProvider");
1890
1256
  }
1891
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: { display: "flex", flexDirection: "column", gap: "16px" }, children: readables.map((readable, index) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1892
- "div",
1893
- {
1894
- style: {
1895
- backgroundColor: "white",
1896
- padding: "16px",
1897
- borderRadius: "8px",
1898
- boxShadow: "0 1px 3px 0 rgba(0, 0, 0, 0.1)",
1899
- border: "1px solid #e5e7eb"
1900
- },
1901
- children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1902
- "div",
1903
- {
1904
- style: { display: "flex", alignItems: "flex-start", justifyContent: "space-between" },
1905
- children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: { flex: 1 }, children: [
1906
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h3", { style: { fontWeight: "600", color: "#1f2937", margin: "0 0 4px 0" }, children: readable.name || `Readable ${index + 1}` }),
1907
- readable.description && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { style: { fontSize: "14px", color: "#4b5563", margin: "0 0 12px 0" }, children: readable.description }),
1908
- readable.value && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1909
- "pre",
1910
- {
1911
- style: {
1912
- marginTop: "12px",
1913
- padding: "8px",
1914
- backgroundColor: "#f9fafb",
1915
- borderRadius: "4px",
1916
- fontSize: "12px",
1917
- overflowX: "auto",
1918
- margin: "12px 0 0 0"
1919
- },
1920
- children: JSON.stringify(readable.value, null, 2)
1921
- }
1922
- )
1923
- ] })
1924
- }
1925
- )
1926
- },
1927
- index
1928
- )) });
1257
+ return context;
1929
1258
  }
1930
- function AgentStatusTab({ context }) {
1931
- const agentStates = context.coagentStates || {};
1932
- const agentStateEntries = Object.entries(agentStates);
1933
- if (agentStateEntries.length === 0) {
1934
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: { textAlign: "center", padding: "48px 0", color: "#6b7280" }, children: [
1935
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { style: { fontSize: "18px", margin: "0 0 8px 0" }, children: "No agent states available" }),
1936
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { style: { fontSize: "14px", margin: 0 }, children: "Agent states will appear here when agents are active" })
1937
- ] });
1938
- }
1939
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: { display: "flex", flexDirection: "column", gap: "24px" }, children: agentStateEntries.map(([agentName, state]) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
1940
- "div",
1941
- {
1942
- style: {
1943
- backgroundColor: "white",
1944
- padding: "24px",
1945
- borderRadius: "8px",
1946
- boxShadow: "0 1px 3px 0 rgba(0, 0, 0, 0.1)",
1947
- border: "1px solid #e5e7eb"
1948
- },
1949
- children: [
1950
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
1951
- "div",
1952
- {
1953
- style: {
1954
- display: "flex",
1955
- alignItems: "center",
1956
- justifyContent: "space-between",
1957
- marginBottom: "16px"
1958
- },
1959
- children: [
1960
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h3", { style: { fontWeight: "600", fontSize: "18px", color: "#1f2937", margin: 0 }, children: agentName }),
1961
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1962
- "span",
1963
- {
1964
- style: {
1965
- padding: "4px 12px",
1966
- borderRadius: "9999px",
1967
- fontSize: "12px",
1968
- fontWeight: "500",
1969
- backgroundColor: state.status === "running" ? "#dcfce7" : state.status === "complete" ? "#dbeafe" : "#f3f4f6",
1970
- color: state.status === "running" ? "#166534" : state.status === "complete" ? "#1e40af" : "#1f2937"
1971
- },
1972
- children: state.status || "idle"
1973
- }
1974
- )
1975
- ]
1976
- }
1977
- ),
1978
- state.state && /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: { marginBottom: "12px" }, children: [
1979
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1980
- "p",
1981
- {
1982
- style: {
1983
- fontSize: "12px",
1984
- fontWeight: "500",
1985
- color: "#6b7280",
1986
- textTransform: "uppercase",
1987
- margin: "0 0 4px 0"
1988
- },
1989
- children: "Current State:"
1990
- }
1991
- ),
1992
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1993
- "pre",
1994
- {
1995
- style: {
1996
- padding: "12px",
1997
- backgroundColor: "#f9fafb",
1998
- borderRadius: "4px",
1999
- fontSize: "12px",
2000
- overflowX: "auto",
2001
- margin: 0
2002
- },
2003
- children: JSON.stringify(state.state, null, 2)
2004
- }
2005
- )
2006
- ] }),
2007
- state.running && /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
2008
- "div",
2009
- {
2010
- style: {
2011
- marginTop: "16px",
2012
- display: "flex",
2013
- alignItems: "center",
2014
- fontSize: "14px",
2015
- color: "#4b5563"
2016
- },
2017
- children: [
2018
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: { marginRight: "8px" }, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
2019
- "svg",
2020
- {
2021
- width: "16",
2022
- height: "16",
2023
- viewBox: "0 0 16 16",
2024
- style: { animation: "spin 1s linear infinite" },
2025
- children: [
2026
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("style", { children: `@keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }` }),
2027
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
2028
- "circle",
2029
- {
2030
- cx: "8",
2031
- cy: "8",
2032
- r: "6",
2033
- fill: "none",
2034
- stroke: "#4b5563",
2035
- strokeWidth: "2",
2036
- strokeDasharray: "9 3"
2037
- }
2038
- )
2039
- ]
2040
- }
2041
- ) }),
2042
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { children: "Agent is currently running..." })
2043
- ]
2044
- }
2045
- )
2046
- ]
2047
- },
2048
- agentName
2049
- )) });
1259
+
1260
+ // src/hooks/use-coagent-state-render-bridge.tsx
1261
+ var import_shared9 = require("@copilotkit/shared");
1262
+ function getStateWithoutConstantKeys(state) {
1263
+ if (!state)
1264
+ return {};
1265
+ const _a = state, { messages, tools, copilotkit } = _a, stateWithoutConstantKeys = __objRest(_a, ["messages", "tools", "copilotkit"]);
1266
+ return stateWithoutConstantKeys;
2050
1267
  }
2051
- function MessagesTab({ messagesContext }) {
2052
- const messages = messagesContext.messages || [];
2053
- if (messages.length === 0) {
2054
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: { textAlign: "center", padding: "48px 0", color: "#6b7280" }, children: [
2055
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { style: { fontSize: "18px", margin: "0 0 8px 0" }, children: "No messages yet" }),
2056
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { style: { fontSize: "14px", margin: 0 }, children: "Messages will appear here as the conversation progresses" })
2057
- ] });
2058
- }
2059
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: { display: "flex", flexDirection: "column", gap: "16px" }, children: messages.map((message, index) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
2060
- "div",
2061
- {
2062
- style: {
2063
- padding: "16px",
2064
- borderRadius: "8px",
2065
- backgroundColor: message.role === "user" ? "#eff6ff" : message.role === "assistant" ? "#f9fafb" : "#fefce8",
2066
- border: `1px solid ${message.role === "user" ? "#c7d2fe" : message.role === "assistant" ? "#e5e7eb" : "#fde047"}`,
2067
- marginLeft: message.role === "user" ? "48px" : "0",
2068
- marginRight: message.role === "assistant" ? "48px" : "0"
2069
- },
2070
- children: [
2071
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
2072
- "div",
2073
- {
2074
- style: {
2075
- display: "flex",
2076
- alignItems: "flex-start",
2077
- justifyContent: "space-between",
2078
- marginBottom: "8px"
2079
- },
2080
- children: [
2081
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
2082
- "span",
2083
- {
2084
- style: {
2085
- fontWeight: "500",
2086
- fontSize: "14px",
2087
- color: "#374151",
2088
- textTransform: "capitalize"
2089
- },
2090
- children: message.role || "system"
2091
- }
2092
- ),
2093
- message.timestamp && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { style: { fontSize: "12px", color: "#6b7280" }, children: new Date(message.timestamp).toLocaleTimeString() })
2094
- ]
2095
- }
2096
- ),
2097
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: { fontSize: "14px", color: "#1f2937", whiteSpace: "pre-wrap" }, children: message.content || "" })
2098
- ]
2099
- },
2100
- index
2101
- )) });
1268
+ function areStatesEquals(a, b) {
1269
+ if (a && !b || !a && b)
1270
+ return false;
1271
+ const _a = a, { messages, tools, copilotkit } = _a, aWithoutConstantKeys = __objRest(_a, ["messages", "tools", "copilotkit"]);
1272
+ const _b = b, {
1273
+ messages: bMessages,
1274
+ tools: bTools,
1275
+ copilotkit: bCopilotkit
1276
+ } = _b, bWithoutConstantKeys = __objRest(_b, [
1277
+ "messages",
1278
+ "tools",
1279
+ "copilotkit"
1280
+ ]);
1281
+ return JSON.stringify(aWithoutConstantKeys) === JSON.stringify(bWithoutConstantKeys);
2102
1282
  }
2103
- function ContextTab({ context }) {
2104
- const documents = context.getDocumentsContext([]);
2105
- if (documents.length === 0) {
2106
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: { textAlign: "center", padding: "48px 0", color: "#6b7280" }, children: [
2107
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { style: { fontSize: "18px", margin: "0 0 8px 0" }, children: "No document context available" }),
2108
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { style: { fontSize: "14px", margin: 0 }, children: "Document context will appear here when provided" })
2109
- ] });
2110
- }
2111
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: { display: "flex", flexDirection: "column", gap: "16px" }, children: documents.map((doc, index) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
2112
- "div",
2113
- {
2114
- style: {
2115
- backgroundColor: "white",
2116
- padding: "16px",
2117
- borderRadius: "8px",
2118
- boxShadow: "0 1px 3px 0 rgba(0, 0, 0, 0.1)",
2119
- border: "1px solid #e5e7eb"
1283
+ function useCoagentStateRenderBridge(agentId, props) {
1284
+ var _a;
1285
+ const { stateSnapshot, messageIndexInRun, message } = props;
1286
+ const { coAgentStateRenders, claimsRef } = useCoAgentStateRenders();
1287
+ const { agent } = (0, import_react10.useAgent)({ agentId });
1288
+ const [nodeName, setNodeName] = (0, import_react11.useState)(void 0);
1289
+ const runId = (_a = props.runId) != null ? _a : message.runId;
1290
+ const effectiveRunId = runId || "pending";
1291
+ (0, import_react11.useEffect)(() => {
1292
+ if (!agent)
1293
+ return;
1294
+ const subscriber = {
1295
+ onStepStartedEvent: ({ event }) => {
1296
+ if (event.stepName !== nodeName) {
1297
+ setNodeName(event.stepName);
1298
+ }
2120
1299
  },
2121
- children: [
2122
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h3", { style: { fontWeight: "600", color: "#1f2937", margin: "0 0 8px 0" }, children: doc.name || `Document ${index + 1}` }),
2123
- doc.content && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
2124
- "pre",
2125
- {
2126
- style: {
2127
- padding: "12px",
2128
- backgroundColor: "#f9fafb",
2129
- borderRadius: "4px",
2130
- fontSize: "12px",
2131
- overflowX: "auto",
2132
- margin: 0
2133
- },
2134
- children: doc.content
2135
- }
2136
- )
2137
- ]
1300
+ onStepFinishedEvent: ({ event }) => {
1301
+ if (event.stepName === nodeName) {
1302
+ setNodeName(void 0);
1303
+ }
1304
+ }
1305
+ };
1306
+ const { unsubscribe } = agent.subscribe(subscriber);
1307
+ return () => {
1308
+ unsubscribe();
1309
+ };
1310
+ }, [agentId, nodeName]);
1311
+ const getStateRender = (0, import_react11.useCallback)(
1312
+ (messageId) => {
1313
+ return Object.entries(coAgentStateRenders).find(([stateRenderId, stateRender]) => {
1314
+ if (claimsRef.current[messageId]) {
1315
+ return stateRenderId === claimsRef.current[messageId].stateRenderId;
1316
+ }
1317
+ const matchingAgentName = stateRender.name === agentId;
1318
+ const matchesNodeContext = stateRender.nodeName ? stateRender.nodeName === nodeName : true;
1319
+ return matchingAgentName && matchesNodeContext;
1320
+ });
2138
1321
  },
2139
- index
2140
- )) });
2141
- }
2142
-
2143
- // src/components/dev-console/console-trigger.tsx
2144
- var import_jsx_runtime7 = require("react/jsx-runtime");
2145
- var INSPECTOR_HIDE_KEY = "cpk:inspector:hidden";
2146
- function ConsoleTrigger({ position = "bottom-right" }) {
2147
- const context = useCopilotContext();
2148
- const hasApiKey = Boolean(context.copilotApiConfig.publicApiKey);
2149
- const [isModalOpen, setIsModalOpen] = (0, import_react10.useState)(false);
2150
- const [isHovered, setIsHovered] = (0, import_react10.useState)(false);
2151
- const [isDragging, setIsDragging] = (0, import_react10.useState)(false);
2152
- const [buttonPosition, setButtonPosition] = (0, import_react10.useState)(null);
2153
- const [mounted, setMounted] = (0, import_react10.useState)(false);
2154
- const [isHidden, setIsHidden] = (0, import_react10.useState)(false);
2155
- const dragRef = (0, import_react10.useRef)(null);
2156
- const buttonRef = (0, import_react10.useRef)(null);
2157
- (0, import_react10.useEffect)(() => {
2158
- setMounted(true);
2159
- try {
2160
- const hidden = typeof window !== "undefined" ? localStorage.getItem(INSPECTOR_HIDE_KEY) : null;
2161
- if (hidden === "1" || hidden === "true") {
2162
- setIsHidden(true);
1322
+ [coAgentStateRenders, nodeName, agentId]
1323
+ );
1324
+ const handleRenderRequest = ({
1325
+ stateRenderId,
1326
+ messageId,
1327
+ runId: runId2,
1328
+ stateSnapshot: renderSnapshot
1329
+ }) => {
1330
+ if (claimsRef.current[messageId]) {
1331
+ const canRender = claimsRef.current[messageId].stateRenderId === stateRenderId;
1332
+ if (canRender && runId2 && (!claimsRef.current[messageId].runId || claimsRef.current[messageId].runId === "pending")) {
1333
+ claimsRef.current[messageId].runId = runId2;
2163
1334
  }
2164
- } catch (e) {
1335
+ return canRender;
2165
1336
  }
2166
- if (typeof window !== "undefined" && !buttonPosition) {
2167
- const buttonSize = 60;
2168
- const margin = 24;
2169
- const initialPosition = {
2170
- x: margin,
2171
- y: window.innerHeight - buttonSize - margin
2172
- };
2173
- setButtonPosition(initialPosition);
1337
+ const renderClaimedByOtherMessage = Object.values(claimsRef.current).find(
1338
+ (c) => c.stateRenderId === stateRenderId && (0, import_shared9.dataToUUID)(getStateWithoutConstantKeys(c.stateSnapshot)) === (0, import_shared9.dataToUUID)(getStateWithoutConstantKeys(renderSnapshot))
1339
+ );
1340
+ if (renderClaimedByOtherMessage) {
1341
+ if (renderSnapshot && renderClaimedByOtherMessage.stateSnapshot && !areStatesEquals(renderClaimedByOtherMessage.stateSnapshot, renderSnapshot)) {
1342
+ claimsRef.current[messageId] = { stateRenderId, runId: runId2 };
1343
+ return true;
1344
+ }
1345
+ return false;
2174
1346
  }
2175
- }, [position]);
2176
- const handleMouseDown = (e) => {
2177
- e.preventDefault();
2178
- if (!buttonPosition)
2179
- return;
2180
- dragRef.current = {
2181
- startX: e.clientX,
2182
- startY: e.clientY,
2183
- buttonX: buttonPosition.x,
2184
- buttonY: buttonPosition.y
2185
- };
2186
- setIsDragging(true);
1347
+ if (!runId2) {
1348
+ return false;
1349
+ }
1350
+ claimsRef.current[messageId] = { stateRenderId, runId: runId2 };
1351
+ return true;
2187
1352
  };
2188
- (0, import_react10.useEffect)(() => {
2189
- if (!isDragging)
1353
+ return (0, import_react11.useMemo)(() => {
1354
+ var _a2, _b, _c;
1355
+ if (messageIndexInRun !== 0) {
1356
+ return null;
1357
+ }
1358
+ const [stateRenderId, stateRender] = (_a2 = getStateRender(message.id)) != null ? _a2 : [];
1359
+ if (!stateRender || !stateRenderId) {
1360
+ return null;
1361
+ }
1362
+ const snapshot = stateSnapshot ? (0, import_shared9.parseJson)(stateSnapshot, stateSnapshot) : agent == null ? void 0 : agent.state;
1363
+ const canRender = handleRenderRequest({
1364
+ stateRenderId,
1365
+ messageId: message.id,
1366
+ runId: effectiveRunId,
1367
+ stateSnapshot: snapshot
1368
+ });
1369
+ if (!canRender) {
1370
+ return null;
1371
+ }
1372
+ if (snapshot && !claimsRef.current[message.id].locked) {
1373
+ if (stateSnapshot) {
1374
+ claimsRef.current[message.id].stateSnapshot = snapshot;
1375
+ claimsRef.current[message.id].locked = true;
1376
+ } else {
1377
+ claimsRef.current[message.id].stateSnapshot = snapshot;
1378
+ }
1379
+ }
1380
+ if (stateRender.handler) {
1381
+ stateRender.handler({
1382
+ state: stateSnapshot ? (0, import_shared9.parseJson)(stateSnapshot, stateSnapshot) : (_b = agent == null ? void 0 : agent.state) != null ? _b : {},
1383
+ nodeName: nodeName != null ? nodeName : ""
1384
+ });
1385
+ }
1386
+ if (stateRender.render) {
1387
+ const status = (agent == null ? void 0 : agent.isRunning) ? "inProgress" : "complete";
1388
+ if (typeof stateRender.render === "string")
1389
+ return stateRender.render;
1390
+ return stateRender.render({
1391
+ status,
1392
+ // Always use state from claim, to make sure the state does not seem "wiped" for a fraction of a second
1393
+ state: (_c = claimsRef.current[message.id].stateSnapshot) != null ? _c : {},
1394
+ nodeName: nodeName != null ? nodeName : ""
1395
+ });
1396
+ }
1397
+ }, [
1398
+ getStateRender,
1399
+ stateSnapshot,
1400
+ agent == null ? void 0 : agent.state,
1401
+ agent == null ? void 0 : agent.isRunning,
1402
+ nodeName,
1403
+ effectiveRunId,
1404
+ message.id,
1405
+ messageIndexInRun
1406
+ ]);
1407
+ }
1408
+ function CoAgentStateRenderBridge(props) {
1409
+ return useCoagentStateRenderBridge(props.agentId, props);
1410
+ }
1411
+
1412
+ // src/components/CopilotListeners.tsx
1413
+ var import_react12 = require("react");
1414
+ var import_react13 = require("@copilotkitnext/react");
1415
+ var import_shared10 = require("@copilotkit/shared");
1416
+ var import_shared11 = require("@copilotkit/shared");
1417
+ var usePredictStateSubscription = (agent) => {
1418
+ const predictStateToolsRef = (0, import_react12.useRef)([]);
1419
+ const getSubscriber = (0, import_react12.useCallback)(
1420
+ (agent2) => ({
1421
+ onCustomEvent: ({ event }) => {
1422
+ if (event.name === "PredictState") {
1423
+ predictStateToolsRef.current = event.value;
1424
+ }
1425
+ },
1426
+ onToolCallArgsEvent: ({ partialToolCallArgs, toolCallName }) => {
1427
+ predictStateToolsRef.current.forEach((t) => {
1428
+ if ((t == null ? void 0 : t.tool) !== toolCallName)
1429
+ return;
1430
+ const emittedState = typeof partialToolCallArgs === "string" ? (0, import_shared10.parseJson)(partialToolCallArgs, partialToolCallArgs) : partialToolCallArgs;
1431
+ agent2.setState({
1432
+ [t.state_key]: emittedState[t.state_key]
1433
+ });
1434
+ });
1435
+ }
1436
+ }),
1437
+ []
1438
+ );
1439
+ (0, import_react12.useEffect)(() => {
1440
+ if (!agent)
2190
1441
  return;
2191
- const handleMouseMove = (e) => {
2192
- e.preventDefault();
2193
- e.stopPropagation();
2194
- if (!dragRef.current)
2195
- return;
2196
- const deltaX = e.clientX - dragRef.current.startX;
2197
- const deltaY = e.clientY - dragRef.current.startY;
2198
- let newX = dragRef.current.buttonX + deltaX;
2199
- let newY = dragRef.current.buttonY + deltaY;
2200
- newX = Math.max(0, Math.min(newX, window.innerWidth - 60));
2201
- newY = Math.max(0, Math.min(newY, window.innerHeight - 60));
2202
- setButtonPosition({ x: newX, y: newY });
1442
+ const subscriber = getSubscriber(agent);
1443
+ const { unsubscribe } = agent.subscribe(subscriber);
1444
+ return () => {
1445
+ unsubscribe();
2203
1446
  };
2204
- const handleMouseUp = (e) => {
2205
- e.preventDefault();
2206
- e.stopPropagation();
2207
- setIsDragging(false);
2208
- dragRef.current = null;
1447
+ }, [agent, getSubscriber]);
1448
+ };
1449
+ function CopilotListeners() {
1450
+ const { copilotkit } = (0, import_react13.useCopilotKit)();
1451
+ const existingConfig = (0, import_react13.useCopilotChatConfiguration)();
1452
+ const resolvedAgentId = existingConfig == null ? void 0 : existingConfig.agentId;
1453
+ const { setBannerError } = useToast();
1454
+ const { agent } = (0, import_react13.useAgent)({ agentId: resolvedAgentId });
1455
+ usePredictStateSubscription(agent);
1456
+ (0, import_react12.useEffect)(() => {
1457
+ const subscriber = {
1458
+ onError: ({ error }) => {
1459
+ setBannerError(new import_shared11.CopilotKitLowLevelError({ error, message: error.message }));
1460
+ }
2209
1461
  };
2210
- document.addEventListener("mousemove", handleMouseMove, { capture: true, passive: false });
2211
- document.addEventListener("mouseup", handleMouseUp, { capture: true, passive: false });
1462
+ const subscription = copilotkit.subscribe(subscriber);
2212
1463
  return () => {
2213
- document.removeEventListener("mousemove", handleMouseMove, { capture: true });
2214
- document.removeEventListener("mouseup", handleMouseUp, { capture: true });
1464
+ subscription.unsubscribe();
2215
1465
  };
2216
- }, [isDragging]);
2217
- if (!mounted || !buttonPosition || isHidden) {
2218
- return null;
2219
- }
2220
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, { children: [
2221
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
2222
- "button",
2223
- {
2224
- ref: buttonRef,
2225
- onClick: (e) => {
2226
- if (!isDragging) {
2227
- if (e.metaKey || e.altKey) {
2228
- try {
2229
- localStorage.setItem(INSPECTOR_HIDE_KEY, "1");
2230
- } catch (e2) {
2231
- }
2232
- setIsHidden(true);
2233
- return;
2234
- }
2235
- setIsModalOpen(true);
2236
- }
2237
- },
2238
- onContextMenu: (e) => {
2239
- e.preventDefault();
2240
- try {
2241
- localStorage.setItem(INSPECTOR_HIDE_KEY, "1");
2242
- } catch (e2) {
2243
- }
2244
- setIsHidden(true);
2245
- },
2246
- onMouseDown: handleMouseDown,
2247
- onMouseEnter: () => setIsHovered(true),
2248
- onMouseLeave: () => setIsHovered(false),
2249
- style: {
2250
- position: "fixed",
2251
- left: `${buttonPosition.x}px`,
2252
- top: `${buttonPosition.y}px`,
2253
- zIndex: 2147483647,
2254
- width: "60px",
2255
- height: "60px",
2256
- background: isDragging ? "#000000" : isHovered ? "#111111" : "#000000",
2257
- color: "white",
2258
- borderRadius: "50%",
2259
- boxShadow: isDragging ? "0 8px 32px rgba(0, 0, 0, 0.6), 0 4px 16px rgba(0, 0, 0, 0.4)" : isHovered ? "0 12px 40px rgba(0, 0, 0, 0.7), 0 6px 20px rgba(0, 0, 0, 0.5)" : "0 6px 20px rgba(0, 0, 0, 0.5), 0 3px 10px rgba(0, 0, 0, 0.3)",
2260
- transition: isDragging ? "none" : "all 0.3s cubic-bezier(0.4, 0, 0.2, 1)",
2261
- display: "flex",
2262
- alignItems: "center",
2263
- justifyContent: "center",
2264
- border: "none",
2265
- cursor: isDragging ? "grabbing" : "grab",
2266
- opacity: 1,
2267
- userSelect: "none",
2268
- transform: isDragging ? "scale(1.05)" : isHovered ? "scale(1.1)" : "scale(1)",
2269
- backdropFilter: "blur(10px)",
2270
- pointerEvents: "auto",
2271
- isolation: "isolate"
2272
- },
2273
- title: hasApiKey ? "Open Inspector (Drag to move)" : "Inspector (License Key Required, Drag to move)",
2274
- children: [
2275
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
2276
- "div",
2277
- {
2278
- onClick: (e) => {
2279
- e.preventDefault();
2280
- e.stopPropagation();
2281
- try {
2282
- localStorage.setItem(INSPECTOR_HIDE_KEY, "1");
2283
- } catch (e2) {
2284
- }
2285
- setIsHidden(true);
2286
- },
2287
- style: {
2288
- position: "absolute",
2289
- bottom: "2px",
2290
- right: "2px",
2291
- width: "20px",
2292
- height: "20px",
2293
- borderRadius: "50%",
2294
- background: "#ffffff",
2295
- color: "#ef4444",
2296
- fontSize: "14px",
2297
- lineHeight: "18px",
2298
- textAlign: "center",
2299
- boxShadow: "0 2px 6px rgba(0,0,0,0.35)",
2300
- cursor: "pointer",
2301
- border: "1px solid #e5e7eb",
2302
- display: "flex",
2303
- alignItems: "center",
2304
- justifyContent: "center",
2305
- zIndex: 1
2306
- },
2307
- title: "Hide Inspector",
2308
- children: "\xD7"
2309
- }
2310
- ),
2311
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
2312
- "div",
2313
- {
2314
- style: {
2315
- width: "28px",
2316
- height: "28px",
2317
- display: "flex",
2318
- alignItems: "center",
2319
- justifyContent: "center",
2320
- filter: "drop-shadow(0 2px 4px rgba(0,0,0,0.2))"
2321
- },
2322
- children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CopilotKitIcon, {})
2323
- }
2324
- ),
2325
- !hasApiKey && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
2326
- "div",
2327
- {
2328
- style: {
2329
- position: "absolute",
2330
- top: "-2px",
2331
- right: "-2px",
2332
- width: "18px",
2333
- height: "18px",
2334
- background: "linear-gradient(135deg, #ff6b6b 0%, #ee5a24 100%)",
2335
- borderRadius: "50%",
2336
- display: "flex",
2337
- alignItems: "center",
2338
- justifyContent: "center",
2339
- boxShadow: "0 2px 8px rgba(255, 107, 107, 0.4)",
2340
- border: "2px solid white"
2341
- },
2342
- children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { style: { fontSize: "10px", color: "white", fontWeight: "bold" }, children: "!" })
2343
- }
2344
- )
2345
- ]
2346
- }
2347
- ),
2348
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
2349
- DeveloperConsoleModal,
2350
- {
2351
- isOpen: isModalOpen,
2352
- onClose: () => setIsModalOpen(false),
2353
- hasApiKey
2354
- }
2355
- )
2356
- ] });
1466
+ }, [copilotkit == null ? void 0 : copilotkit.subscribe]);
1467
+ return null;
2357
1468
  }
2358
1469
 
2359
1470
  // src/components/copilot-provider/copilotkit.tsx
2360
- var import_jsx_runtime8 = require("react/jsx-runtime");
1471
+ var import_jsx_runtime7 = require("react/jsx-runtime");
2361
1472
  function CopilotKit(_a) {
2362
1473
  var _b = _a, { children } = _b, props = __objRest(_b, ["children"]);
2363
1474
  const enabled = shouldShowDevConsole(props.showDevConsole);
1475
+ const showInspector = shouldShowDevConsole(props.enableInspector);
2364
1476
  const publicApiKey = props.publicApiKey || props.publicLicenseKey;
2365
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(ToastProvider, { enabled, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(CopilotErrorBoundary, { publicApiKey, showUsageBanner: enabled, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(CopilotKitInternal, __spreadProps(__spreadValues({}, props), { children })) }) });
1477
+ const renderArr = (0, import_react14.useMemo)(() => [{ render: CoAgentStateRenderBridge }], []);
1478
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(ToastProvider, { enabled, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CopilotErrorBoundary, { publicApiKey, showUsageBanner: enabled, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(ThreadsProvider, { threadId: props.threadId, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1479
+ import_react15.CopilotKitProvider,
1480
+ __spreadProps(__spreadValues({}, props), {
1481
+ showDevConsole: showInspector,
1482
+ renderCustomMessages: renderArr,
1483
+ useSingleEndpoint: true,
1484
+ children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CopilotKitInternal, __spreadProps(__spreadValues({}, props), { children }))
1485
+ })
1486
+ ) }) }) });
2366
1487
  }
2367
1488
  function CopilotKitInternal(cpkProps) {
2368
1489
  var _b;
2369
1490
  const _a = cpkProps, { children } = _a, props = __objRest(_a, ["children"]);
2370
1491
  validateProps(cpkProps);
2371
1492
  const publicApiKey = props.publicLicenseKey || props.publicApiKey;
2372
- const chatApiEndpoint = props.runtimeUrl || import_shared10.COPILOT_CLOUD_CHAT_URL;
2373
- const [actions, setActions] = (0, import_react11.useState)({});
2374
- const [coAgentStateRenders, setCoAgentStateRenders] = (0, import_react11.useState)({});
2375
- const chatComponentsCache = (0, import_react11.useRef)({
1493
+ const chatApiEndpoint = props.runtimeUrl || import_shared12.COPILOT_CLOUD_CHAT_URL;
1494
+ const [actions, setActions] = (0, import_react14.useState)({});
1495
+ const [registeredActionConfigs, setRegisteredActionConfigs] = (0, import_react14.useState)(/* @__PURE__ */ new Map());
1496
+ const chatComponentsCache = (0, import_react14.useRef)({
2376
1497
  actions: {},
2377
1498
  coAgentStateRenders: {}
2378
1499
  });
2379
1500
  const { addElement, removeElement, printTree, getAllElements } = use_tree_default();
2380
- const [isLoading, setIsLoading] = (0, import_react11.useState)(false);
2381
- const [chatInstructions, setChatInstructions] = (0, import_react11.useState)("");
2382
- const [authStates, setAuthStates] = (0, import_react11.useState)({});
2383
- const [extensions, setExtensions] = (0, import_react11.useState)({});
2384
- const [additionalInstructions, setAdditionalInstructions] = (0, import_react11.useState)([]);
1501
+ const [isLoading, setIsLoading] = (0, import_react14.useState)(false);
1502
+ const [chatInstructions, setChatInstructions] = (0, import_react14.useState)("");
1503
+ const [authStates, setAuthStates] = (0, import_react14.useState)({});
1504
+ const [extensions, setExtensions] = (0, import_react14.useState)({});
1505
+ const [additionalInstructions, setAdditionalInstructions] = (0, import_react14.useState)([]);
2385
1506
  const {
2386
1507
  addElement: addDocument,
2387
1508
  removeElement: removeDocument,
2388
1509
  allElements: allDocuments
2389
1510
  } = use_flat_category_store_default();
2390
- const setAction = (0, import_react11.useCallback)((id, action) => {
1511
+ const setAction = (0, import_react14.useCallback)((id, action) => {
2391
1512
  setActions((prevPoints) => {
2392
1513
  return __spreadProps(__spreadValues({}, prevPoints), {
2393
1514
  [id]: action
2394
1515
  });
2395
1516
  });
2396
1517
  }, []);
2397
- const removeAction = (0, import_react11.useCallback)((id) => {
1518
+ const removeAction = (0, import_react14.useCallback)((id) => {
2398
1519
  setActions((prevPoints) => {
2399
1520
  const newPoints = __spreadValues({}, prevPoints);
2400
1521
  delete newPoints[id];
2401
1522
  return newPoints;
2402
1523
  });
2403
1524
  }, []);
2404
- const setCoAgentStateRender = (0, import_react11.useCallback)((id, stateRender) => {
2405
- setCoAgentStateRenders((prevPoints) => {
2406
- return __spreadProps(__spreadValues({}, prevPoints), {
2407
- [id]: stateRender
2408
- });
2409
- });
2410
- }, []);
2411
- const removeCoAgentStateRender = (0, import_react11.useCallback)((id) => {
2412
- setCoAgentStateRenders((prevPoints) => {
2413
- const newPoints = __spreadValues({}, prevPoints);
2414
- delete newPoints[id];
2415
- return newPoints;
2416
- });
2417
- }, []);
2418
- const getContextString = (0, import_react11.useCallback)(
1525
+ const getContextString = (0, import_react14.useCallback)(
2419
1526
  (documents, categories) => {
2420
- const documentsString = documents.map((document2) => {
2421
- return `${document2.name} (${document2.sourceApplication}):
2422
- ${document2.getContents()}`;
1527
+ const documentsString = documents.map((document) => {
1528
+ return `${document.name} (${document.sourceApplication}):
1529
+ ${document.getContents()}`;
2423
1530
  }).join("\n\n");
2424
1531
  const nonDocumentStrings = printTree(categories);
2425
1532
  return `${documentsString}
@@ -2428,46 +1535,46 @@ ${nonDocumentStrings}`;
2428
1535
  },
2429
1536
  [printTree]
2430
1537
  );
2431
- const addContext = (0, import_react11.useCallback)(
1538
+ const addContext = (0, import_react14.useCallback)(
2432
1539
  (context, parentId, categories = defaultCopilotContextCategories) => {
2433
1540
  return addElement(context, categories, parentId);
2434
1541
  },
2435
1542
  [addElement]
2436
1543
  );
2437
- const removeContext = (0, import_react11.useCallback)(
1544
+ const removeContext = (0, import_react14.useCallback)(
2438
1545
  (id) => {
2439
1546
  removeElement(id);
2440
1547
  },
2441
1548
  [removeElement]
2442
1549
  );
2443
- const getAllContext = (0, import_react11.useCallback)(() => {
1550
+ const getAllContext = (0, import_react14.useCallback)(() => {
2444
1551
  return getAllElements();
2445
1552
  }, [getAllElements]);
2446
- const getFunctionCallHandler = (0, import_react11.useCallback)(
1553
+ const getFunctionCallHandler = (0, import_react14.useCallback)(
2447
1554
  (customEntryPoints) => {
2448
1555
  return entryPointsToFunctionCallHandler(Object.values(customEntryPoints || actions));
2449
1556
  },
2450
1557
  [actions]
2451
1558
  );
2452
- const getDocumentsContext = (0, import_react11.useCallback)(
1559
+ const getDocumentsContext = (0, import_react14.useCallback)(
2453
1560
  (categories) => {
2454
1561
  return allDocuments(categories);
2455
1562
  },
2456
1563
  [allDocuments]
2457
1564
  );
2458
- const addDocumentContext = (0, import_react11.useCallback)(
1565
+ const addDocumentContext = (0, import_react14.useCallback)(
2459
1566
  (documentPointer, categories = defaultCopilotContextCategories) => {
2460
1567
  return addDocument(documentPointer, categories);
2461
1568
  },
2462
1569
  [addDocument]
2463
1570
  );
2464
- const removeDocumentContext = (0, import_react11.useCallback)(
1571
+ const removeDocumentContext = (0, import_react14.useCallback)(
2465
1572
  (documentId) => {
2466
1573
  removeDocument(documentId);
2467
1574
  },
2468
1575
  [removeDocument]
2469
1576
  );
2470
- const copilotApiConfig = (0, import_react11.useMemo)(() => {
1577
+ const copilotApiConfig = (0, import_react14.useMemo)(() => {
2471
1578
  var _a2, _b2;
2472
1579
  let cloud = void 0;
2473
1580
  if (publicApiKey) {
@@ -2503,7 +1610,7 @@ ${nonDocumentStrings}`;
2503
1610
  props.cloudRestrictToTopic,
2504
1611
  props.guardrails_c
2505
1612
  ]);
2506
- const headers = (0, import_react11.useMemo)(() => {
1613
+ const headers = (0, import_react14.useMemo)(() => {
2507
1614
  const authHeaders = Object.values(authStates || {}).reduce((acc, state) => {
2508
1615
  if (state.status === "authenticated" && state.authHeaders) {
2509
1616
  return __spreadValues(__spreadValues({}, acc), Object.entries(state.authHeaders).reduce(
@@ -2515,27 +1622,27 @@ ${nonDocumentStrings}`;
2515
1622
  }
2516
1623
  return acc;
2517
1624
  }, {});
2518
- return __spreadValues(__spreadValues(__spreadValues({}, copilotApiConfig.headers || {}), copilotApiConfig.publicApiKey ? { [import_shared10.COPILOT_CLOUD_PUBLIC_API_KEY_HEADER]: copilotApiConfig.publicApiKey } : {}), authHeaders);
1625
+ return __spreadValues(__spreadValues(__spreadValues({}, copilotApiConfig.headers || {}), copilotApiConfig.publicApiKey ? { [import_shared12.COPILOT_CLOUD_PUBLIC_API_KEY_HEADER]: copilotApiConfig.publicApiKey } : {}), authHeaders);
2519
1626
  }, [copilotApiConfig.headers, copilotApiConfig.publicApiKey, authStates]);
2520
- const [internalErrorHandlers, _setInternalErrorHandler] = (0, import_react11.useState)({});
2521
- const setInternalErrorHandler = (0, import_react11.useCallback)((handler) => {
1627
+ const [internalErrorHandlers, _setInternalErrorHandler] = (0, import_react14.useState)({});
1628
+ const setInternalErrorHandler = (0, import_react14.useCallback)((handler) => {
2522
1629
  _setInternalErrorHandler((prev) => __spreadValues(__spreadValues({}, prev), handler));
2523
1630
  }, []);
2524
- const removeInternalErrorHandler = (0, import_react11.useCallback)((key) => {
1631
+ const removeInternalErrorHandler = (0, import_react14.useCallback)((key) => {
2525
1632
  _setInternalErrorHandler((prev) => {
2526
1633
  const _a2 = prev, { [key]: _removed } = _a2, rest = __objRest(_a2, [__restKey(key)]);
2527
1634
  return rest;
2528
1635
  });
2529
1636
  }, []);
2530
- const onErrorRef = (0, import_react11.useRef)(props.onError);
2531
- (0, import_react11.useEffect)(() => {
1637
+ const onErrorRef = (0, import_react14.useRef)(props.onError);
1638
+ (0, import_react14.useEffect)(() => {
2532
1639
  onErrorRef.current = props.onError;
2533
1640
  }, [props.onError]);
2534
- const internalHandlersRef = (0, import_react11.useRef)({});
2535
- (0, import_react11.useEffect)(() => {
1641
+ const internalHandlersRef = (0, import_react14.useRef)({});
1642
+ (0, import_react14.useEffect)(() => {
2536
1643
  internalHandlersRef.current = internalErrorHandlers;
2537
1644
  }, [internalErrorHandlers]);
2538
- const handleErrors = (0, import_react11.useCallback)(
1645
+ const handleErrors = (0, import_react14.useCallback)(
2539
1646
  (error) => __async(this, null, function* () {
2540
1647
  if (copilotApiConfig.publicApiKey && onErrorRef.current) {
2541
1648
  try {
@@ -2555,22 +1662,14 @@ ${nonDocumentStrings}`;
2555
1662
  }),
2556
1663
  [copilotApiConfig.publicApiKey]
2557
1664
  );
2558
- const runtimeClient = useCopilotRuntimeClient({
2559
- url: copilotApiConfig.chatApiEndpoint,
2560
- publicApiKey,
2561
- headers,
2562
- credentials: copilotApiConfig.credentials,
2563
- showDevConsole: shouldShowDevConsole(props.showDevConsole),
2564
- onError: handleErrors
2565
- });
2566
- const [chatSuggestionConfiguration, setChatSuggestionConfiguration] = (0, import_react11.useState)({});
2567
- const addChatSuggestionConfiguration = (0, import_react11.useCallback)(
1665
+ const [chatSuggestionConfiguration, setChatSuggestionConfiguration] = (0, import_react14.useState)({});
1666
+ const addChatSuggestionConfiguration = (0, import_react14.useCallback)(
2568
1667
  (id, suggestion) => {
2569
1668
  setChatSuggestionConfiguration((prev) => __spreadProps(__spreadValues({}, prev), { [id]: suggestion }));
2570
1669
  },
2571
1670
  [setChatSuggestionConfiguration]
2572
1671
  );
2573
- const removeChatSuggestionConfiguration = (0, import_react11.useCallback)(
1672
+ const removeChatSuggestionConfiguration = (0, import_react14.useCallback)(
2574
1673
  (id) => {
2575
1674
  setChatSuggestionConfiguration((prev) => {
2576
1675
  const _a2 = prev, { [id]: _ } = _a2, rest = __objRest(_a2, [__restKey(id)]);
@@ -2579,10 +1678,10 @@ ${nonDocumentStrings}`;
2579
1678
  },
2580
1679
  [setChatSuggestionConfiguration]
2581
1680
  );
2582
- const [availableAgents, setAvailableAgents] = (0, import_react11.useState)([]);
2583
- const [coagentStates, setCoagentStates] = (0, import_react11.useState)({});
2584
- const coagentStatesRef = (0, import_react11.useRef)({});
2585
- const setCoagentStatesWithRef = (0, import_react11.useCallback)(
1681
+ const [availableAgents, setAvailableAgents] = (0, import_react14.useState)([]);
1682
+ const [coagentStates, setCoagentStates] = (0, import_react14.useState)({});
1683
+ const coagentStatesRef = (0, import_react14.useRef)({});
1684
+ const setCoagentStatesWithRef = (0, import_react14.useCallback)(
2586
1685
  (value) => {
2587
1686
  const newValue = typeof value === "function" ? value(coagentStatesRef.current) : value;
2588
1687
  coagentStatesRef.current = newValue;
@@ -2592,28 +1691,14 @@ ${nonDocumentStrings}`;
2592
1691
  },
2593
1692
  []
2594
1693
  );
2595
- const hasLoadedAgents = (0, import_react11.useRef)(false);
2596
- (0, import_react11.useEffect)(() => {
2597
- if (hasLoadedAgents.current)
2598
- return;
2599
- const fetchData = () => __async(this, null, function* () {
2600
- var _a2;
2601
- const result = yield runtimeClient.availableAgents();
2602
- if ((_a2 = result.data) == null ? void 0 : _a2.availableAgents) {
2603
- setAvailableAgents(result.data.availableAgents.agents);
2604
- }
2605
- hasLoadedAgents.current = true;
2606
- });
2607
- void fetchData();
2608
- }, []);
2609
1694
  let initialAgentSession = null;
2610
1695
  if (props.agent) {
2611
1696
  initialAgentSession = {
2612
1697
  agentName: props.agent
2613
1698
  };
2614
1699
  }
2615
- const [agentSession, setAgentSession] = (0, import_react11.useState)(initialAgentSession);
2616
- (0, import_react11.useEffect)(() => {
1700
+ const [agentSession, setAgentSession] = (0, import_react14.useState)(initialAgentSession);
1701
+ (0, import_react14.useEffect)(() => {
2617
1702
  if (props.agent) {
2618
1703
  setAgentSession({
2619
1704
  agentName: props.agent
@@ -2622,8 +1707,8 @@ ${nonDocumentStrings}`;
2622
1707
  setAgentSession(null);
2623
1708
  }
2624
1709
  }, [props.agent]);
2625
- const [internalThreadId, setInternalThreadId] = (0, import_react11.useState)(props.threadId || (0, import_shared10.randomUUID)());
2626
- const setThreadId = (0, import_react11.useCallback)(
1710
+ const { threadId, setThreadId: setInternalThreadId } = useThreads();
1711
+ const setThreadId = (0, import_react14.useCallback)(
2627
1712
  (value) => {
2628
1713
  if (props.threadId) {
2629
1714
  throw new Error("Cannot call setThreadId() when threadId is provided via props.");
@@ -2632,51 +1717,63 @@ ${nonDocumentStrings}`;
2632
1717
  },
2633
1718
  [props.threadId]
2634
1719
  );
2635
- (0, import_react11.useEffect)(() => {
2636
- if (props.threadId !== void 0) {
2637
- setInternalThreadId(props.threadId);
2638
- }
2639
- }, [props.threadId]);
2640
- const [runId, setRunId] = (0, import_react11.useState)(null);
2641
- const chatAbortControllerRef = (0, import_react11.useRef)(null);
1720
+ const [runId, setRunId] = (0, import_react14.useState)(null);
1721
+ const chatAbortControllerRef = (0, import_react14.useRef)(null);
2642
1722
  const showDevConsole = shouldShowDevConsole(props.showDevConsole);
2643
- const [langGraphInterruptActions, _setLangGraphInterruptAction] = (0, import_react11.useState)({});
2644
- const setLangGraphInterruptAction = (0, import_react11.useCallback)(
2645
- (threadId, action) => {
2646
- _setLangGraphInterruptAction((prev) => {
2647
- var _a2, _b2, _c;
2648
- if (action == null)
2649
- return __spreadProps(__spreadValues({}, prev), {
2650
- [threadId]: null
2651
- });
2652
- let event = (_a2 = prev[threadId]) == null ? void 0 : _a2.event;
2653
- if (action.event) {
2654
- event = __spreadValues(__spreadValues({}, ((_b2 = prev[threadId]) == null ? void 0 : _b2.event) || {}), action.event);
2655
- }
1723
+ const [interruptActions, _setInterruptActions] = (0, import_react14.useState)({});
1724
+ const setInterruptAction = (0, import_react14.useCallback)((action) => {
1725
+ _setInterruptActions((prev) => {
1726
+ var _a2;
1727
+ if (action == null || !action.id) {
1728
+ return prev;
1729
+ }
1730
+ return __spreadProps(__spreadValues({}, prev), {
1731
+ [action.id]: __spreadValues(__spreadValues({}, (_a2 = prev[action.id]) != null ? _a2 : {}), action)
1732
+ });
1733
+ });
1734
+ }, []);
1735
+ const removeInterruptAction = (0, import_react14.useCallback)((actionId) => {
1736
+ _setInterruptActions((prev) => {
1737
+ const _a2 = prev, { [actionId]: _ } = _a2, rest = __objRest(_a2, [__restKey(actionId)]);
1738
+ return rest;
1739
+ });
1740
+ }, []);
1741
+ const [interruptEventQueue, setInterruptEventQueue] = (0, import_react14.useState)({});
1742
+ const addInterruptEvent = (0, import_react14.useCallback)((queuedEvent) => {
1743
+ setInterruptEventQueue((prev) => {
1744
+ const threadQueue = prev[queuedEvent.threadId] || [];
1745
+ return __spreadProps(__spreadValues({}, prev), {
1746
+ [queuedEvent.threadId]: [...threadQueue, queuedEvent]
1747
+ });
1748
+ });
1749
+ }, []);
1750
+ const resolveInterruptEvent = (0, import_react14.useCallback)(
1751
+ (threadId2, eventId, response) => {
1752
+ setInterruptEventQueue((prev) => {
1753
+ const threadQueue = prev[threadId2] || [];
2656
1754
  return __spreadProps(__spreadValues({}, prev), {
2657
- [threadId]: __spreadProps(__spreadValues(__spreadValues({}, (_c = prev[threadId]) != null ? _c : {}), action), { event })
1755
+ [threadId2]: threadQueue.map(
1756
+ (queuedEvent) => queuedEvent.eventId === eventId ? __spreadProps(__spreadValues({}, queuedEvent), { event: __spreadProps(__spreadValues({}, queuedEvent.event), { response }) }) : queuedEvent
1757
+ )
2658
1758
  });
2659
1759
  });
2660
1760
  },
2661
1761
  []
2662
1762
  );
2663
- const removeLangGraphInterruptAction = (0, import_react11.useCallback)((threadId) => {
2664
- setLangGraphInterruptAction(threadId, null);
2665
- }, []);
2666
- const memoizedChildren = (0, import_react11.useMemo)(() => children, [children]);
2667
- const [bannerError, setBannerError] = (0, import_react11.useState)(null);
2668
- const agentLock = (0, import_react11.useMemo)(() => {
1763
+ const memoizedChildren = (0, import_react14.useMemo)(() => children, [children]);
1764
+ const [bannerError, setBannerError] = (0, import_react14.useState)(null);
1765
+ const agentLock = (0, import_react14.useMemo)(() => {
2669
1766
  var _a2;
2670
1767
  return (_a2 = props.agent) != null ? _a2 : null;
2671
1768
  }, [props.agent]);
2672
- const forwardedParameters = (0, import_react11.useMemo)(
1769
+ const forwardedParameters = (0, import_react14.useMemo)(
2673
1770
  () => {
2674
1771
  var _a2;
2675
1772
  return (_a2 = props.forwardedParameters) != null ? _a2 : {};
2676
1773
  },
2677
1774
  [props.forwardedParameters]
2678
1775
  );
2679
- const updateExtensions = (0, import_react11.useCallback)(
1776
+ const updateExtensions = (0, import_react14.useCallback)(
2680
1777
  (newExtensions) => {
2681
1778
  setExtensions((prev) => {
2682
1779
  const resolved = typeof newExtensions === "function" ? newExtensions(prev) : newExtensions;
@@ -2688,7 +1785,7 @@ ${nonDocumentStrings}`;
2688
1785
  },
2689
1786
  [setExtensions]
2690
1787
  );
2691
- const updateAuthStates = (0, import_react11.useCallback)(
1788
+ const updateAuthStates = (0, import_react14.useCallback)(
2692
1789
  (newAuthStates) => {
2693
1790
  setAuthStates((prev) => {
2694
1791
  const resolved = typeof newAuthStates === "function" ? newAuthStates(prev) : newAuthStates;
@@ -2700,81 +1797,114 @@ ${nonDocumentStrings}`;
2700
1797
  },
2701
1798
  [setAuthStates]
2702
1799
  );
2703
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
2704
- CopilotContext.Provider,
1800
+ const handleSetRegisteredActions = (0, import_react14.useCallback)((actionConfig) => {
1801
+ const key = actionConfig.action.name || (0, import_shared12.randomUUID)();
1802
+ setRegisteredActionConfigs((prev) => {
1803
+ const newMap = new Map(prev);
1804
+ newMap.set(key, actionConfig);
1805
+ return newMap;
1806
+ });
1807
+ return key;
1808
+ }, []);
1809
+ const handleRemoveRegisteredAction = (0, import_react14.useCallback)((actionKey) => {
1810
+ setRegisteredActionConfigs((prev) => {
1811
+ const newMap = new Map(prev);
1812
+ newMap.delete(actionKey);
1813
+ return newMap;
1814
+ });
1815
+ }, []);
1816
+ const RegisteredActionsRenderer = (0, import_react14.useMemo)(() => {
1817
+ return () => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_jsx_runtime7.Fragment, { children: Array.from(registeredActionConfigs.entries()).map(([key, config]) => {
1818
+ const Component = config.component;
1819
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Component, { action: config.action }, key);
1820
+ }) });
1821
+ }, [registeredActionConfigs]);
1822
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1823
+ import_react15.CopilotChatConfigurationProvider,
2705
1824
  {
2706
- value: {
2707
- actions,
2708
- chatComponentsCache,
2709
- getFunctionCallHandler,
2710
- setAction,
2711
- removeAction,
2712
- coAgentStateRenders,
2713
- setCoAgentStateRender,
2714
- removeCoAgentStateRender,
2715
- getContextString,
2716
- addContext,
2717
- removeContext,
2718
- getAllContext,
2719
- getDocumentsContext,
2720
- addDocumentContext,
2721
- removeDocumentContext,
2722
- copilotApiConfig,
2723
- isLoading,
2724
- setIsLoading,
2725
- chatSuggestionConfiguration,
2726
- addChatSuggestionConfiguration,
2727
- removeChatSuggestionConfiguration,
2728
- chatInstructions,
2729
- setChatInstructions,
2730
- additionalInstructions,
2731
- setAdditionalInstructions,
2732
- showDevConsole,
2733
- coagentStates,
2734
- setCoagentStates,
2735
- coagentStatesRef,
2736
- setCoagentStatesWithRef,
2737
- agentSession,
2738
- setAgentSession,
2739
- runtimeClient,
2740
- forwardedParameters,
2741
- agentLock,
2742
- threadId: internalThreadId,
2743
- setThreadId,
2744
- runId,
2745
- setRunId,
2746
- chatAbortControllerRef,
2747
- availableAgents,
2748
- authConfig_c: props.authConfig_c,
2749
- authStates_c: authStates,
2750
- setAuthStates_c: updateAuthStates,
2751
- extensions,
2752
- setExtensions: updateExtensions,
2753
- langGraphInterruptAction: (_b = langGraphInterruptActions[internalThreadId]) != null ? _b : null,
2754
- setLangGraphInterruptAction,
2755
- removeLangGraphInterruptAction,
2756
- bannerError,
2757
- setBannerError,
2758
- onError: handleErrors,
2759
- internalErrorHandlers,
2760
- setInternalErrorHandler,
2761
- removeInternalErrorHandler
2762
- },
2763
- children: [
2764
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(MessagesTapProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(CopilotMessages, { children: [
2765
- memoizedChildren,
2766
- showDevConsole && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(ConsoleTrigger, {})
2767
- ] }) }),
2768
- bannerError && showDevConsole && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
2769
- UsageBanner,
2770
- {
2771
- severity: bannerError.severity,
2772
- message: bannerError.message,
2773
- onClose: () => setBannerError(null),
2774
- actions: getErrorActions(bannerError)
2775
- }
2776
- )
2777
- ]
1825
+ agentId: (_b = props.agent) != null ? _b : "default",
1826
+ threadId,
1827
+ children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
1828
+ CopilotContext.Provider,
1829
+ {
1830
+ value: {
1831
+ actions,
1832
+ chatComponentsCache,
1833
+ getFunctionCallHandler,
1834
+ setAction,
1835
+ removeAction,
1836
+ setRegisteredActions: handleSetRegisteredActions,
1837
+ removeRegisteredAction: handleRemoveRegisteredAction,
1838
+ getContextString,
1839
+ addContext,
1840
+ removeContext,
1841
+ getAllContext,
1842
+ getDocumentsContext,
1843
+ addDocumentContext,
1844
+ removeDocumentContext,
1845
+ copilotApiConfig,
1846
+ isLoading,
1847
+ setIsLoading,
1848
+ chatSuggestionConfiguration,
1849
+ addChatSuggestionConfiguration,
1850
+ removeChatSuggestionConfiguration,
1851
+ chatInstructions,
1852
+ setChatInstructions,
1853
+ additionalInstructions,
1854
+ setAdditionalInstructions,
1855
+ showDevConsole,
1856
+ coagentStates,
1857
+ setCoagentStates,
1858
+ coagentStatesRef,
1859
+ setCoagentStatesWithRef,
1860
+ agentSession,
1861
+ setAgentSession,
1862
+ forwardedParameters,
1863
+ agentLock,
1864
+ threadId,
1865
+ setThreadId,
1866
+ runId,
1867
+ setRunId,
1868
+ chatAbortControllerRef,
1869
+ availableAgents,
1870
+ authConfig_c: props.authConfig_c,
1871
+ authStates_c: authStates,
1872
+ setAuthStates_c: updateAuthStates,
1873
+ extensions,
1874
+ setExtensions: updateExtensions,
1875
+ interruptActions,
1876
+ setInterruptAction,
1877
+ removeInterruptAction,
1878
+ interruptEventQueue,
1879
+ addInterruptEvent,
1880
+ resolveInterruptEvent,
1881
+ bannerError,
1882
+ setBannerError,
1883
+ onError: handleErrors,
1884
+ internalErrorHandlers,
1885
+ setInternalErrorHandler,
1886
+ removeInternalErrorHandler
1887
+ },
1888
+ children: [
1889
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CopilotListeners, {}),
1890
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(CoAgentStateRendersProvider, { children: [
1891
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(MessagesTapProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(CopilotMessages, { children: [
1892
+ memoizedChildren,
1893
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(RegisteredActionsRenderer, {})
1894
+ ] }) }),
1895
+ bannerError && showDevConsole && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1896
+ UsageBanner,
1897
+ {
1898
+ severity: bannerError.severity,
1899
+ message: bannerError.message,
1900
+ onClose: () => setBannerError(null),
1901
+ actions: getErrorActions(bannerError)
1902
+ }
1903
+ )
1904
+ ] })
1905
+ ]
1906
+ }
1907
+ )
2778
1908
  }
2779
1909
  );
2780
1910
  }
@@ -2811,12 +1941,12 @@ function validateProps(props) {
2811
1941
  const cloudFeatures = Object.keys(props).filter((key) => key.endsWith("_c"));
2812
1942
  const hasApiKey = props.publicApiKey || props.publicLicenseKey;
2813
1943
  if (!props.runtimeUrl && !hasApiKey) {
2814
- throw new import_shared10.ConfigurationError(
1944
+ throw new import_shared12.ConfigurationError(
2815
1945
  "Missing required prop: 'runtimeUrl' or 'publicApiKey' or 'publicLicenseKey'"
2816
1946
  );
2817
1947
  }
2818
1948
  if (cloudFeatures.length > 0 && !hasApiKey) {
2819
- throw new import_shared10.MissingPublicApiKeyError(
1949
+ throw new import_shared12.MissingPublicApiKeyError(
2820
1950
  `Missing required prop: 'publicApiKey' or 'publicLicenseKey' to use cloud features: ${cloudFeatures.map(formatFeatureName).join(", ")}`
2821
1951
  );
2822
1952
  }