@copilotkit/react-core 1.6.0-next.1 → 1.6.0-next.11

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 (76) hide show
  1. package/CHANGELOG.md +77 -0
  2. package/dist/{chunk-XERJQUHA.mjs → chunk-4CEQJ2X6.mjs} +2 -2
  3. package/dist/{chunk-XERJQUHA.mjs.map → chunk-4CEQJ2X6.mjs.map} +1 -1
  4. package/dist/{chunk-VMYLY5KI.mjs → chunk-4EC4JK7H.mjs} +58 -48
  5. package/dist/chunk-4EC4JK7H.mjs.map +1 -0
  6. package/dist/{chunk-ZAU4EMBM.mjs → chunk-F7O6L7C3.mjs} +4 -5
  7. package/dist/chunk-F7O6L7C3.mjs.map +1 -0
  8. package/dist/{chunk-2DPTBHGN.mjs → chunk-FUO5LKSJ.mjs} +115 -63
  9. package/dist/chunk-FUO5LKSJ.mjs.map +1 -0
  10. package/dist/{chunk-4ED56DQX.mjs → chunk-HBCP2KNA.mjs} +3 -4
  11. package/dist/chunk-HBCP2KNA.mjs.map +1 -0
  12. package/dist/{chunk-Z3U4UBG2.mjs → chunk-T4CAQC6B.mjs} +2 -2
  13. package/dist/{chunk-JFCNSGNU.mjs → chunk-Y2T56VSE.mjs} +2 -2
  14. package/dist/components/copilot-provider/copilotkit-props.d.ts +1 -2
  15. package/dist/components/copilot-provider/copilotkit.d.ts +1 -2
  16. package/dist/components/copilot-provider/index.d.ts +1 -2
  17. package/dist/components/index.d.ts +1 -2
  18. package/dist/context/copilot-context.d.ts +10 -148
  19. package/dist/context/index.d.ts +1 -2
  20. package/dist/copilot-context-9ae8990b.d.ts +183 -0
  21. package/dist/hooks/index.d.ts +1 -2
  22. package/dist/hooks/index.js +180 -123
  23. package/dist/hooks/index.js.map +1 -1
  24. package/dist/hooks/index.mjs +6 -6
  25. package/dist/hooks/use-chat.d.ts +1 -2
  26. package/dist/hooks/use-chat.js +113 -64
  27. package/dist/hooks/use-chat.js.map +1 -1
  28. package/dist/hooks/use-chat.mjs +2 -2
  29. package/dist/hooks/use-coagent.d.ts +1 -2
  30. package/dist/hooks/use-coagent.js +171 -112
  31. package/dist/hooks/use-coagent.js.map +1 -1
  32. package/dist/hooks/use-coagent.mjs +4 -4
  33. package/dist/hooks/use-copilot-chat.d.ts +1 -2
  34. package/dist/hooks/use-copilot-chat.js +116 -67
  35. package/dist/hooks/use-copilot-chat.js.map +1 -1
  36. package/dist/hooks/use-copilot-chat.mjs +3 -3
  37. package/dist/hooks/use-langgraph-interrupt-render.js +3 -4
  38. package/dist/hooks/use-langgraph-interrupt-render.js.map +1 -1
  39. package/dist/hooks/use-langgraph-interrupt-render.mjs +1 -1
  40. package/dist/hooks/use-langgraph-interrupt.d.ts +9 -2
  41. package/dist/hooks/use-langgraph-interrupt.js +117 -69
  42. package/dist/hooks/use-langgraph-interrupt.js.map +1 -1
  43. package/dist/hooks/use-langgraph-interrupt.mjs +4 -4
  44. package/dist/index.d.ts +1 -2
  45. package/dist/index.js +187 -130
  46. package/dist/index.js.map +1 -1
  47. package/dist/index.mjs +7 -7
  48. package/dist/lib/copilot-task.d.ts +1 -2
  49. package/dist/lib/copilot-task.js +1 -1
  50. package/dist/lib/copilot-task.js.map +1 -1
  51. package/dist/lib/copilot-task.mjs +2 -2
  52. package/dist/lib/index.d.ts +1 -2
  53. package/dist/lib/index.js +1 -1
  54. package/dist/lib/index.js.map +1 -1
  55. package/dist/lib/index.mjs +2 -2
  56. package/dist/types/frontend-action.d.ts +2 -1
  57. package/dist/types/frontend-action.js +1 -1
  58. package/dist/types/frontend-action.js.map +1 -1
  59. package/dist/types/frontend-action.mjs +1 -1
  60. package/dist/types/interrupt-action.d.ts +10 -35
  61. package/dist/types/interrupt-action.js.map +1 -1
  62. package/dist/utils/extract.d.ts +1 -2
  63. package/dist/utils/index.d.ts +1 -2
  64. package/package.json +3 -3
  65. package/src/hooks/use-chat.ts +134 -61
  66. package/src/hooks/use-coagent.ts +70 -56
  67. package/src/hooks/use-langgraph-interrupt-render.ts +7 -3
  68. package/src/hooks/use-langgraph-interrupt.ts +1 -2
  69. package/src/types/frontend-action.ts +5 -2
  70. package/src/types/interrupt-action.ts +16 -12
  71. package/dist/chunk-2DPTBHGN.mjs.map +0 -1
  72. package/dist/chunk-4ED56DQX.mjs.map +0 -1
  73. package/dist/chunk-VMYLY5KI.mjs.map +0 -1
  74. package/dist/chunk-ZAU4EMBM.mjs.map +0 -1
  75. /package/dist/{chunk-Z3U4UBG2.mjs.map → chunk-T4CAQC6B.mjs.map} +0 -0
  76. /package/dist/{chunk-JFCNSGNU.mjs.map → chunk-Y2T56VSE.mjs.map} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,82 @@
1
1
  # ui
2
2
 
3
+ ## 1.6.0-next.11
4
+
5
+ ### Patch Changes
6
+
7
+ - 85753b3: - feat(actions): enable restricting actions to frontend only
8
+ - @copilotkit/runtime-client-gql@1.6.0-next.11
9
+ - @copilotkit/shared@1.6.0-next.11
10
+
11
+ ## 1.6.0-next.10
12
+
13
+ ### Patch Changes
14
+
15
+ - @copilotkit/runtime-client-gql@1.6.0-next.10
16
+ - @copilotkit/shared@1.6.0-next.10
17
+
18
+ ## 1.6.0-next.9
19
+
20
+ ### Patch Changes
21
+
22
+ - @copilotkit/runtime-client-gql@1.6.0-next.9
23
+ - @copilotkit/shared@1.6.0-next.9
24
+
25
+ ## 1.6.0-next.8
26
+
27
+ ### Patch Changes
28
+
29
+ - @copilotkit/runtime-client-gql@1.6.0-next.8
30
+ - @copilotkit/shared@1.6.0-next.8
31
+
32
+ ## 1.6.0-next.7
33
+
34
+ ### Patch Changes
35
+
36
+ - d800f03: - fix: use memoization in useCoAgent internal functions
37
+ - @copilotkit/runtime-client-gql@1.6.0-next.7
38
+ - @copilotkit/shared@1.6.0-next.7
39
+
40
+ ## 1.6.0-next.6
41
+
42
+ ### Patch Changes
43
+
44
+ - @copilotkit/runtime-client-gql@1.6.0-next.6
45
+ - @copilotkit/shared@1.6.0-next.6
46
+
47
+ ## 1.6.0-next.5
48
+
49
+ ### Patch Changes
50
+
51
+ - Updated dependencies [090203d]
52
+ - @copilotkit/shared@1.6.0-next.5
53
+ - @copilotkit/runtime-client-gql@1.6.0-next.5
54
+
55
+ ## 1.6.0-next.4
56
+
57
+ ### Patch Changes
58
+
59
+ - @copilotkit/runtime-client-gql@1.6.0-next.4
60
+ - @copilotkit/shared@1.6.0-next.4
61
+
62
+ ## 1.6.0-next.3
63
+
64
+ ### Patch Changes
65
+
66
+ - @copilotkit/runtime-client-gql@1.6.0-next.3
67
+ - @copilotkit/shared@1.6.0-next.3
68
+
69
+ ## 1.6.0-next.2
70
+
71
+ ### Patch Changes
72
+
73
+ - b454827: - fix: simplify condition options for langgraph interrupts
74
+ - chore: add new enabled to e2e tests
75
+ - fix: refine argument types
76
+ - chore: document hook API reference
77
+ - @copilotkit/runtime-client-gql@1.6.0-next.2
78
+ - @copilotkit/shared@1.6.0-next.2
79
+
3
80
  ## 1.6.0-next.1
