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