@copilotkit/react-ui 1.8.6-next.0 → 1.8.7-next.0

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 (149) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/{chunk-Q2YY2NX3.mjs → chunk-24TDU7MY.mjs} +2 -2
  3. package/dist/{chunk-XNQO5AZZ.mjs → chunk-ABHUX6T6.mjs} +2 -2
  4. package/dist/{chunk-QJKMOGWN.mjs → chunk-BDNHZ3GW.mjs} +4 -3
  5. package/dist/chunk-BDNHZ3GW.mjs.map +1 -0
  6. package/dist/{chunk-NMNC4ROZ.mjs → chunk-DSQGQJI4.mjs} +2 -2
  7. package/dist/{chunk-HEIDCT7I.mjs → chunk-HWMFMBJC.mjs} +2 -2
  8. package/dist/chunk-HWMFMBJC.mjs.map +1 -0
  9. package/dist/{chunk-UN2E3HCK.mjs → chunk-IEMQ2SQW.mjs} +6 -4
  10. package/dist/chunk-IEMQ2SQW.mjs.map +1 -0
  11. package/dist/{chunk-ZY25LVYR.mjs → chunk-IJADIQAR.mjs} +20 -2
  12. package/dist/chunk-IJADIQAR.mjs.map +1 -0
  13. package/dist/{chunk-X6EFGEBJ.mjs → chunk-JOL7NS2W.mjs} +2 -2
  14. package/dist/{chunk-PCTCOQK2.mjs → chunk-KENCH7RN.mjs} +2 -2
  15. package/dist/{chunk-ZLRUNNS7.mjs → chunk-O34Z4XM2.mjs} +170 -30
  16. package/dist/chunk-O34Z4XM2.mjs.map +1 -0
  17. package/dist/{chunk-5M7ODWKH.mjs → chunk-OZXUB3V7.mjs} +3 -3
  18. package/dist/chunk-PLHTVHUW.mjs +82 -0
  19. package/dist/chunk-PLHTVHUW.mjs.map +1 -0
  20. package/dist/{chunk-62QMTKMJ.mjs → chunk-POWCBXRY.mjs} +3 -3
  21. package/dist/chunk-PXEVB7IK.mjs +1 -0
  22. package/dist/{chunk-HIORSNVD.mjs → chunk-Q2NFQTCQ.mjs} +2 -2
  23. package/dist/chunk-SLTG4L62.mjs +78 -0
  24. package/dist/chunk-SLTG4L62.mjs.map +1 -0
  25. package/dist/{chunk-SMJ3QQCE.mjs → chunk-T7N77F5Y.mjs} +2 -2
  26. package/dist/{chunk-YOEL33HG.mjs → chunk-UFN2VWSR.mjs} +2 -2
  27. package/dist/{chunk-2OTVZXDX.mjs → chunk-UH2UFL5W.mjs} +3 -3
  28. package/dist/{chunk-D5XIJNXQ.mjs → chunk-VGPQYMKJ.mjs} +8 -8
  29. package/dist/{chunk-WNC6OCIB.mjs → chunk-XFCMZH2H.mjs} +2 -2
  30. package/dist/{chunk-ORSMX3SE.mjs → chunk-XWG3L6QC.mjs} +15 -1
  31. package/dist/{chunk-ORSMX3SE.mjs.map → chunk-XWG3L6QC.mjs.map} +1 -1
  32. package/dist/{chunk-TOQ7P4DO.mjs → chunk-XZNY26GH.mjs} +2 -2
  33. package/dist/{chunk-GOAED4H6.mjs → chunk-Y7UO3RPW.mjs} +10 -10
  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 +23 -3
  37. package/dist/components/chat/Chat.js +341 -30
  38. package/dist/components/chat/Chat.js.map +1 -1
  39. package/dist/components/chat/Chat.mjs +16 -14
  40. package/dist/components/chat/ChatContext.d.ts +5 -0
  41. package/dist/components/chat/ChatContext.js +15 -1
  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.map +1 -1
  45. package/dist/components/chat/CodeBlock.mjs +2 -2
  46. package/dist/components/chat/Header.js.map +1 -1
  47. package/dist/components/chat/Header.mjs +5 -5
  48. package/dist/components/chat/Icons.d.ts +2 -1
  49. package/dist/components/chat/Icons.js +17 -2
  50. package/dist/components/chat/Icons.js.map +1 -1
  51. package/dist/components/chat/Icons.mjs +5 -3
  52. package/dist/components/chat/ImageUploadQueue.d.ts +13 -0
  53. package/dist/components/chat/ImageUploadQueue.js +106 -0
  54. package/dist/components/chat/ImageUploadQueue.js.map +1 -0
  55. package/dist/components/chat/ImageUploadQueue.mjs +8 -0
  56. package/dist/components/chat/ImageUploadQueue.mjs.map +1 -0
  57. package/dist/components/chat/Input.d.ts +1 -1
  58. package/dist/components/chat/Input.js +2 -1
  59. package/dist/components/chat/Input.js.map +1 -1
  60. package/dist/components/chat/Input.mjs +3 -3
  61. package/dist/components/chat/Markdown.js.map +1 -1
  62. package/dist/components/chat/Markdown.mjs +3 -3
  63. package/dist/components/chat/Messages.d.ts +1 -1
  64. package/dist/components/chat/Messages.js +18 -0
  65. package/dist/components/chat/Messages.js.map +1 -1
  66. package/dist/components/chat/Messages.mjs +3 -3
  67. package/dist/components/chat/Modal.js +348 -37
  68. package/dist/components/chat/Modal.js.map +1 -1
  69. package/dist/components/chat/Modal.mjs +22 -20
  70. package/dist/components/chat/Popup.js +350 -39
  71. package/dist/components/chat/Popup.js.map +1 -1
  72. package/dist/components/chat/Popup.mjs +23 -21
  73. package/dist/components/chat/Sidebar.js +350 -39
  74. package/dist/components/chat/Sidebar.js.map +1 -1
  75. package/dist/components/chat/Sidebar.mjs +23 -21
  76. package/dist/components/chat/Suggestion.js.map +1 -1
  77. package/dist/components/chat/Suggestion.mjs +2 -2
  78. package/dist/components/chat/Window.js.map +1 -1
  79. package/dist/components/chat/Window.mjs +3 -3
  80. package/dist/components/chat/index.d.ts +1 -0
  81. package/dist/components/chat/index.js +354 -41
  82. package/dist/components/chat/index.js.map +1 -1
  83. package/dist/components/chat/index.mjs +30 -25
  84. package/dist/components/chat/messages/AssistantMessage.js.map +1 -1
  85. package/dist/components/chat/messages/AssistantMessage.mjs +5 -5
  86. package/dist/components/chat/messages/RenderActionExecutionMessage.js.map +1 -1
  87. package/dist/components/chat/messages/RenderActionExecutionMessage.mjs +6 -6
  88. package/dist/components/chat/messages/RenderAgentStateMessage.js.map +1 -1
  89. package/dist/components/chat/messages/RenderAgentStateMessage.mjs +6 -6
  90. package/dist/components/chat/messages/RenderImageMessage.d.ts +7 -0
  91. package/dist/components/chat/messages/RenderImageMessage.js +774 -0
  92. package/dist/components/chat/messages/RenderImageMessage.js.map +1 -0
  93. package/dist/components/chat/messages/RenderImageMessage.mjs +15 -0
  94. package/dist/components/chat/messages/RenderImageMessage.mjs.map +1 -0
  95. package/dist/components/chat/messages/RenderResultMessage.js.map +1 -1
  96. package/dist/components/chat/messages/RenderResultMessage.mjs +6 -6
  97. package/dist/components/chat/messages/RenderTextMessage.js +1 -1
  98. package/dist/components/chat/messages/RenderTextMessage.js.map +1 -1
  99. package/dist/components/chat/messages/RenderTextMessage.mjs +7 -7
  100. package/dist/components/chat/messages/UserMessage.js +1 -1
  101. package/dist/components/chat/messages/UserMessage.js.map +1 -1
  102. package/dist/components/chat/messages/UserMessage.mjs +1 -1
  103. package/dist/components/chat/props.d.ts +3 -0
  104. package/dist/components/chat/props.js.map +1 -1
  105. package/dist/components/dev-console/console.js.map +1 -1
  106. package/dist/components/dev-console/console.mjs +3 -3
  107. package/dist/components/dev-console/index.js.map +1 -1
  108. package/dist/components/dev-console/index.mjs +3 -3
  109. package/dist/components/index.d.ts +1 -0
  110. package/dist/components/index.js +354 -41
  111. package/dist/components/index.js.map +1 -1
  112. package/dist/components/index.mjs +30 -25
  113. package/dist/index.d.ts +1 -0
  114. package/dist/index.js +354 -41
  115. package/dist/index.js.map +1 -1
  116. package/dist/index.mjs +31 -26
  117. package/package.json +4 -4
  118. package/src/components/chat/Chat.tsx +198 -18
  119. package/src/components/chat/ChatContext.tsx +7 -0
  120. package/src/components/chat/Icons.tsx +14 -0
  121. package/src/components/chat/ImageUploadQueue.tsx +77 -0
  122. package/src/components/chat/Input.tsx +8 -1
  123. package/src/components/chat/Messages.tsx +17 -0
  124. package/src/components/chat/index.tsx +1 -0
  125. package/src/components/chat/messages/RenderImageMessage.tsx +64 -0
  126. package/src/components/chat/messages/UserMessage.tsx +5 -1
  127. package/src/components/chat/props.ts +3 -0
  128. package/dist/chunk-HEIDCT7I.mjs.map +0 -1
  129. package/dist/chunk-QJKMOGWN.mjs.map +0 -1
  130. package/dist/chunk-SQMEPWVT.mjs +0 -1
  131. package/dist/chunk-UN2E3HCK.mjs.map +0 -1
  132. package/dist/chunk-ZLRUNNS7.mjs.map +0 -1
  133. package/dist/chunk-ZY25LVYR.mjs.map +0 -1
  134. /package/dist/{chunk-Q2YY2NX3.mjs.map → chunk-24TDU7MY.mjs.map} +0 -0
  135. /package/dist/{chunk-XNQO5AZZ.mjs.map → chunk-ABHUX6T6.mjs.map} +0 -0
  136. /package/dist/{chunk-NMNC4ROZ.mjs.map → chunk-DSQGQJI4.mjs.map} +0 -0
  137. /package/dist/{chunk-X6EFGEBJ.mjs.map → chunk-JOL7NS2W.mjs.map} +0 -0
  138. /package/dist/{chunk-PCTCOQK2.mjs.map → chunk-KENCH7RN.mjs.map} +0 -0
  139. /package/dist/{chunk-5M7ODWKH.mjs.map → chunk-OZXUB3V7.mjs.map} +0 -0
  140. /package/dist/{chunk-62QMTKMJ.mjs.map → chunk-POWCBXRY.mjs.map} +0 -0
  141. /package/dist/{chunk-SQMEPWVT.mjs.map → chunk-PXEVB7IK.mjs.map} +0 -0
  142. /package/dist/{chunk-HIORSNVD.mjs.map → chunk-Q2NFQTCQ.mjs.map} +0 -0
  143. /package/dist/{chunk-SMJ3QQCE.mjs.map → chunk-T7N77F5Y.mjs.map} +0 -0
  144. /package/dist/{chunk-YOEL33HG.mjs.map → chunk-UFN2VWSR.mjs.map} +0 -0
  145. /package/dist/{chunk-2OTVZXDX.mjs.map → chunk-UH2UFL5W.mjs.map} +0 -0
  146. /package/dist/{chunk-D5XIJNXQ.mjs.map → chunk-VGPQYMKJ.mjs.map} +0 -0
  147. /package/dist/{chunk-WNC6OCIB.mjs.map → chunk-XFCMZH2H.mjs.map} +0 -0
  148. /package/dist/{chunk-TOQ7P4DO.mjs.map → chunk-XZNY26GH.mjs.map} +0 -0
  149. /package/dist/{chunk-GOAED4H6.mjs.map → chunk-Y7UO3RPW.mjs.map} +0 -0
