@copilotkit/react-ui 1.9.3 → 1.10.0-next.1

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 (198) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/{chunk-GVKA7RQQ.mjs → chunk-7CAK2CNK.mjs} +2 -2
  3. package/dist/{chunk-KN2GCKBE.mjs → chunk-7RNOT3GM.mjs} +9 -9
  4. package/dist/{chunk-KENCH7RN.mjs → chunk-B5IFB5YJ.mjs} +1 -1
  5. package/dist/chunk-B5IFB5YJ.mjs.map +1 -0
  6. package/dist/chunk-DBKRAOH7.mjs +34 -0
  7. package/dist/chunk-DBKRAOH7.mjs.map +1 -0
  8. package/dist/{chunk-4HUXYD3B.mjs → chunk-DTRPPNSA.mjs} +2 -2
  9. package/dist/{chunk-YTXEWDNC.mjs → chunk-E6MQUIZW.mjs} +15 -4
  10. package/dist/chunk-E6MQUIZW.mjs.map +1 -0
  11. package/dist/{chunk-Z4XPPVZT.mjs → chunk-EYRKZDP5.mjs} +1 -1
  12. package/dist/chunk-EYRKZDP5.mjs.map +1 -0
  13. package/dist/{chunk-SGFUVPDB.mjs → chunk-FOSKS7AI.mjs} +4 -4
  14. package/dist/{chunk-L3GZ7TXC.mjs → chunk-GCKKSSBU.mjs} +21 -24
  15. package/dist/chunk-GCKKSSBU.mjs.map +1 -0
  16. package/dist/{chunk-S5MBUNGN.mjs → chunk-O72ZB5V3.mjs} +4 -4
  17. package/dist/chunk-O72ZB5V3.mjs.map +1 -0
  18. package/dist/{chunk-QGSPTXOV.mjs → chunk-O7KTFUAN.mjs} +2 -2
  19. package/dist/chunk-O7KTFUAN.mjs.map +1 -0
  20. package/dist/{chunk-HKTWKCPS.mjs → chunk-O7PYQO73.mjs} +127 -92
  21. package/dist/chunk-O7PYQO73.mjs.map +1 -0
  22. package/dist/{chunk-32MUWKL3.mjs → chunk-OQM7D3Z3.mjs} +22 -18
  23. package/dist/chunk-OQM7D3Z3.mjs.map +1 -0
  24. package/dist/chunk-Q2467VHZ.mjs +30 -0
  25. package/dist/chunk-Q2467VHZ.mjs.map +1 -0
  26. package/dist/{chunk-ALIBUJML.mjs → chunk-QELAC6XJ.mjs} +2 -2
  27. package/dist/chunk-QELAC6XJ.mjs.map +1 -0
  28. package/dist/{chunk-H3EM63WS.mjs → chunk-TCIZDWPC.mjs} +2 -2
  29. package/dist/chunk-TCIZDWPC.mjs.map +1 -0
  30. package/dist/chunk-VVL6JFCJ.mjs +16 -0
  31. package/dist/chunk-VVL6JFCJ.mjs.map +1 -0
  32. package/dist/chunk-WHDNKXMP.mjs +135 -0
  33. package/dist/chunk-WHDNKXMP.mjs.map +1 -0
  34. package/dist/components/chat/Button.d.ts +1 -1
  35. package/dist/components/chat/Chat.d.ts +119 -28
  36. package/dist/components/chat/Chat.js +298 -658
  37. package/dist/components/chat/Chat.js.map +1 -1
  38. package/dist/components/chat/Chat.mjs +12 -15
  39. package/dist/components/chat/CodeBlock.js.map +1 -1
  40. package/dist/components/chat/CodeBlock.mjs +1 -1
  41. package/dist/components/chat/Header.d.ts +1 -1
  42. package/dist/components/chat/Header.mjs +4 -4
  43. package/dist/components/chat/Input.d.ts +1 -1
  44. package/dist/components/chat/Input.js +3 -3
  45. package/dist/components/chat/Input.js.map +1 -1
  46. package/dist/components/chat/Input.mjs +2 -2
  47. package/dist/components/chat/Markdown.js +13 -2
  48. package/dist/components/chat/Markdown.js.map +1 -1
  49. package/dist/components/chat/Markdown.mjs +2 -2
  50. package/dist/components/chat/Messages.d.ts +3 -3
  51. package/dist/components/chat/Messages.js +40 -116
  52. package/dist/components/chat/Messages.js.map +1 -1
  53. package/dist/components/chat/Messages.mjs +1 -1
  54. package/dist/components/chat/Modal.d.ts +7 -2
  55. package/dist/components/chat/Modal.js +308 -668
  56. package/dist/components/chat/Modal.js.map +1 -1
  57. package/dist/components/chat/Modal.mjs +17 -20
  58. package/dist/components/chat/Popup.d.ts +7 -2
  59. package/dist/components/chat/Popup.js +310 -670
  60. package/dist/components/chat/Popup.js.map +1 -1
  61. package/dist/components/chat/Popup.mjs +18 -21
  62. package/dist/components/chat/Sidebar.d.ts +7 -2
  63. package/dist/components/chat/Sidebar.js +312 -672
  64. package/dist/components/chat/Sidebar.js.map +1 -1
  65. package/dist/components/chat/Sidebar.mjs +18 -21
  66. package/dist/components/chat/Suggestion.d.ts +2 -9
  67. package/dist/components/chat/Suggestion.js +6 -96
  68. package/dist/components/chat/Suggestion.js.map +1 -1
  69. package/dist/components/chat/Suggestion.mjs +3 -5
  70. package/dist/components/chat/Suggestions.d.ts +1 -1
  71. package/dist/components/chat/Suggestions.js +4 -3
  72. package/dist/components/chat/Suggestions.js.map +1 -1
  73. package/dist/components/chat/Suggestions.mjs +2 -2
  74. package/dist/components/chat/Window.d.ts +1 -1
  75. package/dist/components/chat/index.d.ts +8 -3
  76. package/dist/components/chat/index.js +316 -676
  77. package/dist/components/chat/index.js.map +1 -1
  78. package/dist/components/chat/index.mjs +22 -25
  79. package/dist/components/chat/messages/AssistantMessage.d.ts +1 -1
  80. package/dist/components/chat/messages/AssistantMessage.js +32 -24
  81. package/dist/components/chat/messages/AssistantMessage.js.map +1 -1
  82. package/dist/components/chat/messages/AssistantMessage.mjs +3 -3
  83. package/dist/components/chat/messages/ImageRenderer.d.ts +12 -0
  84. package/dist/components/chat/messages/ImageRenderer.js +58 -0
  85. package/dist/components/chat/messages/ImageRenderer.js.map +1 -0
  86. package/dist/components/chat/messages/ImageRenderer.mjs +8 -0
  87. package/dist/components/chat/messages/RenderMessage.d.ts +9 -0
  88. package/dist/components/chat/messages/{RenderTextMessage.js → RenderMessage.js} +92 -47
  89. package/dist/components/chat/messages/RenderMessage.js.map +1 -0
  90. package/dist/components/chat/messages/RenderMessage.mjs +16 -0
  91. package/dist/components/chat/messages/UserMessage.d.ts +1 -1
  92. package/dist/components/chat/messages/UserMessage.js +7 -1
  93. package/dist/components/chat/messages/UserMessage.js.map +1 -1
  94. package/dist/components/chat/messages/UserMessage.mjs +1 -1
  95. package/dist/components/chat/props.d.ts +32 -27
  96. package/dist/components/chat/props.js.map +1 -1
  97. package/dist/components/dev-console/console.mjs +3 -3
  98. package/dist/components/dev-console/index.mjs +4 -4
  99. package/dist/components/index.d.ts +8 -3
  100. package/dist/components/index.js +316 -676
  101. package/dist/components/index.js.map +1 -1
  102. package/dist/components/index.mjs +23 -26
  103. package/dist/hooks/index.js.map +1 -1
  104. package/dist/hooks/index.mjs +1 -1
  105. package/dist/hooks/use-copilot-chat-suggestions.d.ts +1 -1
  106. package/dist/hooks/use-copilot-chat-suggestions.js.map +1 -1
  107. package/dist/hooks/use-copilot-chat-suggestions.mjs +1 -1
  108. package/dist/hooks/use-push-to-talk.d.ts +1 -1
  109. package/dist/hooks/use-push-to-talk.js +3 -3
  110. package/dist/hooks/use-push-to-talk.js.map +1 -1
  111. package/dist/hooks/use-push-to-talk.mjs +1 -1
  112. package/dist/index.css +59 -3
  113. package/dist/index.css.map +1 -1
  114. package/dist/index.d.ts +8 -3
  115. package/dist/index.js +322 -682
  116. package/dist/index.js.map +1 -1
  117. package/dist/index.mjs +24 -27
  118. package/dist/types/css.d.ts +3 -0
  119. package/dist/types/css.js.map +1 -1
  120. package/package.json +4 -4
  121. package/src/components/chat/Chat.tsx +194 -106
  122. package/src/components/chat/CodeBlock.tsx +1 -1
  123. package/src/components/chat/Markdown.tsx +12 -2
  124. package/src/components/chat/Messages.tsx +43 -122
  125. package/src/components/chat/Popup.tsx +1 -1
  126. package/src/components/chat/Sidebar.tsx +1 -1
  127. package/src/components/chat/Suggestion.tsx +5 -108
  128. package/src/components/chat/Suggestions.tsx +0 -1
  129. package/src/components/chat/index.tsx +1 -1
  130. package/src/components/chat/messages/AssistantMessage.tsx +15 -23
  131. package/src/components/chat/messages/ImageRenderer.tsx +37 -0
  132. package/src/components/chat/messages/{RenderTextMessage.tsx → RenderMessage.tsx} +10 -9
  133. package/src/components/chat/messages/UserMessage.tsx +16 -5
  134. package/src/components/chat/props.ts +36 -28
  135. package/src/css/colors.css +10 -0
  136. package/src/css/markdown.css +8 -0
  137. package/src/css/messages.css +54 -5
  138. package/src/css/suggestions.css +1 -1
  139. package/src/hooks/use-copilot-chat-suggestions.tsx +1 -1
  140. package/src/hooks/use-push-to-talk.tsx +6 -5
  141. package/src/styles.css +1 -1
  142. package/src/types/css.ts +3 -0
  143. package/dist/chunk-2II3Q27P.mjs +0 -112
  144. package/dist/chunk-2II3Q27P.mjs.map +0 -1
  145. package/dist/chunk-32MUWKL3.mjs.map +0 -1
  146. package/dist/chunk-53CVDVS5.mjs +0 -127
  147. package/dist/chunk-53CVDVS5.mjs.map +0 -1
  148. package/dist/chunk-ALIBUJML.mjs.map +0 -1
  149. package/dist/chunk-B3D7U7TJ.mjs +0 -211
  150. package/dist/chunk-B3D7U7TJ.mjs.map +0 -1
  151. package/dist/chunk-C7OB63U5.mjs +0 -36
  152. package/dist/chunk-C7OB63U5.mjs.map +0 -1
  153. package/dist/chunk-H3EM63WS.mjs.map +0 -1
  154. package/dist/chunk-HKTWKCPS.mjs.map +0 -1
  155. package/dist/chunk-HWMFMBJC.mjs +0 -10
  156. package/dist/chunk-HWMFMBJC.mjs.map +0 -1
  157. package/dist/chunk-IMBPSLL4.mjs +0 -104
  158. package/dist/chunk-IMBPSLL4.mjs.map +0 -1
  159. package/dist/chunk-KENCH7RN.mjs.map +0 -1
  160. package/dist/chunk-L3GZ7TXC.mjs.map +0 -1
  161. package/dist/chunk-QGSPTXOV.mjs.map +0 -1
  162. package/dist/chunk-S5MBUNGN.mjs.map +0 -1
  163. package/dist/chunk-ULDQXCED.mjs +0 -78
  164. package/dist/chunk-ULDQXCED.mjs.map +0 -1
  165. package/dist/chunk-YTXEWDNC.mjs.map +0 -1
  166. package/dist/chunk-Z4XPPVZT.mjs.map +0 -1
  167. package/dist/components/chat/messages/RenderActionExecutionMessage.d.ts +0 -9
  168. package/dist/components/chat/messages/RenderActionExecutionMessage.js +0 -869
  169. package/dist/components/chat/messages/RenderActionExecutionMessage.js.map +0 -1
  170. package/dist/components/chat/messages/RenderActionExecutionMessage.mjs +0 -14
  171. package/dist/components/chat/messages/RenderAgentStateMessage.d.ts +0 -9
  172. package/dist/components/chat/messages/RenderAgentStateMessage.js +0 -854
  173. package/dist/components/chat/messages/RenderAgentStateMessage.js.map +0 -1
  174. package/dist/components/chat/messages/RenderAgentStateMessage.mjs +0 -14
  175. package/dist/components/chat/messages/RenderImageMessage.d.ts +0 -9
  176. package/dist/components/chat/messages/RenderImageMessage.js +0 -823
  177. package/dist/components/chat/messages/RenderImageMessage.js.map +0 -1
  178. package/dist/components/chat/messages/RenderImageMessage.mjs +0 -15
  179. package/dist/components/chat/messages/RenderImageMessage.mjs.map +0 -1
  180. package/dist/components/chat/messages/RenderResultMessage.d.ts +0 -9
  181. package/dist/components/chat/messages/RenderResultMessage.js +0 -778
  182. package/dist/components/chat/messages/RenderResultMessage.js.map +0 -1
  183. package/dist/components/chat/messages/RenderResultMessage.mjs +0 -14
  184. package/dist/components/chat/messages/RenderResultMessage.mjs.map +0 -1
  185. package/dist/components/chat/messages/RenderTextMessage.d.ts +0 -9
  186. package/dist/components/chat/messages/RenderTextMessage.js.map +0 -1
  187. package/dist/components/chat/messages/RenderTextMessage.mjs +0 -15
  188. package/dist/components/chat/messages/RenderTextMessage.mjs.map +0 -1
  189. package/src/components/chat/messages/RenderActionExecutionMessage.tsx +0 -127
  190. package/src/components/chat/messages/RenderAgentStateMessage.tsx +0 -116
  191. package/src/components/chat/messages/RenderImageMessage.tsx +0 -64
  192. package/src/components/chat/messages/RenderResultMessage.tsx +0 -26
  193. /package/dist/{chunk-GVKA7RQQ.mjs.map → chunk-7CAK2CNK.mjs.map} +0 -0
  194. /package/dist/{chunk-KN2GCKBE.mjs.map → chunk-7RNOT3GM.mjs.map} +0 -0
  195. /package/dist/{chunk-4HUXYD3B.mjs.map → chunk-DTRPPNSA.mjs.map} +0 -0
  196. /package/dist/{chunk-SGFUVPDB.mjs.map → chunk-FOSKS7AI.mjs.map} +0 -0
  197. /package/dist/components/chat/messages/{RenderActionExecutionMessage.mjs.map → ImageRenderer.mjs.map} +0 -0
  198. /package/dist/components/chat/messages/{RenderAgentStateMessage.mjs.map → RenderMessage.mjs.map} +0 -0
