@copilotkit/react-ui 0.0.0-0.0.0-max-changeset-10101010101010-20260109191632

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 (395) hide show
  1. package/CHANGELOG.md +17415 -0
  2. package/LICENSE +21 -0
  3. package/README.md +141 -0
  4. package/dist/chunk-3W6J75HS.mjs +126 -0
  5. package/dist/chunk-3W6J75HS.mjs.map +1 -0
  6. package/dist/chunk-54JAUBUJ.mjs +26 -0
  7. package/dist/chunk-54JAUBUJ.mjs.map +1 -0
  8. package/dist/chunk-7OURDQZJ.mjs +133 -0
  9. package/dist/chunk-7OURDQZJ.mjs.map +1 -0
  10. package/dist/chunk-7PR2KJDO.mjs +222 -0
  11. package/dist/chunk-7PR2KJDO.mjs.map +1 -0
  12. package/dist/chunk-BH6PCAAL.mjs +81 -0
  13. package/dist/chunk-BH6PCAAL.mjs.map +1 -0
  14. package/dist/chunk-C3GSYRC3.mjs +118 -0
  15. package/dist/chunk-C3GSYRC3.mjs.map +1 -0
  16. package/dist/chunk-DBKRAOH7.mjs +34 -0
  17. package/dist/chunk-DBKRAOH7.mjs.map +1 -0
  18. package/dist/chunk-EFZPSZWO.mjs +1 -0
  19. package/dist/chunk-EFZPSZWO.mjs.map +1 -0
  20. package/dist/chunk-ELGRNEAO.mjs +32 -0
  21. package/dist/chunk-ELGRNEAO.mjs.map +1 -0
  22. package/dist/chunk-ELUJRANC.mjs +21 -0
  23. package/dist/chunk-ELUJRANC.mjs.map +1 -0
  24. package/dist/chunk-FFJHOZX6.mjs +202 -0
  25. package/dist/chunk-FFJHOZX6.mjs.map +1 -0
  26. package/dist/chunk-GDSZGYCE.mjs +32 -0
  27. package/dist/chunk-GDSZGYCE.mjs.map +1 -0
  28. package/dist/chunk-HIW7RXCD.mjs +184 -0
  29. package/dist/chunk-HIW7RXCD.mjs.map +1 -0
  30. package/dist/chunk-IEMQ2SQW.mjs +93 -0
  31. package/dist/chunk-IEMQ2SQW.mjs.map +1 -0
  32. package/dist/chunk-IHFR6PYG.mjs +116 -0
  33. package/dist/chunk-IHFR6PYG.mjs.map +1 -0
  34. package/dist/chunk-IK2BPURM.mjs +400 -0
  35. package/dist/chunk-IK2BPURM.mjs.map +1 -0
  36. package/dist/chunk-IU3WTXLQ.mjs +1 -0
  37. package/dist/chunk-IU3WTXLQ.mjs.map +1 -0
  38. package/dist/chunk-JGMFJZMG.mjs +11 -0
  39. package/dist/chunk-JGMFJZMG.mjs.map +1 -0
  40. package/dist/chunk-JY2CSDKN.mjs +135 -0
  41. package/dist/chunk-JY2CSDKN.mjs.map +1 -0
  42. package/dist/chunk-JZ3RFQQ6.mjs +128 -0
  43. package/dist/chunk-JZ3RFQQ6.mjs.map +1 -0
  44. package/dist/chunk-KXE2JCUH.mjs +1 -0
  45. package/dist/chunk-KXE2JCUH.mjs.map +1 -0
  46. package/dist/chunk-LQEFRHRT.mjs +30 -0
  47. package/dist/chunk-LQEFRHRT.mjs.map +1 -0
  48. package/dist/chunk-MMVDU6DF.mjs +1 -0
  49. package/dist/chunk-MMVDU6DF.mjs.map +1 -0
  50. package/dist/chunk-MRXNTQOX.mjs +59 -0
  51. package/dist/chunk-MRXNTQOX.mjs.map +1 -0
  52. package/dist/chunk-NCIAFFQ2.mjs +82 -0
  53. package/dist/chunk-NCIAFFQ2.mjs.map +1 -0
  54. package/dist/chunk-NGJ32FAP.mjs +30 -0
  55. package/dist/chunk-NGJ32FAP.mjs.map +1 -0
  56. package/dist/chunk-NRA3CFEE.mjs +97 -0
  57. package/dist/chunk-NRA3CFEE.mjs.map +1 -0
  58. package/dist/chunk-O72ZB5V3.mjs +140 -0
  59. package/dist/chunk-O72ZB5V3.mjs.map +1 -0
  60. package/dist/chunk-PLHTVHUW.mjs +82 -0
  61. package/dist/chunk-PLHTVHUW.mjs.map +1 -0
  62. package/dist/chunk-Q5V6S67N.mjs +103 -0
  63. package/dist/chunk-Q5V6S67N.mjs.map +1 -0
  64. package/dist/chunk-QB3GUN2N.mjs +31 -0
  65. package/dist/chunk-QB3GUN2N.mjs.map +1 -0
  66. package/dist/chunk-QIOJXTIQ.mjs +64 -0
  67. package/dist/chunk-QIOJXTIQ.mjs.map +1 -0
  68. package/dist/chunk-QPQRLXN3.mjs +435 -0
  69. package/dist/chunk-QPQRLXN3.mjs.map +1 -0
  70. package/dist/chunk-RYUCX3ZK.mjs +32 -0
  71. package/dist/chunk-RYUCX3ZK.mjs.map +1 -0
  72. package/dist/chunk-SC6JRFAJ.mjs +1 -0
  73. package/dist/chunk-SC6JRFAJ.mjs.map +1 -0
  74. package/dist/chunk-T26KLXLH.mjs +1 -0
  75. package/dist/chunk-T26KLXLH.mjs.map +1 -0
  76. package/dist/chunk-UFN2VWSR.mjs +25 -0
  77. package/dist/chunk-UFN2VWSR.mjs.map +1 -0
  78. package/dist/chunk-V7W6IM2V.mjs +1 -0
  79. package/dist/chunk-V7W6IM2V.mjs.map +1 -0
  80. package/dist/chunk-WB3YULQ4.mjs +1 -0
  81. package/dist/chunk-WB3YULQ4.mjs.map +1 -0
  82. package/dist/chunk-XWG3L6QC.mjs +258 -0
  83. package/dist/chunk-XWG3L6QC.mjs.map +1 -0
  84. package/dist/chunk-Y4FKRAKJ.mjs +12 -0
  85. package/dist/chunk-Y4FKRAKJ.mjs.map +1 -0
  86. package/dist/components/chat/Button.d.ts +9 -0
  87. package/dist/components/chat/Button.js +71 -0
  88. package/dist/components/chat/Button.js.map +1 -0
  89. package/dist/components/chat/Button.mjs +10 -0
  90. package/dist/components/chat/Button.mjs.map +1 -0
  91. package/dist/components/chat/Chat.d.ts +204 -0
  92. package/dist/components/chat/Chat.js +2270 -0
  93. package/dist/components/chat/Chat.js.map +1 -0
  94. package/dist/components/chat/Chat.mjs +29 -0
  95. package/dist/components/chat/Chat.mjs.map +1 -0
  96. package/dist/components/chat/ChatContext.d.ts +145 -0
  97. package/dist/components/chat/ChatContext.js +329 -0
  98. package/dist/components/chat/ChatContext.js.map +1 -0
  99. package/dist/components/chat/ChatContext.mjs +13 -0
  100. package/dist/components/chat/ChatContext.mjs.map +1 -0
  101. package/dist/components/chat/CodeBlock.d.ts +14 -0
  102. package/dist/components/chat/CodeBlock.js +510 -0
  103. package/dist/components/chat/CodeBlock.js.map +1 -0
  104. package/dist/components/chat/CodeBlock.mjs +14 -0
  105. package/dist/components/chat/CodeBlock.mjs.map +1 -0
  106. package/dist/components/chat/Header.d.ts +9 -0
  107. package/dist/components/chat/Header.js +582 -0
  108. package/dist/components/chat/Header.js.map +1 -0
  109. package/dist/components/chat/Header.mjs +17 -0
  110. package/dist/components/chat/Header.mjs.map +1 -0
  111. package/dist/components/chat/Icons.d.ts +20 -0
  112. package/dist/components/chat/Icons.js +297 -0
  113. package/dist/components/chat/Icons.js.map +1 -0
  114. package/dist/components/chat/Icons.mjs +38 -0
  115. package/dist/components/chat/Icons.mjs.map +1 -0
  116. package/dist/components/chat/ImageUploadQueue.d.ts +13 -0
  117. package/dist/components/chat/ImageUploadQueue.js +106 -0
  118. package/dist/components/chat/ImageUploadQueue.js.map +1 -0
  119. package/dist/components/chat/ImageUploadQueue.mjs +8 -0
  120. package/dist/components/chat/ImageUploadQueue.mjs.map +1 -0
  121. package/dist/components/chat/Input.d.ts +9 -0
  122. package/dist/components/chat/Input.js +396 -0
  123. package/dist/components/chat/Input.js.map +1 -0
  124. package/dist/components/chat/Input.mjs +14 -0
  125. package/dist/components/chat/Input.mjs.map +1 -0
  126. package/dist/components/chat/Markdown.d.ts +10 -0
  127. package/dist/components/chat/Markdown.js +652 -0
  128. package/dist/components/chat/Markdown.js.map +1 -0
  129. package/dist/components/chat/Markdown.mjs +11 -0
  130. package/dist/components/chat/Markdown.mjs.map +1 -0
  131. package/dist/components/chat/Messages.d.ts +13 -0
  132. package/dist/components/chat/Messages.js +1195 -0
  133. package/dist/components/chat/Messages.js.map +1 -0
  134. package/dist/components/chat/Messages.mjs +20 -0
  135. package/dist/components/chat/Messages.mjs.map +1 -0
  136. package/dist/components/chat/Modal.d.ts +51 -0
  137. package/dist/components/chat/Modal.js +3075 -0
  138. package/dist/components/chat/Modal.js.map +1 -0
  139. package/dist/components/chat/Modal.mjs +38 -0
  140. package/dist/components/chat/Modal.mjs.map +1 -0
  141. package/dist/components/chat/Popup.d.ts +13 -0
  142. package/dist/components/chat/Popup.js +3086 -0
  143. package/dist/components/chat/Popup.js.map +1 -0
  144. package/dist/components/chat/Popup.mjs +39 -0
  145. package/dist/components/chat/Popup.mjs.map +1 -0
  146. package/dist/components/chat/PoweredByTag.d.ts +7 -0
  147. package/dist/components/chat/PoweredByTag.js +61 -0
  148. package/dist/components/chat/PoweredByTag.js.map +1 -0
  149. package/dist/components/chat/PoweredByTag.mjs +9 -0
  150. package/dist/components/chat/PoweredByTag.mjs.map +1 -0
  151. package/dist/components/chat/Sidebar.d.ts +13 -0
  152. package/dist/components/chat/Sidebar.js +3095 -0
  153. package/dist/components/chat/Sidebar.js.map +1 -0
  154. package/dist/components/chat/Sidebar.mjs +39 -0
  155. package/dist/components/chat/Sidebar.mjs.map +1 -0
  156. package/dist/components/chat/Suggestion.d.ts +12 -0
  157. package/dist/components/chat/Suggestion.js +56 -0
  158. package/dist/components/chat/Suggestion.js.map +1 -0
  159. package/dist/components/chat/Suggestion.mjs +9 -0
  160. package/dist/components/chat/Suggestion.mjs.map +1 -0
  161. package/dist/components/chat/Suggestions.d.ts +9 -0
  162. package/dist/components/chat/Suggestions.js +81 -0
  163. package/dist/components/chat/Suggestions.js.map +1 -0
  164. package/dist/components/chat/Suggestions.mjs +10 -0
  165. package/dist/components/chat/Suggestions.mjs.map +1 -0
  166. package/dist/components/chat/Textarea.d.ts +15 -0
  167. package/dist/components/chat/Textarea.js +84 -0
  168. package/dist/components/chat/Textarea.js.map +1 -0
  169. package/dist/components/chat/Textarea.mjs +8 -0
  170. package/dist/components/chat/Textarea.mjs.map +1 -0
  171. package/dist/components/chat/Window.d.ts +9 -0
  172. package/dist/components/chat/Window.js +164 -0
  173. package/dist/components/chat/Window.js.map +1 -0
  174. package/dist/components/chat/Window.mjs +10 -0
  175. package/dist/components/chat/Window.mjs.map +1 -0
  176. package/dist/components/chat/index.d.ts +18 -0
  177. package/dist/components/chat/index.js +3122 -0
  178. package/dist/components/chat/index.js.map +1 -0
  179. package/dist/components/chat/index.mjs +69 -0
  180. package/dist/components/chat/index.mjs.map +1 -0
  181. package/dist/components/chat/messages/AssistantMessage.d.ts +9 -0
  182. package/dist/components/chat/messages/AssistantMessage.js +775 -0
  183. package/dist/components/chat/messages/AssistantMessage.js.map +1 -0
  184. package/dist/components/chat/messages/AssistantMessage.mjs +13 -0
  185. package/dist/components/chat/messages/AssistantMessage.mjs.map +1 -0
  186. package/dist/components/chat/messages/ErrorMessage.d.ts +9 -0
  187. package/dist/components/chat/messages/ErrorMessage.js +722 -0
  188. package/dist/components/chat/messages/ErrorMessage.js.map +1 -0
  189. package/dist/components/chat/messages/ErrorMessage.mjs +66 -0
  190. package/dist/components/chat/messages/ErrorMessage.mjs.map +1 -0
  191. package/dist/components/chat/messages/ImageRenderer.d.ts +12 -0
  192. package/dist/components/chat/messages/ImageRenderer.js +58 -0
  193. package/dist/components/chat/messages/ImageRenderer.js.map +1 -0
  194. package/dist/components/chat/messages/ImageRenderer.mjs +8 -0
  195. package/dist/components/chat/messages/ImageRenderer.mjs.map +1 -0
  196. package/dist/components/chat/messages/LegacyRenderMessage.d.ts +28 -0
  197. package/dist/components/chat/messages/LegacyRenderMessage.js +1023 -0
  198. package/dist/components/chat/messages/LegacyRenderMessage.js.map +1 -0
  199. package/dist/components/chat/messages/LegacyRenderMessage.mjs +17 -0
  200. package/dist/components/chat/messages/LegacyRenderMessage.mjs.map +1 -0
  201. package/dist/components/chat/messages/RenderMessage.d.ts +9 -0
  202. package/dist/components/chat/messages/RenderMessage.js +898 -0
  203. package/dist/components/chat/messages/RenderMessage.js.map +1 -0
  204. package/dist/components/chat/messages/RenderMessage.mjs +16 -0
  205. package/dist/components/chat/messages/RenderMessage.mjs.map +1 -0
  206. package/dist/components/chat/messages/UserMessage.d.ts +9 -0
  207. package/dist/components/chat/messages/UserMessage.js +56 -0
  208. package/dist/components/chat/messages/UserMessage.js.map +1 -0
  209. package/dist/components/chat/messages/UserMessage.mjs +8 -0
  210. package/dist/components/chat/messages/UserMessage.mjs.map +1 -0
  211. package/dist/components/chat/props.d.ts +298 -0
  212. package/dist/components/chat/props.js +19 -0
  213. package/dist/components/chat/props.js.map +1 -0
  214. package/dist/components/chat/props.mjs +2 -0
  215. package/dist/components/chat/props.mjs.map +1 -0
  216. package/dist/components/dev-console/console.d.ts +11 -0
  217. package/dist/components/dev-console/console.js +537 -0
  218. package/dist/components/dev-console/console.js.map +1 -0
  219. package/dist/components/dev-console/console.mjs +17 -0
  220. package/dist/components/dev-console/console.mjs.map +1 -0
  221. package/dist/components/dev-console/icons.d.ts +9 -0
  222. package/dist/components/dev-console/icons.js +131 -0
  223. package/dist/components/dev-console/icons.js.map +1 -0
  224. package/dist/components/dev-console/icons.mjs +16 -0
  225. package/dist/components/dev-console/icons.mjs.map +1 -0
  226. package/dist/components/dev-console/index.d.ts +3 -0
  227. package/dist/components/dev-console/index.js +537 -0
  228. package/dist/components/dev-console/index.js.map +1 -0
  229. package/dist/components/dev-console/index.mjs +18 -0
  230. package/dist/components/dev-console/index.mjs.map +1 -0
  231. package/dist/components/dev-console/types.d.ts +9 -0
  232. package/dist/components/dev-console/types.js +19 -0
  233. package/dist/components/dev-console/types.js.map +1 -0
  234. package/dist/components/dev-console/types.mjs +1 -0
  235. package/dist/components/dev-console/types.mjs.map +1 -0
  236. package/dist/components/dev-console/utils.d.ts +10 -0
  237. package/dist/components/dev-console/utils.js +177 -0
  238. package/dist/components/dev-console/utils.js.map +1 -0
  239. package/dist/components/dev-console/utils.mjs +16 -0
  240. package/dist/components/dev-console/utils.mjs.map +1 -0
  241. package/dist/components/help-modal/icons.d.ts +9 -0
  242. package/dist/components/help-modal/icons.js +107 -0
  243. package/dist/components/help-modal/icons.js.map +1 -0
  244. package/dist/components/help-modal/icons.mjs +12 -0
  245. package/dist/components/help-modal/icons.mjs.map +1 -0
  246. package/dist/components/help-modal/index.d.ts +2 -0
  247. package/dist/components/help-modal/index.js +137 -0
  248. package/dist/components/help-modal/index.js.map +1 -0
  249. package/dist/components/help-modal/index.mjs +10 -0
  250. package/dist/components/help-modal/index.mjs.map +1 -0
  251. package/dist/components/help-modal/modal.d.ts +5 -0
  252. package/dist/components/help-modal/modal.js +135 -0
  253. package/dist/components/help-modal/modal.js.map +1 -0
  254. package/dist/components/help-modal/modal.mjs +9 -0
  255. package/dist/components/help-modal/modal.mjs.map +1 -0
  256. package/dist/components/index.d.ts +19 -0
  257. package/dist/components/index.js +3126 -0
  258. package/dist/components/index.js.map +1 -0
  259. package/dist/components/index.mjs +76 -0
  260. package/dist/components/index.mjs.map +1 -0
  261. package/dist/context/index.d.ts +2 -0
  262. package/dist/context/index.js +19 -0
  263. package/dist/context/index.js.map +1 -0
  264. package/dist/context/index.mjs +2 -0
  265. package/dist/context/index.mjs.map +1 -0
  266. package/dist/hooks/index.d.ts +2 -0
  267. package/dist/hooks/index.js +36 -0
  268. package/dist/hooks/index.js.map +1 -0
  269. package/dist/hooks/index.mjs +9 -0
  270. package/dist/hooks/index.mjs.map +1 -0
  271. package/dist/hooks/use-copilot-chat-suggestions.d.ts +66 -0
  272. package/dist/hooks/use-copilot-chat-suggestions.js +34 -0
  273. package/dist/hooks/use-copilot-chat-suggestions.js.map +1 -0
  274. package/dist/hooks/use-copilot-chat-suggestions.mjs +8 -0
  275. package/dist/hooks/use-copilot-chat-suggestions.mjs.map +1 -0
  276. package/dist/hooks/use-copy-to-clipboard.d.ts +9 -0
  277. package/dist/hooks/use-copy-to-clipboard.js +60 -0
  278. package/dist/hooks/use-copy-to-clipboard.js.map +1 -0
  279. package/dist/hooks/use-copy-to-clipboard.mjs +8 -0
  280. package/dist/hooks/use-copy-to-clipboard.mjs.map +1 -0
  281. package/dist/hooks/use-dark-mode.d.ts +3 -0
  282. package/dist/hooks/use-dark-mode.js +35 -0
  283. package/dist/hooks/use-dark-mode.js.map +1 -0
  284. package/dist/hooks/use-dark-mode.mjs +8 -0
  285. package/dist/hooks/use-dark-mode.mjs.map +1 -0
  286. package/dist/hooks/use-push-to-talk.d.ts +19 -0
  287. package/dist/hooks/use-push-to-talk.js +195 -0
  288. package/dist/hooks/use-push-to-talk.js.map +1 -0
  289. package/dist/hooks/use-push-to-talk.mjs +12 -0
  290. package/dist/hooks/use-push-to-talk.mjs.map +1 -0
  291. package/dist/index.css +1258 -0
  292. package/dist/index.css.map +1 -0
  293. package/dist/index.d.ts +21 -0
  294. package/dist/index.js +3135 -0
  295. package/dist/index.js.map +1 -0
  296. package/dist/index.mjs +84 -0
  297. package/dist/index.mjs.map +1 -0
  298. package/dist/lib/utils.d.ts +4 -0
  299. package/dist/lib/utils.js +76 -0
  300. package/dist/lib/utils.js.map +1 -0
  301. package/dist/lib/utils.mjs +34 -0
  302. package/dist/lib/utils.mjs.map +1 -0
  303. package/dist/types/css.d.ts +22 -0
  304. package/dist/types/css.js +19 -0
  305. package/dist/types/css.js.map +1 -0
  306. package/dist/types/css.mjs +1 -0
  307. package/dist/types/css.mjs.map +1 -0
  308. package/dist/types/index.d.ts +3 -0
  309. package/dist/types/index.js +19 -0
  310. package/dist/types/index.js.map +1 -0
  311. package/dist/types/index.mjs +2 -0
  312. package/dist/types/index.mjs.map +1 -0
  313. package/dist/types/suggestions.d.ts +9 -0
  314. package/dist/types/suggestions.js +19 -0
  315. package/dist/types/suggestions.js.map +1 -0
  316. package/dist/types/suggestions.mjs +1 -0
  317. package/dist/types/suggestions.mjs.map +1 -0
  318. package/dist/v2/index.css +4 -0
  319. package/dist/v2/index.css.map +1 -0
  320. package/dist/v2/index.d.ts +2 -0
  321. package/dist/v2/index.js +2 -0
  322. package/dist/v2/index.js.map +1 -0
  323. package/dist/v2/index.mjs +2 -0
  324. package/dist/v2/index.mjs.map +1 -0
  325. package/jest.config.js +5 -0
  326. package/package.json +83 -0
  327. package/postcss.config.js +60 -0
  328. package/src/components/chat/Button.tsx +18 -0
  329. package/src/components/chat/Chat.tsx +795 -0
  330. package/src/components/chat/ChatContext.tsx +248 -0
  331. package/src/components/chat/CodeBlock.tsx +418 -0
  332. package/src/components/chat/Header.tsx +24 -0
  333. package/src/components/chat/Icons.tsx +237 -0
  334. package/src/components/chat/ImageUploadQueue.tsx +77 -0
  335. package/src/components/chat/Input.tsx +156 -0
  336. package/src/components/chat/Markdown.tsx +144 -0
  337. package/src/components/chat/Messages.tsx +206 -0
  338. package/src/components/chat/Modal.tsx +220 -0
  339. package/src/components/chat/Popup.tsx +77 -0
  340. package/src/components/chat/PoweredByTag.tsx +42 -0
  341. package/src/components/chat/Sidebar.tsx +96 -0
  342. package/src/components/chat/Suggestion.tsx +29 -0
  343. package/src/components/chat/Suggestions.tsx +23 -0
  344. package/src/components/chat/Textarea.tsx +77 -0
  345. package/src/components/chat/Window.tsx +152 -0
  346. package/src/components/chat/index.tsx +11 -0
  347. package/src/components/chat/messages/AssistantMessage.tsx +118 -0
  348. package/src/components/chat/messages/ErrorMessage.tsx +59 -0
  349. package/src/components/chat/messages/ImageRenderer.tsx +37 -0
  350. package/src/components/chat/messages/LegacyRenderMessage.tsx +150 -0
  351. package/src/components/chat/messages/RenderMessage.tsx +61 -0
  352. package/src/components/chat/messages/UserMessage.tsx +46 -0
  353. package/src/components/chat/props.ts +353 -0
  354. package/src/components/dev-console/console.tsx +242 -0
  355. package/src/components/dev-console/icons.tsx +99 -0
  356. package/src/components/dev-console/index.tsx +2 -0
  357. package/src/components/dev-console/types.ts +7 -0
  358. package/src/components/dev-console/utils.ts +142 -0
  359. package/src/components/help-modal/icons.tsx +68 -0
  360. package/src/components/help-modal/index.tsx +1 -0
  361. package/src/components/help-modal/modal.tsx +101 -0
  362. package/src/components/index.ts +2 -0
  363. package/src/context/index.ts +1 -0
  364. package/src/css/animations.css +35 -0
  365. package/src/css/button.css +67 -0
  366. package/src/css/colors.css +78 -0
  367. package/src/css/console.css +166 -0
  368. package/src/css/crew.css +277 -0
  369. package/src/css/header.css +65 -0
  370. package/src/css/input.css +152 -0
  371. package/src/css/markdown.css +150 -0
  372. package/src/css/messages.css +244 -0
  373. package/src/css/panel.css +39 -0
  374. package/src/css/popup.css +22 -0
  375. package/src/css/sidebar.css +34 -0
  376. package/src/css/suggestions.css +43 -0
  377. package/src/css/window.css +60 -0
  378. package/src/hooks/index.ts +1 -0
  379. package/src/hooks/use-copilot-chat-suggestions.tsx +71 -0
  380. package/src/hooks/use-copy-to-clipboard.tsx +29 -0
  381. package/src/hooks/use-dark-mode.ts +10 -0
  382. package/src/hooks/use-push-to-talk.tsx +167 -0
  383. package/src/index.tsx +7 -0
  384. package/src/lib/utils.test.ts +7 -0
  385. package/src/lib/utils.ts +27 -0
  386. package/src/styles.css +14 -0
  387. package/src/types/css.ts +21 -0
  388. package/src/types/index.ts +2 -0
  389. package/src/types/suggestions.ts +7 -0
  390. package/src/v2/index.ts +1 -0
  391. package/src/v2/styles.css +1 -0
  392. package/tailwind.config.js +7 -0
  393. package/tsconfig.json +12 -0
  394. package/tsup.config.ts +11 -0
  395. package/typedoc.json +4 -0
