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

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