@copilotkit/react-core 1.9.2-next.19 → 1.9.2-next.20

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 (42) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/{chunk-XJ34ATKP.mjs → chunk-FN3UA2ZE.mjs} +2 -2
  3. package/dist/{chunk-7EJ4IWSA.mjs → chunk-K42OD3J6.mjs} +2 -2
  4. package/dist/{chunk-5DODGOMM.mjs → chunk-MTAJI7HV.mjs} +77 -45
  5. package/dist/chunk-MTAJI7HV.mjs.map +1 -0
  6. package/dist/{chunk-WR3XTNHJ.mjs → chunk-NJA5ZLAZ.mjs} +26 -7
  7. package/dist/chunk-NJA5ZLAZ.mjs.map +1 -0
  8. package/dist/{chunk-5PE2XROA.mjs → chunk-UGJGKBFB.mjs} +2 -2
  9. package/dist/{chunk-BHGYBOR3.mjs → chunk-ZOMEQ3XC.mjs} +2 -2
  10. package/dist/hooks/index.js +102 -51
  11. package/dist/hooks/index.js.map +1 -1
  12. package/dist/hooks/index.mjs +6 -6
  13. package/dist/hooks/use-chat.js +170 -138
  14. package/dist/hooks/use-chat.js.map +1 -1
  15. package/dist/hooks/use-chat.mjs +1 -1
  16. package/dist/hooks/use-coagent.js +77 -45
  17. package/dist/hooks/use-coagent.js.map +1 -1
  18. package/dist/hooks/use-coagent.mjs +3 -3
  19. package/dist/hooks/use-copilot-action.js +25 -6
  20. package/dist/hooks/use-copilot-action.js.map +1 -1
  21. package/dist/hooks/use-copilot-action.mjs +1 -1
  22. package/dist/hooks/use-copilot-authenticated-action.js +25 -6
  23. package/dist/hooks/use-copilot-authenticated-action.js.map +1 -1
  24. package/dist/hooks/use-copilot-authenticated-action.mjs +2 -2
  25. package/dist/hooks/use-copilot-chat.js +77 -45
  26. package/dist/hooks/use-copilot-chat.js.map +1 -1
  27. package/dist/hooks/use-copilot-chat.mjs +2 -2
  28. package/dist/hooks/use-langgraph-interrupt.js +77 -45
  29. package/dist/hooks/use-langgraph-interrupt.js.map +1 -1
  30. package/dist/hooks/use-langgraph-interrupt.mjs +3 -3
  31. package/dist/index.js +101 -50
  32. package/dist/index.js.map +1 -1
  33. package/dist/index.mjs +6 -6
  34. package/package.json +3 -3
  35. package/src/hooks/use-chat.ts +110 -46
  36. package/src/hooks/use-copilot-action.ts +51 -9
  37. package/dist/chunk-5DODGOMM.mjs.map +0 -1
  38. package/dist/chunk-WR3XTNHJ.mjs.map +0 -1
  39. /package/dist/{chunk-XJ34ATKP.mjs.map → chunk-FN3UA2ZE.mjs.map} +0 -0
  40. /package/dist/{chunk-7EJ4IWSA.mjs.map → chunk-K42OD3J6.mjs.map} +0 -0
  41. /package/dist/{chunk-5PE2XROA.mjs.map → chunk-UGJGKBFB.mjs.map} +0 -0
  42. /package/dist/{chunk-BHGYBOR3.mjs.map → chunk-ZOMEQ3XC.mjs.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  useLangGraphInterrupt
3
- } from "../chunk-5PE2XROA.mjs";
4
- import "../chunk-7EJ4IWSA.mjs";
3
+ } from "../chunk-UGJGKBFB.mjs";
4
+ import "../chunk-K42OD3J6.mjs";
5
5
  import "../chunk-KWQPQ4MM.mjs";
6
6
  import "../chunk-SJJNFYGQ.mjs";
7
7
  import "../chunk-R2LNRHJP.mjs";
@@ -11,7 +11,7 @@ import "../chunk-PMAFHQ7P.mjs";
11
11
  import "../chunk-57K2ZJ5F.mjs";
12
12
  import "../chunk-YPSGKPDA.mjs";
13
13
  import "../chunk-DCTJZ742.mjs";
