@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
@@ -84,7 +84,7 @@ __export(Popup_exports, {
84
84
  module.exports = __toCommonJS(Popup_exports);
85
85
 
86
86
  // src/components/chat/Modal.tsx
87
- var import_react13 = __toESM(require("react"));
87
+ var import_react14 = __toESM(require("react"));
88
88
 
89
89
  // src/components/chat/ChatContext.tsx
90
90
  var import_react = __toESM(require("react"));
@@ -141,7 +141,20 @@ var SendIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
141
141
  xmlns: "http://www.w3.org/2000/svg",
142
142
  fill: "none",
143
143
  viewBox: "0 0 24 24",
144
- strokeWidth: 1.5,
144
+ strokeWidth: "1.5",
145
+ stroke: "currentColor",
146
+ width: "24",
147
+ height: "24",
148
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 19V5m0 0l-7 7m7-7l7 7" })
149
+ }
150
+ );
151
+ var MicrophoneIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
152
+ "svg",
153
+ {
154
+ xmlns: "http://www.w3.org/2000/svg",
155
+ fill: "none",
156
+ viewBox: "0 0 24 24",
157
+ strokeWidth: "1.5",
145
158
  stroke: "currentColor",
146
159
  width: "24",
147
160
  height: "24",
@@ -150,184 +163,157 @@ var SendIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
150
163
  {
151
164
  strokeLinecap: "round",
152
165
  strokeLinejoin: "round",
153
- 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"
166
+ 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"
154
167
  }
155
168
  )
156
169
  }
157
170
  );
158
- var SpinnerIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
171
+ var StopIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
159
172
  "svg",
160
173
  {
161
- style: {
162
- animation: "copilotKitSpinAnimation 1s linear infinite",
163
- color: "rgb(107 114 128)"
164
- },
165
- width: "24",
166
- height: "24",
167
174
  xmlns: "http://www.w3.org/2000/svg",
168
175
  fill: "none",
169
176
  viewBox: "0 0 24 24",
170
- children: [
171
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
172
- "circle",
173
- {
174
- style: { opacity: 0.25 },
175
- cx: "12",
176
- cy: "12",
177
- r: "10",
178
- stroke: "currentColor",
179
- strokeWidth: "4"
180
- }
181
- ),
182
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
183
- "path",
184
- {
185
- style: { opacity: 0.75 },
186
- fill: "currentColor",
187
- 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"
188
- }
189
- )
190
- ]
177
+ strokeWidth: "1.5",
178
+ stroke: "currentColor",
179
+ width: "24",
180
+ height: "24",
181
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
182
+ "path",
183
+ {
184
+ strokeLinecap: "round",
185
+ strokeLinejoin: "round",
186
+ 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"
187
+ }
188
+ )
191
189
  }
192
190
  );
193
- var SmallSpinnerIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
191
+ var RegenerateIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
194
192
  "svg",
195
193
  {
196
- style: {
197
- animation: "copilotKitSpinAnimation 1s linear infinite"
198
- },
199
- width: "13",
200
- height: "13",
201
194
  xmlns: "http://www.w3.org/2000/svg",
202
195
  fill: "none",
203
196
  viewBox: "0 0 24 24",
204
- children: [
205
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
206
- "circle",
207
- {
208
- style: { opacity: 0.25 },
209
- cx: "12",
210
- cy: "12",
211
- r: "10",
212
- stroke: "currentColor",
213
- strokeWidth: "4"
214
- }
215
- ),
216
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
217
- "path",
218
- {
219
- style: { opacity: 0.75 },
220
- fill: "currentColor",
221
- 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"
222
- }
223
- )
224
- ]
197
+ strokeWidth: "2",
198
+ stroke: "currentColor",
199
+ width: "16",
200
+ height: "16",
201
+ style: { minWidth: "16px", minHeight: "16px" },
202
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
203
+ "path",
204
+ {
205
+ strokeLinecap: "round",
206
+ strokeLinejoin: "round",
207
+ 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"
208
+ }
209
+ )
225
210
  }
226
211
  );
227
- var ActivityIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
212
+ var CopyIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
228
213
  "svg",
229
214
  {
230
- style: {
231
- display: "inline-block",
232
- marginLeft: "0.25rem",
233
- marginRight: "0.25rem"
234
- },
235
- height: "24",
236
- width: "24",
237
- viewBox: "0 0 27 27",
238
215
  xmlns: "http://www.w3.org/2000/svg",
239
- fill: "currentColor",
240
- children: [
241
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { className: "copilotKitActivityDot1", cx: "4", cy: "12", r: "3" }),
242
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { className: "copilotKitActivityDot1 copilotKitActivityDot2", cx: "12", cy: "12", r: "3" }),
243
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { className: "copilotKitActivityDot1 copilotKitActivityDot3", cx: "20", cy: "12", r: "3" })
244
- ]
216
+ fill: "none",
217
+ viewBox: "0 0 24 24",
218
+ strokeWidth: "2",
219
+ stroke: "currentColor",
220
+ width: "16",
221
+ height: "16",
222
+ style: { minWidth: "16px", minHeight: "16px" },
223
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
224
+ "path",
225
+ {
226
+ strokeLinecap: "round",
227
+ strokeLinejoin: "round",
228
+ 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"
229
+ }
230
+ )
245
231
  }
246
232
  );
247
- function CheckIcon(_a) {
248
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
249
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
250
- "svg",
251
- __spreadProps(__spreadValues({
252
- xmlns: "http://www.w3.org/2000/svg",
253
- viewBox: "0 0 256 256",
254
- fill: "currentColor",
255
- style: { height: "1rem", width: "1rem" },
256
- className
257
- }, props), {
258
- 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" })
259
- })
260
- );
261
- }
262
- function DownloadIcon(_a) {
263
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
264
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
265
- "svg",
266
- __spreadProps(__spreadValues({
267
- xmlns: "http://www.w3.org/2000/svg",
268
- viewBox: "0 0 256 256",
269
- fill: "currentColor",
270
- style: { height: "1rem", width: "1rem" },
271
- className
272
- }, props), {
273
- 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" })
274
- })
275
- );
276
- }
277
- function CopyIcon(_a) {
278
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
279
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
280
- "svg",
281
- __spreadProps(__spreadValues({
282
- xmlns: "http://www.w3.org/2000/svg",
283
- viewBox: "0 0 256 256",
284
- fill: "currentColor",
285
- style: { height: "1rem", width: "1rem" },
286
- className
287
- }, props), {
288
- 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" })
289
- })
290
- );
291
- }
292
- var StopIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
233
+ var SmallSpinnerIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "copilotKitSpinner", style: { width: "13px", height: "13px" } });
234
+ var SpinnerIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "copilotKitSpinner", style: { width: "24px", height: "24px" } });
235
+ var ActivityIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "4px" }, children: [
236
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "copilotKitActivityDot", style: { animationDelay: "0s" } }),
237
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "copilotKitActivityDot", style: { animationDelay: "0.2s" } }),
238
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "copilotKitActivityDot", style: { animationDelay: "0.4s" } })
239
+ ] });
240
+ var ThumbsUpIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
293
241
  "svg",
294
242
  {
295
243
  xmlns: "http://www.w3.org/2000/svg",
296
- viewBox: "0 0 256 256",
297
- fill: "currentColor",
298
- style: { height: "1rem", width: "1rem" },
299
- 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" })
244
+ fill: "none",
245
+ viewBox: "0 0 24 24",
246
+ strokeWidth: "2",
247
+ stroke: "currentColor",
248
+ width: "16",
249
+ height: "16",
250
+ style: { minWidth: "16px", minHeight: "16px" },
251
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
252
+ "path",
253
+ {
254
+ strokeLinecap: "round",
255
+ strokeLinejoin: "round",
256
+ 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"
257
+ }
258
+ )
300
259
  }
301
260
  );
302
- var RegenerateIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
261
+ var ThumbsDownIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
303
262
  "svg",
304
263
  {
305
264
  xmlns: "http://www.w3.org/2000/svg",
306
- viewBox: "0 0 256 256",
307
- fill: "currentColor",
308
- style: { height: "1rem", width: "1rem" },
309
- 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" })
265
+ fill: "none",
266
+ viewBox: "0 0 24 24",
267
+ strokeWidth: "2",
268
+ stroke: "currentColor",
269
+ width: "16",
270
+ height: "16",
271
+ style: { minWidth: "16px", minHeight: "16px" },
272
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
273
+ "path",
274
+ {
275
+ strokeLinecap: "round",
276
+ strokeLinejoin: "round",
277
+ 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"
278
+ }
279
+ )
310
280
  }
311
281
  );
312
- var PushToTalkIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
282
+ var DownloadIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
313
283
  "svg",
314
284
  {
315
285
  xmlns: "http://www.w3.org/2000/svg",
316
286
  fill: "none",
317
287
  viewBox: "0 0 24 24",
318
- strokeWidth: 1.5,
288
+ strokeWidth: "2",
319
289
  stroke: "currentColor",
320
- className: "w-6 h-6",
290
+ width: "16",
291
+ height: "16",
292
+ style: { minWidth: "16px", minHeight: "16px" },
321
293
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
322
294
  "path",
323
295
  {
324
296
  strokeLinecap: "round",
325
297
  strokeLinejoin: "round",
326
- 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"
298
+ 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"
327
299
  }
328
300
  )
329
301
  }
330
302
  );
303
+ var CheckIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
304
+ "svg",
305
+ {
306
+ xmlns: "http://www.w3.org/2000/svg",
307
+ fill: "none",
308
+ viewBox: "0 0 24 24",
309
+ strokeWidth: "2",
310
+ stroke: "currentColor",
311
+ width: "16",
312
+ height: "16",
313
+ style: { minWidth: "16px", minHeight: "16px" },
314
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4.5 12.75l6 6 9-13.5" })
315
+ }
316
+ );
331
317
 
332
318
  // src/components/chat/ChatContext.tsx
333
319
  var import_jsx_runtime2 = require("react/jsx-runtime");
@@ -358,7 +344,11 @@ var ChatContextProvider = ({
358
344
  placeholder: "Type a message...",
359
345
  error: "\u274C An error occurred. Please try again.",
360
346
  stopGenerating: "Stop generating",
361
- regenerateResponse: "Regenerate response"
347
+ regenerateResponse: "Regenerate response",
348
+ copyToClipboard: "Copy to clipboard",
349
+ thumbsUp: "Thumbs up",
350
+ thumbsDown: "Thumbs down",
351
+ copied: "Copied!"
362
352
  }), labels),
363
353
  [labels]
364
354
  );
@@ -372,7 +362,7 @@ var ChatContextProvider = ({
372
362
  spinnerIcon: SpinnerIcon,
373
363
  stopIcon: StopIcon,
374
364
  regenerateIcon: RegenerateIcon,
375
- pushToTalkIcon: PushToTalkIcon
365
+ pushToTalkIcon: MicrophoneIcon
376
366
  }), icons),
377
367
  [icons]
378
368
  );
@@ -515,845 +505,1354 @@ var Button = ({}) => {
515
505
  ) });
516
506
  };
517
507
 
518
- // src/components/chat/Header.tsx
519
- var import_jsx_runtime5 = require("react/jsx-runtime");
520
- var Header = ({}) => {
521
- const { setOpen, icons, labels } = useChatContext();
522
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "copilotKitHeader", children: [
523
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { children: labels.title }),
524
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { onClick: () => setOpen(false), "aria-label": "Close", children: icons.headerCloseIcon })
525
- ] });
526
- };
527
-
528
- // src/components/chat/Messages.tsx
529
- var import_react3 = require("react");
530
- var import_runtime_client_gql = require("@copilotkit/runtime-client-gql");
508
+ // src/components/dev-console/utils.ts
531
509
  var import_react_core = require("@copilotkit/react-core");
532
- var import_jsx_runtime6 = require("react/jsx-runtime");
533
- var Messages = ({
534
- messages,
535
- inProgress,
536
- children,
537
- RenderTextMessage: RenderTextMessage2,
538
- RenderActionExecutionMessage: RenderActionExecutionMessage2,
539
- RenderAgentStateMessage: RenderAgentStateMessage2,
540
- RenderResultMessage: RenderResultMessage2,
541
- AssistantMessage: AssistantMessage2,
542
- UserMessage: UserMessage2
543
- }) => {
544
- const context = useChatContext();
545
- const initialMessages = (0, import_react3.useMemo)(
546
- () => makeInitialMessages(context.labels.initial),
547
- [context.labels.initial]
548
- );
549
- messages = [...initialMessages, ...messages];
550
- const actionResults = {};
551
- for (let i = 0; i < messages.length; i++) {
552
- if (messages[i].isActionExecutionMessage()) {
553
- const id = messages[i].id;
554
- const resultMessage = messages.find(
555
- (message) => message.isResultMessage() && message.actionExecutionId === id
556
- );
557
- if (resultMessage) {
558
- actionResults[id] = import_runtime_client_gql.ResultMessage.decodeResult(resultMessage.result || "");
559
- }
560
- }
510
+ function shouldShowDevConsole(showDevConsole) {
511
+ if (typeof showDevConsole === "boolean") {
512
+ return showDevConsole;
561
513
  }
562
- const { messagesEndRef, messagesContainerRef } = useScrollToBottom(messages);
563
- const interrupt = (0, import_react_core.useLangGraphInterruptRender)();
564
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "copilotKitMessages", ref: messagesContainerRef, children: [
565
- messages.map((message, index) => {
566
- const isCurrentMessage = index === messages.length - 1;
567
- if (message.isTextMessage()) {
568
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
569
- RenderTextMessage2,
570
- {
571
- message,
572
- inProgress,
573
- index,
574
- isCurrentMessage,
575
- AssistantMessage: AssistantMessage2,
576
- UserMessage: UserMessage2
577
- },
578
- index
579
- );
580
- } else if (message.isActionExecutionMessage()) {
581
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
582
- RenderActionExecutionMessage2,
583
- {
584
- message,
585
- inProgress,
586
- index,
587
- isCurrentMessage,
588
- actionResult: actionResults[message.id],
589
- AssistantMessage: AssistantMessage2,
590
- UserMessage: UserMessage2
591
- },
592
- index
593
- );
594
- } else if (message.isAgentStateMessage()) {
595
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
596
- RenderAgentStateMessage2,
597
- {
598
- message,
599
- inProgress,
600
- index,
601
- isCurrentMessage,
602
- AssistantMessage: AssistantMessage2,
603
- UserMessage: UserMessage2
604
- },
605
- index
606
- );
607
- } else if (message.isResultMessage()) {
608
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
609
- RenderResultMessage2,
610
- {
611
- message,
612
- inProgress,
613
- index,
614
- isCurrentMessage,
615
- AssistantMessage: AssistantMessage2,
616
- UserMessage: UserMessage2
617
- },
618
- index
619
- );
620
- }
621
- }),
622
- interrupt,
623
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("footer", { ref: messagesEndRef, children })
624
- ] });
625
- };
626
- function makeInitialMessages(initial) {
627
- let initialArray = [];
628
- if (initial) {
629
- if (Array.isArray(initial)) {
630
- initialArray.push(...initial);
631
- } else {
632
- initialArray.push(initial);
633
- }
514
+ return getHostname() === "localhost" || getHostname() === "127.0.0.1" || getHostname() === "0.0.0.0" || getHostname() === "::1";
515
+ }
516
+ function getHostname() {
517
+ if (typeof window !== "undefined" && window.location) {
518
+ return window.location.hostname;
634
519
  }
635
- return initialArray.map(
636
- (message) => new import_runtime_client_gql.TextMessage({
637
- role: import_runtime_client_gql.Role.Assistant,
638
- content: message
639
- })
640
- );
520
+ return "";
641
521
  }
642
- function useScrollToBottom(messages) {
643
- const messagesEndRef = (0, import_react3.useRef)(null);
644
- const messagesContainerRef = (0, import_react3.useRef)(null);
645
- const isProgrammaticScrollRef = (0, import_react3.useRef)(false);
646
- const isUserScrollUpRef = (0, import_react3.useRef)(false);
647
- const scrollToBottom = () => {
648
- if (messagesEndRef.current) {
649
- isProgrammaticScrollRef.current = true;
650
- messagesEndRef.current.scrollIntoView({
651
- behavior: "auto"
652
- });
653
- }
654
- };
655
- const handleScroll = () => {
656
- if (isProgrammaticScrollRef.current) {
657
- isProgrammaticScrollRef.current = false;
658
- return;
659
- }
660
- if (messagesContainerRef.current) {
661
- const { scrollTop, scrollHeight, clientHeight } = messagesContainerRef.current;
662
- isUserScrollUpRef.current = scrollTop + clientHeight < scrollHeight;
663
- }
664
- };
665
- (0, import_react3.useEffect)(() => {
666
- const container = messagesContainerRef.current;
667
- if (container) {
668
- container.addEventListener("scroll", handleScroll);
669
- }
670
- return () => {
671
- if (container) {
672
- container.removeEventListener("scroll", handleScroll);
522
+ function getPublishedCopilotKitVersion(current, forceCheck = false) {
523
+ return __async(this, null, function* () {
524
+ const LOCAL_STORAGE_KEY = "__copilotkit_version_check__";
525
+ const serializedVersion = localStorage.getItem(LOCAL_STORAGE_KEY);
526
+ if (serializedVersion && !forceCheck) {
527
+ try {
528
+ const parsedVersion = JSON.parse(serializedVersion);
529
+ const oneHour = 60 * 60 * 1e3;
530
+ const now = (/* @__PURE__ */ new Date()).getTime();
531
+ if (parsedVersion.current === current && now - new Date(parsedVersion.lastChecked).getTime() < oneHour) {
532
+ return parsedVersion;
533
+ }
534
+ } catch (error) {
535
+ console.error("Failed to parse CopilotKitVersion from localStorage", error);
673
536
  }
674
- };
675
- }, []);
676
- (0, import_react3.useEffect)(() => {
677
- const container = messagesContainerRef.current;
678
- if (!container) {
679
- return;
680
537
  }
681
- const mutationObserver = new MutationObserver(() => {
682
- if (!isUserScrollUpRef.current) {
683
- scrollToBottom();
684
- }
685
- });
686
- mutationObserver.observe(container, {
687
- childList: true,
688
- subtree: true,
689
- characterData: true
690
- });
691
- return () => {
692
- mutationObserver.disconnect();
693
- };
694
- }, []);
695
- (0, import_react3.useEffect)(() => {
696
- isUserScrollUpRef.current = false;
697
- scrollToBottom();
698
- }, [messages.filter((m) => m.isTextMessage() && m.role === import_runtime_client_gql.Role.User).length]);
699
- return { messagesEndRef, messagesContainerRef };
700
- }
701
-
702
- // src/components/chat/Input.tsx
703
- var import_react6 = require("react");
538
+ try {
539
+ const response = yield fetch("https://api.cloud.copilotkit.ai/check-for-updates", {
540
+ method: "POST",
541
+ headers: {
542
+ "Content-Type": "application/json"
543
+ },
544
+ body: JSON.stringify({
545
+ packages: [
546
+ {
547
+ packageName: "@copilotkit/shared",
548
+ packageVersion: current
549
+ }
550
+ ]
551
+ })
552
+ });
553
+ const data = yield response.json();
554
+ const version = {
555
+ current,
556
+ lastChecked: (/* @__PURE__ */ new Date()).getTime(),
557
+ latest: data.packages[0].latestVersion,
558
+ severity: data.packages[0].severity,
559
+ advisory: data.packages[0].advisory || null
560
+ };
561
+ localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(version));
562
+ return version;
563
+ } catch (error) {
564
+ console.error("Failed to check for updates", error);
565
+ throw error;
566
+ }
567
+ });
568
+ }
569
+ function logReadables(context) {
570
+ console.log("%cCurrent Readables:", "font-size: 16px; font-weight: bold;");
571
+ const readables = context.getContextString([], import_react_core.defaultCopilotContextCategories).trim();
572
+ if (readables.length === 0) {
573
+ console.log("No readables found");
574
+ return;
575
+ }
576
+ console.log(readables);
577
+ }
578
+ function logActions(context) {
579
+ console.log("%cCurrent Actions:", "font-size: 16px; font-weight: bold;");
580
+ if (Object.values(context.actions).length === 0) {
581
+ console.log("No actions found");
582
+ return;
583
+ }
584
+ for (const action of Object.values(context.actions)) {
585
+ console.group(action.name);
586
+ console.log("name", action.name);
587
+ console.log("description", action.description);
588
+ console.log("parameters", action.parameters);
589
+ console.groupEnd();
590
+ }
591
+ }
592
+ function logMessages(context) {
593
+ console.log("%cCurrent Messages:", "font-size: 16px; font-weight: bold;");
594
+ if (context.messages.length === 0) {
595
+ console.log("No messages found");
596
+ return;
597
+ }
598
+ const tableData = context.messages.map((message) => {
599
+ if (message.isTextMessage()) {
600
+ return {
601
+ id: message.id,
602
+ type: "TextMessage",
603
+ role: message.role,
604
+ name: void 0,
605
+ scope: void 0,
606
+ content: message.content
607
+ };
608
+ } else if (message.isActionExecutionMessage()) {
609
+ return {
610
+ id: message.id,
611
+ type: "ActionExecutionMessage",
612
+ role: void 0,
613
+ name: message.name,
614
+ scope: message.parentMessageId,
615
+ content: message.arguments
616
+ };
617
+ } else if (message.isResultMessage()) {
618
+ return {
619
+ id: message.id,
620
+ type: "ResultMessage",
621
+ role: void 0,
622
+ name: message.actionName,
623
+ scope: message.actionExecutionId,
624
+ content: message.result
625
+ };
626
+ } else if (message.isAgentStateMessage()) {
627
+ return {
628
+ id: message.id,
629
+ type: `AgentStateMessage (running: ${message.running})`,
630
+ role: message.role,
631
+ name: void 0,
632
+ scope: message.threadId,
633
+ content: message.state
634
+ };
635
+ }
636
+ });
637
+ console.table(tableData);
638
+ }
704
639
 
705
- // src/components/chat/Textarea.tsx
640
+ // src/components/dev-console/console.tsx
641
+ var import_react_core2 = require("@copilotkit/react-core");
706
642
  var import_react4 = require("react");
707
- var import_jsx_runtime7 = require("react/jsx-runtime");
708
- var AutoResizingTextarea = (0, import_react4.forwardRef)(
709
- ({ maxRows = 1, placeholder, value, onChange, onKeyDown, autoFocus }, ref) => {
710
- const internalTextareaRef = (0, import_react4.useRef)(null);
711
- const [maxHeight, setMaxHeight] = (0, import_react4.useState)(0);
712
- (0, import_react4.useImperativeHandle)(ref, () => internalTextareaRef.current);
713
- (0, import_react4.useEffect)(() => {
714
- const calculateMaxHeight = () => {
715
- const textarea = internalTextareaRef.current;
716
- if (textarea) {
717
- textarea.style.height = "auto";
718
- const singleRowHeight = textarea.scrollHeight;
719
- setMaxHeight(singleRowHeight * maxRows);
720
- if (autoFocus) {
721
- textarea.focus();
722
- }
723
- }
724
- };
725
- calculateMaxHeight();
726
- }, [maxRows]);
727
- (0, import_react4.useEffect)(() => {
728
- const textarea = internalTextareaRef.current;
729
- if (textarea) {
730
- textarea.style.height = "auto";
731
- textarea.style.height = `${Math.min(textarea.scrollHeight, maxHeight)}px`;
643
+
644
+ // src/components/dev-console/icons.tsx
645
+ var import_jsx_runtime5 = require("react/jsx-runtime");
646
+ var ExclamationMarkTriangleIcon = /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
647
+ "svg",
648
+ {
649
+ width: "13.3967723px",
650
+ height: "12px",
651
+ viewBox: "0 0 13.3967723 12",
652
+ version: "1.1",
653
+ xmlns: "http://www.w3.org/2000/svg",
654
+ 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)(
655
+ "path",
656
+ {
657
+ 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",
658
+ id: "Shape"
732
659
  }
733
- }, [value, maxHeight]);
734
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
735
- "textarea",
660
+ ) }) })
661
+ }
662
+ );
663
+ var ExclamationMarkIcon = /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
664
+ "svg",
665
+ {
666
+ width: "14px",
667
+ height: "14px",
668
+ viewBox: "0 0 14 14",
669
+ version: "1.1",
670
+ xmlns: "http://www.w3.org/2000/svg",
671
+ 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)(
672
+ "path",
736
673
  {
737
- ref: internalTextareaRef,
738
- value,
739
- onChange,
740
- onKeyDown,
741
- placeholder,
742
- style: {
743
- overflow: "auto",
744
- resize: "none",
745
- maxHeight: `${maxHeight}px`
746
- },
747
- rows: 1
674
+ 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",
675
+ id: "Shape"
748
676
  }
749
- );
677
+ ) }) })
750
678
  }
751
679
  );