@@ -85,6 +85,7 @@ __export(components_exports, {
85
85
  CopilotPopup: () => CopilotPopup,
86
86
  CopilotSidebar: () => CopilotSidebar,
87
87
  Markdown: () => Markdown,
88
+ RenderImageMessage: () => RenderImageMessage,
88
89
  UserMessage: () => UserMessage,
89
90
  shouldShowDevConsole: () => shouldShowDevConsole,
90
91
  useChatContext: () => useChatContext
@@ -308,6 +309,19 @@ var DownloadIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
308
309
  )
309
310
  }
310
311
  );
312
+ var UploadIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
313
+ "svg",
314
+ {
315
+ xmlns: "http://www.w3.org/2000/svg",
316
+ fill: "none",
317
+ viewBox: "0 0 24 24",
318
+ strokeWidth: "1.5",
319
+ stroke: "currentColor",
320
+ width: "24",
321
+ height: "24",
322
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4.5v15m7.5-7.5h-15" })
323
+ }
324
+ );
311
325
  var CheckIcon = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
312
326
  "svg",
313
327
  {
@@ -373,7 +387,8 @@ var ChatContextProvider = ({
373
387
  pushToTalkIcon: MicrophoneIcon,
374
388
  copyIcon: CopyIcon,
375
389
  thumbsUpIcon: ThumbsUpIcon,
376
- thumbsDownIcon: ThumbsDownIcon
390
+ thumbsDownIcon: ThumbsDownIcon,
391
+ uploadIcon: UploadIcon
377
392
  }), icons),
