@copilotkit/react-ui 1.9.3-next.4 → 1.10.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/dist/{chunk-KENCH7RN.mjs → chunk-B5IFB5YJ.mjs} +1 -1
  3. package/dist/chunk-B5IFB5YJ.mjs.map +1 -0
  4. package/dist/chunk-DBKRAOH7.mjs +34 -0
  5. package/dist/chunk-DBKRAOH7.mjs.map +1 -0
  6. package/dist/{chunk-4HUXYD3B.mjs → chunk-DTRPPNSA.mjs} +2 -2
  7. package/dist/{chunk-YTXEWDNC.mjs → chunk-E6MQUIZW.mjs} +15 -4
  8. package/dist/chunk-E6MQUIZW.mjs.map +1 -0
  9. package/dist/{chunk-L3GZ7TXC.mjs → chunk-GCKKSSBU.mjs} +21 -24
  10. package/dist/chunk-GCKKSSBU.mjs.map +1 -0
  11. package/dist/{chunk-KN2GCKBE.mjs → chunk-GJ3MFNBX.mjs} +6 -6
  12. package/dist/{chunk-32MUWKL3.mjs → chunk-JHUTTP5C.mjs} +21 -17
  13. package/dist/chunk-JHUTTP5C.mjs.map +1 -0
  14. package/dist/{chunk-HKTWKCPS.mjs → chunk-LXCD3K7B.mjs} +127 -92
  15. package/dist/chunk-LXCD3K7B.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-Q2467VHZ.mjs +30 -0
  21. package/dist/chunk-Q2467VHZ.mjs.map +1 -0
  22. package/dist/{chunk-H3EM63WS.mjs → chunk-VLNT34X3.mjs} +2 -2
  23. package/dist/chunk-VVL6JFCJ.mjs +16 -0
  24. package/dist/chunk-VVL6JFCJ.mjs.map +1 -0
  25. package/dist/chunk-WHDNKXMP.mjs +135 -0
  26. package/dist/chunk-WHDNKXMP.mjs.map +1 -0
  27. package/dist/{chunk-ALIBUJML.mjs → chunk-WPVTPQ7X.mjs} +2 -2
  28. package/dist/components/chat/Button.d.ts +1 -1
  29. package/dist/components/chat/Chat.d.ts +119 -28
  30. package/dist/components/chat/Chat.js +298 -658
  31. package/dist/components/chat/Chat.js.map +1 -1
  32. package/dist/components/chat/Chat.mjs +12 -15
  33. package/dist/components/chat/CodeBlock.js.map +1 -1
  34. package/dist/components/chat/CodeBlock.mjs +1 -1
  35. package/dist/components/chat/Header.d.ts +1 -1
  36. package/dist/components/chat/Input.d.ts +1 -1
  37. package/dist/components/chat/Input.js +3 -3
  38. package/dist/components/chat/Input.js.map +1 -1
  39. package/dist/components/chat/Input.mjs +2 -2
  40. package/dist/components/chat/Markdown.js +13 -2
  41. package/dist/components/chat/Markdown.js.map +1 -1
  42. package/dist/components/chat/Markdown.mjs +2 -2
  43. package/dist/components/chat/Messages.d.ts +3 -3
  44. package/dist/components/chat/Messages.js +40 -116
  45. package/dist/components/chat/Messages.js.map +1 -1
  46. package/dist/components/chat/Messages.mjs +1 -1
  47. package/dist/components/chat/Modal.d.ts +7 -2
  48. package/dist/components/chat/Modal.js +308 -668
  49. package/dist/components/chat/Modal.js.map +1 -1
  50. package/dist/components/chat/Modal.mjs +13 -16
  51. package/dist/components/chat/Popup.d.ts +7 -2
  52. package/dist/components/chat/Popup.js +310 -670
  53. package/dist/components/chat/Popup.js.map +1 -1
  54. package/dist/components/chat/Popup.mjs +14 -17
  55. package/dist/components/chat/Sidebar.d.ts +7 -2
  56. package/dist/components/chat/Sidebar.js +312 -672
  57. package/dist/components/chat/Sidebar.js.map +1 -1
  58. package/dist/components/chat/Sidebar.mjs +14 -17
  59. package/dist/components/chat/Suggestion.d.ts +2 -9
  60. package/dist/components/chat/Suggestion.js +6 -96
  61. package/dist/components/chat/Suggestion.js.map +1 -1
  62. package/dist/components/chat/Suggestion.mjs +3 -5
  63. package/dist/components/chat/Suggestions.d.ts +1 -1
  64. package/dist/components/chat/Suggestions.js +4 -3
  65. package/dist/components/chat/Suggestions.js.map +1 -1
  66. package/dist/components/chat/Suggestions.mjs +2 -2
  67. package/dist/components/chat/Window.d.ts +1 -1
  68. package/dist/components/chat/index.d.ts +8 -3
  69. package/dist/components/chat/index.js +316 -676
  70. package/dist/components/chat/index.js.map +1 -1
  71. package/dist/components/chat/index.mjs +18 -21
  72. package/dist/components/chat/messages/AssistantMessage.d.ts +1 -1
  73. package/dist/components/chat/messages/AssistantMessage.js +32 -24
  74. package/dist/components/chat/messages/AssistantMessage.js.map +1 -1
  75. package/dist/components/chat/messages/AssistantMessage.mjs +3 -3
  76. package/dist/components/chat/messages/ImageRenderer.d.ts +12 -0
  77. package/dist/components/chat/messages/ImageRenderer.js +58 -0
  78. package/dist/components/chat/messages/ImageRenderer.js.map +1 -0
  79. package/dist/components/chat/messages/ImageRenderer.mjs +8 -0
  80. package/dist/components/chat/messages/RenderMessage.d.ts +9 -0
  81. package/dist/components/chat/messages/{RenderTextMessage.js → RenderMessage.js} +92 -47
  82. package/dist/components/chat/messages/RenderMessage.js.map +1 -0
  83. package/dist/components/chat/messages/RenderMessage.mjs +16 -0
  84. package/dist/components/chat/messages/UserMessage.d.ts +1 -1
  85. package/dist/components/chat/messages/UserMessage.js +7 -1
  86. package/dist/components/chat/messages/UserMessage.js.map +1 -1
  87. package/dist/components/chat/messages/UserMessage.mjs +1 -1
  88. package/dist/components/chat/props.d.ts +32 -27
  89. package/dist/components/chat/props.js.map +1 -1
  90. package/dist/components/index.d.ts +8 -3
  91. package/dist/components/index.js +316 -676
  92. package/dist/components/index.js.map +1 -1
  93. package/dist/components/index.mjs +18 -21
  94. package/dist/hooks/use-push-to-talk.d.ts +1 -1
  95. package/dist/hooks/use-push-to-talk.js +3 -3
  96. package/dist/hooks/use-push-to-talk.js.map +1 -1
  97. package/dist/hooks/use-push-to-talk.mjs +1 -1
  98. package/dist/index.css +59 -3
  99. package/dist/index.css.map +1 -1
  100. package/dist/index.d.ts +8 -3
  101. package/dist/index.js +322 -682
  102. package/dist/index.js.map +1 -1
  103. package/dist/index.mjs +18 -21
  104. package/dist/types/css.d.ts +3 -0
  105. package/dist/types/css.js.map +1 -1
  106. package/package.json +4 -4
  107. package/src/components/chat/Chat.tsx +193 -105
  108. package/src/components/chat/CodeBlock.tsx +1 -1
  109. package/src/components/chat/Markdown.tsx +12 -2
  110. package/src/components/chat/Messages.tsx +43 -122
  111. package/src/components/chat/Suggestion.tsx +5 -108
  112. package/src/components/chat/Suggestions.tsx +0 -1
  113. package/src/components/chat/index.tsx +1 -1
  114. package/src/components/chat/messages/AssistantMessage.tsx +15 -23
  115. package/src/components/chat/messages/ImageRenderer.tsx +37 -0
  116. package/src/components/chat/messages/{RenderTextMessage.tsx → RenderMessage.tsx} +10 -9
  117. package/src/components/chat/messages/UserMessage.tsx +16 -5
  118. package/src/components/chat/props.ts +36 -28
  119. package/src/css/colors.css +10 -0
  120. package/src/css/markdown.css +8 -0
  121. package/src/css/messages.css +54 -5
  122. package/src/css/suggestions.css +1 -1
  123. package/src/hooks/use-push-to-talk.tsx +6 -5
  124. package/src/styles.css +1 -1
  125. package/src/types/css.ts +3 -0
  126. package/dist/chunk-2II3Q27P.mjs +0 -112
  127. package/dist/chunk-2II3Q27P.mjs.map +0 -1
  128. package/dist/chunk-32MUWKL3.mjs.map +0 -1
  129. package/dist/chunk-53CVDVS5.mjs +0 -127
  130. package/dist/chunk-53CVDVS5.mjs.map +0 -1
  131. package/dist/chunk-B3D7U7TJ.mjs +0 -211
  132. package/dist/chunk-B3D7U7TJ.mjs.map +0 -1
  133. package/dist/chunk-C7OB63U5.mjs +0 -36
  134. package/dist/chunk-C7OB63U5.mjs.map +0 -1
  135. package/dist/chunk-HKTWKCPS.mjs.map +0 -1
  136. package/dist/chunk-HWMFMBJC.mjs +0 -10
  137. package/dist/chunk-HWMFMBJC.mjs.map +0 -1
  138. package/dist/chunk-IMBPSLL4.mjs +0 -104
  139. package/dist/chunk-IMBPSLL4.mjs.map +0 -1
  140. package/dist/chunk-KENCH7RN.mjs.map +0 -1
  141. package/dist/chunk-L3GZ7TXC.mjs.map +0 -1
  142. package/dist/chunk-QGSPTXOV.mjs.map +0 -1
  143. package/dist/chunk-S5MBUNGN.mjs.map +0 -1
  144. package/dist/chunk-ULDQXCED.mjs +0 -78
  145. package/dist/chunk-ULDQXCED.mjs.map +0 -1
  146. package/dist/chunk-YTXEWDNC.mjs.map +0 -1
  147. package/dist/components/chat/messages/RenderActionExecutionMessage.d.ts +0 -9
  148. package/dist/components/chat/messages/RenderActionExecutionMessage.js +0 -869
  149. package/dist/components/chat/messages/RenderActionExecutionMessage.js.map +0 -1
  150. package/dist/components/chat/messages/RenderActionExecutionMessage.mjs +0 -14
  151. package/dist/components/chat/messages/RenderAgentStateMessage.d.ts +0 -9
  152. package/dist/components/chat/messages/RenderAgentStateMessage.js +0 -854
  153. package/dist/components/chat/messages/RenderAgentStateMessage.js.map +0 -1
  154. package/dist/components/chat/messages/RenderAgentStateMessage.mjs +0 -14
  155. package/dist/components/chat/messages/RenderImageMessage.d.ts +0 -9
  156. package/dist/components/chat/messages/RenderImageMessage.js +0 -823
  157. package/dist/components/chat/messages/RenderImageMessage.js.map +0 -1
  158. package/dist/components/chat/messages/RenderImageMessage.mjs +0 -15
  159. package/dist/components/chat/messages/RenderImageMessage.mjs.map +0 -1
  160. package/dist/components/chat/messages/RenderResultMessage.d.ts +0 -9
  161. package/dist/components/chat/messages/RenderResultMessage.js +0 -778
  162. package/dist/components/chat/messages/RenderResultMessage.js.map +0 -1
  163. package/dist/components/chat/messages/RenderResultMessage.mjs +0 -14
  164. package/dist/components/chat/messages/RenderResultMessage.mjs.map +0 -1
  165. package/dist/components/chat/messages/RenderTextMessage.d.ts +0 -9
  166. package/dist/components/chat/messages/RenderTextMessage.js.map +0 -1
  167. package/dist/components/chat/messages/RenderTextMessage.mjs +0 -15
  168. package/dist/components/chat/messages/RenderTextMessage.mjs.map +0 -1
  169. package/src/components/chat/messages/RenderActionExecutionMessage.tsx +0 -127
  170. package/src/components/chat/messages/RenderAgentStateMessage.tsx +0 -116
  171. package/src/components/chat/messages/RenderImageMessage.tsx +0 -64
  172. package/src/components/chat/messages/RenderResultMessage.tsx +0 -26
  173. /package/dist/{chunk-4HUXYD3B.mjs.map → chunk-DTRPPNSA.mjs.map} +0 -0
  174. /package/dist/{chunk-KN2GCKBE.mjs.map → chunk-GJ3MFNBX.mjs.map} +0 -0
  175. /package/dist/{chunk-H3EM63WS.mjs.map → chunk-VLNT34X3.mjs.map} +0 -0
  176. /package/dist/{chunk-ALIBUJML.mjs.map → chunk-WPVTPQ7X.mjs.map} +0 -0
  177. /package/dist/components/chat/messages/{RenderActionExecutionMessage.mjs.map → ImageRenderer.mjs.map} +0 -0
  178. /package/dist/components/chat/messages/{RenderAgentStateMessage.mjs.map → RenderMessage.mjs.map} +0 -0
