@copilotkit/react-core 1.4.8 → 1.5.0-coagents-v0-3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/{chunk-X6ZF5WAX.mjs → chunk-35EN6BG4.mjs} +2 -2
  3. package/dist/{chunk-FSC4A3JN.mjs → chunk-42N5VKIX.mjs} +23 -5
  4. package/dist/{chunk-FSC4A3JN.mjs.map → chunk-42N5VKIX.mjs.map} +1 -1
  5. package/dist/{chunk-AG7FH7OD.mjs → chunk-5FYKUKG3.mjs} +2 -2
  6. package/dist/{chunk-YUY5ZAST.mjs → chunk-ALR5W5JK.mjs} +17 -8
  7. package/dist/chunk-ALR5W5JK.mjs.map +1 -0
  8. package/dist/{chunk-6EMLM6WX.mjs → chunk-BT6WK2JZ.mjs} +43 -6
  9. package/dist/chunk-BT6WK2JZ.mjs.map +1 -0
  10. package/dist/{chunk-NTLCOVE5.mjs → chunk-QTDCEDOC.mjs} +141 -70
  11. package/dist/chunk-QTDCEDOC.mjs.map +1 -0
  12. package/dist/{chunk-IFTHM7LF.mjs → chunk-QX6V774L.mjs} +6 -8
  13. package/dist/chunk-QX6V774L.mjs.map +1 -0
  14. package/dist/{chunk-XQFVXX6R.mjs → chunk-TQN3EZWQ.mjs} +10 -2
  15. package/dist/chunk-TQN3EZWQ.mjs.map +1 -0
  16. package/dist/{chunk-UOVONDR6.mjs → chunk-V3PFWGIY.mjs} +2 -2
  17. package/dist/{chunk-IVYL7JRC.mjs → chunk-VMP6JWBB.mjs} +12 -3
  18. package/dist/{chunk-IVYL7JRC.mjs.map → chunk-VMP6JWBB.mjs.map} +1 -1
  19. package/dist/chunk-XERJQUHA.mjs +31 -0
  20. package/dist/chunk-XERJQUHA.mjs.map +1 -0
  21. package/dist/components/copilot-provider/copilotkit.js +19 -2
  22. package/dist/components/copilot-provider/copilotkit.js.map +1 -1
  23. package/dist/components/copilot-provider/copilotkit.mjs +2 -2
  24. package/dist/components/copilot-provider/index.js +19 -2
  25. package/dist/components/copilot-provider/index.js.map +1 -1
  26. package/dist/components/copilot-provider/index.mjs +2 -2
  27. package/dist/components/index.js +19 -2
  28. package/dist/components/index.js.map +1 -1
  29. package/dist/components/index.mjs +2 -2
  30. package/dist/context/copilot-context.d.ts +8 -2
  31. package/dist/context/copilot-context.js +9 -1
  32. package/dist/context/copilot-context.js.map +1 -1
  33. package/dist/context/copilot-context.mjs +1 -1
  34. package/dist/context/index.d.ts +1 -1
  35. package/dist/context/index.js +9 -1
  36. package/dist/context/index.js.map +1 -1
  37. package/dist/context/index.mjs +1 -1
  38. package/dist/hooks/index.d.ts +2 -1
  39. package/dist/hooks/index.js +264 -95
  40. package/dist/hooks/index.js.map +1 -1
  41. package/dist/hooks/index.mjs +16 -9
  42. package/dist/hooks/use-chat.d.ts +20 -0
  43. package/dist/hooks/use-chat.js +171 -77
  44. package/dist/hooks/use-chat.js.map +1 -1
  45. package/dist/hooks/use-chat.mjs +2 -1
  46. package/dist/hooks/use-coagent-state-render.js +9 -1
  47. package/dist/hooks/use-coagent-state-render.js.map +1 -1
  48. package/dist/hooks/use-coagent-state-render.mjs +2 -2
  49. package/dist/hooks/use-coagent.d.ts +14 -1
  50. package/dist/hooks/use-coagent.js +245 -85
  51. package/dist/hooks/use-coagent.js.map +1 -1
  52. package/dist/hooks/use-coagent.mjs +12 -5
  53. package/dist/hooks/use-copilot-action.d.ts +12 -2
  54. package/dist/hooks/use-copilot-action.js +24 -7
  55. package/dist/hooks/use-copilot-action.js.map +1 -1
  56. package/dist/hooks/use-copilot-action.mjs +2 -2
  57. package/dist/hooks/use-copilot-chat.d.ts +1 -0
  58. package/dist/hooks/use-copilot-chat.js +223 -84
  59. package/dist/hooks/use-copilot-chat.js.map +1 -1
  60. package/dist/hooks/use-copilot-chat.mjs +5 -4
  61. package/dist/hooks/use-copilot-readable.js +9 -1
  62. package/dist/hooks/use-copilot-readable.js.map +1 -1
  63. package/dist/hooks/use-copilot-readable.mjs +2 -2
  64. package/dist/hooks/use-make-copilot-document-readable.js +9 -1
  65. package/dist/hooks/use-make-copilot-document-readable.js.map +1 -1
  66. package/dist/hooks/use-make-copilot-document-readable.mjs +2 -2
  67. package/dist/index.d.ts +2 -2
  68. package/dist/index.js +281 -106
  69. package/dist/index.js.map +1 -1
  70. package/dist/index.mjs +17 -10
  71. package/dist/lib/copilot-task.d.ts +1 -1
  72. package/dist/lib/copilot-task.js +33 -13
  73. package/dist/lib/copilot-task.js.map +1 -1
  74. package/dist/lib/copilot-task.mjs +4 -3
  75. package/dist/lib/index.d.ts +1 -1
  76. package/dist/lib/index.js +33 -13
  77. package/dist/lib/index.js.map +1 -1
  78. package/dist/lib/index.mjs +4 -3
  79. package/dist/types/frontend-action.d.ts +21 -2
  80. package/dist/types/frontend-action.js +34 -0
  81. package/dist/types/frontend-action.js.map +1 -1
  82. package/dist/types/frontend-action.mjs +7 -0
  83. package/dist/types/index.d.ts +2 -1
  84. package/dist/types/index.js.map +1 -1
  85. package/dist/utils/extract.js.map +1 -1
  86. package/dist/utils/extract.mjs +2 -2
  87. package/dist/utils/index.js.map +1 -1
  88. package/dist/utils/index.mjs +2 -2
  89. package/package.json +3 -3
  90. package/src/components/copilot-provider/copilotkit.tsx +10 -0
  91. package/src/context/copilot-context.tsx +30 -2
  92. package/src/hooks/index.ts +1 -1
  93. package/src/hooks/use-chat.ts +196 -88
  94. package/src/hooks/use-coagent.ts +21 -4
  95. package/src/hooks/use-copilot-action.ts +38 -10
  96. package/src/hooks/use-copilot-chat.ts +43 -3
  97. package/src/lib/copilot-task.ts +2 -8
  98. package/src/types/frontend-action.ts +55 -2
  99. package/src/types/index.ts +5 -1
  100. package/dist/chunk-6EMLM6WX.mjs.map +0 -1
  101. package/dist/chunk-IFTHM7LF.mjs.map +0 -1
  102. package/dist/chunk-NTLCOVE5.mjs.map +0 -1
  103. package/dist/chunk-XQFVXX6R.mjs.map +0 -1
  104. package/dist/chunk-YUY5ZAST.mjs.map +0 -1
  105. /package/dist/{chunk-X6ZF5WAX.mjs.map → chunk-35EN6BG4.mjs.map} +0 -0
  106. /package/dist/{chunk-AG7FH7OD.mjs.map → chunk-5FYKUKG3.mjs.map} +0 -0
  107. /package/dist/{chunk-UOVONDR6.mjs.map → chunk-V3PFWGIY.mjs.map} +0 -0