378
393
  [icons]
379
394
  );
@@ -1078,6 +1093,7 @@ var Messages = ({
1078
1093
  RenderActionExecutionMessage: RenderActionExecutionMessage2,
1079
1094
  RenderAgentStateMessage: RenderAgentStateMessage2,
1080
1095
  RenderResultMessage: RenderResultMessage2,
1096
+ RenderImageMessage: RenderImageMessage2,
1081
1097
  AssistantMessage: AssistantMessage2,
1082
1098
  UserMessage: UserMessage2,
1083
1099
  onRegenerate,
@@ -1166,6 +1182,23 @@ var Messages = ({
1166
1182
  },
1167
1183
  index
1168
1184
  );
1185
+ } else if (message.isImageMessage && message.isImageMessage()) {
1186
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1187
+ RenderImageMessage2,
1188
+ {
1189
+ message,
1190
+ inProgress,
1191
+ index,
1192
+ isCurrentMessage,
1193
+ AssistantMessage: AssistantMessage2,
1194
+ UserMessage: UserMessage2,
1195
+ onRegenerate,
1196
+ onCopy,
1197
+ onThumbsUp,
1198
+ onThumbsDown
1199
+ },
1200
+ index
1201
+ );
1169
1202
  }
1170
1203
  }),
1171
1204
  interrupt
