@easynet/agent-tool 1.0.34 → 1.0.36

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 (60) hide show
  1. package/dist/api/adapters/LangChainToolsHub.d.ts.map +1 -1
  2. package/dist/api/createAgentTools.d.ts.map +1 -1
  3. package/dist/api/expose/extension-init/index.d.ts +3 -0
  4. package/dist/api/expose/extension-init/index.d.ts.map +1 -0
  5. package/dist/api/expose/extension-init/initExtension.d.ts +19 -0
  6. package/dist/api/expose/extension-init/initExtension.d.ts.map +1 -0
  7. package/dist/api/extension/dynamicImportAdapter.d.ts +6 -2
  8. package/dist/api/extension/dynamicImportAdapter.d.ts.map +1 -1
  9. package/dist/api/extension/generateExtensionManifest.d.ts +2 -2
  10. package/dist/api/extension/generateExtensionManifest.d.ts.map +1 -1
  11. package/dist/api/extension/index.d.ts +1 -0
  12. package/dist/api/extension/index.d.ts.map +1 -1
  13. package/dist/api/extension/loadToolYaml.d.ts +1 -0
  14. package/dist/api/extension/loadToolYaml.d.ts.map +1 -1
  15. package/dist/api/extension/overrideWithConfig.d.ts +6 -0
  16. package/dist/api/extension/overrideWithConfig.d.ts.map +1 -0
  17. package/dist/api/extension/registerExtension.d.ts.map +1 -1
  18. package/dist/api/extension/registerFromManifest.d.ts.map +1 -1
  19. package/dist/api/main.cjs +14 -14
  20. package/dist/api/main.js +3 -3
  21. package/dist/api/runtimeFromConfig.d.ts +8 -0
  22. package/dist/api/runtimeFromConfig.d.ts.map +1 -1
  23. package/dist/{chunk-GYUELFVR.js → chunk-3L7CQ6XP.js} +3 -3
  24. package/dist/{chunk-GYUELFVR.js.map → chunk-3L7CQ6XP.js.map} +1 -1
  25. package/dist/{chunk-ETZKGTTF.cjs → chunk-5LCB63L7.cjs} +7 -7
  26. package/dist/{chunk-ETZKGTTF.cjs.map → chunk-5LCB63L7.cjs.map} +1 -1
  27. package/dist/{chunk-YP6GRCQG.cjs → chunk-6ZGMI6KW.cjs} +53 -16
  28. package/dist/chunk-6ZGMI6KW.cjs.map +1 -0
  29. package/dist/{chunk-UUQGKFSG.js → chunk-7VBJ64YC.js} +308 -141
  30. package/dist/chunk-7VBJ64YC.js.map +1 -0
  31. package/dist/{chunk-FHHD4FSI.js → chunk-HEMWFWSK.js} +3 -3
  32. package/dist/{chunk-FHHD4FSI.js.map → chunk-HEMWFWSK.js.map} +1 -1
  33. package/dist/{chunk-6UOHURU4.js → chunk-JG5T3ZYC.js} +42 -5
  34. package/dist/chunk-JG5T3ZYC.js.map +1 -0
  35. package/dist/{chunk-PKUSCCS6.cjs → chunk-LP7KHBA3.cjs} +310 -140
  36. package/dist/chunk-LP7KHBA3.cjs.map +1 -0
  37. package/dist/{chunk-LOGUQGCL.cjs → chunk-WFRHBW32.cjs} +9 -9
  38. package/dist/{chunk-LOGUQGCL.cjs.map → chunk-WFRHBW32.cjs.map} +1 -1
  39. package/dist/index.cjs +119 -69
  40. package/dist/index.cjs.map +1 -1
  41. package/dist/index.d.ts +2 -2
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +71 -26
  44. package/dist/index.js.map +1 -1
  45. package/dist/tools/util/toolConfig.d.ts +11 -3
  46. package/dist/tools/util/toolConfig.d.ts.map +1 -1
  47. package/dist/tools/util/toolDescriptor.d.ts +32 -7
  48. package/dist/tools/util/toolDescriptor.d.ts.map +1 -1
  49. package/dist/utils/cli/index.cjs +233 -31
  50. package/dist/utils/cli/index.cjs.map +1 -1
  51. package/dist/utils/cli/index.d.ts.map +1 -1
  52. package/dist/utils/cli/index.js +201 -15
  53. package/dist/utils/cli/index.js.map +1 -1
  54. package/dist/utils/npmCache.d.ts +14 -0
  55. package/dist/utils/npmCache.d.ts.map +1 -1
  56. package/package.json +1 -1
  57. package/dist/chunk-6UOHURU4.js.map +0 -1
  58. package/dist/chunk-PKUSCCS6.cjs.map +0 -1
  59. package/dist/chunk-UUQGKFSG.js.map +0 -1
  60. package/dist/chunk-YP6GRCQG.cjs.map +0 -1
@@ -1,19 +1,178 @@
1
1
  #!/usr/bin/env node
2
- import { initProject, buildMcpPackage, runMcpServer } from '../../chunk-FHHD4FSI.js';
3
- import { runMCPServerOverStdio, createMCPServerStreamableHttp, createHttpService } from '../../chunk-GYUELFVR.js';
4
- import { findAndLoadToolConfig, resolveToolDescriptor, resolveSandboxedPath, createRuntimeFromConfig, getDisplayScope } from '../../chunk-UUQGKFSG.js';
2
+ import { initProject, buildMcpPackage, runMcpServer } from '../../chunk-HEMWFWSK.js';
3
+ import { runMCPServerOverStdio, createMCPServerStreamableHttp, createHttpService } from '../../chunk-3L7CQ6XP.js';
4
+ import { findAndLoadToolConfig, resolveToolDescriptor, resolveSandboxedPath, createRuntimeFromConfig, getDisplayScope } from '../../chunk-7VBJ64YC.js';
5
5
  import '../../chunk-ZRHPGW7W.js';
6
6
  import { enrichSpecWithCanonicalSchema } from '../../chunk-3MUOBLNB.js';
7
7
  import '../../chunk-KDB3MY2H.js';
8
- import path from 'path';
8
+ import * as path2 from 'path';
9
+ import path2__default from 'path';
9
10
  import { realpathSync } from 'fs';
10
11
  import { fileURLToPath } from 'url';
12
+ import * as fs from 'fs/promises';
11
13
 
14
+ function toPackageName(name) {
15
+ return name.trim().toLowerCase().replace(/\s+/g, "-").replace(/[^a-z0-9-]/g, "");
16
+ }
17
+ function templates(packageName) {
18
+ return {
19
+ "package.json": `{
20
+ "name": "${packageName}",
21
+ "version": "0.0.1",
22
+ "description": "Tools extension for @easynet/agent-tool",
23
+ "type": "module",
24
+ "main": "./dist/index.js",
25
+ "module": "./dist/index.js",
26
+ "types": "./dist/index.d.ts",
27
+ "exports": {
28
+ ".": {
29
+ "types": "./dist/index.d.ts",
30
+ "import": "./dist/index.js",
31
+ "default": "./dist/index.js"
32
+ }
33
+ },
34
+ "files": ["dist"],
35
+ "scripts": {
36
+ "build": "tsx generate-manifest.ts && tsc -p tsconfig.build.json",
37
+ "clean": "rm -rf dist",
38
+ "pretest": "npm run build",
39
+ "test": "vitest run"
40
+ },
41
+ "peerDependencies": {
42
+ "@easynet/agent-tool": ">=1.0.31"
43
+ },
44
+ "devDependencies": {
45
+ "@easynet/agent-tool": "^1.0.34",
46
+ "tsx": "^4.19.2",
47
+ "typescript": "~5.7.2",
48
+ "vitest": "^2.1.8"
49
+ },
50
+ "license": "MIT"
51
+ }
52
+ `,
53
+ "tsconfig.json": `{
54
+ "compilerOptions": {
55
+ "target": "ES2022",
56
+ "module": "NodeNext",
57
+ "moduleResolution": "NodeNext",
58
+ "lib": ["ES2022"],
59
+ "strict": true,
60
+ "skipLibCheck": true,
61
+ "declaration": true,
62
+ "declarationMap": true,
63
+ "sourceMap": true,
64
+ "outDir": "./dist",
65
+ "rootDir": ".",
66
+ "resolveJsonModule": true,
67
+ "isolatedModules": true
68
+ },
69
+ "include": ["./**/*.ts"],
70
+ "exclude": ["node_modules", "dist", "**/dist/**"]
71
+ }
72
+ `,
73
+ "tsconfig.build.json": `{
74
+ "extends": "./tsconfig.json",
75
+ "compilerOptions": { "rootDir": ".", "outDir": "dist" },
76
+ "include": ["./**/*.ts"],
77
+ "exclude": ["node_modules", "dist", "**/dist/**", "**/tsconfig*.json", "**/*.test.ts", "test", "scripts", "generate-manifest.ts"]
78
+ }
79
+ `,
80
+ "generate-manifest.ts": `/**
81
+ * Build step: run framework generateManifest (scan src, emit manifest).
82
+ * Tool names in the manifest are the exported function names.
83
+ */
84
+ import { generateManifest } from "@easynet/agent-tool";
85
+
86
+ generateManifest(process.cwd());
87
+ `,
88
+ "index.ts": `import { createExtension } from "@easynet/agent-tool";
89
+ import type { ToolRegistry, ToolAdapter } from "@easynet/agent-tool";
90
+
91
+ const ext = createExtension({ importMeta: import.meta });
92
+
93
+ /** Framework contract: extension exports register(registry, options). */
94
+ export function register(
95
+ registry: ToolRegistry,
96
+ options?: { only?: string[]; namePrefixes?: string[] },
97
+ ): ToolAdapter {
98
+ return ext.register(registry, options ?? {});
99
+ }
100
+
101
+ export const getExtensionContext = ext.getContext;
102
+ export const runWithExtensionContext = ext.runWith;
103
+ `,
104
+ "src/helloWorld.ts": `/**
105
+ * A simple hello-world tool.
106
+ * @tool
107
+ * @effect none
108
+ */
109
+ export async function helloWorld(_args: Record<string, unknown>) {
110
+ return {
111
+ result: { message: "Hello, World!" },
112
+ evidence: [
113
+ {
114
+ type: "tool",
115
+ ref: "helloWorld",
116
+ summary: "Hello, World!",
117
+ createdAt: new Date().toISOString(),
118
+ },
119
+ ],
120
+ };
121
+ }
122
+ `,
123
+ "README.md": `# ${packageName}
124
+
125
+ Scaffolded by \`agent-tool init ${packageName}\`.
126
+
127
+ ## Quick start
128
+
129
+ \`\`\`bash
130
+ npm install
131
+ npm run build
132
+ \`\`\`
133
+
134
+ Add more tools under \`src/\` (export async functions with \`@tool\` JSDoc), then \`npm run build\` again.
135
+
136
+ ## Use in tool config
137
+
138
+ In your \`tool.yaml\` \`tools.packages\`:
139
+
140
+ \`\`\`yaml
141
+ tools:
142
+ packages:
143
+ file:./path/to/${packageName}: {}
144
+ \`\`\`
145
+
146
+ Or publish and use: \`npm:@your-scope/${packageName}\`
147
+ `
148
+ };
149
+ }
150
+ async function initExtension(options) {
151
+ const parent = path2.resolve(options.parentDir ?? process.cwd());
152
+ const name = options.extensionName.trim();
153
+ if (!name) {
154
+ throw new Error("Extension name is required");
155
+ }
156
+ const targetPath = path2.join(parent, name);
157
+ const packageName = toPackageName(name) || name.replace(/\s/g, "-").toLowerCase();
158
+ const filesCreated = [];
159
+ const tmpl = templates(packageName);
160
+ await fs.mkdir(targetPath, { recursive: true });
161
+ for (const [relPath, content] of Object.entries(tmpl)) {
162
+ const fullPath = path2.join(targetPath, relPath);
163
+ await fs.mkdir(path2.dirname(fullPath), { recursive: true });
164
+ await fs.writeFile(fullPath, content.trimStart(), "utf8");
165
+ filesCreated.push(relPath);
166
+ }
167
+ return { targetPath, filesCreated };
168
+ }
169
+
170
+ // src/utils/cli/index.ts
12
171
  ({
13
172
  sandboxRoot: process.cwd()});
