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

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-RLR36R2Y.mjs → chunk-3V5TOYKW.mjs} +4 -4
  4. package/dist/chunk-3V5TOYKW.mjs.map +1 -0
  5. package/dist/chunk-4RRMC7L2.mjs +32 -0
  6. package/dist/chunk-4RRMC7L2.mjs.map +1 -0
  7. package/dist/chunk-4YZA2BZC.mjs +551 -0
  8. package/dist/chunk-4YZA2BZC.mjs.map +1 -0
  9. package/dist/{chunk-3HEGBDUK.mjs → chunk-53K6WNJG.mjs} +8 -6
  10. package/dist/{chunk-3HEGBDUK.mjs.map → chunk-53K6WNJG.mjs.map} +1 -1
  11. package/dist/{chunk-N4WEHORG.mjs → chunk-6PUNP7CD.mjs} +4 -4
  12. package/dist/chunk-6PUNP7CD.mjs.map +1 -0
  13. package/dist/chunk-7DTB7S5V.mjs +83 -0
  14. package/dist/chunk-7DTB7S5V.mjs.map +1 -0
  15. package/dist/{chunk-BBUQMG45.mjs → chunk-7IBF6RBW.mjs} +3 -3
  16. package/dist/{chunk-BBUQMG45.mjs.map → chunk-7IBF6RBW.mjs.map} +1 -1
  17. package/dist/chunk-A6NKSGH3.mjs +1 -0
  18. package/dist/{chunk-MGWRDFBE.mjs → chunk-ABWT4DRT.mjs} +2 -2
  19. package/dist/{chunk-EUX2P2E7.mjs → chunk-AFNWX62Q.mjs} +11 -9
  20. package/dist/chunk-AFNWX62Q.mjs.map +1 -0
  21. package/dist/{chunk-E6ER5C5U.mjs → chunk-BUSWSDYO.mjs} +2 -2
  22. package/dist/chunk-CDUIA2WM.mjs +60 -0
  23. package/dist/chunk-CDUIA2WM.mjs.map +1 -0
  24. package/dist/chunk-CYDWEPFL.mjs +1 -0
  25. package/dist/{chunk-ZLQVRPDS.mjs → chunk-DMLQZG75.mjs} +1 -1
  26. package/dist/chunk-DMLQZG75.mjs.map +1 -0
  27. package/dist/{chunk-GIGUZ2OK.mjs → chunk-E7SE25ZU.mjs} +3 -3
  28. package/dist/chunk-F555TVE4.mjs +33 -0
  29. package/dist/chunk-F555TVE4.mjs.map +1 -0
  30. package/dist/chunk-FD6FGKYY.mjs +1 -0
  31. package/dist/chunk-FDOMAPJY.mjs +59 -0
  32. package/dist/chunk-FDOMAPJY.mjs.map +1 -0
  33. package/dist/{chunk-BCZQ5BZB.mjs → chunk-FQFXYAV7.mjs} +6 -5
  34. package/dist/{chunk-BCZQ5BZB.mjs.map → chunk-FQFXYAV7.mjs.map} +1 -1
  35. package/dist/chunk-GPEJNVE5.mjs +80 -0
  36. package/dist/chunk-GPEJNVE5.mjs.map +1 -0
  37. package/dist/{chunk-FPOOU7AG.mjs → chunk-HE22TZMF.mjs} +10 -46
  38. package/dist/chunk-HE22TZMF.mjs.map +1 -0
  39. package/dist/chunk-I76HKHPJ.mjs +32 -0
  40. package/dist/chunk-I76HKHPJ.mjs.map +1 -0
  41. package/dist/chunk-JD7BAH7U.mjs +1 -0
  42. package/dist/{chunk-L3I57GMV.mjs → chunk-LHERIF3L.mjs} +4 -4
  43. package/dist/chunk-LSHFN2Y5.mjs +349 -0
  44. package/dist/chunk-LSHFN2Y5.mjs.map +1 -0
  45. package/dist/chunk-NB2FKV2V.mjs +1 -0
  46. package/dist/chunk-NBK4KBLX.mjs +54 -0
  47. package/dist/chunk-NBK4KBLX.mjs.map +1 -0
  48. package/dist/chunk-QNUAXSDP.mjs +166 -0
  49. package/dist/chunk-QNUAXSDP.mjs.map +1 -0
  50. package/dist/chunk-SPCZTZCY.mjs +1 -0
  51. package/dist/chunk-SPCZTZCY.mjs.map +1 -0
  52. package/dist/chunk-VV56AVPB.mjs +125 -0
  53. package/dist/chunk-VV56AVPB.mjs.map +1 -0
  54. package/dist/chunk-WF65O6HX.mjs +66 -0
  55. package/dist/chunk-WF65O6HX.mjs.map +1 -0
  56. package/dist/chunk-XDFVCQD3.mjs +27 -0
  57. package/dist/chunk-XDFVCQD3.mjs.map +1 -0
  58. package/dist/{chunk-TUTNHDM3.mjs → chunk-YCG6SNAU.mjs} +5 -5
  59. package/dist/{chunk-3WUDRJTT.mjs → chunk-YTQHRJUA.mjs} +9 -11
  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 +14 -12
  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 +15 -12
  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 +16 -12
  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 +22 -6
  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 +50 -58
  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 +82 -65
  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-3MUCKQXM.mjs +0 -71
  296. package/dist/chunk-3MUCKQXM.mjs.map +0 -1
  297. package/dist/chunk-3WUDRJTT.mjs.map +0 -1
  298. package/dist/chunk-4I6ZMKGV.mjs +0 -723
  299. package/dist/chunk-4I6ZMKGV.mjs.map +0 -1
  300. package/dist/chunk-5FHSUKQL.mjs.map +0 -1
  301. package/dist/chunk-CUWOXXM5.mjs +0 -231
  302. package/dist/chunk-CUWOXXM5.mjs.map +0 -1
  303. package/dist/chunk-DZTU6PGS.mjs +0 -1
  304. package/dist/chunk-EUX2P2E7.mjs.map +0 -1
  305. package/dist/chunk-FPOOU7AG.mjs.map +0 -1
  306. package/dist/chunk-H4AHA2Y7.mjs +0 -22
  307. package/dist/chunk-H4AHA2Y7.mjs.map +0 -1
  308. package/dist/chunk-HDOG2RTM.mjs +0 -37
  309. package/dist/chunk-HDOG2RTM.mjs.map +0 -1
  310. package/dist/chunk-HI6SPUOX.mjs +0 -142
  311. package/dist/chunk-HI6SPUOX.mjs.map +0 -1
  312. package/dist/chunk-IN74FLIZ.mjs +0 -804
  313. package/dist/chunk-IN74FLIZ.mjs.map +0 -1
  314. package/dist/chunk-N4WEHORG.mjs.map +0 -1
  315. package/dist/chunk-R4Y45UGQ.mjs +0 -25
  316. package/dist/chunk-R4Y45UGQ.mjs.map +0 -1
  317. package/dist/chunk-RLR36R2Y.mjs.map +0 -1
  318. package/dist/chunk-W2UUH57V.mjs +0 -332
  319. package/dist/chunk-W2UUH57V.mjs.map +0 -1
  320. package/dist/chunk-X5GRTEAW.mjs +0 -13
  321. package/dist/chunk-X5GRTEAW.mjs.map +0 -1
  322. package/dist/chunk-YAV3YNFQ.mjs +0 -239
  323. package/dist/chunk-YAV3YNFQ.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-YPBKY4KY.mjs.map → chunk-A6NKSGH3.mjs.map} +0 -0
  347. /package/dist/{chunk-MGWRDFBE.mjs.map → chunk-ABWT4DRT.mjs.map} +0 -0
  348. /package/dist/{chunk-E6ER5C5U.mjs.map → chunk-BUSWSDYO.mjs.map} +0 -0
  349. /package/dist/{chunk-YPSGKPDA.mjs.map → chunk-CYDWEPFL.mjs.map} +0 -0
  350. /package/dist/{chunk-GIGUZ2OK.mjs.map → chunk-E7SE25ZU.mjs.map} +0 -0
  351. /package/dist/{hooks/use-chat.mjs.map → chunk-FD6FGKYY.mjs.map} +0 -0
  352. /package/dist/{utils/extract.mjs.map → chunk-JD7BAH7U.mjs.map} +0 -0
  353. /package/dist/{chunk-L3I57GMV.mjs.map → chunk-LHERIF3L.mjs.map} +0 -0
  354. /package/dist/{utils/suggestions.mjs.map → chunk-NB2FKV2V.mjs.map} +0 -0
  355. /package/dist/{chunk-TUTNHDM3.mjs.map → chunk-YCG6SNAU.mjs.map} +0 -0
