@copilotkit/react-core 1.1.2 → 1.1.3-feat-runtime-remote-actions.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 (135) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +32 -37
  3. package/dist/{chunk-T6L4EGTD.mjs → chunk-326LK7LX.mjs} +5 -5
  4. package/dist/chunk-326LK7LX.mjs.map +1 -0
  5. package/dist/{chunk-VFDR4MIF.mjs → chunk-A37GANOW.mjs} +11 -7
  6. package/dist/chunk-A37GANOW.mjs.map +1 -0
  7. package/dist/chunk-BWYAGPEF.mjs +1 -0
  8. package/dist/{chunk-GE7LAL6V.mjs → chunk-CKOTAKUD.mjs} +4 -3
  9. package/dist/{chunk-GE7LAL6V.mjs.map → chunk-CKOTAKUD.mjs.map} +1 -1
  10. package/dist/{chunk-KONDJRB4.mjs → chunk-CODXG6KU.mjs} +5 -5
  11. package/dist/chunk-CODXG6KU.mjs.map +1 -0
  12. package/dist/{chunk-3NHEWJ4V.mjs → chunk-J2YXDQHR.mjs} +19 -4
  13. package/dist/chunk-J2YXDQHR.mjs.map +1 -0
  14. package/dist/{chunk-UQRDVZ2N.mjs → chunk-OBBH5SHN.mjs} +4 -3
  15. package/dist/{chunk-UQRDVZ2N.mjs.map → chunk-OBBH5SHN.mjs.map} +1 -1
  16. package/dist/chunk-Q4TTTAXQ.mjs +87 -0
  17. package/dist/chunk-Q4TTTAXQ.mjs.map +1 -0
  18. package/dist/{chunk-TVR5CJ6E.mjs → chunk-RBNULK3U.mjs} +39 -5
  19. package/dist/chunk-RBNULK3U.mjs.map +1 -0
  20. package/dist/{chunk-AGGKI26A.mjs → chunk-RK27MXAR.mjs} +76 -11
  21. package/dist/chunk-RK27MXAR.mjs.map +1 -0
  22. package/dist/chunk-STUXJ3BN.mjs +44 -0
  23. package/dist/chunk-STUXJ3BN.mjs.map +1 -0
  24. package/dist/{chunk-YYZNR3CS.mjs → chunk-XBJINVNA.mjs} +72 -14
  25. package/dist/chunk-XBJINVNA.mjs.map +1 -0
  26. package/dist/components/copilot-provider/copilotkit-props.d.ts +4 -0
  27. package/dist/components/copilot-provider/copilotkit-props.js.map +1 -1
  28. package/dist/components/copilot-provider/copilotkit.d.ts +2 -1
  29. package/dist/components/copilot-provider/copilotkit.js +50 -5
  30. package/dist/components/copilot-provider/copilotkit.js.map +1 -1
  31. package/dist/components/copilot-provider/copilotkit.mjs +2 -2
  32. package/dist/components/copilot-provider/index.d.ts +1 -0
  33. package/dist/components/copilot-provider/index.js +50 -5
  34. package/dist/components/copilot-provider/index.js.map +1 -1
  35. package/dist/components/copilot-provider/index.mjs +2 -2
  36. package/dist/components/index.d.ts +1 -0
  37. package/dist/components/index.js +50 -5
  38. package/dist/components/index.js.map +1 -1
  39. package/dist/components/index.mjs +2 -2
  40. package/dist/context/copilot-context.d.ts +21 -2
  41. package/dist/context/copilot-context.js +18 -3
  42. package/dist/context/copilot-context.js.map +1 -1
  43. package/dist/context/copilot-context.mjs +1 -1
  44. package/dist/context/index.d.ts +2 -0
  45. package/dist/context/index.js +18 -3
  46. package/dist/context/index.js.map +1 -1
  47. package/dist/context/index.mjs +1 -1
  48. package/dist/hooks/index.d.ts +4 -0
  49. package/dist/hooks/index.js +288 -30
  50. package/dist/hooks/index.js.map +1 -1
  51. package/dist/hooks/index.mjs +21 -12
  52. package/dist/hooks/use-chat.d.ts +26 -4
  53. package/dist/hooks/use-chat.js +73 -9
  54. package/dist/hooks/use-chat.js.map +1 -1
  55. package/dist/hooks/use-chat.mjs +1 -1
  56. package/dist/hooks/use-coagent-action.d.ts +5 -0
  57. package/dist/hooks/use-coagent-action.js +156 -0
  58. package/dist/hooks/use-coagent-action.js.map +1 -0
  59. package/dist/hooks/use-coagent-action.mjs +9 -0
  60. package/dist/hooks/use-coagent-action.mjs.map +1 -0
  61. package/dist/hooks/use-coagent.d.ts +27 -0
  62. package/dist/hooks/use-coagent.js +219 -0
  63. package/dist/hooks/use-coagent.js.map +1 -0
  64. package/dist/hooks/use-coagent.mjs +10 -0
  65. package/dist/hooks/use-coagent.mjs.map +1 -0
  66. package/dist/hooks/use-copilot-action.js +27 -5
  67. package/dist/hooks/use-copilot-action.js.map +1 -1
  68. package/dist/hooks/use-copilot-action.mjs +2 -2
  69. package/dist/hooks/use-copilot-chat.js +158 -19
  70. package/dist/hooks/use-copilot-chat.js.map +1 -1
  71. package/dist/hooks/use-copilot-chat.mjs +4 -4
  72. package/dist/hooks/use-copilot-readable.js +21 -3
  73. package/dist/hooks/use-copilot-readable.js.map +1 -1
  74. package/dist/hooks/use-copilot-readable.mjs +2 -2
  75. package/dist/hooks/use-make-copilot-document-readable.js +21 -3
  76. package/dist/hooks/use-make-copilot-document-readable.js.map +1 -1
  77. package/dist/hooks/use-make-copilot-document-readable.mjs +2 -2
  78. package/dist/index.d.ts +5 -0
  79. package/dist/index.js +332 -41
  80. package/dist/index.js.map +1 -1
  81. package/dist/index.mjs +24 -16
  82. package/dist/lib/copilot-task.d.ts +2 -0
  83. package/dist/lib/copilot-task.js +2 -1
  84. package/dist/lib/copilot-task.js.map +1 -1
  85. package/dist/lib/copilot-task.mjs +3 -3
  86. package/dist/lib/index.d.ts +2 -0
  87. package/dist/lib/index.js +2 -1
  88. package/dist/lib/index.js.map +1 -1
  89. package/dist/lib/index.mjs +3 -3
  90. package/dist/types/coagent-action.d.ts +17 -0
  91. package/dist/types/coagent-action.js +19 -0
  92. package/dist/types/coagent-action.js.map +1 -0
  93. package/dist/types/coagent-action.mjs +1 -0
  94. package/dist/types/coagent-action.mjs.map +1 -0
  95. package/dist/types/coagent-state.d.ts +11 -0
  96. package/dist/types/coagent-state.js +19 -0
  97. package/dist/types/coagent-state.js.map +1 -0
  98. package/dist/types/coagent-state.mjs +1 -0
  99. package/dist/types/coagent-state.mjs.map +1 -0
  100. package/dist/types/frontend-action.d.ts +1 -0
  101. package/dist/types/frontend-action.js.map +1 -1
  102. package/dist/utils/extract.d.ts +2 -0
  103. package/dist/utils/extract.js +2 -1
  104. package/dist/utils/extract.js.map +1 -1
  105. package/dist/utils/extract.mjs +3 -3
  106. package/dist/utils/index.d.ts +2 -0
  107. package/dist/utils/index.js +2 -1
  108. package/dist/utils/index.js.map +1 -1
  109. package/dist/utils/index.mjs +3 -3
  110. package/package.json +5 -5
  111. package/src/components/copilot-provider/copilotkit-props.tsx +5 -0
  112. package/src/components/copilot-provider/copilotkit.tsx +45 -3
  113. package/src/context/copilot-context.tsx +44 -3
  114. package/src/hooks/index.ts +2 -0
  115. package/src/hooks/use-chat.ts +131 -8
  116. package/src/hooks/use-coagent-action.ts +44 -0
  117. package/src/hooks/use-coagent.ts +133 -0
  118. package/src/hooks/use-copilot-action.ts +9 -5
  119. package/src/hooks/use-copilot-chat.ts +80 -8
  120. package/src/hooks/use-copilot-readable.ts +3 -3
  121. package/src/hooks/use-make-copilot-document-readable.ts +3 -3
  122. package/src/lib/copilot-task.ts +1 -0
  123. package/src/types/coagent-action.ts +17 -0
  124. package/src/types/coagent-state.ts +9 -0
  125. package/src/types/frontend-action.ts +1 -0
  126. package/src/utils/extract.ts +1 -0
  127. package/dist/chunk-3NHEWJ4V.mjs.map +0 -1
  128. package/dist/chunk-5JB4B2SV.mjs +0 -1
  129. package/dist/chunk-AGGKI26A.mjs.map +0 -1
  130. package/dist/chunk-KONDJRB4.mjs.map +0 -1
  131. package/dist/chunk-T6L4EGTD.mjs.map +0 -1
  132. package/dist/chunk-TVR5CJ6E.mjs.map +0 -1
  133. package/dist/chunk-VFDR4MIF.mjs.map +0 -1
  134. package/dist/chunk-YYZNR3CS.mjs.map +0 -1
  135. /package/dist/{chunk-5JB4B2SV.mjs.map → chunk-BWYAGPEF.mjs.map} +0 -0