@@ -82,7 +82,7 @@ __export(Modal_exports, {
82
82
  CopilotModal: () => CopilotModal
83
83
  });
84
84
  module.exports = __toCommonJS(Modal_exports);
85
- var import_react14 = __toESM(require("react"));
85
+ var import_react15 = __toESM(require("react"));
86
86
 
87
87
  // src/components/chat/ChatContext.tsx
88
88
  var import_react = __toESM(require("react"));
@@ -1026,18 +1026,12 @@ var Header = ({}) => {
1026
1026
 
1027
1027
  // src/components/chat/Messages.tsx
1028
1028
  var import_react6 = require("react");
1029
- var import_runtime_client_gql = require("@copilotkit/runtime-client-gql");
1030
1029
  var import_react_core4 = require("@copilotkit/react-core");
1031
1030
  var import_jsx_runtime10 = require("react/jsx-runtime");
1032
1031
  var Messages = ({
1033
- messages,
1034
1032
  inProgress,
1035
1033
  children,
1036
- RenderTextMessage: RenderTextMessage2,
1037
- RenderActionExecutionMessage: RenderActionExecutionMessage2,
1038
- RenderAgentStateMessage: RenderAgentStateMessage2,
1039
- RenderResultMessage: RenderResultMessage2,
1040
- RenderImageMessage: RenderImageMessage2,
1034
+ RenderMessage: RenderMessage2,
1041
1035
  AssistantMessage: AssistantMessage2,
1042
1036
  UserMessage: UserMessage2,
1043
1037
  onRegenerate,
@@ -1046,106 +1040,32 @@ var Messages = ({
1046
1040
  onThumbsDown,
1047
1041
  markdownTagRenderers
1048
1042
  }) => {
1049
- const context = useChatContext();
1050
- const initialMessages = (0, import_react6.useMemo)(
1051
- () => makeInitialMessages(context.labels.initial),
1052
- [context.labels.initial]
1053
- );
1054
- messages = [...initialMessages, ...messages];
1055
- const actionResults = {};
1056
- for (let i = 0; i < messages.length; i++) {
1057
- if (messages[i].isActionExecutionMessage()) {
1058
- const id = messages[i].id;
1059
- const resultMessage = messages.find(
1060
- (message) => message.isResultMessage() && message.actionExecutionId === id
1061
- );
1062
- if (resultMessage) {
1063
- actionResults[id] = import_runtime_client_gql.ResultMessage.decodeResult(resultMessage.result || "");
1064
- }
1065
- }
1066
- }
1043
+ const { labels } = useChatContext();
1044
+ const { visibleMessages, interrupt } = (0, import_react_core4.useCopilotChat)();
1045
+ const initialMessages = (0, import_react6.useMemo)(() => makeInitialMessages(labels.initial), [labels.initial]);
1046
+ const messages = [...initialMessages, ...visibleMessages];
1067
1047
  const { messagesContainerRef, messagesEndRef } = useScrollToBottom(messages);
1068
- const interrupt = (0, import_react_core4.useLangGraphInterruptRender)();
1069
1048
  return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "copilotKitMessages", ref: messagesContainerRef, children: [
1070
1049
  /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "copilotKitMessagesContainer", children: [
1071
1050
  messages.map((message, index) => {
1072
1051
  const isCurrentMessage = index === messages.length - 1;
1073
- if (message.isTextMessage()) {
1074
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1075
- RenderTextMessage2,
1076
- {
1077
- message,
1078
- inProgress,
1079
- index,
1080
- isCurrentMessage,
1081
- AssistantMessage: AssistantMessage2,
1082
- UserMessage: UserMessage2,
1083
- onRegenerate,
1084
- onCopy,
1085
- onThumbsUp,
1086
- onThumbsDown,
1087
- markdownTagRenderers
1088
- },
1089
- index
1090
- );
1091
- } else if (message.isActionExecutionMessage()) {
1092
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1093
- RenderActionExecutionMessage2,
1094
- {
1095
- message,
1096
- inProgress,
1097
- index,
1098
- isCurrentMessage,
1099
- actionResult: actionResults[message.id],
1100
- AssistantMessage: AssistantMessage2,
1101
- UserMessage: UserMessage2
1102
- },
1103
- index
1104
- );
1105
- } else if (message.isAgentStateMessage()) {
1106
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1107
- RenderAgentStateMessage2,
1108
- {
1109
- message,
1110
- inProgress,
1111
- index,
1112
- isCurrentMessage,
1113
- AssistantMessage: AssistantMessage2,
1114
- UserMessage: UserMessage2
1115
- },
1116
- index
1117
- );
1118
- } else if (message.isResultMessage()) {
1119
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1120
- RenderResultMessage2,
1121
- {
1122
- message,
1123
- inProgress,
1124
- index,
1125
- isCurrentMessage,
1126
- AssistantMessage: AssistantMessage2,
1127
- UserMessage: UserMessage2
1128
- },
1129
- index
1130
- );
1131
- } else if (message.isImageMessage && message.isImageMessage()) {
1132
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1133
- RenderImageMessage2,
1134
- {
1135
- message,
1136
- inProgress,
1137
- index,
1138
- isCurrentMessage,
1139
- AssistantMessage: AssistantMessage2,
1140
- UserMessage: UserMessage2,
1141
- onRegenerate,
1142
- onCopy,
1143
- onThumbsUp,
1144
- onThumbsDown
1145
- },
1146
- index
1147
- );
1148
- }
1052
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1053
+ RenderMessage2,
1054
+ {
1055
+ message,
1056
+ inProgress,
1057
+ index,
1058
+ isCurrentMessage,
1059
+ AssistantMessage: AssistantMessage2,
1060
+ UserMessage: UserMessage2,
1061
+ onRegenerate,
1062
+ onCopy,
1063
+ onThumbsUp,
1064
+ onThumbsDown,
1065
+ markdownTagRenderers
1066
+ },
1067
+ index
1068
+ );
1149
1069
  }),
