@easynet/agent-tool-hub 1.0.6 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/ToolHubConfig.ts","../src/registry/ToolRegistry.ts","../src/core/SchemaValidator.ts","../src/core/PolicyEngine.ts","../src/core/Budget.ts","../src/core/Evidence.ts","../src/observability/EventLog.ts","../src/observability/Metrics.ts","../src/observability/Tracing.ts","../src/core/Retry.ts","../src/core/PTCRuntimePipeline.ts","../src/core/PTCRuntimeObservability.ts","../src/core/PTCRuntime.ts","../src/discovery/errors.ts","../src/discovery/loaders/SkillManifest.ts","../src/discovery/loaders/SkillMdParser.ts","../src/discovery/loaders/MCPLoader.ts","../src/discovery/loaders/resolveEntry.ts","../src/discovery/loaders/LangChainLoader.ts","../src/discovery/loaders/SkillLoader.ts","../src/discovery/loaders/N8nLoader.ts","../src/discovery/DirectoryScanner.ts","../src/adapters/LangChainAdapter.ts","../src/adapters/MCPAdapter.ts","../src/adapters/N8nAdapter.ts","../src/adapters/ComfyUIAdapter.ts","../src/adapters/SkillAdapter.ts","../src/core-tools/CoreAdapter.ts","../src/core-tools/types.ts","../src/core-tools/security/sandbox.ts","../src/core-tools/fs/readText.ts","../src/core-tools/fs/writeText.ts","../src/core-tools/fs/listDir.ts","../src/core-tools/fs/searchText.ts","../src/core-tools/fs/sha256.ts","../src/core-tools/fs/deletePath.ts","../src/core-tools/security/ssrf.ts","../src/core-tools/http/fetchText.ts","../src/core-tools/http/fetchJson.ts","../src/core-tools/http/downloadFile.ts","../src/core-tools/http/head.ts","../src/core-tools/util/jsonSelect.ts","../src/core-tools/util/truncate.ts","../src/core-tools/util/hashText.ts","../src/core-tools/util/now.ts","../src/core-tools/util/templateRender.ts","../src/core-tools/CoreToolsModule.ts","../src/tool-hub/ToolHubDiscovery.ts","../src/tool-hub/ToolHubHelpers.ts","../src/tool-hub/ToolHubWatcher.ts","../src/tool-hub/ToolHub.ts"],"names":["uuidv4","path","yaml","join","readFile","pathToFileURL","DEFAULT_EXTENSIONS","rootPath","readdir","loaded","resolve","result","access","basename","stat","dirname","relative","createHash","createReadStream","mkdir","writeFile"],"mappings":"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","file":"chunk-QSBCXLMH.js","sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport yaml from \"js-yaml\";\nimport type { ToolHubInitOptions } from \"../tool-hub/ToolHub.js\";\nimport type { CoreToolsUserConfig } from \"../core-tools/CoreToolsModule.js\";\n\n/** Default config filename used when no path is given (e.g. AgentToolHub(), CLI). */\nexport const DEFAULT_CONFIG_FILE = \"toolhub.yaml\";\n\nexport interface ToolHubConfigLoadResult {\n configPath: string;\n rawConfig: unknown;\n options: ToolHubInitOptions;\n}\n\nfunction resolveRoots(\n rootsRaw: Array<string | { path: string; namespace?: string; config?: CoreToolsUserConfig }>,\n configDir: string,\n): {\n roots: Array<string | { path: string; namespace?: string }>;\n coreToolsInlineConfig: CoreToolsUserConfig | undefined;\n} {\n let coreToolsInlineConfig: CoreToolsUserConfig | undefined;\n const roots = rootsRaw.map((root) => {\n if (typeof root === \"string\") {\n if (root === \"coreTools\") return root;\n return path.isAbsolute(root) ? root : path.resolve(configDir, root);\n }\n if (root.path === \"coreTools\") {\n coreToolsInlineConfig = root.config;\n return root;\n }\n const resolvedPath = path.isAbsolute(root.path)\n ? root.path\n : path.resolve(configDir, root.path);\n return { path: resolvedPath, namespace: root.namespace };\n });\n return { roots, coreToolsInlineConfig };\n}\n\nfunction extractCoreToolsConfig(\n coreTools: Record<string, any>,\n security: Record<string, any>,\n system: Record<string, any>,\n configDir: string,\n): CoreToolsUserConfig {\n const sandboxRoot =\n coreTools.sandboxRoot ??\n coreTools.sandbox?.root ??\n security.sandbox?.root ??\n system.sandbox?.root;\n const allowedHosts =\n coreTools.allowedHosts ??\n coreTools.network?.allowedHosts ??\n security.network?.allowedHosts ??\n system.network?.allowedHosts;\n const blockedCidrs =\n coreTools.blockedCidrs ??\n coreTools.network?.blockedCidrs ??\n security.network?.blockedCidrs ??\n system.network?.blockedCidrs;\n const maxReadBytes =\n coreTools.maxReadBytes ?? coreTools.limits?.maxReadBytes;\n const maxHttpBytes =\n coreTools.maxHttpBytes ?? coreTools.limits?.maxHttpBytes;\n const maxDownloadBytes =\n coreTools.maxDownloadBytes ?? coreTools.limits?.maxDownloadBytes;\n const defaultTimeoutMs =\n coreTools.defaultTimeoutMs ?? coreTools.limits?.defaultTimeoutMs;\n const httpUserAgent =\n coreTools.httpUserAgent ?? coreTools.http?.userAgent;\n const enableAutoWriteLargeResponses =\n coreTools.enableAutoWriteLargeResponses ??\n coreTools.http?.enableAutoWriteLargeResponses;\n\n return {\n sandboxRoot: sandboxRoot\n ? path.isAbsolute(String(sandboxRoot))\n ? String(sandboxRoot)\n : path.resolve(configDir, String(sandboxRoot))\n : sandboxRoot,\n allowedHosts: (allowedHosts as string[] | undefined) ?? [],\n maxReadBytes: maxReadBytes as number | undefined,\n maxHttpBytes: maxHttpBytes as number | undefined,\n maxDownloadBytes: maxDownloadBytes as number | undefined,\n blockedCidrs: blockedCidrs as string[] | undefined,\n defaultTimeoutMs: defaultTimeoutMs as number | undefined,\n httpUserAgent: httpUserAgent as string | undefined,\n enableAutoWriteLargeResponses: enableAutoWriteLargeResponses as boolean | undefined,\n };\n}\n\nfunction extractAdapterConfigs(adapters: Record<string, any>): {\n langchain: ToolHubInitOptions[\"langchain\"];\n mcp: ToolHubInitOptions[\"mcp\"];\n n8nMode: \"local\" | \"api\" | undefined;\n n8nLocal: ToolHubInitOptions[\"n8nLocal\"];\n n8n: ToolHubInitOptions[\"n8n\"];\n comfyui: ToolHubInitOptions[\"comfyui\"];\n skill: ToolHubInitOptions[\"skill\"];\n} {\n const comfyuiRaw = (adapters.comfyui ?? {}) as Record<string, any>;\n const comfyuiConfig =\n Object.keys(comfyuiRaw).length > 0\n ? {\n ...comfyuiRaw,\n baseUrl: (comfyuiRaw.baseUrl ?? comfyuiRaw.apiBaseUrl) as\n | string\n | undefined,\n }\n : undefined;\n\n const n8nRaw = (adapters.n8n ?? {}) as Record<string, any>;\n const n8nMode =\n (n8nRaw.mode as \"local\" | \"api\" | undefined) ??\n (n8nRaw.local ? \"local\" : undefined) ??\n (n8nRaw.api ? \"api\" : undefined);\n const n8nLocal = (n8nRaw.local as Record<string, any> | undefined) ?? undefined;\n const n8nApi = (n8nRaw.api as Record<string, any> | undefined) ?? undefined;\n\n return {\n langchain: adapters.langchain as ToolHubInitOptions[\"langchain\"],\n mcp: adapters.mcp as ToolHubInitOptions[\"mcp\"],\n n8nMode,\n n8nLocal: n8nMode === \"local\" ? (n8nLocal as ToolHubInitOptions[\"n8nLocal\"]) : undefined,\n n8n: n8nMode === \"api\" ? (n8nApi as ToolHubInitOptions[\"n8n\"]) : undefined,\n comfyui: comfyuiConfig as ToolHubInitOptions[\"comfyui\"],\n skill: adapters.skill as ToolHubInitOptions[\"skill\"],\n };\n}\n\nexport function mapToolHubConfig(\n raw: unknown,\n configDir: string,\n): ToolHubInitOptions {\n const config = (raw ?? {}) as Record<string, any>;\n const toolHub = (config.toolHub ?? {}) as Record<string, any>;\n const discovery = (config.discovery ?? toolHub.discovery ?? {}) as Record<string, any>;\n const system = (config.system ?? {}) as Record<string, any>;\n const security = (config.security ?? {}) as Record<string, any>;\n const runtime = system.runtime ?? config.runtime ?? {};\n const coreToolsRaw =\n (system.coreTools ?? config.coreTools ?? {}) as Record<string, any>;\n const adapters = (config.adapters ?? {}) as Record<string, any>;\n\n const rootsRaw = (discovery.roots ?? toolHub.roots ?? []) as Array<\n | string\n | { path: string; namespace?: string; config?: CoreToolsUserConfig }\n >;\n const { roots, coreToolsInlineConfig } = resolveRoots(rootsRaw, configDir);\n\n const coreTools = (coreToolsInlineConfig ?? coreToolsRaw ?? {}) as Record<string, any>;\n const includeCoreTools = roots.some((root) => {\n if (typeof root === \"string\") return root === \"coreTools\";\n return root.path === \"coreTools\";\n });\n const coreToolsConfig = includeCoreTools\n ? extractCoreToolsConfig(coreTools, security, system, configDir)\n : undefined;\n\n const adapterConfigs = extractAdapterConfigs(adapters);\n\n return {\n roots,\n namespace: (config.namespace as string | undefined) ?? (toolHub.namespace as string | undefined),\n extensions:\n (discovery.extensions as string[] | undefined) ??\n (config.extensions as string[] | undefined) ??\n (toolHub.extensions as string[] | undefined),\n debug: (config.debug as ToolHubInitOptions[\"debug\"]) ??\n (toolHub.debug as ToolHubInitOptions[\"debug\"]),\n includeCoreTools,\n coreTools: coreToolsConfig,\n runtimeConfig: runtime as ToolHubInitOptions[\"runtimeConfig\"],\n watch:\n (discovery.hotReload as ToolHubInitOptions[\"watch\"]) ??\n (discovery.watch as ToolHubInitOptions[\"watch\"]) ??\n (config.watch as ToolHubInitOptions[\"watch\"]) ??\n (toolHub.watch as ToolHubInitOptions[\"watch\"]),\n ...adapterConfigs,\n };\n}\n\nexport async function loadToolHubConfig(\n configPath: string,\n): Promise<ToolHubConfigLoadResult> {\n const resolvedPath = path.resolve(process.cwd(), configPath);\n const rawConfigText = await fs.readFile(resolvedPath, \"utf-8\");\n const rawConfig = yaml.load(rawConfigText) ?? {};\n const options = mapToolHubConfig(rawConfig, path.dirname(resolvedPath));\n return {\n configPath: resolvedPath,\n rawConfig,\n options,\n };\n}\n","import type { Capability, ToolKind, ToolSpec } from \"../types/ToolSpec.js\";\n\n/**\n * Search query for tools.\n */\nexport interface ToolSearchQuery {\n /** Text search in name/description/tags */\n text?: string;\n /** Filter by tool kind */\n kind?: ToolKind;\n /** Filter by required capabilities */\n capabilities?: Capability[];\n /** Filter by tags */\n tags?: string[];\n}\n\n/**\n * Tool Registry: manages tool registration, lookup, and search.\n * Supports both static registration and dynamic discovery via adapters.\n */\nexport class ToolRegistry {\n private readonly tools = new Map<string, ToolSpec>();\n private readonly tagIndex = new Map<string, Set<string>>(); // tag → tool names\n private readonly kindIndex = new Map<ToolKind, Set<string>>(); // kind → tool names\n\n /**\n * Register a single tool spec.\n * Overwrites if same name already exists.\n */\n register(spec: ToolSpec): void {\n this.validateSpec(spec);\n this.tools.set(spec.name, spec);\n this.indexTool(spec);\n }\n\n /**\n * Register multiple tool specs at once.\n */\n bulkRegister(specs: ToolSpec[]): void {\n for (const spec of specs) {\n this.register(spec);\n }\n }\n\n /**\n * Unregister a tool by name.\n */\n unregister(name: string): boolean {\n const spec = this.tools.get(name);\n if (!spec) return false;\n this.tools.delete(name);\n this.deindexTool(spec);\n return true;\n }\n\n /**\n * Get a tool spec by name.\n */\n get(name: string): ToolSpec | undefined {\n return this.tools.get(name);\n }\n\n /**\n * Check if a tool exists.\n */\n has(name: string): boolean {\n return this.tools.has(name);\n }\n\n /**\n * Search tools by query.\n */\n search(query: ToolSearchQuery): ToolSpec[] {\n let candidates: ToolSpec[];\n\n // Start with kind filter if specified (uses index)\n if (query.kind) {\n const names = this.kindIndex.get(query.kind);\n if (!names || names.size === 0) return [];\n candidates = [...names]\n .map((n) => this.tools.get(n))\n .filter((s): s is ToolSpec => s !== undefined);\n } else {\n candidates = [...this.tools.values()];\n }\n\n // Filter by tags (uses index for initial candidates if no kind filter)\n if (query.tags && query.tags.length > 0) {\n candidates = candidates.filter((spec) =>\n query.tags!.some((tag) => spec.tags?.includes(tag)),\n );\n }\n\n // Filter by capabilities\n if (query.capabilities && query.capabilities.length > 0) {\n candidates = candidates.filter((spec) =>\n query.capabilities!.every((cap) => spec.capabilities.includes(cap)),\n );\n }\n\n // Filter by text (name, description, tags)\n if (query.text) {\n const lower = query.text.toLowerCase();\n candidates = candidates.filter(\n (spec) =>\n spec.name.toLowerCase().includes(lower) ||\n spec.description?.toLowerCase().includes(lower) ||\n spec.tags?.some((t) => t.toLowerCase().includes(lower)),\n );\n }\n\n return candidates;\n }\n\n /**\n * List all registered tool names.\n */\n list(): string[] {\n return [...this.tools.keys()];\n }\n\n /**\n * Get count of registered tools.\n */\n get size(): number {\n return this.tools.size;\n }\n\n /**\n * Export a snapshot of all registered tools (for debugging/routing).\n */\n snapshot(): ToolSpec[] {\n return [...this.tools.values()];\n }\n\n /**\n * Clear all registered tools.\n */\n clear(): void {\n this.tools.clear();\n this.tagIndex.clear();\n this.kindIndex.clear();\n }\n\n private validateSpec(spec: ToolSpec): void {\n if (!spec.name) throw new Error(\"ToolSpec.name is required\");\n if (!spec.version) throw new Error(\"ToolSpec.version is required\");\n if (!spec.kind) throw new Error(\"ToolSpec.kind is required\");\n if (!spec.inputSchema) throw new Error(\"ToolSpec.inputSchema is required\");\n if (!spec.outputSchema) throw new Error(\"ToolSpec.outputSchema is required\");\n if (!spec.capabilities) throw new Error(\"ToolSpec.capabilities is required\");\n }\n\n private indexTool(spec: ToolSpec): void {\n // Kind index\n let kindSet = this.kindIndex.get(spec.kind);\n if (!kindSet) {\n kindSet = new Set();\n this.kindIndex.set(spec.kind, kindSet);\n }\n kindSet.add(spec.name);\n\n // Tag index\n if (spec.tags) {\n for (const tag of spec.tags) {\n let tagSet = this.tagIndex.get(tag);\n if (!tagSet) {\n tagSet = new Set();\n this.tagIndex.set(tag, tagSet);\n }\n tagSet.add(spec.name);\n }\n }\n }\n\n private deindexTool(spec: ToolSpec): void {\n this.kindIndex.get(spec.kind)?.delete(spec.name);\n if (spec.tags) {\n for (const tag of spec.tags) {\n this.tagIndex.get(tag)?.delete(spec.name);\n }\n }\n }\n}\n","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 key = JSON.stringify(schema);\n let cached = this.cache.get(key);\n if (!cached) {\n cached = this.ajv.compile(schema);\n this.cache.set(key, cached);\n }\n return cached;\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 \"../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","/**\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 pRetry, { type Options as PRetryOptions } from \"p-retry\";\n\n/**\n * Retry configuration.\n */\nexport interface RetryOptions {\n /** Maximum number of retries (default: 2) */\n maxRetries?: number;\n /** Base delay in ms for exponential backoff (default: 1000) */\n baseDelayMs?: number;\n /** Maximum delay in ms (default: 10000) */\n maxDelayMs?: number;\n /** Jitter factor 0-1 (default: 0.1) */\n jitter?: number;\n /** Error filter: return true to retry, false to abort */\n shouldRetry?: (error: Error) => boolean;\n /** Callback on each retry attempt */\n onRetry?: (error: Error, attempt: number) => void;\n}\n\n/**\n * Default errors that should NOT be retried (deterministic failures).\n */\nconst NON_RETRYABLE_ERRORS = new Set([\n \"TOOL_NOT_FOUND\",\n \"INPUT_SCHEMA_INVALID\",\n \"POLICY_DENIED\",\n \"OUTPUT_SCHEMA_INVALID\",\n \"PATH_OUTSIDE_SANDBOX\",\n \"FILE_TOO_LARGE\",\n \"HTTP_DISALLOWED_HOST\",\n \"HTTP_TOO_LARGE\",\n]);\n\n/**\n * Determine if an error is retryable.\n */\nexport function isRetryable(error: unknown): boolean {\n if (error instanceof Error) {\n const kind = (error as Error & { kind?: string }).kind;\n if (kind && NON_RETRYABLE_ERRORS.has(kind)) return false;\n }\n return true;\n}\n\n/**\n * Execute a function with retry logic using exponential backoff.\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n options: RetryOptions = {},\n): Promise<T> {\n const {\n maxRetries = 2,\n baseDelayMs = 1000,\n maxDelayMs = 10_000,\n jitter = 0.1,\n shouldRetry,\n onRetry,\n } = options;\n\n if (maxRetries <= 0) {\n return fn();\n }\n\n const pRetryOptions: PRetryOptions = {\n retries: maxRetries,\n minTimeout: baseDelayMs,\n maxTimeout: maxDelayMs,\n randomize: true,\n factor: 2,\n onFailedAttempt: (error) => {\n // Apply jitter\n if (jitter > 0 && error.retriesLeft > 0) {\n // jitterMs calculated but p-retry handles backoff internally\n void (Math.random() * jitter * baseDelayMs);\n }\n\n // Check if should retry\n if (shouldRetry && !shouldRetry(error)) {\n throw error; // Abort retry\n }\n\n if (!isRetryable(error)) {\n throw error; // Non-retryable error kind\n }\n\n onRetry?.(error, maxRetries - error.retriesLeft);\n },\n };\n\n return pRetry(fn, pRetryOptions);\n}\n\n/**\n * Create a tagged error with a kind field for retry classification.\n */\nexport function createTaggedError(\n kind: string,\n message: string,\n details?: unknown,\n): Error & { kind: string; details?: unknown } {\n const error = new Error(message) as Error & {\n kind: string;\n details?: unknown;\n };\n error.kind = kind;\n error.details = details;\n return error;\n}\n","import pTimeout from \"p-timeout\";\nimport type { ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext } from \"../types/ToolIntent.js\";\nimport type { ToolAdapter } from \"../types/ToolSpec.js\";\nimport { SchemaValidator, SchemaValidationError } from \"./SchemaValidator.js\";\nimport { PolicyEngine, PolicyDeniedError } from \"./PolicyEngine.js\";\nimport { BudgetManager } from \"./Budget.js\";\nimport { withRetry, createTaggedError } from \"./Retry.js\";\nimport type { PolicyDeniedEvent, RetryEvent } from \"../types/Events.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\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}\n\n/**\n * Pipeline step: Resolve tool from registry.\n */\nexport function resolveTool(\n toolName: string,\n registry: PipelineDependencies[\"registry\"],\n): ToolSpec {\n const spec = registry.get(toolName);\n if (!spec) {\n throw createTaggedError(\n \"TOOL_NOT_FOUND\",\n `Tool not found: ${toolName}`,\n { availableTools: registry.snapshot().slice(0, 20).map(s => s.name) },\n );\n }\n return spec;\n}\n\n/**\n * Pipeline step: Validate input against schema.\n */\nexport function validateInput(\n spec: ToolSpec,\n args: unknown,\n validator: SchemaValidator,\n): unknown {\n try {\n return validator.validateOrThrow(\n spec.inputSchema,\n args,\n `Input validation failed for ${spec.name}`,\n );\n } catch (error) {\n if (error instanceof SchemaValidationError) {\n throw createTaggedError(\"INPUT_SCHEMA_INVALID\", error.message, {\n errors: error.errors,\n schema: spec.inputSchema,\n });\n }\n throw error;\n }\n}\n\n/**\n * Pipeline step: Enrich args with defaults from schema.\n */\nexport function enrichDefaults(\n spec: ToolSpec,\n args: unknown,\n validator: SchemaValidator,\n): unknown {\n return validator.enrichDefaults(spec.inputSchema, args);\n}\n\n/**\n * Pipeline step: Enforce policy checks.\n */\nexport function enforcePolicy(\n spec: ToolSpec,\n args: unknown,\n ctx: ExecContext,\n deps: Pick<\n PipelineDependencies,\n \"policy\" | \"eventLog\" | \"metrics\" | \"tracing\"\n >,\n): void {\n try {\n deps.policy.enforce(spec, args, ctx);\n } catch (error) {\n if (error instanceof PolicyDeniedError) {\n // Emit policy denied event\n const event: PolicyDeniedEvent = {\n type: \"POLICY_DENIED\",\n timestamp: new Date().toISOString(),\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n toolName: spec.name,\n traceId: ctx.traceId,\n userId: ctx.userId,\n reason: error.message,\n missingCapabilities: error.missingCapabilities?.map(String),\n };\n deps.eventLog.append(event);\n deps.metrics.recordPolicyDenied(spec.name, error.message);\n }\n throw error;\n }\n}\n\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 } from \"../types/ToolResult.js\";\nimport { ToolRegistry } from \"../registry/ToolRegistry.js\";\nimport { SchemaValidator } from \"./SchemaValidator.js\";\nimport { PolicyEngine } from \"./PolicyEngine.js\";\nimport { BudgetManager } from \"./Budget.js\";\nimport { buildEvidence } from \"./Evidence.js\";\nimport { EventLog } from \"../observability/EventLog.js\";\nimport { createLogger, summarizeForLog, sanitizeForLog } from \"../observability/Logger.js\";\nimport type { DebugOptions, Logger } from \"../observability/Logger.js\";\nimport { Metrics } from \"../observability/Metrics.js\";\nimport { Tracing } from \"../observability/Tracing.js\";\nimport type { PolicyConfig } from \"./PolicyEngine.js\";\nimport type { BudgetOptions } from \"./Budget.js\";\nimport { createTaggedError } from \"./Retry.js\";\nimport {\n resolveTool,\n validateInput,\n enrichDefaults,\n enforcePolicy,\n 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}\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. Execute (adapter.invoke())\n * 7. Output Validate (AJV)\n * 8. Evidence Build\n * 9. 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 the tool registry.\n */\n getRegistry(): ToolRegistry {\n return this.registry;\n }\n\n /**\n * Get the event log.\n */\n getEventLog(): EventLog {\n return this.eventLog;\n }\n\n /**\n * Get the metrics collector.\n */\n getMetrics(): Metrics {\n return this.metrics;\n }\n\n /**\n * Get the tracing system.\n */\n getTracing(): Tracing {\n return this.tracing;\n }\n\n /**\n * Invoke a tool through the PTC pipeline.\n * Never throws - always returns a structured ToolResult.\n */\n async invoke(intent: ToolIntent, ctx: ExecContext): Promise<ToolResult> {\n const startTime = Date.now();\n if (this.logger.isEnabled(\"debug\")) {\n this.logger.debug(\"invoke.start\", {\n tool: intent.tool,\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n traceId: ctx.traceId,\n purpose: intent.purpose,\n args: this.logger.options.includeArgs\n ? sanitizeForLog(intent.args)\n : undefined,\n });\n }\n const span = this.tracing.startSpan({\n name: `tool:${intent.tool}`,\n traceId: ctx.traceId,\n attributes: {\n \"tool.name\": intent.tool,\n \"tool.purpose\": intent.purpose,\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n },\n });\n\n // Emit TOOL_CALLED event\n emitToolCalled(intent, ctx, this.getObservabilityDeps());\n\n try {\n // Step 1: Resolve\n const spec = resolveTool(intent.tool, this.registry);\n\n this.tracing.addEvent(span.spanId, \"resolved\", {\n kind: spec.kind,\n version: spec.version,\n });\n\n // Step 2: Input Validate\n const validatedArgs = validateInput(spec, intent.args, this.validator);\n\n // Step 3: Defaults Enrich\n const enrichedArgs = enrichDefaults(spec, validatedArgs, this.validator);\n\n // Step 4: Policy Gate\n enforcePolicy(spec, enrichedArgs, ctx, {\n policy: this.policy,\n eventLog: this.eventLog,\n metrics: this.metrics,\n tracing: this.tracing,\n });\n\n // Step 5: Budget check\n if (!this.budget.checkRateLimit(spec.name)) {\n throw createTaggedError(\n \"BUDGET_EXCEEDED\",\n `Rate limit exceeded for tool: ${spec.name}`,\n );\n }\n\n // Dry-run mode: return without execution\n if (ctx.dryRun) {\n return this.buildDryRunResult(spec, enrichedArgs, ctx, startTime, span.spanId);\n }\n\n // Step 6: Execute with budget (timeout + retry + circuit breaker)\n const { result, raw } = await executeWithBudget(\n spec,\n enrichedArgs,\n ctx,\n span.spanId,\n this.getPipelineDeps(),\n );\n\n // Step 7: Output Validate\n const validatedOutput = validateOutput(spec, result, this.validator);\n\n // Step 8: Evidence Build\n const durationMs = Date.now() - startTime;\n const evidence = buildEvidence({\n spec,\n args: enrichedArgs,\n result: validatedOutput,\n raw,\n ctx,\n durationMs,\n });\n\n // Step 9: 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 };\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 * Error thrown during directory-based tool discovery.\n */\nexport class DiscoveryError extends Error {\n /** Absolute path to the tool directory that caused the error */\n readonly toolDir: string;\n /** Phase in which the error occurred */\n readonly phase: \"manifest\" | \"load\" | \"validate\";\n /** The underlying cause */\n readonly cause?: Error;\n\n constructor(\n toolDir: string,\n phase: \"manifest\" | \"load\" | \"validate\",\n message: string,\n cause?: Error,\n ) {\n super(`[${phase}] ${toolDir}: ${message}`);\n this.name = \"DiscoveryError\";\n this.toolDir = toolDir;\n this.phase = phase;\n this.cause = cause;\n }\n}\n","/**\n * Parsed SKILL.md manifest following Anthropic's Agent Skills specification.\n *\n * A SKILL.md file has:\n * - YAML frontmatter with `name` and `description` (Level 1: metadata, always loaded)\n * - Markdown body with instructions (Level 2: loaded when triggered)\n * - Bundled resource files referenced from the body (Level 3: loaded as needed)\n *\n * @see https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview\n */\n\n/**\n * YAML frontmatter from SKILL.md.\n * This is Level 1 (metadata) — always loaded at startup for discovery.\n */\nexport interface SkillFrontmatter {\n /**\n * Skill name identifier.\n * - Max 64 characters\n * - Lowercase letters, numbers, and hyphens only\n */\n name: string;\n\n /**\n * What the skill does and when to use it.\n * - Max 1024 characters\n * - Should include triggers/contexts for activation\n * - Written in third person\n */\n description: string;\n}\n\n/**\n * A resource file bundled with the skill.\n * Resources are Level 3 — loaded only as needed during execution.\n */\nexport interface SkillResource {\n /** Relative path from the skill directory */\n relativePath: string;\n /** Absolute path on disk */\n absolutePath: string;\n /** File extension (e.g., \".md\", \".py\", \".json\") */\n extension: string;\n /** Resource type inferred from extension */\n type: \"instructions\" | \"code\" | \"data\";\n}\n\n/**\n * Full parsed SKILL.md with progressive disclosure levels.\n */\nexport interface SkillDefinition {\n /** Level 1: Metadata from YAML frontmatter (always loaded, ~100 tokens) */\n frontmatter: SkillFrontmatter;\n\n /** Level 2: Markdown body instructions (loaded when skill triggered, <5k tokens recommended) */\n instructions: string;\n\n /** Level 3: Bundled resource files (loaded as needed, effectively unlimited) */\n resources: SkillResource[];\n\n /** Absolute path to the skill directory */\n dirPath: string;\n\n /** Absolute path to the SKILL.md file */\n skillMdPath: string;\n}\n\n/**\n * Validation error for SKILL.md parsing.\n */\nexport class SkillManifestError extends Error {\n constructor(\n public readonly path: string,\n public readonly field: string,\n message: string,\n ) {\n super(`SKILL.md error in ${path}: ${message}`);\n this.name = \"SkillManifestError\";\n }\n}\n\n// --- Validation helpers ---\n\nconst NAME_PATTERN = /^[a-z0-9-]+$/;\nconst NAME_MAX_LENGTH = 64;\nconst DESCRIPTION_MAX_LENGTH = 1024;\nconst RESERVED_WORDS = [\"anthropic\", \"claude\"];\nconst XML_TAG_PATTERN = /<\\/?[a-zA-Z][^>]*>/;\n\n/**\n * Validate a SkillFrontmatter object.\n * Throws SkillManifestError if invalid.\n */\nexport function validateFrontmatter(\n fm: Partial<SkillFrontmatter>,\n filePath: string,\n): asserts fm is SkillFrontmatter {\n // name: required\n if (!fm.name || typeof fm.name !== \"string\") {\n throw new SkillManifestError(filePath, \"name\", \"name is required\");\n }\n if (fm.name.length > NAME_MAX_LENGTH) {\n throw new SkillManifestError(\n filePath,\n \"name\",\n `name must be at most ${NAME_MAX_LENGTH} characters (got ${fm.name.length})`,\n );\n }\n if (!NAME_PATTERN.test(fm.name)) {\n throw new SkillManifestError(\n filePath,\n \"name\",\n \"name must contain only lowercase letters, numbers, and hyphens\",\n );\n }\n if (XML_TAG_PATTERN.test(fm.name)) {\n throw new SkillManifestError(filePath, \"name\", \"name cannot contain XML tags\");\n }\n for (const reserved of RESERVED_WORDS) {\n if (fm.name.includes(reserved)) {\n throw new SkillManifestError(\n filePath,\n \"name\",\n `name cannot contain reserved word \"${reserved}\"`,\n );\n }\n }\n\n // description: required\n if (!fm.description || typeof fm.description !== \"string\") {\n throw new SkillManifestError(\n filePath,\n \"description\",\n \"description is required and must be non-empty\",\n );\n }\n if (fm.description.length > DESCRIPTION_MAX_LENGTH) {\n throw new SkillManifestError(\n filePath,\n \"description\",\n `description must be at most ${DESCRIPTION_MAX_LENGTH} characters (got ${fm.description.length})`,\n );\n }\n if (XML_TAG_PATTERN.test(fm.description)) {\n throw new SkillManifestError(\n filePath,\n \"description\",\n \"description cannot contain XML tags\",\n );\n }\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { join, extname, relative } from \"node:path\";\nimport type {\n SkillDefinition,\n SkillFrontmatter,\n SkillResource,\n} from \"./SkillManifest.js\";\nimport { SkillManifestError, validateFrontmatter } from \"./SkillManifest.js\";\n\n/**\n * File extensions categorized by resource type.\n */\nconst CODE_EXTENSIONS = new Set([\n \".py\", \".js\", \".mjs\", \".ts\", \".sh\", \".bash\", \".rb\", \".go\",\n]);\nconst INSTRUCTION_EXTENSIONS = new Set([\".md\", \".markdown\", \".txt\"]);\n\n/**\n * Files to exclude from resource scanning.\n */\nconst EXCLUDED_FILES = new Set([\"SKILL.md\", \"tool.json\"]);\n\n/**\n * Parse a SKILL.md file into its constituent parts:\n * - YAML frontmatter (metadata)\n * - Markdown body (instructions)\n *\n * Supports the standard YAML frontmatter format:\n * ```\n * ---\n * name: my-skill\n * description: Does something useful\n * ---\n *\n * # Instructions here...\n * ```\n */\nexport function parseSkillMd(\n content: string,\n filePath: string,\n): { frontmatter: SkillFrontmatter; instructions: string } {\n const trimmed = content.trimStart();\n\n if (!trimmed.startsWith(\"---\")) {\n throw new SkillManifestError(\n filePath,\n \"frontmatter\",\n \"SKILL.md must start with YAML frontmatter (---)\",\n );\n }\n\n // Find the closing ---\n const endIndex = trimmed.indexOf(\"\\n---\", 3);\n if (endIndex === -1) {\n throw new SkillManifestError(\n filePath,\n \"frontmatter\",\n \"SKILL.md frontmatter is not closed (missing closing ---)\",\n );\n }\n\n const yamlBlock = trimmed.slice(4, endIndex).trim();\n const body = trimmed.slice(endIndex + 4).trim();\n\n // Parse simple YAML (name: value pairs)\n const frontmatter = parseSimpleYaml(yamlBlock, filePath);\n validateFrontmatter(frontmatter, filePath);\n\n return { frontmatter, instructions: body };\n}\n\n/**\n * Minimal YAML parser for frontmatter fields.\n * Handles: simple key: value pairs, quoted strings, multiline with |/>.\n * Does NOT handle: nested objects, arrays, anchors, etc.\n */\nfunction parseSimpleYaml(\n yaml: string,\n _filePath: string,\n): Partial<SkillFrontmatter> {\n const result: Record<string, string> = {};\n const lines = yaml.split(\"\\n\");\n\n let currentKey: string | null = null;\n let multilineValue: string[] = [];\n let multilineMode: \"literal\" | \"folded\" | null = null;\n\n for (const line of lines) {\n // Check if this is a new key: value pair\n const kvMatch = line.match(/^([a-zA-Z_][a-zA-Z0-9_-]*)\\s*:\\s*(.*)/);\n\n if (kvMatch && multilineMode === null) {\n // Flush previous multiline if any\n if (currentKey && multilineValue.length > 0) {\n result[currentKey] = multilineValue.join(\n multilineMode === \"folded\" ? \" \" : \"\\n\",\n );\n multilineValue = [];\n }\n\n const key = kvMatch[1]!;\n const value = (kvMatch[2] ?? \"\").trim();\n\n if (value === \"|\") {\n currentKey = key;\n multilineMode = \"literal\";\n } else if (value === \">\") {\n currentKey = key;\n multilineMode = \"folded\";\n } else {\n // Simple value — strip quotes if present\n result[key] = stripQuotes(value);\n currentKey = null;\n }\n } else if (multilineMode !== null && currentKey) {\n // Continuation of multiline value\n if (line.match(/^\\s/) || line === \"\") {\n multilineValue.push(line.replace(/^\\s{2}/, \"\"));\n } else {\n // End of multiline block, process this line as new key\n result[currentKey] = multilineValue.join(\n multilineMode === \"literal\" ? \"\\n\" : \" \",\n ).trim();\n multilineValue = [];\n multilineMode = null;\n\n const newKv = line.match(/^([a-zA-Z_][a-zA-Z0-9_-]*)\\s*:\\s*(.*)/);\n if (newKv) {\n const newKey = newKv[1]!;\n const val = (newKv[2] ?? \"\").trim();\n if (val === \"|\") {\n currentKey = newKey;\n multilineMode = \"literal\";\n } else if (val === \">\") {\n currentKey = newKey;\n multilineMode = \"folded\";\n } else {\n result[newKey] = stripQuotes(val);\n currentKey = null;\n }\n }\n }\n }\n }\n\n // Flush final multiline\n if (currentKey && multilineValue.length > 0) {\n result[currentKey] = multilineValue.join(\n multilineMode === \"literal\" ? \"\\n\" : \" \",\n ).trim();\n }\n\n return result as Partial<SkillFrontmatter>;\n}\n\nfunction stripQuotes(s: string): string {\n if ((s.startsWith('\"') && s.endsWith('\"')) || (s.startsWith(\"'\") && s.endsWith(\"'\"))) {\n return s.slice(1, -1);\n }\n return s;\n}\n\n/**\n * Scan a skill directory for bundled resource files (Level 3).\n * Recursively finds all files except SKILL.md and tool.json.\n */\nexport async function scanSkillResources(dirPath: string): Promise<SkillResource[]> {\n const resources: SkillResource[] = [];\n await scanDir(dirPath, dirPath, resources);\n return resources;\n}\n\nasync function scanDir(\n basePath: string,\n currentPath: string,\n resources: SkillResource[],\n): Promise<void> {\n let entries;\n try {\n entries = await readdir(currentPath, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n const fullPath = join(currentPath, entry.name);\n\n if (entry.isDirectory()) {\n // Skip node_modules and hidden directories\n if (entry.name.startsWith(\".\") || entry.name === \"node_modules\") {\n continue;\n }\n await scanDir(basePath, fullPath, resources);\n } else if (entry.isFile()) {\n // Skip excluded files\n if (EXCLUDED_FILES.has(entry.name)) {\n continue;\n }\n\n const ext = extname(entry.name).toLowerCase();\n const relPath = relative(basePath, fullPath);\n\n resources.push({\n relativePath: relPath,\n absolutePath: fullPath,\n extension: ext,\n type: inferResourceType(ext),\n });\n }\n }\n}\n\nfunction inferResourceType(ext: string): SkillResource[\"type\"] {\n if (CODE_EXTENSIONS.has(ext)) return \"code\";\n if (INSTRUCTION_EXTENSIONS.has(ext)) return \"instructions\";\n return \"data\";\n}\n\n/**\n * Load and parse a complete skill from a directory containing SKILL.md.\n * Returns the full SkillDefinition with all three progressive disclosure levels.\n */\nexport async function loadSkillDefinition(dirPath: string): Promise<SkillDefinition> {\n const skillMdPath = join(dirPath, \"SKILL.md\");\n\n let content: string;\n try {\n content = await readFile(skillMdPath, \"utf-8\");\n } catch (err) {\n throw new SkillManifestError(\n skillMdPath,\n \"file\",\n `Cannot read SKILL.md: ${(err as Error).message}`,\n );\n }\n\n const { frontmatter, instructions } = parseSkillMd(content, skillMdPath);\n const resources = await scanSkillResources(dirPath);\n\n return {\n frontmatter,\n instructions,\n resources,\n dirPath,\n skillMdPath,\n };\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { MCPServerConfig, ToolManifest, LoadedTool } from \"../types.js\";\nimport { DiscoveryError } from \"../errors.js\";\n\n/**\n * Cursor-compatible mcpServers wrapper format.\n * Example: { \"mcpServers\": { \"server-name\": { \"command\": \"npx\", \"args\": [...] } } }\n */\ninterface CursorMCPConfig {\n mcpServers: Record<string, MCPServerConfig>;\n}\n\n/**\n * Check if the parsed JSON is in Cursor's mcpServers wrapper format.\n */\nfunction isCursorFormat(obj: unknown): obj is CursorMCPConfig {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"mcpServers\" in obj &&\n typeof (obj as CursorMCPConfig).mcpServers === \"object\" &&\n (obj as CursorMCPConfig).mcpServers !== null\n );\n}\n\n/**\n * Extract MCPServerConfig from either Cursor wrapper format or bare format.\n * - Cursor format: { \"mcpServers\": { \"name\": { command/url/args/env } } }\n * Uses the first server entry (or the one matching the tool name).\n * - Bare format: { \"command\": \"...\", \"args\": [...] } or { \"url\": \"...\" }\n */\nfunction extractMCPConfig(\n parsed: unknown,\n toolName: string | undefined,\n): MCPServerConfig {\n if (isCursorFormat(parsed)) {\n const servers = parsed.mcpServers;\n const keys = Object.keys(servers);\n if (keys.length === 0) {\n return {};\n }\n // Prefer server matching tool name, otherwise use first entry\n const name = toolName && keys.includes(toolName) ? toolName : keys[0]!;\n return servers[name]!;\n }\n return parsed as MCPServerConfig;\n}\n\n/**\n * Load an MCP tool from its directory.\n * Reads mcp.json and validates it has either command or url.\n * Supports both Cursor's mcpServers wrapper format and bare server config.\n */\nexport async function loadMCPTool(\n dirPath: string,\n manifest: ToolManifest,\n): Promise<LoadedTool> {\n const mcpPath = join(dirPath, manifest.entryPoint ?? \"mcp.json\");\n\n let raw: string;\n try {\n raw = await readFile(mcpPath, \"utf-8\");\n } catch (err) {\n throw new DiscoveryError(\n dirPath,\n \"load\",\n `Failed to read MCP config: ${mcpPath}`,\n err as Error,\n );\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err) {\n throw new DiscoveryError(\n dirPath,\n \"load\",\n `Invalid JSON in ${mcpPath}`,\n err as Error,\n );\n }\n\n // Extract server config from Cursor wrapper or bare format\n const baseName = manifest.name?.split(\"/\").pop();\n const config = extractMCPConfig(parsed, baseName);\n\n if (!config.command && !config.url) {\n throw new DiscoveryError(\n dirPath,\n \"validate\",\n `mcp.json must have either \"command\" or \"url\" field`,\n );\n }\n\n return { manifest, dirPath, mcpConfig: config };\n}\n","import { join } from \"node:path\";\nimport { stat } from \"node:fs/promises\";\n\nconst DEFAULT_EXTENSIONS = [\".js\", \".mjs\"];\n\n/**\n * Resolve the entry point file for a tool directory.\n * If baseName already has an extension, verifies the file exists.\n * Otherwise tries each extension in order.\n */\nexport async function resolveEntryPoint(\n dirPath: string,\n baseName: string,\n extensions: string[] = DEFAULT_EXTENSIONS,\n): Promise<string> {\n // If baseName already has a recognized extension, use it directly\n if (extensions.some((ext) => baseName.endsWith(ext))) {\n const fullPath = join(dirPath, baseName);\n await stat(fullPath); // throws ENOENT if not found\n return fullPath;\n }\n\n // Try each extension\n for (const ext of extensions) {\n const fullPath = join(dirPath, `${baseName}${ext}`);\n try {\n await stat(fullPath);\n return fullPath;\n } catch {\n // try next extension\n }\n }\n\n throw new Error(\n `Could not find entry point in ${dirPath}. Tried: ${extensions.map((e) => baseName + e).join(\", \")}`,\n );\n}\n","import { pathToFileURL } from \"node:url\";\nimport type { ToolManifest, LoadedTool } from \"../types.js\";\nimport { DiscoveryError } from \"../errors.js\";\nimport { resolveEntryPoint } from \"./resolveEntry.js\";\n\n/**\n * Load a LangChain tool from its directory.\n * Dynamically imports the entry point and validates it has an invoke() method.\n */\nexport async function loadLangChainTool(\n dirPath: string,\n manifest: ToolManifest,\n extensions?: string[],\n): Promise<LoadedTool> {\n let entryFile: string;\n try {\n entryFile = await resolveEntryPoint(\n dirPath,\n manifest.entryPoint ?? \"index\",\n extensions,\n );\n } catch (err) {\n throw new DiscoveryError(\n dirPath,\n \"load\",\n `Cannot find LangChain entry point`,\n err as Error,\n );\n }\n\n let mod: Record<string, unknown>;\n try {\n mod = (await import(pathToFileURL(entryFile).href)) as Record<string, unknown>;\n } catch (err) {\n throw new DiscoveryError(\n dirPath,\n \"load\",\n `Failed to import ${entryFile}`,\n err as Error,\n );\n }\n\n // Resolve the tool instance: default export > named \"tool\" > module itself\n const tool = (mod.default ?? mod.tool ?? mod) as Record<string, unknown>;\n\n if (!tool || typeof tool.invoke !== \"function\") {\n throw new DiscoveryError(\n dirPath,\n \"validate\",\n `Entry point must export an object with invoke() method (LangChainToolLike)`,\n );\n }\n\n return { manifest, dirPath, impl: tool };\n}\n","import { pathToFileURL } from \"node:url\";\nimport type { ToolManifest, LoadedTool } from \"../types.js\";\nimport { DiscoveryError } from \"../errors.js\";\nimport { resolveEntryPoint } from \"./resolveEntry.js\";\nimport { loadSkillDefinition } from \"./SkillMdParser.js\";\nimport type { SkillDefinition } from \"./SkillManifest.js\";\n\n/**\n * Load a Skill tool from its directory following Anthropic's Agent Skills spec.\n *\n * Requires a SKILL.md file with YAML frontmatter (name, description).\n * The SKILL.md body provides instructions (Level 2), and bundled files\n * in the directory provide resources (Level 3).\n *\n * Optionally loads a handler function (handler.js/mjs) for programmatic execution.\n *\n * @see https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview\n */\nexport async function loadSkillTool(\n dirPath: string,\n manifest: ToolManifest,\n extensions?: string[],\n): Promise<LoadedTool> {\n let skillDef: SkillDefinition;\n try {\n skillDef = await loadSkillDefinition(dirPath);\n } catch (err) {\n throw new DiscoveryError(\n dirPath,\n \"load\",\n `Failed to parse SKILL.md: ${(err as Error).message}`,\n err as Error,\n );\n }\n\n // Try to load an optional handler function for programmatic execution\n let handler: unknown;\n try {\n const entryFile = await resolveEntryPoint(\n dirPath,\n manifest.entryPoint ?? \"handler\",\n extensions,\n );\n const mod = (await import(pathToFileURL(entryFile).href)) as Record<string, unknown>;\n const fn = mod.default ?? mod.handler;\n if (typeof fn === \"function\") {\n handler = fn;\n }\n } catch {\n // Handler is optional — skills can be instruction-only\n }\n\n return {\n manifest,\n dirPath,\n impl: handler,\n skillDefinition: skillDef,\n };\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { ToolManifest, LoadedTool } from \"../types.js\";\nimport { DiscoveryError } from \"../errors.js\";\n\n/**\n * Load an n8n tool from its directory.\n * Reads workflow.json and validates it has a \"nodes\" array.\n */\nexport async function loadN8nTool(\n dirPath: string,\n manifest: ToolManifest,\n): Promise<LoadedTool> {\n const workflowPath = join(dirPath, manifest.entryPoint ?? \"workflow.json\");\n\n let raw: string;\n try {\n raw = await readFile(workflowPath, \"utf-8\");\n } catch (err) {\n throw new DiscoveryError(\n dirPath,\n \"load\",\n `Failed to read workflow: ${workflowPath}`,\n err as Error,\n );\n }\n\n let workflowDef: Record<string, unknown>;\n try {\n workflowDef = JSON.parse(raw) as Record<string, unknown>;\n } catch (err) {\n throw new DiscoveryError(\n dirPath,\n \"load\",\n `Invalid JSON in ${workflowPath}`,\n err as Error,\n );\n }\n\n if (!workflowDef.nodes || !Array.isArray(workflowDef.nodes)) {\n throw new DiscoveryError(\n dirPath,\n \"validate\",\n `workflow.json must have a \"nodes\" array`,\n );\n }\n\n return { manifest, dirPath, workflowDef };\n}\n","import { readdir, readFile, access } from \"node:fs/promises\";\nimport { join, basename } from \"node:path\";\nimport type { ToolSpec } from \"../types/ToolSpec.js\";\nimport type {\n ToolManifest,\n DirectoryScannerOptions,\n LoadedTool,\n} from \"./types.js\";\nimport { DiscoveryError } from \"./errors.js\";\nimport { loadMCPTool } from \"./loaders/MCPLoader.js\";\nimport { loadLangChainTool } from \"./loaders/LangChainLoader.js\";\nimport { loadSkillTool } from \"./loaders/SkillLoader.js\";\nimport { loadN8nTool } from \"./loaders/N8nLoader.js\";\nimport { resolveEntryPoint } from \"./loaders/resolveEntry.js\";\n\nconst DEFAULT_EXTENSIONS = [\".js\", \".mjs\"];\n\n/**\n * Scans filesystem directories for tool definitions.\n * A tool can be declared via tool.json or inferred from conventional files\n * (SKILL.md, workflow.json, mcp.json, or an index entry point).\n */\nexport class DirectoryScanner {\n private readonly roots: Array<{ path: string; namespace: string }>;\n private readonly extensions: string[];\n private readonly onError?: (toolDir: string, error: Error) => void;\n\n constructor(options: DirectoryScannerOptions) {\n const defaultNamespace = options.namespace ?? \"dir\";\n this.roots = options.roots.map((root) => {\n if (typeof root === \"string\") {\n return { path: root, namespace: defaultNamespace };\n }\n return {\n path: root.path,\n namespace: root.namespace ?? defaultNamespace,\n };\n });\n this.extensions = options.extensions ?? DEFAULT_EXTENSIONS;\n this.onError = options.onError;\n }\n\n /**\n * Scan all root directories and return discovered ToolSpecs.\n * Errors in individual tool directories are reported via onError\n * and do not prevent other tools from loading.\n */\n async scan(): Promise<ToolSpec[]> {\n const specs: ToolSpec[] = [];\n\n for (const root of this.roots) {\n const rootSpecs = await this.scanRoot(root.path, root.namespace);\n specs.push(...rootSpecs);\n }\n\n return specs;\n }\n\n private async scanRoot(rootPath: string, namespace: string): Promise<ToolSpec[]> {\n return this.scanRecursive(rootPath, namespace);\n }\n\n /**\n * Recursively scan directories for tool definitions.\n * Directories can be detected via tool.json or inferred markers.\n */\n private async scanRecursive(dirPath: string, namespace: string): Promise<ToolSpec[]> {\n const specs: ToolSpec[] = [];\n\n let dirEntries: Array<{ name: string; isDirectory: boolean }>;\n try {\n const entries = await readdir(dirPath, { withFileTypes: true });\n dirEntries = entries.map((entry) => ({\n name: entry.name,\n isDirectory: entry.isDirectory(),\n }));\n } catch (error) {\n this.onError?.(dirPath, error as Error);\n return specs;\n }\n\n const dirName = basename(dirPath);\n try {\n const loadedSpecs = await this.loadToolDir(dirPath, dirName, namespace);\n if (loadedSpecs.length > 0) {\n specs.push(...loadedSpecs);\n }\n } catch (error) {\n this.onError?.(dirPath, error as Error);\n }\n\n for (const entry of dirEntries) {\n if (!entry.isDirectory) {\n continue;\n }\n const childPath = join(dirPath, entry.name);\n try {\n const childSpecs = await this.scanRecursive(childPath, namespace);\n specs.push(...childSpecs);\n } catch (error) {\n this.onError?.(childPath, error as Error);\n }\n }\n\n return specs;\n }\n\n private async loadToolDir(\n dirPath: string,\n dirName: string,\n namespace: string,\n ): Promise<ToolSpec[]> {\n // Read tool.json manifest if present, otherwise infer.\n const manifestPath = join(dirPath, \"tool.json\");\n let manifestRaw: string;\n try {\n manifestRaw = await readFile(manifestPath, \"utf-8\");\n } catch {\n const inferred = await this.inferManifest(dirPath, dirName);\n if (!inferred) {\n return [];\n }\n if (inferred.kind === \"langchain\") {\n if (inferred.entryPoint) {\n const loaded = await loadLangChainTool(dirPath, inferred, this.extensions);\n return [this.toToolSpec(loaded, dirName, dirPath, namespace)];\n }\n return this.loadLangChainTools(dirPath, dirName, inferred, false, namespace);\n }\n const loaded = await this.loadByKind(dirPath, inferred);\n return [this.toToolSpec(loaded, dirName, dirPath, namespace)];\n }\n\n let manifest: ToolManifest;\n try {\n manifest = JSON.parse(manifestRaw) as ToolManifest;\n } catch (err) {\n throw new DiscoveryError(\n dirPath,\n \"manifest\",\n \"Invalid JSON in tool.json\",\n err as Error,\n );\n }\n\n // Validate required field\n if (!manifest.kind) {\n throw new DiscoveryError(\n dirPath,\n \"manifest\",\n `tool.json must have a \"kind\" field`,\n );\n }\n\n // Skip disabled tools\n if (manifest.enabled === false) {\n return [];\n }\n\n // Load based on kind\n if (manifest.kind === \"langchain\") {\n if (manifest.entryPoint) {\n const loaded = await loadLangChainTool(dirPath, manifest, this.extensions);\n return [this.toToolSpec(loaded, dirName, dirPath, namespace)];\n }\n return this.loadLangChainTools(dirPath, dirName, manifest, true, namespace);\n }\n const loaded = await this.loadByKind(dirPath, manifest);\n\n // Convert to ToolSpec\n return [this.toToolSpec(loaded, dirName, dirPath, namespace)];\n }\n\n private async inferManifest(\n dirPath: string,\n dirName: string,\n ): Promise<ToolManifest | null> {\n const hasSkill = await this.fileExists(join(dirPath, \"SKILL.md\"));\n const hasN8n = await this.fileExists(join(dirPath, \"workflow.json\"));\n const hasMcp = await this.fileExists(join(dirPath, \"mcp.json\"));\n const isLangchainDir = dirName === \"langchain\";\n const hasLangchain = isLangchainDir\n ? await this.hasLangchainFiles(dirPath)\n : await this.hasEntryPoint(dirPath, \"index\");\n\n const kinds = [\n hasSkill ? \"skill\" : null,\n hasN8n ? \"n8n\" : null,\n hasMcp ? \"mcp\" : null,\n hasLangchain ? \"langchain\" : null,\n ].filter(Boolean) as ToolManifest[\"kind\"][];\n\n if (kinds.length === 0) return null;\n if (kinds.length > 1) {\n throw new DiscoveryError(\n dirPath,\n \"manifest\",\n `Ambiguous tool kind (found ${kinds.join(\", \")}). Add tool.json to disambiguate.`,\n );\n }\n\n const kind = kinds[0]!;\n const manifest: ToolManifest = { kind };\n if (kind === \"n8n\") manifest.entryPoint = \"workflow.json\";\n if (kind === \"mcp\") manifest.entryPoint = \"mcp.json\";\n if (kind === \"langchain\" && !isLangchainDir) manifest.entryPoint = \"index\";\n if (kind === \"skill\") manifest.entryPoint = \"handler\";\n return manifest;\n }\n\n private async fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n }\n\n private async hasEntryPoint(dirPath: string, baseName: string): Promise<boolean> {\n try {\n await resolveEntryPoint(dirPath, baseName, this.extensions);\n return true;\n } catch {\n return false;\n }\n }\n\n private async hasLangchainFiles(dirPath: string): Promise<boolean> {\n const entryFiles = await this.listLangchainEntryFiles(dirPath);\n return entryFiles.length > 0;\n }\n\n private async listLangchainEntryFiles(dirPath: string): Promise<string[]> {\n let entries: Array<{ name: string; isFile: boolean }>;\n try {\n const dirEntries = await readdir(dirPath, { withFileTypes: true });\n entries = dirEntries.map((entry) => ({\n name: entry.name,\n isFile: entry.isFile(),\n }));\n } catch {\n return [];\n }\n\n return entries\n .filter((entry) => entry.isFile)\n .map((entry) => entry.name)\n .filter((name) => {\n if (name.startsWith(\".\") || name.startsWith(\"_\")) return false;\n if (name.endsWith(\".d.ts\")) return false;\n if (name.includes(\".test.\") || name.includes(\".spec.\")) return false;\n return this.extensions.some((ext) => name.endsWith(ext));\n });\n }\n\n private async loadByKind(\n dirPath: string,\n manifest: ToolManifest,\n ): Promise<LoadedTool> {\n switch (manifest.kind) {\n case \"mcp\":\n return loadMCPTool(dirPath, manifest);\n case \"langchain\":\n return loadLangChainTool(dirPath, manifest, this.extensions);\n case \"skill\":\n return loadSkillTool(dirPath, manifest, this.extensions);\n case \"n8n\":\n return loadN8nTool(dirPath, manifest);\n default:\n throw new DiscoveryError(\n dirPath,\n \"manifest\",\n `Unknown tool kind: \"${(manifest as { kind: string }).kind}\"`,\n );\n }\n }\n\n private async loadLangChainTools(\n dirPath: string,\n dirName: string,\n manifest: ToolManifest,\n strict: boolean,\n namespace: string,\n ): Promise<ToolSpec[]> {\n const entryFiles = await this.listLangchainEntryFiles(dirPath);\n if (entryFiles.length === 0) {\n if (strict) {\n throw new DiscoveryError(\n dirPath,\n \"load\",\n \"No LangChain entry files found\",\n );\n }\n return [];\n }\n\n const specs: ToolSpec[] = [];\n const useDirNameForSingle = dirName !== \"langchain\";\n for (const entryFile of entryFiles) {\n const fileManifest: ToolManifest = {\n ...manifest,\n entryPoint: entryFile,\n };\n try {\n const loaded = await loadLangChainTool(dirPath, fileManifest, this.extensions);\n const fileBase = basename(entryFile).replace(/\\.[^.]+$/, \"\");\n const nameHint =\n entryFiles.length === 1 && useDirNameForSingle ? dirName : fileBase;\n specs.push(this.toToolSpec(loaded, nameHint, dirPath, namespace));\n } catch (error) {\n const err = error as Error;\n if (err instanceof DiscoveryError && err.phase === \"validate\") {\n if (strict) {\n throw err;\n }\n continue;\n }\n this.onError?.(join(dirPath, entryFile), err);\n if (strict) {\n throw err;\n }\n }\n }\n\n return specs;\n }\n\n private toToolSpec(\n loaded: LoadedTool,\n dirName: string,\n dirPath: string,\n namespace: string,\n ): ToolSpec {\n const { manifest } = loaded;\n const kindDirNames = new Set([\"mcp\", \"langchain\", \"skill\", \"n8n\"]);\n const parentName = basename(join(dirPath, \"..\"));\n const isKindDir = kindDirNames.has(dirName);\n const defaultDirName = isKindDir ? parentName : dirName;\n const inferredName = isKindDir\n ? `${namespace}/${defaultDirName}-${dirName}`\n : `${namespace}/${defaultDirName}`;\n const name = manifest.name ?? inferredName;\n\n const spec: ToolSpec = {\n name,\n version: manifest.version ?? \"1.0.0\",\n kind: manifest.kind,\n description: manifest.description ?? `${manifest.kind} tool: ${dirName}`,\n tags: manifest.tags,\n inputSchema: manifest.inputSchema ?? {\n type: \"object\",\n additionalProperties: true,\n },\n outputSchema: manifest.outputSchema ?? {\n type: \"object\",\n additionalProperties: true,\n },\n capabilities: manifest.capabilities ?? [],\n costHints: manifest.costHints,\n };\n\n // Kind-specific fields\n switch (manifest.kind) {\n case \"mcp\":\n if (loaded.mcpConfig?.url) {\n spec.endpoint = loaded.mcpConfig.url;\n }\n // Store full MCP config for adapter to consume\n spec.impl = loaded.mcpConfig;\n break;\n case \"langchain\":\n spec.impl = loaded.impl;\n if (!manifest.name) {\n const toolName = (loaded.impl as { name?: string } | undefined)?.name;\n if (toolName) {\n spec.name = `${namespace}/${toolName}`;\n }\n }\n if (!manifest.description) {\n const toolDescription = (loaded.impl as { description?: string } | undefined)\n ?.description;\n if (toolDescription) {\n spec.description = toolDescription;\n }\n }\n // Extract schema from tool instance if not in manifest\n if (!manifest.inputSchema && loaded.impl) {\n const tool = loaded.impl as { schema?: object };\n if (tool.schema) {\n spec.inputSchema = tool.schema;\n }\n }\n break;\n case \"skill\": {\n // For skills, store the full SkillDefinition + optional handler\n // The SkillAdapter resolves these via spec.impl\n if (loaded.skillDefinition) {\n // Use SKILL.md frontmatter for name and description (overrides tool.json)\n spec.name = manifest.name ?? loaded.skillDefinition.frontmatter.name;\n spec.description = loaded.skillDefinition.frontmatter.description;\n spec.impl = {\n ...loaded.skillDefinition,\n handler: loaded.impl,\n };\n } else {\n spec.impl = loaded.impl;\n }\n break;\n }\n case \"n8n\": {\n const workflow = loaded.workflowDef as { id?: string } | undefined;\n if (workflow?.id) {\n spec.resourceId = String(workflow.id);\n }\n spec.impl = loaded.workflowDef;\n break;\n }\n }\n\n return spec;\n }\n}\n","import type { ToolAdapter, ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext } from \"../types/ToolIntent.js\";\nimport { createLogger, sanitizeForLog, summarizeForLog } from \"../observability/Logger.js\";\nimport type { DebugOptions, Logger } from \"../observability/Logger.js\";\n\n/**\n * Interface for LangChain-compatible tool instances.\n * Matches @langchain/core BaseTool.invoke() signature.\n */\nexport interface LangChainToolLike {\n invoke(input: unknown, config?: unknown): Promise<unknown>;\n name?: string;\n description?: string;\n schema?: object;\n}\n\n/**\n * Options for creating a LangChainAdapter.\n */\nexport interface LangChainAdapterOptions {\n /** Map of tool names to their implementations */\n tools?: Map<string, LangChainToolLike>;\n /** Debug/logging configuration */\n debug?: DebugOptions;\n}\n\n/**\n * Adapter for LangChain-compatible tools.\n * Wraps local tool instances with the unified ToolAdapter interface.\n */\nexport class LangChainAdapter implements ToolAdapter {\n readonly kind = \"langchain\" as const;\n private readonly tools: Map<string, LangChainToolLike>;\n private readonly logger: Logger;\n\n constructor(options: LangChainAdapterOptions = {}) {\n this.tools = options.tools ?? new Map();\n this.logger = createLogger({ ...options.debug, prefix: \"LangChainAdapter\" });\n }\n\n /**\n * Register a LangChain tool instance.\n */\n registerTool(name: string, tool: LangChainToolLike): void {\n this.tools.set(name, tool);\n }\n\n /**\n * Unregister a tool.\n */\n unregisterTool(name: string): boolean {\n return this.tools.delete(name);\n }\n\n /**\n * List available tools (from registered instances).\n */\n async listTools(): Promise<ToolSpec[]> {\n const specs: ToolSpec[] = [];\n for (const [name, tool] of this.tools) {\n specs.push({\n name,\n version: \"1.0.0\",\n kind: \"langchain\",\n description: tool.description ?? `LangChain tool: ${name}`,\n inputSchema: (tool.schema as object) ?? {\n type: \"object\",\n additionalProperties: true,\n },\n outputSchema: { type: \"object\", additionalProperties: true },\n capabilities: [],\n impl: tool,\n });\n }\n return specs;\n }\n\n /**\n * Invoke a LangChain tool.\n */\n async invoke(\n spec: ToolSpec,\n args: unknown,\n ctx: ExecContext,\n ): Promise<{ result: unknown; raw?: unknown }> {\n if (this.logger.isEnabled(\"debug\")) {\n this.logger.debug(\"invoke.start\", {\n tool: spec.name,\n requestId: ctx.requestId,\n traceId: ctx.traceId,\n args: this.logger.options.includeArgs ? sanitizeForLog(args) : undefined,\n });\n }\n // Get tool instance from spec.impl or local registry\n const tool = this.resolveTool(spec);\n\n if (!tool) {\n throw new Error(\n `LangChain tool not found: ${spec.name}. Register it with registerTool() or provide via spec.impl.`,\n );\n }\n\n try {\n // Invoke the tool\n const raw = await tool.invoke(args, {\n metadata: {\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n traceId: ctx.traceId,\n },\n });\n\n // Normalize result\n const result = this.normalizeResult(raw);\n\n if (this.logger.isEnabled(\"debug\")) {\n this.logger.debug(\"invoke.ok\", {\n tool: spec.name,\n result: this.logger.options.includeResults\n ? summarizeForLog(result)\n : undefined,\n raw: this.logger.options.includeRaw ? summarizeForLog(raw) : undefined,\n });\n }\n\n return { result, raw };\n } catch (error) {\n this.logger.warn(\"invoke.error\", {\n tool: spec.name,\n requestId: ctx.requestId,\n traceId: ctx.traceId,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n private resolveTool(spec: ToolSpec): LangChainToolLike | undefined {\n // Priority: spec.impl > local registry\n if (spec.impl && typeof spec.impl === \"object\" && \"invoke\" in spec.impl) {\n return spec.impl as LangChainToolLike;\n }\n return this.tools.get(spec.name);\n }\n\n private normalizeResult(raw: unknown): unknown {\n // If the result is a string, wrap it in an object\n if (typeof raw === \"string\") {\n return { output: raw };\n }\n // If it's already an object, use as-is\n if (raw && typeof raw === \"object\") {\n return raw;\n }\n // Wrap primitives\n return { output: raw };\n }\n}\n","import type { ToolAdapter, ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext } from \"../types/ToolIntent.js\";\nimport { createLogger, sanitizeForLog, summarizeForLog } from \"../observability/Logger.js\";\nimport type { DebugOptions, Logger } from \"../observability/Logger.js\";\n\n/**\n * MCP tool definition as returned by MCP server.\n */\nexport interface MCPToolDefinition {\n name: string;\n description?: string;\n inputSchema?: object;\n}\n\n/**\n * MCP call result from MCP server.\n */\nexport interface MCPCallResult {\n content: Array<{ type: string; text?: string; data?: unknown }>;\n isError?: boolean;\n}\n\n/**\n * Injectable MCP client interface.\n * Matches the core methods of @modelcontextprotocol/sdk Client.\n */\nexport interface MCPClientLike {\n listTools(): Promise<{ tools: MCPToolDefinition[] }>;\n callTool(params: {\n name: string;\n arguments?: Record<string, unknown>;\n }): Promise<MCPCallResult>;\n}\n\n/**\n * Options for creating an MCPAdapter.\n */\nexport interface MCPAdapterOptions {\n /** Injectable MCP client instance */\n client?: MCPClientLike;\n /** Endpoint URL for the MCP server (used in ToolSpec) */\n endpoint?: string;\n /** Tool name prefix for namespacing */\n prefix?: string;\n /** Auth token for MCP server */\n authToken?: string;\n /** Debug/logging configuration */\n debug?: DebugOptions;\n}\n\n/**\n * Adapter for MCP (Model Context Protocol) servers.\n * Supports tool discovery and invocation via injectable MCP client.\n */\nexport class MCPAdapter implements ToolAdapter {\n readonly kind = \"mcp\" as const;\n private client: MCPClientLike | undefined;\n private readonly endpoint: string;\n private readonly prefix: string;\n private readonly _authToken?: string; // Reserved for future authentication support\n private cachedTools: ToolSpec[] | undefined;\n private cacheExpiry = 0;\n private readonly cacheTtlMs = 30_000; // 30s cache\n private readonly logger: Logger;\n\n constructor(options: MCPAdapterOptions = {}) {\n this.client = options.client;\n this.endpoint = options.endpoint ?? \"\";\n this.prefix = options.prefix ?? \"mcp\";\n this._authToken = options.authToken;\n this.logger = createLogger({ ...options.debug, prefix: \"MCPAdapter\" });\n }\n\n /**\n * Set or replace the MCP client.\n */\n setClient(client: MCPClientLike): void {\n this.client = client;\n this.invalidateCache();\n }\n\n /**\n * Discover tools from the MCP server.\n */\n async listTools(): Promise<ToolSpec[]> {\n if (!this.client) {\n throw new Error(\"MCP client not configured. Call setClient() first.\");\n }\n\n // Check cache\n if (this.cachedTools && Date.now() < this.cacheExpiry) {\n return this.cachedTools;\n }\n\n const response = await this.client.listTools();\n const specs = response.tools.map((tool) => this.mapToToolSpec(tool));\n\n this.cachedTools = specs;\n this.cacheExpiry = Date.now() + this.cacheTtlMs;\n\n return specs;\n }\n\n /**\n * Invoke an MCP tool.\n */\n async invoke(\n spec: ToolSpec,\n args: unknown,\n _ctx: ExecContext,\n ): Promise<{ result: unknown; raw?: unknown }> {\n if (!this.client) {\n throw new Error(\"MCP client not configured. Call setClient() first.\");\n }\n\n if (this.logger.isEnabled(\"debug\")) {\n this.logger.debug(\"invoke.start\", {\n tool: spec.name,\n args: this.logger.options.includeArgs ? sanitizeForLog(args) : undefined,\n });\n }\n\n // Extract the original MCP tool name (remove prefix)\n const mcpToolName = this.extractMCPName(spec.name);\n\n try {\n const response = await this.client.callTool({\n name: mcpToolName,\n arguments: (args as Record<string, unknown>) ?? {},\n });\n\n if (response.isError) {\n const errorText = response.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n throw new Error(`MCP tool error: ${errorText || \"Unknown error\"}`);\n }\n\n // Parse result from content\n const result = this.parseResult(response);\n\n if (this.logger.isEnabled(\"debug\")) {\n this.logger.debug(\"invoke.ok\", {\n tool: spec.name,\n result: this.logger.options.includeResults\n ? summarizeForLog(result)\n : undefined,\n raw: this.logger.options.includeRaw\n ? summarizeForLog(response)\n : undefined,\n });\n }\n\n return { result, raw: response };\n } catch (error) {\n this.logger.warn(\"invoke.error\", {\n tool: spec.name,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n /**\n * Invalidate the tool cache.\n */\n invalidateCache(): void {\n this.cachedTools = undefined;\n this.cacheExpiry = 0;\n }\n\n private mapToToolSpec(tool: MCPToolDefinition): ToolSpec {\n return {\n name: `${this.prefix}/${tool.name}`,\n version: \"1.0.0\",\n kind: \"mcp\",\n description: tool.description ?? `MCP tool: ${tool.name}`,\n inputSchema: tool.inputSchema ?? {\n type: \"object\",\n additionalProperties: true,\n },\n outputSchema: { type: \"object\", additionalProperties: true },\n capabilities: [\"network\"],\n endpoint: this.endpoint,\n };\n }\n\n private extractMCPName(specName: string): string {\n const prefix = `${this.prefix}/`;\n if (specName.startsWith(prefix)) {\n return specName.slice(prefix.length);\n }\n return specName;\n }\n\n private parseResult(response: MCPCallResult): unknown {\n const textParts = response.content.filter((c) => c.type === \"text\");\n const dataParts = response.content.filter((c) => c.data !== undefined);\n\n // If there's structured data, prefer it\n if (dataParts.length > 0) {\n return dataParts.length === 1 ? dataParts[0]!.data : dataParts.map((d) => d.data);\n }\n\n // Otherwise parse text as JSON or return as string\n if (textParts.length > 0) {\n const text = textParts.map((t) => t.text).join(\"\\n\");\n try {\n return JSON.parse(text);\n } catch {\n return { output: text };\n }\n }\n\n return { content: response.content };\n }\n}\n","import type { ToolAdapter, ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext } from \"../types/ToolIntent.js\";\nimport { createLogger, sanitizeForLog, summarizeForLog } from \"../observability/Logger.js\";\nimport type { DebugOptions, Logger } from \"../observability/Logger.js\";\n\n/**\n * HTTP client interface for n8n API/webhook calls.\n */\nexport interface HttpClient {\n fetch(\n url: string,\n options: {\n method: string;\n headers?: Record<string, string>;\n body?: string;\n signal?: AbortSignal;\n },\n ): Promise<{ status: number; json(): Promise<unknown>; text(): Promise<string> }>;\n}\n\n/**\n * Default HTTP client using global fetch.\n */\nclass DefaultHttpClient implements HttpClient {\n async fetch(\n url: string,\n options: {\n method: string;\n headers?: Record<string, string>;\n body?: string;\n signal?: AbortSignal;\n },\n ) {\n const response = await globalThis.fetch(url, {\n method: options.method,\n headers: options.headers,\n body: options.body,\n signal: options.signal,\n });\n return {\n status: response.status,\n json: () => response.json() as Promise<unknown>,\n text: () => response.text(),\n };\n }\n}\n\n/**\n * n8n invocation mode.\n */\nexport type N8nInvokeMode = \"webhook\" | \"api\";\n\n/**\n * n8n adapter configuration.\n */\nexport interface N8nAdapterOptions {\n /** Injectable HTTP client */\n httpClient?: HttpClient;\n /** n8n API base URL (for API mode) */\n apiBaseUrl?: string;\n /** n8n API key */\n apiKey?: string;\n /** Default invocation mode */\n defaultMode?: N8nInvokeMode;\n /** Threshold in ms: if workflow takes longer, treat as async */\n asyncThresholdMs?: number;\n /** Debug/logging configuration */\n debug?: DebugOptions;\n}\n\n/**\n * n8n workflow invocation result.\n */\ninterface N8nResult {\n /** If async, returns a jobId for polling */\n jobId?: string;\n /** Workflow execution data */\n data?: unknown;\n /** Execution status */\n status?: string;\n}\n\n/**\n * Adapter for n8n workflows.\n * Supports webhook trigger and API invocation modes.\n * Handles idempotency keys and sync/async detection.\n */\nexport class N8nAdapter implements ToolAdapter {\n readonly kind = \"n8n\" as const;\n private readonly httpClient: HttpClient;\n private readonly apiBaseUrl: string;\n private readonly apiKey?: string;\n private readonly defaultMode: N8nInvokeMode;\n private readonly _asyncThresholdMs: number; // Reserved for future async threshold logic\n private readonly idempotencyStore = new Map<string, unknown>(); // Simple dedup store\n private readonly logger: Logger;\n\n constructor(options: N8nAdapterOptions = {}) {\n this.httpClient = options.httpClient ?? new DefaultHttpClient();\n this.apiBaseUrl = options.apiBaseUrl ?? \"http://localhost:5678\";\n this.apiKey = options.apiKey;\n this.defaultMode = options.defaultMode ?? \"webhook\";\n this._asyncThresholdMs = options.asyncThresholdMs ?? 30_000;\n this.logger = createLogger({ ...options.debug, prefix: \"N8nAdapter\" });\n }\n\n /**\n * Invoke an n8n workflow.\n */\n async invoke(\n spec: ToolSpec,\n args: unknown,\n ctx: ExecContext,\n ): Promise<{ result: unknown; raw?: unknown }> {\n if (this.logger.isEnabled(\"debug\")) {\n this.logger.debug(\"invoke.start\", {\n tool: spec.name,\n requestId: ctx.requestId,\n traceId: ctx.traceId,\n args: this.logger.options.includeArgs ? sanitizeForLog(args) : undefined,\n });\n }\n // Check idempotency\n const idempotencyKey = this.buildIdempotencyKey(spec, ctx);\n if (idempotencyKey) {\n const cached = this.idempotencyStore.get(idempotencyKey);\n if (cached !== undefined) {\n this.logger.debug(\"invoke.cache.hit\", {\n tool: spec.name,\n idempotencyKey,\n });\n return { result: cached, raw: { cached: true, idempotencyKey } };\n }\n }\n\n const mode = this.getInvokeMode(spec);\n let raw: unknown;\n\n try {\n if (mode === \"webhook\") {\n raw = await this.invokeWebhook(spec, args, ctx, idempotencyKey);\n } else {\n raw = await this.invokeApi(spec, args, ctx, idempotencyKey);\n }\n\n const result = this.normalizeResult(raw as N8nResult);\n\n // Store idempotency result\n if (idempotencyKey && result) {\n this.idempotencyStore.set(idempotencyKey, result);\n // Auto-cleanup after 1 hour\n setTimeout(() => this.idempotencyStore.delete(idempotencyKey), 3600_000).unref?.();\n }\n\n if (this.logger.isEnabled(\"debug\")) {\n this.logger.debug(\"invoke.ok\", {\n tool: spec.name,\n mode,\n result: this.logger.options.includeResults\n ? summarizeForLog(result)\n : undefined,\n raw: this.logger.options.includeRaw ? summarizeForLog(raw) : undefined,\n });\n }\n\n return { result, raw };\n } catch (error) {\n this.logger.warn(\"invoke.error\", {\n tool: spec.name,\n mode,\n requestId: ctx.requestId,\n traceId: ctx.traceId,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n private async invokeWebhook(\n spec: ToolSpec,\n args: unknown,\n ctx: ExecContext,\n idempotencyKey?: string,\n ): Promise<unknown> {\n const url = spec.endpoint;\n if (!url) {\n throw new Error(`n8n webhook URL not configured for tool: ${spec.name}`);\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (idempotencyKey) {\n headers[\"X-Idempotency-Key\"] = idempotencyKey;\n }\n\n const body: Record<string, unknown> = {\n ...(args && typeof args === \"object\" ? args : { input: args }),\n _metadata: {\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n idempotencyKey,\n },\n };\n\n const response = await this.httpClient.fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n });\n\n if (response.status >= 400) {\n const errorText = await response.text();\n throw new Error(\n `n8n webhook failed (${response.status}): ${errorText.slice(0, 200)}`,\n );\n }\n\n return response.json();\n }\n\n private async invokeApi(\n spec: ToolSpec,\n args: unknown,\n ctx: ExecContext,\n idempotencyKey?: string,\n ): Promise<unknown> {\n const workflowId = spec.resourceId;\n if (!workflowId) {\n throw new Error(`n8n workflowId not configured for tool: ${spec.name}`);\n }\n\n const url = `${this.apiBaseUrl}/api/v1/workflows/${workflowId}/execute`;\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (this.apiKey) {\n headers[\"X-N8N-API-KEY\"] = this.apiKey;\n }\n if (idempotencyKey) {\n headers[\"X-Idempotency-Key\"] = idempotencyKey;\n }\n\n const body = {\n data: args,\n _metadata: {\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n },\n };\n\n const response = await this.httpClient.fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n });\n\n if (response.status >= 400) {\n const errorText = await response.text();\n throw new Error(\n `n8n API failed (${response.status}): ${errorText.slice(0, 200)}`,\n );\n }\n\n return response.json();\n }\n\n private getInvokeMode(spec: ToolSpec): N8nInvokeMode {\n // If endpoint is set, use webhook mode; otherwise use API mode\n if (spec.endpoint) return \"webhook\";\n if (spec.resourceId) return \"api\";\n return this.defaultMode;\n }\n\n private buildIdempotencyKey(spec: ToolSpec, ctx: ExecContext): string | undefined {\n return `${ctx.requestId}:${ctx.taskId}:${spec.name}`;\n }\n\n private normalizeResult(raw: N8nResult): unknown {\n // If it's an async job, return job info\n if (raw.jobId) {\n return { jobId: raw.jobId, status: raw.status ?? \"queued\" };\n }\n // Return data or the raw response\n return raw.data ?? raw;\n }\n}\n","import type { ToolAdapter, ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext } from \"../types/ToolIntent.js\";\nimport { createLogger, sanitizeForLog, summarizeForLog } from \"../observability/Logger.js\";\nimport type { DebugOptions, Logger } from \"../observability/Logger.js\";\n\n/**\n * ComfyUI queue prompt response.\n */\nexport interface ComfyUIQueueResponse {\n prompt_id: string;\n number: number;\n node_errors?: Record<string, unknown>;\n}\n\n/**\n * ComfyUI history entry.\n */\nexport interface ComfyUIHistoryEntry {\n status: { status_str: string; completed: boolean };\n outputs: Record<string, { images?: Array<{ filename: string; subfolder: string; type: string }> }>;\n}\n\n/**\n * Injectable HTTP client for ComfyUI API.\n */\nexport interface ComfyUIHttpClient {\n fetch(\n url: string,\n options: {\n method: string;\n headers?: Record<string, string>;\n body?: string;\n },\n ): Promise<{ status: number; json(): Promise<unknown>; text(): Promise<string> }>;\n}\n\n/**\n * Default HTTP client using global fetch.\n */\nclass DefaultComfyUIHttpClient implements ComfyUIHttpClient {\n async fetch(url: string, options: { method: string; headers?: Record<string, string>; body?: string }) {\n const response = await globalThis.fetch(url, options);\n return {\n status: response.status,\n json: () => response.json() as Promise<unknown>,\n text: () => response.text(),\n };\n }\n}\n\n/**\n * ComfyUI adapter options.\n */\nexport interface ComfyUIAdapterOptions {\n /** Injectable HTTP client */\n httpClient?: ComfyUIHttpClient;\n /** ComfyUI server base URL */\n baseUrl?: string;\n /** Polling interval in ms for async jobs */\n pollIntervalMs?: number;\n /** Max poll attempts before timeout */\n maxPollAttempts?: number;\n /** Client ID for ComfyUI WebSocket */\n clientId?: string;\n /** Debug/logging configuration */\n debug?: DebugOptions;\n}\n\n/**\n * Adapter for ComfyUI image generation workflows.\n * Submits prompts to the queue, polls for completion, and retrieves artifacts.\n */\nexport class ComfyUIAdapter implements ToolAdapter {\n readonly kind = \"comfyui\" as const;\n private readonly httpClient: ComfyUIHttpClient;\n private readonly baseUrl: string;\n private readonly pollIntervalMs: number;\n private readonly maxPollAttempts: number;\n private readonly clientId: string;\n private readonly logger: Logger;\n\n constructor(options: ComfyUIAdapterOptions = {}) {\n this.httpClient = options.httpClient ?? new DefaultComfyUIHttpClient();\n this.baseUrl = options.baseUrl ?? \"http://127.0.0.1:8188\";\n this.pollIntervalMs = options.pollIntervalMs ?? 2000;\n this.maxPollAttempts = options.maxPollAttempts ?? 150; // 5 min at 2s intervals\n this.clientId = options.clientId ?? `tools-${Date.now()}`;\n this.logger = createLogger({ ...options.debug, prefix: \"ComfyUIAdapter\" });\n }\n\n /**\n * Invoke a ComfyUI workflow.\n * Queues the prompt and polls for completion.\n */\n async invoke(\n spec: ToolSpec,\n args: unknown,\n _ctx: ExecContext,\n ): Promise<{ result: unknown; raw?: unknown }> {\n if (this.logger.isEnabled(\"debug\")) {\n this.logger.debug(\"invoke.start\", {\n tool: spec.name,\n args: this.logger.options.includeArgs ? sanitizeForLog(args) : undefined,\n });\n }\n // Build the prompt from the workflow template and args\n const prompt = this.buildPrompt(spec, args);\n\n // Queue the prompt\n try {\n const queueResponse = await this.queuePrompt(prompt);\n\n if (queueResponse.node_errors && Object.keys(queueResponse.node_errors).length > 0) {\n throw new Error(\n `ComfyUI node errors: ${JSON.stringify(queueResponse.node_errors)}`,\n );\n }\n\n // If spec indicates async, return job info immediately\n if (spec.costHints?.isAsync) {\n const asyncResult = {\n jobId: queueResponse.prompt_id,\n status: \"queued\",\n queueNumber: queueResponse.number,\n };\n this.logger.debug(\"invoke.queued\", {\n tool: spec.name,\n result: this.logger.options.includeResults\n ? summarizeForLog(asyncResult)\n : undefined,\n });\n return {\n result: asyncResult,\n raw: queueResponse,\n };\n }\n\n // Otherwise poll for completion\n const history = await this.pollForCompletion(queueResponse.prompt_id);\n const result = this.extractResult(history, queueResponse.prompt_id);\n\n if (this.logger.isEnabled(\"debug\")) {\n this.logger.debug(\"invoke.ok\", {\n tool: spec.name,\n result: this.logger.options.includeResults\n ? summarizeForLog(result)\n : undefined,\n raw: this.logger.options.includeRaw\n ? summarizeForLog(history)\n : undefined,\n });\n }\n\n return { result, raw: history };\n } catch (error) {\n this.logger.warn(\"invoke.error\", {\n tool: spec.name,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n /**\n * Get the status of a queued prompt.\n */\n async getStatus(promptId: string): Promise<{ completed: boolean; status: string }> {\n const history = await this.getHistory(promptId);\n if (!history) {\n return { completed: false, status: \"queued\" };\n }\n return {\n completed: history.status.completed,\n status: history.status.status_str,\n };\n }\n\n /**\n * Get the result of a completed prompt.\n */\n async getResult(promptId: string): Promise<unknown> {\n const history = await this.getHistory(promptId);\n if (!history || !history.status.completed) {\n return undefined;\n }\n return this.extractResult(history, promptId);\n }\n\n private buildPrompt(spec: ToolSpec, args: unknown): object {\n // If args contains a complete prompt workflow, use it directly\n if (args && typeof args === \"object\" && \"prompt\" in args) {\n return (args as Record<string, unknown>).prompt as object;\n }\n\n // If spec has a resourceId pointing to a workflow template,\n // merge args into the template\n if (spec.impl && typeof spec.impl === \"object\") {\n return this.mergeWorkflowArgs(spec.impl as object, args);\n }\n\n // Otherwise treat args as the prompt itself\n return (args as object) ?? {};\n }\n\n private mergeWorkflowArgs(template: object, args: unknown): object {\n if (!args || typeof args !== \"object\") return template;\n\n // Deep merge args into template nodes\n const merged = structuredClone(template) as Record<string, unknown>;\n const argsObj = args as Record<string, unknown>;\n\n for (const [key, value] of Object.entries(argsObj)) {\n // Support node-level overrides: { \"3\": { inputs: { seed: 123 } } }\n if (typeof value === \"object\" && value !== null && key in merged) {\n merged[key] = this.deepMerge(\n merged[key] as Record<string, unknown>,\n value as Record<string, unknown>,\n );\n } else {\n merged[key] = value;\n }\n }\n\n return merged;\n }\n\n private deepMerge(\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n ): Record<string, unknown> {\n const result = { ...target };\n for (const [key, value] of Object.entries(source)) {\n if (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n typeof result[key] === \"object\" &&\n result[key] !== null\n ) {\n result[key] = this.deepMerge(\n result[key] as Record<string, unknown>,\n value as Record<string, unknown>,\n );\n } else {\n result[key] = value;\n }\n }\n return result;\n }\n\n private async queuePrompt(prompt: object): Promise<ComfyUIQueueResponse> {\n const url = `${this.baseUrl}/prompt`;\n const response = await this.httpClient.fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n prompt,\n client_id: this.clientId,\n }),\n });\n\n if (response.status >= 400) {\n const errorText = await response.text();\n throw new Error(\n `ComfyUI queue failed (${response.status}): ${errorText.slice(0, 200)}`,\n );\n }\n\n return (await response.json()) as ComfyUIQueueResponse;\n }\n\n private async getHistory(promptId: string): Promise<ComfyUIHistoryEntry | undefined> {\n const url = `${this.baseUrl}/history/${promptId}`;\n const response = await this.httpClient.fetch(url, { method: \"GET\" });\n\n if (response.status === 404) return undefined;\n if (response.status >= 400) {\n throw new Error(`ComfyUI history failed (${response.status})`);\n }\n\n const data = (await response.json()) as Record<string, ComfyUIHistoryEntry>;\n return data[promptId];\n }\n\n private async pollForCompletion(promptId: string): Promise<ComfyUIHistoryEntry> {\n for (let attempt = 0; attempt < this.maxPollAttempts; attempt++) {\n await this.sleep(this.pollIntervalMs);\n\n const history = await this.getHistory(promptId);\n if (history && history.status.completed) {\n return history;\n }\n }\n\n throw new Error(\n `ComfyUI prompt ${promptId} did not complete within ${this.maxPollAttempts * this.pollIntervalMs}ms`,\n );\n }\n\n private extractResult(history: ComfyUIHistoryEntry, promptId: string): unknown {\n const outputs: Array<{\n nodeId: string;\n images: Array<{ filename: string; url: string }>;\n }> = [];\n\n for (const [nodeId, output] of Object.entries(history.outputs)) {\n if (output.images && output.images.length > 0) {\n outputs.push({\n nodeId,\n images: output.images.map((img) => ({\n filename: img.filename,\n url: `${this.baseUrl}/view?filename=${encodeURIComponent(img.filename)}&subfolder=${encodeURIComponent(img.subfolder)}&type=${encodeURIComponent(img.type)}`,\n })),\n });\n }\n }\n\n return {\n promptId,\n status: history.status.status_str,\n outputs,\n };\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport type { ToolAdapter, ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext } from \"../types/ToolIntent.js\";\nimport type { Evidence } from \"../types/ToolResult.js\";\nimport type { SkillDefinition, SkillResource } from \"../discovery/loaders/SkillManifest.js\";\nimport { createLogger, sanitizeForLog, summarizeForLog } from \"../observability/Logger.js\";\nimport type { DebugOptions, Logger } from \"../observability/Logger.js\";\n\n/**\n * Skill handler function signature.\n * A skill handler provides programmatic execution when bundled scripts need\n * to run as part of skill invocation.\n */\nexport type SkillHandler = (\n args: unknown,\n ctx: SkillContext,\n) => Promise<SkillOutput>;\n\n/**\n * Context passed to skill handlers.\n * Provides access to the skill's progressive disclosure levels and sub-tool invocation.\n */\nexport interface SkillContext {\n requestId: string;\n taskId: string;\n traceId?: string;\n userId?: string;\n\n /** The skill definition with all three disclosure levels */\n skill: SkillInvocationContext;\n\n /** Invoke a sub-tool (if needed by the skill) */\n invokeTool?: (toolName: string, args: unknown) => Promise<unknown>;\n}\n\n/**\n * Skill invocation context providing progressive disclosure access.\n * Mirrors the three-level loading model from the Anthropic spec.\n */\nexport interface SkillInvocationContext {\n /** Level 1: Metadata (name + description) — always available */\n name: string;\n description: string;\n\n /** Level 2: Instructions from SKILL.md body — loaded when triggered */\n instructions: string;\n\n /** Level 3: Resource access — loaded as needed */\n resources: SkillResource[];\n\n /** Read a resource file by relative path */\n readResource: (relativePath: string) => Promise<string>;\n\n /** Get resources filtered by type */\n getResourcesByType: (type: \"instructions\" | \"code\" | \"data\") => SkillResource[];\n\n /** Absolute path to the skill directory (for script execution) */\n dirPath: string;\n}\n\n/**\n * Structured output from a skill handler.\n */\nexport interface SkillOutput {\n result: unknown;\n evidence?: Evidence[];\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Result returned when a skill is invoked in instruction-only mode\n * (no handler function, just SKILL.md content for an agent to consume).\n */\nexport interface SkillInstructionResult {\n /** The skill name */\n name: string;\n /** The skill description */\n description: string;\n /** The full instructions from SKILL.md body */\n instructions: string;\n /** List of available resources with paths and types */\n resources: Array<{\n path: string;\n type: \"instructions\" | \"code\" | \"data\";\n }>;\n /** The skill directory path for resource access */\n dirPath: string;\n}\n\n/**\n * Options for creating a SkillAdapter.\n */\nexport interface SkillAdapterOptions {\n /** Map of skill names to their SkillDefinitions (from SKILL.md) */\n definitions?: Map<string, SkillDefinition>;\n /** Map of skill names to their handler functions (optional per skill) */\n handlers?: Map<string, SkillHandler>;\n /** Optional sub-tool invoker for skills that need to call other tools */\n toolInvoker?: (toolName: string, args: unknown, ctx: ExecContext) => Promise<unknown>;\n /** Debug/logging configuration */\n debug?: DebugOptions;\n}\n\n/**\n * Adapter for SKILL type tools following Anthropic's Agent Skills specification.\n *\n * Implements the three-level progressive disclosure model:\n * - Level 1 (metadata): name + description, used for discovery (~100 tokens)\n * - Level 2 (instructions): SKILL.md body, loaded when skill is triggered (<5k tokens)\n * - Level 3 (resources): bundled files, loaded as needed (unlimited)\n *\n * Skills can operate in two modes:\n * 1. **Instruction-only**: Returns SKILL.md content for an agent/model to consume\n * 2. **Handler mode**: Executes a bundled handler function with full context\n *\n * This implementation is model-agnostic — any model can consume the skill instructions.\n *\n * @see https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview\n */\nexport class SkillAdapter implements ToolAdapter {\n readonly kind = \"skill\" as const;\n private readonly definitions: Map<string, SkillDefinition>;\n private readonly handlers: Map<string, SkillHandler>;\n private readonly toolInvoker?: (\n toolName: string,\n args: unknown,\n ctx: ExecContext,\n ) => Promise<unknown>;\n private readonly logger: Logger;\n\n constructor(options: SkillAdapterOptions = {}) {\n this.definitions = options.definitions ?? new Map();\n this.handlers = options.handlers ?? new Map();\n this.toolInvoker = options.toolInvoker;\n this.logger = createLogger({ ...options.debug, prefix: \"SkillAdapter\" });\n }\n\n /**\n * Register a skill definition (from SKILL.md parsing).\n */\n registerSkill(name: string, definition: SkillDefinition, handler?: SkillHandler): void {\n this.definitions.set(name, definition);\n if (handler) {\n this.handlers.set(name, handler);\n }\n }\n\n /**\n * Unregister a skill.\n */\n unregisterSkill(name: string): boolean {\n this.handlers.delete(name);\n return this.definitions.delete(name);\n }\n\n /**\n * List registered skills with Level 1 metadata.\n * Returns ToolSpecs with name and description from YAML frontmatter.\n */\n async listTools(): Promise<ToolSpec[]> {\n const specs: ToolSpec[] = [];\n for (const [name, def] of this.definitions.entries()) {\n specs.push({\n name,\n version: \"1.0.0\",\n kind: \"skill\",\n description: def.frontmatter.description,\n inputSchema: { type: \"object\", additionalProperties: true },\n outputSchema: { type: \"object\", additionalProperties: true },\n capabilities: [],\n });\n }\n return specs;\n }\n\n /**\n * Get Level 1 metadata for all registered skills.\n * This is what gets loaded at startup (~100 tokens per skill).\n */\n getMetadata(): Array<{ name: string; description: string }> {\n const metadata: Array<{ name: string; description: string }> = [];\n for (const def of this.definitions.values()) {\n metadata.push({\n name: def.frontmatter.name,\n description: def.frontmatter.description,\n });\n }\n return metadata;\n }\n\n /**\n * Get Level 2 instructions for a specific skill.\n * This is loaded when the skill is triggered.\n */\n getInstructions(name: string): string | undefined {\n return this.definitions.get(name)?.instructions;\n }\n\n /**\n * Get Level 3 resources for a specific skill.\n */\n getResources(name: string): SkillResource[] {\n return this.definitions.get(name)?.resources ?? [];\n }\n\n /**\n * Read a specific resource file from a skill.\n */\n async readResource(skillName: string, relativePath: string): Promise<string> {\n const def = this.definitions.get(skillName);\n if (!def) {\n throw new Error(`Skill not found: ${skillName}`);\n }\n\n const resource = def.resources.find((r) => r.relativePath === relativePath);\n if (!resource) {\n throw new Error(\n `Resource not found: ${relativePath} in skill ${skillName}. ` +\n `Available: ${def.resources.map((r) => r.relativePath).join(\", \")}`,\n );\n }\n\n return readFile(resource.absolutePath, \"utf-8\");\n }\n\n /**\n * Invoke a skill.\n *\n * If the skill has a handler function, executes it with full context.\n * Otherwise, returns the skill's instruction content (Level 2 + Level 3 manifest)\n * for an agent/model to consume and act upon.\n */\n async invoke(\n spec: ToolSpec,\n args: unknown,\n ctx: ExecContext,\n ): Promise<{ result: unknown; raw?: unknown }> {\n if (this.logger.isEnabled(\"debug\")) {\n this.logger.debug(\"invoke.start\", {\n tool: spec.name,\n requestId: ctx.requestId,\n traceId: ctx.traceId,\n args: this.logger.options.includeArgs ? sanitizeForLog(args) : undefined,\n });\n }\n const def = this.resolveDefinition(spec);\n if (!def) {\n throw new Error(\n `Skill definition not found: ${spec.name}. ` +\n `Register with registerSkill() or ensure SKILL.md is loaded.`,\n );\n }\n\n const handler = this.resolveHandler(spec);\n\n try {\n if (handler) {\n // Handler mode: execute the handler with full context\n const result = await this.invokeWithHandler(spec, def, handler, args, ctx);\n this.logger.debug(\"invoke.ok\", {\n tool: spec.name,\n mode: \"handler\",\n result: this.logger.options.includeResults\n ? summarizeForLog(result.result)\n : undefined,\n });\n return result;\n }\n\n // Instruction-only mode: return skill content for agent consumption\n const result = this.invokeInstructionOnly(def);\n this.logger.debug(\"invoke.ok\", {\n tool: spec.name,\n mode: \"instruction\",\n result: this.logger.options.includeResults\n ? summarizeForLog(result.result)\n : undefined,\n });\n return result;\n } catch (error) {\n this.logger.warn(\"invoke.error\", {\n tool: spec.name,\n requestId: ctx.requestId,\n traceId: ctx.traceId,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n private async invokeWithHandler(\n spec: ToolSpec,\n def: SkillDefinition,\n handler: SkillHandler,\n args: unknown,\n ctx: ExecContext,\n ): Promise<{ result: unknown; raw?: unknown }> {\n const skillCtx: SkillContext = {\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n traceId: ctx.traceId,\n userId: ctx.userId,\n skill: this.buildInvocationContext(def),\n invokeTool: this.toolInvoker\n ? (toolName, toolArgs) => this.toolInvoker!(toolName, toolArgs, ctx)\n : undefined,\n };\n\n const output = await handler(args, skillCtx);\n\n if (!output || typeof output !== \"object\" || !(\"result\" in output)) {\n throw new Error(\n `Skill ${spec.name} handler must return { result, evidence? } but returned: ${typeof output}`,\n );\n }\n\n return {\n result: output.result,\n raw: {\n evidence: output.evidence,\n metadata: output.metadata,\n },\n };\n }\n\n private invokeInstructionOnly(\n def: SkillDefinition,\n ): { result: unknown; raw?: unknown } {\n const instructionResult: SkillInstructionResult = {\n name: def.frontmatter.name,\n description: def.frontmatter.description,\n instructions: def.instructions,\n resources: def.resources.map((r) => ({\n path: r.relativePath,\n type: r.type,\n })),\n dirPath: def.dirPath,\n };\n\n return {\n result: instructionResult,\n raw: { mode: \"instruction-only\", resourceCount: def.resources.length },\n };\n }\n\n private buildInvocationContext(def: SkillDefinition): SkillInvocationContext {\n return {\n name: def.frontmatter.name,\n description: def.frontmatter.description,\n instructions: def.instructions,\n resources: def.resources,\n dirPath: def.dirPath,\n readResource: async (relativePath: string) => {\n const resource = def.resources.find((r) => r.relativePath === relativePath);\n if (!resource) {\n throw new Error(\n `Resource not found: ${relativePath}. ` +\n `Available: ${def.resources.map((r) => r.relativePath).join(\", \")}`,\n );\n }\n return readFile(resource.absolutePath, \"utf-8\");\n },\n getResourcesByType: (type) => {\n return def.resources.filter((r) => r.type === type);\n },\n };\n }\n\n private resolveDefinition(spec: ToolSpec): SkillDefinition | undefined {\n // Check if spec.impl is a SkillDefinition (set by DirectoryScanner)\n if (spec.impl && typeof spec.impl === \"object\" && \"frontmatter\" in (spec.impl as object)) {\n return spec.impl as unknown as SkillDefinition;\n }\n return this.definitions.get(spec.name);\n }\n\n private resolveHandler(spec: ToolSpec): SkillHandler | undefined {\n // Check if spec carries a handler reference\n if (spec.impl && typeof spec.impl === \"object\") {\n const implObj = spec.impl as { handler?: unknown };\n if (typeof implObj.handler === \"function\") {\n return implObj.handler as SkillHandler;\n }\n }\n return this.handlers.get(spec.name);\n }\n}\n","import type { ToolAdapter, ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext } from \"../types/ToolIntent.js\";\nimport type { CoreToolHandler, CoreToolContext, CoreToolsConfig } from \"./types.js\";\n\n/**\n * Adapter for core tools (kind=\"core\").\n * Dispatches to registered handler functions by tool name.\n *\n * Core tools are local, atomic operations (filesystem, HTTP, utilities)\n * that enforce their own security constraints (sandbox, SSRF) in addition\n * to the PolicyEngine capability gating.\n */\nexport class CoreAdapter implements ToolAdapter {\n readonly kind = \"core\" as const;\n private readonly handlers = new Map<string, CoreToolHandler>();\n private readonly config: CoreToolsConfig;\n\n constructor(config: CoreToolsConfig) {\n this.config = config;\n }\n\n /**\n * Register a handler for a specific core tool name.\n */\n registerHandler(toolName: string, handler: CoreToolHandler): void {\n this.handlers.set(toolName, handler);\n }\n\n /**\n * Unregister a handler.\n */\n unregisterHandler(toolName: string): boolean {\n return this.handlers.delete(toolName);\n }\n\n /**\n * List registered core tool names.\n */\n getRegisteredTools(): string[] {\n return Array.from(this.handlers.keys());\n }\n\n /**\n * Invoke dispatches to the appropriate handler by spec.name.\n */\n async invoke(\n spec: ToolSpec,\n args: unknown,\n ctx: ExecContext,\n ): Promise<{ result: unknown; raw?: unknown }> {\n const handler = this.handlers.get(spec.name);\n if (!handler) {\n throw new Error(\n `Core tool handler not found: ${spec.name}. Available: [${this.getRegisteredTools().join(\", \")}]`,\n );\n }\n\n const coreCtx: CoreToolContext = {\n execCtx: ctx,\n config: this.config,\n };\n\n const output = await handler(args as Record<string, unknown>, coreCtx);\n\n return {\n result: output.result,\n raw: { evidence: output.evidence },\n };\n }\n}\n","import type { ExecContext } from \"../types/ToolIntent.js\";\nimport type { Evidence } from \"../types/ToolResult.js\";\n\n/**\n * Configuration for core tools runtime.\n */\nexport interface CoreToolsConfig {\n /** Absolute path. All FS operations are confined within this root. */\n sandboxRoot: string;\n /** Only these hosts may be fetched. Supports wildcard prefix (e.g. \"*.github.com\"). */\n allowedHosts: string[];\n /** Maximum bytes for fs.readText (default: 5MB) */\n maxReadBytes: number;\n /** Maximum bytes for HTTP response body (default: 5MB) */\n maxHttpBytes: number;\n /** Maximum bytes for http.downloadFile (default: 100MB) */\n maxDownloadBytes: number;\n /** CIDR ranges to block. Defaults include RFC1918 + loopback + link-local. */\n blockedCidrs: string[];\n /** Default HTTP timeout in ms (default: 15000) */\n defaultTimeoutMs: number;\n /** User-Agent header for HTTP requests */\n httpUserAgent: string;\n /** If true, large HTTP responses are auto-written to sandbox and a file ref is returned */\n enableAutoWriteLargeResponses: boolean;\n}\n\n/**\n * Default configuration values for core tools.\n */\nexport const DEFAULT_CORE_TOOLS_CONFIG: Omit<CoreToolsConfig, \"sandboxRoot\" | \"allowedHosts\"> = {\n maxReadBytes: 5 * 1024 * 1024,\n maxHttpBytes: 5 * 1024 * 1024,\n maxDownloadBytes: 100 * 1024 * 1024,\n blockedCidrs: [\n \"127.0.0.0/8\",\n \"10.0.0.0/8\",\n \"172.16.0.0/12\",\n \"192.168.0.0/16\",\n \"169.254.0.0/16\",\n \"::1/128\",\n \"fc00::/7\",\n \"fe80::/10\",\n ],\n defaultTimeoutMs: 15_000,\n httpUserAgent: \"agent-tool-hub-core/1.0\",\n enableAutoWriteLargeResponses: false,\n};\n\n/**\n * Context passed to each core tool handler.\n */\nexport interface CoreToolContext {\n execCtx: ExecContext;\n config: CoreToolsConfig;\n}\n\n/**\n * Structured result from a core tool handler.\n */\nexport interface CoreToolResult {\n result: unknown;\n evidence: Evidence[];\n}\n\n/**\n * A core tool handler function.\n */\nexport type CoreToolHandler = (\n args: Record<string, unknown>,\n ctx: CoreToolContext,\n) => Promise<CoreToolResult>;\n","import { resolve, normalize, dirname, basename } from \"node:path\";\nimport { realpath, access } from \"node:fs/promises\";\nimport { createTaggedError } from \"../../core/Retry.js\";\n\n/**\n * Resolve an input path to an absolute path within the sandbox.\n * Throws PATH_OUTSIDE_SANDBOX if the resolved path escapes the sandbox root.\n *\n * For existing files: uses realpath to resolve symlinks.\n * For non-existing files (write targets): resolves the parent directory.\n */\nexport async function resolveSandboxedPath(\n inputPath: string,\n sandboxRoot: string,\n): Promise<string> {\n // Resolve the sandbox root itself with realpath to handle platform symlinks\n // (e.g. macOS /var -> /private/var)\n let normalizedRoot: string;\n try {\n normalizedRoot = await realpath(resolve(sandboxRoot));\n } catch {\n normalizedRoot = normalize(resolve(sandboxRoot));\n }\n\n // Resolve against sandbox root\n const resolved = resolve(normalizedRoot, inputPath);\n\n let real: string;\n try {\n // Try to resolve symlinks for existing paths\n await access(resolved);\n real = await realpath(resolved);\n } catch {\n // Path does not exist — resolve parent to check containment\n const parentDir = dirname(resolved);\n let realParent: string;\n try {\n await access(parentDir);\n realParent = await realpath(parentDir);\n } catch {\n // Parent also doesn't exist — use normalized resolved path\n // (will fail at actual FS operation if truly invalid)\n realParent = normalize(parentDir);\n }\n real = resolve(realParent, basename(resolved));\n }\n\n if (!isWithinRoot(real, normalizedRoot)) {\n throw createTaggedError(\n \"PATH_OUTSIDE_SANDBOX\",\n `Path \"${inputPath}\" resolves to \"${real}\" which is outside sandbox \"${normalizedRoot}\"`,\n { inputPath, resolvedPath: real, sandboxRoot: normalizedRoot },\n );\n }\n\n return real;\n}\n\nfunction isWithinRoot(path: string, root: string): boolean {\n const normalizedPath = normalize(path);\n const normalizedRoot = normalize(root);\n return normalizedPath === normalizedRoot || normalizedPath.startsWith(normalizedRoot + \"/\");\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport type { ToolSpec } from \"../../types/ToolSpec.js\";\nimport type { CoreToolHandler } from \"../types.js\";\nimport { resolveSandboxedPath } from \"../security/sandbox.js\";\nimport { createTaggedError } from \"../../core/Retry.js\";\n\nexport const readTextInputSchema = {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"File path relative to sandbox root\" },\n maxBytes: {\n type: \"integer\",\n minimum: 1024,\n maximum: 10485760,\n description: \"Maximum bytes to read (default: from config)\",\n },\n },\n required: [\"path\"],\n additionalProperties: false,\n} as const;\n\nexport const readTextOutputSchema = {\n type: \"object\",\n properties: {\n path: { type: \"string\" },\n text: { type: \"string\" },\n bytes: { type: \"integer\" },\n },\n required: [\"path\", \"text\", \"bytes\"],\n additionalProperties: false,\n} as const;\n\nexport const readTextSpec: ToolSpec = {\n name: \"core/fs.readText\",\n version: \"1.0.0\",\n kind: \"core\",\n description: \"Read a UTF-8 text file from the sandbox\",\n tags: [\"filesystem\", \"read\", \"core\"],\n inputSchema: readTextInputSchema,\n outputSchema: readTextOutputSchema,\n capabilities: [\"read:fs\"],\n};\n\nexport const readTextHandler: CoreToolHandler = async (args, ctx) => {\n const inputPath = args.path as string;\n const maxBytes = (args.maxBytes as number | undefined) ?? ctx.config.maxReadBytes;\n\n const resolvedPath = await resolveSandboxedPath(inputPath, ctx.config.sandboxRoot);\n\n const fileStat = await stat(resolvedPath);\n if (fileStat.size > maxBytes) {\n throw createTaggedError(\n \"FILE_TOO_LARGE\",\n `File size ${fileStat.size} bytes exceeds limit of ${maxBytes} bytes`,\n { path: resolvedPath, size: fileStat.size, limit: maxBytes },\n );\n }\n\n const text = await readFile(resolvedPath, \"utf-8\");\n\n return {\n result: {\n path: resolvedPath,\n text,\n bytes: fileStat.size,\n },\n evidence: [\n {\n type: \"file\",\n ref: resolvedPath,\n summary: `Read ${fileStat.size} bytes from ${resolvedPath}`,\n createdAt: new Date().toISOString(),\n },\n ],\n };\n};\n","import { writeFile, mkdir } from \"node:fs/promises\";\nimport { createHash } from \"node:crypto\";\nimport { dirname } from \"node:path\";\nimport type { ToolSpec } from \"../../types/ToolSpec.js\";\nimport type { CoreToolHandler } from \"../types.js\";\nimport { resolveSandboxedPath } from \"../security/sandbox.js\";\n\nexport const writeTextInputSchema = {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"File path relative to sandbox root\" },\n text: { type: \"string\", description: \"UTF-8 text content to write\" },\n overwrite: {\n type: \"boolean\",\n default: false,\n description: \"Allow overwriting existing files\",\n },\n mkdirp: {\n type: \"boolean\",\n default: true,\n description: \"Create parent directories if they do not exist\",\n },\n },\n required: [\"path\", \"text\"],\n additionalProperties: false,\n} as const;\n\nexport const writeTextOutputSchema = {\n type: \"object\",\n properties: {\n path: { type: \"string\" },\n bytes: { type: \"integer\" },\n sha256: { type: \"string\" },\n },\n required: [\"path\", \"bytes\", \"sha256\"],\n additionalProperties: false,\n} as const;\n\nexport const writeTextSpec: ToolSpec = {\n name: \"core/fs.writeText\",\n version: \"1.0.0\",\n kind: \"core\",\n description: \"Write UTF-8 text to a file in the sandbox\",\n tags: [\"filesystem\", \"write\", \"core\"],\n inputSchema: writeTextInputSchema,\n outputSchema: writeTextOutputSchema,\n capabilities: [\"write:fs\"],\n};\n\nexport const writeTextHandler: CoreToolHandler = async (args, ctx) => {\n const inputPath = args.path as string;\n const text = args.text as string;\n const overwrite = (args.overwrite as boolean | undefined) ?? false;\n const mkdirp = (args.mkdirp as boolean | undefined) ?? true;\n\n const resolvedPath = await resolveSandboxedPath(inputPath, ctx.config.sandboxRoot);\n\n // Check overwrite\n if (!overwrite) {\n const { access } = await import(\"node:fs/promises\");\n try {\n await access(resolvedPath);\n throw new Error(\n `File already exists: ${resolvedPath}. Set overwrite=true to allow overwriting.`,\n );\n } catch (err) {\n // File not found is expected — proceed\n if (err instanceof Error && !err.message.includes(\"already exists\")) {\n // access threw ENOENT — file doesn't exist, continue\n } else {\n throw err;\n }\n }\n }\n\n // Create parent directories if needed\n if (mkdirp) {\n await mkdir(dirname(resolvedPath), { recursive: true });\n }\n\n // Write file\n await writeFile(resolvedPath, text, \"utf-8\");\n\n const bytes = Buffer.byteLength(text, \"utf-8\");\n const sha256 = createHash(\"sha256\").update(text).digest(\"hex\");\n\n return {\n result: {\n path: resolvedPath,\n bytes,\n sha256,\n },\n evidence: [\n {\n type: \"file\",\n ref: resolvedPath,\n summary: `Wrote ${bytes} bytes to ${resolvedPath} (sha256: ${sha256.slice(0, 12)}...)`,\n createdAt: new Date().toISOString(),\n },\n ],\n };\n};\n","import { readdir, stat } from \"node:fs/promises\";\nimport { resolve, join } from \"node:path\";\nimport type { ToolSpec } from \"../../types/ToolSpec.js\";\nimport type { CoreToolHandler } from \"../types.js\";\nimport { resolveSandboxedPath } from \"../security/sandbox.js\";\n\nexport const listDirInputSchema = {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"Directory path relative to sandbox root\" },\n maxEntries: {\n type: \"integer\",\n minimum: 1,\n maximum: 5000,\n default: 2000,\n description: \"Maximum number of entries to return\",\n },\n includeHidden: {\n type: \"boolean\",\n default: false,\n description: \"Include hidden files (starting with .)\",\n },\n recursive: {\n type: \"boolean\",\n default: false,\n description: \"Recurse into subdirectories\",\n },\n maxDepth: {\n type: \"integer\",\n minimum: 1,\n maximum: 10,\n default: 5,\n description: \"Maximum recursion depth (only used when recursive=true)\",\n },\n },\n required: [\"path\"],\n additionalProperties: false,\n} as const;\n\ninterface DirEntry {\n name: string;\n type: \"file\" | \"directory\" | \"symlink\" | \"other\";\n size: number;\n mtime: string;\n}\n\nexport const listDirOutputSchema = {\n type: \"object\",\n properties: {\n path: { type: \"string\" },\n entries: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n type: { type: \"string\", enum: [\"file\", \"directory\", \"symlink\", \"other\"] },\n size: { type: \"integer\" },\n mtime: { type: \"string\" },\n },\n required: [\"name\", \"type\", \"size\", \"mtime\"],\n additionalProperties: false,\n },\n },\n totalEntries: { type: \"integer\" },\n truncated: { type: \"boolean\" },\n },\n required: [\"path\", \"entries\", \"totalEntries\", \"truncated\"],\n additionalProperties: false,\n} as const;\n\nexport const listDirSpec: ToolSpec = {\n name: \"core/fs.listDir\",\n version: \"1.0.0\",\n kind: \"core\",\n description: \"List directory contents in the sandbox\",\n tags: [\"filesystem\", \"read\", \"core\"],\n inputSchema: listDirInputSchema,\n outputSchema: listDirOutputSchema,\n capabilities: [\"read:fs\"],\n};\n\nexport const listDirHandler: CoreToolHandler = async (args, ctx) => {\n const inputPath = args.path as string;\n const maxEntries = (args.maxEntries as number | undefined) ?? 2000;\n const includeHidden = (args.includeHidden as boolean | undefined) ?? false;\n const recursive = (args.recursive as boolean | undefined) ?? false;\n const maxDepth = (args.maxDepth as number | undefined) ?? 5;\n\n const resolvedPath = await resolveSandboxedPath(inputPath, ctx.config.sandboxRoot);\n\n const entries: DirEntry[] = [];\n let truncated = false;\n\n await walkDir(resolvedPath, \"\", entries, {\n maxEntries,\n includeHidden,\n recursive,\n maxDepth,\n currentDepth: 0,\n onTruncate: () => { truncated = true; },\n });\n\n return {\n result: {\n path: resolvedPath,\n entries,\n totalEntries: entries.length,\n truncated,\n },\n evidence: [\n {\n type: \"tool\",\n ref: `core/fs.listDir:${resolvedPath}`,\n summary: `Listed ${entries.length} entries in ${resolvedPath}${truncated ? \" (truncated)\" : \"\"}`,\n createdAt: new Date().toISOString(),\n },\n ],\n };\n};\n\ninterface WalkOptions {\n maxEntries: number;\n includeHidden: boolean;\n recursive: boolean;\n maxDepth: number;\n currentDepth: number;\n onTruncate: () => void;\n}\n\nasync function walkDir(\n basePath: string,\n relativePath: string,\n entries: DirEntry[],\n options: WalkOptions,\n): Promise<void> {\n if (entries.length >= options.maxEntries) {\n options.onTruncate();\n return;\n }\n\n const fullPath = relativePath ? resolve(basePath, relativePath) : basePath;\n const dirEntries = await readdir(fullPath, { withFileTypes: true });\n\n for (const dirent of dirEntries) {\n if (entries.length >= options.maxEntries) {\n options.onTruncate();\n return;\n }\n\n if (!options.includeHidden && dirent.name.startsWith(\".\")) {\n continue;\n }\n\n const entryPath = join(fullPath, dirent.name);\n const entryRelative = relativePath ? join(relativePath, dirent.name) : dirent.name;\n\n let entryType: DirEntry[\"type\"];\n if (dirent.isSymbolicLink()) {\n entryType = \"symlink\";\n } else if (dirent.isDirectory()) {\n entryType = \"directory\";\n } else if (dirent.isFile()) {\n entryType = \"file\";\n } else {\n entryType = \"other\";\n }\n\n let size = 0;\n let mtime = \"\";\n try {\n const entryStat = await stat(entryPath);\n size = entryStat.size;\n mtime = entryStat.mtime.toISOString();\n } catch {\n // Best effort stat\n }\n\n entries.push({\n name: entryRelative,\n type: entryType,\n size,\n mtime,\n });\n\n // Recurse into directories\n if (\n options.recursive &&\n entryType === \"directory\" &&\n options.currentDepth < options.maxDepth\n ) {\n await walkDir(basePath, entryRelative, entries, {\n ...options,\n currentDepth: options.currentDepth + 1,\n });\n }\n }\n}\n","import { readdir, stat } from \"node:fs/promises\";\nimport { createReadStream } from \"node:fs\";\nimport { createInterface } from \"node:readline\";\nimport { join, relative } from \"node:path\";\nimport type { ToolSpec } from \"../../types/ToolSpec.js\";\nimport type { CoreToolHandler } from \"../types.js\";\nimport { resolveSandboxedPath } from \"../security/sandbox.js\";\n\nexport const searchTextInputSchema = {\n type: \"object\",\n properties: {\n root: { type: \"string\", description: \"Directory path relative to sandbox root\" },\n query: { type: \"string\", description: \"Text pattern to search for (plain string or regex)\" },\n glob: {\n type: \"string\",\n default: \"**/*.{md,txt,log,json,ts,js,py,java,scala}\",\n description: \"Glob pattern to filter files\",\n },\n maxMatches: {\n type: \"integer\",\n minimum: 1,\n maximum: 5000,\n default: 100,\n description: \"Maximum number of matches to return\",\n },\n maxFiles: {\n type: \"integer\",\n minimum: 1,\n maximum: 2000,\n default: 500,\n description: \"Maximum number of files to scan\",\n },\n },\n required: [\"root\", \"query\"],\n additionalProperties: false,\n} as const;\n\ninterface SearchMatch {\n file: string;\n lineNo: number;\n excerpt: string;\n}\n\nexport const searchTextOutputSchema = {\n type: \"object\",\n properties: {\n root: { type: \"string\" },\n query: { type: \"string\" },\n matches: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n file: { type: \"string\" },\n lineNo: { type: \"integer\" },\n excerpt: { type: \"string\" },\n },\n required: [\"file\", \"lineNo\", \"excerpt\"],\n additionalProperties: false,\n },\n },\n totalMatches: { type: \"integer\" },\n filesScanned: { type: \"integer\" },\n truncated: { type: \"boolean\" },\n },\n required: [\"root\", \"query\", \"matches\", \"totalMatches\", \"filesScanned\", \"truncated\"],\n additionalProperties: false,\n} as const;\n\nexport const searchTextSpec: ToolSpec = {\n name: \"core/fs.searchText\",\n version: \"1.0.0\",\n kind: \"core\",\n description: \"Search for text patterns in files within the sandbox\",\n tags: [\"filesystem\", \"search\", \"core\"],\n inputSchema: searchTextInputSchema,\n outputSchema: searchTextOutputSchema,\n capabilities: [\"read:fs\"],\n};\n\nexport const searchTextHandler: CoreToolHandler = async (args, ctx) => {\n const rootPath = args.root as string;\n const query = args.query as string;\n const glob = (args.glob as string | undefined) ?? \"**/*.{md,txt,log,json,ts,js,py,java,scala}\";\n const maxMatches = (args.maxMatches as number | undefined) ?? 100;\n const maxFiles = (args.maxFiles as number | undefined) ?? 500;\n\n const resolvedRoot = await resolveSandboxedPath(rootPath, ctx.config.sandboxRoot);\n\n // Build regex from query\n let regex: RegExp;\n try {\n regex = new RegExp(query, \"i\");\n } catch {\n // If not a valid regex, escape and use as literal\n regex = new RegExp(escapeRegExp(query), \"i\");\n }\n\n // Collect matching file extensions from glob\n const extensions = parseGlobExtensions(glob);\n\n // Walk directory and collect files\n const files: string[] = [];\n await collectFiles(resolvedRoot, files, { maxFiles, extensions });\n\n // Search through files\n const matches: SearchMatch[] = [];\n let filesScanned = 0;\n let truncated = false;\n\n for (const filePath of files) {\n if (matches.length >= maxMatches) {\n truncated = true;\n break;\n }\n filesScanned++;\n await searchFile(filePath, resolvedRoot, regex, matches, maxMatches);\n }\n\n if (matches.length >= maxMatches) {\n truncated = true;\n }\n\n return {\n result: {\n root: resolvedRoot,\n query,\n matches,\n totalMatches: matches.length,\n filesScanned,\n truncated,\n },\n evidence: [\n {\n type: \"tool\",\n ref: `core/fs.searchText:${resolvedRoot}`,\n summary: `Found ${matches.length} matches in ${filesScanned} files under ${resolvedRoot}${truncated ? \" (truncated)\" : \"\"}`,\n createdAt: new Date().toISOString(),\n },\n ],\n };\n};\n\nasync function collectFiles(\n dirPath: string,\n files: string[],\n options: { maxFiles: number; extensions: Set<string> },\n): Promise<void> {\n if (files.length >= options.maxFiles) return;\n\n let entries;\n try {\n entries = await readdir(dirPath, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (files.length >= options.maxFiles) return;\n\n const fullPath = join(dirPath, entry.name);\n\n if (entry.isDirectory()) {\n if (entry.name.startsWith(\".\") || entry.name === \"node_modules\") continue;\n await collectFiles(fullPath, files, options);\n } else if (entry.isFile()) {\n if (options.extensions.size > 0) {\n const ext = getExtension(entry.name);\n if (!ext || !options.extensions.has(ext)) continue;\n }\n files.push(fullPath);\n }\n }\n}\n\nasync function searchFile(\n filePath: string,\n root: string,\n regex: RegExp,\n matches: SearchMatch[],\n maxMatches: number,\n): Promise<void> {\n const fileStat = await stat(filePath).catch(() => null);\n // Skip large files (>1MB)\n if (!fileStat || fileStat.size > 1024 * 1024) return;\n\n const stream = createReadStream(filePath, { encoding: \"utf-8\" });\n const rl = createInterface({ input: stream, crlfDelay: Infinity });\n\n let lineNo = 0;\n for await (const line of rl) {\n lineNo++;\n if (matches.length >= maxMatches) {\n stream.destroy();\n break;\n }\n if (regex.test(line)) {\n matches.push({\n file: relative(root, filePath),\n lineNo,\n excerpt: line.slice(0, 200),\n });\n }\n }\n}\n\nfunction parseGlobExtensions(glob: string): Set<string> {\n const extensions = new Set<string>();\n // Match patterns like *.{ts,js,py} or *.ts\n const braceMatch = glob.match(/\\*\\.\\{([^}]+)\\}/);\n if (braceMatch) {\n for (const ext of braceMatch[1]!.split(\",\")) {\n extensions.add(ext.trim());\n }\n } else {\n const simpleMatch = glob.match(/\\*\\.(\\w+)/);\n if (simpleMatch) {\n extensions.add(simpleMatch[1]!);\n }\n }\n return extensions;\n}\n\nfunction getExtension(filename: string): string | null {\n const dotIdx = filename.lastIndexOf(\".\");\n if (dotIdx === -1 || dotIdx === 0) return null;\n return filename.slice(dotIdx + 1);\n}\n\nfunction escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import { createReadStream } from \"node:fs\";\nimport { stat } from \"node:fs/promises\";\nimport { createHash } from \"node:crypto\";\nimport type { ToolSpec } from \"../../types/ToolSpec.js\";\nimport type { CoreToolHandler } from \"../types.js\";\nimport { resolveSandboxedPath } from \"../security/sandbox.js\";\n\nexport const sha256InputSchema = {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"File path relative to sandbox root\" },\n },\n required: [\"path\"],\n additionalProperties: false,\n} as const;\n\nexport const sha256OutputSchema = {\n type: \"object\",\n properties: {\n sha256: { type: \"string\" },\n path: { type: \"string\" },\n bytes: { type: \"integer\" },\n },\n required: [\"sha256\", \"path\", \"bytes\"],\n additionalProperties: false,\n} as const;\n\nexport const sha256Spec: ToolSpec = {\n name: \"core/fs.sha256\",\n version: \"1.0.0\",\n kind: \"core\",\n description: \"Compute SHA-256 hash of a file in the sandbox\",\n tags: [\"filesystem\", \"hash\", \"core\"],\n inputSchema: sha256InputSchema,\n outputSchema: sha256OutputSchema,\n capabilities: [\"read:fs\"],\n};\n\nexport const sha256Handler: CoreToolHandler = async (args, ctx) => {\n const inputPath = args.path as string;\n\n const resolvedPath = await resolveSandboxedPath(inputPath, ctx.config.sandboxRoot);\n const fileStat = await stat(resolvedPath);\n\n const hash = await new Promise<string>((resolve, reject) => {\n const hasher = createHash(\"sha256\");\n const stream = createReadStream(resolvedPath);\n stream.on(\"data\", (chunk) => hasher.update(chunk));\n stream.on(\"end\", () => resolve(hasher.digest(\"hex\")));\n stream.on(\"error\", reject);\n });\n\n return {\n result: {\n sha256: hash,\n path: resolvedPath,\n bytes: fileStat.size,\n },\n evidence: [\n {\n type: \"file\",\n ref: resolvedPath,\n summary: `SHA-256 of ${resolvedPath} (${fileStat.size} bytes): ${hash.slice(0, 16)}...`,\n createdAt: new Date().toISOString(),\n },\n ],\n };\n};\n","import { rm, unlink, rmdir, stat } from \"node:fs/promises\";\nimport type { ToolSpec } from \"../../types/ToolSpec.js\";\nimport type { CoreToolHandler } from \"../types.js\";\nimport { resolveSandboxedPath } from \"../security/sandbox.js\";\n\nexport const deletePathInputSchema = {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"File or directory path relative to sandbox root\" },\n recursive: {\n type: \"boolean\",\n default: false,\n description: \"Recursively delete directory contents\",\n },\n confirm: {\n type: \"boolean\",\n description: \"Must be true to confirm deletion (safety gate)\",\n },\n },\n required: [\"path\", \"confirm\"],\n additionalProperties: false,\n} as const;\n\nexport const deletePathOutputSchema = {\n type: \"object\",\n properties: {\n path: { type: \"string\" },\n deleted: { type: \"boolean\" },\n type: { type: \"string\", enum: [\"file\", \"directory\"] },\n },\n required: [\"path\", \"deleted\", \"type\"],\n additionalProperties: false,\n} as const;\n\nexport const deletePathSpec: ToolSpec = {\n name: \"core/fs.deletePath\",\n version: \"1.0.0\",\n kind: \"core\",\n description: \"Delete a file or directory in the sandbox (dangerous, requires explicit confirmation)\",\n tags: [\"filesystem\", \"delete\", \"dangerous\", \"core\"],\n inputSchema: deletePathInputSchema,\n outputSchema: deletePathOutputSchema,\n capabilities: [\"danger:destructive\", \"write:fs\"],\n};\n\nexport const deletePathHandler: CoreToolHandler = async (args, ctx) => {\n const inputPath = args.path as string;\n const recursive = (args.recursive as boolean | undefined) ?? false;\n const confirm = args.confirm as boolean;\n\n if (!confirm) {\n throw new Error(\n \"Deletion not confirmed. Set confirm=true to proceed with deletion.\",\n );\n }\n\n const resolvedPath = await resolveSandboxedPath(inputPath, ctx.config.sandboxRoot);\n\n // Prevent deleting the sandbox root itself (compare resolved paths)\n let realSandboxRoot: string;\n try {\n const { realpath: rp } = await import(\"node:fs/promises\");\n realSandboxRoot = await rp(ctx.config.sandboxRoot);\n } catch {\n realSandboxRoot = ctx.config.sandboxRoot;\n }\n if (resolvedPath === realSandboxRoot) {\n throw new Error(\"Cannot delete the sandbox root directory.\");\n }\n\n const fileStat = await stat(resolvedPath);\n const isDirectory = fileStat.isDirectory();\n\n if (isDirectory) {\n if (recursive) {\n await rm(resolvedPath, { recursive: true, force: true });\n } else {\n await rmdir(resolvedPath);\n }\n } else {\n await unlink(resolvedPath);\n }\n\n return {\n result: {\n path: resolvedPath,\n deleted: true,\n type: isDirectory ? \"directory\" : \"file\",\n },\n evidence: [\n {\n type: \"file\",\n ref: resolvedPath,\n summary: `Deleted ${isDirectory ? \"directory\" : \"file\"}: ${resolvedPath}${recursive ? \" (recursive)\" : \"\"}`,\n createdAt: new Date().toISOString(),\n },\n ],\n };\n};\n","import { lookup } from \"node:dns/promises\";\nimport { createTaggedError } from \"../../core/Retry.js\";\n\n/**\n * Validate a URL against allowed hosts and blocked CIDRs.\n * Prevents SSRF by checking both hostname allowlist and resolved IP addresses.\n *\n * @throws HTTP_DISALLOWED_HOST if the URL is blocked\n */\nexport async function validateUrl(\n url: string,\n allowedHosts: string[],\n blockedCidrs: string[],\n): Promise<URL> {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw createTaggedError(\n \"HTTP_DISALLOWED_HOST\",\n `Invalid URL: ${url}`,\n { url },\n );\n }\n\n // Only allow http/https\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw createTaggedError(\n \"HTTP_DISALLOWED_HOST\",\n `Protocol not allowed: ${parsed.protocol}. Only http: and https: are supported.`,\n { url, protocol: parsed.protocol },\n );\n }\n\n const hostname = parsed.hostname;\n\n // Check allowlist\n if (!isHostAllowed(hostname, allowedHosts)) {\n throw createTaggedError(\n \"HTTP_DISALLOWED_HOST\",\n `Host \"${hostname}\" is not in the allowed hosts list`,\n { url, hostname, allowedHosts },\n );\n }\n\n // DNS resolve and check against blocked CIDRs\n try {\n const { address } = await lookup(hostname);\n if (isIpInBlockedCidrs(address, blockedCidrs)) {\n throw createTaggedError(\n \"HTTP_DISALLOWED_HOST\",\n `Host \"${hostname}\" resolves to blocked IP: ${address}`,\n { url, hostname, resolvedIp: address },\n );\n }\n } catch (err) {\n // Re-throw our tagged errors\n if (err instanceof Error && (err as any).kind === \"HTTP_DISALLOWED_HOST\") {\n throw err;\n }\n // DNS resolution failure — block by default\n throw createTaggedError(\n \"HTTP_DISALLOWED_HOST\",\n `DNS resolution failed for host \"${hostname}\": ${err instanceof Error ? err.message : String(err)}`,\n { url, hostname },\n );\n }\n\n return parsed;\n}\n\n/**\n * Check if a hostname matches any entry in the allowed hosts list.\n * Supports wildcard prefix matching (e.g. \"*.github.com\" matches \"api.github.com\").\n */\nfunction isHostAllowed(hostname: string, allowedHosts: string[]): boolean {\n for (const pattern of allowedHosts) {\n if (pattern.startsWith(\"*.\")) {\n const suffix = pattern.slice(1); // \".github.com\"\n if (hostname.endsWith(suffix) || hostname === pattern.slice(2)) {\n return true;\n }\n } else if (hostname === pattern) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Check if an IPv4 address falls within any blocked CIDR range.\n */\nexport function isIpInBlockedCidrs(ip: string, cidrs: string[]): boolean {\n // Handle IPv4-mapped IPv6\n const normalizedIp = normalizeIp(ip);\n if (!normalizedIp) return false;\n\n for (const cidr of cidrs) {\n if (cidr.includes(\":\")) {\n // IPv6 CIDR — skip for IPv4 addresses\n if (!ip.includes(\":\")) continue;\n if (isIpv6InCidr(ip, cidr)) return true;\n } else {\n if (isIpv4InCidr(normalizedIp, cidr)) return true;\n }\n }\n return false;\n}\n\nfunction normalizeIp(ip: string): string | null {\n // Handle IPv4-mapped IPv6 (e.g. \"::ffff:127.0.0.1\")\n if (ip.startsWith(\"::ffff:\")) {\n return ip.slice(7);\n }\n // Pure IPv4\n if (/^\\d+\\.\\d+\\.\\d+\\.\\d+$/.test(ip)) {\n return ip;\n }\n return null;\n}\n\nfunction isIpv4InCidr(ip: string, cidr: string): boolean {\n const [cidrIp, prefixStr] = cidr.split(\"/\");\n if (!cidrIp || !prefixStr) return false;\n\n const prefix = parseInt(prefixStr, 10);\n if (isNaN(prefix) || prefix < 0 || prefix > 32) return false;\n\n const ipNum = ipv4ToNum(ip);\n const cidrNum = ipv4ToNum(cidrIp);\n if (ipNum === null || cidrNum === null) return false;\n\n const mask = prefix === 0 ? 0 : (~0 << (32 - prefix)) >>> 0;\n return (ipNum & mask) === (cidrNum & mask);\n}\n\nfunction ipv4ToNum(ip: string): number | null {\n const parts = ip.split(\".\");\n if (parts.length !== 4) return null;\n let num = 0;\n for (const part of parts) {\n const n = parseInt(part, 10);\n if (isNaN(n) || n < 0 || n > 255) return null;\n num = (num << 8) | n;\n }\n return num >>> 0;\n}\n\nfunction isIpv6InCidr(ip: string, cidr: string): boolean {\n // Simplified IPv6 CIDR matching for common cases (::1, fc00::, fe80::)\n const [cidrIp, prefixStr] = cidr.split(\"/\");\n if (!cidrIp || !prefixStr) return false;\n\n const prefix = parseInt(prefixStr, 10);\n if (isNaN(prefix)) return false;\n\n const ipBytes = expandIpv6(ip);\n const cidrBytes = expandIpv6(cidrIp);\n if (!ipBytes || !cidrBytes) return false;\n\n // Compare prefix bits\n const fullBytes = Math.floor(prefix / 8);\n for (let i = 0; i < fullBytes && i < 16; i++) {\n if (ipBytes[i] !== cidrBytes[i]) return false;\n }\n\n const remainingBits = prefix % 8;\n if (remainingBits > 0 && fullBytes < 16) {\n const mask = (~0 << (8 - remainingBits)) & 0xff;\n if ((ipBytes[fullBytes]! & mask) !== (cidrBytes[fullBytes]! & mask)) return false;\n }\n\n return true;\n}\n\nfunction expandIpv6(ip: string): number[] | null {\n // Remove zone ID\n const zoneIdx = ip.indexOf(\"%\");\n if (zoneIdx !== -1) ip = ip.slice(0, zoneIdx);\n\n const parts = ip.split(\"::\");\n if (parts.length > 2) return null;\n\n const bytes: number[] = new Array(16).fill(0);\n\n const expandGroup = (group: string): number[] => {\n if (!group) return [];\n return group.split(\":\").flatMap((hex) => {\n const val = parseInt(hex || \"0\", 16);\n return [(val >> 8) & 0xff, val & 0xff];\n });\n };\n\n if (parts.length === 1) {\n const expanded = expandGroup(parts[0]!);\n if (expanded.length !== 16) return null;\n return expanded;\n }\n\n const left = expandGroup(parts[0]!);\n const right = expandGroup(parts[1]!);\n\n if (left.length + right.length > 16) return null;\n\n for (let i = 0; i < left.length; i++) bytes[i] = left[i]!;\n for (let i = 0; i < right.length; i++) bytes[16 - right.length + i] = right[i]!;\n\n return bytes;\n}\n","import type { ToolSpec } from \"../../types/ToolSpec.js\";\nimport type { CoreToolHandler } from \"../types.js\";\nimport { validateUrl } from \"../security/ssrf.js\";\nimport { createTaggedError } from \"../../core/Retry.js\";\n\nexport const fetchTextInputSchema = {\n type: \"object\",\n properties: {\n url: { type: \"string\", format: \"uri\", description: \"URL to fetch\" },\n method: {\n type: \"string\",\n enum: [\"GET\", \"POST\"],\n default: \"GET\",\n description: \"HTTP method\",\n },\n headers: {\n type: \"object\",\n additionalProperties: { type: \"string\" },\n description: \"Request headers\",\n },\n body: {\n type: [\"string\", \"null\"],\n description: \"Request body (for POST)\",\n },\n timeoutMs: {\n type: \"integer\",\n minimum: 1000,\n maximum: 60000,\n description: \"Request timeout in milliseconds (default: from config)\",\n },\n maxBytes: {\n type: \"integer\",\n minimum: 1024,\n maximum: 10485760,\n description: \"Maximum response size in bytes (default: from config)\",\n },\n },\n required: [\"url\"],\n additionalProperties: false,\n} as const;\n\nexport const fetchTextOutputSchema = {\n type: \"object\",\n properties: {\n url: { type: \"string\" },\n status: { type: \"integer\" },\n headers: { type: \"object\", additionalProperties: { type: \"string\" } },\n text: { type: \"string\" },\n bytes: { type: \"integer\" },\n },\n required: [\"url\", \"status\", \"text\", \"bytes\"],\n additionalProperties: false,\n} as const;\n\nexport const fetchTextSpec: ToolSpec = {\n name: \"core/http.fetchText\",\n version: \"1.0.0\",\n kind: \"core\",\n description: \"Fetch a URL and return the response as text\",\n tags: [\"http\", \"network\", \"core\"],\n inputSchema: fetchTextInputSchema,\n outputSchema: fetchTextOutputSchema,\n capabilities: [\"network\"],\n};\n\nexport const fetchTextHandler: CoreToolHandler = async (args, ctx) => {\n const url = args.url as string;\n const method = (args.method as string | undefined) ?? \"GET\";\n const headers = (args.headers as Record<string, string> | undefined) ?? {};\n const body = args.body as string | null | undefined;\n const timeoutMs = (args.timeoutMs as number | undefined) ?? ctx.config.defaultTimeoutMs;\n const maxBytes = (args.maxBytes as number | undefined) ?? ctx.config.maxHttpBytes;\n\n // SSRF validation\n await validateUrl(url, ctx.config.allowedHosts, ctx.config.blockedCidrs);\n\n // Set User-Agent if not provided\n if (!headers[\"User-Agent\"] && !headers[\"user-agent\"]) {\n headers[\"User-Agent\"] = ctx.config.httpUserAgent;\n }\n\n // Execute fetch with timeout\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n let response: Response;\n try {\n response = await fetch(url, {\n method,\n headers,\n body: body ?? undefined,\n signal: controller.signal,\n });\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw createTaggedError(\n \"HTTP_TIMEOUT\",\n `Request to ${url} timed out after ${timeoutMs}ms`,\n { url, timeoutMs },\n );\n }\n throw createTaggedError(\n \"UPSTREAM_ERROR\",\n `Fetch failed for ${url}: ${err instanceof Error ? err.message : String(err)}`,\n { url },\n );\n } finally {\n clearTimeout(timer);\n }\n\n // Check content-length before reading body\n const contentLength = response.headers.get(\"content-length\");\n if (contentLength && parseInt(contentLength, 10) > maxBytes) {\n throw createTaggedError(\n \"HTTP_TOO_LARGE\",\n `Response Content-Length ${contentLength} exceeds limit of ${maxBytes} bytes`,\n { url, contentLength: parseInt(contentLength, 10), limit: maxBytes },\n );\n }\n\n // Read text body with size limit\n const text = await readResponseWithLimit(response, maxBytes, url);\n const bytes = Buffer.byteLength(text, \"utf-8\");\n\n // Collect response headers\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n return {\n result: {\n url,\n status: response.status,\n headers: responseHeaders,\n text,\n bytes,\n },\n evidence: [\n {\n type: \"url\",\n ref: url,\n summary: `${method} ${url} → ${response.status} (${bytes} bytes)`,\n createdAt: new Date().toISOString(),\n },\n ],\n };\n};\n\nasync function readResponseWithLimit(\n response: Response,\n maxBytes: number,\n url: string,\n): Promise<string> {\n if (!response.body) {\n return response.text();\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n const chunks: string[] = [];\n let totalBytes = 0;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n totalBytes += value.byteLength;\n if (totalBytes > maxBytes) {\n reader.cancel();\n throw createTaggedError(\n \"HTTP_TOO_LARGE\",\n `Response body exceeded limit of ${maxBytes} bytes while reading from ${url}`,\n { url, bytesRead: totalBytes, limit: maxBytes },\n );\n }\n\n chunks.push(decoder.decode(value, { stream: true }));\n }\n chunks.push(decoder.decode());\n } finally {\n reader.releaseLock();\n }\n\n return chunks.join(\"\");\n}\n","import type { ToolSpec } from \"../../types/ToolSpec.js\";\nimport type { CoreToolHandler } from \"../types.js\";\nimport { validateUrl } from \"../security/ssrf.js\";\nimport { createTaggedError } from \"../../core/Retry.js\";\n\nexport const fetchJsonInputSchema = {\n type: \"object\",\n properties: {\n url: { type: \"string\", format: \"uri\", description: \"URL to fetch\" },\n method: {\n type: \"string\",\n enum: [\"GET\", \"POST\"],\n default: \"GET\",\n description: \"HTTP method\",\n },\n headers: {\n type: \"object\",\n additionalProperties: { type: \"string\" },\n description: \"Request headers\",\n },\n body: {\n type: [\"string\", \"null\"],\n description: \"Request body (for POST)\",\n },\n timeoutMs: {\n type: \"integer\",\n minimum: 1000,\n maximum: 60000,\n description: \"Request timeout in milliseconds (default: from config)\",\n },\n maxBytes: {\n type: \"integer\",\n minimum: 1024,\n maximum: 10485760,\n description: \"Maximum response size in bytes (default: from config)\",\n },\n },\n required: [\"url\"],\n additionalProperties: false,\n} as const;\n\nexport const fetchJsonOutputSchema = {\n type: \"object\",\n properties: {\n url: { type: \"string\" },\n status: { type: \"integer\" },\n json: {},\n bytes: { type: \"integer\" },\n },\n required: [\"url\", \"status\", \"json\", \"bytes\"],\n additionalProperties: false,\n} as const;\n\nexport const fetchJsonSpec: ToolSpec = {\n name: \"core/http.fetchJson\",\n version: \"1.0.0\",\n kind: \"core\",\n description: \"Fetch a URL and return the response as parsed JSON\",\n tags: [\"http\", \"network\", \"json\", \"core\"],\n inputSchema: fetchJsonInputSchema,\n outputSchema: fetchJsonOutputSchema,\n capabilities: [\"network\"],\n};\n\nexport const fetchJsonHandler: CoreToolHandler = async (args, ctx) => {\n const url = args.url as string;\n const method = (args.method as string | undefined) ?? \"GET\";\n const headers = (args.headers as Record<string, string> | undefined) ?? {};\n const body = args.body as string | null | undefined;\n const timeoutMs = (args.timeoutMs as number | undefined) ?? ctx.config.defaultTimeoutMs;\n const maxBytes = (args.maxBytes as number | undefined) ?? ctx.config.maxHttpBytes;\n\n // SSRF validation\n await validateUrl(url, ctx.config.allowedHosts, ctx.config.blockedCidrs);\n\n // Set headers\n if (!headers[\"Accept\"] && !headers[\"accept\"]) {\n headers[\"Accept\"] = \"application/json\";\n }\n if (!headers[\"User-Agent\"] && !headers[\"user-agent\"]) {\n headers[\"User-Agent\"] = ctx.config.httpUserAgent;\n }\n\n // Execute fetch with timeout\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n let response: Response;\n try {\n response = await fetch(url, {\n method,\n headers,\n body: body ?? undefined,\n signal: controller.signal,\n });\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw createTaggedError(\n \"HTTP_TIMEOUT\",\n `Request to ${url} timed out after ${timeoutMs}ms`,\n { url, timeoutMs },\n );\n }\n throw createTaggedError(\n \"UPSTREAM_ERROR\",\n `Fetch failed for ${url}: ${err instanceof Error ? err.message : String(err)}`,\n { url },\n );\n } finally {\n clearTimeout(timer);\n }\n\n // Check content-length\n const contentLength = response.headers.get(\"content-length\");\n if (contentLength && parseInt(contentLength, 10) > maxBytes) {\n throw createTaggedError(\n \"HTTP_TOO_LARGE\",\n `Response Content-Length ${contentLength} exceeds limit of ${maxBytes} bytes`,\n { url, contentLength: parseInt(contentLength, 10), limit: maxBytes },\n );\n }\n\n // Read text and parse JSON\n const text = await response.text();\n const bytes = Buffer.byteLength(text, \"utf-8\");\n\n if (bytes > maxBytes) {\n throw createTaggedError(\n \"HTTP_TOO_LARGE\",\n `Response body ${bytes} bytes exceeds limit of ${maxBytes} bytes`,\n { url, bytes, limit: maxBytes },\n );\n }\n\n let json: unknown;\n try {\n json = JSON.parse(text);\n } catch {\n throw createTaggedError(\n \"UPSTREAM_ERROR\",\n `Failed to parse JSON response from ${url}: ${text.slice(0, 200)}`,\n { url, status: response.status, textPreview: text.slice(0, 500) },\n );\n }\n\n return {\n result: {\n url,\n status: response.status,\n json,\n bytes,\n },\n evidence: [\n {\n type: \"url\",\n ref: url,\n summary: `${method} ${url} → ${response.status} JSON (${bytes} bytes)`,\n createdAt: new Date().toISOString(),\n },\n ],\n };\n};\n","import { writeFile, mkdir } from \"node:fs/promises\";\nimport { createHash } from \"node:crypto\";\nimport { dirname } from \"node:path\";\nimport type { ToolSpec } from \"../../types/ToolSpec.js\";\nimport type { CoreToolHandler } from \"../types.js\";\nimport { validateUrl } from \"../security/ssrf.js\";\nimport { resolveSandboxedPath } from \"../security/sandbox.js\";\nimport { createTaggedError } from \"../../core/Retry.js\";\n\nexport const downloadFileInputSchema = {\n type: \"object\",\n properties: {\n url: { type: \"string\", format: \"uri\", description: \"URL to download from\" },\n destPath: { type: \"string\", description: \"Destination path relative to sandbox root\" },\n headers: {\n type: \"object\",\n additionalProperties: { type: \"string\" },\n description: \"Request headers\",\n },\n timeoutMs: {\n type: \"integer\",\n minimum: 1000,\n maximum: 120000,\n description: \"Request timeout in milliseconds (default: from config)\",\n },\n maxBytes: {\n type: \"integer\",\n minimum: 1024,\n maximum: 104857600,\n description: \"Maximum download size in bytes (default: from config)\",\n },\n overwrite: {\n type: \"boolean\",\n default: false,\n description: \"Allow overwriting existing files\",\n },\n },\n required: [\"url\", \"destPath\"],\n additionalProperties: false,\n} as const;\n\nexport const downloadFileOutputSchema = {\n type: \"object\",\n properties: {\n destPath: { type: \"string\" },\n bytes: { type: \"integer\" },\n sha256: { type: \"string\" },\n status: { type: \"integer\" },\n url: { type: \"string\" },\n },\n required: [\"destPath\", \"bytes\", \"sha256\", \"status\", \"url\"],\n additionalProperties: false,\n} as const;\n\nexport const downloadFileSpec: ToolSpec = {\n name: \"core/http.downloadFile\",\n version: \"1.0.0\",\n kind: \"core\",\n description: \"Download a file from a URL to the sandbox\",\n tags: [\"http\", \"network\", \"download\", \"core\"],\n inputSchema: downloadFileInputSchema,\n outputSchema: downloadFileOutputSchema,\n capabilities: [\"network\", \"write:fs\"],\n};\n\nexport const downloadFileHandler: CoreToolHandler = async (args, ctx) => {\n const url = args.url as string;\n const destPath = args.destPath as string;\n const headers = (args.headers as Record<string, string> | undefined) ?? {};\n const timeoutMs = (args.timeoutMs as number | undefined) ?? ctx.config.defaultTimeoutMs;\n const maxBytes = (args.maxBytes as number | undefined) ?? ctx.config.maxDownloadBytes;\n const overwrite = (args.overwrite as boolean | undefined) ?? false;\n\n // SSRF validation\n await validateUrl(url, ctx.config.allowedHosts, ctx.config.blockedCidrs);\n\n // Sandbox validation for destination\n const resolvedDest = await resolveSandboxedPath(destPath, ctx.config.sandboxRoot);\n\n // Check overwrite\n if (!overwrite) {\n const { access } = await import(\"node:fs/promises\");\n try {\n await access(resolvedDest);\n throw new Error(\n `File already exists: ${resolvedDest}. Set overwrite=true to allow overwriting.`,\n );\n } catch (err) {\n if (err instanceof Error && !err.message.includes(\"already exists\")) {\n // ENOENT — file doesn't exist, proceed\n } else {\n throw err;\n }\n }\n }\n\n if (!headers[\"User-Agent\"] && !headers[\"user-agent\"]) {\n headers[\"User-Agent\"] = ctx.config.httpUserAgent;\n }\n\n // Execute fetch\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: \"GET\",\n headers,\n signal: controller.signal,\n });\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw createTaggedError(\n \"HTTP_TIMEOUT\",\n `Download from ${url} timed out after ${timeoutMs}ms`,\n { url, timeoutMs },\n );\n }\n throw createTaggedError(\n \"UPSTREAM_ERROR\",\n `Download failed for ${url}: ${err instanceof Error ? err.message : String(err)}`,\n { url },\n );\n } finally {\n clearTimeout(timer);\n }\n\n // Check content-length\n const contentLength = response.headers.get(\"content-length\");\n if (contentLength && parseInt(contentLength, 10) > maxBytes) {\n throw createTaggedError(\n \"HTTP_TOO_LARGE\",\n `Download Content-Length ${contentLength} exceeds limit of ${maxBytes} bytes`,\n { url, contentLength: parseInt(contentLength, 10), limit: maxBytes },\n );\n }\n\n // Read body with size limit\n if (!response.body) {\n throw createTaggedError(\"UPSTREAM_ERROR\", `No response body from ${url}`, { url });\n }\n\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let totalBytes = 0;\n const hasher = createHash(\"sha256\");\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n totalBytes += value.byteLength;\n if (totalBytes > maxBytes) {\n reader.cancel();\n throw createTaggedError(\n \"HTTP_TOO_LARGE\",\n `Download from ${url} exceeded limit of ${maxBytes} bytes (received ${totalBytes})`,\n { url, bytesRead: totalBytes, limit: maxBytes },\n );\n }\n\n chunks.push(value);\n hasher.update(value);\n }\n } finally {\n reader.releaseLock();\n }\n\n const sha256 = hasher.digest(\"hex\");\n\n // Write to sandbox\n await mkdir(dirname(resolvedDest), { recursive: true });\n const buffer = Buffer.concat(chunks);\n await writeFile(resolvedDest, buffer);\n\n return {\n result: {\n destPath: resolvedDest,\n bytes: totalBytes,\n sha256,\n status: response.status,\n url,\n },\n evidence: [\n {\n type: \"url\",\n ref: url,\n summary: `Downloaded ${totalBytes} bytes from ${url}`,\n createdAt: new Date().toISOString(),\n },\n {\n type: \"file\",\n ref: resolvedDest,\n summary: `Saved to ${resolvedDest} (sha256: ${sha256.slice(0, 12)}...)`,\n createdAt: new Date().toISOString(),\n },\n ],\n };\n};\n","import type { ToolSpec } from \"../../types/ToolSpec.js\";\nimport type { CoreToolHandler } from \"../types.js\";\nimport { validateUrl } from \"../security/ssrf.js\";\nimport { createTaggedError } from \"../../core/Retry.js\";\n\nexport const headInputSchema = {\n type: \"object\",\n properties: {\n url: { type: \"string\", format: \"uri\", description: \"URL to send HEAD request to\" },\n headers: {\n type: \"object\",\n additionalProperties: { type: \"string\" },\n description: \"Request headers\",\n },\n timeoutMs: {\n type: \"integer\",\n minimum: 1000,\n maximum: 60000,\n description: \"Request timeout in milliseconds (default: from config)\",\n },\n },\n required: [\"url\"],\n additionalProperties: false,\n} as const;\n\nexport const headOutputSchema = {\n type: \"object\",\n properties: {\n url: { type: \"string\" },\n status: { type: \"integer\" },\n headers: { type: \"object\", additionalProperties: { type: \"string\" } },\n },\n required: [\"url\", \"status\", \"headers\"],\n additionalProperties: false,\n} as const;\n\nexport const headSpec: ToolSpec = {\n name: \"core/http.head\",\n version: \"1.0.0\",\n kind: \"core\",\n description: \"Send a HEAD request to get response headers without body\",\n tags: [\"http\", \"network\", \"core\"],\n inputSchema: headInputSchema,\n outputSchema: headOutputSchema,\n capabilities: [\"network\"],\n};\n\nexport const headHandler: CoreToolHandler = async (args, ctx) => {\n const url = args.url as string;\n const headers = (args.headers as Record<string, string> | undefined) ?? {};\n const timeoutMs = (args.timeoutMs as number | undefined) ?? ctx.config.defaultTimeoutMs;\n\n // SSRF validation\n await validateUrl(url, ctx.config.allowedHosts, ctx.config.blockedCidrs);\n\n if (!headers[\"User-Agent\"] && !headers[\"user-agent\"]) {\n headers[\"User-Agent\"] = ctx.config.httpUserAgent;\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: \"HEAD\",\n headers,\n signal: controller.signal,\n });\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw createTaggedError(\n \"HTTP_TIMEOUT\",\n `HEAD request to ${url} timed out after ${timeoutMs}ms`,\n { url, timeoutMs },\n );\n }\n throw createTaggedError(\n \"UPSTREAM_ERROR\",\n `HEAD request failed for ${url}: ${err instanceof Error ? err.message : String(err)}`,\n { url },\n );\n } finally {\n clearTimeout(timer);\n }\n\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n return {\n result: {\n url,\n status: response.status,\n headers: responseHeaders,\n },\n evidence: [\n {\n type: \"url\",\n ref: url,\n summary: `HEAD ${url} → ${response.status}`,\n createdAt: new Date().toISOString(),\n },\n ],\n };\n};\n","import type { ToolSpec } from \"../../types/ToolSpec.js\";\nimport type { CoreToolHandler } from \"../types.js\";\n\nexport const jsonSelectInputSchema = {\n type: \"object\",\n properties: {\n json: {\n description: \"JSON data to query (object or array)\",\n },\n path: {\n type: \"string\",\n description: \"JMESPath expression to select fields from the JSON data\",\n },\n },\n required: [\"json\", \"path\"],\n additionalProperties: false,\n} as const;\n\nexport const jsonSelectOutputSchema = {\n type: \"object\",\n properties: {\n value: { description: \"Selected value(s) from the JSON data\" },\n },\n required: [\"value\"],\n additionalProperties: false,\n} as const;\n\nexport const jsonSelectSpec: ToolSpec = {\n name: \"core/util.json.select\",\n version: \"1.0.0\",\n kind: \"core\",\n description: \"Select fields from JSON data using JMESPath expressions\",\n tags: [\"util\", \"json\", \"core\"],\n inputSchema: jsonSelectInputSchema,\n outputSchema: jsonSelectOutputSchema,\n capabilities: [],\n};\n\nexport const jsonSelectHandler: CoreToolHandler = async (args) => {\n const json = args.json;\n const path = args.path as string;\n\n let jmespath: { search: (data: unknown, expression: string) => unknown };\n try {\n jmespath = await import(\"jmespath\");\n } catch {\n throw new Error(\n \"jmespath package is required for core/util.json.select. Install it with: npm install jmespath\",\n );\n }\n\n let value: unknown;\n try {\n value = jmespath.search(json, path);\n } catch (err) {\n throw new Error(\n `JMESPath expression error: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n return {\n result: { value },\n evidence: [\n {\n type: \"tool\",\n ref: \"core/util.json.select\",\n summary: `Selected \"${path}\" from JSON → ${typeof value === \"object\" ? JSON.stringify(value).slice(0, 100) : String(value).slice(0, 100)}`,\n createdAt: new Date().toISOString(),\n },\n ],\n };\n};\n","import type { ToolSpec } from \"../../types/ToolSpec.js\";\nimport type { CoreToolHandler } from \"../types.js\";\n\nexport const truncateInputSchema = {\n type: \"object\",\n properties: {\n text: { type: \"string\", description: \"Text to truncate\" },\n maxChars: {\n type: \"integer\",\n minimum: 1,\n description: \"Maximum number of characters\",\n },\n suffix: {\n type: \"string\",\n default: \"...\",\n description: \"Suffix to append when truncated\",\n },\n },\n required: [\"text\", \"maxChars\"],\n additionalProperties: false,\n} as const;\n\nexport const truncateOutputSchema = {\n type: \"object\",\n properties: {\n text: { type: \"string\" },\n truncated: { type: \"boolean\" },\n originalLength: { type: \"integer\" },\n },\n required: [\"text\", \"truncated\", \"originalLength\"],\n additionalProperties: false,\n} as const;\n\nexport const truncateSpec: ToolSpec = {\n name: \"core/util.text.truncate\",\n version: \"1.0.0\",\n kind: \"core\",\n description: \"Truncate text to a maximum character length with a suffix marker\",\n tags: [\"util\", \"text\", \"core\"],\n inputSchema: truncateInputSchema,\n outputSchema: truncateOutputSchema,\n capabilities: [],\n};\n\nexport const truncateHandler: CoreToolHandler = async (args) => {\n const text = args.text as string;\n const maxChars = args.maxChars as number;\n const suffix = (args.suffix as string | undefined) ?? \"...\";\n\n const originalLength = text.length;\n\n if (text.length <= maxChars) {\n return {\n result: { text, truncated: false, originalLength },\n evidence: [\n {\n type: \"tool\",\n ref: \"core/util.text.truncate\",\n summary: `Text not truncated (${originalLength} chars <= ${maxChars} max)`,\n createdAt: new Date().toISOString(),\n },\n ],\n };\n }\n\n const truncatedText = text.slice(0, maxChars - suffix.length) + suffix;\n\n return {\n result: { text: truncatedText, truncated: true, originalLength },\n evidence: [\n {\n type: \"tool\",\n ref: \"core/util.text.truncate\",\n summary: `Truncated ${originalLength} chars to ${truncatedText.length} chars`,\n createdAt: new Date().toISOString(),\n },\n ],\n };\n};\n","import { createHash } from \"node:crypto\";\nimport type { ToolSpec } from \"../../types/ToolSpec.js\";\nimport type { CoreToolHandler } from \"../types.js\";\n\nexport const hashTextInputSchema = {\n type: \"object\",\n properties: {\n text: { type: \"string\", description: \"Text to hash\" },\n },\n required: [\"text\"],\n additionalProperties: false,\n} as const;\n\nexport const hashTextOutputSchema = {\n type: \"object\",\n properties: {\n sha256: { type: \"string\" },\n },\n required: [\"sha256\"],\n additionalProperties: false,\n} as const;\n\nexport const hashTextSpec: ToolSpec = {\n name: \"core/util.hash.sha256Text\",\n version: \"1.0.0\",\n kind: \"core\",\n description: \"Compute SHA-256 hash of a text string\",\n tags: [\"util\", \"hash\", \"core\"],\n inputSchema: hashTextInputSchema,\n outputSchema: hashTextOutputSchema,\n capabilities: [],\n};\n\nexport const hashTextHandler: CoreToolHandler = async (args) => {\n const text = args.text as string;\n const sha256 = createHash(\"sha256\").update(text, \"utf-8\").digest(\"hex\");\n\n return {\n result: { sha256 },\n evidence: [\n {\n type: \"tool\",\n ref: \"core/util.hash.sha256Text\",\n summary: `SHA-256 of ${text.length} chars: ${sha256.slice(0, 16)}...`,\n createdAt: new Date().toISOString(),\n },\n ],\n };\n};\n","import type { ToolSpec } from \"../../types/ToolSpec.js\";\nimport type { CoreToolHandler } from \"../types.js\";\n\nexport const nowInputSchema = {\n type: \"object\",\n properties: {\n timezone: {\n type: \"string\",\n description: \"IANA timezone (e.g. 'America/New_York', 'Asia/Shanghai'). Defaults to UTC.\",\n },\n },\n required: [],\n additionalProperties: false,\n} as const;\n\nexport const nowOutputSchema = {\n type: \"object\",\n properties: {\n iso: { type: \"string\", description: \"ISO 8601 timestamp\" },\n epochMs: { type: \"integer\", description: \"Unix epoch in milliseconds\" },\n timezone: { type: \"string\" },\n formatted: { type: \"string\", description: \"Human-readable formatted time\" },\n },\n required: [\"iso\", \"epochMs\", \"timezone\", \"formatted\"],\n additionalProperties: false,\n} as const;\n\nexport const nowSpec: ToolSpec = {\n name: \"core/util.time.now\",\n version: \"1.0.0\",\n kind: \"core\",\n description: \"Get the current time in various formats\",\n tags: [\"util\", \"time\", \"core\"],\n inputSchema: nowInputSchema,\n outputSchema: nowOutputSchema,\n capabilities: [],\n};\n\nexport const nowHandler: CoreToolHandler = async (args) => {\n const timezone = (args.timezone as string | undefined) ?? \"UTC\";\n const now = new Date();\n\n let formatted: string;\n try {\n formatted = new Intl.DateTimeFormat(\"en-US\", {\n timeZone: timezone,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: false,\n timeZoneName: \"short\",\n }).format(now);\n } catch {\n formatted = now.toISOString();\n }\n\n return {\n result: {\n iso: now.toISOString(),\n epochMs: now.getTime(),\n timezone,\n formatted,\n },\n evidence: [\n {\n type: \"tool\",\n ref: \"core/util.time.now\",\n summary: `Current time: ${now.toISOString()} (${timezone})`,\n createdAt: now.toISOString(),\n },\n ],\n };\n};\n","import type { ToolSpec } from \"../../types/ToolSpec.js\";\nimport type { CoreToolHandler } from \"../types.js\";\n\nexport const templateRenderInputSchema = {\n type: \"object\",\n properties: {\n template: {\n type: \"string\",\n description: \"Mustache template string\",\n },\n data: {\n type: \"object\",\n additionalProperties: true,\n description: \"Data object for template variables\",\n },\n },\n required: [\"template\", \"data\"],\n additionalProperties: false,\n} as const;\n\nexport const templateRenderOutputSchema = {\n type: \"object\",\n properties: {\n text: { type: \"string\" },\n },\n required: [\"text\"],\n additionalProperties: false,\n} as const;\n\nexport const templateRenderSpec: ToolSpec = {\n name: \"core/util.template.render\",\n version: \"1.0.0\",\n kind: \"core\",\n description: \"Render a Mustache template with data\",\n tags: [\"util\", \"template\", \"core\"],\n inputSchema: templateRenderInputSchema,\n outputSchema: templateRenderOutputSchema,\n capabilities: [],\n};\n\nexport const templateRenderHandler: CoreToolHandler = async (args) => {\n const template = args.template as string;\n const data = args.data as Record<string, unknown>;\n\n let renderFn: (template: string, view: unknown) => string;\n try {\n const mod = await import(\"mustache\");\n // Handle both default and named exports\n const mustache = mod.default ?? mod;\n renderFn = mustache.render.bind(mustache);\n } catch {\n throw new Error(\n \"mustache package is required for core/util.template.render. Install it with: npm install mustache\",\n );\n }\n\n let text: string;\n try {\n text = renderFn(template, data);\n } catch (err) {\n throw new Error(\n `Template rendering error: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n return {\n result: { text },\n evidence: [\n {\n type: \"tool\",\n ref: \"core/util.template.render\",\n summary: `Rendered template (${template.length} chars) → ${text.length} chars output`,\n createdAt: new Date().toISOString(),\n },\n ],\n };\n};\n","import { CoreAdapter } from \"./CoreAdapter.js\";\nimport type { ToolRegistry } from \"../registry/ToolRegistry.js\";\nimport type { CoreToolsConfig } from \"./types.js\";\nimport { DEFAULT_CORE_TOOLS_CONFIG } from \"./types.js\";\n\n// Filesystem tools\nimport { readTextSpec, readTextHandler } from \"./fs/readText.js\";\nimport { writeTextSpec, writeTextHandler } from \"./fs/writeText.js\";\nimport { listDirSpec, listDirHandler } from \"./fs/listDir.js\";\nimport { searchTextSpec, searchTextHandler } from \"./fs/searchText.js\";\nimport { sha256Spec, sha256Handler } from \"./fs/sha256.js\";\nimport { deletePathSpec, deletePathHandler } from \"./fs/deletePath.js\";\n\n// HTTP tools\nimport { fetchTextSpec, fetchTextHandler } from \"./http/fetchText.js\";\nimport { fetchJsonSpec, fetchJsonHandler } from \"./http/fetchJson.js\";\nimport { downloadFileSpec, downloadFileHandler } from \"./http/downloadFile.js\";\nimport { headSpec, headHandler } from \"./http/head.js\";\n\n// Utility tools\nimport { jsonSelectSpec, jsonSelectHandler } from \"./util/jsonSelect.js\";\nimport { truncateSpec, truncateHandler } from \"./util/truncate.js\";\nimport { hashTextSpec, hashTextHandler } from \"./util/hashText.js\";\nimport { nowSpec, nowHandler } from \"./util/now.js\";\nimport { templateRenderSpec, templateRenderHandler } from \"./util/templateRender.js\";\n\n/**\n * All core tools: spec + handler pairs.\n */\nconst ALL_CORE_TOOLS = [\n // Filesystem\n { spec: readTextSpec, handler: readTextHandler },\n { spec: writeTextSpec, handler: writeTextHandler },\n { spec: listDirSpec, handler: listDirHandler },\n { spec: searchTextSpec, handler: searchTextHandler },\n { spec: sha256Spec, handler: sha256Handler },\n { spec: deletePathSpec, handler: deletePathHandler },\n // HTTP\n { spec: fetchTextSpec, handler: fetchTextHandler },\n { spec: fetchJsonSpec, handler: fetchJsonHandler },\n { spec: downloadFileSpec, handler: downloadFileHandler },\n { spec: headSpec, handler: headHandler },\n // Utils\n { spec: jsonSelectSpec, handler: jsonSelectHandler },\n { spec: truncateSpec, handler: truncateHandler },\n { spec: hashTextSpec, handler: hashTextHandler },\n { spec: nowSpec, handler: nowHandler },\n { spec: templateRenderSpec, handler: templateRenderHandler },\n] as const;\n\n/**\n * User-provided config for registerCoreTools.\n * `sandboxRoot` and `allowedHosts` are required; the rest have defaults.\n */\nexport type CoreToolsUserConfig = Pick<CoreToolsConfig, \"sandboxRoot\" | \"allowedHosts\"> &\n Partial<Omit<CoreToolsConfig, \"sandboxRoot\" | \"allowedHosts\">>;\n\n/**\n * Register all core tools with a ToolRegistry and return the configured CoreAdapter.\n *\n * Usage:\n * ```ts\n * const registry = new ToolRegistry();\n * const coreAdapter = registerCoreTools(registry, {\n * sandboxRoot: \"/var/tool-hub/sandbox\",\n * allowedHosts: [\"api.github.com\", \"*.example.com\"],\n * });\n * runtime.registerAdapter(coreAdapter);\n * ```\n */\nexport function registerCoreTools(\n registry: ToolRegistry,\n userConfig: CoreToolsUserConfig,\n): CoreAdapter {\n const config: CoreToolsConfig = {\n ...DEFAULT_CORE_TOOLS_CONFIG,\n ...userConfig,\n };\n\n const adapter = new CoreAdapter(config);\n\n for (const { spec, handler } of ALL_CORE_TOOLS) {\n registry.register(spec);\n adapter.registerHandler(spec.name, handler);\n }\n\n return adapter;\n}\n","import type { ToolSpec } from \"../types/ToolSpec.js\";\nimport type { CoreToolsUserConfig } from \"../core-tools/CoreToolsModule.js\";\nimport { DirectoryScanner } from \"../discovery/DirectoryScanner.js\";\nimport { ToolRegistry } from \"../registry/ToolRegistry.js\";\nimport { registerCoreTools } from \"../core-tools/CoreToolsModule.js\";\nimport type { Logger } from \"../observability/Logger.js\";\n\nexport interface DiscoveryDependencies {\n registry: ToolRegistry;\n logger: Logger;\n includeCoreTools: boolean;\n coreToolsConfig?: CoreToolsUserConfig;\n roots: Array<string | { path: string; namespace?: string }>;\n}\n\n/**\n * Initialize all tools by scanning the configured roots.\n */\nexport async function initAllTools(\n scanner: DirectoryScanner,\n deps: DiscoveryDependencies,\n n8nLocalAdapter?: { start(): Promise<void>; syncWorkflows(specs: ToolSpec[]): Promise<void> },\n): Promise<ToolSpec[]> {\n deps.logger.info(\"init.tools.start\", {\n roots: deps.roots,\n });\n const specs = await scanner.scan();\n deps.registry.bulkRegister(specs);\n \n if (n8nLocalAdapter) {\n await n8nLocalAdapter.start();\n await n8nLocalAdapter.syncWorkflows(\n specs.filter((spec) => spec.kind === \"n8n\"),\n );\n }\n \n deps.logger.info(\"init.tools.done\", { count: specs.length });\n return specs;\n}\n\n/**\n * Refresh tools by re-scanning current roots.\n */\nexport async function refreshTools(\n scanner: DirectoryScanner,\n deps: DiscoveryDependencies,\n n8nLocalAdapter?: { start(): Promise<void>; syncWorkflows(specs: ToolSpec[]): Promise<void> },\n): Promise<ToolSpec[]> {\n deps.logger.info(\"refresh.tools.start\", {\n roots: deps.roots,\n });\n const specs = await scanner.scan();\n deps.registry.clear();\n \n if (deps.includeCoreTools) {\n if (!deps.coreToolsConfig) {\n throw new Error(\"coreTools config is required when includeCoreTools is true\");\n }\n // Note: coreAdapter registration should be handled by caller\n registerCoreTools(deps.registry, deps.coreToolsConfig);\n }\n \n deps.registry.bulkRegister(specs);\n \n if (n8nLocalAdapter) {\n await n8nLocalAdapter.start();\n await n8nLocalAdapter.syncWorkflows(\n specs.filter((spec) => spec.kind === \"n8n\"),\n );\n }\n \n deps.logger.info(\"refresh.tools.done\", { count: specs.length });\n return specs;\n}\n\n/**\n * Split roots into scanner roots and core tools config.\n */\nexport function splitRoots(\n roots: Array<\n | string\n | { path: string; namespace?: string }\n | { path: \"coreTools\"; namespace?: string; config?: CoreToolsUserConfig }\n >,\n includeCoreTools?: boolean,\n): {\n scannerRoots: Array<string | { path: string; namespace?: string }>;\n includeCoreTools: boolean;\n coreToolsConfig?: CoreToolsUserConfig;\n} {\n const scannerRoots: Array<string | { path: string; namespace?: string }> = [];\n let hasCoreTools = false;\n let coreToolsConfig: CoreToolsUserConfig | undefined;\n\n for (const root of roots) {\n if (typeof root === \"string\") {\n if (root === \"coreTools\") {\n hasCoreTools = true;\n } else {\n scannerRoots.push(root);\n }\n continue;\n }\n if (root.path === \"coreTools\") {\n hasCoreTools = true;\n if (\"config\" in root && root.config) {\n coreToolsConfig = root.config;\n }\n continue;\n }\n scannerRoots.push(root);\n }\n\n return {\n scannerRoots,\n includeCoreTools: includeCoreTools ?? hasCoreTools,\n coreToolsConfig,\n };\n}\n","import type { CoreToolsUserConfig } from \"../core-tools/CoreToolsModule.js\";\n\nexport type ToolHubRoot =\n | string\n | { path: string; namespace?: string }\n | { path: \"coreTools\"; namespace?: string; config?: CoreToolsUserConfig };\n\n/**\n * Extract path from root config.\n */\nexport function rootPath(root: string | { path: string; namespace?: string }): string {\n return typeof root === \"string\" ? root : root.path;\n}\n\n/**\n * Generate unique key for root (path + namespace).\n */\nexport function rootKey(root: string | { path: string; namespace?: string }): string {\n const path = rootPath(root);\n const namespace = typeof root === \"string\" ? \"\" : root.namespace ?? \"\";\n return `${path}::${namespace}`;\n}\n","import { watch, type FSWatcher } from \"node:fs\";\nimport type { DirectoryScannerOptions } from \"../discovery/types.js\";\nimport type { Logger } from \"../observability/Logger.js\";\nimport type { ToolSpec } from \"../types/ToolSpec.js\";\nimport { rootPath } from \"./ToolHubHelpers.js\";\n\nexport interface WatcherDependencies {\n logger: Logger;\n scannerOptions: DirectoryScannerOptions;\n refreshTools: () => Promise<ToolSpec[]>;\n}\n\n/**\n * Watch all current roots and auto-refresh on changes.\n */\nexport function watchRoots(\n deps: WatcherDependencies,\n watchers: Map<string, FSWatcher>,\n watchTimers: Map<string, NodeJS.Timeout>,\n options: { debounceMs?: number; persistent?: boolean } = {},\n): void {\n const debounceMs = options.debounceMs ?? 200;\n const persistent = options.persistent ?? true;\n\n for (const root of deps.scannerOptions.roots) {\n const rootPathValue = rootPath(root);\n if (watchers.has(rootPathValue)) {\n continue;\n }\n deps.logger.info(\"watch.start\", { root: rootPathValue, debounceMs, persistent });\n const watcher = watch(\n rootPathValue,\n { recursive: true, persistent },\n () => {\n const existing = watchTimers.get(rootPathValue);\n if (existing) {\n clearTimeout(existing);\n }\n const timer = setTimeout(() => {\n deps.refreshTools().catch((err) => {\n deps.logger.warn(\"watch.refresh.error\", {\n root: rootPathValue,\n message: err instanceof Error ? err.message : String(err),\n });\n deps.scannerOptions.onError?.(rootPathValue, err as Error);\n });\n }, debounceMs);\n watchTimers.set(rootPathValue, timer);\n },\n );\n watchers.set(rootPathValue, watcher);\n }\n}\n\n/**\n * Stop watching all roots.\n */\nexport function unwatchRoots(\n watchers: Map<string, FSWatcher>,\n watchTimers: Map<string, NodeJS.Timeout>,\n logger: Logger,\n): void {\n for (const [root, watcher] of watchers) {\n watcher.close();\n watchers.delete(root);\n const timer = watchTimers.get(root);\n if (timer) {\n clearTimeout(timer);\n watchTimers.delete(root);\n }\n logger.info(\"watch.stop\", { root });\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { FSWatcher } from \"node:fs\";\nimport type { Capability, ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext, ToolIntent, BudgetConfig } from \"../types/ToolIntent.js\";\nimport type { ToolResult } from \"../types/ToolResult.js\";\nimport type { DirectoryScannerOptions } from \"../discovery/types.js\";\nimport type { SkillDefinition } from \"../discovery/loaders/SkillManifest.js\";\nimport type {\n SkillInstructionResult,\n SkillAdapterOptions,\n} from \"../adapters/SkillAdapter.js\";\nimport type { LangChainAdapterOptions } from \"../adapters/LangChainAdapter.js\";\nimport type { MCPAdapterOptions } from \"../adapters/MCPAdapter.js\";\nimport type { N8nAdapterOptions } from \"../adapters/N8nAdapter.js\";\nimport type { N8nLocalAdapter, N8nLocalAdapterOptions } from \"../adapters/N8nLocalAdapter.js\";\nimport type { ComfyUIAdapterOptions } from \"../adapters/ComfyUIAdapter.js\";\nimport type { PTCRuntimeConfig } from \"../core/PTCRuntime.js\";\nimport type { CoreToolsUserConfig } from \"../core-tools/CoreToolsModule.js\";\nimport { PTCRuntime } from \"../core/PTCRuntime.js\";\nimport { ToolRegistry } from \"../registry/ToolRegistry.js\";\nimport { DirectoryScanner } from \"../discovery/DirectoryScanner.js\";\nimport { createLogger } from \"../observability/Logger.js\";\nimport type { DebugOptions, Logger } from \"../observability/Logger.js\";\nimport { LangChainAdapter } from \"../adapters/LangChainAdapter.js\";\nimport { MCPAdapter } from \"../adapters/MCPAdapter.js\";\nimport { N8nAdapter } from \"../adapters/N8nAdapter.js\";\nimport { ComfyUIAdapter } from \"../adapters/ComfyUIAdapter.js\";\nimport { SkillAdapter } from \"../adapters/SkillAdapter.js\";\nimport { registerCoreTools } from \"../core-tools/CoreToolsModule.js\";\nimport { initAllTools, refreshTools, splitRoots } from \"./ToolHubDiscovery.js\";\nimport { watchRoots, unwatchRoots } from \"./ToolHubWatcher.js\";\nimport { rootKey } from \"./ToolHubHelpers.js\";\n\nexport interface ToolMetadata {\n name: string;\n description: string;\n}\n\nexport type ToolDescription =\n | SkillInstructionResult\n | {\n name: string;\n description?: string;\n kind: ToolSpec[\"kind\"];\n version: string;\n tags?: string[];\n capabilities: Capability[];\n inputSchema: object;\n outputSchema: object;\n costHints?: ToolSpec[\"costHints\"];\n endpoint?: string;\n resourceId?: string;\n };\n\nexport interface ToolHubInitOptions {\n roots: Array<\n | string\n | { path: string; namespace?: string }\n | { path: \"coreTools\"; namespace?: string; config?: CoreToolsUserConfig }\n >;\n namespace?: string;\n extensions?: string[];\n onDiscoverError?: (dir: string, err: Error) => void;\n includeCoreTools?: boolean;\n coreTools?: CoreToolsUserConfig;\n runtimeConfig?: PTCRuntimeConfig;\n debug?: DebugOptions;\n watch?: {\n enabled?: boolean;\n debounceMs?: number;\n persistent?: boolean;\n };\n langchain?: LangChainAdapterOptions;\n mcp?: MCPAdapterOptions;\n n8n?: N8nAdapterOptions;\n n8nLocal?: N8nLocalAdapterOptions;\n n8nMode?: \"local\" | \"api\";\n comfyui?: ComfyUIAdapterOptions;\n skill?: SkillAdapterOptions;\n}\n\nexport interface InvokeOptions {\n purpose?: string;\n requestId?: string;\n taskId?: string;\n traceId?: string;\n userId?: string;\n permissions?: Capability[];\n budget?: BudgetConfig;\n dryRun?: boolean;\n idempotencyKey?: string;\n}\n\nexport class ToolHub {\n private readonly registry: ToolRegistry;\n private readonly runtime: PTCRuntime;\n private readonly logger: Logger;\n private scanner: DirectoryScanner;\n private readonly scannerOptions: DirectoryScannerOptions;\n private readonly skillAdapter: SkillAdapter;\n private n8nLocalAdapter?: N8nLocalAdapter;\n private readonly n8nLocalOptions?: N8nLocalAdapterOptions;\n private readonly n8nMode: \"local\" | \"api\";\n private readonly includeCoreTools: boolean;\n private readonly coreToolsConfig?: CoreToolsUserConfig;\n private readonly watchConfig?: ToolHubInitOptions[\"watch\"];\n private readonly watchers = new Map<string, FSWatcher>();\n private readonly watchTimers = new Map<string, NodeJS.Timeout>();\n\n constructor(options: ToolHubInitOptions) {\n this.registry = new ToolRegistry();\n this.logger = createLogger({ ...options.debug, prefix: \"agent-tool-hub\" });\n\n const sharedDebug = options.debug;\n const withDebug = <T extends { debug?: DebugOptions }>(\n opts?: T,\n ): T | undefined => {\n if (!sharedDebug) return opts;\n if (!opts) return { debug: sharedDebug } as T;\n if (opts.debug) return opts;\n return { ...opts, debug: sharedDebug };\n };\n\n const runtimeConfig: PTCRuntimeConfig = {\n ...(options.runtimeConfig ?? {}),\n debug: options.runtimeConfig?.debug ?? options.debug,\n };\n\n this.runtime = new PTCRuntime({\n registry: this.registry,\n config: runtimeConfig,\n });\n\n const { scannerRoots, includeCoreTools, coreToolsConfig } = splitRoots(\n options.roots,\n options.includeCoreTools,\n );\n\n this.scannerOptions = {\n roots: scannerRoots,\n namespace: options.namespace,\n extensions: options.extensions,\n onError: options.onDiscoverError,\n };\n this.scanner = new DirectoryScanner(this.scannerOptions);\n\n this.skillAdapter = new SkillAdapter({\n ...withDebug(options.skill),\n toolInvoker: async (toolName, args, ctx) => {\n const result = await this.runtime.invoke(\n {\n tool: toolName,\n args,\n purpose: `skill:${toolName}`,\n idempotencyKey: `${ctx.requestId}:${ctx.taskId}:${toolName}`,\n },\n ctx,\n );\n if (!result.ok) {\n throw new Error(result.error?.message ?? \"Tool invocation failed\");\n }\n return result.result;\n },\n });\n\n this.runtime.registerAdapter(new LangChainAdapter(withDebug(options.langchain)));\n this.runtime.registerAdapter(new MCPAdapter(withDebug(options.mcp)));\n this.n8nMode = options.n8nMode ?? \"local\";\n if (this.n8nMode === \"api\") {\n this.runtime.registerAdapter(new N8nAdapter(withDebug(options.n8n)));\n } else {\n this.n8nLocalOptions = withDebug(options.n8nLocal);\n }\n this.runtime.registerAdapter(new ComfyUIAdapter(withDebug(options.comfyui)));\n this.runtime.registerAdapter(this.skillAdapter);\n\n this.includeCoreTools = includeCoreTools;\n this.coreToolsConfig = coreToolsConfig ?? options.coreTools;\n this.watchConfig = options.watch;\n\n if (this.includeCoreTools) {\n if (!this.coreToolsConfig) {\n throw new Error(\"coreTools config is required when includeCoreTools is true\");\n }\n const coreAdapter = registerCoreTools(this.registry, this.coreToolsConfig);\n this.runtime.registerAdapter(coreAdapter);\n }\n }\n\n /**\n * Initialize all tools by scanning the configured roots.\n */\n async initAllTools(): Promise<ToolSpec[]> {\n if (this.n8nMode === \"local\") {\n await this.ensureN8nLocalAdapter();\n }\n const specs = await initAllTools(this.scanner, {\n registry: this.registry,\n logger: this.logger,\n includeCoreTools: this.includeCoreTools,\n coreToolsConfig: this.coreToolsConfig,\n roots: this.scannerOptions.roots,\n }, this.n8nLocalAdapter);\n \n if (this.watchConfig?.enabled) {\n this.watchRoots({\n debounceMs: this.watchConfig.debounceMs,\n persistent: this.watchConfig.persistent,\n });\n }\n return specs;\n }\n\n /**\n * Refresh tools by re-scanning current roots.\n */\n async refreshTools(): Promise<ToolSpec[]> {\n if (this.includeCoreTools) {\n if (!this.coreToolsConfig) {\n throw new Error(\"coreTools config is required when includeCoreTools is true\");\n }\n const coreAdapter = registerCoreTools(this.registry, this.coreToolsConfig);\n this.runtime.registerAdapter(coreAdapter);\n }\n if (this.n8nMode === \"local\") {\n await this.ensureN8nLocalAdapter();\n }\n const specs = await refreshTools(this.scanner, {\n registry: this.registry,\n logger: this.logger,\n includeCoreTools: this.includeCoreTools,\n coreToolsConfig: this.coreToolsConfig,\n roots: this.scannerOptions.roots,\n }, this.n8nLocalAdapter);\n return specs;\n }\n\n /**\n * Add additional roots and optionally refresh.\n */\n async addRoots(\n roots: Array<string | { path: string; namespace?: string }>,\n refresh = true,\n ): Promise<ToolSpec[] | void> {\n const merged = new Map<string, string | { path: string; namespace?: string }>();\n for (const root of this.scannerOptions.roots) {\n merged.set(rootKey(root), root);\n }\n for (const root of roots) {\n merged.set(rootKey(root), root);\n }\n this.scannerOptions.roots = Array.from(merged.values());\n this.scanner = new DirectoryScanner(this.scannerOptions);\n this.logger.info(\"roots.added\", { roots, refresh });\n if (refresh) {\n return this.refreshTools();\n }\n }\n\n /**\n * Replace roots and optionally refresh.\n */\n async setRoots(\n roots: Array<string | { path: string; namespace?: string }>,\n refresh = true,\n ): Promise<ToolSpec[] | void> {\n this.scannerOptions.roots = [...roots];\n this.scanner = new DirectoryScanner(this.scannerOptions);\n this.logger.info(\"roots.set\", { roots, refresh });\n if (refresh) {\n return this.refreshTools();\n }\n }\n\n /**\n * Watch all current roots and auto-refresh on changes.\n */\n watchRoots(options: { debounceMs?: number; persistent?: boolean } = {}): void {\n watchRoots(\n {\n logger: this.logger,\n scannerOptions: this.scannerOptions,\n refreshTools: () => this.refreshTools(),\n },\n this.watchers,\n this.watchTimers,\n options,\n );\n }\n\n /**\n * Stop watching all roots.\n */\n unwatchRoots(): void {\n unwatchRoots(this.watchers, this.watchTimers, this.logger);\n }\n\n /**\n * Return tool metadata in SKILL-like format (name + description).\n */\n listToolMetadata(): ToolMetadata[] {\n return this.registry.snapshot().map((spec) => ({\n name: spec.name,\n description: spec.description ?? \"\",\n }));\n }\n\n /**\n * Get a tool's full description. For skills, returns full SKILL content.\n */\n getToolDescription(toolName: string): ToolDescription {\n const spec = this.registry.get(toolName);\n if (!spec) {\n throw new Error(`Tool not found: ${toolName}`);\n }\n\n if (spec.kind === \"skill\") {\n const def = this.extractSkillDefinition(spec);\n if (def) {\n return {\n name: def.frontmatter.name,\n description: def.frontmatter.description,\n instructions: def.instructions,\n resources: def.resources.map((r) => ({\n path: r.relativePath,\n type: r.type,\n })),\n dirPath: def.dirPath,\n };\n }\n }\n\n return {\n name: spec.name,\n description: spec.description,\n kind: spec.kind,\n version: spec.version,\n tags: spec.tags,\n capabilities: spec.capabilities,\n inputSchema: spec.inputSchema,\n outputSchema: spec.outputSchema,\n costHints: spec.costHints,\n endpoint: spec.endpoint,\n resourceId: spec.resourceId,\n };\n }\n\n /**\n * Invoke a tool through PTC Runtime.\n */\n async invokeTool(\n toolName: string,\n args: unknown,\n options: InvokeOptions = {},\n ): Promise<ToolResult> {\n if (this.n8nMode === \"local\") {\n await this.ensureN8nLocalAdapter();\n }\n const requestId = options.requestId ?? `req_${randomUUID()}`;\n const taskId = options.taskId ?? `task_${randomUUID()}`;\n\n const intent: ToolIntent = {\n tool: toolName,\n args,\n purpose: options.purpose ?? \"agent-tool-hub.invoke\",\n idempotencyKey:\n options.idempotencyKey ?? `${requestId}:${taskId}:${toolName}`,\n };\n\n const ctx: ExecContext = {\n requestId,\n taskId,\n traceId: options.traceId,\n userId: options.userId,\n permissions: options.permissions ?? [],\n budget: options.budget,\n dryRun: options.dryRun,\n };\n\n return this.runtime.invoke(intent, ctx);\n }\n\n /**\n * Invoke a tool using a pre-built ToolIntent and ExecContext.\n */\n async invokeIntent(intent: ToolIntent, ctx: ExecContext): Promise<ToolResult> {\n if (this.n8nMode === \"local\") {\n await this.ensureN8nLocalAdapter();\n }\n return this.runtime.invoke(intent, ctx);\n }\n\n getRegistry(): ToolRegistry {\n return this.registry;\n }\n\n getRuntime(): PTCRuntime {\n return this.runtime;\n }\n\n async shutdown(): Promise<void> {\n this.unwatchRoots();\n if (this.n8nLocalAdapter) {\n await this.n8nLocalAdapter.stop();\n }\n }\n\n private async ensureN8nLocalAdapter(): Promise<void> {\n if (this.n8nLocalAdapter) return;\n const { N8nLocalAdapter } = await import(\"../adapters/N8nLocalAdapter.js\");\n this.n8nLocalAdapter = new N8nLocalAdapter(this.n8nLocalOptions);\n this.runtime.registerAdapter(this.n8nLocalAdapter);\n }\n\n private extractSkillDefinition(spec: ToolSpec): SkillDefinition | undefined {\n if (spec.impl && typeof spec.impl === \"object\" && \"frontmatter\" in spec.impl) {\n return spec.impl as SkillDefinition;\n }\n return undefined;\n }\n\n}\n\nexport function createToolHub(options: ToolHubInitOptions): ToolHub {\n return new ToolHub(options);\n}\n"]}