@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
@@ -95,7 +95,7 @@ __export(components_exports, {
95
95
  module.exports = __toCommonJS(components_exports);
96
96
 
97
97
  // src/components/chat/Modal.tsx
98
- var import_react13 = __toESM(require("react"));
98
+ var import_react14 = __toESM(require("react"));
99
99
 
100
100
  // src/components/chat/ChatContext.tsx
101
101
  var import_react = __toESM(require("react"));
@@ -152,7 +152,20 @@ var SendIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
152
152
  xmlns: "http://www.w3.org/2000/svg",
153
153
  fill: "none",
154
154
  viewBox: "0 0 24 24",
155
- strokeWidth: 1.5,
155
+ strokeWidth: "1.5",
156
+ stroke: "currentColor",
157
+ width: "24",
158
+ height: "24",
159
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 19V5m0 0l-7 7m7-7l7 7" })
160
+ }
161
+ );
162
+ var MicrophoneIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
163
+ "svg",
164
+ {
165
+ xmlns: "http://www.w3.org/2000/svg",
166
+ fill: "none",
167
+ viewBox: "0 0 24 24",
168
+ strokeWidth: "1.5",
156
169
  stroke: "currentColor",
157
170
  width: "24",
158
171
  height: "24",
@@ -161,184 +174,157 @@ var SendIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
161
174
  {
162
175
  strokeLinecap: "round",
163
176
  strokeLinejoin: "round",
164
- 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"
177
+ 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"
165
178
  }
166
179
  )
167
180
  }
168
181
  );
169
- var SpinnerIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
182
+ var StopIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
170
183
  "svg",
171
184
  {
172
- style: {
173
- animation: "copilotKitSpinAnimation 1s linear infinite",
174
- color: "rgb(107 114 128)"
175
- },
176
- width: "24",
177
- height: "24",
178
185
  xmlns: "http://www.w3.org/2000/svg",
179
186
  fill: "none",
180
187
  viewBox: "0 0 24 24",
181
- children: [
182
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
183
- "circle",
184
- {
185
- style: { opacity: 0.25 },
186
- cx: "12",
187
- cy: "12",
188
- r: "10",
189
- stroke: "currentColor",
190
- strokeWidth: "4"
191
- }
192
- ),
193
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
194
- "path",
195
- {
196
- style: { opacity: 0.75 },
197
- fill: "currentColor",
198
- 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"
199
- }
200
- )
201
- ]
188
+ strokeWidth: "1.5",
189
+ stroke: "currentColor",
190
+ width: "24",
191
+ height: "24",
192
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
193
+ "path",
194
+ {
195
+ strokeLinecap: "round",
196
+ strokeLinejoin: "round",
197
+ 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"
198
+ }
199
+ )
202
200
  }
203
201
  );
204
- var SmallSpinnerIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
202
+ var RegenerateIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
205
203
  "svg",
206
204
  {
207
- style: {
208
- animation: "copilotKitSpinAnimation 1s linear infinite"
209
- },
210
- width: "13",
211
- height: "13",
212
205
  xmlns: "http://www.w3.org/2000/svg",
213
206
  fill: "none",
214
207
  viewBox: "0 0 24 24",
215
- children: [
216
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
217
- "circle",
218
- {
219
- style: { opacity: 0.25 },
220
- cx: "12",
221
- cy: "12",
222
- r: "10",
223
- stroke: "currentColor",
224
- strokeWidth: "4"
225
- }
226
- ),
227
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
228
- "path",
229
- {
230
- style: { opacity: 0.75 },
231
- fill: "currentColor",
232
- 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"
233
- }
234
- )
235
- ]
208
+ strokeWidth: "2",
209
+ stroke: "currentColor",
210
+ width: "16",
211
+ height: "16",
212
+ style: { minWidth: "16px", minHeight: "16px" },
213
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
214
+ "path",
215
+ {
216
+ strokeLinecap: "round",
217
+ strokeLinejoin: "round",
218
+ 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"
219
+ }
220
+ )
236
221
  }
237
222
  );
238
- var ActivityIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
223
+ var CopyIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
239
224
  "svg",
240
225
  {
241
- style: {
242
- display: "inline-block",
243
- marginLeft: "0.25rem",
244
- marginRight: "0.25rem"
245
- },
246
- height: "24",
247
- width: "24",
248
- viewBox: "0 0 27 27",
249
226
  xmlns: "http://www.w3.org/2000/svg",
250
- fill: "currentColor",
251
- children: [
252
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { className: "copilotKitActivityDot1", cx: "4", cy: "12", r: "3" }),
253
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { className: "copilotKitActivityDot1 copilotKitActivityDot2", cx: "12", cy: "12", r: "3" }),
254
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { className: "copilotKitActivityDot1 copilotKitActivityDot3", cx: "20", cy: "12", r: "3" })
255
- ]
227
+ fill: "none",
228
+ viewBox: "0 0 24 24",
229
+ strokeWidth: "2",
230
+ stroke: "currentColor",
231
+ width: "16",
232
+ height: "16",
233
+ style: { minWidth: "16px", minHeight: "16px" },
234
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
235
+ "path",
236
+ {
237
+ strokeLinecap: "round",
238
+ strokeLinejoin: "round",
239
+ 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"
240
+ }
241
+ )
256
242
  }
257
243
  );
258
- function CheckIcon(_a) {
259
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
260
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
261
- "svg",
262
- __spreadProps(__spreadValues({
263
- xmlns: "http://www.w3.org/2000/svg",
264
- viewBox: "0 0 256 256",
265
- fill: "currentColor",
266
- style: { height: "1rem", width: "1rem" },
267
- className
268
- }, props), {
269
- 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" })
270
- })
271
- );
272
- }
273
- function DownloadIcon(_a) {
274
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
275
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
276
- "svg",
277
- __spreadProps(__spreadValues({
278
- xmlns: "http://www.w3.org/2000/svg",
279
- viewBox: "0 0 256 256",
280
- fill: "currentColor",
281
- style: { height: "1rem", width: "1rem" },
282
- className
283
- }, props), {
284
- 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" })
285
- })
286
- );
287
- }
288
- function CopyIcon(_a) {
289
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
290
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
291
- "svg",
292
- __spreadProps(__spreadValues({
293
- xmlns: "http://www.w3.org/2000/svg",
294
- viewBox: "0 0 256 256",
295
- fill: "currentColor",
296
- style: { height: "1rem", width: "1rem" },
297
- className
298
- }, props), {
299
- 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" })
300
- })
301
- );
302
- }
303
- var StopIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
244
+ var SmallSpinnerIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "copilotKitSpinner", style: { width: "13px", height: "13px" } });
245
+ var SpinnerIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "copilotKitSpinner", style: { width: "24px", height: "24px" } });
246
+ var ActivityIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "4px" }, children: [
247
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "copilotKitActivityDot", style: { animationDelay: "0s" } }),
248
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "copilotKitActivityDot", style: { animationDelay: "0.2s" } }),
249
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "copilotKitActivityDot", style: { animationDelay: "0.4s" } })
250
+ ] });
251
+ var ThumbsUpIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
304
252
  "svg",
305
253
  {
306
254
  xmlns: "http://www.w3.org/2000/svg",
307
- viewBox: "0 0 256 256",
308
- fill: "currentColor",
309
- style: { height: "1rem", width: "1rem" },
310
- 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" })
255
+ fill: "none",
256
+ viewBox: "0 0 24 24",
257
+ strokeWidth: "2",
258
+ stroke: "currentColor",
259
+ width: "16",
260
+ height: "16",
261
+ style: { minWidth: "16px", minHeight: "16px" },
262
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
263
+ "path",
264
+ {
265
+ strokeLinecap: "round",
266
+ strokeLinejoin: "round",
267
+ 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"
268
+ }
269
+ )
311
270
  }
312
271
  );
313
- var RegenerateIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
272
+ var ThumbsDownIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
314
273
  "svg",
315
274
  {
316
275
  xmlns: "http://www.w3.org/2000/svg",
317
- viewBox: "0 0 256 256",
318
- fill: "currentColor",
319
- style: { height: "1rem", width: "1rem" },
320
- 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" })
276
+ fill: "none",
277
+ viewBox: "0 0 24 24",
278
+ strokeWidth: "2",
279
+ stroke: "currentColor",
280
+ width: "16",
281
+ height: "16",
282
+ style: { minWidth: "16px", minHeight: "16px" },
283
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
284
+ "path",
285
+ {
286
+ strokeLinecap: "round",
287
+ strokeLinejoin: "round",
288
+ 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"
289
+ }
290
+ )
321
291
  }
322
292
  );
323
- var PushToTalkIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
293
+ var DownloadIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
324
294
  "svg",
325
295
  {
326
296
  xmlns: "http://www.w3.org/2000/svg",
327
297
  fill: "none",
328
298
  viewBox: "0 0 24 24",
329
- strokeWidth: 1.5,
299
+ strokeWidth: "2",
330
300
  stroke: "currentColor",
331
- className: "w-6 h-6",
301
+ width: "16",
302
+ height: "16",
303
+ style: { minWidth: "16px", minHeight: "16px" },
332
304
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
333
305
  "path",
334
306
  {
335
307
  strokeLinecap: "round",
336
308
  strokeLinejoin: "round",
337
- 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"
309
+ 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"
338
310
  }
339
311
  )
340
312
  }
341
313
  );
314
+ var CheckIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
315
+ "svg",
316
+ {
317
+ xmlns: "http://www.w3.org/2000/svg",
318
+ fill: "none",
319
+ viewBox: "0 0 24 24",
320
+ strokeWidth: "2",
321
+ stroke: "currentColor",
322
+ width: "16",
323
+ height: "16",
324
+ style: { minWidth: "16px", minHeight: "16px" },
325
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4.5 12.75l6 6 9-13.5" })
326
+ }
327
+ );
342
328
 
343
329
  // src/components/chat/ChatContext.tsx
344
330
  var import_jsx_runtime2 = require("react/jsx-runtime");
@@ -369,7 +355,11 @@ var ChatContextProvider = ({
369
355
  placeholder: "Type a message...",
370
356
  error: "\u274C An error occurred. Please try again.",
371
357
  stopGenerating: "Stop generating",
372
- regenerateResponse: "Regenerate response"
358
+ regenerateResponse: "Regenerate response",
359
+ copyToClipboard: "Copy to clipboard",
360
+ thumbsUp: "Thumbs up",
361
+ thumbsDown: "Thumbs down",
362
+ copied: "Copied!"
373
363
  }), labels),
374
364
  [labels]
375
365
  );
@@ -383,7 +373,7 @@ var ChatContextProvider = ({
383
373
  spinnerIcon: SpinnerIcon,
384
374
  stopIcon: StopIcon,
385
375
  regenerateIcon: RegenerateIcon,
386
- pushToTalkIcon: PushToTalkIcon
376
+ pushToTalkIcon: MicrophoneIcon
387
377
  }), icons),
388
378
  [icons]
389
379
  );
@@ -526,819 +516,1327 @@ var Button = ({}) => {
526
516
  ) });
527
517
  };
528
518
 
529
- // src/components/chat/Header.tsx
530
- var import_jsx_runtime5 = require("react/jsx-runtime");
531
- var Header = ({}) => {
532
- const { setOpen, icons, labels } = useChatContext();
533
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "copilotKitHeader", children: [
534
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { children: labels.title }),
535
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { onClick: () => setOpen(false), "aria-label": "Close", children: icons.headerCloseIcon })
536
- ] });
537
- };
538
-
539
- // src/components/chat/Messages.tsx
540
- var import_react3 = require("react");
541
- var import_runtime_client_gql = require("@copilotkit/runtime-client-gql");
519
+ // src/components/dev-console/utils.ts
542
520
  var import_react_core = require("@copilotkit/react-core");
