@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/index.ts
80
80
  var hooks_exports = {};
81
81
  __export(hooks_exports, {
82
+ runAgent: () => runAgent,
83
+ startAgent: () => startAgent,
84
+ stopAgent: () => stopAgent,
82
85
  useCoAgent: () => useCoAgent,
83
86
  useCoAgentStateRender: () => useCoAgentStateRender,
84
87
  useCopilotAction: () => useCopilotAction,
@@ -146,7 +149,15 @@ var emptyCopilotContext = {
146
149
  },
147
150
  agentSession: null,
148
151
  setAgentSession: () => {
149
- }
152
+ },
153
+ agentLock: null,
154
+ threadId: null,
155
+ setThreadId: () => {
156
+ },
157
+ runId: null,
158
+ setRunId: () => {
159
+ },
160
+ chatAbortControllerRef: { current: null }
150
161
  };
151
162
  var CopilotContext = import_react.default.createContext(emptyCopilotContext);
152
163
  function useCopilotContext() {
@@ -162,12 +173,37 @@ function returnAndThrowInDebug(value) {
162
173
  }
163
174
 
164
175
  // src/hooks/use-copilot-chat.ts
165
- var import_runtime_client_gql3 = require("@copilotkit/runtime-client-gql");
176
+ var import_runtime_client_gql4 = require("@copilotkit/runtime-client-gql");
166
177
 
167
178
  // src/hooks/use-chat.ts
168
179
  var import_react5 = require("react");
180
+ var import_shared2 = require("@copilotkit/shared");
181
+ var import_runtime_client_gql3 = require("@copilotkit/runtime-client-gql");
182
+
183
+ // src/types/frontend-action.ts
184
+ var import_runtime_client_gql = require("@copilotkit/runtime-client-gql");
169
185
  var import_shared = require("@copilotkit/shared");
170
- var import_runtime_client_gql2 = require("@copilotkit/runtime-client-gql");
186
+ function processActionsForRuntimeRequest(actions) {
187
+ const filteredActions = actions.filter(
188
+ (action) => action.available !== import_runtime_client_gql.ActionInputAvailability.Disabled && action.disabled !== true && action.name !== "*"
189
+ ).map((action) => {
190
+ let available = import_runtime_client_gql.ActionInputAvailability.Enabled;
191
+ if (action.disabled) {
192
+ available = import_runtime_client_gql.ActionInputAvailability.Disabled;
193
+ } else if (action.available === "disabled") {
194
+ available = import_runtime_client_gql.ActionInputAvailability.Disabled;
195
+ } else if (action.available === "remote") {
196
+ available = import_runtime_client_gql.ActionInputAvailability.Remote;
197
+ }
198
+ return {
199
+ name: action.name,
200
+ description: action.description || "",
201
+ jsonSchema: JSON.stringify((0, import_shared.actionParametersToJsonSchema)(action.parameters || [])),
202
+ available
203
+ };
204
+ });
205
+ return filteredActions;
206
+ }
171
207
 
172
208
  // src/components/toast/toast-provider.tsx
173
209
  var import_react3 = require("react");
@@ -297,13 +333,13 @@ function useToast() {
297
333
  }
298
334
 
299
335
  // src/hooks/use-copilot-runtime-client.ts
300
- var import_runtime_client_gql = require("@copilotkit/runtime-client-gql");
336
+ var import_runtime_client_gql2 = require("@copilotkit/runtime-client-gql");
301
337
  var import_react4 = require("react");
302
338
  var useCopilotRuntimeClient = (options) => {
303
339
  const { addGraphQLErrorsToast } = useToast();
304
340
  const addErrorToast = useErrorToast();
305
341
  const runtimeClient = (0, import_react4.useMemo)(() => {
306
- return new import_runtime_client_gql.CopilotRuntimeClient(__spreadProps(__spreadValues({}, options), {
342
+ return new import_runtime_client_gql2.CopilotRuntimeClient(__spreadProps(__spreadValues({}, options), {
307
343
  handleGQLErrors: (error) => {
308
344
  if (error.graphQLErrors.length) {
309
345
  addGraphQLErrorsToast(error.graphQLErrors);
@@ -332,17 +368,23 @@ function useChat(options) {
332
368
  setCoagentStatesWithRef,
333
369
  coagentStatesRef,
334
370
  agentSession,
335
- setAgentSession
371
+ setAgentSession,
372
+ threadId,
373
+ setThreadId,
374
+ runId,
375
+ setRunId,
376
+ chatAbortControllerRef
336
377
  } = options;
337
- const abortControllerRef = (0, import_react5.useRef)();
338
- const threadIdRef = (0, import_react5.useRef)(null);
339
- const runIdRef = (0, import_react5.useRef)(null);
340
378
  const { addGraphQLErrorsToast } = useToast();
341
379
  const runChatCompletionRef = (0, import_react5.useRef)();
342
380
  const agentSessionRef = (0, import_react5.useRef)(agentSession);
343
381
  agentSessionRef.current = agentSession;
382
+ const threadIdRef = (0, import_react5.useRef)(threadId);
383
+ threadIdRef.current = threadId;
384
+ const runIdRef = (0, import_react5.useRef)(runId);
385
+ runIdRef.current = runId;
344
386
  const publicApiKey = copilotConfig.publicApiKey;
345
- const headers = __spreadValues(__spreadValues({}, copilotConfig.headers || {}), publicApiKey ? { [import_shared.COPILOT_CLOUD_PUBLIC_API_KEY_HEADER]: publicApiKey } : {});
387
+ const headers = __spreadValues(__spreadValues({}, copilotConfig.headers || {}), publicApiKey ? { [import_shared2.COPILOT_CLOUD_PUBLIC_API_KEY_HEADER]: publicApiKey } : {});
346
388
  const runtimeClient = useCopilotRuntimeClient({
347
389
  url: copilotConfig.chatApiEndpoint,
348
390
  publicApiKey: copilotConfig.publicApiKey,
@@ -351,48 +393,29 @@ function useChat(options) {
351
393
  });
352
394
  const runChatCompletion = useAsyncCallback(
353
395
  (previousMessages) => __async(this, null, function* () {
354
- var _a, _b, _c, _d, _e, _f, _g, _h, _i;
396
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
355
397
  setIsLoading(true);
356
398
  let newMessages = [
357
- new import_runtime_client_gql2.TextMessage({
399
+ new import_runtime_client_gql3.TextMessage({
358
400
  content: "",
359
- role: import_runtime_client_gql2.Role.Assistant
401
+ role: import_runtime_client_gql3.Role.Assistant
360
402
  })
361
403
  ];
362
- const abortController = new AbortController();
363
- abortControllerRef.current = abortController;
404
+ chatAbortControllerRef.current = new AbortController();
364
405
  setMessages([...previousMessages, ...newMessages]);
365
406
  const systemMessage = makeSystemMessageCallback();
366
407
  const messagesWithContext = [systemMessage, ...initialMessages || [], ...previousMessages];
408
+ const isAgentRun = agentSessionRef.current !== null;
367
409
  const stream = runtimeClient.asStream(
368
410
  runtimeClient.generateCopilotResponse({
369
411
  data: __spreadProps(__spreadValues(__spreadProps(__spreadValues({
370
412
  frontend: {
371
- actions: actions.filter(
372
- (action) => action.available !== import_runtime_client_gql2.ActionInputAvailability.Disabled || !action.disabled
373
- ).map((action) => {
374
- let available = import_runtime_client_gql2.ActionInputAvailability.Enabled;
375
- if (action.disabled) {
376
- available = import_runtime_client_gql2.ActionInputAvailability.Disabled;
377
- } else if (action.available === "disabled") {
378
- available = import_runtime_client_gql2.ActionInputAvailability.Disabled;
379
- } else if (action.available === "remote") {
380
- available = import_runtime_client_gql2.ActionInputAvailability.Remote;
381
- }
382
- return {
383
- name: action.name,
384
- description: action.description || "",
385
- jsonSchema: JSON.stringify(
386
- (0, import_shared.actionParametersToJsonSchema)(action.parameters || [])
387
- ),
388
- available
389
- };
390
- }),
413
+ actions: processActionsForRuntimeRequest(actions),
391
414
  url: window.location.href
392
415
  },
393
416
  threadId: threadIdRef.current,
394
417
  runId: runIdRef.current,
395
- messages: (0, import_runtime_client_gql2.convertMessagesToGqlInput)((0, import_runtime_client_gql2.filterAgentStateMessages)(messagesWithContext))
418
+ messages: (0, import_runtime_client_gql3.convertMessagesToGqlInput)((0, import_runtime_client_gql3.filterAgentStateMessages)(messagesWithContext))
396
419
  }, copilotConfig.cloud ? {
397
420
  cloud: __spreadValues({}, ((_c = (_b = (_a = copilotConfig.cloud.guardrails) == null ? void 0 : _a.input) == null ? void 0 : _b.restrictToTopic) == null ? void 0 : _c.enabled) ? {
398
421
  guardrails: {
@@ -404,7 +427,7 @@ function useChat(options) {
404
427
  } : {})
405
428
  } : {}), {
406
429
  metadata: {
407
- requestType: import_runtime_client_gql2.CopilotRequestType.Chat
430
+ requestType: import_runtime_client_gql3.CopilotRequestType.Chat
408
431
  }
409
432
  }), agentSessionRef.current ? {
410
433
  agentSession: agentSessionRef.current
@@ -415,14 +438,15 @@ function useChat(options) {
415
438
  }))
416
439
  }),
417
440
  properties: copilotConfig.properties,
418
- signal: (_d = abortControllerRef.current) == null ? void 0 : _d.signal
441
+ signal: (_d = chatAbortControllerRef.current) == null ? void 0 : _d.signal
419
442
  })
420
443
  );
421
444
  const guardrailsEnabled = ((_g = (_f = (_e = copilotConfig.cloud) == null ? void 0 : _e.guardrails) == null ? void 0 : _f.input) == null ? void 0 : _g.restrictToTopic.enabled) || false;
422
445
  const reader = stream.getReader();
423
- let actionResults = {};
424
446
  let executedCoAgentStateRenders = [];
425
447
  let followUp = void 0;
448
+ let messages2 = [];
449
+ let syncedMessages = [];
426
450
  try {
427
451
  while (true) {
428
452
  let done, value;
@@ -434,6 +458,9 @@ function useChat(options) {
434
458
  break;
435
459
  }
436
460
  if (done) {
461
+ if (chatAbortControllerRef.current.signal.aborted) {
462
+ return [];
463
+ }
437
464
  break;
438
465
  }
439
466
  if (!(value == null ? void 0 : value.generateCopilotResponse)) {
@@ -441,8 +468,10 @@ function useChat(options) {
441
468
  }
442
469
  threadIdRef.current = value.generateCopilotResponse.threadId || null;
443
470
  runIdRef.current = value.generateCopilotResponse.runId || null;
444
- const messages2 = (0, import_runtime_client_gql2.convertGqlOutputToMessages)(
445
- (0, import_runtime_client_gql2.filterAdjacentAgentStateMessages)(value.generateCopilotResponse.messages)
471
+ setThreadId(threadIdRef.current);
472
+ setRunId(runIdRef.current);
473
+ messages2 = (0, import_runtime_client_gql3.convertGqlOutputToMessages)(
474
+ (0, import_runtime_client_gql3.filterAdjacentAgentStateMessages)(value.generateCopilotResponse.messages)
446
475
  );
447
476
  if (messages2.length === 0) {
448
477
  continue;
@@ -450,44 +479,16 @@ function useChat(options) {
450
479
  newMessages = [];
451
480
  if (((_h = value.generateCopilotResponse.status) == null ? void 0 : _h.__typename) === "FailedResponseStatus" && value.generateCopilotResponse.status.reason === "GUARDRAILS_VALIDATION_FAILED") {
452
481
  newMessages = [
453
- new import_runtime_client_gql2.TextMessage({
454
- role: import_runtime_client_gql2.MessageRole.Assistant,
482
+ new import_runtime_client_gql3.TextMessage({
483
+ role: import_runtime_client_gql3.MessageRole.Assistant,
455
484
  content: ((_i = value.generateCopilotResponse.status.details) == null ? void 0 : _i.guardrailsReason) || ""
456
485
  })
457
486
  ];
487
+ setMessages([...previousMessages, ...newMessages]);
488
+ break;
458
489
  } else {
490
+ newMessages = [...messages2];
459
491
  for (const message of messages2) {
460
- newMessages.push(message);
461
- if (message.isActionExecutionMessage() && message.status.code !== import_runtime_client_gql2.MessageStatusCode.Pending && message.scope === "client" && onFunctionCall) {
462
- if (!(message.id in actionResults)) {
463
- if (guardrailsEnabled && value.generateCopilotResponse.status === void 0) {
464
- break;
465
- }
466
- try {
467
- setMessages([...previousMessages, ...newMessages]);
468
- const action = actions.find((action2) => action2.name === message.name);
469
- if (action) {
470
- followUp = action.followUp;
471
- }
472
- const result = yield onFunctionCall({
473
- messages: previousMessages,
474
- name: message.name,
475
- args: message.arguments
476
- });
477
- actionResults[message.id] = result;
478
- } catch (e) {
479
- actionResults[message.id] = `Failed to execute action ${message.name}`;
480
- console.error(`Failed to execute action ${message.name}: ${e}`);
481
- }
482
- }
483
- newMessages.push(
484
- new import_runtime_client_gql2.ResultMessage({
485
- result: import_runtime_client_gql2.ResultMessage.encodeResult(actionResults[message.id]),
486
- actionExecutionId: message.id,
487
- actionName: message.name
488
- })
489
- );
490
- }
491
492
  if (message.isAgentStateMessage() && !message.active && !executedCoAgentStateRenders.includes(message.id) && onCoAgentStateRender) {
492
493
  if (guardrailsEnabled && value.generateCopilotResponse.status === void 0) {
493
494
  break;
@@ -502,6 +503,11 @@ function useChat(options) {
502
503
  }
503
504
  const lastAgentStateMessage = [...messages2].reverse().find((message) => message.isAgentStateMessage());
504
505
  if (lastAgentStateMessage) {
506
+ if (lastAgentStateMessage.state.messages && lastAgentStateMessage.state.messages.length > 0) {
507
+ syncedMessages = (0, import_runtime_client_gql3.loadMessagesFromJsonRepresentation)(
508
+ lastAgentStateMessage.state.messages
509
+ );
510
+ }
505
511
  setCoagentStatesWithRef((prevAgentStates) => __spreadProps(__spreadValues({}, prevAgentStates), {
506
512
  [lastAgentStateMessage.agentName]: {
507
513
  name: lastAgentStateMessage.agentName,
@@ -528,14 +534,96 @@ function useChat(options) {
528
534
  setMessages([...previousMessages, ...newMessages]);
529
535
  }
530
536
  }
537
+ const finalMessages = constructFinalMessages(syncedMessages, previousMessages, newMessages);
538
+ let didExecuteAction = false;
539
+ if (onFunctionCall) {
540
+ const lastMessages = [];
541
+ for (let i = finalMessages.length - 1; i >= 0; i--) {
542
+ const message = finalMessages[i];
543
+ if (message.isActionExecutionMessage() && message.status.code !== import_runtime_client_gql3.MessageStatusCode.Pending) {
544
+ lastMessages.unshift(message);
545
+ } else {
546
+ break;
547
+ }
548
+ }
549
+ for (const message of lastMessages) {
550
+ setMessages(finalMessages);
551
+ const action = actions.find((action2) => action2.name === message.name);
552
+ if (action) {
553
+ followUp = action.followUp;
554
+ let result;
555
+ try {
556
+ result = yield Promise.race([
557
+ onFunctionCall({
558
+ messages: previousMessages,
559
+ name: message.name,
560
+ args: message.arguments
561
+ }),
562
+ new Promise(
563
+ (resolve) => {
564
+ var _a2;
565
+ return (_a2 = chatAbortControllerRef.current) == null ? void 0 : _a2.signal.addEventListener(
566
+ "abort",
567
+ () => resolve("Operation was aborted by the user")
568
+ );
569
+ }
570
+ ),
571
+ // if the user stopped generation, we also abort consecutive actions
572
+ new Promise((resolve) => {
573
+ var _a2;
574
+ if ((_a2 = chatAbortControllerRef.current) == null ? void 0 : _a2.signal.aborted) {
575
+ resolve("Operation was aborted by the user");
576
+ }
577
+ })
578
+ ]);
579
+ } catch (e) {
580
+ result = `Failed to execute action ${message.name}`;
581
+ console.error(`Failed to execute action ${message.name}: ${e}`);
582
+ }
583
+ didExecuteAction = true;
584
+ const messageIndex = finalMessages.findIndex((msg) => msg.id === message.id);
585
+ finalMessages.splice(
586
+ messageIndex + 1,
587
+ 0,
588
+ new import_runtime_client_gql3.ResultMessage({
589
+ id: "result-" + message.id,
590
+ result: import_runtime_client_gql3.ResultMessage.encodeResult(result),
591
+ actionExecutionId: message.id,
592
+ actionName: message.name
593
+ })
594
+ );
595
+ }
596
+ }
597
+ setMessages(finalMessages);
598
+ }
531
599
  if (
532
600
  // if followUp is not explicitly false
533
- followUp !== false && // if we have client side results
534
- (Object.values(actionResults).length || // or the last message we received is a result
535
- newMessages.length && newMessages[newMessages.length - 1].isResultMessage())
601
+ followUp !== false && // and we executed an action
602
+ (didExecuteAction || // the last message is a server side result
603
+ !isAgentRun && finalMessages.length && finalMessages[finalMessages.length - 1].isResultMessage()) && // the user did not stop generation
604
+ !((_j = chatAbortControllerRef.current) == null ? void 0 : _j.signal.aborted)
536
605
  ) {
537
606
  yield new Promise((resolve) => setTimeout(resolve, 10));
538
- return yield runChatCompletionRef.current([...previousMessages, ...newMessages]);
607
+ return yield runChatCompletionRef.current(finalMessages);
608
+ } else if ((_k = chatAbortControllerRef.current) == null ? void 0 : _k.signal.aborted) {
609
+ const repairedMessages = finalMessages.filter((message, actionExecutionIndex) => {
610
+ if (message.isActionExecutionMessage()) {
611
+ return finalMessages.find(
612
+ (msg, resultIndex) => msg.isResultMessage() && msg.actionExecutionId === message.id && resultIndex === actionExecutionIndex + 1
613
+ );
614
+ }
615
+ return true;
616
+ });
617
+ const repairedMessageIds = repairedMessages.map((message) => message.id);
618
+ setMessages(repairedMessages);
619
+ if ((_l = agentSessionRef.current) == null ? void 0 : _l.nodeName) {
620
+ setAgentSession({
621
+ threadId: agentSessionRef.current.threadId,
622
+ agentName: agentSessionRef.current.agentName,
623
+ nodeName: "__end__"
624
+ });
625
+ }
626
+ return newMessages.filter((message) => repairedMessageIds.includes(message.id));
539
627
  } else {
540
628
  return newMessages.slice();
541
629
  }
@@ -592,7 +680,7 @@ function useChat(options) {
592
680
  }), [isLoading, messages, setMessages, runChatCompletionAndHandleFunctionCall]);
593
681
  const stop = () => {
594
682
  var _a;
595
- (_a = abortControllerRef.current) == null ? void 0 : _a.abort();
683
+ (_a = chatAbortControllerRef.current) == null ? void 0 : _a.abort("Stop was called");
596
684
  };
597
685
  return {
598
686
  append,
@@ -601,11 +689,28 @@ function useChat(options) {
601
689
  runChatCompletion: () => runChatCompletionRef.current(messages)
602
690
  };
603
691
  }
692
+ function constructFinalMessages(syncedMessages, previousMessages, newMessages) {
693
+ const finalMessages = syncedMessages.length > 0 ? [...syncedMessages] : [...previousMessages, ...newMessages];
694
+ if (syncedMessages.length > 0) {
695
+ const messagesWithAgentState = [...previousMessages, ...newMessages];
696
+ let previousMessageId = void 0;
697
+ for (const message of messagesWithAgentState) {
698
+ if (message.isAgentStateMessage()) {
699
+ const index = finalMessages.findIndex((msg) => msg.id === previousMessageId);
700
+ if (index !== -1) {
701
+ finalMessages.splice(index + 1, 0, message);
702
+ }
703
+ }
704
+ previousMessageId = message.id;
705
+ }
706
+ }
707
+ return finalMessages;
708
+ }
604
709
 
605
710
  // src/components/copilot-provider/copilotkit.tsx
606
711
  var import_react7 = require("react");
607
712
  var import_react_dom = require("react-dom");
608
- var import_shared2 = require("@copilotkit/shared");
713
+ var import_shared3 = require("@copilotkit/shared");
609
714
 
610
715
  // src/context/copilot-messages-context.tsx
611
716
  var import_react6 = __toESM(require("react"));
@@ -647,7 +752,13 @@ function useCopilotChat(_a = {}) {
647
752
  setCoagentStatesWithRef,
648
753
  coAgentStateRenders,
649
754
  agentSession,
650
- setAgentSession
755
+ setAgentSession,
756
+ agentLock,
757
+ threadId,
758
+ setThreadId,
759
+ runId,
760
+ setRunId,
761
+ chatAbortControllerRef
651
762
  } = useCopilotContext();
652
763
  const { messages, setMessages } = useCopilotMessagesContext();
653
764
  const latestGetContextString = useUpdatedRef(getContextString);
@@ -660,9 +771,9 @@ function useCopilotChat(_a = {}) {
660
771
  const makeSystemMessageCallback = (0, import_react8.useCallback)(() => {
661
772
  const systemMessageMaker = makeSystemMessage || defaultSystemMessage;
662
773
  const contextString = latestGetContextString.current([], defaultCopilotContextCategories);
663
- return new import_runtime_client_gql3.TextMessage({
774
+ return new import_runtime_client_gql4.TextMessage({
664
775
  content: systemMessageMaker(contextString, chatInstructions),
665
- role: import_runtime_client_gql3.Role.System
776
+ role: import_runtime_client_gql4.Role.System
666
777
  });
667
778
  }, [getContextString, makeSystemMessage, chatInstructions]);
668
779
  const onCoAgentStateRender = useAsyncCallback(
@@ -697,7 +808,12 @@ function useCopilotChat(_a = {}) {
697
808
  coagentStatesRef,
698
809
  setCoagentStatesWithRef,
699
810
  agentSession,
700
- setAgentSession
811
+ setAgentSession,
812
+ threadId,
813
+ setThreadId,
814
+ runId,
815
+ setRunId,
816
+ chatAbortControllerRef
701
817
  }));
702
818
  const latestAppend = useUpdatedRef(append);
703
819
  const latestAppendFunc = useAsyncCallback(
@@ -732,12 +848,38 @@ function useCopilotChat(_a = {}) {
732
848
  const latestRunChatCompletionFunc = useAsyncCallback(() => __async(this, null, function* () {
733
849
  return yield latestRunChatCompletion.current();
734
850
  }), [latestRunChatCompletion]);
851
+ const reset = (0, import_react8.useCallback)(() => {
852
+ latestStopFunc();
853
+ setMessages([]);
854
+ setThreadId(null);
855
+ setRunId(null);
856
+ setCoagentStatesWithRef({});
857
+ let initialAgentSession = null;
858
+ if (agentLock) {
859
+ initialAgentSession = {
860
+ agentName: agentLock
861
+ };
862
+ }
863
+ setAgentSession(initialAgentSession);
864
+ }, [
865
+ latestStopFunc,
866
+ setMessages,
867
+ setThreadId,
868
+ setCoagentStatesWithRef,
869
+ setAgentSession,
870
+ agentLock
871
+ ]);
872
+ const latestReset = useUpdatedRef(reset);
873
+ const latestResetFunc = (0, import_react8.useCallback)(() => {
874
+ return latestReset.current();
875
+ }, [latestReset]);
735
876
  return {
736
877
  visibleMessages: messages,
737
878
  appendMessage: latestAppendFunc,
738
879
  setMessages: latestSetMessagesFunc,
739
880
  reloadMessages: latestReloadFunc,
740
881
  stopGeneration: latestStopFunc,
882
+ reset: latestResetFunc,
741
883
  deleteMessage: latestDeleteFunc,
742
884
  runChatCompletion: latestRunChatCompletionFunc,
743
885
  isLoading
@@ -775,14 +917,18 @@ ${additionalInstructions}` : "");
775
917
  }
776
918
 
777
919
  // src/hooks/use-copilot-action.ts
778
- var import_shared3 = require("@copilotkit/shared");
920
+ var import_shared4 = require("@copilotkit/shared");
779
921
  var import_react9 = require("react");
780
922
  function useCopilotAction(action, dependencies) {
781
923
  const { setAction, removeAction, actions, chatComponentsCache } = useCopilotContext();
782
- const idRef = (0, import_react9.useRef)((0, import_shared3.randomId)());
924
+ const idRef = (0, import_react9.useRef)((0, import_shared4.randomId)());
783
925
  const renderAndWaitRef = (0, import_react9.useRef)(null);
784
926
  action = __spreadValues({}, action);
785
- if (action.renderAndWait || action.renderAndWaitForResponse) {
927
+ if (
928
+ // renderAndWaitForResponse is not available for catch all actions
929
+ isFrontendAction(action) && // check if renderAndWaitForResponse is set
930
+ (action.renderAndWait || action.renderAndWaitForResponse)
931
+ ) {
786
932
  const renderAndWait = action.renderAndWait || action.renderAndWaitForResponse;
787
933
  action.renderAndWait = void 0;
788
934
  action.renderAndWaitForResponse = void 0;
@@ -820,7 +966,9 @@ function useCopilotAction(action, dependencies) {
820
966
  }
821
967
  if (dependencies === void 0) {
822
968
  if (actions[idRef.current]) {
823
- actions[idRef.current].handler = action.handler;
969
+ if (isFrontendAction(action)) {
970
+ actions[idRef.current].handler = action.handler;
971
+ }
824
972
  if (typeof action.render === "function") {
825
973
  if (chatComponentsCache.current !== null) {
826
974
  chatComponentsCache.current.actions[action.name] = action.render;
@@ -839,23 +987,26 @@ function useCopilotAction(action, dependencies) {
839
987
  }, [
840
988
  setAction,
841
989
  removeAction,
842
- action.description,
990
+ isFrontendAction(action) ? action.description : void 0,
843
991
  action.name,
844
- action.disabled,
845
- action.available,
992
+ isFrontendAction(action) ? action.disabled : void 0,
993
+ isFrontendAction(action) ? action.available : void 0,
846
994
  // This should be faster than deep equality checking
847
995
  // In addition, all major JS engines guarantee the order of object keys
848
- JSON.stringify(action.parameters),
996
+ JSON.stringify(isFrontendAction(action) ? action.parameters : []),
849
997
  // include render only if it's a string
850
998
  typeof action.render === "string" ? action.render : void 0,
851
999
  // dependencies set by the developer
852
1000
  ...dependencies || []
853
1001
  ]);
854
1002
  }
1003
+ function isFrontendAction(action) {
1004
+ return action.name !== "*";
1005
+ }
855
1006
 
856
1007
  // src/hooks/use-coagent-state-render.ts
857
1008
  var import_react10 = require("react");
858
- var import_shared4 = require("@copilotkit/shared");
1009
+ var import_shared5 = require("@copilotkit/shared");
859
1010
  function useCoAgentStateRender(action, dependencies) {
860
1011
  const {
861
1012
  setCoAgentStateRender,
@@ -863,7 +1014,7 @@ function useCoAgentStateRender(action, dependencies) {
863
1014
  coAgentStateRenders,
864
1015
  chatComponentsCache
865
1016
  } = (0, import_react10.useContext)(CopilotContext);
866
- const idRef = (0, import_react10.useRef)((0, import_shared4.randomId)());
1017
+ const idRef = (0, import_react10.useRef)((0, import_shared5.randomId)());
867
1018
  const key = `${action.name}-${action.nodeName || "global"}`;
868
1019
  if (dependencies === void 0) {
869
1020
  if (coAgentStateRenders[idRef.current]) {
@@ -976,7 +1127,11 @@ function useCoAgent(options) {
976
1127
  } else if (coagentStates[name] === void 0) {
977
1128
  setState(options.initialState === void 0 ? {} : options.initialState);
978
1129
  }
979
- }, [isExternalStateManagement(options) ? JSON.stringify(options.state) : void 0]);
1130
+ }, [
1131
+ isExternalStateManagement(options) ? JSON.stringify(options.state) : void 0,
1132
+ // reset initialstate on reset
1133
+ coagentStates[name] === void 0
1134
+ ]);
980
1135
  const runAgentCallback = useAsyncCallback(
981
1136
  (hint) => __async(this, null, function* () {
982
1137
  yield runAgent(name, context, appendMessage, runChatCompletion, hint);
@@ -1005,6 +1160,17 @@ function stopAgent(name, context) {
1005
1160
  const { agentSession, setAgentSession } = context;
1006
1161
  if (agentSession && agentSession.agentName === name) {
1007
1162
  setAgentSession(null);
1163
+ context.setCoagentStates((prevAgentStates) => {
1164
+ return __spreadProps(__spreadValues({}, prevAgentStates), {
1165
+ [name]: __spreadProps(__spreadValues({}, prevAgentStates[name]), {
1166
+ running: false,
1167
+ active: false,
1168
+ threadId: void 0,
1169
+ nodeName: void 0,
1170
+ runId: void 0
1171
+ })
1172
+ });
1173
+ });
1008
1174
  } else {
1009
1175
  console.warn(`No agent session found for ${name}`);
1010
1176
  }
@@ -1040,6 +1206,9 @@ function runAgent(name, context, appendMessage, runChatCompletion, hint) {
1040
1206
  }
1041
1207
  // Annotate the CommonJS export names for ESM import in node:
1042
1208
  0 && (module.exports = {
1209
+ runAgent,
1210
+ startAgent,
1211
+ stopAgent,
1043
1212
  useCoAgent,
1044
1213
  useCoAgentStateRender,
1045
1214
  useCopilotAction,