@@ -1,23 +1,67 @@
1
- import { useRef, useEffect, useCallback, useState, useMemo } from "react";
2
- import { AgentSession, useCopilotContext, CopilotContextParams } from "../context/copilot-context";
3
- import { useCopilotMessagesContext, CopilotMessagesContextParams } from "../context";
1
+ import { useRef, useEffect, useCallback, useMemo, useState, createElement } from "react";
2
+ import { useCopilotContext } from "../context/copilot-context";
4
3
  import { SystemMessageFunction } from "../types";
5
- import { useChat, AppendMessageOptions } from "./use-chat";
6
- import { defaultCopilotContextCategories } from "../components";
7
- import { CoAgentStateRenderHandlerArguments } from "@copilotkit/shared";
8
4
  import { useAsyncCallback } from "../components/error-boundary/error-utils";
9
- import { reloadSuggestions as generateSuggestions } from "../utils";
10
- import type { SuggestionItem } from "../utils";
11
-
12
5
  import { Message } from "@copilotkit/shared";
13
- import {
14
- Role as gqlRole,
15
- TextMessage,
16
- aguiToGQL,
17
- gqlToAGUI,
18
- Message as DeprecatedGqlMessage,
19
- } from "@copilotkit/runtime-client-gql";
6
+ import { gqlToAGUI, Message as DeprecatedGqlMessage } from "@copilotkit/runtime-client-gql";
20
7
  import { useLangGraphInterruptRender } from "./use-langgraph-interrupt-render";