543
- var import_jsx_runtime6 = require("react/jsx-runtime");
544
- var Messages = ({
545
- messages,
546
- inProgress,
547
- children,
548
- RenderTextMessage: RenderTextMessage2,
549
- RenderActionExecutionMessage: RenderActionExecutionMessage2,
550
- RenderAgentStateMessage: RenderAgentStateMessage2,
551
- RenderResultMessage: RenderResultMessage2,
552
- AssistantMessage: AssistantMessage2,
553
- UserMessage: UserMessage2
554
- }) => {
555
- const context = useChatContext();
556
- const initialMessages = (0, import_react3.useMemo)(
557
- () => makeInitialMessages(context.labels.initial),
558
- [context.labels.initial]
559
- );
560
- messages = [...initialMessages, ...messages];
561
- const actionResults = {};
562
- for (let i = 0; i < messages.length; i++) {
563
- if (messages[i].isActionExecutionMessage()) {
564
- const id = messages[i].id;
565
- const resultMessage = messages.find(
566
- (message) => message.isResultMessage() && message.actionExecutionId === id
567
- );
568
- if (resultMessage) {
569
- actionResults[id] = import_runtime_client_gql.ResultMessage.decodeResult(resultMessage.result || "");
570
- }
571
- }
521
+ function shouldShowDevConsole(showDevConsole) {
522
+ if (typeof showDevConsole === "boolean") {
523
+ return showDevConsole;
572
524
  }
573
- const { messagesEndRef, messagesContainerRef } = useScrollToBottom(messages);
574
- const interrupt = (0, import_react_core.useLangGraphInterruptRender)();
575
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "copilotKitMessages", ref: messagesContainerRef, children: [
576
- messages.map((message, index) => {
577
- const isCurrentMessage = index === messages.length - 1;
578
- if (message.isTextMessage()) {
579
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
580
- RenderTextMessage2,
581
- {
582
- message,
583
- inProgress,
584
- index,
585
- isCurrentMessage,
586
- AssistantMessage: AssistantMessage2,
587
- UserMessage: UserMessage2
588
- },
589
- index
590
- );
591
- } else if (message.isActionExecutionMessage()) {
592
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
593
- RenderActionExecutionMessage2,
594
- {
595
- message,
596
- inProgress,
597
- index,
598
- isCurrentMessage,
599
- actionResult: actionResults[message.id],
600
- AssistantMessage: AssistantMessage2,
601
- UserMessage: UserMessage2
602
- },
603
- index
604
- );
605
- } else if (message.isAgentStateMessage()) {
606
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
607
- RenderAgentStateMessage2,
608
- {
609
- message,
610
- inProgress,
611
- index,
612
- isCurrentMessage,
613
- AssistantMessage: AssistantMessage2,
614
- UserMessage: UserMessage2
615
- },
616
- index
617
- );
618
- } else if (message.isResultMessage()) {
619
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
620
- RenderResultMessage2,
621
- {
622
- message,
623
- inProgress,
624
- index,
625
- isCurrentMessage,
626
- AssistantMessage: AssistantMessage2,
627
- UserMessage: UserMessage2
628
- },
629
- index
630
- );
631
- }
632
- }),
633
- interrupt,
634
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("footer", { ref: messagesEndRef, children })
635
- ] });
636
- };
637
- function makeInitialMessages(initial) {
638
- let initialArray = [];
639
- if (initial) {
640
- if (Array.isArray(initial)) {
641
- initialArray.push(...initial);
642
- } else {
643
- initialArray.push(initial);
644
- }
525
+ return getHostname() === "localhost" || getHostname() === "127.0.0.1" || getHostname() === "0.0.0.0" || getHostname() === "::1";
526
+ }
527
+ function getHostname() {
528
+ if (typeof window !== "undefined" && window.location) {
529
+ return window.location.hostname;
645
530
  }
646
- return initialArray.map(
647
- (message) => new import_runtime_client_gql.TextMessage({
648
- role: import_runtime_client_gql.Role.Assistant,
649
- content: message
650
- })
651
- );
531
+ return "";
652
532
  }
653
- function useScrollToBottom(messages) {
654
- const messagesEndRef = (0, import_react3.useRef)(null);
655
- const messagesContainerRef = (0, import_react3.useRef)(null);
656
- const isProgrammaticScrollRef = (0, import_react3.useRef)(false);
657
- const isUserScrollUpRef = (0, import_react3.useRef)(false);
658
- const scrollToBottom = () => {
659
- if (messagesEndRef.current) {
660
- isProgrammaticScrollRef.current = true;
661
- messagesEndRef.current.scrollIntoView({
662
- behavior: "auto"
663
- });
664
- }
665
- };
666
- const handleScroll = () => {
667
- if (isProgrammaticScrollRef.current) {
668
- isProgrammaticScrollRef.current = false;
669
- return;
670
- }
671
- if (messagesContainerRef.current) {
672
- const { scrollTop, scrollHeight, clientHeight } = messagesContainerRef.current;
673
- isUserScrollUpRef.current = scrollTop + clientHeight < scrollHeight;
674
- }
675
- };
676
- (0, import_react3.useEffect)(() => {
677
- const container = messagesContainerRef.current;
678
- if (container) {
679
- container.addEventListener("scroll", handleScroll);
680
- }
681
- return () => {
682
- if (container) {
683
- container.removeEventListener("scroll", handleScroll);
533
+ function getPublishedCopilotKitVersion(current, forceCheck = false) {
534
+ return __async(this, null, function* () {
535
+ const LOCAL_STORAGE_KEY = "__copilotkit_version_check__";
536
+ const serializedVersion = localStorage.getItem(LOCAL_STORAGE_KEY);
537
+ if (serializedVersion && !forceCheck) {
538
+ try {
539
+ const parsedVersion = JSON.parse(serializedVersion);
540
+ const oneHour = 60 * 60 * 1e3;
541
+ const now = (/* @__PURE__ */ new Date()).getTime();
542
+ if (parsedVersion.current === current && now - new Date(parsedVersion.lastChecked).getTime() < oneHour) {
543
+ return parsedVersion;
544
+ }
545
+ } catch (error) {
546
+ console.error("Failed to parse CopilotKitVersion from localStorage", error);
684
547
  }
685
- };
686
- }, []);
687
- (0, import_react3.useEffect)(() => {
688
- const container = messagesContainerRef.current;
689
- if (!container) {
690
- return;
691
548
  }
692
- const mutationObserver = new MutationObserver(() => {
693
- if (!isUserScrollUpRef.current) {
694
- scrollToBottom();
695
- }
696
- });
697
- mutationObserver.observe(container, {
698
- childList: true,
699
- subtree: true,
700
- characterData: true
701
- });
702
- return () => {
703
- mutationObserver.disconnect();
704
- };
705
- }, []);
706
- (0, import_react3.useEffect)(() => {
707
- isUserScrollUpRef.current = false;
708
- scrollToBottom();
709
- }, [messages.filter((m) => m.isTextMessage() && m.role === import_runtime_client_gql.Role.User).length]);
710
- return { messagesEndRef, messagesContainerRef };
549
+ try {
550
+ const response = yield fetch("https://api.cloud.copilotkit.ai/check-for-updates", {
551
+ method: "POST",
552
+ headers: {
553
+ "Content-Type": "application/json"
554
+ },
555
+ body: JSON.stringify({
556
+ packages: [
557
+ {
558
+ packageName: "@copilotkit/shared",
559
+ packageVersion: current
560
+ }
561
+ ]
562
+ })
563
+ });
564
+ const data = yield response.json();
565
+ const version = {
566
+ current,
567
+ lastChecked: (/* @__PURE__ */ new Date()).getTime(),
568
+ latest: data.packages[0].latestVersion,
569
+ severity: data.packages[0].severity,
570
+ advisory: data.packages[0].advisory || null
571
+ };
572
+ localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(version));
573
+ return version;
574
+ } catch (error) {
575
+ console.error("Failed to check for updates", error);
576
+ throw error;
577
+ }
578
+ });
579
+ }
580
+ function logReadables(context) {
581
+ console.log("%cCurrent Readables:", "font-size: 16px; font-weight: bold;");
582
+ const readables = context.getContextString([], import_react_core.defaultCopilotContextCategories).trim();
583
+ if (readables.length === 0) {
584
+ console.log("No readables found");
585
+ return;
586
+ }
587
+ console.log(readables);
588
+ }
589
+ function logActions(context) {
590
+ console.log("%cCurrent Actions:", "font-size: 16px; font-weight: bold;");
591
+ if (Object.values(context.actions).length === 0) {
592
+ console.log("No actions found");
593
+ return;
594
+ }
595
+ for (const action of Object.values(context.actions)) {
596
+ console.group(action.name);
597
+ console.log("name", action.name);
598
+ console.log("description", action.description);
599
+ console.log("parameters", action.parameters);
600
+ console.groupEnd();
601
+ }
602
+ }
603
+ function logMessages(context) {
604
+ console.log("%cCurrent Messages:", "font-size: 16px; font-weight: bold;");
605
+ if (context.messages.length === 0) {
606
+ console.log("No messages found");
607
+ return;
608
+ }
609
+ const tableData = context.messages.map((message) => {
610
+ if (message.isTextMessage()) {
611
+ return {
612
+ id: message.id,
613
+ type: "TextMessage",
614
+ role: message.role,
615
+ name: void 0,
616
+ scope: void 0,
617
+ content: message.content
618
+ };
619
+ } else if (message.isActionExecutionMessage()) {
620
+ return {
621
+ id: message.id,
622
+ type: "ActionExecutionMessage",
623
+ role: void 0,
624
+ name: message.name,
625
+ scope: message.parentMessageId,
626
+ content: message.arguments
627
+ };
628
+ } else if (message.isResultMessage()) {
629
+ return {
630
+ id: message.id,
631
+ type: "ResultMessage",
632
+ role: void 0,
633
+ name: message.actionName,
634
+ scope: message.actionExecutionId,
635
+ content: message.result
636
+ };
637
+ } else if (message.isAgentStateMessage()) {
638
+ return {
639
+ id: message.id,
640
+ type: `AgentStateMessage (running: ${message.running})`,
641
+ role: message.role,
642
+ name: void 0,
643
+ scope: message.threadId,
644
+ content: message.state
645
+ };
646
+ }
647
+ });
648
+ console.table(tableData);
711
649
  }
712
650
 
713
- // src/components/chat/Input.tsx
714
- var import_react6 = require("react");
715
-
716
- // src/components/chat/Textarea.tsx
651
+ // src/components/dev-console/console.tsx
652
+ var import_react_core2 = require("@copilotkit/react-core");
717
653
  var import_react4 = require("react");
718
- var import_jsx_runtime7 = require("react/jsx-runtime");
719
- var AutoResizingTextarea = (0, import_react4.forwardRef)(
720
- ({ maxRows = 1, placeholder, value, onChange, onKeyDown, autoFocus }, ref) => {
721
- const internalTextareaRef = (0, import_react4.useRef)(null);
722
- const [maxHeight, setMaxHeight] = (0, import_react4.useState)(0);
723
- (0, import_react4.useImperativeHandle)(ref, () => internalTextareaRef.current);
724
- (0, import_react4.useEffect)(() => {
725
- const calculateMaxHeight = () => {
726
- const textarea = internalTextareaRef.current;
727
- if (textarea) {
728
- textarea.style.height = "auto";
729
- const singleRowHeight = textarea.scrollHeight;
730
- setMaxHeight(singleRowHeight * maxRows);
731
- if (autoFocus) {
732
- textarea.focus();
733
- }
734
- }
735
- };
736
- calculateMaxHeight();
737
- }, [maxRows]);
738
- (0, import_react4.useEffect)(() => {
739
- const textarea = internalTextareaRef.current;
740
- if (textarea) {
741
- textarea.style.height = "auto";
742
- textarea.style.height = `${Math.min(textarea.scrollHeight, maxHeight)}px`;
654
+
655
+ // src/components/dev-console/icons.tsx
656
+ var import_jsx_runtime5 = require("react/jsx-runtime");
657
+ var ExclamationMarkTriangleIcon = /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
658
+ "svg",
659
+ {
660
+ width: "13.3967723px",
661
+ height: "12px",
662
+ viewBox: "0 0 13.3967723 12",
663
+ version: "1.1",
664
+ xmlns: "http://www.w3.org/2000/svg",
665
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("g", { id: "Page-1", stroke: "none", strokeWidth: "1", fill: "none", fillRule: "evenodd", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("g", { id: "exclamation-triangle", fill: "#CD2121", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
666
+ "path",
667
+ {
668
+ 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",
669
+ id: "Shape"
743
670
  }
744
- }, [value, maxHeight]);
745
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
746
- "textarea",
671
+ ) }) })
672
+ }
673
+ );
674
+ var ExclamationMarkIcon = /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
675
+ "svg",
676
+ {
677
+ width: "14px",
678
+ height: "14px",
679
+ viewBox: "0 0 14 14",
680
+ version: "1.1",
681
+ xmlns: "http://www.w3.org/2000/svg",
682
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("g", { id: "Page-1", stroke: "none", strokeWidth: "1", fill: "none", fillRule: "evenodd", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("g", { id: "exclamation-circle", fill: "#EC662C", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
683
+ "path",
747
684
  {
748
- ref: internalTextareaRef,
749
- value,
750
- onChange,
751
- onKeyDown,
752
- placeholder,
753
- style: {
754
- overflow: "auto",
755
- resize: "none",
756
- maxHeight: `${maxHeight}px`
757
- },
758
- rows: 1
685
+ 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",
686
+ id: "Shape"
759
687
  }
760
- );
688
+ ) }) })
761
689
  }
762
690
  );
763
- var Textarea_default = AutoResizingTextarea;
764
-
765
- // src/hooks/use-push-to-talk.tsx
766
- var import_react_core2 = require("@copilotkit/react-core");
767
- var import_react5 = require("react");
768
- var startRecording = (mediaStreamRef, mediaRecorderRef, audioContextRef, recordedChunks, onStop) => __async(void 0, null, function* () {
769
- if (!mediaStreamRef.current || !audioContextRef.current) {
770
- mediaStreamRef.current = yield navigator.mediaDevices.getUserMedia({ audio: true });
771
- audioContextRef.current = new window.AudioContext();
772
- yield audioContextRef.current.resume();
691
+ var ChevronDownIcon = /* @__PURE__ */ (0, import_jsx_runtime5.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_runtime5.jsx)("g", { id: "Page-1", stroke: "none", strokeWidth: "1", fill: "none", fillRule: "evenodd", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("g", { id: "Group", fill: "#000000", fillRule: "nonzero", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
692
+ "path",
693
+ {
694
+ 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",
695
+ id: "Path"
773
696
  }
774
- mediaRecorderRef.current = new MediaRecorder(mediaStreamRef.current);
775
- mediaRecorderRef.current.start(1e3);
776
- mediaRecorderRef.current.ondataavailable = (event) => {
777
- recordedChunks.push(event.data);
778
- };
779
- mediaRecorderRef.current.onstop = onStop;
780
- });
781
- var stopRecording = (mediaRecorderRef) => {
782
- if (mediaRecorderRef.current && mediaRecorderRef.current.state !== "inactive") {
783
- mediaRecorderRef.current.stop();
697
+ ) }) }) });
698
+ var CheckIcon2 = /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
699
+ "svg",
700
+ {
701
+ width: "14px",
702
+ height: "14px",
703
+ viewBox: "0 0 14 14",
704
+ version: "1.1",
705
+ xmlns: "http://www.w3.org/2000/svg",
706
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("g", { id: "Page-1", stroke: "none", strokeWidth: "1", fill: "none", fillRule: "evenodd", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("g", { id: "Group-2", transform: "translate(-118, 0)", fill: "#1BC030", fillRule: "nonzero", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("g", { id: "Group", transform: "translate(118, 0)", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
707
+ "path",
708
+ {
709
+ 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",
710
+ id: "Shape"
711
+ }
712
+ ) }) }) })
784
713
  }
785
- };
786
- var transcribeAudio = (recordedChunks, transcribeAudioUrl) => __async(void 0, null, function* () {
787
- const completeBlob = new Blob(recordedChunks, { type: "audio/mp4" });
788
- const formData = new FormData();
789
- formData.append("file", completeBlob, "recording.mp4");
790
- const response = yield fetch(transcribeAudioUrl, {
791
- method: "POST",
792
- body: formData
793
- });
794
- if (!response.ok) {
795
- throw new Error(`Error: ${response.statusText}`);
714
+ );
715
+
716
+ // src/components/dev-console/console.tsx
717
+ var import_react5 = require("@headlessui/react");
718
+ var import_shared = require("@copilotkit/shared");
719
+
720
+ // src/components/help-modal/modal.tsx
721
+ var import_react3 = require("react");
722
+
723
+ // src/components/help-modal/icons.tsx
724
+ var import_jsx_runtime6 = require("react/jsx-runtime");
725
+ var CloseIcon2 = () => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
726
+ "svg",
727
+ {
728
+ xmlns: "http://www.w3.org/2000/svg",
729
+ fill: "none",
730
+ viewBox: "0 0 24 24",
731
+ strokeWidth: "1.5",
732
+ stroke: "currentColor",
733
+ width: "20",
734
+ height: "20",
735
+ children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 18L18 6M6 6l12 12" })
796
736
  }
797
- const transcription = yield response.json();
798
- return transcription.text;
799
- });
800
- var playAudioResponse = (text, textToSpeechUrl, audioContext) => {
801
- const encodedText = encodeURIComponent(text);
802
- const url = `${textToSpeechUrl}?text=${encodedText}`;
803
- fetch(url).then((response) => response.arrayBuffer()).then((arrayBuffer) => audioContext.decodeAudioData(arrayBuffer)).then((audioBuffer) => {
804
- const source = audioContext.createBufferSource();
805
- source.buffer = audioBuffer;
806
- source.connect(audioContext.destination);
807
- source.start(0);
808
- }).catch((error) => {
809
- console.error("Error with decoding audio data", error);
810
- });
811
- };
812
- var usePushToTalk = ({
813
- sendFunction,
814
- inProgress
815
- }) => {
816
- const [pushToTalkState, setPushToTalkState] = (0, import_react5.useState)("idle");
817
- const mediaStreamRef = (0, import_react5.useRef)(null);
818
- const audioContextRef = (0, import_react5.useRef)(null);
819
- const mediaRecorderRef = (0, import_react5.useRef)(null);
820
- const recordedChunks = (0, import_react5.useRef)([]);
821
- const generalContext = (0, import_react_core2.useCopilotContext)();
822
- const messagesContext = (0, import_react_core2.useCopilotMessagesContext)();
823
- const context = __spreadValues(__spreadValues({}, generalContext), messagesContext);
824
- const [startReadingFromMessageId, setStartReadingFromMessageId] = (0, import_react5.useState)(null);
825
- (0, import_react5.useEffect)(() => {
826
- if (pushToTalkState === "recording") {
827
- startRecording(
828
- mediaStreamRef,
829
- mediaRecorderRef,
830
- audioContextRef,
831
- recordedChunks.current,
832
- () => {
833
- setPushToTalkState("transcribing");
834
- }
835
- );
836
- } else {
837
- stopRecording(mediaRecorderRef);
838
- if (pushToTalkState === "transcribing") {
839
- transcribeAudio(recordedChunks.current, context.copilotApiConfig.transcribeAudioUrl).then(
840
- (transcription) => __async(void 0, null, function* () {
841
- recordedChunks.current = [];
842
- setPushToTalkState("idle");
843
- const message = yield sendFunction(transcription);
844
- setStartReadingFromMessageId(message.id);
845
- })
846
- );
737
+ );
738
+
739
+ // src/components/help-modal/modal.tsx
740
+ var import_jsx_runtime7 = require("react/jsx-runtime");
741
+ function CopilotKitHelpModal() {
742
+ const [showHelpModal, setShowHelpModal] = (0, import_react3.useState)(false);
743
+ const buttonRef = (0, import_react3.useRef)(null);
744
+ const popoverRef = (0, import_react3.useRef)(null);
745
+ (0, import_react3.useEffect)(() => {
746
+ const handleClickOutside = (event) => {
747
+ if (popoverRef.current && !popoverRef.current.contains(event.target) && buttonRef.current && !buttonRef.current.contains(event.target)) {
748
+ setShowHelpModal(false);
847
749
  }
750
+ };
751
+ if (showHelpModal) {
752
+ document.addEventListener("mousedown", handleClickOutside);
848
753
  }
849
754
  return () => {
850
- stopRecording(mediaRecorderRef);
755
+ document.removeEventListener("mousedown", handleClickOutside);
851
756
  };
852
- }, [pushToTalkState]);
853
- (0, import_react5.useEffect)(() => {
854
- if (inProgress === false && startReadingFromMessageId) {
855
- const lastMessageIndex = context.messages.findIndex(
856
- (message) => message.id === startReadingFromMessageId
857
- );
858
- const messagesAfterLast = context.messages.slice(lastMessageIndex + 1).filter(
859
- (message) => message.isTextMessage() && message.role === "assistant"
860
- );
861
- const text = messagesAfterLast.map((message) => message.content).join("\n");
862
- playAudioResponse(text, context.copilotApiConfig.textToSpeechUrl, audioContextRef.current);
863
- setStartReadingFromMessageId(null);
757
+ }, [showHelpModal]);
758
+ const HelpButton = () => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
759
+ "button",
760
+ {
761
+ ref: buttonRef,
762
+ onClick: () => setShowHelpModal(!showHelpModal),
763
+ className: "copilotKitDebugMenuTriggerButton relative",
764
+ "aria-label": "Open Help",
765
+ children: "Help"
864
766
  }
865
- }, [startReadingFromMessageId, inProgress]);
866
- return { pushToTalkState, setPushToTalkState };
867
- };
767
+ );
768
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "relative", children: [
769
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(HelpButton, {}),
770
+ showHelpModal && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
771
+ "div",
772
+ {
773
+ ref: popoverRef,
774
+ className: "absolute mt-2 z-50",
775
+ style: {
776
+ top: "100%",
777
+ right: "-120px",
778
+ width: "380px"
779
+ },
780
+ children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "bg-white rounded-lg shadow-xl w-full p-4 flex-col relative", children: [
781
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
782
+ "button",
783
+ {
784
+ className: "absolute text-gray-400 hover:text-gray-600 focus:outline-none",
785
+ style: { top: "10px", right: "10px" },
786
+ onClick: () => setShowHelpModal(false),
787
+ "aria-label": "Close",
788
+ children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CloseIcon2, {})
789
+ }
790
+ ),
791
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "w-full flex mb-6 justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("h2", { className: "text-2xl font-bold", children: "Help Options" }) }),
792
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "space-y-4 mb-4", children: [
793
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "copilotKitHelpItemButton", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
794
+ "a",
795
+ {
796
+ href: "https://docs.copilotkit.ai/coagents/troubleshooting/common-issues",
797
+ target: "_blank",
798
+ rel: "noopener noreferrer",
799
+ children: "Visit the Troubleshooting and FAQ section in the docs"
800
+ }
801
+ ) }),
802
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "copilotKitHelpItemButton", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
803
+ "a",
804
+ {
805
+ href: "https://go.copilotkit.ai/dev-console-support-discord",
806
+ target: "_blank",
807
+ rel: "noopener noreferrer",
808
+ children: "Go to Discord Support Channel (Community Support)"
809
+ }
810
+ ) }),
811
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "copilotKitHelpItemButton", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
812
+ "a",
813
+ {
814
+ href: "https://go.copilotkit.ai/dev-console-support-slack",
815
+ target: "_blank",
816
+ rel: "noopener noreferrer",
817
+ children: "Apply for Priority Direct Slack Support"
818
+ }
819
+ ) })
820
+ ] })
821
+ ] })
822
+ }
823
+ )
824
+ ] });
825
+ }
868
826
 
869
- // src/components/chat/Input.tsx
870
- var import_react_core3 = require("@copilotkit/react-core");
827
+ // src/components/dev-console/console.tsx
871
828
  var import_jsx_runtime8 = require("react/jsx-runtime");