package/dist/index.js CHANGED
@@ -86,6 +86,8 @@ __export(src_exports, {
86
86
  CopilotTask: () => CopilotTask,
87
87
  defaultCopilotContextCategories: () => defaultCopilotContextCategories,
88
88
  extract: () => extract,
89
+ useCoAgent: () => useCoAgent,
90
+ useCoAgentAction: () => useCoAgentAction,
89
91
  useCopilotAction: () => useCopilotAction,
90
92
  useCopilotChat: () => useCopilotChat,
91
93
  useCopilotContext: () => useCopilotContext,
@@ -105,7 +107,12 @@ var emptyCopilotContext = {
105
107
  },
106
108
  removeAction: () => {
107
109
  },
108
- chatComponentsCache: { current: {} },
110
+ coagentActions: {},
111
+ setCoagentAction: () => {
112
+ },
113
+ removeCoagentAction: () => {
114
+ },
115
+ chatComponentsCache: { current: { actions: {}, coagentActions: {} } },
109
116
  getContextString: (documents, categories) => returnAndThrowInDebug(""),
110
117
  addContext: () => "",
111
118
  removeContext: () => {
@@ -138,11 +145,21 @@ var emptyCopilotContext = {
138
145
  },
139
146
  removeChatSuggestionConfiguration: () => {
140
147
  },
141
- showDevConsole: "auto"
148
+ showDevConsole: "auto",
149
+ coagentStates: {},
150
+ setCoagentStates: () => {
151
+ },
152
+ agentSession: null,
153
+ setAgentSession: () => {
154
+ }
142
155
  };
143
156
  var CopilotContext = import_react.default.createContext(emptyCopilotContext);
144
157
  function useCopilotContext() {
145
- return import_react.default.useContext(CopilotContext);
158
+ const context = import_react.default.useContext(CopilotContext);
159
+ if (context === emptyCopilotContext) {
160
+ throw new Error("Remember to wrap your app in a `<CopilotKit> {...} </CopilotKit>` !!!");
161
+ }
162
+ return context;
146
163
  }
147
164
  function returnAndThrowInDebug(value) {
148
165
  throw new Error("Remember to wrap your app in a `<CopilotKit> {...} </CopilotKit>` !!!");
@@ -362,7 +379,11 @@ function CopilotKit(_a) {
362
379
  }
363
380
  const chatApiEndpoint = props.runtimeUrl || import_shared3.COPILOT_CLOUD_CHAT_URL;
364
381
  const [actions, setActions] = (0, import_react4.useState)({});
365
- const chatComponentsCache = (0, import_react4.useRef)({});
382
+ const [coagentActions, setCoagentActions] = (0, import_react4.useState)({});
383
+ const chatComponentsCache = (0, import_react4.useRef)({
384
+ actions: {},
385
+ coagentActions: {}
386
+ });
366
387
  const { addElement, removeElement, printTree } = use_tree_default();
367
388
  const [messages, setMessages] = (0, import_react4.useState)([]);
368
389
  const [isLoading, setIsLoading] = (0, import_react4.useState)(false);
@@ -386,6 +407,20 @@ function CopilotKit(_a) {
386
407
  return newPoints;
387
408
  });
388
409
  }, []);
