@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,33 +1,208 @@
1
1
  #!/usr/bin/env node
2
2
  'use strict';
3
3
 
4
- var chunkLOGUQGCL_cjs = require('../../chunk-LOGUQGCL.cjs');
5
- var chunkETZKGTTF_cjs = require('../../chunk-ETZKGTTF.cjs');
6
- var chunkPKUSCCS6_cjs = require('../../chunk-PKUSCCS6.cjs');
4
+ var chunkWFRHBW32_cjs = require('../../chunk-WFRHBW32.cjs');
5
+ var chunk5LCB63L7_cjs = require('../../chunk-5LCB63L7.cjs');
6
+ var chunkLP7KHBA3_cjs = require('../../chunk-LP7KHBA3.cjs');
7
7
  require('../../chunk-TOSPHMYU.cjs');
8
8
  var chunk4KTWJQ32_cjs = require('../../chunk-4KTWJQ32.cjs');
9
9
  require('../../chunk-DYDNPIV2.cjs');
10
- var path = require('path');
10
+ var path2 = require('path');
11
11
  var fs = require('fs');
12
12
  var url = require('url');
13
+ var fs$1 = require('fs/promises');
13
14
 
14
15
  var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
15
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
16
+ function _interopNamespace(e) {
17
+ if (e && e.__esModule) return e;
18
+ var n = Object.create(null);
19
+ if (e) {
20
+ Object.keys(e).forEach(function (k) {
21
+ if (k !== 'default') {
22
+ var d = Object.getOwnPropertyDescriptor(e, k);
23
+ Object.defineProperty(n, k, d.get ? d : {
24
+ enumerable: true,
25
+ get: function () { return e[k]; }
26
+ });
27
+ }
28
+ });
29
+ }
30
+ n.default = e;
31
+ return Object.freeze(n);
32
+ }
33
+
34
+ var path2__namespace = /*#__PURE__*/_interopNamespace(path2);
35
+ var fs__namespace = /*#__PURE__*/_interopNamespace(fs$1);
36
+
37
+ function toPackageName(name) {
38
+ return name.trim().toLowerCase().replace(/\s+/g, "-").replace(/[^a-z0-9-]/g, "");
39
+ }
40
+ function templates(packageName) {
41
+ return {
42
+ "package.json": `{
43
+ "name": "${packageName}",
44
+ "version": "0.0.1",
45
+ "description": "Tools extension for @easynet/agent-tool",
46
+ "type": "module",
47
+ "main": "./dist/index.js",
48
+ "module": "./dist/index.js",
49
+ "types": "./dist/index.d.ts",
50
+ "exports": {
51
+ ".": {
52
+ "types": "./dist/index.d.ts",
53
+ "import": "./dist/index.js",
54
+ "default": "./dist/index.js"
55
+ }
56
+ },
57
+ "files": ["dist"],
58
+ "scripts": {
59
+ "build": "tsx generate-manifest.ts && tsc -p tsconfig.build.json",
60
+ "clean": "rm -rf dist",
61
+ "pretest": "npm run build",
62
+ "test": "vitest run"
63
+ },
64
+ "peerDependencies": {
65
+ "@easynet/agent-tool": ">=1.0.31"
66
+ },
67
+ "devDependencies": {
68
+ "@easynet/agent-tool": "^1.0.34",
69
+ "tsx": "^4.19.2",
70
+ "typescript": "~5.7.2",
71
+ "vitest": "^2.1.8"
72
+ },
73
+ "license": "MIT"
74
+ }
75
+ `,
76
+ "tsconfig.json": `{
77
+ "compilerOptions": {
78
+ "target": "ES2022",
79
+ "module": "NodeNext",
80
+ "moduleResolution": "NodeNext",
81
+ "lib": ["ES2022"],
82
+ "strict": true,
83
+ "skipLibCheck": true,
84
+ "declaration": true,
85
+ "declarationMap": true,
86
+ "sourceMap": true,
87
+ "outDir": "./dist",
88
+ "rootDir": ".",
89
+ "resolveJsonModule": true,
90
+ "isolatedModules": true
91
+ },
92
+ "include": ["./**/*.ts"],
93
+ "exclude": ["node_modules", "dist", "**/dist/**"]
94
+ }
95
+ `,
96
+ "tsconfig.build.json": `{
97
+ "extends": "./tsconfig.json",
98
+ "compilerOptions": { "rootDir": ".", "outDir": "dist" },
99
+ "include": ["./**/*.ts"],
100
+ "exclude": ["node_modules", "dist", "**/dist/**", "**/tsconfig*.json", "**/*.test.ts", "test", "scripts", "generate-manifest.ts"]
101
+ }
102
+ `,
103
+ "generate-manifest.ts": `/**
104
+ * Build step: run framework generateManifest (scan src, emit manifest).
105
+ * Tool names in the manifest are the exported function names.
106
+ */
107
+ import { generateManifest } from "@easynet/agent-tool";
108
+
109
+ generateManifest(process.cwd());
110
+ `,
111
+ "index.ts": `import { createExtension } from "@easynet/agent-tool";
112
+ import type { ToolRegistry, ToolAdapter } from "@easynet/agent-tool";
113
+
114
+ const ext = createExtension({ importMeta: import.meta });
115
+
116
+ /** Framework contract: extension exports register(registry, options). */
117
+ export function register(
118
+ registry: ToolRegistry,
119
+ options?: { only?: string[]; namePrefixes?: string[] },
120
+ ): ToolAdapter {
121
+ return ext.register(registry, options ?? {});
122
+ }
123
+
124
+ export const getExtensionContext = ext.getContext;
125
+ export const runWithExtensionContext = ext.runWith;
126
+ `,
127
+ "src/helloWorld.ts": `/**
128
+ * A simple hello-world tool.
129
+ * @tool
130
+ * @effect none
131
+ */
132
+ export async function helloWorld(_args: Record<string, unknown>) {
133
+ return {
134
+ result: { message: "Hello, World!" },
135
+ evidence: [
136
+ {
137
+ type: "tool",
138
+ ref: "helloWorld",
139
+ summary: "Hello, World!",
140
+ createdAt: new Date().toISOString(),
141
+ },
142
+ ],
143
+ };
144
+ }
145
+ `,
146
+ "README.md": `# ${packageName}
147
+
148
+ Scaffolded by \`agent-tool init ${packageName}\`.
149
+
150
+ ## Quick start
151
+
152
+ \`\`\`bash
153
+ npm install
154
+ npm run build
155
+ \`\`\`
16
156
 
17
- var path__default = /*#__PURE__*/_interopDefault(path);
157
+ Add more tools under \`src/\` (export async functions with \`@tool\` JSDoc), then \`npm run build\` again.
18
158
 
159
+ ## Use in tool config
160
+
161
+ In your \`tool.yaml\` \`tools.packages\`:
162
+
163
+ \`\`\`yaml
164
+ tools:
165
+ packages:
166
+ file:./path/to/${packageName}: {}
167
+ \`\`\`
168
+
169
+ Or publish and use: \`npm:@your-scope/${packageName}\`
170
+ `
171
+ };
172
+ }
173
+ async function initExtension(options) {
174
+ const parent = path2__namespace.resolve(options.parentDir ?? process.cwd());
175
+ const name = options.extensionName.trim();
176
+ if (!name) {
177
+ throw new Error("Extension name is required");
178
+ }
179
+ const targetPath = path2__namespace.join(parent, name);
180
+ const packageName = toPackageName(name) || name.replace(/\s/g, "-").toLowerCase();
181
+ const filesCreated = [];
182
+ const tmpl = templates(packageName);
183
+ await fs__namespace.mkdir(targetPath, { recursive: true });
184
+ for (const [relPath, content] of Object.entries(tmpl)) {
185
+ const fullPath = path2__namespace.join(targetPath, relPath);
186
+ await fs__namespace.mkdir(path2__namespace.dirname(fullPath), { recursive: true });
187
+ await fs__namespace.writeFile(fullPath, content.trimStart(), "utf8");
188
+ filesCreated.push(relPath);
189
+ }
190
+ return { targetPath, filesCreated };
191
+ }
192
+
193
+ // src/utils/cli/index.ts
19
194
  ({
20
195
  sandboxRoot: process.cwd()});