872
- var Input = ({ inProgress, onSend, isVisible = false }) => {
873
- const context = useChatContext();
874
- const copilotContext = (0, import_react_core3.useCopilotContext)();
875
- const pushToTalkConfigured = copilotContext.copilotApiConfig.textToSpeechUrl !== void 0 && copilotContext.copilotApiConfig.transcribeAudioUrl !== void 0;
876
- const textareaRef = (0, import_react6.useRef)(null);
877
- const handleDivClick = (event) => {
878
- var _a;
879
- if (event.target !== event.currentTarget)
880
- return;
881
- (_a = textareaRef.current) == null ? void 0 : _a.focus();
829
+ function CopilotDevConsole() {
830
+ const currentVersion = import_shared.COPILOTKIT_VERSION;
831
+ const context = (0, import_react_core2.useCopilotContext)();
832
+ const [showDevConsole, setShowDevConsole] = (0, import_react4.useState)(false);
833
+ (0, import_react4.useEffect)(() => {
834
+ setShowDevConsole(shouldShowDevConsole(context.showDevConsole));
835
+ }, [context.showDevConsole]);
836
+ const dontRunTwiceInDevMode = (0, import_react4.useRef)(false);
837
+ const [versionStatus, setVersionStatus] = (0, import_react4.useState)("unknown");
838
+ const [latestVersion, setLatestVersion] = (0, import_react4.useState)("");
839
+ const consoleRef = (0, import_react4.useRef)(null);
840
+ const [debugButtonMode, setDebugButtonMode] = (0, import_react4.useState)("full");
841
+ const checkForUpdates = (force = false) => {
842
+ setVersionStatus("checking");
843
+ getPublishedCopilotKitVersion(currentVersion, force).then((v) => {
844
+ setLatestVersion(v.latest);
845
+ let versionOk = false;
846
+ if (v.current === v.latest) {
847
+ versionOk = true;
848
+ } else if (/[a-zA-Z]/.test(v.current)) {
849
+ versionOk = true;
850
+ }
851
+ if (versionOk) {
852
+ setVersionStatus("latest");
853
+ } else if (v.severity !== "low") {
854
+ setVersionStatus("outdated");
855
+ } else {
856
+ setVersionStatus("update-available");
857
+ }
858
+ }).catch((e) => {
859
+ console.error(e);
860
+ setVersionStatus("unknown");
861
+ });
882
862
  };
883
- const [text, setText] = (0, import_react6.useState)("");
884
- const send = () => {
885
- var _a;
886
- if (inProgress)
863
+ (0, import_react4.useEffect)(() => {
864
+ if (dontRunTwiceInDevMode.current === true) {
887
865
  return;
888
- onSend(text);
889
- setText("");
890
- (_a = textareaRef.current) == null ? void 0 : _a.focus();
891
- };
892
- (0, import_react6.useEffect)(() => {
893
- var _a;
894
- if (isVisible) {
895
- (_a = textareaRef.current) == null ? void 0 : _a.focus();
896
866
  }
897
- }, [isVisible]);
898
- const { pushToTalkState, setPushToTalkState } = usePushToTalk({
899
- sendFunction: onSend,
900
- inProgress
901
- });
902
- const sendIcon = inProgress || pushToTalkState === "transcribing" ? context.icons.activityIcon : context.icons.sendIcon;
903
- const showPushToTalk = pushToTalkConfigured && (pushToTalkState === "idle" || pushToTalkState === "recording") && !inProgress;
904
- const canSend = () => {
905
- var _a;
906
- const interruptEvent = (_a = copilotContext.langGraphInterruptAction) == null ? void 0 : _a.event;
907
- const interruptInProgress = (interruptEvent == null ? void 0 : interruptEvent.name) === "LangGraphInterruptEvent" && !(interruptEvent == null ? void 0 : interruptEvent.response);
908
- return !inProgress && text.trim().length > 0 && pushToTalkState === "idle" && !interruptInProgress;
867
+ dontRunTwiceInDevMode.current = true;
868
+ checkForUpdates();
869
+ }, []);
870
+ if (!showDevConsole) {
871
+ return null;
872
+ }
873
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
874
+ "div",
875
+ {
876
+ ref: consoleRef,
877
+ className: "copilotKitDevConsole " + (versionStatus === "update-available" ? "copilotKitDevConsoleUpgrade" : "") + (versionStatus === "outdated" ? "copilotKitDevConsoleWarnOutdated" : ""),
878
+ children: [
879
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
880
+ VersionInfo,
881
+ {
882
+ showDevConsole: context.showDevConsole,
883
+ versionStatus,
884
+ currentVersion,
885
+ latestVersion
886
+ }
887
+ ),
888
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(CopilotKitHelpModal, {}),
889
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
890
+ DebugMenuButton,
891
+ {
892
+ setShowDevConsole,
893
+ checkForUpdates,
894
+ mode: debugButtonMode
895
+ }
896
+ )
897
+ ]
898
+ }
899
+ );
900
+ }
901
+ function VersionInfo({
902
+ showDevConsole,
903
+ versionStatus,
904
+ currentVersion,
905
+ latestVersion
906
+ }) {
907
+ const [copyStatus, setCopyStatus] = (0, import_react4.useState)("");
908
+ let versionLabel = "";
909
+ let versionIcon = "";
910
+ let currentVersionLabel = currentVersion;
911
+ if (versionStatus === "latest") {
912
+ versionLabel = "latest";
913
+ versionIcon = CheckIcon2;
914
+ } else if (versionStatus === "checking") {
915
+ versionLabel = "checking";
916
+ versionIcon = SmallSpinnerIcon;
917
+ } else if (versionStatus === "update-available") {
918
+ versionLabel = "update available";
919
+ versionIcon = ExclamationMarkIcon;
920
+ currentVersionLabel = `${currentVersion} \u2192 ${latestVersion}`;
921
+ } else if (versionStatus === "outdated") {
922
+ versionLabel = "outdated";
923
+ versionIcon = ExclamationMarkTriangleIcon;
924
+ currentVersionLabel = `${currentVersion} \u2192 ${latestVersion}`;
925
+ }
926
+ let asideLabel = "";
927
+ if (showDevConsole === "auto") {
928
+ asideLabel = "(localhost only)";
929
+ } else if (showDevConsole === true) {
930
+ asideLabel = "(always on)";
931
+ }
932
+ const installCommand = [
933
+ `npm install`,
934
+ `@copilotkit/react-core@${latestVersion}`,
935
+ `@copilotkit/react-ui@${latestVersion}`,
936
+ `@copilotkit/react-textarea@${latestVersion}`,
937
+ `&& npm install @copilotkit/runtime@${latestVersion}`
938
+ ].join(" ");
939
+ const handleCopyClick = () => {
940
+ navigator.clipboard.writeText(installCommand.trim()).then(() => {
941
+ setCopyStatus("Command copied to clipboard!");
942
+ setTimeout(() => setCopyStatus(""), 1e3);
943
+ });
909
944
  };
910
- const sendDisabled = !canSend();
911
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "copilotKitInput", onClick: handleDivClick, children: [
945
+ if (versionStatus === "update-available" || versionStatus === "outdated") {
946
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "copilotKitVersionInfo", children: [
947
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("p", { children: [
948
+ currentVersionLabel,
949
+ " ",
950
+ versionIcon
951
+ ] }),
952
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { onClick: handleCopyClick, children: copyStatus || installCommand })
953
+ ] });
954
+ }
955
+ return null;
956
+ }
957
+ function DebugMenuButton({
958
+ setShowDevConsole,
959
+ checkForUpdates,
960
+ mode
961
+ }) {
962
+ const context = (0, import_react_core2.useCopilotContext)();
963
+ const messagesContext = (0, import_react_core2.useCopilotMessagesContext)();
964
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: "bg-black top-24 w-52 text-right", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react5.Menu, { children: [
912
965
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
913
- Textarea_default,
966
+ import_react5.MenuButton,
914
967
  {
915
- ref: textareaRef,
916
- placeholder: context.labels.placeholder,
917
- autoFocus: true,
918
- maxRows: 5,
919
- value: text,
920
- onChange: (event) => setText(event.target.value),
921
- onKeyDown: (event) => {
922
- if (event.key === "Enter" && !event.shiftKey) {
923
- event.preventDefault();
924
- if (canSend()) {
925
- send();
926
- }
927
- }
928
- }
968
+ className: `copilotKitDebugMenuTriggerButton ${mode === "compact" ? "compact" : ""}`,
969
+ children: mode == "compact" ? "Debug" : /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_jsx_runtime8.Fragment, { children: [
970
+ "Debug ",
971
+ ChevronDownIcon
972
+ ] })
929
973
  }
930
974
  ),
931
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "copilotKitInputControls", children: [
932
- showPushToTalk && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
933
- "button",
934
- {
935
- onClick: () => setPushToTalkState(pushToTalkState === "idle" ? "recording" : "transcribing"),
936
- className: pushToTalkState === "recording" ? "copilotKitPushToTalkRecording" : "",
937
- children: context.icons.pushToTalkIcon
938
- }
939
- ),
940
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
941
- "button",
942
- {
943
- disabled: sendDisabled,
944
- onClick: send,
945
- "data-copilotkit-in-progress": !!inProgress,
946
- "data-testid": inProgress ? "copilot-chat-request-in-progress" : void 0,
947
- children: sendIcon
948
- }
949
- )
950
- ] })
951
- ] });
952
- };
975
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
976
+ import_react5.MenuItems,
977
+ {
978
+ transition: true,
979
+ anchor: "bottom end",
980
+ className: "copilotKitDebugMenu",
981
+ style: { zIndex: 40 },
982
+ children: [
983
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react5.MenuItem, { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { className: "copilotKitDebugMenuItem", onClick: () => logReadables(context), children: "Log Readables" }) }),
984
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react5.MenuItem, { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { className: "copilotKitDebugMenuItem", onClick: () => logActions(context), children: "Log Actions" }) }),
985
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react5.MenuItem, { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
986
+ "button",
987
+ {
988
+ className: "copilotKitDebugMenuItem",
989
+ onClick: () => logMessages(messagesContext),
990
+ children: "Log Messages"
991
+ }
992
+ ) }),
993
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react5.MenuItem, { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { className: "copilotKitDebugMenuItem", onClick: () => checkForUpdates(true), children: "Check for Updates" }) }),
994
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("hr", {}),
995
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react5.MenuItem, { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { className: "copilotKitDebugMenuItem", onClick: () => setShowDevConsole(false), children: "Hide Dev Console" }) })
996
+ ]
997
+ }
998
+ )
999
+ ] }) });
1000
+ }
953
1001
 
954
- // src/components/chat/Response.tsx
1002
+ // src/components/chat/Header.tsx
955
1003
  var import_jsx_runtime9 = require("react/jsx-runtime");
956
- var ResponseButton = ({ onClick, inProgress }) => {
957
- const context = useChatContext();
958
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("button", { onClick, className: "copilotKitResponseButton", children: [
959
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: inProgress ? context.icons.stopIcon : context.icons.regenerateIcon }),
960
- inProgress ? context.labels.stopGenerating : context.labels.regenerateResponse
1004
+ var Header = ({}) => {
1005
+ const { setOpen, icons, labels } = useChatContext();
1006
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "copilotKitHeader", children: [
1007
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { children: labels.title }),
1008
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "copilotKitHeaderControls", children: [
1009
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(CopilotDevConsole, {}),
1010
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { onClick: () => setOpen(false), "aria-label": "Close", children: icons.headerCloseIcon })
1011
+ ] })
961
1012
  ] });
962
1013
  };
963
1014
 
964
- // src/components/chat/messages/RenderTextMessage.tsx
1015
+ // src/components/chat/Messages.tsx
1016
+ var import_react6 = require("react");
1017
+ var import_runtime_client_gql = require("@copilotkit/runtime-client-gql");
1018
+ var import_react_core3 = require("@copilotkit/react-core");
965
1019
  var import_jsx_runtime10 = require("react/jsx-runtime");
966
- function RenderTextMessage(props) {
967
- const { message, inProgress, index, isCurrentMessage, UserMessage: UserMessage2, AssistantMessage: AssistantMessage2 } = props;
968
- if (message.isTextMessage()) {
969
- if (message.role === "user") {
970
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
971
- UserMessage2,
972
- {
973
- "data-message-role": "user",
974
- message: message.content,
975
- rawData: message
976
- },
977
- index
978
- );
979
- } else if (message.role == "assistant") {
980
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
981
- AssistantMessage2,
982
- {
983
- "data-message-role": "assistant",
984
- message: message.content,
985
- rawData: message,
986
- isLoading: inProgress && isCurrentMessage && !message.content,
987
- isGenerating: inProgress && isCurrentMessage && !!message.content
988
- },
989
- index
1020
+ var Messages = ({
1021
+ messages,
1022
+ inProgress,
1023
+ children,
1024
+ RenderTextMessage: RenderTextMessage2,
1025
+ RenderActionExecutionMessage: RenderActionExecutionMessage2,
1026
+ RenderAgentStateMessage: RenderAgentStateMessage2,
1027
+ RenderResultMessage: RenderResultMessage2,
1028
+ AssistantMessage: AssistantMessage2,
1029
+ UserMessage: UserMessage2,
1030
+ onRegenerate,
1031
+ onCopy,
1032
+ onThumbsUp,
1033
+ onThumbsDown
1034
+ }) => {
1035
+ const context = useChatContext();
1036
+ const initialMessages = (0, import_react6.useMemo)(
1037
+ () => makeInitialMessages(context.labels.initial),
1038
+ [context.labels.initial]
1039
+ );
1040
+ messages = [...initialMessages, ...messages];
1041
+ const actionResults = {};
1042
+ for (let i = 0; i < messages.length; i++) {
1043
+ if (messages[i].isActionExecutionMessage()) {
1044
+ const id = messages[i].id;
1045
+ const resultMessage = messages.find(
1046
+ (message) => message.isResultMessage() && message.actionExecutionId === id
990
1047
  );
1048
+ if (resultMessage) {
1049
+ actionResults[id] = import_runtime_client_gql.ResultMessage.decodeResult(resultMessage.result || "");
1050
+ }
991
1051
  }
992
1052
  }
993
- }
994
-
995
- // src/components/chat/messages/RenderActionExecutionMessage.tsx
996
- var import_runtime_client_gql2 = require("@copilotkit/runtime-client-gql");
997
- var import_react_core4 = require("@copilotkit/react-core");
998
- var import_jsx_runtime11 = require("react/jsx-runtime");
999
- function RenderActionExecutionMessage(props) {
1000
- const { chatComponentsCache } = (0, import_react_core4.useCopilotContext)();
1001
- const { message, inProgress, index, isCurrentMessage, actionResult, AssistantMessage: AssistantMessage2 } = props;
1002
- if (message.isActionExecutionMessage()) {
1003
- if (chatComponentsCache.current !== null && (chatComponentsCache.current.actions[message.name] || chatComponentsCache.current.actions["*"])) {
1004
- const render = chatComponentsCache.current.actions[message.name] || chatComponentsCache.current.actions["*"];
1005
- if (typeof render === "string") {
1006
- if (isCurrentMessage && inProgress) {
1007
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1008
- AssistantMessage2,
1053
+ const { messagesEndRef, messagesContainerRef } = useScrollToBottom(messages);
1054
+ const interrupt = (0, import_react_core3.useLangGraphInterruptRender)();
1055
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "copilotKitMessages", ref: messagesContainerRef, children: [
1056
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "copilotKitMessagesContainer", children: [
1057
+ messages.map((message, index) => {
1058
+ const isCurrentMessage = index === messages.length - 1;
1059
+ if (message.isTextMessage()) {
1060
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1061
+ RenderTextMessage2,
1009
1062
  {
1010
- rawData: message,
1011
- "data-message-role": "assistant",
1012
- isLoading: false,
1013
- isGenerating: true,
1014
- message: render
1063
+ message,
1064
+ inProgress,
1065
+ index,
1066
+ isCurrentMessage,
1067
+ AssistantMessage: AssistantMessage2,
1068
+ UserMessage: UserMessage2,
1069
+ onRegenerate,
1070
+ onCopy,
1071
+ onThumbsUp,
1072
+ onThumbsDown
1015
1073
  },
1016
1074
  index
1017
1075
  );
1018
- } else {
1019
- return null;
1020
- }
1021
- } else {
1022
- const args = message.arguments;
1023
- let status = "inProgress";
1024
- if (actionResult !== void 0) {
1025
- status = "complete";
1026
- } else if (message.status.code !== import_runtime_client_gql2.MessageStatusCode.Pending) {
1027
- status = "executing";
1028
- }
1029
- try {
1030
- const toRender = render({
1031
- status,
1032
- args,
1033
- result: actionResult,
1034
- name: message.name
1035
- });
1036
- if (!toRender && status === "complete") {
1037
- return null;
1038
- }
1039
- if (typeof toRender === "string") {
1040
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1041
- AssistantMessage2,
1042
- {
1043
- rawData: message,
1044
- "data-message-role": "assistant",
1045
- isLoading: false,
1046
- isGenerating: false,
1047
- message: toRender
1048
- },
1049
- index
1050
- );
1051
- } else {
1052
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1053
- AssistantMessage2,
1054
- {
1055
- rawData: message,
1056
- "data-message-role": "action-render",
1057
- isLoading: false,
1058
- isGenerating: false,
1059
- subComponent: toRender
1060
- },
1061
- index
1062
- );
1063
- }
1064
- } catch (e) {
1065
- console.error(`Error executing render function for action ${message.name}: ${e}`);
1066
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1067
- AssistantMessage2,
1076
+ } else if (message.isActionExecutionMessage()) {
1077
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1078
+ RenderActionExecutionMessage2,
1068
1079
  {
1069
- rawData: message,
1070
- "data-message-role": "assistant",
1071
- isLoading: false,
1072
- isGenerating: false,
1073
- subComponent: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "copilotKitMessage copilotKitAssistantMessage", children: [
1074
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("b", { children: [
1075
- "\u274C Error executing render function for action ",
1076
- message.name,
1077
- ":"
1078
- ] }),
1079
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("pre", { children: e instanceof Error ? e.message : String(e) })
1080
- ] })
1080
+ message,
1081
+ inProgress,
1082
+ index,
1083
+ isCurrentMessage,
1084
+ actionResult: actionResults[message.id],
1085
+ AssistantMessage: AssistantMessage2,
1086
+ UserMessage: UserMessage2
1081
1087
  },
1082
1088
  index
1083
1089
  );
1084
- }
1085
- }
1086
- } else if (!inProgress || !isCurrentMessage) {
1087
- return null;
1088
- } else {
1089
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1090
- AssistantMessage2,
1091
- {
1092
- rawData: message,
1093
- "data-message-role": "assistant",
1094
- isLoading: true,
1095
- isGenerating: true
1096
- },
1097
- index
1098
- );
1099
- }
1100
- }
1101
- }
1102
-
1103
- // src/components/chat/messages/RenderResultMessage.tsx
1104
- var import_jsx_runtime12 = require("react/jsx-runtime");
1105
- function RenderResultMessage(props) {
1106
- const { message, inProgress, index, isCurrentMessage, AssistantMessage: AssistantMessage2 } = props;
1107
- if (message.isResultMessage() && inProgress && isCurrentMessage) {
1108
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1109
- AssistantMessage2,
1110
- {
1111
- "data-message-role": "assistant",
1112
- rawData: message,
1113
- isLoading: true,
1114
- isGenerating: true
1115
- },
1116
- index
1117
- );
1118
- } else {
1119
- return null;
1120
- }
1121
- }
1122
-
1123
- // src/components/chat/messages/RenderAgentStateMessage.tsx
1124
- var import_react_core5 = require("@copilotkit/react-core");
1125
- var import_jsx_runtime13 = require("react/jsx-runtime");
1126
- function RenderAgentStateMessage(props) {
1127
- const { chatComponentsCache } = (0, import_react_core5.useCopilotContext)();
1128
- const { message, inProgress, index, isCurrentMessage, AssistantMessage: AssistantMessage2 } = props;
1129
- if (message.isAgentStateMessage()) {
1130
- let render;
1131
- if (chatComponentsCache.current !== null) {
1132
- render = chatComponentsCache.current.coAgentStateRenders[`${message.agentName}-${message.nodeName}`] || chatComponentsCache.current.coAgentStateRenders[`${message.agentName}-global`];
1133
- }
1134
- if (render) {
1135
- if (typeof render === "string") {
1136
- if (isCurrentMessage && inProgress) {
1137
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1138
- AssistantMessage2,
1090
+ } else if (message.isAgentStateMessage()) {
1091
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1092
+ RenderAgentStateMessage2,
1139
1093
  {
1140
- rawData: message,
1141
- message: render,
1142
- "data-message-role": "assistant",
1143
- isLoading: true,
1144
- isGenerating: true
1094
+ message,
1095
+ inProgress,
1096
+ index,
1097
+ isCurrentMessage,
1098
+ AssistantMessage: AssistantMessage2,
1099
+ UserMessage: UserMessage2
1145
1100
  },
1146
1101
  index
1147
1102
  );
1148
- } else {
1149
- return null;
1150
- }
1151
- } else {
1152
- const state = message.state;
1153
- let status = message.active ? "inProgress" : "complete";
1154
- const toRender = render({
1155
- status,
1156
- state,
1157
- nodeName: message.nodeName
1158
- });
1159
- if (!toRender && status === "complete") {
1160
- return null;
1161
- }
1162
- if (!toRender && isCurrentMessage && inProgress) {
1163
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1164
- AssistantMessage2,
1103
+ } else if (message.isResultMessage()) {
1104
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1105
+ RenderResultMessage2,
1165
1106
  {
1166
- "data-message-role": "assistant",
1167
- rawData: message,
1168
- isLoading: true,
1169
- isGenerating: true
1170
- },
1171
- index
1172
- );
1173
- } else if (!toRender) {
1174
- return null;
1175
- }
1176
- if (typeof toRender === "string") {
1177
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1178
- AssistantMessage2,
1179
- {
1180
- rawData: message,
1181
- message: toRender,
1182
- isLoading: true,
1183
- isGenerating: true,
1184
- "data-message-role": "assistant"
1185
- },
1186
- index
1187
- );
1188
- } else {
1189
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1190
- AssistantMessage2,
1191
- {
1192
- rawData: message,
1193
- "data-message-role": "agent-state-render",
1194
- isLoading: false,
1195
- isGenerating: false,
1196
- subComponent: toRender
1107
+ message,
1108
+ inProgress,
1109
+ index,
1110
+ isCurrentMessage,
1111
+ AssistantMessage: AssistantMessage2,
1112
+ UserMessage: UserMessage2
1197
1113
  },
1198
1114
  index
1199
1115
  );
1200
1116
  }
