@copilotkit/react-core 1.1.2 → 1.1.3-feat-runtime-remote-actions.1

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 (137) hide show
  1. package/CHANGELOG.md +24 -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-GE7LAL6V.mjs → chunk-3U22BXKC.mjs} +6 -4
  6. package/dist/chunk-3U22BXKC.mjs.map +1 -0
  7. package/dist/{chunk-VFDR4MIF.mjs → chunk-A37GANOW.mjs} +11 -7
  8. package/dist/chunk-A37GANOW.mjs.map +1 -0
  9. package/dist/chunk-BWYAGPEF.mjs +1 -0
  10. package/dist/{chunk-KONDJRB4.mjs → chunk-CODXG6KU.mjs} +5 -5
  11. package/dist/chunk-CODXG6KU.mjs.map +1 -0
  12. package/dist/{chunk-YYZNR3CS.mjs → chunk-HABY7NLH.mjs} +72 -14
  13. package/dist/chunk-HABY7NLH.mjs.map +1 -0
  14. package/dist/{chunk-3NHEWJ4V.mjs → chunk-J2YXDQHR.mjs} +19 -4
  15. package/dist/chunk-J2YXDQHR.mjs.map +1 -0
  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-STUXJ3BN.mjs +44 -0
  21. package/dist/chunk-STUXJ3BN.mjs.map +1 -0
  22. package/dist/{chunk-UQRDVZ2N.mjs → chunk-TCZBK3HZ.mjs} +9 -5
  23. package/dist/chunk-TCZBK3HZ.mjs.map +1 -0
  24. package/dist/{chunk-AGGKI26A.mjs → chunk-XSZDVRPW.mjs} +64 -12
  25. package/dist/chunk-XSZDVRPW.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 +274 -31
  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 +59 -10
  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 +144 -20
  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 +320 -44
  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 +3 -2
  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 +3 -2
  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 +3 -2
  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 +3 -2
  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 +107 -11
  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 +3 -1
  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 +8 -2
  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-GE7LAL6V.mjs.map +0 -1
  131. package/dist/chunk-KONDJRB4.mjs.map +0 -1
  132. package/dist/chunk-T6L4EGTD.mjs.map +0 -1
  133. package/dist/chunk-TVR5CJ6E.mjs.map +0 -1
  134. package/dist/chunk-UQRDVZ2N.mjs.map +0 -1
  135. package/dist/chunk-VFDR4MIF.mjs.map +0 -1
  136. package/dist/chunk-YYZNR3CS.mjs.map +0 -1
  137. /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,17 +636,18 @@ 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,