8
+ import {
9
+ useAgent,
10
+ useCopilotChatConfiguration,
11
+ useCopilotKit,
12
+ useRenderCustomMessages,
13
+ useSuggestions,
14
+ } from "@copilotkitnext/react";
15
+ import { Suggestion } from "@copilotkitnext/core";
16
+ import { useLazyToolRenderer } from "./use-lazy-tool-renderer";
17
+ import { AbstractAgent, AGUIConnectNotImplementedError } from "@ag-ui/client";
18
+ import {
19
+ CoAgentStateRenderBridge,
20
+ type CoAgentStateRenderBridgeProps,
21
+ } from "./use-coagent-state-render-bridge";
22
+
23
+ /**
24
+ * The type of suggestions to use in the chat.
25
+ *
26
+ * `auto` - Suggestions are generated automatically.
27
+ * `manual` - Suggestions are controlled programmatically.
28
+ * `SuggestionItem[]` - Static suggestions array.
29
+ */
30
+ export type ChatSuggestions = "auto" | "manual" | Omit<Suggestion, "isLoading">[];
31
+
32
+ export interface AppendMessageOptions {
33
+ /**
34
+ * Whether to run the chat completion after appending the message. Defaults to `true`.
35
+ */
36
+ followUp?: boolean;
37
+ /**
38
+ * Whether to clear the suggestions after appending the message. Defaults to `true`.
39
+ */
40
+ clearSuggestions?: boolean;
41
+ }
42
+
43
+ export interface OnStopGenerationArguments {
44
+ /**
45
+ * The name of the currently executing agent.
46
+ */
47
+ currentAgentName: string | undefined;
48
+
49
+ /**
50
+ * The messages in the chat.
51
+ */
52
+ messages: Message[];
53
+ }
54
+
55
+ export type OnReloadMessagesArguments = OnStopGenerationArguments & {
56
+ /**
57
+ * The message on which "regenerate" was pressed
58
+ */
59
+ messageId: string;
60
+ };
61
+
62
+ export type OnStopGeneration = (args: OnStopGenerationArguments) => void;
63
+
64
+ export type OnReloadMessages = (args: OnReloadMessagesArguments) => void;
21
65
 
22
66
  export interface UseCopilotChatOptions {
23
67
  /**
@@ -46,6 +90,29 @@ export interface UseCopilotChatOptions {
46
90
  * Disables inclusion of CopilotKit’s default system message. When true, no system message is sent (this also suppresses any custom message from <code>makeSystemMessage</code>).
47
91
  */
48
92
  disableSystemMessage?: boolean;
93
+ /**
94
+ * Controls the behavior of suggestions in the chat interface.
95
+ *
96
+ * `auto` (default) - Suggestions are generated automatically:
97
+ * - When the chat is first opened (empty state)
98
+ * - After each message exchange completes
99
+ * - Uses configuration from `useCopilotChatSuggestions` hooks
100
+ *
101
+ * `manual` - Suggestions are controlled programmatically:
102
+ * - Use `setSuggestions()` to set custom suggestions
103
+ * - Use `generateSuggestions()` to trigger AI generation
104
+ * - Access via `useCopilotChat` hook
105
+ *
106
+ * `SuggestionItem[]` - Static suggestions array:
107
+ * - Always shows the same suggestions
108
+ * - No AI generation involved
109
+ */
110
+ suggestions?: ChatSuggestions;
111
+
112
+ onInProgress?: (isLoading: boolean) => void;
113
+ onSubmitMessage?: (messageContent: string) => Promise<void> | void;
114
+ onStopGeneration?: OnStopGeneration;
115
+ onReloadMessages?: OnReloadMessages;
49
116
  }
50
117
 