@@ -1408,7 +1441,7 @@ var usePushToTalk = ({
1408
1441
  // src/components/chat/Input.tsx
1409
1442
  var import_react_core6 = require("@copilotkit/react-core");
1410
1443
  var import_jsx_runtime12 = require("react/jsx-runtime");
1411
- var Input = ({ inProgress, onSend, isVisible = false, onStop }) => {
1444
+ var Input = ({ inProgress, onSend, isVisible = false, onStop, onUpload }) => {
1412
1445
  const context = useChatContext();
1413
1446
  const copilotContext = (0, import_react_core6.useCopilotContext)();
1414
1447
  const pushToTalkConfigured = copilotContext.copilotApiConfig.textToSpeechUrl !== void 0 && copilotContext.copilotApiConfig.transcribeAudioUrl !== void 0;
@@ -1472,6 +1505,7 @@ var Input = ({ inProgress, onSend, isVisible = false, onStop }) => {
1472
1505
  }
1473
1506
  ),
1474
1507
  /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "copilotKitInputControls", children: [
1508
+ onUpload && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("button", { onClick: onUpload, className: "copilotKitInputControlButton", children: context.icons.uploadIcon }),
1475
1509
  /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { style: { flexGrow: 1 } }),
1476
1510
  showPushToTalk && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1477
1511
  "button",
@@ -1499,7 +1533,7 @@ var Input = ({ inProgress, onSend, isVisible = false, onStop }) => {
1499
1533
  // src/components/chat/messages/UserMessage.tsx
1500
1534
  var import_jsx_runtime13 = require("react/jsx-runtime");
1501
1535
  var UserMessage = (props) => {
1502
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "copilotKitMessage copilotKitUserMessage", children: props.message });
1536
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "copilotKitMessage copilotKitUserMessage", children: props.subComponent || props.message });
1503
1537
  };
1504
1538
 
1505
1539
  // src/components/chat/Markdown.tsx
@@ -2353,13 +2387,77 @@ function RenderAgentStateMessage(_a) {
2353
2387
  }
2354
2388
  }
2355
2389
 
2390
+ // src/components/chat/messages/RenderImageMessage.tsx
2391
+ var import_jsx_runtime21 = require("react/jsx-runtime");
2392
+ function RenderImageMessage(_a) {
2393
+ var _b = _a, {
2394
+ UserMessage: UserMessage2 = UserMessage,
2395
+ AssistantMessage: AssistantMessage2 = AssistantMessage
2396
+ } = _b, props = __objRest(_b, [
2397
+ "UserMessage",
2398
+ "AssistantMessage"
2399
+ ]);
2400
+ const {
2401
+ message,
2402
+ inProgress,
2403
+ index,
2404
+ isCurrentMessage,
2405
+ onRegenerate,
2406
+ onCopy,
2407
+ onThumbsUp,
2408
+ onThumbsDown
2409
+ } = props;
2410
+ if (message.isImageMessage()) {
2411
+ const imageData = `data:${message.format};base64,${message.bytes}`;
2412
+ const imageComponent = /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "copilotKitImage", children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2413
+ "img",
2414
+ {
2415
+ src: imageData,
2416
+ alt: "User uploaded image",
2417
+ style: { maxWidth: "100%", maxHeight: "300px", borderRadius: "8px" }
2418
+ }
2419
+ ) });
2420
+ if (message.role === "user") {
2421
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2422
+ UserMessage2,
2423
+ {
2424
+ "data-message-role": "user",
2425
+ message: "",
2426
+ rawData: message,
2427
+ subComponent: imageComponent
2428
+ },
2429
+ index
2430
+ );
2431
+ } else if (message.role === "assistant") {
2432
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2433
+ AssistantMessage2,
2434
+ {
2435
+ "data-message-role": "assistant",
2436
+ message: "",
2437
+ rawData: message,
2438
+ subComponent: imageComponent,
2439
+ isLoading: inProgress && isCurrentMessage && !message.bytes,
2440
+ isGenerating: inProgress && isCurrentMessage && !!message.bytes,
2441
+ isCurrentMessage,
2442
+ onRegenerate: () => onRegenerate == null ? void 0 : onRegenerate(message.id),
2443
+ onCopy,
2444
+ onThumbsUp,
2445
+ onThumbsDown
2446
+ },
2447
+ index
2448
+ );
2449
+ }
2450
+ }
2451
+ return null;
2452
+ }
2453
+
2356
2454
  // src/components/chat/Suggestion.tsx
2357
2455
  var import_react_core9 = require("@copilotkit/react-core");
2358
2456
  var import_shared2 = require("@copilotkit/shared");
2359
2457
  var import_runtime_client_gql3 = require("@copilotkit/runtime-client-gql");