14
173
  async function getRuntimeWithTools(pathOpt, verbose = false) {
15
174
  const cwd = process.cwd();
16
- const searchDir = path.resolve(cwd, pathOpt ?? ".");
175
+ const searchDir = path2__default.resolve(cwd, pathOpt ?? ".");
17
176
  const stepLog = verbose ? (msg) => process.stderr.write(`[agent-tool] ${msg}
18
177
  `) : void 0;
19
178
  if (stepLog) stepLog(`Loading tool config from ${searchDir}`);
@@ -52,6 +211,7 @@ function parseArgv(argv) {
52
211
  let verbose = false;
53
212
  let mcpStdio = false;
54
213
  let pathOpt = "";
214
+ let extensionName = "";
55
215
  let outDir = "";
56
216
  let include = [];
57
217
  let includeN8n = false;
@@ -81,9 +241,9 @@ function parseArgv(argv) {
81
241
  } else if (arg === "--stdio") {
82
242
  mcpStdio = true;
83
243
  } else if (arg === "--path" || arg === "-p") {
84
- pathOpt = path.resolve(process.cwd(), args[++i] ?? "");
244
+ pathOpt = path2__default.resolve(process.cwd(), args[++i] ?? "");
85
245
  } else if (arg === "--out" || arg === "-o") {
86
- outDir = path.resolve(process.cwd(), args[++i] ?? "");
246
+ outDir = path2__default.resolve(process.cwd(), args[++i] ?? "");
87
247
  } else if (arg === "--include" || arg === "-i") {
88
248
  const v = args[++i];
89
249
  if (v) include.push(v);
@@ -98,7 +258,9 @@ function parseArgv(argv) {
98
258
  } else if (arg && !arg.startsWith("-") && commands.includes(arg)) {
99
259
  command = arg;
100
260
  const nextArg = args[i + 1];
101
- if ((command === "show" || command === "describe") && nextArg !== void 0 && !nextArg.startsWith("-")) {
261
+ if (command === "init" && nextArg !== void 0 && !nextArg.startsWith("-")) {
262
+ extensionName = args[++i] ?? "";
263
+ } else if ((command === "show" || command === "describe") && nextArg !== void 0 && !nextArg.startsWith("-")) {
102
264
  toolName = args[++i] ?? "";
103
265
  } else if (command === "run" && nextArg !== void 0 && !nextArg.startsWith("-")) {
104
266
  toolName = args[++i] ?? "";
@@ -111,7 +273,7 @@ function parseArgv(argv) {
111
273
  }
112
274
  }
113
275
  }
114
- return { command, startSub, help, verbose, mcpStdio, pathOpt, outDir, include, includeN8n, toolName, toolArgsJson, port, host };
276
+ return { command, startSub, help, verbose, mcpStdio, pathOpt, extensionName, outDir, include, includeN8n, toolName, toolArgsJson, port, host };
115
277
  }
116
278
  function printHelp() {
117
279
  const bin = "agent-tool";
@@ -126,7 +288,7 @@ Primary commands:
126
288
  start http Start OpenAPI HTTP server (API + Swagger).
127
289
 
128
290
  Other commands:
129
- init Create project template. Then npm install && npm run build.
291
+ init [extension name] Create extension scaffold (folder + src + hello-world + generate-manifest + index + package.json). With no name: create MCP project in --path. Then: cd <folder> && npm install && npm run build.
130
292
  build Scan folder for @tool / SKILL / n8n, generate MCP npm package.
131
293
  serve Start the generated MCP server (stdio) for testing.
132
294
  list Alias for ls.
@@ -152,10 +314,31 @@ Examples:
152
314
  ${bin} start mcp --stdio
153
315
  ${bin} start http --port 3000
154
316
  ${bin} build --path . --out dist
317
+ ${bin} init my-extension
155
318
 
156
319
  For agent run (ReAct + agent.yaml): npx @easynet/agent-orchestra run "task" -c agent.yaml
157
320
  `);
158
321
  }
322
+ async function cmdInitExtension(extensionName, pathOpt) {
323
+ try {
324
+ const parentDir = pathOpt ? path2__default.resolve(process.cwd(), pathOpt) : void 0;
325
+ const { targetPath, filesCreated } = await initExtension({
326
+ extensionName,
327
+ parentDir: parentDir || process.cwd()
328
+ });
329
+ process.stdout.write(
330
+ `Extension scaffold at ${targetPath}
331
+ Created: ${filesCreated.join(", ")}
332
+ Next: cd ${path2__default.basename(targetPath)} && npm install && npm run build
333
+ `
334
+ );
335
+ return 0;
336
+ } catch (err) {
337
+ process.stderr.write(`Init extension failed: ${err instanceof Error ? err.message : String(err)}
338
+ `);
339
+ return 1;
340
+ }
341
+ }
159
342
  async function cmdInit(pathOpt) {
160
343
  try {
161
344
  const { targetPath, filesCreated } = await initProject({ targetPath: pathOpt || void 0 });
@@ -197,8 +380,8 @@ async function cmdServe(pathOpt) {
197
380
  child.stdin?.pipe(process.stdin);
198
381
  child.stdout?.pipe(process.stdout);
199
382
  process.stdin?.unref();
200
- const exit = new Promise((resolve) => {
201
- child.on("close", (code) => resolve(code ?? 0));
383
+ const exit = new Promise((resolve2) => {
384
+ child.on("close", (code) => resolve2(code ?? 0));
202
385
  });
203
386
  return exit;
204
387
  } catch (err) {
@@ -273,7 +456,7 @@ async function cmdLs(pathOpt, verbose = false) {
273
456
  if (specs.length === 0) {
274
457
  process.stdout.write("No tools registered.\n");
275
458
  const cwd = process.cwd();
276
- const searchDir = path.resolve(cwd, pathOpt ?? ".");
459
+ const searchDir = path2__default.resolve(cwd, pathOpt ?? ".");
277
460
  const config = findAndLoadToolConfig(searchDir);
278
461
  const hasNpmTools = Array.isArray(config.tools) && config.tools.some((t) => typeof t === "string" && t.startsWith("npm:"));
279
462
  if (hasNpmTools) {
@@ -412,12 +595,15 @@ async function cmdStartHttp(port, host, pathOpt, verbose = false) {
412
595
  }
413
596
  }
414
597
  async function main(argv = process.argv) {
415
- const { command, startSub, help, verbose, mcpStdio, pathOpt, outDir, include, includeN8n, toolName, toolArgsJson, port, host } = parseArgv(argv);
598
+ const { command, startSub, help, verbose, mcpStdio, pathOpt, extensionName, outDir, include, includeN8n, toolName, toolArgsJson, port, host } = parseArgv(argv);
416
599
  if (help || command === "help") {
417
600
  printHelp();
418
601
  return 0;
419
602
  }
420
- if (command === "init") return cmdInit(pathOpt);
603
+ if (command === "init") {
604
+ if (extensionName) return cmdInitExtension(extensionName, pathOpt);
605
+ return cmdInit(pathOpt);
606
+ }
421
607
  if (command === "build") return cmdBuild(pathOpt, outDir, include, includeN8n);
422
608
  if (command === "serve") return cmdServe(pathOpt);
423
609
  if (command === "ls" || command === "list") return cmdLs(pathOpt, verbose);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/cli/index.ts"],"names":[],"mappings":";;;;;;;;;;;CA0C4B;AAAA,EAC1B,WAAA,EAAa,QAAQ,GAAA,EAEvB;AAEA,eAAe,mBAAA,CAAoB,OAAA,EAAkB,OAAA,GAAU,KAAA,EAAwK;AACrO,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,WAAW,GAAG,CAAA;AAClD,EAAA,MAAM,OAAA,GAAU,UAAU,CAAC,GAAA,KAAgB,QAAQ,MAAA,CAAO,KAAA,CAAM,gBAAgB,GAAG;AAAA,CAAI,CAAA,GAAI,MAAA;AAC3F,EAAA,IAAI,OAAA,EAAS,OAAA,CAAQ,CAAA,yBAAA,EAA4B,SAAS,CAAA,CAAE,CAAA;AAC5D,EAAA,MAAM,MAAA,GAAS,sBAAsB,SAAS,CAAA;AAC9C,EAAA,IAAI,WAAA,GAAc,GAAA;AAClB,EAAA,IAAI,OAAO,aAAA,IAAiB,OAAO,OAAO,aAAA,KAAkB,QAAA,IAAY,OAAO,UAAA,EAAY;AACzF,IAAA,WAAA,GAAc,oBAAA,CAAqB,MAAA,CAAO,UAAA,EAAY,MAAA,CAAO,aAAa,CAAA;AAAA,EAC5E;AACA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,IAAI,OAAO,UAAA,EAAY;AACrB,MAAA,MAAM,CAAA,GAAI,MAAM,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,GAAI,MAAA,CAAO,MAAM,MAAA,GAAS,CAAA;AAC9D,MAAA,OAAA,CAAQ,WAAW,MAAA,CAAO,UAAU,KAAK,CAAC,CAAA,oBAAA,EAAuB,WAAW,CAAA,CAAE,CAAA;AAAA,IAChF,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,oBAAoB,CAAA;AAAA,IAC9B;AAAA,EACF;AACA,EAAA,MAAM,UAAA,GAAa,EAAE,WAAA,EAAa,YAAA,EAAc,EAAC,EAAc;AAC/D,EAAA,MAAM,MAAA,GAAS,MAAM,uBAAA,CAAwB;AAAA,IAC3C,SAAA,EAAW,UAAA;AAAA,IACX,gBAAgB,MAAA,CAAO,UAAA;AAAA,IACvB;AAAA,GACD,CAAA;AACD,EAAA,IAAI,OAAA,UAAiB,CAAA,WAAA,EAAc,MAAA,CAAO,SAAS,QAAA,EAAS,CAAE,MAAM,CAAA,QAAA,CAAU,CAAA;AAC9E,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,cAAc,QAAA,EAAmD;AACxE,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,OAAA,CAAQ,GAAG,CAAA;AAC9B,EAAA,IAAI,IAAI,CAAA,EAAG,OAAO,EAAE,KAAA,EAAO,EAAA,EAAI,MAAM,QAAA,EAAS;AAC9C,EAAA,OAAO,EAAE,KAAA,EAAO,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAG,IAAA,EAAM,QAAA,CAAS,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,EAAE;AACpE;AAEA,SAAS,UAAU,IAAA,EAAyB;AAC1C,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACzB,EAAA,IAAI,OAAA,GAAsB,MAAA;AAC1B,EAAA,IAAI,QAAA,GAA4B,MAAA;AAChC,EAAA,IAAI,IAAA,GAAO,KAAA;AACX,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,OAAA,GAAU,EAAA;AACd,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,IAAI,UAAoB,EAAC;AACzB,EAAA,IAAI,UAAA,GAAa,KAAA;AACjB,EAAA,IAAI,QAAA,GAAW,EAAA;AACf,EAAA,IAAI,YAAA,GAAe,IAAA;AACnB,EAAA,IAAI,IAAA,GAAO,GAAA;AACX,EAAA,IAAI,IAAA,GAAO,WAAA;AAEX,EAAA,MAAM,QAAA,GAAyB;AAAA,IAC7B,MAAA;AAAA,IAAQ,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,MAAA;AAAA,IAAQ,IAAA;AAAA,IAAM,MAAA;AAAA,IAAQ,UAAA;AAAA,IAAY,KAAA;AAAA,IAAO,OAAA;AAAA,IAAS;AAAA,GAC9E;AACA,EAAA,MAAM,gBAAA,GAAsC,CAAC,KAAA,EAAO,MAAM,CAAA;AAE1D,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAA,EAAM;AACpC,MAAA,IAAA,GAAO,IAAA;AAAA,IACT,CAAA,MAAA,IAAW,GAAA,KAAQ,WAAA,IAAe,GAAA,KAAQ,IAAA,EAAM;AAC9C,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ,CAAA,MAAA,IAAW,QAAQ,SAAA,EAAW;AAC5B,MAAA,QAAA,GAAW,IAAA;AAAA,IACb,CAAA,MAAA,IAAW,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAA,EAAM;AAC3C,MAAA,OAAA,GAAU,IAAA,CAAK,QAAQ,OAAA,CAAQ,GAAA,IAAO,IAAA,CAAK,EAAE,CAAC,CAAA,IAAK,EAAE,CAAA;AAAA,IACvD,CAAA,MAAA,IAAW,GAAA,KAAQ,OAAA,IAAW,GAAA,KAAQ,IAAA,EAAM;AAC1C,MAAA,MAAA,GAAS,IAAA,CAAK,QAAQ,OAAA,CAAQ,GAAA,IAAO,IAAA,CAAK,EAAE,CAAC,CAAA,IAAK,EAAE,CAAA;AAAA,IACtD,CAAA,MAAA,IAAW,GAAA,KAAQ,WAAA,IAAe,GAAA,KAAQ,IAAA,EAAM;AAC9C,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,EAAE,CAAC,CAAA;AAClB,MAAA,IAAI,CAAA,EAAG,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AAAA,IACvB,CAAA,MAAA,IAAW,QAAQ,eAAA,EAAiB;AAClC,MAAA,UAAA,GAAa,IAAA;AAAA,IACf,CAAA,MAAA,IAAW,QAAQ,QAAA,EAAU;AAC3B,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,EAAE,CAAC,CAAA;AAClB,MAAA,IAAI,MAAM,MAAA,EAAW,IAAA,GAAO,QAAA,CAAS,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AAAA,IACjD,CAAA,MAAA,IAAW,QAAQ,QAAA,EAAU;AAC3B,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,EAAE,CAAC,CAAA;AAClB,MAAA,IAAI,CAAA,KAAM,QAAW,IAAA,GAAO,CAAA;AAAA,IAC9B,CAAA,MAAA,IAAW,GAAA,IAAO,CAAC,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,IAAK,QAAA,CAAS,QAAA,CAAS,GAAiB,CAAA,EAAG;AAC9E,MAAA,OAAA,GAAU,GAAA;AACV,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AAC1B,MAAA,IAAA,CAAK,OAAA,KAAY,MAAA,IAAU,OAAA,KAAY,UAAA,KAAe,OAAA,KAAY,UAAa,CAAC,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AACvG,QAAA,QAAA,GAAW,IAAA,CAAK,EAAE,CAAC,CAAA,IAAK,EAAA;AAAA,MAC1B,CAAA,MAAA,IAAW,YAAY,KAAA,IAAS,OAAA,KAAY,UAAa,CAAC,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AACjF,QAAA,QAAA,GAAW,IAAA,CAAK,EAAE,CAAC,CAAA,IAAK,EAAA;AACxB,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AAC1B,QAAA,IAAI,YAAY,MAAA,IAAa,CAAC,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AACrD,UAAA,YAAA,GAAe,IAAA,CAAK,EAAE,CAAC,CAAA,IAAK,IAAA;AAAA,QAC9B;AAAA,MACF,CAAA,MAAA,IAAW,OAAA,KAAY,OAAA,IAAW,OAAA,KAAY,MAAA,IAAa,CAAC,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,IAAK,gBAAA,CAAiB,QAAA,CAAS,OAA0B,CAAA,EAAG;AAC5I,QAAA,QAAA,GAAW,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,OAAA,EAAS,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,OAAA,EAAS,MAAA,EAAQ,OAAA,EAAS,UAAA,EAAY,QAAA,EAAU,YAAA,EAAc,MAAM,IAAA,EAAK;AAChI;AAEA,SAAS,SAAA,GAAkB;AACzB,EAAA,MAAM,GAAA,GAAM,YAAA;AACZ,EAAA,OAAA,CAAQ,OAAO,KAAA,CAAM;AAAA,OAAA,EACd,GAAG,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,EAAA,EA6BR,GAAG,CAAA;AAAA,EAAA,EACH,GAAG,CAAA;AAAA,EAAA,EACH,GAAG,CAAA;AAAA,EAAA,EACH,GAAG,CAAA;AAAA,EAAA,EACH,GAAG,CAAA;AAAA,EAAA,EACH,GAAG,CAAA;AAAA,EAAA,EACH,GAAG,CAAA;;AAAA;AAAA,CAGN,CAAA;AACD;AAEA,eAAe,QAAQ,OAAA,EAAkC;AACvD,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,UAAA,EAAY,YAAA,EAAa,GAAI,MAAM,YAAY,EAAE,UAAA,EAAY,OAAA,IAAW,KAAA,CAAA,EAAW,CAAA;AAC3F,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,uBAAA,EAA0B,UAAU;AAAA,SAAA,EAAc,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA,CAAwC,CAAA;AACtI,IAAA,OAAO,CAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,aAAA,EAAgB,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC;AAAA,CAAI,CAAA;AACzF,IAAA,OAAO,CAAA;AAAA,EACT;AACF;AAEA,eAAe,QAAA,CACb,OAAA,EACA,MAAA,EACA,OAAA,EACA,UAAA,EACiB;AACjB,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB;AAAA,MACnC,aAAa,OAAA,IAAW,KAAA,CAAA;AAAA,MACxB,QAAQ,MAAA,IAAU,KAAA,CAAA;AAAA,MAClB,OAAA,EAAS,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,GAAU,KAAA,CAAA;AAAA,MACxC,YAAY,UAAA,IAAc,KAAA;AAAA,KAC3B,CAAA;AACD,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,CAAA,MAAA,EAAS,MAAA,CAAO,SAAS,CAAA,YAAA,EAAe,OAAO,MAAM;AAAA,OAAA,EAAY,OAAO,SAAS;AAAA,UAAA,EAAe,OAAO,WAAW;AAAA;AAAA,KACpH;AACA,IAAA,OAAO,CAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,cAAA,EAAiB,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC;AAAA,CAAI,CAAA;AAC1F,IAAA,OAAO,CAAA;AAAA,EACT;AACF;AAEA,eAAe,SAAS,OAAA,EAAkC;AACxD,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAM,GAAI,MAAM,aAAa,EAAE,IAAA,EAAM,OAAA,IAAW,KAAA,CAAA,EAAW,CAAA;AAC5E,IAAA,KAAA,CAAM,KAAA,EAAO,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA;AAC/B,IAAA,KAAA,CAAM,MAAA,EAAQ,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AACjC,IAAA,OAAA,CAAQ,OAAO,KAAA,EAAM;AACrB,IAAA,MAAM,IAAA,GAAO,IAAI,OAAA,CAAgB,CAAC,OAAA,KAAY;AAC5C,MAAA,KAAA,CAAM,GAAG,OAAA,EAAS,CAAC,SAAS,OAAA,CAAQ,IAAA,IAAQ,CAAC,CAAC,CAAA;AAAA,IAChD,CAAC,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,cAAA,EAAiB,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC;AAAA,CAAI,CAAA;AAC1F,IAAA,OAAO,CAAA;AAAA,EACT;AACF;AAEA,IAAM,WAAA,GAAc,EAAA;AAGpB,SAAS,eAAe,KAAA,EAA2B;AACjD,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AAC/B,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,aAAA,CAAc,KAAK,IAAI,CAAA;AACxC,IAAA,MAAM,QAAQ,eAAA,CAAgB,IAAA,CAAK,MAAM,IAAA,CAAK,IAAA,EAAM,KAAK,OAAO,CAAA;AAChE,IAAA,MAAM,IAAA,GAAA,CAAQ,IAAA,CAAK,WAAA,IAAe,EAAA,EAC/B,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAClB,IAAA,EAAK,CACL,KAAA,CAAM,CAAA,EAAG,WAAW,CAAA;AACvB,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,WAAA,EAAa,QAAQ,kBAAA,EAAmB;AAAA,EAChE,CAAC,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,MAAM,CAAC,CAAA;AAC7D,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,MAAM,CAAC,CAAA;AAE3D,EAAA,MAAM,MAAM,CAAA,EAAG,QAAA,CAAI,MAAA,CAAO,MAAM,CAAC,CAAA,MAAA,EAAI,QAAA,CAAI,MAAA,CAAO,KAAK,CAAC,CAAA,MAAA,EAAI,QAAA,CAAI,MAAA,CAAO,WAAA,GAAc,CAAC,CAAC,CAAA,CAAA;AACrF,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,OAAA,CAAQ,OAAO,MAAM,CAAA;AAAA,IACrB,MAAA,CAAO,OAAO,KAAK,CAAA;AAAA,IACnB;AAAA,GACF,CAAE,KAAK,UAAK,CAAA;AACZ,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,MAAA;AAAA,IACA,GAAA;AAAA,IACA,GAAG,IAAA,CAAK,GAAA;AAAA,MAAI,CAAC,CAAA,KACX;AAAA,QACE,CAAA,CAAE,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AAAA,QACrB,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAAA,QACnB,CAAA,CAAE;AAAA,OACJ,CAAE,KAAK,UAAK;AAAA;AACd,GACF;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAGA,SAAS,qBAAqB,IAAA,EAAwB;AACpD,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAU,GAAI,aAAA,CAAc,KAAK,IAAI,CAAA;AACnD,EAAA,MAAM,QAAQ,eAAA,CAAgB,IAAA,CAAK,MAAM,IAAA,CAAK,IAAA,EAAM,KAAK,OAAO,CAAA;AAChE,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,QAAA,CAAS,KAAK,mBAAS,CAAA;AACvB,EAAA,QAAA,CAAS,IAAA,CAAK,CAAA,qBAAA,EAAmB,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAC5C,EAAA,QAAA,CAAS,IAAA,CAAK,CAAA,qBAAA,EAAmB,KAAK,CAAA,CAAE,CAAA;AACxC,EAAA,QAAA,CAAS,IAAA,CAAK,CAAA,qBAAA,EAAmB,SAAS,CAAA,CAAE,CAAA;AAC5C,EAAA,QAAA,CAAS,IAAA,CAAK,CAAA,qBAAA,EAAmB,IAAA,CAAK,OAAO,CAAA,CAAE,CAAA;AAC/C,EAAA,QAAA,CAAS,IAAA,CAAK,CAAA,qBAAA,EAAmB,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAC5C,EAAA,QAAA,CAAS,KAAK,0BAAgB,CAAA;AAC9B,EAAA,QAAA,CAAS,IAAA,CAAK,YAAO,IAAA,CAAK,WAAA,IAAe,UAAU,OAAA,CAAQ,KAAA,EAAO,YAAO,CAAC,CAAA,CAAE,CAAA;AAC5E,EAAA,QAAA,CAAS,KAAK,mBAAS,CAAA;AACvB,EAAA,QAAA,CAAS,IAAA,CAAK,CAAA,QAAA,EAAM,IAAA,CAAK,IAAA,EAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,GAAI,QAAQ,CAAA,CAAE,CAAA;AACzE,EAAA,QAAA,CAAS,KAAK,2BAAiB,CAAA;AAC/B,EAAA,QAAA,CAAS,KAAK,CAAA,QAAA,EAAM,IAAA,CAAK,aAAa,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAClD,EAAA,IAAI,IAAA,CAAK,KAAA,EAAO,IAAA,EAAM,UAAA,EAAY;AAChC,IAAA,QAAA,CAAS,KAAK,mBAAS,CAAA;AACvB,IAAA,QAAA,CAAS,KAAK,CAAA,oBAAA,EAAkB,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA,CAAE,CAAA;AAAA,EAC9D;AACA,EAAA,QAAA,CAAS,KAAK,2BAAiB,CAAA;AAC/B,EAAA,QAAA,CAAS,IAAA;AAAA,IACP,UAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,WAAA,EAAa,MAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,YAAO;AAAA,GAC1E;AACA,EAAA,QAAA,CAAS,KAAK,4BAAkB,CAAA;AAChC,EAAA,QAAA,CAAS,IAAA;AAAA,IACP,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,YAAA,EAAc,MAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,OAAO;AAAA,GAC3E;AAEA,EAAA,OAAO,QAAA,CAAS,KAAK,IAAI,CAAA;AAC3B;AAEA,eAAe,KAAA,CAAM,OAAA,EAAkB,OAAA,GAAU,KAAA,EAAwB;AACvE,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC/D,IAAA,MAAM,KAAA,GAAQ,SAAS,QAAA,EAAS;AAChC,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,wBAAwB,CAAA;AAC7C,MAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,WAAW,GAAG,CAAA;AAClD,MAAA,MAAM,MAAA,GAAS,sBAAsB,SAAS,CAAA;AAC9C,MAAA,MAAM,cAAc,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,KAAK,KAAK,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,CAAC,MAAM,OAAO,CAAA,KAAM,YAAY,CAAA,CAAE,UAAA,CAAW,MAAM,CAAC,CAAA;AACzH,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,UACb;AAAA,SACF;AAAA,MACF;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAC,CAAA;AACjD,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,cAAA,CAAe,KAAK,IAAI,IAAI,CAAA;AACjD,IAAA,OAAO,CAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,WAAA,EAAc,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC;AAAA,CAAI,CAAA;AACvF,IAAA,OAAO,CAAA;AAAA,EACT;AACF;AAEA,eAAe,WAAA,CAAY,QAAA,EAAkB,OAAA,EAAkB,OAAA,GAAU,KAAA,EAAwB;AAC/F,EAAA,IAAI,CAAC,QAAA,CAAS,IAAA,EAAK,EAAG;AACpB,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,0CAA0C,CAAA;AAC/D,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC/D,IAAA,MAAM,YAAA,GAAe,qBAAA,CAAsB,QAAA,CAAS,IAAA,EAAM,CAAA;AAC1D,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,GAAA,CAAI,YAAY,CAAA;AACtC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,gBAAA,EAAmB,QAAQ;AAAA,CAAI,CAAA;AACpD,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,oBAAA,CAAqB,8BAA8B,IAAI,CAAC,IAAI,IAAI,CAAA;AACrF,IAAA,OAAO,CAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,iBAAA,EAAoB,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC;AAAA,CAAI,CAAA;AAC7F,IAAA,OAAO,CAAA;AAAA,EACT;AACF;AAEA,SAAS,kBAAA,GAAkC;AACzC,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,IACtE,MAAA,EAAQ,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA,IAC1B,WAAA,EAAa;AAAA,MACX,UAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA;AAAA,MACA,oBAAA;AAAA,MACA;AAAA;AACF,GACF;AACF;AAEA,eAAe,MAAA,CAAO,QAAA,EAAkB,YAAA,EAAsB,OAAA,EAAkB,UAAU,KAAA,EAAwB;AAChH,EAAA,IAAI,CAAC,QAAA,CAAS,IAAA,EAAK,EAAG;AACpB,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,qDAAqD,CAAA;AAC1E,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAgB,EAAC;AACrB,EAAA,IAAI,YAAA,CAAa,MAAK,EAAG;AACvB,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,IAAA,CAAK,MAAM,YAAY,CAAA;AAAA,IAChC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,CAAA;AAAA,CAAoE,CAAA;AACzF,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,OAAA,EAAS,QAAA,KAAa,MAAM,mBAAA,CAAoB,SAAS,OAAO,CAAA;AACxE,IAAA,MAAM,YAAA,GAAe,qBAAA,CAAsB,QAAA,CAAS,IAAA,EAAM,CAAA;AAC1D,IAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,YAAY,CAAA,EAAG;AAC/B,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,gBAAA,EAAmB,QAAQ;AAAA,CAAI,CAAA;AACpD,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,MAAM,MAAM,kBAAA,EAAmB;AAC/B,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAA;AAAA,MAC3B,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,SAAS,KAAA,EAAM;AAAA,MAC3C;AAAA,KACF;AACA,IAAA,IAAI,OAAO,EAAA,EAAI;AACb,MAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,GAAI,IAAI,CAAA;AAClE,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,YAAA,EAAe,MAAA,CAAO,KAAA,EAAO,IAAA,IAAQ,SAAS,CAAA,GAAA,EAAM,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,EAAE;AAAA,CAAI,CAAA;AACxG,IAAA,OAAO,CAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,YAAA,EAAe,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC;AAAA,CAAI,CAAA;AACxF,IAAA,OAAO,CAAA;AAAA,EACT;AACF;AAEA,eAAe,WAAA,CAAY,SAAkB,OAAA,GAAU,KAAA,EAAO,QAAQ,KAAA,EAAO,IAAA,GAAO,GAAA,EAAM,IAAA,GAAO,WAAA,EAA8B;AAC7H,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC9D,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,sBAAsB,OAAO,CAAA;AACnC,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,MAAM,UAAA,GAAa,MAAM,6BAAA,CAA8B,OAAA,EAAS,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,CAAA;AAC5F,IAAA,MAAM,EAAE,KAAK,IAAA,EAAM,UAAA,KAAe,MAAM,UAAA,CAAW,MAAA,CAAO,IAAA,EAAM,IAAI,CAAA;AACpE,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,qBAAA,EAAwB,GAAG;AAAA,CAAI,CAAA;AACpD,IAAA,MAAM,IAAI,QAAc,MAAM;AAAA,IAAC,CAAC,CAAA;AAChC,IAAA,OAAO,CAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,kBAAA,EAAqB,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC;AAAA,CAAI,CAAA;AAC9F,IAAA,OAAO,CAAA;AAAA,EACT;AACF;AAEA,eAAe,YAAA,CAAa,IAAA,EAAc,IAAA,EAAc,OAAA,EAAkB,UAAU,KAAA,EAAwB;AAC1G,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC9D,IAAA,MAAM,IAAA,GAAO,MAAM,iBAAA,CAAkB,OAAO,CAAA;AAC5C,IAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,UAAA,EAAW,GAAI,MAAM,IAAA,CAAK,MAAA,CAAO,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA;AAC/E,IAAA,MAAM,IAAA,GAAO,CAAA,OAAA,EAAU,UAAU,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA;AAC/C,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,KAAA,EAAQ,IAAI,mBAAmB,IAAI,CAAA;AAAA,CAAgB,CAAA;AACxE,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,YAAA,EAAe,IAAI,aAAa,IAAI,CAAA;AAAA,CAAkB,CAAA;AAC3E,IAAA,MAAM,IAAI,QAAc,MAAM;AAAA,IAAC,CAAC,CAAA;AAChC,IAAA,OAAO,CAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,mBAAA,EAAsB,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC;AAAA,CAAI,CAAA;AAC/F,IAAA,OAAO,CAAA;AAAA,EACT;AACF;AAEA,eAAe,IAAA,CAAK,IAAA,GAAiB,OAAA,CAAQ,IAAA,EAAuB;AAClE,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,UAAU,OAAA,EAAS,MAAA,EAAQ,OAAA,EAAS,UAAA,EAAY,UAAU,YAAA,EAAc,IAAA,EAAM,IAAA,EAAK,GAC3H,UAAU,IAAI,CAAA;AAEhB,EAAA,IAAI,IAAA,IAAQ,YAAY,MAAA,EAAQ;AAC9B,IAAA,SAAA,EAAU;AACV,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAA,KAAY,MAAA,EAAQ,OAAO,OAAA,CAAQ,OAAO,CAAA;AAC9C,EAAA,IAAI,YAAY,OAAA,EAAS,OAAO,SAAS,OAAA,EAAS,MAAA,EAAQ,SAAS,UAAU,CAAA;AAC7E,EAAA,IAAI,OAAA,KAAY,OAAA,EAAS,OAAO,QAAA,CAAS,OAAO,CAAA;AAChD,EAAA,IAAI,YAAY,IAAA,IAAQ,OAAA,KAAY,QAAQ,OAAO,KAAA,CAAM,SAAS,OAAO,CAAA;AACzE,EAAA,IAAI,OAAA,KAAY,cAAc,OAAA,KAAY,MAAA,SAAe,WAAA,CAAY,QAAA,EAAU,SAAS,OAAO,CAAA;AAC/F,EAAA,IAAI,YAAY,KAAA,EAAO,OAAO,OAAO,QAAA,EAAU,YAAA,EAAc,SAAS,OAAO,CAAA;AAC7E,EAAA,IAAI,YAAY,OAAA,EAAS;AACvB,IAAA,IAAI,QAAA,KAAa,OAAO,OAAO,WAAA,CAAY,SAAS,OAAA,EAAS,QAAA,EAAU,MAAM,IAAI,CAAA;AACjF,IAAA,IAAI,aAAa,MAAA,EAAQ,OAAO,aAAa,IAAA,EAAM,IAAA,EAAM,SAAS,OAAO,CAAA;AACzE,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,wFAAwF,CAAA;AAC7G,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,SAAA,EAAU;AACV,EAAA,OAAO,CAAA;AACT;AAGA,eAAsB,IAAI,IAAA,EAAiC;AACzD,EAAA,OAAO,KAAK,IAAI,CAAA;AAClB;AAEA,IAAM,UAAA,GAAa,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AAChD,IAAM,WAAA,GAAc,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AAClC,IAAI,SAAS,OAAO,OAAA,KAAY,WAAA,IAAe,WAAA,KAAgB,UAAa,WAAA,KAAgB,UAAA;AAC5F,IAAI,CAAC,UAAU,WAAA,EAAa;AAC1B,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,YAAA,CAAa,WAAW,CAAA,KAAM,YAAA,CAAa,UAAU,CAAA;AAAA,EAChE,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEA,IAAI,MAAA,EAAQ;AACV,EAAA,IAAA,EAAK,CACF,IAAA,CAAK,CAAC,IAAA,KAAS,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CACjC,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,IAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,MAAA,CAAO,KAAK,OAAA,IAAW,GAAG,IAAI,IAAI,CAAA;AACvD,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB,CAAC,CAAA;AACL","file":"index.js","sourcesContent":["#!/usr/bin/env node\n/**\n * CLI for @easynet/agent-tool: ls | describe | run | start mcp | start http | init | build | serve | help.\n * Usage: agent-tool <command> [options] [args]\n * Primary: ls, describe [tool path], run [tool path] [parameters], start mcp, start http.\n */\n\nimport path from \"node:path\";\nimport { realpathSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { initProject } from \"../../api/expose/mcp-build/init.js\";\nimport { buildMcpPackage } from \"../../api/expose/mcp-build/build.js\";\nimport { runMcpServer } from \"../../api/expose/mcp-build/run.js\";\nimport { createRuntimeFromConfig, createRuntimeFromConfigSync } from \"../../api/runtimeFromConfig.js\";\nimport { createHttpService } from \"../../api/expose/openapiHttp.js\";\nimport { runMCPServerOverStdio, createMCPServerStreamableHttp } from \"../../api/expose/mcpServer.js\";\nimport type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport { getDisplayScope, resolveToolDescriptor } from \"../../tools/util/toolDescriptor.js\";\nimport { findAndLoadToolConfig, resolveSandboxedPath } from \"../../tools/util/toolConfig.js\";\nimport { enrichSpecWithCanonicalSchema } from \"../../tools/util/canonicalCoreSchemas.js\";\n\ntype CliCommand = \"init\" | \"build\" | \"serve\" | \"list\" | \"ls\" | \"show\" | \"describe\" | \"run\" | \"start\" | \"help\";\ntype StartSubcommand = \"mcp\" | \"http\";\n\ninterface CliArgs {\n command: CliCommand;\n startSub: StartSubcommand;\n help: boolean;\n verbose: boolean;\n /** For start mcp: use stdio transport (default: streamable HTTP) */\n mcpStdio: boolean;\n pathOpt: string;\n outDir: string;\n include: string[];\n includeN8n: boolean;\n toolName: string;\n toolArgsJson: string;\n port: number;\n host: string;\n}\n\nconst DEFAULT_CORE_CONFIG = {\n sandboxRoot: process.cwd(),\n allowedHosts: [] as string[],\n};\n\nasync function getRuntimeWithTools(pathOpt?: string, verbose = false): Promise<{ runtime: Awaited<ReturnType<typeof createRuntimeFromConfig>>[\"runtime\"]; registry: Awaited<ReturnType<typeof createRuntimeFromConfig>>[\"registry\"] }> {\n const cwd = process.cwd();\n const searchDir = path.resolve(cwd, pathOpt ?? \".\");\n const stepLog = verbose ? (msg: string) => process.stderr.write(`[agent-tool] ${msg}\\n`) : undefined;\n if (stepLog) stepLog(`Loading tool config from ${searchDir}`);\n const config = findAndLoadToolConfig(searchDir);\n let sandboxRoot = cwd;\n if (config.sandboxedPath && typeof config.sandboxedPath === \"string\" && config.configPath) {\n sandboxRoot = resolveSandboxedPath(config.configPath, config.sandboxedPath);\n }\n if (stepLog) {\n if (config.configPath) {\n const n = Array.isArray(config.tools) ? config.tools.length : 0;\n stepLog(`Config: ${config.configPath} (${n} tool(s)), sandbox: ${sandboxRoot}`);\n } else {\n stepLog(\"No tool.yaml found\");\n }\n }\n const coreConfig = { sandboxRoot, allowedHosts: [] as string[] };\n const result = await createRuntimeFromConfig({\n coreTools: coreConfig,\n configFilePath: config.configPath,\n stepLog,\n });\n if (stepLog) stepLog(`Registered ${result.registry.snapshot().length} tool(s)`);\n return result;\n}\n\n/** Parse \"scope/name\" into { scope, name }; if no slash, scope is \"\", name is full. */\nfunction parseToolName(fullName: string): { scope: string; name: string } {\n const i = fullName.indexOf(\"/\");\n if (i < 0) return { scope: \"\", name: fullName };\n return { scope: fullName.slice(0, i), name: fullName.slice(i + 1) };\n}\n\nfunction parseArgv(argv: string[]): CliArgs {\n const args = argv.slice(2);\n let command: CliCommand = \"help\";\n let startSub: StartSubcommand = \"http\";\n let help = false;\n let verbose = false;\n let mcpStdio = false;\n let pathOpt = \"\";\n let outDir = \"\";\n let include: string[] = [];\n let includeN8n = false;\n let toolName = \"\";\n let toolArgsJson = \"{}\";\n let port = 3000;\n let host = \"127.0.0.1\";\n\n const commands: CliCommand[] = [\n \"init\", \"build\", \"serve\", \"list\", \"ls\", \"show\", \"describe\", \"run\", \"start\", \"help\",\n ];\n const startSubcommands: StartSubcommand[] = [\"mcp\", \"http\"];\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--help\" || arg === \"-h\") {\n help = true;\n } else if (arg === \"--verbose\" || arg === \"-v\") {\n verbose = true;\n } else if (arg === \"--stdio\") {\n mcpStdio = true;\n } else if (arg === \"--path\" || arg === \"-p\") {\n pathOpt = path.resolve(process.cwd(), args[++i] ?? \"\");\n } else if (arg === \"--out\" || arg === \"-o\") {\n outDir = path.resolve(process.cwd(), args[++i] ?? \"\");\n } else if (arg === \"--include\" || arg === \"-i\") {\n const v = args[++i];\n if (v) include.push(v);\n } else if (arg === \"--include-n8n\") {\n includeN8n = true;\n } else if (arg === \"--port\") {\n const v = args[++i];\n if (v !== undefined) port = parseInt(v, 10) || 3000;\n } else if (arg === \"--host\") {\n const v = args[++i];\n if (v !== undefined) host = v;\n } else if (arg && !arg.startsWith(\"-\") && commands.includes(arg as CliCommand)) {\n command = arg as CliCommand;\n const nextArg = args[i + 1];\n if ((command === \"show\" || command === \"describe\") && nextArg !== undefined && !nextArg.startsWith(\"-\")) {\n toolName = args[++i] ?? \"\";\n } else if (command === \"run\" && nextArg !== undefined && !nextArg.startsWith(\"-\")) {\n toolName = args[++i] ?? \"\";\n const runNext = args[i + 1];\n if (runNext !== undefined && !runNext.startsWith(\"-\")) {\n toolArgsJson = args[++i] ?? \"{}\";\n }\n } else if (command === \"start\" && nextArg !== undefined && !nextArg.startsWith(\"-\") && startSubcommands.includes(nextArg as StartSubcommand)) {\n startSub = args[++i] as StartSubcommand;\n }\n }\n }\n\n return { command, startSub, help, verbose, mcpStdio, pathOpt, outDir, include, includeN8n, toolName, toolArgsJson, port, host };\n}\n\nfunction printHelp(): void {\n const bin = \"agent-tool\";\n process.stdout.write(`\nUsage: ${bin} <command> [options] [args]\n\nPrimary commands:\n ls List all tools (scope, name, description).\n describe <tool path> Show tool details (schema, capabilities, etc.).\n run <tool path> [params] Run a tool. Params: JSON, e.g. '{\"path\":\"README.md\"}'\n start mcp Start MCP server (default: Streamable HTTP; use --stdio for stdio).\n start http Start OpenAPI HTTP server (API + Swagger).\n\nOther commands:\n init Create project template. Then npm install && npm run build.\n build Scan folder for @tool / SKILL / n8n, generate MCP npm package.\n serve Start the generated MCP server (stdio) for testing.\n list Alias for ls.\n show <tool> Alias for describe.\n help Show this help.\n\nOptions:\n --path, -p <path> For init/build/serve: path (default: cwd).\n --out, -o <path> For build: output directory.\n --include, -i <glob> For build: glob for TS files.\n --include-n8n For build: include n8n workflow tools.\n --verbose, -v Print step logs (config load, cache, tools registered).\n --stdio For start mcp: use stdio transport (default: Streamable HTTP).\n --port <number> For start mcp/http: port (default: 3000).\n --host <string> For start mcp/http: host (default: 127.0.0.1).\n --help, -h Show this help.\n\nExamples:\n ${bin} ls\n ${bin} describe core.fs.readText\n ${bin} run core.fs.readText '{\"path\":\"README.md\"}'\n ${bin} start mcp\n ${bin} start mcp --stdio\n ${bin} start http --port 3000\n ${bin} build --path . --out dist\n\nFor agent run (ReAct + agent.yaml): npx @easynet/agent-orchestra run \"task\" -c agent.yaml\n`);\n}\n\nasync function cmdInit(pathOpt: string): Promise<number> {\n try {\n const { targetPath, filesCreated } = await initProject({ targetPath: pathOpt || undefined });\n process.stdout.write(`Initialized project at ${targetPath}\\nCreated: ${filesCreated.join(\", \")}\\nNext: npm install && npm run build\\n`);\n return 0;\n } catch (err) {\n process.stderr.write(`Init failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n return 1;\n }\n}\n\nasync function cmdBuild(\n pathOpt: string,\n outDir: string,\n include: string[],\n includeN8n: boolean,\n): Promise<number> {\n try {\n const result = await buildMcpPackage({\n projectPath: pathOpt || undefined,\n outDir: outDir || undefined,\n include: include.length > 0 ? include : undefined,\n includeN8n: includeN8n || undefined,\n });\n process.stdout.write(\n `Built ${result.toolCount} tool(s) -> ${result.outDir}\\nEntry: ${result.entryPath}\\nmcp.json: ${result.mcpJsonPath}\\n`,\n );\n return 0;\n } catch (err) {\n process.stderr.write(`Build failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n return 1;\n }\n}\n\nasync function cmdServe(pathOpt: string): Promise<number> {\n try {\n const { process: child } = await runMcpServer({ path: pathOpt || undefined });\n child.stdin?.pipe(process.stdin);\n child.stdout?.pipe(process.stdout);\n process.stdin?.unref();\n const exit = new Promise<number>((resolve) => {\n child.on(\"close\", (code) => resolve(code ?? 0));\n });\n return exit;\n } catch (err) {\n process.stderr.write(`Serve failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n return 1;\n }\n}\n\nconst LS_DESC_MAX = 72;\n\n/** Format tool list as table: SCOPE (full package name) | NAME | DESCRIPTION */\nfunction formatLsOutput(specs: ToolSpec[]): string {\n const rows = specs.map((spec) => {\n const { name } = parseToolName(spec.name);\n const scope = getDisplayScope(spec.name, spec.kind, spec.version);\n const desc = (spec.description ?? \"\")\n .replace(/\\n/g, \" \")\n .trim()\n .slice(0, LS_DESC_MAX);\n return { scope, name, description: desc || \"(no description)\" };\n });\n\n const scopeW = Math.max(6, ...rows.map((r) => r.scope.length));\n const nameW = Math.max(4, ...rows.map((r) => r.name.length));\n\n const sep = `${\"─\".repeat(scopeW)}┬${\"─\".repeat(nameW)}┬${\"─\".repeat(LS_DESC_MAX + 2)}`;\n const header = [\n \"SCOPE\".padEnd(scopeW),\n \"NAME\".padEnd(nameW),\n \"DESCRIPTION\",\n ].join(\" │ \");\n const lines = [\n header,\n sep,\n ...rows.map((r) =>\n [\n r.scope.padEnd(scopeW),\n r.name.padEnd(nameW),\n r.description,\n ].join(\" │ \")\n ),\n ];\n return lines.join(\"\\n\");\n}\n\n/** Format single tool details (describe) with clear sections */\nfunction formatDescribeOutput(spec: ToolSpec): string {\n const { name: localName } = parseToolName(spec.name);\n const scope = getDisplayScope(spec.name, spec.kind, spec.version);\n const sections: string[] = [];\n\n sections.push(\"┌─ Tool\");\n sections.push(`│ name: ${spec.name}`);\n sections.push(`│ scope: ${scope}`);\n sections.push(`│ localName: ${localName}`);\n sections.push(`│ version: ${spec.version}`);\n sections.push(`│ kind: ${spec.kind}`);\n sections.push(\"├─ Description\");\n sections.push(`│ ${(spec.description ?? \"(none)\").replace(/\\n/g, \"\\n│ \")}`);\n sections.push(\"├─ Tags\");\n sections.push(`│ ${spec.tags?.length ? spec.tags.join(\", \") : \"(none)\"}`);\n sections.push(\"├─ Capabilities\");\n sections.push(`│ ${spec.capabilities.join(\", \")}`);\n if (spec._meta?.hitl?.sideEffect) {\n sections.push(\"├─ HITL\");\n sections.push(`│ sideEffect: ${spec._meta.hitl.sideEffect}`);\n }\n sections.push(\"├─ Input schema\");\n sections.push(\n \"│ \" + JSON.stringify(spec.inputSchema, null, 2).replace(/\\n/g, \"\\n│ \")\n );\n sections.push(\"└─ Output schema\");\n sections.push(\n \" \" + JSON.stringify(spec.outputSchema, null, 2).replace(/\\n/g, \"\\n \")\n );\n\n return sections.join(\"\\n\");\n}\n\nasync function cmdLs(pathOpt?: string, verbose = false): Promise<number> {\n try {\n const { registry } = await getRuntimeWithTools(pathOpt, verbose);\n const specs = registry.snapshot();\n if (specs.length === 0) {\n process.stdout.write(\"No tools registered.\\n\");\n const cwd = process.cwd();\n const searchDir = path.resolve(cwd, pathOpt ?? \".\");\n const config = findAndLoadToolConfig(searchDir);\n const hasNpmTools = Array.isArray(config.tools) && config.tools.some((t) => typeof t === \"string\" && t.startsWith(\"npm:\"));\n if (hasNpmTools) {\n process.stdout.write(\n \"Tip: Install builtin tools in this directory so 'agent-tool ls' finds them: npm init -y && npm install @easynet/agent-tool-buildin\\n\"\n );\n }\n return 0;\n }\n specs.sort((a, b) => a.name.localeCompare(b.name));\n process.stdout.write(formatLsOutput(specs) + \"\\n\");\n return 0;\n } catch (err) {\n process.stderr.write(`ls failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n return 1;\n }\n}\n\nasync function cmdDescribe(toolName: string, pathOpt?: string, verbose = false): Promise<number> {\n if (!toolName.trim()) {\n process.stderr.write(\"Usage: agent-tool describe <tool path>\\n\");\n return 1;\n }\n try {\n const { registry } = await getRuntimeWithTools(pathOpt, verbose);\n const registryName = resolveToolDescriptor(toolName.trim());\n const spec = registry.get(registryName);\n if (!spec) {\n process.stderr.write(`Tool not found: ${toolName}\\n`);\n return 1;\n }\n process.stdout.write(formatDescribeOutput(enrichSpecWithCanonicalSchema(spec)) + \"\\n\");\n return 0;\n } catch (err) {\n process.stderr.write(`describe failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n return 1;\n }\n}\n\nfunction defaultExecContext(): ExecContext {\n return {\n requestId: `cli-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n taskId: `task-${Date.now()}`,\n permissions: [\n \"read:web\",\n \"read:fs\",\n \"write:fs\",\n \"read:db\",\n \"write:db\",\n \"network\",\n \"workflow\",\n \"danger:destructive\",\n \"exec\",\n ],\n };\n}\n\nasync function cmdRun(toolName: string, toolArgsJson: string, pathOpt?: string, verbose = false): Promise<number> {\n if (!toolName.trim()) {\n process.stderr.write(\"Usage: agent-tool run <tool path> [<json params>]\\n\");\n return 1;\n }\n let args: unknown = {};\n if (toolArgsJson.trim()) {\n try {\n args = JSON.parse(toolArgsJson) as unknown;\n } catch {\n process.stderr.write(\"Invalid JSON for parameters. Example: '{\\\"path\\\":\\\"README.md\\\"}'\\n\");\n return 1;\n }\n }\n try {\n const { runtime, registry } = await getRuntimeWithTools(pathOpt, verbose);\n const registryName = resolveToolDescriptor(toolName.trim());\n if (!registry.get(registryName)) {\n process.stderr.write(`Tool not found: ${toolName}\\n`);\n return 1;\n }\n const ctx = defaultExecContext();\n const result = await runtime.invoke(\n { tool: registryName, args, purpose: \"cli\" },\n ctx\n );\n if (result.ok) {\n process.stdout.write(JSON.stringify(result.result, null, 2) + \"\\n\");\n return 0;\n }\n process.stderr.write(`Tool error: ${result.error?.kind ?? \"unknown\"} - ${result.error?.message ?? \"\"}\\n`);\n return 1;\n } catch (err) {\n process.stderr.write(`Run failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n return 1;\n }\n}\n\nasync function cmdStartMcp(pathOpt?: string, verbose = false, stdio = false, port = 3000, host = \"127.0.0.1\"): Promise<number> {\n try {\n const { runtime } = await getRuntimeWithTools(pathOpt, verbose);\n if (stdio) {\n await runMCPServerOverStdio(runtime);\n return 0;\n }\n const streamable = await createMCPServerStreamableHttp(runtime, { port, host, path: \"/mcp\" });\n const { url, port: actualPort } = await streamable.listen(port, host);\n process.stdout.write(`MCP Streamable HTTP: ${url}\\n`);\n await new Promise<void>(() => {});\n return 0;\n } catch (err) {\n process.stderr.write(`start mcp failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n return 1;\n }\n}\n\nasync function cmdStartHttp(port: number, host: string, pathOpt?: string, verbose = false): Promise<number> {\n try {\n const { runtime } = await getRuntimeWithTools(pathOpt, verbose);\n const http = await createHttpService(runtime);\n const { port: actualPort, host: actualHost } = await http.listen({ port, host });\n const base = `http://${actualHost}:${actualPort}`;\n process.stdout.write(`API: ${base}/invoke (POST), ${base}/tools (GET)\\n`);\n process.stdout.write(`Swagger UI: ${base}/ (spec: ${base}/openapi.json)\\n`);\n await new Promise<void>(() => {});\n return 0;\n } catch (err) {\n process.stderr.write(`start http failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n return 1;\n }\n}\n\nasync function main(argv: string[] = process.argv): Promise<number> {\n const { command, startSub, help, verbose, mcpStdio, pathOpt, outDir, include, includeN8n, toolName, toolArgsJson, port, host } =\n parseArgv(argv);\n\n if (help || command === \"help\") {\n printHelp();\n return 0;\n }\n\n if (command === \"init\") return cmdInit(pathOpt);\n if (command === \"build\") return cmdBuild(pathOpt, outDir, include, includeN8n);\n if (command === \"serve\") return cmdServe(pathOpt);\n if (command === \"ls\" || command === \"list\") return cmdLs(pathOpt, verbose);\n if (command === \"describe\" || command === \"show\") return cmdDescribe(toolName, pathOpt, verbose);\n if (command === \"run\") return cmdRun(toolName, toolArgsJson, pathOpt, verbose);\n if (command === \"start\") {\n if (startSub === \"mcp\") return cmdStartMcp(pathOpt, verbose, mcpStdio, port, host);\n if (startSub === \"http\") return cmdStartHttp(port, host, pathOpt, verbose);\n process.stderr.write(\"Usage: agent-tool start mcp | agent-tool start http [--port 3000] [--host 127.0.0.1]\\n\");\n return 1;\n }\n\n printHelp();\n return 1;\n}\n\n/** Run CLI with the given argv (same shape as process.argv). Exported for tests. */\nexport async function run(argv: string[]): Promise<number> {\n return main(argv);\n}\n\nconst scriptPath = fileURLToPath(import.meta.url);\nconst invokedPath = process.argv[1];\nlet isMain = typeof process !== \"undefined\" && invokedPath !== undefined && invokedPath === scriptPath;\nif (!isMain && invokedPath) {\n try {\n isMain = realpathSync(invokedPath) === realpathSync(scriptPath);\n } catch {\n // keep isMain false if realpath fails\n }\n}\n\nif (isMain) {\n main()\n .then((code) => process.exit(code))\n .catch((err) => {\n process.stderr.write(String(err?.message ?? err) + \"\\n\");\n process.exit(1);\n });\n}\n"]}
1
+ {"version":3,"sources":["../../../src/api/expose/extension-init/initExtension.ts","../../../src/utils/cli/index.ts"],"names":["path","resolve"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Scaffold a new agent-tool extension: folder, src, hello-world tool, generate-manifest, index, package.json.\n * Use: agent-tool init <extension name> → then cd <name> && npm install && npm run build.\n */\n\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\n\nexport interface InitExtensionOptions {\n /** Extension name (folder name to create). */\n extensionName: string;\n /** Parent directory (default: process.cwd()). */\n parentDir?: string;\n}\n\n/** Sanitize extension name for npm package name: lowercase, hyphens allowed. */\nfunction toPackageName(name: string): string {\n return name\n .trim()\n .toLowerCase()\n .replace(/\\s+/g, \"-\")\n .replace(/[^a-z0-9-]/g, \"\");\n}\n\nfunction templates(packageName: string) {\n return {\n \"package.json\": `{\n \"name\": \"${packageName}\",\n \"version\": \"0.0.1\",\n \"description\": \"Tools extension for @easynet/agent-tool\",\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"default\": \"./dist/index.js\"\n }\n },\n \"files\": [\"dist\"],\n \"scripts\": {\n \"build\": \"tsx generate-manifest.ts && tsc -p tsconfig.build.json\",\n \"clean\": \"rm -rf dist\",\n \"pretest\": \"npm run build\",\n \"test\": \"vitest run\"\n },\n \"peerDependencies\": {\n \"@easynet/agent-tool\": \">=1.0.31\"\n },\n \"devDependencies\": {\n \"@easynet/agent-tool\": \"^1.0.34\",\n \"tsx\": \"^4.19.2\",\n \"typescript\": \"~5.7.2\",\n \"vitest\": \"^2.1.8\"\n },\n \"license\": \"MIT\"\n}\n`,\n \"tsconfig.json\": `{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"NodeNext\",\n \"moduleResolution\": \"NodeNext\",\n \"lib\": [\"ES2022\"],\n \"strict\": true,\n \"skipLibCheck\": true,\n \"declaration\": true,\n \"declarationMap\": true,\n \"sourceMap\": true,\n \"outDir\": \"./dist\",\n \"rootDir\": \".\",\n \"resolveJsonModule\": true,\n \"isolatedModules\": true\n },\n \"include\": [\"./**/*.ts\"],\n \"exclude\": [\"node_modules\", \"dist\", \"**/dist/**\"]\n}\n`,\n \"tsconfig.build.json\": `{\n \"extends\": \"./tsconfig.json\",\n \"compilerOptions\": { \"rootDir\": \".\", \"outDir\": \"dist\" },\n \"include\": [\"./**/*.ts\"],\n \"exclude\": [\"node_modules\", \"dist\", \"**/dist/**\", \"**/tsconfig*.json\", \"**/*.test.ts\", \"test\", \"scripts\", \"generate-manifest.ts\"]\n}\n`,\n \"generate-manifest.ts\": `/**\n * Build step: run framework generateManifest (scan src, emit manifest).\n * Tool names in the manifest are the exported function names.\n */\nimport { generateManifest } from \"@easynet/agent-tool\";\n\ngenerateManifest(process.cwd());\n`,\n \"index.ts\": `import { createExtension } from \"@easynet/agent-tool\";\nimport type { ToolRegistry, ToolAdapter } from \"@easynet/agent-tool\";\n\nconst ext = createExtension({ importMeta: import.meta });\n\n/** Framework contract: extension exports register(registry, options). */\nexport function register(\n registry: ToolRegistry,\n options?: { only?: string[]; namePrefixes?: string[] },\n): ToolAdapter {\n return ext.register(registry, options ?? {});\n}\n\nexport const getExtensionContext = ext.getContext;\nexport const runWithExtensionContext = ext.runWith;\n`,\n \"src/helloWorld.ts\": `/**\n * A simple hello-world tool.\n * @tool\n * @effect none\n */\nexport async function helloWorld(_args: Record<string, unknown>) {\n return {\n result: { message: \"Hello, World!\" },\n evidence: [\n {\n type: \"tool\",\n ref: \"helloWorld\",\n summary: \"Hello, World!\",\n createdAt: new Date().toISOString(),\n },\n ],\n };\n}\n`,\n \"README.md\": `# ${packageName}\n\nScaffolded by \\`agent-tool init ${packageName}\\`.\n\n## Quick start\n\n\\`\\`\\`bash\nnpm install\nnpm run build\n\\`\\`\\`\n\nAdd more tools under \\`src/\\` (export async functions with \\`@tool\\` JSDoc), then \\`npm run build\\` again.\n\n## Use in tool config\n\nIn your \\`tool.yaml\\` \\`tools.packages\\`:\n\n\\`\\`\\`yaml\ntools:\n packages:\n file:./path/to/${packageName}: {}\n\\`\\`\\`\n\nOr publish and use: \\`npm:@your-scope/${packageName}\\`\n`,\n };\n}\n\n/**\n * Create extension scaffold at parentDir/extensionName.\n * Returns target path and list of created files.\n */\nexport async function initExtension(\n options: InitExtensionOptions,\n): Promise<{ targetPath: string; filesCreated: string[] }> {\n const parent = path.resolve(options.parentDir ?? process.cwd());\n const name = options.extensionName.trim();\n if (!name) {\n throw new Error(\"Extension name is required\");\n }\n const targetPath = path.join(parent, name);\n const packageName = toPackageName(name) || name.replace(/\\s/g, \"-\").toLowerCase();\n const filesCreated: string[] = [];\n const tmpl = templates(packageName);\n\n await fs.mkdir(targetPath, { recursive: true });\n\n for (const [relPath, content] of Object.entries(tmpl)) {\n const fullPath = path.join(targetPath, relPath);\n await fs.mkdir(path.dirname(fullPath), { recursive: true });\n await fs.writeFile(fullPath, content.trimStart(), \"utf8\");\n filesCreated.push(relPath);\n }\n\n return { targetPath, filesCreated };\n}\n","#!/usr/bin/env node\n/**\n * CLI for @easynet/agent-tool: ls | describe | run | start mcp | start http | init | build | serve | help.\n * Usage: agent-tool <command> [options] [args]\n * Primary: ls, describe [tool path], run [tool path] [parameters], start mcp, start http.\n */\n\nimport path from \"node:path\";\nimport { realpathSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { initProject } from \"../../api/expose/mcp-build/init.js\";\nimport { initExtension } from \"../../api/expose/extension-init/index.js\";\nimport { buildMcpPackage } from \"../../api/expose/mcp-build/build.js\";\nimport { runMcpServer } from \"../../api/expose/mcp-build/run.js\";\nimport { createRuntimeFromConfig, createRuntimeFromConfigSync } from \"../../api/runtimeFromConfig.js\";\nimport { createHttpService } from \"../../api/expose/openapiHttp.js\";\nimport { runMCPServerOverStdio, createMCPServerStreamableHttp } from \"../../api/expose/mcpServer.js\";\nimport type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport { getDisplayScope, resolveToolDescriptor } from \"../../tools/util/toolDescriptor.js\";\nimport { findAndLoadToolConfig, resolveSandboxedPath } from \"../../tools/util/toolConfig.js\";\nimport { enrichSpecWithCanonicalSchema } from \"../../tools/util/canonicalCoreSchemas.js\";\n\ntype CliCommand = \"init\" | \"build\" | \"serve\" | \"list\" | \"ls\" | \"show\" | \"describe\" | \"run\" | \"start\" | \"help\";\ntype StartSubcommand = \"mcp\" | \"http\";\n\ninterface CliArgs {\n command: CliCommand;\n startSub: StartSubcommand;\n help: boolean;\n verbose: boolean;\n /** For start mcp: use stdio transport (default: streamable HTTP) */\n mcpStdio: boolean;\n pathOpt: string;\n /** For init: extension name (folder to create). If set, scaffold extension; else MCP project. */\n extensionName: string;\n outDir: string;\n include: string[];\n includeN8n: boolean;\n toolName: string;\n toolArgsJson: string;\n port: number;\n host: string;\n}\n\nconst DEFAULT_CORE_CONFIG = {\n sandboxRoot: process.cwd(),\n allowedHosts: [] as string[],\n};\n\nasync function getRuntimeWithTools(pathOpt?: string, verbose = false): Promise<{ runtime: Awaited<ReturnType<typeof createRuntimeFromConfig>>[\"runtime\"]; registry: Awaited<ReturnType<typeof createRuntimeFromConfig>>[\"registry\"] }> {\n const cwd = process.cwd();\n const searchDir = path.resolve(cwd, pathOpt ?? \".\");\n const stepLog = verbose ? (msg: string) => process.stderr.write(`[agent-tool] ${msg}\\n`) : undefined;\n if (stepLog) stepLog(`Loading tool config from ${searchDir}`);\n const config = findAndLoadToolConfig(searchDir);\n let sandboxRoot = cwd;\n if (config.sandboxedPath && typeof config.sandboxedPath === \"string\" && config.configPath) {\n sandboxRoot = resolveSandboxedPath(config.configPath, config.sandboxedPath);\n }\n if (stepLog) {\n if (config.configPath) {\n const n = Array.isArray(config.tools) ? config.tools.length : 0;\n stepLog(`Config: ${config.configPath} (${n} tool(s)), sandbox: ${sandboxRoot}`);\n } else {\n stepLog(\"No tool.yaml found\");\n }\n }\n const coreConfig = { sandboxRoot, allowedHosts: [] as string[] };\n const result = await createRuntimeFromConfig({\n coreTools: coreConfig,\n configFilePath: config.configPath,\n stepLog,\n });\n if (stepLog) stepLog(`Registered ${result.registry.snapshot().length} tool(s)`);\n return result;\n}\n\n/** Parse \"scope/name\" into { scope, name }; if no slash, scope is \"\", name is full. */\nfunction parseToolName(fullName: string): { scope: string; name: string } {\n const i = fullName.indexOf(\"/\");\n if (i < 0) return { scope: \"\", name: fullName };\n return { scope: fullName.slice(0, i), name: fullName.slice(i + 1) };\n}\n\nfunction parseArgv(argv: string[]): CliArgs {\n const args = argv.slice(2);\n let command: CliCommand = \"help\";\n let startSub: StartSubcommand = \"http\";\n let help = false;\n let verbose = false;\n let mcpStdio = false;\n let pathOpt = \"\";\n let extensionName = \"\";\n let outDir = \"\";\n let include: string[] = [];\n let includeN8n = false;\n let toolName = \"\";\n let toolArgsJson = \"{}\";\n let port = 3000;\n let host = \"127.0.0.1\";\n\n const commands: CliCommand[] = [\n \"init\", \"build\", \"serve\", \"list\", \"ls\", \"show\", \"describe\", \"run\", \"start\", \"help\",\n ];\n const startSubcommands: StartSubcommand[] = [\"mcp\", \"http\"];\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--help\" || arg === \"-h\") {\n help = true;\n } else if (arg === \"--verbose\" || arg === \"-v\") {\n verbose = true;\n } else if (arg === \"--stdio\") {\n mcpStdio = true;\n } else if (arg === \"--path\" || arg === \"-p\") {\n pathOpt = path.resolve(process.cwd(), args[++i] ?? \"\");\n } else if (arg === \"--out\" || arg === \"-o\") {\n outDir = path.resolve(process.cwd(), args[++i] ?? \"\");\n } else if (arg === \"--include\" || arg === \"-i\") {\n const v = args[++i];\n if (v) include.push(v);\n } else if (arg === \"--include-n8n\") {\n includeN8n = true;\n } else if (arg === \"--port\") {\n const v = args[++i];\n if (v !== undefined) port = parseInt(v, 10) || 3000;\n } else if (arg === \"--host\") {\n const v = args[++i];\n if (v !== undefined) host = v;\n } else if (arg && !arg.startsWith(\"-\") && commands.includes(arg as CliCommand)) {\n command = arg as CliCommand;\n const nextArg = args[i + 1];\n if (command === \"init\" && nextArg !== undefined && !nextArg.startsWith(\"-\")) {\n extensionName = args[++i] ?? \"\";\n } else if ((command === \"show\" || command === \"describe\") && nextArg !== undefined && !nextArg.startsWith(\"-\")) {\n toolName = args[++i] ?? \"\";\n } else if (command === \"run\" && nextArg !== undefined && !nextArg.startsWith(\"-\")) {\n toolName = args[++i] ?? \"\";\n const runNext = args[i + 1];\n if (runNext !== undefined && !runNext.startsWith(\"-\")) {\n toolArgsJson = args[++i] ?? \"{}\";\n }\n } else if (command === \"start\" && nextArg !== undefined && !nextArg.startsWith(\"-\") && startSubcommands.includes(nextArg as StartSubcommand)) {\n startSub = args[++i] as StartSubcommand;\n }\n }\n }\n\n return { command, startSub, help, verbose, mcpStdio, pathOpt, extensionName, outDir, include, includeN8n, toolName, toolArgsJson, port, host };\n}\n\nfunction printHelp(): void {\n const bin = \"agent-tool\";\n process.stdout.write(`\nUsage: ${bin} <command> [options] [args]\n\nPrimary commands:\n ls List all tools (scope, name, description).\n describe <tool path> Show tool details (schema, capabilities, etc.).\n run <tool path> [params] Run a tool. Params: JSON, e.g. '{\"path\":\"README.md\"}'\n start mcp Start MCP server (default: Streamable HTTP; use --stdio for stdio).\n start http Start OpenAPI HTTP server (API + Swagger).\n\nOther commands:\n init [extension name] Create extension scaffold (folder + src + hello-world + generate-manifest + index + package.json). With no name: create MCP project in --path. Then: cd <folder> && npm install && npm run build.\n build Scan folder for @tool / SKILL / n8n, generate MCP npm package.\n serve Start the generated MCP server (stdio) for testing.\n list Alias for ls.\n show <tool> Alias for describe.\n help Show this help.\n\nOptions:\n --path, -p <path> For init/build/serve: path (default: cwd).\n --out, -o <path> For build: output directory.\n --include, -i <glob> For build: glob for TS files.\n --include-n8n For build: include n8n workflow tools.\n --verbose, -v Print step logs (config load, cache, tools registered).\n --stdio For start mcp: use stdio transport (default: Streamable HTTP).\n --port <number> For start mcp/http: port (default: 3000).\n --host <string> For start mcp/http: host (default: 127.0.0.1).\n --help, -h Show this help.\n\nExamples:\n ${bin} ls\n ${bin} describe core.fs.readText\n ${bin} run core.fs.readText '{\"path\":\"README.md\"}'\n ${bin} start mcp\n ${bin} start mcp --stdio\n ${bin} start http --port 3000\n ${bin} build --path . --out dist\n ${bin} init my-extension\n\nFor agent run (ReAct + agent.yaml): npx @easynet/agent-orchestra run \"task\" -c agent.yaml\n`);\n}\n\nasync function cmdInitExtension(extensionName: string, pathOpt: string): Promise<number> {\n try {\n const parentDir = pathOpt ? path.resolve(process.cwd(), pathOpt) : undefined;\n const { targetPath, filesCreated } = await initExtension({\n extensionName,\n parentDir: parentDir || process.cwd(),\n });\n process.stdout.write(\n `Extension scaffold at ${targetPath}\\nCreated: ${filesCreated.join(\", \")}\\nNext: cd ${path.basename(targetPath)} && npm install && npm run build\\n`,\n );\n return 0;\n } catch (err) {\n process.stderr.write(`Init extension failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n return 1;\n }\n}\n\nasync function cmdInit(pathOpt: string): Promise<number> {\n try {\n const { targetPath, filesCreated } = await initProject({ targetPath: pathOpt || undefined });\n process.stdout.write(`Initialized project at ${targetPath}\\nCreated: ${filesCreated.join(\", \")}\\nNext: npm install && npm run build\\n`);\n return 0;\n } catch (err) {\n process.stderr.write(`Init failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n return 1;\n }\n}\n\nasync function cmdBuild(\n pathOpt: string,\n outDir: string,\n include: string[],\n includeN8n: boolean,\n): Promise<number> {\n try {\n const result = await buildMcpPackage({\n projectPath: pathOpt || undefined,\n outDir: outDir || undefined,\n include: include.length > 0 ? include : undefined,\n includeN8n: includeN8n || undefined,\n });\n process.stdout.write(\n `Built ${result.toolCount} tool(s) -> ${result.outDir}\\nEntry: ${result.entryPath}\\nmcp.json: ${result.mcpJsonPath}\\n`,\n );\n return 0;\n } catch (err) {\n process.stderr.write(`Build failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n return 1;\n }\n}\n\nasync function cmdServe(pathOpt: string): Promise<number> {\n try {\n const { process: child } = await runMcpServer({ path: pathOpt || undefined });\n child.stdin?.pipe(process.stdin);\n child.stdout?.pipe(process.stdout);\n process.stdin?.unref();\n const exit = new Promise<number>((resolve) => {\n child.on(\"close\", (code) => resolve(code ?? 0));\n });\n return exit;\n } catch (err) {\n process.stderr.write(`Serve failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n return 1;\n }\n}\n\nconst LS_DESC_MAX = 72;\n\n/** Format tool list as table: SCOPE (full package name) | NAME | DESCRIPTION */\nfunction formatLsOutput(specs: ToolSpec[]): string {\n const rows = specs.map((spec) => {\n const { name } = parseToolName(spec.name);\n const scope = getDisplayScope(spec.name, spec.kind, spec.version);\n const desc = (spec.description ?? \"\")\n .replace(/\\n/g, \" \")\n .trim()\n .slice(0, LS_DESC_MAX);\n return { scope, name, description: desc || \"(no description)\" };\n });\n\n const scopeW = Math.max(6, ...rows.map((r) => r.scope.length));\n const nameW = Math.max(4, ...rows.map((r) => r.name.length));\n\n const sep = `${\"─\".repeat(scopeW)}┬${\"─\".repeat(nameW)}┬${\"─\".repeat(LS_DESC_MAX + 2)}`;\n const header = [\n \"SCOPE\".padEnd(scopeW),\n \"NAME\".padEnd(nameW),\n \"DESCRIPTION\",\n ].join(\" │ \");\n const lines = [\n header,\n sep,\n ...rows.map((r) =>\n [\n r.scope.padEnd(scopeW),\n r.name.padEnd(nameW),\n r.description,\n ].join(\" │ \")\n ),\n ];\n return lines.join(\"\\n\");\n}\n\n/** Format single tool details (describe) with clear sections */\nfunction formatDescribeOutput(spec: ToolSpec): string {\n const { name: localName } = parseToolName(spec.name);\n const scope = getDisplayScope(spec.name, spec.kind, spec.version);\n const sections: string[] = [];\n\n sections.push(\"┌─ Tool\");\n sections.push(`│ name: ${spec.name}`);\n sections.push(`│ scope: ${scope}`);\n sections.push(`│ localName: ${localName}`);\n sections.push(`│ version: ${spec.version}`);\n sections.push(`│ kind: ${spec.kind}`);\n sections.push(\"├─ Description\");\n sections.push(`│ ${(spec.description ?? \"(none)\").replace(/\\n/g, \"\\n│ \")}`);\n sections.push(\"├─ Tags\");\n sections.push(`│ ${spec.tags?.length ? spec.tags.join(\", \") : \"(none)\"}`);\n sections.push(\"├─ Capabilities\");\n sections.push(`│ ${spec.capabilities.join(\", \")}`);\n if (spec._meta?.hitl?.sideEffect) {\n sections.push(\"├─ HITL\");\n sections.push(`│ sideEffect: ${spec._meta.hitl.sideEffect}`);\n }\n sections.push(\"├─ Input schema\");\n sections.push(\n \"│ \" + JSON.stringify(spec.inputSchema, null, 2).replace(/\\n/g, \"\\n│ \")\n );\n sections.push(\"└─ Output schema\");\n sections.push(\n \" \" + JSON.stringify(spec.outputSchema, null, 2).replace(/\\n/g, \"\\n \")\n );\n\n return sections.join(\"\\n\");\n}\n\nasync function cmdLs(pathOpt?: string, verbose = false): Promise<number> {\n try {\n const { registry } = await getRuntimeWithTools(pathOpt, verbose);\n const specs = registry.snapshot();\n if (specs.length === 0) {\n process.stdout.write(\"No tools registered.\\n\");\n const cwd = process.cwd();\n const searchDir = path.resolve(cwd, pathOpt ?? \".\");\n const config = findAndLoadToolConfig(searchDir);\n const hasNpmTools = Array.isArray(config.tools) && config.tools.some((t) => typeof t === \"string\" && t.startsWith(\"npm:\"));\n if (hasNpmTools) {\n process.stdout.write(\n \"Tip: Install builtin tools in this directory so 'agent-tool ls' finds them: npm init -y && npm install @easynet/agent-tool-buildin\\n\"\n );\n }\n return 0;\n }\n specs.sort((a, b) => a.name.localeCompare(b.name));\n process.stdout.write(formatLsOutput(specs) + \"\\n\");\n return 0;\n } catch (err) {\n process.stderr.write(`ls failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n return 1;\n }\n}\n\nasync function cmdDescribe(toolName: string, pathOpt?: string, verbose = false): Promise<number> {\n if (!toolName.trim()) {\n process.stderr.write(\"Usage: agent-tool describe <tool path>\\n\");\n return 1;\n }\n try {\n const { registry } = await getRuntimeWithTools(pathOpt, verbose);\n const registryName = resolveToolDescriptor(toolName.trim());\n const spec = registry.get(registryName);\n if (!spec) {\n process.stderr.write(`Tool not found: ${toolName}\\n`);\n return 1;\n }\n process.stdout.write(formatDescribeOutput(enrichSpecWithCanonicalSchema(spec)) + \"\\n\");\n return 0;\n } catch (err) {\n process.stderr.write(`describe failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n return 1;\n }\n}\n\nfunction defaultExecContext(): ExecContext {\n return {\n requestId: `cli-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n taskId: `task-${Date.now()}`,\n permissions: [\n \"read:web\",\n \"read:fs\",\n \"write:fs\",\n \"read:db\",\n \"write:db\",\n \"network\",\n \"workflow\",\n \"danger:destructive\",\n \"exec\",\n ],\n };\n}\n\nasync function cmdRun(toolName: string, toolArgsJson: string, pathOpt?: string, verbose = false): Promise<number> {\n if (!toolName.trim()) {\n process.stderr.write(\"Usage: agent-tool run <tool path> [<json params>]\\n\");\n return 1;\n }\n let args: unknown = {};\n if (toolArgsJson.trim()) {\n try {\n args = JSON.parse(toolArgsJson) as unknown;\n } catch {\n process.stderr.write(\"Invalid JSON for parameters. Example: '{\\\"path\\\":\\\"README.md\\\"}'\\n\");\n return 1;\n }\n }\n try {\n const { runtime, registry } = await getRuntimeWithTools(pathOpt, verbose);\n const registryName = resolveToolDescriptor(toolName.trim());\n if (!registry.get(registryName)) {\n process.stderr.write(`Tool not found: ${toolName}\\n`);\n return 1;\n }\n const ctx = defaultExecContext();\n const result = await runtime.invoke(\n { tool: registryName, args, purpose: \"cli\" },\n ctx\n );\n if (result.ok) {\n process.stdout.write(JSON.stringify(result.result, null, 2) + \"\\n\");\n return 0;\n }\n process.stderr.write(`Tool error: ${result.error?.kind ?? \"unknown\"} - ${result.error?.message ?? \"\"}\\n`);\n return 1;\n } catch (err) {\n process.stderr.write(`Run failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n return 1;\n }\n}\n\nasync function cmdStartMcp(pathOpt?: string, verbose = false, stdio = false, port = 3000, host = \"127.0.0.1\"): Promise<number> {\n try {\n const { runtime } = await getRuntimeWithTools(pathOpt, verbose);\n if (stdio) {\n await runMCPServerOverStdio(runtime);\n return 0;\n }\n const streamable = await createMCPServerStreamableHttp(runtime, { port, host, path: \"/mcp\" });\n const { url, port: actualPort } = await streamable.listen(port, host);\n process.stdout.write(`MCP Streamable HTTP: ${url}\\n`);\n await new Promise<void>(() => {});\n return 0;\n } catch (err) {\n process.stderr.write(`start mcp failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n return 1;\n }\n}\n\nasync function cmdStartHttp(port: number, host: string, pathOpt?: string, verbose = false): Promise<number> {\n try {\n const { runtime } = await getRuntimeWithTools(pathOpt, verbose);\n const http = await createHttpService(runtime);\n const { port: actualPort, host: actualHost } = await http.listen({ port, host });\n const base = `http://${actualHost}:${actualPort}`;\n process.stdout.write(`API: ${base}/invoke (POST), ${base}/tools (GET)\\n`);\n process.stdout.write(`Swagger UI: ${base}/ (spec: ${base}/openapi.json)\\n`);\n await new Promise<void>(() => {});\n return 0;\n } catch (err) {\n process.stderr.write(`start http failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n return 1;\n }\n}\n\nasync function main(argv: string[] = process.argv): Promise<number> {\n const { command, startSub, help, verbose, mcpStdio, pathOpt, extensionName, outDir, include, includeN8n, toolName, toolArgsJson, port, host } =\n parseArgv(argv);\n\n if (help || command === \"help\") {\n printHelp();\n return 0;\n }\n\n if (command === \"init\") {\n if (extensionName) return cmdInitExtension(extensionName, pathOpt);\n return cmdInit(pathOpt);\n }\n if (command === \"build\") return cmdBuild(pathOpt, outDir, include, includeN8n);\n if (command === \"serve\") return cmdServe(pathOpt);\n if (command === \"ls\" || command === \"list\") return cmdLs(pathOpt, verbose);\n if (command === \"describe\" || command === \"show\") return cmdDescribe(toolName, pathOpt, verbose);\n if (command === \"run\") return cmdRun(toolName, toolArgsJson, pathOpt, verbose);\n if (command === \"start\") {\n if (startSub === \"mcp\") return cmdStartMcp(pathOpt, verbose, mcpStdio, port, host);\n if (startSub === \"http\") return cmdStartHttp(port, host, pathOpt, verbose);\n process.stderr.write(\"Usage: agent-tool start mcp | agent-tool start http [--port 3000] [--host 127.0.0.1]\\n\");\n return 1;\n }\n\n printHelp();\n return 1;\n}\n\n/** Run CLI with the given argv (same shape as process.argv). Exported for tests. */\nexport async function run(argv: string[]): Promise<number> {\n return main(argv);\n}\n\nconst scriptPath = fileURLToPath(import.meta.url);\nconst invokedPath = process.argv[1];\nlet isMain = typeof process !== \"undefined\" && invokedPath !== undefined && invokedPath === scriptPath;\nif (!isMain && invokedPath) {\n try {\n isMain = realpathSync(invokedPath) === realpathSync(scriptPath);\n } catch {\n // keep isMain false if realpath fails\n }\n}\n\nif (isMain) {\n main()\n .then((code) => process.exit(code))\n .catch((err) => {\n process.stderr.write(String(err?.message ?? err) + \"\\n\");\n process.exit(1);\n });\n}\n"]}
@@ -4,6 +4,10 @@
4
4
  * Packs the package, extracts it, runs npm install in that directory so each
5
5
  * downloaded package has its own node_modules—no sharing with the host project—
6
6
  * to avoid package conflicts.
7
+ *
8
+ * When version is "latest": we resolve the actual version from the npm registry first.
9
+ * Cache is used only if it contains that exact version; otherwise we reinstall so the
10
+ * cache always reflects the true latest.
7
11
  */
8
12
  export interface EnsurePackageInCacheOptions {
9
13
  /** Custom cache root (default: ~/.agent/cache) */
@@ -11,10 +15,20 @@ export interface EnsurePackageInCacheOptions {
11
15
  /** Called after npm install; use to add symlinks/aliases in cacheDir/node_modules */
12
16
  afterInstall?: (cacheDir: string, packageName: string) => void;
13
17
  }
18
+ /**
19
+ * Resolve the actual version for "latest" from the npm registry (sync).
20
+ * Uses `npm view <package> version` (dist-tags.latest).
21
+ * @throws Error if the registry cannot be reached or the package does not exist.
22
+ */
23
+ export declare function resolveLatestVersionFromRegistry(packageName: string): string;
14
24
  /**
15
25
  * Ensure the npm package is in the cache: pack, extract, npm install.
16
26
  * Returns the package root path (with its own node_modules).
17
27
  * Cache layout: ~/.agent/cache/<scope>/<name>/<version>/ (like Maven .m2).
28
+ *
29
+ * When version is "latest" (or empty): we resolve the actual version from the registry first.
30
+ * If cache already contains that exact version, we reuse it. Otherwise we install (or reinstall)
31
+ * so the cache always reflects the true latest.
18
32
  */
19
33
  export declare function ensurePackageInCache(packageName: string, version?: string, options?: EnsurePackageInCacheOptions): string;
20
34
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"npmCache.d.ts","sourceRoot":"","sources":["../../src/utils/npmCache.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,MAAM,WAAW,2BAA2B;IAC1C,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qFAAqF;IACrF,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;CAChE;AA8BD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,MAAiB,EAC1B,OAAO,GAAE,2BAAgC,GACxC,MAAM,CA4DR;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAY/D;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAI3E"}
1
+ {"version":3,"file":"npmCache.d.ts","sourceRoot":"","sources":["../../src/utils/npmCache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,MAAM,WAAW,2BAA2B;IAC1C,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qFAAqF;IACrF,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;CAChE;AAUD;;;;GAIG;AACH,wBAAgB,gCAAgC,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAgB5E;AA0CD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,MAAiB,EAC1B,OAAO,GAAE,2BAAgC,GACxC,MAAM,CAgGR;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAY/D;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAI3E"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@easynet/agent-tool",
3
- "version": "1.0.34",
3
+ "version": "1.0.36",
4
4
  "description": "MCP build: init → build → run. Turn your project (@tool, SKILL, n8n) into a standalone MCP npm server (no framework embedding, no package conflict).",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/api/adapters/LangChainToolsHub.ts","../src/api/createAgentTools.ts"],"names":[],"mappings":"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","file":"chunk-6UOHURU4.js","sourcesContent":["/**\n * Exposes all tools from a ToolRegistry + PTCRuntime as LangChain tools\n * for local agent use (e.g. with createReactAgent, AgentExecutor).\n *\n * For most users, use createAgentTools() which loads from tools.yaml and returns\n * StructuredTool[]. Use LangChainToolsHub when you need a custom runtime or ctxFactory.\n *\n * Use: new LangChainToolsHub(runtime, ctxFactory).getLangChainTools()\n */\n\nimport { DynamicStructuredTool, type StructuredToolInterface } from \"@langchain/core/tools\";\nimport type { PTCRuntime } from \"../../core/runtime/PTCRuntime.js\";\nimport type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport type { ToolIntent } from \"../../core/types/ToolIntent.js\";\nimport { enrichSpecWithCanonicalSchema } from \"../../tools/util/canonicalCoreSchemas.js\";\nimport { LANGCHAIN_KIND } from \"../../tools/langchain/types.js\";\n\n/**\n * If inputSchema is { type: \"object\", properties: { args: { type: \"object\", properties: {...} } }, required: [\"args\"] },\n * return the inner args schema so the LLM can pass { path: \".\" } instead of { args: { path: \".\" } }.\n */\nfunction schemaForLangChain(inputSchema: object): Record<string, unknown> {\n const s = inputSchema as Record<string, unknown>;\n if (s?.type !== \"object\" || !s.properties || typeof s.properties !== \"object\") {\n return s;\n }\n const props = s.properties as Record<string, unknown>;\n const args = props.args;\n if (\n args != null &&\n typeof args === \"object\" &&\n (args as Record<string, unknown>).type === \"object\" &&\n (args as Record<string, unknown>).properties != null\n ) {\n return args as Record<string, unknown>;\n }\n return s;\n}\n\nexport type ExecContextFactory = () => ExecContext;\n\nconst DEFAULT_CTX_FACTORY: ExecContextFactory = () => ({\n requestId: `lc-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n taskId: `task-${Date.now()}`,\n permissions: [\n \"read:web\",\n \"read:fs\",\n \"write:fs\",\n \"read:db\",\n \"write:db\",\n \"network\",\n \"workflow\",\n \"danger:destructive\",\n ],\n});\n\n/**\n * Hub that wraps PTCRuntime and exposes every registered tool as a LangChain\n * StructuredTool (DynamicStructuredTool), so local agents (LangChain AgentExecutor,\n * createReactAgent, etc.) can use the same tools as MCP and OpenAPI.\n */\nexport class LangChainToolsHub {\n constructor(\n private readonly runtime: PTCRuntime,\n private readonly ctxFactory: ExecContextFactory = DEFAULT_CTX_FACTORY,\n ) {}\n\n /**\n * Returns all registered tools as LangChain StructuredTool[].\n * Each tool invokes the runtime through the full pipeline (policy, HITL, etc.).\n */\n getLangChainTools(): StructuredToolInterface[] {\n const registry = this.runtime.getRegistry();\n const specs = registry.snapshot();\n\n return specs.map((spec) => this.specToLangChainTool(spec));\n }\n\n /**\n * Returns LangChain tools for a subset of tools (by name or query).\n */\n getLangChainToolsForNames(toolNames: string[]): StructuredToolInterface[] {\n const registry = this.runtime.getRegistry();\n const set = new Set(toolNames);\n const specs = registry.snapshot().filter((s) => set.has(s.name));\n return specs.map((spec) => this.specToLangChainTool(spec));\n }\n\n private specToLangChainTool(spec: ToolSpec): DynamicStructuredTool {\n const runtime = this.runtime;\n const ctxFactory = this.ctxFactory;\n const enriched = enrichSpecWithCanonicalSchema(spec);\n\n const schema = schemaForLangChain(enriched.inputSchema);\n return new DynamicStructuredTool({\n name: spec.name,\n description: spec.description ?? `Tool: ${spec.name}`,\n schema,\n func: async (args: Record<string, unknown>): Promise<string> => {\n const intent: ToolIntent = {\n tool: spec.name,\n args: args ?? {},\n purpose: LANGCHAIN_KIND,\n };\n const ctx = ctxFactory();\n const result = await runtime.invoke(intent, ctx);\n\n if (result.ok) {\n return typeof result.result === \"string\"\n ? result.result\n : JSON.stringify(result.result);\n }\n\n const err = result.error;\n const message = err?.message ?? \"Tool failed\";\n const details = err?.details;\n return JSON.stringify(\n details != null ? { error: message, details } : { error: message },\n );\n },\n });\n }\n}\n","/**\n * Create LangChain tools from config (sync or async). Uses PTCRuntime + registry\n * and exposes tools via LangChainToolsHub. All invokes go through PTC Intent.\n */\n\nimport { loadToolConfig, resolveSandboxedPath } from \"../tools/util/toolConfig.js\";\nimport {\n expandToolDescriptorsToRegistryNames,\n isBarePackageDescriptor,\n} from \"../tools/util/toolDescriptor.js\";\nimport { createRuntimeFromConfigSync, createRuntimeFromConfig } from \"./runtimeFromConfig.js\";\nimport type { CreateRuntimeOptions } from \"./runtimeFromConfig.js\";\nimport { LangChainToolsHub } from \"./adapters/LangChainToolsHub.js\";\nimport type { StructuredToolInterface } from \"@langchain/core/tools\";\n\nexport interface CreateAgentToolsOptions extends CreateRuntimeOptions {\n /** Path to tool.yaml; when set, only tools listed there are returned; sandboxedPath from it is used as sandboxRoot */\n configFilePath?: string;\n /** Project path for async loading (use createLangChainToolsAsync) */\n projectPath?: string;\n}\n\n/** Merge host lists from multiple sources (e.g. tool.yaml + programmatic). Union, dedup, preserves order. */\nfunction mergeHostLists(a?: string[], b?: string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const list of [a ?? [], b ?? []]) {\n for (const h of list) {\n if (!seen.has(h)) {\n seen.add(h);\n out.push(h);\n }\n }\n }\n return out;\n}\n\nfunction runtimeOptionsFromConfig(opts: CreateAgentToolsOptions): CreateRuntimeOptions {\n const coreTools = opts.coreTools ?? { sandboxRoot: process.cwd(), allowedHosts: [] };\n if (opts.configFilePath) {\n const toolConfig = loadToolConfig(opts.configFilePath);\n const updates: {\n sandboxRoot?: string;\n allowedHosts?: string[];\n blockedHosts?: string[];\n blockedCidrs?: string[];\n } = {};\n if (toolConfig.sandboxedPath && typeof toolConfig.sandboxedPath === \"string\") {\n updates.sandboxRoot = resolveSandboxedPath(opts.configFilePath, toolConfig.sandboxedPath);\n }\n // Smart merge: union of allowedHosts and blockedHosts from yaml + programmatic (both lists always applied)\n updates.allowedHosts = mergeHostLists(coreTools.allowedHosts, toolConfig.allowedHosts);\n updates.blockedHosts = mergeHostLists(coreTools.blockedHosts, toolConfig.blockedHosts);\n if (Array.isArray(toolConfig.blockedCidrs) && toolConfig.blockedCidrs.length > 0) {\n updates.blockedCidrs = toolConfig.blockedCidrs;\n } else if (coreTools.blockedCidrs?.length) {\n updates.blockedCidrs = coreTools.blockedCidrs;\n }\n if (Object.keys(updates).length > 0) {\n return { ...opts, coreTools: { ...coreTools, ...updates } };\n }\n }\n return { ...opts, coreTools };\n}\n\n/**\n * Create LangChain tools synchronously. When configFilePath is set, returns only\n * tools listed in that file (and that exist in the registry). If tool.yaml has\n * sandboxedPath, fs tools can only access that directory.\n */\nexport function createAgentTools(\n options?: CreateAgentToolsOptions | string\n): StructuredToolInterface[] {\n const opts: CreateAgentToolsOptions =\n typeof options === \"string\" ? { configFilePath: options } : options ?? {};\n const runtimeOpts = runtimeOptionsFromConfig(opts);\n const { runtime } = createRuntimeFromConfigSync(runtimeOpts);\n const hub = new LangChainToolsHub(runtime);\n\n if (opts.configFilePath) {\n const toolConfig = loadToolConfig(opts.configFilePath);\n const names = Array.isArray(toolConfig.tools) ? toolConfig.tools : [];\n if (names.length > 0) {\n const registryNames = runtime.getRegistry().snapshot().map((s) => s.name);\n const allBarePackages = names.every((n) => isBarePackageDescriptor(String(n)));\n if (allBarePackages) {\n return hub.getLangChainTools();\n }\n const expanded = expandToolDescriptorsToRegistryNames(names, registryNames);\n return hub.getLangChainToolsForNames(expanded);\n }\n }\n\n return hub.getLangChainTools();\n}\n\n/**\n * Create LangChain tools asynchronously. Use when projectPath is set to load\n * tools from the project before building the tool list.\n */\nexport async function createLangChainToolsAsync(\n options: CreateAgentToolsOptions = {}\n): Promise<StructuredToolInterface[]> {\n const runtimeOpts = runtimeOptionsFromConfig(options);\n const { runtime } = await createRuntimeFromConfig(runtimeOpts);\n const hub = new LangChainToolsHub(runtime);\n\n if (options.configFilePath) {\n const toolConfig = loadToolConfig(options.configFilePath);\n const names = Array.isArray(toolConfig.tools) ? toolConfig.tools : [];\n if (names.length > 0) {\n const registryNames = runtime.getRegistry().snapshot().map((s) => s.name);\n const allBarePackages = names.every((n) => isBarePackageDescriptor(String(n)));\n if (allBarePackages) {\n return hub.getLangChainTools();\n }\n const expanded = expandToolDescriptorsToRegistryNames(names, registryNames);\n return hub.getLangChainToolsForNames(expanded);\n }\n }\n\n return hub.getLangChainTools();\n}\n"]}