@copilotkit/react-ui 1.7.2-next.2 → 1.8.0-next.3

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 (161) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/{chunk-QXTRFMPM.mjs → chunk-2LRE4W6A.mjs} +13 -11
  3. package/dist/chunk-2LRE4W6A.mjs.map +1 -0
  4. package/dist/{chunk-QXQDIFOC.mjs → chunk-5GNYGURH.mjs} +48 -37
  5. package/dist/chunk-5GNYGURH.mjs.map +1 -0
  6. package/dist/{chunk-CBBFRI3Q.mjs → chunk-5JY5QJ2W.mjs} +9 -5
  7. package/dist/chunk-5JY5QJ2W.mjs.map +1 -0
  8. package/dist/{chunk-OFYI4UU4.mjs → chunk-7RIBDD4K.mjs} +19 -3
  9. package/dist/chunk-7RIBDD4K.mjs.map +1 -0
  10. package/dist/{chunk-YAGE7RCE.mjs → chunk-CGVOCLHN.mjs} +2 -2
  11. package/dist/chunk-FBYETUFL.mjs +118 -0
  12. package/dist/chunk-FBYETUFL.mjs.map +1 -0
  13. package/dist/chunk-GDJAAFIK.mjs +24 -0
  14. package/dist/chunk-GDJAAFIK.mjs.map +1 -0
  15. package/dist/{chunk-6FTRYYR5.mjs → chunk-GJME6MK4.mjs} +72 -62
  16. package/dist/chunk-GJME6MK4.mjs.map +1 -0
  17. package/dist/{chunk-AELKLZSG.mjs → chunk-KG6DW6R2.mjs} +10 -10
  18. package/dist/{chunk-DLG7BZTA.mjs → chunk-LKCAF2HG.mjs} +2 -2
  19. package/dist/{chunk-R2O33F44.mjs → chunk-LXCH2BIB.mjs} +2 -2
  20. package/dist/chunk-ORSMX3SE.mjs +244 -0
  21. package/dist/chunk-ORSMX3SE.mjs.map +1 -0
  22. package/dist/{chunk-UPTB2MVO.mjs → chunk-PCTCOQK2.mjs} +4 -10
  23. package/dist/chunk-PCTCOQK2.mjs.map +1 -0
  24. package/dist/{chunk-ZIF5JJCH.mjs → chunk-QGK5GOSC.mjs} +24 -53
  25. package/dist/chunk-QGK5GOSC.mjs.map +1 -0
  26. package/dist/{chunk-WGAZXTUA.mjs → chunk-TOQ7P4DO.mjs} +6 -9
  27. package/dist/chunk-TOQ7P4DO.mjs.map +1 -0
  28. package/dist/{chunk-3XAXY2Z3.mjs → chunk-UZTZXMYS.mjs} +2 -2
  29. package/dist/{chunk-RQNJNK2W.mjs → chunk-VC4NO5QZ.mjs} +2 -2
  30. package/dist/{chunk-YQ3D5IQV.mjs → chunk-XNQO5AZZ.mjs} +2 -5
  31. package/dist/chunk-XNQO5AZZ.mjs.map +1 -0
  32. package/dist/chunk-YC4NBUGE.mjs +97 -0
  33. package/dist/chunk-YC4NBUGE.mjs.map +1 -0
  34. package/dist/components/chat/Button.js.map +1 -1
  35. package/dist/components/chat/Button.mjs +3 -3
  36. package/dist/components/chat/Chat.d.ts +17 -1
  37. package/dist/components/chat/Chat.js +378 -905
  38. package/dist/components/chat/Chat.js.map +1 -1
  39. package/dist/components/chat/Chat.mjs +11 -18
  40. package/dist/components/chat/ChatContext.d.ts +20 -0
  41. package/dist/components/chat/ChatContext.js +44 -74
  42. package/dist/components/chat/ChatContext.js.map +1 -1
  43. package/dist/components/chat/ChatContext.mjs +2 -2
  44. package/dist/components/chat/CodeBlock.js +58 -82
  45. package/dist/components/chat/CodeBlock.js.map +1 -1
  46. package/dist/components/chat/CodeBlock.mjs +2 -2
  47. package/dist/components/chat/Header.js +516 -4
  48. package/dist/components/chat/Header.js.map +1 -1
  49. package/dist/components/chat/Header.mjs +10 -3
  50. package/dist/components/chat/Icons.d.ts +10 -9
  51. package/dist/components/chat/Icons.js +125 -164
  52. package/dist/components/chat/Icons.js.map +1 -1
  53. package/dist/components/chat/Icons.mjs +9 -5
  54. package/dist/components/chat/Input.d.ts +1 -1
  55. package/dist/components/chat/Input.js +11 -9
  56. package/dist/components/chat/Input.js.map +1 -1
  57. package/dist/components/chat/Input.mjs +3 -3
  58. package/dist/components/chat/Markdown.js +58 -56
  59. package/dist/components/chat/Markdown.js.map +1 -1
  60. package/dist/components/chat/Markdown.mjs +3 -3
  61. package/dist/components/chat/Messages.d.ts +1 -1
  62. package/dist/components/chat/Messages.js +70 -60
  63. package/dist/components/chat/Messages.js.map +1 -1
  64. package/dist/components/chat/Messages.mjs +3 -3
  65. package/dist/components/chat/Modal.js +1708 -1749
  66. package/dist/components/chat/Modal.js.map +1 -1
  67. package/dist/components/chat/Modal.mjs +21 -21
  68. package/dist/components/chat/Popup.js +1708 -1749
  69. package/dist/components/chat/Popup.js.map +1 -1
  70. package/dist/components/chat/Popup.mjs +22 -22
  71. package/dist/components/chat/Response.js.map +1 -1
  72. package/dist/components/chat/Response.mjs +3 -3
  73. package/dist/components/chat/Sidebar.js +1710 -1751
  74. package/dist/components/chat/Sidebar.js.map +1 -1
  75. package/dist/components/chat/Sidebar.mjs +22 -22
  76. package/dist/components/chat/Suggestion.js +4 -40
  77. package/dist/components/chat/Suggestion.js.map +1 -1
  78. package/dist/components/chat/Suggestion.mjs +2 -2
  79. package/dist/components/chat/Window.js.map +1 -1
  80. package/dist/components/chat/Window.mjs +3 -3
  81. package/dist/components/chat/index.js +1710 -1751
  82. package/dist/components/chat/index.js.map +1 -1
  83. package/dist/components/chat/index.mjs +24 -24
  84. package/dist/components/chat/messages/AssistantMessage.js +211 -59
  85. package/dist/components/chat/messages/AssistantMessage.js.map +1 -1
  86. package/dist/components/chat/messages/AssistantMessage.mjs +5 -5
  87. package/dist/components/chat/messages/RenderTextMessage.js +18 -2
  88. package/dist/components/chat/messages/RenderTextMessage.js.map +1 -1
  89. package/dist/components/chat/messages/RenderTextMessage.mjs +1 -1
  90. package/dist/components/chat/props.d.ts +53 -0
  91. package/dist/components/chat/props.js.map +1 -1
  92. package/dist/components/dev-console/console.js +51 -233
  93. package/dist/components/dev-console/console.js.map +1 -1
  94. package/dist/components/dev-console/console.mjs +3 -3
  95. package/dist/components/dev-console/index.js +51 -233
  96. package/dist/components/dev-console/index.js.map +1 -1
  97. package/dist/components/dev-console/index.mjs +3 -3
  98. package/dist/components/help-modal/index.js +29 -147
  99. package/dist/components/help-modal/index.js.map +1 -1
  100. package/dist/components/help-modal/index.mjs +1 -1
  101. package/dist/components/help-modal/modal.js +29 -147
  102. package/dist/components/help-modal/modal.js.map +1 -1
  103. package/dist/components/help-modal/modal.mjs +1 -1
  104. package/dist/components/index.js +1683 -1724
  105. package/dist/components/index.js.map +1 -1
  106. package/dist/components/index.mjs +28 -28
  107. package/dist/index.css +254 -90
  108. package/dist/index.css.map +1 -1
  109. package/dist/index.js +1692 -1733
  110. package/dist/index.js.map +1 -1
  111. package/dist/index.mjs +28 -28
  112. package/dist/types/css.d.ts +7 -1
  113. package/dist/types/css.js.map +1 -1
  114. package/package.json +4 -4
  115. package/src/components/chat/Chat.tsx +59 -22
  116. package/src/components/chat/ChatContext.tsx +29 -1
  117. package/src/components/chat/CodeBlock.tsx +2 -4
  118. package/src/components/chat/Header.tsx +8 -3
  119. package/src/components/chat/Icons.tsx +108 -108
  120. package/src/components/chat/Input.tsx +42 -38
  121. package/src/components/chat/Markdown.tsx +0 -3
  122. package/src/components/chat/Messages.tsx +68 -56
  123. package/src/components/chat/Suggestion.tsx +2 -3
  124. package/src/components/chat/messages/AssistantMessage.tsx +95 -3
  125. package/src/components/chat/messages/RenderTextMessage.tsx +17 -1
  126. package/src/components/chat/props.ts +66 -0
  127. package/src/components/dev-console/console.tsx +16 -54
  128. package/src/components/help-modal/modal.tsx +38 -101
  129. package/src/css/button.css +15 -4
  130. package/src/css/colors.css +27 -6
  131. package/src/css/console.css +46 -39
  132. package/src/css/header.css +22 -5
  133. package/src/css/input.css +24 -17
  134. package/src/css/markdown.css +2 -1
  135. package/src/css/messages.css +125 -15
  136. package/src/css/panel.css +1 -0
  137. package/src/css/suggestions.css +14 -6
  138. package/src/types/css.ts +7 -1
  139. package/dist/chunk-3VNMQWGT.mjs +0 -25
  140. package/dist/chunk-3VNMQWGT.mjs.map +0 -1
  141. package/dist/chunk-6FTRYYR5.mjs.map +0 -1
  142. package/dist/chunk-CBBFRI3Q.mjs.map +0 -1
  143. package/dist/chunk-FZC7X5PK.mjs +0 -262
  144. package/dist/chunk-FZC7X5PK.mjs.map +0 -1
  145. package/dist/chunk-OFYI4UU4.mjs.map +0 -1
  146. package/dist/chunk-QXQDIFOC.mjs.map +0 -1
  147. package/dist/chunk-QXTRFMPM.mjs.map +0 -1
  148. package/dist/chunk-TI7SY2RI.mjs +0 -164
  149. package/dist/chunk-TI7SY2RI.mjs.map +0 -1
  150. package/dist/chunk-UPTB2MVO.mjs.map +0 -1
  151. package/dist/chunk-VEC45H6Q.mjs +0 -18
  152. package/dist/chunk-VEC45H6Q.mjs.map +0 -1
  153. package/dist/chunk-WGAZXTUA.mjs.map +0 -1
  154. package/dist/chunk-YQ3D5IQV.mjs.map +0 -1
  155. package/dist/chunk-ZIF5JJCH.mjs.map +0 -1
  156. /package/dist/{chunk-YAGE7RCE.mjs.map → chunk-CGVOCLHN.mjs.map} +0 -0
  157. /package/dist/{chunk-AELKLZSG.mjs.map → chunk-KG6DW6R2.mjs.map} +0 -0
  158. /package/dist/{chunk-DLG7BZTA.mjs.map → chunk-LKCAF2HG.mjs.map} +0 -0
  159. /package/dist/{chunk-R2O33F44.mjs.map → chunk-LXCH2BIB.mjs.map} +0 -0
  160. /package/dist/{chunk-3XAXY2Z3.mjs.map → chunk-UZTZXMYS.mjs.map} +0 -0
  161. /package/dist/{chunk-RQNJNK2W.mjs.map → chunk-VC4NO5QZ.mjs.map} +0 -0