752
- var Textarea_default = AutoResizingTextarea;
753
-
754
- // src/hooks/use-push-to-talk.tsx
755
- var import_react_core2 = require("@copilotkit/react-core");
756
- var import_react5 = require("react");
757
- var startRecording = (mediaStreamRef, mediaRecorderRef, audioContextRef, recordedChunks, onStop) => __async(void 0, null, function* () {
758
- if (!mediaStreamRef.current || !audioContextRef.current) {
759
- mediaStreamRef.current = yield navigator.mediaDevices.getUserMedia({ audio: true });
760
- audioContextRef.current = new window.AudioContext();
761
- yield audioContextRef.current.resume();
680
+ 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)(
681
+ "path",
682
+ {
683
+ 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",
684
+ id: "Path"
762
685
  }
763
- mediaRecorderRef.current = new MediaRecorder(mediaStreamRef.current);
764
- mediaRecorderRef.current.start(1e3);
765
- mediaRecorderRef.current.ondataavailable = (event) => {
766
- recordedChunks.push(event.data);
767
- };
768
- mediaRecorderRef.current.onstop = onStop;
769
- });
770
- var stopRecording = (mediaRecorderRef) => {
771
- if (mediaRecorderRef.current && mediaRecorderRef.current.state !== "inactive") {
772
- mediaRecorderRef.current.stop();
686
+ ) }) }) });
687
+ var CheckIcon2 = /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
688
+ "svg",
689
+ {
690
+ width: "14px",
691
+ height: "14px",
692
+ viewBox: "0 0 14 14",
693
+ version: "1.1",
694
+ xmlns: "http://www.w3.org/2000/svg",
695
+ 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)(
696
+ "path",
697
+ {
698
+ 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",
699
+ id: "Shape"
700
+ }
701
+ ) }) }) })
773
702
  }