1201
- }
1202
- } else if (!inProgress || !isCurrentMessage) {
1203
- return null;
1117
+ }),
1118
+ interrupt
1119
+ ] }),
1120
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("footer", { className: "copilotKitMessagesFooter", ref: messagesEndRef, children })
1121
+ ] });
1122
+ };
1123
+ function makeInitialMessages(initial) {
1124
+ let initialArray = [];
1125
+ if (initial) {
1126
+ if (Array.isArray(initial)) {
1127
+ initialArray.push(...initial);
1204
1128
  } else {
1205
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1206
- AssistantMessage2,
1207
- {
1208
- rawData: message,
1209
- isLoading: true,
1210
- isGenerating: true,
1211
- "data-message-role": "assistant"
1212
- },
1213
- index
1214
- );
1129
+ initialArray.push(initial);
1215
1130
  }
1216
1131
  }
1132
+ return initialArray.map(
1133
+ (message) => new import_runtime_client_gql.TextMessage({
1134
+ role: import_runtime_client_gql.Role.Assistant,
1135
+ content: message
1136
+ })
1137
+ );
1217
1138
  }
1218
-
1219
- // src/components/chat/Markdown.tsx
1220
- var import_react8 = require("react");
1221
- var import_react_markdown = __toESM(require("react-markdown"));
1222
-
1223
- // src/components/chat/CodeBlock.tsx
1224
- var import_react7 = require("react");
1225
- var import_react_syntax_highlighter = require("react-syntax-highlighter");
1226
-
1227
- // src/hooks/use-copy-to-clipboard.tsx
1228
- var React5 = __toESM(require("react"));
1229
- function useCopyToClipboard({ timeout = 2e3 }) {
1230
- const [isCopied, setIsCopied] = React5.useState(false);
1231
- const copyToClipboard = (value) => {
1232
- var _a;
1233
- if (typeof window === "undefined" || !((_a = navigator.clipboard) == null ? void 0 : _a.writeText)) {
1234
- return;
1235
- }
1236
- if (!value) {
1237
- return;
1139
+ function useScrollToBottom(messages) {
1140
+ const messagesEndRef = (0, import_react6.useRef)(null);
1141
+ const messagesContainerRef = (0, import_react6.useRef)(null);
1142
+ const isProgrammaticScrollRef = (0, import_react6.useRef)(false);
1143
+ const isUserScrollUpRef = (0, import_react6.useRef)(false);
1144
+ const scrollToBottom = () => {
1145
+ if (messagesEndRef.current) {
1146
+ isProgrammaticScrollRef.current = true;
1147
+ messagesEndRef.current.scrollIntoView({
1148
+ behavior: "auto"
1149
+ });
1238
1150
  }
1239
- navigator.clipboard.writeText(value).then(() => {
1240
- setIsCopied(true);
1241
- setTimeout(() => {
1242
- setIsCopied(false);
1243
- }, timeout);
1244
- });
1245
1151
  };
1246
- return { isCopied, copyToClipboard };
1247
- }
1248
-
1249
- // src/components/chat/CodeBlock.tsx
1250
- var import_jsx_runtime14 = require("react/jsx-runtime");
1251
- var programmingLanguages = {
1252
- javascript: ".js",
1253
- python: ".py",
1254
- java: ".java",
1255
- c: ".c",
1256
- cpp: ".cpp",
1257
- "c++": ".cpp",
1258
- "c#": ".cs",
1259
- ruby: ".rb",
1260
- php: ".php",
1261
- swift: ".swift",
1262
- "objective-c": ".m",
1263
- kotlin: ".kt",
1264
- typescript: ".ts",
1265
- go: ".go",
1266
- perl: ".pl",
1267
- rust: ".rs",
1268
- scala: ".scala",
1269
- haskell: ".hs",
1270
- lua: ".lua",
1271
- shell: ".sh",
1272
- sql: ".sql",
1273
- html: ".html",
1274
- css: ".css"
1275
- // add more file extensions here, make sure the key is same as language prop in CodeBlock.tsx component
1276
- };
1277
- var generateRandomString = (length, lowercase = false) => {
1278
- const chars = "ABCDEFGHJKLMNPQRSTUVWXY3456789";
1279
- let result = "";
1280
- for (let i = 0; i < length; i++) {
1281
- result += chars.charAt(Math.floor(Math.random() * chars.length));
1282
- }
1283
- return lowercase ? result.toLowerCase() : result;
1284
- };
1285
- var CodeBlock = (0, import_react7.memo)(({ language, value }) => {
1286
- const { isCopied, copyToClipboard } = useCopyToClipboard({ timeout: 2e3 });
1287
- const downloadAsFile = () => {
1288
- if (typeof window === "undefined") {
1152
+ const handleScroll = () => {
1153
+ if (isProgrammaticScrollRef.current) {
1154
+ isProgrammaticScrollRef.current = false;
1289
1155
  return;
1290
1156
  }
1291
- const fileExtension = programmingLanguages[language] || ".file";
1292
- const suggestedFileName = `file-${generateRandomString(3, true)}${fileExtension}`;
1293
- const fileName = window.prompt("Enter file name", suggestedFileName);
1294
- if (!fileName) {
1295
- return;
1157
+ if (messagesContainerRef.current) {
1158
+ const { scrollTop, scrollHeight, clientHeight } = messagesContainerRef.current;
1159
+ isUserScrollUpRef.current = scrollTop + clientHeight < scrollHeight;
1296
1160
  }
1297
- const blob = new Blob([value], { type: "text/plain" });
1298
- const url = URL.createObjectURL(blob);
1299
- const link = document.createElement("a");
1300
- link.download = fileName;
1301
- link.href = url;
1302
- link.style.display = "none";
1303
- document.body.appendChild(link);
1304
- link.click();
1305
- document.body.removeChild(link);
1306
- URL.revokeObjectURL(url);
1307
1161
  };
1308
- const onCopy = () => {
1309
- if (isCopied)
1162
+ (0, import_react6.useEffect)(() => {
1163
+ const container = messagesContainerRef.current;
1164
+ if (container) {
1165
+ container.addEventListener("scroll", handleScroll);
1166
+ }
1167
+ return () => {
1168
+ if (container) {
1169
+ container.removeEventListener("scroll", handleScroll);
1170
+ }
1171
+ };
1172
+ }, []);
1173
+ (0, import_react6.useEffect)(() => {
1174
+ const container = messagesContainerRef.current;
1175
+ if (!container) {
1310
1176
  return;
1311
- copyToClipboard(value);
1312
- };
1313
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "copilotKitCodeBlock", children: [
1314
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "copilotKitCodeBlockToolbar", children: [
1315
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "copilotKitCodeBlockToolbarLanguage", children: language }),
1316
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "copilotKitCodeBlockToolbarButtons", children: [
1317
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("button", { className: "copilotKitCodeBlockToolbarButton", onClick: downloadAsFile, children: [
1318
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(DownloadIcon, {}),
1319
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "sr-only", children: "Download" })
1320
- ] }),
1321
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("button", { className: "copilotKitCodeBlockToolbarButton", onClick: onCopy, children: [
1322
- isCopied ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(CheckIcon, {}) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(CopyIcon, {}),
1323
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "sr-only", children: "Copy code" })
1324
- ] })
1325
- ] })
1326
- ] }),
1327
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1328
- import_react_syntax_highlighter.Prism,
1177
+ }
1178
+ const mutationObserver = new MutationObserver(() => {
1179
+ if (!isUserScrollUpRef.current) {
1180
+ scrollToBottom();
1181
+ }
1182
+ });
1183
+ mutationObserver.observe(container, {
1184
+ childList: true,
1185
+ subtree: true,
1186
+ characterData: true
1187
+ });
1188
+ return () => {
1189
+ mutationObserver.disconnect();
1190
+ };
1191
+ }, []);
1192
+ (0, import_react6.useEffect)(() => {
1193
+ isUserScrollUpRef.current = false;
1194
+ scrollToBottom();
1195
+ }, [messages.filter((m) => m.isTextMessage() && m.role === import_runtime_client_gql.Role.User).length]);
1196
+ return { messagesEndRef, messagesContainerRef };
1197
+ }
1198
+
1199
+ // src/components/chat/Input.tsx
1200
+ var import_react9 = require("react");
1201
+
1202
+ // src/components/chat/Textarea.tsx
1203
+ var import_react7 = require("react");
1204
+ var import_jsx_runtime11 = require("react/jsx-runtime");
1205
+ var AutoResizingTextarea = (0, import_react7.forwardRef)(
1206
+ ({ maxRows = 1, placeholder, value, onChange, onKeyDown, autoFocus }, ref) => {
1207
+ const internalTextareaRef = (0, import_react7.useRef)(null);
1208
+ const [maxHeight, setMaxHeight] = (0, import_react7.useState)(0);
1209
+ (0, import_react7.useImperativeHandle)(ref, () => internalTextareaRef.current);
1210
+ (0, import_react7.useEffect)(() => {
1211
+ const calculateMaxHeight = () => {
1212
+ const textarea = internalTextareaRef.current;
1213
+ if (textarea) {
1214
+ textarea.style.height = "auto";
1215
+ const singleRowHeight = textarea.scrollHeight;
1216
+ setMaxHeight(singleRowHeight * maxRows);
1217
+ if (autoFocus) {
1218
+ textarea.focus();
1219
+ }
1220
+ }
1221
+ };
1222
+ calculateMaxHeight();
1223
+ }, [maxRows]);
1224
+ (0, import_react7.useEffect)(() => {
1225
+ const textarea = internalTextareaRef.current;
1226
+ if (textarea) {
1227
+ textarea.style.height = "auto";
1228
+ textarea.style.height = `${Math.min(textarea.scrollHeight, maxHeight)}px`;
1229
+ }
1230
+ }, [value, maxHeight]);
1231
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1232
+ "textarea",
1329
1233
  {
1330
- language,
1331
- style: highlightStyle,
1332
- PreTag: "div",
1333
- customStyle: {
1334
- margin: 0,
1335
- borderBottomLeftRadius: "0.375rem",
1336
- borderBottomRightRadius: "0.375rem"
1234
+ ref: internalTextareaRef,
1235
+ value,
1236
+ onChange,
1237
+ onKeyDown,
1238
+ placeholder,
1239
+ style: {
1240
+ overflow: "auto",
1241
+ resize: "none",
1242
+ maxHeight: `${maxHeight}px`
1337
1243
  },
1338
- children: value
1244
+ rows: 1
1339
1245
  }
1340
- )
1341
- ] });
1246
+ );
1247
+ }
1248
+ );
1249
+ var Textarea_default = AutoResizingTextarea;
1250
+
1251
+ // src/hooks/use-push-to-talk.tsx
1252
+ var import_react_core4 = require("@copilotkit/react-core");
1253
+ var import_react8 = require("react");
1254
+ var startRecording = (mediaStreamRef, mediaRecorderRef, audioContextRef, recordedChunks, onStop) => __async(void 0, null, function* () {
1255
+ if (!mediaStreamRef.current || !audioContextRef.current) {
1256
+ mediaStreamRef.current = yield navigator.mediaDevices.getUserMedia({ audio: true });
1257
+ audioContextRef.current = new window.AudioContext();
1258
+ yield audioContextRef.current.resume();
1259
+ }
1260
+ mediaRecorderRef.current = new MediaRecorder(mediaStreamRef.current);
1261
+ mediaRecorderRef.current.start(1e3);
1262
+ mediaRecorderRef.current.ondataavailable = (event) => {
1263
+ recordedChunks.push(event.data);
1264
+ };
1265
+ mediaRecorderRef.current.onstop = onStop;
1266
+ });
1267
+ var stopRecording = (mediaRecorderRef) => {
1268
+ if (mediaRecorderRef.current && mediaRecorderRef.current.state !== "inactive") {
1269
+ mediaRecorderRef.current.stop();
1270
+ }
1271
+ };
1272
+ var transcribeAudio = (recordedChunks, transcribeAudioUrl) => __async(void 0, null, function* () {
1273
+ const completeBlob = new Blob(recordedChunks, { type: "audio/mp4" });
1274
+ const formData = new FormData();
1275
+ formData.append("file", completeBlob, "recording.mp4");
1276
+ const response = yield fetch(transcribeAudioUrl, {
1277
+ method: "POST",
1278
+ body: formData
1279
+ });
1280
+ if (!response.ok) {
1281
+ throw new Error(`Error: ${response.statusText}`);
1282
+ }
1283
+ const transcription = yield response.json();
1284
+ return transcription.text;
1285
+ });
1286
+ var playAudioResponse = (text, textToSpeechUrl, audioContext) => {
1287
+ const encodedText = encodeURIComponent(text);
1288
+ const url = `${textToSpeechUrl}?text=${encodedText}`;
1289
+ fetch(url).then((response) => response.arrayBuffer()).then((arrayBuffer) => audioContext.decodeAudioData(arrayBuffer)).then((audioBuffer) => {
1290
+ const source = audioContext.createBufferSource();
1291
+ source.buffer = audioBuffer;
1292
+ source.connect(audioContext.destination);
1293
+ source.start(0);
1294
+ }).catch((error) => {
1295
+ console.error("Error with decoding audio data", error);
1296
+ });
1297
+ };
1298
+ var usePushToTalk = ({
1299
+ sendFunction,
1300
+ inProgress
1301
+ }) => {
1302
+ const [pushToTalkState, setPushToTalkState] = (0, import_react8.useState)("idle");
1303
+ const mediaStreamRef = (0, import_react8.useRef)(null);
1304
+ const audioContextRef = (0, import_react8.useRef)(null);
1305
+ const mediaRecorderRef = (0, import_react8.useRef)(null);
1306
+ const recordedChunks = (0, import_react8.useRef)([]);
1307
+ const generalContext = (0, import_react_core4.useCopilotContext)();
1308
+ const messagesContext = (0, import_react_core4.useCopilotMessagesContext)();
1309
+ const context = __spreadValues(__spreadValues({}, generalContext), messagesContext);
1310
+ const [startReadingFromMessageId, setStartReadingFromMessageId] = (0, import_react8.useState)(null);
1311
+ (0, import_react8.useEffect)(() => {
1312
+ if (pushToTalkState === "recording") {
1313
+ startRecording(
1314
+ mediaStreamRef,
1315
+ mediaRecorderRef,
1316
+ audioContextRef,
1317
+ recordedChunks.current,
1318
+ () => {
1319
+ setPushToTalkState("transcribing");
1320
+ }
1321
+ );
1322
+ } else {
1323
+ stopRecording(mediaRecorderRef);
1324
+ if (pushToTalkState === "transcribing") {
1325
+ transcribeAudio(recordedChunks.current, context.copilotApiConfig.transcribeAudioUrl).then(
1326
+ (transcription) => __async(void 0, null, function* () {
1327
+ recordedChunks.current = [];
1328
+ setPushToTalkState("idle");
1329
+ const message = yield sendFunction(transcription);
1330
+ setStartReadingFromMessageId(message.id);
1331
+ })
1332
+ );
1333
+ }
1334
+ }
1335
+ return () => {
1336
+ stopRecording(mediaRecorderRef);
1337
+ };
1338
+ }, [pushToTalkState]);
1339
+ (0, import_react8.useEffect)(() => {
1340
+ if (inProgress === false && startReadingFromMessageId) {
1341
+ const lastMessageIndex = context.messages.findIndex(
1342
+ (message) => message.id === startReadingFromMessageId
1343
+ );
1344
+ const messagesAfterLast = context.messages.slice(lastMessageIndex + 1).filter(
1345
+ (message) => message.isTextMessage() && message.role === "assistant"
1346
+ );
1347
+ const text = messagesAfterLast.map((message) => message.content).join("\n");
1348
+ playAudioResponse(text, context.copilotApiConfig.textToSpeechUrl, audioContextRef.current);
1349
+ setStartReadingFromMessageId(null);
1350
+ }
1351
+ }, [startReadingFromMessageId, inProgress]);
1352
+ return { pushToTalkState, setPushToTalkState };
1353
+ };
1354
+
1355
+ // src/components/chat/Input.tsx
1356
+ var import_react_core5 = require("@copilotkit/react-core");
1357
+ var import_jsx_runtime12 = require("react/jsx-runtime");
1358
+ var Input = ({ inProgress, onSend, isVisible = false, onStop }) => {
1359
+ const context = useChatContext();
1360
+ const copilotContext = (0, import_react_core5.useCopilotContext)();
1361
+ const pushToTalkConfigured = copilotContext.copilotApiConfig.textToSpeechUrl !== void 0 && copilotContext.copilotApiConfig.transcribeAudioUrl !== void 0;
1362
+ const textareaRef = (0, import_react9.useRef)(null);
1363
+ const handleDivClick = (event) => {
1364
+ var _a;
1365
+ if (event.target !== event.currentTarget)
1366
+ return;
1367
+ (_a = textareaRef.current) == null ? void 0 : _a.focus();
1368
+ };
1369
+ const [text, setText] = (0, import_react9.useState)("");
1370
+ const send = () => {
1371
+ var _a;
1372
+ if (inProgress)
1373
+ return;
1374
+ onSend(text);
1375
+ setText("");
1376
+ (_a = textareaRef.current) == null ? void 0 : _a.focus();
1377
+ };
1378
+ (0, import_react9.useEffect)(() => {
1379
+ var _a;
1380
+ if (isVisible) {
1381
+ (_a = textareaRef.current) == null ? void 0 : _a.focus();
1382
+ }
1383
+ }, [isVisible]);
1384
+ const { pushToTalkState, setPushToTalkState } = usePushToTalk({
1385
+ sendFunction: onSend,
1386
+ inProgress
1387
+ });
1388
+ const isInProgress = inProgress || pushToTalkState === "transcribing";
1389
+ const buttonIcon = isInProgress ? context.icons.stopIcon : context.icons.sendIcon;
1390
+ const showPushToTalk = pushToTalkConfigured && (pushToTalkState === "idle" || pushToTalkState === "recording") && !inProgress;
1391
+ const canSend = () => {
1392
+ var _a;
1393
+ const interruptEvent = (_a = copilotContext.langGraphInterruptAction) == null ? void 0 : _a.event;
1394
+ const interruptInProgress = (interruptEvent == null ? void 0 : interruptEvent.name) === "LangGraphInterruptEvent" && !(interruptEvent == null ? void 0 : interruptEvent.response);
1395
+ return (isInProgress || !isInProgress && text.trim().length > 0) && pushToTalkState === "idle" && !interruptInProgress;
1396
+ };
1397
+ const sendDisabled = !canSend();
1398
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "copilotKitInputContainer", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "copilotKitInput", onClick: handleDivClick, children: [
1399
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1400
+ Textarea_default,
1401
+ {
1402
+ ref: textareaRef,
1403
+ placeholder: context.labels.placeholder,
1404
+ autoFocus: true,
1405
+ maxRows: 5,
1406
+ value: text,
1407
+ onChange: (event) => setText(event.target.value),
1408
+ onKeyDown: (event) => {
1409
+ if (event.key === "Enter" && !event.shiftKey) {
1410
+ event.preventDefault();
1411
+ if (canSend()) {
1412
+ send();
1413
+ }
1414
+ }
1415
+ }
1416
+ }
1417
+ ),
1418
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "copilotKitInputControls", children: [
1419
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { style: { flexGrow: 1 } }),
1420
+ showPushToTalk && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1421
+ "button",
1422
+ {
1423
+ onClick: () => setPushToTalkState(pushToTalkState === "idle" ? "recording" : "transcribing"),
1424
+ className: pushToTalkState === "recording" ? "copilotKitPushToTalkRecording" : "",
1425
+ children: context.icons.pushToTalkIcon
1426
+ }
1427
+ ),
1428
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1429
+ "button",
1430
+ {
1431
+ disabled: sendDisabled,
1432
+ onClick: isInProgress ? onStop : send,
1433
+ "data-copilotkit-in-progress": inProgress,
1434
+ "data-test-id": inProgress ? "copilot-chat-request-in-progress" : "copilot-chat-ready",
1435
+ children: buttonIcon
1436
+ }
1437
+ )
1438
+ ] })
1439
+ ] }) });
1440
+ };
1441
+
1442
+ // src/components/chat/Response.tsx
1443
+ var import_jsx_runtime13 = require("react/jsx-runtime");
1444
+ var ResponseButton = ({ onClick, inProgress }) => {
1445
+ const context = useChatContext();
1446
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("button", { onClick, className: "copilotKitResponseButton", children: [
1447
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { children: inProgress ? context.icons.stopIcon : context.icons.regenerateIcon }),
1448
+ inProgress ? context.labels.stopGenerating : context.labels.regenerateResponse
1449
+ ] });
1450
+ };
1451
+
1452
+ // src/components/chat/messages/RenderTextMessage.tsx
1453
+ var import_jsx_runtime14 = require("react/jsx-runtime");
1454
+ function RenderTextMessage(props) {
1455
+ const {
1456
+ message,
1457
+ inProgress,
1458
+ index,
1459
+ isCurrentMessage,
1460
+ UserMessage: UserMessage2,
1461
+ AssistantMessage: AssistantMessage2,
1462
+ onRegenerate,
1463
+ onCopy,
1464
+ onThumbsUp,
1465
+ onThumbsDown
1466
+ } = props;
1467
+ if (message.isTextMessage()) {
1468
+ if (message.role === "user") {
1469
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1470
+ UserMessage2,
1471
+ {
1472
+ "data-message-role": "user",
1473
+ message: message.content,
1474
+ rawData: message
1475
+ },
1476
+ index
1477
+ );
1478
+ } else if (message.role == "assistant") {
1479
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1480
+ AssistantMessage2,
1481
+ {
1482
+ "data-message-role": "assistant",
1483
+ message: message.content,
1484
+ rawData: message,
1485
+ isLoading: inProgress && isCurrentMessage && !message.content,
1486
+ isGenerating: inProgress && isCurrentMessage && !!message.content,
1487
+ isCurrentMessage,
1488
+ onRegenerate,
1489
+ onCopy,
1490
+ onThumbsUp,
1491
+ onThumbsDown
1492
+ },
1493
+ index
1494
+ );
1495
+ }
1496
+ }
1497
+ }
1498
+
1499
+ // src/components/chat/messages/RenderActionExecutionMessage.tsx
1500
+ var import_runtime_client_gql2 = require("@copilotkit/runtime-client-gql");
1501
+ var import_react_core6 = require("@copilotkit/react-core");
1502
+ var import_jsx_runtime15 = require("react/jsx-runtime");
1503
+ function RenderActionExecutionMessage(props) {
1504
+ const { chatComponentsCache } = (0, import_react_core6.useCopilotContext)();
1505
+ const { message, inProgress, index, isCurrentMessage, actionResult, AssistantMessage: AssistantMessage2 } = props;
1506
+ if (message.isActionExecutionMessage()) {
1507
+ if (chatComponentsCache.current !== null && (chatComponentsCache.current.actions[message.name] || chatComponentsCache.current.actions["*"])) {
1508
+ const render = chatComponentsCache.current.actions[message.name] || chatComponentsCache.current.actions["*"];
1509
+ if (typeof render === "string") {
1510
+ if (isCurrentMessage && inProgress) {
1511
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1512
+ AssistantMessage2,
1513
+ {
1514
+ rawData: message,
1515
+ "data-message-role": "assistant",
1516
+ isLoading: false,
1517
+ isGenerating: true,
1518
+ message: render
1519
+ },
1520
+ index
1521
+ );
1522
+ } else {
1523
+ return null;
1524
+ }
1525
+ } else {
1526
+ const args = message.arguments;
1527
+ let status = "inProgress";
1528
+ if (actionResult !== void 0) {
1529
+ status = "complete";
1530
+ } else if (message.status.code !== import_runtime_client_gql2.MessageStatusCode.Pending) {
1531
+ status = "executing";
1532
+ }
1533
+ try {
1534
+ const toRender = render({
1535
+ status,
1536
+ args,
1537
+ result: actionResult,
1538
+ name: message.name
1539
+ });
1540
+ if (!toRender && status === "complete") {
1541
+ return null;
1542
+ }
1543
+ if (typeof toRender === "string") {
1544
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1545
+ AssistantMessage2,
1546
+ {
1547
+ rawData: message,
1548
+ "data-message-role": "assistant",
1549
+ isLoading: false,
1550
+ isGenerating: false,
1551
+ message: toRender
1552
+ },
1553
+ index
1554
+ );
1555
+ } else {
1556
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1557
+ AssistantMessage2,
1558
+ {
1559
+ rawData: message,
1560
+ "data-message-role": "action-render",
1561
+ isLoading: false,
1562
+ isGenerating: false,
1563
+ subComponent: toRender
1564
+ },
1565
+ index
1566
+ );
1567
+ }
1568
+ } catch (e) {
1569
+ console.error(`Error executing render function for action ${message.name}: ${e}`);
1570
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1571
+ AssistantMessage2,
1572
+ {
1573
+ rawData: message,
1574
+ "data-message-role": "assistant",
1575
+ isLoading: false,
1576
+ isGenerating: false,
1577
+ subComponent: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "copilotKitMessage copilotKitAssistantMessage", children: [
1578
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("b", { children: [
1579
+ "\u274C Error executing render function for action ",
1580
+ message.name,
1581
+ ":"
1582
+ ] }),
1583
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("pre", { children: e instanceof Error ? e.message : String(e) })
1584
+ ] })
1585
+ },
1586
+ index
1587
+ );
1588
+ }
1589
+ }
1590
+ } else if (!inProgress || !isCurrentMessage) {
1591
+ return null;
1592
+ } else {
1593
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1594
+ AssistantMessage2,
1595
+ {
1596
+ rawData: message,
1597
+ "data-message-role": "assistant",
1598
+ isLoading: true,
1599
+ isGenerating: true
1600
+ },
1601
+ index
1602
+ );
1603
+ }
1604
+ }
1605
+ }
1606
+
1607
+ // src/components/chat/messages/RenderResultMessage.tsx
1608
+ var import_jsx_runtime16 = require("react/jsx-runtime");
1609
+ function RenderResultMessage(props) {
1610
+ const { message, inProgress, index, isCurrentMessage, AssistantMessage: AssistantMessage2 } = props;
1611
+ if (message.isResultMessage() && inProgress && isCurrentMessage) {
1612
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1613
+ AssistantMessage2,
1614
+ {
1615
+ "data-message-role": "assistant",
1616
+ rawData: message,
1617
+ isLoading: true,
1618
+ isGenerating: true
1619
+ },
1620
+ index
1621
+ );
1622
+ } else {
1623
+ return null;
1624
+ }
1625
+ }
1626
+
1627
+ // src/components/chat/messages/RenderAgentStateMessage.tsx
1628
+ var import_react_core7 = require("@copilotkit/react-core");
1629
+ var import_jsx_runtime17 = require("react/jsx-runtime");
1630
+ function RenderAgentStateMessage(props) {
1631
+ const { chatComponentsCache } = (0, import_react_core7.useCopilotContext)();
1632
+ const { message, inProgress, index, isCurrentMessage, AssistantMessage: AssistantMessage2 } = props;
1633
+ if (message.isAgentStateMessage()) {
1634
+ let render;
1635
+ if (chatComponentsCache.current !== null) {
1636
+ render = chatComponentsCache.current.coAgentStateRenders[`${message.agentName}-${message.nodeName}`] || chatComponentsCache.current.coAgentStateRenders[`${message.agentName}-global`];
1637
+ }
1638
+ if (render) {
1639
+ if (typeof render === "string") {
1640
+ if (isCurrentMessage && inProgress) {
1641
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1642
+ AssistantMessage2,
1643
+ {
1644
+ rawData: message,
1645
+ message: render,
1646
+ "data-message-role": "assistant",
1647
+ isLoading: true,
1648
+ isGenerating: true
1649
+ },
1650
+ index
1651
+ );
1652
+ } else {
1653
+ return null;
1654
+ }
1655
+ } else {
1656
+ const state = message.state;
1657
+ let status = message.active ? "inProgress" : "complete";
1658
+ const toRender = render({
1659
+ status,
1660
+ state,
1661
+ nodeName: message.nodeName
1662
+ });
1663
+ if (!toRender && status === "complete") {
1664
+ return null;
1665
+ }
1666
+ if (!toRender && isCurrentMessage && inProgress) {
1667
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1668
+ AssistantMessage2,
1669
+ {
1670
+ "data-message-role": "assistant",
1671
+ rawData: message,
1672
+ isLoading: true,
1673
+ isGenerating: true
1674
+ },
1675
+ index
1676
+ );
1677
+ } else if (!toRender) {
1678
+ return null;
1679
+ }
1680
+ if (typeof toRender === "string") {
1681
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1682
+ AssistantMessage2,
1683
+ {
1684
+ rawData: message,
1685
+ message: toRender,
1686
+ isLoading: true,
1687
+ isGenerating: true,
1688
+ "data-message-role": "assistant"
1689
+ },
1690
+ index
1691
+ );
1692
+ } else {
1693
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1694
+ AssistantMessage2,
1695
+ {
1696
+ rawData: message,
1697
+ "data-message-role": "agent-state-render",
1698
+ isLoading: false,
1699
+ isGenerating: false,
1700
+ subComponent: toRender
1701
+ },
1702
+ index
1703
+ );
1704
+ }
1705
+ }
1706
+ } else if (!inProgress || !isCurrentMessage) {
1707
+ return null;
1708
+ } else {
1709
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1710
+ AssistantMessage2,
1711
+ {
1712
+ rawData: message,
1713
+ isLoading: true,
1714
+ isGenerating: true,
1715
+ "data-message-role": "assistant"
1716
+ },
1717
+ index
1718
+ );
1719
+ }
1720
+ }
1721
+ }
1722
+
1723
+ // src/components/chat/Markdown.tsx
1724
+ var import_react11 = require("react");
1725
+ var import_react_markdown = __toESM(require("react-markdown"));
1726
+
1727
+ // src/components/chat/CodeBlock.tsx
1728
+ var import_react10 = require("react");
1729
+ var import_react_syntax_highlighter = require("react-syntax-highlighter");
1730
+
1731
+ // src/hooks/use-copy-to-clipboard.tsx
1732
+ var React7 = __toESM(require("react"));
1733
+ function useCopyToClipboard({ timeout = 2e3 }) {
1734
+ const [isCopied, setIsCopied] = React7.useState(false);
1735
+ const copyToClipboard = (value) => {
1736
+ var _a;
1737
+ if (typeof window === "undefined" || !((_a = navigator.clipboard) == null ? void 0 : _a.writeText)) {
1738
+ return;
1739
+ }
1740
+ if (!value) {
1741
+ return;
1742
+ }
1743
+ navigator.clipboard.writeText(value).then(() => {
1744
+ setIsCopied(true);
1745
+ setTimeout(() => {
1746
+ setIsCopied(false);
1747
+ }, timeout);
1748
+ });
1749
+ };
1750
+ return { isCopied, copyToClipboard };
1751
+ }
1752
+
1753
+ // src/components/chat/CodeBlock.tsx
1754
+ var import_jsx_runtime18 = require("react/jsx-runtime");
1755
+ var programmingLanguages = {
1756
+ javascript: ".js",
1757
+ python: ".py",
1758
+ java: ".java",
1759
+ c: ".c",
1760
+ cpp: ".cpp",
1761
+ "c++": ".cpp",
1762
+ "c#": ".cs",
1763
+ ruby: ".rb",
1764
+ php: ".php",
1765
+ swift: ".swift",
1766
+ "objective-c": ".m",
1767
+ kotlin: ".kt",
1768
+ typescript: ".ts",
1769
+ go: ".go",
1770
+ perl: ".pl",
1771
+ rust: ".rs",
1772
+ scala: ".scala",
1773
+ haskell: ".hs",
1774
+ lua: ".lua",
1775
+ shell: ".sh",
1776
+ sql: ".sql",
1777
+ html: ".html",
1778
+ css: ".css"
1779
+ // add more file extensions here, make sure the key is same as language prop in CodeBlock.tsx component
1780
+ };
1781
+ var generateRandomString = (length, lowercase = false) => {
1782
+ const chars = "ABCDEFGHJKLMNPQRSTUVWXY3456789";
1783
+ let result = "";
1784
+ for (let i = 0; i < length; i++) {
1785
+ result += chars.charAt(Math.floor(Math.random() * chars.length));
1786
+ }
1787
+ return lowercase ? result.toLowerCase() : result;
1788
+ };
1789
+ var CodeBlock = (0, import_react10.memo)(({ language, value }) => {
1790
+ const { isCopied, copyToClipboard } = useCopyToClipboard({ timeout: 2e3 });
1791
+ const downloadAsFile = () => {
1792
+ if (typeof window === "undefined") {
1793
+ return;
1794
+ }
1795
+ const fileExtension = programmingLanguages[language] || ".file";
1796
+ const suggestedFileName = `file-${generateRandomString(3, true)}${fileExtension}`;
1797
+ const fileName = window.prompt("Enter file name", suggestedFileName);
1798
+ if (!fileName) {
1799
+ return;
1800
+ }
1801
+ const blob = new Blob([value], { type: "text/plain" });
1802
+ const url = URL.createObjectURL(blob);
1803
+ const link = document.createElement("a");
1804
+ link.download = fileName;
1805
+ link.href = url;
1806
+ link.style.display = "none";
1807
+ document.body.appendChild(link);
1808
+ link.click();
1809
+ document.body.removeChild(link);
1810
+ URL.revokeObjectURL(url);
1811
+ };
1812
+ const onCopy = () => {
1813
+ if (isCopied)
1814
+ return;
1815
+ copyToClipboard(value);
1816
+ };
1817
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "copilotKitCodeBlock", children: [
1818
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "copilotKitCodeBlockToolbar", children: [
1819
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: "copilotKitCodeBlockToolbarLanguage", children: language }),
1820
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "copilotKitCodeBlockToolbarButtons", children: [
1821
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("button", { className: "copilotKitCodeBlockToolbarButton", onClick: downloadAsFile, children: DownloadIcon }),
1822
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("button", { className: "copilotKitCodeBlockToolbarButton", onClick: onCopy, children: isCopied ? CheckIcon : CopyIcon })
1823
+ ] })
1824
+ ] }),
1825
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1826
+ import_react_syntax_highlighter.Prism,
1827
+ {
1828
+ language,
1829
+ style: highlightStyle,
1830
+ PreTag: "div",
1831
+ customStyle: {
1832
+ margin: 0,
1833
+ borderBottomLeftRadius: "0.375rem",
1834
+ borderBottomRightRadius: "0.375rem"
1835
+ },
1836
+ children: value
1837
+ }
1838
+ )
1839
+ ] });
1342
1840
  });