@@ -83,8 +83,8 @@ __export(chat_exports, {
83
83
  CopilotChat: () => CopilotChat,
84
84
  CopilotPopup: () => CopilotPopup,
85
85
  CopilotSidebar: () => CopilotSidebar,
86
+ ImageRenderer: () => ImageRenderer,
86
87
  Markdown: () => Markdown,
87
- RenderImageMessage: () => RenderImageMessage,
88
88
  RenderSuggestion: () => Suggestion,
89
89
  RenderSuggestionsList: () => Suggestions,
90
90
  UserMessage: () => UserMessage,
@@ -93,7 +93,7 @@ __export(chat_exports, {
93
93
  module.exports = __toCommonJS(chat_exports);
94
94
 
95
95
  // src/components/chat/Modal.tsx
96
- var import_react14 = __toESM(require("react"));
96
+ var import_react15 = __toESM(require("react"));
97
97
 
98
98
  // src/components/chat/ChatContext.tsx
99
99
  var import_react = __toESM(require("react"));
@@ -1037,18 +1037,12 @@ var Header = ({}) => {
1037
1037
 
1038
1038
  // src/components/chat/Messages.tsx
1039
1039
  var import_react6 = require("react");
1040
- var import_runtime_client_gql = require("@copilotkit/runtime-client-gql");
1041
1040
  var import_react_core4 = require("@copilotkit/react-core");
1042
1041
  var import_jsx_runtime10 = require("react/jsx-runtime");
1043
1042
  var Messages = ({
1044
- messages,
1045
1043
  inProgress,
1046
1044
  children,
1047
- RenderTextMessage: RenderTextMessage2,
1048
- RenderActionExecutionMessage: RenderActionExecutionMessage2,
1049
- RenderAgentStateMessage: RenderAgentStateMessage2,
1050
- RenderResultMessage: RenderResultMessage2,
1051
- RenderImageMessage: RenderImageMessage2,
1045
+ RenderMessage: RenderMessage2,
1052
1046
  AssistantMessage: AssistantMessage2,
1053
1047
  UserMessage: UserMessage2,
1054
1048
  onRegenerate,
@@ -1057,106 +1051,32 @@ var Messages = ({
1057
1051
  onThumbsDown,
1058
1052
  markdownTagRenderers
1059
1053
  }) => {
1060
- const context = useChatContext();
1061
- const initialMessages = (0, import_react6.useMemo)(
1062
- () => makeInitialMessages(context.labels.initial),
1063
- [context.labels.initial]
1064
- );
1065
- messages = [...initialMessages, ...messages];
1066
- const actionResults = {};
1067
- for (let i = 0; i < messages.length; i++) {
1068
- if (messages[i].isActionExecutionMessage()) {
1069
- const id = messages[i].id;
1070
- const resultMessage = messages.find(
1071
- (message) => message.isResultMessage() && message.actionExecutionId === id
1072
- );
1073
- if (resultMessage) {
1074
- actionResults[id] = import_runtime_client_gql.ResultMessage.decodeResult(resultMessage.result || "");
1075
- }
1076
- }
1077
- }
1054
+ const { labels } = useChatContext();
1055
+ const { visibleMessages, interrupt } = (0, import_react_core4.useCopilotChat)();
1056
+ const initialMessages = (0, import_react6.useMemo)(() => makeInitialMessages(labels.initial), [labels.initial]);
1057
+ const messages = [...initialMessages, ...visibleMessages];
1078
1058
  const { messagesContainerRef, messagesEndRef } = useScrollToBottom(messages);
1079
- const interrupt = (0, import_react_core4.useLangGraphInterruptRender)();
1080
1059
  return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "copilotKitMessages", ref: messagesContainerRef, children: [
1081
1060
  /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "copilotKitMessagesContainer", children: [
1082
1061
  messages.map((message, index) => {
1083
1062
  const isCurrentMessage = index === messages.length - 1;
1084
- if (message.isTextMessage()) {
1085
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1086
- RenderTextMessage2,
1087
- {
1088
- message,
1089
- inProgress,
1090
- index,
1091
- isCurrentMessage,
1092
- AssistantMessage: AssistantMessage2,
1093
- UserMessage: UserMessage2,
1094
- onRegenerate,
1095
- onCopy,
1096
- onThumbsUp,
1097
- onThumbsDown,
1098
- markdownTagRenderers
1099
- },
1100
- index
1101
- );
1102
- } else if (message.isActionExecutionMessage()) {
1103
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1104
- RenderActionExecutionMessage2,
1105
- {
1106
- message,
1107
- inProgress,
1108
- index,
1109
- isCurrentMessage,
1110
- actionResult: actionResults[message.id],
1111
- AssistantMessage: AssistantMessage2,
1112
- UserMessage: UserMessage2
1113
- },
1114
- index
1115
- );
1116
- } else if (message.isAgentStateMessage()) {
1117
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1118
- RenderAgentStateMessage2,
1119
- {
1120
- message,
1121
- inProgress,
1122
- index,
1123
- isCurrentMessage,
1124
- AssistantMessage: AssistantMessage2,
1125
- UserMessage: UserMessage2
1126
- },
1127
- index
1128
- );
1129
- } else if (message.isResultMessage()) {
1130
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1131
- RenderResultMessage2,
1132
- {
1133
- message,
1134
- inProgress,
1135
- index,
1136
- isCurrentMessage,
1137
- AssistantMessage: AssistantMessage2,
1138
- UserMessage: UserMessage2
1139
- },
1140
- index
1141
- );
1142
- } else if (message.isImageMessage && message.isImageMessage()) {
1143
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1144
- RenderImageMessage2,
1145
- {
1146
- message,
1147
- inProgress,
1148
- index,
1149
- isCurrentMessage,
1150
- AssistantMessage: AssistantMessage2,
1151
- UserMessage: UserMessage2,
1152
- onRegenerate,
1153
- onCopy,
1154
- onThumbsUp,
1155
- onThumbsDown
1156
- },
1157
- index
1158
- );
1159
- }
1063
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1064
+ RenderMessage2,
1065
+ {
1066
+ message,
1067
+ inProgress,
1068
+ index,
1069
+ isCurrentMessage,
1070
+ AssistantMessage: AssistantMessage2,
1071
+ UserMessage: UserMessage2,
1072
+ onRegenerate,
1073
+ onCopy,
1074
+ onThumbsUp,
1075
+ onThumbsDown,
1076
+ markdownTagRenderers
1077
+ },
1078
+ index
1079
+ );
1160
1080
  }),
1161
1081
  interrupt
1162
1082
  ] }),
@@ -1164,20 +1084,24 @@ var Messages = ({
1164
1084
  ] });