774
- };
775
- var transcribeAudio = (recordedChunks, transcribeAudioUrl) => __async(void 0, null, function* () {
776
- const completeBlob = new Blob(recordedChunks, { type: "audio/mp4" });
777
- const formData = new FormData();
778
- formData.append("file", completeBlob, "recording.mp4");
779
- const response = yield fetch(transcribeAudioUrl, {
780
- method: "POST",
781
- body: formData
782
- });
783
- if (!response.ok) {
784
- throw new Error(`Error: ${response.statusText}`);
703
+ );
704
+
705
+ // src/components/dev-console/console.tsx
706
+ var import_react5 = require("@headlessui/react");
707
+ var import_shared = require("@copilotkit/shared");
708
+
709
+ // src/components/help-modal/modal.tsx
710
+ var import_react3 = require("react");
711
+
712
+ // src/components/help-modal/icons.tsx
713
+ var import_jsx_runtime6 = require("react/jsx-runtime");
714
+ var CloseIcon2 = () => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
715
+ "svg",
716
+ {
717
+ xmlns: "http://www.w3.org/2000/svg",
718
+ fill: "none",
719
+ viewBox: "0 0 24 24",
720
+ strokeWidth: "1.5",
721
+ stroke: "currentColor",
722
+ width: "20",
723
+ height: "20",
724
+ children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 18L18 6M6 6l12 12" })
785
725
  }
786
- const transcription = yield response.json();
787
- return transcription.text;
788
- });
789
- var playAudioResponse = (text, textToSpeechUrl, audioContext) => {
790
- const encodedText = encodeURIComponent(text);
791
- const url = `${textToSpeechUrl}?text=${encodedText}`;
792
- fetch(url).then((response) => response.arrayBuffer()).then((arrayBuffer) => audioContext.decodeAudioData(arrayBuffer)).then((audioBuffer) => {
793
- const source = audioContext.createBufferSource();
794
- source.buffer = audioBuffer;
795
- source.connect(audioContext.destination);
796
- source.start(0);
797
- }).catch((error) => {
798
- console.error("Error with decoding audio data", error);
799
- });
800
- };
801
- var usePushToTalk = ({
802
- sendFunction,
803
- inProgress
804
- }) => {
805
- const [pushToTalkState, setPushToTalkState] = (0, import_react5.useState)("idle");
806
- const mediaStreamRef = (0, import_react5.useRef)(null);
807
- const audioContextRef = (0, import_react5.useRef)(null);
808
- const mediaRecorderRef = (0, import_react5.useRef)(null);
809
- const recordedChunks = (0, import_react5.useRef)([]);
810
- const generalContext = (0, import_react_core2.useCopilotContext)();
811
- const messagesContext = (0, import_react_core2.useCopilotMessagesContext)();
812
- const context = __spreadValues(__spreadValues({}, generalContext), messagesContext);
813
- const [startReadingFromMessageId, setStartReadingFromMessageId] = (0, import_react5.useState)(null);
814
- (0, import_react5.useEffect)(() => {
815
- if (pushToTalkState === "recording") {
816
- startRecording(
817
- mediaStreamRef,
818
- mediaRecorderRef,
819
- audioContextRef,
820
- recordedChunks.current,
821
- () => {
822
- setPushToTalkState("transcribing");
823
- }
824
- );
825
- } else {
826
- stopRecording(mediaRecorderRef);
827
- if (pushToTalkState === "transcribing") {
828
- transcribeAudio(recordedChunks.current, context.copilotApiConfig.transcribeAudioUrl).then(
829
- (transcription) => __async(void 0, null, function* () {
830
- recordedChunks.current = [];
831
- setPushToTalkState("idle");
832
- const message = yield sendFunction(transcription);
833
- setStartReadingFromMessageId(message.id);
834
- })
835
- );
726
+ );
727
+
728
+ // src/components/help-modal/modal.tsx
729
+ var import_jsx_runtime7 = require("react/jsx-runtime");
730
+ function CopilotKitHelpModal() {
731
+ const [showHelpModal, setShowHelpModal] = (0, import_react3.useState)(false);
732
+ const buttonRef = (0, import_react3.useRef)(null);
733
+ const popoverRef = (0, import_react3.useRef)(null);
734
+ (0, import_react3.useEffect)(() => {
735
+ const handleClickOutside = (event) => {
736
+ if (popoverRef.current && !popoverRef.current.contains(event.target) && buttonRef.current && !buttonRef.current.contains(event.target)) {
737
+ setShowHelpModal(false);
836
738
  }
739
+ };
740
+ if (showHelpModal) {
741
+ document.addEventListener("mousedown", handleClickOutside);
837
742
  }
838
743
  return () => {
839
- stopRecording(mediaRecorderRef);
744
+ document.removeEventListener("mousedown", handleClickOutside);
840
745
  };
841
- }, [pushToTalkState]);
842
- (0, import_react5.useEffect)(() => {
843
- if (inProgress === false && startReadingFromMessageId) {
844
- const lastMessageIndex = context.messages.findIndex(
845
- (message) => message.id === startReadingFromMessageId
846
- );
847
- const messagesAfterLast = context.messages.slice(lastMessageIndex + 1).filter(
848
- (message) => message.isTextMessage() && message.role === "assistant"
849
- );
850
- const text = messagesAfterLast.map((message) => message.content).join("\n");
851
- playAudioResponse(text, context.copilotApiConfig.textToSpeechUrl, audioContextRef.current);
852
- setStartReadingFromMessageId(null);
746
+ }, [showHelpModal]);
747
+ const HelpButton = () => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
748
+ "button",
749
+ {
750
+ ref: buttonRef,
751
+ onClick: () => setShowHelpModal(!showHelpModal),
752
+ className: "copilotKitDebugMenuTriggerButton relative",
753
+ "aria-label": "Open Help",
754
+ children: "Help"
853
755
  }
854
- }, [startReadingFromMessageId, inProgress]);
855
- return { pushToTalkState, setPushToTalkState };
856
- };
756
+ );
757
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "relative", children: [
758
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(HelpButton, {}),
759
+ showHelpModal && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
760
+ "div",
761
+ {
762
+ ref: popoverRef,
763
+ className: "absolute mt-2 z-50",
764
+ style: {
765
+ top: "100%",
766
+ right: "-120px",
767
+ width: "380px"
768
+ },
769
+ children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "bg-white rounded-lg shadow-xl w-full p-4 flex-col relative", children: [
770
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
771
+ "button",
772
+ {
773
+ className: "absolute text-gray-400 hover:text-gray-600 focus:outline-none",
774
+ style: { top: "10px", right: "10px" },
775
+ onClick: () => setShowHelpModal(false),
776
+ "aria-label": "Close",
777
+ children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CloseIcon2, {})
778
+ }
779
+ ),
780
+ /* @__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" }) }),
781
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "space-y-4 mb-4", children: [
782
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "copilotKitHelpItemButton", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
783
+ "a",
784
+ {
785
+ href: "https://docs.copilotkit.ai/coagents/troubleshooting/common-issues",
786
+ target: "_blank",
787
+ rel: "noopener noreferrer",
788
+ children: "Visit the Troubleshooting and FAQ section in the docs"
789
+ }
790
+ ) }),
791
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "copilotKitHelpItemButton", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
792
+ "a",
793
+ {
794
+ href: "https://go.copilotkit.ai/dev-console-support-discord",
795
+ target: "_blank",
796
+ rel: "noopener noreferrer",
797
+ children: "Go to Discord Support Channel (Community Support)"
798
+ }
799
+ ) }),
800
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "copilotKitHelpItemButton", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
801
+ "a",
802
+ {
803
+ href: "https://go.copilotkit.ai/dev-console-support-slack",
804
+ target: "_blank",
805
+ rel: "noopener noreferrer",
806
+ children: "Apply for Priority Direct Slack Support"
807
+ }
808
+ ) })
809
+ ] })
810
+ ] })
811
+ }
812
+ )
813
+ ] });
814
+ }
857
815
 
858
- // src/components/chat/Input.tsx
859
- var import_react_core3 = require("@copilotkit/react-core");
816
+ // src/components/dev-console/console.tsx
860
817
  var import_jsx_runtime8 = require("react/jsx-runtime");
861
- var Input = ({ inProgress, onSend, isVisible = false }) => {
862
- const context = useChatContext();
863
- const copilotContext = (0, import_react_core3.useCopilotContext)();
864
- const pushToTalkConfigured = copilotContext.copilotApiConfig.textToSpeechUrl !== void 0 && copilotContext.copilotApiConfig.transcribeAudioUrl !== void 0;
865
- const textareaRef = (0, import_react6.useRef)(null);
866
- const handleDivClick = (event) => {
867
- var _a;
868
- if (event.target !== event.currentTarget)
869
- return;
870
- (_a = textareaRef.current) == null ? void 0 : _a.focus();
818
+ function CopilotDevConsole() {
819
+ const currentVersion = import_shared.COPILOTKIT_VERSION;
820
+ const context = (0, import_react_core2.useCopilotContext)();
821
+ const [showDevConsole, setShowDevConsole] = (0, import_react4.useState)(false);
822
+ (0, import_react4.useEffect)(() => {
823
+ setShowDevConsole(shouldShowDevConsole(context.showDevConsole));
824
+ }, [context.showDevConsole]);
825
+ const dontRunTwiceInDevMode = (0, import_react4.useRef)(false);
826
+ const [versionStatus, setVersionStatus] = (0, import_react4.useState)("unknown");
827
+ const [latestVersion, setLatestVersion] = (0, import_react4.useState)("");
828
+ const consoleRef = (0, import_react4.useRef)(null);
829
+ const [debugButtonMode, setDebugButtonMode] = (0, import_react4.useState)("full");
830
+ const checkForUpdates = (force = false) => {
831
+ setVersionStatus("checking");
832
+ getPublishedCopilotKitVersion(currentVersion, force).then((v) => {
833
+ setLatestVersion(v.latest);
834
+ let versionOk = false;
835
+ if (v.current === v.latest) {
836
+ versionOk = true;
837
+ } else if (/[a-zA-Z]/.test(v.current)) {
838
+ versionOk = true;
839
+ }
840
+ if (versionOk) {
841
+ setVersionStatus("latest");
842
+ } else if (v.severity !== "low") {
843
+ setVersionStatus("outdated");
844
+ } else {
845
+ setVersionStatus("update-available");
846
+ }
847
+ }).catch((e) => {
848
+ console.error(e);
849
+ setVersionStatus("unknown");
850
+ });
871
851
  };
872
- const [text, setText] = (0, import_react6.useState)("");
873
- const send = () => {
874
- var _a;
875
- if (inProgress)
852
+ (0, import_react4.useEffect)(() => {
853
+ if (dontRunTwiceInDevMode.current === true) {
876
854
  return;
877
- onSend(text);
878
- setText("");
879
- (_a = textareaRef.current) == null ? void 0 : _a.focus();
880
- };
881
- (0, import_react6.useEffect)(() => {
882
- var _a;
883
- if (isVisible) {
884
- (_a = textareaRef.current) == null ? void 0 : _a.focus();
885
855
  }
886
- }, [isVisible]);
887
- const { pushToTalkState, setPushToTalkState } = usePushToTalk({
888
- sendFunction: onSend,
889
- inProgress
890
- });
891
- const sendIcon = inProgress || pushToTalkState === "transcribing" ? context.icons.activityIcon : context.icons.sendIcon;
892
- const showPushToTalk = pushToTalkConfigured && (pushToTalkState === "idle" || pushToTalkState === "recording") && !inProgress;
893
- const canSend = () => {
894
- var _a;
895
- const interruptEvent = (_a = copilotContext.langGraphInterruptAction) == null ? void 0 : _a.event;
896
- const interruptInProgress = (interruptEvent == null ? void 0 : interruptEvent.name) === "LangGraphInterruptEvent" && !(interruptEvent == null ? void 0 : interruptEvent.response);
897
- return !inProgress && text.trim().length > 0 && pushToTalkState === "idle" && !interruptInProgress;
856
+ dontRunTwiceInDevMode.current = true;
857
+ checkForUpdates();
858
+ }, []);
859
+ if (!showDevConsole) {
860
+ return null;
861
+ }
862
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
863
+ "div",
864
+ {
865
+ ref: consoleRef,
866
+ className: "copilotKitDevConsole " + (versionStatus === "update-available" ? "copilotKitDevConsoleUpgrade" : "") + (versionStatus === "outdated" ? "copilotKitDevConsoleWarnOutdated" : ""),
867
+ children: [
868
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
869
+ VersionInfo,
870
+ {
871
+ showDevConsole: context.showDevConsole,
872
+ versionStatus,
873
+ currentVersion,
874
+ latestVersion
875
+ }
876
+ ),
877
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(CopilotKitHelpModal, {}),
878
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
879
+ DebugMenuButton,
880
+ {
881
+ setShowDevConsole,
882
+ checkForUpdates,
883
+ mode: debugButtonMode
884
+ }
885
+ )
886
+ ]
887
+ }
888
+ );
889
+ }
890
+ function VersionInfo({
891
+ showDevConsole,
892
+ versionStatus,
893
+ currentVersion,
894
+ latestVersion
895
+ }) {
896
+ const [copyStatus, setCopyStatus] = (0, import_react4.useState)("");
897
+ let versionLabel = "";
898
+ let versionIcon = "";
899
+ let currentVersionLabel = currentVersion;
900
+ if (versionStatus === "latest") {
901
+ versionLabel = "latest";
902
+ versionIcon = CheckIcon2;
903
+ } else if (versionStatus === "checking") {
904
+ versionLabel = "checking";
905
+ versionIcon = SmallSpinnerIcon;
906
+ } else if (versionStatus === "update-available") {
907
+ versionLabel = "update available";
908
+ versionIcon = ExclamationMarkIcon;
909
+ currentVersionLabel = `${currentVersion} \u2192 ${latestVersion}`;
910
+ } else if (versionStatus === "outdated") {
911
+ versionLabel = "outdated";
912
+ versionIcon = ExclamationMarkTriangleIcon;
913
+ currentVersionLabel = `${currentVersion} \u2192 ${latestVersion}`;
914
+ }
915
+ let asideLabel = "";
916
+ if (showDevConsole === "auto") {
917
+ asideLabel = "(localhost only)";
918
+ } else if (showDevConsole === true) {
919
+ asideLabel = "(always on)";
920
+ }
921
+ const installCommand = [
922
+ `npm install`,
923
+ `@copilotkit/react-core@${latestVersion}`,
924
+ `@copilotkit/react-ui@${latestVersion}`,
925
+ `@copilotkit/react-textarea@${latestVersion}`,
926
+ `&& npm install @copilotkit/runtime@${latestVersion}`
927
+ ].join(" ");
928
+ const handleCopyClick = () => {
929
+ navigator.clipboard.writeText(installCommand.trim()).then(() => {
930
+ setCopyStatus("Command copied to clipboard!");
931
+ setTimeout(() => setCopyStatus(""), 1e3);
932
+ });
898
933
  };
899
- const sendDisabled = !canSend();
900
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "copilotKitInput", onClick: handleDivClick, children: [
934
+ if (versionStatus === "update-available" || versionStatus === "outdated") {
935
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "copilotKitVersionInfo", children: [
936
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("p", { children: [
937
+ currentVersionLabel,
938
+ " ",
939
+ versionIcon
940
+ ] }),
941
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { onClick: handleCopyClick, children: copyStatus || installCommand })
942
+ ] });
943
+ }
944
+ return null;
945
+ }
946
+ function DebugMenuButton({
947
+ setShowDevConsole,
948
+ checkForUpdates,
949
+ mode
950
+ }) {
951
+ const context = (0, import_react_core2.useCopilotContext)();
952
+ const messagesContext = (0, import_react_core2.useCopilotMessagesContext)();
953
+ 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: [
901
954
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
902
- Textarea_default,
955
+ import_react5.MenuButton,
903
956
  {
904
- ref: textareaRef,
905
- placeholder: context.labels.placeholder,
906
- autoFocus: true,
907
- maxRows: 5,
908
- value: text,
909
- onChange: (event) => setText(event.target.value),
910
- onKeyDown: (event) => {
911
- if (event.key === "Enter" && !event.shiftKey) {
912
- event.preventDefault();
913
- if (canSend()) {
914
- send();
915
- }
916
- }
917
- }
957
+ className: `copilotKitDebugMenuTriggerButton ${mode === "compact" ? "compact" : ""}`,
958
+ children: mode == "compact" ? "Debug" : /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_jsx_runtime8.Fragment, { children: [
959
+ "Debug ",
960
+ ChevronDownIcon
961
+ ] })
918
962
  }
919
963
  ),
920
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "copilotKitInputControls", children: [
921
- showPushToTalk && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
922
- "button",
923
- {
924
- onClick: () => setPushToTalkState(pushToTalkState === "idle" ? "recording" : "transcribing"),
925
- className: pushToTalkState === "recording" ? "copilotKitPushToTalkRecording" : "",
926
- children: context.icons.pushToTalkIcon
927
- }
928
- ),
929
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
930
- "button",
931
- {
932
- disabled: sendDisabled,
933
- onClick: send,
934
- "data-copilotkit-in-progress": !!inProgress,
935
- "data-testid": inProgress ? "copilot-chat-request-in-progress" : void 0,
936
- children: sendIcon
937
- }
938
- )
939
- ] })
940
- ] });
941
- };
942
-
943
- // src/components/chat/Response.tsx
964
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
965
+ import_react5.MenuItems,
966
+ {
967
+ transition: true,
968
+ anchor: "bottom end",
969
+ className: "copilotKitDebugMenu",
970
+ style: { zIndex: 40 },
971
+ children: [
972
+ /* @__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" }) }),
973
+ /* @__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" }) }),
974
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react5.MenuItem, { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
975
+ "button",
976
+ {
977
+ className: "copilotKitDebugMenuItem",
978
+ onClick: () => logMessages(messagesContext),
979
+ children: "Log Messages"
980
+ }
981
+ ) }),
982
+ /* @__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" }) }),
983
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("hr", {}),
984
+ /* @__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" }) })
985
+ ]
986
+ }
987
+ )
988
+ ] }) });
989
+ }
990
+
991
+ // src/components/chat/Header.tsx
944
992
  var import_jsx_runtime9 = require("react/jsx-runtime");
945
- var ResponseButton = ({ onClick, inProgress }) => {
946
- const context = useChatContext();
947
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("button", { onClick, className: "copilotKitResponseButton", children: [
948
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: inProgress ? context.icons.stopIcon : context.icons.regenerateIcon }),
949
- inProgress ? context.labels.stopGenerating : context.labels.regenerateResponse
993
+ var Header = ({}) => {
994
+ const { setOpen, icons, labels } = useChatContext();
995
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "copilotKitHeader", children: [
996
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { children: labels.title }),
997
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "copilotKitHeaderControls", children: [
998
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(CopilotDevConsole, {}),
999
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { onClick: () => setOpen(false), "aria-label": "Close", children: icons.headerCloseIcon })
1000
+ ] })
950
1001
  ] });
951
1002
  };
952
1003
 
953
- // src/components/chat/messages/RenderTextMessage.tsx
1004
+ // src/components/chat/Messages.tsx
1005
+ var import_react6 = require("react");
1006
+ var import_runtime_client_gql = require("@copilotkit/runtime-client-gql");
1007
+ var import_react_core3 = require("@copilotkit/react-core");
954
1008
  var import_jsx_runtime10 = require("react/jsx-runtime");
955
- function RenderTextMessage(props) {
956
- const { message, inProgress, index, isCurrentMessage, UserMessage: UserMessage2, AssistantMessage: AssistantMessage2 } = props;
957
- if (message.isTextMessage()) {
958
- if (message.role === "user") {
959
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
960
- UserMessage2,
961
- {
962
- "data-message-role": "user",
963
- message: message.content,
964
- rawData: message
965
- },
966
- index
967
- );
968
- } else if (message.role == "assistant") {
969
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
970
- AssistantMessage2,
971
- {
972
- "data-message-role": "assistant",
973
- message: message.content,
974
- rawData: message,
975
- isLoading: inProgress && isCurrentMessage && !message.content,
976
- isGenerating: inProgress && isCurrentMessage && !!message.content
977
- },
978
- index
1009
+ var Messages = ({
1010
+ messages,
1011
+ inProgress,
1012
+ children,
1013
+ RenderTextMessage: RenderTextMessage2,
1014
+ RenderActionExecutionMessage: RenderActionExecutionMessage2,
1015
+ RenderAgentStateMessage: RenderAgentStateMessage2,
1016
+ RenderResultMessage: RenderResultMessage2,
1017
+ AssistantMessage: AssistantMessage2,
1018
+ UserMessage: UserMessage2,
1019
+ onRegenerate,
1020
+ onCopy,
1021
+ onThumbsUp,
1022
+ onThumbsDown
1023
+ }) => {
1024
+ const context = useChatContext();
1025
+ const initialMessages = (0, import_react6.useMemo)(
1026
+ () => makeInitialMessages(context.labels.initial),
1027
+ [context.labels.initial]
1028
+ );
1029
+ messages = [...initialMessages, ...messages];
1030
+ const actionResults = {};
1031
+ for (let i = 0; i < messages.length; i++) {
1032
+ if (messages[i].isActionExecutionMessage()) {
1033
+ const id = messages[i].id;
1034
+ const resultMessage = messages.find(
1035
+ (message) => message.isResultMessage() && message.actionExecutionId === id
979
1036
  );
980
- }
981
- }
982
- }
983
-
984
- // src/components/chat/messages/RenderActionExecutionMessage.tsx
985
- var import_runtime_client_gql2 = require("@copilotkit/runtime-client-gql");
986
- var import_react_core4 = require("@copilotkit/react-core");
987
- var import_jsx_runtime11 = require("react/jsx-runtime");
988
- function RenderActionExecutionMessage(props) {
989
- const { chatComponentsCache } = (0, import_react_core4.useCopilotContext)();
990
- const { message, inProgress, index, isCurrentMessage, actionResult, AssistantMessage: AssistantMessage2 } = props;
991
- if (message.isActionExecutionMessage()) {
992
- if (chatComponentsCache.current !== null && (chatComponentsCache.current.actions[message.name] || chatComponentsCache.current.actions["*"])) {
993
- const render = chatComponentsCache.current.actions[message.name] || chatComponentsCache.current.actions["*"];
994
- if (typeof render === "string") {
995
- if (isCurrentMessage && inProgress) {
996
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
997
- AssistantMessage2,
998
- {
999
- rawData: message,
1000
- "data-message-role": "assistant",
1001
- isLoading: false,
1002
- isGenerating: true,
1003
- message: render
1004
- },
1005
- index
1006
- );
1007
- } else {
1008
- return null;
1009
- }
1010
- } else {
1011
- const args = message.arguments;
1012
- let status = "inProgress";
1013
- if (actionResult !== void 0) {
1014
- status = "complete";
1015
- } else if (message.status.code !== import_runtime_client_gql2.MessageStatusCode.Pending) {
1016
- status = "executing";
1017
- }
1018
- try {
1019
- const toRender = render({
1020
- status,
1021
- args,
1022
- result: actionResult,
1023
- name: message.name
1024
- });
1025
- if (!toRender && status === "complete") {
1026
- return null;
1027
- }
1028
- if (typeof toRender === "string") {
1029
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1030
- AssistantMessage2,
1031
- {
1032
- rawData: message,
1033
- "data-message-role": "assistant",
1034
- isLoading: false,
1035
- isGenerating: false,
1036
- message: toRender
1037
- },
1038
- index
1039
- );
1040
- } else {
1041
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1042
- AssistantMessage2,
1043
- {
1044
- rawData: message,
1045
- "data-message-role": "action-render",
1046
- isLoading: false,
1047
- isGenerating: false,
1048
- subComponent: toRender
1049
- },
1050
- index
1051
- );
1052
- }
1053
- } catch (e) {
1054
- console.error(`Error executing render function for action ${message.name}: ${e}`);
1055
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1056
- AssistantMessage2,
1057
- {
1058
- rawData: message,
1059
- "data-message-role": "assistant",
1060
- isLoading: false,
1061
- isGenerating: false,
1062
- subComponent: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "copilotKitMessage copilotKitAssistantMessage", children: [
1063
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("b", { children: [
1064
- "\u274C Error executing render function for action ",
1065
- message.name,
1066
- ":"
1067
- ] }),
1068
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("pre", { children: e instanceof Error ? e.message : String(e) })
1069
- ] })
1070
- },
1071
- index
1072
- );
1073
- }
1037
+ if (resultMessage) {
1038
+ actionResults[id] = import_runtime_client_gql.ResultMessage.decodeResult(resultMessage.result || "");
1074
1039
  }
1075
- } else if (!inProgress || !isCurrentMessage) {
1076
- return null;
1077
- } else {
1078
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1079
- AssistantMessage2,
1080
- {
1081
- rawData: message,
1082
- "data-message-role": "assistant",
1083
- isLoading: true,
1084
- isGenerating: true
1085
- },
1086
- index
1087
- );
1088
1040
  }
1089
1041
  }
1090
- }
1091
-
1092
- // src/components/chat/messages/RenderResultMessage.tsx
1093
- var import_jsx_runtime12 = require("react/jsx-runtime");
1094
- function RenderResultMessage(props) {
1095
- const { message, inProgress, index, isCurrentMessage, AssistantMessage: AssistantMessage2 } = props;
1096
- if (message.isResultMessage() && inProgress && isCurrentMessage) {
1097
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1098
- AssistantMessage2,
1099
- {
1100
- "data-message-role": "assistant",
1101
- rawData: message,
1102
- isLoading: true,
1103
- isGenerating: true
1104
- },
1105
- index
1106
- );
1107
- } else {
1108
- return null;
1109
- }
1110
- }
1111
-
1112
- // src/components/chat/messages/RenderAgentStateMessage.tsx
1113
- var import_react_core5 = require("@copilotkit/react-core");
1114
- var import_jsx_runtime13 = require("react/jsx-runtime");
1115
- function RenderAgentStateMessage(props) {
1116
- const { chatComponentsCache } = (0, import_react_core5.useCopilotContext)();
1117
- const { message, inProgress, index, isCurrentMessage, AssistantMessage: AssistantMessage2 } = props;
1118
- if (message.isAgentStateMessage()) {
1119
- let render;
1120
- if (chatComponentsCache.current !== null) {
1121
- render = chatComponentsCache.current.coAgentStateRenders[`${message.agentName}-${message.nodeName}`] || chatComponentsCache.current.coAgentStateRenders[`${message.agentName}-global`];
1122
- }
1123
- if (render) {
1124
- if (typeof render === "string") {
1125
- if (isCurrentMessage && inProgress) {
1126
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1127
- AssistantMessage2,
1042
+ const { messagesEndRef, messagesContainerRef } = useScrollToBottom(messages);
1043
+ const interrupt = (0, import_react_core3.useLangGraphInterruptRender)();
1044
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "copilotKitMessages", ref: messagesContainerRef, children: [
1045
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "copilotKitMessagesContainer", children: [
1046
+ messages.map((message, index) => {
1047
+ const isCurrentMessage = index === messages.length - 1;
1048
+ if (message.isTextMessage()) {
1049
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1050
+ RenderTextMessage2,
1128
1051
  {
1129
- rawData: message,
1130
- message: render,
1131
- "data-message-role": "assistant",
1132
- isLoading: true,
1133
- isGenerating: true
1052
+ message,
1053
+ inProgress,
1054
+ index,
1055
+ isCurrentMessage,
1056
+ AssistantMessage: AssistantMessage2,
1057
+ UserMessage: UserMessage2,
1058
+ onRegenerate,
1059
+ onCopy,
1060
+ onThumbsUp,
1061
+ onThumbsDown
1134
1062
  },
1135
1063
  index
1136
1064
  );
1137
- } else {
1138
- return null;
1139
- }
1140
- } else {
1141
- const state = message.state;
1142
- let status = message.active ? "inProgress" : "complete";
1143
- const toRender = render({
1144
- status,
1145
- state,
1146
- nodeName: message.nodeName
1147
- });
1148
- if (!toRender && status === "complete") {
1149
- return null;
1150
- }
1151
- if (!toRender && isCurrentMessage && inProgress) {
1152
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1153
- AssistantMessage2,
1065
+ } else if (message.isActionExecutionMessage()) {
1066
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1067
+ RenderActionExecutionMessage2,
1154
1068
  {
1155
- "data-message-role": "assistant",
1156
- rawData: message,
1157
- isLoading: true,
1158
- isGenerating: true
1069
+ message,
1070
+ inProgress,
1071
+ index,
1072
+ isCurrentMessage,
1073
+ actionResult: actionResults[message.id],
1074
+ AssistantMessage: AssistantMessage2,
1075
+ UserMessage: UserMessage2
1159
1076
  },
1160
1077
  index
1161
1078
  );
1162
- } else if (!toRender) {
1163
- return null;
1164
- }
1165
- if (typeof toRender === "string") {
1166
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1167
- AssistantMessage2,
1079
+ } else if (message.isAgentStateMessage()) {
1080
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1081
+ RenderAgentStateMessage2,
1168
1082
  {
1169
- rawData: message,
1170
- message: toRender,
1171
- isLoading: true,
1172
- isGenerating: true,
1173
- "data-message-role": "assistant"
1083
+ message,
1084
+ inProgress,
1085
+ index,
1086
+ isCurrentMessage,
1087
+ AssistantMessage: AssistantMessage2,
1088
+ UserMessage: UserMessage2
1174
1089
  },
1175
1090
  index
1176
1091
  );
1177
- } else {
1178
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1179
- AssistantMessage2,
1092
+ } else if (message.isResultMessage()) {
1093
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1094
+ RenderResultMessage2,
1180
1095
  {
1181
- rawData: message,
1182
- "data-message-role": "agent-state-render",
1183
- isLoading: false,
1184
- isGenerating: false,
1185
- subComponent: toRender
1096
+ message,
1097
+ inProgress,
1098
+ index,
1099
+ isCurrentMessage,
1100
+ AssistantMessage: AssistantMessage2,
1101
+ UserMessage: UserMessage2
1186
1102
  },
1187
1103
  index
1188
1104
  );
1189
1105
  }
1190
- }
1191
- } else if (!inProgress || !isCurrentMessage) {
1192
- return null;
1106
+ }),
1107
+ interrupt
1108
+ ] }),
1109
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("footer", { className: "copilotKitMessagesFooter", ref: messagesEndRef, children })
1110
+ ] });
1111
+ };
1112
+ function makeInitialMessages(initial) {
1113
+ let initialArray = [];
1114
+ if (initial) {
1115
+ if (Array.isArray(initial)) {
1116
+ initialArray.push(...initial);
1193
1117
  } else {
1194
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1195
- AssistantMessage2,
1196
- {
1197
- rawData: message,
1198
- isLoading: true,
1199
- isGenerating: true,
1200
- "data-message-role": "assistant"
1201
- },
1202
- index
1203
- );
1118
+ initialArray.push(initial);
1204
1119
  }
1205
1120
  }
1121
+ return initialArray.map(
1122
+ (message) => new import_runtime_client_gql.TextMessage({
1123
+ role: import_runtime_client_gql.Role.Assistant,
1124
+ content: message
1125
+ })
1126
+ );
1206
1127
  }
1207
-
1208
- // src/components/chat/Markdown.tsx
1209
- var import_react8 = require("react");
1210
- var import_react_markdown = __toESM(require("react-markdown"));
1211
-
1212
- // src/components/chat/CodeBlock.tsx
1213
- var import_react7 = require("react");
1214
- var import_react_syntax_highlighter = require("react-syntax-highlighter");
1215
-
1216
- // src/hooks/use-copy-to-clipboard.tsx
1217
- var React5 = __toESM(require("react"));
1218
- function useCopyToClipboard({ timeout = 2e3 }) {
1219
- const [isCopied, setIsCopied] = React5.useState(false);
1220
- const copyToClipboard = (value) => {
1221
- var _a;
1222
- if (typeof window === "undefined" || !((_a = navigator.clipboard) == null ? void 0 : _a.writeText)) {
1223
- return;
1224
- }
1225
- if (!value) {
1226
- return;
1128
+ function useScrollToBottom(messages) {
1129
+ const messagesEndRef = (0, import_react6.useRef)(null);
1130
+ const messagesContainerRef = (0, import_react6.useRef)(null);
1131
+ const isProgrammaticScrollRef = (0, import_react6.useRef)(false);
1132
+ const isUserScrollUpRef = (0, import_react6.useRef)(false);
1133
+ const scrollToBottom = () => {
1134
+ if (messagesEndRef.current) {
1135
+ isProgrammaticScrollRef.current = true;
1136
+ messagesEndRef.current.scrollIntoView({
1137
+ behavior: "auto"
1138
+ });
1227
1139
  }
1228
- navigator.clipboard.writeText(value).then(() => {
1229
- setIsCopied(true);
1230
- setTimeout(() => {
1231
- setIsCopied(false);
1232
- }, timeout);
1233
- });
1234
1140
  };
1235
- return { isCopied, copyToClipboard };
1236
- }
1237
-
1238
- // src/components/chat/CodeBlock.tsx
1239
- var import_jsx_runtime14 = require("react/jsx-runtime");
1240
- var programmingLanguages = {
1241
- javascript: ".js",
1242
- python: ".py",
1243
- java: ".java",
1244
- c: ".c",
1245
- cpp: ".cpp",
1246
- "c++": ".cpp",
1247
- "c#": ".cs",
1248
- ruby: ".rb",
1249
- php: ".php",
1250
- swift: ".swift",
1251
- "objective-c": ".m",
1252
- kotlin: ".kt",
1253
- typescript: ".ts",
1254
- go: ".go",
1255
- perl: ".pl",
1256
- rust: ".rs",
1257
- scala: ".scala",
1258
- haskell: ".hs",
1259
- lua: ".lua",
1260
- shell: ".sh",
1261
- sql: ".sql",
1262
- html: ".html",
1263
- css: ".css"
1264
- // add more file extensions here, make sure the key is same as language prop in CodeBlock.tsx component
1265
- };
1266
- var generateRandomString = (length, lowercase = false) => {
1267
- const chars = "ABCDEFGHJKLMNPQRSTUVWXY3456789";
1268
- let result = "";
1269
- for (let i = 0; i < length; i++) {
1270
- result += chars.charAt(Math.floor(Math.random() * chars.length));
1271
- }
1272
- return lowercase ? result.toLowerCase() : result;
1273
- };
1274
- var CodeBlock = (0, import_react7.memo)(({ language, value }) => {
1275
- const { isCopied, copyToClipboard } = useCopyToClipboard({ timeout: 2e3 });
1276
- const downloadAsFile = () => {
1277
- if (typeof window === "undefined") {
1141
+ const handleScroll = () => {
1142
+ if (isProgrammaticScrollRef.current) {
1143
+ isProgrammaticScrollRef.current = false;
1278
1144
  return;
1279
1145
  }
1280
- const fileExtension = programmingLanguages[language] || ".file";
1281
- const suggestedFileName = `file-${generateRandomString(3, true)}${fileExtension}`;
1282
- const fileName = window.prompt("Enter file name", suggestedFileName);
1283
- if (!fileName) {
1284
- return;
1146
+ if (messagesContainerRef.current) {
1147
+ const { scrollTop, scrollHeight, clientHeight } = messagesContainerRef.current;
1148
+ isUserScrollUpRef.current = scrollTop + clientHeight < scrollHeight;
1285
1149
  }
1286
- const blob = new Blob([value], { type: "text/plain" });
1287
- const url = URL.createObjectURL(blob);
1288
- const link = document.createElement("a");
1289
- link.download = fileName;
1290
- link.href = url;
1291
- link.style.display = "none";
1292
- document.body.appendChild(link);
1293
- link.click();
1294
- document.body.removeChild(link);
1295
- URL.revokeObjectURL(url);
1296
1150
  };
1297
- const onCopy = () => {
1298
- if (isCopied)
1151
+ (0, import_react6.useEffect)(() => {
1152
+ const container = messagesContainerRef.current;
1153
+ if (container) {
1154
+ container.addEventListener("scroll", handleScroll);
1155
+ }
1156
+ return () => {
1157
+ if (container) {
1158
+ container.removeEventListener("scroll", handleScroll);
1159
+ }
1160
+ };
1161
+ }, []);
1162
+ (0, import_react6.useEffect)(() => {
1163
+ const container = messagesContainerRef.current;
1164
+ if (!container) {
1299
1165
  return;
1300
- copyToClipboard(value);
1301
- };
1302
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "copilotKitCodeBlock", children: [
1303
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "copilotKitCodeBlockToolbar", children: [
1304
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "copilotKitCodeBlockToolbarLanguage", children: language }),
1305
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "copilotKitCodeBlockToolbarButtons", children: [
1306
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("button", { className: "copilotKitCodeBlockToolbarButton", onClick: downloadAsFile, children: [
1307
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(DownloadIcon, {}),
1308
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "sr-only", children: "Download" })
1309
- ] }),
1310
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("button", { className: "copilotKitCodeBlockToolbarButton", onClick: onCopy, children: [
1311
- isCopied ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(CheckIcon, {}) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(CopyIcon, {}),
1312
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "sr-only", children: "Copy code" })
1313
- ] })
1314
- ] })
1315
- ] }),
1316
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1317
- import_react_syntax_highlighter.Prism,
1166
+ }
1167
+ const mutationObserver = new MutationObserver(() => {
1168
+ if (!isUserScrollUpRef.current) {
1169
+ scrollToBottom();
1170
+ }
1171
+ });
1172
+ mutationObserver.observe(container, {
1173
+ childList: true,
1174
+ subtree: true,
1175
+ characterData: true
1176
+ });
1177
+ return () => {
1178
+ mutationObserver.disconnect();
1179
+ };
1180
+ }, []);
1181
+ (0, import_react6.useEffect)(() => {
1182
+ isUserScrollUpRef.current = false;
1183
+ scrollToBottom();
1184
+ }, [messages.filter((m) => m.isTextMessage() && m.role === import_runtime_client_gql.Role.User).length]);
1185
+ return { messagesEndRef, messagesContainerRef };
1186
+ }
1187
+
1188
+ // src/components/chat/Input.tsx
1189
+ var import_react9 = require("react");
1190
+
1191
+ // src/components/chat/Textarea.tsx
1192
+ var import_react7 = require("react");
1193
+ var import_jsx_runtime11 = require("react/jsx-runtime");
1194
+ var AutoResizingTextarea = (0, import_react7.forwardRef)(
1195
+ ({ maxRows = 1, placeholder, value, onChange, onKeyDown, autoFocus }, ref) => {
1196
+ const internalTextareaRef = (0, import_react7.useRef)(null);
1197
+ const [maxHeight, setMaxHeight] = (0, import_react7.useState)(0);
1198
+ (0, import_react7.useImperativeHandle)(ref, () => internalTextareaRef.current);
1199
+ (0, import_react7.useEffect)(() => {
1200
+ const calculateMaxHeight = () => {
1201
+ const textarea = internalTextareaRef.current;
1202
+ if (textarea) {
1203
+ textarea.style.height = "auto";
1204
+ const singleRowHeight = textarea.scrollHeight;
1205
+ setMaxHeight(singleRowHeight * maxRows);
1206
+ if (autoFocus) {
1207
+ textarea.focus();
1208
+ }
1209
+ }
1210
+ };
1211
+ calculateMaxHeight();
1212
+ }, [maxRows]);
1213
+ (0, import_react7.useEffect)(() => {
1214
+ const textarea = internalTextareaRef.current;
1215
+ if (textarea) {
1216
+ textarea.style.height = "auto";
1217
+ textarea.style.height = `${Math.min(textarea.scrollHeight, maxHeight)}px`;
1218
+ }
1219
+ }, [value, maxHeight]);
1220
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1221
+ "textarea",
1318
1222
  {
1319
- language,
1320
- style: highlightStyle,
1321
- PreTag: "div",
1322
- customStyle: {
1323
- margin: 0,
1324
- borderBottomLeftRadius: "0.375rem",
1325
- borderBottomRightRadius: "0.375rem"
1223
+ ref: internalTextareaRef,
1224
+ value,
1225
+ onChange,
1226
+ onKeyDown,
1227
+ placeholder,
1228
+ style: {
1229
+ overflow: "auto",
1230
+ resize: "none",
1231
+ maxHeight: `${maxHeight}px`
1326
1232
  },
1327
- children: value
1233
+ rows: 1
1328
1234
  }
1329
- )
1330
- ] });
1235
+ );
1236
+ }
1237
+ );
1238
+ var Textarea_default = AutoResizingTextarea;
1239
+
1240
+ // src/hooks/use-push-to-talk.tsx
1241
+ var import_react_core4 = require("@copilotkit/react-core");
1242
+ var import_react8 = require("react");
1243
+ var startRecording = (mediaStreamRef, mediaRecorderRef, audioContextRef, recordedChunks, onStop) => __async(void 0, null, function* () {
1244
+ if (!mediaStreamRef.current || !audioContextRef.current) {
1245
+ mediaStreamRef.current = yield navigator.mediaDevices.getUserMedia({ audio: true });
1246
+ audioContextRef.current = new window.AudioContext();
1247
+ yield audioContextRef.current.resume();
1248
+ }
1249
+ mediaRecorderRef.current = new MediaRecorder(mediaStreamRef.current);
1250
+ mediaRecorderRef.current.start(1e3);
1251
+ mediaRecorderRef.current.ondataavailable = (event) => {
1252
+ recordedChunks.push(event.data);
1253
+ };
1254
+ mediaRecorderRef.current.onstop = onStop;
1331
1255
  });
1332
- CodeBlock.displayName = "CodeBlock";
1333
- var highlightStyle = {
1334
- 'pre[class*="language-"]': {
1335
- color: "#d4d4d4",
1336
- fontSize: "13px",
1337
- textShadow: "none",
1338
- fontFamily: 'Menlo, Monaco, Consolas, "Andale Mono", "Ubuntu Mono", "Courier New", monospace',
1339
- direction: "ltr",
1340
- textAlign: "left",
1341
- whiteSpace: "pre",
1342
- wordSpacing: "normal",
1343
- wordBreak: "normal",
1344
- lineHeight: "1.5",
1345
- MozTabSize: "4",
1346
- OTabSize: "4",
1347
- tabSize: "4",
1348
- WebkitHyphens: "none",
1349
- MozHyphens: "none",
1350
- msHyphens: "none",
1351
- hyphens: "none",
1352
- padding: "1em",
1353
- margin: ".5em 0",
1354
- overflow: "auto",
1355
- background: "#1e1e1e"
1356
- },
1256
+ var stopRecording = (mediaRecorderRef) => {
1257
+ if (mediaRecorderRef.current && mediaRecorderRef.current.state !== "inactive") {
1258
+ mediaRecorderRef.current.stop();
1259
+ }
1260
+ };
1261
+ var transcribeAudio = (recordedChunks, transcribeAudioUrl) => __async(void 0, null, function* () {
1262
+ const completeBlob = new Blob(recordedChunks, { type: "audio/mp4" });
1263
+ const formData = new FormData();
1264
+ formData.append("file", completeBlob, "recording.mp4");
1265
+ const response = yield fetch(transcribeAudioUrl, {
1266
+ method: "POST",
1267
+ body: formData
1268
+ });
1269
+ if (!response.ok) {
1270
+ throw new Error(`Error: ${response.statusText}`);
1271
+ }
1272
+ const transcription = yield response.json();
1273
+ return transcription.text;
1274
+ });
1275
+ var playAudioResponse = (text, textToSpeechUrl, audioContext) => {
1276
+ const encodedText = encodeURIComponent(text);
1277
+ const url = `${textToSpeechUrl}?text=${encodedText}`;
1278
+ fetch(url).then((response) => response.arrayBuffer()).then((arrayBuffer) => audioContext.decodeAudioData(arrayBuffer)).then((audioBuffer) => {
1279
+ const source = audioContext.createBufferSource();
1280
+ source.buffer = audioBuffer;
1281
+ source.connect(audioContext.destination);
1282
+ source.start(0);
1283
+ }).catch((error) => {
1284
+ console.error("Error with decoding audio data", error);
1285
+ });
1286
+ };
1287
+ var usePushToTalk = ({
1288
+ sendFunction,
1289
+ inProgress
1290
+ }) => {
1291
+ const [pushToTalkState, setPushToTalkState] = (0, import_react8.useState)("idle");
1292
+ const mediaStreamRef = (0, import_react8.useRef)(null);
1293
+ const audioContextRef = (0, import_react8.useRef)(null);
1294
+ const mediaRecorderRef = (0, import_react8.useRef)(null);
1295
+ const recordedChunks = (0, import_react8.useRef)([]);
1296
+ const generalContext = (0, import_react_core4.useCopilotContext)();
1297
+ const messagesContext = (0, import_react_core4.useCopilotMessagesContext)();
1298
+ const context = __spreadValues(__spreadValues({}, generalContext), messagesContext);
1299
+ const [startReadingFromMessageId, setStartReadingFromMessageId] = (0, import_react8.useState)(null);
1300
+ (0, import_react8.useEffect)(() => {
1301
+ if (pushToTalkState === "recording") {
1302
+ startRecording(
1303
+ mediaStreamRef,
1304
+ mediaRecorderRef,
1305
+ audioContextRef,
1306
+ recordedChunks.current,
1307
+ () => {
1308
+ setPushToTalkState("transcribing");
1309
+ }
1310
+ );
1311
+ } else {
1312
+ stopRecording(mediaRecorderRef);
1313
+ if (pushToTalkState === "transcribing") {
1314
+ transcribeAudio(recordedChunks.current, context.copilotApiConfig.transcribeAudioUrl).then(
1315
+ (transcription) => __async(void 0, null, function* () {
1316
+ recordedChunks.current = [];
1317
+ setPushToTalkState("idle");
1318
+ const message = yield sendFunction(transcription);
1319
+ setStartReadingFromMessageId(message.id);
1320
+ })
1321
+ );
1322
+ }
1323
+ }
1324
+ return () => {
1325
+ stopRecording(mediaRecorderRef);
1326
+ };
1327
+ }, [pushToTalkState]);
1328
+ (0, import_react8.useEffect)(() => {
1329
+ if (inProgress === false && startReadingFromMessageId) {
1330
+ const lastMessageIndex = context.messages.findIndex(
1331
+ (message) => message.id === startReadingFromMessageId
1332
+ );
1333
+ const messagesAfterLast = context.messages.slice(lastMessageIndex + 1).filter(
1334
+ (message) => message.isTextMessage() && message.role === "assistant"
1335
+ );
1336
+ const text = messagesAfterLast.map((message) => message.content).join("\n");
1337
+ playAudioResponse(text, context.copilotApiConfig.textToSpeechUrl, audioContextRef.current);
1338
+ setStartReadingFromMessageId(null);
1339
+ }
1340
+ }, [startReadingFromMessageId, inProgress]);
1341
+ return { pushToTalkState, setPushToTalkState };
1342
+ };
1343
+
1344
+ // src/components/chat/Input.tsx
1345
+ var import_react_core5 = require("@copilotkit/react-core");
1346
+ var import_jsx_runtime12 = require("react/jsx-runtime");
1347
+ var Input = ({ inProgress, onSend, isVisible = false, onStop }) => {
1348
+ const context = useChatContext();
1349
+ const copilotContext = (0, import_react_core5.useCopilotContext)();
1350
+ const pushToTalkConfigured = copilotContext.copilotApiConfig.textToSpeechUrl !== void 0 && copilotContext.copilotApiConfig.transcribeAudioUrl !== void 0;
1351
+ const textareaRef = (0, import_react9.useRef)(null);
1352
+ const handleDivClick = (event) => {
1353
+ var _a;
1354
+ if (event.target !== event.currentTarget)
1355
+ return;
1356
+ (_a = textareaRef.current) == null ? void 0 : _a.focus();
1357
+ };
1358
+ const [text, setText] = (0, import_react9.useState)("");
1359
+ const send = () => {
1360
+ var _a;
1361
+ if (inProgress)
1362
+ return;
1363
+ onSend(text);
1364
+ setText("");
1365
+ (_a = textareaRef.current) == null ? void 0 : _a.focus();
1366
+ };
1367
+ (0, import_react9.useEffect)(() => {
1368
+ var _a;
1369
+ if (isVisible) {
1370
+ (_a = textareaRef.current) == null ? void 0 : _a.focus();
1371
+ }
1372
+ }, [isVisible]);
1373
+ const { pushToTalkState, setPushToTalkState } = usePushToTalk({
1374
+ sendFunction: onSend,
1375
+ inProgress
1376
+ });
1377
+ const isInProgress = inProgress || pushToTalkState === "transcribing";
1378
+ const buttonIcon = isInProgress ? context.icons.stopIcon : context.icons.sendIcon;
1379
+ const showPushToTalk = pushToTalkConfigured && (pushToTalkState === "idle" || pushToTalkState === "recording") && !inProgress;
1380
+ const canSend = () => {
1381
+ var _a;
1382
+ const interruptEvent = (_a = copilotContext.langGraphInterruptAction) == null ? void 0 : _a.event;
1383
+ const interruptInProgress = (interruptEvent == null ? void 0 : interruptEvent.name) === "LangGraphInterruptEvent" && !(interruptEvent == null ? void 0 : interruptEvent.response);
1384
+ return (isInProgress || !isInProgress && text.trim().length > 0) && pushToTalkState === "idle" && !interruptInProgress;
1385
+ };
1386
+ const sendDisabled = !canSend();
1387
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "copilotKitInputContainer", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "copilotKitInput", onClick: handleDivClick, children: [
1388
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1389
+ Textarea_default,
1390
+ {
1391
+ ref: textareaRef,
1392
+ placeholder: context.labels.placeholder,
1393
+ autoFocus: true,
1394
+ maxRows: 5,
1395
+ value: text,
1396
+ onChange: (event) => setText(event.target.value),
1397
+ onKeyDown: (event) => {
1398
+ if (event.key === "Enter" && !event.shiftKey) {
1399
+ event.preventDefault();
1400
+ if (canSend()) {
1401
+ send();
1402
+ }
1403
+ }
1404
+ }
1405
+ }
1406
+ ),
1407
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "copilotKitInputControls", children: [
1408
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { style: { flexGrow: 1 } }),
1409
+ showPushToTalk && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1410
+ "button",
1411
+ {
1412
+ onClick: () => setPushToTalkState(pushToTalkState === "idle" ? "recording" : "transcribing"),
1413
+ className: pushToTalkState === "recording" ? "copilotKitInputControlButton copilotKitPushToTalkRecording" : "copilotKitInputControlButton",
1414
+ children: context.icons.pushToTalkIcon
1415
+ }
1416
+ ),
1417
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1418
+ "button",
1419
+ {
1420
+ disabled: sendDisabled,
1421
+ onClick: isInProgress ? onStop : send,
1422
+ "data-copilotkit-in-progress": inProgress,
1423
+ "data-test-id": inProgress ? "copilot-chat-request-in-progress" : "copilot-chat-ready",
1424
+ className: "copilotKitInputControlButton",
1425
+ children: buttonIcon
1426
+ }
1427
+ )
1428
+ ] })
1429
+ ] }) });
1430
+ };
1431
+
1432
+ // src/components/chat/Response.tsx
1433
+ var import_jsx_runtime13 = require("react/jsx-runtime");
1434
+ var ResponseButton = ({ onClick, inProgress }) => {
1435
+ const context = useChatContext();
1436
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("button", { onClick, className: "copilotKitResponseButton", children: [
1437
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { children: inProgress ? context.icons.stopIcon : context.icons.regenerateIcon }),
1438
+ inProgress ? context.labels.stopGenerating : context.labels.regenerateResponse
1439
+ ] });
1440
+ };
1441
+
1442
+ // src/components/chat/messages/RenderTextMessage.tsx
1443
+ var import_jsx_runtime14 = require("react/jsx-runtime");
1444
+ function RenderTextMessage(props) {
1445
+ const {
1446
+ message,
1447
+ inProgress,
1448
+ index,
1449
+ isCurrentMessage,
1450
+ UserMessage: UserMessage2,
1451
+ AssistantMessage: AssistantMessage2,
1452
+ onRegenerate,
1453
+ onCopy,
1454
+ onThumbsUp,
1455
+ onThumbsDown
1456
+ } = props;
1457
+ if (message.isTextMessage()) {
1458
+ if (message.role === "user") {
1459
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1460
+ UserMessage2,
1461
+ {
1462
+ "data-message-role": "user",
1463
+ message: message.content,
1464
+ rawData: message
1465
+ },
1466
+ index
1467
+ );
1468
+ } else if (message.role == "assistant") {
1469
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1470
+ AssistantMessage2,
1471
+ {
1472
+ "data-message-role": "assistant",
1473
+ message: message.content,
1474
+ rawData: message,
1475
+ isLoading: inProgress && isCurrentMessage && !message.content,
1476
+ isGenerating: inProgress && isCurrentMessage && !!message.content,
1477
+ isCurrentMessage,
1478
+ onRegenerate,
1479
+ onCopy,
1480
+ onThumbsUp,
1481
+ onThumbsDown
1482
+ },
1483
+ index
1484
+ );
1485
+ }
1486
+ }
1487
+ }
1488
+
1489
+ // src/components/chat/messages/RenderActionExecutionMessage.tsx
1490
+ var import_runtime_client_gql2 = require("@copilotkit/runtime-client-gql");
1491
+ var import_react_core6 = require("@copilotkit/react-core");
1492
+ var import_jsx_runtime15 = require("react/jsx-runtime");
1493
+ function RenderActionExecutionMessage(props) {
1494
+ const { chatComponentsCache } = (0, import_react_core6.useCopilotContext)();
1495
+ const { message, inProgress, index, isCurrentMessage, actionResult, AssistantMessage: AssistantMessage2 } = props;
1496
+ if (message.isActionExecutionMessage()) {
1497
+ if (chatComponentsCache.current !== null && (chatComponentsCache.current.actions[message.name] || chatComponentsCache.current.actions["*"])) {
1498
+ const render = chatComponentsCache.current.actions[message.name] || chatComponentsCache.current.actions["*"];
1499
+ if (typeof render === "string") {
1500
+ if (isCurrentMessage && inProgress) {
1501
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1502
+ AssistantMessage2,
1503
+ {
1504
+ rawData: message,
1505
+ "data-message-role": "assistant",
1506
+ isLoading: false,
1507
+ isGenerating: true,
1508
+ message: render
1509
+ },
1510
+ index
1511
+ );
1512
+ } else {
1513
+ return null;
1514
+ }
1515
+ } else {
1516
+ const args = message.arguments;
1517
+ let status = "inProgress";
1518
+ if (actionResult !== void 0) {
1519
+ status = "complete";
1520
+ } else if (message.status.code !== import_runtime_client_gql2.MessageStatusCode.Pending) {
1521
+ status = "executing";
1522
+ }
1523
+ try {
1524
+ const toRender = render({
1525
+ status,
1526
+ args,
1527
+ result: actionResult,
1528
+ name: message.name
1529
+ });
1530
+ if (!toRender && status === "complete") {
1531
+ return null;
1532
+ }
1533
+ if (typeof toRender === "string") {
1534
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1535
+ AssistantMessage2,
1536
+ {
1537
+ rawData: message,
1538
+ "data-message-role": "assistant",
1539
+ isLoading: false,
1540
+ isGenerating: false,
1541
+ message: toRender
1542
+ },
1543
+ index
1544
+ );
1545
+ } else {
1546
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1547
+ AssistantMessage2,
1548
+ {
1549
+ rawData: message,
1550
+ "data-message-role": "action-render",
1551
+ isLoading: false,
1552
+ isGenerating: false,
1553
+ subComponent: toRender
1554
+ },
1555
+ index
1556
+ );
1557
+ }
1558
+ } catch (e) {
1559
+ console.error(`Error executing render function for action ${message.name}: ${e}`);
1560
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1561
+ AssistantMessage2,
1562
+ {
1563
+ rawData: message,
1564
+ "data-message-role": "assistant",
1565
+ isLoading: false,
1566
+ isGenerating: false,
1567
+ subComponent: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "copilotKitMessage copilotKitAssistantMessage", children: [
1568
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("b", { children: [
1569
+ "\u274C Error executing render function for action ",
1570
+ message.name,
1571
+ ":"
1572
+ ] }),
1573
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("pre", { children: e instanceof Error ? e.message : String(e) })
1574
+ ] })
1575
+ },
1576
+ index
1577
+ );
1578
+ }
1579
+ }
1580
+ } else if (!inProgress || !isCurrentMessage) {
1581
+ return null;
1582
+ } else {
1583
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1584
+ AssistantMessage2,
1585
+ {
1586
+ rawData: message,
1587
+ "data-message-role": "assistant",
1588
+ isLoading: true,
1589
+ isGenerating: true
1590
+ },
1591
+ index
1592
+ );
1593
+ }
1594
+ }
1595
+ }
1596
+
1597
+ // src/components/chat/messages/RenderResultMessage.tsx
1598
+ var import_jsx_runtime16 = require("react/jsx-runtime");
1599
+ function RenderResultMessage(props) {
1600
+ const { message, inProgress, index, isCurrentMessage, AssistantMessage: AssistantMessage2 } = props;
1601
+ if (message.isResultMessage() && inProgress && isCurrentMessage) {
1602
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1603
+ AssistantMessage2,
1604
+ {
1605
+ "data-message-role": "assistant",
1606
+ rawData: message,
1607
+ isLoading: true,
1608
+ isGenerating: true
1609
+ },
1610
+ index
1611
+ );
1612
+ } else {
1613
+ return null;
1614
+ }
1615
+ }
1616
+
1617
+ // src/components/chat/messages/RenderAgentStateMessage.tsx
1618
+ var import_react_core7 = require("@copilotkit/react-core");
1619
+ var import_jsx_runtime17 = require("react/jsx-runtime");
1620
+ function RenderAgentStateMessage(props) {
1621
+ const { chatComponentsCache } = (0, import_react_core7.useCopilotContext)();
1622
+ const { message, inProgress, index, isCurrentMessage, AssistantMessage: AssistantMessage2 } = props;
1623
+ if (message.isAgentStateMessage()) {
1624
+ let render;
1625
+ if (chatComponentsCache.current !== null) {
1626
+ render = chatComponentsCache.current.coAgentStateRenders[`${message.agentName}-${message.nodeName}`] || chatComponentsCache.current.coAgentStateRenders[`${message.agentName}-global`];
1627
+ }
1628
+ if (render) {
1629
+ if (typeof render === "string") {
1630
+ if (isCurrentMessage && inProgress) {
1631
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1632
+ AssistantMessage2,
1633
+ {
1634
+ rawData: message,
1635
+ message: render,
1636
+ "data-message-role": "assistant",
1637
+ isLoading: true,
1638
+ isGenerating: true
1639
+ },
1640
+ index
1641
+ );
1642
+ } else {
1643
+ return null;
1644
+ }
1645
+ } else {
1646
+ const state = message.state;
1647
+ let status = message.active ? "inProgress" : "complete";
1648
+ const toRender = render({
1649
+ status,
1650
+ state,
1651
+ nodeName: message.nodeName
1652
+ });
1653
+ if (!toRender && status === "complete") {
1654
+ return null;
1655
+ }
1656
+ if (!toRender && isCurrentMessage && inProgress) {
1657
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1658
+ AssistantMessage2,
1659
+ {
1660
+ "data-message-role": "assistant",
1661
+ rawData: message,
1662
+ isLoading: true,
1663
+ isGenerating: true
1664
+ },
1665
+ index
1666
+ );
1667
+ } else if (!toRender) {
1668
+ return null;
1669
+ }
1670
+ if (typeof toRender === "string") {
1671
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1672
+ AssistantMessage2,
1673
+ {
1674
+ rawData: message,
1675
+ message: toRender,
1676
+ isLoading: true,
1677
+ isGenerating: true,
1678
+ "data-message-role": "assistant"
1679
+ },
1680
+ index
1681
+ );
1682
+ } else {
1683
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1684
+ AssistantMessage2,
1685
+ {
1686
+ rawData: message,
1687
+ "data-message-role": "agent-state-render",
1688
+ isLoading: false,
1689
+ isGenerating: false,
1690
+ subComponent: toRender
1691
+ },
1692
+ index
1693
+ );
1694
+ }
1695
+ }
1696
+ } else if (!inProgress || !isCurrentMessage) {
1697
+ return null;
1698
+ } else {
1699
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1700
+ AssistantMessage2,
1701
+ {
1702
+ rawData: message,
1703
+ isLoading: true,
1704
+ isGenerating: true,
1705
+ "data-message-role": "assistant"
1706
+ },
1707
+ index
1708
+ );
1709
+ }
1710
+ }
1711
+ }
1712
+
1713
+ // src/components/chat/Markdown.tsx
1714
+ var import_react11 = require("react");
1715
+ var import_react_markdown = __toESM(require("react-markdown"));
1716
+
1717
+ // src/components/chat/CodeBlock.tsx
1718
+ var import_react10 = require("react");
1719
+ var import_react_syntax_highlighter = require("react-syntax-highlighter");
1720
+
1721
+ // src/hooks/use-copy-to-clipboard.tsx
1722
+ var React7 = __toESM(require("react"));
1723
+ function useCopyToClipboard({ timeout = 2e3 }) {
1724
+ const [isCopied, setIsCopied] = React7.useState(false);
1725
+ const copyToClipboard = (value) => {
1726
+ var _a;
1727
+ if (typeof window === "undefined" || !((_a = navigator.clipboard) == null ? void 0 : _a.writeText)) {
1728
+ return;
1729
+ }
1730
+ if (!value) {
1731
+ return;
1732
+ }
1733
+ navigator.clipboard.writeText(value).then(() => {
1734
+ setIsCopied(true);
1735
+ setTimeout(() => {
1736
+ setIsCopied(false);
1737
+ }, timeout);
1738
+ });
1739
+ };
1740
+ return { isCopied, copyToClipboard };
1741
+ }
1742
+
1743
+ // src/components/chat/CodeBlock.tsx
1744
+ var import_jsx_runtime18 = require("react/jsx-runtime");
1745
+ var programmingLanguages = {
1746
+ javascript: ".js",
1747
+ python: ".py",
1748
+ java: ".java",
1749
+ c: ".c",
1750
+ cpp: ".cpp",
1751
+ "c++": ".cpp",
1752
+ "c#": ".cs",
1753
+ ruby: ".rb",
1754
+ php: ".php",
1755
+ swift: ".swift",
1756
+ "objective-c": ".m",
1757
+ kotlin: ".kt",
1758
+ typescript: ".ts",
1759
+ go: ".go",
1760
+ perl: ".pl",
1761
+ rust: ".rs",
1762
+ scala: ".scala",
1763
+ haskell: ".hs",
1764
+ lua: ".lua",
1765
+ shell: ".sh",
1766
+ sql: ".sql",
1767
+ html: ".html",
1768
+ css: ".css"
1769
+ // add more file extensions here, make sure the key is same as language prop in CodeBlock.tsx component
1770
+ };
1771
+ var generateRandomString = (length, lowercase = false) => {
1772
+ const chars = "ABCDEFGHJKLMNPQRSTUVWXY3456789";
1773
+ let result = "";
1774
+ for (let i = 0; i < length; i++) {
1775
+ result += chars.charAt(Math.floor(Math.random() * chars.length));
1776
+ }
1777
+ return lowercase ? result.toLowerCase() : result;
1778
+ };
1779
+ var CodeBlock = (0, import_react10.memo)(({ language, value }) => {
1780
+ const { isCopied, copyToClipboard } = useCopyToClipboard({ timeout: 2e3 });
1781
+ const downloadAsFile = () => {
1782
+ if (typeof window === "undefined") {
1783
+ return;
1784
+ }
1785
+ const fileExtension = programmingLanguages[language] || ".file";
1786
+ const suggestedFileName = `file-${generateRandomString(3, true)}${fileExtension}`;
1787
+ const fileName = window.prompt("Enter file name", suggestedFileName);
1788
+ if (!fileName) {
1789
+ return;
1790
+ }
1791
+ const blob = new Blob([value], { type: "text/plain" });
1792
+ const url = URL.createObjectURL(blob);
1793
+ const link = document.createElement("a");
1794
+ link.download = fileName;
1795
+ link.href = url;
1796
+ link.style.display = "none";
1797
+ document.body.appendChild(link);
1798
+ link.click();
1799
+ document.body.removeChild(link);
1800
+ URL.revokeObjectURL(url);
1801
+ };
1802
+ const onCopy = () => {
1803
+ if (isCopied)
1804
+ return;
1805
+ copyToClipboard(value);
1806
+ };
1807
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "copilotKitCodeBlock", children: [
1808
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "copilotKitCodeBlockToolbar", children: [
1809
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: "copilotKitCodeBlockToolbarLanguage", children: language }),
1810
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "copilotKitCodeBlockToolbarButtons", children: [
1811
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("button", { className: "copilotKitCodeBlockToolbarButton", onClick: downloadAsFile, children: DownloadIcon }),
1812
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("button", { className: "copilotKitCodeBlockToolbarButton", onClick: onCopy, children: isCopied ? CheckIcon : CopyIcon })
1813
+ ] })
1814
+ ] }),
1815
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1816
+ import_react_syntax_highlighter.Prism,
1817
+ {
1818
+ language,
1819
+ style: highlightStyle,
1820
+ PreTag: "div",
1821
+ customStyle: {
1822
+ margin: 0,
1823
+ borderBottomLeftRadius: "0.375rem",
1824
+ borderBottomRightRadius: "0.375rem"
1825
+ },
1826
+ children: value
1827
+ }
1828
+ )
1829
+ ] });
1830
+ });
1831
+ CodeBlock.displayName = "CodeBlock";
1832
+ var highlightStyle = {
1833
+ 'pre[class*="language-"]': {
1834
+ color: "#d4d4d4",
1835
+ fontSize: "13px",
1836
+ textShadow: "none",
1837
+ fontFamily: 'Menlo, Monaco, Consolas, "Andale Mono", "Ubuntu Mono", "Courier New", monospace',
1838
+ direction: "ltr",
1839
+ textAlign: "left",
1840
+ whiteSpace: "pre",
1841
+ wordSpacing: "normal",
1842
+ wordBreak: "normal",
1843
+ lineHeight: "1.5",
1844
+ MozTabSize: "4",
1845
+ OTabSize: "4",
1846
+ tabSize: "4",
1847
+ WebkitHyphens: "none",
1848
+ MozHyphens: "none",
1849
+ msHyphens: "none",
1850
+ hyphens: "none",
1851
+ padding: "1em",
1852
+ margin: ".5em 0",
1853
+ overflow: "auto",
1854
+ background: "#1e1e1e"
1855
+ },
1357
1856
  'code[class*="language-"]': {
1358
1857
  color: "#d4d4d4",
1359
1858
  fontSize: "13px",
@@ -1576,855 +2075,302 @@ var highlightStyle = {
1576
2075
  color: "#9cdcfe"
1577
2076
  },
1578
2077
  'code[class*="language-typescript"]': {
1579
- color: "#9cdcfe"
1580
- },
1581
- 'pre[class*="language-tsx"]': {
1582
- color: "#9cdcfe"
1583
- },
1584
- 'code[class*="language-tsx"]': {
1585
- color: "#9cdcfe"
1586
- },
1587
- 'pre[class*="language-css"]': {
1588
- color: "#ce9178"
1589
- },
1590
- 'code[class*="language-css"]': {
1591
- color: "#ce9178"
1592
- },
1593
- 'pre[class*="language-html"]': {
1594
- color: "#d4d4d4"
1595
- },
1596
- 'code[class*="language-html"]': {
1597
- color: "#d4d4d4"
1598
- },
1599
- ".language-regex .token.anchor": {
1600
- color: "#dcdcaa"
1601
- },
1602
- ".language-html .token.punctuation": {
1603
- color: "#808080"
1604
- },
1605
- 'pre[class*="language-"] > code[class*="language-"]': {
1606
- position: "relative",
1607
- zIndex: "1"
2078
+ color: "#9cdcfe"
1608
2079
  },
1609
- ".line-highlight.line-highlight": {
1610
- background: "#f7ebc6",
1611
- boxShadow: "inset 5px 0 0 #f7d87c",
1612
- zIndex: "0"
1613
- }
1614
- };
1615
-
1616
- // src/components/chat/Markdown.tsx
1617
- var import_remark_gfm = __toESM(require("remark-gfm"));
1618
- var import_remark_math = __toESM(require("remark-math"));
1619
- var import_jsx_runtime15 = require("react/jsx-runtime");
1620
- var MemoizedReactMarkdown = (0, import_react8.memo)(
1621
- import_react_markdown.default,
1622
- (prevProps, nextProps) => prevProps.children === nextProps.children && prevProps.className === nextProps.className
1623
- );
1624
- var Markdown = ({ content }) => {
1625
- 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 }) });
1626
- };
1627
- var components = {
1628
- p({ children }) {
1629
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { children });
2080
+ 'pre[class*="language-tsx"]': {
2081
+ color: "#9cdcfe"
1630
2082
  },
1631
- a(_a) {
1632
- var _b = _a, { children } = _b, props = __objRest(_b, ["children"]);
1633
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1634
- "a",
1635
- __spreadProps(__spreadValues({
1636
- style: { color: "blue", textDecoration: "underline" }
1637
- }, props), {
1638
- target: "_blank",
1639
- rel: "noopener noreferrer",
1640
- children
1641
- })
1642
- );
2083
+ 'code[class*="language-tsx"]': {
2084
+ color: "#9cdcfe"
1643
2085
  },
1644
- code(_c) {
1645
- var _d = _c, { children, className, inline } = _d, props = __objRest(_d, ["children", "className", "inline"]);
1646
- if (children.length) {
1647
- if (children[0] == "\u258D") {
1648
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1649
- "span",
1650
- {
1651
- style: {
1652
- animation: "pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite",
1653
- marginTop: "0.25rem"
1654
- },
1655
- children: "\u258D"
1656
- }
1657
- );
1658
- }
1659
- children[0] = children[0].replace("`\u258D`", "\u258D");
1660
- }
1661
- const match = /language-(\w+)/.exec(className || "");
1662
- if (inline) {
1663
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("code", __spreadProps(__spreadValues({ className }, props), { children }));
1664
- }
1665
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1666
- CodeBlock,
1667
- __spreadValues({
1668
- language: match && match[1] || "",
1669
- value: String(children).replace(/\n$/, "")
1670
- }, props),
1671
- Math.random()
1672
- );
1673
- }
1674
- };
1675
-
1676
- // src/components/chat/messages/AssistantMessage.tsx
1677
- var import_jsx_runtime16 = require("react/jsx-runtime");
1678
- var AssistantMessage = (props) => {
1679
- const { icons } = useChatContext();
1680
- const { message, isLoading, subComponent } = props;
1681
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_jsx_runtime16.Fragment, { children: [
1682
- (message || isLoading) && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "copilotKitMessage copilotKitAssistantMessage", children: [
1683
- message && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Markdown, { content: message || "" }),
1684
- isLoading && icons.spinnerIcon
1685
- ] }),
1686
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: { marginBottom: "0.5rem" }, children: subComponent })
1687
- ] });
1688
- };
1689
-
1690
- // src/components/chat/messages/UserMessage.tsx
1691
- var import_jsx_runtime17 = require("react/jsx-runtime");
1692
- var UserMessage = (props) => {
1693
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "copilotKitMessage copilotKitUserMessage", children: props.message });
1694
- };
1695
-
1696
- // src/components/chat/Suggestion.tsx
1697
- var import_react_core6 = require("@copilotkit/react-core");
1698
- var import_shared = require("@copilotkit/shared");
1699
- var import_runtime_client_gql3 = require("@copilotkit/runtime-client-gql");
1700
- var import_jsx_runtime18 = require("react/jsx-runtime");
1701
- function Suggestion({ title, message, onClick, partial, className }) {
1702
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
1703
- "button",
1704
- {
1705
- disabled: partial,
1706
- onClick: (e) => {
1707
- e.preventDefault();
1708
- onClick(message);
1709
- },
1710
- className: className || "suggestion",
1711
- "data-test-id": "suggestion",
1712
- children: [
1713
- partial && SmallSpinnerIcon,
1714
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { children: title })
1715
- ]
1716
- }
1717
- );
1718
- }
1719
- var reloadSuggestions = (context, chatSuggestionConfiguration, setCurrentSuggestions, abortControllerRef) => __async(void 0, null, function* () {
1720
- const abortController = abortControllerRef.current;
1721
- const tools = JSON.stringify(
1722
- Object.values(context.actions).map((action) => ({
1723
- name: action.name,
1724
- description: action.description,
1725
- jsonSchema: JSON.stringify((0, import_shared.actionParametersToJsonSchema)(action.parameters))
1726
- }))
1727
- );
1728
- const allSuggestions = [];
1729
- for (const config of Object.values(chatSuggestionConfiguration)) {
1730
- try {
1731
- 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.`;
1732
- const result = yield (0, import_react_core6.extract)({
1733
- context,
1734
- instructions: "Suggest what the user could say next. Provide clear, highly relevant suggestions. Do not literally suggest function calls. ",
1735
- data: config.instructions + "\n\n" + numOfSuggestionsInstructions + "\n\nAvailable tools: " + tools + "\n\n",
1736
- requestType: import_runtime_client_gql3.CopilotRequestType.Task,
1737
- parameters: [
1738
- {
1739
- name: "suggestions",
1740
- type: "object[]",
1741
- attributes: [
1742
- {
1743
- name: "title",
1744
- description: "The title of the suggestion. This is shown as a button and should be short.",
1745
- type: "string"
1746
- },
1747
- {
1748
- name: "message",
1749
- 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.",
1750
- type: "string"
1751
- }
1752
- ]
1753
- }
1754
- ],
1755
- include: {
1756
- messages: true,
1757
- readable: true
1758
- },
1759
- abortSignal: abortController == null ? void 0 : abortController.signal,
1760
- stream: ({ status, args }) => {
1761
- const suggestions = args.suggestions || [];
1762
- const newSuggestions = [];
1763
- for (let i = 0; i < suggestions.length; i++) {
1764
- if (config.maxSuggestions !== void 0 && i >= config.maxSuggestions) {
1765
- break;
1766
- }
1767
- const { title, message } = suggestions[i];
1768
- const partial = i == suggestions.length - 1 && status !== "complete";
1769
- newSuggestions.push({
1770
- title,
1771
- message,
1772
- partial,
1773
- className: config.className
1774
- });
1775
- }
1776
- setCurrentSuggestions([...allSuggestions, ...newSuggestions]);
1777
- }
1778
- });
1779
- allSuggestions.push(...result.suggestions);
1780
- } catch (error) {
1781
- console.error("Error loading suggestions", error);
1782
- }
1783
- }
1784
- if (abortControllerRef.current === abortController) {
1785
- abortControllerRef.current = null;
1786
- }
1787
- });
1788
-
1789
- // src/components/chat/Chat.tsx
1790
- var import_react12 = __toESM(require("react"));
1791
- var import_react_core9 = require("@copilotkit/react-core");
1792
- var import_runtime_client_gql4 = require("@copilotkit/runtime-client-gql");
1793
- var import_shared3 = require("@copilotkit/shared");
1794
-
1795
- // src/components/dev-console/utils.ts
1796
- var import_react_core7 = require("@copilotkit/react-core");
1797
- function shouldShowDevConsole(showDevConsole) {
1798
- if (typeof showDevConsole === "boolean") {
1799
- return showDevConsole;
1800
- }
1801
- return getHostname() === "localhost" || getHostname() === "127.0.0.1" || getHostname() === "0.0.0.0" || getHostname() === "::1";
1802
- }
1803
- function getHostname() {
1804
- if (typeof window !== "undefined" && window.location) {
1805
- return window.location.hostname;
1806
- }
1807
- return "";
1808
- }
1809
- function getPublishedCopilotKitVersion(current, forceCheck = false) {
1810
- return __async(this, null, function* () {
1811
- const LOCAL_STORAGE_KEY = "__copilotkit_version_check__";
1812
- const serializedVersion = localStorage.getItem(LOCAL_STORAGE_KEY);
1813
- if (serializedVersion && !forceCheck) {
1814
- try {
1815
- const parsedVersion = JSON.parse(serializedVersion);
1816
- const oneHour = 60 * 60 * 1e3;
1817
- const now = (/* @__PURE__ */ new Date()).getTime();
1818
- if (parsedVersion.current === current && now - new Date(parsedVersion.lastChecked).getTime() < oneHour) {
1819
- return parsedVersion;
1820
- }
1821
- } catch (error) {
1822
- console.error("Failed to parse CopilotKitVersion from localStorage", error);
1823
- }
1824
- }
1825
- try {
1826
- const response = yield fetch("https://api.cloud.copilotkit.ai/check-for-updates", {
1827
- method: "POST",
1828
- headers: {
1829
- "Content-Type": "application/json"
1830
- },
1831
- body: JSON.stringify({
1832
- packages: [
1833
- {
1834
- packageName: "@copilotkit/shared",
1835
- packageVersion: current
1836
- }
1837
- ]
1838
- })
1839
- });
1840
- const data = yield response.json();
1841
- const version = {
1842
- current,
1843
- lastChecked: (/* @__PURE__ */ new Date()).getTime(),
1844
- latest: data.packages[0].latestVersion,
1845
- severity: data.packages[0].severity,
1846
- advisory: data.packages[0].advisory || null
1847
- };
1848
- localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(version));
1849
- return version;
1850
- } catch (error) {
1851
- console.error("Failed to check for updates", error);
1852
- throw error;
1853
- }
1854
- });
1855
- }
1856
- function logReadables(context) {
1857
- console.log("%cCurrent Readables:", "font-size: 16px; font-weight: bold;");
1858
- const readables = context.getContextString([], import_react_core7.defaultCopilotContextCategories).trim();
1859
- if (readables.length === 0) {
1860
- console.log("No readables found");
1861
- return;
1862
- }
1863
- console.log(readables);
1864
- }
1865
- function logActions(context) {
1866
- console.log("%cCurrent Actions:", "font-size: 16px; font-weight: bold;");
1867
- if (Object.values(context.actions).length === 0) {
1868
- console.log("No actions found");
1869
- return;
1870
- }
1871
- for (const action of Object.values(context.actions)) {
1872
- console.group(action.name);
1873
- console.log("name", action.name);
1874
- console.log("description", action.description);
1875
- console.log("parameters", action.parameters);
1876
- console.groupEnd();
1877
- }
1878
- }
1879
- function logMessages(context) {
1880
- console.log("%cCurrent Messages:", "font-size: 16px; font-weight: bold;");
1881
- if (context.messages.length === 0) {
1882
- console.log("No messages found");
1883
- return;
2086
+ 'pre[class*="language-css"]': {
2087
+ color: "#ce9178"
2088
+ },
2089
+ 'code[class*="language-css"]': {
2090
+ color: "#ce9178"
2091
+ },
2092
+ 'pre[class*="language-html"]': {
2093
+ color: "#d4d4d4"
2094
+ },
2095
+ 'code[class*="language-html"]': {
2096
+ color: "#d4d4d4"
2097
+ },
2098
+ ".language-regex .token.anchor": {
2099
+ color: "#dcdcaa"
2100
+ },
2101
+ ".language-html .token.punctuation": {
2102
+ color: "#808080"
2103
+ },
2104
+ 'pre[class*="language-"] > code[class*="language-"]': {
2105
+ position: "relative",
2106
+ zIndex: "1"
2107
+ },
2108
+ ".line-highlight.line-highlight": {
2109
+ background: "#f7ebc6",
2110
+ boxShadow: "inset 5px 0 0 #f7d87c",
2111
+ zIndex: "0"
1884
2112
  }
1885
- const tableData = context.messages.map((message) => {
1886
- if (message.isTextMessage()) {
1887
- return {
1888
- id: message.id,
1889
- type: "TextMessage",
1890
- role: message.role,
1891
- name: void 0,
1892
- scope: void 0,
1893
- content: message.content
1894
- };
1895
- } else if (message.isActionExecutionMessage()) {
1896
- return {
1897
- id: message.id,
1898
- type: "ActionExecutionMessage",
1899
- role: void 0,
1900
- name: message.name,
1901
- scope: message.parentMessageId,
1902
- content: message.arguments
1903
- };
1904
- } else if (message.isResultMessage()) {
1905
- return {
1906
- id: message.id,
1907
- type: "ResultMessage",
1908
- role: void 0,
1909
- name: message.actionName,
1910
- scope: message.actionExecutionId,
1911
- content: message.result
1912
- };
1913
- } else if (message.isAgentStateMessage()) {
1914
- return {
1915
- id: message.id,
1916
- type: `AgentStateMessage (running: ${message.running})`,
1917
- role: message.role,
1918
- name: void 0,
1919
- scope: message.threadId,
1920
- content: message.state
1921
- };
1922
- }
1923
- });
1924
- console.table(tableData);
1925
- }
1926
-
1927
- // src/components/dev-console/console.tsx
1928
- var import_react_core8 = require("@copilotkit/react-core");
1929
- var import_react10 = require("react");
2113
+ };
1930
2114
 