@@ -140,7 +140,20 @@ var SendIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
140
140
  xmlns: "http://www.w3.org/2000/svg",
141
141
  fill: "none",
142
142
  viewBox: "0 0 24 24",
143
- strokeWidth: 1.5,
143
+ strokeWidth: "1.5",
144
+ stroke: "currentColor",
145
+ width: "24",
146
+ height: "24",
147
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 19V5m0 0l-7 7m7-7l7 7" })
148
+ }
149
+ );
150
+ var MicrophoneIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
151
+ "svg",
152
+ {
153
+ xmlns: "http://www.w3.org/2000/svg",
154
+ fill: "none",
155
+ viewBox: "0 0 24 24",
156
+ strokeWidth: "1.5",
144
157
  stroke: "currentColor",
145
158
  width: "24",
146
159
  height: "24",
@@ -149,184 +162,157 @@ var SendIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
149
162
  {
150
163
  strokeLinecap: "round",
151
164
  strokeLinejoin: "round",
152
- d: "M6 12L3.269 3.126A59.768 59.768 0 0121.485 12 59.77 59.77 0 013.27 20.876L5.999 12zm0 0h7.5"
165
+ d: "M12 18.75a6 6 0 006-6v-1.5m-6 7.5a6 6 0 01-6-6v-1.5m6 7.5v3.75m-3.75 0h7.5M12 15.75a3 3 0 01-3-3V4.5a3 3 0 116 0v8.25a3 3 0 01-3 3z"
153
166
  }
154
167
  )
155
168
  }
156
169
  );
157
- var SpinnerIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
170
+ var StopIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
158
171
  "svg",
159
172
  {
160
- style: {
161
- animation: "copilotKitSpinAnimation 1s linear infinite",
162
- color: "rgb(107 114 128)"
163
- },
164
- width: "24",
165
- height: "24",
166
173
  xmlns: "http://www.w3.org/2000/svg",
167
174
  fill: "none",
168
175
  viewBox: "0 0 24 24",
169
- children: [
170
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
171
- "circle",
172
- {
173
- style: { opacity: 0.25 },
174
- cx: "12",
175
- cy: "12",
176
- r: "10",
177
- stroke: "currentColor",
178
- strokeWidth: "4"
179
- }
180
- ),
181
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
182
- "path",
183
- {
184
- style: { opacity: 0.75 },
185
- fill: "currentColor",
186
- d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
187
- }
188
- )
189
- ]
176
+ strokeWidth: "1.5",
177
+ stroke: "currentColor",
178
+ width: "24",
179
+ height: "24",
180
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
181
+ "path",
182
+ {
183
+ strokeLinecap: "round",
184
+ strokeLinejoin: "round",
185
+ d: "M5.25 7.5A2.25 2.25 0 017.5 5.25h9a2.25 2.25 0 012.25 2.25v9a2.25 2.25 0 01-2.25 2.25h-9a2.25 2.25 0 01-2.25-2.25v-9z"
186
+ }
187
+ )
190
188
  }
191
189
  );
192
- var SmallSpinnerIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
190
+ var RegenerateIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
193
191
  "svg",
194
192
  {
195
- style: {
196
- animation: "copilotKitSpinAnimation 1s linear infinite"
197
- },
198
- width: "13",
199
- height: "13",
200
193
  xmlns: "http://www.w3.org/2000/svg",
201
194
  fill: "none",
202
195
  viewBox: "0 0 24 24",
203
- children: [
204
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
205
- "circle",
206
- {
207
- style: { opacity: 0.25 },
208
- cx: "12",
209
- cy: "12",
210
- r: "10",
211
- stroke: "currentColor",
212
- strokeWidth: "4"
213
- }
214
- ),
215
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
216
- "path",
217
- {
218
- style: { opacity: 0.75 },
219
- fill: "currentColor",
220
- d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
221
- }
222
- )
223
- ]
196
+ strokeWidth: "2",
197
+ stroke: "currentColor",
198
+ width: "16",
199
+ height: "16",
200
+ style: { minWidth: "16px", minHeight: "16px" },
201
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
202
+ "path",
203
+ {
204
+ strokeLinecap: "round",
205
+ strokeLinejoin: "round",
206
+ d: "M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0l3.181 3.183a8.25 8.25 0 0013.803-3.7M4.031 9.865a8.25 8.25 0 0113.803-3.7l3.181 3.182m0-4.991v4.99"
207
+ }
208
+ )
224
209
  }
225
210
  );
226
- var ActivityIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
211
+ var CopyIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
227
212
  "svg",
228
213
  {
229
- style: {
230
- display: "inline-block",
231
- marginLeft: "0.25rem",
232
- marginRight: "0.25rem"
233
- },
234
- height: "24",
235
- width: "24",
236
- viewBox: "0 0 27 27",
237
214
  xmlns: "http://www.w3.org/2000/svg",
238
- fill: "currentColor",
239
- children: [
240
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { className: "copilotKitActivityDot1", cx: "4", cy: "12", r: "3" }),
241
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { className: "copilotKitActivityDot1 copilotKitActivityDot2", cx: "12", cy: "12", r: "3" }),
242
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { className: "copilotKitActivityDot1 copilotKitActivityDot3", cx: "20", cy: "12", r: "3" })
243
- ]
215
+ fill: "none",
216
+ viewBox: "0 0 24 24",
217
+ strokeWidth: "2",
218
+ stroke: "currentColor",
219
+ width: "16",
220
+ height: "16",
221
+ style: { minWidth: "16px", minHeight: "16px" },
222
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
223
+ "path",
224
+ {
225
+ strokeLinecap: "round",
226
+ strokeLinejoin: "round",
227
+ d: "M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 01-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 011.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 00-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 01-1.125-1.125v-9.25m12 6.625v-1.875a3.375 3.375 0 00-3.375-3.375h-1.5a1.125 1.125 0 01-1.125-1.125v-1.5a3.375 3.375 0 00-3.375-3.375H9.75"
228
+ }
229
+ )
244
230
  }
245
231
  );
246
- function CheckIcon(_a) {
247
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
248
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
249
- "svg",
250
- __spreadProps(__spreadValues({
251
- xmlns: "http://www.w3.org/2000/svg",
252
- viewBox: "0 0 256 256",
253
- fill: "currentColor",
254
- style: { height: "1rem", width: "1rem" },
255
- className
256
- }, props), {
257
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "m229.66 77.66-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69 218.34 66.34a8 8 0 0 1 11.32 11.32Z" })
258
- })
259
- );
260
- }
261
- function DownloadIcon(_a) {
262
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
263
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
264
- "svg",
265
- __spreadProps(__spreadValues({
266
- xmlns: "http://www.w3.org/2000/svg",
267
- viewBox: "0 0 256 256",
268
- fill: "currentColor",
269
- style: { height: "1rem", width: "1rem" },
270
- className
271
- }, props), {
272
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M224 152v56a16 16 0 0 1-16 16H48a16 16 0 0 1-16-16v-56a8 8 0 0 1 16 0v56h160v-56a8 8 0 0 1 16 0Zm-101.66 5.66a8 8 0 0 0 11.32 0l40-40a8 8 0 0 0-11.32-11.32L136 132.69V40a8 8 0 0 0-16 0v92.69l-26.34-26.35a8 8 0 0 0-11.32 11.32Z" })
273
- })
274
- );
275
- }
276
- function CopyIcon(_a) {
277
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
278
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
279
- "svg",
280
- __spreadProps(__spreadValues({
281
- xmlns: "http://www.w3.org/2000/svg",
282
- viewBox: "0 0 256 256",
283
- fill: "currentColor",
284
- style: { height: "1rem", width: "1rem" },
285
- className
286
- }, props), {
287
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M216 32H88a8 8 0 0 0-8 8v40H40a8 8 0 0 0-8 8v128a8 8 0 0 0 8 8h128a8 8 0 0 0 8-8v-40h40a8 8 0 0 0 8-8V40a8 8 0 0 0-8-8Zm-56 176H48V96h112Zm48-48h-32V88a8 8 0 0 0-8-8H96V48h112Z" })
288
- })
289
- );
290
- }
291
- var StopIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
232
+ var SmallSpinnerIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "copilotKitSpinner", style: { width: "13px", height: "13px" } });
233
+ var SpinnerIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "copilotKitSpinner", style: { width: "24px", height: "24px" } });
234
+ var ActivityIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "4px" }, children: [
235
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "copilotKitActivityDot", style: { animationDelay: "0s" } }),
236
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "copilotKitActivityDot", style: { animationDelay: "0.2s" } }),
237
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "copilotKitActivityDot", style: { animationDelay: "0.4s" } })
238
+ ] });
239
+ var ThumbsUpIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
292
240
  "svg",