1165
1085
  };
1166
1086
  function makeInitialMessages(initial) {
1167
- let initialArray = [];
1168
- if (initial) {
1169
- if (Array.isArray(initial)) {
1170
- initialArray.push(...initial);
1171
- } else {
1172
- initialArray.push(initial);
1173
- }
1087
+ if (!initial)
1088
+ return [];
1089
+ if (Array.isArray(initial)) {
1090
+ return initial.map((message) => {
1091
+ return {
1092
+ id: message,
1093
+ role: "assistant",
1094
+ content: message
1095
+ };
1096
+ });
1174
1097
  }
1175
- return initialArray.map(
1176
- (message) => new import_runtime_client_gql.TextMessage({
1177
- role: import_runtime_client_gql.Role.Assistant,
1178
- content: message
1179
- })
1180
- );
1098
+ return [
1099
+ {
1100
+ id: initial,
1101
+ role: "system",
1102
+ content: initial
1103
+ }
1104
+ ];
1181
1105
  }
1182
1106
  function useScrollToBottom(messages) {
1183
1107
  const messagesEndRef = (0, import_react6.useRef)(null);
@@ -1233,7 +1157,7 @@ function useScrollToBottom(messages) {
1233
1157
  (0, import_react6.useEffect)(() => {
1234
1158
  isUserScrollUpRef.current = false;
1235
1159
  scrollToBottom();
1236
- }, [messages.filter((m) => m.isTextMessage() && m.role === import_runtime_client_gql.Role.User).length]);
1160
+ }, [messages.filter((m) => m.role === "user").length]);
1237
1161
  return { messagesEndRef, messagesContainerRef };
1238
1162
  }
1239
1163
 
@@ -1302,6 +1226,7 @@ var Textarea_default = AutoResizingTextarea;
1302
1226
 
1303
1227
  // src/hooks/use-push-to-talk.tsx
1304
1228
  var import_react_core5 = require("@copilotkit/react-core");
1229
+ var import_runtime_client_gql = require("@copilotkit/runtime-client-gql");
1305
1230
  var import_react8 = require("react");
1306
1231
  var startRecording = (mediaStreamRef, mediaRecorderRef, audioContextRef, recordedChunks, onStop) => __async(void 0, null, function* () {
1307
1232
  if (!mediaStreamRef.current || !audioContextRef.current) {
@@ -1393,9 +1318,8 @@ var usePushToTalk = ({
1393
1318
  const lastMessageIndex = context.messages.findIndex(
1394
1319
  (message) => message.id === startReadingFromMessageId
1395
1320
  );
1396
- const messagesAfterLast = context.messages.slice(lastMessageIndex + 1).filter(
1397
- (message) => message.isTextMessage() && message.role === "assistant"
1398
- );
1321
+ const aguiMessages = (0, import_runtime_client_gql.gqlToAGUI)(context.messages);
1322
+ const messagesAfterLast = aguiMessages.slice(lastMessageIndex + 1).filter((message) => message.role === "assistant");
1399
1323
  const text = messagesAfterLast.map((message) => message.content).join("\n");
1400
1324
  playAudioResponse(text, context.copilotApiConfig.textToSpeechUrl, audioContextRef.current);
1401
1325
  setStartReadingFromMessageId(null);
@@ -1540,7 +1464,13 @@ var Input = ({
1540
1464
  // src/components/chat/messages/UserMessage.tsx
1541
1465
  var import_jsx_runtime14 = require("react/jsx-runtime");
1542
1466
  var UserMessage = (props) => {
1543
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "copilotKitMessage copilotKitUserMessage", children: props.subComponent || props.message });
1467
+ const { message, ImageRenderer: ImageRenderer2 } = props;
1468
+ const isImageMessage = message && "image" in message && message.image;
1469
+ if (isImageMessage) {
1470
+ const imageMessage = message;
1471
+ 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 }) });
1472
+ }
1473
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "copilotKitMessage copilotKitUserMessage", children: message == null ? void 0 : message.content });
1544
1474
  };
1545
1475
 
1546
1476
  // src/components/chat/Markdown.tsx
@@ -1974,8 +1904,19 @@ var defaultComponents = {
1974
1904
  children[0] = (children == null ? void 0 : children[0]).replace("`\u258D`", "\u258D");
1975
1905
  }
1976
1906
  const match = /language-(\w+)/.exec(className || "");
1977
- if (inline) {
1978
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("code", __spreadProps(__spreadValues({ className }, props), { children }));
1907
+ const hasLanguage = match && match[1];
1908
+ const content = String(children);
1909
+ const hasNewlines = content.includes("\n");
1910
+ const isInline = !hasLanguage && !hasNewlines;
1911
+ if (isInline) {
1912
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1913
+ "code",
1914
+ __spreadProps(__spreadValues({
1915
+ className: `copilotKitMarkdownElement copilotKitInlineCode ${className || ""}`
1916
+ }, props), {
1917
+ children
1918
+ })
1919
+ );
1979
1920
  }
1980
1921
  return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1981
1922
  CodeBlock,
@@ -2051,55 +1992,51 @@ var Markdown = ({ content, components }) => {
2051
1992
  var import_react12 = require("react");
2052
1993
  var import_jsx_runtime17 = require("react/jsx-runtime");
2053
1994
  var AssistantMessage = (props) => {
1995
+ var _a;
2054
1996
  const { icons, labels } = useChatContext();
2055
1997
  const {
2056
1998
  message,
2057
1999
  isLoading,
2058
- subComponent,
2059
2000
  onRegenerate,
2060
2001
  onCopy,
2061
2002
  onThumbsUp,
2062
2003
  onThumbsDown,
2063
2004
  isCurrentMessage,
2064
- rawData,
2065
2005
  markdownTagRenderers
2066
2006
  } = props;
2067
2007
  const [copied, setCopied] = (0, import_react12.useState)(false);
2068
2008
  const handleCopy = () => {
2069
- if (message && onCopy) {
2070
- navigator.clipboard.writeText(message);
2009
+ const content2 = (message == null ? void 0 : message.content) || "";
2010
+ if (content2 && onCopy) {
2011
+ navigator.clipboard.writeText(content2);
2071
2012
  setCopied(true);
2072
- onCopy(message);
2013
+ onCopy(content2);
2073
2014
  setTimeout(() => setCopied(false), 2e3);
2074
- } else if (message) {
2075
- navigator.clipboard.writeText(message);
2015
+ } else if (content2) {
2016
+ navigator.clipboard.writeText(content2);
2076
2017
  setCopied(true);
2077
2018
  setTimeout(() => setCopied(false), 2e3);
2078
2019
  }
2079
2020
  };
2080
2021
  const handleRegenerate = () => {
2081
- if (onRegenerate) {
2022
+ if (onRegenerate)
2082
2023
  onRegenerate();
2083
- }
2084
2024
  };
2085
2025
  const handleThumbsUp = () => {
2086
- const fullMessage = rawData;
2087
- if (onThumbsUp && fullMessage) {
2088
- onThumbsUp(fullMessage);
2089
- }
2026
+ if (onThumbsUp && message)
2027
+ onThumbsUp(message);
2090
2028
  };
2091
2029
  const handleThumbsDown = () => {
2092
- const fullMessage = rawData;
2093
- if (onThumbsDown && fullMessage) {
2094
- onThumbsDown(fullMessage);
2095
- }
2030
+ if (onThumbsDown && message)
2031
+ onThumbsDown(message);
2096
2032
  };
2097
2033
  const LoadingIcon = () => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { children: icons.activityIcon });
2034
+ const content = (message == null ? void 0 : message.content) || "";
2035
+ const subComponent = (_a = message == null ? void 0 : message.generativeUI) == null ? void 0 : _a.call(message);
2098
2036
  return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_jsx_runtime17.Fragment, { children: [
2099
- (message || isLoading) && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "copilotKitMessage copilotKitAssistantMessage", children: [
2100
- message && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(Markdown, { content: message || "", components: markdownTagRenderers }),
2101
- isLoading && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(LoadingIcon, {}),
2102
- message && !isLoading && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
2037
+ content && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "copilotKitMessage copilotKitAssistantMessage", children: [
2038
+ content && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(Markdown, { content, components: markdownTagRenderers }),
2039
+ content && !isLoading && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
2103
2040
  "div",
2104
2041
  {
2105
2042
  className: `copilotKitMessageControls ${isCurrentMessage ? "currentMessage" : ""}`,
@@ -2148,19 +2085,52 @@ var AssistantMessage = (props) => {
2148
2085
  }
2149
2086
  )
2150
2087
  ] }),
2151
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { style: { marginBottom: "0.5rem" }, children: subComponent })
2088
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { style: { marginBottom: "0.5rem" }, children: subComponent }),
2089
+ isLoading && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(LoadingIcon, {})
2152
2090
  ] });