1150
1070
  interrupt
1151
1071
  ] }),
@@ -1153,20 +1073,24 @@ var Messages = ({
1153
1073
  ] });
1154
1074
  };
1155
1075
  function makeInitialMessages(initial) {
1156
- let initialArray = [];
1157
- if (initial) {
1158
- if (Array.isArray(initial)) {
1159
- initialArray.push(...initial);
1160
- } else {
1161
- initialArray.push(initial);
1162
- }
1076
+ if (!initial)
1077
+ return [];
1078
+ if (Array.isArray(initial)) {
1079
+ return initial.map((message) => {
1080
+ return {
1081
+ id: message,
1082
+ role: "assistant",
1083
+ content: message
1084
+ };
1085
+ });
1163
1086
  }
1164
- return initialArray.map(
1165
- (message) => new import_runtime_client_gql.TextMessage({
1166
- role: import_runtime_client_gql.Role.Assistant,
1167
- content: message
1168
- })
1169
- );
1087
+ return [
1088
+ {
1089
+ id: initial,
1090
+ role: "system",
1091
+ content: initial
1092
+ }
1093
+ ];
1170
1094
  }
1171
1095
  function useScrollToBottom(messages) {
1172
1096
  const messagesEndRef = (0, import_react6.useRef)(null);
@@ -1222,7 +1146,7 @@ function useScrollToBottom(messages) {
1222
1146
  (0, import_react6.useEffect)(() => {
1223
1147
  isUserScrollUpRef.current = false;
1224
1148
  scrollToBottom();
1225
- }, [messages.filter((m) => m.isTextMessage() && m.role === import_runtime_client_gql.Role.User).length]);
1149
+ }, [messages.filter((m) => m.role === "user").length]);
1226
1150
  return { messagesEndRef, messagesContainerRef };
1227
1151
  }
1228
1152
 
@@ -1291,6 +1215,7 @@ var Textarea_default = AutoResizingTextarea;
1291
1215
 
1292
1216
  // src/hooks/use-push-to-talk.tsx
1293
1217
  var import_react_core5 = require("@copilotkit/react-core");
1218
+ var import_runtime_client_gql = require("@copilotkit/runtime-client-gql");
1294
1219
  var import_react8 = require("react");
1295
1220
  var startRecording = (mediaStreamRef, mediaRecorderRef, audioContextRef, recordedChunks, onStop) => __async(void 0, null, function* () {
1296
1221
  if (!mediaStreamRef.current || !audioContextRef.current) {
@@ -1382,9 +1307,8 @@ var usePushToTalk = ({
1382
1307
  const lastMessageIndex = context.messages.findIndex(
1383
1308
  (message) => message.id === startReadingFromMessageId
1384
1309
  );
1385
- const messagesAfterLast = context.messages.slice(lastMessageIndex + 1).filter(
1386
- (message) => message.isTextMessage() && message.role === "assistant"
1387
- );
1310
+ const aguiMessages = (0, import_runtime_client_gql.gqlToAGUI)(context.messages);
1311
+ const messagesAfterLast = aguiMessages.slice(lastMessageIndex + 1).filter((message) => message.role === "assistant");
1388
1312
  const text = messagesAfterLast.map((message) => message.content).join("\n");
1389
1313
  playAudioResponse(text, context.copilotApiConfig.textToSpeechUrl, audioContextRef.current);
1390
1314
  setStartReadingFromMessageId(null);
@@ -1529,7 +1453,13 @@ var Input = ({
1529
1453
  // src/components/chat/messages/UserMessage.tsx
1530
1454
  var import_jsx_runtime14 = require("react/jsx-runtime");
1531
1455
  var UserMessage = (props) => {
1532
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "copilotKitMessage copilotKitUserMessage", children: props.subComponent || props.message });
1456
+ const { message, ImageRenderer: ImageRenderer2 } = props;
1457
+ const isImageMessage = message && "image" in message && message.image;
1458
+ if (isImageMessage) {
1459
+ const imageMessage = message;
1460
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "copilotKitMessage copilotKitUserMessage", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(ImageRenderer2, { image: imageMessage.image, content: imageMessage.content }) });
1461
+ }
1462
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "copilotKitMessage copilotKitUserMessage", children: message == null ? void 0 : message.content });
1533
1463
  };
1534
1464
 
1535
1465
  // src/components/chat/Markdown.tsx
@@ -1963,8 +1893,19 @@ var defaultComponents = {
1963
1893
  children[0] = (children == null ? void 0 : children[0]).replace("`\u258D`", "\u258D");
1964
1894
  }
1965
1895
  const match = /language-(\w+)/.exec(className || "");
1966
- if (inline) {
1967
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("code", __spreadProps(__spreadValues({ className }, props), { children }));
1896
+ const hasLanguage = match && match[1];
1897
+ const content = String(children);
1898
+ const hasNewlines = content.includes("\n");
1899
+ const isInline = !hasLanguage && !hasNewlines;
1900
+ if (isInline) {
1901
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1902
+ "code",
1903
+ __spreadProps(__spreadValues({
1904
+ className: `copilotKitMarkdownElement copilotKitInlineCode ${className || ""}`
1905
+ }, props), {
1906
+ children
1907
+ })
1908
+ );
1968
1909
  }
1969
1910
  return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1970
1911
  CodeBlock,
@@ -2040,55 +1981,51 @@ var Markdown = ({ content, components }) => {
2040
1981
  var import_react12 = require("react");
2041
1982
  var import_jsx_runtime17 = require("react/jsx-runtime");
2042
1983
  var AssistantMessage = (props) => {
1984
+ var _a;
2043
1985
  const { icons, labels } = useChatContext();
2044
1986
  const {
2045
1987
  message,
2046
1988
  isLoading,
2047
- subComponent,
2048
1989
  onRegenerate,
2049
1990
  onCopy,
2050
1991
  onThumbsUp,
2051
1992
  onThumbsDown,
2052
1993
  isCurrentMessage,
2053
- rawData,
2054
1994
  markdownTagRenderers
2055
1995
  } = props;
2056
1996
  const [copied, setCopied] = (0, import_react12.useState)(false);
2057
1997
  const handleCopy = () => {
2058
- if (message && onCopy) {
2059
- navigator.clipboard.writeText(message);
1998
+ const content2 = (message == null ? void 0 : message.content) || "";
1999
+ if (content2 && onCopy) {
2000
+ navigator.clipboard.writeText(content2);
2060
2001
  setCopied(true);
2061
- onCopy(message);
2002
+ onCopy(content2);
2062
2003
  setTimeout(() => setCopied(false), 2e3);
2063
- } else if (message) {
2064
- navigator.clipboard.writeText(message);
2004
+ } else if (content2) {
2005
+ navigator.clipboard.writeText(content2);
2065
2006
  setCopied(true);
2066
2007
  setTimeout(() => setCopied(false), 2e3);
2067
2008
  }
2068
2009
  };
2069
2010
  const handleRegenerate = () => {
2070
- if (onRegenerate) {
2011
+ if (onRegenerate)
2071
2012
  onRegenerate();
2072
- }
2073
2013
  };
2074
2014
  const handleThumbsUp = () => {
2075
- const fullMessage = rawData;
2076
- if (onThumbsUp && fullMessage) {
2077
- onThumbsUp(fullMessage);
2078
- }
2015
+ if (onThumbsUp && message)
2016
+ onThumbsUp(message);
2079
2017
  };
2080
2018
  const handleThumbsDown = () => {
2081
- const fullMessage = rawData;
2082
- if (onThumbsDown && fullMessage) {
2083
- onThumbsDown(fullMessage);
2084
- }
2019
+ if (onThumbsDown && message)
2020
+ onThumbsDown(message);
2085
2021
  };
2086
2022
  const LoadingIcon = () => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { children: icons.activityIcon });
2023
+ const content = (message == null ? void 0 : message.content) || "";
2024
+ const subComponent = (_a = message == null ? void 0 : message.generativeUI) == null ? void 0 : _a.call(message);
2087
2025
  return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_jsx_runtime17.Fragment, { children: [
2088
- (message || isLoading) && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "copilotKitMessage copilotKitAssistantMessage", children: [
2089
- message && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(Markdown, { content: message || "", components: markdownTagRenderers }),
2090
- isLoading && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(LoadingIcon, {}),
2091
- message && !isLoading && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
2026
+ content && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "copilotKitMessage copilotKitAssistantMessage", children: [
2027
+ content && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(Markdown, { content, components: markdownTagRenderers }),
2028
+ content && !isLoading && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
2092
2029
  "div",
2093
2030
  {
2094
2031
  className: `copilotKitMessageControls ${isCurrentMessage ? "currentMessage" : ""}`,
@@ -2137,19 +2074,52 @@ var AssistantMessage = (props) => {
2137
2074
  }
2138
2075
  )
2139
2076
  ] }),
2140
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { style: { marginBottom: "0.5rem" }, children: subComponent })
2077
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { style: { marginBottom: "0.5rem" }, children: subComponent }),
2078
+ isLoading && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(LoadingIcon, {})
2141
2079
  ] });
