@easynet/agent-tool 1.0.7 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/api/main.cjs +14 -14
  2. package/dist/api/main.js +3 -3
  3. package/dist/api/runtimeFromConfig.d.ts +2 -2
  4. package/dist/api/runtimeFromConfig.d.ts.map +1 -1
  5. package/dist/{chunk-HEAHNLIZ.js → chunk-4RPX5UAU.js} +55 -13
  6. package/dist/chunk-4RPX5UAU.js.map +1 -0
  7. package/dist/{chunk-FPRNWQMN.js → chunk-72HPGMFQ.js} +3 -3
  8. package/dist/{chunk-FPRNWQMN.js.map → chunk-72HPGMFQ.js.map} +1 -1
  9. package/dist/{chunk-MG4YVODT.cjs → chunk-CS3GYMY6.cjs} +56 -14
  10. package/dist/chunk-CS3GYMY6.cjs.map +1 -0
  11. package/dist/{chunk-JGFLYVXB.cjs → chunk-HZW5X4VL.cjs} +9 -9
  12. package/dist/{chunk-JGFLYVXB.cjs.map → chunk-HZW5X4VL.cjs.map} +1 -1
  13. package/dist/{chunk-HI65VG6J.js → chunk-MLHFH6H6.js} +3 -3
  14. package/dist/{chunk-HI65VG6J.js.map → chunk-MLHFH6H6.js.map} +1 -1
  15. package/dist/{chunk-7LKHIMG3.js → chunk-ONYNCKHC.js} +3 -3
  16. package/dist/{chunk-7LKHIMG3.js.map → chunk-ONYNCKHC.js.map} +1 -1
  17. package/dist/{chunk-R5DEK6YP.cjs → chunk-RQDN5DID.cjs} +12 -12
  18. package/dist/{chunk-R5DEK6YP.cjs.map → chunk-RQDN5DID.cjs.map} +1 -1
  19. package/dist/{chunk-NZIFY6CS.cjs → chunk-XYFZ7WNK.cjs} +7 -7
  20. package/dist/{chunk-NZIFY6CS.cjs.map → chunk-XYFZ7WNK.cjs.map} +1 -1
  21. package/dist/index.cjs +59 -59
  22. package/dist/index.js +5 -5
  23. package/dist/tools/util/toolConfig.d.ts +1 -0
  24. package/dist/tools/util/toolConfig.d.ts.map +1 -1
  25. package/dist/utils/cli/index.cjs +22 -22
  26. package/dist/utils/cli/index.cjs.map +1 -1
  27. package/dist/utils/cli/index.js +10 -10
  28. package/dist/utils/cli/index.js.map +1 -1
  29. package/package.json +1 -1
  30. package/dist/chunk-HEAHNLIZ.js.map +0 -1
  31. package/dist/chunk-MG4YVODT.cjs.map +0 -1
package/dist/api/main.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var chunkR5DEK6YP_cjs = require('../chunk-R5DEK6YP.cjs');
4
- var chunkNZIFY6CS_cjs = require('../chunk-NZIFY6CS.cjs');
5
- var chunkMG4YVODT_cjs = require('../chunk-MG4YVODT.cjs');
3
+ var chunkRQDN5DID_cjs = require('../chunk-RQDN5DID.cjs');
4
+ var chunkXYFZ7WNK_cjs = require('../chunk-XYFZ7WNK.cjs');
5
+ var chunkCS3GYMY6_cjs = require('../chunk-CS3GYMY6.cjs');
6
6
  require('../chunk-ZNJBRLKN.cjs');
7
7
  require('../chunk-6F5JHLZ7.cjs');
8
8
 
@@ -10,47 +10,47 @@ require('../chunk-6F5JHLZ7.cjs');
10
10
 
11
11
  Object.defineProperty(exports, "createAgentTools", {
12
12
  enumerable: true,
13
- get: function () { return chunkR5DEK6YP_cjs.createAgentTools; }
13
+ get: function () { return chunkRQDN5DID_cjs.createAgentTools; }
14
14
  });
15
15
  Object.defineProperty(exports, "createLangChainToolsAsync", {
16
16
  enumerable: true,
17
- get: function () { return chunkR5DEK6YP_cjs.createLangChainToolsAsync; }
17
+ get: function () { return chunkRQDN5DID_cjs.createLangChainToolsAsync; }
18
18
  });
19
19
  Object.defineProperty(exports, "createHttpService", {
20
20
  enumerable: true,
21
- get: function () { return chunkNZIFY6CS_cjs.createHttpService; }
21
+ get: function () { return chunkXYFZ7WNK_cjs.createHttpService; }
22
22
  });
23
23
  Object.defineProperty(exports, "createMCPServer", {
24
24
  enumerable: true,
25
- get: function () { return chunkNZIFY6CS_cjs.createMCPServer; }
25
+ get: function () { return chunkXYFZ7WNK_cjs.createMCPServer; }
26
26
  });
27
27
  Object.defineProperty(exports, "createMCPServerStreamableHttp", {
28
28
  enumerable: true,
29
- get: function () { return chunkNZIFY6CS_cjs.createMCPServerStreamableHttp; }
29
+ get: function () { return chunkXYFZ7WNK_cjs.createMCPServerStreamableHttp; }
30
30
  });
31
31
  Object.defineProperty(exports, "createMCPStreamableHttpHandler", {
32
32
  enumerable: true,
33
- get: function () { return chunkNZIFY6CS_cjs.createMCPStreamableHttpHandler; }
33
+ get: function () { return chunkXYFZ7WNK_cjs.createMCPStreamableHttpHandler; }
34
34
  });
35
35
  Object.defineProperty(exports, "createOpenAPIServer", {
36
36
  enumerable: true,
37
- get: function () { return chunkNZIFY6CS_cjs.createHttpService; }
37
+ get: function () { return chunkXYFZ7WNK_cjs.createHttpService; }
38
38
  });
39
39
  Object.defineProperty(exports, "runMCPServerOverStdio", {
40
40
  enumerable: true,
41
- get: function () { return chunkNZIFY6CS_cjs.runMCPServerOverStdio; }
41
+ get: function () { return chunkXYFZ7WNK_cjs.runMCPServerOverStdio; }
42
42
  });
43
43
  Object.defineProperty(exports, "PTCRuntime", {
44
44
  enumerable: true,
45
- get: function () { return chunkMG4YVODT_cjs.PTCRuntime; }
45
+ get: function () { return chunkCS3GYMY6_cjs.PTCRuntime; }
46
46
  });
47
47
  Object.defineProperty(exports, "createRuntimeFromConfig", {
48
48
  enumerable: true,
49
- get: function () { return chunkMG4YVODT_cjs.createRuntimeFromConfig; }
49
+ get: function () { return chunkCS3GYMY6_cjs.createRuntimeFromConfig; }
50
50
  });
51
51
  Object.defineProperty(exports, "createRuntimeFromConfigSync", {
52
52
  enumerable: true,
53
- get: function () { return chunkMG4YVODT_cjs.createRuntimeFromConfigSync; }
53
+ get: function () { return chunkCS3GYMY6_cjs.createRuntimeFromConfigSync; }
54
54
  });
55
55
  //# sourceMappingURL=main.cjs.map
56
56
  //# sourceMappingURL=main.cjs.map
package/dist/api/main.js CHANGED
@@ -1,6 +1,6 @@
1
- export { createAgentTools, createLangChainToolsAsync } from '../chunk-7LKHIMG3.js';
2
- export { createHttpService, createMCPServer, createMCPServerStreamableHttp, createMCPStreamableHttpHandler, createHttpService as createOpenAPIServer, runMCPServerOverStdio } from '../chunk-HI65VG6J.js';
3
- export { PTCRuntime, createRuntimeFromConfig, createRuntimeFromConfigSync } from '../chunk-HEAHNLIZ.js';
1
+ export { createAgentTools, createLangChainToolsAsync } from '../chunk-ONYNCKHC.js';
2
+ export { createHttpService, createMCPServer, createMCPServerStreamableHttp, createMCPStreamableHttpHandler, createHttpService as createOpenAPIServer, runMCPServerOverStdio } from '../chunk-MLHFH6H6.js';
3
+ export { PTCRuntime, createRuntimeFromConfig, createRuntimeFromConfigSync } from '../chunk-4RPX5UAU.js';
4
4
  import '../chunk-AE6FSNGY.js';
5
5
  import '../chunk-FR2CXERF.js';
6
6
  //# sourceMappingURL=main.js.map