293
241
  {
294
242
  xmlns: "http://www.w3.org/2000/svg",
295
- viewBox: "0 0 256 256",
296
- fill: "currentColor",
297
- style: { height: "1rem", width: "1rem" },
298
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24Zm0 192a88 88 0 1 1 88-88 88.1 88.1 0 0 1-88 88Zm24-120h-48a8 8 0 0 0-8 8v48a8 8 0 0 0 8 8h48a8 8 0 0 0 8-8v-48a8 8 0 0 0-8-8Zm-8 48h-32v-32h32Z" })
243
+ fill: "none",
244
+ viewBox: "0 0 24 24",
245
+ strokeWidth: "2",
246
+ stroke: "currentColor",
247
+ width: "16",
248
+ height: "16",
249
+ style: { minWidth: "16px", minHeight: "16px" },
250
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
251
+ "path",
252
+ {
253
+ strokeLinecap: "round",
254
+ strokeLinejoin: "round",
255
+ d: "M6.633 10.5c.806 0 1.533-.446 2.031-1.08a9.041 9.041 0 012.861-2.4c.723-.384 1.35-.956 1.653-1.715a4.498 4.498 0 00.322-1.672V3a.75.75 0 01.75-.75A2.25 2.25 0 0116.5 4.5c0 1.152-.26 2.243-.723 3.218-.266.558.107 1.282.725 1.282h3.126c1.026 0 1.945.694 2.054 1.715.045.422.068.85.068 1.285a11.95 11.95 0 01-2.649 7.521c-.388.482-.987.729-1.605.729H13.48c-.483 0-.964-.078-1.423-.23l-3.114-1.04a4.501 4.501 0 00-1.423-.23H5.904M14.25 9h2.25M5.904 18.75c.083.205.173.405.27.602.197.4-.078.898-.523.898h-.908c-.889 0-1.713-.518-1.972-1.368a12 12 0 01-.521-3.507c0-1.553.295-3.036.831-4.398C3.387 10.203 4.167 9.75 5 9.75h1.053c.472 0 .745.556.5.96a8.958 8.958 0 00-1.302 4.665c0 1.194.232 2.333.654 3.375z"
256
+ }
257
+ )
299
258
  }
300
259
  );
301
- var RegenerateIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
260
+ var ThumbsDownIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
302
261
  "svg",
303
262
  {
304
263
  xmlns: "http://www.w3.org/2000/svg",
305
- viewBox: "0 0 256 256",
306
- fill: "currentColor",
307
- style: { height: "1rem", width: "1rem" },
308
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M197.67 186.37a8 8 0 0 1 0 11.29C196.58 198.73 170.82 224 128 224c-37.39 0-64.53-22.4-80-39.85V208a8 8 0 0 1-16 0v-48a8 8 0 0 1 8-8h48a8 8 0 0 1 0 16H55.44C67.76 183.35 93 208 128 208c36 0 58.14-21.46 58.36-21.68a8 8 0 0 1 11.31.05ZM216 40a8 8 0 0 0-8 8v23.85C192.53 54.4 165.39 32 128 32c-42.82 0-68.58 25.27-69.66 26.34a8 8 0 0 0 11.3 11.34C69.86 69.46 92 48 128 48c35 0 60.24 24.65 72.56 40H168a8 8 0 0 0 0 16h48a8 8 0 0 0 8-8V48a8 8 0 0 0-8-8Z" })
264
+ fill: "none",
265
+ viewBox: "0 0 24 24",
266
+ strokeWidth: "2",
267
+ stroke: "currentColor",
268
+ width: "16",
269
+ height: "16",
270
+ style: { minWidth: "16px", minHeight: "16px" },
271
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
272
+ "path",
273
+ {
274
+ strokeLinecap: "round",
275
+ strokeLinejoin: "round",
276
+ d: "M7.5 15h2.25m8.024-9.75c.011.05.028.1.052.148.591 1.2.924 2.55.924 3.977a8.96 8.96 0 01-.999 4.125m.023-8.25c-.076-.365.183-.75.575-.75h.908c.889 0 1.713.518 1.972 1.368.339 1.11.521 2.287.521 3.507 0 1.553-.295 3.036-.831 4.398C20.613 14.547 19.833 15 19 15h-1.053c-.472 0-.745-.556-.5-.96a8.95 8.95 0 00.303-.54m.023-8.25H16.48a4.5 4.5 0 01-1.423-.23l-3.114-1.04a4.5 4.5 0 00-1.423-.23H6.504c-.618 0-1.217.247-1.605.729A11.95 11.95 0 002.25 12c0 .434.023.863.068 1.285C2.427 14.306 3.346 15 4.372 15h3.126c.618 0 .991.724.725 1.282A7.471 7.471 0 007.5 19.5a2.25 2.25 0 002.25 2.25.75.75 0 00.75-.75v-.633c0-.573.11-1.14.322-1.672.304-.76.93-1.33 1.653-1.715a9.04 9.04 0 002.86-2.4c.498-.634 1.226-1.08 2.032-1.08h.384"
277
+ }
278
+ )
309
279
  }
310
280
  );
311
- var PushToTalkIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
281
+ var DownloadIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
312
282
  "svg",
313
283
  {
314
284
  xmlns: "http://www.w3.org/2000/svg",
315
285
  fill: "none",
316
286
  viewBox: "0 0 24 24",
317
- strokeWidth: 1.5,
287
+ strokeWidth: "2",
318
288
  stroke: "currentColor",
319
- className: "w-6 h-6",
289
+ width: "16",
290
+ height: "16",
291
+ style: { minWidth: "16px", minHeight: "16px" },
320
292
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
321
293
  "path",
322
294
  {
323
295
  strokeLinecap: "round",
324
296
  strokeLinejoin: "round",
325
- d: "M12 18.75a6 6 0 0 0 6-6v-1.5m-6 7.5a6 6 0 0 1-6-6v-1.5m6 7.5v3.75m-3.75 0h7.5M12 15.75a3 3 0 0 1-3-3V4.5a3 3 0 1 1 6 0v8.25a3 3 0 0 1-3 3Z"
297
+ d: "M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3"
326
298
  }
327
299
  )
328
300
  }
329
301
  );
302
+ var CheckIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
303
+ "svg",
304
+ {
305
+ xmlns: "http://www.w3.org/2000/svg",
306
+ fill: "none",
307
+ viewBox: "0 0 24 24",
308
+ strokeWidth: "2",
309
+ stroke: "currentColor",
310
+ width: "16",
311
+ height: "16",
312
+ style: { minWidth: "16px", minHeight: "16px" },
313
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4.5 12.75l6 6 9-13.5" })
314
+ }
315
+ );
330
316
 
331
317
  // src/components/chat/ChatContext.tsx
332
318
  var import_jsx_runtime2 = require("react/jsx-runtime");
@@ -357,7 +343,11 @@ var ChatContextProvider = ({
357
343
  placeholder: "Type a message...",
358
344
  error: "\u274C An error occurred. Please try again.",
359
345
  stopGenerating: "Stop generating",
360
- regenerateResponse: "Regenerate response"
346
+ regenerateResponse: "Regenerate response",
347
+ copyToClipboard: "Copy to clipboard",
348
+ thumbsUp: "Thumbs up",
349
+ thumbsDown: "Thumbs down",
350
+ copied: "Copied!"
361
351
  }), labels),
362
352
  [labels]
363
353
  );
@@ -371,7 +361,7 @@ var ChatContextProvider = ({
371
361
  spinnerIcon: SpinnerIcon,
372
362
  stopIcon: StopIcon,
373
363
  regenerateIcon: RegenerateIcon,
374
- pushToTalkIcon: PushToTalkIcon
364
+ pushToTalkIcon: MicrophoneIcon
375
365
  }), icons),
376
366
  [icons]
377
367
  );
@@ -401,7 +391,11 @@ var Messages = ({
401
391
  RenderAgentStateMessage: RenderAgentStateMessage2,
402
392
  RenderResultMessage: RenderResultMessage2,
403
393
  AssistantMessage: AssistantMessage2,
404
- UserMessage: UserMessage2
394
+ UserMessage: UserMessage2,
395
+ onRegenerate,
396
+ onCopy,
397
+ onThumbsUp,
398
+ onThumbsDown
405
399
  }) => {
406
400
  const context = useChatContext();
407
401
  const initialMessages = (0, import_react2.useMemo)(
@@ -424,65 +418,71 @@ var Messages = ({
424
418
  const { messagesEndRef, messagesContainerRef } = useScrollToBottom(messages);
425
419
  const interrupt = (0, import_react_core.useLangGraphInterruptRender)();
426
420
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "copilotKitMessages", ref: messagesContainerRef, children: [
427
- messages.map((message, index) => {
428
- const isCurrentMessage = index === messages.length - 1;
429
- if (message.isTextMessage()) {
430
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
431
- RenderTextMessage2,
432
- {
433
- message,
434
- inProgress,
435
- index,
436
- isCurrentMessage,
437
- AssistantMessage: AssistantMessage2,
438
- UserMessage: UserMessage2
439
- },
440
- index
441
- );
442
- } else if (message.isActionExecutionMessage()) {
443
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
444
- RenderActionExecutionMessage2,
445
- {
446
- message,
447
- inProgress,
448
- index,
449
- isCurrentMessage,
450
- actionResult: actionResults[message.id],
451
- AssistantMessage: AssistantMessage2,
452
- UserMessage: UserMessage2
453
- },
454
- index
455
- );
456
- } else if (message.isAgentStateMessage()) {
457
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
458
- RenderAgentStateMessage2,
459
- {
460
- message,
461
- inProgress,
462
- index,
463
- isCurrentMessage,
464
- AssistantMessage: AssistantMessage2,
465
- UserMessage: UserMessage2
466
- },
467
- index
468
- );
469
- } else if (message.isResultMessage()) {
470
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
471
- RenderResultMessage2,
472
- {
473
- message,
474
- inProgress,
475
- index,
476
- isCurrentMessage,
477
- AssistantMessage: AssistantMessage2,
478
- UserMessage: UserMessage2
479
- },
480
- index
481
- );
482
- }
483
- }),
484
- interrupt,
485
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("footer", { ref: messagesEndRef, children })
421
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "copilotKitMessagesContainer", children: [
422
+ messages.map((message, index) => {
423
+ const isCurrentMessage = index === messages.length - 1;
424
+ if (message.isTextMessage()) {
425
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
426
+ RenderTextMessage2,
427
+ {
428
+ message,
429
+ inProgress,
430
+ index,
431
+ isCurrentMessage,
432
+ AssistantMessage: AssistantMessage2,
433
+ UserMessage: UserMessage2,
434
+ onRegenerate,
435
+ onCopy,
436
+ onThumbsUp,
437
+ onThumbsDown
438
+ },
439
+ index
440
+ );
441
+ } else if (message.isActionExecutionMessage()) {
442
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
443
+ RenderActionExecutionMessage2,
444
+ {
445
+ message,
446
+ inProgress,
447
+ index,
448
+ isCurrentMessage,
449
+ actionResult: actionResults[message.id],
450
+ AssistantMessage: AssistantMessage2,
451
+ UserMessage: UserMessage2
452
+ },
453
+ index
454
+ );
455
+ } else if (message.isAgentStateMessage()) {
456
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
457
+ RenderAgentStateMessage2,
458
+ {
459
+ message,
460
+ inProgress,
461
+ index,
462
+ isCurrentMessage,
463
+ AssistantMessage: AssistantMessage2,
464
+ UserMessage: UserMessage2
465
+ },
466
+ index
467
+ );
468
+ } else if (message.isResultMessage()) {
469
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
470
+ RenderResultMessage2,
471
+ {
472
+ message,
473
+ inProgress,
474
+ index,
475
+ isCurrentMessage,
476
+ AssistantMessage: AssistantMessage2,
477
+ UserMessage: UserMessage2
478
+ },
479
+ index
480
+ );
481
+ }
482
+ }),
483
+ interrupt
484
+ ] }),
485
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("footer", { className: "copilotKitMessagesFooter", ref: messagesEndRef, children })
486
486
  ] });