2360
- var import_jsx_runtime21 = require("react/jsx-runtime");
2458
+ var import_jsx_runtime22 = require("react/jsx-runtime");
2361
2459
  function Suggestion({ title, message, onClick, partial, className }) {
2362
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2460
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2363
2461
  "button",
2364
2462
  {
2365
2463
  disabled: partial,
@@ -2369,7 +2467,7 @@ function Suggestion({ title, message, onClick, partial, className }) {
2369
2467
  },
2370
2468
  className: className || (partial ? "suggestion loading" : "suggestion"),
2371
2469
  "data-test-id": "suggestion",
2372
- children: partial ? SmallSpinnerIcon : /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { children: title })
2470
+ children: partial ? SmallSpinnerIcon : /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { children: title })
2373
2471
  }
2374
2472
  );
2375
2473
  }
@@ -2449,7 +2547,87 @@ var import_react_core10 = require("@copilotkit/react-core");
2449
2547
  var import_runtime_client_gql4 = require("@copilotkit/runtime-client-gql");
2450
2548
  var import_shared3 = require("@copilotkit/shared");
2451
2549
  var import_react_core11 = require("@copilotkit/react-core");
2452
- var import_jsx_runtime22 = require("react/jsx-runtime");
2550
+
2551
+ // src/components/chat/ImageUploadQueue.tsx
2552
+ var import_jsx_runtime23 = require("react/jsx-runtime");
2553
+ var ImageUploadQueue = ({
2554
+ images,
2555
+ onRemoveImage,
2556
+ className = ""
2557
+ }) => {
2558
+ if (images.length === 0)
2559
+ return null;
2560
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2561
+ "div",
2562
+ {
2563
+ className: `copilotKitImageUploadQueue ${className}`,
2564
+ style: {
2565
+ display: "flex",
2566
+ flexWrap: "wrap",
2567
+ gap: "8px",
2568
+ margin: "8px",
2569
+ padding: "8px"
2570
+ },
2571
+ children: images.map((image, index) => /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
2572
+ "div",
2573
+ {
2574
+ className: "copilotKitImageUploadQueueItem",
2575
+ style: {
2576
+ position: "relative",
2577
+ display: "inline-block",
2578
+ width: "60px",
2579
+ height: "60px",
2580
+ borderRadius: "4px",
2581
+ overflow: "hidden"
2582
+ },
2583
+ children: [
2584
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2585
+ "img",
2586
+ {
2587
+ src: `data:${image.contentType};base64,${image.bytes}`,
2588
+ alt: `Selected image ${index + 1}`,
2589
+ style: {
2590
+ width: "100%",
2591
+ height: "100%",
2592
+ objectFit: "cover"
2593
+ }
2594
+ }
2595
+ ),
2596
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2597
+ "button",
2598
+ {
2599
+ onClick: () => onRemoveImage(index),
2600
+ className: "copilotKitImageUploadQueueRemoveButton",
2601
+ style: {
2602
+ position: "absolute",
2603
+ top: "2px",
2604
+ right: "2px",
2605
+ background: "rgba(0,0,0,0.6)",
2606
+ color: "white",
2607
+ border: "none",
2608
+ borderRadius: "50%",
2609
+ width: "18px",
2610
+ height: "18px",
2611
+ display: "flex",
2612
+ alignItems: "center",
2613
+ justifyContent: "center",
2614
+ cursor: "pointer",
2615
+ fontSize: "10px",
2616
+ padding: 0
2617
+ },
2618
+ children: "\u2715"
2619
+ }
2620
+ )
2621
+ ]
2622
+ },
2623
+ index
2624
+ ))
2625
+ }
2626
+ );
2627
+ };
2628
+
2629
+ // src/components/chat/Chat.tsx
2630
+ var import_jsx_runtime24 = require("react/jsx-runtime");
2453
2631
  function CopilotChat({
2454
2632
  instructions,
2455
2633
  onSubmitMessage,
@@ -2466,14 +2644,64 @@ function CopilotChat({
2466
2644
  RenderActionExecutionMessage: RenderActionExecutionMessage2 = RenderActionExecutionMessage,
2467
2645
  RenderAgentStateMessage: RenderAgentStateMessage2 = RenderAgentStateMessage,
2468
2646
  RenderResultMessage: RenderResultMessage2 = RenderResultMessage,
2647
+ RenderImageMessage: RenderImageMessage2 = RenderImageMessage,
2469
2648
  Input: Input2 = Input,
2470
2649
  className,
2471
2650
  icons,
2472
2651
  labels,
2473
2652
  AssistantMessage: AssistantMessage2 = AssistantMessage,
2474
- UserMessage: UserMessage2 = UserMessage
2653
+ UserMessage: UserMessage2 = UserMessage,
2654
+ imageUploadsEnabled,
2655
+ inputFileAccept = "image/*"
2475
2656
  }) {
2476
2657
  const { additionalInstructions, setChatInstructions } = (0, import_react_core10.useCopilotContext)();
2658
+ const [selectedImages, setSelectedImages] = (0, import_react13.useState)([]);
2659
+ const fileInputRef = (0, import_react13.useRef)(null);
2660
+ (0, import_react13.useEffect)(() => {
2661
+ if (!imageUploadsEnabled)
2662
+ return;
2663
+ const handlePaste = (e) => __async(this, null, function* () {
2664
+ var _a, _b;
2665
+ const target = e.target;
2666
+ if (!((_a = target.parentElement) == null ? void 0 : _a.classList.contains("copilotKitInput")))
2667
+ return;
2668
+ const items = Array.from(((_b = e.clipboardData) == null ? void 0 : _b.items) || []);
2669
+ const imageItems = items.filter((item) => item.type.startsWith("image/"));
2670
+ if (imageItems.length === 0)
2671
+ return;
2672
+ e.preventDefault();
2673
+ const imagePromises = imageItems.map((item) => {
2674
+ const file = item.getAsFile();
2675
+ if (!file)
2676
+ return Promise.resolve(null);
2677
+ return new Promise((resolve, reject) => {
2678
+ const reader = new FileReader();
2679
+ reader.onload = (e2) => {
2680
+ var _a2, _b2;
2681
+ const base64String = (_b2 = (_a2 = e2.target) == null ? void 0 : _a2.result) == null ? void 0 : _b2.split(",")[1];
2682
+ if (base64String) {
2683
+ resolve({
2684
+ contentType: file.type,
2685
+ bytes: base64String
2686
+ });
2687
+ } else {
2688
+ resolve(null);
2689
+ }
2690
+ };
2691
+ reader.onerror = reject;
2692
+ reader.readAsDataURL(file);
2693
+ });
2694
+ });
2695
+ try {
2696
+ const loadedImages = (yield Promise.all(imagePromises)).filter((img) => img !== null);
2697
+ setSelectedImages((prev) => [...prev, ...loadedImages]);
2698
+ } catch (error) {
2699
+ console.error("Error processing pasted images:", error);
2700
+ }
2701
+ });
2702
+ document.addEventListener("paste", handlePaste);
2703
+ return () => document.removeEventListener("paste", handlePaste);
2704
+ }, [imageUploadsEnabled]);
2477
2705
  (0, import_react13.useEffect)(() => {
2478
2706
  if (!(additionalInstructions == null ? void 0 : additionalInstructions.length)) {
2479
2707
  setChatInstructions(instructions || "");
@@ -2501,6 +2729,14 @@ function CopilotChat({
2501
2729
  onStopGeneration,
2502
2730
  onReloadMessages
2503
2731
  );
2732
+ const handleSendMessage = (text) => {
2733
+ const images = selectedImages;
2734
+ setSelectedImages([]);
2735
+ if (fileInputRef.current) {
2736
+ fileInputRef.current.value = "";
2737
+ }
2738
+ return sendMessage(text, images);
2739
+ };
2504
2740
  const chatContext = import_react13.default.useContext(ChatContext);
2505
2741
  const isVisible = chatContext ? chatContext.open : true;
2506
2742
  const handleRegenerate = (messageId) => {
@@ -2514,8 +2750,42 @@ function CopilotChat({
2514
2750
  onCopy(message);
2515
2751
  }
2516
2752
  };
2517
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(WrappedCopilotChat, { icons, labels, className, children: [
2518
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2753
+ const handleImageUpload = (event) => __async(this, null, function* () {
2754
+ if (!event.target.files || event.target.files.length === 0) {
2755
+ return;
2756
+ }
2757
+ const files = Array.from(event.target.files).filter((file) => file.type.startsWith("image/"));
2758
+ if (files.length === 0)
2759
+ return;
2760
+ const fileReadPromises = files.map((file) => {
2761
+ return new Promise((resolve, reject) => {
2762
+ const reader = new FileReader();
2763
+ reader.onload = (e) => {
2764
+ var _a, _b;
2765
+ const base64String = ((_b = (_a = e.target) == null ? void 0 : _a.result) == null ? void 0 : _b.split(",")[1]) || "";
2766
+ if (base64String) {
2767
+ resolve({
2768
+ contentType: file.type,
2769
+ bytes: base64String
2770
+ });
2771
+ }
2772
+ };
2773
+ reader.onerror = reject;
2774
+ reader.readAsDataURL(file);
2775
+ });
2776
+ });
2777
+ try {
2778
+ const loadedImages = yield Promise.all(fileReadPromises);
2779
+ setSelectedImages((prev) => [...prev, ...loadedImages]);
2780
+ } catch (error) {
2781
+ console.error("Error reading files:", error);
2782
+ }
2783
+ });
2784
+ const removeSelectedImage = (index) => {
2785
+ setSelectedImages((prev) => prev.filter((_, i) => i !== index));
2786
+ };
2787
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(WrappedCopilotChat, { icons, labels, className, children: [
2788
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
2519
2789
  Messages2,
2520
2790
  {
2521
2791
  AssistantMessage: AssistantMessage2,
@@ -2524,32 +2794,51 @@ function CopilotChat({
2524
2794
  RenderActionExecutionMessage: RenderActionExecutionMessage2,
2525
2795
  RenderAgentStateMessage: RenderAgentStateMessage2,
2526
2796
  RenderResultMessage: RenderResultMessage2,
2797
+ RenderImageMessage: RenderImageMessage2,
2527
2798
  messages: visibleMessages,
2528
2799
  inProgress: isLoading,
2529
2800
  onRegenerate: handleRegenerate,
2530
2801
  onCopy: handleCopy,
2531
2802
  onThumbsUp,
2532
2803
  onThumbsDown,
2533
- children: currentSuggestions.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "suggestions", children: currentSuggestions.map((suggestion, index) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2804
+ children: currentSuggestions.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "suggestions", children: currentSuggestions.map((suggestion, index) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
2534
2805
  Suggestion,
2535
2806
  {
2536
2807
  title: suggestion.title,
2537
2808
  message: suggestion.message,
2538
2809
  partial: suggestion.partial,
2539
2810
  className: suggestion.className,
2540
- onClick: (message) => sendMessage(message)
2811
+ onClick: (message) => handleSendMessage(message)
2541
2812
  },
2542
2813
  index
2543
2814
  )) })
2544
2815
  }
2545
2816
  ),
2546
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2817
+ imageUploadsEnabled && /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_jsx_runtime24.Fragment, { children: [
2818
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(ImageUploadQueue, { images: selectedImages, onRemoveImage: removeSelectedImage }),
2819
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
2820
+ "input",
2821
+ {
2822
+ type: "file",
2823
+ multiple: true,
2824
+ ref: fileInputRef,
2825
+ onChange: handleImageUpload,
2826
+ accept: inputFileAccept,
2827
+ style: { display: "none" }
2828
+ }
2829
+ )
2830
+ ] }),
2831
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
2547
2832
  Input2,
2548
2833
  {
2549
2834
  inProgress: isLoading,
2550
- onSend: sendMessage,
2835
+ onSend: handleSendMessage,
2551
2836
  isVisible,
2552
- onStop: stopGeneration
2837
+ onStop: stopGeneration,
2838
+ onUpload: imageUploadsEnabled ? () => {
2839
+ var _a;
2840
+ return (_a = fileInputRef.current) == null ? void 0 : _a.click();
2841
+ } : void 0
2553
2842
  }
2554
2843
  )
2555
2844
  ] });
@@ -2562,10 +2851,10 @@ function WrappedCopilotChat({
2562
2851
  }) {
2563
2852
  const chatContext = import_react13.default.useContext(ChatContext);
2564
2853
  if (!chatContext) {
2565
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(ChatContextProvider, { icons, labels, open: true, setOpen: () => {
2566
- }, children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: `copilotKitChat ${className}`, children }) });
2854
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(ChatContextProvider, { icons, labels, open: true, setOpen: () => {
2855
+ }, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: `copilotKitChat ${className}`, children }) });
2567
2856
  }
2568
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_jsx_runtime22.Fragment, { children });
2857
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_jsx_runtime24.Fragment, { children });
2569
2858
  }
2570
2859
  var SUGGESTIONS_DEBOUNCE_TIMEOUT = 1e3;
2571
2860
  var useCopilotChatLogic = (makeSystemMessage, onInProgress, onSubmitMessage, onStopGeneration, onReloadMessages) => {
@@ -2619,22 +2908,45 @@ var useCopilotChatLogic = (makeSystemMessage, onInProgress, onSubmitMessage, onS
2619
2908
  // global context
2620
2909
  visibleMessages.length == 0
2621
2910
  ]);
2622
- const sendMessage = (messageContent) => __async(void 0, null, function* () {
2911
+ const sendMessage = (messageContent, imagesToUse) => __async(void 0, null, function* () {
2912
+ const images = imagesToUse || [];
2623
2913
  abortSuggestions();
2624
2914
  setCurrentSuggestions([]);
2625
- const message = new import_runtime_client_gql4.TextMessage({
2626
- content: messageContent,
2627
- role: import_runtime_client_gql4.Role.User
2628
- });
2629
- if (onSubmitMessage) {
2630
- try {
2631
- yield onSubmitMessage(messageContent);
2632
- } catch (error) {
2633
- console.error("Error in onSubmitMessage:", error);
2915
+ let firstMessage = null;
2916
+ if (messageContent.trim().length > 0) {
2917
+ const textMessage = new import_runtime_client_gql4.TextMessage({
2918
+ content: messageContent,
2919
+ role: import_runtime_client_gql4.Role.User
2920
+ });
2921
+ if (onSubmitMessage) {
2922
+ try {
2923
+ yield onSubmitMessage(messageContent);
2924
+ } catch (error) {
2925
+ console.error("Error in onSubmitMessage:", error);
2926
+ }
2927
+ }
2928
+ yield appendMessage(textMessage, { followUp: images.length === 0 });
2929
+ if (!firstMessage) {
2930
+ firstMessage = textMessage;
2931
+ }
2932
+ }
2933
+ if (images.length > 0) {
2934
+ for (let i = 0; i < images.length; i++) {
2935
+ const imageMessage = new import_runtime_client_gql4.ImageMessage({
2936
+ format: images[i].contentType.replace("image/", ""),
2937
+ bytes: images[i].bytes,
2938
+ role: import_runtime_client_gql4.Role.User
2939
+ });
2940
+ yield appendMessage(imageMessage, { followUp: i === images.length - 1 });
2941
+ if (!firstMessage) {
2942
+ firstMessage = imageMessage;
2943
+ }
2634
2944
  }
2635
2945
  }
2636
- appendMessage(message);
2637
- return message;
2946
+ if (!firstMessage) {
2947
+ return new import_runtime_client_gql4.TextMessage({ content: "", role: import_runtime_client_gql4.Role.User });
2948
+ }
2949
+ return firstMessage;
2638
2950
  });
2639
2951
  const messages = visibleMessages;
2640
2952
  const { setMessages } = messagesContext;
@@ -2727,7 +3039,7 @@ var useCopilotChatLogic = (makeSystemMessage, onInProgress, onSubmitMessage, onS
2727
3039
  };
2728
3040
 
2729
3041
  // src/components/chat/Modal.tsx
2730
- var import_jsx_runtime23 = require("react/jsx-runtime");
3042
+ var import_jsx_runtime25 = require("react/jsx-runtime");
2731
3043
  var CopilotModal = ({
2732
3044
  instructions,
2733
3045
  defaultOpen = false,
@@ -2761,19 +3073,19 @@ var CopilotModal = ({
2761
3073
  onSetOpen == null ? void 0 : onSetOpen(open);
2762
3074
  setOpenState(open);
2763
3075
  };
2764
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(ChatContextProvider, { icons, labels, open: openState, setOpen, children: [
3076
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(ChatContextProvider, { icons, labels, open: openState, setOpen, children: [
2765
3077
  children,
2766
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className, children: [
2767
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Button2, {}),
2768
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
3078
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className, children: [
3079
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(Button2, {}),
3080
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
2769
3081
  Window2,
2770
3082
  {
2771
3083
  clickOutsideToClose,
2772
3084
  shortcut,
2773
3085
  hitEscapeToClose,
2774
3086
  children: [
2775
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Header2, {}),
2776
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
3087
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(Header2, {}),
3088
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
2777
3089
  CopilotChat,
2778
3090
  {
2779
3091
  instructions,
@@ -2800,17 +3112,17 @@ var CopilotModal = ({
2800
3112
  };
2801
3113
 
2802
3114
  // src/components/chat/Popup.tsx
2803
- var import_jsx_runtime24 = require("react/jsx-runtime");
3115
+ var import_jsx_runtime26 = require("react/jsx-runtime");
2804
3116
  function CopilotPopup(props) {
2805
3117
  props = __spreadProps(__spreadValues({}, props), {
2806
3118
  className: props.className ? props.className + " copilotKitPopup" : "copilotKitPopup"
2807
3119
  });
2808
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(CopilotModal, __spreadProps(__spreadValues({}, props), { children: props.children }));
3120
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(CopilotModal, __spreadProps(__spreadValues({}, props), { children: props.children }));
2809
3121
  }
2810
3122
 
2811
3123
  // src/components/chat/Sidebar.tsx
2812
3124
  var import_react15 = require("react");
2813
- var import_jsx_runtime25 = require("react/jsx-runtime");
3125
+ var import_jsx_runtime27 = require("react/jsx-runtime");
2814
3126
  function CopilotSidebar(props) {
2815
3127
  props = __spreadProps(__spreadValues({}, props), {
2816
3128
  className: props.className ? props.className + " copilotKitSidebar" : "copilotKitSidebar"
@@ -2823,7 +3135,7 @@ function CopilotSidebar(props) {
2823
3135
  (_a = props.onSetOpen) == null ? void 0 : _a.call(props, open);
2824
3136
  setExpandedClassName(open ? "sidebarExpanded" : "");
2825
3137
  };
2826
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: `copilotKitSidebarContentWrapper ${expandedClassName}`, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(CopilotModal, __spreadProps(__spreadValues(__spreadValues({}, props), { onSetOpen }), { children: props.children })) });
3138
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: `copilotKitSidebarContentWrapper ${expandedClassName}`, children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(CopilotModal, __spreadProps(__spreadValues(__spreadValues({}, props), { onSetOpen }), { children: props.children })) });
2827
3139
  }
2828
3140
  // Annotate the CommonJS export names for ESM import in node:
2829
3141
  0 && (module.exports = {
@@ -2833,6 +3145,7 @@ function CopilotSidebar(props) {
2833
3145
  CopilotPopup,
2834
3146
  CopilotSidebar,
2835
3147
  Markdown,
3148
+ RenderImageMessage,
2836
3149
  UserMessage,
2837
3150
  shouldShowDevConsole,
2838
3151
  useChatContext