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