@@ -0,0 +1,77 @@
1
+ import React, { useState, useRef, useEffect, forwardRef, useImperativeHandle } from "react";
2
+
3
+ interface AutoResizingTextareaProps {
4
+ maxRows?: number;
5
+ placeholder?: string;
6
+ value: string;
7
+ onChange: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;
8
+ onKeyDown?: (event: React.KeyboardEvent<HTMLTextAreaElement>) => void;
9
+ onCompositionStart?: () => void;
10
+ onCompositionEnd?: () => void;
11
+ autoFocus?: boolean;
12
+ }
13
+
14
+ const AutoResizingTextarea = forwardRef<HTMLTextAreaElement, AutoResizingTextareaProps>(
15
+ (
16
+ {
17
+ maxRows = 1,
18
+ placeholder,
19
+ value,
20
+ onChange,
21
+ onKeyDown,
22
+ onCompositionStart,
23
+ onCompositionEnd,
24
+ autoFocus,
25
+ },
26
+ ref,
27
+ ) => {
28
+ const internalTextareaRef = useRef<HTMLTextAreaElement>(null);
29
+ const [maxHeight, setMaxHeight] = useState<number>(0);
30
+
31
+ useImperativeHandle(ref, () => internalTextareaRef.current as HTMLTextAreaElement);
32
+
33
+ useEffect(() => {
34
+ const calculateMaxHeight = () => {
35
+ const textarea = internalTextareaRef.current;
36
+ if (textarea) {
37
+ textarea.style.height = "auto";
38
+ const singleRowHeight = textarea.scrollHeight;
39
+ setMaxHeight(singleRowHeight * maxRows);
40
+ if (autoFocus) {
41
+ textarea.focus();
42
+ }
43
+ }
44
+ };
45
+
46
+ calculateMaxHeight();
47
+ }, [maxRows]);
48
+
49
+ useEffect(() => {
50
+ const textarea = internalTextareaRef.current;
51
+ if (textarea) {
52
+ textarea.style.height = "auto";
53
+ textarea.style.height = `${Math.min(textarea.scrollHeight, maxHeight)}px`;
54
+ }
55
+ }, [value, maxHeight]);
56
+
57
+ return (
58
+ <textarea
59
+ ref={internalTextareaRef}
60
+ value={value}
61
+ onChange={onChange}
62
+ onKeyDown={onKeyDown}
63
+ onCompositionStart={onCompositionStart}
64
+ onCompositionEnd={onCompositionEnd}
65
+ placeholder={placeholder}
66
+ style={{
67
+ overflow: "auto",
68
+ resize: "none",
69
+ maxHeight: `${maxHeight}px`,
70
+ }}
71
+ rows={1}
72
+ />
73
+ );
74
+ },
75
+ );
76
+
77
+ export default AutoResizingTextarea;
@@ -0,0 +1,152 @@
1
+ import React, { useCallback, useEffect } from "react";
2
+ import { WindowProps } from "./props";
3
+ import { useChatContext } from "./ChatContext";
4
+ import { useCopilotContext } from "@copilotkit/react-core";
5
+ import { isMacOS } from "@copilotkit/shared";
6
+
7
+ export const Window = ({
8
+ children,
9
+ clickOutsideToClose,
10
+ shortcut,
11
+ hitEscapeToClose,
12
+ }: WindowProps) => {
13
+ const windowRef = React.useRef<HTMLDivElement>(null);
14
+ const context = useCopilotContext();
15
+
16
+ const { open, setOpen } = useChatContext();
17
+
18
+ const handleClickOutside = useCallback(
19
+ (event: MouseEvent) => {
20
+ if (!clickOutsideToClose) {
21
+ return;
22
+ }
23
+
24
+ const parentElement = windowRef.current?.parentElement;
25
+
26
+ let className = "";
27
+ if (event.target instanceof HTMLElement) {
28
+ className = event.target.className;
29
+ }
30
+
31
+ if (
32
+ open &&
33
+ parentElement &&
34
+ !parentElement.contains(event.target as any) &&
35
+ // prevent closing the window when clicking on the debug menu
36
+ !className.includes("copilotKitDebugMenu")
37
+ ) {
38
+ setOpen(false);
39
+ }
40
+ },
41
+ [clickOutsideToClose, open, setOpen],
42
+ );
43
+
44
+ const handleKeyDown = useCallback(
45
+ (event: KeyboardEvent) => {
46
+ const target = event.target as HTMLElement;
47
+ const isInput =
48
+ target.tagName === "INPUT" ||
49
+ target.tagName === "SELECT" ||
50
+ target.tagName === "TEXTAREA" ||
51
+ target.isContentEditable;
52
+
53
+ const isDescendantOfWrapper = windowRef.current?.contains(target);
54
+
55
+ if (
56
+ open &&
57
+ event.key === "Escape" &&
58
+ (!isInput || isDescendantOfWrapper) &&
59
+ hitEscapeToClose
60
+ ) {
61
+ setOpen(false);
62
+ } else if (
63
+ event.key === shortcut &&
64
+ ((isMacOS() && event.metaKey) || (!isMacOS() && event.ctrlKey)) &&
65
+ (!isInput || isDescendantOfWrapper)
66
+ ) {
67
+ setOpen(!open);
68
+ }
69
+ },
70
+ [hitEscapeToClose, shortcut, open, setOpen],
71
+ );
72
+
73
+ const adjustForMobile = useCallback(() => {
74
+ const copilotKitWindow = windowRef.current;
75
+ const vv = window.visualViewport;
76
+ if (!copilotKitWindow || !vv) {
77
+ return;
78
+ }
79
+
80
+ if (window.innerWidth < 640 && open) {
81
+ copilotKitWindow.style.height = `${vv.height}px`;
82
+ copilotKitWindow.style.left = `${vv.offsetLeft}px`;
83
+ copilotKitWindow.style.top = `${vv.offsetTop}px`;
84
+
85
+ document.body.style.position = "fixed";
86
+ document.body.style.width = "100%";
87
+ document.body.style.height = `${window.innerHeight}px`;
88
+ document.body.style.overflow = "hidden";
89
+ document.body.style.touchAction = "none";
90
+
91
+ // Prevent scrolling on iOS
92
+ document.body.addEventListener("touchmove", preventScroll, {
93
+ passive: false,
94
+ });
95
+ } else {
96
+ copilotKitWindow.style.height = "";
97
+ copilotKitWindow.style.left = "";
98
+ copilotKitWindow.style.top = "";
99
+ document.body.style.position = "";
100
+ document.body.style.height = "";
101
+ document.body.style.width = "";
102
+ document.body.style.overflow = "";
103
+ document.body.style.top = "";
104
+ document.body.style.touchAction = "";
105
+
106
+ document.body.removeEventListener("touchmove", preventScroll);
107
+ }
108
+ }, [open]);
109
+
110
+ useEffect(() => {
111
+ document.addEventListener("mousedown", handleClickOutside);
112
+ document.addEventListener("keydown", handleKeyDown);
113
+ if (window.visualViewport) {
114
+ window.visualViewport.addEventListener("resize", adjustForMobile);
115
+ adjustForMobile();
116
+ }
117
+
118
+ return () => {
119
+ document.removeEventListener("mousedown", handleClickOutside);
120
+ document.removeEventListener("keydown", handleKeyDown);
121
+ if (window.visualViewport) {
122
+ window.visualViewport.removeEventListener("resize", adjustForMobile);
123
+ }
124
+ };
125
+ }, [adjustForMobile, handleClickOutside, handleKeyDown]);
126
+
127
+ return (
128
+ <div className={`copilotKitWindow ${open ? " open" : ""}`} ref={windowRef}>
129
+ {children}
130
+ </div>
131
+ );
132
+ };
133
+
134
+ const preventScroll = (event: TouchEvent): void => {
135
+ let targetElement = event.target as Element;
136
+
137
+ // Function to check if the target has the parent with a given class
138
+ const hasParentWithClass = (element: Element, className: string): boolean => {
139
+ while (element && element !== document.body) {
140
+ if (element.classList.contains(className)) {
141
+ return true;
142
+ }
143
+ element = element.parentElement!;
144
+ }
145
+ return false;
146
+ };
147
+
148
+ // Check if the target of the touch event is inside an element with the 'copilotKitMessages' class
149
+ if (!hasParentWithClass(targetElement, "copilotKitMessages")) {
150
+ event.preventDefault();
151
+ }
152
+ };
@@ -0,0 +1,11 @@
1
+ export * from "./props";
2
+ export { CopilotPopup } from "./Popup";
3
+ export { CopilotSidebar } from "./Sidebar";
4
+ export { CopilotChat } from "./Chat";
5
+ export { Markdown } from "./Markdown";
6
+ export { AssistantMessage } from "./messages/AssistantMessage";
7
+ export { UserMessage } from "./messages/UserMessage";
8
+ export { ImageRenderer } from "./messages/ImageRenderer";
9
+ export { useChatContext } from "./ChatContext";
10
+ export { Suggestions as RenderSuggestionsList } from "./Suggestions";
11
+ export { Suggestion as RenderSuggestion } from "./Suggestion";
@@ -0,0 +1,118 @@
1
+ import { AssistantMessageProps } from "../props";
2
+ import { useChatContext } from "../ChatContext";
3
+ import { Markdown } from "../Markdown";
4
+ import { useState } from "react";
5
+ import React from "react";
6
+
7
+ export const AssistantMessage = (props: AssistantMessageProps) => {
8
+ const { icons, labels } = useChatContext();
9
+ const {
10
+ message,
11
+ isLoading,
12
+ onRegenerate,
13
+ onCopy,
14
+ onThumbsUp,
15
+ onThumbsDown,
16
+ isCurrentMessage,
17
+ feedback,
18
+ markdownTagRenderers,
19
+ } = props;
20
+ const [copied, setCopied] = useState(false);
21
+
22
+ const handleCopy = () => {
23
+ const content = message?.content || "";
24
+ if (content && onCopy) {
25
+ navigator.clipboard.writeText(content);
26
+ setCopied(true);
27
+ onCopy(content);
28
+ setTimeout(() => setCopied(false), 2000);
29
+ } else if (content) {
30
+ navigator.clipboard.writeText(content);
31
+ setCopied(true);
32
+ setTimeout(() => setCopied(false), 2000);
33
+ }
34
+ };
35
+
36
+ const handleRegenerate = () => {
37
+ if (onRegenerate) onRegenerate();
38
+ };
39
+
40
+ const handleThumbsUp = () => {
41
+ if (onThumbsUp && message) {
42
+ onThumbsUp(message);
43
+ }
44
+ };
45
+
46
+ const handleThumbsDown = () => {
47
+ if (onThumbsDown && message) {
48
+ onThumbsDown(message);
49
+ }
50
+ };
51
+
52
+ const LoadingIcon = () => <span>{icons.activityIcon}</span>;
53
+ const content = message?.content || "";
54
+ const subComponent = message?.generativeUI?.();
55
+
56
+ return (
57
+ <>
58
+ {content && (
59
+ <div className="copilotKitMessage copilotKitAssistantMessage">
60
+ {content && <Markdown content={content} components={markdownTagRenderers} />}
61
+
62
+ {content && !isLoading && (
63
+ <div
64
+ className={`copilotKitMessageControls ${isCurrentMessage ? "currentMessage" : ""}`}
65
+ >
66
+ <button
67
+ className="copilotKitMessageControlButton"
68
+ onClick={handleRegenerate}
69
+ aria-label={labels.regenerateResponse}
70
+ title={labels.regenerateResponse}
71
+ >
72
+ {icons.regenerateIcon}
73
+ </button>
74
+ <button
75
+ className="copilotKitMessageControlButton"
76
+ onClick={handleCopy}
77
+ aria-label={labels.copyToClipboard}
78
+ title={labels.copyToClipboard}
79
+ >
80
+ {copied ? (
81
+ <span style={{ fontSize: "10px", fontWeight: "bold" }}>✓</span>
82
+ ) : (
83
+ icons.copyIcon
84
+ )}
85
+ </button>
86
+ {onThumbsUp && (
87
+ <button
88
+ className={`copilotKitMessageControlButton ${
89
+ feedback === "thumbsUp" ? "active" : ""
90
+ }`}
91
+ onClick={handleThumbsUp}
92
+ aria-label={labels.thumbsUp}
93
+ title={labels.thumbsUp}
94
+ >
95
+ {icons.thumbsUpIcon}
96
+ </button>
97
+ )}
98
+ {onThumbsDown && (
99
+ <button
100
+ className={`copilotKitMessageControlButton ${
101
+ feedback === "thumbsDown" ? "active" : ""
102
+ }`}
103
+ onClick={handleThumbsDown}
104
+ aria-label={labels.thumbsDown}
105
+ title={labels.thumbsDown}
106
+ >
107
+ {icons.thumbsDownIcon}
108
+ </button>
109
+ )}
110
+ </div>
111
+ )}
112
+ </div>
113
+ )}
114
+ <div style={{ marginBottom: "0.5rem" }}>{subComponent}</div>
115
+ {isLoading && <LoadingIcon />}
116
+ </>
117
+ );
118
+ };
@@ -0,0 +1,59 @@
1
+ import { ErrorMessageProps } from "../props";
2
+ import { useChatContext } from "../ChatContext";
3
+ import { Markdown } from "../Markdown";
4
+ import { useState } from "react";
5
+
6
+ export const ErrorMessage = (props: ErrorMessageProps) => {
7
+ const { icons, labels } = useChatContext();
8
+ const { error, onRegenerate, onCopy, isCurrentMessage } = props;
9
+ const [copied, setCopied] = useState(false);
10
+
11
+ const handleCopy = () => {
12
+ const content = error.message;
13
+ if (content && onCopy) {
14
+ navigator.clipboard.writeText(content);
15
+ setCopied(true);
16
+ onCopy(content);
17
+ setTimeout(() => setCopied(false), 2000);
18
+ } else if (content) {
19
+ navigator.clipboard.writeText(content);
20
+ setCopied(true);
21
+ setTimeout(() => setCopied(false), 2000);
22
+ }
23
+ };
24
+
25
+ const handleRegenerate = () => {
26
+ if (onRegenerate) onRegenerate();
27
+ };
28
+
29
+ console.log(error);
30
+
31
+ return (
32
+ <div className="copilotKitMessage copilotKitAssistantMessage">
33
+ <Markdown content={error.message} />
34
+
35
+ <div className={`copilotKitMessageControls ${isCurrentMessage ? "currentMessage" : ""}`}>
36
+ <button
37
+ className="copilotKitMessageControlButton"
38
+ onClick={handleRegenerate}
39
+ aria-label={labels.regenerateResponse}
40
+ title={labels.regenerateResponse}
41
+ >
42
+ {icons.regenerateIcon}
43
+ </button>
44
+ <button
45
+ className="copilotKitMessageControlButton"
46
+ onClick={handleCopy}
47
+ aria-label={labels.copyToClipboard}
48
+ title={labels.copyToClipboard}
49
+ >
50
+ {copied ? (
51
+ <span style={{ fontSize: "10px", fontWeight: "bold" }}>✓</span>
52
+ ) : (
53
+ icons.copyIcon
54
+ )}
55
+ </button>
56
+ </div>
57
+ </div>
58
+ );
59
+ };
@@ -0,0 +1,37 @@
1
+ import React, { useState } from "react";
2
+ import { ImageRendererProps } from "../props";
3
+
4
+ /**
5
+ * Default image rendering component that can be customized by users.
6
+ * Uses CSS classes for styling so users can override styles.
7
+ */
8
+ export const ImageRenderer: React.FC<ImageRendererProps> = ({ image, content, className = "" }) => {
9
+ const [imageError, setImageError] = useState(false);
10
+ const imageSrc = `data:image/${image.format};base64,${image.bytes}`;
11
+ const altText = content || "User uploaded image";
12
+
13
+ const handleImageError = () => {
14
+ setImageError(true);
15
+ };
16
+
17
+ if (imageError) {
18
+ return (
19
+ <div className={`copilotKitImageRendering copilotKitImageRenderingError ${className}`}>
20
+ <div className="copilotKitImageRenderingErrorMessage">Failed to load image</div>
21
+ {content && <div className="copilotKitImageRenderingContent">{content}</div>}
22
+ </div>
23
+ );
24
+ }
25
+
26
+ return (
27
+ <div className={`copilotKitImageRendering ${className}`}>
28
+ <img
29
+ src={imageSrc}
30
+ alt={altText}
31
+ className="copilotKitImageRenderingImage"
32
+ onError={handleImageError}
33
+ />
34
+ {content && <div className="copilotKitImageRenderingContent">{content}</div>}
35
+ </div>
36
+ );
37
+ };
@@ -0,0 +1,150 @@
1
+ import React from "react";
2
+ import { RenderMessageProps } from "../props";
3
+ import { RenderMessage as DefaultRenderMessage } from "./RenderMessage";
4
+ import { aguiToGQL } from "@copilotkit/runtime-client-gql";
5
+
6
+ /**
7
+ * Legacy message render props interface for backwards compatibility
8
+ */
9
+ export interface LegacyRenderProps {
10
+ RenderTextMessage?: React.ComponentType<RenderMessageProps>;
11
+ RenderActionExecutionMessage?: React.ComponentType<RenderMessageProps>;
12
+ RenderAgentStateMessage?: React.ComponentType<RenderMessageProps>;
13
+ RenderResultMessage?: React.ComponentType<RenderMessageProps>;
14
+ RenderImageMessage?: React.ComponentType<RenderMessageProps>;
15
+ }
16
+
17
+ /**
18
+ * Props for the LegacyRenderMessage component
19
+ */
20
+ export interface LegacyRenderMessageProps extends RenderMessageProps {
21
+ legacyProps: LegacyRenderProps;
22
+ }
23
+
24
+ /**
25
+ * Legacy message adapter component that maps old render props to new message types.
26
+ * This component provides backwards compatibility for the deprecated render props.
27
+ */
28
+ export const LegacyRenderMessage: React.FC<LegacyRenderMessageProps> = ({
29
+ message,
30
+ messages,
31
+ inProgress,
32
+ index,
33
+ isCurrentMessage,
34
+ actionResult,
35
+ AssistantMessage,
36
+ UserMessage,
37
+ ImageRenderer,
38
+ onRegenerate,
39
+ onCopy,
40
+ onThumbsUp,
41
+ onThumbsDown,
42
+ markdownTagRenderers,
43
+ legacyProps,
44
+ }) => {
45
+ const {
46
+ RenderTextMessage,
47
+ RenderActionExecutionMessage,
48
+ RenderAgentStateMessage,
49
+ RenderResultMessage,
50
+ RenderImageMessage,
51
+ } = legacyProps;
52
+
53
+ const deprecatedMessage = aguiToGQL(message)[0] ?? undefined;
54
+
55
+ // Route to appropriate legacy renderer based on message type
56
+ if (deprecatedMessage.isTextMessage() && RenderTextMessage) {
57
+ return (
58
+ <RenderTextMessage
59
+ message={message}
60
+ messages={messages}
61
+ inProgress={inProgress}
62
+ index={index}
63
+ isCurrentMessage={isCurrentMessage}
64
+ AssistantMessage={AssistantMessage}
65
+ UserMessage={UserMessage}
66
+ onRegenerate={onRegenerate}
67
+ onCopy={onCopy}
68
+ onThumbsUp={onThumbsUp}
69
+ onThumbsDown={onThumbsDown}
70
+ markdownTagRenderers={markdownTagRenderers}
71
+ />
72
+ );
73
+ }
74
+
75
+ if (deprecatedMessage.isActionExecutionMessage() && RenderActionExecutionMessage) {
76
+ return (
77
+ <RenderActionExecutionMessage
78
+ messages={messages}
79
+ message={message}
80
+ inProgress={inProgress}
81
+ index={index}
82
+ isCurrentMessage={isCurrentMessage}
83
+ actionResult={actionResult}
84
+ AssistantMessage={AssistantMessage}
85
+ UserMessage={UserMessage}
86
+ />
87
+ );
88
+ }
89
+
90
+ if (deprecatedMessage.isAgentStateMessage() && RenderAgentStateMessage) {
91
+ return (
92
+ <RenderAgentStateMessage
93
+ messages={messages}
94
+ message={message}
95
+ inProgress={inProgress}
96
+ index={index}
97
+ isCurrentMessage={isCurrentMessage}
98
+ AssistantMessage={AssistantMessage}
99
+ UserMessage={UserMessage}
100
+ />
101
+ );
102
+ }
103
+
104
+ if (deprecatedMessage.isResultMessage() && RenderResultMessage) {
105
+ return (
106
+ <RenderResultMessage
107
+ messages={messages}
108
+ message={message}
109
+ inProgress={inProgress}
110
+ index={index}
111
+ isCurrentMessage={isCurrentMessage}
112
+ AssistantMessage={AssistantMessage}
113
+ UserMessage={UserMessage}
114
+ />
115
+ );
116
+ }
117
+
118
+ if (deprecatedMessage.isImageMessage() && RenderImageMessage) {
119
+ return (
120
+ <RenderImageMessage
121
+ messages={messages}
122
+ message={message}
123
+ inProgress={inProgress}
124
+ index={index}
125
+ isCurrentMessage={isCurrentMessage}
126
+ AssistantMessage={AssistantMessage}
127
+ UserMessage={UserMessage}
128
+ />
129
+ );
130
+ }
131
+
132
+ // Fallback to default RenderMessage for any unhandled cases
133
+ return (
134
+ <DefaultRenderMessage
135
+ messages={messages}
136
+ message={message}
137
+ inProgress={inProgress}
138
+ index={index}
139
+ isCurrentMessage={isCurrentMessage}
140
+ AssistantMessage={AssistantMessage}
141
+ UserMessage={UserMessage}
142
+ ImageRenderer={ImageRenderer}
143
+ onRegenerate={onRegenerate}
144
+ onCopy={onCopy}
145
+ onThumbsUp={onThumbsUp}
146
+ onThumbsDown={onThumbsDown}
147
+ markdownTagRenderers={markdownTagRenderers}
148
+ />
149
+ );
150
+ };
@@ -0,0 +1,61 @@
1
+ import { RenderMessageProps } from "../props";
2
+ import { UserMessage as DefaultUserMessage } from "./UserMessage";
3
+ import { AssistantMessage as DefaultAssistantMessage } from "./AssistantMessage";
4
+ import { ImageRenderer as DefaultImageRenderer } from "./ImageRenderer";
5
+
6
+ export function RenderMessage({
7
+ UserMessage = DefaultUserMessage,
8
+ AssistantMessage = DefaultAssistantMessage,
9
+ ImageRenderer = DefaultImageRenderer,
10
+ ...props
11
+ }: RenderMessageProps) {
12
+ const {
13
+ message,
14
+ messages,
15
+ inProgress,
16
+ index,
17
+ isCurrentMessage,
18
+ onRegenerate,
19
+ onCopy,
20
+ onThumbsUp,
21
+ onThumbsDown,
22
+ messageFeedback,
23
+ markdownTagRenderers,
24
+ } = props;
25
+
26
+ switch (message.role) {
27
+ case "user":
28
+ return (
29
+ <UserMessage
30
+ key={index}
31
+ rawData={message}
32
+ data-message-role="user"
33
+ message={message}
34
+ ImageRenderer={ImageRenderer}
35
+ />
36
+ );
37
+ case "assistant":
38
+ return (
39
+ <AssistantMessage
40
+ key={index}
41
+ data-message-role="assistant"
42
+ subComponent={message.generativeUI?.()}
43
+ rawData={message}
44
+ message={message}
45
+ messages={messages}
46
+ isLoading={inProgress && isCurrentMessage && !message.content}
47
+ isGenerating={inProgress && isCurrentMessage && !!message.content}
48
+ isCurrentMessage={isCurrentMessage}
49
+ onRegenerate={() => onRegenerate?.(message.id)}
50
+ onCopy={onCopy}
51
+ onThumbsUp={onThumbsUp}
52
+ onThumbsDown={onThumbsDown}
53
+ feedback={messageFeedback?.[message.id] || null}
54
+ markdownTagRenderers={markdownTagRenderers}
55
+ ImageRenderer={ImageRenderer}
56
+ />
57
+ );
58
+ default:
59
+ return null;
60
+ }
61
+ }