487
487
  };
488
488
  function makeInitialMessages(initial) {
@@ -720,7 +720,7 @@ var usePushToTalk = ({
720
720
  // src/components/chat/Input.tsx
721
721
  var import_react_core3 = require("@copilotkit/react-core");
722
722
  var import_jsx_runtime5 = require("react/jsx-runtime");
723
- var Input = ({ inProgress, onSend, isVisible = false }) => {
723
+ var Input = ({ inProgress, onSend, isVisible = false, onStop }) => {
724
724
  const context = useChatContext();
725
725
  const copilotContext = (0, import_react_core3.useCopilotContext)();
726
726
  const pushToTalkConfigured = copilotContext.copilotApiConfig.textToSpeechUrl !== void 0 && copilotContext.copilotApiConfig.transcribeAudioUrl !== void 0;
@@ -750,16 +750,17 @@ var Input = ({ inProgress, onSend, isVisible = false }) => {
750
750
  sendFunction: onSend,
751
751
  inProgress
752
752
  });
753
- const sendIcon = inProgress || pushToTalkState === "transcribing" ? context.icons.activityIcon : context.icons.sendIcon;
753
+ const isInProgress = inProgress || pushToTalkState === "transcribing";
754
+ const buttonIcon = isInProgress ? context.icons.stopIcon : context.icons.sendIcon;
754
755
  const showPushToTalk = pushToTalkConfigured && (pushToTalkState === "idle" || pushToTalkState === "recording") && !inProgress;
755
756
  const canSend = () => {
756
757
  var _a;
757
758
  const interruptEvent = (_a = copilotContext.langGraphInterruptAction) == null ? void 0 : _a.event;
758
759
  const interruptInProgress = (interruptEvent == null ? void 0 : interruptEvent.name) === "LangGraphInterruptEvent" && !(interruptEvent == null ? void 0 : interruptEvent.response);
759
- return !inProgress && text.trim().length > 0 && pushToTalkState === "idle" && !interruptInProgress;
760
+ return (isInProgress || !isInProgress && text.trim().length > 0) && pushToTalkState === "idle" && !interruptInProgress;
760
761
  };
761
762
  const sendDisabled = !canSend();
762
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "copilotKitInput", onClick: handleDivClick, children: [
763
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "copilotKitInputContainer", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "copilotKitInput", onClick: handleDivClick, children: [
763
764
  /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
764
765
  Textarea_default,
765
766
  {
@@ -780,6 +781,7 @@ var Input = ({ inProgress, onSend, isVisible = false }) => {
780
781
  }
781
782
  ),
782
783
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "copilotKitInputControls", children: [
784
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { flexGrow: 1 } }),
783
785
  showPushToTalk && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
784
786
  "button",
785
787
  {
@@ -792,14 +794,14 @@ var Input = ({ inProgress, onSend, isVisible = false }) => {
792
794
  "button",
793
795
  {
794
796
  disabled: sendDisabled,
795
- onClick: send,
796
- "data-copilotkit-in-progress": !!inProgress,
797
- "data-testid": inProgress ? "copilot-chat-request-in-progress" : void 0,
798
- children: sendIcon
797
+ onClick: isInProgress ? onStop : send,
798
+ "data-copilotkit-in-progress": inProgress,
799
+ "data-test-id": inProgress ? "copilot-chat-request-in-progress" : "copilot-chat-ready",
800
+ children: buttonIcon
799
801
  }
800
802
  )
801
803
  ] })
802
- ] });
804
+ ] }) });
803
805
  };
804
806
 
805
807
  // src/components/chat/Response.tsx
@@ -815,7 +817,18 @@ var ResponseButton = ({ onClick, inProgress }) => {
815
817
  // src/components/chat/messages/RenderTextMessage.tsx
816
818
  var import_jsx_runtime7 = require("react/jsx-runtime");
817
819
  function RenderTextMessage(props) {
818
- const { message, inProgress, index, isCurrentMessage, UserMessage: UserMessage2, AssistantMessage: AssistantMessage2 } = props;
820
+ const {
821
+ message,
822
+ inProgress,
823
+ index,
824
+ isCurrentMessage,
825
+ UserMessage: UserMessage2,
826
+ AssistantMessage: AssistantMessage2,
827
+ onRegenerate,
828
+ onCopy,
829
+ onThumbsUp,
830
+ onThumbsDown
831
+ } = props;
819
832
  if (message.isTextMessage()) {
820
833
  if (message.role === "user") {
821
834
  return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
@@ -835,7 +848,12 @@ function RenderTextMessage(props) {
835
848
  message: message.content,
836
849
  rawData: message,
837
850
  isLoading: inProgress && isCurrentMessage && !message.content,
838
- isGenerating: inProgress && isCurrentMessage && !!message.content
851
+ isGenerating: inProgress && isCurrentMessage && !!message.content,
852
+ isCurrentMessage,
853
+ onRegenerate,
854
+ onCopy,
855
+ onThumbsUp,
856
+ onThumbsDown
839
857
  },
840
858
  index
841
859
  );
@@ -1165,14 +1183,8 @@ var CodeBlock = (0, import_react6.memo)(({ language, value }) => {
1165
1183
  /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "copilotKitCodeBlockToolbar", children: [
1166
1184
  /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "copilotKitCodeBlockToolbarLanguage", children: language }),
1167
1185
  /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "copilotKitCodeBlockToolbarButtons", children: [
1168
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("button", { className: "copilotKitCodeBlockToolbarButton", onClick: downloadAsFile, children: [
1169
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(DownloadIcon, {}),
1170
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "sr-only", children: "Download" })
1171
- ] }),
1172
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("button", { className: "copilotKitCodeBlockToolbarButton", onClick: onCopy, children: [
1173
- isCopied ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(CheckIcon, {}) : /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(CopyIcon, {}),
1174
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "sr-only", children: "Copy code" })
1175
- ] })
1186
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("button", { className: "copilotKitCodeBlockToolbarButton", onClick: downloadAsFile, children: DownloadIcon }),
1187
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("button", { className: "copilotKitCodeBlockToolbarButton", onClick: onCopy, children: isCopied ? CheckIcon : CopyIcon })
1176
1188
  ] })
1177
1189
  ] }),
1178
1190
  /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
@@ -1487,9 +1499,6 @@ var Markdown = ({ content }) => {
1487
1499
  return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "copilotKitMarkdown", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(MemoizedReactMarkdown, { components, remarkPlugins: [import_remark_gfm.default, import_remark_math.default], children: content }) });
1488
1500
  };
