@easynet/agent-tool 1.0.45 → 1.0.47

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 (40) hide show
  1. package/README.md +31 -105
  2. package/dist/api/extension/groupPrefix.d.ts.map +1 -1
  3. package/dist/api/main.cjs +19 -20
  4. package/dist/api/main.js +2 -3
  5. package/dist/api/runtimeFromConfig.d.ts.map +1 -1
  6. package/dist/{chunk-JH6TWGP4.js → chunk-2ZPDD7ZO.js} +722 -279
  7. package/dist/chunk-2ZPDD7ZO.js.map +1 -0
  8. package/dist/{chunk-ONXFQ6K5.js → chunk-64ZQQV5C.js} +79 -75
  9. package/dist/chunk-64ZQQV5C.js.map +1 -0
  10. package/dist/{chunk-YVL3UMM2.cjs → chunk-A5B6Q6EG.cjs} +733 -317
  11. package/dist/chunk-A5B6Q6EG.cjs.map +1 -0
  12. package/dist/{chunk-5WY557HJ.cjs → chunk-IAEVDXWS.cjs} +15 -16
  13. package/dist/chunk-IAEVDXWS.cjs.map +1 -0
  14. package/dist/{chunk-YUA6KJWF.js → chunk-KYBIKD5R.js} +5 -5
  15. package/dist/chunk-KYBIKD5R.js.map +1 -0
  16. package/dist/{chunk-ETXVT6FE.cjs → chunk-MDPU7EIO.cjs} +83 -87
  17. package/dist/chunk-MDPU7EIO.cjs.map +1 -0
  18. package/dist/index.cjs +195 -413
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.d.ts +16 -63
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +171 -281
  23. package/dist/index.js.map +1 -1
  24. package/dist/utils/cli/index.cjs +16 -17
  25. package/dist/utils/cli/index.cjs.map +1 -1
  26. package/dist/utils/cli/index.js +3 -4
  27. package/dist/utils/cli/index.js.map +1 -1
  28. package/dist/utils/npmCache.d.ts +1 -1
  29. package/dist/utils/npmCache.d.ts.map +1 -1
  30. package/package.json +1 -1
  31. package/dist/chunk-5WY557HJ.cjs.map +0 -1
  32. package/dist/chunk-CLJCCBXA.js +0 -474
  33. package/dist/chunk-CLJCCBXA.js.map +0 -1
  34. package/dist/chunk-ETXVT6FE.cjs.map +0 -1
  35. package/dist/chunk-H5SPD2O7.cjs +0 -480
  36. package/dist/chunk-H5SPD2O7.cjs.map +0 -1
  37. package/dist/chunk-JH6TWGP4.js.map +0 -1
  38. package/dist/chunk-ONXFQ6K5.js.map +0 -1
  39. package/dist/chunk-YUA6KJWF.js.map +0 -1
  40. package/dist/chunk-YVL3UMM2.cjs.map +0 -1
package/README.md CHANGED
@@ -1,127 +1,53 @@
1
1
  # @easynet/agent-tool
2
2
 
3
- Agent tool runtime: unified registration, policy, budget, and observability. Multiple tool sources; expose as LangChain tools, MCP service, or OpenAPI HTTP.
3
+ 工具运行时包。最小目标:从 `tool.yaml` 生成可给 LangChain 使用的 tools
4
4
 
5
- ## Capabilities
5
+ ## 最小接口
6
6
 
