@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
@@ -1,20 +1,23 @@
1
1
  import "../chunk-L34MHAXR.mjs";
2
2
  import {
3
+ runAgent,
4
+ startAgent,
5
+ stopAgent,
3
6
  useCoAgent
4
- } from "../chunk-FSC4A3JN.mjs";
7
+ } from "../chunk-42N5VKIX.mjs";
5
8
  import {
6
9
  useCopilotAction
7
- } from "../chunk-YUY5ZAST.mjs";
10
+ } from "../chunk-ALR5W5JK.mjs";
8
11
  import {
9
12
  useCopilotChat
10
- } from "../chunk-6EMLM6WX.mjs";
13
+ } from "../chunk-BT6WK2JZ.mjs";
11
14
  import {
12
15
  useCopilotReadable
13
- } from "../chunk-AG7FH7OD.mjs";
16
+ } from "../chunk-5FYKUKG3.mjs";
14
17
  import {
15
18
  useMakeCopilotDocumentReadable
16
- } from "../chunk-UOVONDR6.mjs";
17
- import "../chunk-IVYL7JRC.mjs";
19
+ } from "../chunk-V3PFWGIY.mjs";
20
+ import "../chunk-VMP6JWBB.mjs";
18
21
  import "../chunk-QCUP6HLK.mjs";
19
22
  import "../chunk-MLAS4QUR.mjs";
20
23
  import "../chunk-XXR4QFAQ.mjs";
@@ -22,7 +25,8 @@ import "../chunk-5FHSUKQL.mjs";
22
25
  import "../chunk-6U3UH3KO.mjs";
23
26
  import "../chunk-YPSGKPDA.mjs";
24
27
  import "../chunk-DCTJZ742.mjs";
25
- import "../chunk-NTLCOVE5.mjs";
28
+ import "../chunk-QTDCEDOC.mjs";
29
+ import "../chunk-XERJQUHA.mjs";
26
30
  import {
27
31
  useCopilotRuntimeClient
28
32
  } from "../chunk-7LRDVJH5.mjs";
@@ -30,10 +34,13 @@ import "../chunk-SFPANIOY.mjs";
30
34
  import "../chunk-O7ARI5CV.mjs";
31
35
  import {
32
36
  useCoAgentStateRender
33
- } from "../chunk-X6ZF5WAX.mjs";
34
- import "../chunk-XQFVXX6R.mjs";
37
+ } from "../chunk-35EN6BG4.mjs";
38
+ import "../chunk-TQN3EZWQ.mjs";
35
39
  import "../chunk-SKC7AJIV.mjs";
