@easynet/agent-tool 1.0.49 → 1.0.50
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/extension/dynamicImportAdapter.d.ts.map +1 -1
- package/dist/api/extension/registerFromManifest.d.ts.map +1 -1
- package/dist/api/main.cjs +15 -15
- package/dist/api/main.js +4 -4
- package/dist/{chunk-XHFZEA7L.cjs → chunk-3GK6IK3N.cjs} +28 -28
- package/dist/{chunk-XHFZEA7L.cjs.map → chunk-3GK6IK3N.cjs.map} +1 -1
- package/dist/{chunk-5GXFZ4GF.cjs → chunk-E3JK57SR.cjs} +15 -15
- package/dist/{chunk-5GXFZ4GF.cjs.map → chunk-E3JK57SR.cjs.map} +1 -1
- package/dist/{chunk-ZRHPGW7W.js → chunk-FCYBA7PR.js} +3 -3
- package/dist/{chunk-ZRHPGW7W.js.map → chunk-FCYBA7PR.js.map} +1 -1
- package/dist/{chunk-C6IARXVY.js → chunk-H4RZJVNS.js} +3 -3
- package/dist/{chunk-C6IARXVY.js.map → chunk-H4RZJVNS.js.map} +1 -1
- package/dist/{chunk-FECO5FHB.js → chunk-NYUSA2YV.js} +4 -4
- package/dist/{chunk-FECO5FHB.js.map → chunk-NYUSA2YV.js.map} +1 -1
- package/dist/{chunk-KDB3MY2H.js → chunk-ODEHUAR4.js} +2 -2
- package/dist/chunk-ODEHUAR4.js.map +1 -0
- package/dist/{chunk-DYDNPIV2.cjs → chunk-QEJF3KDV.cjs} +2 -2
- package/dist/chunk-QEJF3KDV.cjs.map +1 -0
- package/dist/{chunk-BCMMIJAQ.cjs → chunk-QEZLUBAL.cjs} +11 -11
- package/dist/{chunk-BCMMIJAQ.cjs.map → chunk-QEZLUBAL.cjs.map} +1 -1
- package/dist/{chunk-TOSPHMYU.cjs → chunk-WQMHMPNC.cjs} +7 -7
- package/dist/{chunk-TOSPHMYU.cjs.map → chunk-WQMHMPNC.cjs.map} +1 -1
- package/dist/{chunk-2S465X6Q.js → chunk-ZWYRMANX.js} +4 -4
- package/dist/{chunk-2S465X6Q.js.map → chunk-ZWYRMANX.js.map} +1 -1
- package/dist/core/index.cjs +4 -4
- package/dist/core/index.js +1 -1
- package/dist/core/runtime.cjs +6 -6
- package/dist/core/runtime.js +2 -2
- package/dist/core/types/ToolSpec.d.ts +2 -0
- package/dist/core/types/ToolSpec.d.ts.map +1 -1
- package/dist/index.cjs +42 -40
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +11 -9
- package/dist/index.js.map +1 -1
- package/dist/utils/cli/index.cjs +18 -18
- package/dist/utils/cli/index.js +4 -4
- package/package.json +1 -1
- package/dist/chunk-DYDNPIV2.cjs.map +0 -1
- package/dist/chunk-KDB3MY2H.js.map +0 -1
package/dist/core/index.cjs
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkQEJF3KDV_cjs = require('../chunk-QEJF3KDV.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
Object.defineProperty(exports, "DEFAULT_INPUT_SCHEMA", {
|
|
8
8
|
enumerable: true,
|
|
9
|
-
get: function () { return
|
|
9
|
+
get: function () { return chunkQEJF3KDV_cjs.DEFAULT_INPUT_SCHEMA; }
|
|
10
10
|
});
|
|
11
11
|
Object.defineProperty(exports, "DEFAULT_OUTPUT_SCHEMA", {
|
|
12
12
|
enumerable: true,
|
|
13
|
-
get: function () { return
|
|
13
|
+
get: function () { return chunkQEJF3KDV_cjs.DEFAULT_OUTPUT_SCHEMA; }
|
|
14
14
|
});
|
|
15
15
|
Object.defineProperty(exports, "createToolSpec", {
|
|
16
16
|
enumerable: true,
|
|
17
|
-
get: function () { return
|
|
17
|
+
get: function () { return chunkQEJF3KDV_cjs.createToolSpec; }
|
|
18
18
|
});
|
|
19
19
|
//# sourceMappingURL=index.cjs.map
|
|
20
20
|
//# sourceMappingURL=index.cjs.map
|
package/dist/core/index.js
CHANGED
package/dist/core/runtime.cjs
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('../chunk-
|
|
3
|
+
var chunkWQMHMPNC_cjs = require('../chunk-WQMHMPNC.cjs');
|
|
4
|
+
require('../chunk-QEJF3KDV.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
Object.defineProperty(exports, "ToolRegistry", {
|
|
9
9
|
enumerable: true,
|
|
10
|
-
get: function () { return
|
|
10
|
+
get: function () { return chunkWQMHMPNC_cjs.ToolRegistry; }
|
|
11
11
|
});
|
|
12
12
|
Object.defineProperty(exports, "createTaggedError", {
|
|
13
13
|
enumerable: true,
|
|
14
|
-
get: function () { return
|
|
14
|
+
get: function () { return chunkWQMHMPNC_cjs.createTaggedError; }
|
|
15
15
|
});
|
|
16
16
|
Object.defineProperty(exports, "isRetryable", {
|
|
17
17
|
enumerable: true,
|
|
18
|
-
get: function () { return
|
|
18
|
+
get: function () { return chunkWQMHMPNC_cjs.isRetryable; }
|
|
19
19
|
});
|
|
20
20
|
Object.defineProperty(exports, "withRetry", {
|
|
21
21
|
enumerable: true,
|
|
22
|
-
get: function () { return
|
|
22
|
+
get: function () { return chunkWQMHMPNC_cjs.withRetry; }
|
|
23
23
|
});
|
|
24
24
|
//# sourceMappingURL=runtime.cjs.map
|
|
25
25
|
//# sourceMappingURL=runtime.cjs.map
|
package/dist/core/runtime.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { ToolRegistry, createTaggedError, isRetryable, withRetry } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
1
|
+
export { ToolRegistry, createTaggedError, isRetryable, withRetry } from '../chunk-FCYBA7PR.js';
|
|
2
|
+
import '../chunk-ODEHUAR4.js';
|
|
3
3
|
//# sourceMappingURL=runtime.js.map
|
|
4
4
|
//# sourceMappingURL=runtime.js.map
|
|
@@ -54,6 +54,8 @@ export interface ToolSpec {
|
|
|
54
54
|
exportName?: string;
|
|
55
55
|
/** Function/skill kind: project root for resolving sourcePath */
|
|
56
56
|
projectPath?: string;
|
|
57
|
+
/** Extension kind: package root for resolving sourcePath */
|
|
58
|
+
packageRoot?: string;
|
|
57
59
|
};
|
|
58
60
|
/** Adapter-specific: endpoint URL (MCP/n8n) */
|
|
59
61
|
endpoint?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolSpec.d.ts","sourceRoot":"","sources":["../../../src/core/types/ToolSpec.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ToolSpec.d.ts","sourceRoot":"","sources":["../../../src/core/types/ToolSpec.ts"],"names":[],"mappings":"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"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
6
|
-
var
|
|
7
|
-
var
|
|
3
|
+
var chunkE3JK57SR_cjs = require('./chunk-E3JK57SR.cjs');
|
|
4
|
+
var chunkQEZLUBAL_cjs = require('./chunk-QEZLUBAL.cjs');
|
|
5
|
+
var chunk3GK6IK3N_cjs = require('./chunk-3GK6IK3N.cjs');
|
|
6
|
+
var chunkWQMHMPNC_cjs = require('./chunk-WQMHMPNC.cjs');
|
|
7
|
+
var chunkQEJF3KDV_cjs = require('./chunk-QEJF3KDV.cjs');
|
|
8
8
|
require('./chunk-UUNG3GL3.cjs');
|
|
9
9
|
var async_hooks = require('async_hooks');
|
|
10
10
|
var path6 = require('path');
|
|
@@ -61,7 +61,8 @@ function createDynamicImportAdapter(options) {
|
|
|
61
61
|
const defaultArgs = meta?.defaultArgs ?? {};
|
|
62
62
|
const mergedArgs = Object.keys(defaultArgs).length === 0 ? args : { ...defaultArgs, ...args };
|
|
63
63
|
const handlerArgs = unwrapArgsForHandler(spec, mergedArgs);
|
|
64
|
-
const
|
|
64
|
+
const resolvedPackageRoot = meta?.packageRoot ?? packageRoot;
|
|
65
|
+
const modulePath = path6__default.default.join(resolvedPackageRoot, `${sourcePath}.js`);
|
|
65
66
|
const mod = await import(url.pathToFileURL(modulePath).href);
|
|
66
67
|
const handler = mod[exportName];
|
|
67
68
|
if (typeof handler !== "function") {
|
|
@@ -133,7 +134,7 @@ function registerToolsFromManifest(registry, options) {
|
|
|
133
134
|
const registered = [];
|
|
134
135
|
for (const entry of entries) {
|
|
135
136
|
const toolName = entry.name ?? (entry.coreName != null ? entry.coreName.replace(/^[^/]+\//, "").replace(/^src\./, "") : entry.sourcePath.replace(/^src\//, "").replace(/\//g, "."));
|
|
136
|
-
let spec =
|
|
137
|
+
let spec = chunkQEJF3KDV_cjs.createToolSpec({
|
|
137
138
|
name: toolName,
|
|
138
139
|
kind,
|
|
139
140
|
description: entry.description,
|
|
@@ -154,6 +155,7 @@ function registerToolsFromManifest(registry, options) {
|
|
|
154
155
|
sourcePath: entry.sourcePath,
|
|
155
156
|
exportName: entry.exportName,
|
|
156
157
|
shortName: toolName,
|
|
158
|
+
...packageRoot != null && { packageRoot },
|
|
157
159
|
...defaultArgs != null && Object.keys(defaultArgs).length > 0 && { defaultArgs }
|
|
158
160
|
}
|
|
159
161
|
};
|
|
@@ -269,7 +271,7 @@ function generateExtensionManifest(projectRoot = process.cwd(), options = {}) {
|
|
|
269
271
|
const root = path6__default.default.resolve(projectRoot);
|
|
270
272
|
const outDir = path6__default.default.resolve(options.outDir ?? path6__default.default.join(root, "dist"));
|
|
271
273
|
const kind = options.kind ?? "core";
|
|
272
|
-
const { specs, errors } =
|
|
274
|
+
const { specs, errors } = chunkQEZLUBAL_cjs.scanForTools({
|
|
273
275
|
projectPath: root,
|
|
274
276
|
include: options.include ?? ["**/*.ts"],
|
|
275
277
|
tsconfigPath: options.tsconfigPath
|
|
@@ -350,14 +352,14 @@ async function validateUrl(url, options) {
|
|
|
350
352
|
try {
|
|
351
353
|
parsed = new URL(url);
|
|
352
354
|
} catch {
|
|
353
|
-
throw
|
|
355
|
+
throw chunkWQMHMPNC_cjs.createTaggedError(
|
|
354
356
|
"HTTP_DISALLOWED_HOST",
|
|
355
357
|
`Invalid URL: ${url}`,
|
|
356
358
|
{ url }
|
|
357
359
|
);
|
|
358
360
|
}
|
|
359
361
|
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
360
|
-
throw
|
|
362
|
+
throw chunkWQMHMPNC_cjs.createTaggedError(
|
|
361
363
|
"HTTP_DISALLOWED_HOST",
|
|
362
364
|
`Protocol not allowed: ${parsed.protocol}. Only http: and https: are supported.`,
|
|
363
365
|
{ url, protocol: parsed.protocol }
|
|
@@ -365,14 +367,14 @@ async function validateUrl(url, options) {
|
|
|
365
367
|
}
|
|
366
368
|
const hostname = parsed.hostname;
|
|
367
369
|
if (!isHostAllowed(hostname, options.allowedHosts)) {
|
|
368
|
-
throw
|
|
370
|
+
throw chunkWQMHMPNC_cjs.createTaggedError(
|
|
369
371
|
"HTTP_DISALLOWED_HOST",
|
|
370
372
|
`Host "${hostname}" is not in the allowed hosts list`,
|
|
371
373
|
{ url, hostname, allowedHosts: options.allowedHosts }
|
|
372
374
|
);
|
|
373
375
|
}
|
|
374
376
|
if (isHostBlocked(hostname, options.blockedHosts)) {
|
|
375
|
-
throw
|
|
377
|
+
throw chunkWQMHMPNC_cjs.createTaggedError(
|
|
376
378
|
"HTTP_DISALLOWED_HOST",
|
|
377
379
|
`Host "${hostname}" is in the blocked hosts list`,
|
|
378
380
|
{ url, hostname, blockedHosts: options.blockedHosts }
|
|
@@ -381,7 +383,7 @@ async function validateUrl(url, options) {
|
|
|
381
383
|
try {
|
|
382
384
|
const { address } = await promises.lookup(hostname);
|
|
383
385
|
if (isIpInBlockedCidrs(address, options.blockedCidrs)) {
|
|
384
|
-
throw
|
|
386
|
+
throw chunkWQMHMPNC_cjs.createTaggedError(
|
|
385
387
|
"HTTP_DISALLOWED_HOST",
|
|
386
388
|
`Host "${hostname}" resolves to blocked IP: ${address}`,
|
|
387
389
|
{ url, hostname, resolvedIp: address }
|
|
@@ -391,7 +393,7 @@ async function validateUrl(url, options) {
|
|
|
391
393
|
if (err instanceof Error && err.kind === "HTTP_DISALLOWED_HOST") {
|
|
392
394
|
throw err;
|
|
393
395
|
}
|
|
394
|
-
throw
|
|
396
|
+
throw chunkWQMHMPNC_cjs.createTaggedError(
|
|
395
397
|
"HTTP_DISALLOWED_HOST",
|
|
396
398
|
`DNS resolution failed for host "${hostname}": ${err instanceof Error ? err.message : String(err)}`,
|
|
397
399
|
{ url, hostname }
|
|
@@ -522,107 +524,107 @@ function expandIpv6(ip) {
|
|
|
522
524
|
|
|
523
525
|
Object.defineProperty(exports, "createAgentTools", {
|
|
524
526
|
enumerable: true,
|
|
525
|
-
get: function () { return
|
|
527
|
+
get: function () { return chunkE3JK57SR_cjs.createAgentTools; }
|
|
526
528
|
});
|
|
527
529
|
Object.defineProperty(exports, "createLangChainToolsAsync", {
|
|
528
530
|
enumerable: true,
|
|
529
|
-
get: function () { return
|
|
531
|
+
get: function () { return chunkE3JK57SR_cjs.createLangChainToolsAsync; }
|
|
530
532
|
});
|
|
531
533
|
Object.defineProperty(exports, "buildFunctionToTool", {
|
|
532
534
|
enumerable: true,
|
|
533
|
-
get: function () { return
|
|
535
|
+
get: function () { return chunkQEZLUBAL_cjs.buildFunctionToTool; }
|
|
534
536
|
});
|
|
535
537
|
Object.defineProperty(exports, "buildMcpPackage", {
|
|
536
538
|
enumerable: true,
|
|
537
|
-
get: function () { return
|
|
539
|
+
get: function () { return chunkQEZLUBAL_cjs.buildMcpPackage; }
|
|
538
540
|
});
|
|
539
541
|
Object.defineProperty(exports, "initProject", {
|
|
540
542
|
enumerable: true,
|
|
541
|
-
get: function () { return
|
|
543
|
+
get: function () { return chunkQEZLUBAL_cjs.initProject; }
|
|
542
544
|
});
|
|
543
545
|
Object.defineProperty(exports, "runGeneratedMCP", {
|
|
544
546
|
enumerable: true,
|
|
545
|
-
get: function () { return
|
|
547
|
+
get: function () { return chunkQEZLUBAL_cjs.runGeneratedMCP; }
|
|
546
548
|
});
|
|
547
549
|
Object.defineProperty(exports, "runMcpServer", {
|
|
548
550
|
enumerable: true,
|
|
549
|
-
get: function () { return
|
|
551
|
+
get: function () { return chunkQEZLUBAL_cjs.runMcpServer; }
|
|
550
552
|
});
|
|
551
553
|
Object.defineProperty(exports, "scan", {
|
|
552
554
|
enumerable: true,
|
|
553
|
-
get: function () { return
|
|
555
|
+
get: function () { return chunkQEZLUBAL_cjs.scan; }
|
|
554
556
|
});
|
|
555
557
|
Object.defineProperty(exports, "scanForTools", {
|
|
556
558
|
enumerable: true,
|
|
557
|
-
get: function () { return
|
|
559
|
+
get: function () { return chunkQEZLUBAL_cjs.scanForTools; }
|
|
558
560
|
});
|
|
559
561
|
Object.defineProperty(exports, "PTCRuntime", {
|
|
560
562
|
enumerable: true,
|
|
561
|
-
get: function () { return
|
|
563
|
+
get: function () { return chunk3GK6IK3N_cjs.PTCRuntime; }
|
|
562
564
|
});
|
|
563
565
|
Object.defineProperty(exports, "createMCPServer", {
|
|
564
566
|
enumerable: true,
|
|
565
|
-
get: function () { return
|
|
567
|
+
get: function () { return chunk3GK6IK3N_cjs.createMCPServer; }
|
|
566
568
|
});
|
|
567
569
|
Object.defineProperty(exports, "createMCPServerStreamableHttp", {
|
|
568
570
|
enumerable: true,
|
|
569
|
-
get: function () { return
|
|
571
|
+
get: function () { return chunk3GK6IK3N_cjs.createMCPServerStreamableHttp; }
|
|
570
572
|
});
|
|
571
573
|
Object.defineProperty(exports, "createMCPStreamableHttpHandler", {
|
|
572
574
|
enumerable: true,
|
|
573
|
-
get: function () { return
|
|
575
|
+
get: function () { return chunk3GK6IK3N_cjs.createMCPStreamableHttpHandler; }
|
|
574
576
|
});
|
|
575
577
|
Object.defineProperty(exports, "createOpenAPIServer", {
|
|
576
578
|
enumerable: true,
|
|
577
|
-
get: function () { return
|
|
579
|
+
get: function () { return chunk3GK6IK3N_cjs.createHttpService; }
|
|
578
580
|
});
|
|
579
581
|
Object.defineProperty(exports, "createRuntimeFromConfig", {
|
|
580
582
|
enumerable: true,
|
|
581
|
-
get: function () { return
|
|
583
|
+
get: function () { return chunk3GK6IK3N_cjs.createRuntimeFromConfig; }
|
|
582
584
|
});
|
|
583
585
|
Object.defineProperty(exports, "createRuntimeFromConfigSync", {
|
|
584
586
|
enumerable: true,
|
|
585
|
-
get: function () { return
|
|
587
|
+
get: function () { return chunk3GK6IK3N_cjs.createRuntimeFromConfigSync; }
|
|
586
588
|
});
|
|
587
589
|
Object.defineProperty(exports, "loadToolConfig", {
|
|
588
590
|
enumerable: true,
|
|
589
|
-
get: function () { return
|
|
591
|
+
get: function () { return chunk3GK6IK3N_cjs.loadToolConfig; }
|
|
590
592
|
});
|
|
591
593
|
Object.defineProperty(exports, "resolveSandboxedPath", {
|
|
592
594
|
enumerable: true,
|
|
593
|
-
get: function () { return
|
|
595
|
+
get: function () { return chunk3GK6IK3N_cjs.resolveSandboxedPath2; }
|
|
594
596
|
});
|
|
595
597
|
Object.defineProperty(exports, "runMCPServerOverStdio", {
|
|
596
598
|
enumerable: true,
|
|
597
|
-
get: function () { return
|
|
599
|
+
get: function () { return chunk3GK6IK3N_cjs.runMCPServerOverStdio; }
|
|
598
600
|
});
|
|
599
601
|
Object.defineProperty(exports, "setSandboxValidationEnabled", {
|
|
600
602
|
enumerable: true,
|
|
601
|
-
get: function () { return
|
|
603
|
+
get: function () { return chunk3GK6IK3N_cjs.setSandboxValidationEnabled; }
|
|
602
604
|
});
|
|
603
605
|
Object.defineProperty(exports, "ToolRegistry", {
|
|
604
606
|
enumerable: true,
|
|
605
|
-
get: function () { return
|
|
607
|
+
get: function () { return chunkWQMHMPNC_cjs.ToolRegistry; }
|
|
606
608
|
});
|
|
607
609
|
Object.defineProperty(exports, "createTaggedError", {
|
|
608
610
|
enumerable: true,
|
|
609
|
-
get: function () { return
|
|
611
|
+
get: function () { return chunkWQMHMPNC_cjs.createTaggedError; }
|
|
610
612
|
});
|
|
611
613
|
Object.defineProperty(exports, "DEFAULT_INPUT_SCHEMA", {
|
|
612
614
|
enumerable: true,
|
|
613
|
-
get: function () { return
|
|
615
|
+
get: function () { return chunkQEJF3KDV_cjs.DEFAULT_INPUT_SCHEMA; }
|
|
614
616
|
});
|
|
615
617
|
Object.defineProperty(exports, "DEFAULT_OUTPUT_SCHEMA", {
|
|
616
618
|
enumerable: true,
|
|
617
|
-
get: function () { return
|
|
619
|
+
get: function () { return chunkQEJF3KDV_cjs.DEFAULT_OUTPUT_SCHEMA; }
|
|
618
620
|
});
|
|
619
621
|
Object.defineProperty(exports, "createToolSpec", {
|
|
620
622
|
enumerable: true,
|
|
621
|
-
get: function () { return
|
|
623
|
+
get: function () { return chunkQEJF3KDV_cjs.createToolSpec; }
|
|
622
624
|
});
|
|
623
625
|
Object.defineProperty(exports, "normalizeToolName", {
|
|
624
626
|
enumerable: true,
|
|
625
|
-
get: function () { return
|
|
627
|
+
get: function () { return chunkQEJF3KDV_cjs.normalizeToolName; }
|
|
626
628
|
});
|
|
627
629
|
exports.createContextRunner = createContextRunner;
|
|
628
630
|
exports.createDynamicImportAdapter = createDynamicImportAdapter;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/extension/contextRunner.ts","../src/api/extension/dynamicImportAdapter.ts","../src/api/extension/loadToolYaml.ts","../src/api/extension/registerFromManifest.ts","../src/api/extension/resolvePackageRoot.ts","../src/api/extension/registerExtension.ts","../src/api/extension/createExtension.ts","../src/api/extension/generateExtensionManifest.ts","../src/api/extension/overrideWithConfig.ts","../src/api/extension/groupPrefix.ts","../src/security/ssrf.ts"],"names":["AsyncLocalStorage","path","pathToFileURL","existsSync","readFileSync","yaml","statSync","createToolSpec","fileURLToPath","readdirSync","copyFileSync","scanForTools","writeFileSync","createTaggedError","lookup"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Generic context injection for extension tools (e.g. builtin).\n * Any extension that needs to inject config (sandbox, allowedHosts, etc.) into handlers uses this.\n */\nimport { AsyncLocalStorage } from \"node:async_hooks\";\n\nexport interface ContextRunner<T> {\n runWith(ctx: T, fn: () => Promise<unknown>): Promise<unknown>;\n getContext(): T;\n}\n\n/**\n * Create a context runner for an extension. Handlers call getContext() to read config.\n * Adapter calls runWith(ctx, () => handler(args)) so getContext() returns ctx.\n */\nexport function createContextRunner<T>(): ContextRunner<T> {\n const storage = new AsyncLocalStorage<T>();\n return {\n runWith(ctx: T, fn: () => Promise<unknown>): Promise<unknown> {\n return storage.run(ctx, fn);\n },\n getContext(): T {\n const ctx = storage.getStore();\n if (ctx === undefined) {\n throw new Error(\"Extension context not set; invoke only through the extension adapter.\");\n }\n return ctx;\n },\n };\n}\n","/**\n * Generic adapter for extensions that discover tools via manifest and load handlers by dynamic import.\n * Any extension (builtin, etc.) that uses @tool scan → manifest and runs handlers with injected context uses this.\n */\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { ToolAdapter, ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport type { Evidence } from \"../../core/types/ToolResult.js\";\n\n/** If spec.inputSchema wraps params in \"args\", return args.args for the handler; else return args. */\nfunction unwrapArgsForHandler(spec: ToolSpec, args: unknown): unknown {\n if (args == null || typeof args !== \"object\" || Array.isArray(args)) return args;\n const s = spec.inputSchema as Record<string, unknown>;\n if (s?.type !== \"object\" || !s.properties || typeof s.properties !== \"object\") return args;\n const props = s.properties as Record<string, unknown>;\n const argsProp = props.args;\n if (\n argsProp != null &&\n typeof argsProp === \"object\" &&\n (argsProp as Record<string, unknown>).type === \"object\" &&\n (argsProp as Record<string, unknown>).properties != null\n ) {\n const obj = args as Record<string, unknown>;\n if (Object.keys(obj).length === 1 && \"args\" in obj && typeof obj.args === \"object\" && obj.args !== null) {\n return obj.args;\n }\n }\n return args;\n}\n\nexport interface ExtensionToolResult {\n result: unknown;\n evidence: Evidence[];\n}\n\nexport interface DynamicImportAdapterOptions<TContext> {\n kind: string;\n packageRoot: string;\n /**\n * Build context from execCtx, spec, and merged request args.\n * Framework merges defaultArgs (tool.yaml) with request args; implementor can merge into ctx.config\n * so handlers read resolved config from context instead of re-resolving in each handler.\n */\n getExtensionContext: (execCtx: ExecContext, spec: ToolSpec, mergedArgs?: Record<string, unknown>) => TContext;\n contextRunner: { runWith(ctx: TContext, fn: () => Promise<ExtensionToolResult>): Promise<ExtensionToolResult> };\n}\n\n/**\n * Create an adapter that loads handlers by spec._meta.sourcePath and exportName, then runs with extension context.\n */\nexport function createDynamicImportAdapter<TContext>(\n options: DynamicImportAdapterOptions<TContext>,\n): ToolAdapter {\n const { kind, packageRoot, getExtensionContext, contextRunner } = options;\n return {\n kind: kind as ToolAdapter[\"kind\"],\n async invoke(\n spec: ToolSpec,\n args: unknown,\n execCtx: ExecContext,\n ): Promise<{ result: unknown; raw?: unknown }> {\n const meta = spec._meta as {\n sourcePath?: string;\n exportName?: string;\n defaultArgs?: Record<string, unknown>;\n } | undefined;\n const sourcePath = meta?.sourcePath;\n const exportName = meta?.exportName;\n if (!sourcePath || !exportName) {\n throw new Error(`Extension tool ${spec.name} missing _meta.sourcePath or _meta.exportName`);\n }\n const defaultArgs = meta?.defaultArgs ?? {};\n const mergedArgs =\n Object.keys(defaultArgs).length === 0\n ? (args as Record<string, unknown>)\n : { ...defaultArgs, ...(args as Record<string, unknown>) };\n const handlerArgs = unwrapArgsForHandler(spec, mergedArgs);\n const modulePath = path.join(packageRoot, `${sourcePath}.js`);\n const mod = await import(pathToFileURL(modulePath).href);\n const handler = mod[exportName];\n if (typeof handler !== \"function\") {\n throw new Error(\n `Extension tool ${spec.name}: export \"${exportName}\" from ${sourcePath} is not a function`,\n );\n }\n const ctx = getExtensionContext(execCtx, spec, mergedArgs as Record<string, unknown>);\n const output = await contextRunner.runWith(ctx, () => handler(handlerArgs));\n // Return full envelope so pipeline output validation (outputSchema: { result, evidence }) passes.\n return {\n result: { result: output.result, evidence: output.evidence },\n raw: { evidence: output.evidence },\n };\n },\n };\n}\n","/**\n * Load per-tool default args/config from <base>.tool.yaml (framework-defined format).\n *\n * Supported YAML format:\n * tool:\n * defaults: # optional; same level as list; merged into every tool's defaultArgs\n * sandboxRoot: \"\"\n * maxBytes: 5242880\n * list:\n * - name: fetchText\n * timeoutMs: 5000\n * maxBytes: 1048576\n * (find item where name === tool base name; result = { ...defaults, ...item } minus name)\n */\nimport { readFileSync, existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport yaml from \"js-yaml\";\n\n/**\n * Load tool.yaml for a given tool. Path: packageRoot / dirname(sourcePath) / basename(sourcePath).tool.yaml\n * Returns default args (and config) for the tool, or undefined if file missing or no matching entry.\n * If tool.defaults exists (same level as tool.list), it is merged first; list item fields override.\n */\nexport function loadToolYaml(\n packageRoot: string,\n sourcePath: string,\n): Record<string, unknown> | undefined {\n const dir = path.dirname(sourcePath);\n const base = path.basename(sourcePath);\n const dirPath = path.join(packageRoot, dir);\n const yamlPath = existsSync(path.join(dirPath, `${base}.tool.yaml`))\n ? path.join(dirPath, `${base}.tool.yaml`)\n : path.join(dirPath, `${base}.example.yaml`);\n if (!existsSync(yamlPath)) return undefined;\n try {\n const raw = readFileSync(yamlPath, \"utf-8\");\n const data = yaml.load(raw) as unknown;\n if (data == null || typeof data !== \"object\" || Array.isArray(data)) return undefined;\n const obj = data as Record<string, unknown>;\n const toolBlock = obj?.tool as Record<string, unknown> | undefined;\n const arr = toolBlock?.list;\n if (!Array.isArray(arr)) return undefined;\n const defaults =\n toolBlock?.defaults != null &&\n typeof toolBlock.defaults === \"object\" &&\n !Array.isArray(toolBlock.defaults)\n ? (toolBlock.defaults as Record<string, unknown>)\n : {};\n const item = arr.find(\n (e: unknown) => e != null && typeof e === \"object\" && (e as Record<string, unknown>).name === base,\n ) as Record<string, unknown> | undefined;\n if (!item || typeof item !== \"object\") return undefined;\n const { name: _n, ...rest } = item;\n const merged = { ...defaults, ...rest };\n if (Object.keys(merged).length === 0) return undefined;\n return merged;\n } catch {\n return undefined;\n }\n}\n","/**\n * Generic manifest-based registration for extensions.\n * Reads a pre-built JSON manifest (extension produces it at build time; agent-tool does not scan @tool).\n * Registers ToolSpecs with the registry. When packageRoot is provided, loads <base>.tool.yaml per tool and sets defaultArgs in _meta.\n */\nimport { readFileSync, existsSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { createToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { ToolSpec, HitlSideEffect } from \"../../core/types/ToolSpec.js\";\nimport type { ToolRegistry } from \"../../core/registry/ToolRegistry.js\";\nimport { loadToolYaml } from \"./loadToolYaml.js\";\n\n/** Manifest entry shape (convention: extension build emits this, e.g. from @tool scan). */\nexport interface ExtensionManifestEntry {\n /** Tool name (e.g. \"exec.runCommand\"). Legacy manifests may have coreName instead. */\n name?: string;\n /** @deprecated Use name instead. Legacy: e.g. \"core/src.exec.runCommand\". */\n coreName?: string;\n description: string;\n inputSchema: object;\n outputSchema: object;\n sourcePath: string;\n exportName: string;\n sideEffect: HitlSideEffect;\n}\n\n/** Loaded manifest: entries + optional kind from manifest file. */\nexport interface LoadedExtensionManifest {\n kind?: string;\n entries: ExtensionManifestEntry[];\n}\n\nexport interface RegisterFromManifestOptions {\n /** Path to manifest JSON (or directory containing core-tools-manifest.json). */\n manifestPathOrDir: string;\n /** Tool kind; if omitted, uses manifest.kind or \"extension\". */\n kind?: string;\n /** Filter: only register these tool names. */\n only?: string[];\n /** Filter: only register tools whose name starts with one of these prefixes. */\n namePrefixes?: string[];\n /** Extension package root (e.g. dist); when set, loads <base>.tool.yaml per tool and sets defaultArgs in _meta. */\n packageRoot?: string;\n}\n\n/**\n * Load manifest from path. Supports array or { kind?, tools: ExtensionManifestEntry[] }.\n * Returns entries + optional kind so framework can use dynamic kind from manifest.\n */\nexport function loadExtensionManifest(manifestPathOrDir: string): LoadedExtensionManifest {\n const p = path.resolve(manifestPathOrDir);\n let manifestPath: string;\n if (existsSync(p) && statSync(p).isFile()) {\n manifestPath = p;\n } else {\n const inDir = path.join(p, \"core-tools-manifest.json\");\n const inDist = path.join(p, \"dist\", \"core-tools-manifest.json\");\n manifestPath = existsSync(inDir) ? inDir : inDist;\n }\n const raw = readFileSync(manifestPath, \"utf-8\");\n const parsed = JSON.parse(raw) as ExtensionManifestEntry[] | { kind?: string; tools: ExtensionManifestEntry[] };\n if (Array.isArray(parsed)) {\n return { entries: parsed };\n }\n return { kind: parsed.kind, entries: parsed.tools ?? [] };\n}\n\n/**\n * Register tools from a manifest with the registry. Returns the list of registered specs.\n * Extension packages call this from their register (or equivalent) with their package root.\n */\nexport function registerToolsFromManifest(\n registry: ToolRegistry,\n options: RegisterFromManifestOptions,\n): ToolSpec[] {\n const { manifestPathOrDir, kind: kindOpt, only, namePrefixes, packageRoot } = options;\n const loaded = loadExtensionManifest(manifestPathOrDir);\n const kind = (kindOpt ?? loaded.kind ?? \"extension\") as ToolSpec[\"kind\"];\n const entries = loaded.entries;\n const onlySet = only?.length ? new Set(only) : null;\n const registered: ToolSpec[] = [];\n\n for (const entry of entries) {\n const toolName =\n entry.name ??\n (entry.coreName != null\n ? entry.coreName.replace(/^[^/]+\\//, \"\").replace(/^src\\./, \"\")\n : entry.sourcePath.replace(/^src\\//, \"\").replace(/\\//g, \".\"));\n let spec = createToolSpec({\n name: toolName,\n kind,\n description: entry.description,\n inputSchema: entry.inputSchema,\n outputSchema: entry.outputSchema,\n capabilities: [],\n sideEffect: entry.sideEffect,\n });\n if (onlySet && !onlySet.has(spec.name)) continue;\n if (namePrefixes?.length && !namePrefixes.some((prefix) => spec.name.startsWith(prefix))) {\n continue;\n }\n const defaultArgs =\n packageRoot != null ? loadToolYaml(packageRoot, entry.sourcePath) : undefined;\n spec = {\n ...spec,\n _meta: {\n ...spec._meta,\n sourcePath: entry.sourcePath,\n exportName: entry.exportName,\n shortName: toolName,\n ...(defaultArgs != null && Object.keys(defaultArgs).length > 0 && { defaultArgs }),\n },\n } as ToolSpec;\n registry.register(spec);\n registered.push(spec);\n }\n return registered;\n}\n","/**\n * Resolve extension package root for dynamic import (dist when built, else dir).\n * Accepts import.meta.url (file:) or a directory path (e.g. __dirname).\n */\nimport path from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\n\nexport function resolveExtensionPackageRoot(metaUrlOrPath: string): string {\n const dir = metaUrlOrPath.startsWith(\"file:\")\n ? path.dirname(fileURLToPath(metaUrlOrPath))\n : path.resolve(metaUrlOrPath);\n const dist = path.join(dir, \"dist\");\n return existsSync(dist) ? dist : dir;\n}\n","/**\n * One-shot: load pre-built manifest from package, register all specs, create adapter.\n * Framework does NOT scan source for @tool; it reads manifest (e.g. core-tools-manifest.json)\n * produced by the extension's build. Extension passes packagePath, config, getContextRunner.\n */\nimport type { ToolAdapter } from \"../../core/types/ToolSpec.js\";\nimport type { ToolRegistry } from \"../../core/registry/ToolRegistry.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport type { ContextRunner } from \"./contextRunner.js\";\nimport { createDynamicImportAdapter } from \"./dynamicImportAdapter.js\";\nimport type { ExtensionToolResult } from \"./dynamicImportAdapter.js\";\nimport { registerToolsFromManifest, loadExtensionManifest } from \"./registerFromManifest.js\";\nimport { resolveExtensionPackageRoot } from \"./resolvePackageRoot.js\";\n\nexport interface RegisterExtensionOptions<TContext> {\n /** Package root (e.g. __dirname of extension's entry). Manifest is read from here. */\n packagePath: string;\n /** Tool kind; if omitted, uses manifest.kind or \"extension\". */\n kind?: string;\n /** Optional default config; merged with each tool's tool.yaml (spec._meta.defaultArgs). Context config = { ...config, ...toolDefaultArgs }. */\n config?: unknown;\n /** Returns the context runner (extension's createContextRunner()). */\n getContextRunner: () => ContextRunner<TContext>;\n /** Filter: only register these tool names. */\n only?: string[];\n /** Filter: only register tools whose name starts with one of these prefixes. */\n namePrefixes?: string[];\n}\n\n/**\n * Load manifest from package (pre-built JSON; no @tool scanning). Register all specs, create and return adapter.\n */\nexport function registerExtension<TContext extends { execCtx: ExecContext; config: unknown }>(\n registry: ToolRegistry,\n options: RegisterExtensionOptions<TContext>,\n): ToolAdapter {\n const { packagePath, kind: kindOpt, config, getContextRunner, only, namePrefixes } = options;\n const packageRoot = resolveExtensionPackageRoot(packagePath);\n const contextRunner = getContextRunner();\n const loaded = loadExtensionManifest(packagePath);\n const kind = kindOpt ?? loaded.kind ?? \"extension\";\n\n registerToolsFromManifest(registry, {\n manifestPathOrDir: packagePath,\n kind,\n only,\n namePrefixes,\n packageRoot,\n });\n\n const adapter = createDynamicImportAdapter<TContext>({\n kind,\n packageRoot,\n getExtensionContext: (\n execCtx: ExecContext,\n spec: import(\"../../core/types/ToolSpec.js\").ToolSpec,\n mergedArgs?: Record<string, unknown>,\n ) => {\n const defaultArgs = (spec._meta as { defaultArgs?: Record<string, unknown> } | undefined)?.defaultArgs ?? {};\n const baseConfig = (config !== undefined ? (config as Record<string, unknown>) : {}) as Record<string, unknown>;\n const toolOverrides = baseConfig?.toolOverrides as Record<string, Record<string, unknown>> | undefined;\n const shortName = (spec._meta as { shortName?: string } | undefined)?.shortName ?? spec.name;\n // Derive package-scoped key (no version): e.g. \"npm.easynet.agent.tool.buildin::fs.listDir\" so config survives package version bumps\n const prefixWithVersion =\n shortName && spec.name.endsWith(shortName) && spec.name.length > shortName.length\n ? spec.name.slice(0, spec.name.length - shortName.length - 1)\n : \"\";\n const parts = prefixWithVersion ? prefixWithVersion.split(\".\") : [];\n const packageScopedKey =\n parts.length > 1 ? `${parts.slice(0, -1).join(\".\")}::${shortName}` : \"\";\n const perTool = (toolOverrides?.[spec.name] ??\n (packageScopedKey ? toolOverrides?.[packageScopedKey] : undefined) ??\n toolOverrides?.[shortName] ??\n {}) as Record<string, unknown>;\n const packagePrefix = parts.length > 1 ? parts.slice(0, -1).join(\".\") : \"\";\n const packageDefaults = baseConfig?.packageDefaults as Record<string, Record<string, unknown>> | undefined;\n const packageDefaultsForPkg =\n (packagePrefix && packageDefaults?.[packagePrefix]) ??\n (prefixWithVersion && packageDefaults?.[prefixWithVersion]) ??\n {};\n const baseWithoutOverrides = { ...baseConfig };\n delete (baseWithoutOverrides as Record<string, unknown>).toolOverrides;\n delete (baseWithoutOverrides as Record<string, unknown>).packageDefaults;\n const resolvedConfig = {\n ...defaultArgs,\n ...baseWithoutOverrides,\n ...packageDefaultsForPkg,\n ...perTool,\n ...(mergedArgs ?? {}),\n } as TContext[\"config\"];\n return { execCtx, config: resolvedConfig } as TContext;\n },\n contextRunner: {\n runWith(ctx: TContext, fn: () => Promise<ExtensionToolResult>) {\n return contextRunner.runWith(ctx, fn) as Promise<ExtensionToolResult>;\n },\n },\n });\n return adapter;\n}\n","/**\n * One-shot extension bootstrap: context runner + register + getContext/runWith.\n * Config can be extension-level (buildConfig) or per-tool only (defaultConfig in opts, merged with tool.yaml).\n */\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { ToolAdapter } from \"../../core/types/ToolSpec.js\";\nimport type { ToolRegistry } from \"../../core/registry/ToolRegistry.js\";\nimport { createContextRunner } from \"./contextRunner.js\";\nimport { registerExtension } from \"./registerExtension.js\";\nimport type { ExtensionToolContext } from \"./types.js\";\n\n/** Pass import.meta so the framework derives packagePath (extension entry does not need path/fileURLToPath). */\nexport interface ImportMetaLike {\n url: string;\n}\n\n/** Options when config is built from userConfig (buildConfig). */\nexport interface CreateExtensionOptionsWithBuild<TConfig, TUserConfig> {\n packagePath?: string;\n importMeta?: ImportMetaLike;\n kind?: string;\n buildConfig: (userConfig: TUserConfig) => TConfig;\n}\n\n/** Options when config is per-tool only (each tool's tool.yaml). */\nexport interface CreateExtensionOptionsDefaultOnly {\n packagePath?: string;\n importMeta?: ImportMetaLike;\n kind?: string;\n}\n\n/** Register opts when using per-tool config only: filter tools by name. */\nexport interface RegisterOptionsDefaultOnly {\n only?: string[];\n namePrefixes?: string[];\n}\n\nexport type CreateExtensionOptions<TConfig, TUserConfig> =\n | CreateExtensionOptionsWithBuild<TConfig, TUserConfig>\n | (CreateExtensionOptionsDefaultOnly & { buildConfig?: never });\n\nexport interface CreateExtensionResult<TConfig, TUserConfig> {\n register(\n registry: ToolRegistry,\n userConfigOrOpts: TUserConfig,\n options?: { only?: string[]; namePrefixes?: string[] },\n ): ToolAdapter;\n getContext(): ExtensionToolContext<TConfig>;\n runWith<T>(ctx: ExtensionToolContext<TConfig>, fn: () => Promise<T>): Promise<T>;\n}\n\n/**\n * Create an extension. With buildConfig: register(registry, userConfig, opts?).\n * Without buildConfig: register(registry, opts?) where opts = { only?, namePrefixes? }; config comes only from each tool's tool.yaml.\n */\nfunction resolvePackagePath(options: { packagePath?: string; importMeta?: ImportMetaLike }): string {\n if (options.packagePath != null && options.packagePath !== \"\") return options.packagePath;\n if (options.importMeta?.url) return path.dirname(fileURLToPath(options.importMeta.url));\n throw new Error(\"createExtension: provide packagePath or importMeta\");\n}\n\nexport function createExtension<TConfig = Record<string, unknown>, TUserConfig = RegisterOptionsDefaultOnly>(\n options: CreateExtensionOptions<TConfig, TUserConfig>,\n): CreateExtensionResult<TConfig, TUserConfig> {\n const packagePath = resolvePackagePath(options);\n const kind = options.kind;\n const buildConfig = \"buildConfig\" in options ? options.buildConfig : undefined;\n type Ctx = ExtensionToolContext<TConfig>;\n const contextRunner = createContextRunner<Ctx>();\n\n return {\n register(registry, userConfigOrOpts, opts) {\n const config = buildConfig\n ? (buildConfig as (u: TUserConfig) => TConfig)(userConfigOrOpts as TUserConfig)\n : (userConfigOrOpts as Record<string, unknown> | undefined);\n return registerExtension(registry, {\n packagePath,\n kind,\n config,\n getContextRunner: () => contextRunner,\n only: opts?.only ?? (userConfigOrOpts as RegisterOptionsDefaultOnly | undefined)?.only,\n namePrefixes: opts?.namePrefixes ?? (userConfigOrOpts as RegisterOptionsDefaultOnly | undefined)?.namePrefixes,\n });\n },\n getContext(): ExtensionToolContext<TConfig> {\n return contextRunner.getContext() as ExtensionToolContext<TConfig>;\n },\n runWith<T>(ctx: ExtensionToolContext<TConfig>, fn: () => Promise<T>): Promise<T> {\n return contextRunner.runWith(ctx, fn) as Promise<T>;\n },\n };\n}\n","/**\n * Build step: scan project for @tool, emit extension manifest (core-tools-manifest.json) and copy *.tool.yaml / *.example.yaml.\n * Extensions run this at build time; agent-tool reads the manifest when the extension's register is called.\n */\nimport { writeFileSync, mkdirSync, existsSync, readdirSync, copyFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { scanForTools } from \"../../tools/function/scanner.js\";\nimport type { ExtensionManifestEntry } from \"./registerFromManifest.js\";\nimport type { HitlSideEffect } from \"../../core/types/ToolSpec.js\";\n\nexport interface GenerateExtensionManifestOptions {\n /** Project root (default: process.cwd()). */\n projectRoot?: string;\n /** Output directory for manifest and copied tool.yaml (default: projectRoot/dist). */\n outDir?: string;\n /** Manifest kind (default: \"core\"). */\n kind?: string;\n /** Include globs for TS files (default: all .ts). */\n include?: string[];\n /** Path to tsconfig (default: projectRoot/tsconfig.json). */\n tsconfigPath?: string;\n /** Subdirs to recursively copy *.tool.yaml and *.example.yaml from (e.g. [\"src\"]). */\n copyToolYamlDirs?: string[];\n}\n\nfunction copyToolYamlRecursive(srcDir: string, destDir: string): number {\n if (!existsSync(srcDir)) return 0;\n let copied = 0;\n for (const e of readdirSync(srcDir, { withFileTypes: true })) {\n const srcPath = path.join(srcDir, e.name);\n const destPath = path.join(destDir, e.name);\n if (e.isFile() && (e.name.endsWith(\".tool.yaml\") || e.name.endsWith(\".example.yaml\"))) {\n if (!existsSync(destDir)) mkdirSync(destDir, { recursive: true });\n copyFileSync(srcPath, destPath);\n copied++;\n } else if (e.isDirectory()) {\n copied += copyToolYamlRecursive(srcPath, destPath);\n }\n }\n return copied;\n}\n\n/**\n * Scan project for @tool, write core-tools-manifest.json and recursively copy *.tool.yaml and *.example.yaml to outDir.\n * Returns the written manifest path and number of tools.\n */\nexport function generateExtensionManifest(\n projectRoot: string = process.cwd(),\n options: GenerateExtensionManifestOptions = {},\n): { manifestPath: string; toolsCount: number; toolYamlCopied: number } {\n const root = path.resolve(projectRoot);\n const outDir = path.resolve(options.outDir ?? path.join(root, \"dist\"));\n const kind = options.kind ?? \"core\";\n\n const { specs, errors } = scanForTools({\n projectPath: root,\n include: options.include ?? [\"**/*.ts\"],\n tsconfigPath: options.tsconfigPath,\n });\n\n if (errors.length > 0) {\n console.warn(\"generateExtensionManifest: scan errors\", errors);\n }\n\n const entries: ExtensionManifestEntry[] = specs.map((spec) => {\n const sourcePathNoExt = (spec.sourcePath ?? \"\").replace(/\\.(ts|tsx)$/i, \"\");\n const pathBasedName = sourcePathNoExt.replace(/^src\\//, \"\").replace(/\\//g, \".\");\n const name = spec.exportName ?? pathBasedName;\n const sideEffect: HitlSideEffect =\n (spec._meta?.hitl?.sideEffect as HitlSideEffect) ?? \"none\";\n return {\n name,\n description: spec.description ?? sourcePathNoExt,\n inputSchema: spec.inputSchema ?? { type: \"object\", additionalProperties: true },\n outputSchema: spec.outputSchema ?? { type: \"object\", additionalProperties: true },\n sourcePath: sourcePathNoExt,\n exportName: spec.exportName ?? \"\",\n sideEffect,\n };\n });\n\n if (!existsSync(outDir)) mkdirSync(outDir, { recursive: true });\n const manifestPath = path.join(outDir, \"core-tools-manifest.json\");\n writeFileSync(\n manifestPath,\n JSON.stringify({ kind, tools: entries }, null, 2),\n \"utf-8\",\n );\n\n let toolYamlCopied = 0;\n const copyDirs = options.copyToolYamlDirs;\n if (copyDirs?.length) {\n for (const d of copyDirs) {\n const srcDir = path.join(root, d);\n const destDir = path.join(outDir, d);\n try {\n toolYamlCopied += copyToolYamlRecursive(srcDir, destDir);\n } catch {\n // ignore\n }\n }\n }\n\n return { manifestPath, toolsCount: entries.length, toolYamlCopied };\n}\n\n/**\n * Build step for extensions: scan src folder and subfolders, emit manifest, copy tool.yaml.\n * Call from extension's build script (e.g. tsx generate-manifest.ts).\n */\nexport function generateManifest(\n projectRoot: string = process.cwd(),\n options: Omit<GenerateExtensionManifestOptions, \"projectRoot\"> = {},\n): void {\n const { manifestPath, toolsCount, toolYamlCopied } = generateExtensionManifest(projectRoot, {\n include: [\"src/**/*.ts\"],\n copyToolYamlDirs: [\"src\"],\n ...options,\n });\n console.log(`Wrote ${toolsCount} tools to ${path.relative(projectRoot, manifestPath)}`);\n if (toolYamlCopied > 0) console.log(`Copied ${toolYamlCopied} .tool.yaml/.example.yaml file(s) to dist`);\n}\n","/**\n * Overlay extension config on defaults. Use in tools: set defaults first, then override with ctx.config.\n * Only keys present in `defaults` are overridden; values from `config` are used when defined (not undefined).\n */\nexport function overrideWithConfig<T extends Record<string, unknown>>(\n defaults: T,\n config: unknown,\n): T {\n const c =\n config != null && typeof config === \"object\" && !Array.isArray(config)\n ? (config as Record<string, unknown>)\n : {};\n const out = { ...defaults };\n for (const key of Object.keys(defaults)) {\n if (key in c && c[key] !== undefined) {\n (out as Record<string, unknown>)[key] = c[key];\n }\n }\n return out;\n}\n","/**\n * Convert \"groups\" + \"only\" options and a group→prefix map into only/namePrefixes for registerToolsFromManifest.\n * Extensions define their own group names and prefixes (e.g. fs -> \"core/fs.\").\n */\nexport interface GroupPrefixOptions {\n /** Only register tools in these groups (e.g. [\"fs\", \"http\"]). */\n groups?: string[];\n /** Only register these tool names. Takes precedence over groups. */\n only?: string[];\n /** Map group name -> name prefix (e.g. { fs: \"core/fs.\", http: \"core/http.\" }). */\n groupPrefixMap: Record<string, string>;\n}\n\nexport interface ResolvedOnlyNamePrefixes {\n only?: string[];\n namePrefixes?: string[];\n}\n\n/**\n * Resolve groups/only + groupPrefixMap to only and namePrefixes for registerToolsFromManifest.\n */\nexport function getGroupNamePrefixes(options: GroupPrefixOptions): ResolvedOnlyNamePrefixes {\n const { groups, only, groupPrefixMap } = options;\n const onlySet = only?.length ? new Set(only) : null;\n const namePrefixes =\n !onlySet && groups?.length\n ? (groups.map((g) => groupPrefixMap[g]).filter((x): x is string => x != null) as string[])\n : undefined;\n return {\n ...(onlySet ? { only: Array.from(onlySet) } : {}),\n ...(namePrefixes?.length ? { namePrefixes } : {}),\n };\n}\n","import { lookup } from \"node:dns/promises\";\nimport { createTaggedError } from \"../core/runtime/Retry.js\";\n\n/**\n * Options for validateUrl. Unified rule: allow iff host is in allowedHosts AND not in blockedHosts.\n * - \"Default allow all + blocklist\": allowedHosts: [\"*\"], blockedHosts: [\"*.internal\", ...]\n * - \"Default disallow all + allowlist\": allowedHosts: [\"api.github.com\", ...], blockedHosts: []\n */\nexport interface ValidateUrlOptions {\n /** Allow only these hosts. Use [\"*\"] for allow-all. Supports \"*.example.com\", exact host. */\n allowedHosts: string[];\n /** Block these hosts even if allowed. Supports \"*.internal\", exact host. Merged with allowlist. */\n blockedHosts: string[];\n /** CIDR ranges to block (resolved IP). */\n blockedCidrs: string[];\n}\n\n/**\n * Validate a URL: allow iff (host in allowedHosts) AND (host not in blockedHosts). Then check blockedCidrs on resolved IP.\n *\n * @throws HTTP_DISALLOWED_HOST if the URL is blocked\n */\nexport async function validateUrl(url: string, options: ValidateUrlOptions): Promise<URL> {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw createTaggedError(\n \"HTTP_DISALLOWED_HOST\",\n `Invalid URL: ${url}`,\n { url },\n );\n }\n\n // Only allow http/https\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw createTaggedError(\n \"HTTP_DISALLOWED_HOST\",\n `Protocol not allowed: ${parsed.protocol}. Only http: and https: are supported.`,\n { url, protocol: parsed.protocol },\n );\n }\n\n const hostname = parsed.hostname;\n\n if (!isHostAllowed(hostname, options.allowedHosts)) {\n throw createTaggedError(\n \"HTTP_DISALLOWED_HOST\",\n `Host \"${hostname}\" is not in the allowed hosts list`,\n { url, hostname, allowedHosts: options.allowedHosts },\n );\n }\n if (isHostBlocked(hostname, options.blockedHosts)) {\n throw createTaggedError(\n \"HTTP_DISALLOWED_HOST\",\n `Host \"${hostname}\" is in the blocked hosts list`,\n { url, hostname, blockedHosts: options.blockedHosts },\n );\n }\n\n // DNS resolve and check against blocked CIDRs\n try {\n const { address } = await lookup(hostname);\n if (isIpInBlockedCidrs(address, options.blockedCidrs)) {\n throw createTaggedError(\n \"HTTP_DISALLOWED_HOST\",\n `Host \"${hostname}\" resolves to blocked IP: ${address}`,\n { url, hostname, resolvedIp: address },\n );\n }\n } catch (err) {\n // Re-throw our tagged errors\n if (err instanceof Error && (err as any).kind === \"HTTP_DISALLOWED_HOST\") {\n throw err;\n }\n // DNS resolution failure — block by default\n throw createTaggedError(\n \"HTTP_DISALLOWED_HOST\",\n `DNS resolution failed for host \"${hostname}\": ${err instanceof Error ? err.message : String(err)}`,\n { url, hostname },\n );\n }\n\n return parsed;\n}\n\n/**\n * Check if a hostname matches any entry in the allowed hosts list.\n * Supports: exact \"*\" (allow any host), wildcard prefix (e.g. \"*.github.com\"), or exact host.\n */\nfunction isHostAllowed(hostname: string, allowedHosts: string[]): boolean {\n for (const pattern of allowedHosts) {\n if (pattern === \"*\") {\n return true;\n }\n if (pattern.startsWith(\"*.\")) {\n const suffix = pattern.slice(1); // \".github.com\"\n if (hostname.endsWith(suffix) || hostname === pattern.slice(2)) {\n return true;\n }\n } else if (hostname === pattern) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Check if a hostname matches any entry in the blocked hosts list (same pattern rules as allowlist).\n */\nfunction isHostBlocked(hostname: string, blockedHosts: string[]): boolean {\n for (const pattern of blockedHosts) {\n if (pattern === \"*\") {\n return true;\n }\n if (pattern.startsWith(\"*.\")) {\n const suffix = pattern.slice(1);\n if (hostname.endsWith(suffix) || hostname === pattern.slice(2)) {\n return true;\n }\n } else if (hostname === pattern) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Check if an IPv4 address falls within any blocked CIDR range.\n */\nexport function isIpInBlockedCidrs(ip: string, cidrs: string[]): boolean {\n // Handle IPv4-mapped IPv6\n const normalizedIp = normalizeIp(ip);\n if (!normalizedIp) return false;\n\n for (const cidr of cidrs) {\n if (cidr.includes(\":\")) {\n // IPv6 CIDR — skip for IPv4 addresses\n if (!ip.includes(\":\")) continue;\n if (isIpv6InCidr(ip, cidr)) return true;\n } else {\n if (isIpv4InCidr(normalizedIp, cidr)) return true;\n }\n }\n return false;\n}\n\nfunction normalizeIp(ip: string): string | null {\n // Handle IPv4-mapped IPv6 (e.g. \"::ffff:127.0.0.1\")\n if (ip.startsWith(\"::ffff:\")) {\n return ip.slice(7);\n }\n // Pure IPv4\n if (/^\\d+\\.\\d+\\.\\d+\\.\\d+$/.test(ip)) {\n return ip;\n }\n return null;\n}\n\nfunction isIpv4InCidr(ip: string, cidr: string): boolean {\n const [cidrIp, prefixStr] = cidr.split(\"/\");\n if (!cidrIp || !prefixStr) return false;\n\n const prefix = parseInt(prefixStr, 10);\n if (isNaN(prefix) || prefix < 0 || prefix > 32) return false;\n\n const ipNum = ipv4ToNum(ip);\n const cidrNum = ipv4ToNum(cidrIp);\n if (ipNum === null || cidrNum === null) return false;\n\n const mask = prefix === 0 ? 0 : (~0 << (32 - prefix)) >>> 0;\n return (ipNum & mask) === (cidrNum & mask);\n}\n\nfunction ipv4ToNum(ip: string): number | null {\n const parts = ip.split(\".\");\n if (parts.length !== 4) return null;\n let num = 0;\n for (const part of parts) {\n const n = parseInt(part, 10);\n if (isNaN(n) || n < 0 || n > 255) return null;\n num = (num << 8) | n;\n }\n return num >>> 0;\n}\n\nfunction isIpv6InCidr(ip: string, cidr: string): boolean {\n // Simplified IPv6 CIDR matching for common cases (::1, fc00::, fe80::)\n const [cidrIp, prefixStr] = cidr.split(\"/\");\n if (!cidrIp || !prefixStr) return false;\n\n const prefix = parseInt(prefixStr, 10);\n if (isNaN(prefix)) return false;\n\n const ipBytes = expandIpv6(ip);\n const cidrBytes = expandIpv6(cidrIp);\n if (!ipBytes || !cidrBytes) return false;\n\n // Compare prefix bits\n const fullBytes = Math.floor(prefix / 8);\n for (let i = 0; i < fullBytes && i < 16; i++) {\n if (ipBytes[i] !== cidrBytes[i]) return false;\n }\n\n const remainingBits = prefix % 8;\n if (remainingBits > 0 && fullBytes < 16) {\n const mask = (~0 << (8 - remainingBits)) & 0xff;\n if ((ipBytes[fullBytes]! & mask) !== (cidrBytes[fullBytes]! & mask)) return false;\n }\n\n return true;\n}\n\nfunction expandIpv6(ip: string): number[] | null {\n // Remove zone ID\n const zoneIdx = ip.indexOf(\"%\");\n if (zoneIdx !== -1) ip = ip.slice(0, zoneIdx);\n\n const parts = ip.split(\"::\");\n if (parts.length > 2) return null;\n\n const bytes: number[] = new Array(16).fill(0);\n\n const expandGroup = (group: string): number[] => {\n if (!group) return [];\n return group.split(\":\").flatMap((hex) => {\n const val = parseInt(hex || \"0\", 16);\n return [(val >> 8) & 0xff, val & 0xff];\n });\n };\n\n if (parts.length === 1) {\n const expanded = expandGroup(parts[0]!);\n if (expanded.length !== 16) return null;\n return expanded;\n }\n\n const left = expandGroup(parts[0]!);\n const right = expandGroup(parts[1]!);\n\n if (left.length + right.length > 16) return null;\n\n for (let i = 0; i < left.length; i++) bytes[i] = left[i]!;\n for (let i = 0; i < right.length; i++) bytes[16 - right.length + i] = right[i]!;\n\n return bytes;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/api/extension/contextRunner.ts","../src/api/extension/dynamicImportAdapter.ts","../src/api/extension/loadToolYaml.ts","../src/api/extension/registerFromManifest.ts","../src/api/extension/resolvePackageRoot.ts","../src/api/extension/registerExtension.ts","../src/api/extension/createExtension.ts","../src/api/extension/generateExtensionManifest.ts","../src/api/extension/overrideWithConfig.ts","../src/api/extension/groupPrefix.ts","../src/security/ssrf.ts"],"names":["AsyncLocalStorage","path","pathToFileURL","existsSync","readFileSync","yaml","statSync","createToolSpec","fileURLToPath","readdirSync","copyFileSync","scanForTools","writeFileSync","createTaggedError","lookup"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Generic context injection for extension tools (e.g. builtin).\n * Any extension that needs to inject config (sandbox, allowedHosts, etc.) into handlers uses this.\n */\nimport { AsyncLocalStorage } from \"node:async_hooks\";\n\nexport interface ContextRunner<T> {\n runWith(ctx: T, fn: () => Promise<unknown>): Promise<unknown>;\n getContext(): T;\n}\n\n/**\n * Create a context runner for an extension. Handlers call getContext() to read config.\n * Adapter calls runWith(ctx, () => handler(args)) so getContext() returns ctx.\n */\nexport function createContextRunner<T>(): ContextRunner<T> {\n const storage = new AsyncLocalStorage<T>();\n return {\n runWith(ctx: T, fn: () => Promise<unknown>): Promise<unknown> {\n return storage.run(ctx, fn);\n },\n getContext(): T {\n const ctx = storage.getStore();\n if (ctx === undefined) {\n throw new Error(\"Extension context not set; invoke only through the extension adapter.\");\n }\n return ctx;\n },\n };\n}\n","/**\n * Generic adapter for extensions that discover tools via manifest and load handlers by dynamic import.\n * Any extension (builtin, etc.) that uses @tool scan → manifest and runs handlers with injected context uses this.\n */\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { ToolAdapter, ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport type { Evidence } from \"../../core/types/ToolResult.js\";\n\n/** If spec.inputSchema wraps params in \"args\", return args.args for the handler; else return args. */\nfunction unwrapArgsForHandler(spec: ToolSpec, args: unknown): unknown {\n if (args == null || typeof args !== \"object\" || Array.isArray(args)) return args;\n const s = spec.inputSchema as Record<string, unknown>;\n if (s?.type !== \"object\" || !s.properties || typeof s.properties !== \"object\") return args;\n const props = s.properties as Record<string, unknown>;\n const argsProp = props.args;\n if (\n argsProp != null &&\n typeof argsProp === \"object\" &&\n (argsProp as Record<string, unknown>).type === \"object\" &&\n (argsProp as Record<string, unknown>).properties != null\n ) {\n const obj = args as Record<string, unknown>;\n if (Object.keys(obj).length === 1 && \"args\" in obj && typeof obj.args === \"object\" && obj.args !== null) {\n return obj.args;\n }\n }\n return args;\n}\n\nexport interface ExtensionToolResult {\n result: unknown;\n evidence: Evidence[];\n}\n\nexport interface DynamicImportAdapterOptions<TContext> {\n kind: string;\n packageRoot: string;\n /**\n * Build context from execCtx, spec, and merged request args.\n * Framework merges defaultArgs (tool.yaml) with request args; implementor can merge into ctx.config\n * so handlers read resolved config from context instead of re-resolving in each handler.\n */\n getExtensionContext: (execCtx: ExecContext, spec: ToolSpec, mergedArgs?: Record<string, unknown>) => TContext;\n contextRunner: { runWith(ctx: TContext, fn: () => Promise<ExtensionToolResult>): Promise<ExtensionToolResult> };\n}\n\n/**\n * Create an adapter that loads handlers by spec._meta.sourcePath and exportName, then runs with extension context.\n */\nexport function createDynamicImportAdapter<TContext>(\n options: DynamicImportAdapterOptions<TContext>,\n): ToolAdapter {\n const { kind, packageRoot, getExtensionContext, contextRunner } = options;\n return {\n kind: kind as ToolAdapter[\"kind\"],\n async invoke(\n spec: ToolSpec,\n args: unknown,\n execCtx: ExecContext,\n ): Promise<{ result: unknown; raw?: unknown }> {\n const meta = spec._meta as {\n sourcePath?: string;\n exportName?: string;\n defaultArgs?: Record<string, unknown>;\n packageRoot?: string;\n } | undefined;\n const sourcePath = meta?.sourcePath;\n const exportName = meta?.exportName;\n if (!sourcePath || !exportName) {\n throw new Error(`Extension tool ${spec.name} missing _meta.sourcePath or _meta.exportName`);\n }\n const defaultArgs = meta?.defaultArgs ?? {};\n const mergedArgs =\n Object.keys(defaultArgs).length === 0\n ? (args as Record<string, unknown>)\n : { ...defaultArgs, ...(args as Record<string, unknown>) };\n const handlerArgs = unwrapArgsForHandler(spec, mergedArgs);\n const resolvedPackageRoot = meta?.packageRoot ?? packageRoot;\n const modulePath = path.join(resolvedPackageRoot, `${sourcePath}.js`);\n const mod = await import(pathToFileURL(modulePath).href);\n const handler = mod[exportName];\n if (typeof handler !== \"function\") {\n throw new Error(\n `Extension tool ${spec.name}: export \"${exportName}\" from ${sourcePath} is not a function`,\n );\n }\n const ctx = getExtensionContext(execCtx, spec, mergedArgs as Record<string, unknown>);\n const output = await contextRunner.runWith(ctx, () => handler(handlerArgs));\n // Return full envelope so pipeline output validation (outputSchema: { result, evidence }) passes.\n return {\n result: { result: output.result, evidence: output.evidence },\n raw: { evidence: output.evidence },\n };\n },\n };\n}\n","/**\n * Load per-tool default args/config from <base>.tool.yaml (framework-defined format).\n *\n * Supported YAML format:\n * tool:\n * defaults: # optional; same level as list; merged into every tool's defaultArgs\n * sandboxRoot: \"\"\n * maxBytes: 5242880\n * list:\n * - name: fetchText\n * timeoutMs: 5000\n * maxBytes: 1048576\n * (find item where name === tool base name; result = { ...defaults, ...item } minus name)\n */\nimport { readFileSync, existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport yaml from \"js-yaml\";\n\n/**\n * Load tool.yaml for a given tool. Path: packageRoot / dirname(sourcePath) / basename(sourcePath).tool.yaml\n * Returns default args (and config) for the tool, or undefined if file missing or no matching entry.\n * If tool.defaults exists (same level as tool.list), it is merged first; list item fields override.\n */\nexport function loadToolYaml(\n packageRoot: string,\n sourcePath: string,\n): Record<string, unknown> | undefined {\n const dir = path.dirname(sourcePath);\n const base = path.basename(sourcePath);\n const dirPath = path.join(packageRoot, dir);\n const yamlPath = existsSync(path.join(dirPath, `${base}.tool.yaml`))\n ? path.join(dirPath, `${base}.tool.yaml`)\n : path.join(dirPath, `${base}.example.yaml`);\n if (!existsSync(yamlPath)) return undefined;\n try {\n const raw = readFileSync(yamlPath, \"utf-8\");\n const data = yaml.load(raw) as unknown;\n if (data == null || typeof data !== \"object\" || Array.isArray(data)) return undefined;\n const obj = data as Record<string, unknown>;\n const toolBlock = obj?.tool as Record<string, unknown> | undefined;\n const arr = toolBlock?.list;\n if (!Array.isArray(arr)) return undefined;\n const defaults =\n toolBlock?.defaults != null &&\n typeof toolBlock.defaults === \"object\" &&\n !Array.isArray(toolBlock.defaults)\n ? (toolBlock.defaults as Record<string, unknown>)\n : {};\n const item = arr.find(\n (e: unknown) => e != null && typeof e === \"object\" && (e as Record<string, unknown>).name === base,\n ) as Record<string, unknown> | undefined;\n if (!item || typeof item !== \"object\") return undefined;\n const { name: _n, ...rest } = item;\n const merged = { ...defaults, ...rest };\n if (Object.keys(merged).length === 0) return undefined;\n return merged;\n } catch {\n return undefined;\n }\n}\n","/**\n * Generic manifest-based registration for extensions.\n * Reads a pre-built JSON manifest (extension produces it at build time; agent-tool does not scan @tool).\n * Registers ToolSpecs with the registry. When packageRoot is provided, loads <base>.tool.yaml per tool and sets defaultArgs in _meta.\n */\nimport { readFileSync, existsSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { createToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { ToolSpec, HitlSideEffect } from \"../../core/types/ToolSpec.js\";\nimport type { ToolRegistry } from \"../../core/registry/ToolRegistry.js\";\nimport { loadToolYaml } from \"./loadToolYaml.js\";\n\n/** Manifest entry shape (convention: extension build emits this, e.g. from @tool scan). */\nexport interface ExtensionManifestEntry {\n /** Tool name (e.g. \"exec.runCommand\"). Legacy manifests may have coreName instead. */\n name?: string;\n /** @deprecated Use name instead. Legacy: e.g. \"core/src.exec.runCommand\". */\n coreName?: string;\n description: string;\n inputSchema: object;\n outputSchema: object;\n sourcePath: string;\n exportName: string;\n sideEffect: HitlSideEffect;\n}\n\n/** Loaded manifest: entries + optional kind from manifest file. */\nexport interface LoadedExtensionManifest {\n kind?: string;\n entries: ExtensionManifestEntry[];\n}\n\nexport interface RegisterFromManifestOptions {\n /** Path to manifest JSON (or directory containing core-tools-manifest.json). */\n manifestPathOrDir: string;\n /** Tool kind; if omitted, uses manifest.kind or \"extension\". */\n kind?: string;\n /** Filter: only register these tool names. */\n only?: string[];\n /** Filter: only register tools whose name starts with one of these prefixes. */\n namePrefixes?: string[];\n /** Extension package root (e.g. dist); when set, loads <base>.tool.yaml per tool and sets defaultArgs in _meta. */\n packageRoot?: string;\n}\n\n/**\n * Load manifest from path. Supports array or { kind?, tools: ExtensionManifestEntry[] }.\n * Returns entries + optional kind so framework can use dynamic kind from manifest.\n */\nexport function loadExtensionManifest(manifestPathOrDir: string): LoadedExtensionManifest {\n const p = path.resolve(manifestPathOrDir);\n let manifestPath: string;\n if (existsSync(p) && statSync(p).isFile()) {\n manifestPath = p;\n } else {\n const inDir = path.join(p, \"core-tools-manifest.json\");\n const inDist = path.join(p, \"dist\", \"core-tools-manifest.json\");\n manifestPath = existsSync(inDir) ? inDir : inDist;\n }\n const raw = readFileSync(manifestPath, \"utf-8\");\n const parsed = JSON.parse(raw) as ExtensionManifestEntry[] | { kind?: string; tools: ExtensionManifestEntry[] };\n if (Array.isArray(parsed)) {\n return { entries: parsed };\n }\n return { kind: parsed.kind, entries: parsed.tools ?? [] };\n}\n\n/**\n * Register tools from a manifest with the registry. Returns the list of registered specs.\n * Extension packages call this from their register (or equivalent) with their package root.\n */\nexport function registerToolsFromManifest(\n registry: ToolRegistry,\n options: RegisterFromManifestOptions,\n): ToolSpec[] {\n const { manifestPathOrDir, kind: kindOpt, only, namePrefixes, packageRoot } = options;\n const loaded = loadExtensionManifest(manifestPathOrDir);\n const kind = (kindOpt ?? loaded.kind ?? \"extension\") as ToolSpec[\"kind\"];\n const entries = loaded.entries;\n const onlySet = only?.length ? new Set(only) : null;\n const registered: ToolSpec[] = [];\n\n for (const entry of entries) {\n const toolName =\n entry.name ??\n (entry.coreName != null\n ? entry.coreName.replace(/^[^/]+\\//, \"\").replace(/^src\\./, \"\")\n : entry.sourcePath.replace(/^src\\//, \"\").replace(/\\//g, \".\"));\n let spec = createToolSpec({\n name: toolName,\n kind,\n description: entry.description,\n inputSchema: entry.inputSchema,\n outputSchema: entry.outputSchema,\n capabilities: [],\n sideEffect: entry.sideEffect,\n });\n if (onlySet && !onlySet.has(spec.name)) continue;\n if (namePrefixes?.length && !namePrefixes.some((prefix) => spec.name.startsWith(prefix))) {\n continue;\n }\n const defaultArgs =\n packageRoot != null ? loadToolYaml(packageRoot, entry.sourcePath) : undefined;\n spec = {\n ...spec,\n _meta: {\n ...spec._meta,\n sourcePath: entry.sourcePath,\n exportName: entry.exportName,\n shortName: toolName,\n ...(packageRoot != null && { packageRoot }),\n ...(defaultArgs != null && Object.keys(defaultArgs).length > 0 && { defaultArgs }),\n },\n } as ToolSpec;\n registry.register(spec);\n registered.push(spec);\n }\n return registered;\n}\n","/**\n * Resolve extension package root for dynamic import (dist when built, else dir).\n * Accepts import.meta.url (file:) or a directory path (e.g. __dirname).\n */\nimport path from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\n\nexport function resolveExtensionPackageRoot(metaUrlOrPath: string): string {\n const dir = metaUrlOrPath.startsWith(\"file:\")\n ? path.dirname(fileURLToPath(metaUrlOrPath))\n : path.resolve(metaUrlOrPath);\n const dist = path.join(dir, \"dist\");\n return existsSync(dist) ? dist : dir;\n}\n","/**\n * One-shot: load pre-built manifest from package, register all specs, create adapter.\n * Framework does NOT scan source for @tool; it reads manifest (e.g. core-tools-manifest.json)\n * produced by the extension's build. Extension passes packagePath, config, getContextRunner.\n */\nimport type { ToolAdapter } from \"../../core/types/ToolSpec.js\";\nimport type { ToolRegistry } from \"../../core/registry/ToolRegistry.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport type { ContextRunner } from \"./contextRunner.js\";\nimport { createDynamicImportAdapter } from \"./dynamicImportAdapter.js\";\nimport type { ExtensionToolResult } from \"./dynamicImportAdapter.js\";\nimport { registerToolsFromManifest, loadExtensionManifest } from \"./registerFromManifest.js\";\nimport { resolveExtensionPackageRoot } from \"./resolvePackageRoot.js\";\n\nexport interface RegisterExtensionOptions<TContext> {\n /** Package root (e.g. __dirname of extension's entry). Manifest is read from here. */\n packagePath: string;\n /** Tool kind; if omitted, uses manifest.kind or \"extension\". */\n kind?: string;\n /** Optional default config; merged with each tool's tool.yaml (spec._meta.defaultArgs). Context config = { ...config, ...toolDefaultArgs }. */\n config?: unknown;\n /** Returns the context runner (extension's createContextRunner()). */\n getContextRunner: () => ContextRunner<TContext>;\n /** Filter: only register these tool names. */\n only?: string[];\n /** Filter: only register tools whose name starts with one of these prefixes. */\n namePrefixes?: string[];\n}\n\n/**\n * Load manifest from package (pre-built JSON; no @tool scanning). Register all specs, create and return adapter.\n */\nexport function registerExtension<TContext extends { execCtx: ExecContext; config: unknown }>(\n registry: ToolRegistry,\n options: RegisterExtensionOptions<TContext>,\n): ToolAdapter {\n const { packagePath, kind: kindOpt, config, getContextRunner, only, namePrefixes } = options;\n const packageRoot = resolveExtensionPackageRoot(packagePath);\n const contextRunner = getContextRunner();\n const loaded = loadExtensionManifest(packagePath);\n const kind = kindOpt ?? loaded.kind ?? \"extension\";\n\n registerToolsFromManifest(registry, {\n manifestPathOrDir: packagePath,\n kind,\n only,\n namePrefixes,\n packageRoot,\n });\n\n const adapter = createDynamicImportAdapter<TContext>({\n kind,\n packageRoot,\n getExtensionContext: (\n execCtx: ExecContext,\n spec: import(\"../../core/types/ToolSpec.js\").ToolSpec,\n mergedArgs?: Record<string, unknown>,\n ) => {\n const defaultArgs = (spec._meta as { defaultArgs?: Record<string, unknown> } | undefined)?.defaultArgs ?? {};\n const baseConfig = (config !== undefined ? (config as Record<string, unknown>) : {}) as Record<string, unknown>;\n const toolOverrides = baseConfig?.toolOverrides as Record<string, Record<string, unknown>> | undefined;\n const shortName = (spec._meta as { shortName?: string } | undefined)?.shortName ?? spec.name;\n // Derive package-scoped key (no version): e.g. \"npm.easynet.agent.tool.buildin::fs.listDir\" so config survives package version bumps\n const prefixWithVersion =\n shortName && spec.name.endsWith(shortName) && spec.name.length > shortName.length\n ? spec.name.slice(0, spec.name.length - shortName.length - 1)\n : \"\";\n const parts = prefixWithVersion ? prefixWithVersion.split(\".\") : [];\n const packageScopedKey =\n parts.length > 1 ? `${parts.slice(0, -1).join(\".\")}::${shortName}` : \"\";\n const perTool = (toolOverrides?.[spec.name] ??\n (packageScopedKey ? toolOverrides?.[packageScopedKey] : undefined) ??\n toolOverrides?.[shortName] ??\n {}) as Record<string, unknown>;\n const packagePrefix = parts.length > 1 ? parts.slice(0, -1).join(\".\") : \"\";\n const packageDefaults = baseConfig?.packageDefaults as Record<string, Record<string, unknown>> | undefined;\n const packageDefaultsForPkg =\n (packagePrefix && packageDefaults?.[packagePrefix]) ??\n (prefixWithVersion && packageDefaults?.[prefixWithVersion]) ??\n {};\n const baseWithoutOverrides = { ...baseConfig };\n delete (baseWithoutOverrides as Record<string, unknown>).toolOverrides;\n delete (baseWithoutOverrides as Record<string, unknown>).packageDefaults;\n const resolvedConfig = {\n ...defaultArgs,\n ...baseWithoutOverrides,\n ...packageDefaultsForPkg,\n ...perTool,\n ...(mergedArgs ?? {}),\n } as TContext[\"config\"];\n return { execCtx, config: resolvedConfig } as TContext;\n },\n contextRunner: {\n runWith(ctx: TContext, fn: () => Promise<ExtensionToolResult>) {\n return contextRunner.runWith(ctx, fn) as Promise<ExtensionToolResult>;\n },\n },\n });\n return adapter;\n}\n","/**\n * One-shot extension bootstrap: context runner + register + getContext/runWith.\n * Config can be extension-level (buildConfig) or per-tool only (defaultConfig in opts, merged with tool.yaml).\n */\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { ToolAdapter } from \"../../core/types/ToolSpec.js\";\nimport type { ToolRegistry } from \"../../core/registry/ToolRegistry.js\";\nimport { createContextRunner } from \"./contextRunner.js\";\nimport { registerExtension } from \"./registerExtension.js\";\nimport type { ExtensionToolContext } from \"./types.js\";\n\n/** Pass import.meta so the framework derives packagePath (extension entry does not need path/fileURLToPath). */\nexport interface ImportMetaLike {\n url: string;\n}\n\n/** Options when config is built from userConfig (buildConfig). */\nexport interface CreateExtensionOptionsWithBuild<TConfig, TUserConfig> {\n packagePath?: string;\n importMeta?: ImportMetaLike;\n kind?: string;\n buildConfig: (userConfig: TUserConfig) => TConfig;\n}\n\n/** Options when config is per-tool only (each tool's tool.yaml). */\nexport interface CreateExtensionOptionsDefaultOnly {\n packagePath?: string;\n importMeta?: ImportMetaLike;\n kind?: string;\n}\n\n/** Register opts when using per-tool config only: filter tools by name. */\nexport interface RegisterOptionsDefaultOnly {\n only?: string[];\n namePrefixes?: string[];\n}\n\nexport type CreateExtensionOptions<TConfig, TUserConfig> =\n | CreateExtensionOptionsWithBuild<TConfig, TUserConfig>\n | (CreateExtensionOptionsDefaultOnly & { buildConfig?: never });\n\nexport interface CreateExtensionResult<TConfig, TUserConfig> {\n register(\n registry: ToolRegistry,\n userConfigOrOpts: TUserConfig,\n options?: { only?: string[]; namePrefixes?: string[] },\n ): ToolAdapter;\n getContext(): ExtensionToolContext<TConfig>;\n runWith<T>(ctx: ExtensionToolContext<TConfig>, fn: () => Promise<T>): Promise<T>;\n}\n\n/**\n * Create an extension. With buildConfig: register(registry, userConfig, opts?).\n * Without buildConfig: register(registry, opts?) where opts = { only?, namePrefixes? }; config comes only from each tool's tool.yaml.\n */\nfunction resolvePackagePath(options: { packagePath?: string; importMeta?: ImportMetaLike }): string {\n if (options.packagePath != null && options.packagePath !== \"\") return options.packagePath;\n if (options.importMeta?.url) return path.dirname(fileURLToPath(options.importMeta.url));\n throw new Error(\"createExtension: provide packagePath or importMeta\");\n}\n\nexport function createExtension<TConfig = Record<string, unknown>, TUserConfig = RegisterOptionsDefaultOnly>(\n options: CreateExtensionOptions<TConfig, TUserConfig>,\n): CreateExtensionResult<TConfig, TUserConfig> {\n const packagePath = resolvePackagePath(options);\n const kind = options.kind;\n const buildConfig = \"buildConfig\" in options ? options.buildConfig : undefined;\n type Ctx = ExtensionToolContext<TConfig>;\n const contextRunner = createContextRunner<Ctx>();\n\n return {\n register(registry, userConfigOrOpts, opts) {\n const config = buildConfig\n ? (buildConfig as (u: TUserConfig) => TConfig)(userConfigOrOpts as TUserConfig)\n : (userConfigOrOpts as Record<string, unknown> | undefined);\n return registerExtension(registry, {\n packagePath,\n kind,\n config,\n getContextRunner: () => contextRunner,\n only: opts?.only ?? (userConfigOrOpts as RegisterOptionsDefaultOnly | undefined)?.only,\n namePrefixes: opts?.namePrefixes ?? (userConfigOrOpts as RegisterOptionsDefaultOnly | undefined)?.namePrefixes,\n });\n },\n getContext(): ExtensionToolContext<TConfig> {\n return contextRunner.getContext() as ExtensionToolContext<TConfig>;\n },\n runWith<T>(ctx: ExtensionToolContext<TConfig>, fn: () => Promise<T>): Promise<T> {\n return contextRunner.runWith(ctx, fn) as Promise<T>;\n },\n };\n}\n","/**\n * Build step: scan project for @tool, emit extension manifest (core-tools-manifest.json) and copy *.tool.yaml / *.example.yaml.\n * Extensions run this at build time; agent-tool reads the manifest when the extension's register is called.\n */\nimport { writeFileSync, mkdirSync, existsSync, readdirSync, copyFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { scanForTools } from \"../../tools/function/scanner.js\";\nimport type { ExtensionManifestEntry } from \"./registerFromManifest.js\";\nimport type { HitlSideEffect } from \"../../core/types/ToolSpec.js\";\n\nexport interface GenerateExtensionManifestOptions {\n /** Project root (default: process.cwd()). */\n projectRoot?: string;\n /** Output directory for manifest and copied tool.yaml (default: projectRoot/dist). */\n outDir?: string;\n /** Manifest kind (default: \"core\"). */\n kind?: string;\n /** Include globs for TS files (default: all .ts). */\n include?: string[];\n /** Path to tsconfig (default: projectRoot/tsconfig.json). */\n tsconfigPath?: string;\n /** Subdirs to recursively copy *.tool.yaml and *.example.yaml from (e.g. [\"src\"]). */\n copyToolYamlDirs?: string[];\n}\n\nfunction copyToolYamlRecursive(srcDir: string, destDir: string): number {\n if (!existsSync(srcDir)) return 0;\n let copied = 0;\n for (const e of readdirSync(srcDir, { withFileTypes: true })) {\n const srcPath = path.join(srcDir, e.name);\n const destPath = path.join(destDir, e.name);\n if (e.isFile() && (e.name.endsWith(\".tool.yaml\") || e.name.endsWith(\".example.yaml\"))) {\n if (!existsSync(destDir)) mkdirSync(destDir, { recursive: true });\n copyFileSync(srcPath, destPath);\n copied++;\n } else if (e.isDirectory()) {\n copied += copyToolYamlRecursive(srcPath, destPath);\n }\n }\n return copied;\n}\n\n/**\n * Scan project for @tool, write core-tools-manifest.json and recursively copy *.tool.yaml and *.example.yaml to outDir.\n * Returns the written manifest path and number of tools.\n */\nexport function generateExtensionManifest(\n projectRoot: string = process.cwd(),\n options: GenerateExtensionManifestOptions = {},\n): { manifestPath: string; toolsCount: number; toolYamlCopied: number } {\n const root = path.resolve(projectRoot);\n const outDir = path.resolve(options.outDir ?? path.join(root, \"dist\"));\n const kind = options.kind ?? \"core\";\n\n const { specs, errors } = scanForTools({\n projectPath: root,\n include: options.include ?? [\"**/*.ts\"],\n tsconfigPath: options.tsconfigPath,\n });\n\n if (errors.length > 0) {\n console.warn(\"generateExtensionManifest: scan errors\", errors);\n }\n\n const entries: ExtensionManifestEntry[] = specs.map((spec) => {\n const sourcePathNoExt = (spec.sourcePath ?? \"\").replace(/\\.(ts|tsx)$/i, \"\");\n const pathBasedName = sourcePathNoExt.replace(/^src\\//, \"\").replace(/\\//g, \".\");\n const name = spec.exportName ?? pathBasedName;\n const sideEffect: HitlSideEffect =\n (spec._meta?.hitl?.sideEffect as HitlSideEffect) ?? \"none\";\n return {\n name,\n description: spec.description ?? sourcePathNoExt,\n inputSchema: spec.inputSchema ?? { type: \"object\", additionalProperties: true },\n outputSchema: spec.outputSchema ?? { type: \"object\", additionalProperties: true },\n sourcePath: sourcePathNoExt,\n exportName: spec.exportName ?? \"\",\n sideEffect,\n };\n });\n\n if (!existsSync(outDir)) mkdirSync(outDir, { recursive: true });\n const manifestPath = path.join(outDir, \"core-tools-manifest.json\");\n writeFileSync(\n manifestPath,\n JSON.stringify({ kind, tools: entries }, null, 2),\n \"utf-8\",\n );\n\n let toolYamlCopied = 0;\n const copyDirs = options.copyToolYamlDirs;\n if (copyDirs?.length) {\n for (const d of copyDirs) {\n const srcDir = path.join(root, d);\n const destDir = path.join(outDir, d);\n try {\n toolYamlCopied += copyToolYamlRecursive(srcDir, destDir);\n } catch {\n // ignore\n }\n }\n }\n\n return { manifestPath, toolsCount: entries.length, toolYamlCopied };\n}\n\n/**\n * Build step for extensions: scan src folder and subfolders, emit manifest, copy tool.yaml.\n * Call from extension's build script (e.g. tsx generate-manifest.ts).\n */\nexport function generateManifest(\n projectRoot: string = process.cwd(),\n options: Omit<GenerateExtensionManifestOptions, \"projectRoot\"> = {},\n): void {\n const { manifestPath, toolsCount, toolYamlCopied } = generateExtensionManifest(projectRoot, {\n include: [\"src/**/*.ts\"],\n copyToolYamlDirs: [\"src\"],\n ...options,\n });\n console.log(`Wrote ${toolsCount} tools to ${path.relative(projectRoot, manifestPath)}`);\n if (toolYamlCopied > 0) console.log(`Copied ${toolYamlCopied} .tool.yaml/.example.yaml file(s) to dist`);\n}\n","/**\n * Overlay extension config on defaults. Use in tools: set defaults first, then override with ctx.config.\n * Only keys present in `defaults` are overridden; values from `config` are used when defined (not undefined).\n */\nexport function overrideWithConfig<T extends Record<string, unknown>>(\n defaults: T,\n config: unknown,\n): T {\n const c =\n config != null && typeof config === \"object\" && !Array.isArray(config)\n ? (config as Record<string, unknown>)\n : {};\n const out = { ...defaults };\n for (const key of Object.keys(defaults)) {\n if (key in c && c[key] !== undefined) {\n (out as Record<string, unknown>)[key] = c[key];\n }\n }\n return out;\n}\n","/**\n * Convert \"groups\" + \"only\" options and a group→prefix map into only/namePrefixes for registerToolsFromManifest.\n * Extensions define their own group names and prefixes (e.g. fs -> \"core/fs.\").\n */\nexport interface GroupPrefixOptions {\n /** Only register tools in these groups (e.g. [\"fs\", \"http\"]). */\n groups?: string[];\n /** Only register these tool names. Takes precedence over groups. */\n only?: string[];\n /** Map group name -> name prefix (e.g. { fs: \"core/fs.\", http: \"core/http.\" }). */\n groupPrefixMap: Record<string, string>;\n}\n\nexport interface ResolvedOnlyNamePrefixes {\n only?: string[];\n namePrefixes?: string[];\n}\n\n/**\n * Resolve groups/only + groupPrefixMap to only and namePrefixes for registerToolsFromManifest.\n */\nexport function getGroupNamePrefixes(options: GroupPrefixOptions): ResolvedOnlyNamePrefixes {\n const { groups, only, groupPrefixMap } = options;\n const onlySet = only?.length ? new Set(only) : null;\n const namePrefixes =\n !onlySet && groups?.length\n ? (groups.map((g) => groupPrefixMap[g]).filter((x): x is string => x != null) as string[])\n : undefined;\n return {\n ...(onlySet ? { only: Array.from(onlySet) } : {}),\n ...(namePrefixes?.length ? { namePrefixes } : {}),\n };\n}\n","import { lookup } from \"node:dns/promises\";\nimport { createTaggedError } from \"../core/runtime/Retry.js\";\n\n/**\n * Options for validateUrl. Unified rule: allow iff host is in allowedHosts AND not in blockedHosts.\n * - \"Default allow all + blocklist\": allowedHosts: [\"*\"], blockedHosts: [\"*.internal\", ...]\n * - \"Default disallow all + allowlist\": allowedHosts: [\"api.github.com\", ...], blockedHosts: []\n */\nexport interface ValidateUrlOptions {\n /** Allow only these hosts. Use [\"*\"] for allow-all. Supports \"*.example.com\", exact host. */\n allowedHosts: string[];\n /** Block these hosts even if allowed. Supports \"*.internal\", exact host. Merged with allowlist. */\n blockedHosts: string[];\n /** CIDR ranges to block (resolved IP). */\n blockedCidrs: string[];\n}\n\n/**\n * Validate a URL: allow iff (host in allowedHosts) AND (host not in blockedHosts). Then check blockedCidrs on resolved IP.\n *\n * @throws HTTP_DISALLOWED_HOST if the URL is blocked\n */\nexport async function validateUrl(url: string, options: ValidateUrlOptions): Promise<URL> {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw createTaggedError(\n \"HTTP_DISALLOWED_HOST\",\n `Invalid URL: ${url}`,\n { url },\n );\n }\n\n // Only allow http/https\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw createTaggedError(\n \"HTTP_DISALLOWED_HOST\",\n `Protocol not allowed: ${parsed.protocol}. Only http: and https: are supported.`,\n { url, protocol: parsed.protocol },\n );\n }\n\n const hostname = parsed.hostname;\n\n if (!isHostAllowed(hostname, options.allowedHosts)) {\n throw createTaggedError(\n \"HTTP_DISALLOWED_HOST\",\n `Host \"${hostname}\" is not in the allowed hosts list`,\n { url, hostname, allowedHosts: options.allowedHosts },\n );\n }\n if (isHostBlocked(hostname, options.blockedHosts)) {\n throw createTaggedError(\n \"HTTP_DISALLOWED_HOST\",\n `Host \"${hostname}\" is in the blocked hosts list`,\n { url, hostname, blockedHosts: options.blockedHosts },\n );\n }\n\n // DNS resolve and check against blocked CIDRs\n try {\n const { address } = await lookup(hostname);\n if (isIpInBlockedCidrs(address, options.blockedCidrs)) {\n throw createTaggedError(\n \"HTTP_DISALLOWED_HOST\",\n `Host \"${hostname}\" resolves to blocked IP: ${address}`,\n { url, hostname, resolvedIp: address },\n );\n }\n } catch (err) {\n // Re-throw our tagged errors\n if (err instanceof Error && (err as any).kind === \"HTTP_DISALLOWED_HOST\") {\n throw err;\n }\n // DNS resolution failure — block by default\n throw createTaggedError(\n \"HTTP_DISALLOWED_HOST\",\n `DNS resolution failed for host \"${hostname}\": ${err instanceof Error ? err.message : String(err)}`,\n { url, hostname },\n );\n }\n\n return parsed;\n}\n\n/**\n * Check if a hostname matches any entry in the allowed hosts list.\n * Supports: exact \"*\" (allow any host), wildcard prefix (e.g. \"*.github.com\"), or exact host.\n */\nfunction isHostAllowed(hostname: string, allowedHosts: string[]): boolean {\n for (const pattern of allowedHosts) {\n if (pattern === \"*\") {\n return true;\n }\n if (pattern.startsWith(\"*.\")) {\n const suffix = pattern.slice(1); // \".github.com\"\n if (hostname.endsWith(suffix) || hostname === pattern.slice(2)) {\n return true;\n }\n } else if (hostname === pattern) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Check if a hostname matches any entry in the blocked hosts list (same pattern rules as allowlist).\n */\nfunction isHostBlocked(hostname: string, blockedHosts: string[]): boolean {\n for (const pattern of blockedHosts) {\n if (pattern === \"*\") {\n return true;\n }\n if (pattern.startsWith(\"*.\")) {\n const suffix = pattern.slice(1);\n if (hostname.endsWith(suffix) || hostname === pattern.slice(2)) {\n return true;\n }\n } else if (hostname === pattern) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Check if an IPv4 address falls within any blocked CIDR range.\n */\nexport function isIpInBlockedCidrs(ip: string, cidrs: string[]): boolean {\n // Handle IPv4-mapped IPv6\n const normalizedIp = normalizeIp(ip);\n if (!normalizedIp) return false;\n\n for (const cidr of cidrs) {\n if (cidr.includes(\":\")) {\n // IPv6 CIDR — skip for IPv4 addresses\n if (!ip.includes(\":\")) continue;\n if (isIpv6InCidr(ip, cidr)) return true;\n } else {\n if (isIpv4InCidr(normalizedIp, cidr)) return true;\n }\n }\n return false;\n}\n\nfunction normalizeIp(ip: string): string | null {\n // Handle IPv4-mapped IPv6 (e.g. \"::ffff:127.0.0.1\")\n if (ip.startsWith(\"::ffff:\")) {\n return ip.slice(7);\n }\n // Pure IPv4\n if (/^\\d+\\.\\d+\\.\\d+\\.\\d+$/.test(ip)) {\n return ip;\n }\n return null;\n}\n\nfunction isIpv4InCidr(ip: string, cidr: string): boolean {\n const [cidrIp, prefixStr] = cidr.split(\"/\");\n if (!cidrIp || !prefixStr) return false;\n\n const prefix = parseInt(prefixStr, 10);\n if (isNaN(prefix) || prefix < 0 || prefix > 32) return false;\n\n const ipNum = ipv4ToNum(ip);\n const cidrNum = ipv4ToNum(cidrIp);\n if (ipNum === null || cidrNum === null) return false;\n\n const mask = prefix === 0 ? 0 : (~0 << (32 - prefix)) >>> 0;\n return (ipNum & mask) === (cidrNum & mask);\n}\n\nfunction ipv4ToNum(ip: string): number | null {\n const parts = ip.split(\".\");\n if (parts.length !== 4) return null;\n let num = 0;\n for (const part of parts) {\n const n = parseInt(part, 10);\n if (isNaN(n) || n < 0 || n > 255) return null;\n num = (num << 8) | n;\n }\n return num >>> 0;\n}\n\nfunction isIpv6InCidr(ip: string, cidr: string): boolean {\n // Simplified IPv6 CIDR matching for common cases (::1, fc00::, fe80::)\n const [cidrIp, prefixStr] = cidr.split(\"/\");\n if (!cidrIp || !prefixStr) return false;\n\n const prefix = parseInt(prefixStr, 10);\n if (isNaN(prefix)) return false;\n\n const ipBytes = expandIpv6(ip);\n const cidrBytes = expandIpv6(cidrIp);\n if (!ipBytes || !cidrBytes) return false;\n\n // Compare prefix bits\n const fullBytes = Math.floor(prefix / 8);\n for (let i = 0; i < fullBytes && i < 16; i++) {\n if (ipBytes[i] !== cidrBytes[i]) return false;\n }\n\n const remainingBits = prefix % 8;\n if (remainingBits > 0 && fullBytes < 16) {\n const mask = (~0 << (8 - remainingBits)) & 0xff;\n if ((ipBytes[fullBytes]! & mask) !== (cidrBytes[fullBytes]! & mask)) return false;\n }\n\n return true;\n}\n\nfunction expandIpv6(ip: string): number[] | null {\n // Remove zone ID\n const zoneIdx = ip.indexOf(\"%\");\n if (zoneIdx !== -1) ip = ip.slice(0, zoneIdx);\n\n const parts = ip.split(\"::\");\n if (parts.length > 2) return null;\n\n const bytes: number[] = new Array(16).fill(0);\n\n const expandGroup = (group: string): number[] => {\n if (!group) return [];\n return group.split(\":\").flatMap((hex) => {\n const val = parseInt(hex || \"0\", 16);\n return [(val >> 8) & 0xff, val & 0xff];\n });\n };\n\n if (parts.length === 1) {\n const expanded = expandGroup(parts[0]!);\n if (expanded.length !== 16) return null;\n return expanded;\n }\n\n const left = expandGroup(parts[0]!);\n const right = expandGroup(parts[1]!);\n\n if (left.length + right.length > 16) return null;\n\n for (let i = 0; i < left.length; i++) bytes[i] = left[i]!;\n for (let i = 0; i < right.length; i++) bytes[16 - right.length + i] = right[i]!;\n\n return bytes;\n}\n"]}
|