@easynet/agent-tool 1.0.35 → 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.
- package/dist/api/expose/extension-init/index.d.ts +3 -0
- package/dist/api/expose/extension-init/index.d.ts.map +1 -0
- package/dist/api/expose/extension-init/initExtension.d.ts +19 -0
- package/dist/api/expose/extension-init/initExtension.d.ts.map +1 -0
- package/dist/api/extension/index.d.ts +1 -0
- package/dist/api/extension/index.d.ts.map +1 -1
- package/dist/api/extension/overrideWithConfig.d.ts +6 -0
- package/dist/api/extension/overrideWithConfig.d.ts.map +1 -0
- package/dist/api/main.cjs +14 -14
- package/dist/api/main.js +3 -3
- package/dist/{chunk-DDIGAOYI.js → chunk-3L7CQ6XP.js} +3 -3
- package/dist/{chunk-DDIGAOYI.js.map → chunk-3L7CQ6XP.js.map} +1 -1
- package/dist/{chunk-P25NBSPT.cjs → chunk-5LCB63L7.cjs} +7 -7
- package/dist/{chunk-P25NBSPT.cjs.map → chunk-5LCB63L7.cjs.map} +1 -1
- package/dist/{chunk-S27O27OH.cjs → chunk-6ZGMI6KW.cjs} +15 -15
- package/dist/{chunk-S27O27OH.cjs.map → chunk-6ZGMI6KW.cjs.map} +1 -1
- package/dist/{chunk-PSVSVTHY.js → chunk-7VBJ64YC.js} +69 -7
- package/dist/chunk-7VBJ64YC.js.map +1 -0
- package/dist/{chunk-U3CAAURW.js → chunk-HEMWFWSK.js} +3 -3
- package/dist/{chunk-U3CAAURW.js.map → chunk-HEMWFWSK.js.map} +1 -1
- package/dist/{chunk-RRVM6JBA.js → chunk-JG5T3ZYC.js} +3 -3
- package/dist/{chunk-RRVM6JBA.js.map → chunk-JG5T3ZYC.js.map} +1 -1
- package/dist/{chunk-2WDDJYR7.cjs → chunk-LP7KHBA3.cjs} +70 -8
- package/dist/chunk-LP7KHBA3.cjs.map +1 -0
- package/dist/{chunk-Z5STQ2JO.cjs → chunk-WFRHBW32.cjs} +9 -9
- package/dist/{chunk-Z5STQ2JO.cjs.map → chunk-WFRHBW32.cjs.map} +1 -1
- package/dist/index.cjs +63 -50
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -6
- package/dist/index.js.map +1 -1
- package/dist/tools/util/toolDescriptor.d.ts +3 -2
- package/dist/tools/util/toolDescriptor.d.ts.map +1 -1
- package/dist/utils/cli/index.cjs +233 -31
- package/dist/utils/cli/index.cjs.map +1 -1
- package/dist/utils/cli/index.d.ts.map +1 -1
- package/dist/utils/cli/index.js +201 -15
- package/dist/utils/cli/index.js.map +1 -1
- package/dist/utils/npmCache.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-2WDDJYR7.cjs.map +0 -1
- package/dist/chunk-PSVSVTHY.js.map +0 -1
package/dist/utils/cli/index.js
CHANGED
|
@@ -1,19 +1,178 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { initProject, buildMcpPackage, runMcpServer } from '../../chunk-
|
|
3
|
-
import { runMCPServerOverStdio, createMCPServerStreamableHttp, createHttpService } from '../../chunk-
|
|
4
|
-
import { findAndLoadToolConfig, resolveToolDescriptor, resolveSandboxedPath, createRuntimeFromConfig, getDisplayScope } from '../../chunk-
|
|
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
|
|
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 =
|
|
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 =
|
|
244
|
+
pathOpt = path2__default.resolve(process.cwd(), args[++i] ?? "");
|
|
85
245
|
} else if (arg === "--out" || arg === "-o") {
|
|
86
|
-
outDir =
|
|
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 (
|
|
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
|
|
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((
|
|
201
|
-
child.on("close", (code) =>
|
|
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 =
|
|
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")
|
|
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":"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","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"]}
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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.
|
|
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",
|