36
40
  export {
41
+ runAgent,
42
+ startAgent,
43
+ stopAgent,
37
44
  useCoAgent,
38
45
  useCoAgentStateRender,
39
46
  useCopilotAction,
@@ -68,6 +68,26 @@ type UseChatOptions = {
68
68
  * setState-powered method to update the agent session
69
69
  */
70
70
  setAgentSession: React.Dispatch<React.SetStateAction<AgentSession | null>>;
71
+ /**
72
+ * The current thread ID.
73
+ */
74
+ threadId: string | null;
75
+ /**
76
+ * set the current thread ID
77
+ */
78
+ setThreadId: (threadId: string | null) => void;
79
+ /**
80
+ * The current run ID.
81
+ */
82
+ runId: string | null;
83
+ /**
84
+ * set the current run ID
85
+ */
86
+ setRunId: (runId: string | null) => void;
87
+ /**
88
+ * The global chat abort controller.
89
+ */
90
+ chatAbortControllerRef: React.MutableRefObject<AbortController | null>;
71
91
  };
72
92
  type UseChatHelpers = {
73
93
  /**
@@ -61,8 +61,33 @@ __export(use_chat_exports, {
61
61
  });
62
62
  module.exports = __toCommonJS(use_chat_exports);
63
63
  var import_react4 = require("react");
64
+ var import_shared2 = require("@copilotkit/shared");
65
+ var import_runtime_client_gql3 = require("@copilotkit/runtime-client-gql");
66
+
67
+ // src/types/frontend-action.ts
68
+ var import_runtime_client_gql = require("@copilotkit/runtime-client-gql");
64
69
  var import_shared = require("@copilotkit/shared");
65
- var import_runtime_client_gql2 = require("@copilotkit/runtime-client-gql");
70
+ function processActionsForRuntimeRequest(actions) {
71
+ const filteredActions = actions.filter(
72
+ (action) => action.available !== import_runtime_client_gql.ActionInputAvailability.Disabled && action.disabled !== true && action.name !== "*"
73
+ ).map((action) => {
74
+ let available = import_runtime_client_gql.ActionInputAvailability.Enabled;
75
+ if (action.disabled) {
76
+ available = import_runtime_client_gql.ActionInputAvailability.Disabled;
77
+ } else if (action.available === "disabled") {
78
+ available = import_runtime_client_gql.ActionInputAvailability.Disabled;
79
+ } else if (action.available === "remote") {
80
+ available = import_runtime_client_gql.ActionInputAvailability.Remote;
81
+ }
82
+ return {
83
+ name: action.name,
84
+ description: action.description || "",
85
+ jsonSchema: JSON.stringify((0, import_shared.actionParametersToJsonSchema)(action.parameters || [])),
86
+ available
87
+ };
88
+ });
89
+ return filteredActions;
90
+ }
66
91
 
67
92
  // src/components/toast/toast-provider.tsx
68
93
  var import_react2 = require("react");
@@ -192,13 +217,13 @@ function useToast() {
192
217
  }
193
218
 
194
219
  // src/hooks/use-copilot-runtime-client.ts
195
- var import_runtime_client_gql = require("@copilotkit/runtime-client-gql");
220
+ var import_runtime_client_gql2 = require("@copilotkit/runtime-client-gql");
196
221
  var import_react3 = require("react");
197
222
  var useCopilotRuntimeClient = (options) => {
198
223
  const { addGraphQLErrorsToast } = useToast();
199
224
  const addErrorToast = useErrorToast();
200
225
  const runtimeClient = (0, import_react3.useMemo)(() => {
201
- return new import_runtime_client_gql.CopilotRuntimeClient(__spreadProps(__spreadValues({}, options), {
226
+ return new import_runtime_client_gql2.CopilotRuntimeClient(__spreadProps(__spreadValues({}, options), {
202
227
  handleGQLErrors: (error) => {
203
228
  if (error.graphQLErrors.length) {
204
229
  addGraphQLErrorsToast(error.graphQLErrors);
@@ -227,17 +252,23 @@ function useChat(options) {
227
252
  setCoagentStatesWithRef,
228
253
  coagentStatesRef,
229
254
  agentSession,
230
- setAgentSession
255
+ setAgentSession,
256
+ threadId,
257
+ setThreadId,
258
+ runId,
259
+ setRunId,
260
+ chatAbortControllerRef
231
261
  } = options;
232
- const abortControllerRef = (0, import_react4.useRef)();
233
- const threadIdRef = (0, import_react4.useRef)(null);
234
- const runIdRef = (0, import_react4.useRef)(null);
235
262
  const { addGraphQLErrorsToast } = useToast();
236
263
  const runChatCompletionRef = (0, import_react4.useRef)();
237
264
  const agentSessionRef = (0, import_react4.useRef)(agentSession);
238
265
  agentSessionRef.current = agentSession;
266
+ const threadIdRef = (0, import_react4.useRef)(threadId);
267
+ threadIdRef.current = threadId;
268
+ const runIdRef = (0, import_react4.useRef)(runId);
269
+ runIdRef.current = runId;
239
270
  const publicApiKey = copilotConfig.publicApiKey;
240
- const headers = __spreadValues(__spreadValues({}, copilotConfig.headers || {}), publicApiKey ? { [import_shared.COPILOT_CLOUD_PUBLIC_API_KEY_HEADER]: publicApiKey } : {});
271
+ const headers = __spreadValues(__spreadValues({}, copilotConfig.headers || {}), publicApiKey ? { [import_shared2.COPILOT_CLOUD_PUBLIC_API_KEY_HEADER]: publicApiKey } : {});
241
272
  const runtimeClient = useCopilotRuntimeClient({
242
273
  url: copilotConfig.chatApiEndpoint,
243
274
  publicApiKey: copilotConfig.publicApiKey,
@@ -246,48 +277,29 @@ function useChat(options) {
246
277
  });
247
278
  const runChatCompletion = useAsyncCallback(
248
279
  (previousMessages) => __async(this, null, function* () {
249
- var _a, _b, _c, _d, _e, _f, _g, _h, _i;
280
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
250
281
  setIsLoading(true);
251
282
  let newMessages = [
252
- new import_runtime_client_gql2.TextMessage({
283
+ new import_runtime_client_gql3.TextMessage({
253
284
  content: "",
254
- role: import_runtime_client_gql2.Role.Assistant
285
+ role: import_runtime_client_gql3.Role.Assistant
255
286
  })
256
287
  ];
257
- const abortController = new AbortController();
258
- abortControllerRef.current = abortController;
288
+ chatAbortControllerRef.current = new AbortController();
259
289
  setMessages([...previousMessages, ...newMessages]);
260
290
  const systemMessage = makeSystemMessageCallback();
261
291
  const messagesWithContext = [systemMessage, ...initialMessages || [], ...previousMessages];
292
+ const isAgentRun = agentSessionRef.current !== null;
262
293
  const stream = runtimeClient.asStream(
263
294
  runtimeClient.generateCopilotResponse({
264
295
  data: __spreadProps(__spreadValues(__spreadProps(__spreadValues({
265
296
  frontend: {
266
- actions: actions.filter(
267
- (action) => action.available !== import_runtime_client_gql2.ActionInputAvailability.Disabled || !action.disabled
268
- ).map((action) => {
269
- let available = import_runtime_client_gql2.ActionInputAvailability.Enabled;
270
- if (action.disabled) {
271
- available = import_runtime_client_gql2.ActionInputAvailability.Disabled;
272
- } else if (action.available === "disabled") {
273
- available = import_runtime_client_gql2.ActionInputAvailability.Disabled;
274
- } else if (action.available === "remote") {
275
- available = import_runtime_client_gql2.ActionInputAvailability.Remote;
276
- }
277
- return {
278
- name: action.name,
279
- description: action.description || "",
280
- jsonSchema: JSON.stringify(
281
- (0, import_shared.actionParametersToJsonSchema)(action.parameters || [])
282
- ),
283
- available
284
- };
285
- }),
297
+ actions: processActionsForRuntimeRequest(actions),
286
298
  url: window.location.href
287
299
  },
288
300
  threadId: threadIdRef.current,
289
301
  runId: runIdRef.current,
290
- messages: (0, import_runtime_client_gql2.convertMessagesToGqlInput)((0, import_runtime_client_gql2.filterAgentStateMessages)(messagesWithContext))
302
+ messages: (0, import_runtime_client_gql3.convertMessagesToGqlInput)((0, import_runtime_client_gql3.filterAgentStateMessages)(messagesWithContext))
291
303
  }, copilotConfig.cloud ? {
292
304
  cloud: __spreadValues({}, ((_c = (_b = (_a = copilotConfig.cloud.guardrails) == null ? void 0 : _a.input) == null ? void 0 : _b.restrictToTopic) == null ? void 0 : _c.enabled) ? {
293
305
  guardrails: {
@@ -299,7 +311,7 @@ function useChat(options) {
299
311
  } : {})
300
312
  } : {}), {
301
313
  metadata: {
302
- requestType: import_runtime_client_gql2.CopilotRequestType.Chat
314
+ requestType: import_runtime_client_gql3.CopilotRequestType.Chat
303
315
  }
304
316
  }), agentSessionRef.current ? {
305
317
  agentSession: agentSessionRef.current
@@ -310,14 +322,15 @@ function useChat(options) {
310
322
  }))
311
323
  }),
312
324
  properties: copilotConfig.properties,
313
- signal: (_d = abortControllerRef.current) == null ? void 0 : _d.signal
325
+ signal: (_d = chatAbortControllerRef.current) == null ? void 0 : _d.signal
314
326
  })
315
327
  );
316
328
  const guardrailsEnabled = ((_g = (_f = (_e = copilotConfig.cloud) == null ? void 0 : _e.guardrails) == null ? void 0 : _f.input) == null ? void 0 : _g.restrictToTopic.enabled) || false;
317
329
  const reader = stream.getReader();
318
- let actionResults = {};
319
330
  let executedCoAgentStateRenders = [];
320
331
  let followUp = void 0;
332
+ let messages2 = [];
333
+ let syncedMessages = [];
321
334
  try {
322
335
  while (true) {
323
336
  let done, value;
@@ -329,6 +342,9 @@ function useChat(options) {
329
342
  break;
330
343
  }
331
344
  if (done) {
345
+ if (chatAbortControllerRef.current.signal.aborted) {
346
+ return [];
347
+ }
332
348
  break;
333
349
  }
334
350
  if (!(value == null ? void 0 : value.generateCopilotResponse)) {
@@ -336,8 +352,10 @@ function useChat(options) {
336
352
  }
337
353
  threadIdRef.current = value.generateCopilotResponse.threadId || null;
338
354
  runIdRef.current = value.generateCopilotResponse.runId || null;
339
- const messages2 = (0, import_runtime_client_gql2.convertGqlOutputToMessages)(
340
- (0, import_runtime_client_gql2.filterAdjacentAgentStateMessages)(value.generateCopilotResponse.messages)
355
+ setThreadId(threadIdRef.current);
356
+ setRunId(runIdRef.current);
357
+ messages2 = (0, import_runtime_client_gql3.convertGqlOutputToMessages)(
358
+ (0, import_runtime_client_gql3.filterAdjacentAgentStateMessages)(value.generateCopilotResponse.messages)
341
359
  );
342
360
  if (messages2.length === 0) {
343
361
  continue;
@@ -345,44 +363,16 @@ function useChat(options) {
345
363
  newMessages = [];
346
364
  if (((_h = value.generateCopilotResponse.status) == null ? void 0 : _h.__typename) === "FailedResponseStatus" && value.generateCopilotResponse.status.reason === "GUARDRAILS_VALIDATION_FAILED") {
347
365
  newMessages = [
348
- new import_runtime_client_gql2.TextMessage({
349
- role: import_runtime_client_gql2.MessageRole.Assistant,
366
+ new import_runtime_client_gql3.TextMessage({
367
+ role: import_runtime_client_gql3.MessageRole.Assistant,
350
368
  content: ((_i = value.generateCopilotResponse.status.details) == null ? void 0 : _i.guardrailsReason) || ""
351
369
  })
352
370
  ];
371
+ setMessages([...previousMessages, ...newMessages]);
372
+ break;
353
373
  } else {
374
+ newMessages = [...messages2];
354
375
  for (const message of messages2) {
355
- newMessages.push(message);
356
- if (message.isActionExecutionMessage() && message.status.code !== import_runtime_client_gql2.MessageStatusCode.Pending && message.scope === "client" && onFunctionCall) {
357
- if (!(message.id in actionResults)) {
358
- if (guardrailsEnabled && value.generateCopilotResponse.status === void 0) {
359
- break;
360
- }
361
- try {
362
- setMessages([...previousMessages, ...newMessages]);
363
- const action = actions.find((action2) => action2.name === message.name);
364
- if (action) {
365
- followUp = action.followUp;
366
- }
367
- const result = yield onFunctionCall({
368
- messages: previousMessages,
369
- name: message.name,
370
- args: message.arguments
371
- });
372
- actionResults[message.id] = result;
373
- } catch (e) {
374
- actionResults[message.id] = `Failed to execute action ${message.name}`;
375
- console.error(`Failed to execute action ${message.name}: ${e}`);
376
- }
377
- }
378
- newMessages.push(
379
- new import_runtime_client_gql2.ResultMessage({
380
- result: import_runtime_client_gql2.ResultMessage.encodeResult(actionResults[message.id]),
381
- actionExecutionId: message.id,
382
- actionName: message.name
383
- })
384
- );
385
- }
386
376
  if (message.isAgentStateMessage() && !message.active && !executedCoAgentStateRenders.includes(message.id) && onCoAgentStateRender) {
387
377
  if (guardrailsEnabled && value.generateCopilotResponse.status === void 0) {
388
378
  break;
@@ -397,6 +387,11 @@ function useChat(options) {
397
387
  }
398
388
  const lastAgentStateMessage = [...messages2].reverse().find((message) => message.isAgentStateMessage());
399
389
  if (lastAgentStateMessage) {
390
+ if (lastAgentStateMessage.state.messages && lastAgentStateMessage.state.messages.length > 0) {
391
+ syncedMessages = (0, import_runtime_client_gql3.loadMessagesFromJsonRepresentation)(
392
+ lastAgentStateMessage.state.messages
393
+ );
394
+ }
400
395
  setCoagentStatesWithRef((prevAgentStates) => __spreadProps(__spreadValues({}, prevAgentStates), {
401
396
  [lastAgentStateMessage.agentName]: {
402
397
  name: lastAgentStateMessage.agentName,
@@ -423,14 +418,96 @@ function useChat(options) {
423
418
  setMessages([...previousMessages, ...newMessages]);
424
419
  }
425
420
  }
421
+ const finalMessages = constructFinalMessages(syncedMessages, previousMessages, newMessages);
422
+ let didExecuteAction = false;
423
+ if (onFunctionCall) {
424
+ const lastMessages = [];
425
+ for (let i = finalMessages.length - 1; i >= 0; i--) {
426
+ const message = finalMessages[i];
427
+ if (message.isActionExecutionMessage() && message.status.code !== import_runtime_client_gql3.MessageStatusCode.Pending) {
428
+ lastMessages.unshift(message);
429
+ } else {
430
+ break;
431
+ }
432
+ }
433
+ for (const message of lastMessages) {
434
+ setMessages(finalMessages);
435
+ const action = actions.find((action2) => action2.name === message.name);
436
+ if (action) {
437
+ followUp = action.followUp;
438
+ let result;
439
+ try {
440
+ result = yield Promise.race([
441
+ onFunctionCall({
442
+ messages: previousMessages,
443
+ name: message.name,
444
+ args: message.arguments
445
+ }),
446
+ new Promise(
447
+ (resolve) => {
448
+ var _a2;
449
+ return (_a2 = chatAbortControllerRef.current) == null ? void 0 : _a2.signal.addEventListener(
450
+ "abort",
451
+ () => resolve("Operation was aborted by the user")
452
+ );
453
+ }
454
+ ),
455
+ // if the user stopped generation, we also abort consecutive actions
456
+ new Promise((resolve) => {
457
+ var _a2;
458
+ if ((_a2 = chatAbortControllerRef.current) == null ? void 0 : _a2.signal.aborted) {
459
+ resolve("Operation was aborted by the user");
460
+ }
461
+ })
462
+ ]);
463
+ } catch (e) {
464
+ result = `Failed to execute action ${message.name}`;
465
+ console.error(`Failed to execute action ${message.name}: ${e}`);
466
+ }
467
+ didExecuteAction = true;
468
+ const messageIndex = finalMessages.findIndex((msg) => msg.id === message.id);
469
+ finalMessages.splice(
470
+ messageIndex + 1,
471
+ 0,
472
+ new import_runtime_client_gql3.ResultMessage({
473
+ id: "result-" + message.id,
474
+ result: import_runtime_client_gql3.ResultMessage.encodeResult(result),
475
+ actionExecutionId: message.id,
476
+ actionName: message.name
477
+ })
478
+ );
479
+ }
480
+ }
481
+ setMessages(finalMessages);
482
+ }
426
483
  if (
427
484
  // if followUp is not explicitly false
428
- followUp !== false && // if we have client side results
429
- (Object.values(actionResults).length || // or the last message we received is a result
430
- newMessages.length && newMessages[newMessages.length - 1].isResultMessage())
485
+ followUp !== false && // and we executed an action
486
+ (didExecuteAction || // the last message is a server side result
487
+ !isAgentRun && finalMessages.length && finalMessages[finalMessages.length - 1].isResultMessage()) && // the user did not stop generation
488
+ !((_j = chatAbortControllerRef.current) == null ? void 0 : _j.signal.aborted)
431
489
  ) {
432
490
  yield new Promise((resolve) => setTimeout(resolve, 10));
433
- return yield runChatCompletionRef.current([...previousMessages, ...newMessages]);
491
+ return yield runChatCompletionRef.current(finalMessages);
492
+ } else if ((_k = chatAbortControllerRef.current) == null ? void 0 : _k.signal.aborted) {
493
+ const repairedMessages = finalMessages.filter((message, actionExecutionIndex) => {
494
+ if (message.isActionExecutionMessage()) {
495
+ return finalMessages.find(
496
+ (msg, resultIndex) => msg.isResultMessage() && msg.actionExecutionId === message.id && resultIndex === actionExecutionIndex + 1
497
+ );
498
+ }
499
+ return true;
500
+ });
501
+ const repairedMessageIds = repairedMessages.map((message) => message.id);
502
+ setMessages(repairedMessages);
503
+ if ((_l = agentSessionRef.current) == null ? void 0 : _l.nodeName) {
504
+ setAgentSession({
505
+ threadId: agentSessionRef.current.threadId,
506
+ agentName: agentSessionRef.current.agentName,
507
+ nodeName: "__end__"
508
+ });
509
+ }
510
+ return newMessages.filter((message) => repairedMessageIds.includes(message.id));
434
511
  } else {
435
512
  return newMessages.slice();
436
513
  }
@@ -487,7 +564,7 @@ function useChat(options) {
487
564
  }), [isLoading, messages, setMessages, runChatCompletionAndHandleFunctionCall]);
488
565
  const stop = () => {
489
566
  var _a;
490
- (_a = abortControllerRef.current) == null ? void 0 : _a.abort();
567
+ (_a = chatAbortControllerRef.current) == null ? void 0 : _a.abort("Stop was called");
491
568
  };
492
569
  return {
493
570
  append,
@@ -496,6 +573,23 @@ function useChat(options) {
496
573
  runChatCompletion: () => runChatCompletionRef.current(messages)
497
574
  };
498
575
  }
576
+ function constructFinalMessages(syncedMessages, previousMessages, newMessages) {
577
+ const finalMessages = syncedMessages.length > 0 ? [...syncedMessages] : [...previousMessages, ...newMessages];
578
+ if (syncedMessages.length > 0) {
579
+ const messagesWithAgentState = [...previousMessages, ...newMessages];
580
+ let previousMessageId = void 0;
581
+ for (const message of messagesWithAgentState) {
582
+ if (message.isAgentStateMessage()) {
583
+ const index = finalMessages.findIndex((msg) => msg.id === previousMessageId);
584
+ if (index !== -1) {
585
+ finalMessages.splice(index + 1, 0, message);
586
+ }
587
+ }
588
+ previousMessageId = message.id;
589
+ }
590
+ }
591
+ return finalMessages;
592
+ }
499
593
  // Annotate the CommonJS export names for ESM import in node:
500
594
  0 && (module.exports = {
501
595
  useChat