1931
- // src/components/dev-console/icons.tsx
2115
+ // src/components/chat/Markdown.tsx
2116
+ var import_remark_gfm = __toESM(require("remark-gfm"));
2117
+ var import_remark_math = __toESM(require("remark-math"));
1932
2118
  var import_jsx_runtime19 = require("react/jsx-runtime");
1933
- var ExclamationMarkTriangleIcon = /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1934
- "svg",
1935
- {
1936
- width: "13.3967723px",
1937
- height: "12px",
1938
- viewBox: "0 0 13.3967723 12",
1939
- version: "1.1",
1940
- xmlns: "http://www.w3.org/2000/svg",
1941
- 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)(
1942
- "path",
1943
- {
1944
- 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",
1945
- id: "Shape"
1946
- }
1947
- ) }) })
1948
- }
1949
- );
1950
- var ExclamationMarkIcon = /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1951
- "svg",
1952
- {
1953
- width: "14px",
1954
- height: "14px",
1955
- viewBox: "0 0 14 14",
1956
- version: "1.1",
1957
- xmlns: "http://www.w3.org/2000/svg",
1958
- 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)(
1959
- "path",
1960
- {
1961
- 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",
1962
- id: "Shape"
1963
- }
1964
- ) }) })
1965
- }
2119
+ var MemoizedReactMarkdown = (0, import_react11.memo)(
2120
+ import_react_markdown.default,
2121
+ (prevProps, nextProps) => prevProps.children === nextProps.children && prevProps.className === nextProps.className
1966
2122
  );