1489
1501
  var components = {
1490
- p({ children }) {
1491
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("p", { children });
1492
- },
1493
1502
  a(_a) {
1494
1503
  var _b = _a, { children } = _b, props = __objRest(_b, ["children"]);
1495
1504
  return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
@@ -1536,14 +1545,101 @@ var components = {
1536
1545
  };
1537
1546
 
1538
1547
  // src/components/chat/messages/AssistantMessage.tsx
1548
+ var import_react8 = require("react");
1539
1549
  var import_jsx_runtime13 = require("react/jsx-runtime");
1540
1550
  var AssistantMessage = (props) => {
1541
- const { icons } = useChatContext();
1542
- const { message, isLoading, subComponent } = props;
1551
+ const { icons, labels } = useChatContext();
1552
+ const {
1553
+ message,
1554
+ isLoading,
1555
+ subComponent,
1556
+ onRegenerate,
1557
+ onCopy,
1558
+ onThumbsUp,
1559
+ onThumbsDown,
1560
+ isCurrentMessage
1561
+ } = props;
1562
+ const [copied, setCopied] = (0, import_react8.useState)(false);
1563
+ const handleCopy = () => {
1564
+ if (message && onCopy) {
1565
+ navigator.clipboard.writeText(message);
1566
+ setCopied(true);
1567
+ onCopy(message);
1568
+ setTimeout(() => setCopied(false), 2e3);
1569
+ } else if (message) {
1570
+ navigator.clipboard.writeText(message);
1571
+ setCopied(true);
1572
+ setTimeout(() => setCopied(false), 2e3);
1573
+ }
1574
+ };
1575
+ const handleRegenerate = () => {
1576
+ if (onRegenerate) {
1577
+ onRegenerate();
1578
+ }
1579
+ };
1580
+ const handleThumbsUp = () => {
1581
+ if (onThumbsUp && message) {
1582
+ onThumbsUp(message);
1583
+ }
1584
+ };
1585
+ const handleThumbsDown = () => {
1586
+ if (onThumbsDown && message) {
1587
+ onThumbsDown(message);
1588
+ }
1589
+ };
1590
+ const LoadingIcon = () => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { children: icons.activityIcon });
1543
1591
  return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
1544
1592
  (message || isLoading) && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "copilotKitMessage copilotKitAssistantMessage", children: [
1545
1593
  message && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Markdown, { content: message || "" }),
1546
- isLoading && icons.spinnerIcon
1594
+ isLoading && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(LoadingIcon, {}),
1595
+ message && !isLoading && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
1596
+ "div",
1597
+ {
1598
+ className: `copilotKitMessageControls ${isCurrentMessage ? "currentMessage" : ""}`,
1599
+ children: [
1600
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1601
+ "button",
1602
+ {
1603
+ className: "copilotKitMessageControlButton",
1604
+ onClick: handleRegenerate,
1605
+ "aria-label": labels.regenerateResponse,
1606
+ title: labels.regenerateResponse,
1607
+ children: RegenerateIcon
1608
+ }
1609
+ ),
1610
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1611
+ "button",
1612
+ {
1613
+ className: "copilotKitMessageControlButton",
1614
+ onClick: handleCopy,
1615
+ "aria-label": labels.copyToClipboard,
1616
+ title: labels.copyToClipboard,
1617
+ children: copied ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { style: { fontSize: "10px", fontWeight: "bold" }, children: "\u2713" }) : CopyIcon
1618
+ }
1619
+ ),
1620
+ onThumbsUp && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1621
+ "button",
1622
+ {
1623
+ className: "copilotKitMessageControlButton",
1624
+ onClick: handleThumbsUp,
1625
+ "aria-label": labels.thumbsUp,
1626
+ title: labels.thumbsUp,
1627
+ children: ThumbsUpIcon
1628
+ }
1629
+ ),
1630
+ onThumbsDown && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1631
+ "button",
1632
+ {
1633
+ className: "copilotKitMessageControlButton",
1634
+ onClick: handleThumbsDown,
1635
+ "aria-label": labels.thumbsDown,
1636
+ title: labels.thumbsDown,
1637
+ children: ThumbsDownIcon
1638
+ }
1639
+ )
1640
+ ]
1641
+ }
1642
+ )
1547
1643
  ] }),
1548
1644
  /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { style: { marginBottom: "0.5rem" }, children: subComponent })
1549
1645
  ] });
@@ -1561,7 +1657,7 @@ var import_shared = require("@copilotkit/shared");
1561
1657
  var import_runtime_client_gql3 = require("@copilotkit/runtime-client-gql");
1562
1658
  var import_jsx_runtime15 = require("react/jsx-runtime");
1563
1659
  function Suggestion({ title, message, onClick, partial, className }) {
1564
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
1660
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1565
1661
  "button",
1566
1662
  {
1567
1663
  disabled: partial,
@@ -1569,12 +1665,9 @@ function Suggestion({ title, message, onClick, partial, className }) {
1569
1665
  e.preventDefault();
1570
1666
  onClick(message);
1571
1667
  },
1572
- className: className || "suggestion",
1668
+ className: className || (partial ? "suggestion loading" : "suggestion"),
1573
1669
  "data-test-id": "suggestion",
1574
- children: [
1575
- partial && SmallSpinnerIcon,
1576
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { children: title })
1577
- ]
1670
+ children: partial ? SmallSpinnerIcon : /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { children: title })
1578
1671
  }
1579
1672
  );
1580
1673
  }
@@ -1649,646 +1742,12 @@ var reloadSuggestions = (context, chatSuggestionConfiguration, setCurrentSuggest
1649
1742
  });
1650
1743
 
1651
1744
  // src/components/chat/Chat.tsx
1652
- var import_react11 = __toESM(require("react"));
1653
- var import_react_core9 = require("@copilotkit/react-core");
1654
- var import_runtime_client_gql4 = require("@copilotkit/runtime-client-gql");
1655
- var import_shared3 = require("@copilotkit/shared");
1656
-
1657
- // src/components/dev-console/utils.ts
1745
+ var import_react9 = __toESM(require("react"));
1658
1746
  var import_react_core7 = require("@copilotkit/react-core");
1659
- function shouldShowDevConsole(showDevConsole) {
1660
- if (typeof showDevConsole === "boolean") {
1661
- return showDevConsole;
1662
- }
1663
- return getHostname() === "localhost" || getHostname() === "127.0.0.1" || getHostname() === "0.0.0.0" || getHostname() === "::1";
1664
- }
1665
- function getHostname() {
1666
- if (typeof window !== "undefined" && window.location) {
1667
- return window.location.hostname;
1668
- }
1669
- return "";
1670
- }
1671
- function getPublishedCopilotKitVersion(current, forceCheck = false) {
1672
- return __async(this, null, function* () {
1673
- const LOCAL_STORAGE_KEY = "__copilotkit_version_check__";
1674
- const serializedVersion = localStorage.getItem(LOCAL_STORAGE_KEY);
1675
- if (serializedVersion && !forceCheck) {
1676
- try {
1677
- const parsedVersion = JSON.parse(serializedVersion);
1678
- const oneHour = 60 * 60 * 1e3;
1679
- const now = (/* @__PURE__ */ new Date()).getTime();
1680
- if (parsedVersion.current === current && now - new Date(parsedVersion.lastChecked).getTime() < oneHour) {
1681
- return parsedVersion;
1682
- }
1683
- } catch (error) {
1684
- console.error("Failed to parse CopilotKitVersion from localStorage", error);
1685
- }
1686
- }
1687
- try {
1688
- const response = yield fetch("https://api.cloud.copilotkit.ai/check-for-updates", {
1689
- method: "POST",
1690
- headers: {
1691
- "Content-Type": "application/json"
1692
- },
1693
- body: JSON.stringify({
1694
- packages: [
1695
- {
1696
- packageName: "@copilotkit/shared",
1697
- packageVersion: current
1698
- }
1699
- ]
1700
- })
1701
- });
1702
- const data = yield response.json();
1703
- const version = {
1704
- current,
1705
- lastChecked: (/* @__PURE__ */ new Date()).getTime(),
1706
- latest: data.packages[0].latestVersion,
1707
- severity: data.packages[0].severity,
1708
- advisory: data.packages[0].advisory || null
1709
- };
1710
- localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(version));
1711
- return version;
1712
- } catch (error) {
1713
- console.error("Failed to check for updates", error);
1714
- throw error;
1715
- }
1716
- });
1717
- }
1718
- function logReadables(context) {
1719
- console.log("%cCurrent Readables:", "font-size: 16px; font-weight: bold;");
1720
- const readables = context.getContextString([], import_react_core7.defaultCopilotContextCategories).trim();
1721
- if (readables.length === 0) {
1722
- console.log("No readables found");
1723
- return;
1724
- }
1725
- console.log(readables);
1726
- }
1727
- function logActions(context) {
1728
- console.log("%cCurrent Actions:", "font-size: 16px; font-weight: bold;");
1729
- if (Object.values(context.actions).length === 0) {
1730
- console.log("No actions found");
1731
- return;
1732
- }
1733
- for (const action of Object.values(context.actions)) {
1734
- console.group(action.name);
1735
- console.log("name", action.name);
1736
- console.log("description", action.description);
1737
- console.log("parameters", action.parameters);
1738
- console.groupEnd();
1739
- }
1740
- }
1741
- function logMessages(context) {
1742
- console.log("%cCurrent Messages:", "font-size: 16px; font-weight: bold;");
1743
- if (context.messages.length === 0) {
1744
- console.log("No messages found");
1745
- return;
1746
- }
1747
- const tableData = context.messages.map((message) => {
1748
- if (message.isTextMessage()) {
1749
- return {
1750
- id: message.id,
1751
- type: "TextMessage",
1752
- role: message.role,
1753
- name: void 0,
1754
- scope: void 0,
1755
- content: message.content
1756
- };
1757
- } else if (message.isActionExecutionMessage()) {
1758
- return {
1759
- id: message.id,
1760
- type: "ActionExecutionMessage",
1761
- role: void 0,
1762
- name: message.name,
1763
- scope: message.parentMessageId,
1764
- content: message.arguments
1765
- };
1766
- } else if (message.isResultMessage()) {
1767
- return {
1768
- id: message.id,
1769
- type: "ResultMessage",
1770
- role: void 0,
1771
- name: message.actionName,
1772
- scope: message.actionExecutionId,
1773
- content: message.result
1774
- };
1775
- } else if (message.isAgentStateMessage()) {
1776
- return {
1777
- id: message.id,
1778
- type: `AgentStateMessage (running: ${message.running})`,
1779
- role: message.role,
1780
- name: void 0,
1781
- scope: message.threadId,
1782
- content: message.state
1783
- };
1784
- }
1785
- });
1786
- console.table(tableData);
1787
- }
1788
-
1789
- // src/components/dev-console/console.tsx
1747
+ var import_runtime_client_gql4 = require("@copilotkit/runtime-client-gql");
1748
+ var import_shared2 = require("@copilotkit/shared");
1790
1749
  var import_react_core8 = require("@copilotkit/react-core");
1791
- var import_react9 = require("react");
1792
-
1793
- // src/components/dev-console/icons.tsx
1794
1750
  var import_jsx_runtime16 = require("react/jsx-runtime");
