@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
@@ -79,6 +79,9 @@ var __async = (__this, __arguments, generator) => {
79
79
  // src/hooks/use-coagent.ts
80
80
  var use_coagent_exports = {};
81
81
  __export(use_coagent_exports, {
82
+ runAgent: () => runAgent,
83
+ startAgent: () => startAgent,
84
+ stopAgent: () => stopAgent,
82
85
  useCoAgent: () => useCoAgent
83
86
  });
84
87
  module.exports = __toCommonJS(use_coagent_exports);
@@ -138,7 +141,15 @@ var emptyCopilotContext = {
138
141
  },
139
142
  agentSession: null,
140
143
  setAgentSession: () => {
141
- }
144
+ },
145
+ agentLock: null,
146
+ threadId: null,
147
+ setThreadId: () => {
148
+ },
149
+ runId: null,
150
+ setRunId: () => {
151
+ },
152
+ chatAbortControllerRef: { current: null }
142
153
  };
143
154
  var CopilotContext = import_react.default.createContext(emptyCopilotContext);
144
155
  function useCopilotContext() {
@@ -172,12 +183,37 @@ function useCopilotMessagesContext() {
172
183
 
173
184
  // src/hooks/use-copilot-chat.ts
174
185
  var import_react8 = require("react");
175
- var import_runtime_client_gql3 = require("@copilotkit/runtime-client-gql");
186
+ var import_runtime_client_gql4 = require("@copilotkit/runtime-client-gql");
176
187
 
177
188
  // src/hooks/use-chat.ts
178
189
  var import_react6 = require("react");
190
+ var import_shared2 = require("@copilotkit/shared");
191
+ var import_runtime_client_gql3 = require("@copilotkit/runtime-client-gql");
192
+
193
+ // src/types/frontend-action.ts
194
+ var import_runtime_client_gql = require("@copilotkit/runtime-client-gql");
179
195
  var import_shared = require("@copilotkit/shared");
180
- var import_runtime_client_gql2 = require("@copilotkit/runtime-client-gql");
196
+ function processActionsForRuntimeRequest(actions) {
197
+ const filteredActions = actions.filter(
198
+ (action) => action.available !== import_runtime_client_gql.ActionInputAvailability.Disabled && action.disabled !== true && action.name !== "*"
199
+ ).map((action) => {
200
+ let available = import_runtime_client_gql.ActionInputAvailability.Enabled;
201
+ if (action.disabled) {
202
+ available = import_runtime_client_gql.ActionInputAvailability.Disabled;
203
+ } else if (action.available === "disabled") {
204
+ available = import_runtime_client_gql.ActionInputAvailability.Disabled;
205
+ } else if (action.available === "remote") {
206
+ available = import_runtime_client_gql.ActionInputAvailability.Remote;
207
+ }
208
+ return {
209
+ name: action.name,
210
+ description: action.description || "",
211
+ jsonSchema: JSON.stringify((0, import_shared.actionParametersToJsonSchema)(action.parameters || [])),
212
+ available
213
+ };
214
+ });
215
+ return filteredActions;
216
+ }
181
217
 
182
218
  // src/components/toast/toast-provider.tsx
183
219
  var import_react4 = require("react");
@@ -307,13 +343,13 @@ function useToast() {
307
343
  }
308
344
 
309
345
  // src/hooks/use-copilot-runtime-client.ts
310
- var import_runtime_client_gql = require("@copilotkit/runtime-client-gql");
346
+ var import_runtime_client_gql2 = require("@copilotkit/runtime-client-gql");
311
347
  var import_react5 = require("react");
312
348
  var useCopilotRuntimeClient = (options) => {
313
349
  const { addGraphQLErrorsToast } = useToast();
314
350
  const addErrorToast = useErrorToast();
315
351
  const runtimeClient = (0, import_react5.useMemo)(() => {
316
- return new import_runtime_client_gql.CopilotRuntimeClient(__spreadProps(__spreadValues({}, options), {
352
+ return new import_runtime_client_gql2.CopilotRuntimeClient(__spreadProps(__spreadValues({}, options), {
317
353
  handleGQLErrors: (error) => {
318
354
  if (error.graphQLErrors.length) {
319
355
  addGraphQLErrorsToast(error.graphQLErrors);
@@ -342,17 +378,23 @@ function useChat(options) {
342
378
  setCoagentStatesWithRef,
343
379
  coagentStatesRef,
344
380
  agentSession,
345
- setAgentSession
381
+ setAgentSession,
382
+ threadId,
383
+ setThreadId,
384
+ runId,
385
+ setRunId,
386
+ chatAbortControllerRef
346
387
  } = options;
347
- const abortControllerRef = (0, import_react6.useRef)();
348
- const threadIdRef = (0, import_react6.useRef)(null);
349
- const runIdRef = (0, import_react6.useRef)(null);
350
388
  const { addGraphQLErrorsToast } = useToast();
351
389
  const runChatCompletionRef = (0, import_react6.useRef)();
352
390
  const agentSessionRef = (0, import_react6.useRef)(agentSession);
353
391
  agentSessionRef.current = agentSession;
392
+ const threadIdRef = (0, import_react6.useRef)(threadId);
393
+ threadIdRef.current = threadId;
394
+ const runIdRef = (0, import_react6.useRef)(runId);
395
+ runIdRef.current = runId;
354
396
  const publicApiKey = copilotConfig.publicApiKey;
355
- const headers = __spreadValues(__spreadValues({}, copilotConfig.headers || {}), publicApiKey ? { [import_shared.COPILOT_CLOUD_PUBLIC_API_KEY_HEADER]: publicApiKey } : {});
397
+ const headers = __spreadValues(__spreadValues({}, copilotConfig.headers || {}), publicApiKey ? { [import_shared2.COPILOT_CLOUD_PUBLIC_API_KEY_HEADER]: publicApiKey } : {});
356
398
  const runtimeClient = useCopilotRuntimeClient({
357
399
  url: copilotConfig.chatApiEndpoint,
358
400
  publicApiKey: copilotConfig.publicApiKey,
@@ -361,48 +403,29 @@ function useChat(options) {
361
403
  });
362
404
  const runChatCompletion = useAsyncCallback(
363
405
  (previousMessages) => __async(this, null, function* () {
364
- var _a, _b, _c, _d, _e, _f, _g, _h, _i;
406
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
365
407
  setIsLoading(true);
366
408
  let newMessages = [
367
- new import_runtime_client_gql2.TextMessage({
409
+ new import_runtime_client_gql3.TextMessage({
368
410
  content: "",
369
- role: import_runtime_client_gql2.Role.Assistant
411
+ role: import_runtime_client_gql3.Role.Assistant
370
412
  })
371
413
  ];
372
- const abortController = new AbortController();
373
- abortControllerRef.current = abortController;
414
+ chatAbortControllerRef.current = new AbortController();
374
415
  setMessages([...previousMessages, ...newMessages]);
375
416
  const systemMessage = makeSystemMessageCallback();
376
417
  const messagesWithContext = [systemMessage, ...initialMessages || [], ...previousMessages];
418
+ const isAgentRun = agentSessionRef.current !== null;
377
419
  const stream = runtimeClient.asStream(
378
420
  runtimeClient.generateCopilotResponse({
379
421
  data: __spreadProps(__spreadValues(__spreadProps(__spreadValues({
380
422
  frontend: {
381
- actions: actions.filter(
382
- (action) => action.available !== import_runtime_client_gql2.ActionInputAvailability.Disabled || !action.disabled
383
- ).map((action) => {
384
- let available = import_runtime_client_gql2.ActionInputAvailability.Enabled;
385
- if (action.disabled) {
386
- available = import_runtime_client_gql2.ActionInputAvailability.Disabled;
387
- } else if (action.available === "disabled") {
388
- available = import_runtime_client_gql2.ActionInputAvailability.Disabled;
389
- } else if (action.available === "remote") {
390
- available = import_runtime_client_gql2.ActionInputAvailability.Remote;
391
- }
392
- return {
393
- name: action.name,
394
- description: action.description || "",
395
- jsonSchema: JSON.stringify(
396
- (0, import_shared.actionParametersToJsonSchema)(action.parameters || [])
397
- ),
398
- available
399
- };
400
- }),
423
+ actions: processActionsForRuntimeRequest(actions),
401
424
  url: window.location.href
402
425
  },
403
426
  threadId: threadIdRef.current,
404
427
  runId: runIdRef.current,
405
- messages: (0, import_runtime_client_gql2.convertMessagesToGqlInput)((0, import_runtime_client_gql2.filterAgentStateMessages)(messagesWithContext))
428
+ messages: (0, import_runtime_client_gql3.convertMessagesToGqlInput)((0, import_runtime_client_gql3.filterAgentStateMessages)(messagesWithContext))
406
429
  }, copilotConfig.cloud ? {
407
430
  cloud: __spreadValues({}, ((_c = (_b = (_a = copilotConfig.cloud.guardrails) == null ? void 0 : _a.input) == null ? void 0 : _b.restrictToTopic) == null ? void 0 : _c.enabled) ? {
408
431
  guardrails: {
@@ -414,7 +437,7 @@ function useChat(options) {
414
437
  } : {})
415
438
  } : {}), {
416
439
  metadata: {
417
- requestType: import_runtime_client_gql2.CopilotRequestType.Chat
440
+ requestType: import_runtime_client_gql3.CopilotRequestType.Chat
418
441
  }
419
442
  }), agentSessionRef.current ? {
420
443
  agentSession: agentSessionRef.current
@@ -425,14 +448,15 @@ function useChat(options) {
425
448
  }))
426
449
  }),
427
450
  properties: copilotConfig.properties,
428
- signal: (_d = abortControllerRef.current) == null ? void 0 : _d.signal
451
+ signal: (_d = chatAbortControllerRef.current) == null ? void 0 : _d.signal
429
452
  })
430
453
  );
431
454
  const guardrailsEnabled = ((_g = (_f = (_e = copilotConfig.cloud) == null ? void 0 : _e.guardrails) == null ? void 0 : _f.input) == null ? void 0 : _g.restrictToTopic.enabled) || false;
432
455
  const reader = stream.getReader();
433
- let actionResults = {};
434
456
  let executedCoAgentStateRenders = [];
435
457
  let followUp = void 0;
458
+ let messages2 = [];
459
+ let syncedMessages = [];
436
460
  try {
437
461
  while (true) {
438
462
  let done, value;
@@ -444,6 +468,9 @@ function useChat(options) {
444
468
  break;
445
469
  }
446
470
  if (done) {
471
+ if (chatAbortControllerRef.current.signal.aborted) {
472
+ return [];
473
+ }
447
474
  break;
448
475
  }
449
476
  if (!(value == null ? void 0 : value.generateCopilotResponse)) {
@@ -451,8 +478,10 @@ function useChat(options) {
451
478
  }
452
479
  threadIdRef.current = value.generateCopilotResponse.threadId || null;
453
480
  runIdRef.current = value.generateCopilotResponse.runId || null;
454
- const messages2 = (0, import_runtime_client_gql2.convertGqlOutputToMessages)(
455
- (0, import_runtime_client_gql2.filterAdjacentAgentStateMessages)(value.generateCopilotResponse.messages)
481
+ setThreadId(threadIdRef.current);
482
+ setRunId(runIdRef.current);
483
+ messages2 = (0, import_runtime_client_gql3.convertGqlOutputToMessages)(
484
+ (0, import_runtime_client_gql3.filterAdjacentAgentStateMessages)(value.generateCopilotResponse.messages)
456
485
  );
457
486
  if (messages2.length === 0) {
458
487
  continue;
@@ -460,44 +489,16 @@ function useChat(options) {
460
489
  newMessages = [];
461
490
  if (((_h = value.generateCopilotResponse.status) == null ? void 0 : _h.__typename) === "FailedResponseStatus" && value.generateCopilotResponse.status.reason === "GUARDRAILS_VALIDATION_FAILED") {
462
491
  newMessages = [
463
- new import_runtime_client_gql2.TextMessage({
464
- role: import_runtime_client_gql2.MessageRole.Assistant,
492
+ new import_runtime_client_gql3.TextMessage({
493
+ role: import_runtime_client_gql3.MessageRole.Assistant,
465
494
  content: ((_i = value.generateCopilotResponse.status.details) == null ? void 0 : _i.guardrailsReason) || ""
466
495
  })
467
496
  ];
497
+ setMessages([...previousMessages, ...newMessages]);
498
+ break;
468
499
  } else {
500
+ newMessages = [...messages2];
469
501
  for (const message of messages2) {
470
- newMessages.push(message);
471
- if (message.isActionExecutionMessage() && message.status.code !== import_runtime_client_gql2.MessageStatusCode.Pending && message.scope === "client" && onFunctionCall) {
472
- if (!(message.id in actionResults)) {
473
- if (guardrailsEnabled && value.generateCopilotResponse.status === void 0) {
474
- break;
475
- }
476
- try {
477
- setMessages([...previousMessages, ...newMessages]);
478
- const action = actions.find((action2) => action2.name === message.name);
479
- if (action) {
480
- followUp = action.followUp;
481
- }
482
- const result = yield onFunctionCall({
483
- messages: previousMessages,
484
- name: message.name,
485
- args: message.arguments
486
- });
487
- actionResults[message.id] = result;
488
- } catch (e) {
489
- actionResults[message.id] = `Failed to execute action ${message.name}`;
490
- console.error(`Failed to execute action ${message.name}: ${e}`);
491
- }
492
- }
493
- newMessages.push(
494
- new import_runtime_client_gql2.ResultMessage({
495
- result: import_runtime_client_gql2.ResultMessage.encodeResult(actionResults[message.id]),
496
- actionExecutionId: message.id,
497
- actionName: message.name
498
- })
499
- );
500
- }
501
502
  if (message.isAgentStateMessage() && !message.active && !executedCoAgentStateRenders.includes(message.id) && onCoAgentStateRender) {
502
503
  if (guardrailsEnabled && value.generateCopilotResponse.status === void 0) {
503
504
  break;
@@ -512,6 +513,11 @@ function useChat(options) {
512
513
  }
513
514
  const lastAgentStateMessage = [...messages2].reverse().find((message) => message.isAgentStateMessage());
514
515
  if (lastAgentStateMessage) {
516
+ if (lastAgentStateMessage.state.messages && lastAgentStateMessage.state.messages.length > 0) {
517
+ syncedMessages = (0, import_runtime_client_gql3.loadMessagesFromJsonRepresentation)(
518
+ lastAgentStateMessage.state.messages
519
+ );
520
+ }
515
521
  setCoagentStatesWithRef((prevAgentStates) => __spreadProps(__spreadValues({}, prevAgentStates), {
516
522
  [lastAgentStateMessage.agentName]: {
517
523
  name: lastAgentStateMessage.agentName,
@@ -538,14 +544,96 @@ function useChat(options) {
538
544
  setMessages([...previousMessages, ...newMessages]);
539
545
  }
540
546
  }
547
+ const finalMessages = constructFinalMessages(syncedMessages, previousMessages, newMessages);
548
+ let didExecuteAction = false;
549
+ if (onFunctionCall) {
550
+ const lastMessages = [];
551
+ for (let i = finalMessages.length - 1; i >= 0; i--) {
552
+ const message = finalMessages[i];
553
+ if (message.isActionExecutionMessage() && message.status.code !== import_runtime_client_gql3.MessageStatusCode.Pending) {
554
+ lastMessages.unshift(message);
555
+ } else {
556
+ break;
557
+ }
558
+ }
559
+ for (const message of lastMessages) {
560
+ setMessages(finalMessages);
561
+ const action = actions.find((action2) => action2.name === message.name);
562
+ if (action) {
563
+ followUp = action.followUp;
564
+ let result;
565
+ try {
566
+ result = yield Promise.race([
567
+ onFunctionCall({
568
+ messages: previousMessages,
569
+ name: message.name,
570
+ args: message.arguments
571
+ }),
572
+ new Promise(
573
+ (resolve) => {
574
+ var _a2;
575
+ return (_a2 = chatAbortControllerRef.current) == null ? void 0 : _a2.signal.addEventListener(
576
+ "abort",
577
+ () => resolve("Operation was aborted by the user")
578
+ );
579
+ }
580
+ ),
581
+ // if the user stopped generation, we also abort consecutive actions
582
+ new Promise((resolve) => {
583
+ var _a2;
584
+ if ((_a2 = chatAbortControllerRef.current) == null ? void 0 : _a2.signal.aborted) {
585
+ resolve("Operation was aborted by the user");
586
+ }
587
+ })
588
+ ]);
589
+ } catch (e) {
590
+ result = `Failed to execute action ${message.name}`;
591
+ console.error(`Failed to execute action ${message.name}: ${e}`);
592
+ }
593
+ didExecuteAction = true;
594
+ const messageIndex = finalMessages.findIndex((msg) => msg.id === message.id);
595
+ finalMessages.splice(
596
+ messageIndex + 1,
597
+ 0,
598
+ new import_runtime_client_gql3.ResultMessage({
599
+ id: "result-" + message.id,
600
+ result: import_runtime_client_gql3.ResultMessage.encodeResult(result),
601
+ actionExecutionId: message.id,
602
+ actionName: message.name
603
+ })
604
+ );
605
+ }
606
+ }
607
+ setMessages(finalMessages);
608
+ }
541
609
  if (
542
610
  // if followUp is not explicitly false
543
- followUp !== false && // if we have client side results
544
- (Object.values(actionResults).length || // or the last message we received is a result
545
- newMessages.length && newMessages[newMessages.length - 1].isResultMessage())
611
+ followUp !== false && // and we executed an action
612
+ (didExecuteAction || // the last message is a server side result
613
+ !isAgentRun && finalMessages.length && finalMessages[finalMessages.length - 1].isResultMessage()) && // the user did not stop generation
614
+ !((_j = chatAbortControllerRef.current) == null ? void 0 : _j.signal.aborted)
546
615
  ) {
547
616
  yield new Promise((resolve) => setTimeout(resolve, 10));
548
- return yield runChatCompletionRef.current([...previousMessages, ...newMessages]);
617
+ return yield runChatCompletionRef.current(finalMessages);
618
+ } else if ((_k = chatAbortControllerRef.current) == null ? void 0 : _k.signal.aborted) {
619
+ const repairedMessages = finalMessages.filter((message, actionExecutionIndex) => {
620
+ if (message.isActionExecutionMessage()) {
621
+ return finalMessages.find(
622
+ (msg, resultIndex) => msg.isResultMessage() && msg.actionExecutionId === message.id && resultIndex === actionExecutionIndex + 1
623
+ );
624
+ }
625
+ return true;
626
+ });
627
+ const repairedMessageIds = repairedMessages.map((message) => message.id);
628
+ setMessages(repairedMessages);
629
+ if ((_l = agentSessionRef.current) == null ? void 0 : _l.nodeName) {
630
+ setAgentSession({
631
+ threadId: agentSessionRef.current.threadId,
632
+ agentName: agentSessionRef.current.agentName,
633
+ nodeName: "__end__"
634
+ });
635
+ }
636
+ return newMessages.filter((message) => repairedMessageIds.includes(message.id));
549
637
  } else {
550
638
  return newMessages.slice();
551
639
  }
@@ -602,7 +690,7 @@ function useChat(options) {
602
690
  }), [isLoading, messages, setMessages, runChatCompletionAndHandleFunctionCall]);
603
691
  const stop = () => {
604
692
  var _a;
605
- (_a = abortControllerRef.current) == null ? void 0 : _a.abort();
693
+ (_a = chatAbortControllerRef.current) == null ? void 0 : _a.abort("Stop was called");
606
694
  };
607
695
  return {
608
696
  append,
@@ -611,11 +699,28 @@ function useChat(options) {
611
699
  runChatCompletion: () => runChatCompletionRef.current(messages)
612
700
  };
613
701
  }
702
+ function constructFinalMessages(syncedMessages, previousMessages, newMessages) {
703
+ const finalMessages = syncedMessages.length > 0 ? [...syncedMessages] : [...previousMessages, ...newMessages];
704
+ if (syncedMessages.length > 0) {
705
+ const messagesWithAgentState = [...previousMessages, ...newMessages];
706
+ let previousMessageId = void 0;
707
+ for (const message of messagesWithAgentState) {
708
+ if (message.isAgentStateMessage()) {
709
+ const index = finalMessages.findIndex((msg) => msg.id === previousMessageId);
710
+ if (index !== -1) {
711
+ finalMessages.splice(index + 1, 0, message);
712
+ }
713
+ }
714
+ previousMessageId = message.id;
715
+ }
716
+ }
717
+ return finalMessages;
718
+ }
614
719
 
615
720
  // src/components/copilot-provider/copilotkit.tsx
616
721
  var import_react7 = require("react");
617
722
  var import_react_dom = require("react-dom");
618
- var import_shared2 = require("@copilotkit/shared");
723
+ var import_shared3 = require("@copilotkit/shared");
619
724
  var import_jsx_runtime4 = require("react/jsx-runtime");
620
725
  var defaultCopilotContextCategories = ["global"];
621
726
 
@@ -638,7 +743,13 @@ function useCopilotChat(_a = {}) {
638
743
  setCoagentStatesWithRef,
639
744
  coAgentStateRenders,
640
745
  agentSession,
641
- setAgentSession
746
+ setAgentSession,
747
+ agentLock,
748
+ threadId,
749
+ setThreadId,
750
+ runId,
751
+ setRunId,
752
+ chatAbortControllerRef
642
753
  } = useCopilotContext();
643
754
  const { messages, setMessages } = useCopilotMessagesContext();
644
755
  const latestGetContextString = useUpdatedRef(getContextString);
@@ -651,9 +762,9 @@ function useCopilotChat(_a = {}) {
651
762
  const makeSystemMessageCallback = (0, import_react8.useCallback)(() => {
652
763
  const systemMessageMaker = makeSystemMessage || defaultSystemMessage;
653
764
  const contextString = latestGetContextString.current([], defaultCopilotContextCategories);
654
- return new import_runtime_client_gql3.TextMessage({
765
+ return new import_runtime_client_gql4.TextMessage({
655
766
  content: systemMessageMaker(contextString, chatInstructions),
656
- role: import_runtime_client_gql3.Role.System
767
+ role: import_runtime_client_gql4.Role.System
657
768
  });
658
769
  }, [getContextString, makeSystemMessage, chatInstructions]);
659
770
  const onCoAgentStateRender = useAsyncCallback(
@@ -688,7 +799,12 @@ function useCopilotChat(_a = {}) {
688
799
  coagentStatesRef,
689
800
  setCoagentStatesWithRef,
690
801
  agentSession,
691
- setAgentSession
802
+ setAgentSession,
803
+ threadId,
804
+ setThreadId,
805
+ runId,
806
+ setRunId,
807
+ chatAbortControllerRef
692
808
  }));
693
809
  const latestAppend = useUpdatedRef(append);
694
810
  const latestAppendFunc = useAsyncCallback(
@@ -723,12 +839,38 @@ function useCopilotChat(_a = {}) {
723
839
  const latestRunChatCompletionFunc = useAsyncCallback(() => __async(this, null, function* () {
724
840
  return yield latestRunChatCompletion.current();
725
841
  }), [latestRunChatCompletion]);
842
+ const reset = (0, import_react8.useCallback)(() => {
843
+ latestStopFunc();
844
+ setMessages([]);
845
+ setThreadId(null);
846
+ setRunId(null);
847
+ setCoagentStatesWithRef({});
848
+ let initialAgentSession = null;
849
+ if (agentLock) {
850
+ initialAgentSession = {
851
+ agentName: agentLock
852
+ };
853
+ }
854
+ setAgentSession(initialAgentSession);
855
+ }, [
856
+ latestStopFunc,
857
+ setMessages,
858
+ setThreadId,
859
+ setCoagentStatesWithRef,
860
+ setAgentSession,
861
+ agentLock
862
+ ]);
863
+ const latestReset = useUpdatedRef(reset);
864
+ const latestResetFunc = (0, import_react8.useCallback)(() => {
865
+ return latestReset.current();
866
+ }, [latestReset]);
726
867
  return {
727
868
  visibleMessages: messages,
728
869
  appendMessage: latestAppendFunc,
729
870
  setMessages: latestSetMessagesFunc,
730
871
  reloadMessages: latestReloadFunc,
731
872
  stopGeneration: latestStopFunc,
873
+ reset: latestResetFunc,
732
874
  deleteMessage: latestDeleteFunc,
733
875
  runChatCompletion: latestRunChatCompletionFunc,
734
876
  isLoading
@@ -811,7 +953,11 @@ function useCoAgent(options) {
811
953
  } else if (coagentStates[name] === void 0) {
812
954
  setState(options.initialState === void 0 ? {} : options.initialState);
813
955
  }
814
- }, [isExternalStateManagement(options) ? JSON.stringify(options.state) : void 0]);
956
+ }, [
957
+ isExternalStateManagement(options) ? JSON.stringify(options.state) : void 0,
958
+ // reset initialstate on reset
959
+ coagentStates[name] === void 0
960
+ ]);
815
961
  const runAgentCallback = useAsyncCallback(
816
962
  (hint) => __async(this, null, function* () {
817
963
  yield runAgent(name, context, appendMessage, runChatCompletion, hint);
@@ -840,6 +986,17 @@ function stopAgent(name, context) {
840
986
  const { agentSession, setAgentSession } = context;
841
987
  if (agentSession && agentSession.agentName === name) {
842
988
  setAgentSession(null);
989
+ context.setCoagentStates((prevAgentStates) => {
990
+ return __spreadProps(__spreadValues({}, prevAgentStates), {
991
+ [name]: __spreadProps(__spreadValues({}, prevAgentStates[name]), {
992
+ running: false,
993
+ active: false,
994
+ threadId: void 0,
995
+ nodeName: void 0,
996
+ runId: void 0
997
+ })
998
+ });
999
+ });
843
1000
  } else {
844
1001
  console.warn(`No agent session found for ${name}`);
845
1002
  }
@@ -875,6 +1032,9 @@ function runAgent(name, context, appendMessage, runChatCompletion, hint) {
875
1032
  }
876
1033
  // Annotate the CommonJS export names for ESM import in node:
877
1034
  0 && (module.exports = {
1035
+ runAgent,
1036
+ startAgent,
1037
+ stopAgent,
878
1038
  useCoAgent
879
1039
  });
880
1040
  //# sourceMappingURL=use-coagent.js.map