package/dist/index.js CHANGED
@@ -87,7 +87,10 @@ __export(src_exports, {
87
87
  CopilotTask: () => CopilotTask,
88
88
  defaultCopilotContextCategories: () => defaultCopilotContextCategories,
89
89
  extract: () => extract,
90
+ runAgent: () => runAgent,
90
91
  shouldShowDevConsole: () => shouldShowDevConsole,
92
+ startAgent: () => startAgent,
93
+ stopAgent: () => stopAgent,
91
94
  useCoAgent: () => useCoAgent,
92
95
  useCoAgentStateRender: () => useCoAgentStateRender,
93
96
  useCopilotAction: () => useCopilotAction,
@@ -157,7 +160,15 @@ var emptyCopilotContext = {
157
160
  },
158
161
  agentSession: null,
159
162
  setAgentSession: () => {
160
- }
163
+ },
164
+ agentLock: null,
165
+ threadId: null,
166
+ setThreadId: () => {
167
+ },
168
+ runId: null,
169
+ setRunId: () => {
170
+ },
171
+ chatAbortControllerRef: { current: null }
161
172
  };
162
173
  var CopilotContext = import_react.default.createContext(emptyCopilotContext);
163
174
  function useCopilotContext() {
@@ -1044,6 +1055,9 @@ ${nonDocumentStrings}`;
1044
1055
  };
1045
1056
  }
1046
1057
  const [agentSession, setAgentSession] = (0, import_react10.useState)(initialAgentSession);
1058
+ const [threadId, setThreadId] = (0, import_react10.useState)(null);
1059
+ const [runId, setRunId] = (0, import_react10.useState)(null);
1060
+ const chatAbortControllerRef = (0, import_react10.useRef)(null);
1047
1061
  const showDevConsole = props.showDevConsole === void 0 ? "auto" : props.showDevConsole;
1048
1062
  return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1049
1063
  CopilotContext.Provider,
@@ -1078,7 +1092,13 @@ ${nonDocumentStrings}`;
1078
1092
  setCoagentStatesWithRef,
1079
1093
  agentSession,
1080
1094
  setAgentSession,
1081
- runtimeClient
1095
+ runtimeClient,
1096
+ agentLock: props.agent || null,
1097
+ threadId,
1098
+ setThreadId,
1099
+ runId,
1100
+ setRunId,
1101
+ chatAbortControllerRef
1082
1102
  },
1083
1103
  children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CopilotMessages, { children })
1084
1104
  }