1343
1841
  CodeBlock.displayName = "CodeBlock";
1344
1842
  var highlightStyle = {
@@ -1599,843 +2097,290 @@ var highlightStyle = {
1599
2097
  color: "#ce9178"
1600
2098
  },
1601
2099
  'code[class*="language-css"]': {
1602
- color: "#ce9178"
1603
- },
1604
- 'pre[class*="language-html"]': {
1605
- color: "#d4d4d4"
1606
- },
1607
- 'code[class*="language-html"]': {
1608
- color: "#d4d4d4"
1609
- },
1610
- ".language-regex .token.anchor": {
1611
- color: "#dcdcaa"
1612
- },
1613
- ".language-html .token.punctuation": {
1614
- color: "#808080"
1615
- },
1616
- 'pre[class*="language-"] > code[class*="language-"]': {
1617
- position: "relative",
1618
- zIndex: "1"
2100
+ color: "#ce9178"
1619
2101
  },
1620
- ".line-highlight.line-highlight": {
1621
- background: "#f7ebc6",
1622
- boxShadow: "inset 5px 0 0 #f7d87c",
1623
- zIndex: "0"
1624
- }
1625
- };
1626
-
1627
- // src/components/chat/Markdown.tsx
1628
- var import_remark_gfm = __toESM(require("remark-gfm"));
1629
- var import_remark_math = __toESM(require("remark-math"));
1630
- var import_jsx_runtime15 = require("react/jsx-runtime");
1631
- var MemoizedReactMarkdown = (0, import_react8.memo)(
1632
- import_react_markdown.default,
1633
- (prevProps, nextProps) => prevProps.children === nextProps.children && prevProps.className === nextProps.className
1634
- );
1635
- var Markdown = ({ content }) => {
1636
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "copilotKitMarkdown", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(MemoizedReactMarkdown, { components, remarkPlugins: [import_remark_gfm.default, import_remark_math.default], children: content }) });
1637
- };
1638
- var components = {
1639
- p({ children }) {
1640
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { children });
2102
+ 'pre[class*="language-html"]': {
2103
+ color: "#d4d4d4"
1641
2104
  },
1642
- a(_a) {
1643
- var _b = _a, { children } = _b, props = __objRest(_b, ["children"]);
1644
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1645
- "a",
1646
- __spreadProps(__spreadValues({
1647
- style: { color: "blue", textDecoration: "underline" }
1648
- }, props), {
1649
- target: "_blank",
1650
- rel: "noopener noreferrer",
1651
- children
1652
- })
1653
- );
2105
+ 'code[class*="language-html"]': {
2106
+ color: "#d4d4d4"
1654
2107
  },
1655
- code(_c) {
1656
- var _d = _c, { children, className, inline } = _d, props = __objRest(_d, ["children", "className", "inline"]);
1657
- if (children.length) {
1658
- if (children[0] == "\u258D") {
1659
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1660
- "span",
1661
- {
1662
- style: {
1663
- animation: "pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite",
1664
- marginTop: "0.25rem"
1665
- },
1666
- children: "\u258D"
1667
- }
1668
- );
1669
- }
1670
- children[0] = children[0].replace("`\u258D`", "\u258D");
1671
- }
1672
- const match = /language-(\w+)/.exec(className || "");
1673
- if (inline) {
1674
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("code", __spreadProps(__spreadValues({ className }, props), { children }));
1675
- }
1676
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1677
- CodeBlock,
1678
- __spreadValues({
1679
- language: match && match[1] || "",
1680
- value: String(children).replace(/\n$/, "")
1681
- }, props),
1682
- Math.random()
1683
- );
1684
- }
1685
- };
1686
-
1687
- // src/components/chat/messages/AssistantMessage.tsx
1688
- var import_jsx_runtime16 = require("react/jsx-runtime");
1689
- var AssistantMessage = (props) => {
1690
- const { icons } = useChatContext();
1691
- const { message, isLoading, subComponent } = props;
1692
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_jsx_runtime16.Fragment, { children: [
1693
- (message || isLoading) && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "copilotKitMessage copilotKitAssistantMessage", children: [
1694
- message && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Markdown, { content: message || "" }),
1695
- isLoading && icons.spinnerIcon
1696
- ] }),
1697
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: { marginBottom: "0.5rem" }, children: subComponent })
1698
- ] });
1699
- };
1700
-
1701
- // src/components/chat/messages/UserMessage.tsx
1702
- var import_jsx_runtime17 = require("react/jsx-runtime");
1703
- var UserMessage = (props) => {
1704
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "copilotKitMessage copilotKitUserMessage", children: props.message });
1705
- };
1706
-
1707
- // src/components/chat/Suggestion.tsx
1708
- var import_react_core6 = require("@copilotkit/react-core");
1709
- var import_shared = require("@copilotkit/shared");
1710
- var import_runtime_client_gql3 = require("@copilotkit/runtime-client-gql");
1711
- var import_jsx_runtime18 = require("react/jsx-runtime");
1712
- function Suggestion({ title, message, onClick, partial, className }) {
1713
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
1714
- "button",
1715
- {
1716
- disabled: partial,
1717
- onClick: (e) => {
1718
- e.preventDefault();
1719
- onClick(message);
1720
- },
1721
- className: className || "suggestion",
1722
- "data-test-id": "suggestion",
1723
- children: [
1724
- partial && SmallSpinnerIcon,
1725
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { children: title })
1726
- ]
1727
- }
1728
- );
1729
- }
1730
- var reloadSuggestions = (context, chatSuggestionConfiguration, setCurrentSuggestions, abortControllerRef) => __async(void 0, null, function* () {
1731
- const abortController = abortControllerRef.current;
1732
- const tools = JSON.stringify(
1733
- Object.values(context.actions).map((action) => ({
1734
- name: action.name,
1735
- description: action.description,
1736
- jsonSchema: JSON.stringify((0, import_shared.actionParametersToJsonSchema)(action.parameters))
1737
- }))
1738
- );
1739
- const allSuggestions = [];
1740
- for (const config of Object.values(chatSuggestionConfiguration)) {
1741
- try {
1742
- const numOfSuggestionsInstructions = config.minSuggestions === 0 ? `Produce up to ${config.maxSuggestions} suggestions. If there are no highly relevant suggestions you can think of, provide an empty array.` : `Produce between ${config.minSuggestions} and ${config.maxSuggestions} suggestions.`;
1743
- const result = yield (0, import_react_core6.extract)({
1744
- context,
1745
- instructions: "Suggest what the user could say next. Provide clear, highly relevant suggestions. Do not literally suggest function calls. ",
1746
- data: config.instructions + "\n\n" + numOfSuggestionsInstructions + "\n\nAvailable tools: " + tools + "\n\n",
1747
- requestType: import_runtime_client_gql3.CopilotRequestType.Task,
1748
- parameters: [
1749
- {
1750
- name: "suggestions",
1751
- type: "object[]",
1752
- attributes: [
1753
- {
1754
- name: "title",
1755
- description: "The title of the suggestion. This is shown as a button and should be short.",
1756
- type: "string"
1757
- },
1758
- {
1759
- name: "message",
1760
- description: "The message to send when the suggestion is clicked. This should be a clear, complete sentence and will be sent as an instruction to the AI.",
1761
- type: "string"
1762
- }
1763
- ]
1764
- }
1765
- ],
1766
- include: {
1767
- messages: true,
1768
- readable: true
1769
- },
1770
- abortSignal: abortController == null ? void 0 : abortController.signal,
1771
- stream: ({ status, args }) => {
1772
- const suggestions = args.suggestions || [];
1773
- const newSuggestions = [];
1774
- for (let i = 0; i < suggestions.length; i++) {
1775
- if (config.maxSuggestions !== void 0 && i >= config.maxSuggestions) {
1776
- break;
1777
- }
1778
- const { title, message } = suggestions[i];
1779
- const partial = i == suggestions.length - 1 && status !== "complete";
1780
- newSuggestions.push({
1781
- title,
1782
- message,
1783
- partial,
1784
- className: config.className
1785
- });
1786
- }
1787
- setCurrentSuggestions([...allSuggestions, ...newSuggestions]);
1788
- }
1789
- });
1790
- allSuggestions.push(...result.suggestions);
1791
- } catch (error) {
1792
- console.error("Error loading suggestions", error);
1793
- }
1794
- }
1795
- if (abortControllerRef.current === abortController) {
1796
- abortControllerRef.current = null;
1797
- }
1798
- });
1799
-
1800
- // src/components/chat/Chat.tsx
1801
- var import_react12 = __toESM(require("react"));
1802
- var import_react_core9 = require("@copilotkit/react-core");
1803
- var import_runtime_client_gql4 = require("@copilotkit/runtime-client-gql");
1804
- var import_shared3 = require("@copilotkit/shared");
1805
-
1806
- // src/components/dev-console/utils.ts
1807
- var import_react_core7 = require("@copilotkit/react-core");
1808
- function shouldShowDevConsole(showDevConsole) {
1809
- if (typeof showDevConsole === "boolean") {
1810
- return showDevConsole;
1811
- }
1812
- return getHostname() === "localhost" || getHostname() === "127.0.0.1" || getHostname() === "0.0.0.0" || getHostname() === "::1";
1813
- }
1814
- function getHostname() {
1815
- if (typeof window !== "undefined" && window.location) {
1816
- return window.location.hostname;
1817
- }
1818
- return "";
1819
- }
1820
- function getPublishedCopilotKitVersion(current, forceCheck = false) {
1821
- return __async(this, null, function* () {
1822
- const LOCAL_STORAGE_KEY = "__copilotkit_version_check__";
1823
- const serializedVersion = localStorage.getItem(LOCAL_STORAGE_KEY);
1824
- if (serializedVersion && !forceCheck) {
1825
- try {
1826
- const parsedVersion = JSON.parse(serializedVersion);
1827
- const oneHour = 60 * 60 * 1e3;
1828
- const now = (/* @__PURE__ */ new Date()).getTime();
1829
- if (parsedVersion.current === current && now - new Date(parsedVersion.lastChecked).getTime() < oneHour) {
1830
- return parsedVersion;
1831
- }
1832
- } catch (error) {
1833
- console.error("Failed to parse CopilotKitVersion from localStorage", error);
1834
- }
1835
- }
1836
- try {
1837
- const response = yield fetch("https://api.cloud.copilotkit.ai/check-for-updates", {
1838
- method: "POST",
1839
- headers: {
1840
- "Content-Type": "application/json"
1841
- },
1842
- body: JSON.stringify({
1843
- packages: [
1844
- {
1845
- packageName: "@copilotkit/shared",
1846
- packageVersion: current
1847
- }
1848
- ]
1849
- })
1850
- });
1851
- const data = yield response.json();
1852
- const version = {
1853
- current,
1854
- lastChecked: (/* @__PURE__ */ new Date()).getTime(),
1855
- latest: data.packages[0].latestVersion,
1856
- severity: data.packages[0].severity,
1857
- advisory: data.packages[0].advisory || null
1858
- };
1859
- localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(version));
1860
- return version;
1861
- } catch (error) {
1862
- console.error("Failed to check for updates", error);
1863
- throw error;
1864
- }
1865
- });
1866
- }
1867
- function logReadables(context) {
1868
- console.log("%cCurrent Readables:", "font-size: 16px; font-weight: bold;");
1869
- const readables = context.getContextString([], import_react_core7.defaultCopilotContextCategories).trim();
1870
- if (readables.length === 0) {
1871
- console.log("No readables found");
1872
- return;
1873
- }
1874
- console.log(readables);
1875
- }
1876
- function logActions(context) {
1877
- console.log("%cCurrent Actions:", "font-size: 16px; font-weight: bold;");
1878
- if (Object.values(context.actions).length === 0) {
1879
- console.log("No actions found");
1880
- return;
1881
- }
1882
- for (const action of Object.values(context.actions)) {
1883
- console.group(action.name);
1884
- console.log("name", action.name);
1885
- console.log("description", action.description);
1886
- console.log("parameters", action.parameters);
1887
- console.groupEnd();
1888
- }
1889
- }
1890
- function logMessages(context) {
1891
- console.log("%cCurrent Messages:", "font-size: 16px; font-weight: bold;");
1892
- if (context.messages.length === 0) {
1893
- console.log("No messages found");
1894
- return;
2108
+ ".language-regex .token.anchor": {
2109
+ color: "#dcdcaa"
2110
+ },
2111
+ ".language-html .token.punctuation": {
2112
+ color: "#808080"
2113
+ },
2114
+ 'pre[class*="language-"] > code[class*="language-"]': {
2115
+ position: "relative",
2116
+ zIndex: "1"
2117
+ },
2118
+ ".line-highlight.line-highlight": {
2119
+ background: "#f7ebc6",
2120
+ boxShadow: "inset 5px 0 0 #f7d87c",
2121
+ zIndex: "0"
1895
2122
  }
1896
- const tableData = context.messages.map((message) => {
1897
- if (message.isTextMessage()) {
1898
- return {
1899
- id: message.id,
1900
- type: "TextMessage",
1901
- role: message.role,
1902
- name: void 0,
1903
- scope: void 0,
1904
- content: message.content
1905
- };
1906
- } else if (message.isActionExecutionMessage()) {
1907
- return {
1908
- id: message.id,
1909
- type: "ActionExecutionMessage",
1910
- role: void 0,
1911
- name: message.name,
1912
- scope: message.parentMessageId,
1913
- content: message.arguments
1914
- };
1915
- } else if (message.isResultMessage()) {
1916
- return {
1917
- id: message.id,
1918
- type: "ResultMessage",
1919
- role: void 0,
1920
- name: message.actionName,
1921
- scope: message.actionExecutionId,
1922
- content: message.result
1923
- };
1924
- } else if (message.isAgentStateMessage()) {
1925
- return {
1926
- id: message.id,
1927
- type: `AgentStateMessage (running: ${message.running})`,
1928
- role: message.role,
1929
- name: void 0,
1930
- scope: message.threadId,
1931
- content: message.state
1932
- };
1933
- }
1934
- });
1935
- console.table(tableData);
1936
- }
1937
-
1938
- // src/components/dev-console/console.tsx
1939
- var import_react_core8 = require("@copilotkit/react-core");
1940
- var import_react10 = require("react");
2123
+ };
1941
2124
 