4
81
 
5
82
  ### Patch Changes
@@ -5,7 +5,7 @@ import {
5
5
  } from "@copilotkit/shared";
6
6
  function processActionsForRuntimeRequest(actions) {
7
7
  const filteredActions = actions.filter(
8
- (action) => action.available !== ActionInputAvailability.Disabled && action.disabled !== true && action.name !== "*"
8
+ (action) => action.available !== ActionInputAvailability.Disabled && action.disabled !== true && action.name !== "*" && action.available != "frontend" && !action.pairedAction
9
9
  ).map((action) => {
10
10
  let available = ActionInputAvailability.Enabled;
11
11
  if (action.disabled) {
@@ -28,4 +28,4 @@ function processActionsForRuntimeRequest(actions) {
28
28
  export {
29
29
  processActionsForRuntimeRequest
30
30
  };
31
- //# sourceMappingURL=chunk-XERJQUHA.mjs.map
31
+ //# sourceMappingURL=chunk-4CEQJ2X6.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/frontend-action.ts"],"sourcesContent":["import { ActionInputAvailability } from \"@copilotkit/runtime-client-gql\";\nimport {\n Action,\n Parameter,\n MappedParameterTypes,\n actionParametersToJsonSchema,\n} from \"@copilotkit/shared\";\nimport React from \"react\";\n\ninterface InProgressState<T extends Parameter[] | [] = []> {\n status: \"inProgress\";\n args: Partial<MappedParameterTypes<T>>;\n result: undefined;\n}\n\ninterface ExecutingState<T extends Parameter[] | [] = []> {\n status: \"executing\";\n args: MappedParameterTypes<T>;\n result: undefined;\n}\n\ninterface CompleteState<T extends Parameter[] | [] = []> {\n status: \"complete\";\n args: MappedParameterTypes<T>;\n result: any;\n}\n\ninterface InProgressStateNoArgs<T extends Parameter[] | [] = []> {\n status: \"inProgress\";\n args: Partial<MappedParameterTypes<T>>;\n result: undefined;\n}\n\ninterface ExecutingStateNoArgs<T extends Parameter[] | [] = []> {\n status: \"executing\";\n args: MappedParameterTypes<T>;\n result: undefined;\n}\n\ninterface CompleteStateNoArgs<T extends Parameter[] | [] = []> {\n status: \"complete\";\n args: MappedParameterTypes<T>;\n result: any;\n}\n\ninterface InProgressStateWait<T extends Parameter[] | [] = []> {\n status: \"inProgress\";\n args: Partial<MappedParameterTypes<T>>;\n /** @deprecated use respond instead */\n handler: undefined;\n respond: undefined;\n result: undefined;\n}\n\ninterface ExecutingStateWait<T extends Parameter[] | [] = []> {\n status: \"executing\";\n args: MappedParameterTypes<T>;\n /** @deprecated use respond instead */\n handler: (result: any) => void;\n respond: (result: any) => void;\n result: undefined;\n}\n\ninterface CompleteStateWait<T extends Parameter[] | [] = []> {\n status: \"complete\";\n args: MappedParameterTypes<T>;\n /** @deprecated use respond instead */\n handler: undefined;\n respond: undefined;\n result: any;\n}\n\ninterface InProgressStateNoArgsWait<T extends Parameter[] | [] = []> {\n status: \"inProgress\";\n args: Partial<MappedParameterTypes<T>>;\n /** @deprecated use respond instead */\n handler: undefined;\n respond: undefined;\n result: undefined;\n}\n\ninterface ExecutingStateNoArgsWait<T extends Parameter[] | [] = []> {\n status: \"executing\";\n args: MappedParameterTypes<T>;\n /** @deprecated use respond instead */\n handler: (result: any) => void;\n respond: (result: any) => void;\n result: undefined;\n}\n\ninterface CompleteStateNoArgsWait<T extends Parameter[] | [] = []> {\n status: \"complete\";\n args: MappedParameterTypes<T>;\n /** @deprecated use respond instead */\n handler: undefined;\n respond: undefined;\n}\n\nexport type ActionRenderProps<T extends Parameter[] | [] = []> =\n | CompleteState<T>\n | ExecutingState<T>\n | InProgressState<T>;\n\nexport type ActionRenderPropsNoArgs<T extends Parameter[] | [] = []> =\n | CompleteStateNoArgs<T>\n | ExecutingStateNoArgs<T>\n | InProgressStateNoArgs<T>;\n\nexport type ActionRenderPropsWait<T extends Parameter[] | [] = []> =\n | CompleteStateWait<T>\n | ExecutingStateWait<T>\n | InProgressStateWait<T>;\n\nexport type ActionRenderPropsNoArgsWait<T extends Parameter[] | [] = []> =\n | CompleteStateNoArgsWait<T>\n | ExecutingStateNoArgsWait<T>\n | InProgressStateNoArgsWait<T>;\n\nexport type CatchAllActionRenderProps<T extends Parameter[] | [] = []> =\n | (CompleteState<T> & {\n name: string;\n })\n | (ExecutingState<T> & {\n name: string;\n })\n | (InProgressState<T> & {\n name: string;\n });\n\nexport type FrontendActionAvailability = \"disabled\" | \"enabled\" | \"remote\";\n\nexport type FrontendAction<\n T extends Parameter[] | [] = [],\n N extends string = string,\n> = Action<T> & {\n name: Exclude<N, \"*\">;\n /**\n * @deprecated Use `available` instead.\n */\n disabled?: boolean;\n available?: FrontendActionAvailability;\n followUp?: boolean;\n} & (\n | {\n render?:\n | string\n | (T extends []\n ? (props: ActionRenderPropsNoArgs<T>) => string | React.ReactElement\n : (props: ActionRenderProps<T>) => string | React.ReactElement);\n /** @deprecated use renderAndWaitForResponse instead */\n renderAndWait?: never;\n renderAndWaitForResponse?: never;\n }\n | {\n render?: never;\n /** @deprecated use renderAndWaitForResponse instead */\n renderAndWait?: T extends []\n ? (props: ActionRenderPropsNoArgsWait<T>) => React.ReactElement\n : (props: ActionRenderPropsWait<T>) => React.ReactElement;\n renderAndWaitForResponse?: T extends []\n ? (props: ActionRenderPropsNoArgsWait<T>) => React.ReactElement\n : (props: ActionRenderPropsWait<T>) => React.ReactElement;\n handler?: never;\n }\n );\n\nexport type CatchAllFrontendAction = {\n name: \"*\";\n render: (props: CatchAllActionRenderProps<any>) => React.ReactElement;\n};\n\nexport type RenderFunctionStatus = ActionRenderProps<any>[\"status\"];\n\nexport function processActionsForRuntimeRequest(actions: FrontendAction<any>[]) {\n const filteredActions = actions\n .filter(\n (action) =>\n action.available !== ActionInputAvailability.Disabled &&\n action.disabled !== true &&\n action.name !== \"*\",\n )\n .map((action) => {\n let available: ActionInputAvailability | undefined = ActionInputAvailability.Enabled;\n if (action.disabled) {\n available = ActionInputAvailability.Disabled;\n } else if (action.available === \"disabled\") {\n available = ActionInputAvailability.Disabled;\n } else if (action.available === \"remote\") {\n available = ActionInputAvailability.Remote;\n }\n return {\n name: action.name,\n description: action.description || \"\",\n jsonSchema: JSON.stringify(actionParametersToJsonSchema(action.parameters || [])),\n available,\n };\n });\n return filteredActions;\n}\n"],"mappings":";AAAA,SAAS,+BAA+B;AACxC;AAAA,EAIE;AAAA,OACK;AAuKA,SAAS,gCAAgC,SAAgC;AAC9E,QAAM,kBAAkB,QACrB;AAAA,IACC,CAAC,WACC,OAAO,cAAc,wBAAwB,YAC7C,OAAO,aAAa,QACpB,OAAO,SAAS;AAAA,EACpB,EACC,IAAI,CAAC,WAAW;AACf,QAAI,YAAiD,wBAAwB;AAC7E,QAAI,OAAO,UAAU;AACnB,kBAAY,wBAAwB;AAAA,IACtC,WAAW,OAAO,cAAc,YAAY;AAC1C,kBAAY,wBAAwB;AAAA,IACtC,WAAW,OAAO,cAAc,UAAU;AACxC,kBAAY,wBAAwB;AAAA,IACtC;AACA,WAAO;AAAA,MACL,MAAM,OAAO;AAAA,MACb,aAAa,OAAO,eAAe;AAAA,MACnC,YAAY,KAAK,UAAU,6BAA6B,OAAO,cAAc,CAAC,CAAC,CAAC;AAAA,MAChF;AAAA,IACF;AAAA,EACF,CAAC;AACH,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../src/types/frontend-action.ts"],"sourcesContent":["import { ActionInputAvailability } from \"@copilotkit/runtime-client-gql\";\nimport {\n Action,\n Parameter,\n MappedParameterTypes,\n actionParametersToJsonSchema,\n} from \"@copilotkit/shared\";\nimport React from \"react\";\n\ninterface InProgressState<T extends Parameter[] | [] = []> {\n status: \"inProgress\";\n args: Partial<MappedParameterTypes<T>>;\n result: undefined;\n}\n\ninterface ExecutingState<T extends Parameter[] | [] = []> {\n status: \"executing\";\n args: MappedParameterTypes<T>;\n result: undefined;\n}\n\ninterface CompleteState<T extends Parameter[] | [] = []> {\n status: \"complete\";\n args: MappedParameterTypes<T>;\n result: any;\n}\n\ninterface InProgressStateNoArgs<T extends Parameter[] | [] = []> {\n status: \"inProgress\";\n args: Partial<MappedParameterTypes<T>>;\n result: undefined;\n}\n\ninterface ExecutingStateNoArgs<T extends Parameter[] | [] = []> {\n status: \"executing\";\n args: MappedParameterTypes<T>;\n result: undefined;\n}\n\ninterface CompleteStateNoArgs<T extends Parameter[] | [] = []> {\n status: \"complete\";\n args: MappedParameterTypes<T>;\n result: any;\n}\n\ninterface InProgressStateWait<T extends Parameter[] | [] = []> {\n status: \"inProgress\";\n args: Partial<MappedParameterTypes<T>>;\n /** @deprecated use respond instead */\n handler: undefined;\n respond: undefined;\n result: undefined;\n}\n\ninterface ExecutingStateWait<T extends Parameter[] | [] = []> {\n status: \"executing\";\n args: MappedParameterTypes<T>;\n /** @deprecated use respond instead */\n handler: (result: any) => void;\n respond: (result: any) => void;\n result: undefined;\n}\n\ninterface CompleteStateWait<T extends Parameter[] | [] = []> {\n status: \"complete\";\n args: MappedParameterTypes<T>;\n /** @deprecated use respond instead */\n handler: undefined;\n respond: undefined;\n result: any;\n}\n\ninterface InProgressStateNoArgsWait<T extends Parameter[] | [] = []> {\n status: \"inProgress\";\n args: Partial<MappedParameterTypes<T>>;\n /** @deprecated use respond instead */\n handler: undefined;\n respond: undefined;\n result: undefined;\n}\n\ninterface ExecutingStateNoArgsWait<T extends Parameter[] | [] = []> {\n status: \"executing\";\n args: MappedParameterTypes<T>;\n /** @deprecated use respond instead */\n handler: (result: any) => void;\n respond: (result: any) => void;\n result: undefined;\n}\n\ninterface CompleteStateNoArgsWait<T extends Parameter[] | [] = []> {\n status: \"complete\";\n args: MappedParameterTypes<T>;\n /** @deprecated use respond instead */\n handler: undefined;\n respond: undefined;\n}\n\nexport type ActionRenderProps<T extends Parameter[] | [] = []> =\n | CompleteState<T>\n | ExecutingState<T>\n | InProgressState<T>;\n\nexport type ActionRenderPropsNoArgs<T extends Parameter[] | [] = []> =\n | CompleteStateNoArgs<T>\n | ExecutingStateNoArgs<T>\n | InProgressStateNoArgs<T>;\n\nexport type ActionRenderPropsWait<T extends Parameter[] | [] = []> =\n | CompleteStateWait<T>\n | ExecutingStateWait<T>\n | InProgressStateWait<T>;\n\nexport type ActionRenderPropsNoArgsWait<T extends Parameter[] | [] = []> =\n | CompleteStateNoArgsWait<T>\n | ExecutingStateNoArgsWait<T>\n | InProgressStateNoArgsWait<T>;\n\nexport type CatchAllActionRenderProps<T extends Parameter[] | [] = []> =\n | (CompleteState<T> & {\n name: string;\n })\n | (ExecutingState<T> & {\n name: string;\n })\n | (InProgressState<T> & {\n name: string;\n });\n\nexport type FrontendActionAvailability = \"disabled\" | \"enabled\" | \"remote\" | \"frontend\";\n\nexport type FrontendAction<\n T extends Parameter[] | [] = [],\n N extends string = string,\n> = Action<T> & {\n name: Exclude<N, \"*\">;\n /**\n * @deprecated Use `available` instead.\n */\n disabled?: boolean;\n available?: FrontendActionAvailability;\n pairedAction?: string;\n followUp?: boolean;\n} & (\n | {\n render?:\n | string\n | (T extends []\n ? (props: ActionRenderPropsNoArgs<T>) => string | React.ReactElement\n : (props: ActionRenderProps<T>) => string | React.ReactElement);\n /** @deprecated use renderAndWaitForResponse instead */\n renderAndWait?: never;\n renderAndWaitForResponse?: never;\n }\n | {\n render?: never;\n /** @deprecated use renderAndWaitForResponse instead */\n renderAndWait?: T extends []\n ? (props: ActionRenderPropsNoArgsWait<T>) => React.ReactElement\n : (props: ActionRenderPropsWait<T>) => React.ReactElement;\n renderAndWaitForResponse?: T extends []\n ? (props: ActionRenderPropsNoArgsWait<T>) => React.ReactElement\n : (props: ActionRenderPropsWait<T>) => React.ReactElement;\n handler?: never;\n }\n );\n\nexport type CatchAllFrontendAction = {\n name: \"*\";\n render: (props: CatchAllActionRenderProps<any>) => React.ReactElement;\n};\n\nexport type RenderFunctionStatus = ActionRenderProps<any>[\"status\"];\n\nexport function processActionsForRuntimeRequest(actions: FrontendAction<any>[]) {\n const filteredActions = actions\n .filter(\n (action) =>\n action.available !== ActionInputAvailability.Disabled &&\n action.disabled !== true &&\n action.name !== \"*\" &&\n action.available != \"frontend\" &&\n !action.pairedAction,\n )\n .map((action) => {\n let available: ActionInputAvailability | undefined = ActionInputAvailability.Enabled;\n if (action.disabled) {\n available = ActionInputAvailability.Disabled;\n } else if (action.available === \"disabled\") {\n available = ActionInputAvailability.Disabled;\n } else if (action.available === \"remote\") {\n available = ActionInputAvailability.Remote;\n }\n return {\n name: action.name,\n description: action.description || \"\",\n jsonSchema: JSON.stringify(actionParametersToJsonSchema(action.parameters || [])),\n available,\n };\n });\n return filteredActions;\n}\n"],"mappings":";AAAA,SAAS,+BAA+B;AACxC;AAAA,EAIE;AAAA,OACK;AAwKA,SAAS,gCAAgC,SAAgC;AAC9E,QAAM,kBAAkB,QACrB;AAAA,IACC,CAAC,WACC,OAAO,cAAc,wBAAwB,YAC7C,OAAO,aAAa,QACpB,OAAO,SAAS,OAChB,OAAO,aAAa,cACpB,CAAC,OAAO;AAAA,EACZ,EACC,IAAI,CAAC,WAAW;AACf,QAAI,YAAiD,wBAAwB;AAC7E,QAAI,OAAO,UAAU;AACnB,kBAAY,wBAAwB;AAAA,IACtC,WAAW,OAAO,cAAc,YAAY;AAC1C,kBAAY,wBAAwB;AAAA,IACtC,WAAW,OAAO,cAAc,UAAU;AACxC,kBAAY,wBAAwB;AAAA,IACtC;AACA,WAAO;AAAA,MACL,MAAM,OAAO;AAAA,MACb,aAAa,OAAO,eAAe;AAAA,MACnC,YAAY,KAAK,UAAU,6BAA6B,OAAO,cAAc,CAAC,CAAC,CAAC;AAAA,MAChF;AAAA,IACF;AAAA,EACF,CAAC;AACH,SAAO;AACT;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  useCopilotChat
3
- } from "./chunk-Z3U4UBG2.mjs";
3
+ } from "./chunk-T4CAQC6B.mjs";
4
4
  import {
5
5
  useCopilotContext
6
6
  } from "./chunk-ZM56S3LJ.mjs";
@@ -21,16 +21,14 @@ import {
21
21
  } from "./chunk-SKC7AJIV.mjs";
22
22
 
23
23
  // src/hooks/use-coagent.ts
24
- import { useEffect, useRef } from "react";
24
+ import { useCallback, useEffect, useMemo, useRef } from "react";
25
+ import { parseJson } from "@copilotkit/shared";
25
26
  function useCoAgent(options) {
26
27
  const generalContext = useCopilotContext();
27
28
  const { availableAgents } = generalContext;
28
29
  const { addToast } = useToast();
29
30
  const lastLoadedThreadId = useRef();
30
31
  const lastLoadedState = useRef();
31
- const isExternalStateManagement = (options2) => {
32
- return "state" in options2 && "setState" in options2;
33
- };
34
32
  const { name } = options;
35
33
  useEffect(() => {
36
34
  if ((availableAgents == null ? void 0 : availableAgents.length) && !availableAgents.some((a) => a.name === name)) {
@@ -39,44 +37,27 @@ function useCoAgent(options) {
39
37
  addToast({ type: "warning", message });
40
38
  }
41
39
  }, [availableAgents]);
42
- const isInternalStateManagementWithInitial = (options2) => {
43
- return "initialState" in options2;
44
- };
45
40
  const messagesContext = useCopilotMessagesContext();
46
41
  const context = __spreadValues(__spreadValues({}, generalContext), messagesContext);
47
42
  const { coagentStates, coagentStatesRef, setCoagentStatesWithRef, threadId, copilotApiConfig } = context;
48
43
  const { appendMessage, runChatCompletion } = useCopilotChat();
49
- const getCoagentState = (coagentStates2, name2) => {
50
- var _a;
51
- if (coagentStates2[name2]) {
52
- return coagentStates2[name2];
53
- } else {
54
- return {
55
- name: name2,
56
- state: isInternalStateManagementWithInitial(options) ? options.initialState : {},
57
- configurable: (_a = options.configurable) != null ? _a : {},
58
- running: false,
59
- active: false,
60
- threadId: void 0,
61
- nodeName: void 0,
62
- runId: void 0
63
- };
64
- }
65
- };
66
44
  const runtimeClient = useCopilotRuntimeClient({
67
45
  url: copilotApiConfig.chatApiEndpoint,
68
46
  publicApiKey: copilotApiConfig.publicApiKey,
69
47
  credentials: copilotApiConfig.credentials
70
48
  });
71
- const setState = (newState) => {
72
- let coagentState2 = getCoagentState(coagentStatesRef.current || {}, name);
73
- const updatedState = typeof newState === "function" ? newState(coagentState2.state) : newState;
74
- setCoagentStatesWithRef(__spreadProps(__spreadValues({}, coagentStatesRef.current), {
75
- [name]: __spreadProps(__spreadValues({}, coagentState2), {
76
- state: updatedState
77
- })
78
- }));
79
- };
49
+ const setState = useCallback(
50
+ (newState) => {
51
+ let coagentState = getCoagentState({ coagentStates, name, options });
52
+ const updatedState = typeof newState === "function" ? newState(coagentState.state) : newState;
53
+ setCoagentStatesWithRef(__spreadProps(__spreadValues({}, coagentStatesRef.current), {
54
+ [name]: __spreadProps(__spreadValues({}, coagentState), {
55
+ state: updatedState
56
+ })
57
+ }));
58
+ },
59
+ [coagentStates, name]
60
+ );
80
61
  useEffect(() => {
81
62
  const fetchAgentState = () => __async(this, null, function* () {
82
63
  var _a, _b, _c, _d;
@@ -92,13 +73,12 @@ function useCoAgent(options) {
92
73
  if (((_d = (_c = result.data) == null ? void 0 : _c.loadAgentState) == null ? void 0 : _d.threadExists) && newState && newState != "{}") {
93
74
  lastLoadedState.current = newState;
94
75
  lastLoadedThreadId.current = threadId;
95
- const fetchedState = JSON.parse(newState);
76
+ const fetchedState = parseJson(newState, {});
96
77
  isExternalStateManagement(options) ? options.setState(fetchedState) : setState(fetchedState);
97
78
  }
98
79
  });
99
80
  void fetchAgentState();
100
81
  }, [threadId]);
101
- const coagentState = getCoagentState(coagentStates, name);
102
82
  useEffect(() => {
103
83
  if (isExternalStateManagement(options)) {
104
84
  setState(options.state);
@@ -116,17 +96,20 @@ function useCoAgent(options) {
116
96
  }),
117
97
  [name, context, appendMessage, runChatCompletion]
118
98
  );
119
- return {
120
- name,
121
- nodeName: coagentState.nodeName,
122
- threadId: coagentState.threadId,
123
- running: coagentState.running,
124
- state: coagentState.state,
125
- setState: isExternalStateManagement(options) ? options.setState : setState,
126
- start: () => startAgent(name, context),
127
- stop: () => stopAgent(name, context),
128
- run: runAgentCallback
129
- };
99
+ return useMemo(() => {
100
+ const coagentState = getCoagentState({ coagentStates, name, options });
101
+ return {
102
+ name,
103
+ nodeName: coagentState.nodeName,
104
+ threadId: coagentState.threadId,
105
+ running: coagentState.running,
106
+ state: coagentState.state,
107
+ setState: isExternalStateManagement(options) ? options.setState : setState,
108
+ start: () => startAgent(name, context),
109
+ stop: () => stopAgent(name, context),
110
+ run: runAgentCallback
111
+ };
112
+ }, [name, coagentStates, options, setState, runAgentCallback]);
130
113
  }
131
114
  function startAgent(name, context) {
132
115
  const { setAgentSession } = context;
@@ -182,6 +165,33 @@ function runAgent(name, context, appendMessage, runChatCompletion, hint) {
182
165
  }
183
166
  });
184
167
  }
168
+ var isExternalStateManagement = (options) => {
169
+ return "state" in options && "setState" in options;
170
+ };
171
+ var isInternalStateManagementWithInitial = (options) => {
172
+ return "initialState" in options;
173
+ };
174
+ var getCoagentState = ({
175
+ coagentStates,
176
+ name,
177
+ options
178
+ }) => {
179
+ var _a;
180
+ if (coagentStates[name]) {
181
+ return coagentStates[name];
182
+ } else {
183
+ return {
184
+ name,
185
+ state: isInternalStateManagementWithInitial(options) ? options.initialState : {},
186
+ configurable: (_a = options.configurable) != null ? _a : {},
187
+ running: false,
188
+ active: false,
189
+ threadId: void 0,
190
+ nodeName: void 0,
191
+ runId: void 0
192
+ };
193
+ }
194
+ };
185
195
 
186
196
  export {
187
197
  useCoAgent,
@@ -189,4 +199,4 @@ export {
189
199
  stopAgent,
190
200
  runAgent
191
201
  };
192
- //# sourceMappingURL=chunk-VMYLY5KI.mjs.map
202
+ //# sourceMappingURL=chunk-4EC4JK7H.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/use-coagent.ts"],"sourcesContent":["/**\n * <Callout type=\"info\">\n * Usage of this hook assumes some additional setup in your application, for more information\n * on that see the CoAgents <span className=\"text-blue-500\">[getting started guide](/coagents/quickstart/langgraph)</span>.\n * </Callout>\n * <Frame className=\"my-12\">\n * <img\n * src=\"/images/coagents/SharedStateCoAgents.gif\"\n * alt=\"CoAgents demonstration\"\n * className=\"w-auto\"\n * />\n * </Frame>\n *\n * This hook is used to integrate an agent into your application. With its use, you can\n * render and update the state of an agent, allowing for a dynamic and interactive experience.\n * We call these shared state experiences agentic copilots, or CoAgents for short.\n *\n * ## Usage\n *\n * ### Simple Usage\n *\n * ```tsx\n * import { useCoAgent } from \"@copilotkit/react-core\";\n *\n * type AgentState = {\n * count: number;\n * }\n *\n * const agent = useCoAgent<AgentState>({\n * name: \"my-agent\",\n * initialState: {\n * count: 0,\n * },\n * });\n *\n * ```\n *\n * `useCoAgent` returns an object with the following properties:\n *\n * ```tsx\n * const {\n * name, // The name of the agent currently being used.\n * nodeName, // The name of the current LangGraph node.\n * state, // The current state of the agent.\n * setState, // A function to update the state of the agent.\n * running, // A boolean indicating if the agent is currently running.\n * start, // A function to start the agent.\n * stop, // A function to stop the agent.\n * run, // A function to re-run the agent. Takes a HintFunction to inform the agent why it is being re-run.\n * } = agent;\n * ```\n *\n * Finally we can leverage these properties to create reactive experiences with the agent!\n *\n * ```tsx\n * const { state, setState } = useCoAgent<AgentState>({\n * name: \"my-agent\",\n * initialState: {\n * count: 0,\n * },\n * });\n *\n * return (\n * <div>\n * <p>Count: {state.count}</p>\n * <button onClick={() => setState({ count: state.count + 1 })}>Increment</button>\n * </div>\n * );\n * ```\n *\n * This reactivity is bidirectional, meaning that changes to the state from the agent will be reflected in the UI and vice versa.\n *\n * ## Parameters\n * <PropertyReference name=\"options\" type=\"UseCoagentOptions<T>\" required>\n * The options to use when creating the coagent.\n * <PropertyReference name=\"name\" type=\"string\" required>\n * The name of the agent to use.\n * </PropertyReference>\n * <PropertyReference name=\"initialState\" type=\"T | any\">\n * The initial state of the agent.\n * </PropertyReference>\n * <PropertyReference name=\"state\" type=\"T | any\">\n * State to manage externally if you are using this hook with external state management.\n * </PropertyReference>\n * <PropertyReference name=\"setState\" type=\"(newState: T | ((prevState: T | undefined) => T)) => void\">\n * A function to update the state of the agent if you are using this hook with external state management.\n * </PropertyReference>\n * </PropertyReference>\n */\n\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport {\n CopilotContextParams,\n CopilotMessagesContextParams,\n useCopilotContext,\n useCopilotMessagesContext,\n} from \"../context\";\nimport { CoagentState } from \"../types/coagent-state\";\nimport { useCopilotChat } from \"./use-copilot-chat\";\nimport { Message } from \"@copilotkit/runtime-client-gql\";\nimport { useAsyncCallback } from \"../components/error-boundary/error-utils\";\nimport { useToast } from \"../components/toast/toast-provider\";\nimport { useCopilotRuntimeClient } from \"./use-copilot-runtime-client\";\nimport { parseJson } from \"@copilotkit/shared\";\n\ninterface WithInternalStateManagementAndInitial<T> {\n /**\n * The name of the agent being used.\n */\n name: string;\n /**\n * The initial state of the agent.\n */\n initialState: T;\n /**\n * Config to pass to a LangGraph Agent\n */\n configurable?: Record<string, any>;\n}\n\ninterface WithInternalStateManagement {\n /**\n * The name of the agent being used.\n */\n name: string;\n /**\n * Optional initialState with default type any\n */\n initialState?: any;\n /**\n * Config to pass to a LangGraph Agent\n */\n configurable?: Record<string, any>;\n}\n\ninterface WithExternalStateManagement<T> {\n /**\n * The name of the agent being used.\n */\n name: string;\n /**\n * The current state of the agent.\n */\n state: T;\n /**\n * A function to update the state of the agent.\n */\n setState: (newState: T | ((prevState: T | undefined) => T)) => void;\n /**\n * Config to pass to a LangGraph Agent\n */\n configurable?: Record<string, any>;\n}\n\ntype UseCoagentOptions<T> =\n | WithInternalStateManagementAndInitial<T>\n | WithInternalStateManagement\n | WithExternalStateManagement<T>;\n\nexport interface UseCoagentReturnType<T> {\n /**\n * The name of the agent being used.\n */\n name: string;\n /**\n * The name of the current LangGraph node.\n */\n nodeName?: string;\n /**\n * The ID of the thread the agent is running in.\n */\n threadId?: string;\n /**\n * A boolean indicating if the agent is currently running.\n */\n running: boolean;\n /**\n * The current state of the agent.\n */\n state: T;\n /**\n * A function to update the state of the agent.\n */\n setState: (newState: T | ((prevState: T | undefined) => T)) => void;\n /**\n * A function to start the agent.\n */\n start: () => void;\n /**\n * A function to stop the agent.\n */\n stop: () => void;\n /**\n * A function to re-run the agent. The hint function can be used to provide a hint to the agent\n * about why it is being re-run again.\n */\n run: (hint?: HintFunction) => Promise<void>;\n}\n\nexport interface HintFunctionParams {\n /**\n * The previous state of the agent.\n */\n previousState: any;\n /**\n * The current state of the agent.\n */\n currentState: any;\n}\n\nexport type HintFunction = (params: HintFunctionParams) => Message | undefined;\n\n/**\n * This hook is used to integrate an agent into your application. With its use, you can\n * render and update the state of the agent, allowing for a dynamic and interactive experience.\n * We call these shared state experiences \"agentic copilots\". To get started using agentic copilots, which\n * we refer to as CoAgents, checkout the documentation at https://docs.copilotkit.ai/coagents/quickstart/langgraph.\n */\nexport function useCoAgent<T = any>(options: UseCoagentOptions<T>): UseCoagentReturnType<T> {\n const generalContext = useCopilotContext();\n const { availableAgents } = generalContext;\n const { addToast } = useToast();\n const lastLoadedThreadId = useRef<string>();\n const lastLoadedState = useRef<any>();\n\n const { name } = options;\n useEffect(() => {\n if (availableAgents?.length && !availableAgents.some((a) => a.name === name)) {\n const message = `(useCoAgent): Agent \"${name}\" not found. Make sure the agent exists and is properly configured.`;\n console.warn(message);\n addToast({ type: \"warning\", message });\n }\n }, [availableAgents]);\n\n const messagesContext = useCopilotMessagesContext();\n const context = { ...generalContext, ...messagesContext };\n const { coagentStates, coagentStatesRef, setCoagentStatesWithRef, threadId, copilotApiConfig } =\n context;\n const { appendMessage, runChatCompletion } = useCopilotChat();\n\n const runtimeClient = useCopilotRuntimeClient({\n url: copilotApiConfig.chatApiEndpoint,\n publicApiKey: copilotApiConfig.publicApiKey,\n credentials: copilotApiConfig.credentials,\n });\n\n // if we manage state internally, we need to provide a function to set the state\n const setState = useCallback(\n (newState: T | ((prevState: T | undefined) => T)) => {\n // coagentStatesRef.current || {}\n let coagentState: CoagentState = getCoagentState({ coagentStates, name, options });\n const updatedState =\n typeof newState === \"function\" ? (newState as Function)(coagentState.state) : newState;\n\n setCoagentStatesWithRef({\n ...coagentStatesRef.current,\n [name]: {\n ...coagentState,\n state: updatedState,\n },\n });\n },\n [coagentStates, name],\n );\n\n useEffect(() => {\n const fetchAgentState = async () => {\n if (!threadId || threadId === lastLoadedThreadId.current) return;\n\n const result = await runtimeClient.loadAgentState({\n threadId,\n agentName: name,\n });\n\n const newState = result.data?.loadAgentState?.state;\n if (newState === lastLoadedState.current) return;\n\n if (result.data?.loadAgentState?.threadExists && newState && newState != \"{}\") {\n lastLoadedState.current = newState;\n lastLoadedThreadId.current = threadId;\n const fetchedState = parseJson(newState, {});\n isExternalStateManagement(options)\n ? options.setState(fetchedState)\n : setState(fetchedState);\n }\n };\n void fetchAgentState();\n }, [threadId]);\n\n // Sync internal state with external state if state management is external\n useEffect(() => {\n if (isExternalStateManagement(options)) {\n setState(options.state);\n } else if (coagentStates[name] === undefined) {\n setState(options.initialState === undefined ? {} : options.initialState);\n }\n }, [\n isExternalStateManagement(options) ? JSON.stringify(options.state) : undefined,\n // reset initialstate on reset\n coagentStates[name] === undefined,\n ]);\n\n const runAgentCallback = useAsyncCallback(\n async (hint?: HintFunction) => {\n await runAgent(name, context, appendMessage, runChatCompletion, hint);\n },\n [name, context, appendMessage, runChatCompletion],\n );\n\n // Return the state and setState function\n return useMemo(() => {\n const coagentState = getCoagentState({ coagentStates, name, options });\n return {\n name,\n nodeName: coagentState.nodeName,\n threadId: coagentState.threadId,\n running: coagentState.running,\n state: coagentState.state,\n setState: isExternalStateManagement(options) ? options.setState : setState,\n start: () => startAgent(name, context),\n stop: () => stopAgent(name, context),\n run: runAgentCallback,\n };\n }, [name, coagentStates, options, setState, runAgentCallback]);\n}\n\nexport function startAgent(name: string, context: CopilotContextParams) {\n const { setAgentSession } = context;\n setAgentSession({\n agentName: name,\n });\n}\n\nexport function stopAgent(name: string, context: CopilotContextParams) {\n const { agentSession, setAgentSession } = context;\n if (agentSession && agentSession.agentName === name) {\n setAgentSession(null);\n context.setCoagentStates((prevAgentStates) => {\n return {\n ...prevAgentStates,\n [name]: {\n ...prevAgentStates[name],\n running: false,\n active: false,\n threadId: undefined,\n nodeName: undefined,\n runId: undefined,\n },\n };\n });\n } else {\n console.warn(`No agent session found for ${name}`);\n }\n}\n\nexport async function runAgent(\n name: string,\n context: CopilotContextParams & CopilotMessagesContextParams,\n appendMessage: (message: Message) => Promise<void>,\n runChatCompletion: () => Promise<Message[]>,\n hint?: HintFunction,\n) {\n const { agentSession, setAgentSession } = context;\n if (!agentSession || agentSession.agentName !== name) {\n setAgentSession({\n agentName: name,\n });\n }\n\n let previousState: any = null;\n for (let i = context.messages.length - 1; i >= 0; i--) {\n const message = context.messages[i];\n if (message.isAgentStateMessage() && message.agentName === name) {\n previousState = message.state;\n }\n }\n\n let state = context.coagentStatesRef.current?.[name]?.state || {};\n\n if (hint) {\n const hintMessage = hint({ previousState, currentState: state });\n if (hintMessage) {\n await appendMessage(hintMessage);\n } else {\n await runChatCompletion();\n }\n } else {\n await runChatCompletion();\n }\n}\n\nconst isExternalStateManagement = <T>(\n options: UseCoagentOptions<T>,\n): options is WithExternalStateManagement<T> => {\n return \"state\" in options && \"setState\" in options;\n};\n\nconst isInternalStateManagementWithInitial = <T>(\n options: UseCoagentOptions<T>,\n): options is WithInternalStateManagementAndInitial<T> => {\n return \"initialState\" in options;\n};\n\nconst getCoagentState = <T>({\n coagentStates,\n name,\n options,\n}: {\n coagentStates: Record<string, CoagentState>;\n name: string;\n options: UseCoagentOptions<T>;\n}) => {\n if (coagentStates[name]) {\n return coagentStates[name];\n } else {\n return {\n name,\n state: isInternalStateManagementWithInitial<T>(options) ? options.initialState : {},\n configurable: options.configurable ?? {},\n running: false,\n active: false,\n threadId: undefined,\n nodeName: undefined,\n runId: undefined,\n };\n }\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA0FA,SAAS,aAAa,WAAW,SAAS,cAAc;AAaxD,SAAS,iBAAiB;AAmHnB,SAAS,WAAoB,SAAwD;AAC1F,QAAM,iBAAiB,kBAAkB;AACzC,QAAM,EAAE,gBAAgB,IAAI;AAC5B,QAAM,EAAE,SAAS,IAAI,SAAS;AAC9B,QAAM,qBAAqB,OAAe;AAC1C,QAAM,kBAAkB,OAAY;AAEpC,QAAM,EAAE,KAAK,IAAI;AACjB,YAAU,MAAM;AACd,SAAI,mDAAiB,WAAU,CAAC,gBAAgB,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,GAAG;AAC5E,YAAM,UAAU,wBAAwB;AACxC,cAAQ,KAAK,OAAO;AACpB,eAAS,EAAE,MAAM,WAAW,QAAQ,CAAC;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,eAAe,CAAC;AAEpB,QAAM,kBAAkB,0BAA0B;AAClD,QAAM,UAAU,kCAAK,iBAAmB;AACxC,QAAM,EAAE,eAAe,kBAAkB,yBAAyB,UAAU,iBAAiB,IAC3F;AACF,QAAM,EAAE,eAAe,kBAAkB,IAAI,eAAe;AAE5D,QAAM,gBAAgB,wBAAwB;AAAA,IAC5C,KAAK,iBAAiB;AAAA,IACtB,cAAc,iBAAiB;AAAA,IAC/B,aAAa,iBAAiB;AAAA,EAChC,CAAC;AAGD,QAAM,WAAW;AAAA,IACf,CAAC,aAAoD;AAEnD,UAAI,eAA6B,gBAAgB,EAAE,eAAe,MAAM,QAAQ,CAAC;AACjF,YAAM,eACJ,OAAO,aAAa,aAAc,SAAsB,aAAa,KAAK,IAAI;AAEhF,8BAAwB,iCACnB,iBAAiB,UADE;AAAA,QAEtB,CAAC,IAAI,GAAG,iCACH,eADG;AAAA,UAEN,OAAO;AAAA,QACT;AAAA,MACF,EAAC;AAAA,IACH;AAAA,IACA,CAAC,eAAe,IAAI;AAAA,EACtB;AAEA,YAAU,MAAM;AACd,UAAM,kBAAkB,MAAY;AA1QxC;AA2QM,UAAI,CAAC,YAAY,aAAa,mBAAmB;AAAS;AAE1D,YAAM,SAAS,MAAM,cAAc,eAAe;AAAA,QAChD;AAAA,QACA,WAAW;AAAA,MACb,CAAC;AAED,YAAM,YAAW,kBAAO,SAAP,mBAAa,mBAAb,mBAA6B;AAC9C,UAAI,aAAa,gBAAgB;AAAS;AAE1C,YAAI,kBAAO,SAAP,mBAAa,mBAAb,mBAA6B,iBAAgB,YAAY,YAAY,MAAM;AAC7E,wBAAgB,UAAU;AAC1B,2BAAmB,UAAU;AAC7B,cAAM,eAAe,UAAU,UAAU,CAAC,CAAC;AAC3C,kCAA0B,OAAO,IAC7B,QAAQ,SAAS,YAAY,IAC7B,SAAS,YAAY;AAAA,MAC3B;AAAA,IACF;AACA,SAAK,gBAAgB;AAAA,EACvB,GAAG,CAAC,QAAQ,CAAC;AAGb,YAAU,MAAM;AACd,QAAI,0BAA0B,OAAO,GAAG;AACtC,eAAS,QAAQ,KAAK;AAAA,IACxB,WAAW,cAAc,IAAI,MAAM,QAAW;AAC5C,eAAS,QAAQ,iBAAiB,SAAY,CAAC,IAAI,QAAQ,YAAY;AAAA,IACzE;AAAA,EACF,GAAG;AAAA,IACD,0BAA0B,OAAO,IAAI,KAAK,UAAU,QAAQ,KAAK,IAAI;AAAA;AAAA,IAErE,cAAc,IAAI,MAAM;AAAA,EAC1B,CAAC;AAED,QAAM,mBAAmB;AAAA,IACvB,CAAO,SAAwB;AAC7B,YAAM,SAAS,MAAM,SAAS,eAAe,mBAAmB,IAAI;AAAA,IACtE;AAAA,IACA,CAAC,MAAM,SAAS,eAAe,iBAAiB;AAAA,EAClD;AAGA,SAAO,QAAQ,MAAM;AACnB,UAAM,eAAe,gBAAgB,EAAE,eAAe,MAAM,QAAQ,CAAC;AACrE,WAAO;AAAA,MACL;AAAA,MACA,UAAU,aAAa;AAAA,MACvB,UAAU,aAAa;AAAA,MACvB,SAAS,aAAa;AAAA,MACtB,OAAO,aAAa;AAAA,MACpB,UAAU,0BAA0B,OAAO,IAAI,QAAQ,WAAW;AAAA,MAClE,OAAO,MAAM,WAAW,MAAM,OAAO;AAAA,MACrC,MAAM,MAAM,UAAU,MAAM,OAAO;AAAA,MACnC,KAAK;AAAA,IACP;AAAA,EACF,GAAG,CAAC,MAAM,eAAe,SAAS,UAAU,gBAAgB,CAAC;AAC/D;AAEO,SAAS,WAAW,MAAc,SAA+B;AACtE,QAAM,EAAE,gBAAgB,IAAI;AAC5B,kBAAgB;AAAA,IACd,WAAW;AAAA,EACb,CAAC;AACH;AAEO,SAAS,UAAU,MAAc,SAA+B;AACrE,QAAM,EAAE,cAAc,gBAAgB,IAAI;AAC1C,MAAI,gBAAgB,aAAa,cAAc,MAAM;AACnD,oBAAgB,IAAI;AACpB,YAAQ,iBAAiB,CAAC,oBAAoB;AAC5C,aAAO,iCACF,kBADE;AAAA,QAEL,CAAC,IAAI,GAAG,iCACH,gBAAgB,IAAI,IADjB;AAAA,UAEN,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,UAAU;AAAA,UACV,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,OAAO;AACL,YAAQ,KAAK,8BAA8B,MAAM;AAAA,EACnD;AACF;AAEA,SAAsB,SACpB,MACA,SACA,eACA,mBACA,MACA;AAAA;AAzWF;AA0WE,UAAM,EAAE,cAAc,gBAAgB,IAAI;AAC1C,QAAI,CAAC,gBAAgB,aAAa,cAAc,MAAM;AACpD,sBAAgB;AAAA,QACd,WAAW;AAAA,MACb,CAAC;AAAA,IACH;AAEA,QAAI,gBAAqB;AACzB,aAAS,IAAI,QAAQ,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AACrD,YAAM,UAAU,QAAQ,SAAS,CAAC;AAClC,UAAI,QAAQ,oBAAoB,KAAK,QAAQ,cAAc,MAAM;AAC/D,wBAAgB,QAAQ;AAAA,MAC1B;AAAA,IACF;AAEA,QAAI,UAAQ,mBAAQ,iBAAiB,YAAzB,mBAAmC,UAAnC,mBAA0C,UAAS,CAAC;AAEhE,QAAI,MAAM;AACR,YAAM,cAAc,KAAK,EAAE,eAAe,cAAc,MAAM,CAAC;AAC/D,UAAI,aAAa;AACf,cAAM,cAAc,WAAW;AAAA,MACjC,OAAO;AACL,cAAM,kBAAkB;AAAA,MAC1B;AAAA,IACF,OAAO;AACL,YAAM,kBAAkB;AAAA,IAC1B;AAAA,EACF;AAAA;AAEA,IAAM,4BAA4B,CAChC,YAC8C;AAC9C,SAAO,WAAW,WAAW,cAAc;AAC7C;AAEA,IAAM,uCAAuC,CAC3C,YACwD;AACxD,SAAO,kBAAkB;AAC3B;AAEA,IAAM,kBAAkB,CAAI;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AACF,MAIM;AA3ZN;AA4ZE,MAAI,cAAc,IAAI,GAAG;AACvB,WAAO,cAAc,IAAI;AAAA,EAC3B,OAAO;AACL,WAAO;AAAA,MACL;AAAA,MACA,OAAO,qCAAwC,OAAO,IAAI,QAAQ,eAAe,CAAC;AAAA,MAClF,eAAc,aAAQ,iBAAR,YAAwB,CAAC;AAAA,MACvC,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,UAAU;AAAA,MACV,OAAO;AAAA,IACT;AAAA,EACF;AACF;","names":[]}
@@ -4,12 +4,11 @@ import {
4
4
 
5
5
  // src/hooks/use-langgraph-interrupt-render.ts
6
6
  import React, { useCallback } from "react";
7
- import { executeConditions } from "@copilotkit/shared";
8
7
  var InterruptRenderer = ({ event, result, render, resolve }) => {
9
8
  return render({ event, result, resolve });
10
9
  };
11
10
  function useLangGraphInterruptRender() {
12
- const { langGraphInterruptAction, setLangGraphInterruptAction } = useCopilotContext();
11
+ const { langGraphInterruptAction, setLangGraphInterruptAction, agentSession } = useCopilotContext();
13
12
  const responseRef = React.useRef();
14
13
  const resolveInterrupt = useCallback(
15
14
  (response) => {
@@ -22,8 +21,8 @@ function useLangGraphInterruptRender() {
22
21
  );
23
22
  if (!langGraphInterruptAction || !langGraphInterruptAction.event || !langGraphInterruptAction.render)
24
23
  return null;
25
- const { render, handler, event, conditions } = langGraphInterruptAction;
26
- const conditionsMet = executeConditions({ conditions, value: event.value });
24
+ const { render, handler, event, enabled } = langGraphInterruptAction;
25
+ const conditionsMet = !agentSession || !enabled ? true : enabled({ eventValue: event.value, agentMetadata: agentSession });
27
26
  if (!conditionsMet) {
28
27
  return null;
29
28
  }
@@ -45,4 +44,4 @@ function useLangGraphInterruptRender() {
45
44
  export {
46
45
  useLangGraphInterruptRender
47
46
  };
48
- //# sourceMappingURL=chunk-ZAU4EMBM.mjs.map
47
+ //# sourceMappingURL=chunk-F7O6L7C3.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/use-langgraph-interrupt-render.ts"],"sourcesContent":["import { useCopilotContext } from \"../context\";\nimport React, { useCallback } from \"react\";\nimport { executeConditions } from \"@copilotkit/shared\";\n\ntype InterruptProps = {\n event: any;\n result: any;\n render: (props: {\n event: any;\n result: any;\n resolve: (response: string) => void;\n }) => string | React.ReactElement;\n resolve: (response: string) => void;\n};\n\nconst InterruptRenderer: React.FC<InterruptProps> = ({ event, result, render, resolve }) => {\n return render({ event, result, resolve });\n};\n\nexport function useLangGraphInterruptRender(): string | React.ReactElement | null {\n const { langGraphInterruptAction, setLangGraphInterruptAction, agentSession } =\n useCopilotContext();\n\n const responseRef = React.useRef<string>();\n const resolveInterrupt = useCallback(\n (response: string) => {\n responseRef.current = response;\n // Use setTimeout to defer the state update to next tick\n setTimeout(() => {\n setLangGraphInterruptAction({ event: { response } });\n }, 0);\n },\n [setLangGraphInterruptAction],\n );\n\n if (\n !langGraphInterruptAction ||\n !langGraphInterruptAction.event ||\n !langGraphInterruptAction.render\n )\n return null;\n\n const { render, handler, event, enabled } = langGraphInterruptAction;\n\n const conditionsMet =\n !agentSession || !enabled\n ? true\n : enabled({ eventValue: event.value, agentMetadata: agentSession });\n if (!conditionsMet) {\n return null;\n }\n\n let result = null;\n if (handler) {\n result = handler({\n event,\n resolve: resolveInterrupt,\n });\n }\n\n return React.createElement(InterruptRenderer, {\n event,\n result,\n render,\n resolve: resolveInterrupt,\n });\n}\n"],"mappings":";;;;;AACA,OAAO,SAAS,mBAAmB;AAcnC,IAAM,oBAA8C,CAAC,EAAE,OAAO,QAAQ,QAAQ,QAAQ,MAAM;AAC1F,SAAO,OAAO,EAAE,OAAO,QAAQ,QAAQ,CAAC;AAC1C;AAEO,SAAS,8BAAkE;AAChF,QAAM,EAAE,0BAA0B,6BAA6B,aAAa,IAC1E,kBAAkB;AAEpB,QAAM,cAAc,MAAM,OAAe;AACzC,QAAM,mBAAmB;AAAA,IACvB,CAAC,aAAqB;AACpB,kBAAY,UAAU;AAEtB,iBAAW,MAAM;AACf,oCAA4B,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAAA,MACrD,GAAG,CAAC;AAAA,IACN;AAAA,IACA,CAAC,2BAA2B;AAAA,EAC9B;AAEA,MACE,CAAC,4BACD,CAAC,yBAAyB,SAC1B,CAAC,yBAAyB;AAE1B,WAAO;AAET,QAAM,EAAE,QAAQ,SAAS,OAAO,QAAQ,IAAI;AAE5C,QAAM,gBACJ,CAAC,gBAAgB,CAAC,UACd,OACA,QAAQ,EAAE,YAAY,MAAM,OAAO,eAAe,aAAa,CAAC;AACtE,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,EACT;AAEA,MAAI,SAAS;AACb,MAAI,SAAS;AACX,aAAS,QAAQ;AAAA,MACf;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SAAO,MAAM,cAAc,mBAAmB;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,EACX,CAAC;AACH;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  processActionsForRuntimeRequest
3
- } from "./chunk-XERJQUHA.mjs";
3
+ } from "./chunk-4CEQJ2X6.mjs";
4
4
  import {
5
5
  useCopilotRuntimeClient
6
6
  } from "./chunk-BKTARDXX.mjs";
@@ -18,7 +18,8 @@ import {
18
18
  import { useCallback, useRef } from "react";
19
19
  import {
20
20
  COPILOT_CLOUD_PUBLIC_API_KEY_HEADER,
21
- randomId
21
+ randomId,
22
+ parseJson
22
23
  } from "@copilotkit/shared";
23
24
  import {
24
25
  TextMessage,
@@ -33,9 +34,10 @@ import {
33
34
  CopilotRequestType,
34
35
  loadMessagesFromJsonRepresentation,
35
36
  CopilotRuntimeClient,
36
- langGraphInterruptEvent
37
+ langGraphInterruptEvent,
38
+ MetaEventName,
39
+ ActionExecutionMessage
37
40
  } from "@copilotkit/runtime-client-gql";
38
- import { MetaEventName } from "@copilotkit/runtime-client-gql";
39
41
  function useChat(options) {
40
42
  const {
41
43
  messages,
@@ -180,10 +182,7 @@ function useChat(options) {
180
182
  ((_i = (_h = value.generateCopilotResponse) == null ? void 0 : _h.metaEvents) != null ? _i : []).forEach((ev) => {
181
183
  if (ev.name === MetaEventName.LangGraphInterruptEvent) {
182
184
  let eventValue = langGraphInterruptEvent(ev).value;
183
- try {
184
- eventValue = JSON.parse(eventValue);
185
- } catch (e) {
186
- }
185
+ eventValue = parseJson(eventValue, eventValue);
187
186
  setLangGraphInterruptAction({
188
187
  event: __spreadProps(__spreadValues({}, langGraphInterruptEvent(ev)), {
189
188
  value: eventValue
@@ -271,7 +270,7 @@ function useChat(options) {
271
270
  setMessages([...previousMessages, ...newMessages]);
272
271
  }
273
272
  }
274
- const finalMessages = constructFinalMessages(
273
+ let finalMessages = constructFinalMessages(
275
274
  [...syncedMessages, ...interruptMessages],
276
275
  previousMessages,
277
276
  newMessages
@@ -281,7 +280,7 @@ function useChat(options) {
281
280
  const lastMessages = [];
282
281
  for (let i = finalMessages.length - 1; i >= 0; i--) {
283
282
  const message = finalMessages[i];
284
- if (message.isActionExecutionMessage() && message.status.code !== MessageStatusCode.Pending) {
283
+ if ((message.isActionExecutionMessage() || message.isResultMessage()) && message.status.code !== MessageStatusCode.Pending) {
285
284
  lastMessages.unshift(message);
286
285
  } else {
287
286
  break;
@@ -289,59 +288,51 @@ function useChat(options) {
289
288
  }
290
289
  for (const message of lastMessages) {
291
290
  setMessages(finalMessages);
292
- const action = actions.find((action2) => action2.name === message.name);
293
- if (action) {
294
- followUp = action.followUp;
295
- let result;
296
- let error = null;
297
- try {
298
- result = yield Promise.race([
299
- onFunctionCall({
300
- messages: previousMessages,
301
- name: message.name,
302
- args: message.arguments
303
- }),
304
- new Promise(
305
- (resolve) => {
306
- var _a2;
307
- return (_a2 = chatAbortControllerRef.current) == null ? void 0 : _a2.signal.addEventListener(
308
- "abort",
309
- () => resolve("Operation was aborted by the user")
310
- );
311
- }
312
- ),
313
- // if the user stopped generation, we also abort consecutive actions
314
- new Promise((resolve) => {
315
- var _a2;
316
- if ((_a2 = chatAbortControllerRef.current) == null ? void 0 : _a2.signal.aborted) {
317
- resolve("Operation was aborted by the user");
318
- }
319
- })
320
- ]);
321
- } catch (e) {
322
- error = e;
323
- addErrorToast([error]);
324
- result = `Failed to execute action ${message.name}. ${error.message}`;
325
- console.error(`Failed to execute action ${message.name}: ${error}`);
326
- }
291
+ const action = actions.find(
292
+ (action2) => action2.name === message.name
293
+ );
294
+ const currentResultMessagePairedFeAction = message.isResultMessage() ? getPairedFeAction(actions, message) : null;
295
+ const executeActionFromMessage = (action2, message2) => __async(this, null, function* () {
296
+ followUp = action2 == null ? void 0 : action2.followUp;
297
+ const resultMessage = yield executeAction({
298
+ onFunctionCall,
299
+ previousMessages,
300
+ message: message2,
301
+ chatAbortControllerRef,
302
+ onError: (error) => {
303
+ addErrorToast([error]);
304
+ console.error(`Failed to execute action ${message2.name}: ${error}`);
305
+ }
306
+ });
327
307
  didExecuteAction = true;
328
- const messageIndex = finalMessages.findIndex((msg) => msg.id === message.id);
329
- finalMessages.splice(
330
- messageIndex + 1,
331
- 0,
332
- new ResultMessage({
333
- id: "result-" + message.id,
334
- result: ResultMessage.encodeResult(
335
- error ? {
336
- content: result,
337
- error: JSON.parse(
338
- JSON.stringify(error, Object.getOwnPropertyNames(error))
339
- )
340
- } : result
341
- ),
342
- actionExecutionId: message.id,
343
- actionName: message.name
344
- })
308
+ const messageIndex = finalMessages.findIndex((msg) => msg.id === message2.id);
309
+ finalMessages.splice(messageIndex + 1, 0, resultMessage);
310
+ return resultMessage;
311
+ });
312
+ if (action && message.isActionExecutionMessage()) {
313
+ const resultMessage = yield executeActionFromMessage(action, message);
314
+ const pairedFeAction = getPairedFeAction(actions, resultMessage);
315
+ if (pairedFeAction) {
316
+ const newExecutionMessage = new ActionExecutionMessage({
317
+ name: pairedFeAction.name,
318
+ arguments: parseJson(resultMessage.result, resultMessage.result),
319
+ status: message.status,
320
+ createdAt: message.createdAt,
321
+ parentMessageId: message.parentMessageId
322
+ });
323
+ yield executeActionFromMessage(pairedFeAction, newExecutionMessage);
324
+ }
325
+ } else if (message.isResultMessage() && currentResultMessagePairedFeAction) {
326
+ const newExecutionMessage = new ActionExecutionMessage({
327
+ name: currentResultMessagePairedFeAction.name,
328
+ arguments: parseJson(message.result, message.result),
329
+ status: message.status,
330
+ createdAt: message.createdAt
331
+ });
332
+ finalMessages.push(newExecutionMessage);
333
+ yield executeActionFromMessage(
334
+ currentResultMessagePairedFeAction,
335
+ newExecutionMessage
345
336
  );
346
337
  }
347
338
  }
@@ -488,8 +479,69 @@ function constructFinalMessages(syncedMessages, previousMessages, newMessages) {
488
479
  }
489
480
  return finalMessages;
490
481
  }
482
+ function executeAction(_0) {
483
+ return __async(this, arguments, function* ({
484
+ onFunctionCall,
485
+ previousMessages,
486
+ message,
487
+ chatAbortControllerRef,
488
+ onError
489
+ }) {
490
+ let result;
491
+ let error = null;
492
+ try {
493
+ result = yield Promise.race([
494
+ onFunctionCall({
495
+ messages: previousMessages,
496
+ name: message.name,
497
+ args: message.arguments
498
+ }),
499
+ new Promise(
500
+ (resolve) => {
501
+ var _a;
502
+ return (_a = chatAbortControllerRef.current) == null ? void 0 : _a.signal.addEventListener(
503
+ "abort",
504
+ () => resolve("Operation was aborted by the user")
505
+ );
506
+ }
507
+ ),
508
+ // if the user stopped generation, we also abort consecutive actions
509
+ new Promise((resolve) => {
510
+ var _a;
511
+ if ((_a = chatAbortControllerRef.current) == null ? void 0 : _a.signal.aborted) {
512
+ resolve("Operation was aborted by the user");
513
+ }
514
+ })
515
+ ]);
516
+ } catch (e) {
517
+ onError(e);
518
+ }
519
+ return new ResultMessage({
520
+ id: "result-" + message.id,
521
+ result: ResultMessage.encodeResult(
522
+ error ? {
523
+ content: result,
524
+ error: JSON.parse(JSON.stringify(error, Object.getOwnPropertyNames(error)))
525
+ } : result
526
+ ),
527
+ actionExecutionId: message.id,
528
+ actionName: message.name
529
+ });
530
+ });
531
+ }
532
+ function getPairedFeAction(actions, message) {
533
+ let actionName = null;
534
+ if (message.isActionExecutionMessage()) {
535
+ actionName = message.name;
536
+ } else if (message.isResultMessage()) {
537
+ actionName = message.actionName;
538
+ }
539
+ return actions.find(
540
+ (action) => action.name === actionName && action.available === "frontend" || action.pairedAction === actionName
541
+ );
542
+ }
491
543
 
492
544
  export {
493
545
  useChat
494
546
  };
495
- //# sourceMappingURL=chunk-2DPTBHGN.mjs.map
547
+ //# sourceMappingURL=chunk-FUO5LKSJ.mjs.map