@@ -1113,12 +1133,39 @@ function entryPointsToFunctionCallHandler(actions) {
1113
1133
 
1114
1134
  // src/hooks/use-copilot-chat.ts
1115
1135
  var import_react12 = require("react");
1116
- var import_runtime_client_gql5 = require("@copilotkit/runtime-client-gql");
1136
+ var import_runtime_client_gql6 = require("@copilotkit/runtime-client-gql");
1117
1137
 
1118
1138
  // src/hooks/use-chat.ts
1119
1139
  var import_react11 = require("react");
1120
- var import_shared5 = require("@copilotkit/shared");
1140
+ var import_shared6 = require("@copilotkit/shared");
1141
+ var import_runtime_client_gql5 = require("@copilotkit/runtime-client-gql");
1142
+
1143
+ // src/types/frontend-action.ts
1121
1144
  var import_runtime_client_gql4 = require("@copilotkit/runtime-client-gql");
1145
+ var import_shared5 = require("@copilotkit/shared");
1146
+ function processActionsForRuntimeRequest(actions) {
1147
+ const filteredActions = actions.filter(
1148
+ (action) => action.available !== import_runtime_client_gql4.ActionInputAvailability.Disabled && action.disabled !== true && action.name !== "*"
1149
+ ).map((action) => {
1150
+ let available = import_runtime_client_gql4.ActionInputAvailability.Enabled;
1151
+ if (action.disabled) {
1152
+ available = import_runtime_client_gql4.ActionInputAvailability.Disabled;
1153
+ } else if (action.available === "disabled") {
1154
+ available = import_runtime_client_gql4.ActionInputAvailability.Disabled;
1155
+ } else if (action.available === "remote") {
1156
+ available = import_runtime_client_gql4.ActionInputAvailability.Remote;
1157
+ }
1158
+ return {
1159
+ name: action.name,
1160
+ description: action.description || "",
1161
+ jsonSchema: JSON.stringify((0, import_shared5.actionParametersToJsonSchema)(action.parameters || [])),
1162
+ available
1163
+ };
1164
+ });
1165
+ return filteredActions;
1166
+ }
1167
+
1168
+ // src/hooks/use-chat.ts
1122
1169
  function useChat(options) {
1123
1170
  const {
1124
1171
  messages,
@@ -1134,17 +1181,23 @@ function useChat(options) {
1134
1181
  setCoagentStatesWithRef,
1135
1182
  coagentStatesRef,
1136
1183
  agentSession,
1137
- setAgentSession
1184
+ setAgentSession,
1185
+ threadId,
1186
+ setThreadId,
1187
+ runId,
1188
+ setRunId,
1189
+ chatAbortControllerRef
1138
1190
  } = options;
1139
- const abortControllerRef = (0, import_react11.useRef)();
1140
- const threadIdRef = (0, import_react11.useRef)(null);
1141
- const runIdRef = (0, import_react11.useRef)(null);
1142
1191
  const { addGraphQLErrorsToast } = useToast();
1143
1192
  const runChatCompletionRef = (0, import_react11.useRef)();
1144
1193
  const agentSessionRef = (0, import_react11.useRef)(agentSession);
1145
1194
  agentSessionRef.current = agentSession;
1195
+ const threadIdRef = (0, import_react11.useRef)(threadId);
1196
+ threadIdRef.current = threadId;
1197
+ const runIdRef = (0, import_react11.useRef)(runId);
1198
+ runIdRef.current = runId;
1146
1199
  const publicApiKey = copilotConfig.publicApiKey;
1147
- const headers = __spreadValues(__spreadValues({}, copilotConfig.headers || {}), publicApiKey ? { [import_shared5.COPILOT_CLOUD_PUBLIC_API_KEY_HEADER]: publicApiKey } : {});
1200
+ const headers = __spreadValues(__spreadValues({}, copilotConfig.headers || {}), publicApiKey ? { [import_shared6.COPILOT_CLOUD_PUBLIC_API_KEY_HEADER]: publicApiKey } : {});
1148
1201
  const runtimeClient = useCopilotRuntimeClient({
1149
1202
  url: copilotConfig.chatApiEndpoint,
1150
1203
  publicApiKey: copilotConfig.publicApiKey,
@@ -1153,48 +1206,29 @@ function useChat(options) {
1153
1206
  });
1154
1207
  const runChatCompletion = useAsyncCallback(
1155
1208
  (previousMessages) => __async(this, null, function* () {
1156
- var _a, _b, _c, _d, _e, _f, _g, _h, _i;
1209
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
1157
1210
  setIsLoading(true);
1158
1211
  let newMessages = [
1159
- new import_runtime_client_gql4.TextMessage({
1212
+ new import_runtime_client_gql5.TextMessage({
1160
1213
  content: "",
1161
- role: import_runtime_client_gql4.Role.Assistant
1214
+ role: import_runtime_client_gql5.Role.Assistant
1162
1215
  })
1163
1216
  ];
1164
- const abortController = new AbortController();
1165
- abortControllerRef.current = abortController;
1217
+ chatAbortControllerRef.current = new AbortController();
1166
1218
  setMessages([...previousMessages, ...newMessages]);
1167
1219
  const systemMessage = makeSystemMessageCallback();
1168
1220
  const messagesWithContext = [systemMessage, ...initialMessages || [], ...previousMessages];
1221
+ const isAgentRun = agentSessionRef.current !== null;
1169
1222
  const stream = runtimeClient.asStream(
1170
1223
  runtimeClient.generateCopilotResponse({
1171
1224
  data: __spreadProps(__spreadValues(__spreadProps(__spreadValues({
1172
1225
  frontend: {
1173
- actions: actions.filter(
1174
- (action) => action.available !== import_runtime_client_gql4.ActionInputAvailability.Disabled || !action.disabled
1175
- ).map((action) => {
1176
- let available = import_runtime_client_gql4.ActionInputAvailability.Enabled;
1177
- if (action.disabled) {
1178
- available = import_runtime_client_gql4.ActionInputAvailability.Disabled;
1179
- } else if (action.available === "disabled") {
1180
- available = import_runtime_client_gql4.ActionInputAvailability.Disabled;
1181
- } else if (action.available === "remote") {
1182
- available = import_runtime_client_gql4.ActionInputAvailability.Remote;
1183
- }
1184
- return {
1185
- name: action.name,
1186
- description: action.description || "",
1187
- jsonSchema: JSON.stringify(
1188
- (0, import_shared5.actionParametersToJsonSchema)(action.parameters || [])
1189
- ),
1190
- available
1191
- };
1192
- }),
1226
+ actions: processActionsForRuntimeRequest(actions),
1193
1227
  url: window.location.href
1194
1228
  },
1195
1229
  threadId: threadIdRef.current,
1196
1230
  runId: runIdRef.current,
1197
- messages: (0, import_runtime_client_gql4.convertMessagesToGqlInput)((0, import_runtime_client_gql4.filterAgentStateMessages)(messagesWithContext))
1231
+ messages: (0, import_runtime_client_gql5.convertMessagesToGqlInput)((0, import_runtime_client_gql5.filterAgentStateMessages)(messagesWithContext))
1198
1232
  }, copilotConfig.cloud ? {
1199
1233
  cloud: __spreadValues({}, ((_c = (_b = (_a = copilotConfig.cloud.guardrails) == null ? void 0 : _a.input) == null ? void 0 : _b.restrictToTopic) == null ? void 0 : _c.enabled) ? {
1200
1234
  guardrails: {
@@ -1206,7 +1240,7 @@ function useChat(options) {
1206
1240
  } : {})
1207
1241
  } : {}), {
1208
1242
  metadata: {
1209
- requestType: import_runtime_client_gql4.CopilotRequestType.Chat
1243
+ requestType: import_runtime_client_gql5.CopilotRequestType.Chat
1210
1244
  }
1211
1245
  }), agentSessionRef.current ? {
1212
1246
  agentSession: agentSessionRef.current
@@ -1217,14 +1251,15 @@ function useChat(options) {
1217
1251
  }))
1218
1252
  }),
1219
1253
  properties: copilotConfig.properties,
1220
- signal: (_d = abortControllerRef.current) == null ? void 0 : _d.signal
1254
+ signal: (_d = chatAbortControllerRef.current) == null ? void 0 : _d.signal
1221
1255
  })
1222
1256
  );
1223
1257
  const guardrailsEnabled = ((_g = (_f = (_e = copilotConfig.cloud) == null ? void 0 : _e.guardrails) == null ? void 0 : _f.input) == null ? void 0 : _g.restrictToTopic.enabled) || false;
1224
1258
  const reader = stream.getReader();
1225
- let actionResults = {};
1226
1259
  let executedCoAgentStateRenders = [];
1227
1260
  let followUp = void 0;
1261
+ let messages2 = [];
1262
+ let syncedMessages = [];
1228
1263
  try {
1229
1264
  while (true) {
1230
1265
  let done, value;
@@ -1236,6 +1271,9 @@ function useChat(options) {
1236
1271
  break;
1237
1272
  }
1238
1273
  if (done) {
1274
+ if (chatAbortControllerRef.current.signal.aborted) {
1275
+ return [];
1276
+ }
1239
1277
  break;
1240
1278
  }
1241
1279
  if (!(value == null ? void 0 : value.generateCopilotResponse)) {
@@ -1243,8 +1281,10 @@ function useChat(options) {
1243
1281
  }
1244
1282
  threadIdRef.current = value.generateCopilotResponse.threadId || null;
1245
1283
  runIdRef.current = value.generateCopilotResponse.runId || null;
1246
- const messages2 = (0, import_runtime_client_gql4.convertGqlOutputToMessages)(
1247
- (0, import_runtime_client_gql4.filterAdjacentAgentStateMessages)(value.generateCopilotResponse.messages)
1284
+ setThreadId(threadIdRef.current);
1285
+ setRunId(runIdRef.current);
1286
+ messages2 = (0, import_runtime_client_gql5.convertGqlOutputToMessages)(
1287
+ (0, import_runtime_client_gql5.filterAdjacentAgentStateMessages)(value.generateCopilotResponse.messages)
1248
1288
  );
1249
1289
  if (messages2.length === 0) {
1250
1290
  continue;
@@ -1252,44 +1292,16 @@ function useChat(options) {
1252
1292
  newMessages = [];
1253
1293
  if (((_h = value.generateCopilotResponse.status) == null ? void 0 : _h.__typename) === "FailedResponseStatus" && value.generateCopilotResponse.status.reason === "GUARDRAILS_VALIDATION_FAILED") {
1254
1294
  newMessages = [
1255
- new import_runtime_client_gql4.TextMessage({
1256
- role: import_runtime_client_gql4.MessageRole.Assistant,
1295
+ new import_runtime_client_gql5.TextMessage({
1296
+ role: import_runtime_client_gql5.MessageRole.Assistant,
1257
1297
  content: ((_i = value.generateCopilotResponse.status.details) == null ? void 0 : _i.guardrailsReason) || ""
1258
1298
  })
1259
1299
  ];
1300
+ setMessages([...previousMessages, ...newMessages]);
1301
+ break;
1260
1302
  } else {
1303
+ newMessages = [...messages2];
1261
1304
  for (const message of messages2) {
1262
- newMessages.push(message);
1263
- if (message.isActionExecutionMessage() && message.status.code !== import_runtime_client_gql4.MessageStatusCode.Pending && message.scope === "client" && onFunctionCall) {
1264
- if (!(message.id in actionResults)) {
1265
- if (guardrailsEnabled && value.generateCopilotResponse.status === void 0) {
1266
- break;
1267
- }
1268
- try {
1269
- setMessages([...previousMessages, ...newMessages]);
1270
- const action = actions.find((action2) => action2.name === message.name);
1271
- if (action) {
1272
- followUp = action.followUp;
1273
- }
1274
- const result = yield onFunctionCall({
1275
- messages: previousMessages,
1276
- name: message.name,
1277
- args: message.arguments
1278
- });
1279
- actionResults[message.id] = result;
1280
- } catch (e) {
1281
- actionResults[message.id] = `Failed to execute action ${message.name}`;
1282
- console.error(`Failed to execute action ${message.name}: ${e}`);
1283
- }
1284
- }
1285
- newMessages.push(
1286
- new import_runtime_client_gql4.ResultMessage({
1287
- result: import_runtime_client_gql4.ResultMessage.encodeResult(actionResults[message.id]),
1288
- actionExecutionId: message.id,
1289
- actionName: message.name
1290
- })
1291
- );
1292
- }
1293
1305
  if (message.isAgentStateMessage() && !message.active && !executedCoAgentStateRenders.includes(message.id) && onCoAgentStateRender) {
1294
1306
  if (guardrailsEnabled && value.generateCopilotResponse.status === void 0) {
1295
1307
  break;
@@ -1304,6 +1316,11 @@ function useChat(options) {
1304
1316
  }
1305
1317
  const lastAgentStateMessage = [...messages2].reverse().find((message) => message.isAgentStateMessage());
1306
1318
  if (lastAgentStateMessage) {
1319
+ if (lastAgentStateMessage.state.messages && lastAgentStateMessage.state.messages.length > 0) {
1320
+ syncedMessages = (0, import_runtime_client_gql5.loadMessagesFromJsonRepresentation)(
1321
+ lastAgentStateMessage.state.messages
1322
+ );
1323
+ }
1307
1324
  setCoagentStatesWithRef((prevAgentStates) => __spreadProps(__spreadValues({}, prevAgentStates), {
1308
1325
  [lastAgentStateMessage.agentName]: {
1309
1326
  name: lastAgentStateMessage.agentName,
@@ -1330,14 +1347,96 @@ function useChat(options) {
1330
1347
  setMessages([...previousMessages, ...newMessages]);
1331
1348
  }
1332
1349
  }
1350
+ const finalMessages = constructFinalMessages(syncedMessages, previousMessages, newMessages);
1351
+ let didExecuteAction = false;
1352
+ if (onFunctionCall) {
1353
+ const lastMessages = [];
1354
+ for (let i = finalMessages.length - 1; i >= 0; i--) {
1355
+ const message = finalMessages[i];
1356
+ if (message.isActionExecutionMessage() && message.status.code !== import_runtime_client_gql5.MessageStatusCode.Pending) {
1357
+ lastMessages.unshift(message);
1358
+ } else {
1359
+ break;
1360
+ }
1361
+ }
1362
+ for (const message of lastMessages) {
1363
+ setMessages(finalMessages);
1364
+ const action = actions.find((action2) => action2.name === message.name);
1365
+ if (action) {
1366
+ followUp = action.followUp;
1367
+ let result;
1368
+ try {
1369
+ result = yield Promise.race([
1370
+ onFunctionCall({
1371
+ messages: previousMessages,
1372
+ name: message.name,
1373
+ args: message.arguments
1374
+ }),
1375
+ new Promise(
1376
+ (resolve) => {
1377
+ var _a2;
1378
+ return (_a2 = chatAbortControllerRef.current) == null ? void 0 : _a2.signal.addEventListener(
1379
+ "abort",
1380
+ () => resolve("Operation was aborted by the user")
1381
+ );
1382
+ }
1383
+ ),
1384
+ // if the user stopped generation, we also abort consecutive actions
1385
+ new Promise((resolve) => {
1386
+ var _a2;
1387
+ if ((_a2 = chatAbortControllerRef.current) == null ? void 0 : _a2.signal.aborted) {
1388
+ resolve("Operation was aborted by the user");
1389
+ }
1390
+ })
1391
+ ]);
1392
+ } catch (e) {
1393
+ result = `Failed to execute action ${message.name}`;
1394
+ console.error(`Failed to execute action ${message.name}: ${e}`);
1395
+ }
1396
+ didExecuteAction = true;
1397
+ const messageIndex = finalMessages.findIndex((msg) => msg.id === message.id);
1398
+ finalMessages.splice(
1399
+ messageIndex + 1,
1400
+ 0,
1401
+ new import_runtime_client_gql5.ResultMessage({
1402
+ id: "result-" + message.id,
1403
+ result: import_runtime_client_gql5.ResultMessage.encodeResult(result),
1404
+ actionExecutionId: message.id,
1405
+ actionName: message.name
1406
+ })
1407
+ );
1408
+ }
1409
+ }
1410
+ setMessages(finalMessages);
1411
+ }
1333
1412
  if (
1334
1413
  // if followUp is not explicitly false
1335
- followUp !== false && // if we have client side results
1336
- (Object.values(actionResults).length || // or the last message we received is a result
1337
- newMessages.length && newMessages[newMessages.length - 1].isResultMessage())
1414
+ followUp !== false && // and we executed an action
1415
+ (didExecuteAction || // the last message is a server side result
1416
+ !isAgentRun && finalMessages.length && finalMessages[finalMessages.length - 1].isResultMessage()) && // the user did not stop generation
1417
+ !((_j = chatAbortControllerRef.current) == null ? void 0 : _j.signal.aborted)
1338
1418
  ) {
1339
1419
  yield new Promise((resolve) => setTimeout(resolve, 10));
1340
- return yield runChatCompletionRef.current([...previousMessages, ...newMessages]);
1420
+ return yield runChatCompletionRef.current(finalMessages);
1421
+ } else if ((_k = chatAbortControllerRef.current) == null ? void 0 : _k.signal.aborted) {
1422
+ const repairedMessages = finalMessages.filter((message, actionExecutionIndex) => {
1423
+ if (message.isActionExecutionMessage()) {
1424
+ return finalMessages.find(
1425
+ (msg, resultIndex) => msg.isResultMessage() && msg.actionExecutionId === message.id && resultIndex === actionExecutionIndex + 1
1426
+ );
1427
+ }
1428
+ return true;
1429
+ });
1430
+ const repairedMessageIds = repairedMessages.map((message) => message.id);
1431
+ setMessages(repairedMessages);
1432
+ if ((_l = agentSessionRef.current) == null ? void 0 : _l.nodeName) {
1433
+ setAgentSession({
1434
+ threadId: agentSessionRef.current.threadId,
1435
+ agentName: agentSessionRef.current.agentName,
1436
+ nodeName: "__end__"
1437
+ });
1438
+ }
1439
+ return newMessages.filter((message) => repairedMessageIds.includes(message.id));
1341
1440
  } else {
1342
1441
  return newMessages.slice();
1343
1442
  }
@@ -1394,7 +1493,7 @@ function useChat(options) {
1394
1493
  }), [isLoading, messages, setMessages, runChatCompletionAndHandleFunctionCall]);
1395
1494
  const stop = () => {
1396
1495
  var _a;
1397
- (_a = abortControllerRef.current) == null ? void 0 : _a.abort();
1496
+ (_a = chatAbortControllerRef.current) == null ? void 0 : _a.abort("Stop was called");
1398
1497
  };
1399
1498
  return {
1400
1499
  append,
@@ -1403,6 +1502,23 @@ function useChat(options) {
1403
1502
  runChatCompletion: () => runChatCompletionRef.current(messages)
1404
1503
  };
1405
1504
  }
1505
+ function constructFinalMessages(syncedMessages, previousMessages, newMessages) {
1506
+ const finalMessages = syncedMessages.length > 0 ? [...syncedMessages] : [...previousMessages, ...newMessages];
1507
+ if (syncedMessages.length > 0) {
1508
+ const messagesWithAgentState = [...previousMessages, ...newMessages];
1509
+ let previousMessageId = void 0;
1510
+ for (const message of messagesWithAgentState) {
1511
+ if (message.isAgentStateMessage()) {
1512
+ const index = finalMessages.findIndex((msg) => msg.id === previousMessageId);
1513
+ if (index !== -1) {
1514
+ finalMessages.splice(index + 1, 0, message);
1515
+ }
1516
+ }
1517
+ previousMessageId = message.id;
1518
+ }
1519
+ }
1520
+ return finalMessages;
1521
+ }
1406
1522
 
1407
1523
  // src/hooks/use-copilot-chat.ts
1408
1524
  function useCopilotChat(_a = {}) {
@@ -1423,7 +1539,13 @@ function useCopilotChat(_a = {}) {
1423
1539
  setCoagentStatesWithRef,
1424
1540
  coAgentStateRenders,
1425
1541
  agentSession,
1426
- setAgentSession
1542
+ setAgentSession,
1543
+ agentLock,
1544
+ threadId,
1545
+ setThreadId,
1546
+ runId,
1547
+ setRunId,
1548
+ chatAbortControllerRef
1427
1549
  } = useCopilotContext();
1428
1550
  const { messages, setMessages } = useCopilotMessagesContext();
1429
1551
  const latestGetContextString = useUpdatedRef(getContextString);
@@ -1436,9 +1558,9 @@ function useCopilotChat(_a = {}) {
1436
1558
  const makeSystemMessageCallback = (0, import_react12.useCallback)(() => {
1437
1559
  const systemMessageMaker = makeSystemMessage2 || defaultSystemMessage;
1438
1560
  const contextString = latestGetContextString.current([], defaultCopilotContextCategories);
1439
- return new import_runtime_client_gql5.TextMessage({
1561
+ return new import_runtime_client_gql6.TextMessage({
1440
1562
  content: systemMessageMaker(contextString, chatInstructions),
1441
- role: import_runtime_client_gql5.Role.System
1563
+ role: import_runtime_client_gql6.Role.System
1442
1564
  });
1443
1565
  }, [getContextString, makeSystemMessage2, chatInstructions]);
1444
1566
  const onCoAgentStateRender = useAsyncCallback(
@@ -1473,7 +1595,12 @@ function useCopilotChat(_a = {}) {
1473
1595
  coagentStatesRef,
1474
1596
  setCoagentStatesWithRef,
1475
1597
  agentSession,
1476
- setAgentSession
1598
+ setAgentSession,
1599
+ threadId,
1600
+ setThreadId,
1601
+ runId,
1602
+ setRunId,
1603
+ chatAbortControllerRef
1477
1604
  }));
1478
1605
  const latestAppend = useUpdatedRef(append);
1479
1606
  const latestAppendFunc = useAsyncCallback(
@@ -1508,12 +1635,38 @@ function useCopilotChat(_a = {}) {
1508
1635
  const latestRunChatCompletionFunc = useAsyncCallback(() => __async(this, null, function* () {
1509
1636
  return yield latestRunChatCompletion.current();
1510
1637
  }), [latestRunChatCompletion]);
1638
+ const reset = (0, import_react12.useCallback)(() => {
1639
+ latestStopFunc();
1640
+ setMessages([]);
1641
+ setThreadId(null);
1642
+ setRunId(null);
1643
+ setCoagentStatesWithRef({});
1644
+ let initialAgentSession = null;
1645
+ if (agentLock) {
1646
+ initialAgentSession = {
1647
+ agentName: agentLock
1648
+ };
1649
+ }
1650
+ setAgentSession(initialAgentSession);
1651
+ }, [
1652
+ latestStopFunc,
1653
+ setMessages,
1654
+ setThreadId,
1655
+ setCoagentStatesWithRef,
1656
+ setAgentSession,
1657
+ agentLock
1658
+ ]);
1659
+ const latestReset = useUpdatedRef(reset);
1660
+ const latestResetFunc = (0, import_react12.useCallback)(() => {
1661
+ return latestReset.current();
1662
+ }, [latestReset]);
1511
1663
  return {
1512
1664
  visibleMessages: messages,
1513
1665
  appendMessage: latestAppendFunc,
1514
1666
  setMessages: latestSetMessagesFunc,
1515
1667
  reloadMessages: latestReloadFunc,
1516
1668
  stopGeneration: latestStopFunc,
1669
+ reset: latestResetFunc,
1517
1670
  deleteMessage: latestDeleteFunc,
1518
1671
  runChatCompletion: latestRunChatCompletionFunc,
1519
1672
  isLoading
@@ -1551,14 +1704,18 @@ ${additionalInstructions}` : "");
1551
1704
  }
1552
1705
 
1553
1706
  // src/hooks/use-copilot-action.ts
1554
- var import_shared6 = require("@copilotkit/shared");
1707
+ var import_shared7 = require("@copilotkit/shared");
1555
1708
  var import_react13 = require("react");
1556
1709
  function useCopilotAction(action, dependencies) {
1557
1710
  const { setAction, removeAction, actions, chatComponentsCache } = useCopilotContext();
1558
- const idRef = (0, import_react13.useRef)((0, import_shared6.randomId)());
1711
+ const idRef = (0, import_react13.useRef)((0, import_shared7.randomId)());
1559
1712
  const renderAndWaitRef = (0, import_react13.useRef)(null);
1560
1713
  action = __spreadValues({}, action);
1561
- if (action.renderAndWait || action.renderAndWaitForResponse) {
1714
+ if (
1715
+ // renderAndWaitForResponse is not available for catch all actions
1716
+ isFrontendAction(action) && // check if renderAndWaitForResponse is set
1717
+ (action.renderAndWait || action.renderAndWaitForResponse)
1718
+ ) {
1562
1719
  const renderAndWait = action.renderAndWait || action.renderAndWaitForResponse;
1563
1720
  action.renderAndWait = void 0;
1564
1721
  action.renderAndWaitForResponse = void 0;
@@ -1596,7 +1753,9 @@ function useCopilotAction(action, dependencies) {
1596
1753
  }
1597
1754
  if (dependencies === void 0) {
1598
1755
  if (actions[idRef.current]) {
1599
- actions[idRef.current].handler = action.handler;
1756
+ if (isFrontendAction(action)) {
1757
+ actions[idRef.current].handler = action.handler;
1758
+ }
1600
1759
  if (typeof action.render === "function") {
1601
1760
  if (chatComponentsCache.current !== null) {
1602
1761
  chatComponentsCache.current.actions[action.name] = action.render;
@@ -1615,23 +1774,26 @@ function useCopilotAction(action, dependencies) {
1615
1774
  }, [
1616
1775
  setAction,
1617
1776
  removeAction,
1618
- action.description,
1777
+ isFrontendAction(action) ? action.description : void 0,
1619
1778
  action.name,
1620
- action.disabled,
1621
- action.available,
1779
+ isFrontendAction(action) ? action.disabled : void 0,
1780
+ isFrontendAction(action) ? action.available : void 0,
1622
1781
  // This should be faster than deep equality checking
1623
1782
  // In addition, all major JS engines guarantee the order of object keys
1624
- JSON.stringify(action.parameters),
1783
+ JSON.stringify(isFrontendAction(action) ? action.parameters : []),
1625
1784
  // include render only if it's a string
1626
1785
  typeof action.render === "string" ? action.render : void 0,
1627
1786
  // dependencies set by the developer
1628
1787
  ...dependencies || []
1629
1788
  ]);
1630
1789
  }
1790
+ function isFrontendAction(action) {
1791
+ return action.name !== "*";
1792
+ }
1631
1793
 
1632
1794
  // src/hooks/use-coagent-state-render.ts
1633
1795
  var import_react14 = require("react");
1634
- var import_shared7 = require("@copilotkit/shared");
1796
+ var import_shared8 = require("@copilotkit/shared");
1635
1797
  function useCoAgentStateRender(action, dependencies) {
1636
1798
  const {
1637
1799
  setCoAgentStateRender,
@@ -1639,7 +1801,7 @@ function useCoAgentStateRender(action, dependencies) {
1639
1801
  coAgentStateRenders,
1640
1802
  chatComponentsCache
1641
1803
  } = (0, import_react14.useContext)(CopilotContext);
1642
- const idRef = (0, import_react14.useRef)((0, import_shared7.randomId)());
1804
+ const idRef = (0, import_react14.useRef)((0, import_shared8.randomId)());
1643
1805
  const key = `${action.name}-${action.nodeName || "global"}`;
1644
1806
  if (dependencies === void 0) {
1645
1807
  if (coAgentStateRenders[idRef.current]) {
@@ -1752,7 +1914,11 @@ function useCoAgent(options) {
1752
1914
  } else if (coagentStates[name] === void 0) {
1753
1915
  setState(options.initialState === void 0 ? {} : options.initialState);
1754
1916
  }
1755
- }, [isExternalStateManagement(options) ? JSON.stringify(options.state) : void 0]);
1917
+ }, [
1918
+ isExternalStateManagement(options) ? JSON.stringify(options.state) : void 0,
1919
+ // reset initialstate on reset
1920
+ coagentStates[name] === void 0
1921
+ ]);
1756
1922
  const runAgentCallback = useAsyncCallback(
1757
1923
  (hint) => __async(this, null, function* () {
1758
1924
  yield runAgent(name, context, appendMessage, runChatCompletion, hint);
@@ -1781,6 +1947,17 @@ function stopAgent(name, context) {
1781
1947
  const { agentSession, setAgentSession } = context;
1782
1948
  if (agentSession && agentSession.agentName === name) {
1783
1949
  setAgentSession(null);
1950
+ context.setCoagentStates((prevAgentStates) => {
1951
+ return __spreadProps(__spreadValues({}, prevAgentStates), {
1952
+ [name]: __spreadProps(__spreadValues({}, prevAgentStates[name]), {
1953
+ running: false,
1954
+ active: false,
1955
+ threadId: void 0,
1956
+ nodeName: void 0,
1957
+ runId: void 0
1958
+ })
1959
+ });
1960
+ });
1784
1961
  } else {
1785
1962
  console.warn(`No agent session found for ${name}`);
1786
1963
  }
@@ -1816,8 +1993,7 @@ function runAgent(name, context, appendMessage, runChatCompletion, hint) {
1816
1993
  }
1817
1994
 
1818
1995
  // src/lib/copilot-task.ts
1819
- var import_runtime_client_gql6 = require("@copilotkit/runtime-client-gql");
1820
- var import_shared8 = require("@copilotkit/shared");
1996
+ var import_runtime_client_gql7 = require("@copilotkit/runtime-client-gql");
1821
1997
  var CopilotTask = class {
1822
1998
  constructor(config) {
1823
1999
  this.instructions = config.instructions;
@@ -1844,12 +2020,12 @@ var CopilotTask = class {
1844
2020
  if (this.includeCopilotReadable) {
1845
2021
  contextString += context.getContextString([], defaultCopilotContextCategories);
1846
2022
  }
1847
- const systemMessage = new import_runtime_client_gql6.TextMessage({
2023
+ const systemMessage = new import_runtime_client_gql7.TextMessage({
1848
2024
  content: taskSystemMessage(contextString, this.instructions),
1849
- role: import_runtime_client_gql6.Role.System
2025
+ role: import_runtime_client_gql7.Role.System
1850
2026
  });
1851
2027
  const messages = [systemMessage];
1852
- const runtimeClient = new import_runtime_client_gql6.CopilotRuntimeClient({
2028
+ const runtimeClient = new import_runtime_client_gql7.CopilotRuntimeClient({
1853
2029
  url: context.copilotApiConfig.chatApiEndpoint,
1854
2030
  publicApiKey: context.copilotApiConfig.publicApiKey,
1855
2031
  headers: context.copilotApiConfig.headers,
@@ -1858,16 +2034,12 @@ var CopilotTask = class {
1858
2034
  const response = yield runtimeClient.generateCopilotResponse({
1859
2035
  data: {
1860
2036
  frontend: {
1861
- actions: Object.values(actions).map((action) => ({
1862
- name: action.name,
1863
- description: action.description || "",
1864
- jsonSchema: JSON.stringify((0, import_shared8.actionParametersToJsonSchema)(action.parameters || []))
1865
- })),
2037
+ actions: processActionsForRuntimeRequest(Object.values(actions)),
1866
2038
  url: window.location.href
1867
2039
  },
1868
- messages: (0, import_runtime_client_gql6.convertMessagesToGqlInput)((0, import_runtime_client_gql6.filterAgentStateMessages)(messages)),
2040
+ messages: (0, import_runtime_client_gql7.convertMessagesToGqlInput)((0, import_runtime_client_gql7.filterAgentStateMessages)(messages)),
1869
2041
  metadata: {
1870
- requestType: import_runtime_client_gql6.CopilotRequestType.Task
2042
+ requestType: import_runtime_client_gql7.CopilotRequestType.Task
1871
2043
  },
1872
2044
  forwardedParameters: {
1873
2045
  toolChoice: "required"
@@ -1876,7 +2048,7 @@ var CopilotTask = class {
1876
2048
  properties: context.copilotApiConfig.properties
1877
2049
  }).toPromise();
1878
2050
  const functionCallHandler = context.getFunctionCallHandler(actions);
1879
- const functionCalls = (0, import_runtime_client_gql6.convertGqlOutputToMessages)(
2051
+ const functionCalls = (0, import_runtime_client_gql7.convertGqlOutputToMessages)(
1880
2052
  ((_b = (_a = response.data) == null ? void 0 : _a.generateCopilotResponse) == null ? void 0 : _b.messages) || []
1881
2053
  ).filter((m) => m.isActionExecutionMessage());
1882
2054
  for (const functionCall of functionCalls) {
@@ -1922,7 +2094,10 @@ ${instructions}
1922
2094
  CopilotTask,
1923
2095
  defaultCopilotContextCategories,
1924
2096
  extract,
2097
+ runAgent,
1925
2098
  shouldShowDevConsole,
2099
+ startAgent,
2100
+ stopAgent,
1926
2101
  useCoAgent,
1927
2102
  useCoAgentStateRender,
1928
2103
  useCopilotAction,