@copilotkit/react-ui 1.8.6 → 1.8.7

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 +20 -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 +30 -25
  117. package/package.json +6 -6
  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
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # ui
2
2
 
3
+ ## 1.8.7
4
+
5
+ ### Patch Changes
6
+
7
+ - 8b8474f: - feat: add image input support with multi-model compatibility, pasting, and UX improvements
8
+ - Updated dependencies [8b8474f]
9
+ - @copilotkit/runtime-client-gql@1.8.7
10
+ - @copilotkit/react-core@1.8.7
11
+ - @copilotkit/shared@1.8.7
12
+
13
+ ## 1.8.7-next.0
14
+
15
+ ### Patch Changes
16
+
17
+ - 8b8474f: - feat: add image input support with multi-model compatibility, pasting, and UX improvements
18
+ - Updated dependencies [8b8474f]
19
+ - @copilotkit/runtime-client-gql@1.8.7-next.0
20
+ - @copilotkit/react-core@1.8.7-next.0
21
+ - @copilotkit/shared@1.8.7-next.0
22
+
3
23
  ## 1.8.6
4
24
 
5
25
  ### Patch Changes
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  AssistantMessage
3
- } from "./chunk-5M7ODWKH.mjs";
3
+ } from "./chunk-OZXUB3V7.mjs";
4
4
  import {
5
5
  __objRest
6
6
  } from "./chunk-MRXNTQOX.mjs";
