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