51
118
  export interface MCPServerConfig {
@@ -53,6 +120,14 @@ export interface MCPServerConfig {
53
120
  apiKey?: string;
54
121
  }
55
122
 
123
+ // Old suggestion item interface, for returning from useCopilotChatInternal
124
+ interface SuggestionItem {
125
+ title: string;
126
+ message: string;
127
+ partial?: boolean;
128
+ className?: string;
129
+ }
130
+
56
131
  export interface UseCopilotChatReturn {
57
132
  /**
58
133
  * @deprecated use `messages` instead, this is an old non ag-ui version of the messages
@@ -161,6 +236,18 @@ export interface UseCopilotChatReturn {
161
236
  */
162
237
  isLoading: boolean;
163
238
 
239
+ /**
240
+ * Whether the chat agent is available to generate responses
241
+ *
242
+ * ```tsx
243
+ * if (isAvailable) {
244
+ * console.log("Loading...");
245
+ * } else {
246
+ * console.log("Not loading");
247
+ * }
248
+ */
249
+ isAvailable: boolean;
250
+
164
251
  /** Manually trigger chat completion (advanced usage) */
165
252
  runChatCompletion: () => Promise<Message[]>;
166
253
 
@@ -174,13 +261,13 @@ export interface UseCopilotChatReturn {
174
261
  * Current suggestions array
175
262
  * Use this to read the current suggestions or in conjunction with setSuggestions for manual control
176
263
  */
177
- suggestions: SuggestionItem[];
264
+ suggestions: Suggestion[];
178
265
 
179
266
  /**
180
267
  * Manually set suggestions
181
268
  * Useful for manual mode or custom suggestion workflows
182
269
  */
183
- setSuggestions: (suggestions: SuggestionItem[]) => void;
270
+ setSuggestions: (suggestions: Omit<Suggestion, "isLoading">[]) => void;
184
271
 
185
272
  /**
186
273
  * Trigger AI-powered suggestion generation
@@ -205,287 +292,296 @@ export interface UseCopilotChatReturn {
205
292
 
206
293
  /** Interrupt content for human-in-the-loop workflows */
207
294
  interrupt: string | React.ReactElement | null;
208
- }
209
295
 
210
- let globalSuggestionPromise: Promise<void> | null = null;
211
-
212
- export function useCopilotChat(options: UseCopilotChatOptions = {}): UseCopilotChatReturn {
213
- const makeSystemMessage = options.makeSystemMessage ?? defaultSystemMessage;
214
- const {
215
- getContextString,
216
- getFunctionCallHandler,
217
- copilotApiConfig,
218
- isLoading,
219
- setIsLoading,
220
- chatInstructions,
221
- actions,
222
- coagentStatesRef,
223
- setCoagentStatesWithRef,
224
- coAgentStateRenders,
225
- agentSession,
226
- setAgentSession,
227
- forwardedParameters,
228
- agentLock,
229
- threadId,
230
- setThreadId,
231
- runId,
232
- setRunId,
233
- chatAbortControllerRef,
234
- extensions,
235
- setExtensions,
236
- langGraphInterruptAction,
237
- setLangGraphInterruptAction,
238
- chatSuggestionConfiguration,
239
-
240
- runtimeClient,
241
- } = useCopilotContext();
242
- const { messages, setMessages, suggestions, setSuggestions } = useCopilotMessagesContext();
243
-
244
- // Simple state for MCP servers (keep for interface compatibility)
245
- const [mcpServers, setLocalMcpServers] = useState<MCPServerConfig[]>([]);
246
-
247
- // Basic suggestion state for programmatic control
248
- const suggestionsAbortControllerRef = useRef<AbortController | null>(null);
249
- const isLoadingSuggestionsRef = useRef<boolean>(false);
250
-
251
- const abortSuggestions = useCallback(
252
- (clear: boolean = true) => {
253
- suggestionsAbortControllerRef.current?.abort("suggestions aborted by user");
254
- suggestionsAbortControllerRef.current = null;
255
- if (clear) {
256
- setSuggestions([]);
257
- }
258
- },
259
- [setSuggestions],
260
- );
296
+ agent?: ReturnType<typeof useAgent>["agent"];
261
297
 
262
- // Memoize context with stable dependencies only
263
- const stableContext = useMemo(() => {
264
- return {
265
- actions,
266
- copilotApiConfig,
267
- chatSuggestionConfiguration,
268
- messages,
269
- setMessages,
270
- getContextString,
271
- runtimeClient,
272
- };
273
- }, [
274
- JSON.stringify(Object.keys(actions)),
275
- copilotApiConfig.chatApiEndpoint,
276
- messages.length,
277
- Object.keys(chatSuggestionConfiguration).length,
278
- ]);
298
+ threadId?: string;
299
+ }
279
300
 
280
- // Programmatic suggestion generation function
281
- const generateSuggestionsFunc = useCallback(async () => {
282
- // If a global suggestion is running, ignore this call
283
- if (globalSuggestionPromise) {
284
- return globalSuggestionPromise;
285
- }
301
+ export function useCopilotChatInternal({
302
+ suggestions,
303
+ onInProgress,
304
+ onSubmitMessage,
305
+ onStopGeneration,
306
+ onReloadMessages,
307
+ }: UseCopilotChatOptions = {}): UseCopilotChatReturn {
308
+ const { copilotkit } = useCopilotKit();
309
+ const { threadId, agentSession } = useCopilotContext();
310
+ const existingConfig = useCopilotChatConfiguration();
311
+ const [agentAvailable, setAgentAvailable] = useState(false);
312
+
313
+ // Apply priority: props > existing config > defaults
314
+ const resolvedAgentId = existingConfig?.agentId ?? "default";
315
+ const { agent } = useAgent({ agentId: resolvedAgentId });
286
316
 
287
- globalSuggestionPromise = (async () => {
317
+ useEffect(() => {
318
+ const connect = async (agent: AbstractAgent) => {
319
+ setAgentAvailable(false);
288
320
  try {
289
- abortSuggestions();
290
- isLoadingSuggestionsRef.current = true;
291
- suggestionsAbortControllerRef.current = new AbortController();
292
-
293
- setSuggestions([]);
294
-
295
- await generateSuggestions(
296
- stableContext as CopilotContextParams & CopilotMessagesContextParams,
297
- chatSuggestionConfiguration,
298
- setSuggestions,
299
- suggestionsAbortControllerRef,
300
- );
321
+ await copilotkit.connectAgent({ agent });
322
+ setAgentAvailable(true);
301
323
  } catch (error) {
302
- // Re-throw to allow caller to handle the error
303
- throw error;
304
- } finally {
305
- isLoadingSuggestionsRef.current = false;
306
- globalSuggestionPromise = null;
324
+ if (error instanceof AGUIConnectNotImplementedError) {
325
+ // connect not implemented, ignore
326
+ } else {
327
+ throw error;
328
+ }
307
329
  }
308
- })();
330
+ };
331
+ if (agent && existingConfig?.threadId && agent.threadId !== existingConfig.threadId) {
332
+ agent.threadId = existingConfig.threadId;
333
+ connect(agent);
334
+ }
335
+ return () => {};
336
+ }, [existingConfig?.threadId, agent, copilotkit, resolvedAgentId]);
309
337
 
310
- return globalSuggestionPromise;
311
- }, [stableContext, chatSuggestionConfiguration, setSuggestions, abortSuggestions]);
338
+ useEffect(() => {
339
+ onInProgress?.(Boolean(agent?.isRunning));
340
+ }, [agent?.isRunning, onInProgress]);
312
341
 
313
- const resetSuggestions = useCallback(() => {
314
- setSuggestions([]);
315
- }, [setSuggestions]);
342
+ const interrupt = useLangGraphInterruptRender(agent);
316
343
 
317
- // MCP servers logic
318
- useEffect(() => {
319
- if (mcpServers.length > 0) {
320
- const serversCopy = [...mcpServers];
321
- copilotApiConfig.mcpServers = serversCopy;
322
- if (!copilotApiConfig.properties) {
323
- copilotApiConfig.properties = {};
324
- }
325
- copilotApiConfig.properties.mcpServers = serversCopy;
326
- }
327
- }, [mcpServers, copilotApiConfig]);
328
-
329
- const setMcpServers = useCallback((servers: MCPServerConfig[]) => {
330
- setLocalMcpServers(servers);
331
- }, []);
332
-
333
- // Move these function declarations above the useChat call
334
- const onCoAgentStateRender = useAsyncCallback(
335
- async (args: CoAgentStateRenderHandlerArguments) => {
336
- const { name, nodeName, state } = args;
337
- let action = Object.values(coAgentStateRenders).find(
338
- (action) => action.name === name && action.nodeName === nodeName,
344
+ const reset = () => {
345
+ agent?.setMessages([]);
346
+ agent?.setState(null);
347
+ };
348
+
349
+ const deleteMessage = useCallback(
350
+ (messageId: string) => {
351
+ const filteredMessages = (agent?.messages ?? []).filter(
352
+ (message) => message.id !== messageId,
339
353
  );
340
- if (!action) {
341
- action = Object.values(coAgentStateRenders).find(
342
- (action) => action.name === name && !action.nodeName,
343
- );
344
- }
345
- if (action) {
346
- await action.handler?.({ state, nodeName });
347
- }
354
+ agent?.setMessages(filteredMessages);
348
355
  },
349
- [coAgentStateRenders],
356
+ [agent?.setMessages, agent?.messages],
350
357
  );
351
358
 
352
- const makeSystemMessageCallback = useCallback(() => {
353
- const systemMessageMaker = makeSystemMessage || defaultSystemMessage;
354
- // this always gets the latest context string
355
- const contextString = getContextString([], defaultCopilotContextCategories); // TODO: make the context categories configurable
356
-
357
- return new TextMessage({
358
- content: systemMessageMaker(contextString, chatInstructions),
359
- role: gqlRole.System,
360
- });
361
- }, [getContextString, makeSystemMessage, chatInstructions]);
362
-
363
- const deleteMessage = useCallback(
359
+ const latestDelete = useUpdatedRef(deleteMessage);
360
+ const latestDeleteFunc = useCallback(
364
361
  (messageId: string) => {
365
- setMessages((prev) => prev.filter((message) => message.id !== messageId));
362
+ return latestDelete.current(messageId);
366
363
  },
367
- [setMessages],
364
+ [latestDelete],
368
365
  );
369
366
 
370
- // Get chat helpers with updated config
371
- const { append, reload, stop, runChatCompletion } = useChat({
372
- ...options,
373
- actions: Object.values(actions),
374
- copilotConfig: copilotApiConfig,
375
- initialMessages: aguiToGQL(options.initialMessages || []),
376
- onFunctionCall: getFunctionCallHandler(),
377
- onCoAgentStateRender,
378
- messages,
379
- setMessages,
380
- makeSystemMessageCallback,
381
- isLoading,
382
- setIsLoading,
383
- coagentStatesRef,
384
- setCoagentStatesWithRef,
385
- agentSession,
386
- setAgentSession,
387
- forwardedParameters,
388
- threadId,
389
- setThreadId,
390
- runId,
391
- setRunId,
392
- chatAbortControllerRef,
393
- agentLock,
394
- extensions,
395
- setExtensions,
396
- langGraphInterruptAction,
397
- setLangGraphInterruptAction,
398
- disableSystemMessage: options.disableSystemMessage,
399
- });
367
+ const currentSuggestions = useSuggestions({ agentId: resolvedAgentId });
400
368
 
401
- const latestAppend = useUpdatedRef(append);
402
- const latestAppendFunc = useAsyncCallback(
403
- async (message: DeprecatedGqlMessage, options?: AppendMessageOptions) => {
404
- abortSuggestions(options?.clearSuggestions);
405
- return await latestAppend.current(message, options);
369
+ const reload = useAsyncCallback(
370
+ async (reloadMessageId: string): Promise<void> => {
371
+ const messages = agent?.messages ?? [];
372
+ // TODO: get isLoading
373
+ const isLoading = false;
374
+ if (isLoading || messages.length === 0) {
375
+ return;
376
+ }
377
+
378
+ const reloadMessageIndex = messages.findIndex((msg) => msg.id === reloadMessageId);
379
+ if (reloadMessageIndex === -1) {
380
+ console.warn(`Message with id ${reloadMessageId} not found`);
381
+ return;
382
+ }
383
+
384
+ const reloadMessageRole = messages[reloadMessageIndex].role;
385
+ if (reloadMessageRole !== "assistant") {
386
+ console.warn(`Regenerate cannot be performed on ${reloadMessageRole} role`);
387
+ return;
388
+ }
389
+ let historyCutoff: Message[] = [messages[0]];
390
+
391
+ if (messages.length > 2 && reloadMessageIndex !== 0) {
392
+ // message to regenerate from is now first.
393
+ // Work backwards to find the first the closest user message
394
+ const lastUserMessageBeforeRegenerate = messages
395
+ .slice(0, reloadMessageIndex)
396
+ .reverse()
397
+ .find((msg) => msg.role === "user");
398
+
399
+ if (!lastUserMessageBeforeRegenerate) {
400
+ historyCutoff = [messages[0]];
401
+ } else {
402
+ const indexOfLastUserMessageBeforeRegenerate = messages.findIndex(
403
+ (msg) => msg.id === lastUserMessageBeforeRegenerate.id,
404
+ );
405
+ // Include the user message, remove everything after it
406
+ historyCutoff = messages.slice(0, indexOfLastUserMessageBeforeRegenerate + 1);
407
+ }
408
+ } else if (messages.length > 2 && reloadMessageIndex === 0) {
409
+ historyCutoff = [messages[0], messages[1]];
410
+ }
411
+
412
+ agent?.setMessages(historyCutoff);
413
+
414
+ if (agent) {
415
+ copilotkit.runAgent({ agent });
416
+ }
417
+ return;
406
418
  },
407
- [latestAppend],
419
+ [agent?.setMessages, copilotkit?.runAgent],
408
420
  );
409
421
 
410
422
  const latestSendMessageFunc = useAsyncCallback(
411
423
  async (message: Message, options?: AppendMessageOptions) => {
412
- abortSuggestions(options?.clearSuggestions);
413
- return await latestAppend.current(aguiToGQL([message])[0] as DeprecatedGqlMessage, options);
414
- },
415
- [latestAppend],
416
- );
417
-
418
- const latestReload = useUpdatedRef(reload);
419
- const latestReloadFunc = useAsyncCallback(
420
- async (messageId: string) => {
421
- return await latestReload.current(messageId);
424
+ if (!agent) return;
425
+ const followUp = options?.followUp ?? true;
426
+ if (options?.clearSuggestions) {
427
+ copilotkit.clearSuggestions(resolvedAgentId);
428
+ }
429
+ agent?.addMessage(message);
430
+ if (followUp) {
431
+ try {
432
+ await copilotkit.runAgent({ agent });
433
+ } catch (error) {
434
+ console.error("CopilotChat: runAgent failed", error);
435
+ }
436
+ }
437
+ if (onSubmitMessage) {
438
+ const content =
439
+ typeof message.content === "string"
440
+ ? message.content
441
+ : message.content && "text" in message.content
442
+ ? message.content.text
443
+ : message.content && "filename" in message.content
444
+ ? message.content.filename
445
+ : "";
446
+ onSubmitMessage(content);
447
+ }
422
448
  },
423
- [latestReload],
449
+ [agent, copilotkit, resolvedAgentId, onSubmitMessage],
424
450
  );
425
451
 
426
- const latestStop = useUpdatedRef(stop);
427
- const latestStopFunc = useCallback(() => {
428
- return latestStop.current();
429
- }, [latestStop]);
430
-
431
- const latestDelete = useUpdatedRef(deleteMessage);
432
- const latestDeleteFunc = useCallback(
433
- (messageId: string) => {
434
- return latestDelete.current(messageId);
452
+ const latestAppendFunc = useAsyncCallback(
453
+ async (message: DeprecatedGqlMessage, options?: AppendMessageOptions) => {
454
+ return latestSendMessageFunc(gqlToAGUI([message])[0], options);
435
455
  },
436
- [latestDelete],
456
+ [latestSendMessageFunc],
437
457
  );
438
458
 
439
- const latestSetMessages = useUpdatedRef(setMessages);
440
459
  const latestSetMessagesFunc = useCallback(
441
460
  (messages: Message[] | DeprecatedGqlMessage[]) => {
442
461
  if (messages.every((message) => message instanceof DeprecatedGqlMessage)) {
443
- return latestSetMessages.current(messages as DeprecatedGqlMessage[]);
462
+ return agent?.setMessages?.(gqlToAGUI(messages));
444
463
  }
445
- return latestSetMessages.current(aguiToGQL(messages));
464
+ return agent?.setMessages?.(messages);
446
465
  },
447
- [latestSetMessages],
466
+ [agent?.setMessages, agent],
448
467
  );
449
468
 
450
- const latestRunChatCompletion = useUpdatedRef(runChatCompletion);
451
- const latestRunChatCompletionFunc = useAsyncCallback(async () => {
452
- return await latestRunChatCompletion.current!();
453
- }, [latestRunChatCompletion]);
454
-
455
- const reset = useCallback(() => {
456
- latestStopFunc();
457
- setMessages([]);
458
- setRunId(null);
459
- setCoagentStatesWithRef({});
460
- let initialAgentSession: AgentSession | null = null;
461
- if (agentLock) {
462
- initialAgentSession = {
463
- agentName: agentLock,
464
- };
465
- }
466
- setAgentSession(initialAgentSession);
467
- // Reset suggestions when chat is reset
468
- resetSuggestions();
469
- }, [
470
- latestStopFunc,
471
- setMessages,
472
- setThreadId,
473
- setCoagentStatesWithRef,
474
- setAgentSession,
475
- agentLock,
476
- resetSuggestions,
477
- ]);
469
+ const latestReload = useUpdatedRef(reload);
470
+ const latestReloadFunc = useAsyncCallback(
471
+ async (messageId: string) => {
472
+ onReloadMessages?.({
473
+ messageId,
474
+ currentAgentName: agent?.agentId,
475
+ messages: agent?.messages ?? [],
476
+ });
477
+ return await latestReload.current(messageId);
478
+ },
479
+ [latestReload, agent, onReloadMessages],
480
+ );
481
+
482
+ const latestStopFunc = useCallback(() => {
483
+ onStopGeneration?.({
484
+ currentAgentName: agent?.agentId,
485
+ messages: agent?.messages ?? [],
486
+ });
487
+ return agent?.abortRun?.();
488
+ }, [onStopGeneration, agent]);
478
489
 
479
490
  const latestReset = useUpdatedRef(reset);
480
491
  const latestResetFunc = useCallback(() => {
481
492
  return latestReset.current();
482
493
  }, [latestReset]);
483
494
 
484
- const interrupt = useLangGraphInterruptRender();
495
+ const lazyToolRendered = useLazyToolRenderer();
496
+ const renderCustomMessage = useRenderCustomMessages();
497
+ const legacyCustomMessageRenderer = useLegacyCoagentRenderer({
498
+ copilotkit,
499
+ agent,
500
+ agentId: resolvedAgentId,
501
+ threadId: existingConfig?.threadId ?? threadId,
502
+ });
503
+ const allMessages = agent?.messages ?? [];
504
+ const resolvedMessages = useMemo(() => {
505
+ let processedMessages = allMessages.map((message) => {
506
+ if (message.role !== "assistant") {
507
+ return message;
508
+ }
509
+
510
+ const lazyRendered = lazyToolRendered(message, allMessages);
511
+ if (lazyRendered) {
512
+ const renderedGenUi = lazyRendered();
513
+ if (renderedGenUi) {
514
+ return { ...message, generativeUI: () => renderedGenUi };
515
+ }
516
+ }
517
+
518
+ const bridgeRenderer =
519
+ legacyCustomMessageRenderer || renderCustomMessage
520
+ ? () => {
521
+ const customRender = renderCustomMessage?.({
522
+ message,
523
+ position: "before",
524
+ });
525
+ if (customRender) {
526
+ return customRender;
527
+ }
528
+ return legacyCustomMessageRenderer?.({ message, position: "before" });
529
+ }
530
+ : null;
531
+
532
+ if (bridgeRenderer) {
533
+ return { ...message, generativeUI: bridgeRenderer };
534
+ }
535
+ return message;
536
+ });
537
+
538
+ const hasAssistantMessages = processedMessages.some((msg) => msg.role === "assistant");
539
+
540
+ // TODO: what is this?
541
+ // if (legacyCustomMessageRenderer && !hasAssistantMessages) {
542
+ // const placeholderId = `coagent-state-render-${resolvedAgentId}`;
543
+ // const placeholderMessage: Message = {
544
+ // id: placeholderId,
545
+ // role: "assistant",
546
+ // content: "",
547
+ // name: "coagent-state-render",
548
+ // };
549
+ // processedMessages = [
550
+ // ...processedMessages,
551
+ // {
552
+ // ...placeholderMessage,
553
+ // generativeUI: () =>
554
+ // legacyCustomMessageRenderer({
555
+ // message: placeholderMessage,
556
+ // position: "before",
557
+ // }),
558
+ // } as Message,
559
+ // ];
560
+ // }
561
+
562
+ return processedMessages;
563
+ }, [
564
+ agent?.messages,
565
+ lazyToolRendered,
566
+ allMessages,
567
+ renderCustomMessage,
568
+ // legacyCustomMessageRenderer,
569
+ resolvedAgentId,
570
+ ]);
485
571
 
572
+ const renderedSuggestions = useMemo(() => {
573
+ if (Array.isArray(suggestions)) {
574
+ return {
575
+ suggestions: suggestions.map((s) => ({ ...s, isLoading: false })),
576
+ isLoading: false,
577
+ };
578
+ }
579
+ return currentSuggestions;
580
+ }, [suggestions, currentSuggestions]);
581
+
582
+ // @ts-ignore
486
583
  return {
487
- visibleMessages: messages,
488
- messages: gqlToAGUI(messages, actions, coAgentStateRenders),
584
+ messages: resolvedMessages,
489
585
  sendMessage: latestSendMessageFunc,
490
586
  appendMessage: latestAppendFunc,
491
587
  setMessages: latestSetMessagesFunc,
@@ -493,16 +589,19 @@ export function useCopilotChat(options: UseCopilotChatOptions = {}): UseCopilotC
493
589
  stopGeneration: latestStopFunc,
494
590
  reset: latestResetFunc,
495
591
  deleteMessage: latestDeleteFunc,
496
- runChatCompletion: latestRunChatCompletionFunc,
497
- isLoading,
498
- mcpServers,
499
- setMcpServers,
500
- suggestions,
501
- setSuggestions,
502
- generateSuggestions: generateSuggestionsFunc,
503
- resetSuggestions,
504
- isLoadingSuggestions: isLoadingSuggestionsRef.current,
592
+ isAvailable: agentAvailable,
593
+ isLoading: Boolean(agent?.isRunning),
594
+ // mcpServers,
595
+ // setMcpServers,
596
+ suggestions: renderedSuggestions.suggestions,
597
+ setSuggestions: (suggestions: Omit<Suggestion, "isLoading">[]) =>
598
+ copilotkit.addSuggestionsConfig({ suggestions }),
599
+ generateSuggestions: async () => copilotkit.reloadSuggestions(resolvedAgentId),
600
+ resetSuggestions: () => copilotkit.clearSuggestions(resolvedAgentId),
601
+ isLoadingSuggestions: renderedSuggestions.isLoading,
505
602
  interrupt,
603
+ agent,
604
+ threadId,
506
605
  };
507
606
  }
508
607
 
@@ -518,6 +617,54 @@ function useUpdatedRef<T>(value: T) {
518
617
  return ref;
519
618
  }
520
619
 
620
+ type LegacyRenderParams = {
621
+ message: Message;
622
+ position: "before" | "after";
623
+ };
624
+
625
+ type LegacyRenderer = ((args: LegacyRenderParams) => any) | null;
626
+
627
+ function useLegacyCoagentRenderer({
628
+ copilotkit,
629
+ agent,
630
+ agentId,
631
+ threadId,
632
+ }: {
633
+ copilotkit: ReturnType<typeof useCopilotKit>["copilotkit"];
634
+ agent?: AbstractAgent;
635
+ agentId: string;
636
+ threadId?: string;
637
+ }): LegacyRenderer {
638
+ return useMemo(() => {
639
+ if (!copilotkit || !agent) {
640
+ return null;
641
+ }
642
+
643
+ return ({ message, position }: LegacyRenderParams) => {
644
+ const effectiveThreadId = threadId ?? agent.threadId ?? "default";
645
+ const existingRunId = copilotkit.getRunIdForMessage(agentId, effectiveThreadId, message.id);
646
+ const runId = existingRunId || `pending:${message.id}`;
647
+ const messageIndex = Math.max(
648
+ agent.messages.findIndex((msg) => msg.id === message.id),
649
+ 0,
650
+ );
651
+
652
+ const bridgeProps: CoAgentStateRenderBridgeProps = {
653
+ message: message as any,
654
+ position,
655
+ runId,
656
+ messageIndex,
657
+ messageIndexInRun: 0,
658
+ numberOfMessagesInRun: 1,
659
+ agentId,
660
+ stateSnapshot: (message as any).state,
661
+ };
662
+
663
+ return createElement(CoAgentStateRenderBridge, bridgeProps) as any;
664
+ };
665
+ }, [agent, agentId, copilotkit, threadId]);
666
+ }
667
+
521
668
  export function defaultSystemMessage(
522
669
  contextString: string,
523
670
  additionalInstructions?: string,