@easynet/agent-tool 1.0.34 → 1.0.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/adapters/LangChainToolsHub.d.ts.map +1 -1
- package/dist/api/createAgentTools.d.ts.map +1 -1
- 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/dynamicImportAdapter.d.ts +6 -2
- package/dist/api/extension/dynamicImportAdapter.d.ts.map +1 -1
- package/dist/api/extension/generateExtensionManifest.d.ts +2 -2
- package/dist/api/extension/generateExtensionManifest.d.ts.map +1 -1
- package/dist/api/extension/index.d.ts +1 -0
- package/dist/api/extension/index.d.ts.map +1 -1
- package/dist/api/extension/loadToolYaml.d.ts +1 -0
- package/dist/api/extension/loadToolYaml.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/extension/registerExtension.d.ts.map +1 -1
- package/dist/api/extension/registerFromManifest.d.ts.map +1 -1
- package/dist/api/main.cjs +14 -14
- package/dist/api/main.js +3 -3
- package/dist/api/runtimeFromConfig.d.ts +8 -0
- package/dist/api/runtimeFromConfig.d.ts.map +1 -1
- package/dist/{chunk-GYUELFVR.js → chunk-3L7CQ6XP.js} +3 -3
- package/dist/{chunk-GYUELFVR.js.map → chunk-3L7CQ6XP.js.map} +1 -1
- package/dist/{chunk-ETZKGTTF.cjs → chunk-5LCB63L7.cjs} +7 -7
- package/dist/{chunk-ETZKGTTF.cjs.map → chunk-5LCB63L7.cjs.map} +1 -1
- package/dist/{chunk-YP6GRCQG.cjs → chunk-6ZGMI6KW.cjs} +53 -16
- package/dist/chunk-6ZGMI6KW.cjs.map +1 -0
- package/dist/{chunk-UUQGKFSG.js → chunk-7VBJ64YC.js} +308 -141
- package/dist/chunk-7VBJ64YC.js.map +1 -0
- package/dist/{chunk-FHHD4FSI.js → chunk-HEMWFWSK.js} +3 -3
- package/dist/{chunk-FHHD4FSI.js.map → chunk-HEMWFWSK.js.map} +1 -1
- package/dist/{chunk-6UOHURU4.js → chunk-JG5T3ZYC.js} +42 -5
- package/dist/chunk-JG5T3ZYC.js.map +1 -0
- package/dist/{chunk-PKUSCCS6.cjs → chunk-LP7KHBA3.cjs} +310 -140
- package/dist/chunk-LP7KHBA3.cjs.map +1 -0
- package/dist/{chunk-LOGUQGCL.cjs → chunk-WFRHBW32.cjs} +9 -9
- package/dist/{chunk-LOGUQGCL.cjs.map → chunk-WFRHBW32.cjs.map} +1 -1
- package/dist/index.cjs +119 -69
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +71 -26
- package/dist/index.js.map +1 -1
- package/dist/tools/util/toolConfig.d.ts +11 -3
- package/dist/tools/util/toolConfig.d.ts.map +1 -1
- package/dist/tools/util/toolDescriptor.d.ts +32 -7
- package/dist/tools/util/toolDescriptor.d.ts.map +1 -1
- package/dist/utils/cli/index.cjs +233 -31
- package/dist/utils/cli/index.cjs.map +1 -1
- package/dist/utils/cli/index.d.ts.map +1 -1
- package/dist/utils/cli/index.js +201 -15
- package/dist/utils/cli/index.js.map +1 -1
- package/dist/utils/npmCache.d.ts +14 -0
- package/dist/utils/npmCache.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-6UOHURU4.js.map +0 -1
- package/dist/chunk-PKUSCCS6.cjs.map +0 -1
- package/dist/chunk-UUQGKFSG.js.map +0 -1
- package/dist/chunk-YP6GRCQG.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/runtime/SchemaValidator.ts","../src/core/runtime/PolicyEngine.ts","../src/core/runtime/Budget.ts","../src/core/runtime/Evidence.ts","../src/observability/EventLog.ts","../src/observability/Logger.ts","../src/observability/Metrics.ts","../src/observability/Tracing.ts","../src/core/runtime/PTCRuntimePipeline.ts","../src/core/runtime/PTCRuntimeObservability.ts","../src/core/runtime/PTCRuntime.ts","../src/tools/util/toolDescriptor.ts","../src/tools/util/toolConfig.ts","../src/utils/npmCache.ts","../src/api/runtimeFromConfig.ts","../src/tools/mcp/types.ts","../src/tools/langchain/types.ts"],"names":["uuidv4","join","homedir","existsSync","readFileSync","resolve","dirname","runtime"],"mappings":"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","file":"chunk-UUQGKFSG.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 * If a version is written in the descriptor, that version is used.\n * If no version (or @latest) and resolvedVersion is provided, that resolved version is used (e.g. actual \"0.0.4\" from npm).\n * Otherwise \"latest\" is used as the version segment.\n * e.g. \"npm:@easynet/agent-tool-buildin@1.0.0\" -> \"npm.easynet.agent.tool.buildin.1.0.0.\"\n * e.g. \"npm:@easynet/agent-tool-buildin\" + resolvedVersion \"0.0.4\" -> \"npm.easynet.agent.tool.buildin.0.0.4.\"\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 /** Use version from descriptor when written (e.g. @1.0.0); when missing or \"latest\", use resolvedVersion if provided. */\n let version = lastAt <= 0 ? \"latest\" : beforeHash.slice(lastAt + 1).trim() || \"latest\";\n if ((version === \"latest\" || !version) && resolvedVersion != null && resolvedVersion !== \"\") {\n version = resolvedVersion;\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 * 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 * Only descriptors that are already registry names (exact match in registryNames) are included.\n * npm:... descriptors are not resolved here; use registry names in the list or resolve elsewhere.\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 // Plain name may match prefixed registry names (e.g. core.fs.readText -> npm.easynet.agent.tool.buildin.latest.core.fs.readText)\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 }\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 * 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, and security. */\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}\n\n/** Raw tools block: sandboxedPath, list, and optional security inside tools. */\ninterface ToolsBlock {\n sandboxedPath?: string;\n list?: string[];\n allowedHosts?: string[];\n blockedHosts?: string[];\n blockedCidrs?: string[];\n}\n\n/** Raw tool.yaml: either legacy (tools array + top-level sandboxedPath) or new (tools object with sandboxedPath + list + security). */\ninterface RawToolYaml {\n tools?: string[] | ToolsBlock;\n sandboxedPath?: string;\n allowedHosts?: string[];\n blockedHosts?: string[];\n blockedCidrs?: string[];\n}\n\n/**\n * Load tool.yaml and return normalized shape (tools array + sandboxedPath).\n * Supports:\n * - New format: tools: { sandboxedPath: \"...\", list: [...] }\n * - Legacy format: tools: [...], sandboxedPath: \"...\" (top-level)\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 return {\n tools: Array.isArray(toolsBlock.list) ? toolsBlock.list : 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 };\n }\n return {\n tools: Array.isArray(parsed.tools) ? parsed.tools : 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 };\n}\n\n/**\n * Resolve sandboxedPath from tool.yaml relative to the config file directory.\n * Expands leading ~ to homedir so ~/.agent/sandbox works.\n */\nexport function resolveSandboxedPath(toolYamlPath: string, sandboxedPath: string): string {\n const expanded =\n sandboxedPath.startsWith(\"~/\") ? join(homedir(), sandboxedPath.slice(2))\n : sandboxedPath === \"~\" ? homedir()\n : sandboxedPath.startsWith(\"~\") && (sandboxedPath.length === 1 || sandboxedPath[1] === \"/\")\n ? join(homedir(), sandboxedPath.slice(1))\n : sandboxedPath;\n const configDir = dirname(resolve(toolYamlPath));\n return resolve(configDir, expanded);\n}\n\n/** Default subdir under sandboxedPath for the npm package cache. */\nexport const CACHE_SUBDIR = \".agent/cache\";\n\n/**\n * Return cache base path when tool.yaml has sandboxedPath: sandboxedPath/.agent/cache.\n * Call ensurePackageInCache(..., { cacheBase: getCacheBaseFromToolConfig(path) }) to use it.\n */\nexport function getCacheBaseFromToolConfig(toolYamlPath: string): string | undefined {\n const config = loadToolConfig(toolYamlPath);\n if (!config.sandboxedPath || typeof config.sandboxedPath !== \"string\") return undefined;\n const sandboxRoot = resolveSandboxedPath(toolYamlPath, config.sandboxedPath);\n return join(sandboxRoot, CACHE_SUBDIR);\n}\n\n/**\n * Find tool.yaml in directory (tool.yaml or .tool.yaml) and load it.\n * Dir is resolved against process.cwd() when relative so we always load from the local folder.\n */\nexport function findAndLoadToolConfig(dir: string): ToolYamlShape & { configPath?: string } {\n const resolvedDir = resolve(dir);\n const candidates = [join(resolvedDir, \"tool.yaml\"), join(resolvedDir, \".tool.yaml\")];\n for (const p of candidates) {\n if (existsSync(p)) {\n const config = loadToolConfig(p);\n return { ...config, configPath: p };\n }\n }\n return {};\n}\n","/**\n * Framework: resolve an npm package into a local cache folder (like Maven .m2).\n * Cache root: ~/.agent/cache/, organized by package path and version.\n * Packs the package, extracts it, runs npm install in that directory so each\n * downloaded package has its own node_modules—no sharing with the host project—\n * to avoid package conflicts.\n */\n\nimport { execSync } from \"node:child_process\";\nimport { readFileSync, readdirSync, mkdirSync, rmSync, renameSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { pathToFileURL } from \"node:url\";\n\nexport interface EnsurePackageInCacheOptions {\n /** Custom cache root (default: ~/.agent/cache) */\n cacheBase?: string;\n /** Called after npm install; use to add symlinks/aliases in cacheDir/node_modules */\n afterInstall?: (cacheDir: string, packageName: string) => void;\n}\n\nconst DEFAULT_CACHE_BASE = join(homedir(), \".agent\", \"cache\");\n\n/**\n * Package path for cache dir: @scope/name -> scope/name (path segments).\n */\nfunction packagePathSegments(name: string): string[] {\n const withoutScope = name.replace(/^@/, \"\");\n return withoutScope.split(\"/\").filter(Boolean);\n}\n\n/**\n * Resolve cache dir: cacheBase/scope/packageName/version (e.g. ~/.agent/cache/easynet/agent-tool-buildin/0.0.1).\n */\nfunction resolveCacheDir(cacheBase: string, packageName: string, version: string): string {\n const segments = packagePathSegments(packageName);\n return join(cacheBase, ...segments, version);\n}\n\n/**\n * Extract version from packed tarball name (e.g. easynet-agent-tool-buildin-0.0.1.tgz -> 0.0.1)\n * or read from extracted package/package.json.\n */\nfunction getVersionFromTarball(tgzName: string): string {\n const base = tgzName.replace(/\\.tgz$/i, \"\");\n const match = base.match(/-(\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?)$/);\n return match ? match[1]! : base;\n}\n\n/**\n * Ensure the npm package is in the cache: pack, extract, npm install.\n * Returns the package root path (with its own node_modules).\n * Cache layout: ~/.agent/cache/<scope>/<name>/<version>/ (like Maven .m2).\n */\nexport function ensurePackageInCache(\n packageName: string,\n version: string = \"latest\",\n options: EnsurePackageInCacheOptions = {},\n): string {\n const cacheBase = options.cacheBase ?? DEFAULT_CACHE_BASE;\n const packDest = join(cacheBase, \".pack-tmp\", packageName.replace(/@/g, \"\").replace(/\\//g, \"_\"));\n mkdirSync(packDest, { recursive: true });\n\n try {\n execSync(`npm pack ${packageName}@${version} --pack-destination \"${packDest}\"`, {\n cwd: process.cwd(),\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n\n const files = readdirSync(packDest);\n const tgz = files.find((f) => f.endsWith(\".tgz\"));\n if (!tgz) {\n throw new Error(`npm pack did not produce a .tgz in ${packDest}`);\n }\n\n const resolvedVersion = getVersionFromTarball(tgz);\n const cacheDir = resolveCacheDir(cacheBase, packageName, resolvedVersion);\n const packageJsonPath = join(cacheDir, \"package.json\");\n const nodeModulesPath = join(cacheDir, \"node_modules\");\n\n if (existsSync(packageJsonPath) && existsSync(nodeModulesPath)) {\n options.afterInstall?.(cacheDir, packageName);\n rmSync(packDest, { recursive: true, force: true });\n return cacheDir;\n }\n\n const extractDir = join(packDest, \"extract\");\n mkdirSync(extractDir, { recursive: true });\n execSync(`tar -xzf \"${join(packDest, tgz)}\" -C \"${extractDir}\"`, {\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n\n const extractedPackage = join(extractDir, \"package\");\n if (!existsSync(extractedPackage)) {\n throw new Error(`Extracted tarball did not contain \"package\" dir in ${extractDir}`);\n }\n\n mkdirSync(join(cacheDir, \"..\"), { recursive: true });\n if (existsSync(cacheDir)) {\n rmSync(cacheDir, { recursive: true, force: true });\n }\n renameSync(extractedPackage, cacheDir);\n\n execSync(\"npm install\", {\n cwd: cacheDir,\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n\n options.afterInstall?.(cacheDir, packageName);\n return cacheDir;\n } finally {\n if (existsSync(packDest)) {\n rmSync(packDest, { recursive: true, force: true });\n }\n }\n}\n\n/**\n * Resolve the package entry point (main or dist/index.js).\n */\nexport function getPackageEntryPath(packageRoot: string): string {\n const pkgPath = join(packageRoot, \"package.json\");\n if (!existsSync(pkgPath)) {\n throw new Error(`No package.json in ${packageRoot}`);\n }\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as { main?: string; exports?: unknown };\n const main = pkg.main ?? \"dist/index.js\";\n const entry = join(packageRoot, main);\n if (!existsSync(entry)) {\n throw new Error(`Entry not found: ${entry}`);\n }\n return entry;\n}\n\n/**\n * Dynamic import from a cached package (file URL so Node resolves the package's node_modules).\n */\nexport async function importFromCache(packageRoot: string): Promise<unknown> {\n const entryPath = getPackageEntryPath(packageRoot);\n const fileUrl = pathToFileURL(entryPath).href;\n return import(/* @vite-ignore */ fileUrl);\n}\n","/**\n * Create PTCRuntime + ToolRegistry from config (sync or async).\n * Registers 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\nimport { createRequire } from \"node:module\";\nimport { join, resolve, isAbsolute, basename, dirname } from \"node:path\";\nimport { existsSync, readFileSync } 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 { npmDescriptorToRegistryPrefix } from \"../tools/util/toolDescriptor.js\";\nimport { ensurePackageInCache, getPackageEntryPath, importFromCache } from \"../utils/npmCache.js\";\n\nconst requireFromPackage = createRequire(import.meta.url);\n\nfunction getProjectRequire(): NodeRequire | null {\n const cwd = process.cwd();\n if (existsSync(join(cwd, \"package.json\"))) return createRequire(join(cwd, \"package.json\"));\n if (existsSync(join(cwd, \"tool.yaml\"))) return createRequire(join(cwd, \"tool.yaml\"));\n return null;\n}\n\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}\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 extension from tool.yaml npm: entry using node_modules next to the config file (sync). */\nfunction loadExtensionFromToolYamlNodeModules(\n configFilePath: string,\n stepLog?: (message: string) => void,\n): { register: RegisterFn; descriptor: string; resolvedVersion: string } | null {\n const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);\n if (!existsSync(localPath)) return null;\n const config = loadToolConfig(localPath);\n const tools = config.tools;\n if (!Array.isArray(tools) || tools.length === 0) return null;\n const configDir = dirname(localPath);\n const packageJsonPath = join(configDir, \"package.json\");\n if (!existsSync(packageJsonPath)) return null;\n const configRequire = createRequire(packageJsonPath);\n if (stepLog) stepLog(\"Trying tool.yaml npm entries from node_modules\");\n for (const entry of tools) {\n const entryStr = String(entry).trim();\n const parsed = parseNpmDescriptor(entryStr);\n if (!parsed) continue;\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 resolvedVersion = getInstalledPackageVersionFromRequire(parsed.packageName, configRequire) ?? \"latest\";\n return { register: fn, descriptor: entryStr, resolvedVersion };\n }\n } catch {\n continue;\n }\n }\n return 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 extension from tool.yaml npm: entry via cache (sync). Package must export register(registry, options). */\nfunction loadExtensionFromToolYamlCache(\n configFilePath: string,\n stepLog?: (message: string) => void,\n): { register: (r: ToolRegistry, c: CoreToolsUserConfig) => unknown; descriptor: string; resolvedVersion: string } | null {\n const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);\n if (!existsSync(localPath)) return null;\n const config = loadToolConfig(localPath);\n const tools = config.tools;\n if (!Array.isArray(tools)) return null;\n const cacheBase = getCacheBaseFromToolConfig(localPath);\n const cacheOpts = cacheBase ? { cacheBase } : {};\n if (stepLog) stepLog(`Loading extension from tool.yaml cache (cacheBase: ${cacheBase ?? \"~/.agent/cache\"})`);\n for (const entry of tools) {\n const entryStr = String(entry).trim();\n const parsed = parseNpmDescriptor(entryStr);\n if (!parsed) continue;\n for (const opts of [cacheOpts, {}]) {\n try {\n if (stepLog && Object.keys(opts).length === 0 && cacheBase) stepLog(\"Falling back to default cache ~/.agent/cache\");\n const cacheDir = ensurePackageInCache(parsed.packageName, parsed.version, opts);\n if (stepLog) stepLog(`Using 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 }\n return null;\n}\n\n/** Load extension from tool.yaml npm: entry via cache (async). Package must export register or registerCoreTools. */\nasync function loadExtensionFromToolYamlCacheAsync(\n configFilePath: string,\n stepLog?: (message: string) => void,\n): Promise<{ register: (r: ToolRegistry, c: CoreToolsUserConfig) => unknown; descriptor: string; resolvedVersion: string } | null> {\n const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);\n if (!existsSync(localPath)) return null;\n const config = loadToolConfig(localPath);\n const tools = config.tools;\n if (!Array.isArray(tools)) return null;\n const cacheBase = getCacheBaseFromToolConfig(localPath);\n const cacheOpts = cacheBase ? { cacheBase } : {};\n if (stepLog) stepLog(\"Loading extension from tool.yaml cache (async)\");\n for (const entry of tools) {\n const entryStr = String(entry).trim();\n const parsed = parseNpmDescriptor(entryStr);\n if (!parsed) continue;\n for (const opts of [cacheOpts, {}]) {\n try {\n if (stepLog && Object.keys(opts).length === 0 && cacheBase) stepLog(\"Falling back to default cache ~/.agent/cache\");\n const cacheDir = ensurePackageInCache(parsed.packageName, parsed.version, opts);\n if (stepLog) stepLog(`Using cache: ${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 }\n return null;\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 (stepLog) stepLog(\"Trying extension from node_modules\");\n let extensionNode = loadExtensionFromNodeModules();\n if (extensionNode) {\n if (stepLog) stepLog(\"Registered extension from node_modules\");\n const descriptor = `npm:${extensionNode.packageName}`;\n const resolvedVersion = getInstalledPackageVersion(extensionNode.packageName);\n const prefix = npmDescriptorToRegistryPrefix(descriptor, resolvedVersion ?? undefined);\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 if (options.configFilePath) {\n const extensionFromNodeModules = loadExtensionFromToolYamlNodeModules(options.configFilePath, stepLog);\n if (extensionFromNodeModules) {\n if (stepLog) stepLog(\"Registered extension from tool.yaml list (node_modules)\");\n const prefix = npmDescriptorToRegistryPrefix(extensionFromNodeModules.descriptor, extensionFromNodeModules.resolvedVersion);\n const reg = prefix ? createPrefixingRegistry(registry, prefix) : registry;\n const coreAdapter = extensionFromNodeModules.register(reg, options.coreTools) as ToolAdapter;\n const runtime = new PTCRuntime({ registry });\n runtime.registerAdapter(coreAdapter);\n return { runtime, registry };\n }\n if (stepLog) stepLog(\"No extension in node_modules, loading from tool.yaml cache\");\n const extensionCache = loadExtensionFromToolYamlCache(options.configFilePath, stepLog);\n if (extensionCache) {\n if (stepLog) stepLog(\"Registered extension from cache\");\n const prefix = npmDescriptorToRegistryPrefix(extensionCache.descriptor, extensionCache.resolvedVersion);\n const reg = prefix ? createPrefixingRegistry(registry, prefix) : registry;\n const coreAdapter = extensionCache.register(reg, options.coreTools) as ToolAdapter;\n const runtime = new PTCRuntime({ registry });\n runtime.registerAdapter(coreAdapter);\n return { runtime, registry };\n }\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 fromNodeModules = loadExtensionFromToolYamlNodeModules(options.configFilePath, options.stepLog);\n if (fromNodeModules) {\n if (options.stepLog) options.stepLog(\"Registered extension from tool.yaml list (node_modules)\");\n const registry = new ToolRegistry();\n const prefix = npmDescriptorToRegistryPrefix(fromNodeModules.descriptor, fromNodeModules.resolvedVersion);\n const reg = prefix ? createPrefixingRegistry(registry, prefix) : registry;\n const coreAdapter = fromNodeModules.register(reg, options.coreTools) as ToolAdapter;\n const runtime = new PTCRuntime({ registry });\n runtime.registerAdapter(coreAdapter);\n return { runtime, registry };\n }\n if (options.stepLog) options.stepLog(\"Loading extension from tool.yaml cache (dynamic: npm pack + import)\");\n const fromCache = await loadExtensionFromToolYamlCacheAsync(options.configFilePath, options.stepLog);\n if (fromCache) {\n if (options.stepLog) options.stepLog(\"Registered extension from cache\");\n const registry = new ToolRegistry();\n const prefix = npmDescriptorToRegistryPrefix(fromCache.descriptor, fromCache.resolvedVersion);\n const reg = prefix ? createPrefixingRegistry(registry, prefix) : registry;\n const coreAdapter = fromCache.register(reg, options.coreTools) as ToolAdapter;\n const runtime = new PTCRuntime({ registry });\n runtime.registerAdapter(coreAdapter);\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 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/adapters/LangChainToolsHub.ts","../src/api/createAgentTools.ts"],"names":["enrichSpecWithCanonicalSchema","DynamicStructuredTool","LANGCHAIN_KIND","loadToolConfig","resolveSandboxedPath","createRuntimeFromConfigSync","isBarePackageDescriptor","expandToolDescriptorsToRegistryNames","createRuntimeFromConfig"],"mappings":"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","file":"chunk-YP6GRCQG.cjs","sourcesContent":["/**\n * Exposes all tools from a ToolRegistry + PTCRuntime as LangChain tools\n * for local agent use (e.g. with createReactAgent, AgentExecutor).\n *\n * For most users, use createAgentTools() which loads from tools.yaml and returns\n * StructuredTool[]. Use LangChainToolsHub when you need a custom runtime or ctxFactory.\n *\n * Use: new LangChainToolsHub(runtime, ctxFactory).getLangChainTools()\n */\n\nimport { DynamicStructuredTool, type StructuredToolInterface } from \"@langchain/core/tools\";\nimport type { PTCRuntime } from \"../../core/runtime/PTCRuntime.js\";\nimport type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport type { ToolIntent } from \"../../core/types/ToolIntent.js\";\nimport { enrichSpecWithCanonicalSchema } from \"../../tools/util/canonicalCoreSchemas.js\";\nimport { LANGCHAIN_KIND } from \"../../tools/langchain/types.js\";\n\n/**\n * If inputSchema is { type: \"object\", properties: { args: { type: \"object\", properties: {...} } }, required: [\"args\"] },\n * return the inner args schema so the LLM can pass { path: \".\" } instead of { args: { path: \".\" } }.\n */\nfunction schemaForLangChain(inputSchema: object): Record<string, unknown> {\n const s = inputSchema as Record<string, unknown>;\n if (s?.type !== \"object\" || !s.properties || typeof s.properties !== \"object\") {\n return s;\n }\n const props = s.properties as Record<string, unknown>;\n const args = props.args;\n if (\n args != null &&\n typeof args === \"object\" &&\n (args as Record<string, unknown>).type === \"object\" &&\n (args as Record<string, unknown>).properties != null\n ) {\n return args as Record<string, unknown>;\n }\n return s;\n}\n\nexport type ExecContextFactory = () => ExecContext;\n\nconst DEFAULT_CTX_FACTORY: ExecContextFactory = () => ({\n requestId: `lc-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n taskId: `task-${Date.now()}`,\n permissions: [\n \"read:web\",\n \"read:fs\",\n \"write:fs\",\n \"read:db\",\n \"write:db\",\n \"network\",\n \"workflow\",\n \"danger:destructive\",\n ],\n});\n\n/**\n * Hub that wraps PTCRuntime and exposes every registered tool as a LangChain\n * StructuredTool (DynamicStructuredTool), so local agents (LangChain AgentExecutor,\n * createReactAgent, etc.) can use the same tools as MCP and OpenAPI.\n */\nexport class LangChainToolsHub {\n constructor(\n private readonly runtime: PTCRuntime,\n private readonly ctxFactory: ExecContextFactory = DEFAULT_CTX_FACTORY,\n ) {}\n\n /**\n * Returns all registered tools as LangChain StructuredTool[].\n * Each tool invokes the runtime through the full pipeline (policy, HITL, etc.).\n */\n getLangChainTools(): StructuredToolInterface[] {\n const registry = this.runtime.getRegistry();\n const specs = registry.snapshot();\n\n return specs.map((spec) => this.specToLangChainTool(spec));\n }\n\n /**\n * Returns LangChain tools for a subset of tools (by name or query).\n */\n getLangChainToolsForNames(toolNames: string[]): StructuredToolInterface[] {\n const registry = this.runtime.getRegistry();\n const set = new Set(toolNames);\n const specs = registry.snapshot().filter((s) => set.has(s.name));\n return specs.map((spec) => this.specToLangChainTool(spec));\n }\n\n private specToLangChainTool(spec: ToolSpec): DynamicStructuredTool {\n const runtime = this.runtime;\n const ctxFactory = this.ctxFactory;\n const enriched = enrichSpecWithCanonicalSchema(spec);\n\n const schema = schemaForLangChain(enriched.inputSchema);\n return new DynamicStructuredTool({\n name: spec.name,\n description: spec.description ?? `Tool: ${spec.name}`,\n schema,\n func: async (args: Record<string, unknown>): Promise<string> => {\n const intent: ToolIntent = {\n tool: spec.name,\n args: args ?? {},\n purpose: LANGCHAIN_KIND,\n };\n const ctx = ctxFactory();\n const result = await runtime.invoke(intent, ctx);\n\n if (result.ok) {\n return typeof result.result === \"string\"\n ? result.result\n : JSON.stringify(result.result);\n }\n\n const err = result.error;\n const message = err?.message ?? \"Tool failed\";\n const details = err?.details;\n return JSON.stringify(\n details != null ? { error: message, details } : { error: message },\n );\n },\n });\n }\n}\n","/**\n * Create LangChain tools from config (sync or async). Uses PTCRuntime + registry\n * and exposes tools via LangChainToolsHub. All invokes go through PTC Intent.\n */\n\nimport { loadToolConfig, resolveSandboxedPath } from \"../tools/util/toolConfig.js\";\nimport {\n expandToolDescriptorsToRegistryNames,\n isBarePackageDescriptor,\n} from \"../tools/util/toolDescriptor.js\";\nimport { createRuntimeFromConfigSync, createRuntimeFromConfig } from \"./runtimeFromConfig.js\";\nimport type { CreateRuntimeOptions } from \"./runtimeFromConfig.js\";\nimport { LangChainToolsHub } from \"./adapters/LangChainToolsHub.js\";\nimport type { StructuredToolInterface } from \"@langchain/core/tools\";\n\nexport interface CreateAgentToolsOptions extends CreateRuntimeOptions {\n /** Path to tool.yaml; when set, only tools listed there are returned; sandboxedPath from it is used as sandboxRoot */\n configFilePath?: string;\n /** Project path for async loading (use createLangChainToolsAsync) */\n projectPath?: string;\n}\n\n/** Merge host lists from multiple sources (e.g. tool.yaml + programmatic). Union, dedup, preserves order. */\nfunction mergeHostLists(a?: string[], b?: string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const list of [a ?? [], b ?? []]) {\n for (const h of list) {\n if (!seen.has(h)) {\n seen.add(h);\n out.push(h);\n }\n }\n }\n return out;\n}\n\nfunction runtimeOptionsFromConfig(opts: CreateAgentToolsOptions): CreateRuntimeOptions {\n const coreTools = opts.coreTools ?? { sandboxRoot: process.cwd(), allowedHosts: [] };\n if (opts.configFilePath) {\n const toolConfig = loadToolConfig(opts.configFilePath);\n const updates: {\n sandboxRoot?: string;\n allowedHosts?: string[];\n blockedHosts?: string[];\n blockedCidrs?: string[];\n } = {};\n if (toolConfig.sandboxedPath && typeof toolConfig.sandboxedPath === \"string\") {\n updates.sandboxRoot = resolveSandboxedPath(opts.configFilePath, toolConfig.sandboxedPath);\n }\n // Smart merge: union of allowedHosts and blockedHosts from yaml + programmatic (both lists always applied)\n updates.allowedHosts = mergeHostLists(coreTools.allowedHosts, toolConfig.allowedHosts);\n updates.blockedHosts = mergeHostLists(coreTools.blockedHosts, toolConfig.blockedHosts);\n if (Array.isArray(toolConfig.blockedCidrs) && toolConfig.blockedCidrs.length > 0) {\n updates.blockedCidrs = toolConfig.blockedCidrs;\n } else if (coreTools.blockedCidrs?.length) {\n updates.blockedCidrs = coreTools.blockedCidrs;\n }\n if (Object.keys(updates).length > 0) {\n return { ...opts, coreTools: { ...coreTools, ...updates } };\n }\n }\n return { ...opts, coreTools };\n}\n\n/**\n * Create LangChain tools synchronously. When configFilePath is set, returns only\n * tools listed in that file (and that exist in the registry). If tool.yaml has\n * sandboxedPath, fs tools can only access that directory.\n */\nexport function createAgentTools(\n options?: CreateAgentToolsOptions | string\n): StructuredToolInterface[] {\n const opts: CreateAgentToolsOptions =\n typeof options === \"string\" ? { configFilePath: options } : options ?? {};\n const runtimeOpts = runtimeOptionsFromConfig(opts);\n const { runtime } = createRuntimeFromConfigSync(runtimeOpts);\n const hub = new LangChainToolsHub(runtime);\n\n if (opts.configFilePath) {\n const toolConfig = loadToolConfig(opts.configFilePath);\n const names = Array.isArray(toolConfig.tools) ? toolConfig.tools : [];\n if (names.length > 0) {\n const registryNames = runtime.getRegistry().snapshot().map((s) => s.name);\n const allBarePackages = names.every((n) => isBarePackageDescriptor(String(n)));\n if (allBarePackages) {\n return hub.getLangChainTools();\n }\n const expanded = expandToolDescriptorsToRegistryNames(names, registryNames);\n return hub.getLangChainToolsForNames(expanded);\n }\n }\n\n return hub.getLangChainTools();\n}\n\n/**\n * Create LangChain tools asynchronously. Use when projectPath is set to load\n * tools from the project before building the tool list.\n */\nexport async function createLangChainToolsAsync(\n options: CreateAgentToolsOptions = {}\n): Promise<StructuredToolInterface[]> {\n const runtimeOpts = runtimeOptionsFromConfig(options);\n const { runtime } = await createRuntimeFromConfig(runtimeOpts);\n const hub = new LangChainToolsHub(runtime);\n\n if (options.configFilePath) {\n const toolConfig = loadToolConfig(options.configFilePath);\n const names = Array.isArray(toolConfig.tools) ? toolConfig.tools : [];\n if (names.length > 0) {\n const registryNames = runtime.getRegistry().snapshot().map((s) => s.name);\n const allBarePackages = names.every((n) => isBarePackageDescriptor(String(n)));\n if (allBarePackages) {\n return hub.getLangChainTools();\n }\n const expanded = expandToolDescriptorsToRegistryNames(names, registryNames);\n return hub.getLangChainToolsForNames(expanded);\n }\n }\n\n return hub.getLangChainTools();\n}\n"]}
|