7
- | Category | Name | Description |
8
- |----------|------|-------------|
9
- | **Tool sources** | `@tool` functions | Annotated tool functions in TS/JS |
10
- | | SKILL | Skills described in SKILL.md |
11
- | | n8n workflows | Workflow nodes as tools |
12
- | | MCP service | Remote tools via MCP protocol |
13
- | | LangChain directory | LangChain-format tool directory |
14
- | **Runtime** | PTCRuntime | Tool invocation execution |
15
- | | Policy engine | Pre-execution policy checks |
16
- | | Schema validation | Input/output validation |
17
- | | Budget | Call quotas and limits |
18
- | | Retry | Automatic retry for retryable errors |
19
- | | Evidence | Call logging and audit |
20
- | **Exposure** | LangChain tools | For createReactAgent / AgentExecutor |
21
- | | MCP service (stdio) | For Cursor / Claude etc. MCP clients |
22
- | | MCP service (Streamable HTTP) | HTTP + SSE, MCP Streamable HTTP (stateless) |
23
- | | OpenAPI HTTP (GET /tools, POST /invoke) | REST API for any HTTP client |
24
-
25
- ## Install
26
-
27
- ```bash
28
- npm i @easynet/agent-tool
29
- ```
30
-
31
- ## Usage
32
-
33
- ### 1. CLI
34
-
35
- ```bash
36
- # List tools from current project config
37
- npx agent-tool ls
38
-
39
- # Show tool details
40
- npx agent-tool describe <scope/name>
41
-
42
- # Run a tool locally
43
- npx agent-tool run <scope/name> '<{"key":"value"}>'
7
+ ```ts
8
+ import { createAgentTools } from "@easynet/agent-tool/api";
44
9
 
45
- # MCP standalone package: init build → serve
46
- npx agent-tool init
47
- npx agent-tool build --path . --out dist
48
- npx agent-tool serve --path dist
10
+ const tools = createAgentTools({ configFilePath: "./tool.yaml", coreTools: {} });
11
+ console.log(tools.map((t) => t.name));
49
12
  ```
50
13
 
51
- ### 2. Configure tool.yaml
52
-
53
- Place `tool.yaml` at project root to list tools (used by `createAgentTools` and `agent-tool ls`). You can set **sandbox** and **HTTP host security** under `tools`. Host rule: allow iff (host in `allowedHosts`) AND (host not in `blockedHosts`). Lists are merged with programmatic config (union).
54
-
55
- **When nothing is set** (no allowedHosts/blockedHosts/sandboxedPath in tool.yaml and no `coreTools` passed in code), it is equivalent to: `allowedHosts: []`, `blockedHosts: []`, `sandboxRoot: process.cwd()`. That means **no HTTP access is allowed** (all HTTP tools will error), and FS tools use the current directory as sandbox. To enable HTTP tools, configure `allowedHosts` (e.g. `["*"]` or specific hostnames).
14
+ ## 最小 `tool.yaml`
56
15
 
57
16
  ```yaml
58
17
  tools:
59
- sandboxedPath: ~/.agent/sandbox # fs tools only access this dir
60
- allowedHosts: ["*"] # allow all; or ["api.github.com", "api.duckduckgo.com"]
61
- blockedHosts: [] # optional; block these even if allowed (e.g. ["*.internal"])
62
- blockedCidrs: [] # optional; CIDR blocklist for resolved IPs
63
- list:
64
- - npm:@easynet/agent-tool-builtin#fs.readText
65
- - npm:@easynet/agent-tool-builtin#fs.writeText
66
- # ...
67
- ```
18
+ # FS 工具沙箱根目录(相对路径按当前项目解析)
19
+ sandboxedPath: .
68
20
 
69
- ### 3. Programmatic: LangChain tools
21
+ # HTTP 允许列表。先给空数组,表示默认禁用外网请求(更安全)
22
+ allowedHosts: []
23
+ blockedHosts: []
70
24
 
71
- ```ts
72
- import { createAgentTools } from "@easynet/agent-tool/api";
73
-
74
- const tools = createAgentTools({ configFilePath: "tool.yaml", coreTools: {} });
75
- // Use with createReactAgent / AgentExecutor
76
- ```
77
-
78
- ### 4. Programmatic: MCP service (stdio)
79
-
80
- ```ts
81
- import { createMCPServer, createRuntimeFromConfigSync } from "@easynet/agent-tool/api";
82
-
83
- const { runtime } = createRuntimeFromConfigSync({ coreTools: {} });
84
- const server = createMCPServer(runtime);
85
- // runMCPServerOverStdio(server) or attach to stdio
25
+ # 最小起步:直接加载内置工具包(全部工具)
26
+ list:
27
+ - npm:@easynet/agent-tool-buildin
86
28
  ```
87
29
 
88
- ### 5. Programmatic: MCP service (Streamable HTTP)
30
+ ## 最简单示例(带注释)
89
31
 
90
32
  ```ts