1942
- // src/components/dev-console/icons.tsx
2125
+ // src/components/chat/Markdown.tsx
2126
+ var import_remark_gfm = __toESM(require("remark-gfm"));
2127
+ var import_remark_math = __toESM(require("remark-math"));
1943
2128
  var import_jsx_runtime19 = require("react/jsx-runtime");
1944
- var ExclamationMarkTriangleIcon = /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1945
- "svg",
1946
- {
1947
- width: "13.3967723px",
1948
- height: "12px",
1949
- viewBox: "0 0 13.3967723 12",
1950
- version: "1.1",
1951
- xmlns: "http://www.w3.org/2000/svg",
1952
- children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("g", { id: "Page-1", stroke: "none", strokeWidth: "1", fill: "none", fillRule: "evenodd", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("g", { id: "exclamation-triangle", fill: "#CD2121", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1953
- "path",
1954
- {
1955
- 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",
1956
- id: "Shape"
1957
- }
1958
- ) }) })
1959
- }
1960
- );
1961
- var ExclamationMarkIcon = /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1962
- "svg",
1963
- {
1964
- width: "14px",
1965
- height: "14px",
1966
- viewBox: "0 0 14 14",
1967
- version: "1.1",
1968
- xmlns: "http://www.w3.org/2000/svg",
1969
- children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("g", { id: "Page-1", stroke: "none", strokeWidth: "1", fill: "none", fillRule: "evenodd", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("g", { id: "exclamation-circle", fill: "#EC662C", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1970
- "path",
1971
- {
1972
- 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",
1973
- id: "Shape"
1974
- }
1975
- ) }) })
1976
- }
2129
+ var MemoizedReactMarkdown = (0, import_react11.memo)(
2130
+ import_react_markdown.default,
2131
+ (prevProps, nextProps) => prevProps.children === nextProps.children && prevProps.className === nextProps.className
1977
2132
  );
1978
- var ChevronDownIcon = /* @__PURE__ */ (0, import_jsx_runtime19.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_runtime19.jsx)("g", { id: "Page-1", stroke: "none", strokeWidth: "1", fill: "none", fillRule: "evenodd", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("g", { id: "Group", fill: "#000000", fillRule: "nonzero", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1979
- "path",
1980
- {
1981
- 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",
1982
- id: "Path"
1983
- }
1984
- ) }) }) });
1985
- var CheckIcon2 = /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1986
- "svg",
1987
- {
1988
- width: "14px",
1989
- height: "14px",
1990
- viewBox: "0 0 14 14",
1991
- version: "1.1",
1992
- xmlns: "http://www.w3.org/2000/svg",
1993
- children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("g", { id: "Page-1", stroke: "none", strokeWidth: "1", fill: "none", fillRule: "evenodd", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("g", { id: "Group-2", transform: "translate(-118, 0)", fill: "#1BC030", fillRule: "nonzero", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("g", { id: "Group", transform: "translate(118, 0)", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1994
- "path",
1995
- {
1996
- 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",
1997
- id: "Shape"
2133
+ var Markdown = ({ content }) => {
2134
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "copilotKitMarkdown", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(MemoizedReactMarkdown, { components, remarkPlugins: [import_remark_gfm.default, import_remark_math.default], children: content }) });
2135
+ };
2136
+ var components = {
2137
+ a(_a) {
2138
+ var _b = _a, { children } = _b, props = __objRest(_b, ["children"]);
2139
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2140
+ "a",
2141
+ __spreadProps(__spreadValues({
2142
+ style: { color: "blue", textDecoration: "underline" }
2143
+ }, props), {
2144
+ target: "_blank",
2145
+ rel: "noopener noreferrer",
2146
+ children
2147
+ })
2148
+ );
2149
+ },
2150
+ code(_c) {
2151
+ var _d = _c, { children, className, inline } = _d, props = __objRest(_d, ["children", "className", "inline"]);
2152
+ if (children.length) {
2153
+ if (children[0] == "\u258D") {
2154
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2155
+ "span",
2156
+ {
2157
+ style: {
2158
+ animation: "pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite",
2159
+ marginTop: "0.25rem"
2160
+ },
2161
+ children: "\u258D"
2162
+ }
2163
+ );
1998
2164
  }
1999
- ) }) }) })
2000
- }
2001
- );
2002
- var CopilotKitIcon = /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
2003
- "svg",
2004
- {
2005
- width: "33px",
2006
- height: "35px",
2007
- viewBox: "0 0 33 35",
2008
- version: "1.1",
2009
- xmlns: "http://www.w3.org/2000/svg",
2010
- children: [
2011
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("title", { children: "bd5c9079-929b-4d55-bdc9-16d1c8181b71" }),
2012
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("g", { id: "Page-1", stroke: "none", strokeWidth: "1", fill: "none", fillRule: "evenodd", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2013
- "image",
2014
- {
2015
- x: "0",
2016
- y: "0",
2017
- width: "33",
2018
- height: "35",
2019
- xlinkHref: "data:image/png;base64,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"
2020
- }
2021
- ) })
2022
- ]
2165
+ children[0] = children[0].replace("`\u258D`", "\u258D");
2166
+ }
2167
+ const match = /language-(\w+)/.exec(className || "");
2168
+ if (inline) {
2169
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("code", __spreadProps(__spreadValues({ className }, props), { children }));
2170
+ }
2171
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2172
+ CodeBlock,
2173
+ __spreadValues({
2174
+ language: match && match[1] || "",
2175
+ value: String(children).replace(/\n$/, "")
2176
+ }, props),
2177
+ Math.random()
2178
+ );
2023
2179
  }