2153
2091
  };
2154
2092
 
2155
- // src/components/chat/messages/RenderTextMessage.tsx
2093
+ // src/components/chat/messages/ImageRenderer.tsx
2094
+ var import_react13 = require("react");
2156
2095
  var import_jsx_runtime18 = require("react/jsx-runtime");
2157
- function RenderTextMessage(_a) {
2096
+ var ImageRenderer = ({ image, content, className = "" }) => {
2097
+ const [imageError, setImageError] = (0, import_react13.useState)(false);
2098
+ const imageSrc = `data:image/${image.format};base64,${image.bytes}`;
2099
+ const altText = content || "User uploaded image";
2100
+ const handleImageError = () => {
2101
+ setImageError(true);
2102
+ };
2103
+ if (imageError) {
2104
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: `copilotKitImageRendering copilotKitImageRenderingError ${className}`, children: [
2105
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "copilotKitImageRenderingErrorMessage", children: "Failed to load image" }),
2106
+ content && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "copilotKitImageRenderingContent", children: content })
2107
+ ] });
2108
+ }
2109
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: `copilotKitImageRendering ${className}`, children: [
2110
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
2111
+ "img",
2112
+ {
2113
+ src: imageSrc,
2114
+ alt: altText,
2115
+ className: "copilotKitImageRenderingImage",
2116
+ onError: handleImageError
2117
+ }
2118
+ ),
2119
+ content && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "copilotKitImageRenderingContent", children: content })
2120
+ ] });
2121
+ };
2122
+
2123
+ // src/components/chat/messages/RenderMessage.tsx
2124
+ var import_jsx_runtime19 = require("react/jsx-runtime");
2125
+ function RenderMessage(_a) {
2158
2126
  var _b = _a, {
2159
2127
  UserMessage: UserMessage2 = UserMessage,
2160
- AssistantMessage: AssistantMessage2 = AssistantMessage
2128
+ AssistantMessage: AssistantMessage2 = AssistantMessage,
2129
+ ImageRenderer: ImageRenderer2 = ImageRenderer
2161
2130
  } = _b, props = __objRest(_b, [
2162
2131
  "UserMessage",
2163
- "AssistantMessage"
2132
+ "AssistantMessage",
2133
+ "ImageRenderer"
2164
2134
  ]);
2165
2135
  const {
2166
2136
  message,
@@ -2173,24 +2143,23 @@ function RenderTextMessage(_a) {
2173
2143
  onThumbsDown,
2174
2144
  markdownTagRenderers
2175
2145
  } = props;
2176
- if (message.isTextMessage()) {
2177
- if (message.role === "user") {
2178
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
2146
+ switch (message.role) {
2147
+ case "user":
2148
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2179
2149
  UserMessage2,
2180
2150
  {
2181
2151
  "data-message-role": "user",
2182
- message: message.content,
2183
- rawData: message
2152
+ message,
2153
+ ImageRenderer: ImageRenderer2
2184
2154
  },
2185
2155
  index
2186
2156
  );
2187
- } else if (message.role == "assistant") {
2188
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
2157
+ case "assistant":
2158
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2189
2159
  AssistantMessage2,
2190
2160
  {
2191
2161
  "data-message-role": "assistant",
2192
- message: message.content,
2193
- rawData: message,
2162
+ message,
2194
2163
  isLoading: inProgress && isCurrentMessage && !message.content,
2195
2164
  isGenerating: inProgress && isCurrentMessage && !!message.content,
2196
2165
  isCurrentMessage,
@@ -2198,421 +2167,22 @@ function RenderTextMessage(_a) {
2198
2167
  onCopy,
2199
2168
  onThumbsUp,
2200
2169
  onThumbsDown,
2201
- markdownTagRenderers
2170
+ markdownTagRenderers,
2171
+ ImageRenderer: ImageRenderer2
2202
2172
  },
2203
2173
  index
2204
2174
  );
2205
- }
2206
2175
  }
2207
2176
  }
2208
2177
 
2209
- // src/components/chat/messages/RenderActionExecutionMessage.tsx
2210
- var import_runtime_client_gql2 = require("@copilotkit/runtime-client-gql");
2211
- var import_react_core7 = require("@copilotkit/react-core");
2212
- var import_jsx_runtime19 = require("react/jsx-runtime");
2213
- function RenderActionExecutionMessage(_a) {
2214
- var _b = _a, {
2215
- AssistantMessage: AssistantMessage2 = AssistantMessage
2216
- } = _b, props = __objRest(_b, [
2217
- "AssistantMessage"
2218
- ]);
2219
- const { chatComponentsCache } = (0, import_react_core7.useCopilotContext)();
2220
- const { message, inProgress, index, isCurrentMessage, actionResult } = props;
2221
- if (message.isActionExecutionMessage()) {
2222
- if (chatComponentsCache.current !== null && (chatComponentsCache.current.actions[message.name] || chatComponentsCache.current.actions["*"])) {
2223
- const render = chatComponentsCache.current.actions[message.name] || chatComponentsCache.current.actions["*"];
2224
- if (typeof render === "string") {
2225
- if (isCurrentMessage && inProgress) {
2226
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2227
- AssistantMessage2,
2228
- {
2229
- rawData: message,
2230
- "data-message-role": "assistant",
2231
- isLoading: false,
2232
- isGenerating: true,
2233
- message: render
2234
- },
2235
- index
2236
- );
2237
- } else {
2238
- return null;
2239
- }
2240
- } else {
2241
- const args = message.arguments;
2242
- let status = "inProgress";
2243
- if (actionResult !== void 0) {
2244
- status = "complete";
2245
- } else if (message.status.code !== import_runtime_client_gql2.MessageStatusCode.Pending) {
2246
- status = "executing";
2247
- }
2248
- try {
2249
- const toRender = render({
2250
- status,
2251
- // Cast to any as RenderFunctionStatus is a union that can be complex to narrow here
2252
- args,
2253
- result: actionResult,
2254
- name: message.name,
2255
- messageId: message.id
2256
- // Pass messageId for HITL action correlation
2257
- });
2258
- if (!toRender && status === "complete") {
2259
- return null;
2260
- }
2261
- if (typeof toRender === "string") {
2262
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2263
- AssistantMessage2,
2264
- {
2265
- rawData: message,
2266
- "data-message-role": "assistant",
2267
- isLoading: false,
2268
- isGenerating: false,
2269
- message: toRender
2270
- },
2271
- index
2272
- );
2273
- } else {
2274
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2275
- AssistantMessage2,
2276
- {
2277
- rawData: message,
2278
- "data-message-role": "action-render",
2279
- isLoading: false,
2280
- isGenerating: false,
2281
- subComponent: toRender
2282
- },
2283
- index
2284
- );
2285
- }
2286
- } catch (e) {
2287
- console.error(`Error executing render function for action ${message.name}: ${e}`);
2288
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2289
- AssistantMessage2,
2290
- {
2291
- rawData: message,
2292
- "data-message-role": "assistant",
2293
- isLoading: false,
2294
- isGenerating: false,
2295
- subComponent: /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "copilotKitMessage copilotKitAssistantMessage", children: [
2296
- /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("b", { children: [
2297
- "\u274C Error executing render function for action ",
2298
- message.name,
2299
- ":"
2300
- ] }),
2301
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("pre", { children: e instanceof Error ? e.message : String(e) })
2302
- ] })
2303
- },
2304
- index
2305
- );
2306
- }
2307
- }
2308
- } else if (!inProgress || !isCurrentMessage) {
2309
- return null;
2310
- } else {
2311
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2312
- AssistantMessage2,
2313
- {
2314
- rawData: message,
2315
- "data-message-role": "assistant",
2316
- isLoading: true,
2317
- isGenerating: true
2318
- },
2319
- index
2320
- );
2321
- }
2322
- }
2323
- }
2324
-
2325
- // src/components/chat/messages/RenderResultMessage.tsx
2326
- var import_jsx_runtime20 = require("react/jsx-runtime");
2327
- function RenderResultMessage(_a) {
2328
- var _b = _a, {
2329
- AssistantMessage: AssistantMessage2 = AssistantMessage
2330
- } = _b, props = __objRest(_b, [
2331
- "AssistantMessage"
2332
- ]);
2333
- const { message, inProgress, index, isCurrentMessage } = props;
2334
- if (message.isResultMessage() && inProgress && isCurrentMessage) {
2335
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2336
- AssistantMessage2,
2337
- {
2338
- "data-message-role": "assistant",
2339
- rawData: message,
2340
- isLoading: true,
2341
- isGenerating: true
2342
- },
2343
- index
2344
- );
2345
- } else {
2346
- return null;
2347
- }
2348
- }
2349
-
2350
- // src/components/chat/messages/RenderAgentStateMessage.tsx
2351
- var import_react_core8 = require("@copilotkit/react-core");
2352
- var import_jsx_runtime21 = require("react/jsx-runtime");
2353
- function RenderAgentStateMessage(_a) {
2354
- var _b = _a, {
2355
- AssistantMessage: AssistantMessage2 = AssistantMessage
2356
- } = _b, props = __objRest(_b, [
2357
- "AssistantMessage"
2358
- ]);
2359
- const { chatComponentsCache } = (0, import_react_core8.useCopilotContext)();
2360
- const { message, inProgress, index, isCurrentMessage } = props;
2361
- if (message.isAgentStateMessage()) {
2362
- let render;
2363
- if (chatComponentsCache.current !== null) {
2364
- render = chatComponentsCache.current.coAgentStateRenders[`${message.agentName}-${message.nodeName}`] || chatComponentsCache.current.coAgentStateRenders[`${message.agentName}-global`];
2365
- }
2366
- if (render) {
2367
- if (typeof render === "string") {
2368
- if (isCurrentMessage && inProgress) {
2369
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2370
- AssistantMessage2,
2371
- {
2372
- rawData: message,
2373
- message: render,
2374
- "data-message-role": "assistant",
2375
- isLoading: true,
2376
- isGenerating: true
2377
- },
2378
- index
2379
- );
2380
- } else {
2381
- return null;
2382
- }
2383
- } else {
2384
- const state = message.state;
2385
- let status = message.active ? "inProgress" : "complete";
2386
- const toRender = render({
2387
- status,
2388
- state,
2389
- nodeName: message.nodeName
2390
- });
2391
- if (!toRender && status === "complete") {
2392
- return null;
2393
- }
2394
- if (!toRender && isCurrentMessage && inProgress) {
2395
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2396
- AssistantMessage2,
2397
- {
2398
- "data-message-role": "assistant",
2399
- rawData: message,
2400
- isLoading: true,
2401
- isGenerating: true
2402
- },
2403
- index
2404
- );
2405
- } else if (!toRender) {
2406
- return null;
2407
- }
2408
- if (typeof toRender === "string") {
2409
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2410
- AssistantMessage2,
2411
- {
2412
- rawData: message,
2413
- message: toRender,
2414
- isLoading: true,
2415
- isGenerating: true,
2416
- "data-message-role": "assistant"
2417
- },
2418
- index
2419
- );
2420
- } else {
2421
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2422
- AssistantMessage2,
2423
- {
2424
- rawData: message,
2425
- "data-message-role": "agent-state-render",
2426
- isLoading: false,
2427
- isGenerating: false,
2428
- subComponent: toRender
2429
- },
2430
- index
2431
- );
2432
- }
2433
- }
2434
- } else if (!inProgress || !isCurrentMessage) {
2435
- return null;
2436
- } else {
2437
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2438
- AssistantMessage2,
2439
- {
2440
- rawData: message,
2441
- isLoading: true,
2442
- isGenerating: true,
2443
- "data-message-role": "assistant"
2444
- },
2445
- index
2446
- );
2447
- }
2448
- }
2449
- }
2450
-
2451
- // src/components/chat/messages/RenderImageMessage.tsx
2452
- var import_jsx_runtime22 = require("react/jsx-runtime");
2453
- function RenderImageMessage(_a) {
2454
- var _b = _a, {
2455
- UserMessage: UserMessage2 = UserMessage,
2456
- AssistantMessage: AssistantMessage2 = AssistantMessage
2457
- } = _b, props = __objRest(_b, [
2458
- "UserMessage",
2459
- "AssistantMessage"
2460
- ]);
2461
- const {
2462
- message,
2463
- inProgress,
2464
- index,
2465
- isCurrentMessage,
2466
- onRegenerate,
2467
- onCopy,
2468
- onThumbsUp,
2469
- onThumbsDown
2470
- } = props;
2471
- if (message.isImageMessage()) {
2472
- const imageData = `data:${message.format};base64,${message.bytes}`;
2473
- const imageComponent = /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "copilotKitImage", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2474
- "img",
2475
- {
2476
- src: imageData,
2477
- alt: "User uploaded image",
2478
- style: { maxWidth: "100%", maxHeight: "300px", borderRadius: "8px" }
2479
- }
2480
- ) });
2481
- if (message.role === "user") {
2482
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2483
- UserMessage2,
2484
- {
2485
- "data-message-role": "user",
2486
- message: "",
2487
- rawData: message,
2488
- subComponent: imageComponent
2489
- },
2490
- index
2491
- );
2492
- } else if (message.role === "assistant") {
2493
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2494
- AssistantMessage2,
2495
- {
2496
- "data-message-role": "assistant",
2497
- message: "",
2498
- rawData: message,
2499
- subComponent: imageComponent,
2500
- isLoading: inProgress && isCurrentMessage && !message.bytes,
2501
- isGenerating: inProgress && isCurrentMessage && !!message.bytes,
2502
- isCurrentMessage,
2503
- onRegenerate: () => onRegenerate == null ? void 0 : onRegenerate(message.id),
2504
- onCopy,
2505
- onThumbsUp,
2506
- onThumbsDown
2507
- },
2508
- index
2509
- );
2510
- }
2511
- }
2512
- return null;
2513
- }
2514
-
2515
2178
  // src/components/chat/Chat.tsx