2142
2080
  };
2143
2081
 
2144
- // src/components/chat/messages/RenderTextMessage.tsx
2082
+ // src/components/chat/messages/ImageRenderer.tsx
2083
+ var import_react13 = require("react");
2145
2084
  var import_jsx_runtime18 = require("react/jsx-runtime");
2146
- function RenderTextMessage(_a) {
2085
+ var ImageRenderer = ({ image, content, className = "" }) => {
2086
+ const [imageError, setImageError] = (0, import_react13.useState)(false);
2087
+ const imageSrc = `data:image/${image.format};base64,${image.bytes}`;
2088
+ const altText = content || "User uploaded image";
2089
+ const handleImageError = () => {
2090
+ setImageError(true);
2091
+ };
2092
+ if (imageError) {
2093
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: `copilotKitImageRendering copilotKitImageRenderingError ${className}`, children: [
2094
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "copilotKitImageRenderingErrorMessage", children: "Failed to load image" }),
2095
+ content && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "copilotKitImageRenderingContent", children: content })
2096
+ ] });
2097
+ }
2098
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: `copilotKitImageRendering ${className}`, children: [
2099
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
2100
+ "img",
2101
+ {
2102
+ src: imageSrc,
2103
+ alt: altText,
2104
+ className: "copilotKitImageRenderingImage",
2105
+ onError: handleImageError
2106
+ }
2107
+ ),
2108
+ content && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "copilotKitImageRenderingContent", children: content })
2109
+ ] });
2110
+ };
2111
+
2112
+ // src/components/chat/messages/RenderMessage.tsx
2113
+ var import_jsx_runtime19 = require("react/jsx-runtime");
2114
+ function RenderMessage(_a) {
2147
2115
  var _b = _a, {
2148
2116
  UserMessage: UserMessage2 = UserMessage,
2149
- AssistantMessage: AssistantMessage2 = AssistantMessage
2117
+ AssistantMessage: AssistantMessage2 = AssistantMessage,
2118
+ ImageRenderer: ImageRenderer2 = ImageRenderer
2150
2119
  } = _b, props = __objRest(_b, [
2151
2120
  "UserMessage",
2152
- "AssistantMessage"
2121
+ "AssistantMessage",
2122
+ "ImageRenderer"
2153
2123
  ]);
2154
2124
  const {
2155
2125
  message,
@@ -2162,24 +2132,23 @@ function RenderTextMessage(_a) {
2162
2132
  onThumbsDown,
2163
2133
  markdownTagRenderers
2164
2134
  } = props;
2165
- if (message.isTextMessage()) {
2166
- if (message.role === "user") {
2167
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
2135
+ switch (message.role) {
2136
+ case "user":
2137
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2168
2138
  UserMessage2,
2169
2139
  {
2170
2140
  "data-message-role": "user",
2171
- message: message.content,
2172
- rawData: message
2141
+ message,
2142
+ ImageRenderer: ImageRenderer2
2173
2143
  },
2174
2144
  index
2175
2145
  );
2176
- } else if (message.role == "assistant") {
2177
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
2146
+ case "assistant":
2147
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2178
2148
  AssistantMessage2,
2179
2149
  {
2180
2150
  "data-message-role": "assistant",
2181
- message: message.content,
2182
- rawData: message,
2151
+ message,
2183
2152
  isLoading: inProgress && isCurrentMessage && !message.content,
2184
2153
  isGenerating: inProgress && isCurrentMessage && !!message.content,
2185
2154
  isCurrentMessage,
@@ -2187,421 +2156,22 @@ function RenderTextMessage(_a) {
2187
2156
  onCopy,
2188
2157
  onThumbsUp,
2189
2158
  onThumbsDown,
2190
- markdownTagRenderers
2159
+ markdownTagRenderers,
2160
+ ImageRenderer: ImageRenderer2
2191
2161
  },
2192
2162
  index
2193
2163
  );
2194
- }
2195
2164
  }
2196
2165
  }
2197
2166
 
2198
- // src/components/chat/messages/RenderActionExecutionMessage.tsx
2199
- var import_runtime_client_gql2 = require("@copilotkit/runtime-client-gql");
2200
- var import_react_core7 = require("@copilotkit/react-core");
2201
- var import_jsx_runtime19 = require("react/jsx-runtime");
2202
- function RenderActionExecutionMessage(_a) {
2203
- var _b = _a, {
2204
- AssistantMessage: AssistantMessage2 = AssistantMessage
2205
- } = _b, props = __objRest(_b, [
2206
- "AssistantMessage"
2207
- ]);
2208
- const { chatComponentsCache } = (0, import_react_core7.useCopilotContext)();
2209
- const { message, inProgress, index, isCurrentMessage, actionResult } = props;
2210
- if (message.isActionExecutionMessage()) {
2211
- if (chatComponentsCache.current !== null && (chatComponentsCache.current.actions[message.name] || chatComponentsCache.current.actions["*"])) {
2212
- const render = chatComponentsCache.current.actions[message.name] || chatComponentsCache.current.actions["*"];
2213
- if (typeof render === "string") {
2214
- if (isCurrentMessage && inProgress) {
2215
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2216
- AssistantMessage2,
2217
- {
2218
- rawData: message,
2219
- "data-message-role": "assistant",
2220
- isLoading: false,
2221
- isGenerating: true,
2222
- message: render
2223
- },
2224
- index
2225
- );
2226
- } else {
2227
- return null;
2228
- }
2229
- } else {
2230
- const args = message.arguments;
2231
- let status = "inProgress";
2232
- if (actionResult !== void 0) {
2233
- status = "complete";
2234
- } else if (message.status.code !== import_runtime_client_gql2.MessageStatusCode.Pending) {
2235
- status = "executing";
2236
- }
2237
- try {
2238
- const toRender = render({
2239
- status,
2240
- // Cast to any as RenderFunctionStatus is a union that can be complex to narrow here
2241
- args,
2242
- result: actionResult,
2243
- name: message.name,
2244
- messageId: message.id
2245
- // Pass messageId for HITL action correlation
2246
- });
2247
- if (!toRender && status === "complete") {
2248
- return null;
2249
- }
2250
- if (typeof toRender === "string") {
2251
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2252
- AssistantMessage2,
2253
- {
2254
- rawData: message,
2255
- "data-message-role": "assistant",
2256
- isLoading: false,
2257
- isGenerating: false,
2258
- message: toRender
2259
- },
2260
- index
2261
- );
2262
- } else {
2263
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2264
- AssistantMessage2,
2265
- {
2266
- rawData: message,
2267
- "data-message-role": "action-render",
2268
- isLoading: false,
2269
- isGenerating: false,
2270
- subComponent: toRender
2271
- },
2272
- index
2273
- );
2274
- }
2275
- } catch (e) {
2276
- console.error(`Error executing render function for action ${message.name}: ${e}`);
2277
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2278
- AssistantMessage2,
2279
- {
2280
- rawData: message,
2281
- "data-message-role": "assistant",
2282
- isLoading: false,
2283
- isGenerating: false,
2284
- subComponent: /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "copilotKitMessage copilotKitAssistantMessage", children: [
2285
- /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("b", { children: [
2286
- "\u274C Error executing render function for action ",
2287
- message.name,
2288
- ":"
2289
- ] }),
2290
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("pre", { children: e instanceof Error ? e.message : String(e) })
2291
- ] })
2292
- },
2293
- index
2294
- );
2295
- }
2296
- }
2297
- } else if (!inProgress || !isCurrentMessage) {
2298
- return null;
2299
- } else {
2300
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2301
- AssistantMessage2,
2302
- {
2303
- rawData: message,
2304
- "data-message-role": "assistant",
2305
- isLoading: true,
2306
- isGenerating: true
2307
- },
2308
- index
2309
- );
2310
- }
2311
- }
2312
- }
2313
-
2314
- // src/components/chat/messages/RenderResultMessage.tsx
2315
- var import_jsx_runtime20 = require("react/jsx-runtime");
2316
- function RenderResultMessage(_a) {
2317
- var _b = _a, {
2318
- AssistantMessage: AssistantMessage2 = AssistantMessage
2319
- } = _b, props = __objRest(_b, [
2320
- "AssistantMessage"
2321
- ]);
2322
- const { message, inProgress, index, isCurrentMessage } = props;
2323
- if (message.isResultMessage() && inProgress && isCurrentMessage) {
2324
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2325
- AssistantMessage2,
2326
- {
2327
- "data-message-role": "assistant",
2328
- rawData: message,
2329
- isLoading: true,
2330
- isGenerating: true
2331
- },
2332
- index
2333
- );
2334
- } else {
2335
- return null;
2336
- }
2337
- }
2338
-
2339
- // src/components/chat/messages/RenderAgentStateMessage.tsx
2340
- var import_react_core8 = require("@copilotkit/react-core");
2341
- var import_jsx_runtime21 = require("react/jsx-runtime");
2342
- function RenderAgentStateMessage(_a) {
2343
- var _b = _a, {
2344
- AssistantMessage: AssistantMessage2 = AssistantMessage
2345
- } = _b, props = __objRest(_b, [
2346
- "AssistantMessage"
2347
- ]);
2348
- const { chatComponentsCache } = (0, import_react_core8.useCopilotContext)();
2349
- const { message, inProgress, index, isCurrentMessage } = props;
2350
- if (message.isAgentStateMessage()) {
2351
- let render;
2352
- if (chatComponentsCache.current !== null) {
2353
- render = chatComponentsCache.current.coAgentStateRenders[`${message.agentName}-${message.nodeName}`] || chatComponentsCache.current.coAgentStateRenders[`${message.agentName}-global`];
2354
- }
2355
- if (render) {
2356
- if (typeof render === "string") {
2357
- if (isCurrentMessage && inProgress) {
2358
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2359
- AssistantMessage2,
2360
- {
2361
- rawData: message,
2362
- message: render,
2363
- "data-message-role": "assistant",
2364
- isLoading: true,
2365
- isGenerating: true
2366
- },
2367
- index
2368
- );
2369
- } else {
2370
- return null;
2371
- }
2372
- } else {
2373
- const state = message.state;
2374
- let status = message.active ? "inProgress" : "complete";
2375
- const toRender = render({
2376
- status,
2377
- state,
2378
- nodeName: message.nodeName
2379
- });
2380
- if (!toRender && status === "complete") {
2381
- return null;
2382
- }
2383
- if (!toRender && isCurrentMessage && inProgress) {
2384
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2385
- AssistantMessage2,
2386
- {
2387
- "data-message-role": "assistant",
2388
- rawData: message,
2389
- isLoading: true,
2390
- isGenerating: true
2391
- },
2392
- index
2393
- );
2394
- } else if (!toRender) {
2395
- return null;
2396
- }
2397
- if (typeof toRender === "string") {
2398
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2399
- AssistantMessage2,
2400
- {
2401
- rawData: message,
2402
- message: toRender,
2403
- isLoading: true,
2404
- isGenerating: true,
2405
- "data-message-role": "assistant"
2406
- },
2407
- index
2408
- );
2409
- } else {
2410
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2411
- AssistantMessage2,
2412
- {
2413
- rawData: message,
2414
- "data-message-role": "agent-state-render",
2415
- isLoading: false,
2416
- isGenerating: false,
2417
- subComponent: toRender
2418
- },
2419
- index
2420
- );
2421
- }
2422
- }
2423
- } else if (!inProgress || !isCurrentMessage) {
2424
- return null;
2425
- } else {
2426
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2427
- AssistantMessage2,
2428
- {
2429
- rawData: message,
2430
- isLoading: true,
2431
- isGenerating: true,
2432
- "data-message-role": "assistant"
2433
- },
2434
- index
2435
- );
2436
- }
2437
- }
2438
- }
2439
-
2440
- // src/components/chat/messages/RenderImageMessage.tsx
2441
- var import_jsx_runtime22 = require("react/jsx-runtime");
2442
- function RenderImageMessage(_a) {
2443
- var _b = _a, {
2444
- UserMessage: UserMessage2 = UserMessage,
2445
- AssistantMessage: AssistantMessage2 = AssistantMessage
2446
- } = _b, props = __objRest(_b, [
2447
- "UserMessage",
2448
- "AssistantMessage"
2449
- ]);
2450
- const {
2451
- message,
2452
- inProgress,
2453
- index,
2454
- isCurrentMessage,
2455
- onRegenerate,
2456
- onCopy,
2457
- onThumbsUp,
2458
- onThumbsDown
2459
- } = props;
2460
- if (message.isImageMessage()) {
2461
- const imageData = `data:${message.format};base64,${message.bytes}`;
2462
- const imageComponent = /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "copilotKitImage", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2463
- "img",
2464
- {
2465
- src: imageData,
2466
- alt: "User uploaded image",
2467
- style: { maxWidth: "100%", maxHeight: "300px", borderRadius: "8px" }
2468
- }
2469
- ) });
2470
- if (message.role === "user") {
2471
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2472
- UserMessage2,
2473
- {
2474
- "data-message-role": "user",
2475
- message: "",
2476
- rawData: message,
2477
- subComponent: imageComponent
2478
- },
2479
- index
2480
- );
2481
- } else if (message.role === "assistant") {
2482
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2483
- AssistantMessage2,
2484
- {
2485
- "data-message-role": "assistant",
2486
- message: "",
2487
- rawData: message,
2488
- subComponent: imageComponent,
2489
- isLoading: inProgress && isCurrentMessage && !message.bytes,
2490
- isGenerating: inProgress && isCurrentMessage && !!message.bytes,
2491
- isCurrentMessage,
2492
- onRegenerate: () => onRegenerate == null ? void 0 : onRegenerate(message.id),
2493
- onCopy,
2494
- onThumbsUp,
2495
- onThumbsDown
2496
- },
2497
- index
2498
- );
2499
- }
2500
- }
2501
- return null;
2502
- }
2503
-
2504
2167
  // src/components/chat/Chat.tsx
