@easynet/agent-tool 1.0.35 → 1.0.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/expose/extension-init/index.d.ts +3 -0
- package/dist/api/expose/extension-init/index.d.ts.map +1 -0
- package/dist/api/expose/extension-init/initExtension.d.ts +19 -0
- package/dist/api/expose/extension-init/initExtension.d.ts.map +1 -0
- package/dist/api/extension/index.d.ts +1 -0
- package/dist/api/extension/index.d.ts.map +1 -1
- package/dist/api/extension/overrideWithConfig.d.ts +6 -0
- package/dist/api/extension/overrideWithConfig.d.ts.map +1 -0
- package/dist/api/main.cjs +15 -15
- package/dist/api/main.js +4 -4
- package/dist/canonicalCoreSchemas-PHGTNPN5.js +3 -0
- package/dist/{canonicalCoreSchemas-3BZJH6XD.js.map → canonicalCoreSchemas-PHGTNPN5.js.map} +1 -1
- package/dist/canonicalCoreSchemas-TY7NCWCC.cjs +16 -0
- package/dist/{canonicalCoreSchemas-P6KUD3WP.cjs.map → canonicalCoreSchemas-TY7NCWCC.cjs.map} +1 -1
- package/dist/{chunk-S27O27OH.cjs → chunk-4HPV2K7P.cjs} +17 -17
- package/dist/{chunk-S27O27OH.cjs.map → chunk-4HPV2K7P.cjs.map} +1 -1
- package/dist/{chunk-PSVSVTHY.js → chunk-7VBJ64YC.js} +69 -7
- package/dist/chunk-7VBJ64YC.js.map +1 -0
- package/dist/{chunk-P25NBSPT.cjs → chunk-DTWOUO7M.cjs} +10 -10
- package/dist/{chunk-P25NBSPT.cjs.map → chunk-DTWOUO7M.cjs.map} +1 -1
- package/dist/{chunk-U3CAAURW.js → chunk-HEMWFWSK.js} +3 -3
- package/dist/{chunk-U3CAAURW.js.map → chunk-HEMWFWSK.js.map} +1 -1
- package/dist/{chunk-2WDDJYR7.cjs → chunk-LP7KHBA3.cjs} +70 -8
- package/dist/chunk-LP7KHBA3.cjs.map +1 -0
- package/dist/{chunk-RRVM6JBA.js → chunk-NCPOKCX5.js} +4 -4
- package/dist/{chunk-RRVM6JBA.js.map → chunk-NCPOKCX5.js.map} +1 -1
- package/dist/{chunk-DDIGAOYI.js → chunk-NJ46JOBI.js} +5 -5
- package/dist/{chunk-DDIGAOYI.js.map → chunk-NJ46JOBI.js.map} +1 -1
- package/dist/chunk-NTWOVFEY.js +16 -0
- package/dist/chunk-NTWOVFEY.js.map +1 -0
- package/dist/chunk-UUNG3GL3.cjs +19 -0
- package/dist/chunk-UUNG3GL3.cjs.map +1 -0
- package/dist/{chunk-Z5STQ2JO.cjs → chunk-WFRHBW32.cjs} +9 -9
- package/dist/{chunk-Z5STQ2JO.cjs.map → chunk-WFRHBW32.cjs.map} +1 -1
- package/dist/index.cjs +64 -51
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -7
- package/dist/index.js.map +1 -1
- package/dist/tools/util/canonicalCoreSchemas.d.ts +6 -10
- package/dist/tools/util/canonicalCoreSchemas.d.ts.map +1 -1
- package/dist/tools/util/toolDescriptor.d.ts +3 -2
- package/dist/tools/util/toolDescriptor.d.ts.map +1 -1
- package/dist/utils/cli/index.cjs +235 -33
- package/dist/utils/cli/index.cjs.map +1 -1
- package/dist/utils/cli/index.d.ts.map +1 -1
- package/dist/utils/cli/index.js +202 -16
- package/dist/utils/cli/index.js.map +1 -1
- package/dist/utils/npmCache.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/canonicalCoreSchemas-3BZJH6XD.js +0 -4
- package/dist/canonicalCoreSchemas-P6KUD3WP.cjs +0 -21
- package/dist/chunk-2WDDJYR7.cjs.map +0 -1
- package/dist/chunk-3MUOBLNB.js +0 -243
- package/dist/chunk-3MUOBLNB.js.map +0 -1
- package/dist/chunk-4KTWJQ32.cjs +0 -247
- package/dist/chunk-4KTWJQ32.cjs.map +0 -1
- package/dist/chunk-PSVSVTHY.js.map +0 -1
|
@@ -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","packageToolDefaults","list","join","homedir","existsSync","readFileSync","resolve","dirname","runtime"],"mappings":"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","file":"chunk-7VBJ64YC.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 { normalizeToolName } 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 (tool name is normalized before lookup).\n */\nexport function resolveTool(\n toolName: string,\n registry: PipelineDependencies[\"registry\"],\n): ToolSpec {\n const key = normalizeToolName(toolName);\n const spec = registry.get(key);\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 * Common input aliases: alias key -> canonical key.\n * Applied when the tool's input schema requires the canonical key but the caller passed the alias.\n * No tool-specific logic; any tool with required \"query\" will accept \"q\".\n */\nconst INPUT_ALIASES: Record<string, string> = {\n q: \"query\",\n};\n\n/**\n * Pipeline step: Normalize common input aliases so LLM typos (e.g. \"q\" for \"query\") work.\n * Uses INPUT_ALIASES and the tool's required keys; no tool name checks.\n * Runs before validation so schema sees the canonical keys.\n */\nexport function normalizeInputAliases(spec: ToolSpec, args: unknown): unknown {\n if (args == null || typeof args !== \"object\" || Array.isArray(args)) {\n return args;\n }\n const required = getRequiredKeys(spec.inputSchema);\n const obj = args as Record<string, unknown>;\n let changed = false;\n const out = { ...obj };\n for (const [aliasKey, canonicalKey] of Object.entries(INPUT_ALIASES)) {\n if (\n required.includes(canonicalKey) &&\n (out[canonicalKey] === undefined || out[canonicalKey] === \"\") &&\n out[aliasKey] !== undefined &&\n out[aliasKey] !== \"\"\n ) {\n out[canonicalKey] = out[aliasKey];\n delete (out as Record<string, unknown>)[aliasKey];\n changed = true;\n }\n }\n return changed ? out : args;\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 const requiredKeys = getRequiredKeys(spec.inputSchema);\n const passedKeys =\n args != null && typeof args === \"object\" && !Array.isArray(args)\n ? Object.keys(args)\n : [];\n throw createTaggedError(\"INPUT_SCHEMA_INVALID\", error.message, {\n errors: error.errors,\n schema: spec.inputSchema,\n requiredKeys: requiredKeys.length ? requiredKeys : undefined,\n passedKeys: passedKeys.length ? passedKeys : undefined,\n hint:\n requiredKeys.length > 0\n ? `Expected input property ${requiredKeys.length === 1 ? `'${requiredKeys[0]}'` : `[${requiredKeys.map((k) => `'${k}'`).join(\", \")}]`}. You passed: ${passedKeys.length ? passedKeys.map((k) => `'${k}'`).join(\", \") : \"none\"}. Use the exact property names from the tool schema.`\n : undefined,\n });\n }\n throw error;\n }\n}\n\nfunction getRequiredKeys(schema: object): string[] {\n const s = schema as { required?: unknown };\n const raw = s.required;\n if (!Array.isArray(raw)) return [];\n return raw.filter((k): k is string => typeof k === \"string\");\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 normalizeInputAliases,\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 1.5: Normalize input aliases (e.g. q -> query for duckduckgoSearch)\n const normalizedArgs = normalizeInputAliases(spec, intent.args);\n\n // Step 2: Input Validate\n const validatedArgs = validateInput(spec, normalizedArgs, 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 // Treat tool-returned error shape as failure and give actionable feedback (e.g. \"use 'query' not 'q'\")\n const toolError = asToolReturnedError(result);\n if (toolError) {\n const hint = buildInputSchemaHint(spec.inputSchema);\n throw createTaggedError(\"UPSTREAM_ERROR\", toolError.message, {\n ...(toolError.details && typeof toolError.details === \"object\" && !Array.isArray(toolError.details)\n ? (toolError.details as object)\n : {}),\n hint: hint ?? \"Check the tool's input schema for required property names.\",\n });\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 * Detect tool-returned error shape: { error: string, details?: unknown }.\n * When tools return this instead of throwing, PTC treats it as failure and enriches feedback.\n */\nfunction asToolReturnedError(\n result: unknown,\n): { message: string; details?: unknown } | null {\n if (result == null || typeof result !== \"object\" || Array.isArray(result)) {\n return null;\n }\n const r = result as Record<string, unknown>;\n const msg = r.error;\n if (typeof msg !== \"string\" || !msg.trim()) {\n return null;\n }\n return { message: msg.trim(), details: r.details };\n}\n\n/**\n * Build an actionable hint from input JSON Schema (e.g. required property names)\n * so the LLM can fix parameter names (e.g. use 'query' not 'q').\n */\nfunction buildInputSchemaHint(inputSchema: object): string | null {\n const schema = inputSchema as { required?: string[]; properties?: Record<string, unknown> };\n const required = schema.required;\n if (!Array.isArray(required) || required.length === 0) {\n return null;\n }\n const names = required.filter((k): k is string => typeof k === \"string\");\n if (names.length === 0) return null;\n return `This tool expects input property ${names.length === 1 ? `'${names[0]}'` : `one of [${names.map((n) => `'${n}'`).join(\", \")}]`}. Use the exact property names from the tool schema.`;\n}\n","import { normalizeToolName } from \"../../core/types/ToolSpec.js\";\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 * Check if a descriptor is a bare package (no #toolName).\n * When true, the intent is to load all tools from that package.\n */\nexport function isBarePackageDescriptor(descriptor: string): boolean {\n const parsed = parseToolPath(descriptor.trim());\n return parsed !== null && parsed.toolName === \"\";\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 * Build registry name prefix from an npm descriptor (only [a-zA-Z0-9.] in result).\n * Npm tools are always managed in the registry with a concrete version; we never use \"latest\" in the registry.\n * When the descriptor omits version or uses @latest, the caller must resolve to the actual latest version\n * (e.g. via resolveLatestVersionFromRegistry) and pass it as resolvedVersion.\n *\n * @param descriptor - e.g. \"npm:@easynet/agent-tool-buildin\" or \"npm:@scope/pkg@1.0.0\"\n * @param resolvedVersion - Actual version (e.g. \"0.0.11\"); required when descriptor has no version or @latest\n * @returns e.g. \"npm.easynet.agent.tool.buildin.0.0.11.\" (never contains \"latest\")\n * @throws if descriptor uses latest but resolvedVersion is missing or equals \"latest\"\n */\nexport function npmDescriptorToRegistryPrefix(descriptor: string, resolvedVersion?: string): string {\n const s = descriptor.trim();\n if (typeof s !== \"string\" || !s.startsWith(\"npm:\")) return \"\";\n const rest = s.slice(4).trim();\n const hashIdx = rest.indexOf(\"#\");\n const beforeHash = hashIdx < 0 ? rest : rest.slice(0, hashIdx);\n const lastAt = beforeHash.lastIndexOf(\"@\");\n const scopeAndPackage = lastAt <= 0 ? beforeHash : beforeHash.slice(0, lastAt);\n let version = lastAt <= 0 ? \"latest\" : beforeHash.slice(lastAt + 1).trim() || \"latest\";\n if (version === \"latest\" || !version) {\n const resolved = (resolvedVersion ?? \"\").trim();\n if (resolved !== \"\" && resolved.toLowerCase() !== \"latest\") {\n version = resolved;\n } else {\n throw new Error(\n `Registry prefix requires a concrete version when descriptor uses latest (${descriptor}). ` +\n `Resolve version from registry (e.g. resolveLatestVersionFromRegistry) and pass as resolvedVersion.`,\n );\n }\n }\n // Never allow \"latest\" in registry even if descriptor had @latest and wrong resolvedVersion was passed\n if (!version || version.toLowerCase() === \"latest\") {\n throw new Error(\n `Registry never uses \"latest\"; pass resolved concrete version for npm descriptor: ${descriptor}`,\n );\n }\n const slashIdx = scopeAndPackage.indexOf(\"/\");\n const scope = slashIdx < 0 ? scopeAndPackage : scopeAndPackage.slice(0, slashIdx).replace(/^@/, \"\");\n const pkg = slashIdx < 0 ? \"\" : scopeAndPackage.slice(slashIdx + 1);\n const segment = [scope, pkg, version].filter(Boolean).join(\".\");\n const normalized = normalizeToolName(segment);\n if (!normalized) return \"\";\n return \"npm.\" + normalized + \".\";\n}\n\n/**\n * Package prefix from npm descriptor without version (for package-scoped config keys).\n * e.g. \"npm:@easynet/agent-tool-buildin\" or \"npm:@easynet/agent-tool-buildin@0.0.11\" -> \"npm.easynet.agent.tool.buildin\"\n */\nexport function npmDescriptorToPackagePrefix(descriptor: string): string {\n const s = descriptor.trim();\n if (typeof s !== \"string\" || !s.startsWith(\"npm:\")) return \"\";\n const rest = s.slice(4).trim();\n const hashIdx = rest.indexOf(\"#\");\n const beforeHash = hashIdx < 0 ? rest : rest.slice(0, hashIdx);\n const lastAt = beforeHash.lastIndexOf(\"@\");\n const scopeAndPackage = lastAt <= 0 ? beforeHash : beforeHash.slice(0, lastAt);\n const slashIdx = scopeAndPackage.indexOf(\"/\");\n const scope = slashIdx < 0 ? scopeAndPackage : scopeAndPackage.slice(0, slashIdx).replace(/^@/, \"\");\n const pkg = slashIdx < 0 ? \"\" : scopeAndPackage.slice(slashIdx + 1);\n const segment = [scope, pkg].filter(Boolean).join(\".\");\n const normalized = normalizeToolName(segment);\n if (!normalized) return \"\";\n return \"npm.\" + normalized;\n}\n\n/**\n * Package prefix with version when descriptor has explicit version (for same package at multiple versions).\n * e.g. \"npm:@easynet/agent-tool-buildin@1.0.0\" -> \"npm.easynet.agent.tool.buildin.1.0.0\"\n * \"npm:@easynet/agent-tool-buildin\" -> \"npm.easynet.agent.tool.buildin\" (no version)\n */\nexport function npmDescriptorToPackagePrefixWithVersion(descriptor: string): string {\n const s = descriptor.trim();\n if (typeof s !== \"string\" || !s.startsWith(\"npm:\")) return \"\";\n const rest = s.slice(4).trim();\n const hashIdx = rest.indexOf(\"#\");\n const beforeHash = hashIdx < 0 ? rest : rest.slice(0, hashIdx);\n const lastAt = beforeHash.lastIndexOf(\"@\");\n const scopeAndPackage = lastAt <= 0 ? beforeHash : beforeHash.slice(0, lastAt);\n const version = lastAt <= 0 ? \"\" : beforeHash.slice(lastAt + 1).trim();\n const slashIdx = scopeAndPackage.indexOf(\"/\");\n const scope = slashIdx < 0 ? scopeAndPackage : scopeAndPackage.slice(0, slashIdx).replace(/^@/, \"\");\n const pkg = slashIdx < 0 ? \"\" : scopeAndPackage.slice(slashIdx + 1);\n const segment = [scope, pkg, version].filter(Boolean).join(\".\");\n const normalized = normalizeToolName(segment);\n if (!normalized) return \"\";\n return \"npm.\" + normalized;\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/**\n * Return the display scope for a tool: the first segment of the registry name (before the first \".\"),\n * or the full name if there is no \".\".\n */\nexport function getDisplayScope(\n registryName: string,\n _kind?: string,\n _toolVersion?: string,\n): string {\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 a registry name.\n * This package does not resolve npm descriptors to registry names; resolution is done by the runtime/loader.\n * Returns null so that resolveToolDescriptor returns the descriptor as-is.\n */\nexport function resolveNpmToolDescriptor(descriptor: string): string | null {\n return null;\n}\n\n/**\n * Expand a list of tool descriptors to registry tool names.\n * - Plain names: match registry name or suffix (e.g. readText -> npm...readText).\n * - protocol:scope/package#toolName: resolve to registry names that start with package prefix and end with .toolName.\n * - protocol:scope/package (bare): resolve to all registry names that start with package prefix.\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 const key = normalizeToolName(name);\n if (registryNames.includes(key) && !seen.has(key)) {\n seen.add(key);\n out.push(key);\n return;\n }\n const matched = registryNames.filter((r) => r === key || r.endsWith(\".\" + key));\n for (const m of matched) {\n if (!seen.has(m)) {\n seen.add(m);\n out.push(m);\n }\n }\n }\n\n for (const d of descriptors) {\n const s = d.trim();\n if (!s) continue;\n if (isToolPath(s)) {\n if (registryNames.includes(s) && !seen.has(s)) {\n seen.add(s);\n out.push(s);\n continue;\n }\n const path = parseToolPath(s);\n if (path) {\n const packagePrefix =\n path.protocol === \"npm\"\n ? npmDescriptorToPackagePrefix(s)\n : path.protocol === \"file\"\n ? fileDescriptorToPackagePrefix(s)\n : \"\";\n const prefixWithDot = packagePrefix ? packagePrefix + \".\" : \"\";\n if (prefixWithDot) {\n if (path.toolName) {\n const suffix = \".\" + path.toolName;\n for (const r of registryNames) {\n if (r.startsWith(prefixWithDot) && r.endsWith(suffix) && !seen.has(r)) {\n seen.add(r);\n out.push(r);\n }\n }\n } else {\n for (const r of registryNames) {\n if (r.startsWith(prefixWithDot) && !seen.has(r)) {\n seen.add(r);\n out.push(r);\n }\n }\n }\n }\n }\n continue;\n }\n const name = normalizeToolName(s);\n add(name);\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/**\n * Package prefix for file: descriptor (for config keys in tools.packages). No trailing dot.\n * e.g. \"file:./local-tools\" -> \"file.local.tools\"\n */\nexport function fileDescriptorToPackagePrefix(descriptor: string): string {\n const path = parseToolPath(descriptor.trim());\n if (!path || path.protocol !== \"file\") return \"\";\n const pathPart = `${path.scope}/${path.packageWithVersion}`;\n const normalized = normalizeToolName(pathPart);\n if (!normalized) return \"\";\n return \"file.\" + normalized;\n}\n\n/**\n * Registry prefix for file: descriptor (local folder). Path is scope/packageWithVersion from parseToolPath. Has trailing dot.\n * e.g. \"file:./local-tools\" -> \"file.local.tools.\", \"file:../other/pkg\" -> \"file.other.pkg.\"\n */\nexport function fileDescriptorToRegistryPrefix(descriptor: string): string {\n const prefix = fileDescriptorToPackagePrefix(descriptor);\n return prefix ? prefix + \".\" : \"\";\n}\n","/**\n * Load tool.yaml: tools config (sandboxedPath + list) or legacy top-level tools + sandboxedPath.\n * Normalized shape: tools (array of descriptors) and sandboxedPath.\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/** Normalized shape returned by loadToolConfig: tools list, sandbox, security, and per-tool defaults. */\nexport interface ToolYamlShape {\n /** List of tool descriptors (npm:@scope/pkg#path or plain names). */\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 /** Allowed hosts (e.g. [\"*\"] or [\"api.github.com\"]). Merged with programmatic config. */\n allowedHosts?: string[];\n /** Block these hosts even if allowed (e.g. [\"*.internal\"]). Merged with programmatic config. */\n blockedHosts?: string[];\n /** CIDR ranges to block for HTTP (SSRF). When set, overrides builtin default. */\n blockedCidrs?: string[];\n /** Per-tool config overrides. Keys: short name (\"fs.listDir\"), package-scoped (\"npm.easynet.agent.tool.buildin::fs.listDir\", survives version bumps), or full registry name. */\n toolDefaults?: Record<string, Record<string, unknown>>;\n /** Per-package config. Key = npm descriptor. value.defaults = package-level key-value (all tools in this package); value.tools = per-tool config (tool short name -> config). */\n packageToolDefaults?: Record<string, { defaults?: Record<string, unknown>; tools?: Record<string, Record<string, unknown>> }>;\n}\n\n/** Raw tools block: sandboxedPath, list, optional security, defaults, and optional per-package config. */\ninterface ToolsBlock {\n sandboxedPath?: string;\n list?: string[];\n allowedHosts?: string[];\n blockedHosts?: string[];\n blockedCidrs?: string[];\n /** Per-tool config: tool short name -> config object (e.g. fs.listDir: { maxEntries: 500 }). */\n defaults?: Record<string, Record<string, unknown>>;\n /** Per-package: descriptor -> { defaults: package-level k-v, tools: { toolName: config } }. */\n packages?: Record<string, { defaults?: Record<string, unknown>; tools?: Record<string, Record<string, unknown>> }>;\n}\n\n/** Raw tool.yaml: either legacy (tools array + top-level sandboxedPath) or new (tools object with sandboxedPath + list + security + defaults). */\ninterface RawToolYaml {\n tools?: string[] | ToolsBlock;\n sandboxedPath?: string;\n allowedHosts?: string[];\n blockedHosts?: string[];\n blockedCidrs?: string[];\n /** Top-level per-tool defaults (alternative to tools.defaults). */\n toolDefaults?: Record<string, Record<string, unknown>>;\n /** Top-level per-package config (alternative to tools.packages). */\n packageToolDefaults?: Record<string, { defaults?: Record<string, unknown>; tools?: Record<string, Record<string, unknown>> }>;\n}\n\n/**\n * Load tool.yaml and return normalized shape (tools array + sandboxedPath).\n * Supports:\n * - tools: { sandboxedPath, list?, packages? }. When list is omitted, tools = keys of packages.\n * - tools: { packages: { \"npm:@scope/pkg\": { defaults: {...} } } } — list not needed, loaded from packages.\n * - Legacy: tools: [...], sandboxedPath (top-level). With top-level packageToolDefaults, tools = keys when tools array absent.\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 RawToolYaml | undefined;\n if (!parsed || typeof parsed !== \"object\") return {};\n const toolsBlock = parsed.tools;\n if (toolsBlock != null && typeof toolsBlock === \"object\" && !Array.isArray(toolsBlock)) {\n const toolDefaults =\n toolsBlock.defaults != null &&\n typeof toolsBlock.defaults === \"object\" &&\n !Array.isArray(toolsBlock.defaults)\n ? (toolsBlock.defaults as Record<string, Record<string, unknown>>)\n : undefined;\n const packageToolDefaults =\n toolsBlock.packages != null &&\n typeof toolsBlock.packages === \"object\" &&\n !Array.isArray(toolsBlock.packages)\n ? (toolsBlock.packages as Record<string, { defaults?: Record<string, unknown>; tools?: Record<string, Record<string, unknown>> }>)\n : undefined;\n const list = Array.isArray(toolsBlock.list) && toolsBlock.list.length > 0 ? toolsBlock.list : undefined;\n return {\n tools: list ?? (packageToolDefaults ? Object.keys(packageToolDefaults) : undefined),\n sandboxedPath:\n typeof toolsBlock.sandboxedPath === \"string\" ? toolsBlock.sandboxedPath : parsed.sandboxedPath,\n allowedHosts:\n Array.isArray(toolsBlock.allowedHosts) ? toolsBlock.allowedHosts : parsed.allowedHosts,\n blockedHosts:\n Array.isArray(toolsBlock.blockedHosts) ? toolsBlock.blockedHosts : parsed.blockedHosts,\n blockedCidrs:\n Array.isArray(toolsBlock.blockedCidrs) ? toolsBlock.blockedCidrs : parsed.blockedCidrs,\n toolDefaults,\n packageToolDefaults,\n };\n }\n const packageToolDefaults =\n typeof parsed.packageToolDefaults === \"object\" && !Array.isArray(parsed.packageToolDefaults)\n ? (parsed.packageToolDefaults as Record<string, { defaults?: Record<string, unknown>; tools?: Record<string, Record<string, unknown>> }>)\n : undefined;\n const list = Array.isArray(parsed.tools) && parsed.tools.length > 0 ? parsed.tools : undefined;\n return {\n tools: list ?? (packageToolDefaults ? Object.keys(packageToolDefaults) : undefined),\n sandboxedPath: parsed.sandboxedPath,\n allowedHosts: Array.isArray(parsed.allowedHosts) ? parsed.allowedHosts : undefined,\n blockedHosts: Array.isArray(parsed.blockedHosts) ? parsed.blockedHosts : undefined,\n blockedCidrs: Array.isArray(parsed.blockedCidrs) ? parsed.blockedCidrs : undefined,\n toolDefaults:\n typeof parsed.toolDefaults === \"object\" && !Array.isArray(parsed.toolDefaults)\n ? (parsed.toolDefaults as Record<string, Record<string, unknown>>)\n : undefined,\n packageToolDefaults,\n };\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 * When version is \"latest\": we resolve the actual version from the npm registry first.\n * Cache is used only if it contains that exact version; otherwise we reinstall so the\n * cache always reflects the true latest.\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/** Whether the requested version is \"latest\" (or empty) and must be resolved from registry. */\nfunction isLatestRequest(version: string): boolean {\n const v = (version ?? \"\").trim().toLowerCase();\n return v === \"\" || v === \"latest\";\n}\n\n/**\n * Resolve the actual version for \"latest\" from the npm registry (sync).\n * Uses `npm view <package> version` (dist-tags.latest).\n * @throws Error if the registry cannot be reached or the package does not exist.\n */\nexport function resolveLatestVersionFromRegistry(packageName: string): string {\n const quoted = packageName.includes(\" \") ? `\"${packageName}\"` : packageName;\n try {\n const out = execSync(`npm view ${quoted} version`, {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n const version = (out ?? \"\").trim();\n if (!version) {\n throw new Error(`npm view ${packageName} version returned empty`);\n }\n return version;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new Error(`Failed to resolve latest version for ${packageName}: ${msg}`);\n }\n}\n\n/**\n * Read version from a cached package's package.json. Returns undefined if missing or invalid.\n */\nfunction getCachedPackageVersion(cacheDir: string): string | undefined {\n const pkgPath = join(cacheDir, \"package.json\");\n if (!existsSync(pkgPath)) return undefined;\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as { version?: string };\n return typeof pkg.version === \"string\" ? pkg.version : undefined;\n } catch {\n return undefined;\n }\n}\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 *\n * When version is \"latest\" (or empty): we resolve the actual version from the registry first.\n * If cache already contains that exact version, we reuse it. Otherwise we install (or reinstall)\n * so the cache always reflects the true latest.\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\n // Resolve \"latest\" to actual version from registry so cache is keyed by real version.\n let resolvedVersion: string;\n if (isLatestRequest(version)) {\n resolvedVersion = resolveLatestVersionFromRegistry(packageName);\n } else {\n resolvedVersion = version;\n }\n\n const cacheDir = resolveCacheDir(cacheBase, packageName, resolvedVersion);\n const packageJsonPath = join(cacheDir, \"package.json\");\n const nodeModulesPath = join(cacheDir, \"node_modules\");\n\n // Reuse cache only if it exists and contains the exact version we want (no stale \"latest\").\n if (existsSync(packageJsonPath) && existsSync(nodeModulesPath)) {\n const cachedVersion = getCachedPackageVersion(cacheDir);\n if (cachedVersion === resolvedVersion) {\n options.afterInstall?.(cacheDir, packageName);\n return cacheDir;\n }\n // Cached dir is for a different version (e.g. old latest); remove and reinstall.\n rmSync(cacheDir, { recursive: true, force: true });\n }\n\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}@${resolvedVersion} --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 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 const npmInstallTimeout = 120_000; // 2 min for CI/slow networks\n const maxAttempts = 3;\n let lastErr: Error | undefined;\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n execSync(\"npm install --prefer-offline --no-audit --no-fund\", {\n cwd: cacheDir,\n stdio: \"pipe\",\n encoding: \"utf-8\",\n timeout: npmInstallTimeout,\n });\n lastErr = undefined;\n break;\n } catch (err) {\n lastErr = err instanceof Error ? err : new Error(String(err));\n if (attempt < maxAttempts) {\n const delayMs = 5_000 * attempt;\n const deadline = Date.now() + delayMs;\n while (Date.now() < deadline) {\n /* busy wait */\n }\n } else {\n throw new Error(\n `npm install in cache failed after ${maxAttempts} attempts: ${lastErr.message}`,\n );\n }\n }\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 extension adapters when coreTools options are provided.\n * Agent-tool does NOT depend on any specific extension. When configFilePath (tool.yaml)\n * lists npm:@scope/pkg, that package is loaded from cache or node_modules. The framework\n * calls the package's default export contract: register(registry, options) -> ToolAdapter.\n * Extensions implement this contract (e.g. via createExtension from this package).\n *\n * Npm: we always register npm extensions with a concrete version in the registry (never \"latest\").\n * When the descriptor omits version or uses @latest, we resolve to the actual latest from the\n * registry (resolveLatestVersionFromRegistry) and use that version for the registry prefix.\n */\n\nimport { createRequire } from \"node:module\";\nimport { join, resolve, isAbsolute, basename, dirname } from \"node:path\";\nimport { existsSync, readFileSync, statSync } from \"node:fs\";\nimport { ToolRegistry } from \"../core/registry/ToolRegistry.js\";\nimport { PTCRuntime } from \"../core/runtime/PTCRuntime.js\";\nimport type { ToolAdapter, ToolSpec } from \"../core/types/ToolSpec.js\";\nimport { normalizeToolName } from \"../core/types/ToolSpec.js\";\nimport { loadToolConfig, getCacheBaseFromToolConfig } from \"../tools/util/toolConfig.js\";\nimport {\n npmDescriptorToRegistryPrefix,\n fileDescriptorToRegistryPrefix,\n parseToolPath,\n} from \"../tools/util/toolDescriptor.js\";\nimport {\n ensurePackageInCache,\n getPackageEntryPath,\n importFromCache,\n resolveLatestVersionFromRegistry,\n} 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\n/**\n * Default package names tried when loading an extension from node_modules (no tool.yaml).\n * Empty by default so agent-tool does not depend on any specific extension package.\n * Extensions are loaded only via tool.yaml (npm: entries) or when explicitly configured.\n */\nexport const DEFAULT_EXTENSION_PACKAGES: string[] = [];\n\n/** Config passed to extension's register(registry, options). */\nexport interface CoreToolsUserConfig {\n sandboxRoot?: string;\n /** Allowed hosts (e.g. [\"*\"] or [\"api.github.com\"]). Merged with tool.yaml. */\n allowedHosts?: string[];\n /** Block these hosts even if allowed. Merged with tool.yaml. */\n blockedHosts?: string[];\n /** CIDR ranges to block for HTTP (SSRF). Overrides extension default when set. */\n blockedCidrs?: string[];\n /** Per-tool config overrides. Keys: short name (\"fs.listDir\"), package-scoped (\"npm.easynet.agent.tool.buildin::fs.listDir\", survives version bumps), or full registry name. Use package-scoped or full when different packages share the same short name. */\n toolOverrides?: Record<string, Record<string, unknown>>;\n /** Package-level defaults. Key = package prefix (e.g. \"npm.easynet.agent.tool.buildin\"); value = key-value merged into ctx.config for every tool in that package. */\n packageDefaults?: Record<string, Record<string, unknown>>;\n}\n\n/** Config for example-tools extension 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 /** When set, step messages are written here (e.g. for --verbose CLI). */\n stepLog?: (message: string) => void;\n}\n\nexport interface CreateRuntimeResult {\n runtime: PTCRuntime;\n registry: ToolRegistry;\n}\n\n/** Get installed package version by resolving package.json from the same requirers used to load the extension. */\nfunction getInstalledPackageVersion(packageName: string): string | null {\n const projectRequire = getProjectRequire();\n const requirers: NodeRequire[] = [requireFromPackage];\n if (projectRequire) requirers.push(projectRequire);\n for (const req of requirers) {\n try {\n const pkgJsonPath = req.resolve(`${packageName}/package.json`);\n const json = readFileSync(pkgJsonPath, \"utf-8\");\n const pkg = JSON.parse(json) as { version?: string };\n return pkg.version ?? null;\n } catch {\n continue;\n }\n }\n return null;\n}\n\ntype RegisterFn = (r: ToolRegistry, c: CoreToolsUserConfig) => unknown;\n\n/** Backward compat: extensions may export register or registerCoreTools. */\nfunction getRegisterFn(mod: { register?: RegisterFn; registerCoreTools?: RegisterFn }): RegisterFn | undefined {\n return mod?.register ?? mod?.registerCoreTools;\n}\n\n/** Load an extension from node_modules (e.g. for testing). Tries DEFAULT_EXTENSION_PACKAGES. */\nfunction loadExtensionFromNodeModules(): {\n register: RegisterFn;\n packageName: string;\n} | 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 DEFAULT_EXTENSION_PACKAGES) {\n try {\n const mod = req(pkg) as { register?: RegisterFn; registerCoreTools?: RegisterFn };\n const fn = getRegisterFn(mod);\n if (typeof fn === \"function\") return { register: fn, packageName: pkg };\n } catch {\n continue;\n }\n }\n }\n return null;\n}\n\n/** Registry wrapper that prefixes every registered tool name (e.g. npm.easynet.agent.tool.buildin.latest.). */\nfunction createPrefixingRegistry(registry: ToolRegistry, prefix: string): ToolRegistry {\n return {\n register(spec: ToolSpec) {\n registry.register({ ...spec, name: prefix + normalizeToolName(spec.name) });\n },\n bulkRegister(specs: ToolSpec[]) {\n specs.forEach((s) => this.register(s));\n },\n unregister(name: string) {\n return registry.unregister(name);\n },\n get(name: string) {\n return registry.get(name);\n },\n has(name: string) {\n return registry.has(name);\n },\n search(query: Parameters<ToolRegistry[\"search\"]>[0]) {\n return registry.search(query);\n },\n list() {\n return registry.list();\n },\n get size() {\n return registry.size;\n },\n snapshot() {\n return registry.snapshot();\n },\n clear() {\n return registry.clear();\n },\n } as ToolRegistry;\n}\n\n/** Parse npm: descriptor (e.g. \"npm:@easynet/agent-tool-buildin@0.0.1\" or \"npm:@easynet/agent-tool-buildin\") to package name and version. No version => \"latest\". */\nexport function 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 one extension for file: descriptor (local folder with package.json and dist/ or main entry). */\nfunction loadExtensionFromFileDescriptorSync(\n descriptor: string,\n configFilePath: string,\n stepLog?: (message: string) => void,\n): { register: RegisterFn; descriptor: string; resolvedVersion: string } | null {\n const entryStr = descriptor.trim();\n const path = parseToolPath(entryStr);\n if (!path || path.protocol !== \"file\") return null;\n const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);\n const configDir = dirname(localPath);\n const pathPart = `${path.scope}/${path.packageWithVersion}`;\n const resolvedPath = resolve(configDir, pathPart);\n if (!existsSync(resolvedPath) || !statSync(resolvedPath).isDirectory()) return null;\n try {\n const entryPath = getPackageEntryPath(resolvedPath);\n const req = createRequire(join(resolvedPath, \"package.json\"));\n const mod = req(entryPath) as { register?: RegisterFn; registerCoreTools?: RegisterFn };\n const fn = getRegisterFn(mod);\n if (typeof fn === \"function\") {\n if (stepLog) stepLog(`Loaded local extension from ${resolvedPath}`);\n return { register: fn, descriptor: entryStr, resolvedVersion: \"local\" };\n }\n } catch {\n // ignore\n }\n return null;\n}\n\n/** Load one extension for a single npm descriptor (node_modules if version matches, else cache). */\nfunction loadExtensionForDescriptorSync(\n descriptor: string,\n configFilePath: string,\n stepLog?: (message: string) => void,\n): { register: RegisterFn; descriptor: string; resolvedVersion: string } | null {\n const entryStr = descriptor.trim();\n const parsed = parseNpmDescriptor(entryStr);\n if (!parsed) return null;\n const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);\n const configDir = dirname(localPath);\n const packageJsonPath = join(configDir, \"package.json\");\n const useNodeModules = existsSync(packageJsonPath);\n const configRequire = useNodeModules ? createRequire(packageJsonPath) : null;\n\n if (configRequire) {\n try {\n const mod = configRequire(parsed.packageName) as { register?: RegisterFn; registerCoreTools?: RegisterFn };\n const fn = getRegisterFn(mod);\n if (typeof fn === \"function\") {\n const installed = getInstalledPackageVersionFromRequire(parsed.packageName, configRequire);\n const requested = parsed.version === \"latest\" || !parsed.version?.trim() ? null : parsed.version;\n const resolvedVersion =\n installed ??\n (requested === null ? resolveLatestVersionFromRegistry(parsed.packageName) : requested);\n if (requested === null || installed === requested) {\n if (stepLog) stepLog(`Loaded ${parsed.packageName}@${resolvedVersion} from node_modules`);\n return { register: fn, descriptor: entryStr, resolvedVersion };\n }\n }\n } catch {\n // fall through to cache\n }\n }\n\n const cacheBase = getCacheBaseFromToolConfig(localPath);\n const cacheOpts = cacheBase ? { cacheBase } : {};\n for (const opts of [cacheOpts, {}]) {\n try {\n const cacheDir = ensurePackageInCache(parsed.packageName, parsed.version, opts);\n if (stepLog) stepLog(`Loaded ${parsed.packageName} from cache: ${cacheDir}`);\n const entryPath = getPackageEntryPath(cacheDir);\n const req = createRequire(join(cacheDir, \"package.json\"));\n const mod = req(entryPath) as { register?: RegisterFn; registerCoreTools?: RegisterFn };\n const fn = getRegisterFn(mod);\n if (typeof fn === \"function\") {\n const resolvedVersion = basename(cacheDir);\n return { register: fn, descriptor: entryStr, resolvedVersion };\n }\n break;\n } catch {\n if (Object.keys(opts).length > 0) continue;\n break;\n }\n }\n return null;\n}\n\n/** Load all extensions for npm: entries in tool.yaml (sync). Same package at different versions each get one entry. */\nfunction loadAllExtensionsFromToolYamlSync(\n configFilePath: string,\n stepLog?: (message: string) => void,\n): { register: RegisterFn; descriptor: string; resolvedVersion: string }[] {\n const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);\n if (!existsSync(localPath)) return [];\n const config = loadToolConfig(localPath);\n const tools = config.tools;\n if (!Array.isArray(tools) || tools.length === 0) return [];\n if (stepLog) stepLog(\"Loading extensions from tool.yaml (npm + file)\");\n const loaded: { register: RegisterFn; descriptor: string; resolvedVersion: string }[] = [];\n for (const entry of tools) {\n const entryStr = String(entry).trim();\n if (entryStr.startsWith(\"npm:\")) {\n const result = loadExtensionForDescriptorSync(entryStr, configFilePath, stepLog);\n if (result) loaded.push(result);\n } else if (entryStr.startsWith(\"file:\")) {\n const result = loadExtensionFromFileDescriptorSync(entryStr, configFilePath, stepLog);\n if (result) loaded.push(result);\n }\n }\n return loaded;\n}\n\n/** Load extension from tool.yaml npm: entry using node_modules next to the config file (sync). Returns first successful load. */\nfunction loadExtensionFromToolYamlNodeModules(\n configFilePath: string,\n stepLog?: (message: string) => void,\n): { register: RegisterFn; descriptor: string; resolvedVersion: string } | null {\n const all = loadAllExtensionsFromToolYamlSync(configFilePath, stepLog);\n return all.length > 0 ? all[0] : null;\n}\n\n/** Get installed package version using a specific require (e.g. from config dir). */\nfunction getInstalledPackageVersionFromRequire(packageName: string, req: NodeRequire): string | null {\n try {\n const pkgJsonPath = req.resolve(`${packageName}/package.json`);\n const json = readFileSync(pkgJsonPath, \"utf-8\");\n const pkg = JSON.parse(json) as { version?: string };\n return pkg.version ?? null;\n } catch {\n return null;\n }\n}\n\n/** Load one extension for a single npm descriptor (async: node_modules if version matches, else cache). */\nasync function loadExtensionForDescriptorAsync(\n descriptor: string,\n configFilePath: string,\n stepLog?: (message: string) => void,\n): Promise<{ register: RegisterFn; descriptor: string; resolvedVersion: string } | null> {\n const syncResult = loadExtensionForDescriptorSync(descriptor, configFilePath, stepLog);\n if (syncResult) return syncResult;\n const entryStr = descriptor.trim();\n const parsed = parseNpmDescriptor(entryStr);\n if (!parsed) return null;\n const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);\n const cacheBase = getCacheBaseFromToolConfig(localPath);\n const cacheOpts = cacheBase ? { cacheBase } : {};\n for (const opts of [cacheOpts, {}]) {\n try {\n const cacheDir = ensurePackageInCache(parsed.packageName, parsed.version, opts);\n if (stepLog) stepLog(`Loaded ${parsed.packageName} from cache (async): ${cacheDir}`);\n const mod = (await importFromCache(cacheDir)) as { register?: RegisterFn; registerCoreTools?: RegisterFn };\n const fn = getRegisterFn(mod);\n if (typeof fn === \"function\") {\n const resolvedVersion = basename(cacheDir);\n return { register: fn, descriptor: entryStr, resolvedVersion };\n }\n break;\n } catch {\n if (Object.keys(opts).length > 0) continue;\n break;\n }\n }\n return null;\n}\n\n/** Load all extensions for npm: and file: entries in tool.yaml (async). */\nasync function loadAllExtensionsFromToolYamlAsync(\n configFilePath: string,\n stepLog?: (message: string) => void,\n): Promise<{ register: RegisterFn; descriptor: string; resolvedVersion: string }[]> {\n const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);\n if (!existsSync(localPath)) return [];\n const config = loadToolConfig(localPath);\n const tools = config.tools;\n if (!Array.isArray(tools) || tools.length === 0) return [];\n if (stepLog) stepLog(\"Loading extensions from tool.yaml (async)\");\n const loaded: { register: RegisterFn; descriptor: string; resolvedVersion: string }[] = [];\n for (const entry of tools) {\n const entryStr = String(entry).trim();\n if (entryStr.startsWith(\"npm:\")) {\n const result = await loadExtensionForDescriptorAsync(entryStr, configFilePath, stepLog);\n if (result) loaded.push(result);\n } else if (entryStr.startsWith(\"file:\")) {\n const result = loadExtensionFromFileDescriptorSync(entryStr, configFilePath, stepLog);\n if (result) loaded.push(result);\n }\n }\n return loaded;\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 const stepLog = options.stepLog;\n\n if (options.coreTools !== undefined) {\n if (options.configFilePath) {\n const all = loadAllExtensionsFromToolYamlSync(options.configFilePath, stepLog);\n if (all.length > 0) {\n if (stepLog) stepLog(`Registered ${all.length} extension(s) from tool.yaml`);\n const runtime = new PTCRuntime({ registry });\n for (const ext of all) {\n const prefix = ext.descriptor.startsWith(\"file:\")\n ? fileDescriptorToRegistryPrefix(ext.descriptor)\n : npmDescriptorToRegistryPrefix(ext.descriptor, ext.resolvedVersion);\n const reg = prefix ? createPrefixingRegistry(registry, prefix) : registry;\n const adapter = ext.register(reg, options.coreTools) as ToolAdapter;\n runtime.registerAdapter(adapter);\n }\n return { runtime, registry };\n }\n }\n if (stepLog) stepLog(\"Trying extension from node_modules\");\n const extensionNode = loadExtensionFromNodeModules();\n if (extensionNode) {\n if (stepLog) stepLog(\"Registered extension from node_modules\");\n const descriptor = `npm:${extensionNode.packageName}`;\n const resolvedVersion =\n getInstalledPackageVersion(extensionNode.packageName) ??\n resolveLatestVersionFromRegistry(extensionNode.packageName);\n const prefix = npmDescriptorToRegistryPrefix(descriptor, resolvedVersion);\n const reg = prefix ? createPrefixingRegistry(registry, prefix) : registry;\n const coreAdapter = extensionNode.register(reg, options.coreTools) as ToolAdapter;\n const runtime = new PTCRuntime({ registry });\n runtime.registerAdapter(coreAdapter);\n return { runtime, registry };\n }\n const runtime = new PTCRuntime({ registry });\n return { runtime, registry };\n }\n\n const runtime = new PTCRuntime({ registry });\n return { runtime, registry };\n}\n\n/**\n * Create runtime and registry asynchronously. When configFilePath (tool.yaml) lists npm: packages:\n * 1. Try loading from project node_modules (sync, fast).\n * 2. If not found, dynamically load from cache: fetch via npm pack into cache, then dynamic import (works for ESM).\n * 3. Otherwise fall back to sync path (DEFAULT_EXTENSION_PACKAGES, sync cache).\n */\nexport async function createRuntimeFromConfig(\n options: CreateRuntimeOptions = {}\n): Promise<CreateRuntimeResult> {\n if (options.coreTools !== undefined && options.configFilePath) {\n const all = await loadAllExtensionsFromToolYamlAsync(options.configFilePath, options.stepLog);\n if (all.length > 0) {\n if (options.stepLog) options.stepLog(`Registered ${all.length} extension(s) from tool.yaml`);\n const registry = new ToolRegistry();\n const runtime = new PTCRuntime({ registry });\n for (const ext of all) {\n const prefix = ext.descriptor.startsWith(\"file:\")\n ? fileDescriptorToRegistryPrefix(ext.descriptor)\n : npmDescriptorToRegistryPrefix(ext.descriptor, ext.resolvedVersion);\n const reg = prefix ? createPrefixingRegistry(registry, prefix) : registry;\n const adapter = ext.register(reg, options.coreTools) as ToolAdapter;\n runtime.registerAdapter(adapter);\n }\n return { runtime, registry };\n }\n }\n return createRuntimeFromConfigSync(options);\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,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var chunk4KTWJQ32_cjs = require('./chunk-4KTWJQ32.cjs');
|
|
3
|
+
var chunkLP7KHBA3_cjs = require('./chunk-LP7KHBA3.cjs');
|
|
5
4
|
var chunkDYDNPIV2_cjs = require('./chunk-DYDNPIV2.cjs');
|
|
5
|
+
var chunkUUNG3GL3_cjs = require('./chunk-UUNG3GL3.cjs');
|
|
6
6
|
var http = require('http');
|
|
7
7
|
|
|
8
8
|
// src/api/expose/openapi.ts
|
|
@@ -33,7 +33,7 @@ function toolsToOpenAPISpec(registry, options = {}) {
|
|
|
33
33
|
const title = options.title ?? "Tool API";
|
|
34
34
|
const version = options.version ?? "1.0.0";
|
|
35
35
|
const basePath = (options.basePath ?? "").replace(/\/$/, "");
|
|
36
|
-
const specs = registry.snapshot().map(
|
|
36
|
+
const specs = registry.snapshot().map(chunkUUNG3GL3_cjs.enrichSpecWithCanonicalSchema);
|
|
37
37
|
const toolNamesSchema = {
|
|
38
38
|
type: "object",
|
|
39
39
|
required: ["tools"],
|
|
@@ -243,7 +243,7 @@ function createOpenAPIHttpServer(runtime, options = {}) {
|
|
|
243
243
|
return;
|
|
244
244
|
}
|
|
245
245
|
if (req.method === "GET" && norm === "/tools") {
|
|
246
|
-
const { enrichSpecWithCanonicalSchema: enrichSpecWithCanonicalSchema2 } = await import('./canonicalCoreSchemas-
|
|
246
|
+
const { enrichSpecWithCanonicalSchema: enrichSpecWithCanonicalSchema2 } = await import('./canonicalCoreSchemas-TY7NCWCC.cjs');
|
|
247
247
|
const specs = runtime.getRegistry().snapshot().map(enrichSpecWithCanonicalSchema2);
|
|
248
248
|
const tools = specs.map((s) => ({
|
|
249
249
|
name: s.name,
|
|
@@ -326,7 +326,7 @@ function listenOpenAPIHttpServer(server, options = {}) {
|
|
|
326
326
|
});
|
|
327
327
|
}
|
|
328
328
|
async function createHttpService(runtimeOrConfig, options = {}) {
|
|
329
|
-
const runtime = "invoke" in runtimeOrConfig && typeof runtimeOrConfig.invoke === "function" ? runtimeOrConfig : (await
|
|
329
|
+
const runtime = "invoke" in runtimeOrConfig && typeof runtimeOrConfig.invoke === "function" ? runtimeOrConfig : (await chunkLP7KHBA3_cjs.createRuntimeFromConfig(runtimeOrConfig)).runtime;
|
|
330
330
|
const server = createOpenAPIHttpServer(runtime, options);
|
|
331
331
|
const openApiSpec = toolsToOpenAPISpec(runtime.getRegistry(), {
|
|
332
332
|
title: options.title ?? "Tool API",
|
|
@@ -378,7 +378,7 @@ async function createMcpServerWithTools(runtime, options) {
|
|
|
378
378
|
async (args) => {
|
|
379
379
|
const ctx = ctxFactory();
|
|
380
380
|
const result = await runtime.invoke(
|
|
381
|
-
{ tool: spec.name, args: args ?? {}, purpose:
|
|
381
|
+
{ tool: spec.name, args: args ?? {}, purpose: chunkLP7KHBA3_cjs.MCP_KIND },
|
|
382
382
|
ctx
|
|
383
383
|
);
|
|
384
384
|
if (result.ok) {
|
|
@@ -400,7 +400,7 @@ async function createMcpServerWithTools(runtime, options) {
|
|
|
400
400
|
return { server };
|
|
401
401
|
}
|
|
402
402
|
async function createMCPServer(runtimeOrConfig, options = {}) {
|
|
403
|
-
const runtime = "invoke" in runtimeOrConfig && typeof runtimeOrConfig.invoke === "function" ? runtimeOrConfig : (await
|
|
403
|
+
const runtime = "invoke" in runtimeOrConfig && typeof runtimeOrConfig.invoke === "function" ? runtimeOrConfig : (await chunkLP7KHBA3_cjs.createRuntimeFromConfig(runtimeOrConfig)).runtime;
|
|
404
404
|
const { StdioServerTransport } = await import('@modelcontextprotocol/sdk/server/stdio.js');
|
|
405
405
|
const { server } = await createMcpServerWithTools(runtime, options);
|
|
406
406
|
return {
|
|
@@ -437,7 +437,7 @@ function createMCPStreamableHttpHandler(runtimeOrConfig, options = {}) {
|
|
|
437
437
|
};
|
|
438
438
|
}
|
|
439
439
|
return (async () => {
|
|
440
|
-
const { runtime } = await
|
|
440
|
+
const { runtime } = await chunkLP7KHBA3_cjs.createRuntimeFromConfig(runtimeOrConfig);
|
|
441
441
|
return createMCPStreamableHttpHandler(runtime, options);
|
|
442
442
|
})();
|
|
443
443
|
}
|
|
@@ -476,5 +476,5 @@ exports.createMCPServer = createMCPServer;
|
|
|
476
476
|
exports.createMCPServerStreamableHttp = createMCPServerStreamableHttp;
|
|
477
477
|
exports.createMCPStreamableHttpHandler = createMCPStreamableHttpHandler;
|
|
478
478
|
exports.runMCPServerOverStdio = runMCPServerOverStdio;
|
|
479
|
-
//# sourceMappingURL=chunk-
|
|
480
|
-
//# sourceMappingURL=chunk-
|
|
479
|
+
//# sourceMappingURL=chunk-DTWOUO7M.cjs.map
|
|
480
|
+
//# sourceMappingURL=chunk-DTWOUO7M.cjs.map
|