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