2024
- );
2025
-
2026
- // src/components/dev-console/console.tsx
2027
- var import_react11 = require("@headlessui/react");
2028
- var import_shared2 = require("@copilotkit/shared");
2029
-
2030
- // src/components/help-modal/modal.tsx
2031
- var import_react9 = require("react");
2180
+ };
2032
2181
 
2033
- // src/components/help-modal/icons.tsx
2182
+ // src/components/chat/messages/AssistantMessage.tsx
2183
+ var import_react12 = require("react");
2034
2184
  var import_jsx_runtime20 = require("react/jsx-runtime");
2035
- var CloseIcon2 = () => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2036
- "svg",
2037
- {
2038
- xmlns: "http://www.w3.org/2000/svg",
2039
- fill: "none",
2040
- viewBox: "0 0 24 24",
2041
- strokeWidth: "1.5",
2042
- stroke: "currentColor",
2043
- width: "20",
2044
- height: "20",
2045
- children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 18L18 6M6 6l12 12" })
2046
- }
2047
- );
2048
- var LoadingSpinnerIcon = ({ color = "rgb(107 114 128)" }) => /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
2049
- "svg",
2050
- {
2051
- style: {
2052
- animation: "copilotKitSpinAnimation 1s linear infinite",
2053
- color
2054
- },
2055
- width: "24",
2056
- height: "24",
2057
- xmlns: "http://www.w3.org/2000/svg",
2058
- fill: "none",
2059
- viewBox: "0 0 24 24",
2060
- children: [
2061
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2062
- "circle",
2063
- {
2064
- style: { opacity: 0.25 },
2065
- cx: "12",
2066
- cy: "12",
2067
- r: "10",
2068
- stroke: "currentColor",
2069
- strokeWidth: "4"
2070
- }
2071
- ),
2072
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2073
- "path",
2074
- {
2075
- style: { opacity: 0.75 },
2076
- fill: "currentColor",
2077
- 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"
2078
- }
2079
- )
2080
- ]
2081
- }
2082
- );
2083
-
2084
- // src/components/help-modal/modal.tsx
2085
- var import_jsx_runtime21 = require("react/jsx-runtime");
2086
- function CopilotKitHelpModal() {
2087
- const [showHelpModal, setShowHelpModal] = (0, import_react9.useState)(false);
2088
- const [issueDescription, setIssueDescription] = (0, import_react9.useState)("");
2089
- const [email, setEmail] = (0, import_react9.useState)("");
2090
- const [emailError, setEmailError] = (0, import_react9.useState)("");
2091
- const [submitting, setSubmitting] = (0, import_react9.useState)(false);
2092
- const validateEmail = (email2) => {
2093
- const re = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
2094
- return re.test(email2);
2185
+ var AssistantMessage = (props) => {
2186
+ const { icons, labels } = useChatContext();
2187
+ const {
2188
+ message,
2189
+ isLoading,
2190
+ subComponent,
2191
+ onRegenerate,
2192
+ onCopy,
2193
+ onThumbsUp,
2194
+ onThumbsDown,
2195
+ isCurrentMessage
2196
+ } = props;
2197
+ const [copied, setCopied] = (0, import_react12.useState)(false);
2198
+ const handleCopy = () => {
2199
+ if (message && onCopy) {
2200
+ navigator.clipboard.writeText(message);
2201
+ setCopied(true);
2202
+ onCopy(message);
2203
+ setTimeout(() => setCopied(false), 2e3);
2204
+ } else if (message) {
2205
+ navigator.clipboard.writeText(message);
2206
+ setCopied(true);
2207
+ setTimeout(() => setCopied(false), 2e3);
2208
+ }
2095
2209
  };
2096
- const handleSubmit = (e) => __async(this, null, function* () {
2097
- e.preventDefault();
2098
- if ((email == null ? void 0 : email.length) > 0 && !validateEmail(email)) {
2099
- setEmailError("Please enter a valid email address");
2100
- return;
2210
+ const handleRegenerate = () => {
2211
+ if (onRegenerate) {
2212
+ onRegenerate();
2101
2213
  }
2102
- setSubmitting(true);
2103
- yield fetch("https://api.segment.io/v1/track", {
2104
- method: "POST",
2105
- headers: {
2106
- "Content-Type": "application/json"
2107
- },
2108
- body: JSON.stringify({
2109
- event: "oss.dev-console.help",
2110
- anonymousId: window.crypto.randomUUID(),
2111
- properties: { email, text: issueDescription },
2112
- writeKey: "q0gQqvGYyw9pNyhIocNzefSYKGO1aiwW"
2113
- })
2114
- });
2115
- setEmailError("");
2116
- setEmail("");
2117
- setIssueDescription("");
2118
- setSubmitting(false);
2119
- setShowHelpModal(false);
2120
- });
2121
- const HelpButton = () => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2122
- "button",
2123
- {
2124
- onClick: () => setShowHelpModal(true),
2125
- style: { width: "50px", height: "30px", marginRight: "0.25rem" },
2126
- className: "text-sm p-0 bg-transparent rounded border border-blue-500",
2127
- "aria-label": "Open Help",
2128
- children: "Help"
2214
+ };
2215
+ const handleThumbsUp = () => {
2216
+ if (onThumbsUp && message) {
2217
+ onThumbsUp(message);
2129
2218
  }
2130
- );
2131
- const submitButtonDisabled = (0, import_react9.useMemo)(
2132
- () => submitting || !!emailError || issueDescription == null || (issueDescription == null ? void 0 : issueDescription.length) == 0,
2133
- [submitting, emailError, issueDescription]
2134
- );
2135
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_jsx_runtime21.Fragment, { children: [
2136
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(HelpButton, {}),
2137
- showHelpModal && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2138
- "div",
2139
- {
2140
- className: "fixed inset-0 flex items-center justify-center p-4",
2141
- style: { backgroundColor: "rgba(11, 15, 26, 0.5)", zIndex: 99 },
2142
- children: /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "bg-white rounded-lg shadow-xl max-w-md w-full p-4 flex-col relative", children: [
2143
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2144
- "button",
2145
- {
2146
- className: "absolute text-gray-400 hover:text-gray-600 focus:outline-none",
2147
- style: { top: "10px", right: "10px" },
2148
- onClick: () => setShowHelpModal(false),
2149
- "aria-label": "Close",
2150
- children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(CloseIcon2, {})
2151
- }
2152
- ),
2153
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "w-full flex mb-6 justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("h2", { className: "text-2xl font-bold", children: "Help Options" }) }),
2154
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "space-y-4 mb-4", children: [
2155
- /* @__PURE__ */ (0, import_jsx_runtime21.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_runtime21.jsx)(
2156
- "a",
2157
- {
2158
- href: "https://docs.copilotkit.ai/coagents/troubleshooting/common-issues",
2159
- target: "_blank",
2160
- rel: "noopener noreferrer",
2161
- children: "Visit the Troubleshooting and FAQ section in the docs"
2162
- }
2163
- ) }),
2164
- /* @__PURE__ */ (0, import_jsx_runtime21.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_runtime21.jsx)(
2165
- "a",
2219
+ };
2220
+ const handleThumbsDown = () => {
2221
+ if (onThumbsDown && message) {
2222
+ onThumbsDown(message);
2223
+ }
2224
+ };
2225
+ const LoadingIcon = () => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { children: icons.activityIcon });
2226
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_jsx_runtime20.Fragment, { children: [
2227
+ (message || isLoading) && /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "copilotKitMessage copilotKitAssistantMessage", children: [
2228
+ message && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(Markdown, { content: message || "" }),
2229
+ isLoading && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(LoadingIcon, {}),
2230
+ message && !isLoading && /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
2231
+ "div",
2232
+ {
2233
+ className: `copilotKitMessageControls ${isCurrentMessage ? "currentMessage" : ""}`,
2234
+ children: [
2235
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2236
+ "button",
2166
2237
  {
2167
- href: "https://go.copilotkit.ai/dev-console-support-discord",
2168
- target: "_blank",
2169
- rel: "noopener noreferrer",
2170
- children: "Go to Discord Support Channel (Community Support)"
2238
+ className: "copilotKitMessageControlButton",
2239
+ onClick: handleRegenerate,
2240
+ "aria-label": labels.regenerateResponse,
2241
+ title: labels.regenerateResponse,
2242
+ children: RegenerateIcon
2171
2243
  }
2172
- ) }),
2173
- /* @__PURE__ */ (0, import_jsx_runtime21.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_runtime21.jsx)(
2174
- "a",
2244
+ ),
2245
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2246
+ "button",
2175
2247
  {
2176
- href: "https://go.copilotkit.ai/dev-console-support-slack",
2177
- target: "_blank",
2178
- rel: "noopener noreferrer",
2179
- children: "Apply for Priority Direct Slack Support"
2248
+ className: "copilotKitMessageControlButton",
2249
+ onClick: handleCopy,
2250
+ "aria-label": labels.copyToClipboard,
2251
+ title: labels.copyToClipboard,
2252
+ children: copied ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { style: { fontSize: "10px", fontWeight: "bold" }, children: "\u2713" }) : CopyIcon
2180
2253
  }
2181
- ) })
2182
- ] }),
2183
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("form", { onSubmit: handleSubmit, className: "flex flex-col space-y-2", children: [
2184
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { children: [
2185
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("label", { htmlFor: "feedback", className: "block text-sm font-medium text-gray-700 mb-1", children: "Let us know what your issue is:" }),
2186
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2187
- "textarea",
2188
- {
2189
- id: "feedback",
2190
- rows: 4,
2191
- className: "w-full px-3 py-2 text-gray-700 border rounded-lg focus:outline-none focus:border-blue-500",
2192
- placeholder: "A Loom link / screen recording is always great!",
2193
- onChange: (e) => setIssueDescription(e.target.value),
2194
- value: issueDescription,
2195
- required: true
2196
- }
2197
- )
2198
- ] }),
2199
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { children: [
2200
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("label", { htmlFor: "email", className: "block text-sm font-medium text-gray-700 mb-1", children: "Email (optional):" }),
2201
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2202
- "input",
2203
- {
2204
- type: "email",
2205
- id: "email",
2206
- className: `w-full px-3 py-2 text-gray-700 border rounded-lg focus:outline-none focus:border-blue-500 ${emailError ? "border-red-500" : ""}`,
2207
- placeholder: "Enter your email for follow-up",
2208
- onChange: (e) => {
2209
- setEmail(e.target.value);
2210
- setEmailError("");
2211
- },
2212
- value: email
2213
- }
2214
- ),
2215
- emailError && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("p", { className: "text-red-500 text-sm mt-1", children: emailError })
2216
- ] }),
2217
- /* @__PURE__ */ (0, import_jsx_runtime21.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_runtime21.jsx)(
2254
+ ),
2255
+ onThumbsUp && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2218
2256
  "button",
2219
2257
  {
2220
- type: "submit",
2221
- onClick: handleSubmit,
2222
- disabled: submitButtonDisabled,
2223
- style: submitButtonDisabled ? { backgroundColor: "rgb(216, 216, 216)", color: "rgb(129, 129, 129)" } : void 0,
2224
- 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",
2225
- children: submitting ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(LoadingSpinnerIcon, { color: "white" }) : "Submit"
2258
+ className: "copilotKitMessageControlButton",
2259
+ onClick: handleThumbsUp,
2260
+ "aria-label": labels.thumbsUp,
2261
+ title: labels.thumbsUp,
2262
+ children: ThumbsUpIcon
2226
2263
  }
2227
- ) })
2228
- ] })
2229
- ] })
2230
- }
2231
- )
2264
+ ),
2265
+ onThumbsDown && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2266
+ "button",
2267
+ {
2268
+ className: "copilotKitMessageControlButton",
2269
+ onClick: handleThumbsDown,
2270
+ "aria-label": labels.thumbsDown,
2271
+ title: labels.thumbsDown,
2272
+ children: ThumbsDownIcon
2273
+ }
2274
+ )
2275
+ ]
2276
+ }
2277
+ )
2278
+ ] }),
2279
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { style: { marginBottom: "0.5rem" }, children: subComponent })
2232
2280
  ] });
2233
- }
2281
+ };
2234
2282
 
2235
- // src/components/dev-console/console.tsx
2283
+ // src/components/chat/messages/UserMessage.tsx
2284
+ var import_jsx_runtime21 = require("react/jsx-runtime");
2285
+ var UserMessage = (props) => {
2286
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "copilotKitMessage copilotKitUserMessage", children: props.message });
2287
+ };
2288
+
2289
+ // src/components/chat/Suggestion.tsx
2290
+ var import_react_core8 = require("@copilotkit/react-core");
2291
+ var import_shared2 = require("@copilotkit/shared");
2292
+ var import_runtime_client_gql3 = require("@copilotkit/runtime-client-gql");
2236
2293
  var import_jsx_runtime22 = require("react/jsx-runtime");