2516
- var import_react13 = __toESM(require("react"));
2517
- var import_react_core10 = require("@copilotkit/react-core");
2518
-
2519
- // src/components/chat/Suggestion.tsx
2520
- var import_react_core9 = require("@copilotkit/react-core");
2179
+ var import_react14 = __toESM(require("react"));
2180
+ var import_react_core8 = require("@copilotkit/react-core");
2521
2181
  var import_shared3 = require("@copilotkit/shared");
2522
- var import_runtime_client_gql3 = require("@copilotkit/runtime-client-gql");
2523
- var import_jsx_runtime23 = require("react/jsx-runtime");
2524
- function Suggestion({ title, onClick, partial, className }) {
2525
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2526
- "button",
2527
- {
2528
- disabled: partial,
2529
- onClick: (e) => {
2530
- e.preventDefault();
2531
- onClick();
2532
- },
2533
- className: className || (partial ? "suggestion loading" : "suggestion"),
2534
- "data-test-id": "suggestion",
2535
- children: partial ? SmallSpinnerIcon : /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { children: title })
2536
- }
2537
- );
2538
- }
2539
- var reloadSuggestions = (context, chatSuggestionConfiguration, setCurrentSuggestions, abortControllerRef) => __async(void 0, null, function* () {
2540
- const abortController = abortControllerRef.current;
2541
- const tools = JSON.stringify(
2542
- Object.values(context.actions).map((action) => ({
2543
- name: action.name,
2544
- description: action.description,
2545
- jsonSchema: JSON.stringify((0, import_shared3.actionParametersToJsonSchema)(action.parameters))
2546
- }))
2547
- );
2548
- const allSuggestions = [];
2549
- for (const config of Object.values(chatSuggestionConfiguration)) {
2550
- try {
2551
- 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.`;
2552
- const result = yield (0, import_react_core9.extract)({
2553
- context,
2554
- instructions: "Suggest what the user could say next. Provide clear, highly relevant suggestions. Do not literally suggest function calls. ",
2555
- data: config.instructions + "\n\n" + numOfSuggestionsInstructions + "\n\nAvailable tools: " + tools + "\n\n",
2556
- requestType: import_runtime_client_gql3.CopilotRequestType.Task,
2557
- parameters: [
2558
- {
2559
- name: "suggestions",
2560
- type: "object[]",
2561
- attributes: [
2562
- {
2563
- name: "title",
2564
- description: "The title of the suggestion. This is shown as a button and should be short.",
2565
- type: "string"
2566
- },
2567
- {
2568
- name: "message",
2569
- 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.",
2570
- type: "string"
2571
- }
2572
- ]
2573
- }
2574
- ],
2575
- include: {
2576
- messages: true,
2577
- readable: true
2578
- },
2579
- abortSignal: abortController == null ? void 0 : abortController.signal,
2580
- stream: ({ status, args }) => {
2581
- const suggestions = args.suggestions || [];
2582
- const newSuggestions = [];
2583
- for (let i = 0; i < suggestions.length; i++) {
2584
- if (config.maxSuggestions !== void 0 && i >= config.maxSuggestions) {
2585
- break;
2586
- }
2587
- const { title, message } = suggestions[i];
2588
- const partial = i == suggestions.length - 1 && status !== "complete";
2589
- newSuggestions.push({
2590
- title,
2591
- message,
2592
- partial,
2593
- className: config.className
2594
- });
2595
- }
2596
- setCurrentSuggestions([...allSuggestions, ...newSuggestions]);
2597
- }
2598
- });
2599
- allSuggestions.push(...result.suggestions);
2600
- } catch (error) {
2601
- console.error("Error loading suggestions", error);
2602
- }
2603
- }
2604
- if (abortControllerRef.current === abortController) {
2605
- abortControllerRef.current = null;
2606
- }
2607
- });
2608
-
2609
- // src/components/chat/Chat.tsx
2610
- var import_runtime_client_gql4 = require("@copilotkit/runtime-client-gql");
2611
- var import_shared4 = require("@copilotkit/shared");
2612
- var import_react_core11 = require("@copilotkit/react-core");
2182
+ var import_react_core9 = require("@copilotkit/react-core");
2613
2183
 
2614
2184
  // src/components/chat/ImageUploadQueue.tsx
2615
- var import_jsx_runtime24 = require("react/jsx-runtime");
2185
+ var import_jsx_runtime20 = require("react/jsx-runtime");
2616
2186
  var ImageUploadQueue = ({
2617
2187
  images,
2618
2188
  onRemoveImage,
@@ -2620,7 +2190,7 @@ var ImageUploadQueue = ({
2620
2190
  }) => {
2621
2191
  if (images.length === 0)
2622
2192
  return null;
2623
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
2193
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2624
2194
  "div",
2625
2195
  {
2626
2196
  className: `copilotKitImageUploadQueue ${className}`,
@@ -2631,7 +2201,7 @@ var ImageUploadQueue = ({
2631
2201
  margin: "8px",
2632
2202
  padding: "8px"
2633
2203
  },
2634
- children: images.map((image, index) => /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
2204
+ children: images.map((image, index) => /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
2635
2205
  "div",
2636
2206
  {
2637
2207
  className: "copilotKitImageUploadQueueItem",
@@ -2644,7 +2214,7 @@ var ImageUploadQueue = ({
2644
2214
  overflow: "hidden"
2645
2215
  },
2646
2216
  children: [
2647
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
2217
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2648
2218
  "img",
2649
2219
  {
2650
2220
  src: `data:${image.contentType};base64,${image.bytes}`,
@@ -2656,7 +2226,7 @@ var ImageUploadQueue = ({
2656
2226
  }
2657
2227
  }
2658
2228
  ),
2659
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
2229
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2660
2230
  "button",
2661
2231
  {
2662
2232
  onClick: () => onRemoveImage(index),
@@ -2689,10 +2259,32 @@ var ImageUploadQueue = ({
2689
2259
  );
2690
2260
  };
2691
2261
 
2262
+ // src/components/chat/Suggestion.tsx
2263
+ var import_react_core7 = require("@copilotkit/react-core");
2264
+ var import_jsx_runtime21 = require("react/jsx-runtime");
2265
+ function Suggestion({ title, onClick, partial, className }) {
2266
+ if (!title)
2267
+ return null;
2268
+ const { isLoading } = (0, import_react_core7.useCopilotChat)();
2269
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2270
+ "button",
2271
+ {
2272
+ disabled: partial || isLoading,
2273
+ onClick: (e) => {
2274
+ e.preventDefault();
2275
+ onClick();
2276
+ },
2277
+ className: className || (partial ? "suggestion loading" : "suggestion"),
2278
+ "data-test-id": "suggestion",
2279
+ children: partial ? SmallSpinnerIcon : /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { children: title })
2280
+ }
2281
+ );
2282
+ }
2283
+
2692
2284
  // src/components/chat/Suggestions.tsx
2693
- var import_jsx_runtime25 = require("react/jsx-runtime");
2285
+ var import_jsx_runtime22 = require("react/jsx-runtime");
2694
2286
  function Suggestions({ suggestions, onSuggestionClick }) {
2695
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "suggestions", children: suggestions.map((suggestion, index) => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
2287
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "suggestions", children: suggestions.map((suggestion, index) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2696
2288
  Suggestion,
2697
2289
  {
2698
2290
  title: suggestion.title,
@@ -2706,9 +2298,10 @@ function Suggestions({ suggestions, onSuggestionClick }) {
2706
2298
  }
2707
2299
 
2708
2300
  // src/components/chat/Chat.tsx
2709
- var import_jsx_runtime26 = require("react/jsx-runtime");
2301
+ var import_jsx_runtime23 = require("react/jsx-runtime");
2710
2302
  function CopilotChat({
2711
2303
  instructions,
2304
+ suggestions = "auto",
2712
2305
  onSubmitMessage,
2713
2306
  makeSystemMessage,
2714
2307
  onInProgress,
@@ -2720,11 +2313,7 @@ function CopilotChat({
2720
2313
  onThumbsDown,
2721
2314
  markdownTagRenderers,
2722
2315
  Messages: Messages2 = Messages,
2723
- RenderTextMessage: RenderTextMessage2 = RenderTextMessage,
2724
- RenderActionExecutionMessage: RenderActionExecutionMessage2 = RenderActionExecutionMessage,
2725
- RenderAgentStateMessage: RenderAgentStateMessage2 = RenderAgentStateMessage,
2726
- RenderResultMessage: RenderResultMessage2 = RenderResultMessage,
2727
- RenderImageMessage: RenderImageMessage2 = RenderImageMessage,
2316
+ RenderMessage: RenderMessage2 = RenderMessage,
2728
2317
  RenderSuggestionsList = Suggestions,
2729
2318
  Input: Input2 = Input,
2730
2319
  className,
@@ -2732,14 +2321,15 @@ function CopilotChat({
2732
2321
  labels,
2733
2322
  AssistantMessage: AssistantMessage2 = AssistantMessage,
2734
2323
  UserMessage: UserMessage2 = UserMessage,
2324
+ ImageRenderer: ImageRenderer2 = ImageRenderer,
2735
2325
  imageUploadsEnabled,
2736
2326
  inputFileAccept = "image/*",
2737
2327
  hideStopButton
2738
2328
  }) {
2739
- const { additionalInstructions, setChatInstructions } = (0, import_react_core10.useCopilotContext)();
2740
- const [selectedImages, setSelectedImages] = (0, import_react13.useState)([]);
2741
- const fileInputRef = (0, import_react13.useRef)(null);
2742
- (0, import_react13.useEffect)(() => {
2329
+ const { additionalInstructions, setChatInstructions } = (0, import_react_core8.useCopilotContext)();
2330
+ const [selectedImages, setSelectedImages] = (0, import_react14.useState)([]);
2331
+ const fileInputRef = (0, import_react14.useRef)(null);
2332
+ (0, import_react14.useEffect)(() => {
2743
2333
  if (!imageUploadsEnabled)
2744
2334
  return;
2745
2335
  const handlePaste = (e) => __async(this, null, function* () {
@@ -2784,7 +2374,7 @@ function CopilotChat({
2784
2374
  document.addEventListener("paste", handlePaste);
2785
2375
  return () => document.removeEventListener("paste", handlePaste);
2786
2376
  }, [imageUploadsEnabled]);
2787
- (0, import_react13.useEffect)(() => {
2377
+ (0, import_react14.useEffect)(() => {
2788
2378
  if (!(additionalInstructions == null ? void 0 : additionalInstructions.length)) {
2789
2379
  setChatInstructions(instructions || "");
2790
2380
  return;
@@ -2794,17 +2384,17 @@ function CopilotChat({
2794
2384
  "Additionally, follow these instructions:",
2795
2385
  ...additionalInstructions.map((instruction) => `- ${instruction}`)
2796
2386
  ];
2797
- console.log("combinedAdditionalInstructions", combinedAdditionalInstructions);
2798
2387
  setChatInstructions(combinedAdditionalInstructions.join("\n") || "");
2799
2388
  }, [instructions, additionalInstructions]);
2800
2389
  const {
2801
2390
  visibleMessages,
2802
2391
  isLoading,
2803
- currentSuggestions,
2804
2392
  sendMessage,
2805
2393
  stopGeneration,
2806
- reloadMessages
2394
+ reloadMessages,
2395
+ suggestions: currentSuggestions
2807
2396
  } = useCopilotChatLogic(
2397
+ suggestions,
2808
2398
  makeSystemMessage,
2809
2399
  onInProgress,
2810
2400
  onSubmitMessage,
@@ -2819,7 +2409,7 @@ function CopilotChat({
2819
2409
  }
2820
2410
  return sendMessage(text, images);
2821
2411
  };
2822
- const chatContext = import_react13.default.useContext(ChatContext);
2412
+ const chatContext = import_react14.default.useContext(ChatContext);
2823
2413
  const isVisible = chatContext ? chatContext.open : true;
2824
2414
  const handleRegenerate = (messageId) => {
2825
2415
  if (onRegenerate) {
@@ -2866,17 +2456,13 @@ function CopilotChat({
2866
2456
  const removeSelectedImage = (index) => {
2867
2457
  setSelectedImages((prev) => prev.filter((_, i) => i !== index));
2868
2458
  };
2869
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(WrappedCopilotChat, { icons, labels, className, children: [
2870
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2459
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(WrappedCopilotChat, { icons, labels, className, children: [
2460
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2871
2461
  Messages2,
2872
2462
  {
2873
2463
  AssistantMessage: AssistantMessage2,
2874
2464
  UserMessage: UserMessage2,
2875
- RenderTextMessage: RenderTextMessage2,
2876
- RenderActionExecutionMessage: RenderActionExecutionMessage2,
2877
- RenderAgentStateMessage: RenderAgentStateMessage2,
2878
- RenderResultMessage: RenderResultMessage2,
2879
- RenderImageMessage: RenderImageMessage2,
2465
+ RenderMessage: RenderMessage2,
2880
2466
  messages: visibleMessages,
2881
2467
  inProgress: isLoading,
2882
2468
  onRegenerate: handleRegenerate,
@@ -2884,7 +2470,8 @@ function CopilotChat({
2884
2470
  onThumbsUp,
2885
2471
  onThumbsDown,
2886
2472
  markdownTagRenderers,
2887
- children: currentSuggestions.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2473
+ ImageRenderer: ImageRenderer2,
2474
+ children: currentSuggestions.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2888
2475
  RenderSuggestionsList,
2889
2476
  {
2890
2477
  onSuggestionClick: handleSendMessage,
@@ -2893,9 +2480,9 @@ function CopilotChat({
2893
2480
  )
2894
2481
  }
2895
2482
  ),
2896
- imageUploadsEnabled && /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_jsx_runtime26.Fragment, { children: [
2897
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ImageUploadQueue, { images: selectedImages, onRemoveImage: removeSelectedImage }),
2898
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2483
+ imageUploadsEnabled && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_jsx_runtime23.Fragment, { children: [
2484
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(ImageUploadQueue, { images: selectedImages, onRemoveImage: removeSelectedImage }),
2485
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2899
2486
  "input",
2900
2487
  {
2901
2488
  type: "file",
@@ -2907,7 +2494,7 @@ function CopilotChat({
2907
2494
  }
2908
2495
  )
2909
2496
  ] }),
2910
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2497
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2911
2498
  Input2,
2912
2499
  {
2913
2500
  inProgress: isLoading,
@@ -2929,75 +2516,118 @@ function WrappedCopilotChat({
2929
2516
  labels,
2930
2517
  className
2931
2518
  }) {
2932
- const chatContext = import_react13.default.useContext(ChatContext);
2519
+ const chatContext = import_react14.default.useContext(ChatContext);
2933
2520
  if (!chatContext) {
2934
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ChatContextProvider, { icons, labels, open: true, setOpen: () => {
2935
- }, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: `copilotKitChat ${className != null ? className : ""}`, children }) });
2521
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(ChatContextProvider, { icons, labels, open: true, setOpen: () => {
2522
+ }, children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: `copilotKitChat ${className != null ? className : ""}`, children }) });
2936
2523
  }
2937
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_jsx_runtime26.Fragment, { children });
2524
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_jsx_runtime23.Fragment, { children });
2938
2525
  }
2939
- var SUGGESTIONS_DEBOUNCE_TIMEOUT = 1e3;
2940
- var useCopilotChatLogic = (makeSystemMessage, onInProgress, onSubmitMessage, onStopGeneration, onReloadMessages) => {
2526
+ var useCopilotChatLogic = (chatSuggestions, makeSystemMessage, onInProgress, onSubmitMessage, onStopGeneration, onReloadMessages) => {
2941
2527
  var _a;
2942
2528
  const {
2943
2529
  visibleMessages,
2944
2530
  appendMessage,
2531
+ setMessages,
2945
2532
  reloadMessages: defaultReloadMessages,
2946
2533
  stopGeneration: defaultStopGeneration,
2947
2534
  runChatCompletion,
2948
- isLoading
2949
- } = (0, import_react_core10.useCopilotChat)({
2950
- id: (0, import_shared4.randomId)(),
2535
+ isLoading,
2536
+ suggestions,
2537
+ setSuggestions,
2538
+ generateSuggestions,
2539
+ resetSuggestions: resetSuggestionsFromHook,
2540
+ isLoadingSuggestions
2541
+ } = (0, import_react_core8.useCopilotChat)({
2951
2542
  makeSystemMessage
2952
2543
  });
2953
- const [currentSuggestions, setCurrentSuggestions] = (0, import_react13.useState)([]);
2954
- const suggestionsAbortControllerRef = (0, import_react13.useRef)(null);
2955
- const debounceTimerRef = (0, import_react13.useRef)();
2956
- const abortSuggestions = () => {
2957
- var _a2;
2958
- (_a2 = suggestionsAbortControllerRef.current) == null ? void 0 : _a2.abort();
2959
- suggestionsAbortControllerRef.current = null;
2960
- };
2961
- const generalContext = (0, import_react_core10.useCopilotContext)();
2962
- const messagesContext = (0, import_react_core10.useCopilotMessagesContext)();
2963
- const context = __spreadValues(__spreadValues({}, generalContext), messagesContext);
2964
- (0, import_react13.useEffect)(() => {
2965
- onInProgress == null ? void 0 : onInProgress(isLoading);
2966
- abortSuggestions();
2967
- debounceTimerRef.current = setTimeout(
2968
- () => {
2969
- if (!isLoading && Object.keys(context.chatSuggestionConfiguration).length !== 0) {
2970
- suggestionsAbortControllerRef.current = new AbortController();
2971
- reloadSuggestions(
2972
- context,
2973
- context.chatSuggestionConfiguration,
2974
- setCurrentSuggestions,
2975
- suggestionsAbortControllerRef
2976
- );
2977
- }
2978
- },
2979
- currentSuggestions.length == 0 ? 0 : SUGGESTIONS_DEBOUNCE_TIMEOUT
2980
- );
2981
- return () => {
2982
- clearTimeout(debounceTimerRef.current);
2983
- };
2544
+ const generalContext = (0, import_react_core8.useCopilotContext)();
2545
+ const messagesContext = (0, import_react_core8.useCopilotMessagesContext)();
2546
+ const { actions } = generalContext;
2547
+ const [suggestionsFailed, setSuggestionsFailed] = (0, import_react14.useState)(false);
2548
+ const hasGeneratedInitialSuggestions = (0, import_react14.useRef)(false);
2549
+ (0, import_react14.useEffect)(() => {
2550
+ if (Array.isArray(chatSuggestions)) {
2551
+ setSuggestions(chatSuggestions);
2552
+ hasGeneratedInitialSuggestions.current = true;
2553
+ }
2554
+ }, [JSON.stringify(chatSuggestions), setSuggestions]);
2555
+ const generateSuggestionsWithErrorHandling = (0, import_react14.useCallback)(
2556
+ (context) => __async(void 0, null, function* () {
2557
+ try {
2558
+ yield generateSuggestions();
2559
+ } catch (error) {
2560
+ console.error("Failed to generate suggestions:", error);
2561
+ setSuggestionsFailed(true);
2562
+ }
2563
+ }),
2564
+ [generateSuggestions]
2565
+ );
2566
+ (0, import_react14.useEffect)(() => {
2567
+ if (chatSuggestions !== "auto" || isLoadingSuggestions || suggestionsFailed) {
2568
+ return;
2569
+ }
2570
+ if (isLoading) {
2571
+ return;
2572
+ }
2573
+ if (Object.keys(generalContext.chatSuggestionConfiguration).length === 0) {
2574
+ return;
2575
+ }
2576
+ if (visibleMessages.length === 0 && !hasGeneratedInitialSuggestions.current) {
2577
+ hasGeneratedInitialSuggestions.current = true;
2578
+ generateSuggestionsWithErrorHandling("initial");
2579
+ return;
2580
+ }
2581
+ if (visibleMessages.length > 0 && suggestions.length === 0) {
2582
+ generateSuggestionsWithErrorHandling("post-message");
2583
+ return;
2584
+ }
2984
2585
  }, [
2586
+ chatSuggestions,
2587
+ isLoadingSuggestions,
2588
+ suggestionsFailed,
2589
+ visibleMessages.length,
2985
2590
  isLoading,
2986
- context.chatSuggestionConfiguration,
2987
- // hackish way to trigger suggestions reload on reset, but better than moving suggestions to the
2988
- // global context
2989
- visibleMessages.length == 0
2591
+ suggestions.length,
2592
+ Object.keys(generalContext.chatSuggestionConfiguration).join(","),
2593
+ // Use stable string instead of object reference
2594
+ generateSuggestionsWithErrorHandling
2990
2595
  ]);
2596
+ (0, import_react14.useEffect)(() => {
2597
+ if (chatSuggestions !== "auto") {
2598
+ hasGeneratedInitialSuggestions.current = false;
2599
+ setSuggestionsFailed(false);
2600
+ }
2601
+ }, [chatSuggestions]);
2602
+ const stableContext = (0, import_react14.useMemo)(
2603
+ () => __spreadValues(__spreadValues({}, generalContext), messagesContext),
2604
+ [
2605
+ // Only include stable dependencies
2606
+ generalContext.actions,
2607
+ messagesContext.messages.length,
2608
+ generalContext.isLoading
2609
+ ]
2610
+ );
2611
+ const resetSuggestions = (0, import_react14.useCallback)(() => {
2612
+ resetSuggestionsFromHook();
2613
+ setSuggestionsFailed(false);
2614
+ hasGeneratedInitialSuggestions.current = false;
2615
+ }, [resetSuggestionsFromHook]);
2616
+ (0, import_react14.useEffect)(() => {
2617
+ onInProgress == null ? void 0 : onInProgress(isLoading);
2618
+ }, [onInProgress, isLoading]);
2991
2619
  const sendMessage = (messageContent, imagesToUse) => __async(void 0, null, function* () {
2992
2620
  const images = imagesToUse || [];
2993
- abortSuggestions();
2994
- setCurrentSuggestions([]);
2621
+ if (chatSuggestions === "auto" || chatSuggestions === "manual") {
2622
+ setSuggestions([]);
2623
+ }
2995
2624
  let firstMessage = null;
2996
2625
  if (messageContent.trim().length > 0) {
2997
- const textMessage = new import_runtime_client_gql4.TextMessage({
2998
- content: messageContent,
2999
- role: import_runtime_client_gql4.Role.User
3000
- });
2626
+ const textMessage = {
2627
+ id: (0, import_shared3.randomId)(),
2628
+ role: "user",
2629
+ content: messageContent
2630
+ };
3001
2631
  if (onSubmitMessage) {
3002
2632
  try {
3003
2633
  yield onSubmitMessage(messageContent);
@@ -3005,18 +2635,24 @@ var useCopilotChatLogic = (makeSystemMessage, onInProgress, onSubmitMessage, onS
3005
2635
  console.error("Error in onSubmitMessage:", error);
3006
2636
  }
3007
2637
  }
3008
- yield appendMessage(textMessage, { followUp: images.length === 0 });
2638
+ yield appendMessage(textMessage, {
2639
+ followUp: images.length === 0,
2640
+ clearSuggestions: chatSuggestions === "auto" || chatSuggestions === "manual"
2641
+ });
3009
2642
  if (!firstMessage) {
3010
2643
  firstMessage = textMessage;
3011
2644
  }
3012
2645
  }
3013
2646
  if (images.length > 0) {
3014
2647
  for (let i = 0; i < images.length; i++) {
3015
- const imageMessage = new import_runtime_client_gql4.ImageMessage({
3016
- format: images[i].contentType.replace("image/", ""),
3017
- bytes: images[i].bytes,
3018
- role: import_runtime_client_gql4.Role.User
3019
- });
2648
+ const imageMessage = {
2649
+ id: (0, import_shared3.randomId)(),
2650
+ role: "user",
2651
+ image: {
2652
+ format: images[i].contentType.replace("image/", ""),
2653
+ bytes: images[i].bytes
2654
+ }
2655
+ };
3020
2656
  yield appendMessage(imageMessage, { followUp: i === images.length - 1 });
3021
2657
  if (!firstMessage) {
3022
2658
  firstMessage = imageMessage;
@@ -3024,12 +2660,11 @@ var useCopilotChatLogic = (makeSystemMessage, onInProgress, onSubmitMessage, onS
3024
2660
  }
3025
2661
  }
3026
2662
  if (!firstMessage) {
3027
- return new import_runtime_client_gql4.TextMessage({ content: "", role: import_runtime_client_gql4.Role.User });
2663
+ return { role: "user", content: "", id: (0, import_shared3.randomId)() };
3028
2664
  }
3029
2665
  return firstMessage;
3030
2666
  });
3031
2667
  const messages = visibleMessages;
3032
- const { setMessages } = messagesContext;
3033
2668
  const currentAgentName = (_a = generalContext.agentSession) == null ? void 0 : _a.agentName;
3034
2669
  const restartCurrentAgent = (hint) => __async(void 0, null, function* () {
3035
2670
  if (generalContext.agentSession) {
@@ -3050,9 +2685,9 @@ var useCopilotChatLogic = (makeSystemMessage, onInProgress, onSubmitMessage, onS
3050
2685
  });
3051
2686
  const runCurrentAgent = (hint) => __async(void 0, null, function* () {
3052
2687
  if (generalContext.agentSession) {
3053
- yield (0, import_react_core11.runAgent)(
2688
+ yield (0, import_react_core9.runAgent)(
3054
2689
  generalContext.agentSession.agentName,
3055
- context,
2690
+ stableContext,
3056
2691
  appendMessage,
3057
2692
  runChatCompletion,
3058
2693
  hint
@@ -3061,7 +2696,7 @@ var useCopilotChatLogic = (makeSystemMessage, onInProgress, onSubmitMessage, onS
3061
2696
  });
3062
2697
  const stopCurrentAgent = () => {
3063
2698
  if (generalContext.agentSession) {
3064
- (0, import_react_core11.stopAgent)(generalContext.agentSession.agentName, context);
2699
+ (0, import_react_core9.stopAgent)(generalContext.agentSession.agentName, stableContext);
3065
2700
  }
3066
2701
  };
3067
2702
  const setCurrentAgentState = (state) => {
@@ -3076,6 +2711,7 @@ var useCopilotChatLogic = (makeSystemMessage, onInProgress, onSubmitMessage, onS
3076
2711
  }
3077
2712
  };
3078
2713
  function stopGeneration() {
2714
+ setSuggestions([]);
3079
2715
  if (onStopGeneration) {
3080
2716
  onStopGeneration({
3081
2717
  messages,
@@ -3109,17 +2745,21 @@ var useCopilotChatLogic = (makeSystemMessage, onInProgress, onSubmitMessage, onS
3109
2745
  }
3110
2746
  }
3111
2747
  return {
2748
+ messages,
3112
2749
  visibleMessages,
3113
2750
  isLoading,
3114
- currentSuggestions,
2751
+ suggestions,
3115
2752
  sendMessage,
3116
2753
  stopGeneration,
3117
- reloadMessages
2754
+ reloadMessages,
2755
+ resetSuggestions,
2756
+ context: stableContext,
2757
+ actions
3118
2758
  };
3119
2759
  };
3120
2760
 
3121
2761
  // src/components/chat/Modal.tsx
3122
- var import_jsx_runtime27 = require("react/jsx-runtime");
2762
+ var import_jsx_runtime24 = require("react/jsx-runtime");
3123
2763
  var CopilotModal = (_a) => {
3124
2764
  var _b = _a, {
3125
2765
  instructions,
@@ -3178,18 +2818,18 @@ var CopilotModal = (_a) => {
3178
2818
  "className",
3179
2819
  "children"
3180
2820
  ]);
3181
- const [openState, setOpenState] = import_react14.default.useState(defaultOpen);
2821
+ const [openState, setOpenState] = import_react15.default.useState(defaultOpen);
3182
2822
  const setOpen = (open) => {
3183
2823
  onSetOpen == null ? void 0 : onSetOpen(open);
3184
2824
  setOpenState(open);
3185
2825
  };
3186
- const memoizedHeader = (0, import_react14.useMemo)(() => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Header2, {}), [Header2]);
3187
- const memoizedChildren = (0, import_react14.useMemo)(() => children, [children]);
3188
- return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(ChatContextProvider, { icons, labels, open: openState, setOpen, children: [
2826
+ const memoizedHeader = (0, import_react15.useMemo)(() => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(Header2, {}), [Header2]);
2827
+ const memoizedChildren = (0, import_react15.useMemo)(() => children, [children]);
2828
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(ChatContextProvider, { icons, labels, open: openState, setOpen, children: [
3189
2829
  memoizedChildren,
3190
- /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className, children: [
3191
- /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Button2, {}),
3192
- /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
2830
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className, children: [
2831
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(Button2, {}),
2832
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
3193
2833
  Window2,
3194
2834
  {
3195
2835
  clickOutsideToClose,
@@ -3197,7 +2837,7 @@ var CopilotModal = (_a) => {
3197
2837
  hitEscapeToClose,
3198
2838
  children: [
3199
2839
  memoizedHeader,
3200
- /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
2840
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
3201
2841
  CopilotChat,
3202
2842
  __spreadProps(__spreadValues({}, props), {
3203
2843
  instructions,
@@ -3225,22 +2865,22 @@ var CopilotModal = (_a) => {
3225
2865
  };
3226
2866
 
3227
2867
  // src/components/chat/Popup.tsx
3228
- var import_jsx_runtime28 = require("react/jsx-runtime");
2868
+ var import_jsx_runtime25 = require("react/jsx-runtime");
3229
2869
  function CopilotPopup(props) {
3230
2870
  props = __spreadProps(__spreadValues({}, props), {
3231
2871
  className: props.className ? props.className + " copilotKitPopup" : "copilotKitPopup"
3232
2872
  });
3233
- return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(CopilotModal, __spreadProps(__spreadValues({}, props), { children: props.children }));
2873
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(CopilotModal, __spreadProps(__spreadValues({}, props), { children: props.children }));
3234
2874
  }
3235
2875
 
3236
2876
  // src/components/chat/Sidebar.tsx
3237
- var import_react15 = require("react");
3238
- var import_jsx_runtime29 = require("react/jsx-runtime");
2877
+ var import_react16 = require("react");
2878
+ var import_jsx_runtime26 = require("react/jsx-runtime");
3239
2879
  function CopilotSidebar(props) {
3240
2880
  props = __spreadProps(__spreadValues({}, props), {
3241
2881
  className: props.className ? props.className + " copilotKitSidebar" : "copilotKitSidebar"
3242
2882
  });
3243
- const [expandedClassName, setExpandedClassName] = (0, import_react15.useState)(
2883
+ const [expandedClassName, setExpandedClassName] = (0, import_react16.useState)(
3244
2884
  props.defaultOpen ? "sidebarExpanded" : ""
3245
2885
  );
3246
2886
  const onSetOpen = (open) => {
@@ -3248,7 +2888,7 @@ function CopilotSidebar(props) {
3248
2888
  (_a = props.onSetOpen) == null ? void 0 : _a.call(props, open);
3249
2889
  setExpandedClassName(open ? "sidebarExpanded" : "");
3250
2890
  };
3251
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: `copilotKitSidebarContentWrapper ${expandedClassName}`, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(CopilotModal, __spreadProps(__spreadValues(__spreadValues({}, props), { onSetOpen }), { children: props.children })) });
2891
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: `copilotKitSidebarContentWrapper ${expandedClassName}`, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(CopilotModal, __spreadProps(__spreadValues(__spreadValues({}, props), { onSetOpen }), { children: props.children })) });
3252
2892
  }
3253
2893
  // Annotate the CommonJS export names for ESM import in node:
3254
2894
  0 && (module.exports = {
@@ -3256,8 +2896,8 @@ function CopilotSidebar(props) {
3256
2896
  CopilotChat,
3257
2897
  CopilotPopup,
3258
2898
  CopilotSidebar,
2899
+ ImageRenderer,
3259
2900
  Markdown,
3260
- RenderImageMessage,
3261
2901
  RenderSuggestion,
3262
2902
  RenderSuggestionsList,
3263
2903
  UserMessage,