@@ -38,8 +38,8 @@ export interface CreateRuntimeResult {
38
38
  */
39
39
  export declare function createRuntimeFromConfigSync(options?: CreateRuntimeOptions): CreateRuntimeResult;
40
40
  /**
41
- * Create runtime and registry asynchronously. When projectPath is set, can load
42
- * tools from project (e.g. MCP, skills); for now behaves like sync.
41
+ * Create runtime and registry asynchronously. Tries sync first; when configFilePath is set
42
+ * and no builtin was found (e.g. ESM package), tries loading from tool.yaml npm: entry via cache (dynamic import).
43
43
  */
44
44
  export declare function createRuntimeFromConfig(options?: CreateRuntimeOptions): Promise<CreateRuntimeResult>;
45
45
  //# sourceMappingURL=runtimeFromConfig.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtimeFromConfig.d.ts","sourceRoot":"","sources":["../../src/api/runtimeFromConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAoB3D,+FAA+F;AAC/F,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,wFAAwF;AACxF,MAAM,WAAW,sBAAsB;IACrC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,iFAAiF;IACjF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,oEAAoE;IACpE,YAAY,CAAC,EAAE,sBAAsB,CAAC;CACvC;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,UAAU,CAAC;IACpB,QAAQ,EAAE,YAAY,CAAC;CACxB;AA8DD;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,oBAAyB,GAAG,mBAAmB,CAqCnG;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,mBAAmB,CAAC,CAE9B"}
1
+ {"version":3,"file":"runtimeFromConfig.d.ts","sourceRoot":"","sources":["../../src/api/runtimeFromConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAoB3D,+FAA+F;AAC/F,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,wFAAwF;AACxF,MAAM,WAAW,sBAAsB;IACrC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,iFAAiF;IACjF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,oEAAoE;IACpE,YAAY,CAAC,EAAE,sBAAsB,CAAC;CACvC;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,UAAU,CAAC;IACpB,QAAQ,EAAE,YAAY,CAAC;CACxB;AA8FD;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,oBAAyB,GAAG,mBAAmB,CAqCnG;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,mBAAmB,CAAC,CAa9B"}
@@ -7,9 +7,9 @@ import { v4 } from 'uuid';
7
7
  import pTimeout from 'p-timeout';
8
8
  import { readFileSync, existsSync, mkdirSync, readdirSync, rmSync, renameSync } from 'fs';
9
9
  import { join, resolve, dirname, isAbsolute } from 'path';
10
+ import { homedir } from 'os';
10
11
  import yaml from 'js-yaml';
11
12
  import { execSync } from 'child_process';
12
- import { homedir } from 'os';
13
13
  import { pathToFileURL } from 'url';
14
14
  import { createRequire } from 'module';
15
15
 
@@ -1536,8 +1536,9 @@ function loadToolConfig(toolYamlPath) {
1536
1536
  return parsed;
1537
1537
  }
1538
1538
  function resolveSandboxedPath(toolYamlPath, sandboxedPath) {
1539
+ const expanded = sandboxedPath.startsWith("~/") ? join(homedir(), sandboxedPath.slice(2)) : sandboxedPath === "~" ? homedir() : sandboxedPath.startsWith("~") && (sandboxedPath.length === 1 || sandboxedPath[1] === "/") ? join(homedir(), sandboxedPath.slice(1)) : sandboxedPath;
1539
1540
  const configDir = dirname(resolve(toolYamlPath));
1540
- return resolve(configDir, sandboxedPath);
1541
+ return resolve(configDir, expanded);
1541
1542
  }
1542
1543
  var CACHE_SUBDIR = ".agent/cache";
1543
1544
  function getCacheBaseFromToolConfig(toolYamlPath) {
@@ -1688,17 +1689,47 @@ function loadBuiltinFromToolYamlCache(configFilePath) {
1688
1689
  const tools = config.tools;
1689
1690
  if (!Array.isArray(tools)) return null;
1690
1691
  const cacheBase = getCacheBaseFromToolConfig(localPath);
1692
+ const cacheOpts = cacheBase ? { cacheBase } : {};
1691
1693
  for (const entry of tools) {
1692
1694
  const parsed = parseNpmDescriptor(String(entry));
1693
1695
  if (!parsed || !BUILTIN_PKG_NAMES.includes(parsed.packageName)) continue;
1694
- try {
1695
- const cacheDir = ensurePackageInCache(parsed.packageName, parsed.version, cacheBase ? { cacheBase } : {});
1696
- const entryPath = getPackageEntryPath(cacheDir);
1697
- const req = createRequire(join(cacheDir, "package.json"));
1698
- const mod = req(entryPath);
1699
- if (mod && typeof mod.registerCoreTools === "function") return mod;
1700
- } catch {
1701
- continue;
1696
+ for (const opts of [cacheOpts, {}]) {
1697
+ try {
1698
+ const cacheDir = ensurePackageInCache(parsed.packageName, parsed.version, opts);
1699
+ const entryPath = getPackageEntryPath(cacheDir);
1700
+ const req = createRequire(join(cacheDir, "package.json"));
1701
+ const mod = req(entryPath);
1702
+ if (mod && typeof mod.registerCoreTools === "function") return mod;
1703
+ break;
1704
+ } catch {
1705
+ if (Object.keys(opts).length > 0) continue;
1706
+ break;
1707
+ }
1708
+ }
1709
+ }
1710
+ return null;
1711
+ }
1712
+ async function loadBuiltinFromToolYamlCacheAsync(configFilePath) {
1713
+ const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);
1714
+ if (!existsSync(localPath)) return null;
1715
+ const config = loadToolConfig(localPath);
1716
+ const tools = config.tools;
1717
+ if (!Array.isArray(tools)) return null;
1718
+ const cacheBase = getCacheBaseFromToolConfig(localPath);
1719
+ const cacheOpts = cacheBase ? { cacheBase } : {};
1720
+ for (const entry of tools) {
1721
+ const parsed = parseNpmDescriptor(String(entry));
1722
+ if (!parsed || !BUILTIN_PKG_NAMES.includes(parsed.packageName)) continue;
1723
+ for (const opts of [cacheOpts, {}]) {
1724
+ try {
1725
+ const cacheDir = ensurePackageInCache(parsed.packageName, parsed.version, opts);
1726
+ const mod = await importFromCache(cacheDir);
1727
+ if (mod && typeof mod.registerCoreTools === "function") return mod;
1728
+ break;
1729
+ } catch {
1730
+ if (Object.keys(opts).length > 0) continue;
1731
+ break;
1732
+ }
1702
1733
  }
1703
1734
  }
1704
1735
  return null;
@@ -1746,7 +1777,18 @@ function createRuntimeFromConfigSync(options = {}) {
1746
1777
  return { runtime, registry };
1747
1778
  }
1748
1779
  async function createRuntimeFromConfig(options = {}) {
1749
- return createRuntimeFromConfigSync(options);
1780
+ const syncResult = createRuntimeFromConfigSync(options);
1781
+ if (options.coreTools !== void 0 && options.configFilePath && syncResult.registry.snapshot().length === 0) {
1782
+ const builtin = await loadBuiltinFromToolYamlCacheAsync(options.configFilePath);
1783
+ if (builtin) {
1784
+ const registry = new ToolRegistry();
1785
+ const coreAdapter = builtin.registerCoreTools(registry, options.coreTools);
1786
+ const runtime = new PTCRuntime({ registry });
1787
+ runtime.registerAdapter(coreAdapter);
1788
+ return { runtime, registry };
1789
+ }
1790
+ }
1791
+ return syncResult;
1750
1792
  }
1751
1793
 
1752
1794
  // src/tools/mcp/types.ts
@@ -1757,5 +1799,5 @@ var LANGCHAIN_KIND = "langchain";
1757
1799
  var LANGCHAIN_DIR_NAME = "langchain";
1758
1800
 
1759
1801
  export { BudgetManager, EventLog, LANGCHAIN_DIR_NAME, LANGCHAIN_KIND, MCP_KIND, Metrics, PTCRuntime, PolicyDeniedError, PolicyEngine, SchemaValidationError, SchemaValidator, Tracing, buildEvidence, createLogger, createRuntimeFromConfig, createRuntimeFromConfigSync, ensurePackageInCache, expandToolDescriptorsToRegistryNames, findAndLoadToolConfig, getDisplayScope, getPackageEntryPath, importFromCache, isNpmToolDescriptor, loadToolConfig, normalizeToolList, parseNpmToolDescriptor, resolveNpmToolDescriptor, resolveSandboxedPath, resolveToolDescriptor, sanitizeForLog, summarizeForLog };
1760
- //# sourceMappingURL=chunk-HEAHNLIZ.js.map
1761
- //# sourceMappingURL=chunk-HEAHNLIZ.js.map
1802
+ //# sourceMappingURL=chunk-4RPX5UAU.js.map
1803
+ //# sourceMappingURL=chunk-4RPX5UAU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/runtime/SchemaValidator.ts","../src/core/runtime/PolicyEngine.ts","../src/core/runtime/Budget.ts","../src/core/runtime/Evidence.ts","../src/observability/EventLog.ts","../src/observability/Logger.ts","../src/observability/Metrics.ts","../src/observability/Tracing.ts","../src/core/runtime/PTCRuntimePipeline.ts","../src/core/runtime/PTCRuntimeObservability.ts","../src/core/runtime/PTCRuntime.ts","../src/tools/util/toolDescriptor.ts","../src/tools/util/toolConfig.ts","../src/utils/npmCache.ts","../src/api/runtimeFromConfig.ts","../src/tools/mcp/types.ts","../src/tools/langchain/types.ts"],"names":["uuidv4","join","homedir","existsSync","readFileSync","resolve","runtime"],"mappings":"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","file":"chunk-4RPX5UAU.js","sourcesContent":["import Ajv, { type ValidateFunction, type ErrorObject } from \"ajv\";\nimport addFormats from \"ajv-formats\";\n\n/**\n * Schema validation result.\n */\nexport interface ValidationResult {\n valid: boolean;\n errors?: ErrorObject[];\n data?: unknown;\n}\n\n/**\n * AJV-based JSON Schema validator with coercion and default enrichment.\n */\nexport class SchemaValidator {\n private readonly ajv: Ajv;\n private readonly cache = new Map<string, ValidateFunction>();\n\n constructor() {\n this.ajv = new Ajv({\n allErrors: true,\n coerceTypes: true,\n useDefaults: true,\n removeAdditional: \"failing\",\n strict: false,\n });\n addFormats(this.ajv);\n }\n\n /**\n * Validate data against a JSON Schema.\n * Coerces types and applies defaults in-place.\n */\n validate(schema: object, data: unknown): ValidationResult {\n const validate = this.getOrCompile(schema);\n const cloned = structuredClone(data);\n const valid = validate(cloned) as boolean;\n\n if (valid) {\n return { valid: true, data: cloned };\n }\n\n return {\n valid: false,\n errors: validate.errors ?? undefined,\n };\n }\n\n /**\n * Validate and return coerced data, or throw a descriptive error.\n */\n validateOrThrow(schema: object, data: unknown, context: string): unknown {\n const result = this.validate(schema, data);\n if (!result.valid) {\n const messages = (result.errors ?? [])\n .map((e) => `${e.instancePath || \"/\"} ${e.message}`)\n .join(\"; \");\n throw new SchemaValidationError(\n `${context}: ${messages}`,\n result.errors ?? [],\n );\n }\n return result.data;\n }\n\n /**\n * Apply default values from schema to data without full validation.\n */\n enrichDefaults(schema: object, data: unknown): unknown {\n const validate = this.getOrCompile(schema);\n const cloned = structuredClone(data);\n validate(cloned);\n return cloned;\n }\n\n private getOrCompile(schema: object): ValidateFunction {\n const normalized = this.normalizeSchema(schema);\n const key = JSON.stringify(normalized);\n let cached = this.cache.get(key);\n if (!cached) {\n cached = this.ajv.compile(normalized);\n this.cache.set(key, cached);\n }\n return cached;\n }\n\n /** Ensure schema is AJV-compatible (required = string[], nullable handled via type). */\n private normalizeSchema(schema: object): object {\n return this.normalizeSchemaRec(schema as Record<string, unknown>) as object;\n }\n\n private normalizeSchemaRec(s: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(s)) {\n if (key === \"required\") {\n const raw = value;\n out.required = Array.isArray(raw)\n ? raw.filter((x): x is string => typeof x === \"string\")\n : typeof raw === \"string\"\n ? [raw]\n : [];\n continue;\n }\n if (key === \"nullable\") {\n // Skip copying nullable; we'll fix type below if nullable was true\n continue;\n }\n if (key === \"properties\" && value !== null && typeof value === \"object\") {\n const props: Record<string, unknown> = {};\n for (const [pk, pv] of Object.entries(value as Record<string, unknown>)) {\n if (pv !== null && typeof pv === \"object\" && !Array.isArray(pv)) {\n props[pk] = this.normalizeSchemaRec(pv as Record<string, unknown>);\n } else {\n props[pk] = pv;\n }\n }\n out.properties = props;\n continue;\n }\n if (\n (key === \"items\" || key === \"additionalProperties\") &&\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value)\n ) {\n out[key] = this.normalizeSchemaRec(value as Record<string, unknown>);\n continue;\n }\n if (\n (key === \"oneOf\" || key === \"anyOf\" || key === \"allOf\") &&\n Array.isArray(value)\n ) {\n out[key] = value.map((item) =>\n item !== null && typeof item === \"object\" && !Array.isArray(item)\n ? this.normalizeSchemaRec(item as Record<string, unknown>)\n : item,\n );\n continue;\n }\n out[key] = value;\n }\n\n // AJV: \"nullable\" requires \"type\". Convert nullable to type including \"null\".\n if (s.nullable === true) {\n const existingType = out.type;\n if (existingType === undefined) {\n out.type = \"object\";\n } else if (Array.isArray(existingType)) {\n if (!existingType.includes(\"null\")) out.type = [...existingType, \"null\"];\n } else {\n out.type = [existingType, \"null\"];\n }\n }\n return out;\n }\n}\n\n/**\n * Error thrown on schema validation failure.\n */\nexport class SchemaValidationError extends Error {\n constructor(\n message: string,\n public readonly errors: ErrorObject[],\n ) {\n super(message);\n this.name = \"SchemaValidationError\";\n }\n}\n","import type { Capability, ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext } from \"../types/ToolIntent.js\";\n\n/**\n * Policy configuration for the engine.\n */\nexport interface PolicyConfig {\n /** File system sandbox paths (allowed write directories) */\n sandboxPaths?: string[];\n /** Allowed URL patterns (regex strings) */\n urlAllowlist?: string[];\n /** Denied URL patterns (regex strings) */\n urlDenylist?: string[];\n /** SQL patterns that are denied (e.g., DROP, TRUNCATE) */\n deniedSqlPatterns?: string[];\n /** Network allowed domains */\n allowedDomains?: string[];\n /** Whether to require explicit permission for danger:destructive */\n requireExplicitDangerPermission?: boolean;\n}\n\n/**\n * Result of a policy check.\n */\nexport interface PolicyCheckResult {\n allowed: boolean;\n reason?: string;\n missingCapabilities?: Capability[];\n}\n\n/**\n * Policy engine for capability gating, parameter security, and access control.\n */\nexport class PolicyEngine {\n private readonly config: PolicyConfig;\n\n constructor(config: PolicyConfig = {}) {\n this.config = {\n requireExplicitDangerPermission: true,\n deniedSqlPatterns: [\"DROP\\\\s\", \"TRUNCATE\\\\s\", \"DELETE\\\\s+FROM\\\\s+\\\\w+\\\\s*$\"],\n ...config,\n };\n }\n\n /**\n * Enforce all policy checks. Throws PolicyDeniedError if denied.\n */\n enforce(spec: ToolSpec, args: unknown, ctx: ExecContext): void {\n const result = this.check(spec, args, ctx);\n if (!result.allowed) {\n throw new PolicyDeniedError(\n result.reason ?? \"Policy denied\",\n result.missingCapabilities,\n );\n }\n }\n\n /**\n * Check all policies without throwing.\n */\n check(spec: ToolSpec, args: unknown, ctx: ExecContext): PolicyCheckResult {\n // 1. Capability gate\n const capResult = this.checkCapabilities(spec, ctx);\n if (!capResult.allowed) return capResult;\n\n // 2. Parameter-level security\n const paramResult = this.checkParameters(spec, args);\n if (!paramResult.allowed) return paramResult;\n\n // 3. Dry-run check (if enabled, just allow but flag)\n return { allowed: true };\n }\n\n /**\n * Check that context permissions cover tool capabilities.\n */\n private checkCapabilities(\n spec: ToolSpec,\n ctx: ExecContext,\n ): PolicyCheckResult {\n const missing: Capability[] = [];\n\n for (const cap of spec.capabilities) {\n if (cap === \"danger:destructive\") {\n // Destructive capability requires explicit permission\n if (\n this.config.requireExplicitDangerPermission &&\n !ctx.permissions.includes(\"danger:destructive\")\n ) {\n missing.push(cap);\n }\n } else if (!ctx.permissions.includes(cap)) {\n missing.push(cap);\n }\n }\n\n if (missing.length > 0) {\n return {\n allowed: false,\n reason: `Missing capabilities: ${missing.join(\", \")}`,\n missingCapabilities: missing,\n };\n }\n\n return { allowed: true };\n }\n\n /**\n * Check parameter-level security constraints.\n */\n private checkParameters(spec: ToolSpec, args: unknown): PolicyCheckResult {\n if (!args || typeof args !== \"object\") return { allowed: true };\n\n const argsObj = args as Record<string, unknown>;\n\n // File path sandboxing\n if (spec.capabilities.includes(\"write:fs\") && this.config.sandboxPaths) {\n const pathResult = this.checkFilePaths(argsObj);\n if (!pathResult.allowed) return pathResult;\n }\n\n // URL allowlist/denylist\n if (\n spec.capabilities.includes(\"network\") ||\n spec.capabilities.includes(\"read:web\")\n ) {\n const urlResult = this.checkUrls(argsObj);\n if (!urlResult.allowed) return urlResult;\n }\n\n // SQL injection prevention\n if (\n spec.capabilities.includes(\"write:db\") ||\n spec.capabilities.includes(\"read:db\")\n ) {\n const sqlResult = this.checkSql(argsObj);\n if (!sqlResult.allowed) return sqlResult;\n }\n\n // Network domain restrictions\n if (spec.capabilities.includes(\"network\") && this.config.allowedDomains) {\n const domainResult = this.checkDomains(argsObj);\n if (!domainResult.allowed) return domainResult;\n }\n\n return { allowed: true };\n }\n\n private checkFilePaths(args: Record<string, unknown>): PolicyCheckResult {\n const paths = this.extractStringValues(args, [\"path\", \"file\", \"filepath\", \"filename\", \"dir\", \"directory\"]);\n for (const p of paths) {\n const normalized = p.replace(/\\.\\./g, \"\");\n if (p.includes(\"..\")) {\n return {\n allowed: false,\n reason: `Path traversal detected: ${p}`,\n };\n }\n if (this.config.sandboxPaths && this.config.sandboxPaths.length > 0) {\n const inSandbox = this.config.sandboxPaths.some(\n (sp) => normalized.startsWith(sp),\n );\n if (!inSandbox) {\n return {\n allowed: false,\n reason: `Path outside sandbox: ${p}. Allowed: ${this.config.sandboxPaths.join(\", \")}`,\n };\n }\n }\n }\n return { allowed: true };\n }\n\n private checkUrls(args: Record<string, unknown>): PolicyCheckResult {\n const urls = this.extractStringValues(args, [\"url\", \"endpoint\", \"href\", \"uri\"]);\n for (const url of urls) {\n // Check denylist\n if (this.config.urlDenylist) {\n for (const pattern of this.config.urlDenylist) {\n if (new RegExp(pattern, \"i\").test(url)) {\n return {\n allowed: false,\n reason: `URL denied by policy: ${url}`,\n };\n }\n }\n }\n // Check allowlist (if configured, URL must match)\n if (this.config.urlAllowlist && this.config.urlAllowlist.length > 0) {\n const allowed = this.config.urlAllowlist.some((pattern) =>\n new RegExp(pattern, \"i\").test(url),\n );\n if (!allowed) {\n return {\n allowed: false,\n reason: `URL not in allowlist: ${url}`,\n };\n }\n }\n }\n return { allowed: true };\n }\n\n private checkSql(args: Record<string, unknown>): PolicyCheckResult {\n const sqls = this.extractStringValues(args, [\"sql\", \"query\", \"statement\"]);\n for (const sql of sqls) {\n if (this.config.deniedSqlPatterns) {\n for (const pattern of this.config.deniedSqlPatterns) {\n if (new RegExp(pattern, \"i\").test(sql)) {\n return {\n allowed: false,\n reason: `SQL pattern denied: ${sql.slice(0, 50)}...`,\n };\n }\n }\n }\n }\n return { allowed: true };\n }\n\n private checkDomains(args: Record<string, unknown>): PolicyCheckResult {\n const urls = this.extractStringValues(args, [\"url\", \"endpoint\", \"href\", \"host\", \"domain\"]);\n for (const url of urls) {\n try {\n const hostname = url.includes(\"://\")\n ? new URL(url).hostname\n : url;\n if (\n this.config.allowedDomains &&\n !this.config.allowedDomains.some(\n (d) => hostname === d || hostname.endsWith(`.${d}`),\n )\n ) {\n return {\n allowed: false,\n reason: `Domain not allowed: ${hostname}`,\n };\n }\n } catch {\n // Not a valid URL, skip\n }\n }\n return { allowed: true };\n }\n\n /**\n * Extract string values from args matching given key patterns.\n */\n private extractStringValues(\n args: Record<string, unknown>,\n keyPatterns: string[],\n ): string[] {\n const results: string[] = [];\n const walk = (obj: Record<string, unknown>) => {\n for (const [key, val] of Object.entries(obj)) {\n const lowerKey = key.toLowerCase();\n if (\n typeof val === \"string\" &&\n keyPatterns.some((p) => lowerKey.includes(p))\n ) {\n results.push(val);\n } else if (val && typeof val === \"object\" && !Array.isArray(val)) {\n walk(val as Record<string, unknown>);\n }\n }\n };\n walk(args);\n return results;\n }\n}\n\n/**\n * Error thrown when policy denies execution.\n */\nexport class PolicyDeniedError extends Error {\n public readonly kind = \"POLICY_DENIED\";\n\n constructor(\n message: string,\n public readonly missingCapabilities?: Capability[],\n ) {\n super(message);\n this.name = \"PolicyDeniedError\";\n }\n}\n","import {\n bulkhead,\n circuitBreaker,\n ConsecutiveBreaker,\n handleAll,\n type CircuitBreakerPolicy,\n type BulkheadPolicy,\n} from \"cockatiel\";\n\n/**\n * Budget configuration for a tool or global scope.\n */\nexport interface BudgetOptions {\n /** Default timeout in ms for tool invocations */\n defaultTimeoutMs?: number;\n /** Max concurrent invocations per tool */\n maxConcurrency?: number;\n /** Rate limit: max calls per window */\n rateLimit?: { maxCalls: number; windowMs: number };\n /** Circuit breaker config */\n circuitBreaker?: {\n /** Number of consecutive failures before opening */\n threshold: number;\n /** Half-open reset time in ms */\n halfOpenAfterMs: number;\n };\n}\n\n/**\n * Per-tool rate limiter using sliding window.\n */\nclass RateLimiter {\n private readonly timestamps: number[] = [];\n\n constructor(\n private readonly maxCalls: number,\n private readonly windowMs: number,\n ) {}\n\n tryAcquire(): boolean {\n const now = Date.now();\n // Remove expired timestamps\n while (this.timestamps.length > 0 && this.timestamps[0]! <= now - this.windowMs) {\n this.timestamps.shift();\n }\n if (this.timestamps.length >= this.maxCalls) {\n return false;\n }\n this.timestamps.push(now);\n return true;\n }\n\n get remaining(): number {\n const now = Date.now();\n const active = this.timestamps.filter((t) => t > now - this.windowMs);\n return Math.max(0, this.maxCalls - active.length);\n }\n}\n\n/**\n * Budget manager that provides timeout, rate limiting, concurrency control,\n * and circuit breaker per tool.\n */\nexport class BudgetManager {\n private readonly defaultTimeoutMs: number;\n private readonly bulkheads = new Map<string, BulkheadPolicy>();\n private readonly circuitBreakers = new Map<string, CircuitBreakerPolicy>();\n private readonly rateLimiters = new Map<string, RateLimiter>();\n private readonly options: BudgetOptions;\n\n constructor(options: BudgetOptions = {}) {\n this.options = options;\n this.defaultTimeoutMs = options.defaultTimeoutMs ?? 30_000;\n }\n\n /**\n * Get effective timeout for a tool invocation.\n */\n getTimeout(_toolName: string, contextTimeoutMs?: number): number {\n return contextTimeoutMs ?? this.defaultTimeoutMs;\n }\n\n /**\n * Check rate limit for a tool. Returns true if allowed.\n */\n checkRateLimit(toolName: string): boolean {\n if (!this.options.rateLimit) return true;\n let limiter = this.rateLimiters.get(toolName);\n if (!limiter) {\n limiter = new RateLimiter(\n this.options.rateLimit.maxCalls,\n this.options.rateLimit.windowMs,\n );\n this.rateLimiters.set(toolName, limiter);\n }\n return limiter.tryAcquire();\n }\n\n /**\n * Get or create a bulkhead (concurrency limiter) for a tool.\n */\n getBulkhead(toolName: string): BulkheadPolicy | undefined {\n if (!this.options.maxConcurrency) return undefined;\n let bh = this.bulkheads.get(toolName);\n if (!bh) {\n bh = bulkhead(this.options.maxConcurrency, 0);\n this.bulkheads.set(toolName, bh);\n }\n return bh;\n }\n\n /**\n * Get or create a circuit breaker for a tool.\n */\n getCircuitBreaker(toolName: string): CircuitBreakerPolicy | undefined {\n if (!this.options.circuitBreaker) return undefined;\n let breaker = this.circuitBreakers.get(toolName);\n if (!breaker) {\n breaker = circuitBreaker(handleAll, {\n breaker: new ConsecutiveBreaker(this.options.circuitBreaker.threshold),\n halfOpenAfter: this.options.circuitBreaker.halfOpenAfterMs,\n });\n this.circuitBreakers.set(toolName, breaker);\n }\n return breaker;\n }\n\n /**\n * Execute a function within budget constraints (bulkhead + circuit breaker).\n */\n async execute<T>(toolName: string, fn: () => Promise<T>): Promise<T> {\n const bh = this.getBulkhead(toolName);\n const breaker = this.getCircuitBreaker(toolName);\n\n let wrapped: () => Promise<T> = fn;\n\n if (breaker) {\n const prevWrapped = wrapped;\n wrapped = () => breaker.execute(() => prevWrapped());\n }\n\n if (bh) {\n const prevWrapped = wrapped;\n wrapped = () => bh.execute(() => prevWrapped());\n }\n\n return wrapped();\n }\n\n /**\n * Reset all policies for a tool (useful for testing).\n */\n reset(toolName: string): void {\n this.bulkheads.delete(toolName);\n this.circuitBreakers.delete(toolName);\n this.rateLimiters.delete(toolName);\n }\n\n /**\n * Reset all policies globally.\n */\n resetAll(): void {\n this.bulkheads.clear();\n this.circuitBreakers.clear();\n this.rateLimiters.clear();\n }\n}\n","import type { ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext } from \"../types/ToolIntent.js\";\nimport type { Evidence } from \"../types/ToolResult.js\";\n\n/**\n * Options for building evidence from a tool invocation.\n */\nexport interface BuildEvidenceOptions {\n spec: ToolSpec;\n args: unknown;\n result: unknown;\n raw?: unknown;\n ctx: ExecContext;\n durationMs?: number;\n}\n\n/**\n * Build evidence records from a tool invocation result.\n */\nexport function buildEvidence(options: BuildEvidenceOptions): Evidence[] {\n const { spec, args, result, ctx, durationMs } = options;\n const now = new Date().toISOString();\n const evidence: Evidence[] = [];\n\n // Primary tool evidence\n evidence.push({\n type: \"tool\",\n ref: `${spec.name}@${spec.version}`,\n summary: summarizeToolCall(spec, args, result, durationMs),\n createdAt: now,\n });\n\n // If result contains a URL, add url evidence\n if (result && typeof result === \"object\") {\n const urls = extractUrls(result);\n for (const url of urls) {\n evidence.push({\n type: \"url\",\n ref: url,\n summary: `Output URL from ${spec.name}`,\n createdAt: now,\n });\n }\n\n // If result contains file paths, add file evidence\n const files = extractFilePaths(result);\n for (const file of files) {\n evidence.push({\n type: \"file\",\n ref: file,\n summary: `Output file from ${spec.name}`,\n createdAt: now,\n });\n }\n }\n\n // Add metric evidence if duration is significant\n if (durationMs !== undefined && durationMs > 0) {\n evidence.push({\n type: \"metric\",\n ref: `latency:${spec.name}`,\n summary: `Completed in ${durationMs}ms (request: ${ctx.requestId})`,\n createdAt: now,\n });\n }\n\n return evidence;\n}\n\nfunction summarizeToolCall(\n spec: ToolSpec,\n args: unknown,\n result: unknown,\n durationMs?: number,\n): string {\n const argKeys =\n args && typeof args === \"object\" ? Object.keys(args).join(\", \") : \"none\";\n const duration = durationMs ? ` in ${durationMs}ms` : \"\";\n const resultPreview = summarizeValue(result, 100);\n return `${spec.kind}:${spec.name} called with [${argKeys}]${duration} → ${resultPreview}`;\n}\n\nfunction summarizeValue(value: unknown, maxLen: number): string {\n if (value === null || value === undefined) return \"null\";\n if (typeof value === \"string\") {\n return value.length > maxLen ? value.slice(0, maxLen) + \"...\" : value;\n }\n const str = JSON.stringify(value);\n return str.length > maxLen ? str.slice(0, maxLen) + \"...\" : str;\n}\n\nfunction extractUrls(obj: object): string[] {\n const urls: string[] = [];\n const walk = (val: unknown) => {\n if (typeof val === \"string\" && /^https?:\\/\\//i.test(val)) {\n urls.push(val);\n } else if (val && typeof val === \"object\") {\n for (const v of Object.values(val)) {\n walk(v);\n }\n }\n };\n walk(obj);\n return urls.slice(0, 10); // Limit to prevent explosion\n}\n\nfunction extractFilePaths(obj: object): string[] {\n const paths: string[] = [];\n const walk = (val: unknown) => {\n if (\n typeof val === \"string\" &&\n (val.startsWith(\"/\") || val.startsWith(\"./\")) &&\n val.includes(\".\")\n ) {\n paths.push(val);\n } else if (val && typeof val === \"object\") {\n for (const v of Object.values(val)) {\n walk(v);\n }\n }\n };\n walk(obj);\n return paths.slice(0, 10);\n}\n","import { EventEmitter } from \"eventemitter3\";\nimport type { AnyToolEvent, ToolEventType } from \"../core/types/Events.js\";\n\n/**\n * Event log entry with sequence number.\n */\nexport interface LogEntry {\n seq: number;\n event: AnyToolEvent;\n}\n\n/**\n * Event log listener type.\n */\nexport type EventListener = (entry: LogEntry) => void;\n\n/**\n * Append-only event log for tool invocations.\n * Supports in-memory storage with configurable max size and event subscriptions.\n */\nexport class EventLog {\n private readonly entries: LogEntry[] = [];\n private seq = 0;\n private readonly maxEntries: number;\n private readonly emitter = new EventEmitter();\n\n constructor(options: { maxEntries?: number } = {}) {\n this.maxEntries = options.maxEntries ?? 10_000;\n }\n\n /**\n * Append an event to the log.\n */\n append(event: AnyToolEvent): LogEntry {\n const entry: LogEntry = { seq: ++this.seq, event };\n\n this.entries.push(entry);\n\n // Trim if over max\n if (this.entries.length > this.maxEntries) {\n this.entries.shift();\n }\n\n // Emit to subscribers\n this.emitter.emit(\"event\", entry);\n this.emitter.emit(event.type, entry);\n\n return entry;\n }\n\n /**\n * Subscribe to all events.\n */\n on(listener: EventListener): () => void {\n this.emitter.on(\"event\", listener);\n return () => this.emitter.off(\"event\", listener);\n }\n\n /**\n * Subscribe to events of a specific type.\n */\n onType(type: ToolEventType, listener: EventListener): () => void {\n this.emitter.on(type, listener);\n return () => this.emitter.off(type, listener);\n }\n\n /**\n * Query events by filter.\n */\n query(filter: {\n type?: ToolEventType;\n toolName?: string;\n requestId?: string;\n since?: number; // seq number\n limit?: number;\n }): LogEntry[] {\n let results = this.entries;\n\n if (filter.since !== undefined) {\n results = results.filter((e) => e.seq > filter.since!);\n }\n if (filter.type) {\n results = results.filter((e) => e.event.type === filter.type);\n }\n if (filter.toolName) {\n results = results.filter((e) => e.event.toolName === filter.toolName);\n }\n if (filter.requestId) {\n results = results.filter((e) => e.event.requestId === filter.requestId);\n }\n if (filter.limit) {\n results = results.slice(-filter.limit);\n }\n\n return results;\n }\n\n /**\n * Get all entries.\n */\n getAll(): readonly LogEntry[] {\n return this.entries;\n }\n\n /**\n * Get entry count.\n */\n get size(): number {\n return this.entries.length;\n }\n\n /**\n * Clear all entries (for testing).\n */\n clear(): void {\n this.entries.length = 0;\n this.seq = 0;\n }\n}\n","export type LogLevel = \"silent\" | \"error\" | \"warn\" | \"info\" | \"debug\" | \"trace\";\n\nexport interface DebugOptions {\n enabled?: boolean;\n level?: LogLevel;\n includeArgs?: boolean;\n includeResults?: boolean;\n includeRaw?: boolean;\n logEvents?: boolean;\n prefix?: string;\n}\n\nexport interface ResolvedDebugOptions {\n enabled: boolean;\n level: LogLevel;\n includeArgs: boolean;\n includeResults: boolean;\n includeRaw: boolean;\n logEvents: boolean;\n prefix: string;\n}\n\nexport interface Logger {\n options: ResolvedDebugOptions;\n isEnabled(level: LogLevel): boolean;\n error(message: string, meta?: Record<string, unknown>): void;\n warn(message: string, meta?: Record<string, unknown>): void;\n info(message: string, meta?: Record<string, unknown>): void;\n debug(message: string, meta?: Record<string, unknown>): void;\n trace(message: string, meta?: Record<string, unknown>): void;\n}\n\nconst LEVEL_ORDER: Record<LogLevel, number> = {\n silent: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n trace: 5,\n};\n\nexport function createLogger(options: DebugOptions = {}): Logger {\n const resolved = resolveDebugOptions(options);\n\n const log = (level: LogLevel, message: string, meta?: Record<string, unknown>) => {\n if (!resolved.enabled) return;\n if (LEVEL_ORDER[level] > LEVEL_ORDER[resolved.level]) return;\n\n const prefix = `[${resolved.prefix}]`;\n const levelTag = `[${level.toUpperCase()}]`;\n const metaText = meta ? ` ${safeStringify(meta, 1000)}` : \"\";\n\n switch (level) {\n case \"error\":\n console.error(`${prefix} ${levelTag} ${message}${metaText}`);\n break;\n case \"warn\":\n console.warn(`${prefix} ${levelTag} ${message}${metaText}`);\n break;\n case \"info\":\n console.info(`${prefix} ${levelTag} ${message}${metaText}`);\n break;\n default:\n console.log(`${prefix} ${levelTag} ${message}${metaText}`);\n break;\n }\n };\n\n return {\n options: resolved,\n isEnabled: (level) => resolved.enabled && LEVEL_ORDER[level] <= LEVEL_ORDER[resolved.level],\n error: (message, meta) => log(\"error\", message, meta),\n warn: (message, meta) => log(\"warn\", message, meta),\n info: (message, meta) => log(\"info\", message, meta),\n debug: (message, meta) => log(\"debug\", message, meta),\n trace: (message, meta) => log(\"trace\", message, meta),\n };\n}\n\nexport function resolveDebugOptions(options: DebugOptions = {}): ResolvedDebugOptions {\n const envLevel = parseEnvLogLevel();\n const enabledFromEnv = envLevel !== undefined && envLevel !== \"silent\";\n const enabled = options.enabled ?? enabledFromEnv ?? false;\n const level =\n options.level ?? envLevel ?? (enabled ? \"debug\" : \"silent\");\n\n return {\n enabled,\n level,\n includeArgs: options.includeArgs ?? false,\n includeResults: options.includeResults ?? false,\n includeRaw: options.includeRaw ?? false,\n logEvents: options.logEvents ?? false,\n prefix: options.prefix ?? \"agent-tool\",\n };\n}\n\nexport function sanitizeForLog(value: unknown, maxLen = 500): string {\n const str = safeStringify(value, maxLen);\n return str.replace(\n /\"(password|token|secret|key|auth)\":\\s*\"[^\"]*\"/gi,\n \"\\\"$1\\\":\\\"[REDACTED]\\\"\",\n );\n}\n\nexport function summarizeForLog(value: unknown, maxLen = 200): string {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n if (typeof value === \"string\") {\n return value.length > maxLen ? `${value.slice(0, maxLen)}...` : value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (Array.isArray(value)) {\n return `Array(${value.length})`;\n }\n if (typeof value === \"object\") {\n const keys = Object.keys(value as Record<string, unknown>);\n const shown = keys.slice(0, 5).join(\", \");\n return `Object(keys: ${shown}${keys.length > 5 ? \", ...\" : \"\"})`;\n }\n return String(value);\n}\n\nfunction safeStringify(value: unknown, maxLen: number): string {\n try {\n const json = JSON.stringify(value);\n if (!json) return String(value);\n return json.length > maxLen ? `${json.slice(0, maxLen)}...` : json;\n } catch {\n const fallback = String(value);\n return fallback.length > maxLen ? `${fallback.slice(0, maxLen)}...` : fallback;\n }\n}\n\nfunction parseEnvLogLevel(): LogLevel | undefined {\n const raw =\n process.env.TOOLHUB_LOG_LEVEL ??\n process.env.TOOLHUB_DEBUG ??\n process.env.DEBUG;\n\n if (!raw) return undefined;\n const value = raw.trim().toLowerCase();\n if (!value || value === \"0\" || value === \"false\" || value === \"off\") {\n return \"silent\";\n }\n if (value.includes(\"trace\")) return \"trace\";\n if (value.includes(\"debug\") || value === \"1\" || value === \"true\" || value === \"yes\") {\n return \"debug\";\n }\n if (value.includes(\"info\")) return \"info\";\n if (value.includes(\"warn\")) return \"warn\";\n if (value.includes(\"error\")) return \"error\";\n if (value.includes(\"silent\")) return \"silent\";\n return \"debug\";\n}\n","/**\n * Simple counter metric.\n */\nexport interface CounterValue {\n name: string;\n labels: Record<string, string>;\n value: number;\n}\n\n/**\n * Histogram bucket.\n */\nexport interface HistogramValue {\n name: string;\n labels: Record<string, string>;\n count: number;\n sum: number;\n buckets: Map<number, number>; // upper bound → count\n}\n\n/**\n * Lightweight metrics collector for tool invocations.\n * Provides counters and histograms with label support.\n */\nexport class Metrics {\n private readonly counters = new Map<string, number>();\n private readonly histograms = new Map<\n string,\n { count: number; sum: number; values: number[] }\n >();\n\n private readonly defaultBuckets = [\n 5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000,\n ];\n\n /**\n * Increment a counter.\n */\n increment(name: string, labels: Record<string, string> = {}, value = 1): void {\n const key = this.makeKey(name, labels);\n this.counters.set(key, (this.counters.get(key) ?? 0) + value);\n }\n\n /**\n * Record a value in a histogram.\n */\n observe(name: string, labels: Record<string, string>, value: number): void {\n const key = this.makeKey(name, labels);\n let hist = this.histograms.get(key);\n if (!hist) {\n hist = { count: 0, sum: 0, values: [] };\n this.histograms.set(key, hist);\n }\n hist.count++;\n hist.sum += value;\n hist.values.push(value);\n }\n\n /**\n * Get a counter value.\n */\n getCounter(name: string, labels: Record<string, string> = {}): number {\n return this.counters.get(this.makeKey(name, labels)) ?? 0;\n }\n\n /**\n * Get histogram stats.\n */\n getHistogram(\n name: string,\n labels: Record<string, string>,\n ): HistogramValue | undefined {\n const key = this.makeKey(name, labels);\n const hist = this.histograms.get(key);\n if (!hist) return undefined;\n\n const buckets = new Map<number, number>();\n for (const bound of this.defaultBuckets) {\n buckets.set(bound, hist.values.filter((v) => v <= bound).length);\n }\n\n return { name, labels, count: hist.count, sum: hist.sum, buckets };\n }\n\n /**\n * Get all counter values.\n */\n getAllCounters(): CounterValue[] {\n const results: CounterValue[] = [];\n for (const [key, value] of this.counters) {\n const { name, labels } = this.parseKey(key);\n results.push({ name, labels, value });\n }\n return results;\n }\n\n /**\n * Get all histogram values.\n */\n getAllHistograms(): HistogramValue[] {\n const results: HistogramValue[] = [];\n for (const [key, hist] of this.histograms) {\n const { name, labels } = this.parseKey(key);\n const buckets = new Map<number, number>();\n for (const bound of this.defaultBuckets) {\n buckets.set(bound, hist.values.filter((v) => v <= bound).length);\n }\n results.push({ name, labels, count: hist.count, sum: hist.sum, buckets });\n }\n return results;\n }\n\n /**\n * Record standard tool invocation metrics.\n */\n recordInvocation(toolName: string, ok: boolean, durationMs: number): void {\n this.increment(\"tool_invocations_total\", {\n toolName,\n ok: String(ok),\n });\n this.observe(\"tool_latency_ms\", { toolName }, durationMs);\n }\n\n /**\n * Record a retry event.\n */\n recordRetry(toolName: string): void {\n this.increment(\"tool_retries_total\", { toolName });\n }\n\n /**\n * Record a policy denial.\n */\n recordPolicyDenied(toolName: string, reason: string): void {\n this.increment(\"policy_denied_total\", { toolName, reason });\n }\n\n /**\n * Reset all metrics (for testing).\n */\n reset(): void {\n this.counters.clear();\n this.histograms.clear();\n }\n\n private makeKey(name: string, labels: Record<string, string>): string {\n const sortedLabels = Object.entries(labels)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${k}=${v}`)\n .join(\",\");\n return `${name}{${sortedLabels}}`;\n }\n\n private parseKey(key: string): {\n name: string;\n labels: Record<string, string>;\n } {\n const match = key.match(/^(.+?)\\{(.*)\\}$/);\n if (!match) return { name: key, labels: {} };\n const labels: Record<string, string> = {};\n if (match[2]) {\n for (const part of match[2].split(\",\")) {\n const [k, v] = part.split(\"=\");\n if (k && v !== undefined) labels[k] = v;\n }\n }\n return { name: match[1]!, labels };\n }\n}\n","import { v4 as uuidv4 } from \"uuid\";\n\n/**\n * A trace span representing a unit of work.\n */\nexport interface Span {\n spanId: string;\n traceId: string;\n parentSpanId?: string;\n name: string;\n startTime: number; // ms epoch\n endTime?: number;\n durationMs?: number;\n status: \"ok\" | \"error\" | \"in_progress\";\n attributes: Record<string, string | number | boolean>;\n events: SpanEvent[];\n}\n\n/**\n * An event within a span.\n */\nexport interface SpanEvent {\n name: string;\n timestamp: number;\n attributes?: Record<string, string | number | boolean>;\n}\n\n/**\n * Lightweight tracing system for tool invocation spans.\n * Compatible with OpenTelemetry trace/span ID format.\n */\nexport class Tracing {\n private readonly spans = new Map<string, Span>();\n private readonly traceSpans = new Map<string, string[]>(); // traceId → spanIds\n\n /**\n * Start a new span.\n */\n startSpan(options: {\n name: string;\n traceId?: string;\n parentSpanId?: string;\n attributes?: Record<string, string | number | boolean>;\n }): Span {\n const span: Span = {\n spanId: uuidv4(),\n traceId: options.traceId ?? uuidv4(),\n parentSpanId: options.parentSpanId,\n name: options.name,\n startTime: Date.now(),\n status: \"in_progress\",\n attributes: options.attributes ?? {},\n events: [],\n };\n\n this.spans.set(span.spanId, span);\n\n const traceList = this.traceSpans.get(span.traceId) ?? [];\n traceList.push(span.spanId);\n this.traceSpans.set(span.traceId, traceList);\n\n return span;\n }\n\n /**\n * End a span and calculate duration.\n */\n endSpan(spanId: string, status: \"ok\" | \"error\" = \"ok\"): Span | undefined {\n const span = this.spans.get(spanId);\n if (!span) return undefined;\n\n span.endTime = Date.now();\n span.durationMs = span.endTime - span.startTime;\n span.status = status;\n return span;\n }\n\n /**\n * Add an event to a span.\n */\n addEvent(\n spanId: string,\n name: string,\n attributes?: Record<string, string | number | boolean>,\n ): void {\n const span = this.spans.get(spanId);\n if (!span) return;\n span.events.push({ name, timestamp: Date.now(), attributes });\n }\n\n /**\n * Set attributes on a span.\n */\n setAttributes(\n spanId: string,\n attributes: Record<string, string | number | boolean>,\n ): void {\n const span = this.spans.get(spanId);\n if (!span) return;\n Object.assign(span.attributes, attributes);\n }\n\n /**\n * Get a span by ID.\n */\n getSpan(spanId: string): Span | undefined {\n return this.spans.get(spanId);\n }\n\n /**\n * Get all spans for a trace.\n */\n getTrace(traceId: string): Span[] {\n const spanIds = this.traceSpans.get(traceId) ?? [];\n return spanIds\n .map((id) => this.spans.get(id))\n .filter((s): s is Span => s !== undefined);\n }\n\n /**\n * Create a child span from a parent.\n */\n createChildSpan(\n parentSpanId: string,\n name: string,\n attributes?: Record<string, string | number | boolean>,\n ): Span | undefined {\n const parent = this.spans.get(parentSpanId);\n if (!parent) return undefined;\n return this.startSpan({\n name,\n traceId: parent.traceId,\n parentSpanId: parent.spanId,\n attributes,\n });\n }\n\n /**\n * Clear all traces (for testing).\n */\n clear(): void {\n this.spans.clear();\n this.traceSpans.clear();\n }\n}\n","import pTimeout from \"p-timeout\";\nimport type { ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext } from \"../types/ToolIntent.js\";\nimport type { ToolAdapter } from \"../types/ToolSpec.js\";\nimport { SchemaValidator, SchemaValidationError } from \"./SchemaValidator.js\";\nimport { PolicyEngine, PolicyDeniedError } from \"./PolicyEngine.js\";\nimport { BudgetManager } from \"./Budget.js\";\nimport { withRetry, createTaggedError } from \"./Retry.js\";\nimport type {\n PolicyDeniedEvent,\n RetryEvent,\n HitlApprovalRequestedEvent,\n HitlApprovalGrantedEvent,\n HitlApprovalDeniedEvent,\n} from \"../types/Events.js\";\nimport type { HitlSideEffect } from \"../types/ToolSpec.js\";\nimport { EventLog } from \"../../observability/EventLog.js\";\nimport { Metrics } from \"../../observability/Metrics.js\";\nimport { Tracing } from \"../../observability/Tracing.js\";\nimport type { Logger } from \"../../observability/Logger.js\";\n\n/** Called when tool has sideEffect external_write/destructive; return true/void to approve, false to deny. */\nexport type OnApprovalRequired = (\n spec: ToolSpec,\n args: unknown,\n ctx: ExecContext,\n) => Promise<boolean | void>;\n\nexport interface PipelineDependencies {\n registry: { get(name: string): ToolSpec | undefined; snapshot(): ToolSpec[] };\n adapters: Map<string, ToolAdapter>;\n validator: SchemaValidator;\n policy: PolicyEngine;\n budget: BudgetManager;\n eventLog: EventLog;\n metrics: Metrics;\n tracing: Tracing;\n logger: Logger;\n defaultMaxRetries?: number;\n /** HITL: when set, tools with sideEffect external_write/destructive require human approval before execute */\n onApprovalRequired?: OnApprovalRequired;\n}\n\n/**\n * Pipeline step: Resolve tool from registry.\n */\nexport function resolveTool(\n toolName: string,\n registry: PipelineDependencies[\"registry\"],\n): ToolSpec {\n const spec = registry.get(toolName);\n if (!spec) {\n throw createTaggedError(\n \"TOOL_NOT_FOUND\",\n `Tool not found: ${toolName}`,\n { availableTools: registry.snapshot().slice(0, 20).map(s => s.name) },\n );\n }\n return spec;\n}\n\n/**\n * Pipeline step: Validate input against schema.\n */\nexport function validateInput(\n spec: ToolSpec,\n args: unknown,\n validator: SchemaValidator,\n): unknown {\n try {\n return validator.validateOrThrow(\n spec.inputSchema,\n args,\n `Input validation failed for ${spec.name}`,\n );\n } catch (error) {\n if (error instanceof SchemaValidationError) {\n throw createTaggedError(\"INPUT_SCHEMA_INVALID\", error.message, {\n errors: error.errors,\n schema: spec.inputSchema,\n });\n }\n throw error;\n }\n}\n\n/**\n * Pipeline step: Enrich args with defaults from schema.\n */\nexport function enrichDefaults(\n spec: ToolSpec,\n args: unknown,\n validator: SchemaValidator,\n): unknown {\n return validator.enrichDefaults(spec.inputSchema, args);\n}\n\n/**\n * Pipeline step: Enforce policy checks.\n */\nexport function enforcePolicy(\n spec: ToolSpec,\n args: unknown,\n ctx: ExecContext,\n deps: Pick<\n PipelineDependencies,\n \"policy\" | \"eventLog\" | \"metrics\" | \"tracing\"\n >,\n): void {\n try {\n deps.policy.enforce(spec, args, ctx);\n } catch (error) {\n if (error instanceof PolicyDeniedError) {\n // Emit policy denied event\n const event: PolicyDeniedEvent = {\n type: \"POLICY_DENIED\",\n timestamp: new Date().toISOString(),\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n toolName: spec.name,\n traceId: ctx.traceId,\n userId: ctx.userId,\n reason: error.message,\n missingCapabilities: error.missingCapabilities?.map(String),\n };\n deps.eventLog.append(event);\n deps.metrics.recordPolicyDenied(spec.name, error.message);\n }\n throw error;\n }\n}\n\nconst HITL_GATED_SIDE_EFFECTS: HitlSideEffect[] = [\"external_write\", \"destructive\"];\n\n/**\n * Pipeline step: Human-in-the-loop approval for external_write/destructive tools.\n * When onApprovalRequired is set, waits for callback resolve(true/void) before continuing; resolve(false) or reject throws HITL_DENIED.\n */\nexport async function requireHumanApproval(\n spec: ToolSpec,\n args: unknown,\n ctx: ExecContext,\n deps: Pick<PipelineDependencies, \"onApprovalRequired\" | \"eventLog\" | \"logger\">,\n): Promise<void> {\n const sideEffect = (spec._meta?.hitl?.sideEffect ?? \"none\") as HitlSideEffect;\n if (!HITL_GATED_SIDE_EFFECTS.includes(sideEffect)) return;\n const onApproval = deps.onApprovalRequired;\n if (!onApproval) return;\n\n const baseEvent = {\n timestamp: new Date().toISOString(),\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n toolName: spec.name,\n traceId: ctx.traceId,\n userId: ctx.userId,\n };\n\n const requested: HitlApprovalRequestedEvent = {\n ...baseEvent,\n type: \"HITL_APPROVAL_REQUESTED\",\n sideEffect,\n };\n deps.eventLog.append(requested);\n deps.logger.trace(\"hitl.requested\", { tool: spec.name, sideEffect, requestId: ctx.requestId });\n\n let approved: boolean | void;\n try {\n approved = await onApproval(spec, args, ctx);\n } catch (err) {\n deps.eventLog.append({\n ...baseEvent,\n type: \"HITL_APPROVAL_DENIED\",\n sideEffect,\n reason: err instanceof Error ? err.message : String(err),\n } as HitlApprovalDeniedEvent);\n throw createTaggedError(\n \"HITL_DENIED\",\n `Human denied approval for ${spec.name} (${sideEffect})`,\n { reason: err instanceof Error ? err.message : String(err) },\n );\n }\n\n if (approved === false) {\n deps.eventLog.append({\n ...baseEvent,\n type: \"HITL_APPROVAL_DENIED\",\n sideEffect,\n reason: \"User rejected\",\n } as HitlApprovalDeniedEvent);\n throw createTaggedError(\"HITL_DENIED\", `Human denied approval for ${spec.name} (${sideEffect})`);\n }\n\n deps.eventLog.append({\n ...baseEvent,\n type: \"HITL_APPROVAL_GRANTED\",\n sideEffect,\n } as HitlApprovalGrantedEvent);\n deps.logger.trace(\"hitl.granted\", { tool: spec.name, sideEffect, requestId: ctx.requestId });\n}\n\n/**\n * Pipeline step: Execute tool with budget, retry, and timeout.\n */\nexport async function executeWithBudget(\n spec: ToolSpec,\n args: unknown,\n ctx: ExecContext,\n spanId: string,\n deps: PipelineDependencies,\n): Promise<{ result: unknown; raw?: unknown }> {\n const adapter = deps.adapters.get(spec.kind);\n if (!adapter) {\n throw createTaggedError(\n \"TOOL_NOT_FOUND\",\n `No adapter registered for kind: ${spec.kind}`,\n );\n }\n\n const timeoutMs = deps.budget.getTimeout(\n spec.name,\n ctx.budget?.timeoutMs,\n );\n const maxRetries = ctx.budget?.maxRetries ?? deps.defaultMaxRetries ?? 2;\n\n const executeFn = async () => {\n return deps.budget.execute(spec.name, async () => {\n deps.tracing.addEvent(spanId, \"execute_start\");\n deps.logger.trace(\"execute.start\", {\n tool: spec.name,\n requestId: ctx.requestId,\n timeoutMs,\n maxRetries,\n });\n const result = await adapter.invoke(spec, args, ctx);\n deps.tracing.addEvent(spanId, \"execute_end\");\n deps.logger.trace(\"execute.end\", {\n tool: spec.name,\n requestId: ctx.requestId,\n });\n return result;\n });\n };\n\n // Wrap with retry\n const retryFn = () =>\n withRetry(executeFn, {\n maxRetries,\n onRetry: (error, attempt) => {\n deps.metrics.recordRetry(spec.name);\n const event: RetryEvent = {\n type: \"RETRY\",\n timestamp: new Date().toISOString(),\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n toolName: spec.name,\n traceId: ctx.traceId,\n userId: ctx.userId,\n attempt,\n maxRetries,\n reason: error.message,\n };\n deps.eventLog.append(event);\n deps.tracing.addEvent(spanId, \"retry\", { attempt, reason: error.message });\n },\n });\n\n // Wrap with timeout\n try {\n return await pTimeout(retryFn(), {\n milliseconds: timeoutMs,\n message: `Tool ${spec.name} timed out after ${timeoutMs}ms`,\n });\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"timed out\")) {\n throw createTaggedError(\"TIMEOUT\", error.message);\n }\n throw error;\n }\n}\n\n/**\n * Pipeline step: Validate output against schema.\n */\nexport function validateOutput(\n spec: ToolSpec,\n result: unknown,\n validator: SchemaValidator,\n): unknown {\n try {\n return validator.validateOrThrow(\n spec.outputSchema,\n result,\n `Output validation failed for ${spec.name}`,\n );\n } catch (error) {\n if (error instanceof SchemaValidationError) {\n throw createTaggedError(\"OUTPUT_SCHEMA_INVALID\", error.message, {\n errors: error.errors,\n });\n }\n throw error;\n }\n}\n","import type { ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext, ToolIntent } from \"../types/ToolIntent.js\";\nimport type { Evidence, ToolResult } from \"../types/ToolResult.js\";\nimport type {\n ToolCalledEvent,\n ToolResultEvent,\n} from \"../types/Events.js\";\nimport { EventLog } from \"../../observability/EventLog.js\";\nimport { Metrics } from \"../../observability/Metrics.js\";\nimport { Tracing } from \"../../observability/Tracing.js\";\nimport { sanitizeForLog, summarizeForLog } from \"../../observability/Logger.js\";\nimport type { Logger } from \"../../observability/Logger.js\";\n\nexport interface ObservabilityDependencies {\n eventLog: EventLog;\n metrics: Metrics;\n tracing: Tracing;\n logger: Logger;\n}\n\n/**\n * Emit TOOL_CALLED event.\n */\nexport function emitToolCalled(\n intent: ToolIntent,\n ctx: ExecContext,\n deps: ObservabilityDependencies,\n): void {\n const event: ToolCalledEvent = {\n type: \"TOOL_CALLED\",\n timestamp: new Date().toISOString(),\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n toolName: intent.tool,\n traceId: ctx.traceId,\n userId: ctx.userId,\n argsSummary: sanitizeArgs(intent.args),\n purpose: intent.purpose,\n idempotencyKey: intent.idempotencyKey,\n };\n deps.eventLog.append(event);\n}\n\n/**\n * Record successful tool invocation.\n */\nexport function recordSuccess(\n spec: ToolSpec,\n durationMs: number,\n _evidence: Evidence[],\n spanId: string,\n deps: ObservabilityDependencies,\n): void {\n deps.metrics.recordInvocation(spec.name, true, durationMs);\n deps.tracing.setAttributes(spanId, {\n \"tool.duration_ms\": durationMs,\n \"tool.ok\": true,\n });\n deps.tracing.endSpan(spanId, \"ok\");\n}\n\n/**\n * Handle error and return ToolResult.\n */\nexport function handleError(\n error: unknown,\n intent: ToolIntent,\n ctx: ExecContext,\n durationMs: number,\n spanId: string,\n deps: ObservabilityDependencies,\n): ToolResult {\n const kind = (error as any)?.kind ?? \"UPSTREAM_ERROR\";\n const message =\n error instanceof Error ? error.message : String(error);\n const details = (error as any)?.details;\n\n // Metrics & tracing\n deps.metrics.recordInvocation(intent.tool, false, durationMs);\n deps.tracing.setAttributes(spanId, {\n \"tool.duration_ms\": durationMs,\n \"tool.ok\": false,\n \"tool.error_kind\": kind,\n });\n deps.tracing.endSpan(spanId, \"error\");\n\n // Event log\n const event: ToolResultEvent = {\n type: \"TOOL_RESULT\",\n timestamp: new Date().toISOString(),\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n toolName: intent.tool,\n traceId: ctx.traceId,\n userId: ctx.userId,\n ok: false,\n durationMs,\n resultSummary: message,\n evidence: [],\n error: { kind, message, details },\n };\n deps.eventLog.append(event);\n\n deps.logger.warn(\"invoke.error\", {\n tool: intent.tool,\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n traceId: ctx.traceId,\n kind,\n message,\n durationMs,\n details: deps.logger.options.includeResults\n ? summarizeForLog(details)\n : undefined,\n });\n\n return {\n ok: false,\n evidence: [],\n error: { kind, message, details },\n };\n}\n\nfunction sanitizeArgs(args: unknown): string {\n if (!args) return \"{}\";\n return sanitizeForLog(args);\n}\n","import type { ToolAdapter, ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext, ToolIntent } from \"../types/ToolIntent.js\";\nimport type { ToolResult, Evidence } from \"../types/ToolResult.js\";\nimport { ToolRegistry } from \"../registry/ToolRegistry.js\";\nimport { SchemaValidator } from \"./SchemaValidator.js\";\nimport { PolicyEngine } from \"./PolicyEngine.js\";\nimport { BudgetManager } from \"./Budget.js\";\nimport { buildEvidence } from \"./Evidence.js\";\nimport { EventLog } from \"../../observability/EventLog.js\";\nimport { createLogger, summarizeForLog, sanitizeForLog } from \"../../observability/Logger.js\";\nimport type { DebugOptions, Logger } from \"../../observability/Logger.js\";\nimport { Metrics } from \"../../observability/Metrics.js\";\nimport { Tracing } from \"../../observability/Tracing.js\";\nimport type { PolicyConfig } from \"./PolicyEngine.js\";\nimport type { BudgetOptions } from \"./Budget.js\";\nimport { createTaggedError } from \"./Retry.js\";\nimport {\n resolveTool,\n validateInput,\n enrichDefaults,\n enforcePolicy,\n requireHumanApproval,\n executeWithBudget,\n validateOutput,\n type PipelineDependencies,\n} from \"./PTCRuntimePipeline.js\";\nimport {\n emitToolCalled,\n recordSuccess,\n handleError,\n type ObservabilityDependencies,\n} from \"./PTCRuntimeObservability.js\";\n\n/**\n * PTC Runtime configuration.\n */\nexport interface PTCRuntimeConfig {\n policy?: PolicyConfig;\n budget?: BudgetOptions;\n /** Include raw response in ToolResult (default: true, disable in production) */\n includeRaw?: boolean;\n /** Maximum retries if not specified in context (default: 2) */\n defaultMaxRetries?: number;\n /** Debug/logging configuration */\n debug?: DebugOptions;\n /** HITL: when set, tools with sideEffect external_write/destructive require human approval before execute; callback returns true/void to approve, false to deny */\n onApprovalRequired?: (\n spec: import(\"../types/ToolSpec.js\").ToolSpec,\n args: unknown,\n ctx: import(\"../types/ToolIntent.js\").ExecContext,\n ) => Promise<boolean | void>;\n}\n\n/**\n * PTC Runtime: the unified execution kernel for all tool invocations.\n *\n * Enforces the mandatory 9-step pipeline:\n * 1. Resolve (Registry lookup)\n * 2. Input Validate (AJV)\n * 3. Defaults Enrich\n * 4. Policy Gate\n * 5. Budget check\n * 6. HITL approval (if onApprovalRequired set and tool sideEffect external_write/destructive)\n * 7. Execute (adapter.invoke())\n * 8. Output Validate (AJV)\n * 9. Evidence Build\n * 10. Audit & Metrics\n *\n * Never throws to callers - always returns ToolResult.\n */\nexport class PTCRuntime {\n private readonly registry: ToolRegistry;\n private readonly adapters = new Map<string, ToolAdapter>();\n private readonly validator: SchemaValidator;\n private readonly policy: PolicyEngine;\n private readonly budget: BudgetManager;\n private readonly eventLog: EventLog;\n private readonly metrics: Metrics;\n private readonly tracing: Tracing;\n private readonly config: PTCRuntimeConfig;\n private readonly logger: Logger;\n\n constructor(\n options: {\n registry?: ToolRegistry;\n validator?: SchemaValidator;\n policy?: PolicyEngine;\n budget?: BudgetManager;\n eventLog?: EventLog;\n metrics?: Metrics;\n tracing?: Tracing;\n config?: PTCRuntimeConfig;\n } = {},\n ) {\n this.config = options.config ?? {};\n this.registry = options.registry ?? new ToolRegistry();\n this.validator = options.validator ?? new SchemaValidator();\n this.policy = options.policy ?? new PolicyEngine(this.config.policy);\n this.budget = options.budget ?? new BudgetManager(this.config.budget);\n this.eventLog = options.eventLog ?? new EventLog();\n this.metrics = options.metrics ?? new Metrics();\n this.tracing = options.tracing ?? new Tracing();\n this.logger = createLogger({ ...this.config.debug, prefix: \"PTCRuntime\" });\n\n if (this.logger.options.logEvents) {\n this.eventLog.on((entry) => {\n const event = entry.event;\n this.logger.debug(\"event\", {\n seq: entry.seq,\n type: event.type,\n toolName: event.toolName,\n requestId: event.requestId,\n taskId: event.taskId,\n ok: \"ok\" in event ? event.ok : undefined,\n });\n });\n }\n }\n\n /**\n * Register an adapter for a tool kind.\n */\n registerAdapter(adapter: ToolAdapter): void {\n this.adapters.set(adapter.kind, adapter);\n }\n\n /**\n * Get an adapter by kind (e.g. \"mcp\"). Use to set MCP client via adapter.setClient().\n */\n getAdapter(kind: string): ToolAdapter | undefined {\n return this.adapters.get(kind);\n }\n\n /**\n * Get the tool registry.\n */\n getRegistry(): ToolRegistry {\n return this.registry;\n }\n\n /**\n * Get the event log.\n */\n getEventLog(): EventLog {\n return this.eventLog;\n }\n\n /**\n * Get the metrics collector.\n */\n getMetrics(): Metrics {\n return this.metrics;\n }\n\n /**\n * Get the tracing system.\n */\n getTracing(): Tracing {\n return this.tracing;\n }\n\n /**\n * Invoke a tool through the PTC pipeline.\n * Never throws - always returns a structured ToolResult.\n */\n async invoke(intent: ToolIntent, ctx: ExecContext): Promise<ToolResult> {\n const startTime = Date.now();\n if (this.logger.isEnabled(\"debug\")) {\n this.logger.debug(\"invoke.start\", {\n tool: intent.tool,\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n traceId: ctx.traceId,\n purpose: intent.purpose,\n args: this.logger.options.includeArgs\n ? sanitizeForLog(intent.args)\n : undefined,\n });\n }\n const span = this.tracing.startSpan({\n name: `tool:${intent.tool}`,\n traceId: ctx.traceId,\n attributes: {\n \"tool.name\": intent.tool,\n \"tool.purpose\": intent.purpose,\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n },\n });\n\n // Emit TOOL_CALLED event\n emitToolCalled(intent, ctx, this.getObservabilityDeps());\n\n try {\n // Step 1: Resolve\n const spec = resolveTool(intent.tool, this.registry);\n\n this.tracing.addEvent(span.spanId, \"resolved\", {\n kind: spec.kind,\n version: spec.version,\n });\n\n // Step 2: Input Validate\n const validatedArgs = validateInput(spec, intent.args, this.validator);\n\n // Step 3: Defaults Enrich\n const enrichedArgs = enrichDefaults(spec, validatedArgs, this.validator);\n\n // Step 4: Policy Gate\n enforcePolicy(spec, enrichedArgs, ctx, {\n policy: this.policy,\n eventLog: this.eventLog,\n metrics: this.metrics,\n tracing: this.tracing,\n });\n\n // Step 5: Budget check\n if (!this.budget.checkRateLimit(spec.name)) {\n throw createTaggedError(\n \"BUDGET_EXCEEDED\",\n `Rate limit exceeded for tool: ${spec.name}`,\n );\n }\n\n // Step 6: HITL approval (for external_write/destructive when onApprovalRequired set)\n await requireHumanApproval(spec, enrichedArgs, ctx, {\n onApprovalRequired: this.config.onApprovalRequired,\n eventLog: this.eventLog,\n logger: this.logger,\n });\n\n // Dry-run mode: return without execution\n if (ctx.dryRun) {\n return this.buildDryRunResult(spec, enrichedArgs, ctx, startTime, span.spanId);\n }\n\n // Step 7: Execute with budget (timeout + retry + circuit breaker)\n const { result, raw } = await executeWithBudget(\n spec,\n enrichedArgs,\n ctx,\n span.spanId,\n this.getPipelineDeps(),\n );\n\n // Step 8: Output Validate\n const validatedOutput = validateOutput(spec, result, this.validator);\n\n // Step 9: Evidence Build (merge adapter-provided evidence with built evidence)\n const durationMs = Date.now() - startTime;\n const builtEvidence = buildEvidence({\n spec,\n args: enrichedArgs,\n result: validatedOutput,\n raw,\n ctx,\n durationMs,\n });\n const adapterEvidence: Evidence[] =\n raw &&\n typeof raw === \"object\" &&\n Array.isArray((raw as { evidence?: Evidence[] }).evidence)\n ? ((raw as { evidence: Evidence[] }).evidence as Evidence[])\n : [];\n const evidence = [...adapterEvidence, ...builtEvidence];\n\n // Step 10: Audit & Metrics\n recordSuccess(spec, durationMs, evidence, span.spanId, this.getObservabilityDeps());\n\n if (this.logger.isEnabled(\"debug\")) {\n this.logger.debug(\"invoke.ok\", {\n tool: spec.name,\n durationMs,\n result: this.logger.options.includeResults\n ? summarizeForLog(validatedOutput)\n : undefined,\n raw: this.logger.options.includeRaw\n ? summarizeForLog(raw)\n : undefined,\n });\n }\n\n return {\n ok: true,\n result: validatedOutput,\n evidence,\n raw: this.config.includeRaw !== false ? raw : undefined,\n };\n } catch (error) {\n const durationMs = Date.now() - startTime;\n return handleError(error, intent, ctx, durationMs, span.spanId, this.getObservabilityDeps());\n }\n }\n\n /**\n * Search for tools in the registry.\n */\n searchTools(\n query: string,\n filters?: { kind?: string; capabilities?: string[]; tags?: string[] },\n ): ToolSpec[] {\n return this.registry.search({\n text: query,\n kind: filters?.kind as any,\n capabilities: filters?.capabilities as any,\n tags: filters?.tags,\n });\n }\n\n /**\n * Get the schema for a tool.\n */\n getToolSchema(toolName: string): { input: object; output: object } | undefined {\n const spec = this.registry.get(toolName);\n if (!spec) return undefined;\n return { input: spec.inputSchema, output: spec.outputSchema };\n }\n\n // --- Helper Methods ---\n\n private getPipelineDeps(): PipelineDependencies {\n return {\n registry: this.registry,\n adapters: this.adapters,\n validator: this.validator,\n policy: this.policy,\n budget: this.budget,\n eventLog: this.eventLog,\n metrics: this.metrics,\n tracing: this.tracing,\n logger: this.logger,\n defaultMaxRetries: this.config.defaultMaxRetries,\n onApprovalRequired: this.config.onApprovalRequired,\n };\n }\n\n private getObservabilityDeps(): ObservabilityDependencies {\n return {\n eventLog: this.eventLog,\n metrics: this.metrics,\n tracing: this.tracing,\n logger: this.logger,\n };\n }\n\n private buildDryRunResult(\n spec: ToolSpec,\n args: unknown,\n _ctx: ExecContext,\n startTime: number,\n spanId: string,\n ): ToolResult {\n void (Date.now() - startTime); // durationMs calculated but not used in dry-run\n this.tracing.endSpan(spanId, \"ok\");\n\n return {\n ok: true,\n result: {\n dryRun: true,\n tool: spec.name,\n kind: spec.kind,\n args,\n capabilities: spec.capabilities,\n },\n evidence: [\n {\n type: \"tool\",\n ref: `${spec.name}@${spec.version}`,\n summary: `Dry-run: would execute ${spec.kind}:${spec.name}`,\n createdAt: new Date().toISOString(),\n },\n ],\n };\n }\n\n}\n","/**\n * Tool path format (canonical, supported everywhere):\n * [protocol]:[scope]/[package with version]#[tool name] (tool name required)\n * [protocol]:[scope]/[package with version] (bare package; tool name omitted = all tools)\n *\n * Examples:\n * npm:@easynet/agent-tool-builtin#fs.readText\n * npm:@scope/pkg@1.0.0#http.fetchText\n * npm:@easynet/agent-tool-builtin (bare package)\n * file:./local/tools#myTool\n */\n\n/** Matches [protocol]:[scope]/[package]#[tool name] or [protocol]:[scope]/[package] (optional #part) */\nconst TOOL_PATH_REGEX = /^([a-z][a-z0-9-]*):([^/]+)\\/([^#]+)(#(.+))?$/;\n\nexport interface ToolPath {\n /** Protocol (npm, file, http, etc.) */\n protocol: string;\n /** Scope, e.g. @easynet or scope */\n scope: string;\n /** Package id, optionally with version (e.g. pkg or pkg@1.0.0) */\n packageWithVersion: string;\n /** Tool name after #; empty string when bare package (no #) */\n toolName: string;\n}\n\n/** Parsed package and optional version from packageWithVersion (e.g. \"pkg@1.0.0\" -> { package: \"pkg\", version: \"1.0.0\" }) */\nexport interface PackageVersion {\n package: string;\n version?: string;\n}\n\n/**\n * Check if a string is a tool path in canonical form.\n * Format: [protocol]:[scope]/[package with version]#[tool name]\n */\nexport function isToolPath(descriptor: string): boolean {\n return TOOL_PATH_REGEX.test(descriptor.trim());\n}\n\n/**\n * Parse a tool path into { protocol, scope, packageWithVersion, toolName }.\n * Returns null if the string does not match the format.\n */\nexport function parseToolPath(descriptor: string): ToolPath | null {\n const s = descriptor.trim();\n const m = s.match(TOOL_PATH_REGEX);\n if (!m || m[1] === undefined || m[2] === undefined || m[3] === undefined) return null;\n return {\n protocol: m[1],\n scope: m[2],\n packageWithVersion: m[3],\n toolName: m[5] ?? \"\",\n };\n}\n\n/**\n * Split packageWithVersion into package and optional version (e.g. \"pkg@1.0.0\" -> { package: \"pkg\", version: \"1.0.0\" }).\n */\nexport function parsePackageVersion(packageWithVersion: string): PackageVersion {\n const at = packageWithVersion.lastIndexOf(\"@\");\n if (at <= 0) return { package: packageWithVersion };\n const pkg = packageWithVersion.slice(0, at);\n const version = packageWithVersion.slice(at + 1);\n if (!version || /^\\d/.test(version)) return { package: pkg, version };\n return { package: packageWithVersion };\n}\n\n// --- Backward compatibility: npm-specific API ---\n\n/** Matches npm:@scope/packageName#toolPath (subset of tool path) */\nconst NPM_TOOL_DESCRIPTOR_REGEX = /^npm:(@[\\w.-]+\\/[\\w.-]+)#(.+)$/;\n\nexport interface NpmToolDescriptor {\n /** Full package id, e.g. @scope/package */\n fullPackage: string;\n /** Tool path after #, e.g. fs.readText */\n toolPath: string;\n}\n\n/**\n * Check if a string is an npm tool path (npm:@scope/package#path).\n * @deprecated Prefer isToolPath(descriptor) and parseToolPath(descriptor)?.protocol === 'npm'\n */\nexport function isNpmToolDescriptor(descriptor: string): boolean {\n return isToolPath(descriptor) && parseToolPath(descriptor)?.protocol === \"npm\";\n}\n\n/**\n * Parse npm tool path into { fullPackage, toolPath } or null.\n * @deprecated Prefer parseToolPath(descriptor) for protocol:scope/package#toolName\n */\nexport function parseNpmToolDescriptor(descriptor: string): NpmToolDescriptor | null {\n const parsed = parseToolPath(descriptor);\n if (!parsed || parsed.protocol !== \"npm\") return null;\n return {\n fullPackage: `${parsed.scope}/${parsed.packageWithVersion}`,\n toolPath: parsed.toolName,\n };\n}\n\n/** npm package id for builtin tools; registry names use core/ prefix. */\nconst BUILTIN_NPM_PACKAGE = \"@easynet/agent-tool-builtin\";\nconst BUILTIN_REGISTRY_PREFIX = \"core/\";\n\n/** Full package descriptor for builtin tools (display scope). Use with optional @version. */\nexport const BUILTIN_DISPLAY_SCOPE_PREFIX = \"npm:@easynet/agent-tool-builtin\";\n\n/**\n * Return the display scope (full package name) for a tool. For core/builtin tools returns\n * npm:@easynet/agent-tool-builtin@[version]; for others returns the scope part of the registry name.\n */\nexport function getDisplayScope(\n registryName: string,\n kind: string,\n toolVersion?: string,\n): string {\n if (kind === \"core\" || registryName.startsWith(BUILTIN_REGISTRY_PREFIX)) {\n return toolVersion\n ? `${BUILTIN_DISPLAY_SCOPE_PREFIX}@${toolVersion}`\n : BUILTIN_DISPLAY_SCOPE_PREFIX;\n }\n const i = registryName.indexOf(\"/\");\n return i < 0 ? registryName : registryName.slice(0, i);\n}\n\n/**\n * Resolve a single npm tool descriptor to one or more registry names (builtin: npm:@easynet/agent-tool-builtin#path -> core/path).\n * Returns null if not a known npm descriptor. For wildcards or bare package, use expandToolDescriptorsToRegistryNames.\n */\nexport function resolveNpmToolDescriptor(descriptor: string): string | null {\n const parsed = parseToolPath(descriptor);\n if (!parsed || parsed.protocol !== \"npm\") return null;\n const pv = parsePackageVersion(parsed.packageWithVersion);\n const pkgId = `${parsed.scope}/${pv.package}`;\n if (pkgId !== BUILTIN_NPM_PACKAGE) return null;\n if (!parsed.toolName) return null;\n if (parsed.toolName.includes(\"*\")) return null;\n return BUILTIN_REGISTRY_PREFIX + parsed.toolName;\n}\n\n/**\n * Expand a list of tool descriptors (npm:...#path, npm:...#prefix.*, bare npm:...# omitted) to registry tool names.\n * - npm:@easynet/agent-tool-builtin#path -> core/path\n * - npm:@easynet/agent-tool-builtin#fs.* -> all core/fs.* names from registry\n * - npm:@easynet/agent-tool-builtin -> all core/* names from registry\n * - Plain names and already-resolved names are kept as-is (exact match).\n */\nexport function expandToolDescriptorsToRegistryNames(\n descriptors: string[],\n registryNames: string[],\n): string[] {\n const out: string[] = [];\n const seen = new Set<string>();\n\n function add(name: string): void {\n if (registryNames.includes(name) && !seen.has(name)) {\n seen.add(name);\n out.push(name);\n }\n }\n\n function globMatch(pattern: string, name: string): boolean {\n const re = new RegExp(\"^\" + pattern.replace(/\\*/g, \"[^.]*\").replace(/\\./g, \"\\\\.\") + \"$\");\n return re.test(name);\n }\n\n for (const d of descriptors) {\n const s = d.trim();\n if (!s) continue;\n const parsed = parseToolPath(s);\n if (parsed && parsed.protocol === \"npm\") {\n const pv = parsePackageVersion(parsed.packageWithVersion);\n const pkgId = `${parsed.scope}/${pv.package}`;\n if (pkgId === BUILTIN_NPM_PACKAGE) {\n if (!parsed.toolName) {\n registryNames.filter((n) => n.startsWith(BUILTIN_REGISTRY_PREFIX)).forEach(add);\n continue;\n }\n if (parsed.toolName.includes(\"*\")) {\n registryNames\n .filter((n) => n.startsWith(BUILTIN_REGISTRY_PREFIX) && globMatch(parsed.toolName, n.slice(BUILTIN_REGISTRY_PREFIX.length)))\n .forEach(add);\n continue;\n }\n add(BUILTIN_REGISTRY_PREFIX + parsed.toolName);\n continue;\n }\n }\n add(s);\n }\n return out;\n}\n\n/**\n * Resolve a single tool descriptor to a tool name.\n * If it is a tool path, returns it as-is (no resolution in this package); otherwise returns the string as-is (plain name).\n */\nexport function resolveToolDescriptor(descriptor: string): string {\n const s = descriptor.trim();\n const resolved = resolveNpmToolDescriptor(s);\n if (resolved !== null) return resolved;\n return s;\n}\n\n/**\n * Normalize a list of tool descriptors (plain names or [protocol]:[scope]/[package]#[tool name]).\n * Deduplicates and preserves order. Tool paths are kept as-is (no resolution in this package).\n */\nexport function normalizeToolList(descriptors: string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const d of descriptors) {\n if (typeof d !== \"string\" || !d.trim()) continue;\n const name = resolveToolDescriptor(d);\n if (!seen.has(name)) {\n seen.add(name);\n out.push(name);\n }\n }\n return out;\n}\n\n/**\n * Serialize ToolPath back to canonical string.\n * [protocol]:[scope]/[package with version]#[tool name]\n */\nexport function formatToolPath(path: ToolPath): string {\n return `${path.protocol}:${path.scope}/${path.packageWithVersion}#${path.toolName}`;\n}\n","/**\n * Load tool.yaml: list of tool names or npm descriptors (npm:@scope/package#path),\n * and optional sandboxedPath (fs tools can only access that directory; cache is under it).\n */\n\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { resolve, join, dirname } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport yaml from \"js-yaml\";\n\n/** Shape of tool.yaml: tools list and optional sandboxedPath. */\nexport interface ToolYamlShape {\n tools?: string[];\n /** Root path for fs sandbox; tools can only access under this path. Resolved relative to tool.yaml dir. */\n sandboxedPath?: string;\n}\n\n/**\n * Load tool.yaml and return tools list and sandboxedPath (if set).\n */\nexport function loadToolConfig(toolYamlPath: string): ToolYamlShape {\n const abs = resolve(toolYamlPath);\n const raw = readFileSync(abs, \"utf8\");\n const parsed = yaml.load(raw) as ToolYamlShape | undefined;\n if (!parsed || typeof parsed !== \"object\") return {};\n return parsed;\n}\n\n/**\n * Resolve sandboxedPath from tool.yaml relative to the config file directory.\n * Expands leading ~ to homedir so ~/.agent/sandbox works.\n */\nexport function resolveSandboxedPath(toolYamlPath: string, sandboxedPath: string): string {\n const expanded =\n sandboxedPath.startsWith(\"~/\") ? join(homedir(), sandboxedPath.slice(2))\n : sandboxedPath === \"~\" ? homedir()\n : sandboxedPath.startsWith(\"~\") && (sandboxedPath.length === 1 || sandboxedPath[1] === \"/\")\n ? join(homedir(), sandboxedPath.slice(1))\n : sandboxedPath;\n const configDir = dirname(resolve(toolYamlPath));\n return resolve(configDir, expanded);\n}\n\n/** Default subdir under sandboxedPath for the npm package cache. */\nexport const CACHE_SUBDIR = \".agent/cache\";\n\n/**\n * Return cache base path when tool.yaml has sandboxedPath: sandboxedPath/.agent/cache.\n * Call ensurePackageInCache(..., { cacheBase: getCacheBaseFromToolConfig(path) }) to use it.\n */\nexport function getCacheBaseFromToolConfig(toolYamlPath: string): string | undefined {\n const config = loadToolConfig(toolYamlPath);\n if (!config.sandboxedPath || typeof config.sandboxedPath !== \"string\") return undefined;\n const sandboxRoot = resolveSandboxedPath(toolYamlPath, config.sandboxedPath);\n return join(sandboxRoot, CACHE_SUBDIR);\n}\n\n/**\n * Find tool.yaml in directory (tool.yaml or .tool.yaml) and load it.\n * Dir is resolved against process.cwd() when relative so we always load from the local folder.\n */\nexport function findAndLoadToolConfig(dir: string): ToolYamlShape & { configPath?: string } {\n const resolvedDir = resolve(dir);\n const candidates = [join(resolvedDir, \"tool.yaml\"), join(resolvedDir, \".tool.yaml\")];\n for (const p of candidates) {\n if (existsSync(p)) {\n const config = loadToolConfig(p);\n return { ...config, configPath: p };\n }\n }\n return {};\n}\n","/**\n * Framework: resolve an npm package into a local cache folder (like Maven .m2).\n * Cache root: ~/.agent/cache/, organized by package path and version.\n * Packs the package, extracts it, runs npm install in that directory so each\n * downloaded package has its own node_modules—no sharing with the host project—\n * to avoid package conflicts.\n */\n\nimport { execSync } from \"node:child_process\";\nimport { readFileSync, readdirSync, mkdirSync, rmSync, renameSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { pathToFileURL } from \"node:url\";\n\nexport interface EnsurePackageInCacheOptions {\n /** Custom cache root (default: ~/.agent/cache) */\n cacheBase?: string;\n /** Called after npm install; use to add symlinks/aliases in cacheDir/node_modules */\n afterInstall?: (cacheDir: string, packageName: string) => void;\n}\n\nconst DEFAULT_CACHE_BASE = join(homedir(), \".agent\", \"cache\");\n\n/**\n * Package path for cache dir: @scope/name -> scope/name (path segments).\n */\nfunction packagePathSegments(name: string): string[] {\n const withoutScope = name.replace(/^@/, \"\");\n return withoutScope.split(\"/\").filter(Boolean);\n}\n\n/**\n * Resolve cache dir: cacheBase/scope/packageName/version (e.g. ~/.agent/cache/easynet/agent-tool-buildin/0.0.1).\n */\nfunction resolveCacheDir(cacheBase: string, packageName: string, version: string): string {\n const segments = packagePathSegments(packageName);\n return join(cacheBase, ...segments, version);\n}\n\n/**\n * Extract version from packed tarball name (e.g. easynet-agent-tool-buildin-0.0.1.tgz -> 0.0.1)\n * or read from extracted package/package.json.\n */\nfunction getVersionFromTarball(tgzName: string): string {\n const base = tgzName.replace(/\\.tgz$/i, \"\");\n const match = base.match(/-(\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?)$/);\n return match ? match[1]! : base;\n}\n\n/**\n * Ensure the npm package is in the cache: pack, extract, npm install.\n * Returns the package root path (with its own node_modules).\n * Cache layout: ~/.agent/cache/<scope>/<name>/<version>/ (like Maven .m2).\n */\nexport function ensurePackageInCache(\n packageName: string,\n version: string = \"latest\",\n options: EnsurePackageInCacheOptions = {},\n): string {\n const cacheBase = options.cacheBase ?? DEFAULT_CACHE_BASE;\n const packDest = join(cacheBase, \".pack-tmp\", packageName.replace(/@/g, \"\").replace(/\\//g, \"_\"));\n mkdirSync(packDest, { recursive: true });\n\n try {\n execSync(`npm pack ${packageName}@${version} --pack-destination \"${packDest}\"`, {\n cwd: process.cwd(),\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n\n const files = readdirSync(packDest);\n const tgz = files.find((f) => f.endsWith(\".tgz\"));\n if (!tgz) {\n throw new Error(`npm pack did not produce a .tgz in ${packDest}`);\n }\n\n const resolvedVersion = getVersionFromTarball(tgz);\n const cacheDir = resolveCacheDir(cacheBase, packageName, resolvedVersion);\n const packageJsonPath = join(cacheDir, \"package.json\");\n const nodeModulesPath = join(cacheDir, \"node_modules\");\n\n if (existsSync(packageJsonPath) && existsSync(nodeModulesPath)) {\n options.afterInstall?.(cacheDir, packageName);\n rmSync(packDest, { recursive: true, force: true });\n return cacheDir;\n }\n\n const extractDir = join(packDest, \"extract\");\n mkdirSync(extractDir, { recursive: true });\n execSync(`tar -xzf \"${join(packDest, tgz)}\" -C \"${extractDir}\"`, {\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n\n const extractedPackage = join(extractDir, \"package\");\n if (!existsSync(extractedPackage)) {\n throw new Error(`Extracted tarball did not contain \"package\" dir in ${extractDir}`);\n }\n\n mkdirSync(join(cacheDir, \"..\"), { recursive: true });\n if (existsSync(cacheDir)) {\n rmSync(cacheDir, { recursive: true, force: true });\n }\n renameSync(extractedPackage, cacheDir);\n\n execSync(\"npm install\", {\n cwd: cacheDir,\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n\n options.afterInstall?.(cacheDir, packageName);\n return cacheDir;\n } finally {\n if (existsSync(packDest)) {\n rmSync(packDest, { recursive: true, force: true });\n }\n }\n}\n\n/**\n * Resolve the package entry point (main or dist/index.js).\n */\nexport function getPackageEntryPath(packageRoot: string): string {\n const pkgPath = join(packageRoot, \"package.json\");\n if (!existsSync(pkgPath)) {\n throw new Error(`No package.json in ${packageRoot}`);\n }\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as { main?: string; exports?: unknown };\n const main = pkg.main ?? \"dist/index.js\";\n const entry = join(packageRoot, main);\n if (!existsSync(entry)) {\n throw new Error(`Entry not found: ${entry}`);\n }\n return entry;\n}\n\n/**\n * Dynamic import from a cached package (file URL so Node resolves the package's node_modules).\n */\nexport async function importFromCache(packageRoot: string): Promise<unknown> {\n const entryPath = getPackageEntryPath(packageRoot);\n const fileUrl = pathToFileURL(entryPath).href;\n return import(/* @vite-ignore */ fileUrl);\n}\n","/**\n * Create PTCRuntime + ToolRegistry from config (sync or async).\n * Registers core/example adapters only when coreTools/exampleTools options are provided.\n * Extensions (@easynet/agent-tool-builtin-tools, @easynet/agent-tool-example-tools) are\n * loaded optionally so the CLI works when they are not installed (e.g. npx @easynet/agent-tool).\n * When configFilePath (tool.yaml) lists npm:@easynet/agent-tool-buildin@version, the package\n * is loaded from cache (~/.agent/cache or sandboxedPath/.agent/cache) if not in node_modules.\n */\n\nimport { createRequire } from \"node:module\";\nimport { join, resolve, isAbsolute } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport { ToolRegistry } from \"../core/registry/ToolRegistry.js\";\nimport { PTCRuntime } from \"../core/runtime/PTCRuntime.js\";\nimport type { ToolAdapter } from \"../core/types/ToolSpec.js\";\nimport { loadToolConfig, getCacheBaseFromToolConfig } from \"../tools/util/toolConfig.js\";\nimport { ensurePackageInCache, getPackageEntryPath, importFromCache } from \"../utils/npmCache.js\";\n\nconst requireFromPackage = createRequire(import.meta.url);\n\nfunction getProjectRequire(): NodeRequire | null {\n const cwd = process.cwd();\n if (existsSync(join(cwd, \"package.json\"))) return createRequire(join(cwd, \"package.json\"));\n if (existsSync(join(cwd, \"tool.yaml\"))) return createRequire(join(cwd, \"tool.yaml\"));\n return null;\n}\n\nconst BUILTIN_PKG_NAMES = [\n \"@easynet/agent-tool-builtin-tools\",\n \"@easynet/agent-tool-builtin\",\n \"@easynet/agent-tool-buildin\",\n];\n\n/** Config for core (builtin) tools; matches @easynet/agent-tool-builtin-tools when present. */\nexport interface CoreToolsUserConfig {\n sandboxRoot?: string;\n allowedHosts?: string[];\n}\n\n/** Config for example tools; matches @easynet/agent-tool-example-tools when present. */\nexport interface ExampleToolsUserConfig {\n allowedHosts?: string[];\n}\n\nexport interface CreateRuntimeOptions {\n /** Path to tool.yaml (optional; used by createAgentTools to filter tool list) */\n configFilePath?: string;\n /** Project path for async tool loading (optional; reserved for future use) */\n projectPath?: string;\n /** Sandbox / core tools config; when set, core adapter is registered */\n coreTools?: CoreToolsUserConfig;\n /** Example tools config; when set, example adapter is registered */\n exampleTools?: ExampleToolsUserConfig;\n}\n\nexport interface CreateRuntimeResult {\n runtime: PTCRuntime;\n registry: ToolRegistry;\n}\n\nfunction loadBuiltinTools(): { registerCoreTools: (r: ToolRegistry, c: CoreToolsUserConfig) => unknown } | null {\n const projectRequire = getProjectRequire();\n const requirers: NodeRequire[] = [requireFromPackage];\n if (projectRequire) requirers.push(projectRequire);\n for (const req of requirers) {\n for (const pkg of BUILTIN_PKG_NAMES) {\n try {\n const mod = req(pkg);\n if (mod && typeof mod.registerCoreTools === \"function\") return mod;\n } catch {\n continue;\n }\n }\n }\n return null;\n}\n\n/** Parse npm: descriptor (e.g. \"npm:@easynet/agent-tool-buildin@0.0.1\") to package name and version. */\nfunction parseNpmDescriptor(entry: string): { packageName: string; version: string } | null {\n if (typeof entry !== \"string\" || !entry.startsWith(\"npm:\")) return null;\n const rest = entry.slice(4).trim();\n const at = rest.indexOf(\"@\", 1);\n if (at < 0) return { packageName: rest, version: \"latest\" };\n const packageName = rest.slice(0, at);\n const version = rest.slice(at + 1).split(\"#\")[0]?.trim() || \"latest\";\n return { packageName, version };\n}\n\n/** Load builtin from tool.yaml npm: entry via cache (sync: require). Always uses local folder (cwd) for tool.yaml path. Falls back to ~/.agent/cache if project cache fails (e.g. .agent deleted). */\nfunction loadBuiltinFromToolYamlCache(configFilePath: string): { registerCoreTools: (r: ToolRegistry, c: CoreToolsUserConfig) => unknown } | null {\n const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);\n if (!existsSync(localPath)) return null;\n const config = loadToolConfig(localPath);\n const tools = config.tools;\n if (!Array.isArray(tools)) return null;\n const cacheBase = getCacheBaseFromToolConfig(localPath);\n const cacheOpts = cacheBase ? { cacheBase } : {};\n for (const entry of tools) {\n const parsed = parseNpmDescriptor(String(entry));\n if (!parsed || !BUILTIN_PKG_NAMES.includes(parsed.packageName)) continue;\n for (const opts of [cacheOpts, {}]) {\n try {\n const cacheDir = ensurePackageInCache(parsed.packageName, parsed.version, opts);\n const entryPath = getPackageEntryPath(cacheDir);\n const req = createRequire(join(cacheDir, \"package.json\"));\n const mod = req(entryPath);\n if (mod && typeof mod.registerCoreTools === \"function\") return mod;\n break;\n } catch {\n if (Object.keys(opts).length > 0) continue;\n break;\n }\n }\n }\n return null;\n}\n\n/** Load builtin from tool.yaml npm: entry via cache (async: import for ESM). Uses local folder (cwd) for tool.yaml path. Falls back to ~/.agent/cache if project cache fails (e.g. .agent deleted). */\nasync function loadBuiltinFromToolYamlCacheAsync(configFilePath: string): Promise<{ registerCoreTools: (r: ToolRegistry, c: CoreToolsUserConfig) => unknown } | null> {\n const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);\n if (!existsSync(localPath)) return null;\n const config = loadToolConfig(localPath);\n const tools = config.tools;\n if (!Array.isArray(tools)) return null;\n const cacheBase = getCacheBaseFromToolConfig(localPath);\n const cacheOpts = cacheBase ? { cacheBase } : {};\n for (const entry of tools) {\n const parsed = parseNpmDescriptor(String(entry));\n if (!parsed || !BUILTIN_PKG_NAMES.includes(parsed.packageName)) continue;\n for (const opts of [cacheOpts, {}]) {\n try {\n const cacheDir = ensurePackageInCache(parsed.packageName, parsed.version, opts);\n const mod = (await importFromCache(cacheDir)) as { registerCoreTools?: (r: ToolRegistry, c: CoreToolsUserConfig) => unknown };\n if (mod && typeof mod.registerCoreTools === \"function\") return mod as { registerCoreTools: (r: ToolRegistry, c: CoreToolsUserConfig) => unknown };\n break;\n } catch {\n if (Object.keys(opts).length > 0) continue;\n break;\n }\n }\n }\n return null;\n}\n\nfunction loadExampleTools(): { registerExampleTools: (r: ToolRegistry, c: ExampleToolsUserConfig) => unknown } | null {\n try {\n return requireFromPackage(\"@easynet/agent-tool-example-tools\");\n } catch {\n return null;\n }\n}\n\n/**\n * Create runtime and registry synchronously. Registers core/example adapters\n * only when coreTools/exampleTools are provided (opt-in). If extension packages\n * are not installed, those adapters are skipped (runtime still works with empty/minimal tools).\n */\nexport function createRuntimeFromConfigSync(options: CreateRuntimeOptions = {}): CreateRuntimeResult {\n const registry = new ToolRegistry();\n\n if (options.coreTools !== undefined) {\n let builtin = loadBuiltinTools();\n if (!builtin && options.configFilePath) {\n builtin = loadBuiltinFromToolYamlCache(options.configFilePath);\n }\n if (builtin) {\n const coreAdapter = builtin.registerCoreTools(registry, options.coreTools) as ToolAdapter;\n const runtime = new PTCRuntime({ registry });\n runtime.registerAdapter(coreAdapter);\n if (options.exampleTools !== undefined) {\n const example = loadExampleTools();\n if (example) {\n const exampleAdapter = example.registerExampleTools(registry, options.exampleTools) as ToolAdapter;\n runtime.registerAdapter(exampleAdapter);\n }\n }\n return { runtime, registry };\n }\n const runtime = new PTCRuntime({ registry });\n return { runtime, registry };\n }\n\n if (options.exampleTools !== undefined) {\n const example = loadExampleTools();\n if (example) {\n const exampleAdapter = example.registerExampleTools(registry, options.exampleTools) as ToolAdapter;\n const runtime = new PTCRuntime({ registry });\n runtime.registerAdapter(exampleAdapter);\n return { runtime, registry };\n }\n }\n\n const runtime = new PTCRuntime({ registry });\n return { runtime, registry };\n}\n\n/**\n * Create runtime and registry asynchronously. Tries sync first; when configFilePath is set\n * and no builtin was found (e.g. ESM package), tries loading from tool.yaml npm: entry via cache (dynamic import).\n */\nexport async function createRuntimeFromConfig(\n options: CreateRuntimeOptions = {}\n): Promise<CreateRuntimeResult> {\n const syncResult = createRuntimeFromConfigSync(options);\n if (options.coreTools !== undefined && options.configFilePath && syncResult.registry.snapshot().length === 0) {\n const builtin = await loadBuiltinFromToolYamlCacheAsync(options.configFilePath);\n if (builtin) {\n const registry = new ToolRegistry();\n const coreAdapter = builtin.registerCoreTools(registry, options.coreTools) as ToolAdapter;\n const runtime = new PTCRuntime({ registry });\n runtime.registerAdapter(coreAdapter);\n return { runtime, registry };\n }\n }\n return syncResult;\n}\n","/** Kind for MCP directory discovery. */\nexport const MCP_KIND = \"mcp\" as const;\n","/** Kind for LangChain directory discovery. */\nexport const LANGCHAIN_KIND = \"langchain\" as const;\n\n/** Conventional directory name for LangChain tools. */\nexport const LANGCHAIN_DIR_NAME = \"langchain\" as const;\n"]}
@@ -1,5 +1,5 @@
1
- import { LANGCHAIN_DIR_NAME, LANGCHAIN_KIND, MCP_KIND } from './chunk-HEAHNLIZ.js';
2
1
  import { DEFAULT_OUTPUT_SCHEMA } from './chunk-5SWSNVMI.js';
2
+ import { LANGCHAIN_DIR_NAME, LANGCHAIN_KIND, MCP_KIND } from './chunk-4RPX5UAU.js';
3
3
  import * as fs3 from 'fs/promises';
4
4
  import { readdir, readFile, access, stat } from 'fs/promises';
5
5
  import * as path9 from 'path';
@@ -1779,5 +1779,5 @@ async function runMcpServer(options = {}) {
1779
1779
  var runGeneratedMCP = runMcpServer;
1780
1780
 
1781
1781
  export { DirectoryScanner, DiscoveryError, SkillManifestError, buildFunctionToTool, buildMcpPackage, initProject, loadMCPTool, loadSkillDefinition, parseSkillMd, runGeneratedMCP, runMcpServer, scan, scanForTools, scanSkillResources, validateFrontmatter };
1782
- //# sourceMappingURL=chunk-FPRNWQMN.js.map
1783
- //# sourceMappingURL=chunk-FPRNWQMN.js.map
1782
+ //# sourceMappingURL=chunk-72HPGMFQ.js.map
1783
+ //# sourceMappingURL=chunk-72HPGMFQ.js.map