14
- import "../chunk-5DODGOMM.mjs";
14
+ import "../chunk-MTAJI7HV.mjs";
15
15
  import "../chunk-4CEQJ2X6.mjs";
16
16
  import "../chunk-3OQM3NEK.mjs";
17
17
  import "../chunk-O7ARI5CV.mjs";
package/dist/index.js CHANGED
@@ -2137,6 +2137,7 @@ var import_runtime_client_gql7 = require("@copilotkit/runtime-client-gql");
2137
2137
 
2138
2138
  // src/hooks/use-chat.ts
2139
2139
  var import_react11 = require("react");
2140
+ var import_react_dom2 = require("react-dom");
2140
2141
  var import_shared12 = require("@copilotkit/shared");
2141
2142
  var import_runtime_client_gql6 = require("@copilotkit/runtime-client-gql");
2142
2143
 
@@ -2483,6 +2484,39 @@ function useChat(options) {
2483
2484
  newMessages
2484
2485
  );
2485
2486
  let didExecuteAction = false;
2487
+ const executeActionFromMessage = (currentAction, actionMessage) => __async(this, null, function* () {
2488
+ var _a2;
2489
+ const isInterruptAction = interruptMessages.find((m) => m.id === actionMessage.id);
2490
+ followUp = (_a2 = currentAction == null ? void 0 : currentAction.followUp) != null ? _a2 : !isInterruptAction;
2491
+ if (currentAction == null ? void 0 : currentAction._setActivatingMessageId) {
2492
+ currentAction._setActivatingMessageId(actionMessage.id);
2493
+ }
2494
+ const resultMessage = yield executeAction({
2495
+ onFunctionCall,
2496
+ message: actionMessage,
2497
+ chatAbortControllerRef,
2498
+ onError: (error) => {
2499
+ addErrorToast([error]);
2500
+ console.error(`Failed to execute action ${actionMessage.name}: ${error}`);
2501
+ },
2502
+ setMessages,
2503
+ getFinalMessages: () => finalMessages,
2504
+ isRenderAndWait: (currentAction == null ? void 0 : currentAction._isRenderAndWait) || false
2505
+ });
2506
+ didExecuteAction = true;
2507
+ const messageIndex = finalMessages.findIndex((msg) => msg.id === actionMessage.id);
2508
+ finalMessages.splice(messageIndex + 1, 0, resultMessage);
2509
+ if (currentAction == null ? void 0 : currentAction._isRenderAndWait) {
2510
+ const messagesForImmediateUpdate = [...finalMessages];
2511
+ (0, import_react_dom2.flushSync)(() => {
2512
+ setMessages(messagesForImmediateUpdate);
2513
+ });
2514
+ }
2515
+ if (currentAction == null ? void 0 : currentAction._setActivatingMessageId) {
2516
+ currentAction._setActivatingMessageId(null);
2517
+ }
2518
+ return resultMessage;
2519
+ });
2486
2520
  if (onFunctionCall) {
2487
2521
  const lastMessages = [];
2488
2522
  for (let i = finalMessages.length - 1; i >= 0; i--) {
@@ -2499,37 +2533,28 @@ function useChat(options) {
2499
2533
  (action2) => action2.name === message.name
2500
2534
  );
2501
2535
  const currentResultMessagePairedFeAction = message.isResultMessage() ? getPairedFeAction(actions, message) : null;
2502
- const executeActionFromMessage = (action2, message2) => __async(this, null, function* () {
2503
- var _a2;
2504
- const isInterruptAction = interruptMessages.find((m) => m.id === message2.id);
2505
- followUp = (_a2 = action2 == null ? void 0 : action2.followUp) != null ? _a2 : !isInterruptAction;
2506
- const resultMessage = yield executeAction({
2507
- onFunctionCall,
2508
- previousMessages,
2509
- message: message2,
2510
- chatAbortControllerRef,
2511
- onError: (error) => {
2512
- addErrorToast([error]);
2513
- console.error(`Failed to execute action ${message2.name}: ${error}`);
2514
- }
2515
- });
2516
- didExecuteAction = true;
2517
- const messageIndex = finalMessages.findIndex((msg) => msg.id === message2.id);
2518
- finalMessages.splice(messageIndex + 1, 0, resultMessage);
2519
- return resultMessage;
2520
- });
2521
2536
  if (action && message.isActionExecutionMessage()) {
2522
- const resultMessage = yield executeActionFromMessage(action, message);
2523
- const pairedFeAction = getPairedFeAction(actions, resultMessage);
2524
- if (pairedFeAction) {
2525
- const newExecutionMessage = new import_runtime_client_gql6.ActionExecutionMessage({
2526
- name: pairedFeAction.name,
2527
- arguments: (0, import_shared12.parseJson)(resultMessage.result, resultMessage.result),
2528
- status: message.status,
2529
- createdAt: message.createdAt,
2530
- parentMessageId: message.parentMessageId
2531
- });
2532
- yield executeActionFromMessage(pairedFeAction, newExecutionMessage);
2537
+ const isRenderAndWaitAction = (action == null ? void 0 : action._isRenderAndWait) || false;
2538
+ const alreadyProcessed = isRenderAndWaitAction && finalMessages.some(
2539
+ (fm) => fm.isResultMessage() && fm.actionExecutionId === message.id
2540
+ );
2541
+ if (alreadyProcessed) {
2542
+ } else {
2543
+ const resultMessage = yield executeActionFromMessage(
2544
+ action,
2545
+ message
2546
+ );
2547
+ const pairedFeAction = getPairedFeAction(actions, resultMessage);
2548
+ if (pairedFeAction) {
2549
+ const newExecutionMessage = new import_runtime_client_gql6.ActionExecutionMessage({
2550
+ name: pairedFeAction.name,
2551
+ arguments: (0, import_shared12.parseJson)(resultMessage.result, resultMessage.result),
2552
+ status: message.status,
2553
+ createdAt: message.createdAt,
2554
+ parentMessageId: message.parentMessageId
2555
+ });
2556
+ yield executeActionFromMessage(pairedFeAction, newExecutionMessage);
2557
+ }
2533
2558
  }
2534
2559
  } else if (message.isResultMessage() && currentResultMessagePairedFeAction) {
2535
2560
  const newExecutionMessage = new import_runtime_client_gql6.ActionExecutionMessage({
@@ -2547,13 +2572,9 @@ function useChat(options) {
2547
2572
  }
2548
2573
  setMessages(finalMessages);
2549
2574
  }
2550
- if (
2551
- // if followUp is not explicitly false
2552
- followUp !== false && // and we executed an action
2553
- (didExecuteAction || // the last message is a server side result
2554
- !isAgentRun && finalMessages.length && finalMessages[finalMessages.length - 1].isResultMessage()) && // the user did not stop generation
2555
- !((_r = chatAbortControllerRef.current) == null ? void 0 : _r.signal.aborted)
2556
- ) {
2575
+ if (followUp !== false && (didExecuteAction || // the last message is a server side result
2576
+ !isAgentRun && finalMessages.length && finalMessages[finalMessages.length - 1].isResultMessage()) && // the user did not stop generation
2577
+ !((_r = chatAbortControllerRef.current) == null ? void 0 : _r.signal.aborted)) {
2557
2578
  yield new Promise((resolve) => setTimeout(resolve, 10));
2558
2579
  return yield runChatCompletionRef.current(finalMessages);
2559
2580
  } else if ((_s = chatAbortControllerRef.current) == null ? void 0 : _s.signal.aborted) {
@@ -2724,20 +2745,31 @@ function constructFinalMessages(syncedMessages, previousMessages, newMessages) {
2724
2745
  function executeAction(_0) {
2725
2746
  return __async(this, arguments, function* ({
2726
2747
  onFunctionCall,
2727
- previousMessages,
2728
2748
  message,
2729
2749
  chatAbortControllerRef,
2730
- onError
2750
+ onError,
2751
+ setMessages,
2752
+ getFinalMessages,
2753
+ isRenderAndWait
2731
2754
  }) {
2732
2755
  let result;
2733
2756
  let error = null;
2757
+ const currentMessagesForHandler = getFinalMessages();
2758
+ const handlerReturnedPromise = onFunctionCall({
2759
+ messages: currentMessagesForHandler,
2760
+ name: message.name,
2761
+ args: message.arguments
2762
+ });
2763
+ if (isRenderAndWait) {
2764
+ const currentMessagesForRender = getFinalMessages();
2765
+ (0, import_react_dom2.flushSync)(() => {
2766
+ setMessages([...currentMessagesForRender]);
2767
+ });
2768
+ }
2734
2769
  try {
2735
2770
  result = yield Promise.race([
2736
- onFunctionCall({
2737
- messages: previousMessages,
2738
- name: message.name,
2739
- args: message.arguments
2740
- }),
2771
+ handlerReturnedPromise,
2772
+ // Await the promise returned by the handler
2741
2773
  new Promise(
2742
2774
  (resolve) => {
2743
2775
  var _a;
@@ -3004,6 +3036,7 @@ function useCopilotAction(action, dependencies) {
3004
3036
  const { setAction, removeAction, actions, chatComponentsCache } = useCopilotContext();
3005
3037
  const idRef = (0, import_react13.useRef)((0, import_shared13.randomId)());
3006
3038
  const renderAndWaitRef = (0, import_react13.useRef)(null);
3039
+ const activatingMessageIdRef = (0, import_react13.useRef)(null);
3007
3040
  const { addToast } = useToast();
3008
3041
  action = __spreadValues({}, action);
3009
3042
  if (
@@ -3011,30 +3044,48 @@ function useCopilotAction(action, dependencies) {
3011
3044
  isFrontendAction(action) && // check if renderAndWaitForResponse is set
3012
3045
  (action.renderAndWait || action.renderAndWaitForResponse)
3013
3046
  ) {
3047
+ action._isRenderAndWait = true;
3014
3048
  const renderAndWait = action.renderAndWait || action.renderAndWaitForResponse;
3015
3049
  action.renderAndWait = void 0;
3016
3050
  action.renderAndWaitForResponse = void 0;
3051
+ action._setActivatingMessageId = (id) => {
3052
+ activatingMessageIdRef.current = id;
3053
+ };
3017
3054
  action.handler = useAsyncCallback(() => __async(this, null, function* () {
3055
+ const currentActivatingId = activatingMessageIdRef.current;
3018
3056
  let resolve;
3019
3057
  let reject;
3020
3058
  const promise = new Promise((resolvePromise, rejectPromise) => {
3021
3059
  resolve = resolvePromise;
3022
3060
  reject = rejectPromise;
3023
3061
  });
3024
- renderAndWaitRef.current = { promise, resolve, reject };
3025
- return yield promise;
3062
+ renderAndWaitRef.current = {
3063
+ promise,
3064
+ resolve,
3065
+ reject,
3066
+ messageId: currentActivatingId
3067
+ };
3068
+ const result = yield promise;
3069
+ return result;
3026
3070
  }), []);
3027
3071
  action.render = (props) => {
3072
+ const currentRenderMessageId = props.messageId;
3028
3073
  let status = props.status;
3029
- if (props.status === "executing" && !renderAndWaitRef.current) {
3030
- status = "inProgress";
3074
+ if (props.status === "executing") {
3075
+ if (!renderAndWaitRef.current || !renderAndWaitRef.current.promise) {
3076
+ status = "inProgress";
3077
+ } else if (renderAndWaitRef.current.messageId !== currentRenderMessageId && activatingMessageIdRef.current !== currentRenderMessageId) {
3078
+ status = "inProgress";
3079
+ }
3031
3080
  }
3032
3081
  const waitProps = {
3033
3082
  status,
3034
3083
  args: props.args,
3035
3084
  result: props.result,
3036
- handler: status === "executing" ? renderAndWaitRef.current.resolve : void 0,
3037
- respond: status === "executing" ? renderAndWaitRef.current.resolve : void 0
3085
+ // handler and respond should only be provided if this is the truly active instance
3086
+ // and its promise infrastructure is ready.
3087
+ handler: status === "executing" && renderAndWaitRef.current && renderAndWaitRef.current.messageId === currentRenderMessageId ? renderAndWaitRef.current.resolve : void 0,
3088
+ respond: status === "executing" && renderAndWaitRef.current && renderAndWaitRef.current.messageId === currentRenderMessageId ? renderAndWaitRef.current.resolve : void 0
3038
3089
  };
3039
3090
  const isNoArgsRenderWait = (_fn) => {
3040
3091
  var _a;