593
- messages: (0, import_runtime_client_gql.convertMessagesToGqlInput)(messagesWithContext)
650
+ messages: (0, import_runtime_client_gql.convertMessagesToGqlInput)((0, import_runtime_client_gql.filterAgentStateMessages)(messagesWithContext))
594
651
  }, copilotConfig.cloud ? {
595
652
  cloud: __spreadValues({}, ((_c = (_b = (_a = copilotConfig.cloud.guardrails) == null ? void 0 : _a.input) == null ? void 0 : _b.restrictToTopic) == null ? void 0 : _c.enabled) ? {
596
653
  guardrails: {
@@ -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();
@@ -623,7 +688,9 @@ function useChat(options) {
623
688
  }
624
689
  threadIdRef.current = value.generateCopilotResponse.threadId || null;
625
690
  runIdRef.current = value.generateCopilotResponse.runId || null;
626
- const messages2 = (0, import_runtime_client_gql.convertGqlOutputToMessages)(value.generateCopilotResponse.messages);
691
+ const messages2 = (0, import_runtime_client_gql.convertGqlOutputToMessages)(
692
+ (0, import_runtime_client_gql.filterAdjacentAgentStateMessages)(value.generateCopilotResponse.messages)
693
+ );
627
694
  if (messages2.length === 0) {
628
695
  continue;
629
696
  }
@@ -638,8 +705,30 @@ function useChat(options) {
638
705
  } else {
639
706
  for (const message of messages2) {
640
707
  newMessages.push(message);
708
+ if (message instanceof import_runtime_client_gql.AgentStateMessage) {
709
+ if (message.running) {
710
+ setCoagentStates((prevAgentStates) => __spreadProps(__spreadValues({}, prevAgentStates), {
711
+ [message.agentName]: {
712
+ name: message.agentName,
713
+ state: message.state,
714
+ running: message.running,
715
+ active: message.active,
716
+ threadId: message.threadId,
717
+ nodeName: message.nodeName,
718
+ runId: message.runId
719
+ }
720
+ }));
721
+ setAgentSession({
722
+ threadId: message.threadId,
723
+ agentName: message.agentName,
724
+ nodeName: message.nodeName
725
+ });
726
+ } else {
727
+ setAgentSession(null);
728
+ }
729
+ }
641
730
  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)) {
731
+ if (!(message.id in actionResults)) {
643
732
  if (guardrailsEnabled && value.generateCopilotResponse.status === void 0) {
644
733
  break;
645
734
  }
@@ -648,16 +737,27 @@ function useChat(options) {
648
737
  name: message.name,
649
738
  args: message.arguments
650
739
  });
651
- results[message.id] = result;
740
+ actionResults[message.id] = result;
652
741
  }
653
742
  newMessages.push(
654
743
  new import_runtime_client_gql.ResultMessage({
655
- result: import_runtime_client_gql.ResultMessage.encodeResult(results[message.id]),
744
+ result: import_runtime_client_gql.ResultMessage.encodeResult(actionResults[message.id]),
656
745
  actionExecutionId: message.id,
657
746
  actionName: message.name
658
747
  })
659
748
  );
660
749
  }
750
+ if (message instanceof import_runtime_client_gql.AgentStateMessage && !message.active && !executedCoagentActions.includes(message.id) && onCoagentAction) {
751
+ if (guardrailsEnabled && value.generateCopilotResponse.status === void 0) {
752
+ break;
753
+ }
754
+ yield onCoagentAction({
755
+ name: message.agentName,
756
+ nodeName: message.nodeName,
757
+ state: message.state
758
+ });
759
+ executedCoagentActions.push(message.id);
760
+ }
661
761
  }
662
762
  }
663
763
  if (newMessages.length > 0) {
@@ -666,7 +766,7 @@ function useChat(options) {
666
766
  }
667
767
  if (
668
768
  // if we have client side results
669
- Object.values(results).length || // or the last message we received is a result
769
+ Object.values(actionResults).length || // or the last message we received is a result
670
770
  newMessages.length && newMessages[newMessages.length - 1] instanceof import_runtime_client_gql.ResultMessage
671
771
  ) {
672
772
  yield new Promise((resolve) => setTimeout(resolve, 10));
@@ -728,8 +828,13 @@ function useCopilotChat(_a = {}) {
728
828
  isLoading,
729
829
  setIsLoading,
730
830
  chatInstructions,
731
- actions
732
- } = (0, import_react6.useContext)(CopilotContext);
831
+ actions,
832
+ coagentStates,
833
+ setCoagentStates,
834
+ coagentActions,
835
+ agentSession,
836
+ setAgentSession
837
+ } = useCopilotContext();
733
838
  const latestGetContextString = useUpdatedRef(getContextString);
734
839
  const deleteMessage = (0, import_react6.useCallback)(
735
840
  (messageId) => {
@@ -745,24 +850,76 @@ function useCopilotChat(_a = {}) {
745
850
  role: import_runtime_client_gql2.Role.System
746
851
  });
747
852
  }, [getContextString, makeSystemMessage2, chatInstructions]);
853
+ const onCoagentAction = (0, import_react6.useCallback)(
854
+ (args) => __async(this, null, function* () {
855
+ var _a2;
856
+ const { name, nodeName, state } = args;
857
+ let action = Object.values(coagentActions).find(
858
+ (action2) => action2.name === name && action2.nodeName === nodeName
859
+ );
860
+ if (!action) {
861
+ action = Object.values(coagentActions).find(
862
+ (action2) => action2.name === name && !action2.nodeName
863
+ );
864
+ }
865
+ if (action) {
866
+ yield (_a2 = action.handler) == null ? void 0 : _a2.call(action, { state, nodeName });
867
+ }
868
+ }),
869
+ [coagentActions]
870
+ );
748
871
  const { append, reload, stop } = useChat(__spreadProps(__spreadValues({}, options), {
749
872
  actions: Object.values(actions),
750
873
  copilotConfig: copilotApiConfig,
751
874
  initialMessages: options.initialMessages || [],
752
875
  onFunctionCall: getFunctionCallHandler(),
876
+ onCoagentAction,
753
877
  messages,
754
878
  setMessages,
755
879
  makeSystemMessageCallback,
756
880
  isLoading,
757
- setIsLoading
881
+ setIsLoading,
882
+ coagentStates,
883
+ setCoagentStates,
884
+ agentSession,
885
+ setAgentSession
758
886
  }));
887
+ const latestAppend = useUpdatedRef(append);
888
+ const latestAppendFunc = (0, import_react6.useCallback)(
889
+ (message) => {
890
+ return latestAppend.current(message);
891
+ },
892
+ [latestAppend]
893
+ );
894
+ const latestReload = useUpdatedRef(reload);
895
+ const latestReloadFunc = (0, import_react6.useCallback)(() => {
896
+ return latestReload.current();
897
+ }, [latestReload]);
898
+ const latestStop = useUpdatedRef(stop);
899
+ const latestStopFunc = (0, import_react6.useCallback)(() => {
900
+ return latestStop.current();
901
+ }, [latestStop]);
902
+ const latestDelete = useUpdatedRef(deleteMessage);
903
+ const latestDeleteFunc = (0, import_react6.useCallback)(
904
+ (messageId) => {
905
+ return latestDelete.current(messageId);
906
+ },
907
+ [latestDelete]
908
+ );
909
+ const latestSetMessages = useUpdatedRef(setMessages);
910
+ const latestSetMessagesFunc = (0, import_react6.useCallback)(
911
+ (messages2) => {
912
+ return latestSetMessages.current(messages2);
913
+ },
914
+ [latestSetMessages]
915
+ );
759
916
  return {
760
917
  visibleMessages: messages,
761
- appendMessage: append,
762
- setMessages,
763
- reloadMessages: reload,
764
- stopGeneration: stop,
765
- deleteMessage,
918
+ appendMessage: latestAppendFunc,
919
+ setMessages: latestSetMessagesFunc,
920
+ reloadMessages: latestReloadFunc,
921
+ stopGeneration: latestStopFunc,
922
+ deleteMessage: latestDeleteFunc,
766
923
  isLoading
767
924
  };
768
925
  }
