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