@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
@@ -139,7 +139,15 @@ var emptyCopilotContext = {
139
139
  },
140
140
  agentSession: null,
141
141
  setAgentSession: () => {
142
- }
142
+ },
143
+ agentLock: null,
144
+ threadId: null,
145
+ setThreadId: () => {
146
+ },
147
+ runId: null,
148
+ setRunId: () => {
149
+ },
150
+ chatAbortControllerRef: { current: null }
143
151
  };
144
152
  var CopilotContext = import_react.default.createContext(emptyCopilotContext);
145
153
  function useCopilotContext() {
@@ -155,12 +163,37 @@ function returnAndThrowInDebug(value) {
155
163
  }
156
164
 
157
165
  // src/hooks/use-copilot-chat.ts
158
- var import_runtime_client_gql3 = require("@copilotkit/runtime-client-gql");
166
+ var import_runtime_client_gql4 = require("@copilotkit/runtime-client-gql");
159
167
 
160
168
  // src/hooks/use-chat.ts
161
169
  var import_react5 = require("react");
170
+ var import_shared2 = require("@copilotkit/shared");
171
+ var import_runtime_client_gql3 = require("@copilotkit/runtime-client-gql");
172
+
173
+ // src/types/frontend-action.ts
174
+ var import_runtime_client_gql = require("@copilotkit/runtime-client-gql");
162
175
  var import_shared = require("@copilotkit/shared");
163
- var import_runtime_client_gql2 = require("@copilotkit/runtime-client-gql");
176
+ function processActionsForRuntimeRequest(actions) {
177
+ const filteredActions = actions.filter(
178
+ (action) => action.available !== import_runtime_client_gql.ActionInputAvailability.Disabled && action.disabled !== true && action.name !== "*"
179
+ ).map((action) => {
180
+ let available = import_runtime_client_gql.ActionInputAvailability.Enabled;
181
+ if (action.disabled) {
182
+ available = import_runtime_client_gql.ActionInputAvailability.Disabled;
183
+ } else if (action.available === "disabled") {
184
+ available = import_runtime_client_gql.ActionInputAvailability.Disabled;
185
+ } else if (action.available === "remote") {
186
+ available = import_runtime_client_gql.ActionInputAvailability.Remote;
187
+ }
188
+ return {
189
+ name: action.name,
190
+ description: action.description || "",
191
+ jsonSchema: JSON.stringify((0, import_shared.actionParametersToJsonSchema)(action.parameters || [])),
192
+ available
193
+ };
194
+ });
195
+ return filteredActions;
196
+ }
164
197
 
165
198
  // src/components/toast/toast-provider.tsx
166
199
  var import_react3 = require("react");
@@ -290,13 +323,13 @@ function useToast() {
290
323
  }
291
324
 
292
325
  // src/hooks/use-copilot-runtime-client.ts
293
- var import_runtime_client_gql = require("@copilotkit/runtime-client-gql");
326
+ var import_runtime_client_gql2 = require("@copilotkit/runtime-client-gql");
294
327
  var import_react4 = require("react");
295
328
  var useCopilotRuntimeClient = (options) => {
296
329
  const { addGraphQLErrorsToast } = useToast();
297
330
  const addErrorToast = useErrorToast();
298
331
  const runtimeClient = (0, import_react4.useMemo)(() => {
299
- return new import_runtime_client_gql.CopilotRuntimeClient(__spreadProps(__spreadValues({}, options), {
332
+ return new import_runtime_client_gql2.CopilotRuntimeClient(__spreadProps(__spreadValues({}, options), {
300
333
  handleGQLErrors: (error) => {
301
334
  if (error.graphQLErrors.length) {
302
335
  addGraphQLErrorsToast(error.graphQLErrors);
@@ -325,17 +358,23 @@ function useChat(options) {
325
358
  setCoagentStatesWithRef,
326
359
  coagentStatesRef,
327
360
  agentSession,
328
- setAgentSession
361
+ setAgentSession,
362
+ threadId,
363
+ setThreadId,
364
+ runId,
365
+ setRunId,
366
+ chatAbortControllerRef
329
367
  } = options;
330
- const abortControllerRef = (0, import_react5.useRef)();
331
- const threadIdRef = (0, import_react5.useRef)(null);
332
- const runIdRef = (0, import_react5.useRef)(null);
333
368
  const { addGraphQLErrorsToast } = useToast();
334
369
  const runChatCompletionRef = (0, import_react5.useRef)();
335
370
  const agentSessionRef = (0, import_react5.useRef)(agentSession);
336
371
  agentSessionRef.current = agentSession;
372
+ const threadIdRef = (0, import_react5.useRef)(threadId);
373
+ threadIdRef.current = threadId;
374
+ const runIdRef = (0, import_react5.useRef)(runId);
375
+ runIdRef.current = runId;
337
376
  const publicApiKey = copilotConfig.publicApiKey;
338
- const headers = __spreadValues(__spreadValues({}, copilotConfig.headers || {}), publicApiKey ? { [import_shared.COPILOT_CLOUD_PUBLIC_API_KEY_HEADER]: publicApiKey } : {});
377
+ const headers = __spreadValues(__spreadValues({}, copilotConfig.headers || {}), publicApiKey ? { [import_shared2.COPILOT_CLOUD_PUBLIC_API_KEY_HEADER]: publicApiKey } : {});
339
378
  const runtimeClient = useCopilotRuntimeClient({
340
379
  url: copilotConfig.chatApiEndpoint,
341
380
  publicApiKey: copilotConfig.publicApiKey,
@@ -344,48 +383,29 @@ function useChat(options) {
344
383
  });
345
384
  const runChatCompletion = useAsyncCallback(
346
385
  (previousMessages) => __async(this, null, function* () {
347
- var _a, _b, _c, _d, _e, _f, _g, _h, _i;
386
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
348
387
  setIsLoading(true);
349
388
  let newMessages = [
350
- new import_runtime_client_gql2.TextMessage({
389
+ new import_runtime_client_gql3.TextMessage({
351
390
  content: "",
352
- role: import_runtime_client_gql2.Role.Assistant
391
+ role: import_runtime_client_gql3.Role.Assistant
353
392
  })
354
393
  ];
355
- const abortController = new AbortController();
356
- abortControllerRef.current = abortController;
394
+ chatAbortControllerRef.current = new AbortController();
357
395
  setMessages([...previousMessages, ...newMessages]);
358
396
  const systemMessage = makeSystemMessageCallback();
359
397
  const messagesWithContext = [systemMessage, ...initialMessages || [], ...previousMessages];
398
+ const isAgentRun = agentSessionRef.current !== null;
360
399
  const stream = runtimeClient.asStream(
361
400
  runtimeClient.generateCopilotResponse({
362
401
  data: __spreadProps(__spreadValues(__spreadProps(__spreadValues({
363
402
  frontend: {
364
- actions: actions.filter(
365
- (action) => action.available !== import_runtime_client_gql2.ActionInputAvailability.Disabled || !action.disabled
366
- ).map((action) => {
367
- let available = import_runtime_client_gql2.ActionInputAvailability.Enabled;
368
- if (action.disabled) {
369
- available = import_runtime_client_gql2.ActionInputAvailability.Disabled;
370
- } else if (action.available === "disabled") {
371
- available = import_runtime_client_gql2.ActionInputAvailability.Disabled;
372
- } else if (action.available === "remote") {
373
- available = import_runtime_client_gql2.ActionInputAvailability.Remote;
374
- }
375
- return {
376
- name: action.name,
377
- description: action.description || "",
378
- jsonSchema: JSON.stringify(
379
- (0, import_shared.actionParametersToJsonSchema)(action.parameters || [])
380
- ),
381
- available
382
- };
383
- }),
403
+ actions: processActionsForRuntimeRequest(actions),
384
404
  url: window.location.href
385
405
  },
386
406
  threadId: threadIdRef.current,
387
407
  runId: runIdRef.current,
388
- messages: (0, import_runtime_client_gql2.convertMessagesToGqlInput)((0, import_runtime_client_gql2.filterAgentStateMessages)(messagesWithContext))
408
+ messages: (0, import_runtime_client_gql3.convertMessagesToGqlInput)((0, import_runtime_client_gql3.filterAgentStateMessages)(messagesWithContext))
389
409
  }, copilotConfig.cloud ? {
390
410
  cloud: __spreadValues({}, ((_c = (_b = (_a = copilotConfig.cloud.guardrails) == null ? void 0 : _a.input) == null ? void 0 : _b.restrictToTopic) == null ? void 0 : _c.enabled) ? {
391
411
  guardrails: {
@@ -397,7 +417,7 @@ function useChat(options) {
397
417
  } : {})
398
418
  } : {}), {
399
419
  metadata: {
400
- requestType: import_runtime_client_gql2.CopilotRequestType.Chat
420
+ requestType: import_runtime_client_gql3.CopilotRequestType.Chat
401
421
  }
402
422
  }), agentSessionRef.current ? {
403
423
  agentSession: agentSessionRef.current
@@ -408,14 +428,15 @@ function useChat(options) {
408
428
  }))
409
429
  }),
410
430
  properties: copilotConfig.properties,
411
- signal: (_d = abortControllerRef.current) == null ? void 0 : _d.signal
431
+ signal: (_d = chatAbortControllerRef.current) == null ? void 0 : _d.signal
412
432
  })
413
433
  );
414
434
  const guardrailsEnabled = ((_g = (_f = (_e = copilotConfig.cloud) == null ? void 0 : _e.guardrails) == null ? void 0 : _f.input) == null ? void 0 : _g.restrictToTopic.enabled) || false;
415
435
  const reader = stream.getReader();
416
- let actionResults = {};
417
436
  let executedCoAgentStateRenders = [];
418
437
  let followUp = void 0;
438
+ let messages2 = [];
439
+ let syncedMessages = [];
419
440
  try {
420
441
  while (true) {
421
442
  let done, value;
@@ -427,6 +448,9 @@ function useChat(options) {
427
448
  break;
428
449
  }
429
450
  if (done) {
451
+ if (chatAbortControllerRef.current.signal.aborted) {
452
+ return [];
453
+ }
430
454
  break;
431
455
  }
432
456
  if (!(value == null ? void 0 : value.generateCopilotResponse)) {
@@ -434,8 +458,10 @@ function useChat(options) {
434
458
  }
435
459
  threadIdRef.current = value.generateCopilotResponse.threadId || null;
436
460
  runIdRef.current = value.generateCopilotResponse.runId || null;
437
- const messages2 = (0, import_runtime_client_gql2.convertGqlOutputToMessages)(
438
- (0, import_runtime_client_gql2.filterAdjacentAgentStateMessages)(value.generateCopilotResponse.messages)
461
+ setThreadId(threadIdRef.current);
462
+ setRunId(runIdRef.current);
463
+ messages2 = (0, import_runtime_client_gql3.convertGqlOutputToMessages)(
464
+ (0, import_runtime_client_gql3.filterAdjacentAgentStateMessages)(value.generateCopilotResponse.messages)
439
465
  );
440
466
  if (messages2.length === 0) {
441
467
  continue;
@@ -443,44 +469,16 @@ function useChat(options) {
443
469
  newMessages = [];
444
470
  if (((_h = value.generateCopilotResponse.status) == null ? void 0 : _h.__typename) === "FailedResponseStatus" && value.generateCopilotResponse.status.reason === "GUARDRAILS_VALIDATION_FAILED") {
445
471
  newMessages = [
446
- new import_runtime_client_gql2.TextMessage({
447
- role: import_runtime_client_gql2.MessageRole.Assistant,
472
+ new import_runtime_client_gql3.TextMessage({
473
+ role: import_runtime_client_gql3.MessageRole.Assistant,
448
474
  content: ((_i = value.generateCopilotResponse.status.details) == null ? void 0 : _i.guardrailsReason) || ""
449
475
  })
450
476
  ];
477
+ setMessages([...previousMessages, ...newMessages]);
478
+ break;
451
479
  } else {
480
+ newMessages = [...messages2];
452
481
  for (const message of messages2) {
453
- newMessages.push(message);
454
- if (message.isActionExecutionMessage() && message.status.code !== import_runtime_client_gql2.MessageStatusCode.Pending && message.scope === "client" && onFunctionCall) {
455
- if (!(message.id in actionResults)) {
456
- if (guardrailsEnabled && value.generateCopilotResponse.status === void 0) {
457
- break;
458
- }
459
- try {
460
- setMessages([...previousMessages, ...newMessages]);
461
- const action = actions.find((action2) => action2.name === message.name);
462
- if (action) {
463
- followUp = action.followUp;
464
- }
465
- const result = yield onFunctionCall({
466
- messages: previousMessages,
467
- name: message.name,
468
- args: message.arguments
469
- });
470
- actionResults[message.id] = result;
471
- } catch (e) {
472
- actionResults[message.id] = `Failed to execute action ${message.name}`;
473
- console.error(`Failed to execute action ${message.name}: ${e}`);
474
- }
475
- }
476
- newMessages.push(
477
- new import_runtime_client_gql2.ResultMessage({
478
- result: import_runtime_client_gql2.ResultMessage.encodeResult(actionResults[message.id]),
479
- actionExecutionId: message.id,
480
- actionName: message.name
481
- })
482
- );
483
- }
484
482
  if (message.isAgentStateMessage() && !message.active && !executedCoAgentStateRenders.includes(message.id) && onCoAgentStateRender) {
485
483
  if (guardrailsEnabled && value.generateCopilotResponse.status === void 0) {
486
484
  break;
@@ -495,6 +493,11 @@ function useChat(options) {
495
493
  }
496
494
  const lastAgentStateMessage = [...messages2].reverse().find((message) => message.isAgentStateMessage());
497
495
  if (lastAgentStateMessage) {
496
+ if (lastAgentStateMessage.state.messages && lastAgentStateMessage.state.messages.length > 0) {
497
+ syncedMessages = (0, import_runtime_client_gql3.loadMessagesFromJsonRepresentation)(
498
+ lastAgentStateMessage.state.messages
499
+ );
500
+ }
498
501
  setCoagentStatesWithRef((prevAgentStates) => __spreadProps(__spreadValues({}, prevAgentStates), {
499
502
  [lastAgentStateMessage.agentName]: {
500
503
  name: lastAgentStateMessage.agentName,
@@ -521,14 +524,96 @@ function useChat(options) {
521
524
  setMessages([...previousMessages, ...newMessages]);
522
525
  }
523
526
  }
527
+ const finalMessages = constructFinalMessages(syncedMessages, previousMessages, newMessages);
528
+ let didExecuteAction = false;
529
+ if (onFunctionCall) {
530
+ const lastMessages = [];
531
+ for (let i = finalMessages.length - 1; i >= 0; i--) {
532
+ const message = finalMessages[i];
533
+ if (message.isActionExecutionMessage() && message.status.code !== import_runtime_client_gql3.MessageStatusCode.Pending) {
534
+ lastMessages.unshift(message);
535
+ } else {
536
+ break;
537
+ }
538
+ }
539
+ for (const message of lastMessages) {
540
+ setMessages(finalMessages);
541
+ const action = actions.find((action2) => action2.name === message.name);
542
+ if (action) {
543
+ followUp = action.followUp;
544
+ let result;
545
+ try {
546
+ result = yield Promise.race([
547
+ onFunctionCall({
548
+ messages: previousMessages,
549
+ name: message.name,
550
+ args: message.arguments
551
+ }),
552
+ new Promise(
553
+ (resolve) => {
554
+ var _a2;
555
+ return (_a2 = chatAbortControllerRef.current) == null ? void 0 : _a2.signal.addEventListener(
556
+ "abort",
557
+ () => resolve("Operation was aborted by the user")
558
+ );
559
+ }
560
+ ),
561
+ // if the user stopped generation, we also abort consecutive actions
562
+ new Promise((resolve) => {
563
+ var _a2;
564
+ if ((_a2 = chatAbortControllerRef.current) == null ? void 0 : _a2.signal.aborted) {
565
+ resolve("Operation was aborted by the user");
566
+ }
567
+ })
568
+ ]);
569
+ } catch (e) {
570
+ result = `Failed to execute action ${message.name}`;
571
+ console.error(`Failed to execute action ${message.name}: ${e}`);
572
+ }
573
+ didExecuteAction = true;
574
+ const messageIndex = finalMessages.findIndex((msg) => msg.id === message.id);
575
+ finalMessages.splice(
576
+ messageIndex + 1,
577
+ 0,
578
+ new import_runtime_client_gql3.ResultMessage({
579
+ id: "result-" + message.id,
580
+ result: import_runtime_client_gql3.ResultMessage.encodeResult(result),
581
+ actionExecutionId: message.id,
582
+ actionName: message.name
583
+ })
584
+ );
585
+ }
586
+ }
587
+ setMessages(finalMessages);
588
+ }
524
589
  if (
525
590
  // if followUp is not explicitly false
526
- followUp !== false && // if we have client side results
527
- (Object.values(actionResults).length || // or the last message we received is a result
528
- newMessages.length && newMessages[newMessages.length - 1].isResultMessage())
591
+ followUp !== false && // and we executed an action
592
+ (didExecuteAction || // the last message is a server side result
593
+ !isAgentRun && finalMessages.length && finalMessages[finalMessages.length - 1].isResultMessage()) && // the user did not stop generation
594
+ !((_j = chatAbortControllerRef.current) == null ? void 0 : _j.signal.aborted)
529
595
  ) {
530
596
  yield new Promise((resolve) => setTimeout(resolve, 10));
531
- return yield runChatCompletionRef.current([...previousMessages, ...newMessages]);
597
+ return yield runChatCompletionRef.current(finalMessages);
598
+ } else if ((_k = chatAbortControllerRef.current) == null ? void 0 : _k.signal.aborted) {
599
+ const repairedMessages = finalMessages.filter((message, actionExecutionIndex) => {
600
+ if (message.isActionExecutionMessage()) {
601
+ return finalMessages.find(
602
+ (msg, resultIndex) => msg.isResultMessage() && msg.actionExecutionId === message.id && resultIndex === actionExecutionIndex + 1
603
+ );
604
+ }
605
+ return true;
606
+ });
607
+ const repairedMessageIds = repairedMessages.map((message) => message.id);
608
+ setMessages(repairedMessages);
609
+ if ((_l = agentSessionRef.current) == null ? void 0 : _l.nodeName) {
610
+ setAgentSession({
611
+ threadId: agentSessionRef.current.threadId,
612
+ agentName: agentSessionRef.current.agentName,
613
+ nodeName: "__end__"
614
+ });
615
+ }
616
+ return newMessages.filter((message) => repairedMessageIds.includes(message.id));
532
617
  } else {
533
618
  return newMessages.slice();
534
619
  }
@@ -585,7 +670,7 @@ function useChat(options) {
585
670
  }), [isLoading, messages, setMessages, runChatCompletionAndHandleFunctionCall]);
586
671
  const stop = () => {
587
672
  var _a;
588
- (_a = abortControllerRef.current) == null ? void 0 : _a.abort();
673
+ (_a = chatAbortControllerRef.current) == null ? void 0 : _a.abort("Stop was called");
589
674
  };
590
675
  return {
591
676
  append,
@@ -594,11 +679,28 @@ function useChat(options) {
594
679
  runChatCompletion: () => runChatCompletionRef.current(messages)
595
680
  };
596
681
  }
682
+ function constructFinalMessages(syncedMessages, previousMessages, newMessages) {
683
+ const finalMessages = syncedMessages.length > 0 ? [...syncedMessages] : [...previousMessages, ...newMessages];
684
+ if (syncedMessages.length > 0) {
685
+ const messagesWithAgentState = [...previousMessages, ...newMessages];
686
+ let previousMessageId = void 0;
687
+ for (const message of messagesWithAgentState) {
688
+ if (message.isAgentStateMessage()) {
689
+ const index = finalMessages.findIndex((msg) => msg.id === previousMessageId);
690
+ if (index !== -1) {
691
+ finalMessages.splice(index + 1, 0, message);
692
+ }
693
+ }
694
+ previousMessageId = message.id;
695
+ }
696
+ }
697
+ return finalMessages;
698
+ }
597
699
 
598
700
  // src/components/copilot-provider/copilotkit.tsx
599
701
  var import_react7 = require("react");
600
702
  var import_react_dom = require("react-dom");
601
- var import_shared2 = require("@copilotkit/shared");
703
+ var import_shared3 = require("@copilotkit/shared");
602
704
 
603
705
  // src/context/copilot-messages-context.tsx
604
706
  var import_react6 = __toESM(require("react"));
@@ -640,7 +742,13 @@ function useCopilotChat(_a = {}) {
640
742
  setCoagentStatesWithRef,
641
743
  coAgentStateRenders,
642
744
  agentSession,
643
- setAgentSession
745
+ setAgentSession,
746
+ agentLock,
747
+ threadId,
748
+ setThreadId,
749
+ runId,
750
+ setRunId,
751
+ chatAbortControllerRef
644
752
  } = useCopilotContext();
645
753
  const { messages, setMessages } = useCopilotMessagesContext();
646
754
  const latestGetContextString = useUpdatedRef(getContextString);
@@ -653,9 +761,9 @@ function useCopilotChat(_a = {}) {
653
761
  const makeSystemMessageCallback = (0, import_react8.useCallback)(() => {
654
762
  const systemMessageMaker = makeSystemMessage || defaultSystemMessage;
655
763
  const contextString = latestGetContextString.current([], defaultCopilotContextCategories);
656
- return new import_runtime_client_gql3.TextMessage({
764
+ return new import_runtime_client_gql4.TextMessage({
657
765
  content: systemMessageMaker(contextString, chatInstructions),
658
- role: import_runtime_client_gql3.Role.System
766
+ role: import_runtime_client_gql4.Role.System
659
767
  });
660
768
  }, [getContextString, makeSystemMessage, chatInstructions]);
661
769
  const onCoAgentStateRender = useAsyncCallback(
@@ -690,7 +798,12 @@ function useCopilotChat(_a = {}) {
690
798
  coagentStatesRef,
691
799
  setCoagentStatesWithRef,
692
800
  agentSession,
693
- setAgentSession
801
+ setAgentSession,
802
+ threadId,
803
+ setThreadId,
804
+ runId,
805
+ setRunId,
806
+ chatAbortControllerRef
694
807
  }));
695
808
  const latestAppend = useUpdatedRef(append);
696
809
  const latestAppendFunc = useAsyncCallback(
@@ -725,12 +838,38 @@ function useCopilotChat(_a = {}) {
725
838
  const latestRunChatCompletionFunc = useAsyncCallback(() => __async(this, null, function* () {
726
839
  return yield latestRunChatCompletion.current();
727
840
  }), [latestRunChatCompletion]);
841
+ const reset = (0, import_react8.useCallback)(() => {
842
+ latestStopFunc();
843
+ setMessages([]);
844
+ setThreadId(null);
845
+ setRunId(null);
846
+ setCoagentStatesWithRef({});
847
+ let initialAgentSession = null;
848
+ if (agentLock) {
849
+ initialAgentSession = {
850
+ agentName: agentLock
851
+ };
852
+ }
853
+ setAgentSession(initialAgentSession);
854
+ }, [
855
+ latestStopFunc,
856
+ setMessages,
857
+ setThreadId,
858
+ setCoagentStatesWithRef,
859
+ setAgentSession,
860
+ agentLock
861
+ ]);
862
+ const latestReset = useUpdatedRef(reset);
863
+ const latestResetFunc = (0, import_react8.useCallback)(() => {
864
+ return latestReset.current();
865
+ }, [latestReset]);
728
866
  return {
729
867
  visibleMessages: messages,
730
868
  appendMessage: latestAppendFunc,
731
869
  setMessages: latestSetMessagesFunc,
732
870
  reloadMessages: latestReloadFunc,
733
871
  stopGeneration: latestStopFunc,
872
+ reset: latestResetFunc,
734
873
  deleteMessage: latestDeleteFunc,
735
874
  runChatCompletion: latestRunChatCompletionFunc,
736
875
  isLoading