@@ -801,22 +958,25 @@ ${additionalInstructions}` : "");
801
958
  var import_react7 = require("react");
802
959
  var import_shared5 = require("@copilotkit/shared");
803
960
  function useCopilotAction(action, dependencies) {
804
- const { setAction, removeAction, actions, chatComponentsCache } = (0, import_react7.useContext)(CopilotContext);
961
+ const { setAction, removeAction, actions, chatComponentsCache } = useCopilotContext();
805
962
  const idRef = (0, import_react7.useRef)((0, import_shared5.randomId)());
806
963
  if (dependencies === void 0) {
807
964
  if (actions[idRef.current]) {
808
965
  actions[idRef.current].handler = action.handler;
809
966
  if (typeof action.render === "function") {
810
967
  if (chatComponentsCache.current !== null) {
811
- chatComponentsCache.current[action.name] = action.render;
968
+ chatComponentsCache.current.actions[action.name] = action.render;
812
969
  }
813
970
  }
814
971
  }
815
972
  }
816
973
  (0, import_react7.useEffect)(() => {
974
+ if (action.disabled) {
975
+ return;
976
+ }
817
977
  setAction(idRef.current, action);
818
978
  if (chatComponentsCache.current !== null && action.render !== void 0) {
819
- chatComponentsCache.current[action.name] = action.render;
979
+ chatComponentsCache.current.actions[action.name] = action.render;
820
980
  }
821
981
  return () => {
822
982
  removeAction(idRef.current);
@@ -826,6 +986,7 @@ function useCopilotAction(action, dependencies) {
826
986
  removeAction,
827
987
  action.description,
828
988
  action.name,
989
+ action.disabled,
829
990
  // This should be faster than deep equality checking
830
991
  // In addition, all major JS engines guarantee the order of object keys
831
992
  JSON.stringify(action.parameters),
@@ -836,12 +997,48 @@ function useCopilotAction(action, dependencies) {
836
997
  ]);
837
998
  }
838
999
 
839
- // src/hooks/use-make-copilot-document-readable.ts
1000
+ // src/hooks/use-coagent-action.ts
840
1001
  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)();
1002
+ var import_shared6 = require("@copilotkit/shared");
1003
+ function useCoAgentAction(action, dependencies) {
1004
+ const { setCoagentAction, removeCoagentAction, coagentActions, chatComponentsCache } = (0, import_react8.useContext)(CopilotContext);
1005
+ const idRef = (0, import_react8.useRef)((0, import_shared6.randomId)());
1006
+ const key = `${action.name}-${action.nodeName || "global"}`;
1007
+ if (dependencies === void 0) {
1008
+ if (coagentActions[idRef.current]) {
1009
+ coagentActions[idRef.current].handler = action.handler;
1010
+ if (typeof action.render === "function") {
1011
+ if (chatComponentsCache.current !== null) {
1012
+ chatComponentsCache.current.coagentActions[key] = action.render;
1013
+ }
1014
+ }
1015
+ }
1016
+ }
844
1017
  (0, import_react8.useEffect)(() => {
1018
+ setCoagentAction(idRef.current, action);
1019
+ if (chatComponentsCache.current !== null && action.render !== void 0) {
1020
+ chatComponentsCache.current.coagentActions[key] = action.render;
1021
+ }
1022
+ return () => {
1023
+ removeCoagentAction(idRef.current);
1024
+ };
1025
+ }, [
1026
+ setCoagentAction,
1027
+ removeCoagentAction,
1028
+ action.name,
1029
+ // include render only if it's a string
1030
+ typeof action.render === "string" ? action.render : void 0,
1031
+ // dependencies set by the developer
1032
+ ...dependencies || []
1033
+ ]);
1034
+ }
1035
+
1036
+ // src/hooks/use-make-copilot-document-readable.ts
1037
+ var import_react9 = require("react");
1038
+ function useMakeCopilotDocumentReadable(document, categories, dependencies = []) {
1039
+ const { addDocumentContext, removeDocumentContext } = useCopilotContext();
1040
+ const idRef = (0, import_react9.useRef)();
1041
+ (0, import_react9.useEffect)(() => {
845
1042
  const id = addDocumentContext(document, categories);
846
1043
  idRef.current = id;
847
1044
  return () => {
@@ -852,16 +1049,16 @@ function useMakeCopilotDocumentReadable(document, categories, dependencies = [])
852
1049
  }
853
1050
 
854
1051
  // src/hooks/use-copilot-readable.ts
855
- var import_react9 = require("react");
1052
+ var import_react10 = require("react");
856
1053
  function convertToJSON(description, value) {
857
1054
  return `${description}: ${typeof value === "string" ? value : JSON.stringify(value)}`;
858
1055
  }
859
1056
  function useCopilotReadable({ description, value, parentId, categories, convert }, dependencies) {
860
- const { addContext, removeContext } = (0, import_react9.useContext)(CopilotContext);
861
- const idRef = (0, import_react9.useRef)();
1057
+ const { addContext, removeContext } = useCopilotContext();
1058
+ const idRef = (0, import_react10.useRef)();
862
1059
  convert = convert || convertToJSON;
863
1060
  const information = convert(description, value);
864
- (0, import_react9.useEffect)(() => {
1061
+ (0, import_react10.useEffect)(() => {
865
1062
  const id = addContext(information, parentId, categories);
866
1063
  idRef.current = id;
867
1064
  return () => {
@@ -871,9 +1068,84 @@ function useCopilotReadable({ description, value, parentId, categories, convert
871
1068
  return idRef.current;
872
1069
  }
873
1070
 
1071
+ // src/hooks/use-coagent.ts
1072
+ var import_react11 = require("react");
1073
+ function useCoAgent(options) {
1074
+ const isExternalStateManagement = (options2) => {
1075
+ return "state" in options2 && "setState" in options2;
1076
+ };
1077
+ const { name } = options;
1078
+ const isInternalStateManagementWithInitial = (options2) => {
1079
+ return "initialState" in options2;
1080
+ };
1081
+ const { coagentStates, setCoagentStates } = useCopilotContext();
1082
+ const getCoagentState = (coagentStates2, name2) => {
1083
+ if (coagentStates2[name2]) {
1084
+ return coagentStates2[name2];
1085
+ } else {
1086
+ return {
1087
+ name: name2,
1088
+ state: isInternalStateManagementWithInitial(options) ? options.initialState : {},
1089
+ running: false,
1090
+ active: false,
1091
+ threadId: void 0,
1092
+ nodeName: void 0,
1093
+ runId: void 0
1094
+ };
1095
+ }
1096
+ };
1097
+ const setState = (newState) => {
1098
+ setCoagentStates((prevAgentStates) => {
1099
+ let coagentState2 = getCoagentState(prevAgentStates, name);
1100
+ const updatedState = typeof newState === "function" ? newState(coagentState2.state) : newState;
1101
+ return __spreadProps(__spreadValues({}, prevAgentStates), {
1102
+ [name]: __spreadProps(__spreadValues({}, coagentState2), {
1103
+ state: updatedState
1104
+ })
1105
+ });
1106
+ });
1107
+ };
1108
+ const coagentState = getCoagentState(coagentStates, name);
1109
+ const state = isExternalStateManagement(options) ? options.state : coagentState.state;
1110
+ (0, import_react11.useEffect)(() => {
1111
+ if (isExternalStateManagement(options)) {
1112
+ setState(options.state);
1113
+ } else if (coagentStates[name] === void 0) {
1114
+ setState(options.initialState === void 0 ? {} : options.initialState);
1115
+ }
1116
+ }, [isExternalStateManagement(options) ? JSON.stringify(options.state) : void 0]);
1117
+ return {
1118
+ name,
1119
+ nodeName: coagentState.nodeName,
1120
+ state,
1121
+ setState,
1122
+ running: coagentState.running,
1123
+ start: () => {
1124
+ startAgent(name);
1125
+ },
1126
+ stop: () => {
1127
+ stopAgent(name);
1128
+ }
1129
+ };
1130
+ }
1131
+ function startAgent(name) {
1132
+ const { setAgentSession } = useCopilotContext();
1133
+ setAgentSession({
1134
+ agentName: name
1135
+ });
1136
+ }
1137
+ function stopAgent(name) {
1138
+ const { agentSession, setAgentSession } = useCopilotContext();
1139
+ if (agentSession && agentSession.agentName === name) {
1140
+ setAgentSession(null);
1141
+ } else {
1142
+ console.warn(`No agent session found for ${name}`);
1143
+ }
1144
+ }
1145
+
874
1146
  // src/lib/copilot-task.ts
875
1147
  var import_runtime_client_gql3 = require("@copilotkit/runtime-client-gql");
876
- var import_shared6 = require("@copilotkit/shared");
1148
+ var import_shared7 = require("@copilotkit/shared");
877
1149
  var CopilotTask = class {
878
1150
  constructor(config) {
879
1151
  this.instructions = config.instructions;
@@ -917,10 +1189,11 @@ var CopilotTask = class {
917
1189
  actions: Object.values(actions).map((action) => ({
918
1190
  name: action.name,
919
1191
  description: action.description || "",
920
- jsonSchema: JSON.stringify((0, import_shared6.actionParametersToJsonSchema)(action.parameters || []))
921
- }))
1192
+ jsonSchema: JSON.stringify((0, import_shared7.actionParametersToJsonSchema)(action.parameters || []))
1193
+ })),
1194
+ url: window.location.href
922
1195
  },
923
- messages: (0, import_runtime_client_gql3.convertMessagesToGqlInput)(messages),
1196
+ messages: (0, import_runtime_client_gql3.convertMessagesToGqlInput)((0, import_runtime_client_gql3.filterAgentStateMessages)(messages)),
924
1197
  metadata: {
925
1198
  requestType: import_runtime_client_gql3.CopilotRequestType.Task
926
1199
  },
@@ -971,7 +1244,7 @@ ${instructions}
971
1244
  }
972
1245
 
973
1246
  // src/utils/extract.ts
974
- var import_shared7 = require("@copilotkit/shared");
1247
+ var import_shared8 = require("@copilotkit/shared");
975
1248
  var import_runtime_client_gql4 = require("@copilotkit/runtime-client-gql");
976
1249
  var import_runtime_client_gql5 = require("@copilotkit/runtime-client-gql");
977
1250
  var import_runtime_client_gql6 = require("@copilotkit/runtime-client-gql");
@@ -1007,7 +1280,7 @@ function extract(_0) {
1007
1280
  content: makeSystemMessage(contextString, instructions),
1008
1281
  role: import_runtime_client_gql4.Role.System
1009
1282
  });
1010
- const headers = __spreadValues(__spreadValues({}, context.copilotApiConfig.headers || {}), context.copilotApiConfig.publicApiKey ? { [import_shared7.COPILOT_CLOUD_PUBLIC_API_KEY_HEADER]: context.copilotApiConfig.publicApiKey } : {});
1283
+ const headers = __spreadValues(__spreadValues({}, context.copilotApiConfig.headers || {}), context.copilotApiConfig.publicApiKey ? { [import_shared8.COPILOT_CLOUD_PUBLIC_API_KEY_HEADER]: context.copilotApiConfig.publicApiKey } : {});
1011
1284
  const runtimeClient = new import_runtime_client_gql5.CopilotRuntimeClient({
1012
1285
  url: context.copilotApiConfig.chatApiEndpoint,
1013
1286
  publicApiKey: context.copilotApiConfig.publicApiKey,
@@ -1022,12 +1295,13 @@ function extract(_0) {
1022
1295
  {
1023
1296
  name: action.name,
1024
1297
  description: action.description || "",
1025
- jsonSchema: JSON.stringify((0, import_shared7.actionParametersToJsonSchema)(action.parameters || []))
1298
+ jsonSchema: JSON.stringify((0, import_shared8.actionParametersToJsonSchema)(action.parameters || []))
1026
1299
  }
1027
- ]
1300
+ ],
1301
+ url: window.location.href
1028
1302
  },
1029
1303
  messages: (0, import_runtime_client_gql6.convertMessagesToGqlInput)(
1030
- includeMessages ? [systemMessage, ...messages] : [systemMessage]
1304
+ includeMessages ? [systemMessage, ...(0, import_runtime_client_gql6.filterAgentStateMessages)(messages)] : [systemMessage]
1031
1305
  ),
1032
1306
  metadata: {
1033
1307
  requestType
@@ -1108,6 +1382,8 @@ Any additional messages provided are for providing context only and should not b
1108
1382
  CopilotTask,
1109
1383
  defaultCopilotContextCategories,
1110
1384
  extract,
1385
+ useCoAgent,
1386
+ useCoAgentAction,
1111
1387
  useCopilotAction,
1112
1388
  useCopilotChat,
1113
1389
  useCopilotContext,