@@ -109,4 +109,4 @@ function RenderAgentStateMessage(_a) {
109
109
  export {
110
110
  RenderAgentStateMessage
111
111
  };
112
- //# sourceMappingURL=chunk-Q2YY2NX3.mjs.map
112
+ //# sourceMappingURL=chunk-24TDU7MY.mjs.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  CodeBlock
3
- } from "./chunk-PCTCOQK2.mjs";
3
+ } from "./chunk-KENCH7RN.mjs";
4
4
  import {
5
5
  __objRest,
6
6
  __spreadProps,
@@ -69,4 +69,4 @@ var components = {
69
69
  export {
70
70
  Markdown
71
71
  };
72
- //# sourceMappingURL=chunk-XNQO5AZZ.mjs.map
72
+ //# sourceMappingURL=chunk-ABHUX6T6.mjs.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-YQFVRDNC.mjs";
4
4
  import {
5
5
  useChatContext
6
- } from "./chunk-UN2E3HCK.mjs";
6
+ } from "./chunk-IEMQ2SQW.mjs";
7
7
  import {
8
8
  usePushToTalk
9
9
  } from "./chunk-S5MBUNGN.mjs";
@@ -12,7 +12,7 @@ import {
12
12
  import { useEffect, useRef, useState } from "react";
13
13
  import { useCopilotContext } from "@copilotkit/react-core";
14
14
  import { jsx, jsxs } from "react/jsx-runtime";
15
- var Input = ({ inProgress, onSend, isVisible = false, onStop }) => {
15
+ var Input = ({ inProgress, onSend, isVisible = false, onStop, onUpload }) => {
16
16
  const context = useChatContext();
17
17
  const copilotContext = useCopilotContext();
18
18
  const pushToTalkConfigured = copilotContext.copilotApiConfig.textToSpeechUrl !== void 0 && copilotContext.copilotApiConfig.transcribeAudioUrl !== void 0;
@@ -76,6 +76,7 @@ var Input = ({ inProgress, onSend, isVisible = false, onStop }) => {
76
76
  }
77
77
  ),
78
78
  /* @__PURE__ */ jsxs("div", { className: "copilotKitInputControls", children: [
79
+ onUpload && /* @__PURE__ */ jsx("button", { onClick: onUpload, className: "copilotKitInputControlButton", children: context.icons.uploadIcon }),
79
80
  /* @__PURE__ */ jsx("div", { style: { flexGrow: 1 } }),
80
81
  showPushToTalk && /* @__PURE__ */ jsx(
81
82
  "button",
@@ -103,4 +104,4 @@ var Input = ({ inProgress, onSend, isVisible = false, onStop }) => {
103
104
  export {
104
105
  Input
105
106
  };
106
- //# sourceMappingURL=chunk-QJKMOGWN.mjs.map
107
+ //# sourceMappingURL=chunk-BDNHZ3GW.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/chat/Input.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from \"react\";\nimport { InputProps } from \"./props\";\nimport { useChatContext } from \"./ChatContext\";\nimport AutoResizingTextarea from \"./Textarea\";\nimport { usePushToTalk } from \"../../hooks/use-push-to-talk\";\nimport { useCopilotContext } from \"@copilotkit/react-core\";\n\nexport const Input = ({ inProgress, onSend, isVisible = false, onStop, onUpload }: InputProps) => {\n const context = useChatContext();\n const copilotContext = useCopilotContext();\n\n const pushToTalkConfigured =\n copilotContext.copilotApiConfig.textToSpeechUrl !== undefined &&\n copilotContext.copilotApiConfig.transcribeAudioUrl !== undefined;\n\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n const handleDivClick = (event: React.MouseEvent<HTMLDivElement>) => {\n const target = event.target as HTMLElement;\n\n // If the user clicked a button or inside a button, don't focus the textarea\n if (target.closest(\"button\")) return;\n\n // If the user clicked the textarea, do nothing (it's already focused)\n if (target.tagName === \"TEXTAREA\") return;\n\n // Otherwise, focus the textarea\n textareaRef.current?.focus();\n };\n\n const [text, setText] = useState(\"\");\n const send = () => {\n if (inProgress) return;\n onSend(text);\n setText(\"\");\n\n textareaRef.current?.focus();\n };\n\n useEffect(() => {\n if (isVisible) {\n textareaRef.current?.focus();\n }\n }, [isVisible]);\n\n const { pushToTalkState, setPushToTalkState } = usePushToTalk({\n sendFunction: onSend,\n inProgress,\n });\n\n const isInProgress = inProgress || pushToTalkState === \"transcribing\";\n const buttonIcon = isInProgress ? context.icons.stopIcon : context.icons.sendIcon;\n const showPushToTalk =\n pushToTalkConfigured &&\n (pushToTalkState === \"idle\" || pushToTalkState === \"recording\") &&\n !inProgress;\n\n const canSend = () => {\n const interruptEvent = copilotContext.langGraphInterruptAction?.event;\n const interruptInProgress =\n interruptEvent?.name === \"LangGraphInterruptEvent\" && !interruptEvent?.response;\n\n return (\n (isInProgress || (!isInProgress && text.trim().length > 0)) &&\n pushToTalkState === \"idle\" &&\n !interruptInProgress\n );\n };\n\n const sendDisabled = !canSend();\n\n return (\n <div className=\"copilotKitInputContainer\">\n <div className=\"copilotKitInput\" onClick={handleDivClick}>\n <AutoResizingTextarea\n ref={textareaRef}\n placeholder={context.labels.placeholder}\n autoFocus={true}\n maxRows={5}\n value={text}\n onChange={(event) => setText(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n if (canSend()) {\n send();\n }\n }\n }}\n />\n <div className=\"copilotKitInputControls\">\n {onUpload && (\n <button onClick={onUpload} className=\"copilotKitInputControlButton\">\n {context.icons.uploadIcon}\n </button>\n )}\n\n <div style={{ flexGrow: 1 }} />\n\n {showPushToTalk && (\n <button\n onClick={() =>\n setPushToTalkState(pushToTalkState === \"idle\" ? \"recording\" : \"transcribing\")\n }\n className={\n pushToTalkState === \"recording\"\n ? \"copilotKitInputControlButton copilotKitPushToTalkRecording\"\n : \"copilotKitInputControlButton\"\n }\n >\n {context.icons.pushToTalkIcon}\n </button>\n )}\n <button\n disabled={sendDisabled}\n onClick={isInProgress ? onStop : send}\n data-copilotkit-in-progress={inProgress}\n data-test-id={inProgress ? \"copilot-chat-request-in-progress\" : \"copilot-chat-ready\"}\n className=\"copilotKitInputControlButton\"\n >\n {buttonIcon}\n </button>\n </div>\n </div>\n </div>\n );\n};\n"],"mappings":";;;;;;;;;;;AAAA,SAAgB,WAAW,QAAQ,gBAAgB;AAKnD,SAAS,yBAAyB;AAqE1B,cAgBA,YAhBA;AAnED,IAAM,QAAQ,CAAC,EAAE,YAAY,QAAQ,YAAY,OAAO,QAAQ,SAAS,MAAkB;AAChG,QAAM,UAAU,eAAe;AAC/B,QAAM,iBAAiB,kBAAkB;AAEzC,QAAM,uBACJ,eAAe,iBAAiB,oBAAoB,UACpD,eAAe,iBAAiB,uBAAuB;AAEzD,QAAM,cAAc,OAA4B,IAAI;AAEpD,QAAM,iBAAiB,CAAC,UAA4C;AAjBtE;AAkBI,UAAM,SAAS,MAAM;AAGrB,QAAI,OAAO,QAAQ,QAAQ;AAAG;AAG9B,QAAI,OAAO,YAAY;AAAY;AAGnC,sBAAY,YAAZ,mBAAqB;AAAA,EACvB;AAEA,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,EAAE;AACnC,QAAM,OAAO,MAAM;AA/BrB;AAgCI,QAAI;AAAY;AAChB,WAAO,IAAI;AACX,YAAQ,EAAE;AAEV,sBAAY,YAAZ,mBAAqB;AAAA,EACvB;AAEA,YAAU,MAAM;AAvClB;AAwCI,QAAI,WAAW;AACb,wBAAY,YAAZ,mBAAqB;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,EAAE,iBAAiB,mBAAmB,IAAI,cAAc;AAAA,IAC5D,cAAc;AAAA,IACd;AAAA,EACF,CAAC;AAED,QAAM,eAAe,cAAc,oBAAoB;AACvD,QAAM,aAAa,eAAe,QAAQ,MAAM,WAAW,QAAQ,MAAM;AACzE,QAAM,iBACJ,yBACC,oBAAoB,UAAU,oBAAoB,gBACnD,CAAC;AAEH,QAAM,UAAU,MAAM;AAzDxB;AA0DI,UAAM,kBAAiB,oBAAe,6BAAf,mBAAyC;AAChE,UAAM,uBACJ,iDAAgB,UAAS,6BAA6B,EAAC,iDAAgB;AAEzE,YACG,gBAAiB,CAAC,gBAAgB,KAAK,KAAK,EAAE,SAAS,MACxD,oBAAoB,UACpB,CAAC;AAAA,EAEL;AAEA,QAAM,eAAe,CAAC,QAAQ;AAE9B,SACE,oBAAC,SAAI,WAAU,4BACb,+BAAC,SAAI,WAAU,mBAAkB,SAAS,gBACxC;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,aAAa,QAAQ,OAAO;AAAA,QAC5B,WAAW;AAAA,QACX,SAAS;AAAA,QACT,OAAO;AAAA,QACP,UAAU,CAAC,UAAU,QAAQ,MAAM,OAAO,KAAK;AAAA,QAC/C,WAAW,CAAC,UAAU;AACpB,cAAI,MAAM,QAAQ,WAAW,CAAC,MAAM,UAAU;AAC5C,kBAAM,eAAe;AACrB,gBAAI,QAAQ,GAAG;AACb,mBAAK;AAAA,YACP;AAAA,UACF;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IACA,qBAAC,SAAI,WAAU,2BACZ;AAAA,kBACC,oBAAC,YAAO,SAAS,UAAU,WAAU,gCAClC,kBAAQ,MAAM,YACjB;AAAA,MAGF,oBAAC,SAAI,OAAO,EAAE,UAAU,EAAE,GAAG;AAAA,MAE5B,kBACC;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,MACP,mBAAmB,oBAAoB,SAAS,cAAc,cAAc;AAAA,UAE9E,WACE,oBAAoB,cAChB,+DACA;AAAA,UAGL,kBAAQ,MAAM;AAAA;AAAA,MACjB;AAAA,MAEF;AAAA,QAAC;AAAA;AAAA,UACC,UAAU;AAAA,UACV,SAAS,eAAe,SAAS;AAAA,UACjC,+BAA6B;AAAA,UAC7B,gBAAc,aAAa,qCAAqC;AAAA,UAChE,WAAU;AAAA,UAET;AAAA;AAAA,MACH;AAAA,OACF;AAAA,KACF,GACF;AAEJ;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  AssistantMessage
3
- } from "./chunk-5M7ODWKH.mjs";
3
+ } from "./chunk-OZXUB3V7.mjs";
4
4
  import {
5
5
  __objRest
6
6
  } from "./chunk-MRXNTQOX.mjs";
@@ -121,4 +121,4 @@ function RenderActionExecutionMessage(_a) {
121
121
  export {
122
122
  RenderActionExecutionMessage
123
123
  };
124
- //# sourceMappingURL=chunk-NMNC4ROZ.mjs.map
124
+ //# sourceMappingURL=chunk-DSQGQJI4.mjs.map
@@ -1,10 +1,10 @@
1
1
  // src/components/chat/messages/UserMessage.tsx
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  var UserMessage = (props) => {
4
- return /* @__PURE__ */ jsx("div", { className: "copilotKitMessage copilotKitUserMessage", children: props.message });
4
+ return /* @__PURE__ */ jsx("div", { className: "copilotKitMessage copilotKitUserMessage", children: props.subComponent || props.message });
5
5
  };
6
6
 
7
7
  export {
8
8
  UserMessage
9
9
  };
10
- //# sourceMappingURL=chunk-HEIDCT7I.mjs.map
10
+ //# sourceMappingURL=chunk-HWMFMBJC.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/chat/messages/UserMessage.tsx"],"sourcesContent":["import { UserMessageProps } from \"../props\";\n\nexport const UserMessage = (props: UserMessageProps) => {\n return (\n <div className=\"copilotKitMessage copilotKitUserMessage\">\n {props.subComponent || props.message}\n </div>\n );\n};\n"],"mappings":";AAII;AAFG,IAAM,cAAc,CAAC,UAA4B;AACtD,SACE,oBAAC,SAAI,WAAU,2CACZ,gBAAM,gBAAgB,MAAM,SAC/B;AAEJ;","names":[]}
@@ -10,8 +10,9 @@ import {
10
10
  SpinnerIcon,
11
11
  StopIcon,
12
12
  ThumbsDownIcon,
13
- ThumbsUpIcon
14
- } from "./chunk-ORSMX3SE.mjs";
13
+ ThumbsUpIcon,
14
+ UploadIcon
15
+ } from "./chunk-XWG3L6QC.mjs";
15
16
  import {
16
17
  __spreadValues
17
18
  } from "./chunk-MRXNTQOX.mjs";
@@ -67,7 +68,8 @@ var ChatContextProvider = ({
67
68
  pushToTalkIcon: MicrophoneIcon,
68
69
  copyIcon: CopyIcon,
69
70
  thumbsUpIcon: ThumbsUpIcon,
70
- thumbsDownIcon: ThumbsDownIcon
71
+ thumbsDownIcon: ThumbsDownIcon,
72
+ uploadIcon: UploadIcon
71
73
  }), icons),
72
74
  [icons]
73
75
  );
@@ -88,4 +90,4 @@ export {
88
90
  useChatContext,
89
91
  ChatContextProvider
90
92
  };
91
- //# sourceMappingURL=chunk-UN2E3HCK.mjs.map
93
+ //# sourceMappingURL=chunk-IEMQ2SQW.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/chat/ChatContext.tsx"],"sourcesContent":["import React, { useMemo, useState } from \"react\";\nimport * as DefaultIcons from \"./Icons\";\nimport { ThumbsDownIcon, ThumbsUpIcon } from \"./Icons\";\n\n/**\n * Icons for CopilotChat component.\n */\nexport interface CopilotChatIcons {\n /**\n * The icon to use for the open chat button.\n * @default <OpenIcon />\n */\n openIcon?: React.ReactNode;\n\n /**\n * The icon to use for the close chat button.\n * @default <CloseIcon />\n */\n closeIcon?: React.ReactNode;\n\n /**\n * The icon to use for the close chat button in the header.\n * @default <HeaderCloseIcon />\n */\n headerCloseIcon?: React.ReactNode;\n\n /**\n * The icon to use for the send button.\n * @default <SendIcon />\n */\n sendIcon?: React.ReactNode;\n\n /**\n * The icon to use for the activity indicator.\n * @default <ActivityIcon />\n */\n activityIcon?: React.ReactNode;\n\n /**\n * The icon to use for the spinner.\n * @default <SpinnerIcon />\n */\n spinnerIcon?: React.ReactNode;\n\n /**\n * The icon to use for the stop button.\n * @default <StopIcon />\n */\n stopIcon?: React.ReactNode;\n\n /**\n * The icon to use for the regenerate button.\n * @default <RegenerateIcon />\n */\n regenerateIcon?: React.ReactNode;\n\n /**\n * The icons to use for push to talk.\n * @default <PushToTalkIcon />\n */\n\n pushToTalkIcon?: React.ReactNode;\n\n /**\n * The icons to use for copy assistant response\n * @default <CopyIcon />\n */\n\n copyIcon?: React.ReactNode;\n\n /**\n * The icon to use for thumbs up/response approval.\n * @default <ThumbsUpIcon />\n */\n\n thumbsUpIcon?: React.ReactNode;\n\n /**\n * The icon to use for thumbs down/response rejection.\n * @default <ThumbsDownIcon />\n */\n\n thumbsDownIcon?: React.ReactNode;\n\n /**\n * The icon to use for the upload button.\n * @default <UploadIcon />\n */\n uploadIcon?: React.ReactNode;\n}\n\n/**\n * Labels for CopilotChat component.\n */\nexport interface CopilotChatLabels {\n /**\n * The initial message(s) to display in the chat window.\n */\n initial?: string | string[];\n\n /**\n * The title to display in the header.\n * @default \"CopilotKit\"\n */\n title?: string;\n\n /**\n * The placeholder to display in the input.\n * @default \"Type a message...\"\n */\n placeholder?: string;\n\n /**\n * The message to display when an error occurs.\n * @default \"❌ An error occurred. Please try again.\"\n */\n error?: string;\n\n /**\n * The label to display on the stop button.\n * @default \"Stop generating\"\n */\n stopGenerating?: string;\n\n /**\n * The label to display on the regenerate button.\n * @default \"Regenerate response\"\n */\n regenerateResponse?: string;\n\n /**\n * The label for the copy button.\n * @default \"Copy to clipboard\"\n */\n copyToClipboard?: string;\n\n /**\n * The label for the thumbs up button.\n * @default \"Thumbs up\"\n */\n thumbsUp?: string;\n\n /**\n * The label for the thumbs down button.\n * @default \"Thumbs down\"\n */\n thumbsDown?: string;\n\n /**\n * The text to display when content is copied.\n * @default \"Copied!\"\n */\n copied?: string;\n}\n\ninterface ChatContext {\n labels: Required<CopilotChatLabels>;\n icons: Required<CopilotChatIcons>;\n open: boolean;\n setOpen: (open: boolean) => void;\n}\n\nexport const ChatContext = React.createContext<ChatContext | undefined>(undefined);\n\nexport function useChatContext(): ChatContext {\n const context = React.useContext(ChatContext);\n if (context === undefined) {\n throw new Error(\n \"Context not found. Did you forget to wrap your app in a <ChatContextProvider> component?\",\n );\n }\n return context;\n}\n\ninterface ChatContextProps {\n // temperature?: number;\n // instructions?: string;\n // maxFeedback?: number;\n labels?: CopilotChatLabels;\n icons?: CopilotChatIcons;\n children?: React.ReactNode;\n open: boolean;\n setOpen: (open: boolean) => void;\n}\n\nexport const ChatContextProvider = ({\n // temperature,\n // instructions,\n // maxFeedback,\n labels,\n icons,\n children,\n open,\n setOpen,\n}: ChatContextProps) => {\n const memoizedLabels = useMemo(\n () => ({\n ...{\n initial: \"\",\n title: \"CopilotKit\",\n placeholder: \"Type a message...\",\n error: \"❌ An error occurred. Please try again.\",\n stopGenerating: \"Stop generating\",\n regenerateResponse: \"Regenerate response\",\n copyToClipboard: \"Copy to clipboard\",\n thumbsUp: \"Thumbs up\",\n thumbsDown: \"Thumbs down\",\n copied: \"Copied!\",\n },\n ...labels,\n }),\n [labels],\n );\n\n const memoizedIcons = useMemo(\n () => ({\n ...{\n openIcon: DefaultIcons.OpenIcon,\n closeIcon: DefaultIcons.CloseIcon,\n headerCloseIcon: DefaultIcons.HeaderCloseIcon,\n sendIcon: DefaultIcons.SendIcon,\n activityIcon: DefaultIcons.ActivityIcon,\n spinnerIcon: DefaultIcons.SpinnerIcon,\n stopIcon: DefaultIcons.StopIcon,\n regenerateIcon: DefaultIcons.RegenerateIcon,\n pushToTalkIcon: DefaultIcons.MicrophoneIcon,\n copyIcon: DefaultIcons.CopyIcon,\n thumbsUpIcon: DefaultIcons.ThumbsUpIcon,\n thumbsDownIcon: DefaultIcons.ThumbsDownIcon,\n uploadIcon: DefaultIcons.UploadIcon,\n },\n ...icons,\n }),\n [icons],\n );\n\n const context = useMemo(\n () => ({\n labels: memoizedLabels,\n icons: memoizedIcons,\n open,\n setOpen,\n }),\n [memoizedLabels, memoizedIcons, open, setOpen],\n );\n\n return <ChatContext.Provider value={context}>{children}</ChatContext.Provider>;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,OAAO,SAAS,eAAyB;AAsPhC;AApFF,IAAM,cAAc,MAAM,cAAuC,MAAS;AAE1E,SAAS,iBAA8B;AAC5C,QAAM,UAAU,MAAM,WAAW,WAAW;AAC5C,MAAI,YAAY,QAAW;AACzB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAaO,IAAM,sBAAsB,CAAC;AAAA;AAAA;AAAA;AAAA,EAIlC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAwB;AACtB,QAAM,iBAAiB;AAAA,IACrB,MAAO,kCACF;AAAA,MACD,SAAS;AAAA,MACT,OAAO;AAAA,MACP,aAAa;AAAA,MACb,OAAO;AAAA,MACP,gBAAgB;AAAA,MAChB,oBAAoB;AAAA,MACpB,iBAAiB;AAAA,MACjB,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,QAAQ;AAAA,IACV,IACG;AAAA,IAEL,CAAC,MAAM;AAAA,EACT;AAEA,QAAM,gBAAgB;AAAA,IACpB,MAAO,kCACF;AAAA,MACD,UAAuB;AAAA,MACvB,WAAwB;AAAA,MACxB,iBAA8B;AAAA,MAC9B,UAAuB;AAAA,MACvB,cAA2B;AAAA,MAC3B,aAA0B;AAAA,MAC1B,UAAuB;AAAA,MACvB,gBAA6B;AAAA,MAC7B,gBAA6B;AAAA,MAC7B,UAAuB;AAAA,MACvB,cAA2B;AAAA,MAC3B,gBAA6B;AAAA,MAC7B,YAAyB;AAAA,IAC3B,IACG;AAAA,IAEL,CAAC,KAAK;AAAA,EACR;AAEA,QAAM,UAAU;AAAA,IACd,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,gBAAgB,eAAe,MAAM,OAAO;AAAA,EAC/C;AAEA,SAAO,oBAAC,YAAY,UAAZ,EAAqB,OAAO,SAAU,UAAS;AACzD;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  useChatContext
3
- } from "./chunk-UN2E3HCK.mjs";
3
+ } from "./chunk-IEMQ2SQW.mjs";
4
4
 
5
5
  // src/components/chat/Messages.tsx
6
6
  import { useEffect, useMemo, useRef } from "react";
@@ -15,6 +15,7 @@ var Messages = ({
15
15
  RenderActionExecutionMessage,
16
16
  RenderAgentStateMessage,
17
17
  RenderResultMessage,
18
+ RenderImageMessage,
18
19
  AssistantMessage,
19
20
  UserMessage,
20
21
  onRegenerate,
@@ -103,6 +104,23 @@ var Messages = ({
103
104
  },
104
105
  index
105
106
  );
107
+ } else if (message.isImageMessage && message.isImageMessage()) {
108
+ return /* @__PURE__ */ jsx(
109
+ RenderImageMessage,
110
+ {
111
+ message,
112
+ inProgress,
113
+ index,
114
+ isCurrentMessage,
115
+ AssistantMessage,
116
+ UserMessage,
117
+ onRegenerate,
118
+ onCopy,
119
+ onThumbsUp,
120
+ onThumbsDown
121
+ },
122
+ index
123
+ );
106
124
  }
107
125
  }),
108
126
  interrupt
@@ -190,4 +208,4 @@ export {
190
208
  Messages,
191
209
  useScrollToBottom
192
210
  };
193
- //# sourceMappingURL=chunk-ZY25LVYR.mjs.map
211
+ //# sourceMappingURL=chunk-IJADIQAR.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/chat/Messages.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { MessagesProps } from \"./props\";\nimport { useChatContext } from \"./ChatContext\";\nimport { Message, ResultMessage, TextMessage, Role } from \"@copilotkit/runtime-client-gql\";\nimport { useLangGraphInterruptRender } from \"@copilotkit/react-core\";\n\nexport const Messages = ({\n messages,\n inProgress,\n children,\n RenderTextMessage,\n RenderActionExecutionMessage,\n RenderAgentStateMessage,\n RenderResultMessage,\n RenderImageMessage,\n AssistantMessage,\n UserMessage,\n onRegenerate,\n onCopy,\n onThumbsUp,\n onThumbsDown,\n}: MessagesProps) => {\n const context = useChatContext();\n const initialMessages = useMemo(\n () => makeInitialMessages(context.labels.initial),\n [context.labels.initial],\n );\n\n messages = [...initialMessages, ...messages];\n\n const actionResults: Record<string, string> = {};\n\n for (let i = 0; i < messages.length; i++) {\n if (messages[i].isActionExecutionMessage()) {\n const id = messages[i].id;\n const resultMessage: ResultMessage | undefined = messages.find(\n (message) => message.isResultMessage() && message.actionExecutionId === id,\n ) as ResultMessage | undefined;\n\n if (resultMessage) {\n actionResults[id] = ResultMessage.decodeResult(resultMessage.result || \"\");\n }\n }\n }\n\n const { messagesEndRef, messagesContainerRef } = useScrollToBottom(messages);\n\n const interrupt = useLangGraphInterruptRender();\n\n return (\n <div className=\"copilotKitMessages\" ref={messagesContainerRef}>\n <div className=\"copilotKitMessagesContainer\">\n {messages.map((message, index) => {\n const isCurrentMessage = index === messages.length - 1;\n\n if (message.isTextMessage()) {\n return (\n <RenderTextMessage\n key={index}\n message={message}\n inProgress={inProgress}\n index={index}\n isCurrentMessage={isCurrentMessage}\n AssistantMessage={AssistantMessage}\n UserMessage={UserMessage}\n onRegenerate={onRegenerate}\n onCopy={onCopy}\n onThumbsUp={onThumbsUp}\n onThumbsDown={onThumbsDown}\n />\n );\n } else if (message.isActionExecutionMessage()) {\n return (\n <RenderActionExecutionMessage\n key={index}\n message={message}\n inProgress={inProgress}\n index={index}\n isCurrentMessage={isCurrentMessage}\n actionResult={actionResults[message.id]}\n AssistantMessage={AssistantMessage}\n UserMessage={UserMessage}\n />\n );\n } else if (message.isAgentStateMessage()) {\n return (\n <RenderAgentStateMessage\n key={index}\n message={message}\n inProgress={inProgress}\n index={index}\n isCurrentMessage={isCurrentMessage}\n AssistantMessage={AssistantMessage}\n UserMessage={UserMessage}\n />\n );\n } else if (message.isResultMessage()) {\n return (\n <RenderResultMessage\n key={index}\n message={message}\n inProgress={inProgress}\n index={index}\n isCurrentMessage={isCurrentMessage}\n AssistantMessage={AssistantMessage}\n UserMessage={UserMessage}\n />\n );\n } else if (message.isImageMessage && message.isImageMessage()) {\n return (\n <RenderImageMessage\n key={index}\n message={message}\n inProgress={inProgress}\n index={index}\n isCurrentMessage={isCurrentMessage}\n AssistantMessage={AssistantMessage}\n UserMessage={UserMessage}\n onRegenerate={onRegenerate}\n onCopy={onCopy}\n onThumbsUp={onThumbsUp}\n onThumbsDown={onThumbsDown}\n />\n );\n }\n })}\n {interrupt}\n </div>\n <footer className=\"copilotKitMessagesFooter\" ref={messagesEndRef}>\n {children}\n </footer>\n </div>\n );\n};\n\nfunction makeInitialMessages(initial?: string | string[]): Message[] {\n let initialArray: string[] = [];\n if (initial) {\n if (Array.isArray(initial)) {\n initialArray.push(...initial);\n } else {\n initialArray.push(initial);\n }\n }\n\n return initialArray.map(\n (message) =>\n new TextMessage({\n role: Role.Assistant,\n content: message,\n }),\n );\n}\nexport function useScrollToBottom(messages: any[]) {\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const messagesContainerRef = useRef<HTMLDivElement | null>(null);\n const isProgrammaticScrollRef = useRef(false);\n const isUserScrollUpRef = useRef(false);\n\n const scrollToBottom = () => {\n if (messagesEndRef.current) {\n isProgrammaticScrollRef.current = true;\n messagesEndRef.current.scrollIntoView({\n behavior: \"auto\",\n });\n }\n };\n\n const handleScroll = () => {\n if (isProgrammaticScrollRef.current) {\n isProgrammaticScrollRef.current = false;\n return;\n }\n\n if (messagesContainerRef.current) {\n const { scrollTop, scrollHeight, clientHeight } = messagesContainerRef.current;\n isUserScrollUpRef.current = scrollTop + clientHeight < scrollHeight;\n }\n };\n\n useEffect(() => {\n const container = messagesContainerRef.current;\n if (container) {\n container.addEventListener(\"scroll\", handleScroll);\n }\n return () => {\n if (container) {\n container.removeEventListener(\"scroll\", handleScroll);\n }\n };\n }, []);\n\n useEffect(() => {\n const container = messagesContainerRef.current;\n if (!container) {\n return;\n }\n\n const mutationObserver = new MutationObserver(() => {\n if (!isUserScrollUpRef.current) {\n scrollToBottom();\n }\n });\n\n mutationObserver.observe(container, {\n childList: true,\n subtree: true,\n characterData: true,\n });\n\n return () => {\n mutationObserver.disconnect();\n };\n }, []);\n\n useEffect(() => {\n isUserScrollUpRef.current = false;\n scrollToBottom();\n }, [messages.filter((m) => m.isTextMessage() && m.role === Role.User).length]);\n\n return { messagesEndRef, messagesContainerRef };\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  CopilotModal
3
- } from "./chunk-GOAED4H6.mjs";
3
+ } from "./chunk-Y7UO3RPW.mjs";
4
4
  import {
5
5
  __spreadProps,
6
6
  __spreadValues
@@ -27,4 +27,4 @@ function CopilotSidebar(props) {
27
27
  export {
28
28
  CopilotSidebar
29
29
  };
30
- //# sourceMappingURL=chunk-X6EFGEBJ.mjs.map
30
+ //# sourceMappingURL=chunk-JOL7NS2W.mjs.map
@@ -2,7 +2,7 @@ import {
2
2
  CheckIcon,
3
3
  CopyIcon,
4
4
  DownloadIcon
5
- } from "./chunk-ORSMX3SE.mjs";
5
+ } from "./chunk-XWG3L6QC.mjs";
6
6
  import {
7
7
  useCopyToClipboard
8
8
  } from "./chunk-54JAUBUJ.mjs";
@@ -386,4 +386,4 @@ export {
386
386
  generateRandomString,
387
387
  CodeBlock
388
388
  };
389
- //# sourceMappingURL=chunk-PCTCOQK2.mjs.map
389
+ //# sourceMappingURL=chunk-KENCH7RN.mjs.map
@@ -1,35 +1,41 @@
1
+ import {
2
+ RenderActionExecutionMessage
3
+ } from "./chunk-DSQGQJI4.mjs";
1
4
  import {
2
5
  RenderAgentStateMessage
3
- } from "./chunk-Q2YY2NX3.mjs";
6
+ } from "./chunk-24TDU7MY.mjs";
7
+ import {
8
+ RenderImageMessage
9
+ } from "./chunk-SLTG4L62.mjs";
4
10
  import {
5
11
  RenderResultMessage
6
- } from "./chunk-WNC6OCIB.mjs";
12
+ } from "./chunk-XFCMZH2H.mjs";
7
13
  import {
8
14
  RenderTextMessage
9
- } from "./chunk-62QMTKMJ.mjs";
15
+ } from "./chunk-POWCBXRY.mjs";
10
16
  import {
11
17
  UserMessage
12
- } from "./chunk-HEIDCT7I.mjs";
13
- import {
14
- RenderActionExecutionMessage
15
- } from "./chunk-NMNC4ROZ.mjs";
18
+ } from "./chunk-HWMFMBJC.mjs";
16
19
  import {
17
20
  AssistantMessage
18
- } from "./chunk-5M7ODWKH.mjs";
21
+ } from "./chunk-OZXUB3V7.mjs";
19
22
  import {
20
23
  Suggestion,
21
24
  reloadSuggestions
22
- } from "./chunk-TOQ7P4DO.mjs";
25
+ } from "./chunk-XZNY26GH.mjs";
26
+ import {
27
+ ImageUploadQueue
28
+ } from "./chunk-PLHTVHUW.mjs";
23
29
  import {
24
30
  Input
25
- } from "./chunk-QJKMOGWN.mjs";
31
+ } from "./chunk-BDNHZ3GW.mjs";
26
32
  import {
27
33
  Messages
28
- } from "./chunk-ZY25LVYR.mjs";
34
+ } from "./chunk-IJADIQAR.mjs";
29
35
  import {
30
36
  ChatContext,
31
37
  ChatContextProvider
32
- } from "./chunk-UN2E3HCK.mjs";
38
+ } from "./chunk-IEMQ2SQW.mjs";
33
39
  import {
34
40
  __async,
35
41
  __spreadProps,
@@ -43,7 +49,7 @@ import {
43
49
  useCopilotContext,
44
50
  useCopilotMessagesContext
45
51
  } from "@copilotkit/react-core";
46
- import { Role, TextMessage } from "@copilotkit/runtime-client-gql";
52
+ import { Role, TextMessage, ImageMessage } from "@copilotkit/runtime-client-gql";
47
53
  import { randomId } from "@copilotkit/shared";
48
54
  import { runAgent, stopAgent } from "@copilotkit/react-core";
49
55
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -63,14 +69,64 @@ function CopilotChat({
63
69
  RenderActionExecutionMessage: RenderActionExecutionMessage2 = RenderActionExecutionMessage,
64
70
  RenderAgentStateMessage: RenderAgentStateMessage2 = RenderAgentStateMessage,
65
71
  RenderResultMessage: RenderResultMessage2 = RenderResultMessage,
72
+ RenderImageMessage: RenderImageMessage2 = RenderImageMessage,
66
73
  Input: Input2 = Input,
67
74
  className,
68
75
  icons,
69
76
  labels,
70
77
  AssistantMessage: AssistantMessage2 = AssistantMessage,
71
- UserMessage: UserMessage2 = UserMessage
78
+ UserMessage: UserMessage2 = UserMessage,
79
+ imageUploadsEnabled,
80
+ inputFileAccept = "image/*"
72
81
  }) {
73
82
  const { additionalInstructions, setChatInstructions } = useCopilotContext();
83
+ const [selectedImages, setSelectedImages] = useState([]);
84
+ const fileInputRef = useRef(null);
85
+ useEffect(() => {
86
+ if (!imageUploadsEnabled)
87
+ return;
88
+ const handlePaste = (e) => __async(this, null, function* () {
89
+ var _a, _b;
90
+ const target = e.target;
91
+ if (!((_a = target.parentElement) == null ? void 0 : _a.classList.contains("copilotKitInput")))
92
+ return;
93
+ const items = Array.from(((_b = e.clipboardData) == null ? void 0 : _b.items) || []);
94
+ const imageItems = items.filter((item) => item.type.startsWith("image/"));
95
+ if (imageItems.length === 0)
96
+ return;
97
+ e.preventDefault();
98
+ const imagePromises = imageItems.map((item) => {
99
+ const file = item.getAsFile();
100
+ if (!file)
101
+ return Promise.resolve(null);
102
+ return new Promise((resolve, reject) => {
103
+ const reader = new FileReader();
104
+ reader.onload = (e2) => {
105
+ var _a2, _b2;
106
+ const base64String = (_b2 = (_a2 = e2.target) == null ? void 0 : _a2.result) == null ? void 0 : _b2.split(",")[1];
107
+ if (base64String) {
108
+ resolve({
109
+ contentType: file.type,
110
+ bytes: base64String
111
+ });
112
+ } else {
113
+ resolve(null);
114
+ }
115
+ };
116
+ reader.onerror = reject;
117
+ reader.readAsDataURL(file);
118
+ });
119
+ });
120
+ try {
121
+ const loadedImages = (yield Promise.all(imagePromises)).filter((img) => img !== null);
122
+ setSelectedImages((prev) => [...prev, ...loadedImages]);
123
+ } catch (error) {
124
+ console.error("Error processing pasted images:", error);
125
+ }
126
+ });
127
+ document.addEventListener("paste", handlePaste);
128
+ return () => document.removeEventListener("paste", handlePaste);
129
+ }, [imageUploadsEnabled]);
74
130
  useEffect(() => {
75
131
  if (!(additionalInstructions == null ? void 0 : additionalInstructions.length)) {
76
132
  setChatInstructions(instructions || "");
@@ -98,6 +154,14 @@ function CopilotChat({
98
154
  onStopGeneration,
99
155
  onReloadMessages
100
156
  );
157
+ const handleSendMessage = (text) => {
158
+ const images = selectedImages;
159
+ setSelectedImages([]);
160
+ if (fileInputRef.current) {
161
+ fileInputRef.current.value = "";
162
+ }
163
+ return sendMessage(text, images);
164
+ };
101
165
  const chatContext = React.useContext(ChatContext);
102
166
  const isVisible = chatContext ? chatContext.open : true;
103
167
  const handleRegenerate = (messageId) => {
@@ -111,6 +175,40 @@ function CopilotChat({
111
175
  onCopy(message);
112
176
  }
113
177
  };
178
+ const handleImageUpload = (event) => __async(this, null, function* () {
179
+ if (!event.target.files || event.target.files.length === 0) {
180
+ return;
181
+ }
182
+ const files = Array.from(event.target.files).filter((file) => file.type.startsWith("image/"));
183
+ if (files.length === 0)
184
+ return;
185
+ const fileReadPromises = files.map((file) => {
186
+ return new Promise((resolve, reject) => {
187
+ const reader = new FileReader();
188
+ reader.onload = (e) => {
189
+ var _a, _b;
190
+ const base64String = ((_b = (_a = e.target) == null ? void 0 : _a.result) == null ? void 0 : _b.split(",")[1]) || "";
191
+ if (base64String) {
192
+ resolve({
193
+ contentType: file.type,
194
+ bytes: base64String
195
+ });
196
+ }
197
+ };
198
+ reader.onerror = reject;
199
+ reader.readAsDataURL(file);
200
+ });
201
+ });
202
+ try {
203
+ const loadedImages = yield Promise.all(fileReadPromises);
204
+ setSelectedImages((prev) => [...prev, ...loadedImages]);
205
+ } catch (error) {
206
+ console.error("Error reading files:", error);
207
+ }
208
+ });
209
+ const removeSelectedImage = (index) => {
210
+ setSelectedImages((prev) => prev.filter((_, i) => i !== index));
211
+ };
114
212
  return /* @__PURE__ */ jsxs(WrappedCopilotChat, { icons, labels, className, children: [
115
213
  /* @__PURE__ */ jsx(
116
214
  Messages2,
@@ -121,6 +219,7 @@ function CopilotChat({
121
219
  RenderActionExecutionMessage: RenderActionExecutionMessage2,
122
220
  RenderAgentStateMessage: RenderAgentStateMessage2,
123
221
  RenderResultMessage: RenderResultMessage2,
222
+ RenderImageMessage: RenderImageMessage2,
124
223
  messages: visibleMessages,
125
224
  inProgress: isLoading,
126
225
  onRegenerate: handleRegenerate,
@@ -134,19 +233,37 @@ function CopilotChat({
134
233
  message: suggestion.message,
135
234
  partial: suggestion.partial,
136
235
  className: suggestion.className,
137
- onClick: (message) => sendMessage(message)
236
+ onClick: (message) => handleSendMessage(message)
138
237
  },
139
238
  index
140
239
  )) })
141
240
  }
142
241
  ),
242
+ imageUploadsEnabled && /* @__PURE__ */ jsxs(Fragment, { children: [
243
+ /* @__PURE__ */ jsx(ImageUploadQueue, { images: selectedImages, onRemoveImage: removeSelectedImage }),
244
+ /* @__PURE__ */ jsx(
245
+ "input",
246
+ {
247
+ type: "file",
248
+ multiple: true,
249
+ ref: fileInputRef,
250
+ onChange: handleImageUpload,
251
+ accept: inputFileAccept,
252
+ style: { display: "none" }
253
+ }
254
+ )
255
+ ] }),
143
256
  /* @__PURE__ */ jsx(
144
257
  Input2,
145
258
  {
146
259
  inProgress: isLoading,
147
- onSend: sendMessage,
260
+ onSend: handleSendMessage,
148
261
  isVisible,
149
- onStop: stopGeneration
262
+ onStop: stopGeneration,
263
+ onUpload: imageUploadsEnabled ? () => {
264
+ var _a;
265
+ return (_a = fileInputRef.current) == null ? void 0 : _a.click();
266
+ } : void 0
150
267
  }
151
268
  )
152
269
  ] });
@@ -216,22 +333,45 @@ var useCopilotChatLogic = (makeSystemMessage, onInProgress, onSubmitMessage, onS
216
333
  // global context
217
334
  visibleMessages.length == 0
218
335
  ]);
219
- const sendMessage = (messageContent) => __async(void 0, null, function* () {
336
+ const sendMessage = (messageContent, imagesToUse) => __async(void 0, null, function* () {
337
+ const images = imagesToUse || [];
220
338
  abortSuggestions();
221
339
  setCurrentSuggestions([]);
222
- const message = new TextMessage({
223
- content: messageContent,
224
- role: Role.User
225
- });
226
- if (onSubmitMessage) {
227
- try {
228
- yield onSubmitMessage(messageContent);
229
- } catch (error) {
230
- console.error("Error in onSubmitMessage:", error);
340
+ let firstMessage = null;
341
+ if (messageContent.trim().length > 0) {
342
+ const textMessage = new TextMessage({
343
+ content: messageContent,
344
+ role: Role.User
345
+ });
346
+ if (onSubmitMessage) {
347
+ try {
348
+ yield onSubmitMessage(messageContent);
349
+ } catch (error) {
350
+ console.error("Error in onSubmitMessage:", error);
351
+ }
231
352
  }
353
+ yield appendMessage(textMessage, { followUp: images.length === 0 });
354
+ if (!firstMessage) {
355
+ firstMessage = textMessage;
356
+ }
357
+ }
358
+ if (images.length > 0) {
359
+ for (let i = 0; i < images.length; i++) {
360
+ const imageMessage = new ImageMessage({
361
+ format: images[i].contentType.replace("image/", ""),
362
+ bytes: images[i].bytes,
363
+ role: Role.User
364
+ });
365
+ yield appendMessage(imageMessage, { followUp: i === images.length - 1 });
366
+ if (!firstMessage) {
367
+ firstMessage = imageMessage;
368
+ }
369
+ }
370
+ }
371
+ if (!firstMessage) {
372
+ return new TextMessage({ content: "", role: Role.User });
232
373
  }
233
- appendMessage(message);
234
- return message;
374
+ return firstMessage;
235
375
  });
236
376
  const messages = visibleMessages;
237
377
  const { setMessages } = messagesContext;
@@ -328,4 +468,4 @@ export {
328
468
  WrappedCopilotChat,
329
469
  useCopilotChatLogic
330
470
  };
331
- //# sourceMappingURL=chunk-ZLRUNNS7.mjs.map
471
+ //# sourceMappingURL=chunk-O34Z4XM2.mjs.map