21
196
  async function getRuntimeWithTools(pathOpt, verbose = false) {
22
197
  const cwd = process.cwd();
23
- const searchDir = path__default.default.resolve(cwd, pathOpt ?? ".");
198
+ const searchDir = path2__namespace.default.resolve(cwd, pathOpt ?? ".");
24
199
  const stepLog = verbose ? (msg) => process.stderr.write(`[agent-tool] ${msg}
25
200
  `) : void 0;
26
201
  if (stepLog) stepLog(`Loading tool config from ${searchDir}`);
27
- const config = chunkPKUSCCS6_cjs.findAndLoadToolConfig(searchDir);
202
+ const config = chunkLP7KHBA3_cjs.findAndLoadToolConfig(searchDir);
28
203
  let sandboxRoot = cwd;
29
204
  if (config.sandboxedPath && typeof config.sandboxedPath === "string" && config.configPath) {
30
- sandboxRoot = chunkPKUSCCS6_cjs.resolveSandboxedPath(config.configPath, config.sandboxedPath);
205
+ sandboxRoot = chunkLP7KHBA3_cjs.resolveSandboxedPath(config.configPath, config.sandboxedPath);
31
206
  }
32
207
  if (stepLog) {
33
208
  if (config.configPath) {
@@ -38,7 +213,7 @@ async function getRuntimeWithTools(pathOpt, verbose = false) {
38
213
  }
39
214
  }
40
215
  const coreConfig = { sandboxRoot, allowedHosts: [] };
41
- const result = await chunkPKUSCCS6_cjs.createRuntimeFromConfig({
216
+ const result = await chunkLP7KHBA3_cjs.createRuntimeFromConfig({
42
217
  coreTools: coreConfig,
43
218
  configFilePath: config.configPath,
44
219
  stepLog
@@ -59,6 +234,7 @@ function parseArgv(argv) {
59
234
  let verbose = false;
60
235
  let mcpStdio = false;
61
236
  let pathOpt = "";
237
+ let extensionName = "";
62
238
  let outDir = "";
63
239
  let include = [];
64
240
  let includeN8n = false;
@@ -88,9 +264,9 @@ function parseArgv(argv) {
88
264
  } else if (arg === "--stdio") {
89
265
  mcpStdio = true;
90
266
  } else if (arg === "--path" || arg === "-p") {
91
- pathOpt = path__default.default.resolve(process.cwd(), args[++i] ?? "");
267
+ pathOpt = path2__namespace.default.resolve(process.cwd(), args[++i] ?? "");
92
268
  } else if (arg === "--out" || arg === "-o") {
93
- outDir = path__default.default.resolve(process.cwd(), args[++i] ?? "");
269
+ outDir = path2__namespace.default.resolve(process.cwd(), args[++i] ?? "");
94
270
  } else if (arg === "--include" || arg === "-i") {
95
271
  const v = args[++i];
96
272
  if (v) include.push(v);
@@ -105,7 +281,9 @@ function parseArgv(argv) {
105
281
  } else if (arg && !arg.startsWith("-") && commands.includes(arg)) {
106
282
  command = arg;
107
283
  const nextArg = args[i + 1];
108
- if ((command === "show" || command === "describe") && nextArg !== void 0 && !nextArg.startsWith("-")) {
284
+ if (command === "init" && nextArg !== void 0 && !nextArg.startsWith("-")) {
285
+ extensionName = args[++i] ?? "";
286
+ } else if ((command === "show" || command === "describe") && nextArg !== void 0 && !nextArg.startsWith("-")) {
109
287
  toolName = args[++i] ?? "";
110
288
  } else if (command === "run" && nextArg !== void 0 && !nextArg.startsWith("-")) {
111
289
  toolName = args[++i] ?? "";
@@ -118,7 +296,7 @@ function parseArgv(argv) {
118
296
  }
119
297
  }
120
298
  }
121
- return { command, startSub, help, verbose, mcpStdio, pathOpt, outDir, include, includeN8n, toolName, toolArgsJson, port, host };
299
+ return { command, startSub, help, verbose, mcpStdio, pathOpt, extensionName, outDir, include, includeN8n, toolName, toolArgsJson, port, host };
122
300
  }
123
301
  function printHelp() {
124
302
  const bin = "agent-tool";
@@ -133,7 +311,7 @@ Primary commands:
133
311
  start http Start OpenAPI HTTP server (API + Swagger).
134
312
 
135
313
  Other commands:
136
- init Create project template. Then npm install && npm run build.
314
+ 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.
137
315
  build Scan folder for @tool / SKILL / n8n, generate MCP npm package.
138
316
  serve Start the generated MCP server (stdio) for testing.
139
317
  list Alias for ls.
@@ -159,13 +337,34 @@ Examples:
159
337
  ${bin} start mcp --stdio
160
338
  ${bin} start http --port 3000
161
339
  ${bin} build --path . --out dist
340
+ ${bin} init my-extension
162
341
 
163
342
  For agent run (ReAct + agent.yaml): npx @easynet/agent-orchestra run "task" -c agent.yaml
164
343
  `);
165
344
  }
345
+ async function cmdInitExtension(extensionName, pathOpt) {
346
+ try {
347
+ const parentDir = pathOpt ? path2__namespace.default.resolve(process.cwd(), pathOpt) : void 0;
348
+ const { targetPath, filesCreated } = await initExtension({
349
+ extensionName,
350
+ parentDir: parentDir || process.cwd()
351
+ });
352
+ process.stdout.write(
353
+ `Extension scaffold at ${targetPath}
354
+ Created: ${filesCreated.join(", ")}
355
+ Next: cd ${path2__namespace.default.basename(targetPath)} && npm install && npm run build
356
+ `
357
+ );
358
+ return 0;
359
+ } catch (err) {
360
+ process.stderr.write(`Init extension failed: ${err instanceof Error ? err.message : String(err)}
361
+ `);
362
+ return 1;
363
+ }
364
+ }
166
365
  async function cmdInit(pathOpt) {
167
366
  try {
168
- const { targetPath, filesCreated } = await chunkLOGUQGCL_cjs.initProject({ targetPath: pathOpt || void 0 });
367
+ const { targetPath, filesCreated } = await chunkWFRHBW32_cjs.initProject({ targetPath: pathOpt || void 0 });
169
368
  process.stdout.write(`Initialized project at ${targetPath}
170
369
  Created: ${filesCreated.join(", ")}
171
370
  Next: npm install && npm run build
@@ -179,7 +378,7 @@ Next: npm install && npm run build
179
378
  }
180
379
  async function cmdBuild(pathOpt, outDir, include, includeN8n) {
181
380
  try {
182
- const result = await chunkLOGUQGCL_cjs.buildMcpPackage({
381
+ const result = await chunkWFRHBW32_cjs.buildMcpPackage({
183
382
  projectPath: pathOpt || void 0,
184
383
  outDir: outDir || void 0,
185
384
  include: include.length > 0 ? include : void 0,
@@ -200,12 +399,12 @@ mcp.json: ${result.mcpJsonPath}
200
399
  }
201
400
  async function cmdServe(pathOpt) {
202
401
  try {
203
- const { process: child } = await chunkLOGUQGCL_cjs.runMcpServer({ path: pathOpt || void 0 });
402
+ const { process: child } = await chunkWFRHBW32_cjs.runMcpServer({ path: pathOpt || void 0 });
204
403
  child.stdin?.pipe(process.stdin);
205
404
  child.stdout?.pipe(process.stdout);
206
405
  process.stdin?.unref();
207
- const exit = new Promise((resolve) => {
208
- child.on("close", (code) => resolve(code ?? 0));
406
+ const exit = new Promise((resolve2) => {
407
+ child.on("close", (code) => resolve2(code ?? 0));
209
408
  });
210
409
  return exit;
211
410
  } catch (err) {
@@ -218,7 +417,7 @@ var LS_DESC_MAX = 72;
218
417
  function formatLsOutput(specs) {
219
418
  const rows = specs.map((spec) => {
220
419
  const { name } = parseToolName(spec.name);
221
- const scope = chunkPKUSCCS6_cjs.getDisplayScope(spec.name, spec.kind, spec.version);
420
+ const scope = chunkLP7KHBA3_cjs.getDisplayScope(spec.name, spec.kind, spec.version);
222
421
  const desc = (spec.description ?? "").replace(/\n/g, " ").trim().slice(0, LS_DESC_MAX);
223
422
  return { scope, name, description: desc || "(no description)" };
224
423
  });
@@ -245,7 +444,7 @@ function formatLsOutput(specs) {
245
444
  }
246
445
  function formatDescribeOutput(spec) {
247
446
  const { name: localName } = parseToolName(spec.name);
248
- const scope = chunkPKUSCCS6_cjs.getDisplayScope(spec.name, spec.kind, spec.version);
447
+ const scope = chunkLP7KHBA3_cjs.getDisplayScope(spec.name, spec.kind, spec.version);
249
448
  const sections = [];
250
449
  sections.push("\u250C\u2500 Tool");
251
450
  sections.push(`\u2502 name: ${spec.name}`);
@@ -280,8 +479,8 @@ async function cmdLs(pathOpt, verbose = false) {
280
479
  if (specs.length === 0) {
281
480
  process.stdout.write("No tools registered.\n");
282
481
  const cwd = process.cwd();
283
- const searchDir = path__default.default.resolve(cwd, pathOpt ?? ".");
284
- const config = chunkPKUSCCS6_cjs.findAndLoadToolConfig(searchDir);
482
+ const searchDir = path2__namespace.default.resolve(cwd, pathOpt ?? ".");
483
+ const config = chunkLP7KHBA3_cjs.findAndLoadToolConfig(searchDir);
285
484
  const hasNpmTools = Array.isArray(config.tools) && config.tools.some((t) => typeof t === "string" && t.startsWith("npm:"));
286
485
  if (hasNpmTools) {
287
486
  process.stdout.write(
@@ -306,7 +505,7 @@ async function cmdDescribe(toolName, pathOpt, verbose = false) {
306
505
  }
307
506
  try {
308
507
  const { registry } = await getRuntimeWithTools(pathOpt, verbose);
309
- const registryName = chunkPKUSCCS6_cjs.resolveToolDescriptor(toolName.trim());
508
+ const registryName = chunkLP7KHBA3_cjs.resolveToolDescriptor(toolName.trim());
310
509
  const spec = registry.get(registryName);
311
510
  if (!spec) {
312
511
  process.stderr.write(`Tool not found: ${toolName}
@@ -355,7 +554,7 @@ async function cmdRun(toolName, toolArgsJson, pathOpt, verbose = false) {
355
554
  }
356
555
  try {
357
556
  const { runtime, registry } = await getRuntimeWithTools(pathOpt, verbose);
358
- const registryName = chunkPKUSCCS6_cjs.resolveToolDescriptor(toolName.trim());
557
+ const registryName = chunkLP7KHBA3_cjs.resolveToolDescriptor(toolName.trim());
359
558
  if (!registry.get(registryName)) {
360
559
  process.stderr.write(`Tool not found: ${toolName}
361
560
  `);
@@ -383,10 +582,10 @@ async function cmdStartMcp(pathOpt, verbose = false, stdio = false, port = 3e3,
383
582
  try {
384
583
  const { runtime } = await getRuntimeWithTools(pathOpt, verbose);
385
584
  if (stdio) {
386
- await chunkETZKGTTF_cjs.runMCPServerOverStdio(runtime);
585
+ await chunk5LCB63L7_cjs.runMCPServerOverStdio(runtime);
387
586
  return 0;
388
587
  }
389
- const streamable = await chunkETZKGTTF_cjs.createMCPServerStreamableHttp(runtime, { port, host, path: "/mcp" });
588
+ const streamable = await chunk5LCB63L7_cjs.createMCPServerStreamableHttp(runtime, { port, host, path: "/mcp" });
390
589
  const { url, port: actualPort } = await streamable.listen(port, host);
391
590
  process.stdout.write(`MCP Streamable HTTP: ${url}
392
591
  `);
@@ -402,7 +601,7 @@ async function cmdStartMcp(pathOpt, verbose = false, stdio = false, port = 3e3,
402
601
  async function cmdStartHttp(port, host, pathOpt, verbose = false) {
403
602
  try {
404
603
  const { runtime } = await getRuntimeWithTools(pathOpt, verbose);
405
- const http = await chunkETZKGTTF_cjs.createHttpService(runtime);
604
+ const http = await chunk5LCB63L7_cjs.createHttpService(runtime);
406
605
  const { port: actualPort, host: actualHost } = await http.listen({ port, host });
407
606
  const base = `http://${actualHost}:${actualPort}`;
408
607
  process.stdout.write(`API: ${base}/invoke (POST), ${base}/tools (GET)
@@ -419,12 +618,15 @@ async function cmdStartHttp(port, host, pathOpt, verbose = false) {
419
618
  }
420
619
  }
421
620
  async function main(argv = process.argv) {
422
- const { command, startSub, help, verbose, mcpStdio, pathOpt, outDir, include, includeN8n, toolName, toolArgsJson, port, host } = parseArgv(argv);
621
+ const { command, startSub, help, verbose, mcpStdio, pathOpt, extensionName, outDir, include, includeN8n, toolName, toolArgsJson, port, host } = parseArgv(argv);
423
622
  if (help || command === "help") {
424
623
  printHelp();
425
624
  return 0;
426
625
  }
427
- if (command === "init") return cmdInit(pathOpt);
626
+ if (command === "init") {
627
+ if (extensionName) return cmdInitExtension(extensionName, pathOpt);
628
+ return cmdInit(pathOpt);
629
+ }
428
630
  if (command === "build") return cmdBuild(pathOpt, outDir, include, includeN8n);
429
631
  if (command === "serve") return cmdServe(pathOpt);
430
632
  if (command === "ls" || command === "list") return cmdLs(pathOpt, verbose);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/cli/index.ts"],"names":["path","findAndLoadToolConfig","resolveSandboxedPath","createRuntimeFromConfig","initProject","buildMcpPackage","runMcpServer","getDisplayScope","resolveToolDescriptor","enrichSpecWithCanonicalSchema","runMCPServerOverStdio","createMCPServerStreamableHttp","createHttpService","fileURLToPath","realpathSync"],"mappings":"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","file":"index.cjs","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","fs","findAndLoadToolConfig","resolveSandboxedPath","createRuntimeFromConfig","initProject","buildMcpPackage","runMcpServer","resolve","getDisplayScope","resolveToolDescriptor","enrichSpecWithCanonicalSchema","runMCPServerOverStdio","createMCPServerStreamableHttp","createHttpService","fileURLToPath","realpathSync"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,SAAS,cAAc,IAAA,EAAsB;AAC3C,EAAA,OAAO,IAAA,CACJ,IAAA,EAAK,CACL,WAAA,EAAY,CACZ,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CACnB,OAAA,CAAQ,aAAA,EAAe,EAAE,CAAA;AAC9B;AAEA,SAAS,UAAU,WAAA,EAAqB;AACtC,EAAA,OAAO;AAAA,IACL,cAAA,EAAgB,CAAA;AAAA,WAAA,EACP,WAAW,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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,IAiCpB,eAAA,EAAiB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,IAoBjB,qBAAA,EAAuB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,IAOvB,sBAAA,EAAwB,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA;AAAA,IAQxB,UAAA,EAAY,CAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,CAAA;AAAA,IAgBZ,mBAAA,EAAqB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,IAmBrB,WAAA,EAAa,KAAK,WAAW;;AAAA,gCAAA,EAEC,WAAW,CAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA,mBAAA,EAkBxB,WAAW,CAAA;AAAA;;AAAA,sCAAA,EAGQ,WAAW,CAAA;AAAA;AAAA,GAEjD;AACF;AAMA,eAAsB,cACpB,OAAA,EACyD;AACzD,EAAA,MAAM,SAAcA,gBAAA,CAAA,OAAA,CAAQ,OAAA,CAAQ,SAAA,IAAa,OAAA,CAAQ,KAAK,CAAA;AAC9D,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,aAAA,CAAc,IAAA,EAAK;AACxC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,EAC9C;AACA,EAAA,MAAM,UAAA,GAAkBA,gBAAA,CAAA,IAAA,CAAK,MAAA,EAAQ,IAAI,CAAA;AACzC,EAAA,MAAM,WAAA,GAAc,cAAc,IAAI,CAAA,IAAK,KAAK,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAAE,WAAA,EAAY;AAChF,EAAA,MAAM,eAAyB,EAAC;AAChC,EAAA,MAAM,IAAA,GAAO,UAAU,WAAW,CAAA;AAElC,EAAA,MAASC,aAAA,CAAA,KAAA,CAAM,UAAA,EAAY,EAAE,SAAA,EAAW,MAAM,CAAA;AAE9C,EAAA,KAAA,MAAW,CAAC,OAAA,EAAS,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AACrD,IAAA,MAAM,QAAA,GAAgBD,gBAAA,CAAA,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA;AAC9C,IAAA,MAASC,oBAAWD,gBAAA,CAAA,OAAA,CAAQ,QAAQ,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAC1D,IAAA,MAASC,aAAA,CAAA,SAAA,CAAU,QAAA,EAAU,OAAA,CAAQ,SAAA,IAAa,MAAM,CAAA;AACxD,IAAA,YAAA,CAAa,KAAK,OAAO,CAAA;AAAA,EAC3B;AAEA,EAAA,OAAO,EAAE,YAAY,YAAA,EAAa;AACpC;;;CC5I4B;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,GAAYD,wBAAAA,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,GAASE,wCAAsB,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,GAAcC,sCAAA,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,MAAMC,yCAAA,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,aAAA,GAAgB,EAAA;AACpB,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,GAAUJ,wBAAAA,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,GAASA,wBAAAA,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,IAAI,OAAA,KAAY,UAAU,OAAA,KAAY,MAAA,IAAa,CAAC,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAC3E,QAAA,aAAA,GAAgB,IAAA,CAAK,EAAE,CAAC,CAAA,IAAK,EAAA;AAAA,MAC/B,CAAA,MAAA,IAAA,CAAY,OAAA,KAAY,MAAA,IAAU,OAAA,KAAY,UAAA,KAAe,OAAA,KAAY,MAAA,IAAa,CAAC,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAC9G,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,SAAS,QAAA,EAAU,OAAA,EAAS,aAAA,EAAe,MAAA,EAAQ,OAAA,EAAS,UAAA,EAAY,QAAA,EAAU,YAAA,EAAc,MAAM,IAAA,EAAK;AAC/I;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,EAAA,EACH,GAAG,CAAA;;AAAA;AAAA,CAGN,CAAA;AACD;AAEA,eAAe,gBAAA,CAAiB,eAAuB,OAAA,EAAkC;AACvF,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,UAAUA,wBAAAA,CAAK,OAAA,CAAQ,QAAQ,GAAA,EAAI,EAAG,OAAO,CAAA,GAAI,KAAA,CAAA;AACnE,IAAA,MAAM,EAAE,UAAA,EAAY,YAAA,EAAa,GAAI,MAAM,aAAA,CAAc;AAAA,MACvD,aAAA;AAAA,MACA,SAAA,EAAW,SAAA,IAAa,OAAA,CAAQ,GAAA;AAAI,KACrC,CAAA;AACD,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,yBAAyB,UAAU;AAAA,SAAA,EAAc,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC;AAAA,SAAA,EAAcA,wBAAAA,CAAK,QAAA,CAAS,UAAU,CAAC,CAAA;AAAA;AAAA,KACjH;AACA,IAAA,OAAO,CAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,uBAAA,EAA0B,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC;AAAA,CAAI,CAAA;AACnG,IAAA,OAAO,CAAA;AAAA,EACT;AACF;AAEA,eAAe,QAAQ,OAAA,EAAkC;AACvD,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,UAAA,EAAY,YAAA,EAAa,GAAI,MAAMK,8BAAY,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,MAAMC,iCAAA,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,MAAMC,+BAAa,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,CAACC,QAAAA,KAAY;AAC5C,MAAA,KAAA,CAAM,GAAG,OAAA,EAAS,CAAC,SAASA,QAAAA,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,QAAQC,iCAAA,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,QAAQA,iCAAA,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,GAAYT,wBAAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,WAAW,GAAG,CAAA;AAClD,MAAA,MAAM,MAAA,GAASE,wCAAsB,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,GAAeQ,uCAAA,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,CAAqBC,gDAA8B,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,GAAeD,uCAAA,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,MAAME,wCAAsB,OAAO,CAAA;AACnC,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,MAAM,UAAA,GAAa,MAAMC,+CAAA,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,MAAMC,mCAAA,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,aAAA,EAAe,MAAA,EAAQ,OAAA,EAAS,YAAY,QAAA,EAAU,YAAA,EAAc,MAAM,IAAA,EAAK,GAC1I,UAAU,IAAI,CAAA;AAEhB,EAAA,IAAI,IAAA,IAAQ,YAAY,MAAA,EAAQ;AAC9B,IAAA,SAAA,EAAU;AACV,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,IAAA,IAAI,aAAA,EAAe,OAAO,gBAAA,CAAiB,aAAA,EAAe,OAAO,CAAA;AACjE,IAAA,OAAO,QAAQ,OAAO,CAAA;AAAA,EACxB;AACA,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,GAAaC,iBAAA,CAAc,2PAAe,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,GAASC,eAAA,CAAa,WAAW,CAAA,KAAMA,eAAA,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.cjs","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"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/cli/index.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAqdH,oFAAoF;AACpF,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAEzD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/cli/index.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAgfH,oFAAoF;AACpF,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAEzD"}