91
- import { createMCPStreamableHttpHandler, createMCPServerStreamableHttp, createRuntimeFromConfigSync } from "@easynet/agent-tool/api";
92
-
93
- const { runtime } = createRuntimeFromConfigSync({ coreTools: {} });
94
-
95
- // Option A: handler only, mount on your HTTP server (use express.json() for body)
96
- const handler = createMCPStreamableHttpHandler(runtime);
97
- // app.use(express.json()); app.post("/mcp", handler);
33
+ import { createAgentTools } from "@easynet/agent-tool/api";
98
34
 
99
- // Option B: get Express app and start
100
- const { app, path, listen } = await createMCPServerStreamableHttp(runtime, { path: "/mcp", port: 3000 });
101
- const { url } = await listen(3000);
102
- // Client: POST http://127.0.0.1:3000/mcp (MCP Streamable HTTP: SSE + direct response)
103
- ```
35
+ async function main() {
36
+ // 1) tool.yaml 创建 LangChain tools
37
+ const tools = createAgentTools({
38
+ configFilePath: "./tool.yaml",
39
+ coreTools: {},
40
+ });
104
41
 
105
- ### 6. Programmatic: OpenAPI HTTP
42
+ // 2) 打印工具名,确认加载成功
43
+ console.log("loaded tools:", tools.map((t) => t.name));
44
+ }
106
45
 
107
- ```ts
108
- import { createOpenAPIServer, createRuntimeFromConfigSync } from "@easynet/agent-tool/api";
109
-
110
- const { runtime } = createRuntimeFromConfigSync({ coreTools: {} });
111
- const { app } = createOpenAPIServer(runtime, { basePath: "/api" });
112
- // Express-compatible app: GET /api/tools, POST /api/invoke
46
+ main().catch(console.error);
113
47
  ```
114
48
 
115
- ## Entrypoints
116
-
117
- | Entry | Purpose |
118
- |-------|---------|
119
- | `@easynet/agent-tool` | Core types, Runtime, Registry, discovery, MCP client, extensions |
120
- | `@easynet/agent-tool/api` | createAgentTools, createMCPServer, createMCPStreamableHttpHandler, createMCPServerStreamableHttp, createOpenAPIServer, createRuntimeFromConfig |
121
- | `@easynet/agent-tool/core` | PTCRuntime, PolicyEngine, SchemaValidator, ToolSpec, etc. |
122
- | `@easynet/agent-tool/runtime` | Same as core runtime subpath |
123
-
124
- ## Requirements
49
+ ## 进阶能力
125
50
 
126
- - Node.js >= 18
127
- - For LangChain: install `langchain`, `@langchain/core`, `zod`. For MCP: install `@modelcontextprotocol/sdk` (see package peerDependencies).
51
+ - MCP 服务:`createMCPServer(...)`
52
+ - OpenAPI HTTP:`createOpenAPIServer(...)`
53
+ - 扩展开发:`createExtension(...)`、`generateManifest(...)`
@@ -1 +1 @@
1
- {"version":3,"file":"groupPrefix.d.ts","sourceRoot":"","sources":["../../../src/api/extension/groupPrefix.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,oEAAoE;IACpE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,mFAAmF;IACnF,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,kBAAkB,GAAG,wBAAwB,CAS1F"}
1
+ {"version":3,"file":"groupPrefix.d.ts","sourceRoot":"","sources":["../../../src/api/extension/groupPrefix.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,oEAAoE;IACpE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,mFAAmF;IACnF,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,kBAAkB,GAAG,wBAAwB,CAW1F"}
package/dist/api/main.cjs CHANGED
@@ -1,8 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var chunk5WY557HJ_cjs = require('../chunk-5WY557HJ.cjs');
4
- var chunkH5SPD2O7_cjs = require('../chunk-H5SPD2O7.cjs');
5
- var chunkYVL3UMM2_cjs = require('../chunk-YVL3UMM2.cjs');
3
+ var chunkIAEVDXWS_cjs = require('../chunk-IAEVDXWS.cjs');
4
+ var chunkA5B6Q6EG_cjs = require('../chunk-A5B6Q6EG.cjs');
6
5
  require('../chunk-TOSPHMYU.cjs');
7
6
  require('../chunk-DYDNPIV2.cjs');
8
7
  require('../chunk-UUNG3GL3.cjs');
@@ -11,47 +10,47 @@ require('../chunk-UUNG3GL3.cjs');
11
10
 
12
11
  Object.defineProperty(exports, "createAgentTools", {
13
12
  enumerable: true,
14
- get: function () { return chunk5WY557HJ_cjs.createAgentTools; }
13
+ get: function () { return chunkIAEVDXWS_cjs.createAgentTools; }
15
14
  });
16
15
  Object.defineProperty(exports, "createLangChainToolsAsync", {
17
16
  enumerable: true,
18
- get: function () { return chunk5WY557HJ_cjs.createLangChainToolsAsync; }
17
+ get: function () { return chunkIAEVDXWS_cjs.createLangChainToolsAsync; }
18
+ });
19
+ Object.defineProperty(exports, "PTCRuntime", {
20
+ enumerable: true,
21
+ get: function () { return chunkA5B6Q6EG_cjs.PTCRuntime; }
19
22
  });
20
23
  Object.defineProperty(exports, "createHttpService", {
21
24
  enumerable: true,
22
- get: function () { return chunkH5SPD2O7_cjs.createHttpService; }
25
+ get: function () { return chunkA5B6Q6EG_cjs.createHttpService; }
23
26
  });
24
27
  Object.defineProperty(exports, "createMCPServer", {
25
28
  enumerable: true,
26
- get: function () { return chunkH5SPD2O7_cjs.createMCPServer; }
29
+ get: function () { return chunkA5B6Q6EG_cjs.createMCPServer; }
27
30
  });
28
31
  Object.defineProperty(exports, "createMCPServerStreamableHttp", {
29
32
  enumerable: true,
30
- get: function () { return chunkH5SPD2O7_cjs.createMCPServerStreamableHttp; }
33
+ get: function () { return chunkA5B6Q6EG_cjs.createMCPServerStreamableHttp; }
31
34
  });
32
35
  Object.defineProperty(exports, "createMCPStreamableHttpHandler", {
33
36
  enumerable: true,
34
- get: function () { return chunkH5SPD2O7_cjs.createMCPStreamableHttpHandler; }
37
+ get: function () { return chunkA5B6Q6EG_cjs.createMCPStreamableHttpHandler; }
35
38
  });
36
39
  Object.defineProperty(exports, "createOpenAPIServer", {
37
40
  enumerable: true,
38
- get: function () { return chunkH5SPD2O7_cjs.createHttpService; }
39
- });
40
- Object.defineProperty(exports, "runMCPServerOverStdio", {
41
- enumerable: true,
42
- get: function () { return chunkH5SPD2O7_cjs.runMCPServerOverStdio; }
43
- });
44
- Object.defineProperty(exports, "PTCRuntime", {
45
- enumerable: true,
46
- get: function () { return chunkYVL3UMM2_cjs.PTCRuntime; }
41
+ get: function () { return chunkA5B6Q6EG_cjs.createHttpService; }
47
42
  });
48
43
  Object.defineProperty(exports, "createRuntimeFromConfig", {
49
44
  enumerable: true,
50
- get: function () { return chunkYVL3UMM2_cjs.createRuntimeFromConfig; }
45
+ get: function () { return chunkA5B6Q6EG_cjs.createRuntimeFromConfig; }
51
46
  });
52
47
  Object.defineProperty(exports, "createRuntimeFromConfigSync", {
53
48
  enumerable: true,
54
- get: function () { return chunkYVL3UMM2_cjs.createRuntimeFromConfigSync; }
49
+ get: function () { return chunkA5B6Q6EG_cjs.createRuntimeFromConfigSync; }
50
+ });
51
+ Object.defineProperty(exports, "runMCPServerOverStdio", {
52
+ enumerable: true,
53
+ get: function () { return chunkA5B6Q6EG_cjs.runMCPServerOverStdio; }
55
54
  });
56
55
  //# sourceMappingURL=main.cjs.map
57
56
  //# sourceMappingURL=main.cjs.map
package/dist/api/main.js CHANGED
@@ -1,6 +1,5 @@
1
- export { createAgentTools, createLangChainToolsAsync } from '../chunk-YUA6KJWF.js';
2
- export { createHttpService, createMCPServer, createMCPServerStreamableHttp, createMCPStreamableHttpHandler, createHttpService as createOpenAPIServer, runMCPServerOverStdio } from '../chunk-CLJCCBXA.js';
3
- export { PTCRuntime, createRuntimeFromConfig, createRuntimeFromConfigSync } from '../chunk-JH6TWGP4.js';
1
+ export { createAgentTools, createLangChainToolsAsync } from '../chunk-KYBIKD5R.js';
2
+ export { PTCRuntime, createHttpService, createMCPServer, createMCPServerStreamableHttp, createMCPStreamableHttpHandler, createHttpService as createOpenAPIServer, createRuntimeFromConfig, createRuntimeFromConfigSync, runMCPServerOverStdio } from '../chunk-2ZPDD7ZO.js';
4
3
  import '../chunk-ZRHPGW7W.js';
5
4
  import '../chunk-KDB3MY2H.js';
6
5
  import '../chunk-NTWOVFEY.js';
@@ -1 +1 @@
1
- {"version":3,"file":"runtimeFromConfig.d.ts","sourceRoot":"","sources":["../../src/api/runtimeFromConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AA0B3D;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,EAAE,MAAM,EAAO,CAAC;AAEvD,gEAAgE;AAChE,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wFAAwF;IACxF,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,8PAA8P;IAC9P,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,qKAAqK;IACrK,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,mFAAmF;IACnF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,uDAAuD;AACvD,MAAM,WAAW,sBAAsB;IACrC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,iFAAiF;IACjF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,oEAAoE;IACpE,YAAY,CAAC,EAAE,sBAAsB,CAAC;IACtC,yEAAyE;IACzE,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,UAAU,CAAC;IACpB,QAAQ,EAAE,YAAY,CAAC;CACxB;AAqFD,qKAAqK;AACrK,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQjG;AAiMD;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,oBAAyB,GAAG,mBAAmB,CA2CnG;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,mBAAmB,CAAC,CAoB9B"}
1
+ {"version":3,"file":"runtimeFromConfig.d.ts","sourceRoot":"","sources":["../../src/api/runtimeFromConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AA0B3D;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,EAAE,MAAM,EAAO,CAAC;AAEvD,gEAAgE;AAChE,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wFAAwF;IACxF,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,8PAA8P;IAC9P,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,qKAAqK;IACrK,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,mFAAmF;IACnF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,uDAAuD;AACvD,MAAM,WAAW,sBAAsB;IACrC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,iFAAiF;IACjF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,oEAAoE;IACpE,YAAY,CAAC,EAAE,sBAAsB,CAAC;IACtC,yEAAyE;IACzE,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,UAAU,CAAC;IACpB,QAAQ,EAAE,YAAY,CAAC;CACxB;AAqFD,qKAAqK;AACrK,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQjG;AAkMD;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,oBAAyB,GAAG,mBAAmB,CA2CnG;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,mBAAmB,CAAC,CAoB9B"}