@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.
- package/CHANGELOG.md +77 -0
- package/dist/{chunk-XERJQUHA.mjs → chunk-4CEQJ2X6.mjs} +2 -2
- package/dist/{chunk-XERJQUHA.mjs.map → chunk-4CEQJ2X6.mjs.map} +1 -1
- package/dist/{chunk-VMYLY5KI.mjs → chunk-4EC4JK7H.mjs} +58 -48
- package/dist/chunk-4EC4JK7H.mjs.map +1 -0
- package/dist/{chunk-ZAU4EMBM.mjs → chunk-F7O6L7C3.mjs} +4 -5
- package/dist/chunk-F7O6L7C3.mjs.map +1 -0
- package/dist/{chunk-2DPTBHGN.mjs → chunk-FUO5LKSJ.mjs} +115 -63
- package/dist/chunk-FUO5LKSJ.mjs.map +1 -0
- package/dist/{chunk-4ED56DQX.mjs → chunk-HBCP2KNA.mjs} +3 -4
- package/dist/chunk-HBCP2KNA.mjs.map +1 -0
- package/dist/{chunk-Z3U4UBG2.mjs → chunk-T4CAQC6B.mjs} +2 -2
- package/dist/{chunk-JFCNSGNU.mjs → chunk-Y2T56VSE.mjs} +2 -2
- package/dist/components/copilot-provider/copilotkit-props.d.ts +1 -2
- package/dist/components/copilot-provider/copilotkit.d.ts +1 -2
- package/dist/components/copilot-provider/index.d.ts +1 -2
- package/dist/components/index.d.ts +1 -2
- package/dist/context/copilot-context.d.ts +10 -148
- package/dist/context/index.d.ts +1 -2
- package/dist/copilot-context-9ae8990b.d.ts +183 -0
- package/dist/hooks/index.d.ts +1 -2
- package/dist/hooks/index.js +180 -123
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/index.mjs +6 -6
- package/dist/hooks/use-chat.d.ts +1 -2
- package/dist/hooks/use-chat.js +113 -64
- package/dist/hooks/use-chat.js.map +1 -1
- package/dist/hooks/use-chat.mjs +2 -2
- package/dist/hooks/use-coagent.d.ts +1 -2
- package/dist/hooks/use-coagent.js +171 -112
- package/dist/hooks/use-coagent.js.map +1 -1
- package/dist/hooks/use-coagent.mjs +4 -4
- package/dist/hooks/use-copilot-chat.d.ts +1 -2
- package/dist/hooks/use-copilot-chat.js +116 -67
- package/dist/hooks/use-copilot-chat.js.map +1 -1
- package/dist/hooks/use-copilot-chat.mjs +3 -3
- package/dist/hooks/use-langgraph-interrupt-render.js +3 -4
- package/dist/hooks/use-langgraph-interrupt-render.js.map +1 -1
- package/dist/hooks/use-langgraph-interrupt-render.mjs +1 -1
- package/dist/hooks/use-langgraph-interrupt.d.ts +9 -2
- package/dist/hooks/use-langgraph-interrupt.js +117 -69
- package/dist/hooks/use-langgraph-interrupt.js.map +1 -1
- package/dist/hooks/use-langgraph-interrupt.mjs +4 -4
- package/dist/index.d.ts +1 -2
- package/dist/index.js +187 -130
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7 -7
- package/dist/lib/copilot-task.d.ts +1 -2
- package/dist/lib/copilot-task.js +1 -1
- package/dist/lib/copilot-task.js.map +1 -1
- package/dist/lib/copilot-task.mjs +2 -2
- package/dist/lib/index.d.ts +1 -2
- package/dist/lib/index.js +1 -1
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/index.mjs +2 -2
- package/dist/types/frontend-action.d.ts +2 -1
- package/dist/types/frontend-action.js +1 -1
- package/dist/types/frontend-action.js.map +1 -1
- package/dist/types/frontend-action.mjs +1 -1
- package/dist/types/interrupt-action.d.ts +10 -35
- package/dist/types/interrupt-action.js.map +1 -1
- package/dist/utils/extract.d.ts +1 -2
- package/dist/utils/index.d.ts +1 -2
- package/package.json +3 -3
- package/src/hooks/use-chat.ts +134 -61
- package/src/hooks/use-coagent.ts +70 -56
- package/src/hooks/use-langgraph-interrupt-render.ts +7 -3
- package/src/hooks/use-langgraph-interrupt.ts +1 -2
- package/src/types/frontend-action.ts +5 -2
- package/src/types/interrupt-action.ts +16 -12
- package/dist/chunk-2DPTBHGN.mjs.map +0 -1
- package/dist/chunk-4ED56DQX.mjs.map +0 -1
- package/dist/chunk-VMYLY5KI.mjs.map +0 -1
- package/dist/chunk-ZAU4EMBM.mjs.map +0 -1
- /package/dist/{chunk-Z3U4UBG2.mjs.map → chunk-T4CAQC6B.mjs.map} +0 -0
- /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-
|
|
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;
|
|
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-
|
|
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 = (
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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 =
|
|
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
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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-
|
|
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":"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","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,
|
|
26
|
-
const conditionsMet =
|
|
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-
|
|
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-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
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 ===
|
|
329
|
-
finalMessages.splice(
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
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-
|
|
547
|
+
//# sourceMappingURL=chunk-FUO5LKSJ.mjs.map
|