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