2237
- function CopilotDevConsole() {
2238
- const currentVersion = import_shared2.COPILOTKIT_VERSION;
2239
- const context = (0, import_react_core8.useCopilotContext)();
2240
- const [showDevConsole, setShowDevConsole] = (0, import_react10.useState)(false);
2241
- (0, import_react10.useEffect)(() => {
2242
- setShowDevConsole(shouldShowDevConsole(context.showDevConsole));
2243
- }, [context.showDevConsole]);
2244
- const dontRunTwiceInDevMode = (0, import_react10.useRef)(false);
2245
- const [versionStatus, setVersionStatus] = (0, import_react10.useState)("unknown");
2246
- const [latestVersion, setLatestVersion] = (0, import_react10.useState)("");
2247
- const consoleRef = (0, import_react10.useRef)(null);
2248
- const [debugButtonMode, setDebugButtonMode] = (0, import_react10.useState)("full");
2249
- const checkForUpdates = (force = false) => {
2250
- setVersionStatus("checking");
2251
- getPublishedCopilotKitVersion(currentVersion, force).then((v) => {
2252
- setLatestVersion(v.latest);
2253
- let versionOk = false;
2254
- if (v.current === v.latest) {
2255
- versionOk = true;
2256
- } else if (/[a-zA-Z]/.test(v.current)) {
2257
- versionOk = true;
2258
- }
2259
- if (versionOk) {
2260
- setVersionStatus("latest");
2261
- } else if (v.severity !== "low") {
2262
- setVersionStatus("outdated");
2263
- } else {
2264
- setVersionStatus("update-available");
2265
- }
2266
- }).catch((e) => {
2267
- console.error(e);
2268
- setVersionStatus("unknown");
2269
- });
2270
- };
2271
- (0, import_react10.useEffect)(() => {
2272
- if (dontRunTwiceInDevMode.current === true) {
2273
- return;
2274
- }
2275
- dontRunTwiceInDevMode.current = true;
2276
- checkForUpdates();
2277
- }, []);
2278
- (0, import_react10.useEffect)(() => {
2279
- const handleResize = (entries) => {
2280
- for (let entry of entries) {
2281
- if (entry.target === consoleRef.current) {
2282
- const width = entry.contentRect.width;
2283
- if (width < 400) {
2284
- setDebugButtonMode("compact");
2285
- } else {
2286
- setDebugButtonMode("full");
2287
- }
2288
- }
2289
- }
2290
- };
2291
- const observer = new ResizeObserver(handleResize);
2292
- if (consoleRef.current) {
2293
- observer.observe(consoleRef.current);
2294
- const initialWidth = consoleRef.current.getBoundingClientRect().width;
2295
- if (initialWidth < 400) {
2296
- setDebugButtonMode("compact");
2297
- } else {
2298
- setDebugButtonMode("full");
2299
- }
2300
- }
2301
- return () => {
2302
- if (consoleRef.current) {
2303
- observer.unobserve(consoleRef.current);
2304
- }
2305
- };
2306
- }, [consoleRef.current]);
2307
- if (!showDevConsole) {
2308
- return null;
2309
- }
2310
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
2311
- "div",
2294
+ function Suggestion({ title, message, onClick, partial, className }) {
2295
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2296
+ "button",
2312
2297
  {
2313
- ref: consoleRef,
2314
- className: "copilotKitDevConsole " + (versionStatus === "update-available" ? "copilotKitDevConsoleUpgrade" : "") + (versionStatus === "outdated" ? "copilotKitDevConsoleWarnOutdated" : ""),
2315
- children: [
2316
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "copilotKitDevConsoleLogo", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("a", { href: "https://copilotkit.ai", target: "_blank", children: CopilotKitIcon }) }),
2317
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2318
- VersionInfo,
2298
+ disabled: partial,
2299
+ onClick: (e) => {
2300
+ e.preventDefault();
2301
+ onClick(message);
2302
+ },
2303
+ className: className || (partial ? "suggestion loading" : "suggestion"),
2304
+ "data-test-id": "suggestion",
2305
+ children: partial ? SmallSpinnerIcon : /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { children: title })
2306
+ }
2307
+ );
2308
+ }
2309
+ var reloadSuggestions = (context, chatSuggestionConfiguration, setCurrentSuggestions, abortControllerRef) => __async(void 0, null, function* () {
2310
+ const abortController = abortControllerRef.current;
2311
+ const tools = JSON.stringify(
2312
+ Object.values(context.actions).map((action) => ({
2313
+ name: action.name,
2314
+ description: action.description,
2315
+ jsonSchema: JSON.stringify((0, import_shared2.actionParametersToJsonSchema)(action.parameters))
2316
+ }))
2317
+ );
2318
+ const allSuggestions = [];
2319
+ for (const config of Object.values(chatSuggestionConfiguration)) {
2320
+ try {
2321
+ const numOfSuggestionsInstructions = config.minSuggestions === 0 ? `Produce up to ${config.maxSuggestions} suggestions. If there are no highly relevant suggestions you can think of, provide an empty array.` : `Produce between ${config.minSuggestions} and ${config.maxSuggestions} suggestions.`;
2322
+ const result = yield (0, import_react_core8.extract)({
2323
+ context,
2324
+ instructions: "Suggest what the user could say next. Provide clear, highly relevant suggestions. Do not literally suggest function calls. ",
2325
+ data: config.instructions + "\n\n" + numOfSuggestionsInstructions + "\n\nAvailable tools: " + tools + "\n\n",
2326
+ requestType: import_runtime_client_gql3.CopilotRequestType.Task,
2327
+ parameters: [
2319
2328
  {
2320
- showDevConsole: context.showDevConsole,
2321
- versionStatus,
2322
- currentVersion,
2323
- latestVersion
2329
+ name: "suggestions",
2330
+ type: "object[]",
2331
+ attributes: [
2332
+ {
2333
+ name: "title",
2334
+ description: "The title of the suggestion. This is shown as a button and should be short.",
2335
+ type: "string"
2336
+ },
2337
+ {
2338
+ name: "message",
2339
+ description: "The message to send when the suggestion is clicked. This should be a clear, complete sentence and will be sent as an instruction to the AI.",
2340
+ type: "string"
2341
+ }
2342
+ ]
2324
2343
  }
2325
- ),
2326
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(CopilotKitHelpModal, {}),
2327
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2328
- DebugMenuButton,
2329
- {
2330
- setShowDevConsole,
2331
- checkForUpdates,
2332
- mode: debugButtonMode
2344
+ ],
2345
+ include: {
2346
+ messages: true,
2347
+ readable: true
2348
+ },
2349
+ abortSignal: abortController == null ? void 0 : abortController.signal,
2350
+ stream: ({ status, args }) => {
2351
+ const suggestions = args.suggestions || [];
2352
+ const newSuggestions = [];
2353
+ for (let i = 0; i < suggestions.length; i++) {
2354
+ if (config.maxSuggestions !== void 0 && i >= config.maxSuggestions) {
2355
+ break;
2356
+ }
2357
+ const { title, message } = suggestions[i];
2358
+ const partial = i == suggestions.length - 1 && status !== "complete";
2359
+ newSuggestions.push({
2360
+ title,
2361
+ message,
2362
+ partial,
2363
+ className: config.className
2364
+ });
2333
2365
  }
2334
- )
2335
- ]
2366
+ setCurrentSuggestions([...allSuggestions, ...newSuggestions]);
2367
+ }
2368
+ });
2369
+ allSuggestions.push(...result.suggestions);
2370
+ } catch (error) {
2371
+ console.error("Error loading suggestions", error);
2336
2372
  }
2337
- );
2338
- }
2339
- function VersionInfo({
2340
- showDevConsole,
2341
- versionStatus,
2342
- currentVersion,
2343
- latestVersion
2344
- }) {
2345
- const [copyStatus, setCopyStatus] = (0, import_react10.useState)("");
2346
- let versionLabel = "";
2347
- let versionIcon = "";
2348
- let currentVersionLabel = currentVersion;
2349
- if (versionStatus === "latest") {
2350
- versionLabel = "latest";
2351
- versionIcon = CheckIcon2;
2352
- } else if (versionStatus === "checking") {
2353
- versionLabel = "checking";
2354
- versionIcon = SmallSpinnerIcon;
2355
- } else if (versionStatus === "update-available") {
2356
- versionLabel = "update available";
2357
- versionIcon = ExclamationMarkIcon;
2358
- currentVersionLabel = `${currentVersion} \u2192 ${latestVersion}`;
2359
- } else if (versionStatus === "outdated") {
2360
- versionLabel = "outdated";
2361
- versionIcon = ExclamationMarkTriangleIcon;
2362
- currentVersionLabel = `${currentVersion} \u2192 ${latestVersion}`;
2363
2373
  }
2364
- let asideLabel = "";
2365
- if (showDevConsole === "auto") {
2366
- asideLabel = "(localhost only)";
2367
- } else if (showDevConsole === true) {
2368
- asideLabel = "(always on)";
2374
+ if (abortControllerRef.current === abortController) {
2375
+ abortControllerRef.current = null;
2369
2376
  }
2370
- const installCommand = [
2371
- `npm install`,
2372
- `@copilotkit/react-core@${latestVersion}`,
2373
- `@copilotkit/react-ui@${latestVersion}`,
2374
- `@copilotkit/react-textarea@${latestVersion}`,
2375
- `&& npm install @copilotkit/runtime@${latestVersion}`
2376
- ].join(" ");
2377
- const handleCopyClick = () => {
2378
- navigator.clipboard.writeText(installCommand.trim()).then(() => {
2379
- setCopyStatus("Command copied to clipboard!");
2380
- setTimeout(() => setCopyStatus(""), 1e3);
2381
- });
2382
- };
2383
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "copilotKitVersionInfo", children: [
2384
- /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("header", { children: [
2385
- "COPILOTKIT DEV CONSOLE",
2386
- showDevConsole === "auto" && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("aside", { children: asideLabel })
2387
- ] }),
2388
- /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("section", { children: [
2389
- "Version: ",
2390
- versionLabel,
2391
- " (",
2392
- currentVersionLabel,
2393
- ") ",
2394
- versionIcon
2395
- ] }),
2396
- (versionStatus === "update-available" || versionStatus === "outdated") && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("footer", { children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("button", { onClick: handleCopyClick, children: copyStatus || installCommand }) })
2397
- ] });
2398
- }
2399
- function DebugMenuButton({
2400
- setShowDevConsole,
2401
- checkForUpdates,
2402
- mode
2403
- }) {
2404
- const context = (0, import_react_core8.useCopilotContext)();
2405
- const messagesContext = (0, import_react_core8.useCopilotMessagesContext)();
2406
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "bg-black top-24 w-52 text-right", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_react11.Menu, { children: [
2407
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_react11.MenuButton, { className: `copilotKitDebugMenuButton ${mode === "compact" ? "compact" : ""}`, children: mode == "compact" ? "Debug" : /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_jsx_runtime22.Fragment, { children: [
2408
- "Debug ",
2409
- ChevronDownIcon
2410
- ] }) }),
2411
- /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
2412
- import_react11.MenuItems,
2413
- {
2414
- transition: true,
2415
- anchor: "bottom end",
2416
- className: "copilotKitDebugMenu",
2417
- style: { zIndex: 40 },
2418
- children: [
2419
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_react11.MenuItem, { children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("button", { className: "copilotKitDebugMenuItem", onClick: () => logReadables(context), children: "Log Readables" }) }),
2420
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_react11.MenuItem, { children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("button", { className: "copilotKitDebugMenuItem", onClick: () => logActions(context), children: "Log Actions" }) }),
2421
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_react11.MenuItem, { children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2422
- "button",
2423
- {
2424
- className: "copilotKitDebugMenuItem",
2425
- onClick: () => logMessages(messagesContext),
2426
- children: "Log Messages"
2427
- }
2428
- ) }),
2429
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_react11.MenuItem, { children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("button", { className: "copilotKitDebugMenuItem", onClick: () => checkForUpdates(true), children: "Check for Updates" }) }),
2430
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("hr", {}),
2431
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_react11.MenuItem, { children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("button", { className: "copilotKitDebugMenuItem", onClick: () => setShowDevConsole(false), children: "Hide Dev Console" }) })
2432
- ]
2433
- }
2434
- )
2435
- ] }) });
2436
- }
2377
+ });
2437
2378
 
2438
2379
  // src/components/chat/Chat.tsx
2380
+ var import_react13 = __toESM(require("react"));
2381
+ var import_react_core9 = require("@copilotkit/react-core");
2382
+ var import_runtime_client_gql4 = require("@copilotkit/runtime-client-gql");
2383
+ var import_shared3 = require("@copilotkit/shared");
2439
2384
  var import_react_core10 = require("@copilotkit/react-core");
2440
2385
  var import_jsx_runtime23 = require("react/jsx-runtime");
2441
2386
  function CopilotChat({
@@ -2446,6 +2391,10 @@ function CopilotChat({
2446
2391
  onInProgress,
2447
2392
  onStopGeneration,
2448
2393
  onReloadMessages,
2394
+ onRegenerate,
2395
+ onCopy,
2396
+ onThumbsUp,
2397
+ onThumbsDown,
2449
2398
  Messages: Messages2 = Messages,
2450
2399
  RenderTextMessage: RenderTextMessage2 = RenderTextMessage,
2451
2400
  RenderActionExecutionMessage: RenderActionExecutionMessage2 = RenderActionExecutionMessage,
@@ -2460,7 +2409,7 @@ function CopilotChat({
2460
2409
  UserMessage: UserMessage2 = UserMessage
2461
2410
  }) {
2462
2411
  const { additionalInstructions, setChatInstructions } = (0, import_react_core9.useCopilotContext)();
2463
- (0, import_react12.useEffect)(() => {
2412
+ (0, import_react13.useEffect)(() => {
2464
2413
  if (!(additionalInstructions == null ? void 0 : additionalInstructions.length)) {
2465
2414
  setChatInstructions(instructions || "");
2466
2415
  return;
@@ -2487,11 +2436,21 @@ function CopilotChat({
2487
2436
  onStopGeneration,
2488
2437
  onReloadMessages
2489
2438
  );
2490
- const chatContext = import_react12.default.useContext(ChatContext);
2439
+ const chatContext = import_react13.default.useContext(ChatContext);
2491
2440
  const isVisible = chatContext ? chatContext.open : true;
2441
+ const handleRegenerate = () => {
2442
+ if (onRegenerate) {
2443
+ onRegenerate();
2444
+ }
2445
+ reloadMessages();
2446
+ };
2447
+ const handleCopy = (message) => {
2448
+ if (onCopy) {
2449
+ onCopy(message);
2450
+ }
2451
+ };
2492
2452
  return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(WrappedCopilotChat, { icons, labels, className, children: [
2493
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(CopilotDevConsole, {}),
2494
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
2453
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2495
2454
  Messages2,
2496
2455
  {
2497
2456
  AssistantMessage: AssistantMessage2,
@@ -2502,32 +2461,32 @@ function CopilotChat({
2502
2461
  RenderResultMessage: RenderResultMessage2,
2503
2462
  messages: visibleMessages,
2504
2463
  inProgress: isLoading,
2505
- children: [
2506
- currentSuggestions.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { children: [
2507
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("h6", { children: "Suggested:" }),
2508
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "suggestions", children: currentSuggestions.map((suggestion, index) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2509
- Suggestion,
2510
- {
2511
- title: suggestion.title,
2512
- message: suggestion.message,
2513
- partial: suggestion.partial,
2514
- className: suggestion.className,
2515
- onClick: (message) => sendMessage(message)
2516
- },
2517
- index
2518
- )) })
2519
- ] }),
2520
- showResponseButton && visibleMessages.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2521
- ResponseButton2,
2522
- {
2523
- onClick: isLoading ? stopGeneration : reloadMessages,
2524
- inProgress: isLoading
2525
- }
2526
- )
2527
- ]
2464
+ onRegenerate: handleRegenerate,
2465
+ onCopy: handleCopy,
2466
+ onThumbsUp,
2467
+ onThumbsDown,
2468
+ children: currentSuggestions.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "suggestions", children: currentSuggestions.map((suggestion, index) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2469
+ Suggestion,
2470
+ {
2471
+ title: suggestion.title,
2472
+ message: suggestion.message,
2473
+ partial: suggestion.partial,
2474
+ className: suggestion.className,
2475
+ onClick: (message) => sendMessage(message)
2476
+ },
2477
+ index
2478
+ )) })
2528
2479
  }
2529
2480
  ),
2530
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Input2, { inProgress: isLoading, onSend: sendMessage, isVisible })
2481
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2482
+ Input2,
2483
+ {
2484
+ inProgress: isLoading,
2485
+ onSend: sendMessage,
2486
+ isVisible,
2487
+ onStop: stopGeneration
2488
+ }
2489
+ )
2531
2490
  ] });
2532
2491
  }
2533
2492
  function WrappedCopilotChat({
@@ -2536,7 +2495,7 @@ function WrappedCopilotChat({
2536
2495
  labels,
2537
2496
  className
2538
2497
  }) {
2539
- const chatContext = import_react12.default.useContext(ChatContext);
2498
+ const chatContext = import_react13.default.useContext(ChatContext);
2540
2499
  if (!chatContext) {
2541
2500
  return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(ChatContextProvider, { icons, labels, open: true, setOpen: () => {
2542
2501
  }, children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: `copilotKitChat ${className}`, children }) });
@@ -2557,9 +2516,9 @@ var useCopilotChatLogic = (makeSystemMessage, onInProgress, onSubmitMessage, onS
2557
2516
  id: (0, import_shared3.randomId)(),
2558
2517
  makeSystemMessage
2559
2518
  });
2560
- const [currentSuggestions, setCurrentSuggestions] = (0, import_react12.useState)([]);
2561
- const suggestionsAbortControllerRef = (0, import_react12.useRef)(null);
2562
- const debounceTimerRef = (0, import_react12.useRef)();
2519
+ const [currentSuggestions, setCurrentSuggestions] = (0, import_react13.useState)([]);
2520
+ const suggestionsAbortControllerRef = (0, import_react13.useRef)(null);
2521
+ const debounceTimerRef = (0, import_react13.useRef)();
2563
2522
  const abortSuggestions = () => {
2564
2523
  var _a2;
2565
2524
  (_a2 = suggestionsAbortControllerRef.current) == null ? void 0 : _a2.abort();
@@ -2568,7 +2527,7 @@ var useCopilotChatLogic = (makeSystemMessage, onInProgress, onSubmitMessage, onS
2568
2527
  const generalContext = (0, import_react_core9.useCopilotContext)();
2569
2528
  const messagesContext = (0, import_react_core9.useCopilotMessagesContext)();
2570
2529
  const context = __spreadValues(__spreadValues({}, generalContext), messagesContext);
2571
- (0, import_react12.useEffect)(() => {
2530
+ (0, import_react13.useEffect)(() => {
2572
2531
  onInProgress == null ? void 0 : onInProgress(isLoading);
2573
2532
  abortSuggestions();
2574
2533
  debounceTimerRef.current = setTimeout(
@@ -2729,7 +2688,7 @@ var CopilotModal = ({
2729
2688
  className,
2730
2689
  children
2731
2690
  }) => {
2732
- const [openState, setOpenState] = import_react13.default.useState(defaultOpen);
2691
+ const [openState, setOpenState] = import_react14.default.useState(defaultOpen);
2733
2692
  const setOpen = (open) => {
2734
2693
  onSetOpen == null ? void 0 : onSetOpen(open);
2735
2694
  setOpenState(open);
@@ -2780,13 +2739,13 @@ function CopilotPopup(props) {
2780
2739
  }
2781
2740
 
2782
2741
  // src/components/chat/Sidebar.tsx
2783
- var import_react14 = require("react");
2742
+ var import_react15 = require("react");
2784
2743
  var import_jsx_runtime26 = require("react/jsx-runtime");
2785
2744
  function CopilotSidebar(props) {
2786
2745
  props = __spreadProps(__spreadValues({}, props), {
2787
2746
  className: props.className ? props.className + " copilotKitSidebar" : "copilotKitSidebar"
2788
2747
  });
2789
- const [expandedClassName, setExpandedClassName] = (0, import_react14.useState)(
2748
+ const [expandedClassName, setExpandedClassName] = (0, import_react15.useState)(
2790
2749
  props.defaultOpen ? "sidebarExpanded" : ""
2791
2750
  );
2792
2751
  const onSetOpen = (open) => {
@@ -2798,7 +2757,7 @@ function CopilotSidebar(props) {
2798
2757
  }
2799
2758
 
2800
2759
  // src/components/crew/DefaultResponseRenderer.tsx
2801
- var import_react15 = require("react");
2760
+ var import_react16 = require("react");
2802
2761
  var import_jsx_runtime27 = require("react/jsx-runtime");
2803
2762
  var createResponseCache = () => {
2804
2763
  const responseCache = /* @__PURE__ */ new Map();
@@ -2856,7 +2815,7 @@ var DefaultResponseRenderer = ({
2856
2815
  buttonClassName = "copilotkit-response-button",
2857
2816
  completedFeedbackClassName = "copilotkit-response-completed-feedback"
2858
2817
  }) => {
2859
- const [isExpanded, setIsExpanded] = (0, import_react15.useState)(true);
2818
+ const [isExpanded, setIsExpanded] = (0, import_react16.useState)(true);
2860
2819
  const defaultLabels = {
2861
2820
  responseLabel: "Response",
2862
2821
  approveLabel: "Approve",
@@ -2926,7 +2885,7 @@ var DefaultResponseRenderer = ({
2926
2885
  };
2927
2886
 
2928
2887
  // src/components/crew/DefaultStateRenderer.tsx
2929
- var import_react16 = require("react");
2888
+ var import_react17 = require("react");
2930
2889
  var import_jsx_runtime28 = require("react/jsx-runtime");
2931
2890
  var DefaultExpandIcon2 = ({ className }) => /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
2932
2891
  "svg",
@@ -3014,10 +2973,10 @@ var DefaultStateRenderer = ({
3014
2973
  maxHeight = "250px",
3015
2974
  defaultCollapsed = true
3016
2975
  }) => {
3017
- const [isCollapsed, setIsCollapsed] = (0, import_react16.useState)(defaultCollapsed);
3018
- const contentRef = (0, import_react16.useRef)(null);
3019
- const prevItemsLengthRef = (0, import_react16.useRef)(0);
3020
- const [newestItemId, setNewestItemId] = (0, import_react16.useState)(null);
2976
+ const [isCollapsed, setIsCollapsed] = (0, import_react17.useState)(defaultCollapsed);
2977
+ const contentRef = (0, import_react17.useRef)(null);
2978
+ const prevItemsLengthRef = (0, import_react17.useRef)(0);
2979
+ const [newestItemId, setNewestItemId] = (0, import_react17.useState)(null);
3021
2980
  const defaultLabels = {
3022
2981
  inProgressLabel: "Analyzing",
3023
2982
  completeLabel: "Analyzed",
@@ -3026,14 +2985,14 @@ var DefaultStateRenderer = ({
3026
2985
  const mergedLabels = __spreadValues(__spreadValues({}, defaultLabels), labels);
3027
2986
  const ExpandIcon = (icons == null ? void 0 : icons.expand) || DefaultExpandIcon2;
3028
2987
  const CollapseIcon = (icons == null ? void 0 : icons.collapse) || DefaultCollapseIcon2;
3029
- const items = (0, import_react16.useMemo)(() => {
2988
+ const items = (0, import_react17.useMemo)(() => {
3030
2989
  var _a;
3031
2990
  return state ? [...((_a = state.steps) == null ? void 0 : _a.filter((s) => s.tool)) || [], ...state.tasks || []].sort(
3032
2991
  (a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()
3033
2992
  ) : [];
3034
2993
  }, [state]);
3035
2994
  const isThinking = status === "inProgress" && items.length === 0;
3036
- (0, import_react16.useEffect)(() => {
2995
+ (0, import_react17.useEffect)(() => {
3037
2996
  if (!state)
3038
2997
  return;
3039
2998
  if (items.length > prevItemsLengthRef.current) {