410
+ const setCoagentAction = (0, import_react4.useCallback)((id, action) => {
411
+ setCoagentActions((prevPoints) => {
412
+ return __spreadProps(__spreadValues({}, prevPoints), {
413
+ [id]: action
414
+ });
415
+ });
416
+ }, []);
417
+ const removeCoagentAction = (0, import_react4.useCallback)((id) => {
418
+ setCoagentActions((prevPoints) => {
419
+ const newPoints = __spreadValues({}, prevPoints);
420
+ delete newPoints[id];
421
+ return newPoints;
422
+ });
423
+ }, []);
389
424
  const getContextString = (0, import_react4.useCallback)(
390
425
  (documents, categories) => {
391
426
  const documentsString = documents.map((document) => {
@@ -476,6 +511,14 @@ ${nonDocumentStrings}`;
476
511
  return rest;
477
512
  });
478
513
  };
514
+ const [coagentStates, setCoagentStates] = (0, import_react4.useState)({});
515
+ let initialAgentSession = null;
516
+ if (props.agent) {
517
+ initialAgentSession = {
518
+ agentName: props.agent
519
+ };
520
+ }
521
+ const [agentSession, setAgentSession] = (0, import_react4.useState)(initialAgentSession);
479
522
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
480
523
  CopilotContext.Provider,
481
524
  {
@@ -485,6 +528,9 @@ ${nonDocumentStrings}`;
485
528
  getFunctionCallHandler,
486
529
  setAction,
487
530
  removeAction,
531
+ coagentActions,
532
+ setCoagentAction,
533
+ removeCoagentAction,
488
534
  getContextString,
489
535
  addContext,
490
536
  removeContext,
@@ -501,7 +547,11 @@ ${nonDocumentStrings}`;
501
547
  removeChatSuggestionConfiguration,
502
548
  chatInstructions,
503
549
  setChatInstructions,
504
- showDevConsole: props.showDevConsole === void 0 ? "auto" : props.showDevConsole
550
+ showDevConsole: props.showDevConsole === void 0 ? "auto" : props.showDevConsole,
551
+ coagentStates,
552
+ setCoagentStates,
553
+ agentSession,
554
+ setAgentSession
505
555
  },
506
556
  children
507
557
  }
@@ -519,8 +569,9 @@ function entryPointsToFunctionCallHandler(actions) {
519
569
  if (action) {
520
570
  yield new Promise((resolve, reject) => {
521
571
  (0, import_react_dom.flushSync)(() => __async(this, null, function* () {
572
+ var _a;
522
573
  try {
523
- result = yield action.handler(args);
574
+ result = yield (_a = action.handler) == null ? void 0 : _a.call(action, args);
524
575
  resolve();
525
576
  } catch (error) {
526
577
  reject(error);
@@ -551,7 +602,12 @@ function useChat(options) {
551
602
  initialMessages,
552
603
  isLoading,
553
604
  actions,
554
- onFunctionCall
605
+ onFunctionCall,
606
+ onCoagentAction,
607
+ setCoagentStates,
608
+ coagentStates,
609
+ agentSession,
610
+ setAgentSession
555
611
  } = options;
556
612
  const abortControllerRef = (0, import_react5.useRef)();
557
613
  const threadIdRef = (0, import_react5.useRef)(null);
@@ -580,13 +636,14 @@ function useChat(options) {
580
636
  const messagesWithContext = [systemMessage, ...initialMessages || [], ...previousMessages];
581
637
  const stream = import_runtime_client_gql.CopilotRuntimeClient.asStream(
582
638
  runtimeClient.generateCopilotResponse({
583
- data: __spreadProps(__spreadValues({
639
+ data: __spreadProps(__spreadValues(__spreadProps(__spreadValues({
584
640
  frontend: {
585
641
  actions: actions.map((action) => ({
586
642
  name: action.name,
587
643
  description: action.description || "",
588
644
  jsonSchema: JSON.stringify((0, import_shared4.actionParametersToJsonSchema)(action.parameters || []))
589
- }))
645
+ })),
646
+ url: window.location.href
590
647
  },
591
648
  threadId: threadIdRef.current,
592
649
  runId: runIdRef.current,
@@ -604,6 +661,13 @@ function useChat(options) {
604
661
  metadata: {
605
662
  requestType: import_runtime_client_gql.CopilotRequestType.Chat
606
663
  }
664
+ }), agentSession ? {
665
+ agentSession
666
+ } : {}), {
667
+ agentStates: Object.values(coagentStates).map((state) => ({
668
+ agentName: state.name,
669
+ state: JSON.stringify(state.state)
670
+ }))
607
671
  }),
608
672
  properties: copilotConfig.properties,
609
673
  signal: (_d = abortControllerRef.current) == null ? void 0 : _d.signal
@@ -611,7 +675,8 @@ function useChat(options) {
611
675
  );
612
676
  const guardrailsEnabled = ((_g = (_f = (_e = copilotConfig.cloud) == null ? void 0 : _e.guardrails) == null ? void 0 : _f.input) == null ? void 0 : _g.restrictToTopic.enabled) || false;
613
677
  const reader = stream.getReader();
614
- let results = {};
678
+ let actionResults = {};
679
+ let executedCoagentActions = [];
615
680
  try {
616
681
  while (true) {
617
682
  const { done, value } = yield reader.read();
@@ -638,8 +703,30 @@ function useChat(options) {
638
703
  } else {
639
704
  for (const message of messages2) {
640
705
  newMessages.push(message);
706
+ if (message instanceof import_runtime_client_gql.AgentStateMessage) {
707
+ if (message.running) {
708
+ setCoagentStates((prevAgentStates) => __spreadProps(__spreadValues({}, prevAgentStates), {
709
+ [message.agentName]: {
710
+ name: message.agentName,
711
+ state: message.state,
712
+ running: message.running,
713
+ active: message.active,
714
+ threadId: message.threadId,
715
+ nodeName: message.nodeName,
716
+ runId: message.runId
717
+ }
718
+ }));
719
+ setAgentSession({
720
+ threadId: message.threadId,
721
+ agentName: message.agentName,
722
+ nodeName: message.nodeName
723
+ });
724
+ } else {
725
+ setAgentSession(null);
726
+ }
727
+ }
641
728
  if (message instanceof import_runtime_client_gql.ActionExecutionMessage && message.status.code !== import_runtime_client_gql.MessageStatusCode.Pending && message.scope === "client" && onFunctionCall) {
642
- if (!(message.id in results)) {
729
+ if (!(message.id in actionResults)) {
643
730
  if (guardrailsEnabled && value.generateCopilotResponse.status === void 0) {
644
731
  break;
645
732
  }
@@ -648,25 +735,53 @@ function useChat(options) {
648
735
  name: message.name,
649
736
  args: message.arguments
650
737
  });
651
- results[message.id] = result;
738
+ actionResults[message.id] = result;
652
739
  }
653
740
  newMessages.push(
654
741
  new import_runtime_client_gql.ResultMessage({
655
- result: import_runtime_client_gql.ResultMessage.encodeResult(results[message.id]),
742
+ result: import_runtime_client_gql.ResultMessage.encodeResult(actionResults[message.id]),
656
743
  actionExecutionId: message.id,
657
744
  actionName: message.name
658
745
  })
659
746
  );
660
747
  }
748
+ if (message instanceof import_runtime_client_gql.AgentStateMessage && !message.active && !executedCoagentActions.includes(message.id) && onCoagentAction) {
749
+ if (guardrailsEnabled && value.generateCopilotResponse.status === void 0) {
750
+ break;
751
+ }
752
+ yield onCoagentAction({
753
+ name: message.agentName,
754
+ nodeName: message.nodeName,
755
+ state: message.state
756
+ });
757
+ executedCoagentActions.push(message.id);
758
+ }
661
759
  }
662
760
  }
663
761
  if (newMessages.length > 0) {
664
- setMessages([...previousMessages, ...newMessages]);
762
+ const filteredMessages = [...previousMessages, ...newMessages].reduce(
763
+ (acc, message) => {
764
+ if (
765
+ // If the current message is an AgentStateMessage
766
+ message instanceof import_runtime_client_gql.AgentStateMessage && // And there is at least one message in the accumulator
767
+ acc.length > 0 && // And the last message in the accumulator is also an AgentStateMessage
768
+ acc[acc.length - 1] instanceof import_runtime_client_gql.AgentStateMessage && // And the agentName, nodeName, and runId are the same
769
+ acc[acc.length - 1].agentName === message.agentName && acc[acc.length - 1].nodeName === message.nodeName && acc[acc.length - 1].runId === message.runId
770
+ ) {
771
+ acc[acc.length - 1] = message;
772
+ } else {
773
+ acc.push(message);
774
+ }
775
+ return acc;
776
+ },
777
+ []
778
+ );
779
+ setMessages(filteredMessages);
665
780
  }
666
781
  }
667
782
  if (
668
783
  // if we have client side results
669
- Object.values(results).length || // or the last message we received is a result
784
+ Object.values(actionResults).length || // or the last message we received is a result
670
785
  newMessages.length && newMessages[newMessages.length - 1] instanceof import_runtime_client_gql.ResultMessage
671
786
  ) {
672
787
  yield new Promise((resolve) => setTimeout(resolve, 10));
@@ -728,8 +843,13 @@ function useCopilotChat(_a = {}) {
728
843
  isLoading,
729
844
  setIsLoading,
730
845
  chatInstructions,
731
- actions
732
- } = (0, import_react6.useContext)(CopilotContext);
846
+ actions,
847
+ coagentStates,
848
+ setCoagentStates,
849
+ coagentActions,
850
+ agentSession,
851
+ setAgentSession
852
+ } = useCopilotContext();
733
853
  const latestGetContextString = useUpdatedRef(getContextString);
734
854
  const deleteMessage = (0, import_react6.useCallback)(
735
855
  (messageId) => {
@@ -745,24 +865,76 @@ function useCopilotChat(_a = {}) {
745
865
  role: import_runtime_client_gql2.Role.System
746
866
  });
747
867
  }, [getContextString, makeSystemMessage2, chatInstructions]);
868
+ const onCoagentAction = (0, import_react6.useCallback)(
869
+ (args) => __async(this, null, function* () {
870
+ var _a2;
871
+ const { name, nodeName, state } = args;
872
+ let action = Object.values(coagentActions).find(
873
+ (action2) => action2.name === name && action2.nodeName === nodeName
874
+ );
875
+ if (!action) {
876
+ action = Object.values(coagentActions).find(
877
+ (action2) => action2.name === name && !action2.nodeName
878
+ );
879
+ }
880
+ if (action) {
881
+ yield (_a2 = action.handler) == null ? void 0 : _a2.call(action, { state, nodeName });
882
+ }
883
+ }),
884
+ [coagentActions]
885
+ );
748
886
  const { append, reload, stop } = useChat(__spreadProps(__spreadValues({}, options), {
749
887
  actions: Object.values(actions),
750
888
  copilotConfig: copilotApiConfig,
751
889
  initialMessages: options.initialMessages || [],
752
890
  onFunctionCall: getFunctionCallHandler(),
891
+ onCoagentAction,
753
892
  messages,
754
893
  setMessages,
755
894
  makeSystemMessageCallback,
756
895
  isLoading,
757
- setIsLoading
896
+ setIsLoading,
897
+ coagentStates,
898
+ setCoagentStates,
899
+ agentSession,
900
+ setAgentSession
758
901
  }));
902
+ const latestAppend = useUpdatedRef(append);
903
+ const latestAppendFunc = (0, import_react6.useCallback)(
904
+ (message) => {
905
+ return latestAppend.current(message);
906
+ },
907
+ [latestAppend]
908
+ );
909
+ const latestReload = useUpdatedRef(reload);
910
+ const latestReloadFunc = (0, import_react6.useCallback)(() => {
911
+ return latestReload.current();
912
+ }, [latestReload]);
913
+ const latestStop = useUpdatedRef(stop);
914
+ const latestStopFunc = (0, import_react6.useCallback)(() => {
915
+ return latestStop.current();
916
+ }, [latestStop]);
917
+ const latestDelete = useUpdatedRef(deleteMessage);
918
+ const latestDeleteFunc = (0, import_react6.useCallback)(
919
+ (messageId) => {
920
+ return latestDelete.current(messageId);
921
+ },
922
+ [latestDelete]
923
+ );
924
+ const latestSetMessages = useUpdatedRef(setMessages);
925
+ const latestSetMessagesFunc = (0, import_react6.useCallback)(
926
+ (messages2) => {
927
+ return latestSetMessages.current(messages2);
928
+ },
929
+ [latestSetMessages]
930
+ );
759
931
  return {
760
932
  visibleMessages: messages,
761
- appendMessage: append,
762
- setMessages,
763
- reloadMessages: reload,
764
- stopGeneration: stop,
765
- deleteMessage,
933
+ appendMessage: latestAppendFunc,
934
+ setMessages: latestSetMessagesFunc,
935
+ reloadMessages: latestReloadFunc,
936
+ stopGeneration: latestStopFunc,
937
+ deleteMessage: latestDeleteFunc,
766
938
  isLoading
767
939
  };
768
940
  }
@@ -801,22 +973,25 @@ ${additionalInstructions}` : "");
801
973
  var import_react7 = require("react");
802
974
  var import_shared5 = require("@copilotkit/shared");
803
975
  function useCopilotAction(action, dependencies) {
804
- const { setAction, removeAction, actions, chatComponentsCache } = (0, import_react7.useContext)(CopilotContext);
976
+ const { setAction, removeAction, actions, chatComponentsCache } = useCopilotContext();
805
977
  const idRef = (0, import_react7.useRef)((0, import_shared5.randomId)());
806
978
  if (dependencies === void 0) {
807
979
  if (actions[idRef.current]) {
808
980
  actions[idRef.current].handler = action.handler;
809
981
  if (typeof action.render === "function") {
810
982
  if (chatComponentsCache.current !== null) {
811
- chatComponentsCache.current[action.name] = action.render;
983
+ chatComponentsCache.current.actions[action.name] = action.render;
812
984
  }
813
985
  }
814
986
  }
815
987
  }
816
988
  (0, import_react7.useEffect)(() => {
989
+ if (action.disabled) {
990
+ return;
991
+ }
817
992
  setAction(idRef.current, action);
818
993
  if (chatComponentsCache.current !== null && action.render !== void 0) {
819
- chatComponentsCache.current[action.name] = action.render;
994
+ chatComponentsCache.current.actions[action.name] = action.render;
820
995
  }
821
996
  return () => {
822
997
  removeAction(idRef.current);
@@ -826,6 +1001,7 @@ function useCopilotAction(action, dependencies) {
826
1001
  removeAction,
827
1002
  action.description,
828
1003
  action.name,
1004
+ action.disabled,
829
1005
  // This should be faster than deep equality checking
830
1006
  // In addition, all major JS engines guarantee the order of object keys
831
1007
  JSON.stringify(action.parameters),
@@ -836,12 +1012,48 @@ function useCopilotAction(action, dependencies) {
836
1012
  ]);
837
1013
  }
838
1014
 
839
- // src/hooks/use-make-copilot-document-readable.ts
1015
+ // src/hooks/use-coagent-action.ts
840
1016
  var import_react8 = require("react");
841
- function useMakeCopilotDocumentReadable(document, categories, dependencies = []) {
842
- const { addDocumentContext, removeDocumentContext } = (0, import_react8.useContext)(CopilotContext);
843
- const idRef = (0, import_react8.useRef)();
1017
+ var import_shared6 = require("@copilotkit/shared");
1018
+ function useCoAgentAction(action, dependencies) {
1019
+ const { setCoagentAction, removeCoagentAction, coagentActions, chatComponentsCache } = (0, import_react8.useContext)(CopilotContext);
1020
+ const idRef = (0, import_react8.useRef)((0, import_shared6.randomId)());
1021
+ const key = `${action.name}-${action.nodeName || "global"}`;
1022
+ if (dependencies === void 0) {
1023
+ if (coagentActions[idRef.current]) {
1024
+ coagentActions[idRef.current].handler = action.handler;
1025
+ if (typeof action.render === "function") {
1026
+ if (chatComponentsCache.current !== null) {
1027
+ chatComponentsCache.current.coagentActions[key] = action.render;
1028
+ }
1029
+ }
1030
+ }
1031
+ }
844
1032
  (0, import_react8.useEffect)(() => {
1033
+ setCoagentAction(idRef.current, action);
1034
+ if (chatComponentsCache.current !== null && action.render !== void 0) {
1035
+ chatComponentsCache.current.coagentActions[key] = action.render;
1036
+ }
1037
+ return () => {
1038
+ removeCoagentAction(idRef.current);
1039
+ };
1040
+ }, [
1041
+ setCoagentAction,
1042
+ removeCoagentAction,
1043
+ action.name,
1044
+ // include render only if it's a string
1045
+ typeof action.render === "string" ? action.render : void 0,
1046
+ // dependencies set by the developer
1047
+ ...dependencies || []
1048
+ ]);
1049
+ }
1050
+
1051
+ // src/hooks/use-make-copilot-document-readable.ts
1052
+ var import_react9 = require("react");
1053
+ function useMakeCopilotDocumentReadable(document, categories, dependencies = []) {
1054
+ const { addDocumentContext, removeDocumentContext } = useCopilotContext();
1055
+ const idRef = (0, import_react9.useRef)();
1056
+ (0, import_react9.useEffect)(() => {
845
1057
  const id = addDocumentContext(document, categories);
846
1058
  idRef.current = id;
847
1059
  return () => {
@@ -852,16 +1064,16 @@ function useMakeCopilotDocumentReadable(document, categories, dependencies = [])
852
1064
  }
853
1065
 
854
1066
  // src/hooks/use-copilot-readable.ts
855
- var import_react9 = require("react");
1067
+ var import_react10 = require("react");
856
1068
  function convertToJSON(description, value) {
857
1069
  return `${description}: ${typeof value === "string" ? value : JSON.stringify(value)}`;
858
1070
  }
859
1071
  function useCopilotReadable({ description, value, parentId, categories, convert }, dependencies) {
860
- const { addContext, removeContext } = (0, import_react9.useContext)(CopilotContext);
861
- const idRef = (0, import_react9.useRef)();
1072
+ const { addContext, removeContext } = useCopilotContext();
1073
+ const idRef = (0, import_react10.useRef)();
862
1074
  convert = convert || convertToJSON;
863
1075
  const information = convert(description, value);
864
- (0, import_react9.useEffect)(() => {
1076
+ (0, import_react10.useEffect)(() => {
865
1077
  const id = addContext(information, parentId, categories);
866
1078
  idRef.current = id;
867
1079
  return () => {
@@ -871,9 +1083,84 @@ function useCopilotReadable({ description, value, parentId, categories, convert
871
1083
  return idRef.current;
872
1084
  }
873
1085
 
1086
+ // src/hooks/use-coagent.ts
1087
+ var import_react11 = require("react");
1088
+ function useCoAgent(options) {
1089
+ const isExternalStateManagement = (options2) => {
1090
+ return "state" in options2 && "setState" in options2;
1091
+ };
1092
+ const { name } = options;
1093
+ const isInternalStateManagementWithInitial = (options2) => {
1094
+ return "initialState" in options2;
1095
+ };
1096
+ const { coagentStates, setCoagentStates } = useCopilotContext();
1097
+ const getCoagentState = (coagentStates2, name2) => {
1098
+ if (coagentStates2[name2]) {
1099
+ return coagentStates2[name2];
1100
+ } else {
1101
+ return {
1102
+ name: name2,
1103
+ state: isInternalStateManagementWithInitial(options) ? options.initialState : {},
1104
+ running: false,
1105
+ active: false,
1106
+ threadId: void 0,
1107
+ nodeName: void 0,
1108
+ runId: void 0
1109
+ };
1110
+ }
1111
+ };
1112
+ const setState = (newState) => {
1113
+ setCoagentStates((prevAgentStates) => {
1114
+ let coagentState2 = getCoagentState(prevAgentStates, name);
1115
+ const updatedState = typeof newState === "function" ? newState(coagentState2.state) : newState;
1116
+ return __spreadProps(__spreadValues({}, prevAgentStates), {
1117
+ [name]: __spreadProps(__spreadValues({}, coagentState2), {
1118
+ state: updatedState
1119
+ })
1120
+ });
1121
+ });
1122
+ };
1123
+ const coagentState = getCoagentState(coagentStates, name);
1124
+ const state = isExternalStateManagement(options) ? options.state : coagentState.state;
1125
+ (0, import_react11.useEffect)(() => {
1126
+ if (isExternalStateManagement(options)) {
1127
+ setState(options.state);
1128
+ } else if (coagentStates[name] === void 0) {
1129
+ setState(options.initialState === void 0 ? {} : options.initialState);
1130
+ }
1131
+ }, [isExternalStateManagement(options) ? JSON.stringify(options.state) : void 0]);
1132
+ return {
1133
+ name,
1134
+ nodeName: coagentState.nodeName,
1135
+ state,
1136
+ setState,
1137
+ running: coagentState.running,
1138
+ start: () => {
1139
+ startAgent(name);
1140
+ },
1141
+ stop: () => {
1142
+ stopAgent(name);
1143
+ }
1144
+ };
1145
+ }
1146
+ function startAgent(name) {
1147
+ const { setAgentSession } = useCopilotContext();
1148
+ setAgentSession({
1149
+ agentName: name
1150
+ });
1151
+ }
1152
+ function stopAgent(name) {
1153
+ const { agentSession, setAgentSession } = useCopilotContext();
1154
+ if (agentSession && agentSession.agentName === name) {
1155
+ setAgentSession(null);
1156
+ } else {
1157
+ console.warn(`No agent session found for ${name}`);
1158
+ }
1159
+ }
1160
+
874
1161
  // src/lib/copilot-task.ts
875
1162
  var import_runtime_client_gql3 = require("@copilotkit/runtime-client-gql");
876
- var import_shared6 = require("@copilotkit/shared");
1163
+ var import_shared7 = require("@copilotkit/shared");
877
1164
  var CopilotTask = class {
878
1165
  constructor(config) {
879
1166
  this.instructions = config.instructions;
@@ -917,8 +1204,9 @@ var CopilotTask = class {
917
1204
  actions: Object.values(actions).map((action) => ({
918
1205
  name: action.name,
919
1206
  description: action.description || "",
920
- jsonSchema: JSON.stringify((0, import_shared6.actionParametersToJsonSchema)(action.parameters || []))
921
- }))
1207
+ jsonSchema: JSON.stringify((0, import_shared7.actionParametersToJsonSchema)(action.parameters || []))
1208
+ })),
1209
+ url: window.location.href
922
1210
  },
923
1211
  messages: (0, import_runtime_client_gql3.convertMessagesToGqlInput)(messages),
924
1212
  metadata: {
@@ -971,7 +1259,7 @@ ${instructions}
971
1259
  }
972
1260
 
973
1261
  // src/utils/extract.ts
974
- var import_shared7 = require("@copilotkit/shared");
1262
+ var import_shared8 = require("@copilotkit/shared");
975
1263
  var import_runtime_client_gql4 = require("@copilotkit/runtime-client-gql");
976
1264
  var import_runtime_client_gql5 = require("@copilotkit/runtime-client-gql");
977
1265
  var import_runtime_client_gql6 = require("@copilotkit/runtime-client-gql");
@@ -1007,7 +1295,7 @@ function extract(_0) {
1007
1295
  content: makeSystemMessage(contextString, instructions),
1008
1296
  role: import_runtime_client_gql4.Role.System
1009
1297
  });
1010
- const headers = __spreadValues(__spreadValues({}, context.copilotApiConfig.headers || {}), context.copilotApiConfig.publicApiKey ? { [import_shared7.COPILOT_CLOUD_PUBLIC_API_KEY_HEADER]: context.copilotApiConfig.publicApiKey } : {});
1298
+ const headers = __spreadValues(__spreadValues({}, context.copilotApiConfig.headers || {}), context.copilotApiConfig.publicApiKey ? { [import_shared8.COPILOT_CLOUD_PUBLIC_API_KEY_HEADER]: context.copilotApiConfig.publicApiKey } : {});
1011
1299
  const runtimeClient = new import_runtime_client_gql5.CopilotRuntimeClient({
1012
1300
  url: context.copilotApiConfig.chatApiEndpoint,
1013
1301
  publicApiKey: context.copilotApiConfig.publicApiKey,
@@ -1022,9 +1310,10 @@ function extract(_0) {
1022
1310
  {
1023
1311
  name: action.name,
1024
1312
  description: action.description || "",
1025
- jsonSchema: JSON.stringify((0, import_shared7.actionParametersToJsonSchema)(action.parameters || []))
1313
+ jsonSchema: JSON.stringify((0, import_shared8.actionParametersToJsonSchema)(action.parameters || []))
1026
1314
  }
1027
- ]
1315
+ ],
1316
+ url: window.location.href
1028
1317
  },
1029
1318
  messages: (0, import_runtime_client_gql6.convertMessagesToGqlInput)(
1030
1319
  includeMessages ? [systemMessage, ...messages] : [systemMessage]
@@ -1108,6 +1397,8 @@ Any additional messages provided are for providing context only and should not b
1108
1397
  CopilotTask,
1109
1398
  defaultCopilotContextCategories,
1110
1399
  extract,
1400
+ useCoAgent,
1401
+ useCoAgentAction,
1111
1402
  useCopilotAction,
1112
1403
  useCopilotChat,
1113
1404
  useCopilotContext,