1967
- 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)(
1968
- "path",
1969
- {
1970
- 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",
1971
- id: "Path"
1972
- }
1973
- ) }) }) });
1974
- var CheckIcon2 = /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1975
- "svg",
1976
- {
1977
- width: "14px",
1978
- height: "14px",
1979
- viewBox: "0 0 14 14",
1980
- version: "1.1",
1981
- xmlns: "http://www.w3.org/2000/svg",
1982
- 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)(
1983
- "path",
1984
- {
1985
- 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",
1986
- id: "Shape"
2123
+ var Markdown = ({ content }) => {
2124
+ 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 }) });
2125
+ };
2126
+ var components = {
2127
+ a(_a) {
2128
+ var _b = _a, { children } = _b, props = __objRest(_b, ["children"]);
2129
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2130
+ "a",
2131
+ __spreadProps(__spreadValues({
2132
+ style: { color: "blue", textDecoration: "underline" }
2133
+ }, props), {
2134
+ target: "_blank",
2135
+ rel: "noopener noreferrer",
2136
+ children
2137
+ })
2138
+ );
2139
+ },
2140
+ code(_c) {
2141
+ var _d = _c, { children, className, inline } = _d, props = __objRest(_d, ["children", "className", "inline"]);
2142
+ if (children.length) {
2143
+ if (children[0] == "\u258D") {
2144
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2145
+ "span",
2146
+ {
2147
+ style: {
2148
+ animation: "pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite",
2149
+ marginTop: "0.25rem"
2150
+ },
2151
+ children: "\u258D"
2152
+ }
2153
+ );
1987
2154
  }
1988
- ) }) }) })
1989
- }
1990
- );
1991
- var CopilotKitIcon = /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
1992
- "svg",
1993
- {
1994
- width: "33px",
1995
- height: "35px",
1996
- viewBox: "0 0 33 35",
1997
- version: "1.1",
1998
- xmlns: "http://www.w3.org/2000/svg",
1999
- children: [
2000
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("title", { children: "bd5c9079-929b-4d55-bdc9-16d1c8181b71" }),
2001
- /* @__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)(
2002
- "image",
2003
- {
2004
- x: "0",
2005
- y: "0",
2006
- width: "33",
2007
- height: "35",
2008
- xlinkHref: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAI0AAACXCAYAAAAoE9hYAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAjaADAAQAAAABAAAAlwAAAACI8Oz3AABAAElEQVR4Ae2dCYAlVXnvv6q79d7TMz37sIMgKKBCkLhkSKK4xJUMQVzAqJBgNDGJa2LsvJfERI0aiEbwRXnoQ2VYRASiQUFRUGQm7DAwzDBbT+/rvbfvXu/3P1V1+84CzEw3MNPD6a579nOqzvev73znO0t59rzZbQu88sXndp2w4gVLp5oG+6+47ivDu010kAb6B+lzP+Vjr1zZk0xV/ddMVIufap/34g+e+s9rX9351U1dT5npIIpMHkTPusePmto+tKhctVWPDW1/c27hIVNbCsFbCpa7/aR/f/SWFV2ZX974zsNG97iwOZjwedDshqiZlL3AD9JH9Y8PpTYMPJEuLj7+pclE5vBquXZ6MV/56Zu/ueGnmWpqzer3HzKym+xzPsib80+4lw/Y09Pjr7lm9GO+eR+eKI4tXdeRsomXv8a6Dj3eqn6iRoPl5qW83o60vyaT9O5IWPX2llrH+hsuXJbfy6oO2OTPg2Yn0p1/6ueWFK1wWTKReo1XDZoeqw7YxhcfYfNf9NtWSHTYVLVqxSAIqoFlU76NzEt6mzqSCQBkt3up1NrlHUdsXX22V92p2DnlfR40O5Az8N57+pfPgcv8YzLZdHjKS3i9uS1254Kitf3271qq81ATGkq1wPJCDVexEtS8oFZKpBLZeWl/w7yE98uUZ3cnLPhNefSFmx7s8Uo7VDEHPM+DpoGI71v5xaODkn02kUi9Ne03Jz3Ps2Jh3O4ubbCB006yzqNPsYrfYhbUrBwEBnZstBLYBFIzSDIXQB5LeOY3JXoXJv3/afP9H9dqdtv8XHb9mp5T5kQX9rwg3ACaaiF4ZcL3T0x6KQATaiNS6RZbmm+yib7tFiwfM7+1ySTYJACMuE6zktFP5X3PKgDIyoCnULFavrKs3/eW9af8N3qZRN9wU9N9R33hgZ8kveRvyuXs2g2fOGW8oeoDyvk8p4nI9Z7f/eLyZMn/AkR9azrR3ASvMHgJsXRD2X67q3nUci87yVoPOQluk4apBI7blNVVkSyLXRHrURZYiwlAdF8EhmFqaV5RL+XnM+nEffN8W2OJxG2e1R5MpPz++dUFxWMP+3lh9dln7/fy0POggZYaMT3xo67XpnzvX1PJzPFJP2PIusAFonNVK1P2QOEJ23z0Qms/+dVWycwHNDUHnBJJCoBl3PVQ5HDAIZD8rrvCcragUI0BRGCSpk95401pf327F/w64QcP1FLN92Rq3qZM81h2xchUaeVnVpZ6PE8w3K/M86CBHBe86tKlQa3wlwk/+cFUoqVZXVMAKAQYcRSDbn3ZrfZAe8EqLz/dMguPtrKHqEuUZBsxkzxgEbcpi7u4rPw4O/KL7MrAvwOPQCSOFHEg870KHKevxfc2pBOJe2F066pWe6g5mehrSVo2KLdM+C21wvoPHV225xhIBz1oVq26KjGvt/+Nnnl/m0o2n5pI0IeIsIDGWVBedr44bg9Vttn2E4+wjhecYuVMZ8hAAIp6InGbCTBQhJuEeCOQsJDjqDxd8mPrR7ZAFaeJw0URBGlL+oVEwgaafX+T79umivkbkKWeyPjJrS1+ZSRhifFMMjNR7U5MPLHp8JL1PHsc6aAXhDu2TnQGvvdKRkwvSAIYDw5SC2ADIp4jJDaOTLLJFpeabWRgwCrLRiyZ7rAy7ECDJQ8wpEjVjLuMQFxVRknLngrA9uVXObgVF0S2hGgVoHAllRGwwq6sqeoFh2a5LGGvskStAAcc8xLFrRXP206Ovlott63Sm3y8LbOud8nFj/UlvMmxtnRtbM0FLys8k9xId3zQGsdl+gdP84PEF1KJ9OmpRMa1RbUmqom44jL6Q36hK8kWRuy+1KBNnPhCaznyZVZJNiPritMg9wCKEnaWrHnyqedxQBHbESAcR1GxKjcs3rlxOqOw3RnlazQRxgBFYAl/Cq40giy2vdn3NgaJxBMJv/ZgS8bvbc/4A8lydaw14eeqqdzEmgtPKTcWMxP3Qc1p2scmFyc8/3UJL/FiAcZHlpGAK/2MBOHQhFSSnNOUarPu8pils0PGINxGLAND8WEEGLhJAnw0wT2qcJIC+R1DcdxF8VySdxxnaSw7dquQnYyqhnOFJrZJrywBBVdqLVaxFtCwAg53qiWq5UzCHylXaqMTU9brIw+1+tbfWWldd9IXHxpIJoLBZCY9kilXpyrJYi7d3zGx8jOH77WwHd9JdGMHj9Wz8tZkf/Dwa7wg8Zl0svk0N2KCEkwQOOA4ARhWEY+iZNdqZZsIhm3By5qtdNwLbU1hqY0DH1FQHMdxGzhDEaJOYGsILkZDIeFVd8dhje0dgaExqE6dyOGsRrfKacig7lBIFUABm+f7tWY/KACkQbA65vneIIL2cMazyXTCG0glElsyCZvgxZmyWmXKTyfGWpPJscHc1NT/jCUqlsoFJw4+UFm06RfFyuCjudtuu62i2g5aTjNU3rDISyTfgODruEw8YqqpxSGyGEIAAdQLiBDqpESNxQvm2wsOa7LtqSnLTObQu2QizqRoyTbkASxViJYjyPUJyurYjsrCTbyTYyL6h4THE/uJDRM2BDQ4w3RR+jjccbAozOV3Jfj5mteSD4LDCDrM5/6yPBDjvmoq4RUSXpBtTnilZq9aSfpW8CvVXD5ZG68EyUnzikzB1aqPZw4tVg77/bHjW4/+1etftfC2m29fPXRQgub8ld9sCqrVF9ItrUz56Rbf1/BZbCCkm7onEVI9QBgSERnCd3Q3WWtXxiaGxq00mbJUV4cFKPscJkiNvsXlaRYwAE4Wn4bkrkCVqyL147hPFC5rFyN2gXHCtHNEeRUWXWFhkd8VvEucerc06WSrRCwYjie6t3EPbRXJYAQmEdwD6irAHlO1YiWVG6mWhweCyuQAPGi8XCoUTignukdXrVp160EJmiYrLPH8zNmJZPK4FJzCGahO22F8GjjSz7gQhYdAgN1b17K0+anA+h7rs4lK3lo6llg1AWigiBchR9xJwHP5CM/icsARoJQmtgUc1SHryYyAFpvYraDYrbg4SRTmgxCN5gSSBD9pbBFawEmQWMl0aWSvzA5QvDR+ecqq+WFvcnBLakHvllStr8/aJkdtHiUUUi3ztle212657YbaQQeaj5x+VXMtUTwTAeVt6WQm6QMEJ/TSgHXahQigOSXjqF0VWbNMm29ti5JWypattGmK6YSCVQ8ftWSGlxYSSa5RcobwTjhOwWFaCUFWNsbAWlIR9kwCjgqOQCbSuYzOsfMPafl3ZmdbgS5MhAcouB04qE+gkdsBBDsGjGzlEagVnwjQAE1NWHmyz/L9W6za32udA+O2rNJirbVWeqiKsUykmEk0PZzIDj9AluCgAg0k9S5MfGthc83elkgmFkiRp0YV8eqACduUcHQwDgR6X3kLSdDayQiqw2x8O0SZzFirN27V0QFLdyxkGqnFEU7UV9oK2fRWCxut/IifFQCjgCNBuRYDh3BXue7jyYy7RyJ1K85oZkyzEPzwAOIYGsFpZkJ2IgKEezb8SivgiveF4CEsQNqaGrXSWJ8Vejdapr/fusbytqDSZIsSS6y9eR65zIa4ysZUv+fdc+zjfzF8n93hwOYiD4afj772Wy1NleC1NN1vo5eByYRDbPfC0+CiQf0XArtuRqo6JSBt+5KkJaBUdoChdaXZumrj1j/Ub7VFK8xvb7EahEnx45R7gEOE8slbBiQiXELgwV/ALwFZQ/NQz6N6n9owke7AoFSurDpAFB7etcLFcZwKAHcIFKUHLspPvYlakS5ozAqjvTbVu8FSA0O2aKJoi3ie7tQKa2lpRRkdCfe8LAlUEZVqYYzmeHC1hZOpBxWnqdUC1v4m/iKdTranWQgMDc2XAKg/GtsNanCLdYsAjjwkqjAMT6GA6VrhWxk2Md5XsXSiybqCVts+OGrFsUFrbetmxMTst/JTpt5yn7wChwRRAUplJumy1HUILJKPBRyNY52sjL07Q1Euj8qUkeW6HrnxxBwkjhdwZEIbENEFJUpTFoD27HCvFbc+YW2A5Yhszbr9DutuWmpNTa0Ai1K5r/Av5JJowkvmTW2s+JP3u0L5OWhA86HX35SplUY+7Cf8E1LpFIwDQroRDqSkoTRKEetmHR7ekIQSbBOMrKpQta2bkROcZnx7xfKjUsamrCPRZl3jfTY50GteN9r+FuCgMhxAICXFqEy3OoLy1V3pPwSMwBpWLZ2f3LEhiZI5IAloMgJjnF+RcbjSiZO4fxcuCKlAngfB1grIK/Snk8PbrYhgO28sZ0dMJW2hv9A62+ZZiukRdcVhlmnoqowqYGPWf6TcvPBXP/j5lwfdjfBzUIAGQdf7+GuvfmXF89+cTCctlQofO34z1RhqavACBWhw5yAMQjtdDeDpWIzg2BzY5GDNWClhgA+1Hl1UIWW5wSEWXTEf1dxOphQEFolpXBAjW7/wHziZuAs1qR6MMEvRrttQikbj8hMQhyJ94Qu7HuVxBlvgCWP0q1rgKuWSBVMjlh/aYtnBXkv3D1k7XdBR1Ywt9hdYZ0snwm0IFpW/Q91hMa5eacdZlDYy0dZ5N8nqiDooQPPRM7+1MKglP5FOp+enm3lkNQwm5Cw0GlTQCMq9o7ghr2siyTxV1LySYzqXI//AcRhkGC+g+WjDUgBkHtxmYGzMSsN9TiD2mf2uggpxMRFXLc3cUESEEDghgNwtuHjpRwQmmYhmYeRufqNbdzHqfuSXwG7VogXFrFUmBy0/0mvV7b0WjIzb8nxgy4M2m5/qthZGeX4Cbqjn1Z/yycSFOpsf/qUZ94JqrZhKPjbc5K8JE4a/cx40LLBKTt6ReT3d9avTzSjjkChdt+QaLXzrpcF1wq7ai3Z0RFX7QHGPvqa5kxEQ3dPUeGBTYyRwxJKdtLYkXVRx0gYGB6y6iHmpjLiNhOgQMFiOQAKPAykEk1v0chexZHBhOJwJ+RRORdUpKmcoa4U5NEpDM1cRV5m04ni/FYe2W7m/zzLjWQeWRV6HdaQ6rJmJVZ/u1IFBRYYFO1fdqxuN6nIvj+7aD4rFVGLNkYmugUbUzHnQTNx53Akpz7sg1YQkk0YqgJ+H8oC4iwhH40RgUc+kPsNNJahrQigRdxGXSbUENrYJGqHiTdA1KU4FpJEJukttNtzP8HUZ3GbeYt7mZleJ4wAqEmKE77YIE5JGdTaCwgHJxUYpuBclCQEUcir5fdWLkFWVrJIdtfJIv1WHByw5NGYLciVbWEpZZ6Lb2ptaLEUXZCz1kOFp+FUJDWYH7w4emqEWMO0wNpH07/7x6h2XoM5p0Hx81VWdXs7eiT7m5AzL3xKMTQUUdqY4sKgdJew64KhNFYkRR1D70mx0TTXrXEY4tMoOkLaSABSKUxrgBQtrS7VaW27MxuA2vOLmt2gSUybkIGrkGBTKJtDKFnBc3bjjYTJOZxSve3BCrgthIF8uWA2uUpoYtiKCbW1o2NKjE7aARcrd1SYE825ra251Qrp7OygkBIsrIPpxJVO2HnJXE4bqt0Yvm+hdUq49uHOqOQuaq1iR9z9Tidf4SW9VpjnZlExBFtqrsa0cRlzDRsDRyAl2o7UzbrgK98+g0GtfUbXCJFsrhxBEWU7nqE5aAUHD8wyg6co328TgsFXGUfY1tQMmlPdwK3Evx8lAgMgVcphpUmqorwgXF1HHhRHicx+1aokeKM88F0AZHbTKQJ+lhsdtXrZkXeWkdVm7tdL9ZFLN4IR7E71VXvQCREWG4c5DAqXZyYTSEVHcj56fOyz5yeTdR1ZO7N0p6dwdPd1v6eOTyeCdybS/nG4pVlk0PD/N5Bo3bmc1Jk1FmJvxFjtgLNzazfRBR2AjjyWskhfnEcHV6iAqIk6CuaeuRLsNTgzaFAJxav5S85sBjeJdsQIMHkz4GwHIhfBDmjicjXe85GyBqbIeOTdu+fEhFHGMdgcHLc1weUGuZvMrSevwu6wZoGgdkBsyx2WHBYUPFZe/O5REcTFYKMSlEmicWI4OkvHi2p7bzqCD3tHMSU7zyVU3LfRrpYsYXr8i1ZxMSSejFzo2cbtGlKq/lSEXQNjkha0BGI9epm0p4ABA+UHkoarPPBPkr6LJVSNja1gqrW97upPh96Rt6N1urUsPtWQLs98RIWJIqD7VLWCGwItvCqmH1YLqfkqUMQVQ8qNDVgQoLcMT1pkvA5S0dRrzQckWOBkLxugW4+dw9/0UwIifuw6QOK0A3eBWV+gGAXqmlD+YSgR3xnkb7TkHGinxMlZ6jZ/wzkg2JeZruFxv3YhGcUM5rwjoiCgOE3KEkAPR7bTUrKUbjfAUr90EsgxlaSMAEqJLGwKHRVt0VSzkctrVvmFGMSN91rxghdWSmnESaaOKHUmoI7olx1UQamsMlYu5UZtATikPDVkwzJrAyZItoN6FNea42EPeJK7CCEgz7SoxBF0jKZ/MHT+t4nX/8b04r0JcRtn6cxyRBqCre7jW5W90kTv9zDnQdDRPnYbk8X64zFHwGMY5NEpMpPjhd9dwIKdODLnpJZrnMzrqrDBNwGLzfMK0ikIAc1wI8IiANbiYdDnS6XQ2zbdulHyD2/ssWDFuibZFACQUe52conopIKE1yBW4CkCZHB+0yf5tDJWHLDmaQzYKrLuGUJuErySZB0Kv4lR60TPoHp/ckAgT/k67ph8XWEx7SEdK9x/mYFEIL0CVZ2HGPOn/8pLVF+W+ah90ZTb+zCnQfHbV9UcXzT6EHPNbmUwyqW5F635l1NhqGicghm2l4GkD0WUECqXxEElaFtGAaWalWasmfY1AI3rXmPnTdINPFyYAJdRdVRPWyjzOolKXjaBUq2aHAQ2b6ihIJaMoM5/5nwpD5SxAGUf2ybLV1x+atA7mgA5FWzs/iZySbrWMFrgzVHb3q3vSje3WhMQOf5Ug8tcDYn9kuzJwu/84LLRBE8HcqcceC98rsWbkbkJ2W/WcAU3Pqv+aX/HLLHnwXpnJpFrontxb5cAStlPYqFEzNLxwLrzuJ17LFvxMzdJdyBkVFPPZFAKwdDyARfKOZFUpBLnEZRicAhwAxNqE7nK3LSzkrDAG56CLYt0tKycnbAoheWRgK9MQfVYcGKb7KdqSYsq6mfSchwKuKd0cDpUhXdhNToMlJq+j+c4/jc8Wxe3ITfR4KkGgCI1zRQ88XXYoz/BUzJr7m8e9zC5D7Sj73Bg9reSMvIRfXIle4Wy4zCJkDxn3jG7YNN1a0dskZMRtGUeqWTFiC4wX0m10TS1VlGhMWE6FmmTpZcIph2nQ+Exfo22PgIQiEC3swrFWe2yg35q6nrBaqslGezfZ8JYt5g1OWDtrKw9HTulKzLOOTAeykHZBTAu17qYh3PRdhSHR3cWeuh0/ZxwQ5uOX528sI+QiYarpmCi1aytAA4dVe/mp5G8OO+29w3bzH8fF7mDPCU7zu0tfeiyPegES/ylpZrClxHPtoEfVyEncBVvvbtjIalS8siLbuaNmFm6aOljRlq5ZaYQhFENcFL8ug+ve6pyGSUkaWmGsObZiscDWXOSUYNIe2bjdmkf7bSkASQ+X7egiM8upZdbGNEMKIMG2VCB3FLI+9xs6XWhjnNy6zfjXOeMfFxHDIEwVpozcWHFsY34XVo+j9WiIqqYlCNPJFj09vCFPYg5o0EAs7+/P++EhiVrij9C5vTrdFHMEnlYNQkOEoMCDCZU1zqmWCbkN3kjTLhcA4BewpLoqbmhdmUwbq/yYoIzIq26JRG7GmpFPqVK0bClrfbkR24hi7/HJEdvC0LmA/DI6mbeXJA61o1qOZQjO/A9iuTTJ8KUQaJSjTqHeEYW3Gd1gBCjdkDN6ILmVKEy4U/IwWZy2MY1LGIJU0a5diFfbhIDSL92wx4vi+1kv5d3ZUNguzgMaNB9/3w9Y5pJaGST8d6QyfjOXk/xdo6pBXKO4VgoZjUNQ2AZyat2LjAvG7/Ih4CZbWBfbzFAa7lArhKv1xBgEFu2+rARFy5VzNsTa2s0IvJsZBT2SnbTxEkBDj2IdC0AGfdwkW3gZJje3tMNYWKCFMKRhti5BsOZeZoFQdTeAJ8KJu0d3X7z0Lkye+FKeaRPf/nRI+HDT4QKJ66SiJCFQXH+sRFGdcOm+TN5/bLqcXV0HLGgu/tBNmeKU9zLGtB9JphNHp5vYEk+35AyNowZXs8Rt7GIIDBVh9eCoRaJ0+JQu2Va2RKbK4iW6EVT1ASegTbGgSRxlOwDZlh+3zZNjtrlQsCGwEWiolV4MWFhAnG6jAPwsVTC40PrCmB3v51HKcRiSph64PMlB/GllnxZ8aWmE6+Lc3TSAJ7ofETa877jH0F26J3I59FP3OUcEiCgwhE88ixUGht10mFOpxf30C6zue8n85rF6wbtxHLCgKU3VXuR56Q8m0t5JDjCsb3ENETWUQCPkqLHVaDFYGruoKIkShk0DvTy6IYGGiR+WU1dtmC24A+heNjD305ebsI1TU9bPot+a1MWsUWEPCxNUrQCFYbJUya4sFUStTfOsd2oTuzCz6F26HFjcUlDN7ZBEo68AdueAoy7L3YXyqvsLbyn+1R0Cs8i7Y2T8crjniTO4+3AxhAgwKjd6TnyhM/S7dkOY19kHTO7ed/ZOs9r1IiPHAQeanp7A7+q9ZQXnI14Ijd7MZCQbJQUYPRE/ssO2ICxunCiI8Ph9U5qQBEqs0U/FCkXOVGwuWmsr229zZfvJo5vtsW2j1lsqWS8cIvAARmYpi2vgJk1cblJSQBERucJ+JvRKUGrttqnJfttQHrblzYvAFF0XlYrTCBQ6ItRxGHEeaRNViitDb7zIHIbpDlVDaKZdcYieTn+hCW3llmJRvjAOl4uK4ndwh7XRzedGkxmt0ntKc8CBZsWWO+dNpr03JYLE21jsnQ71J9EzCiRyhu3iGsuBKfK7AZRC1S0w4ajRQplZ5ByzyGPoVrZnWZOyNGWLU122abBkN20bJxziq+vR3pUMRNcwyikCVSgEjFmCaOmCcET1GbPf4jYbSuP24sq4daOLEctz3I9kjFXIzv1oKtwBCcEYZ4AyKFxqGnOWqEjFkSesRw75wsrCl0ZhoZH0Mh3WmGZHt9K4MsXp/MTWfMp/PC7jyewDDjS5xOSbmDb862ST351i9zp7TONWCpuPVlCIGkO21Pfh8gQUdQixZTbxCySTpZwNMjk4MJVDkM3acKFko6R9w6GL3RLhe9nXlG89BjkF7iJVsBsiuxIpNJYtVFFYffgrj+KwxTF0QFL7IhsYGrX1pSFbkOkGb+zGFJX40b1LUeiKw+0EZMk9SiDZx8k6YcmkqkNEzxYSWnHh8+56H8TU7w1H+O8CXXAUJ25cQ12gEqeSTfd01vyRuMYnsw8o0Fz8J//9EkSAD6L1PTwJYKT1Vcvo+XdsiNAv9l5jWFyAm0wy2hlGhT9UyNoWB5KijZbLNoY2dwL5pOrNt/kL2m3pohZGRr5tmGqzcgtcxrU8JIqBImqFQ6mwTesVK0IX3EFEj8PhUOVUuz3CSVovas0h22ibS8htxFUc5pVFWFM3pXySdRzLoRjSqDj+wyKxZXYAxA5+F6uf6TRqI3c/LjhyRwGyqEA8jlMAHso35wthqif/PWBA80/v+NFxtYT32VTaf5l2FGhRlZ43bgyam7amy0E2qcJNsuhJJhjtDOQnbBvcZAMC7ASySQ6QTPocFcL6F/bZwkXocphBlnxy9ArPjpxfYBjt21iOUVM0H+W4h2QUBwaRL6KiKKwwGVFX4Y4IYh9RuA4+QrYZGN9k/aUR6+AELWaxiBah4u4oeo4IPO7tV/6o63Npo+JVQSj3uEpdfaoydjh3GEDbyBFxPpcmqieGn6J1gdhqKpktesHa3m1sZXgac0CA5h/OvfEw9JV/zl6j32FeiQVl6uvpbnhYrZovViocPz/lup3hKXU1OXuikLeREgIt5/pOIiOM1Uc7AokuuhwWT7kRj4hPH3ZIZ5GF2IH9bJKTEYuqg0uNGpv4tRc46pdr9dDr0hHnujKliQxbXEu5AbqoUTuktthamLmuiaCOrQAckklnFHajeKhHKhzFqBQtSXVdVgREt0Q1Kjp+aUKvOIraRHZ4425BWT1tFIY/XB0oh6Cr5abB9kTN37hy5fml2257b5Rj99Z+D5o3vvJPu1K11F966co7UulKE4p9G+folJw4STmPXJJ3INmIzmQE5RrnPpMiZXmUbJXUPAs00nEgkQDLiny0sg4Mje1Bq3UwQXlMpw40MntwnE1xVZpGSV2T4lDLytS163qDCXQUV2T0RjvCKtxFOKIwiWWV1gX2RLbPBovDdlgruxnDrW8h8URkygrntbCpTp/ucLsmKEpdl0pzjCeqRn7Vr+pCfIQhSqllGs5EQfIJn6olNnIpn2Qq1T2VTj7itdvAU00fxHn3a9CcfPjJ8w5rPuI9A1PbzimVi51BqmLDgKWvVGQYTBeEvqRAd1Ni3rWQaEV2oJthYTXqXIACSMRJJIy6N1+PPN1oYQOI2BhabymTk4e0VW2kmLCRPJzAvfrE1UEgtxJjZKvFGzmPinZpccR5lFbhcJagucsmc4O2qThih7QsYZ0Me79FcKWRgap65wUcBxbKdvIOaULlHyRXGsJd8VGeEDCuhPAnCog5TXxLcT3T6eFjBEqp5yAW+BvaptBG7oHZn0GTOGbx7523oTJ50SNDmxeNoJWtZjmGlX2NFRq8mumymgCiYa00sLFyzSnYePKYsE/ZCLSaXkHElRUdNZvHnNNdgxnLsWvSUUygcK3N6+jKU7kKkKfhcuBRuNiAwiNTdxKHLDOZbreHy5N2QpBlp2MLRUsSI1GUTgTWJWKKu6gLcfJLvegwratO96FwMii741VRUFy9bJWlKzQhUGKfbI3Yiik/V0wk7vO7DjvgQRM8Vhyd2pAoNnPyMmtVkENajmDR7pIQINopKOG0PhRWC3CpBWVcQ/Hj7DBoJ08YSIsmAMvCDg3JPbs/m7YJdU0OMFFhIVWi9Hhi6rrKFBldoo6jdpTGgUhh+HW/TV02PjEBlxyzhYDel7JQWXWP2OIOys5tOLc4jm5Doy11i47TCJeEx9xHwFIaGRUTG92KjIbtO5s4Lrxt1s/43lDKr25ZvOxlGns/raHV91sT9DWNPlhMdD8YdK5YwGTQChRlSZt3GNwFOUUngAkw7lKjisnGfmz16/V4+SOANYZFeY5tr9qZy3KOidzey0kQU3Autay7yOvKjfzOTZBr+TgM2xFWdqOJ4wlzZbE2h/XATdW8HdbcZk16EQjXX2yUTFMdApDcLhbbgSNGWD1eonJYtEup9Fw6W8/lVWSDCcNcDle+HliLyDgf8K5Uqnb1Z7/6ooGG5E/qVIvsv+aJJwp2z5U3WWv72VYr/aFN9F5rE5vZADQeDgudYAt4BAhdEnLdpbAoXPuU3F6lKI1LG8ULeKRf1lG2pc0Vewwu01/k7XdlNeSTXOTKiMpU2eJyse3c+OuAVJyjXkhFF44fjXCldT5LJ0q2tcicIN8SY4M91dFRcR/axOcuKfp4FCn/HDPVreCWgKt1yRHWqUNu0jgQCSjIQQ2AiYETxodgiYkt2anKNIaHYm+iKf34xg6USHtoePoDwPzg42xVsxvttA/dbi3jf8TTnmNNhZej2m9C6FVr08I7PcfO/sZotaYM/UAqWbVFbRVjVYXdk83YQFndHvEuDay9Xg4JXNdDPtkuImb98suQxhnCFeW6hihOfoGRaYWxXL89BmiOZolFSzKFXimqRFZcpHPjaYwTkFS+5Bl1UXLXbzDkOtN+F/mUPzryhB0V1c6p0hMZK+7xt6jip3zKwvebyF9fMsHXLL5hlfIfs1blf9lE/10cATbmliGIyLx54YU7JnyjHcc7QIRpFnN8yIs7SnwpzrdRQBOglQ25xO7KEDgVj63LsQPZevdiP/EhmyBMZUTl4XRpGP5PcbJELyqCYQ6yhvoht3EcI8zisvHjOISK436J3sEOuYfCwjziQKEH/9MZ8jjIaX2PZ+PoqB8+Jts28XTZ4nhqOsCMpu2vff8mVkJdworvj7Gr7DrO1ljP6YlFt/BJj6OWjC+1dnzFYbENK+9qqtjidMUGWHA1ykLvaSI35AspRhxlO7cIpCsGiuqLw2TLH4WFmaJ45acONtaNwC02s9amxKfspm8vBIfL4ooIgeM2+5HIyTqyuaa7pbCq8LGVSa6nNi6JmFgo0CPHeP0fOu31OrRrj8yB0T3t7lFuuFDs9HZ72xXrrDbyarjNWZZpp8tqXWGJJuYZIOhTGYiaYSvKoe1Fa+Z8+keRZ0bY3B8TLMy6EwXkdX2CfvAIGOFQh3C6IQWLEAp3XVXUjbnkhClOHIG93mOFNnucKY5jWsdtSTPDb0DEEh5XhDQ2MfG1/kbZXVdHVqVxpTpQhundL4nCdLoHZdiN0W05o6E8paj7TPqPe4nasNdT11rGiZ7U5jYOcHPdewbYCX+9lXP/m67qK5YbvQtBOWvxFErUuCGHoNWcX7bZgnTVjmsr8rabbc6nmZeKQbNjujqQ6nkb4sUmduAyalKuOK0DD2likMmW8pEuarBcse1wG2m5pzlHyFGUX7ka6w79UbeFR12USxdaSo2RJ3TFv64khbkLwGA7bDOOZzFrX7LWzNlee24OXE7T+IyXXSjW+pCt+spmjs68k/Nb/oCjFl7P9MGxcB6EZR7TNVj0CqrVMN18iuKIlhKqfUZNU2iQlUgTQGG0SzP9+sob5Rex5FTL1xNH71+sF3FR/LiylJ5L4BKf0KirqZNlGQP2KCdtHtWet84UxzlG0Uorp4rQr6rTj5TUTo2sYuMicbt5JOpVsulbElTCEggOMzhH+BMqDb0C2qmNNJ4GGnts5gZo4sdd/UGdKv9LO+c7G5nFXAt4Xm+18mtZjrnUMm7VeZzSncG7HMDMY2ri/mybbSsJWDS7QNNoYko4WxF1R+RuTAxVY9CIYKKy4/rKwxVTVMRn+F1iycR2phVG2EzXgbZY54y7w5IEAN2Gsqh4fhxIFOSKCiPcyeridOqvSORwKScZXT4VgAndzunKVPpoADjhJf2tRy1c/rTLIaLcztLtzz3z3Xf02pX+tRwT/WmE5L/laMubLTtWMdbPhC3rs64lsONai/RagW3MZfhUMqBRa4RUkWP6Upi7CHKcKPIrvbvwi3juoouLR1aKjLuuMGHkV1oEYuaj+jj/+/H8KKO3qWjwFwm6qoI/bSt23ZArSnGxXodY6nMDQul3qNN1cbofjG5XYNkBMApXGMN1nXaBSx8b692+h5pgMjgTVRF755LNKOuK89hZn7jailN/Z1PZ/wA4W20K+ZmhZlu6bIc2lyyL8DskDbATaKMmVsvGV2OTxMARG6iDJ04bZVAaZa6DRW4uNyRWYQ3x7FyYYpP/FhaGjZcmSCblHAAgfQgAgSbyk2+XYXYU56pTNXHZqgajandnNGpS90R521nQNrInM9uN5cyt7qnxyWL36rPVZa21VVdtgXK3o+N5F4fAvJYlLk2Lm8q2Ltdk2zTUfjITN3z9lRV1Yo9sJYj8sVPUcl1TFB/JUNRPWr3hURlab4yybwsfrdjMjoclLQsZ9Omo1iiZFp4rNT9RSY5RKr9L4yJCqGguqp4ovg/y7mzUQ4aLuJysNMRXY/ZKnlF5c5jT7NRcq88eZLvBj+HNn17k5y4+pXliq9ZybaBrGmZvk6P9Tll28IoQupyJHC4sJicRomRIzYizaDSmJtYVxUVZnT8afo8ycbkpN2l5lqRKGgmLmU4fc5i46sZqdiiWCPfn7sGl3uHH5aN8dU+UrqmYTfw+5R6nHQqIPHOf0zQ+9eqzx/He9+FLrk4vnld55UghsWLDEDsmp1i5ldEkJbFOWG3MtJPbpVFY5JDlOE89AozgdlhSGICRFbOBcAikAMKJYNKyyne+Hy1ut5ciFLdxKIDP+cTq/qS7ccfVqgg3naBuRfnCvA4b1K0wBwhsRTujNHVPFOaCiHAZbIqtP5tZhCROvFdGr8BBZW699dbkicuD5Qua/SNZzfLoyNjUFTaORplloiFd96BJRBBnIoes+GrM7igpikeRzo/b+VUAbk2E0lcO11K2MTvCJ5rzIQBII+yFspGyhFwEsVgZozRyRHHOdjH1sDid7EYTYWmCRSHDS5f27rEmOC6j8RHjsDltDw4ONhWrdhocet6ituBHr1pa+TBHZ15oYyM/sMmxKacUdEIszeCIFtk7t0pIuzDSuUWKiHKidiMw5HbdVBTu/LhdekiAhriGsu8xdnAOFkZDTqDYenI5VATAIVA53Y/cLlGYuJ4+TBGmicpRFhmnuIbTkK8frXDfhaGOK4zcw9+DDjTJZLIFQfCl1VrAunPv3ss+QZf1nbN/yjkhF1l29F9sfPQBy+c0Jo0IE7Wko9ROrVoPw6GWjLsphety42EcAowDErYDZJwgspnptpYuW4dq+hG2/1Y1H6X0AokECGyXXUW5K8zn3IpTOjzucvehREqrdNNGvVK4GJ8uzTM+zZzc40nK6VK4nUbPXHcDFr9SqRxCY57INcqZwI/Un3n12dvMy32BA4P/lhMT77RsljNZ1cqkCGlUT7qDo5EujekcRZWSQEc82XFzR2FxuGbItYOTI/M3cgxsluG35A5g4KoWYEKwyY7A0VB0XIyzwxoVS9roit3YAg4R2p0zwe3s8XII5YpN/BSxf07bq1evZoWVnc6RH13Yj4+Pjz+6wwN/6z05u3LV9cyef9ByY1+3iTGmJdjf4DSupBQRdmdcOD+OSBHK6mEK1xU1teM0uJ3fJaJEbA2/mxfaRnZUbM4NsRO0GHEK5eXfXZGbAMdV6vcSgksJXS0uGT8yO1rhO8CXEYnYNqIvxu2DOahAMzU11QJ3ORWt6gSNvratrW33W1CvfOc9lpv8rGVHLreJiXWWyzPEAjkiQESEXdrahfPTmCZ2i+Kuf1Fz61K6hkuFqR9qmccnkJvtMQ5GyvNR1R2AEqFBYXH20BH7VR7/9UtACsGl4p2h+9Q+dtJwFr/Xf2Lrwuc5Tdw2T2a3trYur1arL4fTIAQGvz77bLTGT2auffd2W7Lin21i8uOA57+wxzmkBv4uqu3GOLav8JB4O9gKE1gcl4ncrhy54wunzrZp6rYHJyetH27jdDaRvKLsEpEch4ltqB8CIyxeRYVriaNisZyJqpDlFHueN0YRA5sO1+mCe28OKj0NDXYyTXQonOZXuPuuvPLKbgRjtaU1NzcH5XI5gBvVWlr45Ioz/cxztt3+wVsmtk6M1y7kkIC3sqN/CTqdaDxMohhErhT5yRoDSG6o48LUxTnhxAWE+ZTX6V+IUyYNv9sWcA5Orz3Ad5uO7FzBclQ21gEOR+woq1LLiKs4GQVbbgnETn5XuP6iBPV00a1R2hBp+3p6znjylyasYre/BxtoTqUV0nCaZRDifACThRgiBaKLPkfKTplksgp42DXrhkIsBqwEX35ForRxohL8vD87nq+WFgfpJg4ShcAYtyvSucIfNw/owvUTEQ/AiLgiqOa9HAAcuCK3COyoTwLOEw7mL7ZMMcdWmnFbwL5zN9QW31H34hBAObo9QCevCncAoRwXzU/UDbk0qlZcK7SFUziNn2Bs74Kw9s4cNKC57rrrjmLk9HKBhIY/kmb6Yy69/2p2EU1tKqIoLPa6M2SgT3BYm1VWtQToeAq0dNF9uVYbH5TJXS67SBOZyFGPd4Wq4DiBbIFl2h87vWCR9fNNhIn1HExdnc/x9uF8lG7Ryc+AxTE4gUilCDwqS57GyxVNgACmFLJAHmVwOnZtn4bbKvKgAM1VV121BFnmUzzvcVz3crmDlQGIDF4xgBprs9ERiwI7GScDk1Bf/2ni+wicG+xtz9UWb8n7JxQttQDu5EAUZgzf6HoREMrRytmhR35RUIQOY2O/IuilWDbRn89b7zgfVm/tsm52j+quImi4Lq9+k3Rv4SOIy8Sh2tKrZwH/BE0Dk/q8gINUvN6SFwyHte3975wHzY9+9KPWycnJdwOGt3FtoYk+VyqV7uF7lgKIazE4kGttgOX8gCdu/V1atEYcIAnWDQcLb9sSvGG0kj43yLQuSzQxZI5yOdiERTtMhEtXQq7i6lQ/pTN7Q/Ustk57hOjufkIwlfj0YblvzI5bNmrz+eaCx+hKxavsEBtATgHiNtiO24glxrdOHep32epOEsEzrJ9MBTZcDKYT1b2e3Y4bY06DBg6TQBdzDiC4iLcwCSg+v3jx4mvPOOOMvVqpFjfWDnbPrUnbNvi4JYvb+PD2+63ZPwFpGt4NO4pfbdkCj+vwZMsfXTXS6UMLDjjq50jkgKQMmCofzqxk7OGJfju8HRmHbbyavKxzGweGMKnQxL+rSraMKwU0Obi4wJivBVOIY/29XaN7tG87LG3HX4FxzppUKvUqwPLnvN2Hcn0T8MwOYNRiPXw864SHtppNfZuz8D/HYvZ7rZDVhvBwxCSyiVharKVWlhucOLf84gisuHO23C4NNv/iHu7E0NaFdl+eswDdfBRfr3UgIF5JSO84jkuvfOqmoq4q9NbT1/OFoJ2k9IHLLrtgn4bbqluPMSfN97///dPgLD2A5TQa7SaG0n997rnn7l6Zt68tcNttgT1wTd7mv24d3+/awM7PZXCTQ9jsz7GAUBXqQE0uOWRHJhabXDw/zlZc7MDWnipYQgVO0+VX7AgA5Ou8Ypm4SNft4I2yxQxOCdQdxcaFg+Ua+7YxT6TS3nW3PXT85jh+b23he86Z73znO4cgp4jDvATArMX+l3e/+92Dz9iD3vbegrUd9d9WKn3acuO/tOwE81biOBFQZNUvHDu45W+4xHIcCyEPi83LbKx7iIOuJzgh1GkBxE30IPqJk7rs01xGcVGqMB1+QQi5h5G5n6ML3eeRk6qeU6ABHN7111+/jKmCv8J9JtdWrr/mOe8CPNOvnp58ts1lp5Ttu6vuYBh2nuUnvm6TfMa2iAZZxBUI1E2FntBfB0pEeQcU3AKaiyM55+5U25fa1rJn6ya3w8gKrgSV4/6UlfS6FBF2Q/jljsLljtfgsNOhwgEBfeVJjuOagZlToPnGN77Rxsjo3bTH22nAPMPo/0TT+xumC8JTJmbQUHuc9cqzNiGxfpYPPF3FUosx4zzAcLws6kW4xRlSVtTV5aiPHddSdzDG72SrS4c9nB3nuLhJkmi0FAJDqZXSXfzUw6NAFe1iZSNr8doUAz85WPYzz3MaNQ0jpXRnZ+dKnOdzLaQBvwWX+f6b3vSmfZqUo4x9N98+azufSv07lll8i5nyvLGTMhofhxSOS3bE5acOGr3DApDCFInhGLhKywLbNFVkemEYyCAQuwiAI5c8cdooXIFxUFyUhuTINlMsJB9uyXBo4QzMnOA0PT09SUCyEs7yYYByiEZJjJy+vm7dum0zaJuZZf02E575xN+z+uBiOA5fQ2WUL0ajFneElh05YjsGQT2B0iAQo6fJBhm7j/moXDkbxtbLCMuLweFsglxRcVcnP5Xzxbgsa423fWb1qr1e4umKiH4OeNAAEv+44447EtCcx3UKz/Vrwr6+ffv2rYDJDRcaH/hZdV/39mFrHf1nOM4VCMe9bimpE22guIguUye+wuSJUFVHAX52Y+boptahJR5mCYyOwQ35TPwbF6QiprmMC43qcSOoRJDztdm/Pt5Sir03B/SQG1D4rPk9DM5yAUD5Q+wnaLTP4/7FeeedN3MF3t6356451vywaC9541pWAU4hJB+PyrYjPHE0oqZQE4k6YWZ5dggACZBJ+h8+RNbNztClACilk0sbUqr7cfkas+N2XvQzVc5TZtJtg5/2b7z1AbYtz8Ac0JzmxBNP7GKk9BZAcjZgmaR7Wo0g/AsE373eljGDNnz6rFecN2Ktwf/hDJ3/sDyrAYsc0qBX33EWssf4cfKMSNLAbVS60rHWJs8JoY/nszbKclC3OS7mKkQrSZ3LqLzGy3lpJc+yfD5Rs9szMgcsaBB829DFnEFTXEBjcS6sfZvrShR4QzNqkWcmc2CXsYDdz1/KN5b/3vLjD7JlhsXrcI86cUV1Ko9VvXVAKRCDQFxt6eagggob61h8zvcewhiXqZ5NgQ48ziH4SQB2807VZCIxWPWTM1ZwHpCg0d4lGuJUGucD2EuxfwrHueqhh6TW34/NFech49Su4YtzX0XOuZdj7nRWv6gcAcZRPASO4zaQpw4euig20o0y0bU+N+Y+h+g6nyire+q4HDyhMyqPKuAyZbjTMMfZz2i4rXoOONBEcszhAOUi7v80QHM7XdJlXV1djzzngq9a9OmMOI7mq4LSP8Jt1jJfxcJ1cRwIXDcRsR0vUbjAw8Vx+YU036LS8JuTJmp8OEScxAFEyZSt7ncuF6bRAGmKLJfoP+oFR+zxKZ7129nJccCB5vjjj18AYN7Pc6zk2owccyVLFe5i5nqfJ+B2apNn3vv/3jXBQUs/snJBHOduN9GpZRnhImDsCDQCSoiE8J50GBK7Mcc4nmQzQnGhogOswplvBxeXzSHHpQ+5DWxGs+OeX/CT/uBDPatn3E4HFGjgKlooJRnmQuws9v/Bvn6/E3xDEj/17zfeMsln7a62aulfAM1dVpjgWHboGQPFcZcYPLENufiud45lEo9PTfLtqlE3/Bau6sYlFZfB8OOG2jgZOfHVB7+/x2auhjigQHPNNde8Hs7yp4Cnmesq3FcBmL06L67euPuDQ8egTIz/xCr5r6AE/CVTD3RVmq+CLI19joOAYADX0EfGMvNsG/h6YmoMQSUWiIl2gIkezLmFmgg4vpUtU9vnhVeNzXXAgOa73/3uS7nxf4W7aKPbDwDNV1atWtXf+DAHpPsH75u0tqOv4uiKv7Pc8N0ccVtyi7PUVYnbxEhwIMLvuqgOG7ZmW883N3MsQJehXUgppPAfTWC6CMVxJRNe0a/5s6KKOCBAw/B6OdMCHwUox/D8a+iSPg9gttJQvEdzwGiGvCP/K6vlP2VT479hQRefx4tkHAcekT02uPWNbw4M6CtVrZ/TQStwm52NQOTQoghOtMc7Ua66HQg7J91r/34PGuljaIAeuqI383QjAOZvzzrrrN8QpkHB3DE6veGq993KKsA/s8nBtZYfroSrACGRk3MiW2Bw3KbLtgRpewidTY7DkELZGV4jfOmS5Txy8M2MpD9cSo3Mig5rvwbNTTfd1AFI/gwOI43vFNdfApifuxaZqz+r33sPXOYDVhy+ybIDJY62DUFTR4M4CGTTgQF8CmhzLs/OBfR1Wl/sTAgcB5gIQAjBZfzjR3YdO6PZ7bjJ91vQXHrppSmWaGqK4N08cBJO838BzHfiG5/T9jXn3cdxth+zwtgvOJ0UGUf79SGVgOMunl4fRgM02ziXbxNnEZeqnFQaN0oEFlmR7lD910hTW3JGs9tx8fV64oD9wb777rtT3d3dr2SN719wP4cAnKtwSwiOX6f94Taf2XtY/b51KADfj3zzAwTkbP2jIa7vERwgHcPvLF/91XzUiOajtNCKGCcQi7J4aDuSesXxpnTv2T0n7Cr87MNT7Heg4SH99evXHwtn+RNAcjT+texR+uI555zTtw/Pd2BnWf2BjaxiYKdD/haG5EXXVemJ6tyGk1OY8d4mgXhq1A2/HVKUJH5yJD/2QpW2tjbPeM4pLnK/Ag0A8W644YbD0PB+iBs8A9Dcj/1v/f39j+CeW4JvTIGns2uta5l2YBXgxK02NVZAGRjlABY65JpVfUMcT/Lw5BAfgmVEHaMF2zn5SQReaXmBY9FnyexXoOHQoW7mkd4Kl3kDAMpxXQ6Afn7hhe7bB7P0yAdYMfpU0eD2h+mePsfSil9YcRLgRKKJOI4+H42yb91Ugc8ojjDgqkSMyEEmfFjPKouL5bkHGnYRtMNN3s5T/jE2gyb/CkBz/dvfzuq3g93c1lPh4wl3mhX/HuBwPuB4Ify2ldgIAjHf/O6rpuxxDkMq1VCQR3jhTAqt0QtqST872pTao+9T7klT7xechqUOTcVi8VRAci7XMgBzA9zmahR4TwMYLVdzS9b25FkP7DSXs7eqNX23Vae+xiKu2wFPNFdFE+gwJD7OsYHdmDouPxwy8bjIwFpNU04lx29rmzcrOho14nMOGkCSGBoaeilA0UTkidzTHbi/Pjo6+vRyjPTBPXqvDiLg+PNvsXL2S8yOr7VitA1Yw+/WbtM3eDbwwfiKht8M0aUvZ0qBMwtsPO+VZmXe6TkHDYDxrr322hVwlXNw/y6gecQPgm/PmzfvwT2SYzSN0CMBWc1zkJjVTNCmAr7xUPxPRlQPWYnja8VS+KJLiQ/bP8p3FnLgQy2iRqFxau1BbfwN4/lZUeyplZ9TTnPzzTd3CzCA5TzuJY8m9GvJTOamWTnVQU83V42+a1UofA/h+AuMqNbBcdxyUJ0O+mC+ZBvz6onCAwOSCb86lkkNHr9y5aytBnjOQBNpfF8Hh5HgW+S6KlWt/tdb3sI6k+fN07fAzR9Gmzf1A5ZVfN2KE4+yoMst0MqyHHQDx+VX2fwgblMtVmvrzB87my+bP32he5biOQGNdkMuXLhQSzU/gvyyCMBcwxrfr775He+YNQl/zx7/AE/1/Y8wxZ34GjLOxVYYGXQHPbYu4kt5Ods63GfjQzn26RWqI9kC0vHsdeHPCWgAymFMC/w1oNFSh/8BNF9/61vfuhlb3fDzZm9aQF8NLvlXwmmuhePwpTGzIfZ9r9n2BPvzsoy3a7WWoDor62ji23rWQSMuQ+V/x/VmrvU80+eYiFwLYGaNfcYPd9DYN140yofPPmfDG2+xie3lWmnK1kz22mTAAq2E1U4qyDF75lkFDVMELXCZv4HDvBOQ9HL9K7qYH83e4xzEJd34kQ1WGu9h1d+vmY+qjLDGZlupnyF3rZaoZQ9MTiMOw1m9bwQwfw5pRwHMN4eHh6/Ffr5Lmi2s//xLzNVV/5GTuB7TUopNfMK5EBSC3tK6Ge9AaLzFZ4XTaKTEHNLvUPFnuJoAzreQaS5GF/PsHwPS+PRz0X3b5/8LBc0/Waq1b1Mlx1ddttXK2dKs6WjUZGykeWaNNrcxUjqaLbQfo2s6Ghnm1wDoq8wpPXPHmT2zj7T/l95WXG3WeWS+OPmn94ysH1lYHpw1HY0e/hkHDZv0BRQNrV8Fh1lHd/RJAPPo/t/yB/Ad3nxJ0Y78/X8rtrTlHh0fmN8/8eCsraV5xkGD4KulDu8CLK+nskGA8xVGSnccwORAN8881yU3p21kUTvatBZLsn2xorNWOc4zz+mMLfoKrRa2/LBgz+X5OBtuGbdTz7rOVrzpdeObDk/Y+JWz1uyM6p8Zg+DbCVfRnNInsPkChfd5OM7lbG6bVdQ/M3e/m1Lf+qV5fIliMWfFHM4moqM5xeE4y3CMQ1NzYJm2wFo7OAY2U2ODtdZdbkDRdpclyttsuGOLXXLMrMoUu7m73Qe95/qXWNvCf2dy8wZr7fyqXfLyWVlT84x0T9/85jc5893eyPUBwMK8vX2DL5t8lyWbe/0N6N23xrMYeuY/LrVycaVlx1/J6iaUkd4S7EVcXey99gFPn7W0P2qdS8atfd6xrNs9kinmPODZzDrLrdaZ+4V98r5f8ZGDe+wTR+3Tl9z2+Wlbuk5iH/cpgJrZzMIm67l1tTs0e58LDDPOOmjgMMwIJE6Gq5xHFccCmu9zXc35dwPYB44CDwHebvd+xyrls+AaK+Eeh9I3taJi1ZcqioxQWPhd+xWzzL9kbcuj7tvICf94SzWfy0lXK0l7MmlOwH6J+ZU38E3MX9qn197AUYn32RdOmlVl25NiQPUHJZSpwdHcy/m2tXoPaR9+0vR7GDHr3RMnhb+YkZLO8X0H1294Gf/q8MMPX3vKKewiPFDMmy7lTI9+VhEGf0Vj68st4pyh4YOphP+QaeX/NK/0sBpEFgAADklJREFUMJ+2HrebL9HC3cBWfbHZjn31MvNSfwygLiJkXpRLuyik4n8c+4eWrHzLek7dEMU9M9YFl6as9oIfcDzt63Rr/HNaQO3Llkl90b56xoyUfbPKaeAyC9G/vFOCL1zlcbjN11Hg3f+Hf/iHBw5gTv9Is031nQeBL6ArOllzOdPGk2xyBcdk/ocNLthga3Zau7z6LzW03WCfuvvf4TbowALAY4sIYwW4deE+GXupVdKL7W/u/4b944vvxv8MmcO6WUpzBEDhNsTga53Mc59mU7UX4Fk7k0pnTbnHR7jmAZazAMq7uKES7n/js343XnDBBQ06Aq2w07WfmlUApm3+e1hm9FfQma6FW3XbRWT7PId/I8eDfMFeXn1sF8BMPxKqtVO2W6LwWWSaf5sOdq4kwFlO9/ZONLf/2z629pSd4mfPW0suRK5awAVeYHQ1dauVY1i89TLqnxENZgU0F198cQZB99VwFx1nxvJ4+wFd1I/WrFkzQhi8MTaN7jhsP7FXXZWwye6z2BbyAQTcQwFLKjxkiCZyuxsTD8FhvmArrXePhtI9jFRSua+BuyvdE6oV4pYIgnbe/ldb0vuofew3v/WMvEjVYrMFZT5qBWAct5FdhesFJ9nZqztm0uozBo0E32XLlkng/VNu5Hiu23BfgeC7dffHme2nwJlc/1sMpz8AWF4MWAAMPYqOYtXF4btcl9mhC+7eI8DEFOk5XSdp9gCWh+KgyBbr4uNQ9iZOxPqUffpejoqd2du/U/l8K6raBEiSIZcBMDqFolptY7vvEZaxhbuk34uAGcs0jJRWIMd8GKCcSb1aG/MlZJhf78U9PPdJ3/TFE2jMD9FzvgLOIKSE9xQzcc/7obUccjkndO6lbMYL8g/2mP3NPf8L4HydtxyFYGTYXYJfwHkLZ4VM2MfXfhb3jEc2cfGAfz7PlHL+WK4J9GUyZKua11lPtw+OGXEauMx8uqM/YYR0NnXfi30xe7DZn3MAmTO/OJ9GfAcc5XVwk4Q7GFpfwk3wPsFwmDHuI/wfbPUMPspRnfwxQsW/AxxO86Rt3JlmOOIuK7C3w93eaT0b49HWzBvQq4jT+G5jnY5lm77SgHR6NLgPNe0zaK644opW6tNSh/O5pGn8LkLw9w+oAxN7+LxyxnshBPt9AIKyTkCJLoEmwfHgfupmu+EvfrMPbTud5fHttE/iSsDyqAOMwKIBTQygmvQ/wR+xSPwVdsHdIXeYzr1vLr4NDVDYL0e3pCPZBBon37CrLlHM7FuhYS5aZu+N5Bi4ihaFf5pLH7O4hk36l7MofM81niKYPZG2sbEma+EhauWSNf1kfK9khr2/9R1z3Pu1bvOb0WPUXuwiNFIKHfRQcnvDfG7nu1HgvlvaWvuxX2xi4/X/pby/oRtEEBZiGkwNBZyh2+m07Whu75ux5haZARmGSgCN0Kn6wjrZP+eO12qofO+c+wQaqngZYNGc0nKu1QDoKwCm/ymrvvixjPUNz7OAYw6migssdy/DwWAJE37L2bCDWj79gI2/9nvIjc/O3JSUX2Opl9Cwr6MRW0KQ6Aki4LDJjC7r+9bkrXnK59rTyM+9ImufvPc6vofNMDt4K9k0/J42jqDe79EmD9kYuh7jd2+MBOnGkWrAl8VqfCtX4w7Np8Y2IjLA3UvZbMcb2WvQ6FN/AOWvKeZEuiN96u8bCL5PL8BtzR9u1eTbzK8ei5ywnDdgKfSZTzmdNF4L153sS5bS6dkRoifbqbfwKrqf42hVqm3kMnjN30b3dJU1TarrnQUD1TIbN3MQ47fgNCcBnGMcaBqBY3yfx/Pegrx8tV0QrLXLvL0lrh4iLLFUZs7PCb5hUJ3TMAVS9fMzeaC9kmkk+LKA6nwqfDNgeRz70rGxsT0TfINSNw3yHh7pfFD/GuwXkX8ZVyv04q92KIR6kZ1/64yENMp7eiOdTM1fDmAAjd8WCr+8P6Ecg53mbUz82CY67jadhTdbpueIgiWaf4mi7Sbe/smwu4DGjqDQW9itBUcR8EfWsgaN7l6YkMtMQzCoLUY/g0KP7knf/XYKvipyTrWfCdihvSh5l6R7DBp9FJ3c5wOWD2Bn1SXxJbfVe7R9VtWWkw9y93fIOW30jPHFzLGh8JrXccR0/DPk6rI29pa+HKH3ZIATjpJ2sP2NTFJ+305tnf2Ne+vvH2Mn22rA8Us4Dksp4iYQeHDXkPU8NMYBXdW+GvdSVF7gwAJO3CcRdTxJrcJZJNV7ranct69FK98egUZrfCcmJs6gWzqfaz7XdwHN6jPPPHPPZ2u//JIxCPQdeMrgNFCiW3e44ajKgI98JbguCGZnBLH7lvHYALwEUPwe3KTDjZY8uExdkecjy6R+akHq/hkLo7urX0KxZR8EHNfCcXrr70y9+yBToKUXtXfbRx5U9733pjK8AMCc5BR6bqhNlSGn2cqnEdfa6o/M6FtYewQadC+/A4f5c+5ek103I8t8jiWbe78bspyD03hXcOnolF2wQwCsufZ6a1172N631B7muOBSBNDUqbwvrI9JcCs0wQ5XYhtE+6G1pQH3M2S+fMaYeW0/pFu6lmsYAPHY1KU2cV0UdtVexYHUf7RPd1AtvhzQSGEZg4Wy2TAXwOmrrXfxwKppn83Tgoaj5Y8EMNpvrRHT3Vz/weq7zftU45d+WxuM/5O8DzxJ/gwN9wpU679tH/rVjOZHnqR8XvLlCIgG61d3uIuR8u0X7JF+yC77g6ldYmczYNsDA7SFhvP/TZ15B5gdScncUe0Cu+jOF+5VtW/7d7hM7e2M0pQ/BE0AKmtVXobqLdbRtfcv+0438JSg0TeuAYkmIV9Hvn6mDD7LuTG371TG3nlbXrqOB7qYTDvqdDT14qZfvOVoMc9lRZxmY5/y/vauYlKvvDVpSWZ5fT1PAJvZ2TDcNQjZlt0y07dx55J38aubmte2BmL+G0LCLcRPj2jqXVWgebBP2EV3Ldkl/+4CJMsUS+9BZnqD647qk5W1IdryOsu3/ATNNn3VzMyTEoWRkr7cdhbFn82ldSTfRF/0sz0WfJ/svnrUNVV+AlGucSCpg0UZeNU45AjrdJR9Z9nHHtodN3iykp8+/KjBDqYM3kUdu5breehFvNVWTd8xqyOmp7orHdE6OXUPz3spXdRPsAvcW0MO13/+PnLeR+2iW58aOCt7kpbf8ka4yZ8CmIUNXKaM+wYr175pt31wz2XQhrvY2blb0ACYNAlfA0j0QdFuhN6vcX1v1j6RM+9Hm61UgdsE97pOPH6z1F7h1cHw/F0cFXa2ffzuGU2u7fDABZ+XANaNNi+uKLTRswc15oeqV9mxf/DsKBfjG7v8jILNP4W67ZNclwMadR+0glQuzrUMgZnZ95Z/tT+7c6VJKdlopNR76+eOspbWv0Hw/Ree4xiAQwlOOOqnvP9A4P8ne1VpvSutMe8+uqM7m84NSDwWVL0CYfeTXL9LzI3Ynz766KPXz+qSzQ+hIU6Ov49+/dO8/bu+RRwwCIE3AZ6PWnXwBrvkDTNb0f/e7x/CyOF6Sj2ZFm14bqHUbjev8k/WMvmTZ43LTDd56FLXkj601RbYK63iv5F2+S2AcxLPH4LE8wF2sInrGk4w/5mNPz5skxNo1UuvACTSJAOWGnKgG3kiL9nPWE/z/6yS+oXNP3psNrql+JYbGi8Muvrqq4/B9VnA8xbsn8FhPnP//fffufu1MXEx+2h/4r4u+uB3kPszEHORYBKayCHLQ6VetY+wMPvHprdyX8253/s6Wd/vXuKw3LCkIHiEsI9ZJXnTbDbsvt5mPd/5t84zf+p0Dpx+JUA5HtnmSPQsyxlRsbOAD3SX8nyyuYImneUVQXWCUddDPMd6wu5AEXy7/eRT+J8ZUwcNIPG/973vHYGw+wGquojrcUZMn2DJ5m1veMMM3/KnuveP3NFsXvIsVNt/AWc5CSaw49RGSGA0mN7lVit8ybqXj1jP4XCdPRg2inW/7fJOa2mSJvrz3Abdrti2jNb7Bg/TU33VxgevsJs/PDNOFhb6zPyKC6WGOmy82MX9L4GrMAXCbLXnw4+10L06yJqu7XbaSPbZmPB1oIm6pPl0Q1oUrp0EnAjpfxXAXApgJp6Zlmgotae3xUa2vQau8nc0AtsumIPZnfGC/7IqK+iK5TtQyo3YpS/TScsRW9opg5YYlO5fYKX0ByjzgwBEanUSOTEui2MDjf0vlrLr7VvvmRUBcac7mLNeBxqNlADJmTzlPwMYzXlcgv8yttBufdaeXBynhsIt8OEK3qupVyOcpnr9Dhruh1EOKnjztT2Ds1ja+q0yPm5fOp2uCwD1MKzesLnTyv6plHUuwDiH8FAu0CIoC6SFvZH837ar3ill4+5BV6/4ecfOLeBAw/HyryLiMwDmFdg3Min5aTS+Tz9zvXNps+H/s18fwQ7FcwDOayDosXAHWLIH54l0Nlrn4oRkLR1g9BX4t8I81iAbPW5VvgE5NbyMyf8zzKsySnL5NXMspd0w9v3cIvM+CMSr39s3G7d7MJbhwWUWIrt8hYeXAu9ndFGfZ2j9C8Lizv/Zb5ce5qEm7j2cibbT6cN/i+7qOMAxDzejA38hdiu6CKYDYBLVWolRQh9bMzZYOcdHtQqHErYEQHEmqgMWk3TeFgDzU5jKf9v3znv02X+guVVjEsFXH+A6kcdaD1Aub29v//VzChi1b49X4vdRhLr11vsHN1pz7Qj8bDKrLULpdyJzKocw1OwCKBm2zYKPCh1PiQ87sujILdnw1gKQrQiMDNmTj5nP0P2F714fHlStCp43M2kBT2t9EXjfBlBydEu37Pfn+J7/zXkIt50IxO3oK1rgKgEaU5YYAJhaUOCLawjufOW8i0Pnlm1/bo/7mAll9uO8/x9teQya14m6TgAAAABJRU5ErkJggg=="
2009
- }
2010
- ) })
2011
- ]
2155
+ children[0] = children[0].replace("`\u258D`", "\u258D");
2156
+ }
2157
+ const match = /language-(\w+)/.exec(className || "");
2158
+ if (inline) {
2159
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("code", __spreadProps(__spreadValues({ className }, props), { children }));
2160
+ }
2161
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2162
+ CodeBlock,
2163
+ __spreadValues({
2164
+ language: match && match[1] || "",
2165
+ value: String(children).replace(/\n$/, "")
2166
+ }, props),
2167
+ Math.random()
2168
+ );
2012
2169
  }
2013
- );
2014
-
2015
- // src/components/dev-console/console.tsx
2016
- var import_react11 = require("@headlessui/react");
2017
- var import_shared2 = require("@copilotkit/shared");
2018
-
2019
- // src/components/help-modal/modal.tsx
2020
- var import_react9 = require("react");
2170
+ };
2021
2171
 
2022
- // src/components/help-modal/icons.tsx
2172
+ // src/components/chat/messages/AssistantMessage.tsx
2173
+ var import_react12 = require("react");
2023
2174
  var import_jsx_runtime20 = require("react/jsx-runtime");
2024
- var CloseIcon2 = () => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2025
- "svg",
2026
- {
2027
- xmlns: "http://www.w3.org/2000/svg",
2028
- fill: "none",
2029
- viewBox: "0 0 24 24",
2030
- strokeWidth: "1.5",
2031
- stroke: "currentColor",
2032
- width: "20",
2033
- height: "20",
2034
- children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 18L18 6M6 6l12 12" })
2035
- }
2036
- );
2037
- var LoadingSpinnerIcon = ({ color = "rgb(107 114 128)" }) => /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
2038
- "svg",
2039
- {
2040
- style: {
2041
- animation: "copilotKitSpinAnimation 1s linear infinite",
2042
- color
2043
- },
2044
- width: "24",
2045
- height: "24",
2046
- xmlns: "http://www.w3.org/2000/svg",
2047
- fill: "none",
2048
- viewBox: "0 0 24 24",
2049
- children: [
2050
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2051
- "circle",
2052
- {
2053
- style: { opacity: 0.25 },
2054
- cx: "12",
2055
- cy: "12",
2056
- r: "10",
2057
- stroke: "currentColor",
2058
- strokeWidth: "4"
2059
- }
2060
- ),
2061
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2062
- "path",
2063
- {
2064
- style: { opacity: 0.75 },
2065
- fill: "currentColor",
2066
- 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"
2067
- }
2068
- )
2069
- ]
2070
- }
2071
- );
2072
-
2073
- // src/components/help-modal/modal.tsx
2074
- var import_jsx_runtime21 = require("react/jsx-runtime");
2075
- function CopilotKitHelpModal() {
2076
- const [showHelpModal, setShowHelpModal] = (0, import_react9.useState)(false);
2077
- const [issueDescription, setIssueDescription] = (0, import_react9.useState)("");
2078
- const [email, setEmail] = (0, import_react9.useState)("");
2079
- const [emailError, setEmailError] = (0, import_react9.useState)("");
2080
- const [submitting, setSubmitting] = (0, import_react9.useState)(false);
2081
- const validateEmail = (email2) => {
2082
- const re = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
2083
- return re.test(email2);
2175
+ var AssistantMessage = (props) => {
2176
+ const { icons, labels } = useChatContext();
2177
+ const {
2178
+ message,
2179
+ isLoading,
2180
+ subComponent,
2181
+ onRegenerate,
2182
+ onCopy,
2183
+ onThumbsUp,
2184
+ onThumbsDown,
2185
+ isCurrentMessage
2186
+ } = props;
2187
+ const [copied, setCopied] = (0, import_react12.useState)(false);
2188
+ const handleCopy = () => {
2189
+ if (message && onCopy) {
2190
+ navigator.clipboard.writeText(message);
2191
+ setCopied(true);
2192
+ onCopy(message);
2193
+ setTimeout(() => setCopied(false), 2e3);
2194
+ } else if (message) {
2195
+ navigator.clipboard.writeText(message);
2196
+ setCopied(true);
2197
+ setTimeout(() => setCopied(false), 2e3);
2198
+ }
2084
2199
  };
2085
- const handleSubmit = (e) => __async(this, null, function* () {
2086
- e.preventDefault();
2087
- if ((email == null ? void 0 : email.length) > 0 && !validateEmail(email)) {
2088
- setEmailError("Please enter a valid email address");
2089
- return;
2200
+ const handleRegenerate = () => {
2201
+ if (onRegenerate) {
2202
+ onRegenerate();
2090
2203
  }
2091
- setSubmitting(true);
2092
- yield fetch("https://api.segment.io/v1/track", {
2093
- method: "POST",
2094
- headers: {
2095
- "Content-Type": "application/json"
2096
- },
2097
- body: JSON.stringify({
2098
- event: "oss.dev-console.help",
2099
- anonymousId: window.crypto.randomUUID(),
2100
- properties: { email, text: issueDescription },
2101
- writeKey: "q0gQqvGYyw9pNyhIocNzefSYKGO1aiwW"
2102
- })
2103
- });
2104
- setEmailError("");
2105
- setEmail("");
2106
- setIssueDescription("");
2107
- setSubmitting(false);
2108
- setShowHelpModal(false);
2109
- });
2110
- const HelpButton = () => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2111
- "button",
2112
- {
2113
- onClick: () => setShowHelpModal(true),
2114
- style: { width: "50px", height: "30px", marginRight: "0.25rem" },
2115
- className: "text-sm p-0 bg-transparent rounded border border-blue-500",
2116
- "aria-label": "Open Help",
2117
- children: "Help"
2204
+ };
2205
+ const handleThumbsUp = () => {
2206
+ if (onThumbsUp && message) {
2207
+ onThumbsUp(message);
2118
2208
  }
2119
- );
2120
- const submitButtonDisabled = (0, import_react9.useMemo)(
2121
- () => submitting || !!emailError || issueDescription == null || (issueDescription == null ? void 0 : issueDescription.length) == 0,
2122
- [submitting, emailError, issueDescription]
2123
- );
2124
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_jsx_runtime21.Fragment, { children: [
2125
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(HelpButton, {}),
2126
- showHelpModal && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2127
- "div",
2128
- {
2129
- className: "fixed inset-0 flex items-center justify-center p-4",
2130
- style: { backgroundColor: "rgba(11, 15, 26, 0.5)", zIndex: 99 },
2131
- 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: [
2132
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2133
- "button",
2134
- {
2135
- className: "absolute text-gray-400 hover:text-gray-600 focus:outline-none",
2136
- style: { top: "10px", right: "10px" },
2137
- onClick: () => setShowHelpModal(false),
2138
- "aria-label": "Close",
2139
- children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(CloseIcon2, {})
2140
- }
2141
- ),
2142
- /* @__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" }) }),
2143
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "space-y-4 mb-4", children: [
2144
- /* @__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)(
2145
- "a",
2209
+ };
2210
+ const handleThumbsDown = () => {
2211
+ if (onThumbsDown && message) {
2212
+ onThumbsDown(message);
2213
+ }
2214
+ };
2215
+ const LoadingIcon = () => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { children: icons.activityIcon });
2216
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_jsx_runtime20.Fragment, { children: [
2217
+ (message || isLoading) && /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "copilotKitMessage copilotKitAssistantMessage", children: [
2218
+ message && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(Markdown, { content: message || "" }),
2219
+ isLoading && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(LoadingIcon, {}),
2220
+ message && !isLoading && /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
2221
+ "div",
2222
+ {
2223
+ className: `copilotKitMessageControls ${isCurrentMessage ? "currentMessage" : ""}`,
2224
+ children: [
2225
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2226
+ "button",
2146
2227
  {
2147
- href: "https://docs.copilotkit.ai/coagents/troubleshooting/common-issues",
2148
- target: "_blank",
2149
- rel: "noopener noreferrer",
2150
- children: "Visit the Troubleshooting and FAQ section in the docs"
2228
+ className: "copilotKitMessageControlButton",
2229
+ onClick: handleRegenerate,
2230
+ "aria-label": labels.regenerateResponse,
2231
+ title: labels.regenerateResponse,
2232
+ children: RegenerateIcon
2151
2233
  }
2152
- ) }),
2153
- /* @__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)(
2154
- "a",
2234
+ ),
2235
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2236
+ "button",
2155
2237
  {
2156
- href: "https://go.copilotkit.ai/dev-console-support-discord",
2157
- target: "_blank",
2158
- rel: "noopener noreferrer",
2159
- children: "Go to Discord Support Channel (Community Support)"
2238
+ className: "copilotKitMessageControlButton",
2239
+ onClick: handleCopy,
2240
+ "aria-label": labels.copyToClipboard,
2241
+ title: labels.copyToClipboard,
2242
+ children: copied ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { style: { fontSize: "10px", fontWeight: "bold" }, children: "\u2713" }) : CopyIcon
2160
2243
  }
2161
- ) }),
2162
- /* @__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)(
2163
- "a",
2244
+ ),
2245
+ onThumbsUp && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2246
+ "button",
2164
2247
  {
2165
- href: "https://go.copilotkit.ai/dev-console-support-slack",
2166
- target: "_blank",
2167
- rel: "noopener noreferrer",
2168
- children: "Apply for Priority Direct Slack Support"
2248
+ className: "copilotKitMessageControlButton",
2249
+ onClick: handleThumbsUp,
2250
+ "aria-label": labels.thumbsUp,
2251
+ title: labels.thumbsUp,
2252
+ children: ThumbsUpIcon
2169
2253
  }
2170
- ) })
2171
- ] }),
2172
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("form", { onSubmit: handleSubmit, className: "flex flex-col space-y-2", children: [
2173
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { children: [
2174
- /* @__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:" }),
2175
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2176
- "textarea",
2177
- {
2178
- id: "feedback",
2179
- rows: 4,
2180
- className: "w-full px-3 py-2 text-gray-700 border rounded-lg focus:outline-none focus:border-blue-500",
2181
- placeholder: "A Loom link / screen recording is always great!",
2182
- onChange: (e) => setIssueDescription(e.target.value),
2183
- value: issueDescription,
2184
- required: true
2185
- }
2186
- )
2187
- ] }),
2188
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { children: [
2189
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("label", { htmlFor: "email", className: "block text-sm font-medium text-gray-700 mb-1", children: "Email (optional):" }),
2190
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2191
- "input",
2192
- {
2193
- type: "email",
2194
- id: "email",
2195
- className: `w-full px-3 py-2 text-gray-700 border rounded-lg focus:outline-none focus:border-blue-500 ${emailError ? "border-red-500" : ""}`,
2196
- placeholder: "Enter your email for follow-up",
2197
- onChange: (e) => {
2198
- setEmail(e.target.value);
2199
- setEmailError("");
2200
- },
2201
- value: email
2202
- }
2203
- ),
2204
- emailError && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("p", { className: "text-red-500 text-sm mt-1", children: emailError })
2205
- ] }),
2206
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "bg-gray-50 px-4 py-4 sm:px-6 sm:flex sm:flex-row-reverse rounded-b-lg", children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2254
+ ),
2255
+ onThumbsDown && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2207
2256
  "button",
2208
2257
  {
2209
- type: "submit",
2210
- onClick: handleSubmit,
2211
- disabled: submitButtonDisabled,
2212
- style: submitButtonDisabled ? { backgroundColor: "rgb(216, 216, 216)", color: "rgb(129, 129, 129)" } : void 0,
2213
- 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",
2214
- children: submitting ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(LoadingSpinnerIcon, { color: "white" }) : "Submit"
2258
+ className: "copilotKitMessageControlButton",
2259
+ onClick: handleThumbsDown,
2260
+ "aria-label": labels.thumbsDown,
2261
+ title: labels.thumbsDown,
2262
+ children: ThumbsDownIcon
2215
2263
  }
2216
- ) })
2217
- ] })
2218
- ] })
2219
- }
2220
- )
2264
+ )
2265
+ ]
2266
+ }
2267
+ )
2268
+ ] }),
2269
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { style: { marginBottom: "0.5rem" }, children: subComponent })
2221
2270
  ] });
2222
- }
2271
+ };
2223
2272
 
2224
- // src/components/dev-console/console.tsx
2273
+ // src/components/chat/messages/UserMessage.tsx
2274
+ var import_jsx_runtime21 = require("react/jsx-runtime");
2275
+ var UserMessage = (props) => {
2276
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "copilotKitMessage copilotKitUserMessage", children: props.message });
2277
+ };
2278
+
2279
+ // src/components/chat/Suggestion.tsx
2280
+ var import_react_core8 = require("@copilotkit/react-core");
2281
+ var import_shared2 = require("@copilotkit/shared");
2282
+ var import_runtime_client_gql3 = require("@copilotkit/runtime-client-gql");
2225
2283
  var import_jsx_runtime22 = require("react/jsx-runtime");
2226
- function CopilotDevConsole() {
2227
- const currentVersion = import_shared2.COPILOTKIT_VERSION;
2228
- const context = (0, import_react_core8.useCopilotContext)();
2229
- const [showDevConsole, setShowDevConsole] = (0, import_react10.useState)(false);
2230
- (0, import_react10.useEffect)(() => {
2231
- setShowDevConsole(shouldShowDevConsole(context.showDevConsole));
2232
- }, [context.showDevConsole]);
2233
- const dontRunTwiceInDevMode = (0, import_react10.useRef)(false);
2234
- const [versionStatus, setVersionStatus] = (0, import_react10.useState)("unknown");
2235
- const [latestVersion, setLatestVersion] = (0, import_react10.useState)("");
2236
- const consoleRef = (0, import_react10.useRef)(null);
2237
- const [debugButtonMode, setDebugButtonMode] = (0, import_react10.useState)("full");
2238
- const checkForUpdates = (force = false) => {
2239
- setVersionStatus("checking");
2240
- getPublishedCopilotKitVersion(currentVersion, force).then((v) => {
2241
- setLatestVersion(v.latest);
2242
- let versionOk = false;
2243
- if (v.current === v.latest) {
2244
- versionOk = true;
2245
- } else if (/[a-zA-Z]/.test(v.current)) {
2246
- versionOk = true;
2247
- }
2248
- if (versionOk) {
2249
- setVersionStatus("latest");
2250
- } else if (v.severity !== "low") {
2251
- setVersionStatus("outdated");
2252
- } else {
2253
- setVersionStatus("update-available");
2254
- }
2255
- }).catch((e) => {
2256
- console.error(e);
2257
- setVersionStatus("unknown");
2258
- });
2259
- };
2260
- (0, import_react10.useEffect)(() => {
2261
- if (dontRunTwiceInDevMode.current === true) {
2262
- return;
2263
- }
2264
- dontRunTwiceInDevMode.current = true;
2265
- checkForUpdates();
2266
- }, []);
2267
- (0, import_react10.useEffect)(() => {
2268
- const handleResize = (entries) => {
2269
- for (let entry of entries) {
2270
- if (entry.target === consoleRef.current) {
2271
- const width = entry.contentRect.width;
2272
- if (width < 400) {
2273
- setDebugButtonMode("compact");
2274
- } else {
2275
- setDebugButtonMode("full");
2276
- }
2277
- }
2278
- }
2279
- };
2280
- const observer = new ResizeObserver(handleResize);
2281
- if (consoleRef.current) {
2282
- observer.observe(consoleRef.current);
2283
- const initialWidth = consoleRef.current.getBoundingClientRect().width;
2284
- if (initialWidth < 400) {
2285
- setDebugButtonMode("compact");
2286
- } else {
2287
- setDebugButtonMode("full");
2288
- }
2289
- }
2290
- return () => {
2291
- if (consoleRef.current) {
2292
- observer.unobserve(consoleRef.current);
2293
- }
2294
- };
2295
- }, [consoleRef.current]);
2296
- if (!showDevConsole) {
2297
- return null;
2298
- }
2299
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
2300
- "div",
2284
+ function Suggestion({ title, message, onClick, partial, className }) {
2285
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2286
+ "button",
2301
2287
  {
2302
- ref: consoleRef,
2303
- className: "copilotKitDevConsole " + (versionStatus === "update-available" ? "copilotKitDevConsoleUpgrade" : "") + (versionStatus === "outdated" ? "copilotKitDevConsoleWarnOutdated" : ""),
2304
- children: [
2305
- /* @__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 }) }),
2306
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2307
- VersionInfo,
2288
+ disabled: partial,
2289
+ onClick: (e) => {
2290
+ e.preventDefault();
2291
+ onClick(message);
2292
+ },
2293
+ className: className || (partial ? "suggestion loading" : "suggestion"),
2294
+ "data-test-id": "suggestion",
2295
+ children: partial ? SmallSpinnerIcon : /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { children: title })
2296
+ }
2297
+ );
2298
+ }
2299
+ var reloadSuggestions = (context, chatSuggestionConfiguration, setCurrentSuggestions, abortControllerRef) => __async(void 0, null, function* () {
2300
+ const abortController = abortControllerRef.current;
2301
+ const tools = JSON.stringify(
2302
+ Object.values(context.actions).map((action) => ({
2303
+ name: action.name,
2304
+ description: action.description,
2305
+ jsonSchema: JSON.stringify((0, import_shared2.actionParametersToJsonSchema)(action.parameters))
2306
+ }))
2307
+ );
2308
+ const allSuggestions = [];
2309
+ for (const config of Object.values(chatSuggestionConfiguration)) {
2310
+ try {
2311
+ 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.`;
2312
+ const result = yield (0, import_react_core8.extract)({
2313
+ context,
2314
+ instructions: "Suggest what the user could say next. Provide clear, highly relevant suggestions. Do not literally suggest function calls. ",
2315
+ data: config.instructions + "\n\n" + numOfSuggestionsInstructions + "\n\nAvailable tools: " + tools + "\n\n",
2316
+ requestType: import_runtime_client_gql3.CopilotRequestType.Task,
2317
+ parameters: [
2308
2318
  {
2309
- showDevConsole: context.showDevConsole,
2310
- versionStatus,
2311
- currentVersion,
2312
- latestVersion
2319
+ name: "suggestions",
2320
+ type: "object[]",
2321
+ attributes: [
2322
+ {
2323
+ name: "title",
2324
+ description: "The title of the suggestion. This is shown as a button and should be short.",
2325
+ type: "string"
2326
+ },
2327
+ {
2328
+ name: "message",
2329
+ 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.",
2330
+ type: "string"
2331
+ }
2332
+ ]
2313
2333
  }
2314
- ),
2315
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(CopilotKitHelpModal, {}),
2316
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2317
- DebugMenuButton,
2318
- {
2319
- setShowDevConsole,
2320
- checkForUpdates,
2321
- mode: debugButtonMode
2334
+ ],
2335
+ include: {
2336
+ messages: true,
2337
+ readable: true
2338
+ },
2339
+ abortSignal: abortController == null ? void 0 : abortController.signal,
2340
+ stream: ({ status, args }) => {
2341
+ const suggestions = args.suggestions || [];
2342
+ const newSuggestions = [];
2343
+ for (let i = 0; i < suggestions.length; i++) {
2344
+ if (config.maxSuggestions !== void 0 && i >= config.maxSuggestions) {
2345
+ break;
2346
+ }
2347
+ const { title, message } = suggestions[i];
2348
+ const partial = i == suggestions.length - 1 && status !== "complete";
2349
+ newSuggestions.push({
2350
+ title,
2351
+ message,
2352
+ partial,
2353
+ className: config.className
2354
+ });
2322
2355
  }
2323
- )
2324
- ]
2356
+ setCurrentSuggestions([...allSuggestions, ...newSuggestions]);
2357
+ }
2358
+ });
2359
+ allSuggestions.push(...result.suggestions);
2360
+ } catch (error) {
2361
+ console.error("Error loading suggestions", error);
2325
2362
  }
2326
- );
2327
- }
2328
- function VersionInfo({
2329
- showDevConsole,
2330
- versionStatus,
2331
- currentVersion,
2332
- latestVersion
2333
- }) {
2334
- const [copyStatus, setCopyStatus] = (0, import_react10.useState)("");
2335
- let versionLabel = "";
2336
- let versionIcon = "";
2337
- let currentVersionLabel = currentVersion;
2338
- if (versionStatus === "latest") {
2339
- versionLabel = "latest";
2340
- versionIcon = CheckIcon2;
2341
- } else if (versionStatus === "checking") {
2342
- versionLabel = "checking";
2343
- versionIcon = SmallSpinnerIcon;
2344
- } else if (versionStatus === "update-available") {
2345
- versionLabel = "update available";
2346
- versionIcon = ExclamationMarkIcon;
2347
- currentVersionLabel = `${currentVersion} \u2192 ${latestVersion}`;
2348
- } else if (versionStatus === "outdated") {
2349
- versionLabel = "outdated";
2350
- versionIcon = ExclamationMarkTriangleIcon;
2351
- currentVersionLabel = `${currentVersion} \u2192 ${latestVersion}`;
2352
2363
  }
2353
- let asideLabel = "";
2354
- if (showDevConsole === "auto") {
2355
- asideLabel = "(localhost only)";
2356
- } else if (showDevConsole === true) {
2357
- asideLabel = "(always on)";
2364
+ if (abortControllerRef.current === abortController) {
2365
+ abortControllerRef.current = null;
2358
2366
  }
2359
- const installCommand = [
2360
- `npm install`,
2361
- `@copilotkit/react-core@${latestVersion}`,
2362
- `@copilotkit/react-ui@${latestVersion}`,
2363
- `@copilotkit/react-textarea@${latestVersion}`,
2364
- `&& npm install @copilotkit/runtime@${latestVersion}`
2365
- ].join(" ");
2366
- const handleCopyClick = () => {
2367
- navigator.clipboard.writeText(installCommand.trim()).then(() => {
2368
- setCopyStatus("Command copied to clipboard!");
2369
- setTimeout(() => setCopyStatus(""), 1e3);
2370
- });
2371
- };
2372
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "copilotKitVersionInfo", children: [
2373
- /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("header", { children: [
2374
- "COPILOTKIT DEV CONSOLE",
2375
- showDevConsole === "auto" && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("aside", { children: asideLabel })
2376
- ] }),
2377
- /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("section", { children: [
2378
- "Version: ",
2379
- versionLabel,
2380
- " (",
2381
- currentVersionLabel,
2382
- ") ",
2383
- versionIcon
2384
- ] }),
2385
- (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 }) })
2386
- ] });
2387
- }
2388
- function DebugMenuButton({
2389
- setShowDevConsole,
2390
- checkForUpdates,
2391
- mode
2392
- }) {
2393
- const context = (0, import_react_core8.useCopilotContext)();
2394
- const messagesContext = (0, import_react_core8.useCopilotMessagesContext)();
2395
- 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: [
2396
- /* @__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: [
2397
- "Debug ",
2398
- ChevronDownIcon
2399
- ] }) }),
2400
- /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
2401
- import_react11.MenuItems,
2402
- {
2403
- transition: true,
2404
- anchor: "bottom end",
2405
- className: "copilotKitDebugMenu",
2406
- style: { zIndex: 40 },
2407
- children: [
2408
- /* @__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" }) }),
2409
- /* @__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" }) }),
2410
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_react11.MenuItem, { children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2411
- "button",
2412
- {
2413
- className: "copilotKitDebugMenuItem",
2414
- onClick: () => logMessages(messagesContext),
2415
- children: "Log Messages"
2416
- }
2417
- ) }),
2418
- /* @__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" }) }),
2419
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("hr", {}),
2420
- /* @__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" }) })
2421
- ]
2422
- }
2423
- )
2424
- ] }) });
2425
- }
2367
+ });
2426
2368
 
2427
2369
  // src/components/chat/Chat.tsx
2370
+ var import_react13 = __toESM(require("react"));
2371
+ var import_react_core9 = require("@copilotkit/react-core");
2372
+ var import_runtime_client_gql4 = require("@copilotkit/runtime-client-gql");
2373
+ var import_shared3 = require("@copilotkit/shared");
2428
2374
  var import_react_core10 = require("@copilotkit/react-core");
2429
2375
  var import_jsx_runtime23 = require("react/jsx-runtime");
2430
2376
  function CopilotChat({
@@ -2435,6 +2381,10 @@ function CopilotChat({
2435
2381
  onInProgress,
2436
2382
  onStopGeneration,
2437
2383
  onReloadMessages,
2384
+ onRegenerate,
2385
+ onCopy,
2386
+ onThumbsUp,
2387
+ onThumbsDown,
2438
2388
  Messages: Messages2 = Messages,
2439
2389
  RenderTextMessage: RenderTextMessage2 = RenderTextMessage,
2440
2390
  RenderActionExecutionMessage: RenderActionExecutionMessage2 = RenderActionExecutionMessage,
@@ -2449,7 +2399,7 @@ function CopilotChat({
2449
2399
  UserMessage: UserMessage2 = UserMessage
2450
2400
  }) {
2451
2401
  const { additionalInstructions, setChatInstructions } = (0, import_react_core9.useCopilotContext)();
2452
- (0, import_react12.useEffect)(() => {
2402
+ (0, import_react13.useEffect)(() => {
2453
2403
  if (!(additionalInstructions == null ? void 0 : additionalInstructions.length)) {
2454
2404
  setChatInstructions(instructions || "");
2455
2405
  return;
@@ -2476,11 +2426,21 @@ function CopilotChat({
2476
2426
  onStopGeneration,
2477
2427
  onReloadMessages
2478
2428
  );
2479
- const chatContext = import_react12.default.useContext(ChatContext);
2429
+ const chatContext = import_react13.default.useContext(ChatContext);
2480
2430
  const isVisible = chatContext ? chatContext.open : true;
2431
+ const handleRegenerate = () => {
2432
+ if (onRegenerate) {
2433
+ onRegenerate();
2434
+ }
2435
+ reloadMessages();
2436
+ };
2437
+ const handleCopy = (message) => {
2438
+ if (onCopy) {
2439
+ onCopy(message);
2440
+ }
2441
+ };
2481
2442
  return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(WrappedCopilotChat, { icons, labels, className, children: [
2482
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(CopilotDevConsole, {}),
2483
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
2443
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2484
2444
  Messages2,
2485
2445
  {
2486
2446
  AssistantMessage: AssistantMessage2,
@@ -2491,32 +2451,32 @@ function CopilotChat({
2491
2451
  RenderResultMessage: RenderResultMessage2,
2492
2452
  messages: visibleMessages,
2493
2453
  inProgress: isLoading,
2494
- children: [
2495
- currentSuggestions.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { children: [
2496
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("h6", { children: "Suggested:" }),
2497
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "suggestions", children: currentSuggestions.map((suggestion, index) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2498
- Suggestion,
2499
- {
2500
- title: suggestion.title,
2501
- message: suggestion.message,
2502
- partial: suggestion.partial,
2503
- className: suggestion.className,
2504
- onClick: (message) => sendMessage(message)
2505
- },
2506
- index
2507
- )) })
2508
- ] }),
2509
- showResponseButton && visibleMessages.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2510
- ResponseButton2,
2511
- {
2512
- onClick: isLoading ? stopGeneration : reloadMessages,
2513
- inProgress: isLoading
2514
- }
2515
- )
2516
- ]
2454
+ onRegenerate: handleRegenerate,
2455
+ onCopy: handleCopy,
2456
+ onThumbsUp,
2457
+ onThumbsDown,
2458
+ children: currentSuggestions.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "suggestions", children: currentSuggestions.map((suggestion, index) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2459
+ Suggestion,
2460
+ {
2461
+ title: suggestion.title,
2462
+ message: suggestion.message,
2463
+ partial: suggestion.partial,
2464
+ className: suggestion.className,
2465
+ onClick: (message) => sendMessage(message)
2466
+ },
2467
+ index
2468
+ )) })
2517
2469
  }
2518
2470
  ),
2519
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Input2, { inProgress: isLoading, onSend: sendMessage, isVisible })
2471
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2472
+ Input2,
2473
+ {
2474
+ inProgress: isLoading,
2475
+ onSend: sendMessage,
2476
+ isVisible,
2477
+ onStop: stopGeneration
2478
+ }
2479
+ )
2520
2480
  ] });
2521
2481
  }
2522
2482
  function WrappedCopilotChat({
@@ -2525,7 +2485,7 @@ function WrappedCopilotChat({
2525
2485
  labels,
2526
2486
  className
2527
2487
  }) {
2528
- const chatContext = import_react12.default.useContext(ChatContext);
2488
+ const chatContext = import_react13.default.useContext(ChatContext);
2529
2489
  if (!chatContext) {
2530
2490
  return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(ChatContextProvider, { icons, labels, open: true, setOpen: () => {
2531
2491
  }, children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: `copilotKitChat ${className}`, children }) });
@@ -2546,9 +2506,9 @@ var useCopilotChatLogic = (makeSystemMessage, onInProgress, onSubmitMessage, onS
2546
2506
  id: (0, import_shared3.randomId)(),
2547
2507
  makeSystemMessage
2548
2508
  });
2549
- const [currentSuggestions, setCurrentSuggestions] = (0, import_react12.useState)([]);
2550
- const suggestionsAbortControllerRef = (0, import_react12.useRef)(null);
2551
- const debounceTimerRef = (0, import_react12.useRef)();
2509
+ const [currentSuggestions, setCurrentSuggestions] = (0, import_react13.useState)([]);
2510
+ const suggestionsAbortControllerRef = (0, import_react13.useRef)(null);
2511
+ const debounceTimerRef = (0, import_react13.useRef)();
2552
2512
  const abortSuggestions = () => {
2553
2513
  var _a2;
2554
2514
  (_a2 = suggestionsAbortControllerRef.current) == null ? void 0 : _a2.abort();
@@ -2557,7 +2517,7 @@ var useCopilotChatLogic = (makeSystemMessage, onInProgress, onSubmitMessage, onS
2557
2517
  const generalContext = (0, import_react_core9.useCopilotContext)();
2558
2518
  const messagesContext = (0, import_react_core9.useCopilotMessagesContext)();
2559
2519
  const context = __spreadValues(__spreadValues({}, generalContext), messagesContext);
2560
- (0, import_react12.useEffect)(() => {
2520
+ (0, import_react13.useEffect)(() => {
2561
2521
  onInProgress == null ? void 0 : onInProgress(isLoading);
2562
2522
  abortSuggestions();
2563
2523
  debounceTimerRef.current = setTimeout(
@@ -2718,7 +2678,7 @@ var CopilotModal = ({
2718
2678
  className,
2719
2679
  children
2720
2680
  }) => {
2721
- const [openState, setOpenState] = import_react13.default.useState(defaultOpen);
2681
+ const [openState, setOpenState] = import_react14.default.useState(defaultOpen);
2722
2682
  const setOpen = (open) => {
2723
2683
  onSetOpen == null ? void 0 : onSetOpen(open);
2724
2684
  setOpenState(open);