2505
- var import_react13 = __toESM(require("react"));
2506
- var import_react_core10 = require("@copilotkit/react-core");
2507
-
2508
- // src/components/chat/Suggestion.tsx
2509
- var import_react_core9 = require("@copilotkit/react-core");
2168
+ var import_react14 = __toESM(require("react"));
2169
+ var import_react_core8 = require("@copilotkit/react-core");
2510
2170
  var import_shared3 = require("@copilotkit/shared");
2511
- var import_runtime_client_gql3 = require("@copilotkit/runtime-client-gql");
2512
- var import_jsx_runtime23 = require("react/jsx-runtime");
2513
- function Suggestion({ title, onClick, partial, className }) {
2514
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2515
- "button",
2516
- {
2517
- disabled: partial,
2518
- onClick: (e) => {
2519
- e.preventDefault();
2520
- onClick();
2521
- },
2522
- className: className || (partial ? "suggestion loading" : "suggestion"),
2523
- "data-test-id": "suggestion",
2524
- children: partial ? SmallSpinnerIcon : /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { children: title })
2525
- }
2526
- );
2527
- }
2528
- var reloadSuggestions = (context, chatSuggestionConfiguration, setCurrentSuggestions, abortControllerRef) => __async(void 0, null, function* () {
2529
- const abortController = abortControllerRef.current;
2530
- const tools = JSON.stringify(
2531
- Object.values(context.actions).map((action) => ({
2532
- name: action.name,
2533
- description: action.description,
2534
- jsonSchema: JSON.stringify((0, import_shared3.actionParametersToJsonSchema)(action.parameters))
2535
- }))
2536
- );
2537
- const allSuggestions = [];
2538
- for (const config of Object.values(chatSuggestionConfiguration)) {
2539
- try {
2540
- 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.`;
2541
- const result = yield (0, import_react_core9.extract)({
2542
- context,
2543
- instructions: "Suggest what the user could say next. Provide clear, highly relevant suggestions. Do not literally suggest function calls. ",
2544
- data: config.instructions + "\n\n" + numOfSuggestionsInstructions + "\n\nAvailable tools: " + tools + "\n\n",
2545
- requestType: import_runtime_client_gql3.CopilotRequestType.Task,
2546
- parameters: [
2547
- {
2548
- name: "suggestions",
2549
- type: "object[]",
2550
- attributes: [
2551
- {
2552
- name: "title",
2553
- description: "The title of the suggestion. This is shown as a button and should be short.",
2554
- type: "string"
2555
- },
2556
- {
2557
- name: "message",
2558
- 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.",
2559
- type: "string"
2560
- }
2561
- ]
2562
- }
2563
- ],
2564
- include: {
2565
- messages: true,
2566
- readable: true
2567
- },
2568
- abortSignal: abortController == null ? void 0 : abortController.signal,
2569
- stream: ({ status, args }) => {
2570
- const suggestions = args.suggestions || [];
2571
- const newSuggestions = [];
2572
- for (let i = 0; i < suggestions.length; i++) {
2573
- if (config.maxSuggestions !== void 0 && i >= config.maxSuggestions) {
2574
- break;
2575
- }
2576
- const { title, message } = suggestions[i];
2577
- const partial = i == suggestions.length - 1 && status !== "complete";
2578
- newSuggestions.push({
2579
- title,
2580
- message,
2581
- partial,
2582
- className: config.className
2583
- });
2584
- }
2585
- setCurrentSuggestions([...allSuggestions, ...newSuggestions]);
2586
- }
2587
- });
2588
- allSuggestions.push(...result.suggestions);
2589
- } catch (error) {
2590
- console.error("Error loading suggestions", error);
2591
- }
2592
- }
2593
- if (abortControllerRef.current === abortController) {
2594
- abortControllerRef.current = null;
2595
- }
2596
- });
2597
-
2598
- // src/components/chat/Chat.tsx
2599
- var import_runtime_client_gql4 = require("@copilotkit/runtime-client-gql");
2600
- var import_shared4 = require("@copilotkit/shared");
2601
- var import_react_core11 = require("@copilotkit/react-core");
2171
+ var import_react_core9 = require("@copilotkit/react-core");
2602
2172
 
2603
2173
  // src/components/chat/ImageUploadQueue.tsx
2604
- var import_jsx_runtime24 = require("react/jsx-runtime");
2174
+ var import_jsx_runtime20 = require("react/jsx-runtime");
2605
2175
  var ImageUploadQueue = ({
2606
2176
  images,
2607
2177
  onRemoveImage,
@@ -2609,7 +2179,7 @@ var ImageUploadQueue = ({
2609
2179
  }) => {
2610
2180
  if (images.length === 0)
2611
2181
  return null;
2612
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
2182
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2613
2183
  "div",
2614
2184
  {
2615
2185
  className: `copilotKitImageUploadQueue ${className}`,
@@ -2620,7 +2190,7 @@ var ImageUploadQueue = ({
2620
2190
  margin: "8px",
2621
2191
  padding: "8px"
2622
2192
  },
2623
- children: images.map((image, index) => /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
2193
+ children: images.map((image, index) => /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
2624
2194
  "div",
2625
2195
  {
2626
2196
  className: "copilotKitImageUploadQueueItem",
@@ -2633,7 +2203,7 @@ var ImageUploadQueue = ({
2633
2203
  overflow: "hidden"
2634
2204
  },
2635
2205
  children: [
2636
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
2206
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2637
2207
  "img",
2638
2208
  {
2639
2209
  src: `data:${image.contentType};base64,${image.bytes}`,
@@ -2645,7 +2215,7 @@ var ImageUploadQueue = ({
2645
2215
  }
2646
2216
  }
2647
2217
  ),
2648
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
2218
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2649
2219
  "button",
2650
2220
  {
2651
2221
  onClick: () => onRemoveImage(index),
@@ -2678,10 +2248,32 @@ var ImageUploadQueue = ({
2678
2248
  );
2679
2249
  };
2680
2250
 
2251
+ // src/components/chat/Suggestion.tsx
2252
+ var import_react_core7 = require("@copilotkit/react-core");
2253
+ var import_jsx_runtime21 = require("react/jsx-runtime");
2254
+ function Suggestion({ title, onClick, partial, className }) {
2255
+ if (!title)
2256
+ return null;
2257
+ const { isLoading } = (0, import_react_core7.useCopilotChat)();
2258
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2259
+ "button",
2260
+ {
2261
+ disabled: partial || isLoading,
2262
+ onClick: (e) => {
2263
+ e.preventDefault();
2264
+ onClick();
2265
+ },
2266
+ className: className || (partial ? "suggestion loading" : "suggestion"),
2267
+ "data-test-id": "suggestion",
2268
+ children: partial ? SmallSpinnerIcon : /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { children: title })
2269
+ }
2270
+ );
2271
+ }
2272
+
2681
2273
  // src/components/chat/Suggestions.tsx
2682
- var import_jsx_runtime25 = require("react/jsx-runtime");
2274
+ var import_jsx_runtime22 = require("react/jsx-runtime");
2683
2275
  function Suggestions({ suggestions, onSuggestionClick }) {
2684
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "suggestions", children: suggestions.map((suggestion, index) => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
2276
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "suggestions", children: suggestions.map((suggestion, index) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2685
2277
  Suggestion,
2686
2278
  {
2687
2279
  title: suggestion.title,
@@ -2695,9 +2287,10 @@ function Suggestions({ suggestions, onSuggestionClick }) {
2695
2287
  }
2696
2288
 
2697
2289
  // src/components/chat/Chat.tsx
2698
- var import_jsx_runtime26 = require("react/jsx-runtime");
2290
+ var import_jsx_runtime23 = require("react/jsx-runtime");
2699
2291
  function CopilotChat({
2700
2292
  instructions,
2293
+ suggestions = "auto",
2701
2294
  onSubmitMessage,
2702
2295
  makeSystemMessage,
2703
2296
  onInProgress,
@@ -2709,11 +2302,7 @@ function CopilotChat({
2709
2302
  onThumbsDown,
2710
2303
  markdownTagRenderers,
2711
2304
  Messages: Messages2 = Messages,
2712
- RenderTextMessage: RenderTextMessage2 = RenderTextMessage,
2713
- RenderActionExecutionMessage: RenderActionExecutionMessage2 = RenderActionExecutionMessage,
2714
- RenderAgentStateMessage: RenderAgentStateMessage2 = RenderAgentStateMessage,
2715
- RenderResultMessage: RenderResultMessage2 = RenderResultMessage,
2716
- RenderImageMessage: RenderImageMessage2 = RenderImageMessage,
2305
+ RenderMessage: RenderMessage2 = RenderMessage,
2717
2306
  RenderSuggestionsList = Suggestions,
2718
2307
  Input: Input2 = Input,
2719
2308
  className,
@@ -2721,14 +2310,15 @@ function CopilotChat({
2721
2310
  labels,
2722
2311
  AssistantMessage: AssistantMessage2 = AssistantMessage,
2723
2312
  UserMessage: UserMessage2 = UserMessage,
2313
+ ImageRenderer: ImageRenderer2 = ImageRenderer,
2724
2314
  imageUploadsEnabled,
2725
2315
  inputFileAccept = "image/*",
2726
2316
  hideStopButton
2727
2317
  }) {
2728
- const { additionalInstructions, setChatInstructions } = (0, import_react_core10.useCopilotContext)();
2729
- const [selectedImages, setSelectedImages] = (0, import_react13.useState)([]);
2730
- const fileInputRef = (0, import_react13.useRef)(null);
2731
- (0, import_react13.useEffect)(() => {
2318
+ const { additionalInstructions, setChatInstructions } = (0, import_react_core8.useCopilotContext)();
2319
+ const [selectedImages, setSelectedImages] = (0, import_react14.useState)([]);
2320
+ const fileInputRef = (0, import_react14.useRef)(null);
2321
+ (0, import_react14.useEffect)(() => {
2732
2322
  if (!imageUploadsEnabled)
2733
2323
  return;
2734
2324
  const handlePaste = (e) => __async(this, null, function* () {
@@ -2773,7 +2363,7 @@ function CopilotChat({
2773
2363
  document.addEventListener("paste", handlePaste);
2774
2364
  return () => document.removeEventListener("paste", handlePaste);
2775
2365
  }, [imageUploadsEnabled]);
2776
- (0, import_react13.useEffect)(() => {
2366
+ (0, import_react14.useEffect)(() => {
2777
2367
  if (!(additionalInstructions == null ? void 0 : additionalInstructions.length)) {
2778
2368
  setChatInstructions(instructions || "");
2779
2369
  return;
@@ -2783,17 +2373,17 @@ function CopilotChat({
2783
2373
  "Additionally, follow these instructions:",
2784
2374
  ...additionalInstructions.map((instruction) => `- ${instruction}`)
2785
2375
  ];
2786
- console.log("combinedAdditionalInstructions", combinedAdditionalInstructions);
2787
2376
  setChatInstructions(combinedAdditionalInstructions.join("\n") || "");
2788
2377
  }, [instructions, additionalInstructions]);
2789
2378
  const {
2790
2379
  visibleMessages,
2791
2380
  isLoading,
2792
- currentSuggestions,
2793
2381
  sendMessage,
2794
2382
  stopGeneration,
2795
- reloadMessages
2383
+ reloadMessages,
2384
+ suggestions: currentSuggestions
2796
2385
  } = useCopilotChatLogic(
2386
+ suggestions,
2797
2387
  makeSystemMessage,
2798
2388
  onInProgress,
2799
2389
  onSubmitMessage,
@@ -2808,7 +2398,7 @@ function CopilotChat({
2808
2398
  }
2809
2399
  return sendMessage(text, images);
2810
2400
  };
2811
- const chatContext = import_react13.default.useContext(ChatContext);
2401
+ const chatContext = import_react14.default.useContext(ChatContext);
2812
2402
  const isVisible = chatContext ? chatContext.open : true;
2813
2403
  const handleRegenerate = (messageId) => {
2814
2404
  if (onRegenerate) {
@@ -2855,17 +2445,13 @@ function CopilotChat({
2855
2445
  const removeSelectedImage = (index) => {
2856
2446
  setSelectedImages((prev) => prev.filter((_, i) => i !== index));
2857
2447
  };
2858
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(WrappedCopilotChat, { icons, labels, className, children: [
2859
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2448
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(WrappedCopilotChat, { icons, labels, className, children: [
2449
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2860
2450
  Messages2,
2861
2451
  {
2862
2452
  AssistantMessage: AssistantMessage2,
2863
2453
  UserMessage: UserMessage2,
2864
- RenderTextMessage: RenderTextMessage2,
2865
- RenderActionExecutionMessage: RenderActionExecutionMessage2,
2866
- RenderAgentStateMessage: RenderAgentStateMessage2,
2867
- RenderResultMessage: RenderResultMessage2,
2868
- RenderImageMessage: RenderImageMessage2,
2454
+ RenderMessage: RenderMessage2,
2869
2455
  messages: visibleMessages,
2870
2456
  inProgress: isLoading,
2871
2457
  onRegenerate: handleRegenerate,
@@ -2873,7 +2459,8 @@ function CopilotChat({
2873
2459
  onThumbsUp,
2874
2460
  onThumbsDown,
2875
2461
  markdownTagRenderers,
2876
- children: currentSuggestions.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2462
+ ImageRenderer: ImageRenderer2,
2463
+ children: currentSuggestions.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2877
2464
  RenderSuggestionsList,
2878
2465
  {
2879
2466
  onSuggestionClick: handleSendMessage,
@@ -2882,9 +2469,9 @@ function CopilotChat({
2882
2469
  )
2883
2470
  }
2884
2471
  ),
2885
- imageUploadsEnabled && /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_jsx_runtime26.Fragment, { children: [
2886
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ImageUploadQueue, { images: selectedImages, onRemoveImage: removeSelectedImage }),
2887
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2472
+ imageUploadsEnabled && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_jsx_runtime23.Fragment, { children: [
2473
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(ImageUploadQueue, { images: selectedImages, onRemoveImage: removeSelectedImage }),
2474
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2888
2475
  "input",
2889
2476
  {
2890
2477
  type: "file",
@@ -2896,7 +2483,7 @@ function CopilotChat({
2896
2483
  }
2897
2484
  )
2898
2485
  ] }),
2899
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2486
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2900
2487
  Input2,
2901
2488
  {
2902
2489
  inProgress: isLoading,
@@ -2918,75 +2505,118 @@ function WrappedCopilotChat({
2918
2505
  labels,
2919
2506
  className
2920
2507
  }) {
2921
- const chatContext = import_react13.default.useContext(ChatContext);
2508
+ const chatContext = import_react14.default.useContext(ChatContext);
2922
2509
  if (!chatContext) {
2923
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ChatContextProvider, { icons, labels, open: true, setOpen: () => {
2924
- }, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: `copilotKitChat ${className != null ? className : ""}`, children }) });
2510
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(ChatContextProvider, { icons, labels, open: true, setOpen: () => {
2511
+ }, children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: `copilotKitChat ${className != null ? className : ""}`, children }) });
2925
2512
  }
2926
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_jsx_runtime26.Fragment, { children });
2513
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_jsx_runtime23.Fragment, { children });
2927
2514
  }
2928
- var SUGGESTIONS_DEBOUNCE_TIMEOUT = 1e3;
2929
- var useCopilotChatLogic = (makeSystemMessage, onInProgress, onSubmitMessage, onStopGeneration, onReloadMessages) => {
2515
+ var useCopilotChatLogic = (chatSuggestions, makeSystemMessage, onInProgress, onSubmitMessage, onStopGeneration, onReloadMessages) => {
2930
2516
  var _a;
2931
2517
  const {
2932
2518
  visibleMessages,
2933
2519
  appendMessage,
2520
+ setMessages,
2934
2521
  reloadMessages: defaultReloadMessages,
2935
2522
  stopGeneration: defaultStopGeneration,
2936
2523
  runChatCompletion,
2937
- isLoading
2938
- } = (0, import_react_core10.useCopilotChat)({
2939
- id: (0, import_shared4.randomId)(),
2524
+ isLoading,
2525
+ suggestions,
2526
+ setSuggestions,
2527
+ generateSuggestions,
2528
+ resetSuggestions: resetSuggestionsFromHook,
2529
+ isLoadingSuggestions
2530
+ } = (0, import_react_core8.useCopilotChat)({
2940
2531
  makeSystemMessage
2941
2532
  });
2942
- const [currentSuggestions, setCurrentSuggestions] = (0, import_react13.useState)([]);
2943
- const suggestionsAbortControllerRef = (0, import_react13.useRef)(null);
2944
- const debounceTimerRef = (0, import_react13.useRef)();
2945
- const abortSuggestions = () => {
2946
- var _a2;
2947
- (_a2 = suggestionsAbortControllerRef.current) == null ? void 0 : _a2.abort();
2948
- suggestionsAbortControllerRef.current = null;
2949
- };
2950
- const generalContext = (0, import_react_core10.useCopilotContext)();
2951
- const messagesContext = (0, import_react_core10.useCopilotMessagesContext)();
2952
- const context = __spreadValues(__spreadValues({}, generalContext), messagesContext);
2953
- (0, import_react13.useEffect)(() => {
2954
- onInProgress == null ? void 0 : onInProgress(isLoading);
2955
- abortSuggestions();
2956
- debounceTimerRef.current = setTimeout(
2957
- () => {
2958
- if (!isLoading && Object.keys(context.chatSuggestionConfiguration).length !== 0) {
2959
- suggestionsAbortControllerRef.current = new AbortController();
2960
- reloadSuggestions(
2961
- context,
2962
- context.chatSuggestionConfiguration,
2963
- setCurrentSuggestions,
2964
- suggestionsAbortControllerRef
2965
- );
2966
- }
2967
- },
2968
- currentSuggestions.length == 0 ? 0 : SUGGESTIONS_DEBOUNCE_TIMEOUT
2969
- );
2970
- return () => {
2971
- clearTimeout(debounceTimerRef.current);
2972
- };
2533
+ const generalContext = (0, import_react_core8.useCopilotContext)();
2534
+ const messagesContext = (0, import_react_core8.useCopilotMessagesContext)();
2535
+ const { actions } = generalContext;
2536
+ const [suggestionsFailed, setSuggestionsFailed] = (0, import_react14.useState)(false);
2537
+ const hasGeneratedInitialSuggestions = (0, import_react14.useRef)(false);
2538
+ (0, import_react14.useEffect)(() => {
2539
+ if (Array.isArray(chatSuggestions)) {
2540
+ setSuggestions(chatSuggestions);
2541
+ hasGeneratedInitialSuggestions.current = true;
2542
+ }
2543
+ }, [JSON.stringify(chatSuggestions), setSuggestions]);
2544
+ const generateSuggestionsWithErrorHandling = (0, import_react14.useCallback)(
2545
+ (context) => __async(void 0, null, function* () {
2546
+ try {
2547
+ yield generateSuggestions();
2548
+ } catch (error) {
2549
+ console.error("Failed to generate suggestions:", error);
2550
+ setSuggestionsFailed(true);
2551
+ }
2552
+ }),
2553
+ [generateSuggestions]
2554
+ );
2555
+ (0, import_react14.useEffect)(() => {
2556
+ if (chatSuggestions !== "auto" || isLoadingSuggestions || suggestionsFailed) {
2557
+ return;
2558
+ }
2559
+ if (isLoading) {
2560
+ return;
2561
+ }
2562
+ if (Object.keys(generalContext.chatSuggestionConfiguration).length === 0) {
2563
+ return;
2564
+ }
2565
+ if (visibleMessages.length === 0 && !hasGeneratedInitialSuggestions.current) {
2566
+ hasGeneratedInitialSuggestions.current = true;
2567
+ generateSuggestionsWithErrorHandling("initial");
2568
+ return;
2569
+ }
2570
+ if (visibleMessages.length > 0 && suggestions.length === 0) {
2571
+ generateSuggestionsWithErrorHandling("post-message");
2572
+ return;
2573
+ }
2973
2574
  }, [
2575
+ chatSuggestions,
2576
+ isLoadingSuggestions,
2577
+ suggestionsFailed,
2578
+ visibleMessages.length,
2974
2579
  isLoading,
2975
- context.chatSuggestionConfiguration,
2976
- // hackish way to trigger suggestions reload on reset, but better than moving suggestions to the
2977
- // global context
2978
- visibleMessages.length == 0
2580
+ suggestions.length,
2581
+ Object.keys(generalContext.chatSuggestionConfiguration).join(","),
2582
+ // Use stable string instead of object reference
2583
+ generateSuggestionsWithErrorHandling
2979
2584
  ]);
2585
+ (0, import_react14.useEffect)(() => {
2586
+ if (chatSuggestions !== "auto") {
2587
+ hasGeneratedInitialSuggestions.current = false;
2588
+ setSuggestionsFailed(false);
2589
+ }
2590
+ }, [chatSuggestions]);
2591
+ const stableContext = (0, import_react14.useMemo)(
2592
+ () => __spreadValues(__spreadValues({}, generalContext), messagesContext),
2593
+ [
2594
+ // Only include stable dependencies
2595
+ generalContext.actions,
2596
+ messagesContext.messages.length,
2597
+ generalContext.isLoading
2598
+ ]
2599
+ );
2600
+ const resetSuggestions = (0, import_react14.useCallback)(() => {
2601
+ resetSuggestionsFromHook();
2602
+ setSuggestionsFailed(false);
2603
+ hasGeneratedInitialSuggestions.current = false;
2604
+ }, [resetSuggestionsFromHook]);
2605
+ (0, import_react14.useEffect)(() => {
2606
+ onInProgress == null ? void 0 : onInProgress(isLoading);
2607
+ }, [onInProgress, isLoading]);
2980
2608
  const sendMessage = (messageContent, imagesToUse) => __async(void 0, null, function* () {
2981
2609
  const images = imagesToUse || [];
2982
- abortSuggestions();
2983
- setCurrentSuggestions([]);
2610
+ if (chatSuggestions === "auto" || chatSuggestions === "manual") {
2611
+ setSuggestions([]);
2612
+ }
2984
2613
  let firstMessage = null;
2985
2614
  if (messageContent.trim().length > 0) {
2986
- const textMessage = new import_runtime_client_gql4.TextMessage({
2987
- content: messageContent,
2988
- role: import_runtime_client_gql4.Role.User
2989
- });
2615
+ const textMessage = {
2616
+ id: (0, import_shared3.randomId)(),
2617
+ role: "user",
2618
+ content: messageContent
2619
+ };
2990
2620
  if (onSubmitMessage) {
2991
2621
  try {
2992
2622
  yield onSubmitMessage(messageContent);
@@ -2994,18 +2624,24 @@ var useCopilotChatLogic = (makeSystemMessage, onInProgress, onSubmitMessage, onS
2994
2624
  console.error("Error in onSubmitMessage:", error);
2995
2625
  }
2996
2626
  }
2997
- yield appendMessage(textMessage, { followUp: images.length === 0 });
2627
+ yield appendMessage(textMessage, {
2628
+ followUp: images.length === 0,
2629
+ clearSuggestions: chatSuggestions === "auto" || chatSuggestions === "manual"
2630
+ });
2998
2631
  if (!firstMessage) {
2999
2632
  firstMessage = textMessage;
3000
2633
  }
3001
2634
  }
3002
2635
  if (images.length > 0) {
3003
2636
  for (let i = 0; i < images.length; i++) {
3004
- const imageMessage = new import_runtime_client_gql4.ImageMessage({
3005
- format: images[i].contentType.replace("image/", ""),
3006
- bytes: images[i].bytes,
3007
- role: import_runtime_client_gql4.Role.User
3008
- });
2637
+ const imageMessage = {
2638
+ id: (0, import_shared3.randomId)(),
2639
+ role: "user",
2640
+ image: {
2641
+ format: images[i].contentType.replace("image/", ""),
2642
+ bytes: images[i].bytes
2643
+ }
2644
+ };
3009
2645
  yield appendMessage(imageMessage, { followUp: i === images.length - 1 });
3010
2646
  if (!firstMessage) {
3011
2647
  firstMessage = imageMessage;
@@ -3013,12 +2649,11 @@ var useCopilotChatLogic = (makeSystemMessage, onInProgress, onSubmitMessage, onS
3013
2649
  }
3014
2650
  }
3015
2651
  if (!firstMessage) {
3016
- return new import_runtime_client_gql4.TextMessage({ content: "", role: import_runtime_client_gql4.Role.User });
2652
+ return { role: "user", content: "", id: (0, import_shared3.randomId)() };
3017
2653
  }
3018
2654
  return firstMessage;
3019
2655
  });
3020
2656
  const messages = visibleMessages;
3021
- const { setMessages } = messagesContext;
3022
2657
  const currentAgentName = (_a = generalContext.agentSession) == null ? void 0 : _a.agentName;
3023
2658
  const restartCurrentAgent = (hint) => __async(void 0, null, function* () {
3024
2659
  if (generalContext.agentSession) {
@@ -3039,9 +2674,9 @@ var useCopilotChatLogic = (makeSystemMessage, onInProgress, onSubmitMessage, onS
3039
2674
  });
3040
2675
  const runCurrentAgent = (hint) => __async(void 0, null, function* () {
3041
2676
  if (generalContext.agentSession) {
3042
- yield (0, import_react_core11.runAgent)(
2677
+ yield (0, import_react_core9.runAgent)(
3043
2678
  generalContext.agentSession.agentName,
3044
- context,
2679
+ stableContext,
3045
2680
  appendMessage,
3046
2681
  runChatCompletion,
3047
2682
  hint
@@ -3050,7 +2685,7 @@ var useCopilotChatLogic = (makeSystemMessage, onInProgress, onSubmitMessage, onS
3050
2685
  });
3051
2686
  const stopCurrentAgent = () => {
3052
2687
  if (generalContext.agentSession) {
3053
- (0, import_react_core11.stopAgent)(generalContext.agentSession.agentName, context);
2688
+ (0, import_react_core9.stopAgent)(generalContext.agentSession.agentName, stableContext);
3054
2689
  }
3055
2690
  };
3056
2691
  const setCurrentAgentState = (state) => {
@@ -3065,6 +2700,7 @@ var useCopilotChatLogic = (makeSystemMessage, onInProgress, onSubmitMessage, onS
3065
2700
  }
3066
2701
  };
3067
2702
  function stopGeneration() {
2703
+ setSuggestions([]);
3068
2704
  if (onStopGeneration) {
3069
2705
  onStopGeneration({
3070
2706
  messages,
@@ -3098,17 +2734,21 @@ var useCopilotChatLogic = (makeSystemMessage, onInProgress, onSubmitMessage, onS
3098
2734
  }
3099
2735
  }
3100
2736
  return {
2737
+ messages,
3101
2738
  visibleMessages,
3102
2739
  isLoading,
3103
- currentSuggestions,
2740
+ suggestions,
3104
2741
  sendMessage,
3105
2742
  stopGeneration,
3106
- reloadMessages
2743
+ reloadMessages,
2744
+ resetSuggestions,
2745
+ context: stableContext,
2746
+ actions
3107
2747
  };
3108
2748
  };
3109
2749
 
3110
2750
  // src/components/chat/Modal.tsx
3111
- var import_jsx_runtime27 = require("react/jsx-runtime");
2751
+ var import_jsx_runtime24 = require("react/jsx-runtime");
3112
2752
  var CopilotModal = (_a) => {
3113
2753
  var _b = _a, {
3114
2754
  instructions,
@@ -3167,18 +2807,18 @@ var CopilotModal = (_a) => {
3167
2807
  "className",
3168
2808
  "children"
3169
2809
  ]);
3170
- const [openState, setOpenState] = import_react14.default.useState(defaultOpen);
2810
+ const [openState, setOpenState] = import_react15.default.useState(defaultOpen);
3171
2811
  const setOpen = (open) => {
3172
2812
  onSetOpen == null ? void 0 : onSetOpen(open);
3173
2813
  setOpenState(open);
3174
2814
  };
3175
- const memoizedHeader = (0, import_react14.useMemo)(() => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Header2, {}), [Header2]);
3176
- const memoizedChildren = (0, import_react14.useMemo)(() => children, [children]);
3177
- return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(ChatContextProvider, { icons, labels, open: openState, setOpen, children: [
2815
+ const memoizedHeader = (0, import_react15.useMemo)(() => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(Header2, {}), [Header2]);
2816
+ const memoizedChildren = (0, import_react15.useMemo)(() => children, [children]);
2817
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(ChatContextProvider, { icons, labels, open: openState, setOpen, children: [
3178
2818
  memoizedChildren,
3179
- /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className, children: [
3180
- /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Button2, {}),
3181
- /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
2819
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className, children: [
2820
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(Button2, {}),
2821
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
3182
2822
  Window2,
3183
2823
  {
3184
2824
  clickOutsideToClose,
@@ -3186,7 +2826,7 @@ var CopilotModal = (_a) => {
3186
2826
  hitEscapeToClose,
3187
2827
  children: [
3188
2828
  memoizedHeader,
3189
- /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
2829
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
3190
2830
  CopilotChat,
3191
2831
  __spreadProps(__spreadValues({}, props), {
3192
2832
  instructions,