1795
- var ExclamationMarkTriangleIcon = /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1796
- "svg",
1797
- {
1798
- width: "13.3967723px",
1799
- height: "12px",
1800
- viewBox: "0 0 13.3967723 12",
1801
- version: "1.1",
1802
- xmlns: "http://www.w3.org/2000/svg",
1803
- children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("g", { id: "Page-1", stroke: "none", strokeWidth: "1", fill: "none", fillRule: "evenodd", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("g", { id: "exclamation-triangle", fill: "#CD2121", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1804
- "path",
1805
- {
1806
- 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",
1807
- id: "Shape"
1808
- }
1809
- ) }) })
1810
- }
1811
- );
1812
- var ExclamationMarkIcon = /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1813
- "svg",
1814
- {
1815
- width: "14px",
1816
- height: "14px",
1817
- viewBox: "0 0 14 14",
1818
- version: "1.1",
1819
- xmlns: "http://www.w3.org/2000/svg",
1820
- children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("g", { id: "Page-1", stroke: "none", strokeWidth: "1", fill: "none", fillRule: "evenodd", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("g", { id: "exclamation-circle", fill: "#EC662C", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1821
- "path",
1822
- {
1823
- d: "M7,14 C10.866,14 14,10.866 14,7 C14,3.13401 10.866,0 7,0 C3.13401,0 0,3.13401 0,7 C0,10.866 3.13401,14 7,14 Z M7,3 C7.41421,3 7.75,3.33579 7.75,3.75 L7.75,6.75 C7.75,7.16421 7.41421,7.5 7,7.5 C6.58579,7.5 6.25,7.16421 6.25,6.75 L6.25,3.75 C6.25,3.33579 6.58579,3 7,3 Z M7,11 C7.55228,11 8,10.5523 8,10 C8,9.4477 7.55228,9 7,9 C6.44772,9 6,9.4477 6,10 C6,10.5523 6.44772,11 7,11 Z",
1824
- id: "Shape"
1825
- }
1826
- ) }) })
1827
- }
1828
- );
1829
- var ChevronDownIcon = /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("svg", { width: "7px", height: "4px", viewBox: "0 0 7 4", version: "1.1", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("g", { id: "Page-1", stroke: "none", strokeWidth: "1", fill: "none", fillRule: "evenodd", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("g", { id: "Group", fill: "#000000", fillRule: "nonzero", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1830
- "path",
1831
- {
1832
- d: "M3.71690723,3.90271086 C3.59268176,4.03242971 3.39143629,4.03242971 3.26721082,3.90271086 L0.0853966595,0.57605615 C-0.0314221035,0.444981627 -0.0279751448,0.240725043 0.0931934622,0.114040675 C0.214362069,-0.0126436935 0.409725445,-0.0162475626 0.535093061,0.105888951 L3.49205902,3.19746006 L6.44902499,0.105888951 C6.52834574,0.0168884389 6.64780588,-0.0197473458 6.7605411,0.0103538404 C6.87327633,0.0404550266 6.96130636,0.132492308 6.99009696,0.250359396 C7.01888756,0.368226483 6.98384687,0.493124608 6.89872139,0.57605615 L3.71690723,3.90271086 Z",
1833
- id: "Path"
1834
- }
1835
- ) }) }) });
1836
- var CheckIcon2 = /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1837
- "svg",
1838
- {
1839
- width: "14px",
1840
- height: "14px",
1841
- viewBox: "0 0 14 14",
1842
- version: "1.1",
1843
- xmlns: "http://www.w3.org/2000/svg",
1844
- children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("g", { id: "Page-1", stroke: "none", strokeWidth: "1", fill: "none", fillRule: "evenodd", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("g", { id: "Group-2", transform: "translate(-118, 0)", fill: "#1BC030", fillRule: "nonzero", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("g", { id: "Group", transform: "translate(118, 0)", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1845
- "path",
1846
- {
1847
- 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",
1848
- id: "Shape"
1849
- }
1850
- ) }) }) })
1851
- }
1852
- );
1853
- var CopilotKitIcon = /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
1854
- "svg",
1855
- {
1856
- width: "33px",
1857
- height: "35px",
1858
- viewBox: "0 0 33 35",
1859
- version: "1.1",
1860
- xmlns: "http://www.w3.org/2000/svg",
1861
- children: [
1862
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("title", { children: "bd5c9079-929b-4d55-bdc9-16d1c8181b71" }),
1863
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("g", { id: "Page-1", stroke: "none", strokeWidth: "1", fill: "none", fillRule: "evenodd", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1864
- "image",
1865
- {
1866
- x: "0",
1867
- y: "0",
1868
- width: "33",
1869
- height: "35",
1870
- xlinkHref: "data:image/png;base64,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"
1871
- }
1872
- ) })
1873
- ]
1874
- }
1875
- );
1876
-
1877
- // src/components/dev-console/console.tsx
1878
- var import_react10 = require("@headlessui/react");
1879
- var import_shared2 = require("@copilotkit/shared");
1880
-
1881
- // src/components/help-modal/modal.tsx
1882
- var import_react8 = require("react");
1883
-
1884
- // src/components/help-modal/icons.tsx
1885
- var import_jsx_runtime17 = require("react/jsx-runtime");
1886
- var CloseIcon2 = () => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1887
- "svg",
1888
- {
1889
- xmlns: "http://www.w3.org/2000/svg",
1890
- fill: "none",
1891
- viewBox: "0 0 24 24",
1892
- strokeWidth: "1.5",
1893
- stroke: "currentColor",
1894
- width: "20",
1895
- height: "20",
1896
- children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 18L18 6M6 6l12 12" })
1897
- }
1898
- );
1899
- var LoadingSpinnerIcon = ({ color = "rgb(107 114 128)" }) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
1900
- "svg",
1901
- {
1902
- style: {
1903
- animation: "copilotKitSpinAnimation 1s linear infinite",
1904
- color
1905
- },
1906
- width: "24",
1907
- height: "24",
1908
- xmlns: "http://www.w3.org/2000/svg",
1909
- fill: "none",
1910
- viewBox: "0 0 24 24",
1911
- children: [
1912
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1913
- "circle",
1914
- {
1915
- style: { opacity: 0.25 },
1916
- cx: "12",
1917
- cy: "12",
1918
- r: "10",
1919
- stroke: "currentColor",
1920
- strokeWidth: "4"
1921
- }
1922
- ),
1923
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1924
- "path",
1925
- {
1926
- style: { opacity: 0.75 },
1927
- fill: "currentColor",
1928
- d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
1929
- }
1930
- )
1931
- ]
1932
- }
1933
- );
1934
-
1935
- // src/components/help-modal/modal.tsx
1936
- var import_jsx_runtime18 = require("react/jsx-runtime");
1937
- function CopilotKitHelpModal() {
1938
- const [showHelpModal, setShowHelpModal] = (0, import_react8.useState)(false);
1939
- const [issueDescription, setIssueDescription] = (0, import_react8.useState)("");
1940
- const [email, setEmail] = (0, import_react8.useState)("");
1941
- const [emailError, setEmailError] = (0, import_react8.useState)("");
1942
- const [submitting, setSubmitting] = (0, import_react8.useState)(false);
1943
- const validateEmail = (email2) => {
1944
- const re = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
1945
- return re.test(email2);
1946
- };
1947
- const handleSubmit = (e) => __async(this, null, function* () {
1948
- e.preventDefault();
1949
- if ((email == null ? void 0 : email.length) > 0 && !validateEmail(email)) {
1950
- setEmailError("Please enter a valid email address");
1951
- return;
1952
- }
1953
- setSubmitting(true);
1954
- yield fetch("https://api.segment.io/v1/track", {
1955
- method: "POST",
1956
- headers: {
1957
- "Content-Type": "application/json"
1958
- },
1959
- body: JSON.stringify({
1960
- event: "oss.dev-console.help",
1961
- anonymousId: window.crypto.randomUUID(),
1962
- properties: { email, text: issueDescription },
1963
- writeKey: "q0gQqvGYyw9pNyhIocNzefSYKGO1aiwW"
1964
- })
1965
- });
1966
- setEmailError("");
1967
- setEmail("");
1968
- setIssueDescription("");
1969
- setSubmitting(false);
1970
- setShowHelpModal(false);
1971
- });
1972
- const HelpButton = () => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1973
- "button",
1974
- {
1975
- onClick: () => setShowHelpModal(true),
1976
- style: { width: "50px", height: "30px", marginRight: "0.25rem" },
1977
- className: "text-sm p-0 bg-transparent rounded border border-blue-500",
1978
- "aria-label": "Open Help",
1979
- children: "Help"
1980
- }
1981
- );
1982
- const submitButtonDisabled = (0, import_react8.useMemo)(
1983
- () => submitting || !!emailError || issueDescription == null || (issueDescription == null ? void 0 : issueDescription.length) == 0,
1984
- [submitting, emailError, issueDescription]
1985
- );
1986
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_jsx_runtime18.Fragment, { children: [
1987
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(HelpButton, {}),
1988
- showHelpModal && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1989
- "div",
1990
- {
1991
- className: "fixed inset-0 flex items-center justify-center p-4",
1992
- style: { backgroundColor: "rgba(11, 15, 26, 0.5)", zIndex: 99 },
1993
- children: /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "bg-white rounded-lg shadow-xl max-w-md w-full p-4 flex-col relative", children: [
1994
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1995
- "button",
1996
- {
1997
- className: "absolute text-gray-400 hover:text-gray-600 focus:outline-none",
1998
- style: { top: "10px", right: "10px" },
1999
- onClick: () => setShowHelpModal(false),
2000
- "aria-label": "Close",
2001
- children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(CloseIcon2, {})
2002
- }
2003
- ),
2004
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "w-full flex mb-6 justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("h2", { className: "text-2xl font-bold", children: "Help Options" }) }),
2005
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "space-y-4 mb-4", children: [
2006
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "block w-full text-center py-2 px-4 bg-blue-500 text-white rounded hover:bg-blue-600 transition duration-150 text-sm", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
2007
- "a",
2008
- {
2009
- href: "https://docs.copilotkit.ai/coagents/troubleshooting/common-issues",
2010
- target: "_blank",
2011
- rel: "noopener noreferrer",
2012
- children: "Visit the Troubleshooting and FAQ section in the docs"
2013
- }
2014
- ) }),
2015
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "block w-full text-center py-2 px-4 bg-blue-500 text-white rounded hover:bg-blue-600 transition duration-150 text-sm", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
2016
- "a",
2017
- {
2018
- href: "https://go.copilotkit.ai/dev-console-support-discord",
2019
- target: "_blank",
2020
- rel: "noopener noreferrer",
2021
- children: "Go to Discord Support Channel (Community Support)"
2022
- }
2023
- ) }),
2024
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "block w-full text-center py-2 px-4 bg-blue-500 text-white rounded hover:bg-blue-600 transition duration-150 text-sm", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
2025
- "a",
2026
- {
2027
- href: "https://go.copilotkit.ai/dev-console-support-slack",
2028
- target: "_blank",
2029
- rel: "noopener noreferrer",
2030
- children: "Apply for Priority Direct Slack Support"
2031
- }
2032
- ) })
2033
- ] }),
2034
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("form", { onSubmit: handleSubmit, className: "flex flex-col space-y-2", children: [
2035
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { children: [
2036
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("label", { htmlFor: "feedback", className: "block text-sm font-medium text-gray-700 mb-1", children: "Let us know what your issue is:" }),
2037
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
2038
- "textarea",
2039
- {
2040
- id: "feedback",
2041
- rows: 4,
2042
- className: "w-full px-3 py-2 text-gray-700 border rounded-lg focus:outline-none focus:border-blue-500",
2043
- placeholder: "A Loom link / screen recording is always great!",
2044
- onChange: (e) => setIssueDescription(e.target.value),
2045
- value: issueDescription,
2046
- required: true
2047
- }
2048
- )
2049
- ] }),
2050
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { children: [
2051
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("label", { htmlFor: "email", className: "block text-sm font-medium text-gray-700 mb-1", children: "Email (optional):" }),
2052
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
2053
- "input",
2054
- {
2055
- type: "email",
2056
- id: "email",
2057
- className: `w-full px-3 py-2 text-gray-700 border rounded-lg focus:outline-none focus:border-blue-500 ${emailError ? "border-red-500" : ""}`,
2058
- placeholder: "Enter your email for follow-up",
2059
- onChange: (e) => {
2060
- setEmail(e.target.value);
2061
- setEmailError("");
2062
- },
2063
- value: email
2064
- }
2065
- ),
2066
- emailError && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: "text-red-500 text-sm mt-1", children: emailError })
2067
- ] }),
2068
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "bg-gray-50 px-4 py-4 sm:px-6 sm:flex sm:flex-row-reverse rounded-b-lg", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
2069
- "button",
2070
- {
2071
- type: "submit",
2072
- onClick: handleSubmit,
2073
- disabled: submitButtonDisabled,
2074
- style: submitButtonDisabled ? { backgroundColor: "rgb(216, 216, 216)", color: "rgb(129, 129, 129)" } : void 0,
2075
- className: "w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-500 text-base font-medium text-white hover:bg-blue-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:ml-3 sm:w-auto sm:text-sm disabled:shadow-none",
2076
- children: submitting ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(LoadingSpinnerIcon, { color: "white" }) : "Submit"
2077
- }
2078
- ) })
2079
- ] })
2080
- ] })
2081
- }
2082
- )
2083
- ] });
2084
- }
2085
-
2086
- // src/components/dev-console/console.tsx
2087
- var import_jsx_runtime19 = require("react/jsx-runtime");
2088
- function CopilotDevConsole() {
2089
- const currentVersion = import_shared2.COPILOTKIT_VERSION;
2090
- const context = (0, import_react_core8.useCopilotContext)();
2091
- const [showDevConsole, setShowDevConsole] = (0, import_react9.useState)(false);
2092
- (0, import_react9.useEffect)(() => {
2093
- setShowDevConsole(shouldShowDevConsole(context.showDevConsole));
2094
- }, [context.showDevConsole]);
2095
- const dontRunTwiceInDevMode = (0, import_react9.useRef)(false);
2096
- const [versionStatus, setVersionStatus] = (0, import_react9.useState)("unknown");
2097
- const [latestVersion, setLatestVersion] = (0, import_react9.useState)("");
2098
- const consoleRef = (0, import_react9.useRef)(null);
2099
- const [debugButtonMode, setDebugButtonMode] = (0, import_react9.useState)("full");
2100
- const checkForUpdates = (force = false) => {
2101
- setVersionStatus("checking");
2102
- getPublishedCopilotKitVersion(currentVersion, force).then((v) => {
2103
- setLatestVersion(v.latest);
2104
- let versionOk = false;
2105
- if (v.current === v.latest) {
2106
- versionOk = true;
2107
- } else if (/[a-zA-Z]/.test(v.current)) {
2108
- versionOk = true;
2109
- }
2110
- if (versionOk) {
2111
- setVersionStatus("latest");
2112
- } else if (v.severity !== "low") {
2113
- setVersionStatus("outdated");
2114
- } else {
2115
- setVersionStatus("update-available");
2116
- }
2117
- }).catch((e) => {
2118
- console.error(e);
2119
- setVersionStatus("unknown");
2120
- });
2121
- };
2122
- (0, import_react9.useEffect)(() => {
2123
- if (dontRunTwiceInDevMode.current === true) {
2124
- return;
2125
- }
2126
- dontRunTwiceInDevMode.current = true;
2127
- checkForUpdates();
2128
- }, []);
2129
- (0, import_react9.useEffect)(() => {
2130
- const handleResize = (entries) => {
2131
- for (let entry of entries) {
2132
- if (entry.target === consoleRef.current) {
2133
- const width = entry.contentRect.width;
2134
- if (width < 400) {
2135
- setDebugButtonMode("compact");
2136
- } else {
2137
- setDebugButtonMode("full");
2138
- }
2139
- }
2140
- }
2141
- };
2142
- const observer = new ResizeObserver(handleResize);
2143
- if (consoleRef.current) {
2144
- observer.observe(consoleRef.current);
2145
- const initialWidth = consoleRef.current.getBoundingClientRect().width;
2146
- if (initialWidth < 400) {
2147
- setDebugButtonMode("compact");
2148
- } else {
2149
- setDebugButtonMode("full");
2150
- }
2151
- }
2152
- return () => {
2153
- if (consoleRef.current) {
2154
- observer.unobserve(consoleRef.current);
2155
- }
2156
- };
2157
- }, [consoleRef.current]);
2158
- if (!showDevConsole) {
2159
- return null;
2160
- }
2161
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
2162
- "div",
2163
- {
2164
- ref: consoleRef,
2165
- className: "copilotKitDevConsole " + (versionStatus === "update-available" ? "copilotKitDevConsoleUpgrade" : "") + (versionStatus === "outdated" ? "copilotKitDevConsoleWarnOutdated" : ""),
2166
- children: [
2167
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "copilotKitDevConsoleLogo", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("a", { href: "https://copilotkit.ai", target: "_blank", children: CopilotKitIcon }) }),
2168
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2169
- VersionInfo,
2170
- {
2171
- showDevConsole: context.showDevConsole,
2172
- versionStatus,
2173
- currentVersion,
2174
- latestVersion
2175
- }
2176
- ),
2177
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(CopilotKitHelpModal, {}),
2178
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2179
- DebugMenuButton,
2180
- {
2181
- setShowDevConsole,
2182
- checkForUpdates,
2183
- mode: debugButtonMode
2184
- }
2185
- )
2186
- ]
2187
- }
2188
- );
2189
- }
2190
- function VersionInfo({
2191
- showDevConsole,
2192
- versionStatus,
2193
- currentVersion,
2194
- latestVersion
2195
- }) {
2196
- const [copyStatus, setCopyStatus] = (0, import_react9.useState)("");
2197
- let versionLabel = "";
2198
- let versionIcon = "";
2199
- let currentVersionLabel = currentVersion;
2200
- if (versionStatus === "latest") {
2201
- versionLabel = "latest";
2202
- versionIcon = CheckIcon2;
2203
- } else if (versionStatus === "checking") {
2204
- versionLabel = "checking";
2205
- versionIcon = SmallSpinnerIcon;
2206
- } else if (versionStatus === "update-available") {
2207
- versionLabel = "update available";
2208
- versionIcon = ExclamationMarkIcon;
2209
- currentVersionLabel = `${currentVersion} \u2192 ${latestVersion}`;
2210
- } else if (versionStatus === "outdated") {
2211
- versionLabel = "outdated";
2212
- versionIcon = ExclamationMarkTriangleIcon;
2213
- currentVersionLabel = `${currentVersion} \u2192 ${latestVersion}`;
2214
- }
2215
- let asideLabel = "";
2216
- if (showDevConsole === "auto") {
2217
- asideLabel = "(localhost only)";
2218
- } else if (showDevConsole === true) {
2219
- asideLabel = "(always on)";
2220
- }
2221
- const installCommand = [
2222
- `npm install`,
2223
- `@copilotkit/react-core@${latestVersion}`,
2224
- `@copilotkit/react-ui@${latestVersion}`,
2225
- `@copilotkit/react-textarea@${latestVersion}`,
2226
- `&& npm install @copilotkit/runtime@${latestVersion}`
2227
- ].join(" ");
2228
- const handleCopyClick = () => {
2229
- navigator.clipboard.writeText(installCommand.trim()).then(() => {
2230
- setCopyStatus("Command copied to clipboard!");
2231
- setTimeout(() => setCopyStatus(""), 1e3);
2232
- });
2233
- };
2234
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "copilotKitVersionInfo", children: [
2235
- /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("header", { children: [
2236
- "COPILOTKIT DEV CONSOLE",
2237
- showDevConsole === "auto" && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("aside", { children: asideLabel })
2238
- ] }),
2239
- /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("section", { children: [
2240
- "Version: ",
2241
- versionLabel,
2242
- " (",
2243
- currentVersionLabel,
2244
- ") ",
2245
- versionIcon
2246
- ] }),
2247
- (versionStatus === "update-available" || versionStatus === "outdated") && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("footer", { children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("button", { onClick: handleCopyClick, children: copyStatus || installCommand }) })
2248
- ] });
2249
- }
2250
- function DebugMenuButton({
2251
- setShowDevConsole,
2252
- checkForUpdates,
2253
- mode
2254
- }) {
2255
- const context = (0, import_react_core8.useCopilotContext)();
2256
- const messagesContext = (0, import_react_core8.useCopilotMessagesContext)();
2257
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "bg-black top-24 w-52 text-right", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_react10.Menu, { children: [
2258
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_react10.MenuButton, { className: `copilotKitDebugMenuButton ${mode === "compact" ? "compact" : ""}`, children: mode == "compact" ? "Debug" : /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_jsx_runtime19.Fragment, { children: [
2259
- "Debug ",
2260
- ChevronDownIcon
2261
- ] }) }),
2262
- /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
2263
- import_react10.MenuItems,
2264
- {
2265
- transition: true,
2266
- anchor: "bottom end",
2267
- className: "copilotKitDebugMenu",
2268
- style: { zIndex: 40 },
2269
- children: [
2270
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_react10.MenuItem, { children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("button", { className: "copilotKitDebugMenuItem", onClick: () => logReadables(context), children: "Log Readables" }) }),
2271
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_react10.MenuItem, { children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("button", { className: "copilotKitDebugMenuItem", onClick: () => logActions(context), children: "Log Actions" }) }),
2272
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_react10.MenuItem, { children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2273
- "button",
2274
- {
2275
- className: "copilotKitDebugMenuItem",
2276
- onClick: () => logMessages(messagesContext),
2277
- children: "Log Messages"
2278
- }
2279
- ) }),
2280
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_react10.MenuItem, { children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("button", { className: "copilotKitDebugMenuItem", onClick: () => checkForUpdates(true), children: "Check for Updates" }) }),
2281
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("hr", {}),
2282
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_react10.MenuItem, { children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("button", { className: "copilotKitDebugMenuItem", onClick: () => setShowDevConsole(false), children: "Hide Dev Console" }) })
2283
- ]
2284
- }
2285
- )
2286
- ] }) });
2287
- }
2288
-
2289
- // src/components/chat/Chat.tsx
2290
- var import_react_core10 = require("@copilotkit/react-core");
2291
- var import_jsx_runtime20 = require("react/jsx-runtime");
2292
1751
  function CopilotChat({
2293
1752
  instructions,
2294
1753
  onSubmitMessage,
@@ -2297,6 +1756,10 @@ function CopilotChat({
2297
1756
  onInProgress,
2298
1757
  onStopGeneration,
2299
1758
  onReloadMessages,
1759
+ onRegenerate,
1760
+ onCopy,
1761
+ onThumbsUp,
1762
+ onThumbsDown,
2300
1763
  Messages: Messages2 = Messages,
2301
1764
  RenderTextMessage: RenderTextMessage2 = RenderTextMessage,
2302
1765
  RenderActionExecutionMessage: RenderActionExecutionMessage2 = RenderActionExecutionMessage,
@@ -2310,8 +1773,8 @@ function CopilotChat({
2310
1773
  AssistantMessage: AssistantMessage2 = AssistantMessage,
2311
1774
  UserMessage: UserMessage2 = UserMessage
2312
1775
  }) {
2313
- const { additionalInstructions, setChatInstructions } = (0, import_react_core9.useCopilotContext)();
2314
- (0, import_react11.useEffect)(() => {
1776
+ const { additionalInstructions, setChatInstructions } = (0, import_react_core7.useCopilotContext)();
1777
+ (0, import_react9.useEffect)(() => {
2315
1778
  if (!(additionalInstructions == null ? void 0 : additionalInstructions.length)) {
2316
1779
  setChatInstructions(instructions || "");
2317
1780
  return;
@@ -2338,11 +1801,21 @@ function CopilotChat({
2338
1801
  onStopGeneration,
2339
1802
  onReloadMessages
2340
1803
  );
2341
- const chatContext = import_react11.default.useContext(ChatContext);
1804
+ const chatContext = import_react9.default.useContext(ChatContext);
2342
1805
  const isVisible = chatContext ? chatContext.open : true;
2343
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(WrappedCopilotChat, { icons, labels, className, children: [
2344
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(CopilotDevConsole, {}),
2345
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
1806
+ const handleRegenerate = () => {
1807
+ if (onRegenerate) {
1808
+ onRegenerate();
1809
+ }
1810
+ reloadMessages();
1811
+ };
1812
+ const handleCopy = (message) => {
1813
+ if (onCopy) {
1814
+ onCopy(message);
1815
+ }
1816
+ };
1817
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(WrappedCopilotChat, { icons, labels, className, children: [
1818
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
2346
1819
  Messages2,
2347
1820
  {
2348
1821
  AssistantMessage: AssistantMessage2,
@@ -2353,32 +1826,32 @@ function CopilotChat({
2353
1826
  RenderResultMessage: RenderResultMessage2,
2354
1827
  messages: visibleMessages,
2355
1828
  inProgress: isLoading,
2356
- children: [
2357
- currentSuggestions.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { children: [
2358
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("h6", { children: "Suggested:" }),
2359
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "suggestions", children: currentSuggestions.map((suggestion, index) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2360
- Suggestion,
2361
- {
2362
- title: suggestion.title,
2363
- message: suggestion.message,
2364
- partial: suggestion.partial,
2365
- className: suggestion.className,
2366
- onClick: (message) => sendMessage(message)
2367
- },
2368
- index
2369
- )) })
2370
- ] }),
2371
- showResponseButton && visibleMessages.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2372
- ResponseButton2,
2373
- {
2374
- onClick: isLoading ? stopGeneration : reloadMessages,
2375
- inProgress: isLoading
2376
- }
2377
- )
2378
- ]
1829
+ onRegenerate: handleRegenerate,
1830
+ onCopy: handleCopy,
1831
+ onThumbsUp,
1832
+ onThumbsDown,
1833
+ children: currentSuggestions.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: "suggestions", children: currentSuggestions.map((suggestion, index) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1834
+ Suggestion,
1835
+ {
1836
+ title: suggestion.title,
1837
+ message: suggestion.message,
1838
+ partial: suggestion.partial,
1839
+ className: suggestion.className,
1840
+ onClick: (message) => sendMessage(message)
1841
+ },
1842
+ index
1843
+ )) })
2379
1844
  }
2380
1845
  ),
2381
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(Input2, { inProgress: isLoading, onSend: sendMessage, isVisible })
1846
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1847
+ Input2,
1848
+ {
1849
+ inProgress: isLoading,
1850
+ onSend: sendMessage,
1851
+ isVisible,
1852
+ onStop: stopGeneration
1853
+ }
1854
+ )
2382
1855
  ] });
2383
1856
  }
2384
1857
  function WrappedCopilotChat({
@@ -2387,12 +1860,12 @@ function WrappedCopilotChat({
2387
1860
  labels,
2388
1861
  className
2389
1862
  }) {
2390
- const chatContext = import_react11.default.useContext(ChatContext);
1863
+ const chatContext = import_react9.default.useContext(ChatContext);
2391
1864
  if (!chatContext) {
2392
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(ChatContextProvider, { icons, labels, open: true, setOpen: () => {
2393
- }, children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: `copilotKitChat ${className}`, children }) });
1865
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(ChatContextProvider, { icons, labels, open: true, setOpen: () => {
1866
+ }, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: `copilotKitChat ${className}`, children }) });
2394
1867
  }
2395
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_jsx_runtime20.Fragment, { children });
1868
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_jsx_runtime16.Fragment, { children });
2396
1869
  }
2397
1870
  var SUGGESTIONS_DEBOUNCE_TIMEOUT = 1e3;
2398
1871
  var useCopilotChatLogic = (makeSystemMessage, onInProgress, onSubmitMessage, onStopGeneration, onReloadMessages) => {
@@ -2404,22 +1877,22 @@ var useCopilotChatLogic = (makeSystemMessage, onInProgress, onSubmitMessage, onS
2404
1877
  stopGeneration: defaultStopGeneration,
2405
1878
  runChatCompletion,
2406
1879
  isLoading
2407
- } = (0, import_react_core9.useCopilotChat)({
2408
- id: (0, import_shared3.randomId)(),
1880
+ } = (0, import_react_core7.useCopilotChat)({
1881
+ id: (0, import_shared2.randomId)(),
2409
1882
  makeSystemMessage
2410
1883
  });
2411
- const [currentSuggestions, setCurrentSuggestions] = (0, import_react11.useState)([]);
2412
- const suggestionsAbortControllerRef = (0, import_react11.useRef)(null);
2413
- const debounceTimerRef = (0, import_react11.useRef)();
1884
+ const [currentSuggestions, setCurrentSuggestions] = (0, import_react9.useState)([]);
1885
+ const suggestionsAbortControllerRef = (0, import_react9.useRef)(null);
1886
+ const debounceTimerRef = (0, import_react9.useRef)();
2414
1887
  const abortSuggestions = () => {
2415
1888
  var _a2;
2416
1889
  (_a2 = suggestionsAbortControllerRef.current) == null ? void 0 : _a2.abort();
2417
1890
  suggestionsAbortControllerRef.current = null;
2418
1891
  };
2419
- const generalContext = (0, import_react_core9.useCopilotContext)();
2420
- const messagesContext = (0, import_react_core9.useCopilotMessagesContext)();
1892
+ const generalContext = (0, import_react_core7.useCopilotContext)();
1893
+ const messagesContext = (0, import_react_core7.useCopilotMessagesContext)();
2421
1894
  const context = __spreadValues(__spreadValues({}, generalContext), messagesContext);
2422
- (0, import_react11.useEffect)(() => {
1895
+ (0, import_react9.useEffect)(() => {
2423
1896
  onInProgress == null ? void 0 : onInProgress(isLoading);
2424
1897
  abortSuggestions();
2425
1898
  debounceTimerRef.current = setTimeout(
@@ -2485,7 +1958,7 @@ var useCopilotChatLogic = (makeSystemMessage, onInProgress, onSubmitMessage, onS
2485
1958
  });
2486
1959
  const runCurrentAgent = (hint) => __async(void 0, null, function* () {
2487
1960
  if (generalContext.agentSession) {
2488
- yield (0, import_react_core10.runAgent)(
1961
+ yield (0, import_react_core8.runAgent)(
2489
1962
  generalContext.agentSession.agentName,
2490
1963
  context,
2491
1964
  appendMessage,
@@ -2496,7 +1969,7 @@ var useCopilotChatLogic = (makeSystemMessage, onInProgress, onSubmitMessage, onS
2496
1969
  });
2497
1970
  const stopCurrentAgent = () => {
2498
1971
  if (generalContext.agentSession) {
2499
- (0, import_react_core10.stopAgent)(generalContext.agentSession.agentName, context);
1972
+ (0, import_react_core8.stopAgent)(generalContext.agentSession.agentName, context);
2500
1973
  }
2501
1974
  };
2502
1975
  const setCurrentAgentState = (state) => {