@easynet/agent-tool 1.0.55 → 1.0.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/expose/openapiHttp.d.ts.map +1 -1
- package/dist/api/main.cjs +13 -13
- package/dist/api/main.js +2 -2
- package/dist/{chunk-XT2CXR6A.js → chunk-A5C2MUNA.js} +61 -10
- package/dist/{chunk-XT2CXR6A.js.map → chunk-A5C2MUNA.js.map} +1 -1
- package/dist/{chunk-TFT4RYFZ.cjs → chunk-DPOLJN7F.cjs} +13 -13
- package/dist/{chunk-TFT4RYFZ.cjs.map → chunk-DPOLJN7F.cjs.map} +1 -1
- package/dist/{chunk-WC54NBDE.js → chunk-IWM5B5DU.js} +3 -3
- package/dist/{chunk-WC54NBDE.js.map → chunk-IWM5B5DU.js.map} +1 -1
- package/dist/{chunk-D2T3NTFN.cjs → chunk-JXYANBTH.cjs} +62 -11
- package/dist/chunk-JXYANBTH.cjs.map +1 -0
- package/dist/{chunk-WAGGOFT3.cjs → chunk-MUBZV65R.cjs} +15 -15
- package/dist/{chunk-WAGGOFT3.cjs.map → chunk-MUBZV65R.cjs.map} +1 -1
- package/dist/{chunk-W4AGLV2U.js → chunk-Y75CRPVF.js} +3 -3
- package/dist/{chunk-W4AGLV2U.js.map → chunk-Y75CRPVF.js.map} +1 -1
- package/dist/index.cjs +24 -24
- package/dist/index.js +4 -4
- package/dist/utils/cli/index.cjs +16 -16
- package/dist/utils/cli/index.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-D2T3NTFN.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tools/util/toolConfig.ts","../src/tools/util/toolDescriptor.ts","../src/core/runtime/SchemaValidator.ts","../src/core/runtime/PolicyEngine.ts","../src/core/runtime/Budget.ts","../src/core/runtime/Evidence.ts","../src/observability/EventLog.ts","../src/observability/Logger.ts","../src/observability/Metrics.ts","../src/observability/Tracing.ts","../src/core/runtime/PTCRuntimePipeline.ts","../src/core/runtime/PTCRuntimeObservability.ts","../src/core/runtime/PTCRuntime.ts","../src/security/sandbox.ts","../src/tools/util/scanUtil.ts","../src/tools/function/schemaFromTs.ts","../src/tools/function/types.ts","../src/tools/skill/types.ts","../src/tools/n8n/types.ts","../src/tools/mcp/mcpSpecToToolSpec.ts","../src/tools/function/scanner.ts","../src/tools/util/resolveEntry.ts","../src/tools/skill/SkillManifest.ts","../src/tools/skill/SkillMdParser.ts","../src/tools/skill/scanSkill.ts","../src/tools/n8n/N8nLoader.ts","../src/tools/n8n/scanN8n.ts","../src/tools/mcp/types.ts","../src/tools/mcp/scanner.ts","../src/tools/langchain/types.ts","../src/tools/langchain/scanner.ts","../src/tools/langchain/LangChainLoader.ts","../src/tools/skill/SkillLoader.ts","../src/tools/langchain/directoryLoad.ts","../src/tools/mcp/MCPLoader.ts","../src/tools/mcp/directoryApply.ts","../src/tools/langchain/directoryApply.ts","../src/tools/skill/directoryApply.ts","../src/tools/n8n/directoryApply.ts","../src/tools/discoveryFactory.ts","../src/api/runtimeFromConfig.ts","../src/api/expose/openapi.ts","../src/api/expose/openapiHttp.ts","../src/api/expose/mcpServer.ts"],"names":["packageToolDefaults","list","path","walk","uuidv4","resolveSandboxedPath","resolve","dirname","join","ts","readdir","relative","path2","scan","readFile","basename","defaultInputSchema","path3","path4","path5","DEFAULT_EXTENSIONS","pathToFileURL","entryFile","loaded","applyLoadedToSpec","directoryMarker","path6","access","existsSync","readFileSync","out","statSync","runtime","enrichSpecWithCanonicalSchema","DEFAULT_CTX"],"mappings":"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","file":"chunk-XT2CXR6A.js","sourcesContent":["/**\n * Load tool.yaml: tools config (sandboxedPath + list) or legacy top-level tools + sandboxedPath.\n * Normalized shape: tools (array of descriptors) and sandboxedPath.\n */\n\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { resolve, join, dirname } from \"node:path\";\nimport { expandHomePath, parseYamlContent, resolveConfigPath } from \"@easynet/agent-common\";\n\n/** Normalized shape returned by loadToolConfig: tools list, sandbox, security, and per-tool defaults. */\nexport interface ToolYamlShape {\n /** List of tool descriptors (npm:@scope/pkg#path or plain names). */\n tools?: string[];\n /** Root path for fs sandbox; tools can only access under this path. Resolved relative to tool.yaml dir. */\n sandboxedPath?: string;\n /** Whether to enforce sandbox boundary checks in fs path resolution. Default: false. */\n enableSandboxValidation?: boolean;\n /** Allowed hosts (e.g. [\"*\"] or [\"api.github.com\"]). Merged with programmatic config. */\n allowedHosts?: string[];\n /** Block these hosts even if allowed (e.g. [\"*.internal\"]). Merged with programmatic config. */\n blockedHosts?: string[];\n /** CIDR ranges to block for HTTP (SSRF). When set, overrides builtin default. */\n blockedCidrs?: string[];\n /** Per-tool config overrides. Keys: short name (\"fs.listDir\"), package-scoped (\"npm.easynet.agent.tool.buildin::fs.listDir\", survives version bumps), or full registry name. */\n toolDefaults?: Record<string, Record<string, unknown>>;\n /** Per-package config. Key = npm descriptor. value.defaults = package-level key-value (all tools in this package); value.tools = per-tool config (tool short name -> config). */\n packageToolDefaults?: Record<string, { defaults?: Record<string, unknown>; tools?: Record<string, Record<string, unknown>> }>;\n}\n\n/** Raw tools block: sandboxedPath, list, optional security, defaults, and optional per-package config. */\ninterface ToolsBlock {\n sandboxedPath?: string;\n enableSandboxValidation?: boolean;\n list?: string[];\n allowedHosts?: string[];\n blockedHosts?: string[];\n blockedCidrs?: string[];\n /** Per-tool config: tool short name -> config object (e.g. fs.listDir: { maxEntries: 500 }). */\n defaults?: Record<string, Record<string, unknown>>;\n /** Per-package: descriptor -> { defaults: package-level k-v, tools: { toolName: config } }. */\n packages?: Record<string, { defaults?: Record<string, unknown>; tools?: Record<string, Record<string, unknown>> }>;\n}\n\n/** Raw tool.yaml: either legacy (tools array + top-level sandboxedPath) or new (tools object with sandboxedPath + list + security + defaults). */\ninterface RawToolYaml {\n tools?: string[] | ToolsBlock;\n sandboxedPath?: string;\n enableSandboxValidation?: boolean;\n allowedHosts?: string[];\n blockedHosts?: string[];\n blockedCidrs?: string[];\n /** Top-level per-tool defaults (alternative to tools.defaults). */\n toolDefaults?: Record<string, Record<string, unknown>>;\n /** Top-level per-package config (alternative to tools.packages). */\n packageToolDefaults?: Record<string, { defaults?: Record<string, unknown>; tools?: Record<string, Record<string, unknown>> }>;\n}\n\n/**\n * Load tool.yaml and return normalized shape (tools array + sandboxedPath).\n * Supports:\n * - tools: { sandboxedPath, list?, packages? }. When list is omitted, tools = keys of packages.\n * - tools: { packages: { \"npm:@scope/pkg\": { defaults: {...} } } } — list not needed, loaded from packages.\n * - Legacy: tools: [...], sandboxedPath (top-level). With top-level packageToolDefaults, tools = keys when tools array absent.\n */\nexport function loadToolConfig(toolYamlPath: string): ToolYamlShape {\n const abs = resolve(toolYamlPath);\n const raw = readFileSync(abs, \"utf8\");\n const parsed = parseYamlContent<RawToolYaml | undefined>(raw, {\n substituteEnv: false,\n });\n if (!parsed || typeof parsed !== \"object\") return {};\n const toolsBlock = parsed.tools;\n if (toolsBlock != null && typeof toolsBlock === \"object\" && !Array.isArray(toolsBlock)) {\n const toolDefaults =\n toolsBlock.defaults != null &&\n typeof toolsBlock.defaults === \"object\" &&\n !Array.isArray(toolsBlock.defaults)\n ? (toolsBlock.defaults as Record<string, Record<string, unknown>>)\n : undefined;\n const packageToolDefaults =\n toolsBlock.packages != null &&\n typeof toolsBlock.packages === \"object\" &&\n !Array.isArray(toolsBlock.packages)\n ? (toolsBlock.packages as Record<string, { defaults?: Record<string, unknown>; tools?: Record<string, Record<string, unknown>> }>)\n : undefined;\n const list = Array.isArray(toolsBlock.list) && toolsBlock.list.length > 0 ? toolsBlock.list : undefined;\n return {\n tools: list ?? (packageToolDefaults ? Object.keys(packageToolDefaults) : undefined),\n sandboxedPath:\n typeof toolsBlock.sandboxedPath === \"string\" ? toolsBlock.sandboxedPath : parsed.sandboxedPath,\n enableSandboxValidation:\n typeof toolsBlock.enableSandboxValidation === \"boolean\"\n ? toolsBlock.enableSandboxValidation\n : parsed.enableSandboxValidation,\n allowedHosts:\n Array.isArray(toolsBlock.allowedHosts) ? toolsBlock.allowedHosts : parsed.allowedHosts,\n blockedHosts:\n Array.isArray(toolsBlock.blockedHosts) ? toolsBlock.blockedHosts : parsed.blockedHosts,\n blockedCidrs:\n Array.isArray(toolsBlock.blockedCidrs) ? toolsBlock.blockedCidrs : parsed.blockedCidrs,\n toolDefaults,\n packageToolDefaults,\n };\n }\n const packageToolDefaults =\n typeof parsed.packageToolDefaults === \"object\" && !Array.isArray(parsed.packageToolDefaults)\n ? (parsed.packageToolDefaults as Record<string, { defaults?: Record<string, unknown>; tools?: Record<string, Record<string, unknown>> }>)\n : undefined;\n const list = Array.isArray(parsed.tools) && parsed.tools.length > 0 ? parsed.tools : undefined;\n return {\n tools: list ?? (packageToolDefaults ? Object.keys(packageToolDefaults) : undefined),\n sandboxedPath: parsed.sandboxedPath,\n enableSandboxValidation:\n typeof parsed.enableSandboxValidation === \"boolean\" ? parsed.enableSandboxValidation : undefined,\n allowedHosts: Array.isArray(parsed.allowedHosts) ? parsed.allowedHosts : undefined,\n blockedHosts: Array.isArray(parsed.blockedHosts) ? parsed.blockedHosts : undefined,\n blockedCidrs: Array.isArray(parsed.blockedCidrs) ? parsed.blockedCidrs : undefined,\n toolDefaults:\n typeof parsed.toolDefaults === \"object\" && !Array.isArray(parsed.toolDefaults)\n ? (parsed.toolDefaults as Record<string, Record<string, unknown>>)\n : undefined,\n packageToolDefaults,\n };\n}\n\n/**\n * Resolve sandboxedPath from tool.yaml relative to the config file directory.\n * Expands leading ~ to homedir so ~/.agent/sandbox works.\n */\nexport function resolveSandboxedPath(toolYamlPath: string, sandboxedPath: string): string {\n const configDir = dirname(resolve(toolYamlPath));\n return resolveConfigPath(sandboxedPath, configDir, {\n expandHome: true,\n });\n}\n\n/** Default subdir under sandboxedPath for the npm package cache. */\nexport const CACHE_SUBDIR = \".agent/cache\";\n\n/**\n * Return cache base path when tool.yaml has sandboxedPath: sandboxedPath/.agent/cache.\n * Call ensurePackageInCache(..., { cacheBase: getCacheBaseFromToolConfig(path) }) to use it.\n */\nexport function getCacheBaseFromToolConfig(toolYamlPath: string): string | undefined {\n const config = loadToolConfig(toolYamlPath);\n if (!config.sandboxedPath || typeof config.sandboxedPath !== \"string\") return undefined;\n const sandboxRoot = resolveSandboxedPath(toolYamlPath, config.sandboxedPath);\n return join(sandboxRoot, CACHE_SUBDIR);\n}\n\n/**\n * Find tool.yaml in directory (tool.yaml or .tool.yaml) and load it.\n * Dir is resolved against process.cwd() when relative so we always load from the local folder.\n */\nexport function findAndLoadToolConfig(dir: string): ToolYamlShape & { configPath?: string } {\n const resolvedDir = resolve(dir);\n const candidates = [join(resolvedDir, \"tool.yaml\"), join(resolvedDir, \".tool.yaml\")];\n for (const p of candidates) {\n if (existsSync(p)) {\n const config = loadToolConfig(p);\n return { ...config, configPath: p };\n }\n }\n return {};\n}\n","import { normalizeToolName } from \"../../core/types/ToolSpec.js\";\n\n/**\n * Tool path format (canonical, supported everywhere):\n * [protocol]:[scope]/[package with version]#[tool name] (tool name required)\n * [protocol]:[scope]/[package with version] (bare package; tool name omitted = all tools)\n *\n * Examples:\n * npm:@easynet/agent-tool-builtin#fs.readText\n * npm:@scope/pkg@1.0.0#http.fetchText\n * npm:@easynet/agent-tool-builtin (bare package)\n * file:./local/tools#myTool\n */\n\n/** Matches [protocol]:[scope]/[package]#[tool name] or [protocol]:[scope]/[package] (optional #part) */\nconst TOOL_PATH_REGEX = /^([a-z][a-z0-9-]*):([^/]+)\\/([^#]+)(#(.+))?$/;\n\nexport interface ToolPath {\n /** Protocol (npm, file, http, etc.) */\n protocol: string;\n /** Scope, e.g. @easynet or scope */\n scope: string;\n /** Package id, optionally with version (e.g. pkg or pkg@1.0.0) */\n packageWithVersion: string;\n /** Tool name after #; empty string when bare package (no #) */\n toolName: string;\n}\n\n/** Parsed package and optional version from packageWithVersion (e.g. \"pkg@1.0.0\" -> { package: \"pkg\", version: \"1.0.0\" }) */\nexport interface PackageVersion {\n package: string;\n version?: string;\n}\n\n/**\n * Check if a string is a tool path in canonical form.\n * Format: [protocol]:[scope]/[package with version]#[tool name]\n */\nexport function isToolPath(descriptor: string): boolean {\n return TOOL_PATH_REGEX.test(descriptor.trim());\n}\n\n/**\n * Check if a descriptor is a bare package (no #toolName).\n * When true, the intent is to load all tools from that package.\n */\nexport function isBarePackageDescriptor(descriptor: string): boolean {\n const parsed = parseToolPath(descriptor.trim());\n return parsed !== null && parsed.toolName === \"\";\n}\n\n/**\n * Parse a tool path into { protocol, scope, packageWithVersion, toolName }.\n * Returns null if the string does not match the format.\n */\nexport function parseToolPath(descriptor: string): ToolPath | null {\n const s = descriptor.trim();\n const m = s.match(TOOL_PATH_REGEX);\n if (!m || m[1] === undefined || m[2] === undefined || m[3] === undefined) return null;\n return {\n protocol: m[1],\n scope: m[2],\n packageWithVersion: m[3],\n toolName: m[5] ?? \"\",\n };\n}\n\n/**\n * Build registry name prefix from an npm descriptor (only [a-zA-Z0-9.] in result).\n * Npm tools are always managed in the registry with a concrete version; we never use \"latest\" in the registry.\n * When the descriptor omits version or uses @latest, the caller must resolve to the actual latest version\n * (e.g. via resolveLatestVersionFromRegistry) and pass it as resolvedVersion.\n *\n * @param descriptor - e.g. \"npm:@easynet/agent-tool-buildin\" or \"npm:@scope/pkg@1.0.0\"\n * @param resolvedVersion - Actual version (e.g. \"0.0.11\"); required when descriptor has no version or @latest\n * @returns e.g. \"npm.easynet.agent.tool.buildin.0.0.11.\" (never contains \"latest\")\n * @throws if descriptor uses latest but resolvedVersion is missing or equals \"latest\"\n */\nexport function npmDescriptorToRegistryPrefix(descriptor: string, resolvedVersion?: string): string {\n const s = descriptor.trim();\n if (typeof s !== \"string\" || !s.startsWith(\"npm:\")) return \"\";\n const rest = s.slice(4).trim();\n const hashIdx = rest.indexOf(\"#\");\n const beforeHash = hashIdx < 0 ? rest : rest.slice(0, hashIdx);\n const lastAt = beforeHash.lastIndexOf(\"@\");\n const scopeAndPackage = lastAt <= 0 ? beforeHash : beforeHash.slice(0, lastAt);\n let version = lastAt <= 0 ? \"latest\" : beforeHash.slice(lastAt + 1).trim() || \"latest\";\n if (version === \"latest\" || !version) {\n const resolved = (resolvedVersion ?? \"\").trim();\n if (resolved !== \"\" && resolved.toLowerCase() !== \"latest\") {\n version = resolved;\n } else {\n throw new Error(\n `Registry prefix requires a concrete version when descriptor uses latest (${descriptor}). ` +\n `Resolve version from registry (e.g. resolveLatestVersionFromRegistry) and pass as resolvedVersion.`,\n );\n }\n }\n // Never allow \"latest\" in registry even if descriptor had @latest and wrong resolvedVersion was passed\n if (!version || version.toLowerCase() === \"latest\") {\n throw new Error(\n `Registry never uses \"latest\"; pass resolved concrete version for npm descriptor: ${descriptor}`,\n );\n }\n const slashIdx = scopeAndPackage.indexOf(\"/\");\n const scope = slashIdx < 0 ? scopeAndPackage : scopeAndPackage.slice(0, slashIdx).replace(/^@/, \"\");\n const pkg = slashIdx < 0 ? \"\" : scopeAndPackage.slice(slashIdx + 1);\n const segment = [scope, pkg, version].filter(Boolean).join(\".\");\n const normalized = normalizeToolName(segment);\n if (!normalized) return \"\";\n return \"npm.\" + normalized + \".\";\n}\n\n/**\n * Package prefix from npm descriptor without version (for package-scoped config keys).\n * e.g. \"npm:@easynet/agent-tool-buildin\" or \"npm:@easynet/agent-tool-buildin@0.0.11\" -> \"npm.easynet.agent.tool.buildin\"\n */\nexport function npmDescriptorToPackagePrefix(descriptor: string): string {\n const s = descriptor.trim();\n if (typeof s !== \"string\" || !s.startsWith(\"npm:\")) return \"\";\n const rest = s.slice(4).trim();\n const hashIdx = rest.indexOf(\"#\");\n const beforeHash = hashIdx < 0 ? rest : rest.slice(0, hashIdx);\n const lastAt = beforeHash.lastIndexOf(\"@\");\n const scopeAndPackage = lastAt <= 0 ? beforeHash : beforeHash.slice(0, lastAt);\n const slashIdx = scopeAndPackage.indexOf(\"/\");\n const scope = slashIdx < 0 ? scopeAndPackage : scopeAndPackage.slice(0, slashIdx).replace(/^@/, \"\");\n const pkg = slashIdx < 0 ? \"\" : scopeAndPackage.slice(slashIdx + 1);\n const segment = [scope, pkg].filter(Boolean).join(\".\");\n const normalized = normalizeToolName(segment);\n if (!normalized) return \"\";\n return \"npm.\" + normalized;\n}\n\n/**\n * Package prefix with version when descriptor has explicit version (for same package at multiple versions).\n * e.g. \"npm:@easynet/agent-tool-buildin@1.0.0\" -> \"npm.easynet.agent.tool.buildin.1.0.0\"\n * \"npm:@easynet/agent-tool-buildin\" -> \"npm.easynet.agent.tool.buildin\" (no version)\n */\nexport function npmDescriptorToPackagePrefixWithVersion(descriptor: string): string {\n const s = descriptor.trim();\n if (typeof s !== \"string\" || !s.startsWith(\"npm:\")) return \"\";\n const rest = s.slice(4).trim();\n const hashIdx = rest.indexOf(\"#\");\n const beforeHash = hashIdx < 0 ? rest : rest.slice(0, hashIdx);\n const lastAt = beforeHash.lastIndexOf(\"@\");\n const scopeAndPackage = lastAt <= 0 ? beforeHash : beforeHash.slice(0, lastAt);\n const version = lastAt <= 0 ? \"\" : beforeHash.slice(lastAt + 1).trim();\n const slashIdx = scopeAndPackage.indexOf(\"/\");\n const scope = slashIdx < 0 ? scopeAndPackage : scopeAndPackage.slice(0, slashIdx).replace(/^@/, \"\");\n const pkg = slashIdx < 0 ? \"\" : scopeAndPackage.slice(slashIdx + 1);\n const segment = [scope, pkg, version].filter(Boolean).join(\".\");\n const normalized = normalizeToolName(segment);\n if (!normalized) return \"\";\n return \"npm.\" + normalized;\n}\n\n/**\n * Split packageWithVersion into package and optional version (e.g. \"pkg@1.0.0\" -> { package: \"pkg\", version: \"1.0.0\" }).\n */\nexport function parsePackageVersion(packageWithVersion: string): PackageVersion {\n const at = packageWithVersion.lastIndexOf(\"@\");\n if (at <= 0) return { package: packageWithVersion };\n const pkg = packageWithVersion.slice(0, at);\n const version = packageWithVersion.slice(at + 1);\n if (!version || /^\\d/.test(version)) return { package: pkg, version };\n return { package: packageWithVersion };\n}\n\n// --- Backward compatibility: npm-specific API ---\n\n/** Matches npm:@scope/packageName#toolPath (subset of tool path) */\nconst NPM_TOOL_DESCRIPTOR_REGEX = /^npm:(@[\\w.-]+\\/[\\w.-]+)#(.+)$/;\n\nexport interface NpmToolDescriptor {\n /** Full package id, e.g. @scope/package */\n fullPackage: string;\n /** Tool path after #, e.g. fs.readText */\n toolPath: string;\n}\n\n/**\n * Check if a string is an npm tool path (npm:@scope/package#path).\n * @deprecated Prefer isToolPath(descriptor) and parseToolPath(descriptor)?.protocol === 'npm'\n */\nexport function isNpmToolDescriptor(descriptor: string): boolean {\n return isToolPath(descriptor) && parseToolPath(descriptor)?.protocol === \"npm\";\n}\n\n/**\n * Parse npm tool path into { fullPackage, toolPath } or null.\n * @deprecated Prefer parseToolPath(descriptor) for protocol:scope/package#toolName\n */\nexport function parseNpmToolDescriptor(descriptor: string): NpmToolDescriptor | null {\n const parsed = parseToolPath(descriptor);\n if (!parsed || parsed.protocol !== \"npm\") return null;\n return {\n fullPackage: `${parsed.scope}/${parsed.packageWithVersion}`,\n toolPath: parsed.toolName,\n };\n}\n\n/**\n * Return the display scope for a tool: the first segment of the registry name (before the first \".\"),\n * or the full name if there is no \".\".\n */\nexport function getDisplayScope(\n registryName: string,\n _kind?: string,\n _toolVersion?: string,\n): string {\n const i = registryName.indexOf(\".\");\n return i < 0 ? registryName : registryName.slice(0, i);\n}\n\n/**\n * Resolve a single npm tool descriptor to a registry name.\n * This package does not resolve npm descriptors to registry names; resolution is done by the runtime/loader.\n * Returns null so that resolveToolDescriptor returns the descriptor as-is.\n */\nexport function resolveNpmToolDescriptor(descriptor: string): string | null {\n return null;\n}\n\n/**\n * Expand a list of tool descriptors to registry tool names.\n * - Plain names: match registry name or suffix (e.g. readText -> npm...readText).\n * - protocol:scope/package#toolName: resolve to registry names that start with package prefix and end with .toolName.\n * - protocol:scope/package (bare): resolve to all registry names that start with package prefix.\n */\nexport function expandToolDescriptorsToRegistryNames(\n descriptors: string[],\n registryNames: string[],\n): string[] {\n const out: string[] = [];\n const seen = new Set<string>();\n\n function add(name: string): void {\n const key = normalizeToolName(name);\n if (registryNames.includes(key) && !seen.has(key)) {\n seen.add(key);\n out.push(key);\n return;\n }\n const matched = registryNames.filter((r) => r === key || r.endsWith(\".\" + key));\n for (const m of matched) {\n if (!seen.has(m)) {\n seen.add(m);\n out.push(m);\n }\n }\n }\n\n for (const d of descriptors) {\n const s = d.trim();\n if (!s) continue;\n if (isToolPath(s)) {\n if (registryNames.includes(s) && !seen.has(s)) {\n seen.add(s);\n out.push(s);\n continue;\n }\n const path = parseToolPath(s);\n if (path) {\n const packagePrefix =\n path.protocol === \"npm\"\n ? npmDescriptorToPackagePrefix(s)\n : path.protocol === \"file\"\n ? fileDescriptorToPackagePrefix(s)\n : \"\";\n const prefixWithDot = packagePrefix ? packagePrefix + \".\" : \"\";\n if (prefixWithDot) {\n if (path.toolName) {\n const suffix = \".\" + path.toolName;\n for (const r of registryNames) {\n if (r.startsWith(prefixWithDot) && r.endsWith(suffix) && !seen.has(r)) {\n seen.add(r);\n out.push(r);\n }\n }\n } else {\n for (const r of registryNames) {\n if (r.startsWith(prefixWithDot) && !seen.has(r)) {\n seen.add(r);\n out.push(r);\n }\n }\n }\n }\n }\n continue;\n }\n const name = normalizeToolName(s);\n add(name);\n }\n return out;\n}\n\n/**\n * Resolve a single tool descriptor to a tool name.\n * If it is a tool path, returns it as-is (no resolution in this package); otherwise returns the string as-is (plain name).\n */\nexport function resolveToolDescriptor(descriptor: string): string {\n const s = descriptor.trim();\n const resolved = resolveNpmToolDescriptor(s);\n if (resolved !== null) return resolved;\n return s;\n}\n\n/**\n * Normalize a list of tool descriptors (plain names or [protocol]:[scope]/[package]#[tool name]).\n * Deduplicates and preserves order. Tool paths are kept as-is (no resolution in this package).\n */\nexport function normalizeToolList(descriptors: string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const d of descriptors) {\n if (typeof d !== \"string\" || !d.trim()) continue;\n const name = resolveToolDescriptor(d);\n if (!seen.has(name)) {\n seen.add(name);\n out.push(name);\n }\n }\n return out;\n}\n\n/**\n * Serialize ToolPath back to canonical string.\n * [protocol]:[scope]/[package with version]#[tool name]\n */\nexport function formatToolPath(path: ToolPath): string {\n return `${path.protocol}:${path.scope}/${path.packageWithVersion}#${path.toolName}`;\n}\n\n/**\n * Package prefix for file: descriptor (for config keys in tools.packages). No trailing dot.\n * e.g. \"file:./local-tools\" -> \"file.local.tools\"\n */\nexport function fileDescriptorToPackagePrefix(descriptor: string): string {\n const path = parseToolPath(descriptor.trim());\n if (!path || path.protocol !== \"file\") return \"\";\n const pathPart = `${path.scope}/${path.packageWithVersion}`;\n const normalized = normalizeToolName(pathPart);\n if (!normalized) return \"\";\n return \"file.\" + normalized;\n}\n\n/**\n * Registry prefix for file: descriptor (local folder). Path is scope/packageWithVersion from parseToolPath. Has trailing dot.\n * e.g. \"file:./local-tools\" -> \"file.local.tools.\", \"file:../other/pkg\" -> \"file.other.pkg.\"\n */\nexport function fileDescriptorToRegistryPrefix(descriptor: string): string {\n const prefix = fileDescriptorToPackagePrefix(descriptor);\n return prefix ? prefix + \".\" : \"\";\n}\n","import Ajv, { type ValidateFunction, type ErrorObject } from \"ajv\";\nimport addFormats from \"ajv-formats\";\n\n/**\n * Schema validation result.\n */\nexport interface ValidationResult {\n valid: boolean;\n errors?: ErrorObject[];\n data?: unknown;\n}\n\n/**\n * AJV-based JSON Schema validator with coercion and default enrichment.\n */\nexport class SchemaValidator {\n private readonly ajv: Ajv;\n private readonly cache = new Map<string, ValidateFunction>();\n\n constructor() {\n this.ajv = new Ajv({\n allErrors: true,\n coerceTypes: true,\n useDefaults: true,\n removeAdditional: \"failing\",\n strict: false,\n });\n addFormats(this.ajv);\n }\n\n /**\n * Validate data against a JSON Schema.\n * Coerces types and applies defaults in-place.\n */\n validate(schema: object, data: unknown): ValidationResult {\n const validate = this.getOrCompile(schema);\n const cloned = structuredClone(data);\n const valid = validate(cloned) as boolean;\n\n if (valid) {\n return { valid: true, data: cloned };\n }\n\n return {\n valid: false,\n errors: validate.errors ?? undefined,\n };\n }\n\n /**\n * Validate and return coerced data, or throw a descriptive error.\n */\n validateOrThrow(schema: object, data: unknown, context: string): unknown {\n const result = this.validate(schema, data);\n if (!result.valid) {\n const messages = (result.errors ?? [])\n .map((e) => `${e.instancePath || \"/\"} ${e.message}`)\n .join(\"; \");\n throw new SchemaValidationError(\n `${context}: ${messages}`,\n result.errors ?? [],\n );\n }\n return result.data;\n }\n\n /**\n * Apply default values from schema to data without full validation.\n */\n enrichDefaults(schema: object, data: unknown): unknown {\n const validate = this.getOrCompile(schema);\n const cloned = structuredClone(data);\n validate(cloned);\n return cloned;\n }\n\n private getOrCompile(schema: object): ValidateFunction {\n const normalized = this.normalizeSchema(schema);\n const key = JSON.stringify(normalized);\n let cached = this.cache.get(key);\n if (!cached) {\n cached = this.ajv.compile(normalized);\n this.cache.set(key, cached);\n }\n return cached;\n }\n\n /** Ensure schema is AJV-compatible (required = string[], nullable handled via type). */\n private normalizeSchema(schema: object): object {\n return this.normalizeSchemaRec(schema as Record<string, unknown>) as object;\n }\n\n private normalizeSchemaRec(s: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(s)) {\n if (key === \"required\") {\n const raw = value;\n out.required = Array.isArray(raw)\n ? raw.filter((x): x is string => typeof x === \"string\")\n : typeof raw === \"string\"\n ? [raw]\n : [];\n continue;\n }\n if (key === \"nullable\") {\n // Skip copying nullable; we'll fix type below if nullable was true\n continue;\n }\n if (key === \"properties\" && value !== null && typeof value === \"object\") {\n const props: Record<string, unknown> = {};\n for (const [pk, pv] of Object.entries(value as Record<string, unknown>)) {\n if (pv !== null && typeof pv === \"object\" && !Array.isArray(pv)) {\n props[pk] = this.normalizeSchemaRec(pv as Record<string, unknown>);\n } else {\n props[pk] = pv;\n }\n }\n out.properties = props;\n continue;\n }\n if (\n (key === \"items\" || key === \"additionalProperties\") &&\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value)\n ) {\n out[key] = this.normalizeSchemaRec(value as Record<string, unknown>);\n continue;\n }\n if (\n (key === \"oneOf\" || key === \"anyOf\" || key === \"allOf\") &&\n Array.isArray(value)\n ) {\n out[key] = value.map((item) =>\n item !== null && typeof item === \"object\" && !Array.isArray(item)\n ? this.normalizeSchemaRec(item as Record<string, unknown>)\n : item,\n );\n continue;\n }\n out[key] = value;\n }\n\n // AJV: \"nullable\" requires \"type\". Convert nullable to type including \"null\".\n if (s.nullable === true) {\n const existingType = out.type;\n if (existingType === undefined) {\n out.type = \"object\";\n } else if (Array.isArray(existingType)) {\n if (!existingType.includes(\"null\")) out.type = [...existingType, \"null\"];\n } else {\n out.type = [existingType, \"null\"];\n }\n }\n return out;\n }\n}\n\n/**\n * Error thrown on schema validation failure.\n */\nexport class SchemaValidationError extends Error {\n constructor(\n message: string,\n public readonly errors: ErrorObject[],\n ) {\n super(message);\n this.name = \"SchemaValidationError\";\n }\n}\n","import type { Capability, ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext } from \"../types/ToolIntent.js\";\n\n/**\n * Policy configuration for the engine.\n */\nexport interface PolicyConfig {\n /** File system sandbox paths (allowed write directories) */\n sandboxPaths?: string[];\n /** Allowed URL patterns (regex strings) */\n urlAllowlist?: string[];\n /** Denied URL patterns (regex strings) */\n urlDenylist?: string[];\n /** SQL patterns that are denied (e.g., DROP, TRUNCATE) */\n deniedSqlPatterns?: string[];\n /** Network allowed domains */\n allowedDomains?: string[];\n /** Whether to require explicit permission for danger:destructive */\n requireExplicitDangerPermission?: boolean;\n}\n\n/**\n * Result of a policy check.\n */\nexport interface PolicyCheckResult {\n allowed: boolean;\n reason?: string;\n missingCapabilities?: Capability[];\n}\n\n/**\n * Policy engine for capability gating, parameter security, and access control.\n */\nexport class PolicyEngine {\n private readonly config: PolicyConfig;\n\n constructor(config: PolicyConfig = {}) {\n this.config = {\n requireExplicitDangerPermission: true,\n deniedSqlPatterns: [\"DROP\\\\s\", \"TRUNCATE\\\\s\", \"DELETE\\\\s+FROM\\\\s+\\\\w+\\\\s*$\"],\n ...config,\n };\n }\n\n /**\n * Enforce all policy checks. Throws PolicyDeniedError if denied.\n */\n enforce(spec: ToolSpec, args: unknown, ctx: ExecContext): void {\n const result = this.check(spec, args, ctx);\n if (!result.allowed) {\n throw new PolicyDeniedError(\n result.reason ?? \"Policy denied\",\n result.missingCapabilities,\n );\n }\n }\n\n /**\n * Check all policies without throwing.\n */\n check(spec: ToolSpec, args: unknown, ctx: ExecContext): PolicyCheckResult {\n // 1. Capability gate\n const capResult = this.checkCapabilities(spec, ctx);\n if (!capResult.allowed) return capResult;\n\n // 2. Parameter-level security\n const paramResult = this.checkParameters(spec, args);\n if (!paramResult.allowed) return paramResult;\n\n // 3. Dry-run check (if enabled, just allow but flag)\n return { allowed: true };\n }\n\n /**\n * Check that context permissions cover tool capabilities.\n */\n private checkCapabilities(\n spec: ToolSpec,\n ctx: ExecContext,\n ): PolicyCheckResult {\n const missing: Capability[] = [];\n\n for (const cap of spec.capabilities) {\n if (cap === \"danger:destructive\") {\n // Destructive capability requires explicit permission\n if (\n this.config.requireExplicitDangerPermission &&\n !ctx.permissions.includes(\"danger:destructive\")\n ) {\n missing.push(cap);\n }\n } else if (!ctx.permissions.includes(cap)) {\n missing.push(cap);\n }\n }\n\n if (missing.length > 0) {\n return {\n allowed: false,\n reason: `Missing capabilities: ${missing.join(\", \")}`,\n missingCapabilities: missing,\n };\n }\n\n return { allowed: true };\n }\n\n /**\n * Check parameter-level security constraints.\n */\n private checkParameters(spec: ToolSpec, args: unknown): PolicyCheckResult {\n if (!args || typeof args !== \"object\") return { allowed: true };\n\n const argsObj = args as Record<string, unknown>;\n\n // File path sandboxing\n if (spec.capabilities.includes(\"write:fs\") && this.config.sandboxPaths) {\n const pathResult = this.checkFilePaths(argsObj);\n if (!pathResult.allowed) return pathResult;\n }\n\n // URL allowlist/denylist\n if (\n spec.capabilities.includes(\"network\") ||\n spec.capabilities.includes(\"read:web\")\n ) {\n const urlResult = this.checkUrls(argsObj);\n if (!urlResult.allowed) return urlResult;\n }\n\n // SQL injection prevention\n if (\n spec.capabilities.includes(\"write:db\") ||\n spec.capabilities.includes(\"read:db\")\n ) {\n const sqlResult = this.checkSql(argsObj);\n if (!sqlResult.allowed) return sqlResult;\n }\n\n // Network domain restrictions\n if (spec.capabilities.includes(\"network\") && this.config.allowedDomains) {\n const domainResult = this.checkDomains(argsObj);\n if (!domainResult.allowed) return domainResult;\n }\n\n return { allowed: true };\n }\n\n private checkFilePaths(args: Record<string, unknown>): PolicyCheckResult {\n const paths = this.extractStringValues(args, [\"path\", \"file\", \"filepath\", \"filename\", \"dir\", \"directory\"]);\n for (const p of paths) {\n const normalized = p.replace(/\\.\\./g, \"\");\n if (p.includes(\"..\")) {\n return {\n allowed: false,\n reason: `Path traversal detected: ${p}`,\n };\n }\n if (this.config.sandboxPaths && this.config.sandboxPaths.length > 0) {\n const inSandbox = this.config.sandboxPaths.some(\n (sp) => normalized.startsWith(sp),\n );\n if (!inSandbox) {\n return {\n allowed: false,\n reason: `Path outside sandbox: ${p}. Allowed: ${this.config.sandboxPaths.join(\", \")}`,\n };\n }\n }\n }\n return { allowed: true };\n }\n\n private checkUrls(args: Record<string, unknown>): PolicyCheckResult {\n const urls = this.extractStringValues(args, [\"url\", \"endpoint\", \"href\", \"uri\"]);\n for (const url of urls) {\n // Check denylist\n if (this.config.urlDenylist) {\n for (const pattern of this.config.urlDenylist) {\n if (new RegExp(pattern, \"i\").test(url)) {\n return {\n allowed: false,\n reason: `URL denied by policy: ${url}`,\n };\n }\n }\n }\n // Check allowlist (if configured, URL must match)\n if (this.config.urlAllowlist && this.config.urlAllowlist.length > 0) {\n const allowed = this.config.urlAllowlist.some((pattern) =>\n new RegExp(pattern, \"i\").test(url),\n );\n if (!allowed) {\n return {\n allowed: false,\n reason: `URL not in allowlist: ${url}`,\n };\n }\n }\n }\n return { allowed: true };\n }\n\n private checkSql(args: Record<string, unknown>): PolicyCheckResult {\n const sqls = this.extractStringValues(args, [\"sql\", \"query\", \"statement\"]);\n for (const sql of sqls) {\n if (this.config.deniedSqlPatterns) {\n for (const pattern of this.config.deniedSqlPatterns) {\n if (new RegExp(pattern, \"i\").test(sql)) {\n return {\n allowed: false,\n reason: `SQL pattern denied: ${sql.slice(0, 50)}...`,\n };\n }\n }\n }\n }\n return { allowed: true };\n }\n\n private checkDomains(args: Record<string, unknown>): PolicyCheckResult {\n const urls = this.extractStringValues(args, [\"url\", \"endpoint\", \"href\", \"host\", \"domain\"]);\n for (const url of urls) {\n try {\n const hostname = url.includes(\"://\")\n ? new URL(url).hostname\n : url;\n if (\n this.config.allowedDomains &&\n !this.config.allowedDomains.some(\n (d) => hostname === d || hostname.endsWith(`.${d}`),\n )\n ) {\n return {\n allowed: false,\n reason: `Domain not allowed: ${hostname}`,\n };\n }\n } catch {\n // Not a valid URL, skip\n }\n }\n return { allowed: true };\n }\n\n /**\n * Extract string values from args matching given key patterns.\n */\n private extractStringValues(\n args: Record<string, unknown>,\n keyPatterns: string[],\n ): string[] {\n const results: string[] = [];\n const walk = (obj: Record<string, unknown>) => {\n for (const [key, val] of Object.entries(obj)) {\n const lowerKey = key.toLowerCase();\n if (\n typeof val === \"string\" &&\n keyPatterns.some((p) => lowerKey.includes(p))\n ) {\n results.push(val);\n } else if (val && typeof val === \"object\" && !Array.isArray(val)) {\n walk(val as Record<string, unknown>);\n }\n }\n };\n walk(args);\n return results;\n }\n}\n\n/**\n * Error thrown when policy denies execution.\n */\nexport class PolicyDeniedError extends Error {\n public readonly kind = \"POLICY_DENIED\";\n\n constructor(\n message: string,\n public readonly missingCapabilities?: Capability[],\n ) {\n super(message);\n this.name = \"PolicyDeniedError\";\n }\n}\n","import {\n bulkhead,\n circuitBreaker,\n ConsecutiveBreaker,\n handleAll,\n type CircuitBreakerPolicy,\n type BulkheadPolicy,\n} from \"cockatiel\";\n\n/**\n * Budget configuration for a tool or global scope.\n */\nexport interface BudgetOptions {\n /** Default timeout in ms for tool invocations */\n defaultTimeoutMs?: number;\n /** Max concurrent invocations per tool */\n maxConcurrency?: number;\n /** Rate limit: max calls per window */\n rateLimit?: { maxCalls: number; windowMs: number };\n /** Circuit breaker config */\n circuitBreaker?: {\n /** Number of consecutive failures before opening */\n threshold: number;\n /** Half-open reset time in ms */\n halfOpenAfterMs: number;\n };\n}\n\n/**\n * Per-tool rate limiter using sliding window.\n */\nclass RateLimiter {\n private readonly timestamps: number[] = [];\n\n constructor(\n private readonly maxCalls: number,\n private readonly windowMs: number,\n ) {}\n\n tryAcquire(): boolean {\n const now = Date.now();\n // Remove expired timestamps\n while (this.timestamps.length > 0 && this.timestamps[0]! <= now - this.windowMs) {\n this.timestamps.shift();\n }\n if (this.timestamps.length >= this.maxCalls) {\n return false;\n }\n this.timestamps.push(now);\n return true;\n }\n\n get remaining(): number {\n const now = Date.now();\n const active = this.timestamps.filter((t) => t > now - this.windowMs);\n return Math.max(0, this.maxCalls - active.length);\n }\n}\n\n/**\n * Budget manager that provides timeout, rate limiting, concurrency control,\n * and circuit breaker per tool.\n */\nexport class BudgetManager {\n private readonly defaultTimeoutMs: number;\n private readonly bulkheads = new Map<string, BulkheadPolicy>();\n private readonly circuitBreakers = new Map<string, CircuitBreakerPolicy>();\n private readonly rateLimiters = new Map<string, RateLimiter>();\n private readonly options: BudgetOptions;\n\n constructor(options: BudgetOptions = {}) {\n this.options = options;\n this.defaultTimeoutMs = options.defaultTimeoutMs ?? 30_000;\n }\n\n /**\n * Get effective timeout for a tool invocation.\n */\n getTimeout(_toolName: string, contextTimeoutMs?: number): number {\n return contextTimeoutMs ?? this.defaultTimeoutMs;\n }\n\n /**\n * Check rate limit for a tool. Returns true if allowed.\n */\n checkRateLimit(toolName: string): boolean {\n if (!this.options.rateLimit) return true;\n let limiter = this.rateLimiters.get(toolName);\n if (!limiter) {\n limiter = new RateLimiter(\n this.options.rateLimit.maxCalls,\n this.options.rateLimit.windowMs,\n );\n this.rateLimiters.set(toolName, limiter);\n }\n return limiter.tryAcquire();\n }\n\n /**\n * Get or create a bulkhead (concurrency limiter) for a tool.\n */\n getBulkhead(toolName: string): BulkheadPolicy | undefined {\n if (!this.options.maxConcurrency) return undefined;\n let bh = this.bulkheads.get(toolName);\n if (!bh) {\n bh = bulkhead(this.options.maxConcurrency, 0);\n this.bulkheads.set(toolName, bh);\n }\n return bh;\n }\n\n /**\n * Get or create a circuit breaker for a tool.\n */\n getCircuitBreaker(toolName: string): CircuitBreakerPolicy | undefined {\n if (!this.options.circuitBreaker) return undefined;\n let breaker = this.circuitBreakers.get(toolName);\n if (!breaker) {\n breaker = circuitBreaker(handleAll, {\n breaker: new ConsecutiveBreaker(this.options.circuitBreaker.threshold),\n halfOpenAfter: this.options.circuitBreaker.halfOpenAfterMs,\n });\n this.circuitBreakers.set(toolName, breaker);\n }\n return breaker;\n }\n\n /**\n * Execute a function within budget constraints (bulkhead + circuit breaker).\n */\n async execute<T>(toolName: string, fn: () => Promise<T>): Promise<T> {\n const bh = this.getBulkhead(toolName);\n const breaker = this.getCircuitBreaker(toolName);\n\n let wrapped: () => Promise<T> = fn;\n\n if (breaker) {\n const prevWrapped = wrapped;\n wrapped = () => breaker.execute(() => prevWrapped());\n }\n\n if (bh) {\n const prevWrapped = wrapped;\n wrapped = () => bh.execute(() => prevWrapped());\n }\n\n return wrapped();\n }\n\n /**\n * Reset all policies for a tool (useful for testing).\n */\n reset(toolName: string): void {\n this.bulkheads.delete(toolName);\n this.circuitBreakers.delete(toolName);\n this.rateLimiters.delete(toolName);\n }\n\n /**\n * Reset all policies globally.\n */\n resetAll(): void {\n this.bulkheads.clear();\n this.circuitBreakers.clear();\n this.rateLimiters.clear();\n }\n}\n","import type { ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext } from \"../types/ToolIntent.js\";\nimport type { Evidence } from \"../types/ToolResult.js\";\n\n/**\n * Options for building evidence from a tool invocation.\n */\nexport interface BuildEvidenceOptions {\n spec: ToolSpec;\n args: unknown;\n result: unknown;\n raw?: unknown;\n ctx: ExecContext;\n durationMs?: number;\n}\n\n/**\n * Build evidence records from a tool invocation result.\n */\nexport function buildEvidence(options: BuildEvidenceOptions): Evidence[] {\n const { spec, args, result, ctx, durationMs } = options;\n const now = new Date().toISOString();\n const evidence: Evidence[] = [];\n\n // Primary tool evidence\n evidence.push({\n type: \"tool\",\n ref: `${spec.name}@${spec.version}`,\n summary: summarizeToolCall(spec, args, result, durationMs),\n createdAt: now,\n });\n\n // If result contains a URL, add url evidence\n if (result && typeof result === \"object\") {\n const urls = extractUrls(result);\n for (const url of urls) {\n evidence.push({\n type: \"url\",\n ref: url,\n summary: `Output URL from ${spec.name}`,\n createdAt: now,\n });\n }\n\n // If result contains file paths, add file evidence\n const files = extractFilePaths(result);\n for (const file of files) {\n evidence.push({\n type: \"file\",\n ref: file,\n summary: `Output file from ${spec.name}`,\n createdAt: now,\n });\n }\n }\n\n // Add metric evidence if duration is significant\n if (durationMs !== undefined && durationMs > 0) {\n evidence.push({\n type: \"metric\",\n ref: `latency:${spec.name}`,\n summary: `Completed in ${durationMs}ms (request: ${ctx.requestId})`,\n createdAt: now,\n });\n }\n\n return evidence;\n}\n\nfunction summarizeToolCall(\n spec: ToolSpec,\n args: unknown,\n result: unknown,\n durationMs?: number,\n): string {\n const argKeys =\n args && typeof args === \"object\" ? Object.keys(args).join(\", \") : \"none\";\n const duration = durationMs ? ` in ${durationMs}ms` : \"\";\n const resultPreview = summarizeValue(result, 100);\n return `${spec.kind}:${spec.name} called with [${argKeys}]${duration} → ${resultPreview}`;\n}\n\nfunction summarizeValue(value: unknown, maxLen: number): string {\n if (value === null || value === undefined) return \"null\";\n if (typeof value === \"string\") {\n return value.length > maxLen ? value.slice(0, maxLen) + \"...\" : value;\n }\n const str = JSON.stringify(value);\n return str.length > maxLen ? str.slice(0, maxLen) + \"...\" : str;\n}\n\nfunction extractUrls(obj: object): string[] {\n const urls: string[] = [];\n const walk = (val: unknown) => {\n if (typeof val === \"string\" && /^https?:\\/\\//i.test(val)) {\n urls.push(val);\n } else if (val && typeof val === \"object\") {\n for (const v of Object.values(val)) {\n walk(v);\n }\n }\n };\n walk(obj);\n return urls.slice(0, 10); // Limit to prevent explosion\n}\n\nfunction extractFilePaths(obj: object): string[] {\n const paths: string[] = [];\n const walk = (val: unknown) => {\n if (\n typeof val === \"string\" &&\n (val.startsWith(\"/\") || val.startsWith(\"./\")) &&\n val.includes(\".\")\n ) {\n paths.push(val);\n } else if (val && typeof val === \"object\") {\n for (const v of Object.values(val)) {\n walk(v);\n }\n }\n };\n walk(obj);\n return paths.slice(0, 10);\n}\n","import { EventEmitter } from \"eventemitter3\";\nimport type { AnyToolEvent, ToolEventType } from \"../core/types/Events.js\";\n\n/**\n * Event log entry with sequence number.\n */\nexport interface LogEntry {\n seq: number;\n event: AnyToolEvent;\n}\n\n/**\n * Event log listener type.\n */\nexport type EventListener = (entry: LogEntry) => void;\n\n/**\n * Append-only event log for tool invocations.\n * Supports in-memory storage with configurable max size and event subscriptions.\n */\nexport class EventLog {\n private readonly entries: LogEntry[] = [];\n private seq = 0;\n private readonly maxEntries: number;\n private readonly emitter = new EventEmitter();\n\n constructor(options: { maxEntries?: number } = {}) {\n this.maxEntries = options.maxEntries ?? 10_000;\n }\n\n /**\n * Append an event to the log.\n */\n append(event: AnyToolEvent): LogEntry {\n const entry: LogEntry = { seq: ++this.seq, event };\n\n this.entries.push(entry);\n\n // Trim if over max\n if (this.entries.length > this.maxEntries) {\n this.entries.shift();\n }\n\n // Emit to subscribers\n this.emitter.emit(\"event\", entry);\n this.emitter.emit(event.type, entry);\n\n return entry;\n }\n\n /**\n * Subscribe to all events.\n */\n on(listener: EventListener): () => void {\n this.emitter.on(\"event\", listener);\n return () => this.emitter.off(\"event\", listener);\n }\n\n /**\n * Subscribe to events of a specific type.\n */\n onType(type: ToolEventType, listener: EventListener): () => void {\n this.emitter.on(type, listener);\n return () => this.emitter.off(type, listener);\n }\n\n /**\n * Query events by filter.\n */\n query(filter: {\n type?: ToolEventType;\n toolName?: string;\n requestId?: string;\n since?: number; // seq number\n limit?: number;\n }): LogEntry[] {\n let results = this.entries;\n\n if (filter.since !== undefined) {\n results = results.filter((e) => e.seq > filter.since!);\n }\n if (filter.type) {\n results = results.filter((e) => e.event.type === filter.type);\n }\n if (filter.toolName) {\n results = results.filter((e) => e.event.toolName === filter.toolName);\n }\n if (filter.requestId) {\n results = results.filter((e) => e.event.requestId === filter.requestId);\n }\n if (filter.limit) {\n results = results.slice(-filter.limit);\n }\n\n return results;\n }\n\n /**\n * Get all entries.\n */\n getAll(): readonly LogEntry[] {\n return this.entries;\n }\n\n /**\n * Get entry count.\n */\n get size(): number {\n return this.entries.length;\n }\n\n /**\n * Clear all entries (for testing).\n */\n clear(): void {\n this.entries.length = 0;\n this.seq = 0;\n }\n}\n","export type LogLevel = \"silent\" | \"error\" | \"warn\" | \"info\" | \"debug\" | \"trace\";\n\nexport interface DebugOptions {\n enabled?: boolean;\n level?: LogLevel;\n includeArgs?: boolean;\n includeResults?: boolean;\n includeRaw?: boolean;\n logEvents?: boolean;\n prefix?: string;\n}\n\nexport interface ResolvedDebugOptions {\n enabled: boolean;\n level: LogLevel;\n includeArgs: boolean;\n includeResults: boolean;\n includeRaw: boolean;\n logEvents: boolean;\n prefix: string;\n}\n\nexport interface Logger {\n options: ResolvedDebugOptions;\n isEnabled(level: LogLevel): boolean;\n error(message: string, meta?: Record<string, unknown>): void;\n warn(message: string, meta?: Record<string, unknown>): void;\n info(message: string, meta?: Record<string, unknown>): void;\n debug(message: string, meta?: Record<string, unknown>): void;\n trace(message: string, meta?: Record<string, unknown>): void;\n}\n\nconst LEVEL_ORDER: Record<LogLevel, number> = {\n silent: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n trace: 5,\n};\n\nexport function createLogger(options: DebugOptions = {}): Logger {\n const resolved = resolveDebugOptions(options);\n\n const log = (level: LogLevel, message: string, meta?: Record<string, unknown>) => {\n if (!resolved.enabled) return;\n if (LEVEL_ORDER[level] > LEVEL_ORDER[resolved.level]) return;\n\n const prefix = `[${resolved.prefix}]`;\n const levelTag = `[${level.toUpperCase()}]`;\n const metaText = meta ? ` ${safeStringify(meta, 1000)}` : \"\";\n\n switch (level) {\n case \"error\":\n console.error(`${prefix} ${levelTag} ${message}${metaText}`);\n break;\n case \"warn\":\n console.warn(`${prefix} ${levelTag} ${message}${metaText}`);\n break;\n case \"info\":\n console.info(`${prefix} ${levelTag} ${message}${metaText}`);\n break;\n default:\n console.log(`${prefix} ${levelTag} ${message}${metaText}`);\n break;\n }\n };\n\n return {\n options: resolved,\n isEnabled: (level) => resolved.enabled && LEVEL_ORDER[level] <= LEVEL_ORDER[resolved.level],\n error: (message, meta) => log(\"error\", message, meta),\n warn: (message, meta) => log(\"warn\", message, meta),\n info: (message, meta) => log(\"info\", message, meta),\n debug: (message, meta) => log(\"debug\", message, meta),\n trace: (message, meta) => log(\"trace\", message, meta),\n };\n}\n\nexport function resolveDebugOptions(options: DebugOptions = {}): ResolvedDebugOptions {\n const envLevel = parseEnvLogLevel();\n const enabledFromEnv = envLevel !== undefined && envLevel !== \"silent\";\n const enabled = options.enabled ?? enabledFromEnv ?? false;\n const level =\n options.level ?? envLevel ?? (enabled ? \"debug\" : \"silent\");\n\n return {\n enabled,\n level,\n includeArgs: options.includeArgs ?? false,\n includeResults: options.includeResults ?? false,\n includeRaw: options.includeRaw ?? false,\n logEvents: options.logEvents ?? false,\n prefix: options.prefix ?? \"agent-tool\",\n };\n}\n\nexport function sanitizeForLog(value: unknown, maxLen = 500): string {\n const str = safeStringify(value, maxLen);\n return str.replace(\n /\"(password|token|secret|key|auth)\":\\s*\"[^\"]*\"/gi,\n \"\\\"$1\\\":\\\"[REDACTED]\\\"\",\n );\n}\n\nexport function summarizeForLog(value: unknown, maxLen = 200): string {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n if (typeof value === \"string\") {\n return value.length > maxLen ? `${value.slice(0, maxLen)}...` : value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (Array.isArray(value)) {\n return `Array(${value.length})`;\n }\n if (typeof value === \"object\") {\n const keys = Object.keys(value as Record<string, unknown>);\n const shown = keys.slice(0, 5).join(\", \");\n return `Object(keys: ${shown}${keys.length > 5 ? \", ...\" : \"\"})`;\n }\n return String(value);\n}\n\nfunction safeStringify(value: unknown, maxLen: number): string {\n try {\n const json = JSON.stringify(value);\n if (!json) return String(value);\n return json.length > maxLen ? `${json.slice(0, maxLen)}...` : json;\n } catch {\n const fallback = String(value);\n return fallback.length > maxLen ? `${fallback.slice(0, maxLen)}...` : fallback;\n }\n}\n\nfunction parseEnvLogLevel(): LogLevel | undefined {\n const raw =\n process.env.TOOLHUB_LOG_LEVEL ??\n process.env.TOOLHUB_DEBUG ??\n process.env.DEBUG;\n\n if (!raw) return undefined;\n const value = raw.trim().toLowerCase();\n if (!value || value === \"0\" || value === \"false\" || value === \"off\") {\n return \"silent\";\n }\n if (value.includes(\"trace\")) return \"trace\";\n if (value.includes(\"debug\") || value === \"1\" || value === \"true\" || value === \"yes\") {\n return \"debug\";\n }\n if (value.includes(\"info\")) return \"info\";\n if (value.includes(\"warn\")) return \"warn\";\n if (value.includes(\"error\")) return \"error\";\n if (value.includes(\"silent\")) return \"silent\";\n return \"debug\";\n}\n","/**\n * Simple counter metric.\n */\nexport interface CounterValue {\n name: string;\n labels: Record<string, string>;\n value: number;\n}\n\n/**\n * Histogram bucket.\n */\nexport interface HistogramValue {\n name: string;\n labels: Record<string, string>;\n count: number;\n sum: number;\n buckets: Map<number, number>; // upper bound → count\n}\n\n/**\n * Lightweight metrics collector for tool invocations.\n * Provides counters and histograms with label support.\n */\nexport class Metrics {\n private readonly counters = new Map<string, number>();\n private readonly histograms = new Map<\n string,\n { count: number; sum: number; values: number[] }\n >();\n\n private readonly defaultBuckets = [\n 5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000,\n ];\n\n /**\n * Increment a counter.\n */\n increment(name: string, labels: Record<string, string> = {}, value = 1): void {\n const key = this.makeKey(name, labels);\n this.counters.set(key, (this.counters.get(key) ?? 0) + value);\n }\n\n /**\n * Record a value in a histogram.\n */\n observe(name: string, labels: Record<string, string>, value: number): void {\n const key = this.makeKey(name, labels);\n let hist = this.histograms.get(key);\n if (!hist) {\n hist = { count: 0, sum: 0, values: [] };\n this.histograms.set(key, hist);\n }\n hist.count++;\n hist.sum += value;\n hist.values.push(value);\n }\n\n /**\n * Get a counter value.\n */\n getCounter(name: string, labels: Record<string, string> = {}): number {\n return this.counters.get(this.makeKey(name, labels)) ?? 0;\n }\n\n /**\n * Get histogram stats.\n */\n getHistogram(\n name: string,\n labels: Record<string, string>,\n ): HistogramValue | undefined {\n const key = this.makeKey(name, labels);\n const hist = this.histograms.get(key);\n if (!hist) return undefined;\n\n const buckets = new Map<number, number>();\n for (const bound of this.defaultBuckets) {\n buckets.set(bound, hist.values.filter((v) => v <= bound).length);\n }\n\n return { name, labels, count: hist.count, sum: hist.sum, buckets };\n }\n\n /**\n * Get all counter values.\n */\n getAllCounters(): CounterValue[] {\n const results: CounterValue[] = [];\n for (const [key, value] of this.counters) {\n const { name, labels } = this.parseKey(key);\n results.push({ name, labels, value });\n }\n return results;\n }\n\n /**\n * Get all histogram values.\n */\n getAllHistograms(): HistogramValue[] {\n const results: HistogramValue[] = [];\n for (const [key, hist] of this.histograms) {\n const { name, labels } = this.parseKey(key);\n const buckets = new Map<number, number>();\n for (const bound of this.defaultBuckets) {\n buckets.set(bound, hist.values.filter((v) => v <= bound).length);\n }\n results.push({ name, labels, count: hist.count, sum: hist.sum, buckets });\n }\n return results;\n }\n\n /**\n * Record standard tool invocation metrics.\n */\n recordInvocation(toolName: string, ok: boolean, durationMs: number): void {\n this.increment(\"tool_invocations_total\", {\n toolName,\n ok: String(ok),\n });\n this.observe(\"tool_latency_ms\", { toolName }, durationMs);\n }\n\n /**\n * Record a retry event.\n */\n recordRetry(toolName: string): void {\n this.increment(\"tool_retries_total\", { toolName });\n }\n\n /**\n * Record a policy denial.\n */\n recordPolicyDenied(toolName: string, reason: string): void {\n this.increment(\"policy_denied_total\", { toolName, reason });\n }\n\n /**\n * Reset all metrics (for testing).\n */\n reset(): void {\n this.counters.clear();\n this.histograms.clear();\n }\n\n private makeKey(name: string, labels: Record<string, string>): string {\n const sortedLabels = Object.entries(labels)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${k}=${v}`)\n .join(\",\");\n return `${name}{${sortedLabels}}`;\n }\n\n private parseKey(key: string): {\n name: string;\n labels: Record<string, string>;\n } {\n const match = key.match(/^(.+?)\\{(.*)\\}$/);\n if (!match) return { name: key, labels: {} };\n const labels: Record<string, string> = {};\n if (match[2]) {\n for (const part of match[2].split(\",\")) {\n const [k, v] = part.split(\"=\");\n if (k && v !== undefined) labels[k] = v;\n }\n }\n return { name: match[1]!, labels };\n }\n}\n","import { v4 as uuidv4 } from \"uuid\";\n\n/**\n * A trace span representing a unit of work.\n */\nexport interface Span {\n spanId: string;\n traceId: string;\n parentSpanId?: string;\n name: string;\n startTime: number; // ms epoch\n endTime?: number;\n durationMs?: number;\n status: \"ok\" | \"error\" | \"in_progress\";\n attributes: Record<string, string | number | boolean>;\n events: SpanEvent[];\n}\n\n/**\n * An event within a span.\n */\nexport interface SpanEvent {\n name: string;\n timestamp: number;\n attributes?: Record<string, string | number | boolean>;\n}\n\n/**\n * Lightweight tracing system for tool invocation spans.\n * Compatible with OpenTelemetry trace/span ID format.\n */\nexport class Tracing {\n private readonly spans = new Map<string, Span>();\n private readonly traceSpans = new Map<string, string[]>(); // traceId → spanIds\n\n /**\n * Start a new span.\n */\n startSpan(options: {\n name: string;\n traceId?: string;\n parentSpanId?: string;\n attributes?: Record<string, string | number | boolean>;\n }): Span {\n const span: Span = {\n spanId: uuidv4(),\n traceId: options.traceId ?? uuidv4(),\n parentSpanId: options.parentSpanId,\n name: options.name,\n startTime: Date.now(),\n status: \"in_progress\",\n attributes: options.attributes ?? {},\n events: [],\n };\n\n this.spans.set(span.spanId, span);\n\n const traceList = this.traceSpans.get(span.traceId) ?? [];\n traceList.push(span.spanId);\n this.traceSpans.set(span.traceId, traceList);\n\n return span;\n }\n\n /**\n * End a span and calculate duration.\n */\n endSpan(spanId: string, status: \"ok\" | \"error\" = \"ok\"): Span | undefined {\n const span = this.spans.get(spanId);\n if (!span) return undefined;\n\n span.endTime = Date.now();\n span.durationMs = span.endTime - span.startTime;\n span.status = status;\n return span;\n }\n\n /**\n * Add an event to a span.\n */\n addEvent(\n spanId: string,\n name: string,\n attributes?: Record<string, string | number | boolean>,\n ): void {\n const span = this.spans.get(spanId);\n if (!span) return;\n span.events.push({ name, timestamp: Date.now(), attributes });\n }\n\n /**\n * Set attributes on a span.\n */\n setAttributes(\n spanId: string,\n attributes: Record<string, string | number | boolean>,\n ): void {\n const span = this.spans.get(spanId);\n if (!span) return;\n Object.assign(span.attributes, attributes);\n }\n\n /**\n * Get a span by ID.\n */\n getSpan(spanId: string): Span | undefined {\n return this.spans.get(spanId);\n }\n\n /**\n * Get all spans for a trace.\n */\n getTrace(traceId: string): Span[] {\n const spanIds = this.traceSpans.get(traceId) ?? [];\n return spanIds\n .map((id) => this.spans.get(id))\n .filter((s): s is Span => s !== undefined);\n }\n\n /**\n * Create a child span from a parent.\n */\n createChildSpan(\n parentSpanId: string,\n name: string,\n attributes?: Record<string, string | number | boolean>,\n ): Span | undefined {\n const parent = this.spans.get(parentSpanId);\n if (!parent) return undefined;\n return this.startSpan({\n name,\n traceId: parent.traceId,\n parentSpanId: parent.spanId,\n attributes,\n });\n }\n\n /**\n * Clear all traces (for testing).\n */\n clear(): void {\n this.spans.clear();\n this.traceSpans.clear();\n }\n}\n","import pTimeout from \"p-timeout\";\nimport type { ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext } from \"../types/ToolIntent.js\";\nimport type { ToolAdapter } from \"../types/ToolSpec.js\";\nimport { normalizeToolName } from \"../types/ToolSpec.js\";\nimport { SchemaValidator, SchemaValidationError } from \"./SchemaValidator.js\";\nimport { PolicyEngine, PolicyDeniedError } from \"./PolicyEngine.js\";\nimport { BudgetManager } from \"./Budget.js\";\nimport { withRetry, createTaggedError } from \"./Retry.js\";\nimport type {\n PolicyDeniedEvent,\n RetryEvent,\n HitlApprovalRequestedEvent,\n HitlApprovalGrantedEvent,\n HitlApprovalDeniedEvent,\n} from \"../types/Events.js\";\nimport type { HitlSideEffect } from \"../types/ToolSpec.js\";\nimport { EventLog } from \"../../observability/EventLog.js\";\nimport { Metrics } from \"../../observability/Metrics.js\";\nimport { Tracing } from \"../../observability/Tracing.js\";\nimport type { Logger } from \"../../observability/Logger.js\";\n\n/** Called when tool has sideEffect external_write/destructive; return true/void to approve, false to deny. */\nexport type OnApprovalRequired = (\n spec: ToolSpec,\n args: unknown,\n ctx: ExecContext,\n) => Promise<boolean | void>;\n\nexport interface PipelineDependencies {\n registry: { get(name: string): ToolSpec | undefined; snapshot(): ToolSpec[] };\n adapters: Map<string, ToolAdapter>;\n adaptersByToolName: Map<string, ToolAdapter>;\n validator: SchemaValidator;\n policy: PolicyEngine;\n budget: BudgetManager;\n eventLog: EventLog;\n metrics: Metrics;\n tracing: Tracing;\n logger: Logger;\n defaultMaxRetries?: number;\n /** HITL: when set, tools with sideEffect external_write/destructive require human approval before execute */\n onApprovalRequired?: OnApprovalRequired;\n}\n\n/**\n * Pipeline step: Resolve tool from registry (tool name is normalized before lookup).\n */\nexport function resolveTool(\n toolName: string,\n registry: PipelineDependencies[\"registry\"],\n): ToolSpec {\n const key = normalizeToolName(toolName);\n const spec = registry.get(key);\n if (!spec) {\n throw createTaggedError(\n \"TOOL_NOT_FOUND\",\n `Tool not found: ${toolName}`,\n { availableTools: registry.snapshot().slice(0, 20).map(s => s.name) },\n );\n }\n return spec;\n}\n\n/**\n * Common input aliases: alias key -> canonical key.\n * Applied when the tool's input schema requires the canonical key but the caller passed the alias.\n * No tool-specific logic; any tool with required \"query\" will accept \"q\".\n */\nconst INPUT_ALIASES: Record<string, string> = {\n q: \"query\",\n};\n\n/**\n * Pipeline step: Normalize common input aliases so LLM typos (e.g. \"q\" for \"query\") work.\n * Uses INPUT_ALIASES and the tool's required keys; no tool name checks.\n * Runs before validation so schema sees the canonical keys.\n */\nexport function normalizeInputAliases(spec: ToolSpec, args: unknown): unknown {\n if (args == null || typeof args !== \"object\" || Array.isArray(args)) {\n return args;\n }\n const required = getRequiredKeys(spec.inputSchema);\n const obj = args as Record<string, unknown>;\n let changed = false;\n const out = { ...obj };\n for (const [aliasKey, canonicalKey] of Object.entries(INPUT_ALIASES)) {\n if (\n required.includes(canonicalKey) &&\n (out[canonicalKey] === undefined || out[canonicalKey] === \"\") &&\n out[aliasKey] !== undefined &&\n out[aliasKey] !== \"\"\n ) {\n out[canonicalKey] = out[aliasKey];\n delete (out as Record<string, unknown>)[aliasKey];\n changed = true;\n }\n }\n return changed ? out : args;\n}\n\n/**\n * Pipeline step: Validate input against schema.\n */\nexport function validateInput(\n spec: ToolSpec,\n args: unknown,\n validator: SchemaValidator,\n): unknown {\n try {\n return validator.validateOrThrow(\n spec.inputSchema,\n args,\n `Input validation failed for ${spec.name}`,\n );\n } catch (error) {\n if (error instanceof SchemaValidationError) {\n const requiredKeys = getRequiredKeys(spec.inputSchema);\n const passedKeys =\n args != null && typeof args === \"object\" && !Array.isArray(args)\n ? Object.keys(args)\n : [];\n throw createTaggedError(\"INPUT_SCHEMA_INVALID\", error.message, {\n errors: error.errors,\n schema: spec.inputSchema,\n requiredKeys: requiredKeys.length ? requiredKeys : undefined,\n passedKeys: passedKeys.length ? passedKeys : undefined,\n hint:\n requiredKeys.length > 0\n ? `Expected input property ${requiredKeys.length === 1 ? `'${requiredKeys[0]}'` : `[${requiredKeys.map((k) => `'${k}'`).join(\", \")}]`}. You passed: ${passedKeys.length ? passedKeys.map((k) => `'${k}'`).join(\", \") : \"none\"}. Use the exact property names from the tool schema.`\n : undefined,\n });\n }\n throw error;\n }\n}\n\nfunction getRequiredKeys(schema: object): string[] {\n const s = schema as { required?: unknown };\n const raw = s.required;\n if (!Array.isArray(raw)) return [];\n return raw.filter((k): k is string => typeof k === \"string\");\n}\n\n/**\n * Pipeline step: Enrich args with defaults from schema.\n */\nexport function enrichDefaults(\n spec: ToolSpec,\n args: unknown,\n validator: SchemaValidator,\n): unknown {\n return validator.enrichDefaults(spec.inputSchema, args);\n}\n\n/**\n * Pipeline step: Enforce policy checks.\n */\nexport function enforcePolicy(\n spec: ToolSpec,\n args: unknown,\n ctx: ExecContext,\n deps: Pick<\n PipelineDependencies,\n \"policy\" | \"eventLog\" | \"metrics\" | \"tracing\"\n >,\n): void {\n try {\n deps.policy.enforce(spec, args, ctx);\n } catch (error) {\n if (error instanceof PolicyDeniedError) {\n // Emit policy denied event\n const event: PolicyDeniedEvent = {\n type: \"POLICY_DENIED\",\n timestamp: new Date().toISOString(),\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n toolName: spec.name,\n traceId: ctx.traceId,\n userId: ctx.userId,\n reason: error.message,\n missingCapabilities: error.missingCapabilities?.map(String),\n };\n deps.eventLog.append(event);\n deps.metrics.recordPolicyDenied(spec.name, error.message);\n }\n throw error;\n }\n}\n\nconst HITL_GATED_SIDE_EFFECTS: HitlSideEffect[] = [\"external_write\", \"destructive\"];\n\n/**\n * Pipeline step: Human-in-the-loop approval for external_write/destructive tools.\n * When onApprovalRequired is set, waits for callback resolve(true/void) before continuing; resolve(false) or reject throws HITL_DENIED.\n */\nexport async function requireHumanApproval(\n spec: ToolSpec,\n args: unknown,\n ctx: ExecContext,\n deps: Pick<PipelineDependencies, \"onApprovalRequired\" | \"eventLog\" | \"logger\">,\n): Promise<void> {\n const sideEffect = (spec._meta?.hitl?.sideEffect ?? \"none\") as HitlSideEffect;\n if (!HITL_GATED_SIDE_EFFECTS.includes(sideEffect)) return;\n const onApproval = deps.onApprovalRequired;\n if (!onApproval) return;\n\n const baseEvent = {\n timestamp: new Date().toISOString(),\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n toolName: spec.name,\n traceId: ctx.traceId,\n userId: ctx.userId,\n };\n\n const requested: HitlApprovalRequestedEvent = {\n ...baseEvent,\n type: \"HITL_APPROVAL_REQUESTED\",\n sideEffect,\n };\n deps.eventLog.append(requested);\n deps.logger.trace(\"hitl.requested\", { tool: spec.name, sideEffect, requestId: ctx.requestId });\n\n let approved: boolean | void;\n try {\n approved = await onApproval(spec, args, ctx);\n } catch (err) {\n deps.eventLog.append({\n ...baseEvent,\n type: \"HITL_APPROVAL_DENIED\",\n sideEffect,\n reason: err instanceof Error ? err.message : String(err),\n } as HitlApprovalDeniedEvent);\n throw createTaggedError(\n \"HITL_DENIED\",\n `Human denied approval for ${spec.name} (${sideEffect})`,\n { reason: err instanceof Error ? err.message : String(err) },\n );\n }\n\n if (approved === false) {\n deps.eventLog.append({\n ...baseEvent,\n type: \"HITL_APPROVAL_DENIED\",\n sideEffect,\n reason: \"User rejected\",\n } as HitlApprovalDeniedEvent);\n throw createTaggedError(\"HITL_DENIED\", `Human denied approval for ${spec.name} (${sideEffect})`);\n }\n\n deps.eventLog.append({\n ...baseEvent,\n type: \"HITL_APPROVAL_GRANTED\",\n sideEffect,\n } as HitlApprovalGrantedEvent);\n deps.logger.trace(\"hitl.granted\", { tool: spec.name, sideEffect, requestId: ctx.requestId });\n}\n\n/**\n * Pipeline step: Execute tool with budget, retry, and timeout.\n */\nexport async function executeWithBudget(\n spec: ToolSpec,\n args: unknown,\n ctx: ExecContext,\n spanId: string,\n deps: PipelineDependencies,\n): Promise<{ result: unknown; raw?: unknown }> {\n const adapter = deps.adaptersByToolName.get(spec.name) ?? deps.adapters.get(spec.kind);\n if (!adapter) {\n throw createTaggedError(\n \"TOOL_NOT_FOUND\",\n `No adapter registered for kind: ${spec.kind}`,\n );\n }\n\n const timeoutMs = deps.budget.getTimeout(\n spec.name,\n ctx.budget?.timeoutMs,\n );\n const maxRetries = ctx.budget?.maxRetries ?? deps.defaultMaxRetries ?? 2;\n\n const executeFn = async () => {\n return deps.budget.execute(spec.name, async () => {\n deps.tracing.addEvent(spanId, \"execute_start\");\n deps.logger.trace(\"execute.start\", {\n tool: spec.name,\n requestId: ctx.requestId,\n timeoutMs,\n maxRetries,\n });\n const result = await adapter.invoke(spec, args, ctx);\n deps.tracing.addEvent(spanId, \"execute_end\");\n deps.logger.trace(\"execute.end\", {\n tool: spec.name,\n requestId: ctx.requestId,\n });\n return result;\n });\n };\n\n // Wrap with retry\n const retryFn = () =>\n withRetry(executeFn, {\n maxRetries,\n onRetry: (error, attempt) => {\n deps.metrics.recordRetry(spec.name);\n const event: RetryEvent = {\n type: \"RETRY\",\n timestamp: new Date().toISOString(),\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n toolName: spec.name,\n traceId: ctx.traceId,\n userId: ctx.userId,\n attempt,\n maxRetries,\n reason: error.message,\n };\n deps.eventLog.append(event);\n deps.tracing.addEvent(spanId, \"retry\", { attempt, reason: error.message });\n },\n });\n\n // Wrap with timeout\n try {\n return await pTimeout(retryFn(), {\n milliseconds: timeoutMs,\n message: `Tool ${spec.name} timed out after ${timeoutMs}ms`,\n });\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"timed out\")) {\n throw createTaggedError(\"TIMEOUT\", error.message);\n }\n throw error;\n }\n}\n\n/**\n * Pipeline step: Validate output against schema.\n */\nexport function validateOutput(\n spec: ToolSpec,\n result: unknown,\n validator: SchemaValidator,\n): unknown {\n try {\n return validator.validateOrThrow(\n spec.outputSchema,\n result,\n `Output validation failed for ${spec.name}`,\n );\n } catch (error) {\n if (error instanceof SchemaValidationError) {\n throw createTaggedError(\"OUTPUT_SCHEMA_INVALID\", error.message, {\n errors: error.errors,\n });\n }\n throw error;\n }\n}\n","import type { ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext, ToolIntent } from \"../types/ToolIntent.js\";\nimport type { Evidence, ToolResult } from \"../types/ToolResult.js\";\nimport type {\n ToolCalledEvent,\n ToolResultEvent,\n} from \"../types/Events.js\";\nimport { EventLog } from \"../../observability/EventLog.js\";\nimport { Metrics } from \"../../observability/Metrics.js\";\nimport { Tracing } from \"../../observability/Tracing.js\";\nimport { sanitizeForLog, summarizeForLog } from \"../../observability/Logger.js\";\nimport type { Logger } from \"../../observability/Logger.js\";\n\nexport interface ObservabilityDependencies {\n eventLog: EventLog;\n metrics: Metrics;\n tracing: Tracing;\n logger: Logger;\n}\n\n/**\n * Emit TOOL_CALLED event.\n */\nexport function emitToolCalled(\n intent: ToolIntent,\n ctx: ExecContext,\n deps: ObservabilityDependencies,\n): void {\n const event: ToolCalledEvent = {\n type: \"TOOL_CALLED\",\n timestamp: new Date().toISOString(),\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n toolName: intent.tool,\n traceId: ctx.traceId,\n userId: ctx.userId,\n argsSummary: sanitizeArgs(intent.args),\n purpose: intent.purpose,\n idempotencyKey: intent.idempotencyKey,\n };\n deps.eventLog.append(event);\n}\n\n/**\n * Record successful tool invocation.\n */\nexport function recordSuccess(\n spec: ToolSpec,\n durationMs: number,\n _evidence: Evidence[],\n spanId: string,\n deps: ObservabilityDependencies,\n): void {\n deps.metrics.recordInvocation(spec.name, true, durationMs);\n deps.tracing.setAttributes(spanId, {\n \"tool.duration_ms\": durationMs,\n \"tool.ok\": true,\n });\n deps.tracing.endSpan(spanId, \"ok\");\n}\n\n/**\n * Handle error and return ToolResult.\n */\nexport function handleError(\n error: unknown,\n intent: ToolIntent,\n ctx: ExecContext,\n durationMs: number,\n spanId: string,\n deps: ObservabilityDependencies,\n): ToolResult {\n const kind = (error as any)?.kind ?? \"UPSTREAM_ERROR\";\n const message =\n error instanceof Error ? error.message : String(error);\n const details = (error as any)?.details;\n\n // Metrics & tracing\n deps.metrics.recordInvocation(intent.tool, false, durationMs);\n deps.tracing.setAttributes(spanId, {\n \"tool.duration_ms\": durationMs,\n \"tool.ok\": false,\n \"tool.error_kind\": kind,\n });\n deps.tracing.endSpan(spanId, \"error\");\n\n // Event log\n const event: ToolResultEvent = {\n type: \"TOOL_RESULT\",\n timestamp: new Date().toISOString(),\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n toolName: intent.tool,\n traceId: ctx.traceId,\n userId: ctx.userId,\n ok: false,\n durationMs,\n resultSummary: message,\n evidence: [],\n error: { kind, message, details },\n };\n deps.eventLog.append(event);\n\n deps.logger.warn(\"invoke.error\", {\n tool: intent.tool,\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n traceId: ctx.traceId,\n kind,\n message,\n durationMs,\n details: deps.logger.options.includeResults\n ? summarizeForLog(details)\n : undefined,\n });\n\n return {\n ok: false,\n evidence: [],\n error: { kind, message, details },\n };\n}\n\nfunction sanitizeArgs(args: unknown): string {\n if (!args) return \"{}\";\n return sanitizeForLog(args);\n}\n","import type { ToolAdapter, ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext, ToolIntent } from \"../types/ToolIntent.js\";\nimport type { ToolResult, Evidence } from \"../types/ToolResult.js\";\nimport { ToolRegistry } from \"../registry/ToolRegistry.js\";\nimport { SchemaValidator } from \"./SchemaValidator.js\";\nimport { PolicyEngine } from \"./PolicyEngine.js\";\nimport { BudgetManager } from \"./Budget.js\";\nimport { buildEvidence } from \"./Evidence.js\";\nimport { EventLog } from \"../../observability/EventLog.js\";\nimport { createLogger, summarizeForLog, sanitizeForLog } from \"../../observability/Logger.js\";\nimport type { DebugOptions, Logger } from \"../../observability/Logger.js\";\nimport { Metrics } from \"../../observability/Metrics.js\";\nimport { Tracing } from \"../../observability/Tracing.js\";\nimport type { PolicyConfig } from \"./PolicyEngine.js\";\nimport type { BudgetOptions } from \"./Budget.js\";\nimport { createTaggedError } from \"./Retry.js\";\nimport {\n resolveTool,\n normalizeInputAliases,\n validateInput,\n enrichDefaults,\n enforcePolicy,\n requireHumanApproval,\n executeWithBudget,\n validateOutput,\n type PipelineDependencies,\n} from \"./PTCRuntimePipeline.js\";\nimport {\n emitToolCalled,\n recordSuccess,\n handleError,\n type ObservabilityDependencies,\n} from \"./PTCRuntimeObservability.js\";\n\n/**\n * PTC Runtime configuration.\n */\nexport interface PTCRuntimeConfig {\n policy?: PolicyConfig;\n budget?: BudgetOptions;\n /** Include raw response in ToolResult (default: true, disable in production) */\n includeRaw?: boolean;\n /** Maximum retries if not specified in context (default: 2) */\n defaultMaxRetries?: number;\n /** Debug/logging configuration */\n debug?: DebugOptions;\n /** HITL: when set, tools with sideEffect external_write/destructive require human approval before execute; callback returns true/void to approve, false to deny */\n onApprovalRequired?: (\n spec: import(\"../types/ToolSpec.js\").ToolSpec,\n args: unknown,\n ctx: import(\"../types/ToolIntent.js\").ExecContext,\n ) => Promise<boolean | void>;\n}\n\n/**\n * PTC Runtime: the unified execution kernel for all tool invocations.\n *\n * Enforces the mandatory 9-step pipeline:\n * 1. Resolve (Registry lookup)\n * 2. Input Validate (AJV)\n * 3. Defaults Enrich\n * 4. Policy Gate\n * 5. Budget check\n * 6. HITL approval (if onApprovalRequired set and tool sideEffect external_write/destructive)\n * 7. Execute (adapter.invoke())\n * 8. Output Validate (AJV)\n * 9. Evidence Build\n * 10. Audit & Metrics\n *\n * Never throws to callers - always returns ToolResult.\n */\nexport class PTCRuntime {\n private readonly registry: ToolRegistry;\n private readonly adapters = new Map<string, ToolAdapter>();\n private readonly adaptersByToolName = 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 * Bind an adapter to exact tool keys (full package path + tool path).\n * This avoids collisions when multiple extensions share the same kind.\n */\n registerAdapterForTools(toolNames: string[], adapter: ToolAdapter): void {\n for (const name of toolNames) {\n this.adaptersByToolName.set(name, adapter);\n }\n }\n\n /**\n * Get an adapter by kind (e.g. \"mcp\"). Use to set MCP client via adapter.setClient().\n */\n getAdapter(kind: string): ToolAdapter | undefined {\n return this.adapters.get(kind);\n }\n\n /**\n * Get the tool registry.\n */\n getRegistry(): ToolRegistry {\n return this.registry;\n }\n\n /**\n * Get the event log.\n */\n getEventLog(): EventLog {\n return this.eventLog;\n }\n\n /**\n * Get the metrics collector.\n */\n getMetrics(): Metrics {\n return this.metrics;\n }\n\n /**\n * Get the tracing system.\n */\n getTracing(): Tracing {\n return this.tracing;\n }\n\n /**\n * Invoke a tool through the PTC pipeline.\n * Never throws - always returns a structured ToolResult.\n */\n async invoke(intent: ToolIntent, ctx: ExecContext): Promise<ToolResult> {\n const startTime = Date.now();\n if (this.logger.isEnabled(\"debug\")) {\n this.logger.debug(\"invoke.start\", {\n tool: intent.tool,\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n traceId: ctx.traceId,\n purpose: intent.purpose,\n args: this.logger.options.includeArgs\n ? sanitizeForLog(intent.args)\n : undefined,\n });\n }\n const span = this.tracing.startSpan({\n name: `tool:${intent.tool}`,\n traceId: ctx.traceId,\n attributes: {\n \"tool.name\": intent.tool,\n \"tool.purpose\": intent.purpose,\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n },\n });\n\n // Emit TOOL_CALLED event\n emitToolCalled(intent, ctx, this.getObservabilityDeps());\n\n try {\n // Step 1: Resolve\n const spec = resolveTool(intent.tool, this.registry);\n\n this.tracing.addEvent(span.spanId, \"resolved\", {\n kind: spec.kind,\n version: spec.version,\n });\n\n // Step 1.5: Normalize input aliases (e.g. q -> query for duckduckgoSearch)\n const normalizedArgs = normalizeInputAliases(spec, intent.args);\n\n // Step 2: Input Validate\n const validatedArgs = validateInput(spec, normalizedArgs, this.validator);\n\n // Step 3: Defaults Enrich\n const enrichedArgs = enrichDefaults(spec, validatedArgs, this.validator);\n\n // Step 4: Policy Gate\n enforcePolicy(spec, enrichedArgs, ctx, {\n policy: this.policy,\n eventLog: this.eventLog,\n metrics: this.metrics,\n tracing: this.tracing,\n });\n\n // Step 5: Budget check\n if (!this.budget.checkRateLimit(spec.name)) {\n throw createTaggedError(\n \"BUDGET_EXCEEDED\",\n `Rate limit exceeded for tool: ${spec.name}`,\n );\n }\n\n // Step 6: HITL approval (for external_write/destructive when onApprovalRequired set)\n await requireHumanApproval(spec, enrichedArgs, ctx, {\n onApprovalRequired: this.config.onApprovalRequired,\n eventLog: this.eventLog,\n logger: this.logger,\n });\n\n // Dry-run mode: return without execution\n if (ctx.dryRun) {\n return this.buildDryRunResult(spec, enrichedArgs, ctx, startTime, span.spanId);\n }\n\n // Step 7: Execute with budget (timeout + retry + circuit breaker)\n const { result, raw } = await executeWithBudget(\n spec,\n enrichedArgs,\n ctx,\n span.spanId,\n this.getPipelineDeps(),\n );\n\n // Treat tool-returned error shape as failure and give actionable feedback (e.g. \"use 'query' not 'q'\")\n const toolError = asToolReturnedError(result);\n if (toolError) {\n const hint = buildInputSchemaHint(spec.inputSchema);\n throw createTaggedError(\"UPSTREAM_ERROR\", toolError.message, {\n ...(toolError.details && typeof toolError.details === \"object\" && !Array.isArray(toolError.details)\n ? (toolError.details as object)\n : {}),\n hint: hint ?? \"Check the tool's input schema for required property names.\",\n });\n }\n\n // Step 8: Output Validate\n const validatedOutput = validateOutput(spec, result, this.validator);\n\n // Step 9: Evidence Build (merge adapter-provided evidence with built evidence)\n const durationMs = Date.now() - startTime;\n const builtEvidence = buildEvidence({\n spec,\n args: enrichedArgs,\n result: validatedOutput,\n raw,\n ctx,\n durationMs,\n });\n const adapterEvidence: Evidence[] =\n raw &&\n typeof raw === \"object\" &&\n Array.isArray((raw as { evidence?: Evidence[] }).evidence)\n ? ((raw as { evidence: Evidence[] }).evidence as Evidence[])\n : [];\n const evidence = [...adapterEvidence, ...builtEvidence];\n\n // Step 10: Audit & Metrics\n recordSuccess(spec, durationMs, evidence, span.spanId, this.getObservabilityDeps());\n\n if (this.logger.isEnabled(\"debug\")) {\n this.logger.debug(\"invoke.ok\", {\n tool: spec.name,\n durationMs,\n result: this.logger.options.includeResults\n ? summarizeForLog(validatedOutput)\n : undefined,\n raw: this.logger.options.includeRaw\n ? summarizeForLog(raw)\n : undefined,\n });\n }\n\n return {\n ok: true,\n result: validatedOutput,\n evidence,\n raw: this.config.includeRaw !== false ? raw : undefined,\n };\n } catch (error) {\n const durationMs = Date.now() - startTime;\n return handleError(error, intent, ctx, durationMs, span.spanId, this.getObservabilityDeps());\n }\n }\n\n /**\n * Search for tools in the registry.\n */\n searchTools(\n query: string,\n filters?: { kind?: string; capabilities?: string[]; tags?: string[] },\n ): ToolSpec[] {\n return this.registry.search({\n text: query,\n kind: filters?.kind as any,\n capabilities: filters?.capabilities as any,\n tags: filters?.tags,\n });\n }\n\n /**\n * Get the schema for a tool.\n */\n getToolSchema(toolName: string): { input: object; output: object } | undefined {\n const spec = this.registry.get(toolName);\n if (!spec) return undefined;\n return { input: spec.inputSchema, output: spec.outputSchema };\n }\n\n // --- Helper Methods ---\n\n private getPipelineDeps(): PipelineDependencies {\n return {\n registry: this.registry,\n adapters: this.adapters,\n adaptersByToolName: this.adaptersByToolName,\n validator: this.validator,\n policy: this.policy,\n budget: this.budget,\n eventLog: this.eventLog,\n metrics: this.metrics,\n tracing: this.tracing,\n logger: this.logger,\n defaultMaxRetries: this.config.defaultMaxRetries,\n onApprovalRequired: this.config.onApprovalRequired,\n };\n }\n\n private getObservabilityDeps(): ObservabilityDependencies {\n return {\n eventLog: this.eventLog,\n metrics: this.metrics,\n tracing: this.tracing,\n logger: this.logger,\n };\n }\n\n private buildDryRunResult(\n spec: ToolSpec,\n args: unknown,\n _ctx: ExecContext,\n startTime: number,\n spanId: string,\n ): ToolResult {\n void (Date.now() - startTime); // durationMs calculated but not used in dry-run\n this.tracing.endSpan(spanId, \"ok\");\n\n return {\n ok: true,\n result: {\n dryRun: true,\n tool: spec.name,\n kind: spec.kind,\n args,\n capabilities: spec.capabilities,\n },\n evidence: [\n {\n type: \"tool\",\n ref: `${spec.name}@${spec.version}`,\n summary: `Dry-run: would execute ${spec.kind}:${spec.name}`,\n createdAt: new Date().toISOString(),\n },\n ],\n };\n }\n}\n\n/**\n * Detect tool-returned error shape: { error: string, details?: unknown }.\n * When tools return this instead of throwing, PTC treats it as failure and enriches feedback.\n */\nfunction asToolReturnedError(\n result: unknown,\n): { message: string; details?: unknown } | null {\n if (result == null || typeof result !== \"object\" || Array.isArray(result)) {\n return null;\n }\n const r = result as Record<string, unknown>;\n const msg = r.error;\n if (typeof msg !== \"string\" || !msg.trim()) {\n return null;\n }\n return { message: msg.trim(), details: r.details };\n}\n\n/**\n * Build an actionable hint from input JSON Schema (e.g. required property names)\n * so the LLM can fix parameter names (e.g. use 'query' not 'q').\n */\nfunction buildInputSchemaHint(inputSchema: object): string | null {\n const schema = inputSchema as { required?: string[]; properties?: Record<string, unknown> };\n const required = schema.required;\n if (!Array.isArray(required) || required.length === 0) {\n return null;\n }\n const names = required.filter((k): k is string => typeof k === \"string\");\n if (names.length === 0) return null;\n return `This tool expects input property ${names.length === 1 ? `'${names[0]}'` : `one of [${names.map((n) => `'${n}'`).join(\", \")}]`}. Use the exact property names from the tool schema.`;\n}\n","import { resolve, normalize, dirname, basename } from \"node:path\";\nimport { realpath, access } from \"node:fs/promises\";\nimport { createTaggedError } from \"../core/runtime/Retry.js\";\n\nlet sandboxValidationEnabled = false;\n\nexport function setSandboxValidationEnabled(enabled: boolean): void {\n sandboxValidationEnabled = enabled;\n}\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 (sandboxValidationEnabled && !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","/**\n * Shared scan helpers for tool-type scanners (function, skill, n8n).\n * findDirsContainingFile: recursive dirs that contain a given file name.\n * pathToToolName: build dotted tool name from source path and program name.\n */\n\nimport { readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport async function findDirsContainingFile(\n rootPath: string,\n fileName: string,\n): Promise<string[]> {\n const found: string[] = [];\n await collectDirsWithFile(rootPath, fileName, found);\n return found;\n}\n\nasync function collectDirsWithFile(\n dir: string,\n fileName: string,\n acc: string[],\n): Promise<void> {\n let entries: Array<{ name: string; isDirectory: boolean; isFile: boolean }>;\n try {\n const e = await readdir(dir, { withFileTypes: true });\n entries = e.map((x) => ({\n name: x.name,\n isDirectory: x.isDirectory(),\n isFile: x.isFile(),\n }));\n } catch {\n return;\n }\n if (entries.some((x) => x.isFile && x.name === fileName)) acc.push(dir);\n for (const entry of entries) {\n if (!entry.isDirectory || entry.name === \"node_modules\" || entry.name.startsWith(\".\")) continue;\n await collectDirsWithFile(join(dir, entry.name), fileName, acc);\n }\n}\n\n/** Build dotted tool name from source path (extension stripped) and program name. */\nexport function pathToToolName(sourcePath: string, programName: string): string {\n const normalized = sourcePath\n .replace(/\\\\/g, \"/\")\n .replace(/\\.(ts|tsx|js|mjs|json)$/i, \"\");\n const segments = normalized.split(\"/\").filter(Boolean);\n return segments.length === 0 ? programName : `${segments.join(\".\")}.${programName}`;\n}\n","/**\n * Build JSON Schema from TypeScript parameter types using the compiler API.\n * MVP: primitives, optional, array, object. Complex types fallback to {} with warn.\n */\n\nimport * as ts from \"typescript\";\n\n/**\n * Build output JSON Schema from function return type (unwrap Promise if present).\n * Used by scan when auto-deriving schema.\n */\nexport function buildOutputSchemaFromReturnType(\n node: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression,\n typeChecker: ts.TypeChecker,\n onWarn?: (message: string) => void,\n): object {\n const sig = typeChecker.getSignatureFromDeclaration(node as ts.SignatureDeclaration);\n if (!sig) {\n onWarn?.(\"Could not get signature for return type, using object\");\n return { type: \"object\", additionalProperties: true };\n }\n let returnType = typeChecker.getReturnTypeOfSignature(sig);\n // Unwrap Promise<T> to T\n if (returnType.getSymbol?.()?.getName() === \"Promise\") {\n const typeArgs = (returnType as ts.TypeReference).typeArguments;\n if (typeArgs?.[0]) returnType = typeArgs[0];\n }\n const schema = typeToJsonSchema(returnType, typeChecker, onWarn);\n const hasProps =\n typeof schema === \"object\" &&\n (schema as { type?: string; properties?: object }).type === \"object\" &&\n Object.keys((schema as { properties?: object }).properties ?? {}).length > 0;\n return hasProps ? schema : { type: \"object\", additionalProperties: true };\n}\n\n/** Build { type: \"object\", properties, required } from function parameters. */\nexport function buildInputSchemaFromParams(\n node: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression,\n typeChecker: ts.TypeChecker,\n onWarn?: (message: string) => void,\n): { schema: object; required: string[] } {\n const properties: Record<string, object> = {};\n const required: string[] = [];\n\n if (!node.parameters.length) {\n return { schema: { type: \"object\", properties: {} }, required: [] };\n }\n\n for (const param of node.parameters) {\n const name = (param.name as ts.Identifier).getText();\n if (name.startsWith(\"_\") && name.length <= 2) continue;\n const sym = (param as ts.ParameterDeclaration & { symbol?: ts.Symbol }).symbol;\n const paramType = sym\n ? typeChecker.getTypeOfSymbolAtLocation(sym, param)\n : typeChecker.getTypeAtLocation(param);\n const isOptional = !!param.questionToken || param.initializer !== undefined;\n const propSchema = typeToJsonSchema(paramType, typeChecker, onWarn);\n properties[name] = propSchema;\n if (!isOptional) required.push(name);\n }\n\n // Flatten: when there is exactly one parameter and it's an object type, emit that object's\n // schema at top level so agents can pass flat params like { path: \".\" } instead of { args: { path: \".\" } }.\n const paramNames = Object.keys(properties);\n if (paramNames.length === 1) {\n const soleName = paramNames[0]!;\n const inner = properties[soleName] as\n | { type?: string; properties?: Record<string, object>; required?: string[]; additionalProperties?: boolean }\n | undefined;\n if (\n inner &&\n typeof inner === \"object\" &&\n inner.type === \"object\" &&\n inner.properties &&\n typeof inner.properties === \"object\"\n ) {\n return {\n schema: {\n type: \"object\",\n properties: inner.properties,\n ...(Array.isArray(inner.required) && inner.required.length > 0 ? { required: inner.required } : {}),\n ...(inner.additionalProperties !== undefined ? { additionalProperties: inner.additionalProperties } : {}),\n },\n required: inner.required ?? [],\n };\n }\n }\n\n return {\n schema: {\n type: \"object\",\n properties,\n ...(required.length > 0 ? { required } : {}),\n },\n required,\n };\n}\n\nfunction typeToJsonSchema(\n type: ts.Type,\n typeChecker: ts.TypeChecker,\n onWarn?: (message: string) => void,\n): object {\n const flags = type.flags;\n if (flags & ts.TypeFlags.String) return { type: \"string\" };\n if (flags & ts.TypeFlags.Number) return { type: \"number\" };\n if (flags & ts.TypeFlags.Boolean) return { type: \"boolean\" };\n if (flags & ts.TypeFlags.BooleanLiteral) return { type: \"boolean\" };\n if (flags & ts.TypeFlags.Null) return { type: \"null\" };\n if (flags & ts.TypeFlags.Undefined || flags & ts.TypeFlags.Void) return {};\n if (flags & ts.TypeFlags.Any || flags & ts.TypeFlags.Unknown) {\n onWarn?.(`Unsupported type: any/unknown, using empty schema`);\n return {};\n }\n\n if (type.isUnion?.()) {\n const union = type as ts.UnionType;\n const types = union.types;\n const withoutUndef = types.filter(\n (t) => !(t.flags & ts.TypeFlags.Undefined) && !(t.flags & ts.TypeFlags.Void),\n );\n if (withoutUndef.length === 1) return typeToJsonSchema(withoutUndef[0]!, typeChecker, onWarn);\n if (withoutUndef.length === 0) return {};\n // Union of string literals -> { type: \"string\", enum: [...] } so we don't fall through to getProperties() (String prototype).\n const stringEnumValues: string[] = [];\n let allStringLiterals = true;\n for (const t of withoutUndef) {\n if (t.flags & ts.TypeFlags.StringLiteral) {\n const lit = t as ts.StringLiteralType;\n if (typeof lit.value === \"string\") stringEnumValues.push(lit.value);\n } else {\n allStringLiterals = false;\n break;\n }\n }\n if (allStringLiterals && stringEnumValues.length > 0) {\n return { type: \"string\", enum: [...new Set(stringEnumValues)] };\n }\n\n // Union of boolean literals (true | false | undefined) should stay boolean.\n let allBooleanLiterals = true;\n for (const t of withoutUndef) {\n if (!(t.flags & ts.TypeFlags.BooleanLiteral)) {\n allBooleanLiterals = false;\n break;\n }\n }\n if (allBooleanLiterals) return { type: \"boolean\" };\n }\n\n // Single string literal (e.g. type: \"file\") -> { type: \"string\", enum: [\"file\"] }, not object with String methods.\n if (flags & ts.TypeFlags.StringLiteral) {\n const lit = type as ts.StringLiteralType;\n if (typeof lit.value === \"string\") {\n return { type: \"string\", enum: [lit.value] };\n }\n return { type: \"string\" };\n }\n\n if (typeChecker.isArrayType(type)) {\n const typeRef = type as ts.TypeReference;\n const typeArgs = typeRef.typeArguments;\n const itemType = typeArgs?.[0];\n const items = itemType ? typeToJsonSchema(itemType, typeChecker, onWarn) : {};\n return { type: \"array\", items: Object.keys(items).length ? items : {} };\n }\n\n const str = typeChecker.typeToString(type);\n if (str === \"string\") return { type: \"string\" };\n if (str === \"number\") return { type: \"number\" };\n if (str === \"boolean\") return { type: \"boolean\" };\n if (str.endsWith(\"[]\")) {\n const inner = str.slice(0, -2).trim();\n const itemType =\n inner === \"string\" ? { type: \"string\" as const } : inner === \"number\" ? { type: \"number\" as const } : {};\n return { type: \"array\", items: itemType };\n }\n\n if (type.getProperties && type.getProperties().length >= 0) {\n const props = type.getProperties();\n const properties: Record<string, object> = {};\n const required: string[] = [];\n for (const p of props) {\n const decl = p.valueDeclaration;\n const propType = decl\n ? typeChecker.getTypeAtLocation(decl)\n : typeChecker.getTypeOfSymbolAtLocation(p, (p as unknown as { valueDeclaration: ts.Node }).valueDeclaration);\n const optional = decl && ts.isPropertySignature(decl) ? !!decl.questionToken : false;\n properties[p.name] = typeToJsonSchema(propType, typeChecker, onWarn);\n if (!optional) required.push(p.name);\n }\n return { type: \"object\", properties, ...(required.length ? { required } : {}) };\n }\n\n onWarn?.(`Unsupported type: ${str}, using object`);\n return { type: \"object\" };\n}\n","/** HITL side-effect classification. */\nexport type SideEffect = \"none\" | \"local_write\" | \"external_write\" | \"destructive\";\n\n/** Kind for @tool function discovery. */\nexport const FUNCTION_KIND = \"function\" as const;\n\n/** Single tool spec from @tool function. */\nexport interface FunctionToolSpec {\n kind: typeof FUNCTION_KIND;\n name: string;\n description: string;\n inputSchema: object;\n outputSchema?: object;\n _meta?: { hitl?: { sideEffect?: SideEffect } };\n sourcePath: string;\n exportName: string;\n}\n","import type { SideEffect } from \"../function/types.js\";\n\n/** Kind for SKILL.md discovery. */\nexport const SKILL_KIND = \"skill\" as const;\n\n/** Conventional directory name for skill tools. */\nexport const SKILL_DIR_NAME = \"skill\" as const;\n\n/** Single tool spec from SKILL.md directory. */\nexport interface SkillToolSpec {\n kind: typeof SKILL_KIND;\n name: string;\n description: string;\n inputSchema: object;\n _meta?: { hitl?: { sideEffect?: SideEffect } };\n sourcePath: string;\n}\n","import type { SideEffect } from \"../function/types.js\";\n\n/** Kind for n8n workflow.json discovery. */\nexport const N8N_KIND = \"n8n\" as const;\n\n/** Single tool spec from n8n workflow.json directory. */\nexport interface N8nToolSpec {\n kind: typeof N8N_KIND;\n name: string;\n description: string;\n inputSchema: object;\n _meta?: { hitl?: { sideEffect?: SideEffect } };\n sourcePath: string;\n webhookUrl?: string;\n}\n","/**\n * Convert MCPToolSpec (function/skill/n8n scan result) to unified ToolSpec.\n * MCP layer: used by function/skill/n8n scanners when exposing unified ToolSpec.\n */\n\nimport type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport { DEFAULT_OUTPUT_SCHEMA } from \"../../core/types/ToolSpec.js\";\nimport type { MCPToolSpec } from \"../discoveryFactory.js\";\nimport { FUNCTION_KIND } from \"../function/types.js\";\nimport { SKILL_KIND } from \"../skill/types.js\";\nimport { N8N_KIND } from \"../n8n/types.js\";\n\nconst DEFAULT_OUTPUT = { type: \"object\" as const, additionalProperties: true };\n\nexport function mcpSpecToToolSpec(spec: MCPToolSpec, projectPath?: string): ToolSpec {\n const base: ToolSpec = {\n name: spec.name,\n version: \"1.0.0\",\n kind: spec.kind,\n description: spec.description,\n inputSchema: spec.inputSchema ?? DEFAULT_OUTPUT,\n outputSchema:\n \"outputSchema\" in spec && spec.outputSchema\n ? spec.outputSchema\n : (DEFAULT_OUTPUT_SCHEMA as object),\n capabilities: [],\n _meta: spec._meta,\n ...(spec.kind === N8N_KIND && \"webhookUrl\" in spec && spec.webhookUrl\n ? { endpoint: spec.webhookUrl }\n : {}),\n };\n if (spec.kind === FUNCTION_KIND && \"sourcePath\" in spec && \"exportName\" in spec) {\n base._meta = {\n ...base._meta,\n sourcePath: spec.sourcePath,\n exportName: spec.exportName,\n ...(projectPath && { projectPath }),\n };\n }\n if (spec.kind === SKILL_KIND && \"sourcePath\" in spec && projectPath) {\n base._meta = { ...base._meta, sourcePath: spec.sourcePath, projectPath };\n }\n if (spec.kind === N8N_KIND && \"sourcePath\" in spec && projectPath) {\n base._meta = { ...base._meta, sourcePath: spec.sourcePath, projectPath };\n }\n return base;\n}\n","/**\n * Scan TypeScript source files for exported functions with @tool JSDoc.\n * Extracts description, @effect, and builds inputSchema from param types.\n * Exposes both scanForTools (raw) and scan (unified DiscoverToolsResult).\n */\n\nimport * as path from \"node:path\";\nimport * as fs from \"node:fs\";\nimport * as ts from \"typescript\";\nimport { pathToToolName } from \"../util/scanUtil.js\";\nimport { buildInputSchemaFromParams, buildOutputSchemaFromReturnType } from \"./schemaFromTs.js\";\nimport type { FunctionToolSpec, SideEffect } from \"./types.js\";\nimport { FUNCTION_KIND } from \"./types.js\";\nimport type { DiscoverToolsOptions, DiscoverToolsResult } from \"../discoveryFactory.js\";\nimport { mcpSpecToToolSpec } from \"../mcp/mcpSpecToToolSpec.js\";\n\nconst TOOL_TAG = \"@tool\";\nconst EFFECT_TAG = \"@effect\";\nconst EFFECT_VALUES: SideEffect[] = [\"none\", \"local_write\", \"external_write\", \"destructive\"];\n\nexport interface ScanResult {\n specs: FunctionToolSpec[];\n errors: Array<{ file: string; message: string }>;\n warnings: Array<{ file: string; message: string }>;\n}\n\n/**\n * Scan a project folder for exported functions annotated with @tool.\n */\nexport function scanForTools(options: {\n projectPath: string;\n include?: string[];\n tsconfigPath?: string;\n}): ScanResult {\n const projectPath = path.resolve(options.projectPath);\n const tsconfigPath =\n options.tsconfigPath ?? path.join(projectPath, \"tsconfig.json\");\n const include = options.include ?? [\"**/*.ts\"];\n const errors: Array<{ file: string; message: string }> = [];\n const warnings: Array<{ file: string; message: string }> = [];\n\n let config: ts.ParsedCommandLine;\n let configPathResolved = path.resolve(projectPath, tsconfigPath);\n if (!fs.existsSync(configPathResolved)) {\n configPathResolved = path.join(projectPath, \"tsconfig.json\");\n }\n if (fs.existsSync(configPathResolved)) {\n const configFile = ts.readConfigFile(configPathResolved, ts.sys.readFile);\n if (configFile.error) {\n errors.push({ file: configPathResolved, message: String(configFile.error.messageText) });\n return { specs: [], errors, warnings };\n }\n const parsed = ts.parseJsonConfigFileContent(\n configFile.config,\n ts.sys,\n path.dirname(configPathResolved),\n );\n if (parsed.errors.length) {\n for (const e of parsed.errors) {\n errors.push({ file: e.file?.fileName ?? \"tsconfig\", message: String(e.messageText) });\n }\n return { specs: [], errors, warnings };\n }\n config = parsed;\n } else {\n config = {\n options: {\n target: ts.ScriptTarget.ES2022,\n module: ts.ModuleKind.ESNext,\n moduleResolution: ts.ModuleResolutionKind.NodeNext,\n strict: true,\n skipLibCheck: true,\n noEmit: true,\n },\n fileNames: resolveGlob(projectPath, include),\n errors: [],\n } as ts.ParsedCommandLine;\n }\n\n const program = ts.createProgram(config.fileNames, config.options);\n const typeChecker = program.getTypeChecker();\n const specs: FunctionToolSpec[] = [];\n\n for (const sourceFile of program.getSourceFiles()) {\n const fileName = sourceFile.fileName;\n if (fileName.includes(\"node_modules\") || fileName.endsWith(\".d.ts\")) continue;\n if (!config.fileNames.some((f) => path.resolve(f) === path.resolve(fileName))) continue;\n\n ts.forEachChild(sourceFile, (node) => {\n const decl = getExportedFunctionDeclaration(node, sourceFile);\n if (!decl) return;\n const func = decl.func;\n const name = decl.name;\n if (!name) return;\n\n const host = getJSDocHost(func);\n if (!hasToolTag(host)) return;\n const jsDoc = getJSDocComments(host);\n\n const description = getDescription(jsDoc, name);\n if (!description) {\n warnings.push({ file: fileName, message: `Tool ${name}: missing description, using humanized name` });\n }\n const sideEffect = getEffect(host);\n\n const onWarn = (msg: string) => warnings.push({ file: fileName, message: `${name}: ${msg}` });\n const { schema } = buildInputSchemaFromParams(func, typeChecker, onWarn);\n\n const inputSchema =\n Object.keys((schema as { properties?: object }).properties ?? {}).length > 0\n ? schema\n : { type: \"object\" as const, properties: {} };\n\n const outputSchema = buildOutputSchemaFromReturnType(func, typeChecker, onWarn);\n\n const sourcePath = path.relative(projectPath, fileName) || path.basename(fileName);\n const toolName = pathToToolName(sourcePath, name);\n\n specs.push({\n kind: FUNCTION_KIND,\n name: toolName,\n description: description || humanize(name),\n inputSchema,\n outputSchema,\n _meta: { hitl: { sideEffect } },\n sourcePath,\n exportName: name,\n });\n });\n }\n\n return { specs, errors, warnings };\n}\n\nfunction resolveGlob(projectPath: string, patterns: string[]): string[] {\n const result: string[] = [];\n const seen = new Set<string>();\n const add = (f: string) => {\n const abs = path.resolve(f);\n if (f.endsWith(\".ts\") && !f.endsWith(\".d.ts\") && !seen.has(abs)) {\n seen.add(abs);\n result.push(abs);\n }\n };\n for (const p of patterns) {\n const full = path.join(projectPath, p);\n if (full.includes(\"*\")) {\n const baseDir = full.replace(/\\*\\*\\/.*$/, \"\").replace(/\\*.*$/, \"\").replace(/\\/?$/, \"\") || \".\";\n const dir = path.resolve(projectPath, baseDir);\n if (fs.existsSync(dir)) walk(dir, add);\n } else {\n const resolved = path.resolve(projectPath, full);\n if (fs.existsSync(resolved)) {\n if (fs.statSync(resolved).isFile()) add(resolved);\n else walk(resolved, add);\n }\n }\n }\n if (result.length > 0) return result;\n const srcDir = path.join(projectPath, \"src\");\n if (fs.existsSync(srcDir)) return walkCollect(srcDir);\n return [];\n}\n\nfunction walkCollect(dir: string): string[] {\n const out: string[] = [];\n walk(dir, (fullPath) => {\n if (fullPath.endsWith(\".ts\") && !fullPath.endsWith(\".d.ts\")) out.push(path.resolve(fullPath));\n });\n return out;\n}\n\nconst SKIP_DIRS = new Set([\"node_modules\", \"generated\", \"dist\"]);\n\nfunction walk(dir: string, visit: (fullPath: string) => void): void {\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const e of entries) {\n const full = path.join(dir, e.name);\n if (e.isDirectory() && !SKIP_DIRS.has(e.name)) walk(full, visit);\n else if (e.isFile()) visit(full);\n }\n } catch {\n // ignore\n }\n}\n\nfunction getExportedFunctionDeclaration(\n node: ts.Node,\n _sourceFile: ts.SourceFile,\n): { func: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression; name: string } | null {\n if (ts.isFunctionDeclaration(node) && node.name) {\n const exported = (ts.getModifiers(node) ?? []).some((m) => m.kind === ts.SyntaxKind.ExportKeyword);\n if (exported) return { func: node, name: node.name.getText() };\n return null;\n }\n if (ts.isVariableStatement(node)) {\n const exported = (ts.getModifiers(node) ?? []).some((m) => m.kind === ts.SyntaxKind.ExportKeyword);\n if (!exported) return null;\n for (const decl of node.declarationList.declarations) {\n let init = decl.initializer;\n while (init && (ts.isParenthesizedExpression(init) || ts.isAsExpression(init)))\n init = init.expression;\n if (init && ts.isArrowFunction(init)) {\n const name = (decl.name as ts.Identifier).getText();\n return { func: init, name };\n }\n if (init && ts.isFunctionExpression(init)) {\n const name = (decl.name as ts.Identifier).getText();\n return { func: init, name };\n }\n }\n }\n return null;\n}\n\nfunction getJSDocHost(node: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression): ts.Node {\n const parent = node.parent;\n if (ts.isVariableDeclaration(parent)) {\n const gp = parent.parent;\n if (ts.isVariableDeclarationList(gp) && gp.parent && ts.isVariableStatement(gp.parent)) return gp.parent;\n }\n return node as ts.Node;\n}\n\nfunction getJSDocComments(host: ts.Node): ts.JSDoc[] {\n const all = ts.getJSDocCommentsAndTags(host);\n return all.filter((t): t is ts.JSDoc => ts.isJSDoc(t));\n}\n\nfunction hasToolTag(host: ts.Node): boolean {\n const tags = ts.getJSDocTags(host);\n for (const tag of tags) {\n const name = (tag as { tagName?: ts.Identifier }).tagName?.getText() ?? \"\";\n if (name === \"tool\") return true;\n }\n const all = ts.getJSDocCommentsAndTags(host);\n for (const t of all) {\n if (ts.isJSDoc(t)) {\n const full = t.getFullText();\n if (full.includes(TOOL_TAG)) return true;\n }\n }\n return false;\n}\n\nfunction getDescription(jsDocs: ts.JSDoc[], fallbackName: string): string {\n for (const doc of jsDocs) {\n const comment = doc.comment;\n if (typeof comment === \"string\") {\n const first = comment.split(/\\n/)[0]?.trim() ?? \"\";\n if (first && !first.startsWith(\"@\")) return first;\n }\n if (Array.isArray(comment)) {\n const first = comment[0];\n if (first && typeof first === \"object\" && \"text\" in first) {\n const t = (first as { text: string }).text.trim();\n if (t && !t.startsWith(\"@\")) return t;\n }\n }\n const full = doc.getFullText();\n const match = full.match(/\\*\\s*@tool\\s+(.+?)(?=\\n|$|\\*\\/)/s);\n if (match?.[1]) return match[1].trim();\n }\n return \"\";\n}\n\nfunction getEffect(host: ts.Node): SideEffect {\n const tags = ts.getJSDocTags(host);\n for (const tag of tags) {\n const name = (tag as { tagName?: ts.Identifier }).tagName?.getText() ?? \"\";\n if (name === \"effect\") {\n const comment = (tag as ts.JSDocUnknownTag).comment;\n const v = (typeof comment === \"string\" ? comment : \"\").trim().toLowerCase();\n if (EFFECT_VALUES.includes(v as SideEffect)) return v as SideEffect;\n }\n }\n const all = ts.getJSDocCommentsAndTags(host);\n for (const t of all) {\n if (ts.isJSDoc(t)) {\n const full = t.getFullText();\n const match = full.match(/\\*\\s*@effect\\s+(\\w+)/);\n if (match && EFFECT_VALUES.includes(match[1] as SideEffect)) return match[1] as SideEffect;\n }\n }\n return \"none\";\n}\n\nfunction humanize(name: string): string {\n return name.replace(/([A-Z])/g, \" $1\").replace(/^./, (s) => s.toUpperCase()).trim();\n}\n\n/** Unified scan: (path, options) → DiscoverToolsResult. */\nexport function scan(\n projectPath: string,\n options: DiscoverToolsOptions = {},\n): Promise<DiscoverToolsResult> {\n const root = path.resolve(projectPath);\n const result = scanForTools({\n projectPath: root,\n include: options.include ?? [\"**/*.ts\"],\n tsconfigPath: options.tsconfigPath,\n });\n const specs = result.specs.map((s) => mcpSpecToToolSpec(s, root));\n return Promise.resolve({\n specs,\n errors: result.errors,\n warnings: result.warnings,\n });\n}\n","/**\n * Resolve entry point file for a tool directory.\n * Used by skill and langchain loaders (each has its own default: handler vs index).\n */\n\nimport { join } from \"node:path\";\nimport { stat } from \"node:fs/promises\";\n\n/** Runtime-executable extensions only (Node runs .js/.mjs; .ts is not needed unless using ts-node/tsx). */\nconst DEFAULT_EXTENSIONS = [\".js\", \".mjs\"];\n\nexport async function resolveEntryPoint(\n dirPath: string,\n baseName: string,\n extensions: string[] = DEFAULT_EXTENSIONS,\n): Promise<string> {\n if (extensions.some((ext) => baseName.endsWith(ext))) {\n const fullPath = join(dirPath, baseName);\n await stat(fullPath);\n return fullPath;\n }\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\n }\n }\n throw new Error(\n `Could not find entry point in ${dirPath}. Tried: ${extensions.map((e) => baseName + e).join(\", \")}`,\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 (Agent Skills spec).\n * Level 1 (metadata) — always loaded at startup for discovery.\n * @see https://agentskills.io/specification\n */\nexport interface SkillFrontmatter {\n /**\n * Skill name identifier (required).\n * - Max 64 characters; lowercase letters, numbers, hyphens only\n * - Must not start or end with hyphen; no consecutive hyphens\n */\n name: string;\n\n /**\n * What the skill does and when to use it (required).\n * - Max 1024 characters\n */\n description: string;\n\n /** Optional: license name or reference (e.g. Apache-2.0, LICENSE.txt). */\n license?: string;\n\n /** Optional: environment requirements, max 500 characters. */\n compatibility?: string;\n\n /** Optional: arbitrary key-value metadata. */\n metadata?: Record<string, string>;\n\n /** Optional: space-delimited list of pre-approved tools (experimental). */\n allowedTools?: 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 COMPATIBILITY_MAX_LENGTH = 500;\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 (fm.name.startsWith(\"-\") || fm.name.endsWith(\"-\")) {\n throw new SkillManifestError(\n filePath,\n \"name\",\n \"name must not start or end with a hyphen\",\n );\n }\n if (fm.name.includes(\"--\")) {\n throw new SkillManifestError(\n filePath,\n \"name\",\n \"name must not contain consecutive 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 // Optional: compatibility max 500 characters\n if (fm.compatibility != null && typeof fm.compatibility === \"string\") {\n if (fm.compatibility.length > COMPATIBILITY_MAX_LENGTH) {\n throw new SkillManifestError(\n filePath,\n \"compatibility\",\n `compatibility must be at most ${COMPATIBILITY_MAX_LENGTH} characters (got ${fm.compatibility.length})`,\n );\n }\n }\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { join, extname, relative } from \"node:path\";\nimport yaml from \"js-yaml\";\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 let raw: Record<string, unknown>;\n try {\n const parsed = yaml.load(yamlBlock);\n if (parsed == null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new SkillManifestError(\n filePath,\n \"frontmatter\",\n \"YAML frontmatter must be an object (key: value)\",\n );\n }\n raw = parsed as Record<string, unknown>;\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n throw new SkillManifestError(\n filePath,\n \"frontmatter\",\n `Invalid YAML frontmatter: ${message}`,\n );\n }\n\n const name = stringField(raw, \"name\", filePath);\n const description = stringField(raw, \"description\", filePath);\n if (!name || !description) {\n throw new SkillManifestError(\n filePath,\n \"frontmatter\",\n !name ? \"name is required\" : \"description is required\",\n );\n }\n\n const license = stringField(raw, \"license\");\n const compatibility = stringField(raw, \"compatibility\");\n const allowedTools = stringField(raw, \"allowed-tools\");\n const metadata = normalizeMetadata(raw.metadata);\n\n const frontmatter: SkillFrontmatter = {\n name,\n description,\n ...(license && { license }),\n ...(compatibility && { compatibility }),\n ...(allowedTools && { allowedTools }),\n ...(metadata && Object.keys(metadata).length > 0 && { metadata }),\n };\n validateFrontmatter(frontmatter, filePath);\n\n return { frontmatter, instructions: body };\n}\n\nfunction stringField(\n raw: Record<string, unknown>,\n key: string,\n filePath?: string,\n): string {\n const v = raw[key];\n if (v == null) return \"\";\n if (typeof v === \"string\") return v;\n if (typeof v === \"number\" || typeof v === \"boolean\") return String(v);\n if (Array.isArray(v)) {\n return v.map((x) => (typeof x === \"string\" ? x : String(x))).join(\"\\n\");\n }\n if (filePath) {\n throw new SkillManifestError(\n filePath,\n \"frontmatter\",\n `Frontmatter field \"${key}\" must be a string, number, boolean, or array`,\n );\n }\n return String(v);\n}\n\n/**\n * Normalize frontmatter `metadata` to Record<string, string>.\n * Supports nested YAML: { author: \"...\", version: \"...\" } → flat string values.\n */\nfunction normalizeMetadata(val: unknown): Record<string, string> | undefined {\n if (val == null) return undefined;\n if (typeof val === \"object\" && !Array.isArray(val)) {\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(val)) {\n if (typeof k === \"string\" && v !== undefined && v !== null) {\n out[k] = typeof v === \"object\" ? JSON.stringify(v) : String(v);\n }\n }\n return Object.keys(out).length ? out : undefined;\n }\n if (typeof val === \"string\" || typeof val === \"number\" || typeof val === \"boolean\") {\n return { value: String(val) };\n }\n return undefined;\n}\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","/**\n * Scan project for SKILL.md directories; produce MCP tool specs.\n * Exposes both scanForSkill (raw) and scan (unified DiscoverToolsResult).\n */\n\nimport * as path from \"node:path\";\nimport { findDirsContainingFile, pathToToolName } from \"../util/scanUtil.js\";\nimport { loadSkillDefinition } from \"./SkillMdParser.js\";\nimport type { SkillToolSpec } from \"./types.js\";\nimport { SKILL_KIND } from \"./types.js\";\nimport type { DiscoverToolsOptions, DiscoverToolsResult } from \"../discoveryFactory.js\";\nimport { mcpSpecToToolSpec } from \"../mcp/mcpSpecToToolSpec.js\";\n\nexport interface ScanSkillResult {\n skills: SkillToolSpec[];\n errors: Array<{ dir: string; message: string }>;\n}\n\nconst defaultInputSchema = { type: \"object\" as const, properties: {}, additionalProperties: true };\n\n/**\n * Scan projectPath for SKILL.md directories; return skill tool specs.\n */\nexport async function scanForSkill(projectPath: string): Promise<ScanSkillResult> {\n const projectRoot = path.resolve(projectPath);\n const dirs = await findDirsContainingFile(projectRoot, \"SKILL.md\");\n\n const skills: SkillToolSpec[] = [];\n const errors: Array<{ dir: string; message: string }> = [];\n\n for (const dirPath of dirs) {\n const relativePath = path.relative(projectRoot, dirPath) || path.basename(dirPath);\n try {\n const skillDef = await loadSkillDefinition(dirPath);\n const name = pathToToolName(relativePath, skillDef.frontmatter.name);\n skills.push({\n kind: SKILL_KIND,\n name,\n description: skillDef.frontmatter.description,\n inputSchema: defaultInputSchema,\n _meta: { hitl: { sideEffect: \"none\" } },\n sourcePath: relativePath.replace(/\\\\/g, \"/\"),\n });\n } catch (err) {\n errors.push({ dir: relativePath, message: err instanceof Error ? err.message : String(err) });\n }\n }\n\n return { skills, errors };\n}\n\n/** Unified scan: (path, options) → DiscoverToolsResult. */\nexport async function scan(\n projectPath: string,\n _options: DiscoverToolsOptions = {},\n): Promise<DiscoverToolsResult> {\n const root = path.resolve(projectPath);\n const result = await scanForSkill(root);\n const specs = result.skills.map((s) => mcpSpecToToolSpec(s, root));\n return {\n specs,\n errors: result.errors.map((e) => ({ file: e.dir, message: e.message })),\n };\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join, basename } from \"node:path\";\nimport type { ToolManifest, LoadedTool } from \"../discoveryFactory.js\";\nimport { DiscoveryError } from \"../discoveryFactory.js\";\n\n/** Metadata extracted from workflow.json for spec building (used by N8nLoader and scan scanN8n). */\nexport interface WorkflowMeta {\n name: string;\n description: string;\n webhookUrl?: string;\n workflowDef: Record<string, unknown>;\n}\n\n/**\n * Read and parse workflow.json in dirPath; return metadata and raw workflow.\n * Shared by loadN8nTool (runtime) and scan scanN8n.\n */\nexport async function readWorkflowMeta(\n dirPath: string,\n workflowFileName: string = \"workflow.json\",\n): Promise<WorkflowMeta> {\n const workflowPath = join(dirPath, workflowFileName);\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 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 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 const meta = workflowDef.meta as Record<string, unknown> | undefined;\n const name =\n (workflowDef.name as string) ||\n (meta?.name as string) ||\n basename(dirPath);\n const description =\n (workflowDef.description as string) ||\n (meta?.description as string) ||\n `n8n workflow: ${name}`;\n let webhookUrl: string | undefined;\n const nodes = workflowDef.nodes as Array<Record<string, unknown>> | undefined;\n if (Array.isArray(nodes)) {\n const webhookNode = nodes.find(\n (n) =>\n n.type === \"n8n-nodes-base.webhook\" || (n.type as string)?.includes(\"webhook\"),\n );\n if (webhookNode?.parameters && typeof webhookNode.parameters === \"object\") {\n const params = webhookNode.parameters as Record<string, unknown>;\n const pathVal = params.path ?? params.webhookPath;\n if (typeof pathVal === \"string\" && pathVal.startsWith(\"http\")) {\n webhookUrl = pathVal;\n }\n }\n }\n return { name, description, webhookUrl, workflowDef };\n}\n\n/**\n * Load an n8n tool from its directory.\n * Reads workflow.json and validates it has a \"nodes\" array.\n *\n * Description for the tool spec is taken (in order) from:\n * 1. tool.json \"description\" (if present)\n * 2. workflow.json \"description\" or \"meta.description\"\n * 3. workflow.json \"name\" (n8n workflow name)\n * 4. Fallback: \"n8n tool: <dirName>\"\n */\nexport async function loadN8nTool(\n dirPath: string,\n manifest: ToolManifest,\n): Promise<LoadedTool> {\n const { workflowDef } = await readWorkflowMeta(\n dirPath,\n manifest.entryPoint ?? \"workflow.json\",\n );\n return { manifest, dirPath, workflowDef };\n}\n","/**\n * Scan project for workflow.json (n8n) directories; produce MCP tool specs.\n * Exposes both scanForN8n (raw) and scan (unified DiscoverToolsResult).\n */\n\nimport * as path from \"node:path\";\nimport { findDirsContainingFile, pathToToolName } from \"../util/scanUtil.js\";\nimport { readWorkflowMeta } from \"./N8nLoader.js\";\nimport type { N8nToolSpec } from \"./types.js\";\nimport { N8N_KIND } from \"./types.js\";\nimport type { DiscoverToolsOptions, DiscoverToolsResult } from \"../discoveryFactory.js\";\nimport { mcpSpecToToolSpec } from \"../mcp/mcpSpecToToolSpec.js\";\n\nexport interface ScanN8nResult {\n n8n: N8nToolSpec[];\n errors: Array<{ dir: string; message: string }>;\n}\n\nconst defaultInputSchema = { type: \"object\" as const, properties: {}, additionalProperties: true };\n\n/**\n * Scan projectPath for workflow.json directories; return n8n tool specs.\n */\nexport async function scanForN8n(projectPath: string): Promise<ScanN8nResult> {\n const projectRoot = path.resolve(projectPath);\n const dirs = await findDirsContainingFile(projectRoot, \"workflow.json\");\n\n const n8n: N8nToolSpec[] = [];\n const errors: Array<{ dir: string; message: string }> = [];\n\n for (const dirPath of dirs) {\n const relativePath = path.relative(projectRoot, dirPath) || path.basename(dirPath);\n try {\n const { name: wfName, description: wfDesc, webhookUrl } = await readWorkflowMeta(dirPath);\n const toolName = pathToToolName(relativePath, wfName);\n n8n.push({\n kind: N8N_KIND,\n name: toolName,\n description: wfDesc,\n inputSchema: defaultInputSchema,\n _meta: { hitl: { sideEffect: \"external_write\" } },\n sourcePath: relativePath.replace(/\\\\/g, \"/\"),\n webhookUrl,\n });\n } catch (err) {\n errors.push({ dir: relativePath, message: err instanceof Error ? err.message : String(err) });\n }\n }\n\n return { n8n, errors };\n}\n\n/** Unified scan: (path, options) → DiscoverToolsResult. */\nexport async function scan(\n projectPath: string,\n _options: DiscoverToolsOptions = {},\n): Promise<DiscoverToolsResult> {\n const root = path.resolve(projectPath);\n const result = await scanForN8n(root);\n const specs = result.n8n.map((s) => mcpSpecToToolSpec(s, root));\n return {\n specs,\n errors: result.errors.map((e) => ({ file: e.dir, message: e.message })),\n };\n}\n","/** Kind for MCP directory discovery. */\nexport const MCP_KIND = \"mcp\" as const;\n","/**\n * MCP scan: find dirs with mcp.json, load via DirectoryScanner, return unified DiscoverToolsResult.\n * Exposes scan(path, options) only (no separate raw scanner).\n */\n\nimport * as path from \"node:path\";\nimport type { DiscoverToolsOptions, DiscoverToolsResult } from \"../discoveryFactory.js\";\nimport { DirectoryScanner } from \"../discoveryFactory.js\";\nimport { MCP_KIND } from \"./types.js\";\n\n/** Unified scan: (path, options) → DiscoverToolsResult. */\nexport async function scan(\n projectPath: string,\n options: DiscoverToolsOptions = {},\n): Promise<DiscoverToolsResult> {\n const root = path.resolve(projectPath);\n const namespace = options.namespace ?? \"dir\";\n const errors: Array<{ file: string; message: string }> = [];\n\n const scanner = new DirectoryScanner({\n roots: [root],\n namespace,\n extensions: options.extensions,\n onError: (dir, err) => {\n errors.push({ file: dir, message: err.message });\n options.onError?.(dir, err);\n },\n });\n\n let specs;\n try {\n specs = await scanner.scan();\n } catch (err) {\n errors.push({\n file: root,\n message: err instanceof Error ? err.message : String(err),\n });\n return { specs: [], errors };\n }\n\n const filtered = specs.filter((s) => s.kind === MCP_KIND);\n return { specs: filtered, errors };\n}\n","/** Kind for LangChain directory discovery. */\nexport const LANGCHAIN_KIND = \"langchain\" as const;\n\n/** Conventional directory name for LangChain tools. */\nexport const LANGCHAIN_DIR_NAME = \"langchain\" as const;\n","/**\n * LangChain scan: find langchain dirs / tool.json, load via DirectoryScanner, return unified DiscoverToolsResult.\n * Exposes scan(path, options) only (no separate raw scanner).\n */\n\nimport * as path from \"node:path\";\nimport type { DiscoverToolsOptions, DiscoverToolsResult } from \"../discoveryFactory.js\";\nimport { DirectoryScanner } from \"../discoveryFactory.js\";\nimport { LANGCHAIN_KIND } from \"./types.js\";\n\n/** Unified scan: (path, options) → DiscoverToolsResult. */\nexport async function scan(\n projectPath: string,\n options: DiscoverToolsOptions = {},\n): Promise<DiscoverToolsResult> {\n const root = path.resolve(projectPath);\n const namespace = options.namespace ?? \"dir\";\n const errors: Array<{ file: string; message: string }> = [];\n\n const scanner = new DirectoryScanner({\n roots: [root],\n namespace,\n extensions: options.extensions,\n onError: (dir, err) => {\n errors.push({ file: dir, message: err.message });\n options.onError?.(dir, err);\n },\n });\n\n let specs;\n try {\n specs = await scanner.scan();\n } catch (err) {\n errors.push({\n file: root,\n message: err instanceof Error ? err.message : String(err),\n });\n return { specs: [], errors };\n }\n\n const filtered = specs.filter((s) => s.kind === LANGCHAIN_KIND);\n return { specs: filtered, errors };\n}\n","import { pathToFileURL } from \"node:url\";\nimport type { ToolManifest, LoadedTool } from \"../discoveryFactory.js\";\nimport { DiscoveryError } from \"../discoveryFactory.js\";\nimport { resolveEntryPoint } from \"../util/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 { readdir } from \"node:fs/promises\";\nimport { pathToFileURL } from \"node:url\";\nimport type { ToolManifest, LoadedTool } from \"../discoveryFactory.js\";\nimport { DiscoveryError } from \"../discoveryFactory.js\";\nimport { resolveEntryPoint } from \"../util/resolveEntry.js\";\nimport { loadSkillDefinition } from \"./SkillMdParser.js\";\nimport type { SkillDefinition } from \"./SkillManifest.js\";\n\nconst DEFAULT_EXTENSIONS = [\".js\", \".mjs\"];\n\n/**\n * List top-level .js/.mjs files in the skill directory (exclude lib/, node_modules/, hidden, test files).\n * Used to auto-discover multiple programs when tool.json has no \"programs\" map.\n */\nasync function listSkillProgramFiles(\n dirPath: string,\n extensions: string[] = DEFAULT_EXTENSIONS,\n): 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 return entries\n .filter((e) => e.isFile)\n .map((e) => e.name)\n .filter((name) => {\n if (name.startsWith(\".\") || name.startsWith(\"_\")) return false;\n if (name.includes(\".test.\") || name.includes(\".spec.\")) return false;\n return extensions.some((ext) => name.endsWith(ext));\n })\n .sort((a, b) => {\n // Prefer handler.js or index.js as first (default program)\n if (a === \"handler.js\" || a === \"index.js\") return -1;\n if (b === \"handler.js\" || b === \"index.js\") return 1;\n return a.localeCompare(b);\n });\n}\n\n/**\n * Check if a value is a LangChain-like tool (object with invoke function).\n * Includes instances of StructuredTool and plain { name?, description?, schema?, invoke }.\n */\nfunction isLangChainLikeTool(val: unknown): val is { name?: string; description?: string; schema?: object; invoke: (args: unknown) => Promise<unknown> } {\n return (\n val != null &&\n typeof val === \"object\" &&\n \"invoke\" in val &&\n typeof (val as { invoke: unknown }).invoke === \"function\"\n );\n}\n\n/**\n * Check if a value is a class (constructor) that can be instantiated.\n * Used to detect \"class Foo extends StructuredTool\" exports.\n */\nfunction isConstructable(val: unknown): val is new (...args: unknown[]) => { invoke?: (args: unknown) => Promise<unknown> } {\n return typeof val === \"function\" && typeof (val as { prototype?: unknown }).prototype === \"object\";\n}\n\n/**\n * Load a single skill program (one entry point) and return a LoadedTool.\n * Supports:\n * - Class extending StructuredTool: loader instantiates with new ToolClass(), uses instance.\n * - LangChain-like object (or instance): { name?, description?, schema?, invoke(args) }.\n * - Function: (args, ctx) => Promise<{ result, evidence? }> — name/description from SKILL.md.\n */\nasync function loadOneSkillProgram(\n dirPath: string,\n manifest: ToolManifest,\n entryFile: string,\n skillDef: SkillDefinition,\n programKey: string | undefined,\n extensions: string[] | undefined,\n): Promise<LoadedTool> {\n let impl: unknown;\n try {\n const fullPath = await resolveEntryPoint(dirPath, entryFile, extensions ?? [\".js\", \".mjs\"]);\n const mod = (await import(pathToFileURL(fullPath).href)) as Record<string, unknown>;\n const fn = mod.default ?? mod.handler ?? mod.Tool;\n if (isLangChainLikeTool(fn)) {\n impl = fn;\n } else if (isConstructable(fn)) {\n const instance = new (fn as new () => { invoke: (args: unknown) => Promise<unknown> })();\n if (isLangChainLikeTool(instance)) impl = instance;\n } else if (typeof fn === \"function\") {\n impl = fn;\n }\n } catch {\n // Handler is optional — skills can be instruction-only\n }\n return {\n manifest,\n dirPath,\n impl,\n skillDefinition: skillDef,\n programKey,\n };\n}\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 const loaded = await loadSkillTools(dirPath, manifest, extensions);\n if (loaded.length === 0) {\n throw new DiscoveryError(dirPath, \"load\", \"No skill programs loaded\", new Error(\"empty\"));\n }\n return loaded[0]!;\n}\n\n/**\n * Load one or more skill programs from a directory.\n * When manifest.programs is set (e.g. { \"default\": \"handler.js\", \"report\": \"report.js\" }),\n * returns one LoadedTool per program; otherwise returns a single LoadedTool (entryPoint or \"handler\").\n */\nexport async function loadSkillTools(\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 const programs = manifest.programs;\n if (programs && typeof programs === \"object\" && Object.keys(programs).length > 0) {\n const result: LoadedTool[] = [];\n for (const [programKey, entryFile] of Object.entries(programs)) {\n const loaded = await loadOneSkillProgram(\n dirPath,\n manifest,\n entryFile,\n skillDef,\n programKey,\n extensions,\n );\n result.push(loaded);\n }\n return result;\n }\n\n // Auto-discover: list top-level .js/.mjs; if multiple, treat each as a program\n const exts = extensions ?? DEFAULT_EXTENSIONS;\n const files = await listSkillProgramFiles(dirPath, exts);\n if (files.length >= 2) {\n const result: LoadedTool[] = [];\n for (let i = 0; i < files.length; i++) {\n const file = files[i]!;\n const programKey = i === 0 ? \"default\" : file.replace(/\\.[^.]+$/, \"\");\n const loaded = await loadOneSkillProgram(\n dirPath,\n manifest,\n file,\n skillDef,\n programKey,\n extensions,\n );\n result.push(loaded);\n }\n return result;\n }\n\n // Single program: entryPoint or \"handler\" (or only one file found)\n const entryFile = manifest.entryPoint ?? files[0] ?? \"handler\";\n const loaded = await loadOneSkillProgram(\n dirPath,\n manifest,\n entryFile,\n skillDef,\n undefined,\n extensions,\n );\n return [loaded];\n}\n","import { readdir } from \"node:fs/promises\";\nimport { join, basename } from \"node:path\";\nimport type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { ToolManifest, LoadedTool } from \"../discoveryFactory.js\";\nimport { DiscoveryError } from \"../discoveryFactory.js\";\nimport { loadLangChainTool } from \"./LangChainLoader.js\";\n\n/**\n * List entry files (.js/.mjs) in dirPath for LangChain multi-tool dirs.\n * Implementation in langchain, not in factory.\n */\nexport async function listLangchainEntryFiles(\n dirPath: string,\n extensions: string[],\n): 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 return entries\n .filter((e) => e.isFile)\n .map((e) => e.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 extensions.some((ext) => name.endsWith(ext));\n });\n}\n\n/**\n * Load all LangChain tools from a directory (multiple entry files).\n * Implementation in langchain, not in factory.\n */\nexport async function loadLangChainToolsFromDir(\n dirPath: string,\n dirName: string,\n manifest: ToolManifest,\n strict: boolean,\n namespace: string,\n extensions: string[],\n langchainDirName: string,\n toSpec: (loaded: LoadedTool, nameHint: string, dirPath: string, namespace: string) => ToolSpec,\n onError?: (filePath: string, error: Error) => void,\n): Promise<ToolSpec[]> {\n const entryFiles = await listLangchainEntryFiles(dirPath, extensions);\n if (entryFiles.length === 0) {\n if (strict) {\n throw new DiscoveryError(dirPath, \"load\", \"No LangChain entry files found\");\n }\n return [];\n }\n const specs: ToolSpec[] = [];\n const useDirNameForSingle = dirName !== langchainDirName;\n for (const entryFile of entryFiles) {\n const fileManifest: ToolManifest = { ...manifest, entryPoint: entryFile };\n try {\n const loaded = await loadLangChainTool(dirPath, fileManifest, extensions);\n const fileBase = basename(entryFile).replace(/\\.[^.]+$/, \"\");\n const nameHint =\n entryFiles.length === 1 && useDirNameForSingle ? dirName : fileBase;\n specs.push(toSpec(loaded, nameHint, dirPath, namespace));\n } catch (error) {\n const err = error as Error;\n if (err instanceof DiscoveryError && err.phase === \"validate\") {\n if (strict) throw err;\n continue;\n }\n onError?.(join(dirPath, entryFile), err);\n if (strict) throw err;\n }\n }\n return specs;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { MCPServerConfig, ToolManifest, LoadedTool } from \"../discoveryFactory.js\";\nimport { DiscoveryError } from \"../discoveryFactory.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 type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { LoadedTool, ToolManifest } from \"../discoveryFactory.js\";\n\n/** Apply MCP-loaded tool to spec (implementation in mcp, not in factory). */\nexport function applyLoadedToSpec(\n spec: ToolSpec,\n loaded: LoadedTool,\n _manifest: ToolManifest,\n _defaultDirName: string,\n _namespace: string,\n): void {\n if (loaded.mcpConfig?.url) spec.endpoint = loaded.mcpConfig.url;\n spec.impl = loaded.mcpConfig;\n}\n\nexport const directoryMarker = {\n kind: \"mcp\" as const,\n markerFile: \"mcp.json\",\n defaultEntryPoint: \"mcp.json\",\n};\n","import type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { LoadedTool, ToolManifest } from \"../discoveryFactory.js\";\n\n/** Apply LangChain-loaded tool to spec (implementation in langchain, not in factory). */\nexport function applyLoadedToSpec(\n spec: ToolSpec,\n loaded: LoadedTool,\n manifest: ToolManifest,\n _defaultDirName: string,\n namespace: string,\n): void {\n spec.impl = loaded.impl;\n if (!manifest.name && loaded.impl) {\n const toolName = (loaded.impl as { name?: string }).name;\n if (toolName) spec.name = `${namespace}/${toolName}`;\n }\n if (!manifest.description && loaded.impl) {\n const d = (loaded.impl as { description?: string }).description;\n if (d) spec.description = d;\n }\n if (!manifest.inputSchema && loaded.impl) {\n const schema = (loaded.impl as { schema?: object }).schema;\n if (schema) spec.inputSchema = schema;\n }\n}\n","import type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { LoadedTool, ToolManifest } from \"../discoveryFactory.js\";\n\n/** Apply skill-loaded tool to spec (implementation in skill, not in factory). */\nexport function applyLoadedToSpec(\n spec: ToolSpec,\n loaded: LoadedTool,\n manifest: ToolManifest,\n defaultDirName: string,\n namespace: string,\n): void {\n const skillDef = loaded.skillDefinition as\n | { frontmatter: { name: string; description: string } }\n | undefined;\n if (skillDef) {\n spec.name = manifest.name ?? skillDef.frontmatter.name;\n spec.description = skillDef.frontmatter.description;\n if (loaded.programKey === \"default\") {\n spec.name = `${namespace}/${defaultDirName}`;\n } else if (loaded.programKey) {\n spec.name = `${namespace}/${defaultDirName}/${loaded.programKey}`;\n }\n const impl = loaded.impl as\n | { description?: string; schema?: object; invoke?: unknown }\n | undefined;\n if (impl && typeof impl === \"object\" && typeof impl.invoke === \"function\") {\n if (impl.description != null && impl.description !== \"\")\n spec.description = impl.description;\n if (impl.schema != null && typeof impl.schema === \"object\")\n spec.inputSchema = impl.schema as object;\n }\n spec.impl = { ...skillDef, handler: loaded.impl };\n } else {\n spec.impl = loaded.impl;\n }\n}\n\nexport const directoryMarker = {\n kind: \"skill\" as const,\n markerFile: \"SKILL.md\",\n defaultEntryPoint: \"handler\",\n};\n","import type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { LoadedTool, ToolManifest } from \"../discoveryFactory.js\";\n\n/** Apply n8n-loaded tool to spec (implementation in n8n, not in factory). */\nexport function applyLoadedToSpec(\n spec: ToolSpec,\n loaded: LoadedTool,\n manifest: ToolManifest,\n _defaultDirName: string,\n _namespace: string,\n): void {\n const workflow = loaded.workflowDef as {\n id?: string;\n name?: string;\n description?: string;\n meta?: { description?: string };\n } | undefined;\n if (workflow?.id) spec.resourceId = String(workflow.id);\n if (!manifest.description && workflow) {\n const d =\n workflow.description ??\n workflow.meta?.description ??\n (typeof workflow.name === \"string\" ? workflow.name : undefined);\n if (d) spec.description = d;\n }\n spec.impl = loaded.workflowDef;\n}\n\nexport const directoryMarker = {\n kind: \"n8n\" as const,\n markerFile: \"workflow.json\",\n defaultEntryPoint: \"workflow.json\",\n};\n","/**\n * Discovery factory: types, discoverTools by kind, directory loaders/markers, and DirectoryScanner.\n * Single place for discovery types, scan-by-type, and filesystem directory scanning.\n */\n\nimport * as path from \"node:path\";\nimport { join, basename } from \"node:path\";\nimport { readdir, readFile, access } from \"node:fs/promises\";\nimport type { ToolSpec, Capability, CostHints } from \"../core/types/ToolSpec.js\";\nimport type { FunctionToolSpec, SideEffect } from \"./function/types.js\";\nimport type { SkillToolSpec } from \"./skill/types.js\";\nimport type { N8nToolSpec } from \"./n8n/types.js\";\nimport { resolveEntryPoint } from \"./util/resolveEntry.js\";\n\n// --- Discovery types (single source of truth) ---\n\nexport type { SideEffect, FunctionToolSpec } from \"./function/types.js\";\nexport type { SkillToolSpec } from \"./skill/types.js\";\nexport type { N8nToolSpec } from \"./n8n/types.js\";\nexport type MCPToolSpec = FunctionToolSpec | SkillToolSpec | N8nToolSpec;\n\nexport type DiscoverableKind = \"function\" | \"skill\" | \"n8n\" | \"mcp\" | \"langchain\";\n\nexport interface DiscoverToolsOptions {\n namespace?: string;\n include?: string[];\n tsconfigPath?: string;\n extensions?: string[];\n onError?: (fileOrDir: string, error: Error) => void;\n}\n\nexport interface DiscoverToolsResult {\n specs: ToolSpec[];\n errors: Array<{ file: string; message: string }>;\n warnings?: Array<{ file: string; message: string }>;\n}\n\nexport interface MCPServerConfig {\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n cwd?: string;\n url?: string;\n}\n\nexport interface ToolManifest {\n kind: DiscoverableKind;\n name?: string;\n version?: string;\n description?: string;\n tags?: string[];\n capabilities?: Capability[];\n costHints?: CostHints;\n entryPoint?: string;\n programs?: Record<string, string>;\n inputSchema?: object;\n outputSchema?: object;\n enabled?: boolean;\n}\n\nexport interface DirectoryScannerOptions {\n roots: Array<string | { path: string; namespace?: string }>;\n namespace?: string;\n extensions?: string[];\n onError?: (toolDir: string, error: Error) => void;\n}\n\nexport interface LoadedTool {\n manifest: ToolManifest;\n dirPath: string;\n impl?: unknown;\n mcpConfig?: MCPServerConfig;\n workflowDef?: unknown;\n skillDefinition?: unknown;\n programKey?: string;\n}\n\nexport class DiscoveryError extends Error {\n readonly toolDir: string;\n readonly phase: \"manifest\" | \"load\" | \"validate\";\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}\nimport { scan as scanFunction } from \"./function/scanner.js\";\nimport { scan as scanSkill } from \"./skill/scanSkill.js\";\nimport { scan as scanN8n } from \"./n8n/scanN8n.js\";\nimport { scan as scanMcp } from \"./mcp/scanner.js\";\nimport { scan as scanLangchain } from \"./langchain/scanner.js\";\nimport { loadLangChainTool } from \"./langchain/LangChainLoader.js\";\nimport { loadSkillTools } from \"./skill/SkillLoader.js\";\nimport { loadLangChainToolsFromDir, listLangchainEntryFiles } from \"./langchain/directoryLoad.js\";\nimport { loadMCPTool } from \"./mcp/MCPLoader.js\";\nimport { applyLoadedToSpec as applyMcp, directoryMarker as markerMcp } from \"./mcp/directoryApply.js\";\nimport { applyLoadedToSpec as applyLangchain } from \"./langchain/directoryApply.js\";\nimport { applyLoadedToSpec as applySkill, directoryMarker as markerSkill } from \"./skill/directoryApply.js\";\nimport { loadN8nTool } from \"./n8n/N8nLoader.js\";\nimport { applyLoadedToSpec as applyN8n, directoryMarker as markerN8n } from \"./n8n/directoryApply.js\";\nimport { LANGCHAIN_DIR_NAME } from \"./langchain/types.js\";\nimport { SKILL_DIR_NAME } from \"./skill/types.js\";\n\n// --- Directory discovery (loaders / markers / apply) ---\n\nconst DIRECTORY_KINDS = [\"mcp\", \"langchain\", \"skill\", \"n8n\"] as const;\n\nexport const DIRECTORY_DISCOVERABLE_KINDS = DIRECTORY_KINDS;\n\nexport const DIRECTORY_KIND_MARKERS = [\n markerSkill,\n markerN8n,\n markerMcp,\n] as const;\n\nexport type DirectoryLoader = (\n dirPath: string,\n manifest: ToolManifest,\n extensions: string[],\n) => Promise<LoadedTool | LoadedTool[]>;\n\nconst DIRECTORY_LOADERS: Record<(typeof DIRECTORY_KINDS)[number], DirectoryLoader> = {\n mcp: async (dirPath, manifest) => [await loadMCPTool(dirPath, manifest)],\n langchain: async (dirPath, manifest, ext) => [await loadLangChainTool(dirPath, manifest, ext)],\n skill: (dirPath, manifest, ext) => loadSkillTools(dirPath, manifest, ext),\n n8n: async (dirPath, manifest) => [await loadN8nTool(dirPath, manifest)],\n};\n\nexport function getDirectoryLoader(kind: (typeof DIRECTORY_KINDS)[number]): DirectoryLoader {\n const loader = DIRECTORY_LOADERS[kind];\n if (!loader) {\n throw new DiscoveryError(\"\", \"manifest\", `Unknown directory tool kind: \"${kind}\"`);\n }\n return loader;\n}\n\nexport function applyDirectoryLoadedToSpec(\n spec: ToolSpec,\n loaded: LoadedTool,\n manifest: ToolManifest,\n defaultDirName: string,\n namespace: string,\n): void {\n switch (manifest.kind) {\n case \"mcp\":\n return applyMcp(spec, loaded, manifest, defaultDirName, namespace);\n case \"langchain\":\n return applyLangchain(spec, loaded, manifest, defaultDirName, namespace);\n case \"skill\":\n return applySkill(spec, loaded, manifest, defaultDirName, namespace);\n case \"n8n\":\n return applyN8n(spec, loaded, manifest, defaultDirName, namespace);\n default:\n break;\n }\n}\n\n// --- discoverTools: dispatch by kind to each type's scanner ---\n\nexport async function discoverTools(\n type: DiscoverableKind,\n projectPath: string,\n options: DiscoverToolsOptions = {},\n): Promise<DiscoverToolsResult> {\n const root = path.resolve(projectPath);\n switch (type) {\n case \"function\":\n return scanFunction(root, options);\n case \"skill\":\n return scanSkill(root, options);\n case \"n8n\":\n return scanN8n(root, options);\n case \"mcp\":\n return scanMcp(root, options);\n case \"langchain\":\n return scanLangchain(root, options);\n default: {\n const _: never = type;\n return _;\n }\n }\n}\n\nexport { LANGCHAIN_DIR_NAME } from \"./langchain/types.js\";\nexport { SKILL_DIR_NAME } from \"./skill/types.js\";\n\n// --- DirectoryScanner ---\n\nconst DEFAULT_EXTENSIONS = [\".js\", \".mjs\"];\n\n/**\n * Scans filesystem directories for tool definitions.\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 async scan(): Promise<ToolSpec[]> {\n const specs: ToolSpec[] = [];\n for (const root of this.roots) {\n const rootSpecs = await this.scanRoot(root.path, root.namespace);\n specs.push(...rootSpecs);\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 private async scanRecursive(dirPath: string, namespace: string): Promise<ToolSpec[]> {\n const specs: ToolSpec[] = [];\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) specs.push(...loadedSpecs);\n } catch (error) {\n this.onError?.(dirPath, error as Error);\n }\n\n for (const entry of dirEntries) {\n if (!entry.isDirectory) continue;\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 return specs;\n }\n\n private async loadToolDir(\n dirPath: string,\n dirName: string,\n namespace: string,\n ): Promise<ToolSpec[]> {\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) return [];\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 loadLangChainToolsFromDir(\n dirPath,\n dirName,\n inferred,\n false,\n namespace,\n this.extensions,\n LANGCHAIN_DIR_NAME,\n (loaded, nameHint, dp, ns) => this.toToolSpec(loaded, nameHint, dp, ns),\n this.onError,\n );\n }\n if (inferred.kind === \"skill\") {\n const loadedList = await loadSkillTools(dirPath, inferred, this.extensions);\n return loadedList.map((loaded: LoadedTool) =>\n this.toToolSpec(loaded, dirName, dirPath, namespace),\n );\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(dirPath, \"manifest\", \"Invalid JSON in tool.json\", err as Error);\n }\n if (!manifest.kind) {\n throw new DiscoveryError(dirPath, \"manifest\", `tool.json must have a \"kind\" field`);\n }\n if (manifest.enabled === false) return [];\n\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 loadLangChainToolsFromDir(\n dirPath,\n dirName,\n manifest,\n true,\n namespace,\n this.extensions,\n LANGCHAIN_DIR_NAME,\n (loaded, nameHint, dp, ns) => this.toToolSpec(loaded, nameHint, dp, ns),\n this.onError,\n );\n }\n if (manifest.kind === \"skill\") {\n const loadedList = await loadSkillTools(dirPath, manifest, this.extensions);\n return loadedList.map((loaded: LoadedTool) =>\n this.toToolSpec(loaded, dirName, dirPath, namespace),\n );\n }\n const loaded = await this.loadByKind(dirPath, manifest);\n return [this.toToolSpec(loaded, dirName, dirPath, namespace)];\n }\n\n private async inferManifest(dirPath: string, dirName: string): Promise<ToolManifest | null> {\n const kinds: ToolManifest[\"kind\"][] = [];\n\n for (const m of DIRECTORY_KIND_MARKERS) {\n if (await this.fileExists(join(dirPath, m.markerFile))) kinds.push(m.kind);\n }\n\n const isLangchainDir = dirName === LANGCHAIN_DIR_NAME;\n const hasLangchain =\n isLangchainDir\n ? (await listLangchainEntryFiles(dirPath, this.extensions)).length > 0\n : dirName !== SKILL_DIR_NAME && (await this.hasEntryPoint(dirPath, \"index\"));\n if (hasLangchain) kinds.push(\"langchain\");\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 const kind = kinds[0]!;\n const manifest: ToolManifest = { kind };\n const marker = DIRECTORY_KIND_MARKERS.find((m) => m.kind === kind);\n if (marker) {\n manifest.entryPoint = marker.defaultEntryPoint;\n }\n if (kind === \"langchain\" && !isLangchainDir) manifest.entryPoint = \"index\";\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 loadByKind(dirPath: string, manifest: ToolManifest): Promise<LoadedTool> {\n const kind = manifest.kind as (typeof DIRECTORY_DISCOVERABLE_KINDS)[number];\n const loader = getDirectoryLoader(kind);\n const result = await loader(dirPath, manifest, this.extensions);\n const list = Array.isArray(result) ? result : [result];\n if (list.length === 0) {\n throw new DiscoveryError(dirPath, \"load\", \"No tools loaded\", new Error(\"empty\"));\n }\n return list[0]!;\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(DIRECTORY_DISCOVERABLE_KINDS);\n const parentName = basename(join(dirPath, \"..\"));\n const isKindDir = kindDirNames.has(dirName as (typeof DIRECTORY_DISCOVERABLE_KINDS)[number]);\n const defaultDirName = isKindDir ? parentName : dirName;\n const inferredName = isKindDir\n ? `${namespace}/${defaultDirName}-${dirName}`\n : `${namespace}/${defaultDirName}`;\n const name = manifest.name ?? inferredName;\n const spec = this.buildBaseSpec(manifest, name, dirName);\n applyDirectoryLoadedToSpec(spec, loaded, manifest, defaultDirName, namespace);\n return spec;\n }\n\n private buildBaseSpec(\n manifest: ToolManifest,\n name: string,\n dirName: string,\n ): ToolSpec {\n return {\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 ?? { type: \"object\", additionalProperties: true },\n outputSchema: manifest.outputSchema ?? { type: \"object\", additionalProperties: true },\n capabilities: manifest.capabilities ?? [],\n costHints: manifest.costHints,\n };\n }\n}\n","/**\n * Create PTCRuntime + ToolRegistry from config (sync or async).\n * Registers extension adapters when coreTools options are provided.\n * Agent-tool does NOT depend on any specific extension. When configFilePath (tool.yaml)\n * lists npm:@scope/pkg, that package is loaded from cache or node_modules. The framework\n * calls the package's default export contract: register(registry, options) -> ToolAdapter.\n * Extensions implement this contract (e.g. via createExtension from this package).\n *\n * Npm: we always register npm extensions with a concrete version in the registry (never \"latest\").\n * When the descriptor omits version or uses @latest, we resolve to the actual latest from the\n * registry (resolveLatestVersionFromRegistry) and use that version for the registry prefix.\n */\n\nimport { createRequire } from \"node:module\";\nimport { join, resolve, isAbsolute, basename, dirname } from \"node:path\";\nimport { existsSync, readFileSync, statSync } from \"node:fs\";\nimport { pathToFileURL } from \"node:url\";\nimport { ToolRegistry } from \"../core/registry/ToolRegistry.js\";\nimport { PTCRuntime } from \"../core/runtime/PTCRuntime.js\";\nimport type { ToolAdapter, ToolSpec, ToolKind } from \"../core/types/ToolSpec.js\";\nimport { normalizeToolName } from \"../core/types/ToolSpec.js\";\nimport { setSandboxValidationEnabled } from \"../security/sandbox.js\";\nimport { DirectoryScanner } from \"../tools/discoveryFactory.js\";\nimport { loadToolConfig, getCacheBaseFromToolConfig } from \"../tools/util/toolConfig.js\";\nimport {\n npmDescriptorToRegistryPrefix,\n fileDescriptorToRegistryPrefix,\n parseToolPath,\n} from \"../tools/util/toolDescriptor.js\";\nimport {\n ensurePackageInCache,\n getPackageEntryPath,\n importFromCache,\n resolveLatestVersionFromRegistry,\n} from \"../utils/npmCache.js\";\n\nconst requireFromPackage = createRequire(import.meta.url);\n\nfunction getProjectRequire(): NodeRequire | null {\n const cwd = process.cwd();\n if (existsSync(join(cwd, \"package.json\"))) return createRequire(join(cwd, \"package.json\"));\n if (existsSync(join(cwd, \"tool.yaml\"))) return createRequire(join(cwd, \"tool.yaml\"));\n return null;\n}\n\nfunction findNearestPackageJson(startDir: string): string | null {\n let dir = resolve(startDir);\n while (true) {\n const pkg = join(dir, \"package.json\");\n if (existsSync(pkg)) return pkg;\n const parent = dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\n/**\n * Default package names tried when loading an extension from node_modules (no tool.yaml).\n * Empty by default so agent-tool does not depend on any specific extension package.\n * Extensions are loaded only via tool.yaml (npm: entries) or when explicitly configured.\n */\nexport const DEFAULT_EXTENSION_PACKAGES: string[] = [];\n\n/** Config passed to extension's register(registry, options). */\nexport interface CoreToolsUserConfig {\n sandboxRoot?: string;\n /** Whether to enforce sandbox boundary checks in fs path resolution. Default: false. */\n enableSandboxValidation?: boolean;\n /** Allowed hosts (e.g. [\"*\"] or [\"api.github.com\"]). Merged with tool.yaml. */\n allowedHosts?: string[];\n /** Block these hosts even if allowed. Merged with tool.yaml. */\n blockedHosts?: string[];\n /** CIDR ranges to block for HTTP (SSRF). Overrides extension default when set. */\n blockedCidrs?: string[];\n /** Per-tool config overrides. Keys: short name (\"fs.listDir\"), package-scoped (\"npm.easynet.agent.tool.buildin::fs.listDir\", survives version bumps), or full registry name. Use package-scoped or full when different packages share the same short name. */\n toolOverrides?: Record<string, Record<string, unknown>>;\n /** Package-level defaults. Key = package prefix (e.g. \"npm.easynet.agent.tool.buildin\"); value = key-value merged into ctx.config for every tool in that package. */\n packageDefaults?: Record<string, Record<string, unknown>>;\n /** Shared services injected into extension tool context config (e.g. modelHub). */\n services?: Record<string, unknown>;\n}\n\n/** Config for example-tools extension when present. */\nexport interface ExampleToolsUserConfig {\n allowedHosts?: string[];\n}\n\nexport interface CreateRuntimeOptions {\n /** Path to tool.yaml (optional; used by createAgentTools to filter tool list) */\n configFilePath?: string;\n /** Project path for async tool loading (optional; reserved for future use) */\n projectPath?: string;\n /** Sandbox / core tools config; when set, core adapter is registered */\n coreTools?: CoreToolsUserConfig;\n /** Example tools config; when set, example adapter is registered */\n exampleTools?: ExampleToolsUserConfig;\n /** When set, step messages are written here (e.g. for --verbose CLI). */\n stepLog?: (message: string) => void;\n}\n\nexport interface CreateRuntimeResult {\n runtime: PTCRuntime;\n registry: ToolRegistry;\n}\n\n/** Get installed package version by resolving package.json from the same requirers used to load the extension. */\nfunction getInstalledPackageVersion(packageName: string): string | null {\n const projectRequire = getProjectRequire();\n const requirers: NodeRequire[] = [requireFromPackage];\n if (projectRequire) requirers.push(projectRequire);\n for (const req of requirers) {\n try {\n const pkgJsonPath = req.resolve(`${packageName}/package.json`);\n const json = readFileSync(pkgJsonPath, \"utf-8\");\n const pkg = JSON.parse(json) as { version?: string };\n return pkg.version ?? null;\n } catch {\n continue;\n }\n }\n return null;\n}\n\ntype RegisterFn = (r: ToolRegistry, c: CoreToolsUserConfig) => unknown;\ntype LoadedExtension = { register: RegisterFn; descriptor: string; resolvedVersion: string };\ntype LoadedLocalDirectory = { specs: ToolSpec[]; descriptor: string; resolvedVersion: string };\n\nfunction hasInvokeFunction(value: unknown): value is { invoke: (args: unknown) => Promise<unknown> } {\n return (\n value != null &&\n typeof value === \"object\" &&\n \"invoke\" in value &&\n typeof (value as { invoke?: unknown }).invoke === \"function\"\n );\n}\n\nfunction normalizeToolOutput(output: unknown): { result: unknown; raw?: unknown } {\n if (output != null && typeof output === \"object\" && \"result\" in (output as Record<string, unknown>)) {\n const o = output as { result: unknown; evidence?: unknown };\n const evidence = Array.isArray(o.evidence) ? o.evidence : undefined;\n return evidence ? { result: o.result, raw: { evidence } } : { result: o.result };\n }\n return { result: output };\n}\n\nfunction createLocalDirectoryAdapter(kind: ToolKind): ToolAdapter {\n return {\n kind,\n async invoke(spec, args, ctx) {\n if (spec.kind === \"skill\") {\n const impl = spec.impl as\n | {\n handler?: unknown;\n frontmatter?: { name?: string; description?: string };\n instructions?: string;\n dirPath?: string;\n }\n | undefined;\n if (hasInvokeFunction(impl)) {\n const out = await impl.invoke(args);\n return normalizeToolOutput(out);\n }\n const handler = typeof impl?.handler === \"function\"\n ? impl.handler\n : typeof spec.impl === \"function\"\n ? spec.impl\n : undefined;\n if (typeof handler !== \"function\") {\n throw new Error(`Local skill ${spec.name} has no executable handler`);\n }\n const out = await (handler as (a: unknown, c: unknown) => Promise<unknown>)(args, {\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n skill: {\n name: impl?.frontmatter?.name ?? spec.name,\n description: impl?.frontmatter?.description ?? spec.description ?? \"\",\n instructions: impl?.instructions ?? \"\",\n resources: [],\n readResource: async () => \"\",\n getResourcesByType: () => [],\n dirPath: impl?.dirPath ?? \"\",\n },\n });\n return normalizeToolOutput(out);\n }\n\n if (spec.kind === \"langchain\") {\n if (!hasInvokeFunction(spec.impl)) {\n throw new Error(`Local langchain tool ${spec.name} missing invoke()`);\n }\n const out = await spec.impl.invoke(args);\n return normalizeToolOutput(out);\n }\n\n if (spec.kind === \"n8n\") {\n if (!spec.endpoint) {\n throw new Error(`Local n8n tool ${spec.name} missing endpoint/webhook URL`);\n }\n const res = await fetch(spec.endpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(args ?? {}),\n });\n if (!res.ok) {\n throw new Error(`n8n request failed (${res.status})`);\n }\n const text = await res.text();\n if (!text.trim()) return { result: {} };\n try {\n return { result: JSON.parse(text) };\n } catch {\n return { result: text };\n }\n }\n\n if (spec.kind === \"function\") {\n const meta = spec._meta as { sourcePath?: string; projectPath?: string; exportName?: string } | undefined;\n if (!meta?.sourcePath || !meta?.exportName || !meta?.projectPath) {\n throw new Error(`Local function ${spec.name} missing sourcePath/exportName/projectPath`);\n }\n const source = resolve(meta.projectPath, meta.sourcePath);\n const mod = await import(pathToFileURL(source).href);\n const fn = mod[meta.exportName];\n if (typeof fn !== \"function\") {\n throw new Error(`Local function ${spec.name} export \"${meta.exportName}\" is not a function`);\n }\n const out = await fn(args);\n return normalizeToolOutput(out);\n }\n\n throw new Error(`Local directory tool kind not supported for invoke: ${spec.kind}`);\n },\n };\n}\n\nfunction resolveFileDescriptorPath(descriptor: string, configFilePath: string): string | null {\n const parsed = parseToolPath(descriptor.trim());\n if (!parsed || parsed.protocol !== \"file\") return null;\n const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);\n const configDir = dirname(localPath);\n return resolve(configDir, `${parsed.scope}/${parsed.packageWithVersion}`);\n}\n\n/** Backward compat: extensions may export register or registerCoreTools. */\nfunction getRegisterFn(mod: { register?: RegisterFn; registerCoreTools?: RegisterFn }): RegisterFn | undefined {\n return mod?.register ?? mod?.registerCoreTools;\n}\n\n/** Load an extension from node_modules (e.g. for testing). Tries DEFAULT_EXTENSION_PACKAGES. */\nfunction loadExtensionFromNodeModules(): {\n register: RegisterFn;\n packageName: string;\n} | null {\n const projectRequire = getProjectRequire();\n const requirers: NodeRequire[] = [requireFromPackage];\n if (projectRequire) requirers.push(projectRequire);\n for (const req of requirers) {\n for (const pkg of DEFAULT_EXTENSION_PACKAGES) {\n try {\n const mod = req(pkg) as { register?: RegisterFn; registerCoreTools?: RegisterFn };\n const fn = getRegisterFn(mod);\n if (typeof fn === \"function\") return { register: fn, packageName: pkg };\n } catch {\n continue;\n }\n }\n }\n return null;\n}\n\n/** Registry wrapper that prefixes every registered tool name (e.g. npm.easynet.agent.tool.buildin.latest.). */\nfunction createPrefixingRegistry(\n registry: ToolRegistry,\n prefix: string,\n): ToolRegistry {\n return {\n register(spec: ToolSpec) {\n registry.register({\n ...spec,\n name: prefix + normalizeToolName(spec.name),\n });\n },\n bulkRegister(specs: ToolSpec[]) {\n specs.forEach((s) => this.register(s));\n },\n unregister(name: string) {\n return registry.unregister(name);\n },\n get(name: string) {\n return registry.get(name);\n },\n has(name: string) {\n return registry.has(name);\n },\n search(query: Parameters<ToolRegistry[\"search\"]>[0]) {\n return registry.search(query);\n },\n list() {\n return registry.list();\n },\n get size() {\n return registry.size;\n },\n snapshot() {\n return registry.snapshot();\n },\n clear() {\n return registry.clear();\n },\n } as ToolRegistry;\n}\n\n/** Parse npm: descriptor (e.g. \"npm:@easynet/agent-tool-buildin@0.0.1\" or \"npm:@easynet/agent-tool-buildin\") to package name and version. No version => \"latest\". */\nexport function parseNpmDescriptor(entry: string): { packageName: string; version: string } | null {\n if (typeof entry !== \"string\" || !entry.startsWith(\"npm:\")) return null;\n const rest = entry.slice(4).trim();\n const at = rest.indexOf(\"@\", 1);\n if (at < 0) return { packageName: rest, version: \"latest\" };\n const packageName = rest.slice(0, at);\n const version = rest.slice(at + 1).split(\"#\")[0]?.trim() || \"latest\";\n return { packageName, version };\n}\n\n/** Load one extension for file: descriptor (local folder with package.json and dist/ or main entry). */\nfunction loadExtensionFromFileDescriptorSync(\n descriptor: string,\n configFilePath: string,\n stepLog?: (message: string) => void,\n): { register: RegisterFn; descriptor: string; resolvedVersion: string } | null {\n const entryStr = descriptor.trim();\n const path = parseToolPath(entryStr);\n if (!path || path.protocol !== \"file\") return null;\n const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);\n const configDir = dirname(localPath);\n const pathPart = `${path.scope}/${path.packageWithVersion}`;\n const resolvedPath = resolve(configDir, pathPart);\n if (!existsSync(resolvedPath) || !statSync(resolvedPath).isDirectory()) return null;\n try {\n const entryPath = getPackageEntryPath(resolvedPath);\n const req = createRequire(join(resolvedPath, \"package.json\"));\n const mod = req(entryPath) as { register?: RegisterFn; registerCoreTools?: RegisterFn };\n const fn = getRegisterFn(mod);\n if (typeof fn === \"function\") {\n if (stepLog) stepLog(`Loaded local extension from ${resolvedPath}`);\n return { register: fn, descriptor: entryStr, resolvedVersion: \"local\" };\n }\n } catch {\n // ignore\n }\n return null;\n}\n\n/** Load one extension for a single npm descriptor (node_modules if version matches, else cache). */\nfunction loadExtensionForDescriptorSync(\n descriptor: string,\n configFilePath: string,\n stepLog?: (message: string) => void,\n): { register: RegisterFn; descriptor: string; resolvedVersion: string } | null {\n const entryStr = descriptor.trim();\n const parsed = parseNpmDescriptor(entryStr);\n if (!parsed) return null;\n const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);\n const configDir = dirname(localPath);\n const packageJsonPath = findNearestPackageJson(configDir);\n const configRequire = packageJsonPath ? createRequire(packageJsonPath) : null;\n const npmCwd = packageJsonPath ? dirname(packageJsonPath) : configDir;\n\n if (configRequire) {\n try {\n const mod = configRequire(parsed.packageName) as { register?: RegisterFn; registerCoreTools?: RegisterFn };\n const fn = getRegisterFn(mod);\n if (typeof fn === \"function\") {\n const installed = getInstalledPackageVersionFromRequire(parsed.packageName, configRequire);\n const requested = parsed.version === \"latest\" || !parsed.version?.trim() ? null : parsed.version;\n const resolvedVersion = requested === null\n ? resolveLatestVersionFromRegistry(parsed.packageName, { cwd: npmCwd })\n : requested;\n if (installed === resolvedVersion) {\n if (stepLog) stepLog(`Loaded ${parsed.packageName}@${resolvedVersion} from node_modules`);\n return { register: fn, descriptor: entryStr, resolvedVersion };\n }\n }\n } catch {\n // fall through to cache\n }\n }\n\n const cacheBase = getCacheBaseFromToolConfig(localPath);\n const cacheOptions = cacheBase ? [{ cacheBase, cwd: npmCwd }, { cwd: npmCwd }] : [{ cwd: npmCwd }];\n for (const opts of cacheOptions) {\n try {\n const cacheDir = ensurePackageInCache(parsed.packageName, parsed.version, opts as Parameters<typeof ensurePackageInCache>[2]);\n if (stepLog) stepLog(`Loaded ${parsed.packageName} from cache: ${cacheDir}`);\n const entryPath = getPackageEntryPath(cacheDir);\n const req = createRequire(join(cacheDir, \"package.json\"));\n const mod = req(entryPath) as { register?: RegisterFn; registerCoreTools?: RegisterFn };\n const fn = getRegisterFn(mod);\n if (typeof fn === \"function\") {\n const resolvedVersion = basename(cacheDir);\n return { register: fn, descriptor: entryStr, resolvedVersion };\n }\n break;\n } catch {\n if (cacheBase && \"cacheBase\" in opts) continue;\n break;\n }\n }\n return null;\n}\n\n/** Load all extensions for npm: entries in tool.yaml (sync). Same package at different versions each get one entry. */\nfunction loadAllExtensionsFromToolYamlSync(\n configFilePath: string,\n stepLog?: (message: string) => void,\n): { register: RegisterFn; descriptor: string; resolvedVersion: string }[] {\n const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);\n if (!existsSync(localPath)) return [];\n const config = loadToolConfig(localPath);\n const tools = config.tools;\n if (!Array.isArray(tools) || tools.length === 0) return [];\n if (stepLog) stepLog(\"Loading extensions from tool.yaml (npm + file)\");\n const loaded: { register: RegisterFn; descriptor: string; resolvedVersion: string }[] = [];\n for (const entry of tools) {\n const entryStr = String(entry).trim();\n if (entryStr.startsWith(\"npm:\")) {\n const result = loadExtensionForDescriptorSync(entryStr, configFilePath, stepLog);\n if (result) loaded.push(result);\n } else if (entryStr.startsWith(\"file:\")) {\n const result = loadExtensionFromFileDescriptorSync(entryStr, configFilePath, stepLog);\n if (result) loaded.push(result);\n }\n }\n return loaded;\n}\n\n/** Load extension from tool.yaml npm: entry using node_modules next to the config file (sync). Returns first successful load. */\nfunction loadExtensionFromToolYamlNodeModules(\n configFilePath: string,\n stepLog?: (message: string) => void,\n): { register: RegisterFn; descriptor: string; resolvedVersion: string } | null {\n const all = loadAllExtensionsFromToolYamlSync(configFilePath, stepLog);\n const first = all[0];\n return first ?? null;\n}\n\n/** Get installed package version using a specific require (e.g. from config dir). */\nfunction getInstalledPackageVersionFromRequire(packageName: string, req: NodeRequire): string | null {\n try {\n const pkgJsonPath = req.resolve(`${packageName}/package.json`);\n const json = readFileSync(pkgJsonPath, \"utf-8\");\n const pkg = JSON.parse(json) as { version?: string };\n return pkg.version ?? null;\n } catch {\n return null;\n }\n}\n\n/** Load one extension for a single npm descriptor (async: node_modules if version matches, else cache). */\nasync function loadExtensionForDescriptorAsync(\n descriptor: string,\n configFilePath: string,\n stepLog?: (message: string) => void,\n): Promise<{ register: RegisterFn; descriptor: string; resolvedVersion: string } | null> {\n const syncResult = loadExtensionForDescriptorSync(descriptor, configFilePath, stepLog);\n if (syncResult) return syncResult;\n const entryStr = descriptor.trim();\n const parsed = parseNpmDescriptor(entryStr);\n if (!parsed) return null;\n const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);\n const configDir = dirname(localPath);\n const packageJsonPath = findNearestPackageJson(configDir);\n const configRequire = packageJsonPath ? createRequire(packageJsonPath) : null;\n const npmCwd = packageJsonPath ? dirname(packageJsonPath) : configDir;\n if (configRequire) {\n try {\n const installed = getInstalledPackageVersionFromRequire(parsed.packageName, configRequire);\n const requested = parsed.version === \"latest\" || !parsed.version?.trim() ? null : parsed.version;\n const resolvedVersion = requested === null\n ? resolveLatestVersionFromRegistry(parsed.packageName, { cwd: npmCwd })\n : requested;\n if (installed === resolvedVersion) {\n const pkgJsonResolved = configRequire.resolve(`${parsed.packageName}/package.json`);\n const packageRoot = dirname(pkgJsonResolved);\n const entryPath = getPackageEntryPath(packageRoot);\n const mod = (await import(pathToFileURL(entryPath).href)) as {\n register?: RegisterFn;\n registerCoreTools?: RegisterFn;\n };\n const fn = getRegisterFn(mod);\n if (typeof fn === \"function\") {\n if (stepLog) stepLog(`Loaded ${parsed.packageName}@${resolvedVersion} from node_modules (async import)`);\n return { register: fn, descriptor: entryStr, resolvedVersion };\n }\n }\n } catch {\n // fall through to cache\n }\n }\n const cacheBase = getCacheBaseFromToolConfig(localPath);\n const cacheOptions = cacheBase ? [{ cacheBase, cwd: npmCwd }, { cwd: npmCwd }] : [{ cwd: npmCwd }];\n for (const opts of cacheOptions) {\n try {\n const cacheDir = ensurePackageInCache(parsed.packageName, parsed.version, opts as Parameters<typeof ensurePackageInCache>[2]);\n if (stepLog) stepLog(`Loaded ${parsed.packageName} from cache (async): ${cacheDir}`);\n const mod = (await importFromCache(cacheDir)) as { register?: RegisterFn; registerCoreTools?: RegisterFn };\n const fn = getRegisterFn(mod);\n if (typeof fn === \"function\") {\n const resolvedVersion = basename(cacheDir);\n return { register: fn, descriptor: entryStr, resolvedVersion };\n }\n break;\n } catch {\n if (cacheBase && \"cacheBase\" in opts) continue;\n break;\n }\n }\n return null;\n}\n\n/** Load local directory tools for file: descriptor when it's not an extension package. */\nasync function loadLocalDirectoryForFileDescriptor(\n descriptor: string,\n configFilePath: string,\n stepLog?: (message: string) => void,\n): Promise<LoadedLocalDirectory | null> {\n const resolvedPath = resolveFileDescriptorPath(descriptor, configFilePath);\n if (!resolvedPath || !existsSync(resolvedPath) || !statSync(resolvedPath).isDirectory()) return null;\n if (existsSync(join(resolvedPath, \"package.json\"))) return null;\n\n const scanErrors: string[] = [];\n const scanner = new DirectoryScanner({\n roots: [{ path: resolvedPath, namespace: \"local\" }],\n onError: (toolDir, error) => scanErrors.push(`${toolDir}: ${error.message}`),\n });\n const specs = await scanner.scan();\n if (scanErrors.length > 0 && stepLog) {\n stepLog(`Local directory scan (${descriptor}) reported ${scanErrors.length} error(s)`);\n }\n if (specs.length === 0) return null;\n if (stepLog) {\n stepLog(`Loaded ${specs.length} local tool(s) from ${descriptor}`);\n }\n return {\n specs,\n descriptor: descriptor.trim(),\n resolvedVersion: \"local\",\n };\n}\n\n/** Load all extensions for npm: and file: entries in tool.yaml (async). */\nasync function loadAllExtensionsFromToolYamlAsync(\n configFilePath: string,\n stepLog?: (message: string) => void,\n): Promise<Array<LoadedExtension | LoadedLocalDirectory>> {\n const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);\n if (!existsSync(localPath)) return [];\n const config = loadToolConfig(localPath);\n const tools = config.tools;\n if (!Array.isArray(tools) || tools.length === 0) return [];\n if (stepLog) stepLog(\"Loading extensions from tool.yaml (async)\");\n const loaded: Array<LoadedExtension | LoadedLocalDirectory> = [];\n for (const entry of tools) {\n const entryStr = String(entry).trim();\n if (entryStr.startsWith(\"npm:\")) {\n const result = await loadExtensionForDescriptorAsync(entryStr, configFilePath, stepLog);\n if (result) loaded.push(result);\n } else if (entryStr.startsWith(\"file:\")) {\n const result = loadExtensionFromFileDescriptorSync(entryStr, configFilePath, stepLog);\n if (result) {\n loaded.push(result);\n } else {\n const local = await loadLocalDirectoryForFileDescriptor(entryStr, configFilePath, stepLog);\n if (local) loaded.push(local);\n }\n }\n }\n return loaded;\n}\n\n/**\n * Create runtime and registry synchronously. Registers core/example adapters\n * only when coreTools/exampleTools are provided (opt-in). If extension packages\n * are not installed, those adapters are skipped (runtime still works with empty/minimal tools).\n */\nexport function createRuntimeFromConfigSync(options: CreateRuntimeOptions = {}): CreateRuntimeResult {\n const registry = new ToolRegistry();\n const stepLog = options.stepLog;\n setSandboxValidationEnabled(options.coreTools?.enableSandboxValidation === true);\n\n if (options.coreTools !== undefined) {\n if (options.configFilePath) {\n const all = loadAllExtensionsFromToolYamlSync(options.configFilePath, stepLog);\n if (all.length > 0) {\n if (stepLog) stepLog(`Registered ${all.length} extension(s) from tool.yaml`);\n const runtime = new PTCRuntime({ registry });\n for (const ext of all) {\n const before = new Set(registry.snapshot().map((s) => s.name));\n const prefix = ext.descriptor.startsWith(\"file:\")\n ? fileDescriptorToRegistryPrefix(ext.descriptor)\n : npmDescriptorToRegistryPrefix(ext.descriptor, ext.resolvedVersion);\n const reg = createPrefixingRegistry(registry, prefix ?? \"\");\n const adapter = ext.register(reg, options.coreTools) as ToolAdapter;\n runtime.registerAdapter(adapter);\n const registeredNow = registry\n .snapshot()\n .map((s) => s.name)\n .filter((name) => !before.has(name));\n runtime.registerAdapterForTools(registeredNow, adapter);\n }\n return { runtime, registry };\n }\n }\n if (stepLog) stepLog(\"Trying extension from node_modules\");\n const extensionNode = loadExtensionFromNodeModules();\n if (extensionNode) {\n if (stepLog) stepLog(\"Registered extension from node_modules\");\n const descriptor = `npm:${extensionNode.packageName}`;\n const resolvedVersion =\n getInstalledPackageVersion(extensionNode.packageName) ??\n resolveLatestVersionFromRegistry(extensionNode.packageName);\n const before = new Set(registry.snapshot().map((s) => s.name));\n const prefix = npmDescriptorToRegistryPrefix(descriptor, resolvedVersion);\n const reg = createPrefixingRegistry(registry, prefix ?? \"\");\n const coreAdapter = extensionNode.register(reg, options.coreTools) as ToolAdapter;\n const runtime = new PTCRuntime({ registry });\n runtime.registerAdapter(coreAdapter);\n const registeredNow = registry\n .snapshot()\n .map((s) => s.name)\n .filter((name) => !before.has(name));\n runtime.registerAdapterForTools(registeredNow, coreAdapter);\n return { runtime, registry };\n }\n const runtime = new PTCRuntime({ registry });\n return { runtime, registry };\n }\n\n const runtime = new PTCRuntime({ registry });\n return { runtime, registry };\n}\n\n/**\n * Create runtime and registry asynchronously. When configFilePath (tool.yaml) lists npm: packages:\n * 1. Try loading from project node_modules (sync, fast).\n * 2. If not found, dynamically load from cache: fetch via npm pack into cache, then dynamic import (works for ESM).\n * 3. Otherwise fall back to sync path (DEFAULT_EXTENSION_PACKAGES, sync cache).\n */\nexport async function createRuntimeFromConfig(\n options: CreateRuntimeOptions = {}\n): Promise<CreateRuntimeResult> {\n setSandboxValidationEnabled(options.coreTools?.enableSandboxValidation === true);\n if (options.coreTools !== undefined && options.configFilePath) {\n const all = await loadAllExtensionsFromToolYamlAsync(options.configFilePath, options.stepLog);\n if (all.length > 0) {\n if (options.stepLog) options.stepLog(`Registered ${all.length} extension(s) from tool.yaml`);\n const registry = new ToolRegistry();\n const runtime = new PTCRuntime({ registry });\n for (const ext of all) {\n const before = new Set(registry.snapshot().map((s) => s.name));\n const prefix = ext.descriptor.startsWith(\"file:\")\n ? fileDescriptorToRegistryPrefix(ext.descriptor)\n : npmDescriptorToRegistryPrefix(ext.descriptor, ext.resolvedVersion);\n const reg = createPrefixingRegistry(registry, prefix ?? \"\");\n if (\"register\" in ext) {\n const adapter = ext.register(reg, options.coreTools) as ToolAdapter;\n runtime.registerAdapter(adapter);\n const registeredNow = registry\n .snapshot()\n .map((s) => s.name)\n .filter((name) => !before.has(name));\n runtime.registerAdapterForTools(registeredNow, adapter);\n } else {\n reg.bulkRegister(ext.specs);\n const registeredNow = registry\n .snapshot()\n .map((s) => s.name)\n .filter((name) => !before.has(name));\n const byKind = new Map<ToolKind, string[]>();\n for (const toolName of registeredNow) {\n const spec = registry.get(toolName);\n if (!spec) continue;\n const list = byKind.get(spec.kind) ?? [];\n list.push(toolName);\n byKind.set(spec.kind, list);\n }\n for (const [kind, names] of byKind.entries()) {\n const adapter = createLocalDirectoryAdapter(kind);\n runtime.registerAdapter(adapter);\n runtime.registerAdapterForTools(names, adapter);\n }\n }\n }\n return { runtime, registry };\n }\n }\n return createRuntimeFromConfigSync(options);\n}\n","/**\n * Expose tools as OpenAPI (Swagger) spec and optional HTTP server.\n * Same tools can be used via LangChain, MCP, or REST.\n */\n\nimport type { ToolRegistry } from \"../../core/registry/ToolRegistry.js\";\nimport type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport { enrichSpecWithCanonicalSchema } from \"../../tools/util/canonicalCoreSchemas.js\";\n\nexport interface OpenAPISpecOptions {\n /** API title (default: \"Tool API\") */\n title?: string;\n /** API version (default: \"1.0.0\") */\n version?: string;\n /** Base path for the API (default: \"\") */\n basePath?: string;\n}\n\n/** Tool name to URL path segment: \"core.fs.readText\" -> \"core~fs~readText\" (dots to ~ in path) */\nexport function toolNameToSlug(name: string): string {\n return name.replace(/\\./g, \"~\");\n}\n\n/** URL path segment back to tool name: \"core~fs~readText\" -> \"core.fs.readText\" */\nexport function slugToToolName(slug: string): string {\n return slug.replace(/~/g, \".\");\n}\n\n/** Safe schema key for components: \"core.fs.readText\" -> \"Tool_core_fs_readText\" */\nfunction toolSchemaKey(name: string): string {\n return `Tool_${name.replace(/[^a-zA-Z0-9_]/g, \"_\")}`;\n}\n\nconst resultSchema = {\n type: \"object\" as const,\n properties: {\n result: { description: \"Tool return value\", additionalProperties: true },\n },\n};\nconst errorSchema = {\n type: \"object\" as const,\n properties: {\n error: { type: \"string\" },\n kind: { type: \"string\" },\n details: { type: \"object\", additionalProperties: true },\n },\n};\n\n/**\n * Build OpenAPI 3.0 document from the tool registry.\n * GET /tools, POST /invoke (generic), and one POST /invoke/{toolSlug} per tool with that tool's input schema.\n */\nexport function toolsToOpenAPISpec(\n registry: ToolRegistry,\n options: OpenAPISpecOptions = {}\n): Record<string, unknown> {\n const title = options.title ?? \"Tool API\";\n const version = options.version ?? \"1.0.0\";\n const basePath = (options.basePath ?? \"\").replace(/\\/$/, \"\");\n const specs = registry.snapshot().map(enrichSpecWithCanonicalSchema);\n\n const toolNamesSchema = {\n type: \"object\",\n required: [\"tools\"],\n properties: {\n tools: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n description: { type: \"string\" },\n kind: { type: \"string\" },\n },\n },\n },\n },\n };\n\n const invokeRequestBody = {\n type: \"object\",\n required: [\"tool\", \"args\"],\n properties: {\n tool: { type: \"string\", description: \"Tool name (e.g. from GET /tools)\" },\n args: {\n type: \"object\",\n description: \"Tool arguments (schema per tool; use per-tool paths for typed schema)\",\n additionalProperties: true,\n },\n },\n };\n\n const prefix = basePath ? `${basePath}/` : \"/\";\n const paths: Record<string, unknown> = {\n [`${prefix}tools`]: {\n get: {\n summary: \"List tools\",\n description: \"Returns all registered tool names and descriptions.\",\n operationId: \"listTools\",\n responses: {\n \"200\": {\n description: \"List of tools\",\n content: {\n \"application/json\": {\n schema: toolNamesSchema,\n },\n },\n },\n },\n },\n },\n [`${prefix}invoke`]: {\n post: {\n summary: \"Invoke a tool (generic)\",\n description: \"Call any tool by name with body { tool, args }. For typed schemas use POST /invoke/{toolSlug}.\",\n operationId: \"invokeTool\",\n requestBody: {\n required: true,\n content: {\n \"application/json\": {\n schema: invokeRequestBody,\n },\n },\n },\n responses: {\n \"200\": {\n description: \"Tool result\",\n content: { \"application/json\": { schema: resultSchema } },\n },\n \"400\": {\n description: \"Bad request\",\n content: { \"application/json\": { schema: errorSchema } },\n },\n },\n },\n },\n };\n\n const schemaEntries: [string, object][] = [];\n for (const s of specs) {\n const key = toolSchemaKey(s.name);\n schemaEntries.push([key, s.inputSchema as object]);\n const slug = toolNameToSlug(s.name);\n paths[`${prefix}invoke/${slug}`] = {\n post: {\n summary: s.description ?? s.name,\n description: `Invoke tool \\`${s.name}\\`. Request body is the tool's arguments (JSON Schema below).`,\n operationId: `invoke_${key}`,\n requestBody: {\n required: true,\n content: {\n \"application/json\": {\n schema: { $ref: `#/components/schemas/${key}` },\n },\n },\n },\n responses: {\n \"200\": {\n description: \"Tool result\",\n content: { \"application/json\": { schema: resultSchema } },\n },\n \"400\": {\n description: \"Bad request (invalid args or tool error)\",\n content: { \"application/json\": { schema: errorSchema } },\n },\n },\n },\n };\n }\n\n return {\n openapi: \"3.0.3\",\n info: { title, version },\n paths,\n components: {\n schemas: Object.fromEntries(schemaEntries),\n },\n };\n}\n","/**\n * HTTP server that exposes tools via OpenAPI (Swagger): GET / (Swagger UI), GET /openapi.json, GET /tools, POST /invoke.\n * All invokes go through PTCRuntime.invoke(intent, ctx). Uses Node's built-in http.\n */\n\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport type { PTCRuntime } from \"../../core/runtime/PTCRuntime.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport type { CreateRuntimeOptions } from \"../runtimeFromConfig.js\";\nimport { createRuntimeFromConfig } from \"../runtimeFromConfig.js\";\nimport { toolsToOpenAPISpec, slugToToolName } from \"./openapi.js\";\n\nexport interface OpenAPIHttpServerOptions {\n /** Port (default: 0 = let OS choose) */\n port?: number;\n /** Host (default: \"localhost\") */\n host?: string;\n /** Base path for routes (default: \"\") */\n basePath?: string;\n /** Build ExecContext for each request (default: minimal ctx) */\n execContextFactory?: (req: IncomingMessage) => ExecContext;\n}\n\nconst DEFAULT_CTX: ExecContext = {\n requestId: `http-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n taskId: `task-${Date.now()}`,\n permissions: [\n \"read:web\", \"read:fs\", \"write:fs\", \"read:db\", \"write:db\",\n \"network\", \"workflow\", \"danger:destructive\",\n ],\n};\n\nfunction parseBody(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk) => chunks.push(chunk));\n req.on(\"end\", () => {\n const raw = Buffer.concat(chunks).toString(\"utf-8\");\n if (!raw.trim()) {\n resolve({});\n return;\n }\n try {\n resolve(JSON.parse(raw) as unknown);\n } catch {\n reject(new Error(\"Invalid JSON body\"));\n }\n });\n req.on(\"error\", reject);\n });\n}\n\nfunction sendJson(res: ServerResponse, status: number, data: unknown): void {\n res.writeHead(status, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(data));\n}\n\n/** Build HTML for Swagger UI (CDN) pointing at the given spec URL. */\nfunction swaggerUiHtml(specUrl: string): string {\n const specUrlEscaped = specUrl.replace(/\"/g, \""\");\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Tool API – Swagger UI</title>\n <link rel=\"stylesheet\" href=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui.css\">\n</head>\n<body>\n <div id=\"swagger-ui\"></div>\n <script src=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui-bundle.js\" crossorigin></script>\n <script src=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui-standalone-preset.js\" crossorigin></script>\n <script>\n window.onload = function() {\n window.ui = SwaggerUIBundle({\n url: \"${specUrlEscaped}\",\n dom_id: \"#swagger-ui\",\n deepLinking: true,\n presets: [\n SwaggerUIBundle.presets.apis,\n SwaggerUIStandalonePreset\n ],\n layout: \"StandaloneLayout\"\n });\n };\n </script>\n</body>\n</html>`;\n}\n\n/**\n * Create an HTTP server that exposes tools via OpenAPI-style routes.\n * - GET / or GET /swagger: Swagger UI (interactive docs)\n * - GET /openapi.json (or basePath/openapi.json): OpenAPI 3.0 spec\n * - GET /tools: list tools\n * - POST /invoke: body { tool, args } -> { result } or { error }\n */\nexport function createOpenAPIHttpServer(\n runtime: PTCRuntime,\n options: OpenAPIHttpServerOptions = {}\n): import(\"node:http\").Server {\n const basePath = (options.basePath ?? \"\").replace(/\\/$/, \"\");\n const ctxFactory = options.execContextFactory ?? (() => ({ ...DEFAULT_CTX }));\n\n const server = createServer(async (req: IncomingMessage, res: ServerResponse) => {\n const url = req.url ?? \"/\";\n const path = url.split(\"?\")[0] ?? \"/\";\n const norm = basePath ? (path === basePath ? \"\" : path.replace(basePath, \"\") || \"/\") : path;\n\n try {\n if (req.method === \"GET\" && (norm === \"/\" || norm === \"/swagger\")) {\n const specPath = basePath ? `${basePath}/openapi.json` : \"/openapi.json\";\n const html = swaggerUiHtml(specPath);\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(html);\n return;\n }\n\n if (req.method === \"GET\" && (norm === \"/openapi.json\" || norm === \"/spec\")) {\n const spec = toolsToOpenAPISpec(runtime.getRegistry(), {\n title: \"Tool API\",\n version: \"1.0.0\",\n basePath: basePath || undefined,\n });\n sendJson(res, 200, spec);\n return;\n }\n\n if (req.method === \"GET\" && norm === \"/tools\") {\n const { enrichSpecWithCanonicalSchema } = await import(\"../../tools/util/canonicalCoreSchemas.js\");\n const specs = runtime.getRegistry().snapshot().map(enrichSpecWithCanonicalSchema);\n const tools = specs.map((s) => ({\n name: s.name,\n description: s.description,\n kind: s.kind,\n inputSchema: s.inputSchema,\n }));\n sendJson(res, 200, { tools });\n return;\n }\n\n if (req.method === \"POST\" && norm === \"/invoke\") {\n const body = (await parseBody(req)) as { tool?: string; args?: unknown };\n const tool = body?.tool;\n const args = body?.args ?? {};\n if (typeof tool !== \"string\" || !tool.trim()) {\n sendJson(res, 400, { error: \"Missing or invalid 'tool' in body\", kind: \"BAD_REQUEST\" });\n return;\n }\n const ctx = ctxFactory(req);\n const result = await runtime.invoke(\n { tool: tool.trim(), args, purpose: \"openapi\" },\n ctx\n );\n if (result.ok) {\n sendJson(res, 200, { result: result.result });\n return;\n }\n sendJson(res, 400, {\n error: result.error?.message ?? \"Tool failed\",\n kind: result.error?.kind,\n details: result.error?.details,\n });\n return;\n }\n\n if (req.method === \"POST\" && norm.startsWith(\"/invoke/\") && norm.length > \"/invoke/\".length) {\n const slug = norm.slice(\"/invoke/\".length);\n const toolName = slugToToolName(slug);\n let args: unknown;\n try {\n args = await parseBody(req);\n } catch {\n sendJson(res, 400, { error: \"Invalid JSON body\", kind: \"BAD_REQUEST\" });\n return;\n }\n const ctx = ctxFactory(req);\n const result = await runtime.invoke(\n { tool: toolName, args: args ?? {}, purpose: \"openapi\" },\n ctx\n );\n if (result.ok) {\n sendJson(res, 200, { result: result.result });\n return;\n }\n sendJson(res, 400, {\n error: result.error?.message ?? \"Tool failed\",\n kind: result.error?.kind,\n details: result.error?.details,\n });\n return;\n }\n\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Not found\", path: norm }));\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n sendJson(res, 500, { error: message, kind: \"INTERNAL_ERROR\" });\n }\n });\n\n return server;\n}\n\n/**\n * Start the OpenAPI HTTP server on the given port/host.\n * Call after createOpenAPIHttpServer if you did not pass port in options.\n */\nexport function listenOpenAPIHttpServer(\n server: import(\"node:http\").Server,\n options: { port?: number; host?: string } = {}\n): Promise<{ port: number; host: string }> {\n return new Promise((resolve, reject) => {\n const port = options.port ?? 0;\n const host = options.host ?? \"localhost\";\n server.listen(port, host, () => {\n const addr = server.address();\n const actualPort = typeof addr === \"object\" && addr?.port != null ? addr.port : port;\n resolve({ port: actualPort, host });\n });\n server.on(\"error\", reject);\n });\n}\n\nexport interface HttpServiceResult {\n /** Node HTTP server (call .close() when done) */\n server: import(\"node:http\").Server;\n /** OpenAPI 3.0 spec document (for Swagger UI etc.) */\n openApiSpec: Record<string, unknown>;\n /** Start listening; returns { port, host } */\n listen: (options?: { port?: number; host?: string }) => Promise<{ port: number; host: string }>;\n}\n\nexport interface CreateHttpServiceOptions extends OpenAPIHttpServerOptions {\n /** API title for OpenAPI spec (default: \"Tool API\") */\n title?: string;\n /** API version for OpenAPI spec (default: \"1.0.0\") */\n version?: string;\n}\n\n/**\n * Create HTTP service that exposes tools via OpenAPI (Swagger).\n * Returns server, OpenAPI spec, and a listen() helper.\n */\nexport function createHttpService(\n runtime: PTCRuntime,\n options?: CreateHttpServiceOptions\n): Promise<HttpServiceResult>;\n\n/**\n * Create HTTP service from config (async: loads tools from projectPath when set).\n */\nexport function createHttpService(\n config: CreateRuntimeOptions,\n options?: CreateHttpServiceOptions\n): Promise<HttpServiceResult>;\n\nexport async function createHttpService(\n runtimeOrConfig: PTCRuntime | CreateRuntimeOptions,\n options: CreateHttpServiceOptions = {}\n): Promise<HttpServiceResult> {\n const runtime: PTCRuntime =\n \"invoke\" in runtimeOrConfig && typeof runtimeOrConfig.invoke === \"function\"\n ? (runtimeOrConfig as PTCRuntime)\n : (await createRuntimeFromConfig(runtimeOrConfig as CreateRuntimeOptions)).runtime;\n const server = createOpenAPIHttpServer(runtime, options);\n const openApiSpec = toolsToOpenAPISpec(runtime.getRegistry(), {\n title: options.title ?? \"Tool API\",\n version: options.version ?? \"1.0.0\",\n basePath: options.basePath,\n });\n return {\n server,\n openApiSpec,\n listen: (listenOpts) => listenOpenAPIHttpServer(server, listenOpts),\n };\n}\n","/**\n * Expose tools as an MCP server (stdio or Streamable HTTP). All invokes go through PTCRuntime.invoke(intent, ctx).\n * Requires @modelcontextprotocol/sdk.\n */\n\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { PTCRuntime } from \"../../core/runtime/PTCRuntime.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport { normalizeToolName } from \"../../core/types/ToolSpec.js\";\nimport type { CreateRuntimeOptions } from \"../runtimeFromConfig.js\";\nimport { createRuntimeFromConfig } from \"../runtimeFromConfig.js\";\nimport { MCP_KIND } from \"../../tools/mcp/types.js\";\n\nexport interface MCPServerOptions {\n /** Server name (default: \"agent-tool\") */\n name?: string;\n /** Server version (default: \"1.0.0\") */\n version?: string;\n /** Build ExecContext for each tool call (default: minimal ctx) */\n execContextFactory?: () => ExecContext;\n}\n\nconst DEFAULT_CTX: ExecContext = {\n requestId: `mcp-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n taskId: `task-${Date.now()}`,\n permissions: [\n \"read:web\", \"read:fs\", \"write:fs\", \"read:db\", \"write:db\",\n \"network\", \"workflow\", \"danger:destructive\",\n ],\n};\n\nexport interface MCPServerResult {\n /** The MCP server instance */\n server: { connect(transport: unknown): Promise<void>; close?(): Promise<void> };\n /** Call this to start listening on stdio (for in-process MCP service) */\n connectStdio: () => Promise<void>;\n}\n\n/** Request handler for Streamable HTTP: (req, res, parsedBody?) => Promise<void>. Use with Express app.post(path, handler) and express.json(). */\nexport type MCPStreamableHttpHandler = (\n req: IncomingMessage,\n res: ServerResponse,\n parsedBody?: unknown\n) => Promise<void>;\n\nexport interface MCPServerStreamableHttpResult {\n /** Express app with POST /mcp (or path) wired to Streamable HTTP handler */\n app: { post: (path: string, handler: MCPStreamableHttpHandler) => void };\n /** Path mounted (e.g. \"/mcp\") */\n path: string;\n /** Start HTTP server; returns when listening. Use createMCPStreamableHttpHandler + your own server if you prefer. */\n listen: (port?: number, host?: string) => Promise<{ url: string; port: number }>;\n}\n\n/**\n * MCP tool names must match SEP-986: A–Z, a–z, 0–9, underscore, dash, dot only.\n * Use normalized tool name (only [a-zA-Z0-9.]).\n */\nfunction toMcpToolName(registryName: string): string {\n return normalizeToolName(registryName);\n}\n\n/**\n * Create a configured McpServer with all tools from the given runtime (no transport connected).\n * Used by createMCPServer (stdio) and createMCPStreamableHttpHandler (Streamable HTTP).\n */\nasync function createMcpServerWithTools(\n runtime: PTCRuntime,\n options: MCPServerOptions\n): Promise<{ server: InstanceType<Awaited<typeof import(\"@modelcontextprotocol/sdk/server/mcp.js\")>[\"McpServer\"]> }> {\n const { McpServer } = await import(\"@modelcontextprotocol/sdk/server/mcp.js\");\n const name = options.name ?? \"agent-tool\";\n const version = options.version ?? \"1.0.0\";\n const ctxFactory = options.execContextFactory ?? (() => ({ ...DEFAULT_CTX }));\n\n const server = new McpServer({ name, version });\n const registry = runtime.getRegistry();\n const specs = registry.snapshot();\n\n for (const spec of specs) {\n const mcpName = toMcpToolName(spec.name);\n server.registerTool(\n mcpName,\n {\n description: spec.description ?? `Tool: ${spec.name}`,\n inputSchema: spec.inputSchema,\n _meta: spec._meta,\n } as Parameters<typeof server.registerTool>[1],\n async (args: unknown) => {\n const ctx = ctxFactory();\n const result = await runtime.invoke(\n { tool: spec.name, args: args ?? {}, purpose: MCP_KIND },\n ctx\n );\n if (result.ok) {\n return { content: [{ type: \"text\", text: JSON.stringify(result.result) }] };\n }\n const err = result.error;\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ error: err?.message ?? \"Tool failed\", kind: err?.kind }),\n },\n ],\n isError: true,\n };\n }\n );\n }\n return { server };\n}\n\n/**\n * Create an MCP server that serves all tools from the given PTCRuntime.\n * Register tools with the server; then call connectStdio() to listen on stdio (for Cursor/Claude).\n */\nexport function createMCPServer(\n runtime: PTCRuntime,\n options?: MCPServerOptions\n): Promise<MCPServerResult>;\n\n/**\n * Create an MCP server from config (async: loads tools from projectPath when set).\n */\nexport function createMCPServer(\n config: CreateRuntimeOptions,\n options?: MCPServerOptions\n): Promise<MCPServerResult>;\n\nexport async function createMCPServer(\n runtimeOrConfig: PTCRuntime | CreateRuntimeOptions,\n options: MCPServerOptions = {}\n): Promise<MCPServerResult> {\n const runtime: PTCRuntime =\n \"invoke\" in runtimeOrConfig && typeof runtimeOrConfig.invoke === \"function\"\n ? (runtimeOrConfig as PTCRuntime)\n : (await createRuntimeFromConfig(runtimeOrConfig as CreateRuntimeOptions)).runtime;\n const { StdioServerTransport } = await import(\"@modelcontextprotocol/sdk/server/stdio.js\");\n\n const { server } = await createMcpServerWithTools(runtime, options);\n\n return {\n server,\n async connectStdio() {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n },\n };\n}\n\n/**\n * Create a request handler for MCP Streamable HTTP (stateless). Use with Express: app.use(express.json()); app.post(\"/mcp\", handler).\n * Each request gets a new server and transport; supports SSE and direct HTTP responses per MCP Streamable HTTP spec.\n */\nexport function createMCPStreamableHttpHandler(\n runtime: PTCRuntime,\n options?: MCPServerOptions\n): MCPStreamableHttpHandler;\n\nexport function createMCPStreamableHttpHandler(\n config: CreateRuntimeOptions,\n options?: MCPServerOptions\n): Promise<MCPStreamableHttpHandler>;\n\nexport function createMCPStreamableHttpHandler(\n runtimeOrConfig: PTCRuntime | CreateRuntimeOptions,\n options: MCPServerOptions = {}\n): MCPStreamableHttpHandler | Promise<MCPStreamableHttpHandler> {\n if (\"invoke\" in runtimeOrConfig && typeof runtimeOrConfig.invoke === \"function\") {\n const runtime = runtimeOrConfig as PTCRuntime;\n return async function streamableHttpHandler(\n req: IncomingMessage,\n res: ServerResponse,\n parsedBody?: unknown\n ): Promise<void> {\n const { StreamableHTTPServerTransport } = await import(\"@modelcontextprotocol/sdk/server/streamableHttp.js\");\n const { server } = await createMcpServerWithTools(runtime, options);\n const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });\n await server.connect(transport);\n const onClose = (): void => {\n transport.close().catch(() => {});\n server.close().catch(() => {});\n res.removeListener(\"close\", onClose);\n res.removeListener(\"finish\", onClose);\n };\n res.once(\"close\", onClose);\n res.once(\"finish\", onClose);\n await transport.handleRequest(\n req as IncomingMessage & { auth?: import(\"@modelcontextprotocol/sdk/server/auth/types.js\").AuthInfo },\n res,\n parsedBody\n );\n };\n }\n return (async (): Promise<MCPStreamableHttpHandler> => {\n const { runtime } = await createRuntimeFromConfig(runtimeOrConfig as CreateRuntimeOptions);\n return createMCPStreamableHttpHandler(runtime, options) as MCPStreamableHttpHandler;\n })();\n}\n\nexport interface CreateMCPServerStreamableHttpOptions extends MCPServerOptions {\n /** Path for MCP endpoint (default: \"/mcp\") */\n path?: string;\n /** Host to bind (default: \"127.0.0.1\") */\n host?: string;\n /** Port (default: 3000) */\n port?: number;\n}\n\n/**\n * Create an Express app with MCP Streamable HTTP handler mounted at path. Requires @modelcontextprotocol/sdk (which uses express).\n * Returns app and listen(port?, host?) to start the HTTP server.\n */\nexport function createMCPServerStreamableHttp(\n runtime: PTCRuntime,\n options?: CreateMCPServerStreamableHttpOptions\n): Promise<MCPServerStreamableHttpResult>;\n\nexport function createMCPServerStreamableHttp(\n config: CreateRuntimeOptions,\n options?: CreateMCPServerStreamableHttpOptions\n): Promise<MCPServerStreamableHttpResult>;\n\nexport async function createMCPServerStreamableHttp(\n runtimeOrConfig: PTCRuntime | CreateRuntimeOptions,\n options: CreateMCPServerStreamableHttpOptions = {}\n): Promise<MCPServerStreamableHttpResult> {\n const path = options.path ?? \"/mcp\";\n const host = options.host ?? \"127.0.0.1\";\n const port = options.port ?? 3000;\n const { createMcpExpressApp } = await import(\"@modelcontextprotocol/sdk/server/express.js\");\n const handler =\n \"invoke\" in runtimeOrConfig && typeof runtimeOrConfig.invoke === \"function\"\n ? createMCPStreamableHttpHandler(runtimeOrConfig as PTCRuntime, options)\n : await createMCPStreamableHttpHandler(runtimeOrConfig as CreateRuntimeOptions, options);\n const app = createMcpExpressApp({ host });\n app.post(path, handler);\n\n return {\n app,\n path,\n async listen(listenPort?: number, listenHost?: string): Promise<{ url: string; port: number }> {\n const p = listenPort ?? port;\n const h = listenHost ?? host;\n return new Promise((resolve, reject) => {\n const server = (app as {\n listen: (port: number, host: string, cb?: () => void) => import(\"node:http\").Server;\n }).listen(p, h, () => {\n const addr = server.address();\n const actualPort =\n typeof addr === \"object\" && addr !== null && \"port\" in addr ? addr.port : p;\n resolve({ url: `http://${h}:${actualPort}${path}`, port: actualPort });\n });\n });\n },\n };\n}\n\n/**\n * Run MCP server over stdio using the given runtime.\n * Call this when your process should act as an MCP server (e.g. for Cursor/Claude to connect).\n */\nexport async function runMCPServerOverStdio(\n runtime: PTCRuntime,\n options: MCPServerOptions = {}\n): Promise<MCPServerResult> {\n const result = await createMCPServer(runtime, options);\n await result.connectStdio();\n return result;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/tools/util/toolConfig.ts","../src/tools/util/toolDescriptor.ts","../src/core/runtime/SchemaValidator.ts","../src/core/runtime/PolicyEngine.ts","../src/core/runtime/Budget.ts","../src/core/runtime/Evidence.ts","../src/observability/EventLog.ts","../src/observability/Logger.ts","../src/observability/Metrics.ts","../src/observability/Tracing.ts","../src/core/runtime/PTCRuntimePipeline.ts","../src/core/runtime/PTCRuntimeObservability.ts","../src/core/runtime/PTCRuntime.ts","../src/security/sandbox.ts","../src/tools/util/scanUtil.ts","../src/tools/function/schemaFromTs.ts","../src/tools/function/types.ts","../src/tools/skill/types.ts","../src/tools/n8n/types.ts","../src/tools/mcp/mcpSpecToToolSpec.ts","../src/tools/function/scanner.ts","../src/tools/util/resolveEntry.ts","../src/tools/skill/SkillManifest.ts","../src/tools/skill/SkillMdParser.ts","../src/tools/skill/scanSkill.ts","../src/tools/n8n/N8nLoader.ts","../src/tools/n8n/scanN8n.ts","../src/tools/mcp/types.ts","../src/tools/mcp/scanner.ts","../src/tools/langchain/types.ts","../src/tools/langchain/scanner.ts","../src/tools/langchain/LangChainLoader.ts","../src/tools/skill/SkillLoader.ts","../src/tools/langchain/directoryLoad.ts","../src/tools/mcp/MCPLoader.ts","../src/tools/mcp/directoryApply.ts","../src/tools/langchain/directoryApply.ts","../src/tools/skill/directoryApply.ts","../src/tools/n8n/directoryApply.ts","../src/tools/discoveryFactory.ts","../src/api/runtimeFromConfig.ts","../src/api/expose/openapi.ts","../src/api/expose/openapiHttp.ts","../src/api/expose/mcpServer.ts"],"names":["packageToolDefaults","list","path","walk","uuidv4","resolveSandboxedPath","resolve","dirname","join","ts","readdir","relative","path2","scan","readFile","basename","defaultInputSchema","path3","path4","path5","DEFAULT_EXTENSIONS","pathToFileURL","entryFile","loaded","applyLoadedToSpec","directoryMarker","path6","access","existsSync","readFileSync","out","statSync","runtime","enrichSpecWithCanonicalSchema","DEFAULT_CTX"],"mappings":"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","file":"chunk-A5C2MUNA.js","sourcesContent":["/**\n * Load tool.yaml: tools config (sandboxedPath + list) or legacy top-level tools + sandboxedPath.\n * Normalized shape: tools (array of descriptors) and sandboxedPath.\n */\n\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { resolve, join, dirname } from \"node:path\";\nimport { expandHomePath, parseYamlContent, resolveConfigPath } from \"@easynet/agent-common\";\n\n/** Normalized shape returned by loadToolConfig: tools list, sandbox, security, and per-tool defaults. */\nexport interface ToolYamlShape {\n /** List of tool descriptors (npm:@scope/pkg#path or plain names). */\n tools?: string[];\n /** Root path for fs sandbox; tools can only access under this path. Resolved relative to tool.yaml dir. */\n sandboxedPath?: string;\n /** Whether to enforce sandbox boundary checks in fs path resolution. Default: false. */\n enableSandboxValidation?: boolean;\n /** Allowed hosts (e.g. [\"*\"] or [\"api.github.com\"]). Merged with programmatic config. */\n allowedHosts?: string[];\n /** Block these hosts even if allowed (e.g. [\"*.internal\"]). Merged with programmatic config. */\n blockedHosts?: string[];\n /** CIDR ranges to block for HTTP (SSRF). When set, overrides builtin default. */\n blockedCidrs?: string[];\n /** Per-tool config overrides. Keys: short name (\"fs.listDir\"), package-scoped (\"npm.easynet.agent.tool.buildin::fs.listDir\", survives version bumps), or full registry name. */\n toolDefaults?: Record<string, Record<string, unknown>>;\n /** Per-package config. Key = npm descriptor. value.defaults = package-level key-value (all tools in this package); value.tools = per-tool config (tool short name -> config). */\n packageToolDefaults?: Record<string, { defaults?: Record<string, unknown>; tools?: Record<string, Record<string, unknown>> }>;\n}\n\n/** Raw tools block: sandboxedPath, list, optional security, defaults, and optional per-package config. */\ninterface ToolsBlock {\n sandboxedPath?: string;\n enableSandboxValidation?: boolean;\n list?: string[];\n allowedHosts?: string[];\n blockedHosts?: string[];\n blockedCidrs?: string[];\n /** Per-tool config: tool short name -> config object (e.g. fs.listDir: { maxEntries: 500 }). */\n defaults?: Record<string, Record<string, unknown>>;\n /** Per-package: descriptor -> { defaults: package-level k-v, tools: { toolName: config } }. */\n packages?: Record<string, { defaults?: Record<string, unknown>; tools?: Record<string, Record<string, unknown>> }>;\n}\n\n/** Raw tool.yaml: either legacy (tools array + top-level sandboxedPath) or new (tools object with sandboxedPath + list + security + defaults). */\ninterface RawToolYaml {\n tools?: string[] | ToolsBlock;\n sandboxedPath?: string;\n enableSandboxValidation?: boolean;\n allowedHosts?: string[];\n blockedHosts?: string[];\n blockedCidrs?: string[];\n /** Top-level per-tool defaults (alternative to tools.defaults). */\n toolDefaults?: Record<string, Record<string, unknown>>;\n /** Top-level per-package config (alternative to tools.packages). */\n packageToolDefaults?: Record<string, { defaults?: Record<string, unknown>; tools?: Record<string, Record<string, unknown>> }>;\n}\n\n/**\n * Load tool.yaml and return normalized shape (tools array + sandboxedPath).\n * Supports:\n * - tools: { sandboxedPath, list?, packages? }. When list is omitted, tools = keys of packages.\n * - tools: { packages: { \"npm:@scope/pkg\": { defaults: {...} } } } — list not needed, loaded from packages.\n * - Legacy: tools: [...], sandboxedPath (top-level). With top-level packageToolDefaults, tools = keys when tools array absent.\n */\nexport function loadToolConfig(toolYamlPath: string): ToolYamlShape {\n const abs = resolve(toolYamlPath);\n const raw = readFileSync(abs, \"utf8\");\n const parsed = parseYamlContent<RawToolYaml | undefined>(raw, {\n substituteEnv: false,\n });\n if (!parsed || typeof parsed !== \"object\") return {};\n const toolsBlock = parsed.tools;\n if (toolsBlock != null && typeof toolsBlock === \"object\" && !Array.isArray(toolsBlock)) {\n const toolDefaults =\n toolsBlock.defaults != null &&\n typeof toolsBlock.defaults === \"object\" &&\n !Array.isArray(toolsBlock.defaults)\n ? (toolsBlock.defaults as Record<string, Record<string, unknown>>)\n : undefined;\n const packageToolDefaults =\n toolsBlock.packages != null &&\n typeof toolsBlock.packages === \"object\" &&\n !Array.isArray(toolsBlock.packages)\n ? (toolsBlock.packages as Record<string, { defaults?: Record<string, unknown>; tools?: Record<string, Record<string, unknown>> }>)\n : undefined;\n const list = Array.isArray(toolsBlock.list) && toolsBlock.list.length > 0 ? toolsBlock.list : undefined;\n return {\n tools: list ?? (packageToolDefaults ? Object.keys(packageToolDefaults) : undefined),\n sandboxedPath:\n typeof toolsBlock.sandboxedPath === \"string\" ? toolsBlock.sandboxedPath : parsed.sandboxedPath,\n enableSandboxValidation:\n typeof toolsBlock.enableSandboxValidation === \"boolean\"\n ? toolsBlock.enableSandboxValidation\n : parsed.enableSandboxValidation,\n allowedHosts:\n Array.isArray(toolsBlock.allowedHosts) ? toolsBlock.allowedHosts : parsed.allowedHosts,\n blockedHosts:\n Array.isArray(toolsBlock.blockedHosts) ? toolsBlock.blockedHosts : parsed.blockedHosts,\n blockedCidrs:\n Array.isArray(toolsBlock.blockedCidrs) ? toolsBlock.blockedCidrs : parsed.blockedCidrs,\n toolDefaults,\n packageToolDefaults,\n };\n }\n const packageToolDefaults =\n typeof parsed.packageToolDefaults === \"object\" && !Array.isArray(parsed.packageToolDefaults)\n ? (parsed.packageToolDefaults as Record<string, { defaults?: Record<string, unknown>; tools?: Record<string, Record<string, unknown>> }>)\n : undefined;\n const list = Array.isArray(parsed.tools) && parsed.tools.length > 0 ? parsed.tools : undefined;\n return {\n tools: list ?? (packageToolDefaults ? Object.keys(packageToolDefaults) : undefined),\n sandboxedPath: parsed.sandboxedPath,\n enableSandboxValidation:\n typeof parsed.enableSandboxValidation === \"boolean\" ? parsed.enableSandboxValidation : undefined,\n allowedHosts: Array.isArray(parsed.allowedHosts) ? parsed.allowedHosts : undefined,\n blockedHosts: Array.isArray(parsed.blockedHosts) ? parsed.blockedHosts : undefined,\n blockedCidrs: Array.isArray(parsed.blockedCidrs) ? parsed.blockedCidrs : undefined,\n toolDefaults:\n typeof parsed.toolDefaults === \"object\" && !Array.isArray(parsed.toolDefaults)\n ? (parsed.toolDefaults as Record<string, Record<string, unknown>>)\n : undefined,\n packageToolDefaults,\n };\n}\n\n/**\n * Resolve sandboxedPath from tool.yaml relative to the config file directory.\n * Expands leading ~ to homedir so ~/.agent/sandbox works.\n */\nexport function resolveSandboxedPath(toolYamlPath: string, sandboxedPath: string): string {\n const configDir = dirname(resolve(toolYamlPath));\n return resolveConfigPath(sandboxedPath, configDir, {\n expandHome: true,\n });\n}\n\n/** Default subdir under sandboxedPath for the npm package cache. */\nexport const CACHE_SUBDIR = \".agent/cache\";\n\n/**\n * Return cache base path when tool.yaml has sandboxedPath: sandboxedPath/.agent/cache.\n * Call ensurePackageInCache(..., { cacheBase: getCacheBaseFromToolConfig(path) }) to use it.\n */\nexport function getCacheBaseFromToolConfig(toolYamlPath: string): string | undefined {\n const config = loadToolConfig(toolYamlPath);\n if (!config.sandboxedPath || typeof config.sandboxedPath !== \"string\") return undefined;\n const sandboxRoot = resolveSandboxedPath(toolYamlPath, config.sandboxedPath);\n return join(sandboxRoot, CACHE_SUBDIR);\n}\n\n/**\n * Find tool.yaml in directory (tool.yaml or .tool.yaml) and load it.\n * Dir is resolved against process.cwd() when relative so we always load from the local folder.\n */\nexport function findAndLoadToolConfig(dir: string): ToolYamlShape & { configPath?: string } {\n const resolvedDir = resolve(dir);\n const candidates = [join(resolvedDir, \"tool.yaml\"), join(resolvedDir, \".tool.yaml\")];\n for (const p of candidates) {\n if (existsSync(p)) {\n const config = loadToolConfig(p);\n return { ...config, configPath: p };\n }\n }\n return {};\n}\n","import { normalizeToolName } from \"../../core/types/ToolSpec.js\";\n\n/**\n * Tool path format (canonical, supported everywhere):\n * [protocol]:[scope]/[package with version]#[tool name] (tool name required)\n * [protocol]:[scope]/[package with version] (bare package; tool name omitted = all tools)\n *\n * Examples:\n * npm:@easynet/agent-tool-builtin#fs.readText\n * npm:@scope/pkg@1.0.0#http.fetchText\n * npm:@easynet/agent-tool-builtin (bare package)\n * file:./local/tools#myTool\n */\n\n/** Matches [protocol]:[scope]/[package]#[tool name] or [protocol]:[scope]/[package] (optional #part) */\nconst TOOL_PATH_REGEX = /^([a-z][a-z0-9-]*):([^/]+)\\/([^#]+)(#(.+))?$/;\n\nexport interface ToolPath {\n /** Protocol (npm, file, http, etc.) */\n protocol: string;\n /** Scope, e.g. @easynet or scope */\n scope: string;\n /** Package id, optionally with version (e.g. pkg or pkg@1.0.0) */\n packageWithVersion: string;\n /** Tool name after #; empty string when bare package (no #) */\n toolName: string;\n}\n\n/** Parsed package and optional version from packageWithVersion (e.g. \"pkg@1.0.0\" -> { package: \"pkg\", version: \"1.0.0\" }) */\nexport interface PackageVersion {\n package: string;\n version?: string;\n}\n\n/**\n * Check if a string is a tool path in canonical form.\n * Format: [protocol]:[scope]/[package with version]#[tool name]\n */\nexport function isToolPath(descriptor: string): boolean {\n return TOOL_PATH_REGEX.test(descriptor.trim());\n}\n\n/**\n * Check if a descriptor is a bare package (no #toolName).\n * When true, the intent is to load all tools from that package.\n */\nexport function isBarePackageDescriptor(descriptor: string): boolean {\n const parsed = parseToolPath(descriptor.trim());\n return parsed !== null && parsed.toolName === \"\";\n}\n\n/**\n * Parse a tool path into { protocol, scope, packageWithVersion, toolName }.\n * Returns null if the string does not match the format.\n */\nexport function parseToolPath(descriptor: string): ToolPath | null {\n const s = descriptor.trim();\n const m = s.match(TOOL_PATH_REGEX);\n if (!m || m[1] === undefined || m[2] === undefined || m[3] === undefined) return null;\n return {\n protocol: m[1],\n scope: m[2],\n packageWithVersion: m[3],\n toolName: m[5] ?? \"\",\n };\n}\n\n/**\n * Build registry name prefix from an npm descriptor (only [a-zA-Z0-9.] in result).\n * Npm tools are always managed in the registry with a concrete version; we never use \"latest\" in the registry.\n * When the descriptor omits version or uses @latest, the caller must resolve to the actual latest version\n * (e.g. via resolveLatestVersionFromRegistry) and pass it as resolvedVersion.\n *\n * @param descriptor - e.g. \"npm:@easynet/agent-tool-buildin\" or \"npm:@scope/pkg@1.0.0\"\n * @param resolvedVersion - Actual version (e.g. \"0.0.11\"); required when descriptor has no version or @latest\n * @returns e.g. \"npm.easynet.agent.tool.buildin.0.0.11.\" (never contains \"latest\")\n * @throws if descriptor uses latest but resolvedVersion is missing or equals \"latest\"\n */\nexport function npmDescriptorToRegistryPrefix(descriptor: string, resolvedVersion?: string): string {\n const s = descriptor.trim();\n if (typeof s !== \"string\" || !s.startsWith(\"npm:\")) return \"\";\n const rest = s.slice(4).trim();\n const hashIdx = rest.indexOf(\"#\");\n const beforeHash = hashIdx < 0 ? rest : rest.slice(0, hashIdx);\n const lastAt = beforeHash.lastIndexOf(\"@\");\n const scopeAndPackage = lastAt <= 0 ? beforeHash : beforeHash.slice(0, lastAt);\n let version = lastAt <= 0 ? \"latest\" : beforeHash.slice(lastAt + 1).trim() || \"latest\";\n if (version === \"latest\" || !version) {\n const resolved = (resolvedVersion ?? \"\").trim();\n if (resolved !== \"\" && resolved.toLowerCase() !== \"latest\") {\n version = resolved;\n } else {\n throw new Error(\n `Registry prefix requires a concrete version when descriptor uses latest (${descriptor}). ` +\n `Resolve version from registry (e.g. resolveLatestVersionFromRegistry) and pass as resolvedVersion.`,\n );\n }\n }\n // Never allow \"latest\" in registry even if descriptor had @latest and wrong resolvedVersion was passed\n if (!version || version.toLowerCase() === \"latest\") {\n throw new Error(\n `Registry never uses \"latest\"; pass resolved concrete version for npm descriptor: ${descriptor}`,\n );\n }\n const slashIdx = scopeAndPackage.indexOf(\"/\");\n const scope = slashIdx < 0 ? scopeAndPackage : scopeAndPackage.slice(0, slashIdx).replace(/^@/, \"\");\n const pkg = slashIdx < 0 ? \"\" : scopeAndPackage.slice(slashIdx + 1);\n const segment = [scope, pkg, version].filter(Boolean).join(\".\");\n const normalized = normalizeToolName(segment);\n if (!normalized) return \"\";\n return \"npm.\" + normalized + \".\";\n}\n\n/**\n * Package prefix from npm descriptor without version (for package-scoped config keys).\n * e.g. \"npm:@easynet/agent-tool-buildin\" or \"npm:@easynet/agent-tool-buildin@0.0.11\" -> \"npm.easynet.agent.tool.buildin\"\n */\nexport function npmDescriptorToPackagePrefix(descriptor: string): string {\n const s = descriptor.trim();\n if (typeof s !== \"string\" || !s.startsWith(\"npm:\")) return \"\";\n const rest = s.slice(4).trim();\n const hashIdx = rest.indexOf(\"#\");\n const beforeHash = hashIdx < 0 ? rest : rest.slice(0, hashIdx);\n const lastAt = beforeHash.lastIndexOf(\"@\");\n const scopeAndPackage = lastAt <= 0 ? beforeHash : beforeHash.slice(0, lastAt);\n const slashIdx = scopeAndPackage.indexOf(\"/\");\n const scope = slashIdx < 0 ? scopeAndPackage : scopeAndPackage.slice(0, slashIdx).replace(/^@/, \"\");\n const pkg = slashIdx < 0 ? \"\" : scopeAndPackage.slice(slashIdx + 1);\n const segment = [scope, pkg].filter(Boolean).join(\".\");\n const normalized = normalizeToolName(segment);\n if (!normalized) return \"\";\n return \"npm.\" + normalized;\n}\n\n/**\n * Package prefix with version when descriptor has explicit version (for same package at multiple versions).\n * e.g. \"npm:@easynet/agent-tool-buildin@1.0.0\" -> \"npm.easynet.agent.tool.buildin.1.0.0\"\n * \"npm:@easynet/agent-tool-buildin\" -> \"npm.easynet.agent.tool.buildin\" (no version)\n */\nexport function npmDescriptorToPackagePrefixWithVersion(descriptor: string): string {\n const s = descriptor.trim();\n if (typeof s !== \"string\" || !s.startsWith(\"npm:\")) return \"\";\n const rest = s.slice(4).trim();\n const hashIdx = rest.indexOf(\"#\");\n const beforeHash = hashIdx < 0 ? rest : rest.slice(0, hashIdx);\n const lastAt = beforeHash.lastIndexOf(\"@\");\n const scopeAndPackage = lastAt <= 0 ? beforeHash : beforeHash.slice(0, lastAt);\n const version = lastAt <= 0 ? \"\" : beforeHash.slice(lastAt + 1).trim();\n const slashIdx = scopeAndPackage.indexOf(\"/\");\n const scope = slashIdx < 0 ? scopeAndPackage : scopeAndPackage.slice(0, slashIdx).replace(/^@/, \"\");\n const pkg = slashIdx < 0 ? \"\" : scopeAndPackage.slice(slashIdx + 1);\n const segment = [scope, pkg, version].filter(Boolean).join(\".\");\n const normalized = normalizeToolName(segment);\n if (!normalized) return \"\";\n return \"npm.\" + normalized;\n}\n\n/**\n * Split packageWithVersion into package and optional version (e.g. \"pkg@1.0.0\" -> { package: \"pkg\", version: \"1.0.0\" }).\n */\nexport function parsePackageVersion(packageWithVersion: string): PackageVersion {\n const at = packageWithVersion.lastIndexOf(\"@\");\n if (at <= 0) return { package: packageWithVersion };\n const pkg = packageWithVersion.slice(0, at);\n const version = packageWithVersion.slice(at + 1);\n if (!version || /^\\d/.test(version)) return { package: pkg, version };\n return { package: packageWithVersion };\n}\n\n// --- Backward compatibility: npm-specific API ---\n\n/** Matches npm:@scope/packageName#toolPath (subset of tool path) */\nconst NPM_TOOL_DESCRIPTOR_REGEX = /^npm:(@[\\w.-]+\\/[\\w.-]+)#(.+)$/;\n\nexport interface NpmToolDescriptor {\n /** Full package id, e.g. @scope/package */\n fullPackage: string;\n /** Tool path after #, e.g. fs.readText */\n toolPath: string;\n}\n\n/**\n * Check if a string is an npm tool path (npm:@scope/package#path).\n * @deprecated Prefer isToolPath(descriptor) and parseToolPath(descriptor)?.protocol === 'npm'\n */\nexport function isNpmToolDescriptor(descriptor: string): boolean {\n return isToolPath(descriptor) && parseToolPath(descriptor)?.protocol === \"npm\";\n}\n\n/**\n * Parse npm tool path into { fullPackage, toolPath } or null.\n * @deprecated Prefer parseToolPath(descriptor) for protocol:scope/package#toolName\n */\nexport function parseNpmToolDescriptor(descriptor: string): NpmToolDescriptor | null {\n const parsed = parseToolPath(descriptor);\n if (!parsed || parsed.protocol !== \"npm\") return null;\n return {\n fullPackage: `${parsed.scope}/${parsed.packageWithVersion}`,\n toolPath: parsed.toolName,\n };\n}\n\n/**\n * Return the display scope for a tool: the first segment of the registry name (before the first \".\"),\n * or the full name if there is no \".\".\n */\nexport function getDisplayScope(\n registryName: string,\n _kind?: string,\n _toolVersion?: string,\n): string {\n const i = registryName.indexOf(\".\");\n return i < 0 ? registryName : registryName.slice(0, i);\n}\n\n/**\n * Resolve a single npm tool descriptor to a registry name.\n * This package does not resolve npm descriptors to registry names; resolution is done by the runtime/loader.\n * Returns null so that resolveToolDescriptor returns the descriptor as-is.\n */\nexport function resolveNpmToolDescriptor(descriptor: string): string | null {\n return null;\n}\n\n/**\n * Expand a list of tool descriptors to registry tool names.\n * - Plain names: match registry name or suffix (e.g. readText -> npm...readText).\n * - protocol:scope/package#toolName: resolve to registry names that start with package prefix and end with .toolName.\n * - protocol:scope/package (bare): resolve to all registry names that start with package prefix.\n */\nexport function expandToolDescriptorsToRegistryNames(\n descriptors: string[],\n registryNames: string[],\n): string[] {\n const out: string[] = [];\n const seen = new Set<string>();\n\n function add(name: string): void {\n const key = normalizeToolName(name);\n if (registryNames.includes(key) && !seen.has(key)) {\n seen.add(key);\n out.push(key);\n return;\n }\n const matched = registryNames.filter((r) => r === key || r.endsWith(\".\" + key));\n for (const m of matched) {\n if (!seen.has(m)) {\n seen.add(m);\n out.push(m);\n }\n }\n }\n\n for (const d of descriptors) {\n const s = d.trim();\n if (!s) continue;\n if (isToolPath(s)) {\n if (registryNames.includes(s) && !seen.has(s)) {\n seen.add(s);\n out.push(s);\n continue;\n }\n const path = parseToolPath(s);\n if (path) {\n const packagePrefix =\n path.protocol === \"npm\"\n ? npmDescriptorToPackagePrefix(s)\n : path.protocol === \"file\"\n ? fileDescriptorToPackagePrefix(s)\n : \"\";\n const prefixWithDot = packagePrefix ? packagePrefix + \".\" : \"\";\n if (prefixWithDot) {\n if (path.toolName) {\n const suffix = \".\" + path.toolName;\n for (const r of registryNames) {\n if (r.startsWith(prefixWithDot) && r.endsWith(suffix) && !seen.has(r)) {\n seen.add(r);\n out.push(r);\n }\n }\n } else {\n for (const r of registryNames) {\n if (r.startsWith(prefixWithDot) && !seen.has(r)) {\n seen.add(r);\n out.push(r);\n }\n }\n }\n }\n }\n continue;\n }\n const name = normalizeToolName(s);\n add(name);\n }\n return out;\n}\n\n/**\n * Resolve a single tool descriptor to a tool name.\n * If it is a tool path, returns it as-is (no resolution in this package); otherwise returns the string as-is (plain name).\n */\nexport function resolveToolDescriptor(descriptor: string): string {\n const s = descriptor.trim();\n const resolved = resolveNpmToolDescriptor(s);\n if (resolved !== null) return resolved;\n return s;\n}\n\n/**\n * Normalize a list of tool descriptors (plain names or [protocol]:[scope]/[package]#[tool name]).\n * Deduplicates and preserves order. Tool paths are kept as-is (no resolution in this package).\n */\nexport function normalizeToolList(descriptors: string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const d of descriptors) {\n if (typeof d !== \"string\" || !d.trim()) continue;\n const name = resolveToolDescriptor(d);\n if (!seen.has(name)) {\n seen.add(name);\n out.push(name);\n }\n }\n return out;\n}\n\n/**\n * Serialize ToolPath back to canonical string.\n * [protocol]:[scope]/[package with version]#[tool name]\n */\nexport function formatToolPath(path: ToolPath): string {\n return `${path.protocol}:${path.scope}/${path.packageWithVersion}#${path.toolName}`;\n}\n\n/**\n * Package prefix for file: descriptor (for config keys in tools.packages). No trailing dot.\n * e.g. \"file:./local-tools\" -> \"file.local.tools\"\n */\nexport function fileDescriptorToPackagePrefix(descriptor: string): string {\n const path = parseToolPath(descriptor.trim());\n if (!path || path.protocol !== \"file\") return \"\";\n const pathPart = `${path.scope}/${path.packageWithVersion}`;\n const normalized = normalizeToolName(pathPart);\n if (!normalized) return \"\";\n return normalizeToolName(\"file.\" + normalized);\n}\n\n/**\n * Registry prefix for file: descriptor (local folder). Path is scope/packageWithVersion from parseToolPath. Has trailing dot.\n * e.g. \"file:./local-tools\" -> \"file.local.tools.\", \"file:../other/pkg\" -> \"file.other.pkg.\"\n */\nexport function fileDescriptorToRegistryPrefix(descriptor: string): string {\n const prefix = fileDescriptorToPackagePrefix(descriptor);\n return prefix ? prefix + \".\" : \"\";\n}\n","import Ajv, { type ValidateFunction, type ErrorObject } from \"ajv\";\nimport addFormats from \"ajv-formats\";\n\n/**\n * Schema validation result.\n */\nexport interface ValidationResult {\n valid: boolean;\n errors?: ErrorObject[];\n data?: unknown;\n}\n\n/**\n * AJV-based JSON Schema validator with coercion and default enrichment.\n */\nexport class SchemaValidator {\n private readonly ajv: Ajv;\n private readonly cache = new Map<string, ValidateFunction>();\n\n constructor() {\n this.ajv = new Ajv({\n allErrors: true,\n coerceTypes: true,\n useDefaults: true,\n removeAdditional: \"failing\",\n strict: false,\n });\n addFormats(this.ajv);\n }\n\n /**\n * Validate data against a JSON Schema.\n * Coerces types and applies defaults in-place.\n */\n validate(schema: object, data: unknown): ValidationResult {\n const validate = this.getOrCompile(schema);\n const cloned = structuredClone(data);\n const valid = validate(cloned) as boolean;\n\n if (valid) {\n return { valid: true, data: cloned };\n }\n\n return {\n valid: false,\n errors: validate.errors ?? undefined,\n };\n }\n\n /**\n * Validate and return coerced data, or throw a descriptive error.\n */\n validateOrThrow(schema: object, data: unknown, context: string): unknown {\n const result = this.validate(schema, data);\n if (!result.valid) {\n const messages = (result.errors ?? [])\n .map((e) => `${e.instancePath || \"/\"} ${e.message}`)\n .join(\"; \");\n throw new SchemaValidationError(\n `${context}: ${messages}`,\n result.errors ?? [],\n );\n }\n return result.data;\n }\n\n /**\n * Apply default values from schema to data without full validation.\n */\n enrichDefaults(schema: object, data: unknown): unknown {\n const validate = this.getOrCompile(schema);\n const cloned = structuredClone(data);\n validate(cloned);\n return cloned;\n }\n\n private getOrCompile(schema: object): ValidateFunction {\n const normalized = this.normalizeSchema(schema);\n const key = JSON.stringify(normalized);\n let cached = this.cache.get(key);\n if (!cached) {\n cached = this.ajv.compile(normalized);\n this.cache.set(key, cached);\n }\n return cached;\n }\n\n /** Ensure schema is AJV-compatible (required = string[], nullable handled via type). */\n private normalizeSchema(schema: object): object {\n return this.normalizeSchemaRec(schema as Record<string, unknown>) as object;\n }\n\n private normalizeSchemaRec(s: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(s)) {\n if (key === \"required\") {\n const raw = value;\n out.required = Array.isArray(raw)\n ? raw.filter((x): x is string => typeof x === \"string\")\n : typeof raw === \"string\"\n ? [raw]\n : [];\n continue;\n }\n if (key === \"nullable\") {\n // Skip copying nullable; we'll fix type below if nullable was true\n continue;\n }\n if (key === \"properties\" && value !== null && typeof value === \"object\") {\n const props: Record<string, unknown> = {};\n for (const [pk, pv] of Object.entries(value as Record<string, unknown>)) {\n if (pv !== null && typeof pv === \"object\" && !Array.isArray(pv)) {\n props[pk] = this.normalizeSchemaRec(pv as Record<string, unknown>);\n } else {\n props[pk] = pv;\n }\n }\n out.properties = props;\n continue;\n }\n if (\n (key === \"items\" || key === \"additionalProperties\") &&\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value)\n ) {\n out[key] = this.normalizeSchemaRec(value as Record<string, unknown>);\n continue;\n }\n if (\n (key === \"oneOf\" || key === \"anyOf\" || key === \"allOf\") &&\n Array.isArray(value)\n ) {\n out[key] = value.map((item) =>\n item !== null && typeof item === \"object\" && !Array.isArray(item)\n ? this.normalizeSchemaRec(item as Record<string, unknown>)\n : item,\n );\n continue;\n }\n out[key] = value;\n }\n\n // AJV: \"nullable\" requires \"type\". Convert nullable to type including \"null\".\n if (s.nullable === true) {\n const existingType = out.type;\n if (existingType === undefined) {\n out.type = \"object\";\n } else if (Array.isArray(existingType)) {\n if (!existingType.includes(\"null\")) out.type = [...existingType, \"null\"];\n } else {\n out.type = [existingType, \"null\"];\n }\n }\n return out;\n }\n}\n\n/**\n * Error thrown on schema validation failure.\n */\nexport class SchemaValidationError extends Error {\n constructor(\n message: string,\n public readonly errors: ErrorObject[],\n ) {\n super(message);\n this.name = \"SchemaValidationError\";\n }\n}\n","import type { Capability, ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext } from \"../types/ToolIntent.js\";\n\n/**\n * Policy configuration for the engine.\n */\nexport interface PolicyConfig {\n /** File system sandbox paths (allowed write directories) */\n sandboxPaths?: string[];\n /** Allowed URL patterns (regex strings) */\n urlAllowlist?: string[];\n /** Denied URL patterns (regex strings) */\n urlDenylist?: string[];\n /** SQL patterns that are denied (e.g., DROP, TRUNCATE) */\n deniedSqlPatterns?: string[];\n /** Network allowed domains */\n allowedDomains?: string[];\n /** Whether to require explicit permission for danger:destructive */\n requireExplicitDangerPermission?: boolean;\n}\n\n/**\n * Result of a policy check.\n */\nexport interface PolicyCheckResult {\n allowed: boolean;\n reason?: string;\n missingCapabilities?: Capability[];\n}\n\n/**\n * Policy engine for capability gating, parameter security, and access control.\n */\nexport class PolicyEngine {\n private readonly config: PolicyConfig;\n\n constructor(config: PolicyConfig = {}) {\n this.config = {\n requireExplicitDangerPermission: true,\n deniedSqlPatterns: [\"DROP\\\\s\", \"TRUNCATE\\\\s\", \"DELETE\\\\s+FROM\\\\s+\\\\w+\\\\s*$\"],\n ...config,\n };\n }\n\n /**\n * Enforce all policy checks. Throws PolicyDeniedError if denied.\n */\n enforce(spec: ToolSpec, args: unknown, ctx: ExecContext): void {\n const result = this.check(spec, args, ctx);\n if (!result.allowed) {\n throw new PolicyDeniedError(\n result.reason ?? \"Policy denied\",\n result.missingCapabilities,\n );\n }\n }\n\n /**\n * Check all policies without throwing.\n */\n check(spec: ToolSpec, args: unknown, ctx: ExecContext): PolicyCheckResult {\n // 1. Capability gate\n const capResult = this.checkCapabilities(spec, ctx);\n if (!capResult.allowed) return capResult;\n\n // 2. Parameter-level security\n const paramResult = this.checkParameters(spec, args);\n if (!paramResult.allowed) return paramResult;\n\n // 3. Dry-run check (if enabled, just allow but flag)\n return { allowed: true };\n }\n\n /**\n * Check that context permissions cover tool capabilities.\n */\n private checkCapabilities(\n spec: ToolSpec,\n ctx: ExecContext,\n ): PolicyCheckResult {\n const missing: Capability[] = [];\n\n for (const cap of spec.capabilities) {\n if (cap === \"danger:destructive\") {\n // Destructive capability requires explicit permission\n if (\n this.config.requireExplicitDangerPermission &&\n !ctx.permissions.includes(\"danger:destructive\")\n ) {\n missing.push(cap);\n }\n } else if (!ctx.permissions.includes(cap)) {\n missing.push(cap);\n }\n }\n\n if (missing.length > 0) {\n return {\n allowed: false,\n reason: `Missing capabilities: ${missing.join(\", \")}`,\n missingCapabilities: missing,\n };\n }\n\n return { allowed: true };\n }\n\n /**\n * Check parameter-level security constraints.\n */\n private checkParameters(spec: ToolSpec, args: unknown): PolicyCheckResult {\n if (!args || typeof args !== \"object\") return { allowed: true };\n\n const argsObj = args as Record<string, unknown>;\n\n // File path sandboxing\n if (spec.capabilities.includes(\"write:fs\") && this.config.sandboxPaths) {\n const pathResult = this.checkFilePaths(argsObj);\n if (!pathResult.allowed) return pathResult;\n }\n\n // URL allowlist/denylist\n if (\n spec.capabilities.includes(\"network\") ||\n spec.capabilities.includes(\"read:web\")\n ) {\n const urlResult = this.checkUrls(argsObj);\n if (!urlResult.allowed) return urlResult;\n }\n\n // SQL injection prevention\n if (\n spec.capabilities.includes(\"write:db\") ||\n spec.capabilities.includes(\"read:db\")\n ) {\n const sqlResult = this.checkSql(argsObj);\n if (!sqlResult.allowed) return sqlResult;\n }\n\n // Network domain restrictions\n if (spec.capabilities.includes(\"network\") && this.config.allowedDomains) {\n const domainResult = this.checkDomains(argsObj);\n if (!domainResult.allowed) return domainResult;\n }\n\n return { allowed: true };\n }\n\n private checkFilePaths(args: Record<string, unknown>): PolicyCheckResult {\n const paths = this.extractStringValues(args, [\"path\", \"file\", \"filepath\", \"filename\", \"dir\", \"directory\"]);\n for (const p of paths) {\n const normalized = p.replace(/\\.\\./g, \"\");\n if (p.includes(\"..\")) {\n return {\n allowed: false,\n reason: `Path traversal detected: ${p}`,\n };\n }\n if (this.config.sandboxPaths && this.config.sandboxPaths.length > 0) {\n const inSandbox = this.config.sandboxPaths.some(\n (sp) => normalized.startsWith(sp),\n );\n if (!inSandbox) {\n return {\n allowed: false,\n reason: `Path outside sandbox: ${p}. Allowed: ${this.config.sandboxPaths.join(\", \")}`,\n };\n }\n }\n }\n return { allowed: true };\n }\n\n private checkUrls(args: Record<string, unknown>): PolicyCheckResult {\n const urls = this.extractStringValues(args, [\"url\", \"endpoint\", \"href\", \"uri\"]);\n for (const url of urls) {\n // Check denylist\n if (this.config.urlDenylist) {\n for (const pattern of this.config.urlDenylist) {\n if (new RegExp(pattern, \"i\").test(url)) {\n return {\n allowed: false,\n reason: `URL denied by policy: ${url}`,\n };\n }\n }\n }\n // Check allowlist (if configured, URL must match)\n if (this.config.urlAllowlist && this.config.urlAllowlist.length > 0) {\n const allowed = this.config.urlAllowlist.some((pattern) =>\n new RegExp(pattern, \"i\").test(url),\n );\n if (!allowed) {\n return {\n allowed: false,\n reason: `URL not in allowlist: ${url}`,\n };\n }\n }\n }\n return { allowed: true };\n }\n\n private checkSql(args: Record<string, unknown>): PolicyCheckResult {\n const sqls = this.extractStringValues(args, [\"sql\", \"query\", \"statement\"]);\n for (const sql of sqls) {\n if (this.config.deniedSqlPatterns) {\n for (const pattern of this.config.deniedSqlPatterns) {\n if (new RegExp(pattern, \"i\").test(sql)) {\n return {\n allowed: false,\n reason: `SQL pattern denied: ${sql.slice(0, 50)}...`,\n };\n }\n }\n }\n }\n return { allowed: true };\n }\n\n private checkDomains(args: Record<string, unknown>): PolicyCheckResult {\n const urls = this.extractStringValues(args, [\"url\", \"endpoint\", \"href\", \"host\", \"domain\"]);\n for (const url of urls) {\n try {\n const hostname = url.includes(\"://\")\n ? new URL(url).hostname\n : url;\n if (\n this.config.allowedDomains &&\n !this.config.allowedDomains.some(\n (d) => hostname === d || hostname.endsWith(`.${d}`),\n )\n ) {\n return {\n allowed: false,\n reason: `Domain not allowed: ${hostname}`,\n };\n }\n } catch {\n // Not a valid URL, skip\n }\n }\n return { allowed: true };\n }\n\n /**\n * Extract string values from args matching given key patterns.\n */\n private extractStringValues(\n args: Record<string, unknown>,\n keyPatterns: string[],\n ): string[] {\n const results: string[] = [];\n const walk = (obj: Record<string, unknown>) => {\n for (const [key, val] of Object.entries(obj)) {\n const lowerKey = key.toLowerCase();\n if (\n typeof val === \"string\" &&\n keyPatterns.some((p) => lowerKey.includes(p))\n ) {\n results.push(val);\n } else if (val && typeof val === \"object\" && !Array.isArray(val)) {\n walk(val as Record<string, unknown>);\n }\n }\n };\n walk(args);\n return results;\n }\n}\n\n/**\n * Error thrown when policy denies execution.\n */\nexport class PolicyDeniedError extends Error {\n public readonly kind = \"POLICY_DENIED\";\n\n constructor(\n message: string,\n public readonly missingCapabilities?: Capability[],\n ) {\n super(message);\n this.name = \"PolicyDeniedError\";\n }\n}\n","import {\n bulkhead,\n circuitBreaker,\n ConsecutiveBreaker,\n handleAll,\n type CircuitBreakerPolicy,\n type BulkheadPolicy,\n} from \"cockatiel\";\n\n/**\n * Budget configuration for a tool or global scope.\n */\nexport interface BudgetOptions {\n /** Default timeout in ms for tool invocations */\n defaultTimeoutMs?: number;\n /** Max concurrent invocations per tool */\n maxConcurrency?: number;\n /** Rate limit: max calls per window */\n rateLimit?: { maxCalls: number; windowMs: number };\n /** Circuit breaker config */\n circuitBreaker?: {\n /** Number of consecutive failures before opening */\n threshold: number;\n /** Half-open reset time in ms */\n halfOpenAfterMs: number;\n };\n}\n\n/**\n * Per-tool rate limiter using sliding window.\n */\nclass RateLimiter {\n private readonly timestamps: number[] = [];\n\n constructor(\n private readonly maxCalls: number,\n private readonly windowMs: number,\n ) {}\n\n tryAcquire(): boolean {\n const now = Date.now();\n // Remove expired timestamps\n while (this.timestamps.length > 0 && this.timestamps[0]! <= now - this.windowMs) {\n this.timestamps.shift();\n }\n if (this.timestamps.length >= this.maxCalls) {\n return false;\n }\n this.timestamps.push(now);\n return true;\n }\n\n get remaining(): number {\n const now = Date.now();\n const active = this.timestamps.filter((t) => t > now - this.windowMs);\n return Math.max(0, this.maxCalls - active.length);\n }\n}\n\n/**\n * Budget manager that provides timeout, rate limiting, concurrency control,\n * and circuit breaker per tool.\n */\nexport class BudgetManager {\n private readonly defaultTimeoutMs: number;\n private readonly bulkheads = new Map<string, BulkheadPolicy>();\n private readonly circuitBreakers = new Map<string, CircuitBreakerPolicy>();\n private readonly rateLimiters = new Map<string, RateLimiter>();\n private readonly options: BudgetOptions;\n\n constructor(options: BudgetOptions = {}) {\n this.options = options;\n this.defaultTimeoutMs = options.defaultTimeoutMs ?? 30_000;\n }\n\n /**\n * Get effective timeout for a tool invocation.\n */\n getTimeout(_toolName: string, contextTimeoutMs?: number): number {\n return contextTimeoutMs ?? this.defaultTimeoutMs;\n }\n\n /**\n * Check rate limit for a tool. Returns true if allowed.\n */\n checkRateLimit(toolName: string): boolean {\n if (!this.options.rateLimit) return true;\n let limiter = this.rateLimiters.get(toolName);\n if (!limiter) {\n limiter = new RateLimiter(\n this.options.rateLimit.maxCalls,\n this.options.rateLimit.windowMs,\n );\n this.rateLimiters.set(toolName, limiter);\n }\n return limiter.tryAcquire();\n }\n\n /**\n * Get or create a bulkhead (concurrency limiter) for a tool.\n */\n getBulkhead(toolName: string): BulkheadPolicy | undefined {\n if (!this.options.maxConcurrency) return undefined;\n let bh = this.bulkheads.get(toolName);\n if (!bh) {\n bh = bulkhead(this.options.maxConcurrency, 0);\n this.bulkheads.set(toolName, bh);\n }\n return bh;\n }\n\n /**\n * Get or create a circuit breaker for a tool.\n */\n getCircuitBreaker(toolName: string): CircuitBreakerPolicy | undefined {\n if (!this.options.circuitBreaker) return undefined;\n let breaker = this.circuitBreakers.get(toolName);\n if (!breaker) {\n breaker = circuitBreaker(handleAll, {\n breaker: new ConsecutiveBreaker(this.options.circuitBreaker.threshold),\n halfOpenAfter: this.options.circuitBreaker.halfOpenAfterMs,\n });\n this.circuitBreakers.set(toolName, breaker);\n }\n return breaker;\n }\n\n /**\n * Execute a function within budget constraints (bulkhead + circuit breaker).\n */\n async execute<T>(toolName: string, fn: () => Promise<T>): Promise<T> {\n const bh = this.getBulkhead(toolName);\n const breaker = this.getCircuitBreaker(toolName);\n\n let wrapped: () => Promise<T> = fn;\n\n if (breaker) {\n const prevWrapped = wrapped;\n wrapped = () => breaker.execute(() => prevWrapped());\n }\n\n if (bh) {\n const prevWrapped = wrapped;\n wrapped = () => bh.execute(() => prevWrapped());\n }\n\n return wrapped();\n }\n\n /**\n * Reset all policies for a tool (useful for testing).\n */\n reset(toolName: string): void {\n this.bulkheads.delete(toolName);\n this.circuitBreakers.delete(toolName);\n this.rateLimiters.delete(toolName);\n }\n\n /**\n * Reset all policies globally.\n */\n resetAll(): void {\n this.bulkheads.clear();\n this.circuitBreakers.clear();\n this.rateLimiters.clear();\n }\n}\n","import type { ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext } from \"../types/ToolIntent.js\";\nimport type { Evidence } from \"../types/ToolResult.js\";\n\n/**\n * Options for building evidence from a tool invocation.\n */\nexport interface BuildEvidenceOptions {\n spec: ToolSpec;\n args: unknown;\n result: unknown;\n raw?: unknown;\n ctx: ExecContext;\n durationMs?: number;\n}\n\n/**\n * Build evidence records from a tool invocation result.\n */\nexport function buildEvidence(options: BuildEvidenceOptions): Evidence[] {\n const { spec, args, result, ctx, durationMs } = options;\n const now = new Date().toISOString();\n const evidence: Evidence[] = [];\n\n // Primary tool evidence\n evidence.push({\n type: \"tool\",\n ref: `${spec.name}@${spec.version}`,\n summary: summarizeToolCall(spec, args, result, durationMs),\n createdAt: now,\n });\n\n // If result contains a URL, add url evidence\n if (result && typeof result === \"object\") {\n const urls = extractUrls(result);\n for (const url of urls) {\n evidence.push({\n type: \"url\",\n ref: url,\n summary: `Output URL from ${spec.name}`,\n createdAt: now,\n });\n }\n\n // If result contains file paths, add file evidence\n const files = extractFilePaths(result);\n for (const file of files) {\n evidence.push({\n type: \"file\",\n ref: file,\n summary: `Output file from ${spec.name}`,\n createdAt: now,\n });\n }\n }\n\n // Add metric evidence if duration is significant\n if (durationMs !== undefined && durationMs > 0) {\n evidence.push({\n type: \"metric\",\n ref: `latency:${spec.name}`,\n summary: `Completed in ${durationMs}ms (request: ${ctx.requestId})`,\n createdAt: now,\n });\n }\n\n return evidence;\n}\n\nfunction summarizeToolCall(\n spec: ToolSpec,\n args: unknown,\n result: unknown,\n durationMs?: number,\n): string {\n const argKeys =\n args && typeof args === \"object\" ? Object.keys(args).join(\", \") : \"none\";\n const duration = durationMs ? ` in ${durationMs}ms` : \"\";\n const resultPreview = summarizeValue(result, 100);\n return `${spec.kind}:${spec.name} called with [${argKeys}]${duration} → ${resultPreview}`;\n}\n\nfunction summarizeValue(value: unknown, maxLen: number): string {\n if (value === null || value === undefined) return \"null\";\n if (typeof value === \"string\") {\n return value.length > maxLen ? value.slice(0, maxLen) + \"...\" : value;\n }\n const str = JSON.stringify(value);\n return str.length > maxLen ? str.slice(0, maxLen) + \"...\" : str;\n}\n\nfunction extractUrls(obj: object): string[] {\n const urls: string[] = [];\n const walk = (val: unknown) => {\n if (typeof val === \"string\" && /^https?:\\/\\//i.test(val)) {\n urls.push(val);\n } else if (val && typeof val === \"object\") {\n for (const v of Object.values(val)) {\n walk(v);\n }\n }\n };\n walk(obj);\n return urls.slice(0, 10); // Limit to prevent explosion\n}\n\nfunction extractFilePaths(obj: object): string[] {\n const paths: string[] = [];\n const walk = (val: unknown) => {\n if (\n typeof val === \"string\" &&\n (val.startsWith(\"/\") || val.startsWith(\"./\")) &&\n val.includes(\".\")\n ) {\n paths.push(val);\n } else if (val && typeof val === \"object\") {\n for (const v of Object.values(val)) {\n walk(v);\n }\n }\n };\n walk(obj);\n return paths.slice(0, 10);\n}\n","import { EventEmitter } from \"eventemitter3\";\nimport type { AnyToolEvent, ToolEventType } from \"../core/types/Events.js\";\n\n/**\n * Event log entry with sequence number.\n */\nexport interface LogEntry {\n seq: number;\n event: AnyToolEvent;\n}\n\n/**\n * Event log listener type.\n */\nexport type EventListener = (entry: LogEntry) => void;\n\n/**\n * Append-only event log for tool invocations.\n * Supports in-memory storage with configurable max size and event subscriptions.\n */\nexport class EventLog {\n private readonly entries: LogEntry[] = [];\n private seq = 0;\n private readonly maxEntries: number;\n private readonly emitter = new EventEmitter();\n\n constructor(options: { maxEntries?: number } = {}) {\n this.maxEntries = options.maxEntries ?? 10_000;\n }\n\n /**\n * Append an event to the log.\n */\n append(event: AnyToolEvent): LogEntry {\n const entry: LogEntry = { seq: ++this.seq, event };\n\n this.entries.push(entry);\n\n // Trim if over max\n if (this.entries.length > this.maxEntries) {\n this.entries.shift();\n }\n\n // Emit to subscribers\n this.emitter.emit(\"event\", entry);\n this.emitter.emit(event.type, entry);\n\n return entry;\n }\n\n /**\n * Subscribe to all events.\n */\n on(listener: EventListener): () => void {\n this.emitter.on(\"event\", listener);\n return () => this.emitter.off(\"event\", listener);\n }\n\n /**\n * Subscribe to events of a specific type.\n */\n onType(type: ToolEventType, listener: EventListener): () => void {\n this.emitter.on(type, listener);\n return () => this.emitter.off(type, listener);\n }\n\n /**\n * Query events by filter.\n */\n query(filter: {\n type?: ToolEventType;\n toolName?: string;\n requestId?: string;\n since?: number; // seq number\n limit?: number;\n }): LogEntry[] {\n let results = this.entries;\n\n if (filter.since !== undefined) {\n results = results.filter((e) => e.seq > filter.since!);\n }\n if (filter.type) {\n results = results.filter((e) => e.event.type === filter.type);\n }\n if (filter.toolName) {\n results = results.filter((e) => e.event.toolName === filter.toolName);\n }\n if (filter.requestId) {\n results = results.filter((e) => e.event.requestId === filter.requestId);\n }\n if (filter.limit) {\n results = results.slice(-filter.limit);\n }\n\n return results;\n }\n\n /**\n * Get all entries.\n */\n getAll(): readonly LogEntry[] {\n return this.entries;\n }\n\n /**\n * Get entry count.\n */\n get size(): number {\n return this.entries.length;\n }\n\n /**\n * Clear all entries (for testing).\n */\n clear(): void {\n this.entries.length = 0;\n this.seq = 0;\n }\n}\n","export type LogLevel = \"silent\" | \"error\" | \"warn\" | \"info\" | \"debug\" | \"trace\";\n\nexport interface DebugOptions {\n enabled?: boolean;\n level?: LogLevel;\n includeArgs?: boolean;\n includeResults?: boolean;\n includeRaw?: boolean;\n logEvents?: boolean;\n prefix?: string;\n}\n\nexport interface ResolvedDebugOptions {\n enabled: boolean;\n level: LogLevel;\n includeArgs: boolean;\n includeResults: boolean;\n includeRaw: boolean;\n logEvents: boolean;\n prefix: string;\n}\n\nexport interface Logger {\n options: ResolvedDebugOptions;\n isEnabled(level: LogLevel): boolean;\n error(message: string, meta?: Record<string, unknown>): void;\n warn(message: string, meta?: Record<string, unknown>): void;\n info(message: string, meta?: Record<string, unknown>): void;\n debug(message: string, meta?: Record<string, unknown>): void;\n trace(message: string, meta?: Record<string, unknown>): void;\n}\n\nconst LEVEL_ORDER: Record<LogLevel, number> = {\n silent: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n trace: 5,\n};\n\nexport function createLogger(options: DebugOptions = {}): Logger {\n const resolved = resolveDebugOptions(options);\n\n const log = (level: LogLevel, message: string, meta?: Record<string, unknown>) => {\n if (!resolved.enabled) return;\n if (LEVEL_ORDER[level] > LEVEL_ORDER[resolved.level]) return;\n\n const prefix = `[${resolved.prefix}]`;\n const levelTag = `[${level.toUpperCase()}]`;\n const metaText = meta ? ` ${safeStringify(meta, 1000)}` : \"\";\n\n switch (level) {\n case \"error\":\n console.error(`${prefix} ${levelTag} ${message}${metaText}`);\n break;\n case \"warn\":\n console.warn(`${prefix} ${levelTag} ${message}${metaText}`);\n break;\n case \"info\":\n console.info(`${prefix} ${levelTag} ${message}${metaText}`);\n break;\n default:\n console.log(`${prefix} ${levelTag} ${message}${metaText}`);\n break;\n }\n };\n\n return {\n options: resolved,\n isEnabled: (level) => resolved.enabled && LEVEL_ORDER[level] <= LEVEL_ORDER[resolved.level],\n error: (message, meta) => log(\"error\", message, meta),\n warn: (message, meta) => log(\"warn\", message, meta),\n info: (message, meta) => log(\"info\", message, meta),\n debug: (message, meta) => log(\"debug\", message, meta),\n trace: (message, meta) => log(\"trace\", message, meta),\n };\n}\n\nexport function resolveDebugOptions(options: DebugOptions = {}): ResolvedDebugOptions {\n const envLevel = parseEnvLogLevel();\n const enabledFromEnv = envLevel !== undefined && envLevel !== \"silent\";\n const enabled = options.enabled ?? enabledFromEnv ?? false;\n const level =\n options.level ?? envLevel ?? (enabled ? \"debug\" : \"silent\");\n\n return {\n enabled,\n level,\n includeArgs: options.includeArgs ?? false,\n includeResults: options.includeResults ?? false,\n includeRaw: options.includeRaw ?? false,\n logEvents: options.logEvents ?? false,\n prefix: options.prefix ?? \"agent-tool\",\n };\n}\n\nexport function sanitizeForLog(value: unknown, maxLen = 500): string {\n const str = safeStringify(value, maxLen);\n return str.replace(\n /\"(password|token|secret|key|auth)\":\\s*\"[^\"]*\"/gi,\n \"\\\"$1\\\":\\\"[REDACTED]\\\"\",\n );\n}\n\nexport function summarizeForLog(value: unknown, maxLen = 200): string {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n if (typeof value === \"string\") {\n return value.length > maxLen ? `${value.slice(0, maxLen)}...` : value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (Array.isArray(value)) {\n return `Array(${value.length})`;\n }\n if (typeof value === \"object\") {\n const keys = Object.keys(value as Record<string, unknown>);\n const shown = keys.slice(0, 5).join(\", \");\n return `Object(keys: ${shown}${keys.length > 5 ? \", ...\" : \"\"})`;\n }\n return String(value);\n}\n\nfunction safeStringify(value: unknown, maxLen: number): string {\n try {\n const json = JSON.stringify(value);\n if (!json) return String(value);\n return json.length > maxLen ? `${json.slice(0, maxLen)}...` : json;\n } catch {\n const fallback = String(value);\n return fallback.length > maxLen ? `${fallback.slice(0, maxLen)}...` : fallback;\n }\n}\n\nfunction parseEnvLogLevel(): LogLevel | undefined {\n const raw =\n process.env.TOOLHUB_LOG_LEVEL ??\n process.env.TOOLHUB_DEBUG ??\n process.env.DEBUG;\n\n if (!raw) return undefined;\n const value = raw.trim().toLowerCase();\n if (!value || value === \"0\" || value === \"false\" || value === \"off\") {\n return \"silent\";\n }\n if (value.includes(\"trace\")) return \"trace\";\n if (value.includes(\"debug\") || value === \"1\" || value === \"true\" || value === \"yes\") {\n return \"debug\";\n }\n if (value.includes(\"info\")) return \"info\";\n if (value.includes(\"warn\")) return \"warn\";\n if (value.includes(\"error\")) return \"error\";\n if (value.includes(\"silent\")) return \"silent\";\n return \"debug\";\n}\n","/**\n * Simple counter metric.\n */\nexport interface CounterValue {\n name: string;\n labels: Record<string, string>;\n value: number;\n}\n\n/**\n * Histogram bucket.\n */\nexport interface HistogramValue {\n name: string;\n labels: Record<string, string>;\n count: number;\n sum: number;\n buckets: Map<number, number>; // upper bound → count\n}\n\n/**\n * Lightweight metrics collector for tool invocations.\n * Provides counters and histograms with label support.\n */\nexport class Metrics {\n private readonly counters = new Map<string, number>();\n private readonly histograms = new Map<\n string,\n { count: number; sum: number; values: number[] }\n >();\n\n private readonly defaultBuckets = [\n 5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000,\n ];\n\n /**\n * Increment a counter.\n */\n increment(name: string, labels: Record<string, string> = {}, value = 1): void {\n const key = this.makeKey(name, labels);\n this.counters.set(key, (this.counters.get(key) ?? 0) + value);\n }\n\n /**\n * Record a value in a histogram.\n */\n observe(name: string, labels: Record<string, string>, value: number): void {\n const key = this.makeKey(name, labels);\n let hist = this.histograms.get(key);\n if (!hist) {\n hist = { count: 0, sum: 0, values: [] };\n this.histograms.set(key, hist);\n }\n hist.count++;\n hist.sum += value;\n hist.values.push(value);\n }\n\n /**\n * Get a counter value.\n */\n getCounter(name: string, labels: Record<string, string> = {}): number {\n return this.counters.get(this.makeKey(name, labels)) ?? 0;\n }\n\n /**\n * Get histogram stats.\n */\n getHistogram(\n name: string,\n labels: Record<string, string>,\n ): HistogramValue | undefined {\n const key = this.makeKey(name, labels);\n const hist = this.histograms.get(key);\n if (!hist) return undefined;\n\n const buckets = new Map<number, number>();\n for (const bound of this.defaultBuckets) {\n buckets.set(bound, hist.values.filter((v) => v <= bound).length);\n }\n\n return { name, labels, count: hist.count, sum: hist.sum, buckets };\n }\n\n /**\n * Get all counter values.\n */\n getAllCounters(): CounterValue[] {\n const results: CounterValue[] = [];\n for (const [key, value] of this.counters) {\n const { name, labels } = this.parseKey(key);\n results.push({ name, labels, value });\n }\n return results;\n }\n\n /**\n * Get all histogram values.\n */\n getAllHistograms(): HistogramValue[] {\n const results: HistogramValue[] = [];\n for (const [key, hist] of this.histograms) {\n const { name, labels } = this.parseKey(key);\n const buckets = new Map<number, number>();\n for (const bound of this.defaultBuckets) {\n buckets.set(bound, hist.values.filter((v) => v <= bound).length);\n }\n results.push({ name, labels, count: hist.count, sum: hist.sum, buckets });\n }\n return results;\n }\n\n /**\n * Record standard tool invocation metrics.\n */\n recordInvocation(toolName: string, ok: boolean, durationMs: number): void {\n this.increment(\"tool_invocations_total\", {\n toolName,\n ok: String(ok),\n });\n this.observe(\"tool_latency_ms\", { toolName }, durationMs);\n }\n\n /**\n * Record a retry event.\n */\n recordRetry(toolName: string): void {\n this.increment(\"tool_retries_total\", { toolName });\n }\n\n /**\n * Record a policy denial.\n */\n recordPolicyDenied(toolName: string, reason: string): void {\n this.increment(\"policy_denied_total\", { toolName, reason });\n }\n\n /**\n * Reset all metrics (for testing).\n */\n reset(): void {\n this.counters.clear();\n this.histograms.clear();\n }\n\n private makeKey(name: string, labels: Record<string, string>): string {\n const sortedLabels = Object.entries(labels)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${k}=${v}`)\n .join(\",\");\n return `${name}{${sortedLabels}}`;\n }\n\n private parseKey(key: string): {\n name: string;\n labels: Record<string, string>;\n } {\n const match = key.match(/^(.+?)\\{(.*)\\}$/);\n if (!match) return { name: key, labels: {} };\n const labels: Record<string, string> = {};\n if (match[2]) {\n for (const part of match[2].split(\",\")) {\n const [k, v] = part.split(\"=\");\n if (k && v !== undefined) labels[k] = v;\n }\n }\n return { name: match[1]!, labels };\n }\n}\n","import { v4 as uuidv4 } from \"uuid\";\n\n/**\n * A trace span representing a unit of work.\n */\nexport interface Span {\n spanId: string;\n traceId: string;\n parentSpanId?: string;\n name: string;\n startTime: number; // ms epoch\n endTime?: number;\n durationMs?: number;\n status: \"ok\" | \"error\" | \"in_progress\";\n attributes: Record<string, string | number | boolean>;\n events: SpanEvent[];\n}\n\n/**\n * An event within a span.\n */\nexport interface SpanEvent {\n name: string;\n timestamp: number;\n attributes?: Record<string, string | number | boolean>;\n}\n\n/**\n * Lightweight tracing system for tool invocation spans.\n * Compatible with OpenTelemetry trace/span ID format.\n */\nexport class Tracing {\n private readonly spans = new Map<string, Span>();\n private readonly traceSpans = new Map<string, string[]>(); // traceId → spanIds\n\n /**\n * Start a new span.\n */\n startSpan(options: {\n name: string;\n traceId?: string;\n parentSpanId?: string;\n attributes?: Record<string, string | number | boolean>;\n }): Span {\n const span: Span = {\n spanId: uuidv4(),\n traceId: options.traceId ?? uuidv4(),\n parentSpanId: options.parentSpanId,\n name: options.name,\n startTime: Date.now(),\n status: \"in_progress\",\n attributes: options.attributes ?? {},\n events: [],\n };\n\n this.spans.set(span.spanId, span);\n\n const traceList = this.traceSpans.get(span.traceId) ?? [];\n traceList.push(span.spanId);\n this.traceSpans.set(span.traceId, traceList);\n\n return span;\n }\n\n /**\n * End a span and calculate duration.\n */\n endSpan(spanId: string, status: \"ok\" | \"error\" = \"ok\"): Span | undefined {\n const span = this.spans.get(spanId);\n if (!span) return undefined;\n\n span.endTime = Date.now();\n span.durationMs = span.endTime - span.startTime;\n span.status = status;\n return span;\n }\n\n /**\n * Add an event to a span.\n */\n addEvent(\n spanId: string,\n name: string,\n attributes?: Record<string, string | number | boolean>,\n ): void {\n const span = this.spans.get(spanId);\n if (!span) return;\n span.events.push({ name, timestamp: Date.now(), attributes });\n }\n\n /**\n * Set attributes on a span.\n */\n setAttributes(\n spanId: string,\n attributes: Record<string, string | number | boolean>,\n ): void {\n const span = this.spans.get(spanId);\n if (!span) return;\n Object.assign(span.attributes, attributes);\n }\n\n /**\n * Get a span by ID.\n */\n getSpan(spanId: string): Span | undefined {\n return this.spans.get(spanId);\n }\n\n /**\n * Get all spans for a trace.\n */\n getTrace(traceId: string): Span[] {\n const spanIds = this.traceSpans.get(traceId) ?? [];\n return spanIds\n .map((id) => this.spans.get(id))\n .filter((s): s is Span => s !== undefined);\n }\n\n /**\n * Create a child span from a parent.\n */\n createChildSpan(\n parentSpanId: string,\n name: string,\n attributes?: Record<string, string | number | boolean>,\n ): Span | undefined {\n const parent = this.spans.get(parentSpanId);\n if (!parent) return undefined;\n return this.startSpan({\n name,\n traceId: parent.traceId,\n parentSpanId: parent.spanId,\n attributes,\n });\n }\n\n /**\n * Clear all traces (for testing).\n */\n clear(): void {\n this.spans.clear();\n this.traceSpans.clear();\n }\n}\n","import pTimeout from \"p-timeout\";\nimport type { ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext } from \"../types/ToolIntent.js\";\nimport type { ToolAdapter } from \"../types/ToolSpec.js\";\nimport { normalizeToolName } from \"../types/ToolSpec.js\";\nimport { SchemaValidator, SchemaValidationError } from \"./SchemaValidator.js\";\nimport { PolicyEngine, PolicyDeniedError } from \"./PolicyEngine.js\";\nimport { BudgetManager } from \"./Budget.js\";\nimport { withRetry, createTaggedError } from \"./Retry.js\";\nimport type {\n PolicyDeniedEvent,\n RetryEvent,\n HitlApprovalRequestedEvent,\n HitlApprovalGrantedEvent,\n HitlApprovalDeniedEvent,\n} from \"../types/Events.js\";\nimport type { HitlSideEffect } from \"../types/ToolSpec.js\";\nimport { EventLog } from \"../../observability/EventLog.js\";\nimport { Metrics } from \"../../observability/Metrics.js\";\nimport { Tracing } from \"../../observability/Tracing.js\";\nimport type { Logger } from \"../../observability/Logger.js\";\n\n/** Called when tool has sideEffect external_write/destructive; return true/void to approve, false to deny. */\nexport type OnApprovalRequired = (\n spec: ToolSpec,\n args: unknown,\n ctx: ExecContext,\n) => Promise<boolean | void>;\n\nexport interface PipelineDependencies {\n registry: { get(name: string): ToolSpec | undefined; snapshot(): ToolSpec[] };\n adapters: Map<string, ToolAdapter>;\n adaptersByToolName: Map<string, ToolAdapter>;\n validator: SchemaValidator;\n policy: PolicyEngine;\n budget: BudgetManager;\n eventLog: EventLog;\n metrics: Metrics;\n tracing: Tracing;\n logger: Logger;\n defaultMaxRetries?: number;\n /** HITL: when set, tools with sideEffect external_write/destructive require human approval before execute */\n onApprovalRequired?: OnApprovalRequired;\n}\n\n/**\n * Pipeline step: Resolve tool from registry (tool name is normalized before lookup).\n */\nexport function resolveTool(\n toolName: string,\n registry: PipelineDependencies[\"registry\"],\n): ToolSpec {\n const key = normalizeToolName(toolName);\n const spec = registry.get(key);\n if (!spec) {\n throw createTaggedError(\n \"TOOL_NOT_FOUND\",\n `Tool not found: ${toolName}`,\n { availableTools: registry.snapshot().slice(0, 20).map(s => s.name) },\n );\n }\n return spec;\n}\n\n/**\n * Common input aliases: alias key -> canonical key.\n * Applied when the tool's input schema requires the canonical key but the caller passed the alias.\n * No tool-specific logic; any tool with required \"query\" will accept \"q\".\n */\nconst INPUT_ALIASES: Record<string, string> = {\n q: \"query\",\n};\n\n/**\n * Pipeline step: Normalize common input aliases so LLM typos (e.g. \"q\" for \"query\") work.\n * Uses INPUT_ALIASES and the tool's required keys; no tool name checks.\n * Runs before validation so schema sees the canonical keys.\n */\nexport function normalizeInputAliases(spec: ToolSpec, args: unknown): unknown {\n if (args == null || typeof args !== \"object\" || Array.isArray(args)) {\n return args;\n }\n const required = getRequiredKeys(spec.inputSchema);\n const obj = args as Record<string, unknown>;\n let changed = false;\n const out = { ...obj };\n for (const [aliasKey, canonicalKey] of Object.entries(INPUT_ALIASES)) {\n if (\n required.includes(canonicalKey) &&\n (out[canonicalKey] === undefined || out[canonicalKey] === \"\") &&\n out[aliasKey] !== undefined &&\n out[aliasKey] !== \"\"\n ) {\n out[canonicalKey] = out[aliasKey];\n delete (out as Record<string, unknown>)[aliasKey];\n changed = true;\n }\n }\n return changed ? out : args;\n}\n\n/**\n * Pipeline step: Validate input against schema.\n */\nexport function validateInput(\n spec: ToolSpec,\n args: unknown,\n validator: SchemaValidator,\n): unknown {\n try {\n return validator.validateOrThrow(\n spec.inputSchema,\n args,\n `Input validation failed for ${spec.name}`,\n );\n } catch (error) {\n if (error instanceof SchemaValidationError) {\n const requiredKeys = getRequiredKeys(spec.inputSchema);\n const passedKeys =\n args != null && typeof args === \"object\" && !Array.isArray(args)\n ? Object.keys(args)\n : [];\n throw createTaggedError(\"INPUT_SCHEMA_INVALID\", error.message, {\n errors: error.errors,\n schema: spec.inputSchema,\n requiredKeys: requiredKeys.length ? requiredKeys : undefined,\n passedKeys: passedKeys.length ? passedKeys : undefined,\n hint:\n requiredKeys.length > 0\n ? `Expected input property ${requiredKeys.length === 1 ? `'${requiredKeys[0]}'` : `[${requiredKeys.map((k) => `'${k}'`).join(\", \")}]`}. You passed: ${passedKeys.length ? passedKeys.map((k) => `'${k}'`).join(\", \") : \"none\"}. Use the exact property names from the tool schema.`\n : undefined,\n });\n }\n throw error;\n }\n}\n\nfunction getRequiredKeys(schema: object): string[] {\n const s = schema as { required?: unknown };\n const raw = s.required;\n if (!Array.isArray(raw)) return [];\n return raw.filter((k): k is string => typeof k === \"string\");\n}\n\n/**\n * Pipeline step: Enrich args with defaults from schema.\n */\nexport function enrichDefaults(\n spec: ToolSpec,\n args: unknown,\n validator: SchemaValidator,\n): unknown {\n return validator.enrichDefaults(spec.inputSchema, args);\n}\n\n/**\n * Pipeline step: Enforce policy checks.\n */\nexport function enforcePolicy(\n spec: ToolSpec,\n args: unknown,\n ctx: ExecContext,\n deps: Pick<\n PipelineDependencies,\n \"policy\" | \"eventLog\" | \"metrics\" | \"tracing\"\n >,\n): void {\n try {\n deps.policy.enforce(spec, args, ctx);\n } catch (error) {\n if (error instanceof PolicyDeniedError) {\n // Emit policy denied event\n const event: PolicyDeniedEvent = {\n type: \"POLICY_DENIED\",\n timestamp: new Date().toISOString(),\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n toolName: spec.name,\n traceId: ctx.traceId,\n userId: ctx.userId,\n reason: error.message,\n missingCapabilities: error.missingCapabilities?.map(String),\n };\n deps.eventLog.append(event);\n deps.metrics.recordPolicyDenied(spec.name, error.message);\n }\n throw error;\n }\n}\n\nconst HITL_GATED_SIDE_EFFECTS: HitlSideEffect[] = [\"external_write\", \"destructive\"];\n\n/**\n * Pipeline step: Human-in-the-loop approval for external_write/destructive tools.\n * When onApprovalRequired is set, waits for callback resolve(true/void) before continuing; resolve(false) or reject throws HITL_DENIED.\n */\nexport async function requireHumanApproval(\n spec: ToolSpec,\n args: unknown,\n ctx: ExecContext,\n deps: Pick<PipelineDependencies, \"onApprovalRequired\" | \"eventLog\" | \"logger\">,\n): Promise<void> {\n const sideEffect = (spec._meta?.hitl?.sideEffect ?? \"none\") as HitlSideEffect;\n if (!HITL_GATED_SIDE_EFFECTS.includes(sideEffect)) return;\n const onApproval = deps.onApprovalRequired;\n if (!onApproval) return;\n\n const baseEvent = {\n timestamp: new Date().toISOString(),\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n toolName: spec.name,\n traceId: ctx.traceId,\n userId: ctx.userId,\n };\n\n const requested: HitlApprovalRequestedEvent = {\n ...baseEvent,\n type: \"HITL_APPROVAL_REQUESTED\",\n sideEffect,\n };\n deps.eventLog.append(requested);\n deps.logger.trace(\"hitl.requested\", { tool: spec.name, sideEffect, requestId: ctx.requestId });\n\n let approved: boolean | void;\n try {\n approved = await onApproval(spec, args, ctx);\n } catch (err) {\n deps.eventLog.append({\n ...baseEvent,\n type: \"HITL_APPROVAL_DENIED\",\n sideEffect,\n reason: err instanceof Error ? err.message : String(err),\n } as HitlApprovalDeniedEvent);\n throw createTaggedError(\n \"HITL_DENIED\",\n `Human denied approval for ${spec.name} (${sideEffect})`,\n { reason: err instanceof Error ? err.message : String(err) },\n );\n }\n\n if (approved === false) {\n deps.eventLog.append({\n ...baseEvent,\n type: \"HITL_APPROVAL_DENIED\",\n sideEffect,\n reason: \"User rejected\",\n } as HitlApprovalDeniedEvent);\n throw createTaggedError(\"HITL_DENIED\", `Human denied approval for ${spec.name} (${sideEffect})`);\n }\n\n deps.eventLog.append({\n ...baseEvent,\n type: \"HITL_APPROVAL_GRANTED\",\n sideEffect,\n } as HitlApprovalGrantedEvent);\n deps.logger.trace(\"hitl.granted\", { tool: spec.name, sideEffect, requestId: ctx.requestId });\n}\n\n/**\n * Pipeline step: Execute tool with budget, retry, and timeout.\n */\nexport async function executeWithBudget(\n spec: ToolSpec,\n args: unknown,\n ctx: ExecContext,\n spanId: string,\n deps: PipelineDependencies,\n): Promise<{ result: unknown; raw?: unknown }> {\n const adapter = deps.adaptersByToolName.get(spec.name) ?? deps.adapters.get(spec.kind);\n if (!adapter) {\n throw createTaggedError(\n \"TOOL_NOT_FOUND\",\n `No adapter registered for kind: ${spec.kind}`,\n );\n }\n\n const timeoutMs = deps.budget.getTimeout(\n spec.name,\n ctx.budget?.timeoutMs,\n );\n const maxRetries = ctx.budget?.maxRetries ?? deps.defaultMaxRetries ?? 2;\n\n const executeFn = async () => {\n return deps.budget.execute(spec.name, async () => {\n deps.tracing.addEvent(spanId, \"execute_start\");\n deps.logger.trace(\"execute.start\", {\n tool: spec.name,\n requestId: ctx.requestId,\n timeoutMs,\n maxRetries,\n });\n const result = await adapter.invoke(spec, args, ctx);\n deps.tracing.addEvent(spanId, \"execute_end\");\n deps.logger.trace(\"execute.end\", {\n tool: spec.name,\n requestId: ctx.requestId,\n });\n return result;\n });\n };\n\n // Wrap with retry\n const retryFn = () =>\n withRetry(executeFn, {\n maxRetries,\n onRetry: (error, attempt) => {\n deps.metrics.recordRetry(spec.name);\n const event: RetryEvent = {\n type: \"RETRY\",\n timestamp: new Date().toISOString(),\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n toolName: spec.name,\n traceId: ctx.traceId,\n userId: ctx.userId,\n attempt,\n maxRetries,\n reason: error.message,\n };\n deps.eventLog.append(event);\n deps.tracing.addEvent(spanId, \"retry\", { attempt, reason: error.message });\n },\n });\n\n // Wrap with timeout\n try {\n return await pTimeout(retryFn(), {\n milliseconds: timeoutMs,\n message: `Tool ${spec.name} timed out after ${timeoutMs}ms`,\n });\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"timed out\")) {\n throw createTaggedError(\"TIMEOUT\", error.message);\n }\n throw error;\n }\n}\n\n/**\n * Pipeline step: Validate output against schema.\n */\nexport function validateOutput(\n spec: ToolSpec,\n result: unknown,\n validator: SchemaValidator,\n): unknown {\n try {\n return validator.validateOrThrow(\n spec.outputSchema,\n result,\n `Output validation failed for ${spec.name}`,\n );\n } catch (error) {\n if (error instanceof SchemaValidationError) {\n throw createTaggedError(\"OUTPUT_SCHEMA_INVALID\", error.message, {\n errors: error.errors,\n });\n }\n throw error;\n }\n}\n","import type { ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext, ToolIntent } from \"../types/ToolIntent.js\";\nimport type { Evidence, ToolResult } from \"../types/ToolResult.js\";\nimport type {\n ToolCalledEvent,\n ToolResultEvent,\n} from \"../types/Events.js\";\nimport { EventLog } from \"../../observability/EventLog.js\";\nimport { Metrics } from \"../../observability/Metrics.js\";\nimport { Tracing } from \"../../observability/Tracing.js\";\nimport { sanitizeForLog, summarizeForLog } from \"../../observability/Logger.js\";\nimport type { Logger } from \"../../observability/Logger.js\";\n\nexport interface ObservabilityDependencies {\n eventLog: EventLog;\n metrics: Metrics;\n tracing: Tracing;\n logger: Logger;\n}\n\n/**\n * Emit TOOL_CALLED event.\n */\nexport function emitToolCalled(\n intent: ToolIntent,\n ctx: ExecContext,\n deps: ObservabilityDependencies,\n): void {\n const event: ToolCalledEvent = {\n type: \"TOOL_CALLED\",\n timestamp: new Date().toISOString(),\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n toolName: intent.tool,\n traceId: ctx.traceId,\n userId: ctx.userId,\n argsSummary: sanitizeArgs(intent.args),\n purpose: intent.purpose,\n idempotencyKey: intent.idempotencyKey,\n };\n deps.eventLog.append(event);\n}\n\n/**\n * Record successful tool invocation.\n */\nexport function recordSuccess(\n spec: ToolSpec,\n durationMs: number,\n _evidence: Evidence[],\n spanId: string,\n deps: ObservabilityDependencies,\n): void {\n deps.metrics.recordInvocation(spec.name, true, durationMs);\n deps.tracing.setAttributes(spanId, {\n \"tool.duration_ms\": durationMs,\n \"tool.ok\": true,\n });\n deps.tracing.endSpan(spanId, \"ok\");\n}\n\n/**\n * Handle error and return ToolResult.\n */\nexport function handleError(\n error: unknown,\n intent: ToolIntent,\n ctx: ExecContext,\n durationMs: number,\n spanId: string,\n deps: ObservabilityDependencies,\n): ToolResult {\n const kind = (error as any)?.kind ?? \"UPSTREAM_ERROR\";\n const message =\n error instanceof Error ? error.message : String(error);\n const details = (error as any)?.details;\n\n // Metrics & tracing\n deps.metrics.recordInvocation(intent.tool, false, durationMs);\n deps.tracing.setAttributes(spanId, {\n \"tool.duration_ms\": durationMs,\n \"tool.ok\": false,\n \"tool.error_kind\": kind,\n });\n deps.tracing.endSpan(spanId, \"error\");\n\n // Event log\n const event: ToolResultEvent = {\n type: \"TOOL_RESULT\",\n timestamp: new Date().toISOString(),\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n toolName: intent.tool,\n traceId: ctx.traceId,\n userId: ctx.userId,\n ok: false,\n durationMs,\n resultSummary: message,\n evidence: [],\n error: { kind, message, details },\n };\n deps.eventLog.append(event);\n\n deps.logger.warn(\"invoke.error\", {\n tool: intent.tool,\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n traceId: ctx.traceId,\n kind,\n message,\n durationMs,\n details: deps.logger.options.includeResults\n ? summarizeForLog(details)\n : undefined,\n });\n\n return {\n ok: false,\n evidence: [],\n error: { kind, message, details },\n };\n}\n\nfunction sanitizeArgs(args: unknown): string {\n if (!args) return \"{}\";\n return sanitizeForLog(args);\n}\n","import type { ToolAdapter, ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext, ToolIntent } from \"../types/ToolIntent.js\";\nimport type { ToolResult, Evidence } from \"../types/ToolResult.js\";\nimport { ToolRegistry } from \"../registry/ToolRegistry.js\";\nimport { SchemaValidator } from \"./SchemaValidator.js\";\nimport { PolicyEngine } from \"./PolicyEngine.js\";\nimport { BudgetManager } from \"./Budget.js\";\nimport { buildEvidence } from \"./Evidence.js\";\nimport { EventLog } from \"../../observability/EventLog.js\";\nimport { createLogger, summarizeForLog, sanitizeForLog } from \"../../observability/Logger.js\";\nimport type { DebugOptions, Logger } from \"../../observability/Logger.js\";\nimport { Metrics } from \"../../observability/Metrics.js\";\nimport { Tracing } from \"../../observability/Tracing.js\";\nimport type { PolicyConfig } from \"./PolicyEngine.js\";\nimport type { BudgetOptions } from \"./Budget.js\";\nimport { createTaggedError } from \"./Retry.js\";\nimport {\n resolveTool,\n normalizeInputAliases,\n validateInput,\n enrichDefaults,\n enforcePolicy,\n requireHumanApproval,\n executeWithBudget,\n validateOutput,\n type PipelineDependencies,\n} from \"./PTCRuntimePipeline.js\";\nimport {\n emitToolCalled,\n recordSuccess,\n handleError,\n type ObservabilityDependencies,\n} from \"./PTCRuntimeObservability.js\";\n\n/**\n * PTC Runtime configuration.\n */\nexport interface PTCRuntimeConfig {\n policy?: PolicyConfig;\n budget?: BudgetOptions;\n /** Include raw response in ToolResult (default: true, disable in production) */\n includeRaw?: boolean;\n /** Maximum retries if not specified in context (default: 2) */\n defaultMaxRetries?: number;\n /** Debug/logging configuration */\n debug?: DebugOptions;\n /** HITL: when set, tools with sideEffect external_write/destructive require human approval before execute; callback returns true/void to approve, false to deny */\n onApprovalRequired?: (\n spec: import(\"../types/ToolSpec.js\").ToolSpec,\n args: unknown,\n ctx: import(\"../types/ToolIntent.js\").ExecContext,\n ) => Promise<boolean | void>;\n}\n\n/**\n * PTC Runtime: the unified execution kernel for all tool invocations.\n *\n * Enforces the mandatory 9-step pipeline:\n * 1. Resolve (Registry lookup)\n * 2. Input Validate (AJV)\n * 3. Defaults Enrich\n * 4. Policy Gate\n * 5. Budget check\n * 6. HITL approval (if onApprovalRequired set and tool sideEffect external_write/destructive)\n * 7. Execute (adapter.invoke())\n * 8. Output Validate (AJV)\n * 9. Evidence Build\n * 10. Audit & Metrics\n *\n * Never throws to callers - always returns ToolResult.\n */\nexport class PTCRuntime {\n private readonly registry: ToolRegistry;\n private readonly adapters = new Map<string, ToolAdapter>();\n private readonly adaptersByToolName = 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 * Bind an adapter to exact tool keys (full package path + tool path).\n * This avoids collisions when multiple extensions share the same kind.\n */\n registerAdapterForTools(toolNames: string[], adapter: ToolAdapter): void {\n for (const name of toolNames) {\n this.adaptersByToolName.set(name, adapter);\n }\n }\n\n /**\n * Get an adapter by kind (e.g. \"mcp\"). Use to set MCP client via adapter.setClient().\n */\n getAdapter(kind: string): ToolAdapter | undefined {\n return this.adapters.get(kind);\n }\n\n /**\n * Get the tool registry.\n */\n getRegistry(): ToolRegistry {\n return this.registry;\n }\n\n /**\n * Get the event log.\n */\n getEventLog(): EventLog {\n return this.eventLog;\n }\n\n /**\n * Get the metrics collector.\n */\n getMetrics(): Metrics {\n return this.metrics;\n }\n\n /**\n * Get the tracing system.\n */\n getTracing(): Tracing {\n return this.tracing;\n }\n\n /**\n * Invoke a tool through the PTC pipeline.\n * Never throws - always returns a structured ToolResult.\n */\n async invoke(intent: ToolIntent, ctx: ExecContext): Promise<ToolResult> {\n const startTime = Date.now();\n if (this.logger.isEnabled(\"debug\")) {\n this.logger.debug(\"invoke.start\", {\n tool: intent.tool,\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n traceId: ctx.traceId,\n purpose: intent.purpose,\n args: this.logger.options.includeArgs\n ? sanitizeForLog(intent.args)\n : undefined,\n });\n }\n const span = this.tracing.startSpan({\n name: `tool:${intent.tool}`,\n traceId: ctx.traceId,\n attributes: {\n \"tool.name\": intent.tool,\n \"tool.purpose\": intent.purpose,\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n },\n });\n\n // Emit TOOL_CALLED event\n emitToolCalled(intent, ctx, this.getObservabilityDeps());\n\n try {\n // Step 1: Resolve\n const spec = resolveTool(intent.tool, this.registry);\n\n this.tracing.addEvent(span.spanId, \"resolved\", {\n kind: spec.kind,\n version: spec.version,\n });\n\n // Step 1.5: Normalize input aliases (e.g. q -> query for duckduckgoSearch)\n const normalizedArgs = normalizeInputAliases(spec, intent.args);\n\n // Step 2: Input Validate\n const validatedArgs = validateInput(spec, normalizedArgs, this.validator);\n\n // Step 3: Defaults Enrich\n const enrichedArgs = enrichDefaults(spec, validatedArgs, this.validator);\n\n // Step 4: Policy Gate\n enforcePolicy(spec, enrichedArgs, ctx, {\n policy: this.policy,\n eventLog: this.eventLog,\n metrics: this.metrics,\n tracing: this.tracing,\n });\n\n // Step 5: Budget check\n if (!this.budget.checkRateLimit(spec.name)) {\n throw createTaggedError(\n \"BUDGET_EXCEEDED\",\n `Rate limit exceeded for tool: ${spec.name}`,\n );\n }\n\n // Step 6: HITL approval (for external_write/destructive when onApprovalRequired set)\n await requireHumanApproval(spec, enrichedArgs, ctx, {\n onApprovalRequired: this.config.onApprovalRequired,\n eventLog: this.eventLog,\n logger: this.logger,\n });\n\n // Dry-run mode: return without execution\n if (ctx.dryRun) {\n return this.buildDryRunResult(spec, enrichedArgs, ctx, startTime, span.spanId);\n }\n\n // Step 7: Execute with budget (timeout + retry + circuit breaker)\n const { result, raw } = await executeWithBudget(\n spec,\n enrichedArgs,\n ctx,\n span.spanId,\n this.getPipelineDeps(),\n );\n\n // Treat tool-returned error shape as failure and give actionable feedback (e.g. \"use 'query' not 'q'\")\n const toolError = asToolReturnedError(result);\n if (toolError) {\n const hint = buildInputSchemaHint(spec.inputSchema);\n throw createTaggedError(\"UPSTREAM_ERROR\", toolError.message, {\n ...(toolError.details && typeof toolError.details === \"object\" && !Array.isArray(toolError.details)\n ? (toolError.details as object)\n : {}),\n hint: hint ?? \"Check the tool's input schema for required property names.\",\n });\n }\n\n // Step 8: Output Validate\n const validatedOutput = validateOutput(spec, result, this.validator);\n\n // Step 9: Evidence Build (merge adapter-provided evidence with built evidence)\n const durationMs = Date.now() - startTime;\n const builtEvidence = buildEvidence({\n spec,\n args: enrichedArgs,\n result: validatedOutput,\n raw,\n ctx,\n durationMs,\n });\n const adapterEvidence: Evidence[] =\n raw &&\n typeof raw === \"object\" &&\n Array.isArray((raw as { evidence?: Evidence[] }).evidence)\n ? ((raw as { evidence: Evidence[] }).evidence as Evidence[])\n : [];\n const evidence = [...adapterEvidence, ...builtEvidence];\n\n // Step 10: Audit & Metrics\n recordSuccess(spec, durationMs, evidence, span.spanId, this.getObservabilityDeps());\n\n if (this.logger.isEnabled(\"debug\")) {\n this.logger.debug(\"invoke.ok\", {\n tool: spec.name,\n durationMs,\n result: this.logger.options.includeResults\n ? summarizeForLog(validatedOutput)\n : undefined,\n raw: this.logger.options.includeRaw\n ? summarizeForLog(raw)\n : undefined,\n });\n }\n\n return {\n ok: true,\n result: validatedOutput,\n evidence,\n raw: this.config.includeRaw !== false ? raw : undefined,\n };\n } catch (error) {\n const durationMs = Date.now() - startTime;\n return handleError(error, intent, ctx, durationMs, span.spanId, this.getObservabilityDeps());\n }\n }\n\n /**\n * Search for tools in the registry.\n */\n searchTools(\n query: string,\n filters?: { kind?: string; capabilities?: string[]; tags?: string[] },\n ): ToolSpec[] {\n return this.registry.search({\n text: query,\n kind: filters?.kind as any,\n capabilities: filters?.capabilities as any,\n tags: filters?.tags,\n });\n }\n\n /**\n * Get the schema for a tool.\n */\n getToolSchema(toolName: string): { input: object; output: object } | undefined {\n const spec = this.registry.get(toolName);\n if (!spec) return undefined;\n return { input: spec.inputSchema, output: spec.outputSchema };\n }\n\n // --- Helper Methods ---\n\n private getPipelineDeps(): PipelineDependencies {\n return {\n registry: this.registry,\n adapters: this.adapters,\n adaptersByToolName: this.adaptersByToolName,\n validator: this.validator,\n policy: this.policy,\n budget: this.budget,\n eventLog: this.eventLog,\n metrics: this.metrics,\n tracing: this.tracing,\n logger: this.logger,\n defaultMaxRetries: this.config.defaultMaxRetries,\n onApprovalRequired: this.config.onApprovalRequired,\n };\n }\n\n private getObservabilityDeps(): ObservabilityDependencies {\n return {\n eventLog: this.eventLog,\n metrics: this.metrics,\n tracing: this.tracing,\n logger: this.logger,\n };\n }\n\n private buildDryRunResult(\n spec: ToolSpec,\n args: unknown,\n _ctx: ExecContext,\n startTime: number,\n spanId: string,\n ): ToolResult {\n void (Date.now() - startTime); // durationMs calculated but not used in dry-run\n this.tracing.endSpan(spanId, \"ok\");\n\n return {\n ok: true,\n result: {\n dryRun: true,\n tool: spec.name,\n kind: spec.kind,\n args,\n capabilities: spec.capabilities,\n },\n evidence: [\n {\n type: \"tool\",\n ref: `${spec.name}@${spec.version}`,\n summary: `Dry-run: would execute ${spec.kind}:${spec.name}`,\n createdAt: new Date().toISOString(),\n },\n ],\n };\n }\n}\n\n/**\n * Detect tool-returned error shape: { error: string, details?: unknown }.\n * When tools return this instead of throwing, PTC treats it as failure and enriches feedback.\n */\nfunction asToolReturnedError(\n result: unknown,\n): { message: string; details?: unknown } | null {\n if (result == null || typeof result !== \"object\" || Array.isArray(result)) {\n return null;\n }\n const r = result as Record<string, unknown>;\n const msg = r.error;\n if (typeof msg !== \"string\" || !msg.trim()) {\n return null;\n }\n return { message: msg.trim(), details: r.details };\n}\n\n/**\n * Build an actionable hint from input JSON Schema (e.g. required property names)\n * so the LLM can fix parameter names (e.g. use 'query' not 'q').\n */\nfunction buildInputSchemaHint(inputSchema: object): string | null {\n const schema = inputSchema as { required?: string[]; properties?: Record<string, unknown> };\n const required = schema.required;\n if (!Array.isArray(required) || required.length === 0) {\n return null;\n }\n const names = required.filter((k): k is string => typeof k === \"string\");\n if (names.length === 0) return null;\n return `This tool expects input property ${names.length === 1 ? `'${names[0]}'` : `one of [${names.map((n) => `'${n}'`).join(\", \")}]`}. Use the exact property names from the tool schema.`;\n}\n","import { resolve, normalize, dirname, basename } from \"node:path\";\nimport { realpath, access } from \"node:fs/promises\";\nimport { createTaggedError } from \"../core/runtime/Retry.js\";\n\nlet sandboxValidationEnabled = false;\n\nexport function setSandboxValidationEnabled(enabled: boolean): void {\n sandboxValidationEnabled = enabled;\n}\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 (sandboxValidationEnabled && !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","/**\n * Shared scan helpers for tool-type scanners (function, skill, n8n).\n * findDirsContainingFile: recursive dirs that contain a given file name.\n * pathToToolName: build dotted tool name from source path and program name.\n */\n\nimport { readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport async function findDirsContainingFile(\n rootPath: string,\n fileName: string,\n): Promise<string[]> {\n const found: string[] = [];\n await collectDirsWithFile(rootPath, fileName, found);\n return found;\n}\n\nasync function collectDirsWithFile(\n dir: string,\n fileName: string,\n acc: string[],\n): Promise<void> {\n let entries: Array<{ name: string; isDirectory: boolean; isFile: boolean }>;\n try {\n const e = await readdir(dir, { withFileTypes: true });\n entries = e.map((x) => ({\n name: x.name,\n isDirectory: x.isDirectory(),\n isFile: x.isFile(),\n }));\n } catch {\n return;\n }\n if (entries.some((x) => x.isFile && x.name === fileName)) acc.push(dir);\n for (const entry of entries) {\n if (!entry.isDirectory || entry.name === \"node_modules\" || entry.name.startsWith(\".\")) continue;\n await collectDirsWithFile(join(dir, entry.name), fileName, acc);\n }\n}\n\n/** Build dotted tool name from source path (extension stripped) and program name. */\nexport function pathToToolName(sourcePath: string, programName: string): string {\n const normalized = sourcePath\n .replace(/\\\\/g, \"/\")\n .replace(/\\.(ts|tsx|js|mjs|json)$/i, \"\");\n const segments = normalized.split(\"/\").filter(Boolean);\n return segments.length === 0 ? programName : `${segments.join(\".\")}.${programName}`;\n}\n","/**\n * Build JSON Schema from TypeScript parameter types using the compiler API.\n * MVP: primitives, optional, array, object. Complex types fallback to {} with warn.\n */\n\nimport * as ts from \"typescript\";\n\n/**\n * Build output JSON Schema from function return type (unwrap Promise if present).\n * Used by scan when auto-deriving schema.\n */\nexport function buildOutputSchemaFromReturnType(\n node: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression,\n typeChecker: ts.TypeChecker,\n onWarn?: (message: string) => void,\n): object {\n const sig = typeChecker.getSignatureFromDeclaration(node as ts.SignatureDeclaration);\n if (!sig) {\n onWarn?.(\"Could not get signature for return type, using object\");\n return { type: \"object\", additionalProperties: true };\n }\n let returnType = typeChecker.getReturnTypeOfSignature(sig);\n // Unwrap Promise<T> to T\n if (returnType.getSymbol?.()?.getName() === \"Promise\") {\n const typeArgs = (returnType as ts.TypeReference).typeArguments;\n if (typeArgs?.[0]) returnType = typeArgs[0];\n }\n const schema = typeToJsonSchema(returnType, typeChecker, onWarn);\n const hasProps =\n typeof schema === \"object\" &&\n (schema as { type?: string; properties?: object }).type === \"object\" &&\n Object.keys((schema as { properties?: object }).properties ?? {}).length > 0;\n return hasProps ? schema : { type: \"object\", additionalProperties: true };\n}\n\n/** Build { type: \"object\", properties, required } from function parameters. */\nexport function buildInputSchemaFromParams(\n node: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression,\n typeChecker: ts.TypeChecker,\n onWarn?: (message: string) => void,\n): { schema: object; required: string[] } {\n const properties: Record<string, object> = {};\n const required: string[] = [];\n\n if (!node.parameters.length) {\n return { schema: { type: \"object\", properties: {} }, required: [] };\n }\n\n for (const param of node.parameters) {\n const name = (param.name as ts.Identifier).getText();\n if (name.startsWith(\"_\") && name.length <= 2) continue;\n const sym = (param as ts.ParameterDeclaration & { symbol?: ts.Symbol }).symbol;\n const paramType = sym\n ? typeChecker.getTypeOfSymbolAtLocation(sym, param)\n : typeChecker.getTypeAtLocation(param);\n const isOptional = !!param.questionToken || param.initializer !== undefined;\n const propSchema = typeToJsonSchema(paramType, typeChecker, onWarn);\n properties[name] = propSchema;\n if (!isOptional) required.push(name);\n }\n\n // Flatten: when there is exactly one parameter and it's an object type, emit that object's\n // schema at top level so agents can pass flat params like { path: \".\" } instead of { args: { path: \".\" } }.\n const paramNames = Object.keys(properties);\n if (paramNames.length === 1) {\n const soleName = paramNames[0]!;\n const inner = properties[soleName] as\n | { type?: string; properties?: Record<string, object>; required?: string[]; additionalProperties?: boolean }\n | undefined;\n if (\n inner &&\n typeof inner === \"object\" &&\n inner.type === \"object\" &&\n inner.properties &&\n typeof inner.properties === \"object\"\n ) {\n return {\n schema: {\n type: \"object\",\n properties: inner.properties,\n ...(Array.isArray(inner.required) && inner.required.length > 0 ? { required: inner.required } : {}),\n ...(inner.additionalProperties !== undefined ? { additionalProperties: inner.additionalProperties } : {}),\n },\n required: inner.required ?? [],\n };\n }\n }\n\n return {\n schema: {\n type: \"object\",\n properties,\n ...(required.length > 0 ? { required } : {}),\n },\n required,\n };\n}\n\nfunction typeToJsonSchema(\n type: ts.Type,\n typeChecker: ts.TypeChecker,\n onWarn?: (message: string) => void,\n): object {\n const flags = type.flags;\n if (flags & ts.TypeFlags.String) return { type: \"string\" };\n if (flags & ts.TypeFlags.Number) return { type: \"number\" };\n if (flags & ts.TypeFlags.Boolean) return { type: \"boolean\" };\n if (flags & ts.TypeFlags.BooleanLiteral) return { type: \"boolean\" };\n if (flags & ts.TypeFlags.Null) return { type: \"null\" };\n if (flags & ts.TypeFlags.Undefined || flags & ts.TypeFlags.Void) return {};\n if (flags & ts.TypeFlags.Any || flags & ts.TypeFlags.Unknown) {\n onWarn?.(`Unsupported type: any/unknown, using empty schema`);\n return {};\n }\n\n if (type.isUnion?.()) {\n const union = type as ts.UnionType;\n const types = union.types;\n const withoutUndef = types.filter(\n (t) => !(t.flags & ts.TypeFlags.Undefined) && !(t.flags & ts.TypeFlags.Void),\n );\n if (withoutUndef.length === 1) return typeToJsonSchema(withoutUndef[0]!, typeChecker, onWarn);\n if (withoutUndef.length === 0) return {};\n // Union of string literals -> { type: \"string\", enum: [...] } so we don't fall through to getProperties() (String prototype).\n const stringEnumValues: string[] = [];\n let allStringLiterals = true;\n for (const t of withoutUndef) {\n if (t.flags & ts.TypeFlags.StringLiteral) {\n const lit = t as ts.StringLiteralType;\n if (typeof lit.value === \"string\") stringEnumValues.push(lit.value);\n } else {\n allStringLiterals = false;\n break;\n }\n }\n if (allStringLiterals && stringEnumValues.length > 0) {\n return { type: \"string\", enum: [...new Set(stringEnumValues)] };\n }\n\n // Union of boolean literals (true | false | undefined) should stay boolean.\n let allBooleanLiterals = true;\n for (const t of withoutUndef) {\n if (!(t.flags & ts.TypeFlags.BooleanLiteral)) {\n allBooleanLiterals = false;\n break;\n }\n }\n if (allBooleanLiterals) return { type: \"boolean\" };\n }\n\n // Single string literal (e.g. type: \"file\") -> { type: \"string\", enum: [\"file\"] }, not object with String methods.\n if (flags & ts.TypeFlags.StringLiteral) {\n const lit = type as ts.StringLiteralType;\n if (typeof lit.value === \"string\") {\n return { type: \"string\", enum: [lit.value] };\n }\n return { type: \"string\" };\n }\n\n if (typeChecker.isArrayType(type)) {\n const typeRef = type as ts.TypeReference;\n const typeArgs = typeRef.typeArguments;\n const itemType = typeArgs?.[0];\n const items = itemType ? typeToJsonSchema(itemType, typeChecker, onWarn) : {};\n return { type: \"array\", items: Object.keys(items).length ? items : {} };\n }\n\n const str = typeChecker.typeToString(type);\n if (str === \"string\") return { type: \"string\" };\n if (str === \"number\") return { type: \"number\" };\n if (str === \"boolean\") return { type: \"boolean\" };\n if (str.endsWith(\"[]\")) {\n const inner = str.slice(0, -2).trim();\n const itemType =\n inner === \"string\" ? { type: \"string\" as const } : inner === \"number\" ? { type: \"number\" as const } : {};\n return { type: \"array\", items: itemType };\n }\n\n if (type.getProperties && type.getProperties().length >= 0) {\n const props = type.getProperties();\n const properties: Record<string, object> = {};\n const required: string[] = [];\n for (const p of props) {\n const decl = p.valueDeclaration;\n const propType = decl\n ? typeChecker.getTypeAtLocation(decl)\n : typeChecker.getTypeOfSymbolAtLocation(p, (p as unknown as { valueDeclaration: ts.Node }).valueDeclaration);\n const optional = decl && ts.isPropertySignature(decl) ? !!decl.questionToken : false;\n properties[p.name] = typeToJsonSchema(propType, typeChecker, onWarn);\n if (!optional) required.push(p.name);\n }\n return { type: \"object\", properties, ...(required.length ? { required } : {}) };\n }\n\n onWarn?.(`Unsupported type: ${str}, using object`);\n return { type: \"object\" };\n}\n","/** HITL side-effect classification. */\nexport type SideEffect = \"none\" | \"local_write\" | \"external_write\" | \"destructive\";\n\n/** Kind for @tool function discovery. */\nexport const FUNCTION_KIND = \"function\" as const;\n\n/** Single tool spec from @tool function. */\nexport interface FunctionToolSpec {\n kind: typeof FUNCTION_KIND;\n name: string;\n description: string;\n inputSchema: object;\n outputSchema?: object;\n _meta?: { hitl?: { sideEffect?: SideEffect } };\n sourcePath: string;\n exportName: string;\n}\n","import type { SideEffect } from \"../function/types.js\";\n\n/** Kind for SKILL.md discovery. */\nexport const SKILL_KIND = \"skill\" as const;\n\n/** Conventional directory name for skill tools. */\nexport const SKILL_DIR_NAME = \"skill\" as const;\n\n/** Single tool spec from SKILL.md directory. */\nexport interface SkillToolSpec {\n kind: typeof SKILL_KIND;\n name: string;\n description: string;\n inputSchema: object;\n _meta?: { hitl?: { sideEffect?: SideEffect } };\n sourcePath: string;\n}\n","import type { SideEffect } from \"../function/types.js\";\n\n/** Kind for n8n workflow.json discovery. */\nexport const N8N_KIND = \"n8n\" as const;\n\n/** Single tool spec from n8n workflow.json directory. */\nexport interface N8nToolSpec {\n kind: typeof N8N_KIND;\n name: string;\n description: string;\n inputSchema: object;\n _meta?: { hitl?: { sideEffect?: SideEffect } };\n sourcePath: string;\n webhookUrl?: string;\n}\n","/**\n * Convert MCPToolSpec (function/skill/n8n scan result) to unified ToolSpec.\n * MCP layer: used by function/skill/n8n scanners when exposing unified ToolSpec.\n */\n\nimport type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport { DEFAULT_OUTPUT_SCHEMA } from \"../../core/types/ToolSpec.js\";\nimport type { MCPToolSpec } from \"../discoveryFactory.js\";\nimport { FUNCTION_KIND } from \"../function/types.js\";\nimport { SKILL_KIND } from \"../skill/types.js\";\nimport { N8N_KIND } from \"../n8n/types.js\";\n\nconst DEFAULT_OUTPUT = { type: \"object\" as const, additionalProperties: true };\n\nexport function mcpSpecToToolSpec(spec: MCPToolSpec, projectPath?: string): ToolSpec {\n const base: ToolSpec = {\n name: spec.name,\n version: \"1.0.0\",\n kind: spec.kind,\n description: spec.description,\n inputSchema: spec.inputSchema ?? DEFAULT_OUTPUT,\n outputSchema:\n \"outputSchema\" in spec && spec.outputSchema\n ? spec.outputSchema\n : (DEFAULT_OUTPUT_SCHEMA as object),\n capabilities: [],\n _meta: spec._meta,\n ...(spec.kind === N8N_KIND && \"webhookUrl\" in spec && spec.webhookUrl\n ? { endpoint: spec.webhookUrl }\n : {}),\n };\n if (spec.kind === FUNCTION_KIND && \"sourcePath\" in spec && \"exportName\" in spec) {\n base._meta = {\n ...base._meta,\n sourcePath: spec.sourcePath,\n exportName: spec.exportName,\n ...(projectPath && { projectPath }),\n };\n }\n if (spec.kind === SKILL_KIND && \"sourcePath\" in spec && projectPath) {\n base._meta = { ...base._meta, sourcePath: spec.sourcePath, projectPath };\n }\n if (spec.kind === N8N_KIND && \"sourcePath\" in spec && projectPath) {\n base._meta = { ...base._meta, sourcePath: spec.sourcePath, projectPath };\n }\n return base;\n}\n","/**\n * Scan TypeScript source files for exported functions with @tool JSDoc.\n * Extracts description, @effect, and builds inputSchema from param types.\n * Exposes both scanForTools (raw) and scan (unified DiscoverToolsResult).\n */\n\nimport * as path from \"node:path\";\nimport * as fs from \"node:fs\";\nimport * as ts from \"typescript\";\nimport { pathToToolName } from \"../util/scanUtil.js\";\nimport { buildInputSchemaFromParams, buildOutputSchemaFromReturnType } from \"./schemaFromTs.js\";\nimport type { FunctionToolSpec, SideEffect } from \"./types.js\";\nimport { FUNCTION_KIND } from \"./types.js\";\nimport type { DiscoverToolsOptions, DiscoverToolsResult } from \"../discoveryFactory.js\";\nimport { mcpSpecToToolSpec } from \"../mcp/mcpSpecToToolSpec.js\";\n\nconst TOOL_TAG = \"@tool\";\nconst EFFECT_TAG = \"@effect\";\nconst EFFECT_VALUES: SideEffect[] = [\"none\", \"local_write\", \"external_write\", \"destructive\"];\n\nexport interface ScanResult {\n specs: FunctionToolSpec[];\n errors: Array<{ file: string; message: string }>;\n warnings: Array<{ file: string; message: string }>;\n}\n\n/**\n * Scan a project folder for exported functions annotated with @tool.\n */\nexport function scanForTools(options: {\n projectPath: string;\n include?: string[];\n tsconfigPath?: string;\n}): ScanResult {\n const projectPath = path.resolve(options.projectPath);\n const tsconfigPath =\n options.tsconfigPath ?? path.join(projectPath, \"tsconfig.json\");\n const include = options.include ?? [\"**/*.ts\"];\n const errors: Array<{ file: string; message: string }> = [];\n const warnings: Array<{ file: string; message: string }> = [];\n\n let config: ts.ParsedCommandLine;\n let configPathResolved = path.resolve(projectPath, tsconfigPath);\n if (!fs.existsSync(configPathResolved)) {\n configPathResolved = path.join(projectPath, \"tsconfig.json\");\n }\n if (fs.existsSync(configPathResolved)) {\n const configFile = ts.readConfigFile(configPathResolved, ts.sys.readFile);\n if (configFile.error) {\n errors.push({ file: configPathResolved, message: String(configFile.error.messageText) });\n return { specs: [], errors, warnings };\n }\n const parsed = ts.parseJsonConfigFileContent(\n configFile.config,\n ts.sys,\n path.dirname(configPathResolved),\n );\n if (parsed.errors.length) {\n for (const e of parsed.errors) {\n errors.push({ file: e.file?.fileName ?? \"tsconfig\", message: String(e.messageText) });\n }\n return { specs: [], errors, warnings };\n }\n config = parsed;\n } else {\n config = {\n options: {\n target: ts.ScriptTarget.ES2022,\n module: ts.ModuleKind.ESNext,\n moduleResolution: ts.ModuleResolutionKind.NodeNext,\n strict: true,\n skipLibCheck: true,\n noEmit: true,\n },\n fileNames: resolveGlob(projectPath, include),\n errors: [],\n } as ts.ParsedCommandLine;\n }\n\n const program = ts.createProgram(config.fileNames, config.options);\n const typeChecker = program.getTypeChecker();\n const specs: FunctionToolSpec[] = [];\n\n for (const sourceFile of program.getSourceFiles()) {\n const fileName = sourceFile.fileName;\n if (fileName.includes(\"node_modules\") || fileName.endsWith(\".d.ts\")) continue;\n if (!config.fileNames.some((f) => path.resolve(f) === path.resolve(fileName))) continue;\n\n ts.forEachChild(sourceFile, (node) => {\n const decl = getExportedFunctionDeclaration(node, sourceFile);\n if (!decl) return;\n const func = decl.func;\n const name = decl.name;\n if (!name) return;\n\n const host = getJSDocHost(func);\n if (!hasToolTag(host)) return;\n const jsDoc = getJSDocComments(host);\n\n const description = getDescription(jsDoc, name);\n if (!description) {\n warnings.push({ file: fileName, message: `Tool ${name}: missing description, using humanized name` });\n }\n const sideEffect = getEffect(host);\n\n const onWarn = (msg: string) => warnings.push({ file: fileName, message: `${name}: ${msg}` });\n const { schema } = buildInputSchemaFromParams(func, typeChecker, onWarn);\n\n const inputSchema =\n Object.keys((schema as { properties?: object }).properties ?? {}).length > 0\n ? schema\n : { type: \"object\" as const, properties: {} };\n\n const outputSchema = buildOutputSchemaFromReturnType(func, typeChecker, onWarn);\n\n const sourcePath = path.relative(projectPath, fileName) || path.basename(fileName);\n const toolName = pathToToolName(sourcePath, name);\n\n specs.push({\n kind: FUNCTION_KIND,\n name: toolName,\n description: description || humanize(name),\n inputSchema,\n outputSchema,\n _meta: { hitl: { sideEffect } },\n sourcePath,\n exportName: name,\n });\n });\n }\n\n return { specs, errors, warnings };\n}\n\nfunction resolveGlob(projectPath: string, patterns: string[]): string[] {\n const result: string[] = [];\n const seen = new Set<string>();\n const add = (f: string) => {\n const abs = path.resolve(f);\n if (f.endsWith(\".ts\") && !f.endsWith(\".d.ts\") && !seen.has(abs)) {\n seen.add(abs);\n result.push(abs);\n }\n };\n for (const p of patterns) {\n const full = path.join(projectPath, p);\n if (full.includes(\"*\")) {\n const baseDir = full.replace(/\\*\\*\\/.*$/, \"\").replace(/\\*.*$/, \"\").replace(/\\/?$/, \"\") || \".\";\n const dir = path.resolve(projectPath, baseDir);\n if (fs.existsSync(dir)) walk(dir, add);\n } else {\n const resolved = path.resolve(projectPath, full);\n if (fs.existsSync(resolved)) {\n if (fs.statSync(resolved).isFile()) add(resolved);\n else walk(resolved, add);\n }\n }\n }\n if (result.length > 0) return result;\n const srcDir = path.join(projectPath, \"src\");\n if (fs.existsSync(srcDir)) return walkCollect(srcDir);\n return [];\n}\n\nfunction walkCollect(dir: string): string[] {\n const out: string[] = [];\n walk(dir, (fullPath) => {\n if (fullPath.endsWith(\".ts\") && !fullPath.endsWith(\".d.ts\")) out.push(path.resolve(fullPath));\n });\n return out;\n}\n\nconst SKIP_DIRS = new Set([\"node_modules\", \"generated\", \"dist\"]);\n\nfunction walk(dir: string, visit: (fullPath: string) => void): void {\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const e of entries) {\n const full = path.join(dir, e.name);\n if (e.isDirectory() && !SKIP_DIRS.has(e.name)) walk(full, visit);\n else if (e.isFile()) visit(full);\n }\n } catch {\n // ignore\n }\n}\n\nfunction getExportedFunctionDeclaration(\n node: ts.Node,\n _sourceFile: ts.SourceFile,\n): { func: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression; name: string } | null {\n if (ts.isFunctionDeclaration(node) && node.name) {\n const exported = (ts.getModifiers(node) ?? []).some((m) => m.kind === ts.SyntaxKind.ExportKeyword);\n if (exported) return { func: node, name: node.name.getText() };\n return null;\n }\n if (ts.isVariableStatement(node)) {\n const exported = (ts.getModifiers(node) ?? []).some((m) => m.kind === ts.SyntaxKind.ExportKeyword);\n if (!exported) return null;\n for (const decl of node.declarationList.declarations) {\n let init = decl.initializer;\n while (init && (ts.isParenthesizedExpression(init) || ts.isAsExpression(init)))\n init = init.expression;\n if (init && ts.isArrowFunction(init)) {\n const name = (decl.name as ts.Identifier).getText();\n return { func: init, name };\n }\n if (init && ts.isFunctionExpression(init)) {\n const name = (decl.name as ts.Identifier).getText();\n return { func: init, name };\n }\n }\n }\n return null;\n}\n\nfunction getJSDocHost(node: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression): ts.Node {\n const parent = node.parent;\n if (ts.isVariableDeclaration(parent)) {\n const gp = parent.parent;\n if (ts.isVariableDeclarationList(gp) && gp.parent && ts.isVariableStatement(gp.parent)) return gp.parent;\n }\n return node as ts.Node;\n}\n\nfunction getJSDocComments(host: ts.Node): ts.JSDoc[] {\n const all = ts.getJSDocCommentsAndTags(host);\n return all.filter((t): t is ts.JSDoc => ts.isJSDoc(t));\n}\n\nfunction hasToolTag(host: ts.Node): boolean {\n const tags = ts.getJSDocTags(host);\n for (const tag of tags) {\n const name = (tag as { tagName?: ts.Identifier }).tagName?.getText() ?? \"\";\n if (name === \"tool\") return true;\n }\n const all = ts.getJSDocCommentsAndTags(host);\n for (const t of all) {\n if (ts.isJSDoc(t)) {\n const full = t.getFullText();\n if (full.includes(TOOL_TAG)) return true;\n }\n }\n return false;\n}\n\nfunction getDescription(jsDocs: ts.JSDoc[], fallbackName: string): string {\n for (const doc of jsDocs) {\n const comment = doc.comment;\n if (typeof comment === \"string\") {\n const first = comment.split(/\\n/)[0]?.trim() ?? \"\";\n if (first && !first.startsWith(\"@\")) return first;\n }\n if (Array.isArray(comment)) {\n const first = comment[0];\n if (first && typeof first === \"object\" && \"text\" in first) {\n const t = (first as { text: string }).text.trim();\n if (t && !t.startsWith(\"@\")) return t;\n }\n }\n const full = doc.getFullText();\n const match = full.match(/\\*\\s*@tool\\s+(.+?)(?=\\n|$|\\*\\/)/s);\n if (match?.[1]) return match[1].trim();\n }\n return \"\";\n}\n\nfunction getEffect(host: ts.Node): SideEffect {\n const tags = ts.getJSDocTags(host);\n for (const tag of tags) {\n const name = (tag as { tagName?: ts.Identifier }).tagName?.getText() ?? \"\";\n if (name === \"effect\") {\n const comment = (tag as ts.JSDocUnknownTag).comment;\n const v = (typeof comment === \"string\" ? comment : \"\").trim().toLowerCase();\n if (EFFECT_VALUES.includes(v as SideEffect)) return v as SideEffect;\n }\n }\n const all = ts.getJSDocCommentsAndTags(host);\n for (const t of all) {\n if (ts.isJSDoc(t)) {\n const full = t.getFullText();\n const match = full.match(/\\*\\s*@effect\\s+(\\w+)/);\n if (match && EFFECT_VALUES.includes(match[1] as SideEffect)) return match[1] as SideEffect;\n }\n }\n return \"none\";\n}\n\nfunction humanize(name: string): string {\n return name.replace(/([A-Z])/g, \" $1\").replace(/^./, (s) => s.toUpperCase()).trim();\n}\n\n/** Unified scan: (path, options) → DiscoverToolsResult. */\nexport function scan(\n projectPath: string,\n options: DiscoverToolsOptions = {},\n): Promise<DiscoverToolsResult> {\n const root = path.resolve(projectPath);\n const result = scanForTools({\n projectPath: root,\n include: options.include ?? [\"**/*.ts\"],\n tsconfigPath: options.tsconfigPath,\n });\n const specs = result.specs.map((s) => mcpSpecToToolSpec(s, root));\n return Promise.resolve({\n specs,\n errors: result.errors,\n warnings: result.warnings,\n });\n}\n","/**\n * Resolve entry point file for a tool directory.\n * Used by skill and langchain loaders (each has its own default: handler vs index).\n */\n\nimport { join } from \"node:path\";\nimport { stat } from \"node:fs/promises\";\n\n/** Runtime-executable extensions only (Node runs .js/.mjs; .ts is not needed unless using ts-node/tsx). */\nconst DEFAULT_EXTENSIONS = [\".js\", \".mjs\"];\n\nexport async function resolveEntryPoint(\n dirPath: string,\n baseName: string,\n extensions: string[] = DEFAULT_EXTENSIONS,\n): Promise<string> {\n if (extensions.some((ext) => baseName.endsWith(ext))) {\n const fullPath = join(dirPath, baseName);\n await stat(fullPath);\n return fullPath;\n }\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\n }\n }\n throw new Error(\n `Could not find entry point in ${dirPath}. Tried: ${extensions.map((e) => baseName + e).join(\", \")}`,\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 (Agent Skills spec).\n * Level 1 (metadata) — always loaded at startup for discovery.\n * @see https://agentskills.io/specification\n */\nexport interface SkillFrontmatter {\n /**\n * Skill name identifier (required).\n * - Max 64 characters; lowercase letters, numbers, hyphens only\n * - Must not start or end with hyphen; no consecutive hyphens\n */\n name: string;\n\n /**\n * What the skill does and when to use it (required).\n * - Max 1024 characters\n */\n description: string;\n\n /** Optional: license name or reference (e.g. Apache-2.0, LICENSE.txt). */\n license?: string;\n\n /** Optional: environment requirements, max 500 characters. */\n compatibility?: string;\n\n /** Optional: arbitrary key-value metadata. */\n metadata?: Record<string, string>;\n\n /** Optional: space-delimited list of pre-approved tools (experimental). */\n allowedTools?: 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 COMPATIBILITY_MAX_LENGTH = 500;\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 (fm.name.startsWith(\"-\") || fm.name.endsWith(\"-\")) {\n throw new SkillManifestError(\n filePath,\n \"name\",\n \"name must not start or end with a hyphen\",\n );\n }\n if (fm.name.includes(\"--\")) {\n throw new SkillManifestError(\n filePath,\n \"name\",\n \"name must not contain consecutive 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 // Optional: compatibility max 500 characters\n if (fm.compatibility != null && typeof fm.compatibility === \"string\") {\n if (fm.compatibility.length > COMPATIBILITY_MAX_LENGTH) {\n throw new SkillManifestError(\n filePath,\n \"compatibility\",\n `compatibility must be at most ${COMPATIBILITY_MAX_LENGTH} characters (got ${fm.compatibility.length})`,\n );\n }\n }\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { join, extname, relative } from \"node:path\";\nimport yaml from \"js-yaml\";\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 let raw: Record<string, unknown>;\n try {\n const parsed = yaml.load(yamlBlock);\n if (parsed == null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new SkillManifestError(\n filePath,\n \"frontmatter\",\n \"YAML frontmatter must be an object (key: value)\",\n );\n }\n raw = parsed as Record<string, unknown>;\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n throw new SkillManifestError(\n filePath,\n \"frontmatter\",\n `Invalid YAML frontmatter: ${message}`,\n );\n }\n\n const name = stringField(raw, \"name\", filePath);\n const description = stringField(raw, \"description\", filePath);\n if (!name || !description) {\n throw new SkillManifestError(\n filePath,\n \"frontmatter\",\n !name ? \"name is required\" : \"description is required\",\n );\n }\n\n const license = stringField(raw, \"license\");\n const compatibility = stringField(raw, \"compatibility\");\n const allowedTools = stringField(raw, \"allowed-tools\");\n const metadata = normalizeMetadata(raw.metadata);\n\n const frontmatter: SkillFrontmatter = {\n name,\n description,\n ...(license && { license }),\n ...(compatibility && { compatibility }),\n ...(allowedTools && { allowedTools }),\n ...(metadata && Object.keys(metadata).length > 0 && { metadata }),\n };\n validateFrontmatter(frontmatter, filePath);\n\n return { frontmatter, instructions: body };\n}\n\nfunction stringField(\n raw: Record<string, unknown>,\n key: string,\n filePath?: string,\n): string {\n const v = raw[key];\n if (v == null) return \"\";\n if (typeof v === \"string\") return v;\n if (typeof v === \"number\" || typeof v === \"boolean\") return String(v);\n if (Array.isArray(v)) {\n return v.map((x) => (typeof x === \"string\" ? x : String(x))).join(\"\\n\");\n }\n if (filePath) {\n throw new SkillManifestError(\n filePath,\n \"frontmatter\",\n `Frontmatter field \"${key}\" must be a string, number, boolean, or array`,\n );\n }\n return String(v);\n}\n\n/**\n * Normalize frontmatter `metadata` to Record<string, string>.\n * Supports nested YAML: { author: \"...\", version: \"...\" } → flat string values.\n */\nfunction normalizeMetadata(val: unknown): Record<string, string> | undefined {\n if (val == null) return undefined;\n if (typeof val === \"object\" && !Array.isArray(val)) {\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(val)) {\n if (typeof k === \"string\" && v !== undefined && v !== null) {\n out[k] = typeof v === \"object\" ? JSON.stringify(v) : String(v);\n }\n }\n return Object.keys(out).length ? out : undefined;\n }\n if (typeof val === \"string\" || typeof val === \"number\" || typeof val === \"boolean\") {\n return { value: String(val) };\n }\n return undefined;\n}\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","/**\n * Scan project for SKILL.md directories; produce MCP tool specs.\n * Exposes both scanForSkill (raw) and scan (unified DiscoverToolsResult).\n */\n\nimport * as path from \"node:path\";\nimport { findDirsContainingFile, pathToToolName } from \"../util/scanUtil.js\";\nimport { loadSkillDefinition } from \"./SkillMdParser.js\";\nimport type { SkillToolSpec } from \"./types.js\";\nimport { SKILL_KIND } from \"./types.js\";\nimport type { DiscoverToolsOptions, DiscoverToolsResult } from \"../discoveryFactory.js\";\nimport { mcpSpecToToolSpec } from \"../mcp/mcpSpecToToolSpec.js\";\n\nexport interface ScanSkillResult {\n skills: SkillToolSpec[];\n errors: Array<{ dir: string; message: string }>;\n}\n\nconst defaultInputSchema = { type: \"object\" as const, properties: {}, additionalProperties: true };\n\n/**\n * Scan projectPath for SKILL.md directories; return skill tool specs.\n */\nexport async function scanForSkill(projectPath: string): Promise<ScanSkillResult> {\n const projectRoot = path.resolve(projectPath);\n const dirs = await findDirsContainingFile(projectRoot, \"SKILL.md\");\n\n const skills: SkillToolSpec[] = [];\n const errors: Array<{ dir: string; message: string }> = [];\n\n for (const dirPath of dirs) {\n const relativePath = path.relative(projectRoot, dirPath) || path.basename(dirPath);\n try {\n const skillDef = await loadSkillDefinition(dirPath);\n const name = pathToToolName(relativePath, skillDef.frontmatter.name);\n skills.push({\n kind: SKILL_KIND,\n name,\n description: skillDef.frontmatter.description,\n inputSchema: defaultInputSchema,\n _meta: { hitl: { sideEffect: \"none\" } },\n sourcePath: relativePath.replace(/\\\\/g, \"/\"),\n });\n } catch (err) {\n errors.push({ dir: relativePath, message: err instanceof Error ? err.message : String(err) });\n }\n }\n\n return { skills, errors };\n}\n\n/** Unified scan: (path, options) → DiscoverToolsResult. */\nexport async function scan(\n projectPath: string,\n _options: DiscoverToolsOptions = {},\n): Promise<DiscoverToolsResult> {\n const root = path.resolve(projectPath);\n const result = await scanForSkill(root);\n const specs = result.skills.map((s) => mcpSpecToToolSpec(s, root));\n return {\n specs,\n errors: result.errors.map((e) => ({ file: e.dir, message: e.message })),\n };\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join, basename } from \"node:path\";\nimport type { ToolManifest, LoadedTool } from \"../discoveryFactory.js\";\nimport { DiscoveryError } from \"../discoveryFactory.js\";\n\n/** Metadata extracted from workflow.json for spec building (used by N8nLoader and scan scanN8n). */\nexport interface WorkflowMeta {\n name: string;\n description: string;\n webhookUrl?: string;\n workflowDef: Record<string, unknown>;\n}\n\n/**\n * Read and parse workflow.json in dirPath; return metadata and raw workflow.\n * Shared by loadN8nTool (runtime) and scan scanN8n.\n */\nexport async function readWorkflowMeta(\n dirPath: string,\n workflowFileName: string = \"workflow.json\",\n): Promise<WorkflowMeta> {\n const workflowPath = join(dirPath, workflowFileName);\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 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 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 const meta = workflowDef.meta as Record<string, unknown> | undefined;\n const name =\n (workflowDef.name as string) ||\n (meta?.name as string) ||\n basename(dirPath);\n const description =\n (workflowDef.description as string) ||\n (meta?.description as string) ||\n `n8n workflow: ${name}`;\n let webhookUrl: string | undefined;\n const nodes = workflowDef.nodes as Array<Record<string, unknown>> | undefined;\n if (Array.isArray(nodes)) {\n const webhookNode = nodes.find(\n (n) =>\n n.type === \"n8n-nodes-base.webhook\" || (n.type as string)?.includes(\"webhook\"),\n );\n if (webhookNode?.parameters && typeof webhookNode.parameters === \"object\") {\n const params = webhookNode.parameters as Record<string, unknown>;\n const pathVal = params.path ?? params.webhookPath;\n if (typeof pathVal === \"string\" && pathVal.startsWith(\"http\")) {\n webhookUrl = pathVal;\n }\n }\n }\n return { name, description, webhookUrl, workflowDef };\n}\n\n/**\n * Load an n8n tool from its directory.\n * Reads workflow.json and validates it has a \"nodes\" array.\n *\n * Description for the tool spec is taken (in order) from:\n * 1. tool.json \"description\" (if present)\n * 2. workflow.json \"description\" or \"meta.description\"\n * 3. workflow.json \"name\" (n8n workflow name)\n * 4. Fallback: \"n8n tool: <dirName>\"\n */\nexport async function loadN8nTool(\n dirPath: string,\n manifest: ToolManifest,\n): Promise<LoadedTool> {\n const { workflowDef } = await readWorkflowMeta(\n dirPath,\n manifest.entryPoint ?? \"workflow.json\",\n );\n return { manifest, dirPath, workflowDef };\n}\n","/**\n * Scan project for workflow.json (n8n) directories; produce MCP tool specs.\n * Exposes both scanForN8n (raw) and scan (unified DiscoverToolsResult).\n */\n\nimport * as path from \"node:path\";\nimport { findDirsContainingFile, pathToToolName } from \"../util/scanUtil.js\";\nimport { readWorkflowMeta } from \"./N8nLoader.js\";\nimport type { N8nToolSpec } from \"./types.js\";\nimport { N8N_KIND } from \"./types.js\";\nimport type { DiscoverToolsOptions, DiscoverToolsResult } from \"../discoveryFactory.js\";\nimport { mcpSpecToToolSpec } from \"../mcp/mcpSpecToToolSpec.js\";\n\nexport interface ScanN8nResult {\n n8n: N8nToolSpec[];\n errors: Array<{ dir: string; message: string }>;\n}\n\nconst defaultInputSchema = { type: \"object\" as const, properties: {}, additionalProperties: true };\n\n/**\n * Scan projectPath for workflow.json directories; return n8n tool specs.\n */\nexport async function scanForN8n(projectPath: string): Promise<ScanN8nResult> {\n const projectRoot = path.resolve(projectPath);\n const dirs = await findDirsContainingFile(projectRoot, \"workflow.json\");\n\n const n8n: N8nToolSpec[] = [];\n const errors: Array<{ dir: string; message: string }> = [];\n\n for (const dirPath of dirs) {\n const relativePath = path.relative(projectRoot, dirPath) || path.basename(dirPath);\n try {\n const { name: wfName, description: wfDesc, webhookUrl } = await readWorkflowMeta(dirPath);\n const toolName = pathToToolName(relativePath, wfName);\n n8n.push({\n kind: N8N_KIND,\n name: toolName,\n description: wfDesc,\n inputSchema: defaultInputSchema,\n _meta: { hitl: { sideEffect: \"external_write\" } },\n sourcePath: relativePath.replace(/\\\\/g, \"/\"),\n webhookUrl,\n });\n } catch (err) {\n errors.push({ dir: relativePath, message: err instanceof Error ? err.message : String(err) });\n }\n }\n\n return { n8n, errors };\n}\n\n/** Unified scan: (path, options) → DiscoverToolsResult. */\nexport async function scan(\n projectPath: string,\n _options: DiscoverToolsOptions = {},\n): Promise<DiscoverToolsResult> {\n const root = path.resolve(projectPath);\n const result = await scanForN8n(root);\n const specs = result.n8n.map((s) => mcpSpecToToolSpec(s, root));\n return {\n specs,\n errors: result.errors.map((e) => ({ file: e.dir, message: e.message })),\n };\n}\n","/** Kind for MCP directory discovery. */\nexport const MCP_KIND = \"mcp\" as const;\n","/**\n * MCP scan: find dirs with mcp.json, load via DirectoryScanner, return unified DiscoverToolsResult.\n * Exposes scan(path, options) only (no separate raw scanner).\n */\n\nimport * as path from \"node:path\";\nimport type { DiscoverToolsOptions, DiscoverToolsResult } from \"../discoveryFactory.js\";\nimport { DirectoryScanner } from \"../discoveryFactory.js\";\nimport { MCP_KIND } from \"./types.js\";\n\n/** Unified scan: (path, options) → DiscoverToolsResult. */\nexport async function scan(\n projectPath: string,\n options: DiscoverToolsOptions = {},\n): Promise<DiscoverToolsResult> {\n const root = path.resolve(projectPath);\n const namespace = options.namespace ?? \"dir\";\n const errors: Array<{ file: string; message: string }> = [];\n\n const scanner = new DirectoryScanner({\n roots: [root],\n namespace,\n extensions: options.extensions,\n onError: (dir, err) => {\n errors.push({ file: dir, message: err.message });\n options.onError?.(dir, err);\n },\n });\n\n let specs;\n try {\n specs = await scanner.scan();\n } catch (err) {\n errors.push({\n file: root,\n message: err instanceof Error ? err.message : String(err),\n });\n return { specs: [], errors };\n }\n\n const filtered = specs.filter((s) => s.kind === MCP_KIND);\n return { specs: filtered, errors };\n}\n","/** Kind for LangChain directory discovery. */\nexport const LANGCHAIN_KIND = \"langchain\" as const;\n\n/** Conventional directory name for LangChain tools. */\nexport const LANGCHAIN_DIR_NAME = \"langchain\" as const;\n","/**\n * LangChain scan: find langchain dirs / tool.json, load via DirectoryScanner, return unified DiscoverToolsResult.\n * Exposes scan(path, options) only (no separate raw scanner).\n */\n\nimport * as path from \"node:path\";\nimport type { DiscoverToolsOptions, DiscoverToolsResult } from \"../discoveryFactory.js\";\nimport { DirectoryScanner } from \"../discoveryFactory.js\";\nimport { LANGCHAIN_KIND } from \"./types.js\";\n\n/** Unified scan: (path, options) → DiscoverToolsResult. */\nexport async function scan(\n projectPath: string,\n options: DiscoverToolsOptions = {},\n): Promise<DiscoverToolsResult> {\n const root = path.resolve(projectPath);\n const namespace = options.namespace ?? \"dir\";\n const errors: Array<{ file: string; message: string }> = [];\n\n const scanner = new DirectoryScanner({\n roots: [root],\n namespace,\n extensions: options.extensions,\n onError: (dir, err) => {\n errors.push({ file: dir, message: err.message });\n options.onError?.(dir, err);\n },\n });\n\n let specs;\n try {\n specs = await scanner.scan();\n } catch (err) {\n errors.push({\n file: root,\n message: err instanceof Error ? err.message : String(err),\n });\n return { specs: [], errors };\n }\n\n const filtered = specs.filter((s) => s.kind === LANGCHAIN_KIND);\n return { specs: filtered, errors };\n}\n","import { pathToFileURL } from \"node:url\";\nimport type { ToolManifest, LoadedTool } from \"../discoveryFactory.js\";\nimport { DiscoveryError } from \"../discoveryFactory.js\";\nimport { resolveEntryPoint } from \"../util/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 { readdir } from \"node:fs/promises\";\nimport { pathToFileURL } from \"node:url\";\nimport type { ToolManifest, LoadedTool } from \"../discoveryFactory.js\";\nimport { DiscoveryError } from \"../discoveryFactory.js\";\nimport { resolveEntryPoint } from \"../util/resolveEntry.js\";\nimport { loadSkillDefinition } from \"./SkillMdParser.js\";\nimport type { SkillDefinition } from \"./SkillManifest.js\";\n\nconst DEFAULT_EXTENSIONS = [\".js\", \".mjs\"];\n\n/**\n * List top-level .js/.mjs files in the skill directory (exclude lib/, node_modules/, hidden, test files).\n * Used to auto-discover multiple programs when tool.json has no \"programs\" map.\n */\nasync function listSkillProgramFiles(\n dirPath: string,\n extensions: string[] = DEFAULT_EXTENSIONS,\n): 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 return entries\n .filter((e) => e.isFile)\n .map((e) => e.name)\n .filter((name) => {\n if (name.startsWith(\".\") || name.startsWith(\"_\")) return false;\n if (name.includes(\".test.\") || name.includes(\".spec.\")) return false;\n return extensions.some((ext) => name.endsWith(ext));\n })\n .sort((a, b) => {\n // Prefer handler.js or index.js as first (default program)\n if (a === \"handler.js\" || a === \"index.js\") return -1;\n if (b === \"handler.js\" || b === \"index.js\") return 1;\n return a.localeCompare(b);\n });\n}\n\n/**\n * Check if a value is a LangChain-like tool (object with invoke function).\n * Includes instances of StructuredTool and plain { name?, description?, schema?, invoke }.\n */\nfunction isLangChainLikeTool(val: unknown): val is { name?: string; description?: string; schema?: object; invoke: (args: unknown) => Promise<unknown> } {\n return (\n val != null &&\n typeof val === \"object\" &&\n \"invoke\" in val &&\n typeof (val as { invoke: unknown }).invoke === \"function\"\n );\n}\n\n/**\n * Check if a value is a class (constructor) that can be instantiated.\n * Used to detect \"class Foo extends StructuredTool\" exports.\n */\nfunction isConstructable(val: unknown): val is new (...args: unknown[]) => { invoke?: (args: unknown) => Promise<unknown> } {\n return typeof val === \"function\" && typeof (val as { prototype?: unknown }).prototype === \"object\";\n}\n\n/**\n * Load a single skill program (one entry point) and return a LoadedTool.\n * Supports:\n * - Class extending StructuredTool: loader instantiates with new ToolClass(), uses instance.\n * - LangChain-like object (or instance): { name?, description?, schema?, invoke(args) }.\n * - Function: (args, ctx) => Promise<{ result, evidence? }> — name/description from SKILL.md.\n */\nasync function loadOneSkillProgram(\n dirPath: string,\n manifest: ToolManifest,\n entryFile: string,\n skillDef: SkillDefinition,\n programKey: string | undefined,\n extensions: string[] | undefined,\n): Promise<LoadedTool> {\n let impl: unknown;\n try {\n const fullPath = await resolveEntryPoint(dirPath, entryFile, extensions ?? [\".js\", \".mjs\"]);\n const mod = (await import(pathToFileURL(fullPath).href)) as Record<string, unknown>;\n const fn = mod.default ?? mod.handler ?? mod.Tool;\n if (isLangChainLikeTool(fn)) {\n impl = fn;\n } else if (isConstructable(fn)) {\n const instance = new (fn as new () => { invoke: (args: unknown) => Promise<unknown> })();\n if (isLangChainLikeTool(instance)) impl = instance;\n } else if (typeof fn === \"function\") {\n impl = fn;\n }\n } catch {\n // Handler is optional — skills can be instruction-only\n }\n return {\n manifest,\n dirPath,\n impl,\n skillDefinition: skillDef,\n programKey,\n };\n}\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 const loaded = await loadSkillTools(dirPath, manifest, extensions);\n if (loaded.length === 0) {\n throw new DiscoveryError(dirPath, \"load\", \"No skill programs loaded\", new Error(\"empty\"));\n }\n return loaded[0]!;\n}\n\n/**\n * Load one or more skill programs from a directory.\n * When manifest.programs is set (e.g. { \"default\": \"handler.js\", \"report\": \"report.js\" }),\n * returns one LoadedTool per program; otherwise returns a single LoadedTool (entryPoint or \"handler\").\n */\nexport async function loadSkillTools(\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 const programs = manifest.programs;\n if (programs && typeof programs === \"object\" && Object.keys(programs).length > 0) {\n const result: LoadedTool[] = [];\n for (const [programKey, entryFile] of Object.entries(programs)) {\n const loaded = await loadOneSkillProgram(\n dirPath,\n manifest,\n entryFile,\n skillDef,\n programKey,\n extensions,\n );\n result.push(loaded);\n }\n return result;\n }\n\n // Auto-discover: list top-level .js/.mjs; if multiple, treat each as a program\n const exts = extensions ?? DEFAULT_EXTENSIONS;\n const files = await listSkillProgramFiles(dirPath, exts);\n if (files.length >= 2) {\n const result: LoadedTool[] = [];\n for (let i = 0; i < files.length; i++) {\n const file = files[i]!;\n const programKey = i === 0 ? \"default\" : file.replace(/\\.[^.]+$/, \"\");\n const loaded = await loadOneSkillProgram(\n dirPath,\n manifest,\n file,\n skillDef,\n programKey,\n extensions,\n );\n result.push(loaded);\n }\n return result;\n }\n\n // Single program: entryPoint or \"handler\" (or only one file found)\n const entryFile = manifest.entryPoint ?? files[0] ?? \"handler\";\n const loaded = await loadOneSkillProgram(\n dirPath,\n manifest,\n entryFile,\n skillDef,\n undefined,\n extensions,\n );\n return [loaded];\n}\n","import { readdir } from \"node:fs/promises\";\nimport { join, basename } from \"node:path\";\nimport type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { ToolManifest, LoadedTool } from \"../discoveryFactory.js\";\nimport { DiscoveryError } from \"../discoveryFactory.js\";\nimport { loadLangChainTool } from \"./LangChainLoader.js\";\n\n/**\n * List entry files (.js/.mjs) in dirPath for LangChain multi-tool dirs.\n * Implementation in langchain, not in factory.\n */\nexport async function listLangchainEntryFiles(\n dirPath: string,\n extensions: string[],\n): 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 return entries\n .filter((e) => e.isFile)\n .map((e) => e.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 extensions.some((ext) => name.endsWith(ext));\n });\n}\n\n/**\n * Load all LangChain tools from a directory (multiple entry files).\n * Implementation in langchain, not in factory.\n */\nexport async function loadLangChainToolsFromDir(\n dirPath: string,\n dirName: string,\n manifest: ToolManifest,\n strict: boolean,\n namespace: string,\n extensions: string[],\n langchainDirName: string,\n toSpec: (loaded: LoadedTool, nameHint: string, dirPath: string, namespace: string) => ToolSpec,\n onError?: (filePath: string, error: Error) => void,\n): Promise<ToolSpec[]> {\n const entryFiles = await listLangchainEntryFiles(dirPath, extensions);\n if (entryFiles.length === 0) {\n if (strict) {\n throw new DiscoveryError(dirPath, \"load\", \"No LangChain entry files found\");\n }\n return [];\n }\n const specs: ToolSpec[] = [];\n const useDirNameForSingle = dirName !== langchainDirName;\n for (const entryFile of entryFiles) {\n const fileManifest: ToolManifest = { ...manifest, entryPoint: entryFile };\n try {\n const loaded = await loadLangChainTool(dirPath, fileManifest, extensions);\n const fileBase = basename(entryFile).replace(/\\.[^.]+$/, \"\");\n const nameHint =\n entryFiles.length === 1 && useDirNameForSingle ? dirName : fileBase;\n specs.push(toSpec(loaded, nameHint, dirPath, namespace));\n } catch (error) {\n const err = error as Error;\n if (err instanceof DiscoveryError && err.phase === \"validate\") {\n if (strict) throw err;\n continue;\n }\n onError?.(join(dirPath, entryFile), err);\n if (strict) throw err;\n }\n }\n return specs;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { MCPServerConfig, ToolManifest, LoadedTool } from \"../discoveryFactory.js\";\nimport { DiscoveryError } from \"../discoveryFactory.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 type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { LoadedTool, ToolManifest } from \"../discoveryFactory.js\";\n\n/** Apply MCP-loaded tool to spec (implementation in mcp, not in factory). */\nexport function applyLoadedToSpec(\n spec: ToolSpec,\n loaded: LoadedTool,\n _manifest: ToolManifest,\n _defaultDirName: string,\n _namespace: string,\n): void {\n if (loaded.mcpConfig?.url) spec.endpoint = loaded.mcpConfig.url;\n spec.impl = loaded.mcpConfig;\n}\n\nexport const directoryMarker = {\n kind: \"mcp\" as const,\n markerFile: \"mcp.json\",\n defaultEntryPoint: \"mcp.json\",\n};\n","import type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { LoadedTool, ToolManifest } from \"../discoveryFactory.js\";\n\n/** Apply LangChain-loaded tool to spec (implementation in langchain, not in factory). */\nexport function applyLoadedToSpec(\n spec: ToolSpec,\n loaded: LoadedTool,\n manifest: ToolManifest,\n _defaultDirName: string,\n namespace: string,\n): void {\n spec.impl = loaded.impl;\n if (!manifest.name && loaded.impl) {\n const toolName = (loaded.impl as { name?: string }).name;\n if (toolName) spec.name = `${namespace}/${toolName}`;\n }\n if (!manifest.description && loaded.impl) {\n const d = (loaded.impl as { description?: string }).description;\n if (d) spec.description = d;\n }\n if (!manifest.inputSchema && loaded.impl) {\n const schema = (loaded.impl as { schema?: object }).schema;\n if (schema) spec.inputSchema = schema;\n }\n}\n","import type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { LoadedTool, ToolManifest } from \"../discoveryFactory.js\";\n\n/** Apply skill-loaded tool to spec (implementation in skill, not in factory). */\nexport function applyLoadedToSpec(\n spec: ToolSpec,\n loaded: LoadedTool,\n manifest: ToolManifest,\n defaultDirName: string,\n namespace: string,\n): void {\n const skillDef = loaded.skillDefinition as\n | { frontmatter: { name: string; description: string } }\n | undefined;\n if (skillDef) {\n spec.name = manifest.name ?? skillDef.frontmatter.name;\n spec.description = skillDef.frontmatter.description;\n if (loaded.programKey === \"default\") {\n spec.name = `${namespace}/${defaultDirName}`;\n } else if (loaded.programKey) {\n spec.name = `${namespace}/${defaultDirName}/${loaded.programKey}`;\n }\n const impl = loaded.impl as\n | { description?: string; schema?: object; invoke?: unknown }\n | undefined;\n if (impl && typeof impl === \"object\" && typeof impl.invoke === \"function\") {\n if (impl.description != null && impl.description !== \"\")\n spec.description = impl.description;\n if (impl.schema != null && typeof impl.schema === \"object\")\n spec.inputSchema = impl.schema as object;\n }\n spec.impl = { ...skillDef, handler: loaded.impl };\n } else {\n spec.impl = loaded.impl;\n }\n}\n\nexport const directoryMarker = {\n kind: \"skill\" as const,\n markerFile: \"SKILL.md\",\n defaultEntryPoint: \"handler\",\n};\n","import type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { LoadedTool, ToolManifest } from \"../discoveryFactory.js\";\n\n/** Apply n8n-loaded tool to spec (implementation in n8n, not in factory). */\nexport function applyLoadedToSpec(\n spec: ToolSpec,\n loaded: LoadedTool,\n manifest: ToolManifest,\n _defaultDirName: string,\n _namespace: string,\n): void {\n const workflow = loaded.workflowDef as {\n id?: string;\n name?: string;\n description?: string;\n meta?: { description?: string };\n } | undefined;\n if (workflow?.id) spec.resourceId = String(workflow.id);\n if (!manifest.description && workflow) {\n const d =\n workflow.description ??\n workflow.meta?.description ??\n (typeof workflow.name === \"string\" ? workflow.name : undefined);\n if (d) spec.description = d;\n }\n spec.impl = loaded.workflowDef;\n}\n\nexport const directoryMarker = {\n kind: \"n8n\" as const,\n markerFile: \"workflow.json\",\n defaultEntryPoint: \"workflow.json\",\n};\n","/**\n * Discovery factory: types, discoverTools by kind, directory loaders/markers, and DirectoryScanner.\n * Single place for discovery types, scan-by-type, and filesystem directory scanning.\n */\n\nimport * as path from \"node:path\";\nimport { join, basename } from \"node:path\";\nimport { readdir, readFile, access } from \"node:fs/promises\";\nimport type { ToolSpec, Capability, CostHints } from \"../core/types/ToolSpec.js\";\nimport type { FunctionToolSpec, SideEffect } from \"./function/types.js\";\nimport type { SkillToolSpec } from \"./skill/types.js\";\nimport type { N8nToolSpec } from \"./n8n/types.js\";\nimport { resolveEntryPoint } from \"./util/resolveEntry.js\";\n\n// --- Discovery types (single source of truth) ---\n\nexport type { SideEffect, FunctionToolSpec } from \"./function/types.js\";\nexport type { SkillToolSpec } from \"./skill/types.js\";\nexport type { N8nToolSpec } from \"./n8n/types.js\";\nexport type MCPToolSpec = FunctionToolSpec | SkillToolSpec | N8nToolSpec;\n\nexport type DiscoverableKind = \"function\" | \"skill\" | \"n8n\" | \"mcp\" | \"langchain\";\n\nexport interface DiscoverToolsOptions {\n namespace?: string;\n include?: string[];\n tsconfigPath?: string;\n extensions?: string[];\n onError?: (fileOrDir: string, error: Error) => void;\n}\n\nexport interface DiscoverToolsResult {\n specs: ToolSpec[];\n errors: Array<{ file: string; message: string }>;\n warnings?: Array<{ file: string; message: string }>;\n}\n\nexport interface MCPServerConfig {\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n cwd?: string;\n url?: string;\n}\n\nexport interface ToolManifest {\n kind: DiscoverableKind;\n name?: string;\n version?: string;\n description?: string;\n tags?: string[];\n capabilities?: Capability[];\n costHints?: CostHints;\n entryPoint?: string;\n programs?: Record<string, string>;\n inputSchema?: object;\n outputSchema?: object;\n enabled?: boolean;\n}\n\nexport interface DirectoryScannerOptions {\n roots: Array<string | { path: string; namespace?: string }>;\n namespace?: string;\n extensions?: string[];\n onError?: (toolDir: string, error: Error) => void;\n}\n\nexport interface LoadedTool {\n manifest: ToolManifest;\n dirPath: string;\n impl?: unknown;\n mcpConfig?: MCPServerConfig;\n workflowDef?: unknown;\n skillDefinition?: unknown;\n programKey?: string;\n}\n\nexport class DiscoveryError extends Error {\n readonly toolDir: string;\n readonly phase: \"manifest\" | \"load\" | \"validate\";\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}\nimport { scan as scanFunction } from \"./function/scanner.js\";\nimport { scan as scanSkill } from \"./skill/scanSkill.js\";\nimport { scan as scanN8n } from \"./n8n/scanN8n.js\";\nimport { scan as scanMcp } from \"./mcp/scanner.js\";\nimport { scan as scanLangchain } from \"./langchain/scanner.js\";\nimport { loadLangChainTool } from \"./langchain/LangChainLoader.js\";\nimport { loadSkillTools } from \"./skill/SkillLoader.js\";\nimport { loadLangChainToolsFromDir, listLangchainEntryFiles } from \"./langchain/directoryLoad.js\";\nimport { loadMCPTool } from \"./mcp/MCPLoader.js\";\nimport { applyLoadedToSpec as applyMcp, directoryMarker as markerMcp } from \"./mcp/directoryApply.js\";\nimport { applyLoadedToSpec as applyLangchain } from \"./langchain/directoryApply.js\";\nimport { applyLoadedToSpec as applySkill, directoryMarker as markerSkill } from \"./skill/directoryApply.js\";\nimport { loadN8nTool } from \"./n8n/N8nLoader.js\";\nimport { applyLoadedToSpec as applyN8n, directoryMarker as markerN8n } from \"./n8n/directoryApply.js\";\nimport { LANGCHAIN_DIR_NAME } from \"./langchain/types.js\";\nimport { SKILL_DIR_NAME } from \"./skill/types.js\";\n\n// --- Directory discovery (loaders / markers / apply) ---\n\nconst DIRECTORY_KINDS = [\"mcp\", \"langchain\", \"skill\", \"n8n\"] as const;\n\nexport const DIRECTORY_DISCOVERABLE_KINDS = DIRECTORY_KINDS;\n\nexport const DIRECTORY_KIND_MARKERS = [\n markerSkill,\n markerN8n,\n markerMcp,\n] as const;\n\nexport type DirectoryLoader = (\n dirPath: string,\n manifest: ToolManifest,\n extensions: string[],\n) => Promise<LoadedTool | LoadedTool[]>;\n\nconst DIRECTORY_LOADERS: Record<(typeof DIRECTORY_KINDS)[number], DirectoryLoader> = {\n mcp: async (dirPath, manifest) => [await loadMCPTool(dirPath, manifest)],\n langchain: async (dirPath, manifest, ext) => [await loadLangChainTool(dirPath, manifest, ext)],\n skill: (dirPath, manifest, ext) => loadSkillTools(dirPath, manifest, ext),\n n8n: async (dirPath, manifest) => [await loadN8nTool(dirPath, manifest)],\n};\n\nexport function getDirectoryLoader(kind: (typeof DIRECTORY_KINDS)[number]): DirectoryLoader {\n const loader = DIRECTORY_LOADERS[kind];\n if (!loader) {\n throw new DiscoveryError(\"\", \"manifest\", `Unknown directory tool kind: \"${kind}\"`);\n }\n return loader;\n}\n\nexport function applyDirectoryLoadedToSpec(\n spec: ToolSpec,\n loaded: LoadedTool,\n manifest: ToolManifest,\n defaultDirName: string,\n namespace: string,\n): void {\n switch (manifest.kind) {\n case \"mcp\":\n return applyMcp(spec, loaded, manifest, defaultDirName, namespace);\n case \"langchain\":\n return applyLangchain(spec, loaded, manifest, defaultDirName, namespace);\n case \"skill\":\n return applySkill(spec, loaded, manifest, defaultDirName, namespace);\n case \"n8n\":\n return applyN8n(spec, loaded, manifest, defaultDirName, namespace);\n default:\n break;\n }\n}\n\n// --- discoverTools: dispatch by kind to each type's scanner ---\n\nexport async function discoverTools(\n type: DiscoverableKind,\n projectPath: string,\n options: DiscoverToolsOptions = {},\n): Promise<DiscoverToolsResult> {\n const root = path.resolve(projectPath);\n switch (type) {\n case \"function\":\n return scanFunction(root, options);\n case \"skill\":\n return scanSkill(root, options);\n case \"n8n\":\n return scanN8n(root, options);\n case \"mcp\":\n return scanMcp(root, options);\n case \"langchain\":\n return scanLangchain(root, options);\n default: {\n const _: never = type;\n return _;\n }\n }\n}\n\nexport { LANGCHAIN_DIR_NAME } from \"./langchain/types.js\";\nexport { SKILL_DIR_NAME } from \"./skill/types.js\";\n\n// --- DirectoryScanner ---\n\nconst DEFAULT_EXTENSIONS = [\".js\", \".mjs\"];\n\n/**\n * Scans filesystem directories for tool definitions.\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 async scan(): Promise<ToolSpec[]> {\n const specs: ToolSpec[] = [];\n for (const root of this.roots) {\n const rootSpecs = await this.scanRoot(root.path, root.namespace);\n specs.push(...rootSpecs);\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 private async scanRecursive(dirPath: string, namespace: string): Promise<ToolSpec[]> {\n const specs: ToolSpec[] = [];\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) specs.push(...loadedSpecs);\n } catch (error) {\n this.onError?.(dirPath, error as Error);\n }\n\n for (const entry of dirEntries) {\n if (!entry.isDirectory) continue;\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 return specs;\n }\n\n private async loadToolDir(\n dirPath: string,\n dirName: string,\n namespace: string,\n ): Promise<ToolSpec[]> {\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) return [];\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 loadLangChainToolsFromDir(\n dirPath,\n dirName,\n inferred,\n false,\n namespace,\n this.extensions,\n LANGCHAIN_DIR_NAME,\n (loaded, nameHint, dp, ns) => this.toToolSpec(loaded, nameHint, dp, ns),\n this.onError,\n );\n }\n if (inferred.kind === \"skill\") {\n const loadedList = await loadSkillTools(dirPath, inferred, this.extensions);\n return loadedList.map((loaded: LoadedTool) =>\n this.toToolSpec(loaded, dirName, dirPath, namespace),\n );\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(dirPath, \"manifest\", \"Invalid JSON in tool.json\", err as Error);\n }\n if (!manifest.kind) {\n throw new DiscoveryError(dirPath, \"manifest\", `tool.json must have a \"kind\" field`);\n }\n if (manifest.enabled === false) return [];\n\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 loadLangChainToolsFromDir(\n dirPath,\n dirName,\n manifest,\n true,\n namespace,\n this.extensions,\n LANGCHAIN_DIR_NAME,\n (loaded, nameHint, dp, ns) => this.toToolSpec(loaded, nameHint, dp, ns),\n this.onError,\n );\n }\n if (manifest.kind === \"skill\") {\n const loadedList = await loadSkillTools(dirPath, manifest, this.extensions);\n return loadedList.map((loaded: LoadedTool) =>\n this.toToolSpec(loaded, dirName, dirPath, namespace),\n );\n }\n const loaded = await this.loadByKind(dirPath, manifest);\n return [this.toToolSpec(loaded, dirName, dirPath, namespace)];\n }\n\n private async inferManifest(dirPath: string, dirName: string): Promise<ToolManifest | null> {\n const kinds: ToolManifest[\"kind\"][] = [];\n\n for (const m of DIRECTORY_KIND_MARKERS) {\n if (await this.fileExists(join(dirPath, m.markerFile))) kinds.push(m.kind);\n }\n\n const isLangchainDir = dirName === LANGCHAIN_DIR_NAME;\n const hasLangchain =\n isLangchainDir\n ? (await listLangchainEntryFiles(dirPath, this.extensions)).length > 0\n : dirName !== SKILL_DIR_NAME && (await this.hasEntryPoint(dirPath, \"index\"));\n if (hasLangchain) kinds.push(\"langchain\");\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 const kind = kinds[0]!;\n const manifest: ToolManifest = { kind };\n const marker = DIRECTORY_KIND_MARKERS.find((m) => m.kind === kind);\n if (marker) {\n manifest.entryPoint = marker.defaultEntryPoint;\n }\n if (kind === \"langchain\" && !isLangchainDir) manifest.entryPoint = \"index\";\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 loadByKind(dirPath: string, manifest: ToolManifest): Promise<LoadedTool> {\n const kind = manifest.kind as (typeof DIRECTORY_DISCOVERABLE_KINDS)[number];\n const loader = getDirectoryLoader(kind);\n const result = await loader(dirPath, manifest, this.extensions);\n const list = Array.isArray(result) ? result : [result];\n if (list.length === 0) {\n throw new DiscoveryError(dirPath, \"load\", \"No tools loaded\", new Error(\"empty\"));\n }\n return list[0]!;\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(DIRECTORY_DISCOVERABLE_KINDS);\n const parentName = basename(join(dirPath, \"..\"));\n const isKindDir = kindDirNames.has(dirName as (typeof DIRECTORY_DISCOVERABLE_KINDS)[number]);\n const defaultDirName = isKindDir ? parentName : dirName;\n const inferredName = isKindDir\n ? `${namespace}/${defaultDirName}-${dirName}`\n : `${namespace}/${defaultDirName}`;\n const name = manifest.name ?? inferredName;\n const spec = this.buildBaseSpec(manifest, name, dirName);\n applyDirectoryLoadedToSpec(spec, loaded, manifest, defaultDirName, namespace);\n return spec;\n }\n\n private buildBaseSpec(\n manifest: ToolManifest,\n name: string,\n dirName: string,\n ): ToolSpec {\n return {\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 ?? { type: \"object\", additionalProperties: true },\n outputSchema: manifest.outputSchema ?? { type: \"object\", additionalProperties: true },\n capabilities: manifest.capabilities ?? [],\n costHints: manifest.costHints,\n };\n }\n}\n","/**\n * Create PTCRuntime + ToolRegistry from config (sync or async).\n * Registers extension adapters when coreTools options are provided.\n * Agent-tool does NOT depend on any specific extension. When configFilePath (tool.yaml)\n * lists npm:@scope/pkg, that package is loaded from cache or node_modules. The framework\n * calls the package's default export contract: register(registry, options) -> ToolAdapter.\n * Extensions implement this contract (e.g. via createExtension from this package).\n *\n * Npm: we always register npm extensions with a concrete version in the registry (never \"latest\").\n * When the descriptor omits version or uses @latest, we resolve to the actual latest from the\n * registry (resolveLatestVersionFromRegistry) and use that version for the registry prefix.\n */\n\nimport { createRequire } from \"node:module\";\nimport { join, resolve, isAbsolute, basename, dirname } from \"node:path\";\nimport { existsSync, readFileSync, statSync } from \"node:fs\";\nimport { pathToFileURL } from \"node:url\";\nimport { ToolRegistry } from \"../core/registry/ToolRegistry.js\";\nimport { PTCRuntime } from \"../core/runtime/PTCRuntime.js\";\nimport type { ToolAdapter, ToolSpec, ToolKind } from \"../core/types/ToolSpec.js\";\nimport { normalizeToolName } from \"../core/types/ToolSpec.js\";\nimport { setSandboxValidationEnabled } from \"../security/sandbox.js\";\nimport { DirectoryScanner } from \"../tools/discoveryFactory.js\";\nimport { loadToolConfig, getCacheBaseFromToolConfig } from \"../tools/util/toolConfig.js\";\nimport {\n npmDescriptorToRegistryPrefix,\n fileDescriptorToRegistryPrefix,\n parseToolPath,\n} from \"../tools/util/toolDescriptor.js\";\nimport {\n ensurePackageInCache,\n getPackageEntryPath,\n importFromCache,\n resolveLatestVersionFromRegistry,\n} from \"../utils/npmCache.js\";\n\nconst requireFromPackage = createRequire(import.meta.url);\n\nfunction getProjectRequire(): NodeRequire | null {\n const cwd = process.cwd();\n if (existsSync(join(cwd, \"package.json\"))) return createRequire(join(cwd, \"package.json\"));\n if (existsSync(join(cwd, \"tool.yaml\"))) return createRequire(join(cwd, \"tool.yaml\"));\n return null;\n}\n\nfunction findNearestPackageJson(startDir: string): string | null {\n let dir = resolve(startDir);\n while (true) {\n const pkg = join(dir, \"package.json\");\n if (existsSync(pkg)) return pkg;\n const parent = dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\n/**\n * Default package names tried when loading an extension from node_modules (no tool.yaml).\n * Empty by default so agent-tool does not depend on any specific extension package.\n * Extensions are loaded only via tool.yaml (npm: entries) or when explicitly configured.\n */\nexport const DEFAULT_EXTENSION_PACKAGES: string[] = [];\n\n/** Config passed to extension's register(registry, options). */\nexport interface CoreToolsUserConfig {\n sandboxRoot?: string;\n /** Whether to enforce sandbox boundary checks in fs path resolution. Default: false. */\n enableSandboxValidation?: boolean;\n /** Allowed hosts (e.g. [\"*\"] or [\"api.github.com\"]). Merged with tool.yaml. */\n allowedHosts?: string[];\n /** Block these hosts even if allowed. Merged with tool.yaml. */\n blockedHosts?: string[];\n /** CIDR ranges to block for HTTP (SSRF). Overrides extension default when set. */\n blockedCidrs?: string[];\n /** Per-tool config overrides. Keys: short name (\"fs.listDir\"), package-scoped (\"npm.easynet.agent.tool.buildin::fs.listDir\", survives version bumps), or full registry name. Use package-scoped or full when different packages share the same short name. */\n toolOverrides?: Record<string, Record<string, unknown>>;\n /** Package-level defaults. Key = package prefix (e.g. \"npm.easynet.agent.tool.buildin\"); value = key-value merged into ctx.config for every tool in that package. */\n packageDefaults?: Record<string, Record<string, unknown>>;\n /** Shared services injected into extension tool context config (e.g. modelHub). */\n services?: Record<string, unknown>;\n}\n\n/** Config for example-tools extension when present. */\nexport interface ExampleToolsUserConfig {\n allowedHosts?: string[];\n}\n\nexport interface CreateRuntimeOptions {\n /** Path to tool.yaml (optional; used by createAgentTools to filter tool list) */\n configFilePath?: string;\n /** Project path for async tool loading (optional; reserved for future use) */\n projectPath?: string;\n /** Sandbox / core tools config; when set, core adapter is registered */\n coreTools?: CoreToolsUserConfig;\n /** Example tools config; when set, example adapter is registered */\n exampleTools?: ExampleToolsUserConfig;\n /** When set, step messages are written here (e.g. for --verbose CLI). */\n stepLog?: (message: string) => void;\n}\n\nexport interface CreateRuntimeResult {\n runtime: PTCRuntime;\n registry: ToolRegistry;\n}\n\n/** Get installed package version by resolving package.json from the same requirers used to load the extension. */\nfunction getInstalledPackageVersion(packageName: string): string | null {\n const projectRequire = getProjectRequire();\n const requirers: NodeRequire[] = [requireFromPackage];\n if (projectRequire) requirers.push(projectRequire);\n for (const req of requirers) {\n try {\n const pkgJsonPath = req.resolve(`${packageName}/package.json`);\n const json = readFileSync(pkgJsonPath, \"utf-8\");\n const pkg = JSON.parse(json) as { version?: string };\n return pkg.version ?? null;\n } catch {\n continue;\n }\n }\n return null;\n}\n\ntype RegisterFn = (r: ToolRegistry, c: CoreToolsUserConfig) => unknown;\ntype LoadedExtension = { register: RegisterFn; descriptor: string; resolvedVersion: string };\ntype LoadedLocalDirectory = { specs: ToolSpec[]; descriptor: string; resolvedVersion: string };\n\nfunction hasInvokeFunction(value: unknown): value is { invoke: (args: unknown) => Promise<unknown> } {\n return (\n value != null &&\n typeof value === \"object\" &&\n \"invoke\" in value &&\n typeof (value as { invoke?: unknown }).invoke === \"function\"\n );\n}\n\nfunction normalizeToolOutput(output: unknown): { result: unknown; raw?: unknown } {\n if (output != null && typeof output === \"object\" && \"result\" in (output as Record<string, unknown>)) {\n const o = output as { result: unknown; evidence?: unknown };\n const evidence = Array.isArray(o.evidence) ? o.evidence : undefined;\n return evidence ? { result: o.result, raw: { evidence } } : { result: o.result };\n }\n return { result: output };\n}\n\nfunction createLocalDirectoryAdapter(kind: ToolKind): ToolAdapter {\n return {\n kind,\n async invoke(spec, args, ctx) {\n if (spec.kind === \"skill\") {\n const impl = spec.impl as\n | {\n handler?: unknown;\n frontmatter?: { name?: string; description?: string };\n instructions?: string;\n dirPath?: string;\n }\n | undefined;\n if (hasInvokeFunction(impl)) {\n const out = await impl.invoke(args);\n return normalizeToolOutput(out);\n }\n const handler = typeof impl?.handler === \"function\"\n ? impl.handler\n : typeof spec.impl === \"function\"\n ? spec.impl\n : undefined;\n if (typeof handler !== \"function\") {\n throw new Error(`Local skill ${spec.name} has no executable handler`);\n }\n const out = await (handler as (a: unknown, c: unknown) => Promise<unknown>)(args, {\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n skill: {\n name: impl?.frontmatter?.name ?? spec.name,\n description: impl?.frontmatter?.description ?? spec.description ?? \"\",\n instructions: impl?.instructions ?? \"\",\n resources: [],\n readResource: async () => \"\",\n getResourcesByType: () => [],\n dirPath: impl?.dirPath ?? \"\",\n },\n });\n return normalizeToolOutput(out);\n }\n\n if (spec.kind === \"langchain\") {\n if (!hasInvokeFunction(spec.impl)) {\n throw new Error(`Local langchain tool ${spec.name} missing invoke()`);\n }\n const out = await spec.impl.invoke(args);\n return normalizeToolOutput(out);\n }\n\n if (spec.kind === \"n8n\") {\n if (!spec.endpoint) {\n throw new Error(`Local n8n tool ${spec.name} missing endpoint/webhook URL`);\n }\n const res = await fetch(spec.endpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(args ?? {}),\n });\n if (!res.ok) {\n throw new Error(`n8n request failed (${res.status})`);\n }\n const text = await res.text();\n if (!text.trim()) return { result: {} };\n try {\n return { result: JSON.parse(text) };\n } catch {\n return { result: text };\n }\n }\n\n if (spec.kind === \"function\") {\n const meta = spec._meta as { sourcePath?: string; projectPath?: string; exportName?: string } | undefined;\n if (!meta?.sourcePath || !meta?.exportName || !meta?.projectPath) {\n throw new Error(`Local function ${spec.name} missing sourcePath/exportName/projectPath`);\n }\n const source = resolve(meta.projectPath, meta.sourcePath);\n const mod = await import(pathToFileURL(source).href);\n const fn = mod[meta.exportName];\n if (typeof fn !== \"function\") {\n throw new Error(`Local function ${spec.name} export \"${meta.exportName}\" is not a function`);\n }\n const out = await fn(args);\n return normalizeToolOutput(out);\n }\n\n throw new Error(`Local directory tool kind not supported for invoke: ${spec.kind}`);\n },\n };\n}\n\nfunction resolveFileDescriptorPath(descriptor: string, configFilePath: string): string | null {\n const parsed = parseToolPath(descriptor.trim());\n if (!parsed || parsed.protocol !== \"file\") return null;\n const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);\n const configDir = dirname(localPath);\n return resolve(configDir, `${parsed.scope}/${parsed.packageWithVersion}`);\n}\n\n/** Backward compat: extensions may export register or registerCoreTools. */\nfunction getRegisterFn(mod: { register?: RegisterFn; registerCoreTools?: RegisterFn }): RegisterFn | undefined {\n return mod?.register ?? mod?.registerCoreTools;\n}\n\n/** Load an extension from node_modules (e.g. for testing). Tries DEFAULT_EXTENSION_PACKAGES. */\nfunction loadExtensionFromNodeModules(): {\n register: RegisterFn;\n packageName: string;\n} | null {\n const projectRequire = getProjectRequire();\n const requirers: NodeRequire[] = [requireFromPackage];\n if (projectRequire) requirers.push(projectRequire);\n for (const req of requirers) {\n for (const pkg of DEFAULT_EXTENSION_PACKAGES) {\n try {\n const mod = req(pkg) as { register?: RegisterFn; registerCoreTools?: RegisterFn };\n const fn = getRegisterFn(mod);\n if (typeof fn === \"function\") return { register: fn, packageName: pkg };\n } catch {\n continue;\n }\n }\n }\n return null;\n}\n\n/** Registry wrapper that prefixes every registered tool name (e.g. npm.easynet.agent.tool.buildin.latest.). */\nfunction createPrefixingRegistry(\n registry: ToolRegistry,\n prefix: string,\n): ToolRegistry {\n return {\n register(spec: ToolSpec) {\n registry.register({\n ...spec,\n name: prefix + normalizeToolName(spec.name),\n });\n },\n bulkRegister(specs: ToolSpec[]) {\n specs.forEach((s) => this.register(s));\n },\n unregister(name: string) {\n return registry.unregister(name);\n },\n get(name: string) {\n return registry.get(name);\n },\n has(name: string) {\n return registry.has(name);\n },\n search(query: Parameters<ToolRegistry[\"search\"]>[0]) {\n return registry.search(query);\n },\n list() {\n return registry.list();\n },\n get size() {\n return registry.size;\n },\n snapshot() {\n return registry.snapshot();\n },\n clear() {\n return registry.clear();\n },\n } as ToolRegistry;\n}\n\n/** Parse npm: descriptor (e.g. \"npm:@easynet/agent-tool-buildin@0.0.1\" or \"npm:@easynet/agent-tool-buildin\") to package name and version. No version => \"latest\". */\nexport function parseNpmDescriptor(entry: string): { packageName: string; version: string } | null {\n if (typeof entry !== \"string\" || !entry.startsWith(\"npm:\")) return null;\n const rest = entry.slice(4).trim();\n const at = rest.indexOf(\"@\", 1);\n if (at < 0) return { packageName: rest, version: \"latest\" };\n const packageName = rest.slice(0, at);\n const version = rest.slice(at + 1).split(\"#\")[0]?.trim() || \"latest\";\n return { packageName, version };\n}\n\n/** Load one extension for file: descriptor (local folder with package.json and dist/ or main entry). */\nfunction loadExtensionFromFileDescriptorSync(\n descriptor: string,\n configFilePath: string,\n stepLog?: (message: string) => void,\n): { register: RegisterFn; descriptor: string; resolvedVersion: string } | null {\n const entryStr = descriptor.trim();\n const path = parseToolPath(entryStr);\n if (!path || path.protocol !== \"file\") return null;\n const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);\n const configDir = dirname(localPath);\n const pathPart = `${path.scope}/${path.packageWithVersion}`;\n const resolvedPath = resolve(configDir, pathPart);\n if (!existsSync(resolvedPath) || !statSync(resolvedPath).isDirectory()) return null;\n try {\n const entryPath = getPackageEntryPath(resolvedPath);\n const req = createRequire(join(resolvedPath, \"package.json\"));\n const mod = req(entryPath) as { register?: RegisterFn; registerCoreTools?: RegisterFn };\n const fn = getRegisterFn(mod);\n if (typeof fn === \"function\") {\n if (stepLog) stepLog(`Loaded local extension from ${resolvedPath}`);\n return { register: fn, descriptor: entryStr, resolvedVersion: \"local\" };\n }\n } catch {\n // ignore\n }\n return null;\n}\n\n/** Load one extension for a single npm descriptor (node_modules if version matches, else cache). */\nfunction loadExtensionForDescriptorSync(\n descriptor: string,\n configFilePath: string,\n stepLog?: (message: string) => void,\n): { register: RegisterFn; descriptor: string; resolvedVersion: string } | null {\n const entryStr = descriptor.trim();\n const parsed = parseNpmDescriptor(entryStr);\n if (!parsed) return null;\n const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);\n const configDir = dirname(localPath);\n const packageJsonPath = findNearestPackageJson(configDir);\n const configRequire = packageJsonPath ? createRequire(packageJsonPath) : null;\n const npmCwd = packageJsonPath ? dirname(packageJsonPath) : configDir;\n\n if (configRequire) {\n try {\n const mod = configRequire(parsed.packageName) as { register?: RegisterFn; registerCoreTools?: RegisterFn };\n const fn = getRegisterFn(mod);\n if (typeof fn === \"function\") {\n const installed = getInstalledPackageVersionFromRequire(parsed.packageName, configRequire);\n const requested = parsed.version === \"latest\" || !parsed.version?.trim() ? null : parsed.version;\n const resolvedVersion = requested === null\n ? resolveLatestVersionFromRegistry(parsed.packageName, { cwd: npmCwd })\n : requested;\n if (installed === resolvedVersion) {\n if (stepLog) stepLog(`Loaded ${parsed.packageName}@${resolvedVersion} from node_modules`);\n return { register: fn, descriptor: entryStr, resolvedVersion };\n }\n }\n } catch {\n // fall through to cache\n }\n }\n\n const cacheBase = getCacheBaseFromToolConfig(localPath);\n const cacheOptions = cacheBase ? [{ cacheBase, cwd: npmCwd }, { cwd: npmCwd }] : [{ cwd: npmCwd }];\n for (const opts of cacheOptions) {\n try {\n const cacheDir = ensurePackageInCache(parsed.packageName, parsed.version, opts as Parameters<typeof ensurePackageInCache>[2]);\n if (stepLog) stepLog(`Loaded ${parsed.packageName} from cache: ${cacheDir}`);\n const entryPath = getPackageEntryPath(cacheDir);\n const req = createRequire(join(cacheDir, \"package.json\"));\n const mod = req(entryPath) as { register?: RegisterFn; registerCoreTools?: RegisterFn };\n const fn = getRegisterFn(mod);\n if (typeof fn === \"function\") {\n const resolvedVersion = basename(cacheDir);\n return { register: fn, descriptor: entryStr, resolvedVersion };\n }\n break;\n } catch {\n if (cacheBase && \"cacheBase\" in opts) continue;\n break;\n }\n }\n return null;\n}\n\n/** Load all extensions for npm: entries in tool.yaml (sync). Same package at different versions each get one entry. */\nfunction loadAllExtensionsFromToolYamlSync(\n configFilePath: string,\n stepLog?: (message: string) => void,\n): { register: RegisterFn; descriptor: string; resolvedVersion: string }[] {\n const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);\n if (!existsSync(localPath)) return [];\n const config = loadToolConfig(localPath);\n const tools = config.tools;\n if (!Array.isArray(tools) || tools.length === 0) return [];\n if (stepLog) stepLog(\"Loading extensions from tool.yaml (npm + file)\");\n const loaded: { register: RegisterFn; descriptor: string; resolvedVersion: string }[] = [];\n for (const entry of tools) {\n const entryStr = String(entry).trim();\n if (entryStr.startsWith(\"npm:\")) {\n const result = loadExtensionForDescriptorSync(entryStr, configFilePath, stepLog);\n if (result) loaded.push(result);\n } else if (entryStr.startsWith(\"file:\")) {\n const result = loadExtensionFromFileDescriptorSync(entryStr, configFilePath, stepLog);\n if (result) loaded.push(result);\n }\n }\n return loaded;\n}\n\n/** Load extension from tool.yaml npm: entry using node_modules next to the config file (sync). Returns first successful load. */\nfunction loadExtensionFromToolYamlNodeModules(\n configFilePath: string,\n stepLog?: (message: string) => void,\n): { register: RegisterFn; descriptor: string; resolvedVersion: string } | null {\n const all = loadAllExtensionsFromToolYamlSync(configFilePath, stepLog);\n const first = all[0];\n return first ?? null;\n}\n\n/** Get installed package version using a specific require (e.g. from config dir). */\nfunction getInstalledPackageVersionFromRequire(packageName: string, req: NodeRequire): string | null {\n try {\n const pkgJsonPath = req.resolve(`${packageName}/package.json`);\n const json = readFileSync(pkgJsonPath, \"utf-8\");\n const pkg = JSON.parse(json) as { version?: string };\n return pkg.version ?? null;\n } catch {\n return null;\n }\n}\n\n/** Load one extension for a single npm descriptor (async: node_modules if version matches, else cache). */\nasync function loadExtensionForDescriptorAsync(\n descriptor: string,\n configFilePath: string,\n stepLog?: (message: string) => void,\n): Promise<{ register: RegisterFn; descriptor: string; resolvedVersion: string } | null> {\n const syncResult = loadExtensionForDescriptorSync(descriptor, configFilePath, stepLog);\n if (syncResult) return syncResult;\n const entryStr = descriptor.trim();\n const parsed = parseNpmDescriptor(entryStr);\n if (!parsed) return null;\n const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);\n const configDir = dirname(localPath);\n const packageJsonPath = findNearestPackageJson(configDir);\n const configRequire = packageJsonPath ? createRequire(packageJsonPath) : null;\n const npmCwd = packageJsonPath ? dirname(packageJsonPath) : configDir;\n if (configRequire) {\n try {\n const installed = getInstalledPackageVersionFromRequire(parsed.packageName, configRequire);\n const requested = parsed.version === \"latest\" || !parsed.version?.trim() ? null : parsed.version;\n const resolvedVersion = requested === null\n ? resolveLatestVersionFromRegistry(parsed.packageName, { cwd: npmCwd })\n : requested;\n if (installed === resolvedVersion) {\n const pkgJsonResolved = configRequire.resolve(`${parsed.packageName}/package.json`);\n const packageRoot = dirname(pkgJsonResolved);\n const entryPath = getPackageEntryPath(packageRoot);\n const mod = (await import(pathToFileURL(entryPath).href)) as {\n register?: RegisterFn;\n registerCoreTools?: RegisterFn;\n };\n const fn = getRegisterFn(mod);\n if (typeof fn === \"function\") {\n if (stepLog) stepLog(`Loaded ${parsed.packageName}@${resolvedVersion} from node_modules (async import)`);\n return { register: fn, descriptor: entryStr, resolvedVersion };\n }\n }\n } catch {\n // fall through to cache\n }\n }\n const cacheBase = getCacheBaseFromToolConfig(localPath);\n const cacheOptions = cacheBase ? [{ cacheBase, cwd: npmCwd }, { cwd: npmCwd }] : [{ cwd: npmCwd }];\n for (const opts of cacheOptions) {\n try {\n const cacheDir = ensurePackageInCache(parsed.packageName, parsed.version, opts as Parameters<typeof ensurePackageInCache>[2]);\n if (stepLog) stepLog(`Loaded ${parsed.packageName} from cache (async): ${cacheDir}`);\n const mod = (await importFromCache(cacheDir)) as { register?: RegisterFn; registerCoreTools?: RegisterFn };\n const fn = getRegisterFn(mod);\n if (typeof fn === \"function\") {\n const resolvedVersion = basename(cacheDir);\n return { register: fn, descriptor: entryStr, resolvedVersion };\n }\n break;\n } catch {\n if (cacheBase && \"cacheBase\" in opts) continue;\n break;\n }\n }\n return null;\n}\n\n/** Load local directory tools for file: descriptor when it's not an extension package. */\nasync function loadLocalDirectoryForFileDescriptor(\n descriptor: string,\n configFilePath: string,\n stepLog?: (message: string) => void,\n): Promise<LoadedLocalDirectory | null> {\n const resolvedPath = resolveFileDescriptorPath(descriptor, configFilePath);\n if (!resolvedPath || !existsSync(resolvedPath) || !statSync(resolvedPath).isDirectory()) return null;\n if (existsSync(join(resolvedPath, \"package.json\"))) return null;\n\n const scanErrors: string[] = [];\n const scanner = new DirectoryScanner({\n roots: [{ path: resolvedPath, namespace: \"local\" }],\n onError: (toolDir, error) => scanErrors.push(`${toolDir}: ${error.message}`),\n });\n const specs = await scanner.scan();\n if (scanErrors.length > 0 && stepLog) {\n stepLog(`Local directory scan (${descriptor}) reported ${scanErrors.length} error(s)`);\n }\n if (specs.length === 0) return null;\n if (stepLog) {\n stepLog(`Loaded ${specs.length} local tool(s) from ${descriptor}`);\n }\n return {\n specs,\n descriptor: descriptor.trim(),\n resolvedVersion: \"local\",\n };\n}\n\n/** Load all extensions for npm: and file: entries in tool.yaml (async). */\nasync function loadAllExtensionsFromToolYamlAsync(\n configFilePath: string,\n stepLog?: (message: string) => void,\n): Promise<Array<LoadedExtension | LoadedLocalDirectory>> {\n const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);\n if (!existsSync(localPath)) return [];\n const config = loadToolConfig(localPath);\n const tools = config.tools;\n if (!Array.isArray(tools) || tools.length === 0) return [];\n if (stepLog) stepLog(\"Loading extensions from tool.yaml (async)\");\n const loaded: Array<LoadedExtension | LoadedLocalDirectory> = [];\n for (const entry of tools) {\n const entryStr = String(entry).trim();\n if (entryStr.startsWith(\"npm:\")) {\n const result = await loadExtensionForDescriptorAsync(entryStr, configFilePath, stepLog);\n if (result) loaded.push(result);\n } else if (entryStr.startsWith(\"file:\")) {\n const result = loadExtensionFromFileDescriptorSync(entryStr, configFilePath, stepLog);\n if (result) {\n loaded.push(result);\n } else {\n const local = await loadLocalDirectoryForFileDescriptor(entryStr, configFilePath, stepLog);\n if (local) loaded.push(local);\n }\n }\n }\n return loaded;\n}\n\n/**\n * Create runtime and registry synchronously. Registers core/example adapters\n * only when coreTools/exampleTools are provided (opt-in). If extension packages\n * are not installed, those adapters are skipped (runtime still works with empty/minimal tools).\n */\nexport function createRuntimeFromConfigSync(options: CreateRuntimeOptions = {}): CreateRuntimeResult {\n const registry = new ToolRegistry();\n const stepLog = options.stepLog;\n setSandboxValidationEnabled(options.coreTools?.enableSandboxValidation === true);\n\n if (options.coreTools !== undefined) {\n if (options.configFilePath) {\n const all = loadAllExtensionsFromToolYamlSync(options.configFilePath, stepLog);\n if (all.length > 0) {\n if (stepLog) stepLog(`Registered ${all.length} extension(s) from tool.yaml`);\n const runtime = new PTCRuntime({ registry });\n for (const ext of all) {\n const before = new Set(registry.snapshot().map((s) => s.name));\n const prefix = ext.descriptor.startsWith(\"file:\")\n ? fileDescriptorToRegistryPrefix(ext.descriptor)\n : npmDescriptorToRegistryPrefix(ext.descriptor, ext.resolvedVersion);\n const reg = createPrefixingRegistry(registry, prefix ?? \"\");\n const adapter = ext.register(reg, options.coreTools) as ToolAdapter;\n runtime.registerAdapter(adapter);\n const registeredNow = registry\n .snapshot()\n .map((s) => s.name)\n .filter((name) => !before.has(name));\n runtime.registerAdapterForTools(registeredNow, adapter);\n }\n return { runtime, registry };\n }\n }\n if (stepLog) stepLog(\"Trying extension from node_modules\");\n const extensionNode = loadExtensionFromNodeModules();\n if (extensionNode) {\n if (stepLog) stepLog(\"Registered extension from node_modules\");\n const descriptor = `npm:${extensionNode.packageName}`;\n const resolvedVersion =\n getInstalledPackageVersion(extensionNode.packageName) ??\n resolveLatestVersionFromRegistry(extensionNode.packageName);\n const before = new Set(registry.snapshot().map((s) => s.name));\n const prefix = npmDescriptorToRegistryPrefix(descriptor, resolvedVersion);\n const reg = createPrefixingRegistry(registry, prefix ?? \"\");\n const coreAdapter = extensionNode.register(reg, options.coreTools) as ToolAdapter;\n const runtime = new PTCRuntime({ registry });\n runtime.registerAdapter(coreAdapter);\n const registeredNow = registry\n .snapshot()\n .map((s) => s.name)\n .filter((name) => !before.has(name));\n runtime.registerAdapterForTools(registeredNow, coreAdapter);\n return { runtime, registry };\n }\n const runtime = new PTCRuntime({ registry });\n return { runtime, registry };\n }\n\n const runtime = new PTCRuntime({ registry });\n return { runtime, registry };\n}\n\n/**\n * Create runtime and registry asynchronously. When configFilePath (tool.yaml) lists npm: packages:\n * 1. Try loading from project node_modules (sync, fast).\n * 2. If not found, dynamically load from cache: fetch via npm pack into cache, then dynamic import (works for ESM).\n * 3. Otherwise fall back to sync path (DEFAULT_EXTENSION_PACKAGES, sync cache).\n */\nexport async function createRuntimeFromConfig(\n options: CreateRuntimeOptions = {}\n): Promise<CreateRuntimeResult> {\n setSandboxValidationEnabled(options.coreTools?.enableSandboxValidation === true);\n if (options.coreTools !== undefined && options.configFilePath) {\n const all = await loadAllExtensionsFromToolYamlAsync(options.configFilePath, options.stepLog);\n if (all.length > 0) {\n if (options.stepLog) options.stepLog(`Registered ${all.length} extension(s) from tool.yaml`);\n const registry = new ToolRegistry();\n const runtime = new PTCRuntime({ registry });\n for (const ext of all) {\n const before = new Set(registry.snapshot().map((s) => s.name));\n const prefix = ext.descriptor.startsWith(\"file:\")\n ? fileDescriptorToRegistryPrefix(ext.descriptor)\n : npmDescriptorToRegistryPrefix(ext.descriptor, ext.resolvedVersion);\n const reg = createPrefixingRegistry(registry, prefix ?? \"\");\n if (\"register\" in ext) {\n const adapter = ext.register(reg, options.coreTools) as ToolAdapter;\n runtime.registerAdapter(adapter);\n const registeredNow = registry\n .snapshot()\n .map((s) => s.name)\n .filter((name) => !before.has(name));\n runtime.registerAdapterForTools(registeredNow, adapter);\n } else {\n reg.bulkRegister(ext.specs);\n const registeredNow = registry\n .snapshot()\n .map((s) => s.name)\n .filter((name) => !before.has(name));\n const byKind = new Map<ToolKind, string[]>();\n for (const toolName of registeredNow) {\n const spec = registry.get(toolName);\n if (!spec) continue;\n const list = byKind.get(spec.kind) ?? [];\n list.push(toolName);\n byKind.set(spec.kind, list);\n }\n for (const [kind, names] of byKind.entries()) {\n const adapter = createLocalDirectoryAdapter(kind);\n runtime.registerAdapter(adapter);\n runtime.registerAdapterForTools(names, adapter);\n }\n }\n }\n return { runtime, registry };\n }\n }\n return createRuntimeFromConfigSync(options);\n}\n","/**\n * Expose tools as OpenAPI (Swagger) spec and optional HTTP server.\n * Same tools can be used via LangChain, MCP, or REST.\n */\n\nimport type { ToolRegistry } from \"../../core/registry/ToolRegistry.js\";\nimport type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport { enrichSpecWithCanonicalSchema } from \"../../tools/util/canonicalCoreSchemas.js\";\n\nexport interface OpenAPISpecOptions {\n /** API title (default: \"Tool API\") */\n title?: string;\n /** API version (default: \"1.0.0\") */\n version?: string;\n /** Base path for the API (default: \"\") */\n basePath?: string;\n}\n\n/** Tool name to URL path segment: \"core.fs.readText\" -> \"core~fs~readText\" (dots to ~ in path) */\nexport function toolNameToSlug(name: string): string {\n return name.replace(/\\./g, \"~\");\n}\n\n/** URL path segment back to tool name: \"core~fs~readText\" -> \"core.fs.readText\" */\nexport function slugToToolName(slug: string): string {\n return slug.replace(/~/g, \".\");\n}\n\n/** Safe schema key for components: \"core.fs.readText\" -> \"Tool_core_fs_readText\" */\nfunction toolSchemaKey(name: string): string {\n return `Tool_${name.replace(/[^a-zA-Z0-9_]/g, \"_\")}`;\n}\n\nconst resultSchema = {\n type: \"object\" as const,\n properties: {\n result: { description: \"Tool return value\", additionalProperties: true },\n },\n};\nconst errorSchema = {\n type: \"object\" as const,\n properties: {\n error: { type: \"string\" },\n kind: { type: \"string\" },\n details: { type: \"object\", additionalProperties: true },\n },\n};\n\n/**\n * Build OpenAPI 3.0 document from the tool registry.\n * GET /tools, POST /invoke (generic), and one POST /invoke/{toolSlug} per tool with that tool's input schema.\n */\nexport function toolsToOpenAPISpec(\n registry: ToolRegistry,\n options: OpenAPISpecOptions = {}\n): Record<string, unknown> {\n const title = options.title ?? \"Tool API\";\n const version = options.version ?? \"1.0.0\";\n const basePath = (options.basePath ?? \"\").replace(/\\/$/, \"\");\n const specs = registry.snapshot().map(enrichSpecWithCanonicalSchema);\n\n const toolNamesSchema = {\n type: \"object\",\n required: [\"tools\"],\n properties: {\n tools: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n description: { type: \"string\" },\n kind: { type: \"string\" },\n },\n },\n },\n },\n };\n\n const invokeRequestBody = {\n type: \"object\",\n required: [\"tool\", \"args\"],\n properties: {\n tool: { type: \"string\", description: \"Tool name (e.g. from GET /tools)\" },\n args: {\n type: \"object\",\n description: \"Tool arguments (schema per tool; use per-tool paths for typed schema)\",\n additionalProperties: true,\n },\n },\n };\n\n const prefix = basePath ? `${basePath}/` : \"/\";\n const paths: Record<string, unknown> = {\n [`${prefix}tools`]: {\n get: {\n summary: \"List tools\",\n description: \"Returns all registered tool names and descriptions.\",\n operationId: \"listTools\",\n responses: {\n \"200\": {\n description: \"List of tools\",\n content: {\n \"application/json\": {\n schema: toolNamesSchema,\n },\n },\n },\n },\n },\n },\n [`${prefix}invoke`]: {\n post: {\n summary: \"Invoke a tool (generic)\",\n description: \"Call any tool by name with body { tool, args }. For typed schemas use POST /invoke/{toolSlug}.\",\n operationId: \"invokeTool\",\n requestBody: {\n required: true,\n content: {\n \"application/json\": {\n schema: invokeRequestBody,\n },\n },\n },\n responses: {\n \"200\": {\n description: \"Tool result\",\n content: { \"application/json\": { schema: resultSchema } },\n },\n \"400\": {\n description: \"Bad request\",\n content: { \"application/json\": { schema: errorSchema } },\n },\n },\n },\n },\n };\n\n const schemaEntries: [string, object][] = [];\n for (const s of specs) {\n const key = toolSchemaKey(s.name);\n schemaEntries.push([key, s.inputSchema as object]);\n const slug = toolNameToSlug(s.name);\n paths[`${prefix}invoke/${slug}`] = {\n post: {\n summary: s.description ?? s.name,\n description: `Invoke tool \\`${s.name}\\`. Request body is the tool's arguments (JSON Schema below).`,\n operationId: `invoke_${key}`,\n requestBody: {\n required: true,\n content: {\n \"application/json\": {\n schema: { $ref: `#/components/schemas/${key}` },\n },\n },\n },\n responses: {\n \"200\": {\n description: \"Tool result\",\n content: { \"application/json\": { schema: resultSchema } },\n },\n \"400\": {\n description: \"Bad request (invalid args or tool error)\",\n content: { \"application/json\": { schema: errorSchema } },\n },\n },\n },\n };\n }\n\n return {\n openapi: \"3.0.3\",\n info: { title, version },\n paths,\n components: {\n schemas: Object.fromEntries(schemaEntries),\n },\n };\n}\n","/**\n * HTTP server that exposes tools via OpenAPI (Swagger): GET / (Swagger UI), GET /openapi.json, GET /tools, POST /invoke.\n * All invokes go through PTCRuntime.invoke(intent, ctx). Uses Node's built-in http.\n */\n\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport type { PTCRuntime } from \"../../core/runtime/PTCRuntime.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport type { CreateRuntimeOptions } from \"../runtimeFromConfig.js\";\nimport { createRuntimeFromConfig } from \"../runtimeFromConfig.js\";\nimport { toolsToOpenAPISpec, slugToToolName } from \"./openapi.js\";\n\nexport interface OpenAPIHttpServerOptions {\n /** Port (default: 0 = let OS choose) */\n port?: number;\n /** Host (default: \"localhost\") */\n host?: string;\n /** Base path for routes (default: \"\") */\n basePath?: string;\n /** Build ExecContext for each request (default: minimal ctx) */\n execContextFactory?: (req: IncomingMessage) => ExecContext;\n}\n\nconst DEFAULT_CTX: ExecContext = {\n requestId: `http-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n taskId: `task-${Date.now()}`,\n permissions: [\n \"read:web\", \"read:fs\", \"write:fs\", \"read:db\", \"write:db\",\n \"network\", \"workflow\", \"danger:destructive\",\n ],\n};\n\nfunction safeParseToolArgs(\n raw: string\n): { ok: true; value: unknown } | { ok: false; hint: string } {\n const text = String(raw ?? \"\").trim();\n const firstBrace = text.indexOf(\"{\");\n if (firstBrace === -1) {\n return {\n ok: false,\n hint:\n \"Tool arguments must be a single JSON object. \" +\n 'Do not prepend explanations. Example: itermRunCommandInSession({\"command\":\"df -h\"})',\n };\n }\n\n let jsonText = text.slice(firstBrace);\n const lastBrace = jsonText.lastIndexOf(\"}\");\n if (lastBrace !== -1) {\n jsonText = jsonText.slice(0, lastBrace + 1);\n }\n\n try {\n return { ok: true, value: JSON.parse(jsonText) as unknown };\n } catch {\n return {\n ok: false,\n hint:\n \"Tool arguments must be valid JSON: double-quoted keys/strings, no comments or trailing commas.\",\n };\n }\n}\n\nclass BodyParseError extends Error {\n readonly hint?: string;\n\n constructor(message: string, hint?: string) {\n super(message);\n this.name = \"BodyParseError\";\n this.hint = hint;\n }\n}\n\nfunction parseBody(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk) => chunks.push(chunk));\n req.on(\"end\", () => {\n const raw = Buffer.concat(chunks).toString(\"utf-8\");\n if (!raw.trim()) {\n resolve({});\n return;\n }\n const parsed = safeParseToolArgs(raw);\n if (parsed.ok) {\n resolve(parsed.value);\n return;\n }\n reject(new BodyParseError(\"Invalid JSON body\", parsed.hint));\n });\n req.on(\"error\", reject);\n });\n}\n\nfunction sendJson(res: ServerResponse, status: number, data: unknown): void {\n res.writeHead(status, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(data));\n}\n\n/** Build HTML for Swagger UI (CDN) pointing at the given spec URL. */\nfunction swaggerUiHtml(specUrl: string): string {\n const specUrlEscaped = specUrl.replace(/\"/g, \""\");\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Tool API – Swagger UI</title>\n <link rel=\"stylesheet\" href=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui.css\">\n</head>\n<body>\n <div id=\"swagger-ui\"></div>\n <script src=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui-bundle.js\" crossorigin></script>\n <script src=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui-standalone-preset.js\" crossorigin></script>\n <script>\n window.onload = function() {\n window.ui = SwaggerUIBundle({\n url: \"${specUrlEscaped}\",\n dom_id: \"#swagger-ui\",\n deepLinking: true,\n presets: [\n SwaggerUIBundle.presets.apis,\n SwaggerUIStandalonePreset\n ],\n layout: \"StandaloneLayout\"\n });\n };\n </script>\n</body>\n</html>`;\n}\n\n/**\n * Create an HTTP server that exposes tools via OpenAPI-style routes.\n * - GET / or GET /swagger: Swagger UI (interactive docs)\n * - GET /openapi.json (or basePath/openapi.json): OpenAPI 3.0 spec\n * - GET /tools: list tools\n * - POST /invoke: body { tool, args } -> { result } or { error }\n */\nexport function createOpenAPIHttpServer(\n runtime: PTCRuntime,\n options: OpenAPIHttpServerOptions = {}\n): import(\"node:http\").Server {\n const basePath = (options.basePath ?? \"\").replace(/\\/$/, \"\");\n const ctxFactory = options.execContextFactory ?? (() => ({ ...DEFAULT_CTX }));\n\n const server = createServer(async (req: IncomingMessage, res: ServerResponse) => {\n const url = req.url ?? \"/\";\n const path = url.split(\"?\")[0] ?? \"/\";\n const norm = basePath ? (path === basePath ? \"\" : path.replace(basePath, \"\") || \"/\") : path;\n\n try {\n if (req.method === \"GET\" && (norm === \"/\" || norm === \"/swagger\")) {\n const specPath = basePath ? `${basePath}/openapi.json` : \"/openapi.json\";\n const html = swaggerUiHtml(specPath);\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(html);\n return;\n }\n\n if (req.method === \"GET\" && (norm === \"/openapi.json\" || norm === \"/spec\")) {\n const spec = toolsToOpenAPISpec(runtime.getRegistry(), {\n title: \"Tool API\",\n version: \"1.0.0\",\n basePath: basePath || undefined,\n });\n sendJson(res, 200, spec);\n return;\n }\n\n if (req.method === \"GET\" && norm === \"/tools\") {\n const { enrichSpecWithCanonicalSchema } = await import(\"../../tools/util/canonicalCoreSchemas.js\");\n const specs = runtime.getRegistry().snapshot().map(enrichSpecWithCanonicalSchema);\n const tools = specs.map((s) => ({\n name: s.name,\n description: s.description,\n kind: s.kind,\n inputSchema: s.inputSchema,\n }));\n sendJson(res, 200, { tools });\n return;\n }\n\n if (req.method === \"POST\" && norm === \"/invoke\") {\n let body: { tool?: string; args?: unknown };\n try {\n body = (await parseBody(req)) as { tool?: string; args?: unknown };\n } catch (err) {\n const hint = err instanceof BodyParseError ? err.hint : undefined;\n sendJson(res, 400, {\n ok: false,\n error: \"Invalid JSON body\",\n kind: \"BAD_REQUEST\",\n ...(hint ? { hint } : {}),\n });\n return;\n }\n const tool = body?.tool;\n const args = body?.args ?? {};\n if (typeof tool !== \"string\" || !tool.trim()) {\n sendJson(res, 400, { error: \"Missing or invalid 'tool' in body\", kind: \"BAD_REQUEST\" });\n return;\n }\n const ctx = ctxFactory(req);\n const result = await runtime.invoke(\n { tool: tool.trim(), args, purpose: \"openapi\" },\n ctx\n );\n if (result.ok) {\n sendJson(res, 200, { result: result.result });\n return;\n }\n sendJson(res, 400, {\n error: result.error?.message ?? \"Tool failed\",\n kind: result.error?.kind,\n details: result.error?.details,\n });\n return;\n }\n\n if (req.method === \"POST\" && norm.startsWith(\"/invoke/\") && norm.length > \"/invoke/\".length) {\n const slug = norm.slice(\"/invoke/\".length);\n const toolName = slugToToolName(slug);\n let args: unknown;\n let hint: string | undefined;\n try {\n args = await parseBody(req);\n } catch (err) {\n hint = err instanceof BodyParseError ? err.hint : undefined;\n sendJson(res, 400, {\n ok: false,\n error: \"Invalid JSON body\",\n kind: \"BAD_REQUEST\",\n ...(hint ? { hint } : {}),\n });\n return;\n }\n const ctx = ctxFactory(req);\n const result = await runtime.invoke(\n { tool: toolName, args: args ?? {}, purpose: \"openapi\" },\n ctx\n );\n if (result.ok) {\n sendJson(res, 200, { result: result.result });\n return;\n }\n sendJson(res, 400, {\n error: result.error?.message ?? \"Tool failed\",\n kind: result.error?.kind,\n details: result.error?.details,\n });\n return;\n }\n\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Not found\", path: norm }));\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n sendJson(res, 500, { error: message, kind: \"INTERNAL_ERROR\" });\n }\n });\n\n return server;\n}\n\n/**\n * Start the OpenAPI HTTP server on the given port/host.\n * Call after createOpenAPIHttpServer if you did not pass port in options.\n */\nexport function listenOpenAPIHttpServer(\n server: import(\"node:http\").Server,\n options: { port?: number; host?: string } = {}\n): Promise<{ port: number; host: string }> {\n return new Promise((resolve, reject) => {\n const port = options.port ?? 0;\n const host = options.host ?? \"localhost\";\n server.listen(port, host, () => {\n const addr = server.address();\n const actualPort = typeof addr === \"object\" && addr?.port != null ? addr.port : port;\n resolve({ port: actualPort, host });\n });\n server.on(\"error\", reject);\n });\n}\n\nexport interface HttpServiceResult {\n /** Node HTTP server (call .close() when done) */\n server: import(\"node:http\").Server;\n /** OpenAPI 3.0 spec document (for Swagger UI etc.) */\n openApiSpec: Record<string, unknown>;\n /** Start listening; returns { port, host } */\n listen: (options?: { port?: number; host?: string }) => Promise<{ port: number; host: string }>;\n}\n\nexport interface CreateHttpServiceOptions extends OpenAPIHttpServerOptions {\n /** API title for OpenAPI spec (default: \"Tool API\") */\n title?: string;\n /** API version for OpenAPI spec (default: \"1.0.0\") */\n version?: string;\n}\n\n/**\n * Create HTTP service that exposes tools via OpenAPI (Swagger).\n * Returns server, OpenAPI spec, and a listen() helper.\n */\nexport function createHttpService(\n runtime: PTCRuntime,\n options?: CreateHttpServiceOptions\n): Promise<HttpServiceResult>;\n\n/**\n * Create HTTP service from config (async: loads tools from projectPath when set).\n */\nexport function createHttpService(\n config: CreateRuntimeOptions,\n options?: CreateHttpServiceOptions\n): Promise<HttpServiceResult>;\n\nexport async function createHttpService(\n runtimeOrConfig: PTCRuntime | CreateRuntimeOptions,\n options: CreateHttpServiceOptions = {}\n): Promise<HttpServiceResult> {\n const runtime: PTCRuntime =\n \"invoke\" in runtimeOrConfig && typeof runtimeOrConfig.invoke === \"function\"\n ? (runtimeOrConfig as PTCRuntime)\n : (await createRuntimeFromConfig(runtimeOrConfig as CreateRuntimeOptions)).runtime;\n const server = createOpenAPIHttpServer(runtime, options);\n const openApiSpec = toolsToOpenAPISpec(runtime.getRegistry(), {\n title: options.title ?? \"Tool API\",\n version: options.version ?? \"1.0.0\",\n basePath: options.basePath,\n });\n return {\n server,\n openApiSpec,\n listen: (listenOpts) => listenOpenAPIHttpServer(server, listenOpts),\n };\n}\n","/**\n * Expose tools as an MCP server (stdio or Streamable HTTP). All invokes go through PTCRuntime.invoke(intent, ctx).\n * Requires @modelcontextprotocol/sdk.\n */\n\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { PTCRuntime } from \"../../core/runtime/PTCRuntime.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport { normalizeToolName } from \"../../core/types/ToolSpec.js\";\nimport type { CreateRuntimeOptions } from \"../runtimeFromConfig.js\";\nimport { createRuntimeFromConfig } from \"../runtimeFromConfig.js\";\nimport { MCP_KIND } from \"../../tools/mcp/types.js\";\n\nexport interface MCPServerOptions {\n /** Server name (default: \"agent-tool\") */\n name?: string;\n /** Server version (default: \"1.0.0\") */\n version?: string;\n /** Build ExecContext for each tool call (default: minimal ctx) */\n execContextFactory?: () => ExecContext;\n}\n\nconst DEFAULT_CTX: ExecContext = {\n requestId: `mcp-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n taskId: `task-${Date.now()}`,\n permissions: [\n \"read:web\", \"read:fs\", \"write:fs\", \"read:db\", \"write:db\",\n \"network\", \"workflow\", \"danger:destructive\",\n ],\n};\n\nexport interface MCPServerResult {\n /** The MCP server instance */\n server: { connect(transport: unknown): Promise<void>; close?(): Promise<void> };\n /** Call this to start listening on stdio (for in-process MCP service) */\n connectStdio: () => Promise<void>;\n}\n\n/** Request handler for Streamable HTTP: (req, res, parsedBody?) => Promise<void>. Use with Express app.post(path, handler) and express.json(). */\nexport type MCPStreamableHttpHandler = (\n req: IncomingMessage,\n res: ServerResponse,\n parsedBody?: unknown\n) => Promise<void>;\n\nexport interface MCPServerStreamableHttpResult {\n /** Express app with POST /mcp (or path) wired to Streamable HTTP handler */\n app: { post: (path: string, handler: MCPStreamableHttpHandler) => void };\n /** Path mounted (e.g. \"/mcp\") */\n path: string;\n /** Start HTTP server; returns when listening. Use createMCPStreamableHttpHandler + your own server if you prefer. */\n listen: (port?: number, host?: string) => Promise<{ url: string; port: number }>;\n}\n\n/**\n * MCP tool names must match SEP-986: A–Z, a–z, 0–9, underscore, dash, dot only.\n * Use normalized tool name (only [a-zA-Z0-9.]).\n */\nfunction toMcpToolName(registryName: string): string {\n return normalizeToolName(registryName);\n}\n\n/**\n * Create a configured McpServer with all tools from the given runtime (no transport connected).\n * Used by createMCPServer (stdio) and createMCPStreamableHttpHandler (Streamable HTTP).\n */\nasync function createMcpServerWithTools(\n runtime: PTCRuntime,\n options: MCPServerOptions\n): Promise<{ server: InstanceType<Awaited<typeof import(\"@modelcontextprotocol/sdk/server/mcp.js\")>[\"McpServer\"]> }> {\n const { McpServer } = await import(\"@modelcontextprotocol/sdk/server/mcp.js\");\n const name = options.name ?? \"agent-tool\";\n const version = options.version ?? \"1.0.0\";\n const ctxFactory = options.execContextFactory ?? (() => ({ ...DEFAULT_CTX }));\n\n const server = new McpServer({ name, version });\n const registry = runtime.getRegistry();\n const specs = registry.snapshot();\n\n for (const spec of specs) {\n const mcpName = toMcpToolName(spec.name);\n server.registerTool(\n mcpName,\n {\n description: spec.description ?? `Tool: ${spec.name}`,\n inputSchema: spec.inputSchema,\n _meta: spec._meta,\n } as Parameters<typeof server.registerTool>[1],\n async (args: unknown) => {\n const ctx = ctxFactory();\n const result = await runtime.invoke(\n { tool: spec.name, args: args ?? {}, purpose: MCP_KIND },\n ctx\n );\n if (result.ok) {\n return { content: [{ type: \"text\", text: JSON.stringify(result.result) }] };\n }\n const err = result.error;\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ error: err?.message ?? \"Tool failed\", kind: err?.kind }),\n },\n ],\n isError: true,\n };\n }\n );\n }\n return { server };\n}\n\n/**\n * Create an MCP server that serves all tools from the given PTCRuntime.\n * Register tools with the server; then call connectStdio() to listen on stdio (for Cursor/Claude).\n */\nexport function createMCPServer(\n runtime: PTCRuntime,\n options?: MCPServerOptions\n): Promise<MCPServerResult>;\n\n/**\n * Create an MCP server from config (async: loads tools from projectPath when set).\n */\nexport function createMCPServer(\n config: CreateRuntimeOptions,\n options?: MCPServerOptions\n): Promise<MCPServerResult>;\n\nexport async function createMCPServer(\n runtimeOrConfig: PTCRuntime | CreateRuntimeOptions,\n options: MCPServerOptions = {}\n): Promise<MCPServerResult> {\n const runtime: PTCRuntime =\n \"invoke\" in runtimeOrConfig && typeof runtimeOrConfig.invoke === \"function\"\n ? (runtimeOrConfig as PTCRuntime)\n : (await createRuntimeFromConfig(runtimeOrConfig as CreateRuntimeOptions)).runtime;\n const { StdioServerTransport } = await import(\"@modelcontextprotocol/sdk/server/stdio.js\");\n\n const { server } = await createMcpServerWithTools(runtime, options);\n\n return {\n server,\n async connectStdio() {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n },\n };\n}\n\n/**\n * Create a request handler for MCP Streamable HTTP (stateless). Use with Express: app.use(express.json()); app.post(\"/mcp\", handler).\n * Each request gets a new server and transport; supports SSE and direct HTTP responses per MCP Streamable HTTP spec.\n */\nexport function createMCPStreamableHttpHandler(\n runtime: PTCRuntime,\n options?: MCPServerOptions\n): MCPStreamableHttpHandler;\n\nexport function createMCPStreamableHttpHandler(\n config: CreateRuntimeOptions,\n options?: MCPServerOptions\n): Promise<MCPStreamableHttpHandler>;\n\nexport function createMCPStreamableHttpHandler(\n runtimeOrConfig: PTCRuntime | CreateRuntimeOptions,\n options: MCPServerOptions = {}\n): MCPStreamableHttpHandler | Promise<MCPStreamableHttpHandler> {\n if (\"invoke\" in runtimeOrConfig && typeof runtimeOrConfig.invoke === \"function\") {\n const runtime = runtimeOrConfig as PTCRuntime;\n return async function streamableHttpHandler(\n req: IncomingMessage,\n res: ServerResponse,\n parsedBody?: unknown\n ): Promise<void> {\n const { StreamableHTTPServerTransport } = await import(\"@modelcontextprotocol/sdk/server/streamableHttp.js\");\n const { server } = await createMcpServerWithTools(runtime, options);\n const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });\n await server.connect(transport);\n const onClose = (): void => {\n transport.close().catch(() => {});\n server.close().catch(() => {});\n res.removeListener(\"close\", onClose);\n res.removeListener(\"finish\", onClose);\n };\n res.once(\"close\", onClose);\n res.once(\"finish\", onClose);\n await transport.handleRequest(\n req as IncomingMessage & { auth?: import(\"@modelcontextprotocol/sdk/server/auth/types.js\").AuthInfo },\n res,\n parsedBody\n );\n };\n }\n return (async (): Promise<MCPStreamableHttpHandler> => {\n const { runtime } = await createRuntimeFromConfig(runtimeOrConfig as CreateRuntimeOptions);\n return createMCPStreamableHttpHandler(runtime, options) as MCPStreamableHttpHandler;\n })();\n}\n\nexport interface CreateMCPServerStreamableHttpOptions extends MCPServerOptions {\n /** Path for MCP endpoint (default: \"/mcp\") */\n path?: string;\n /** Host to bind (default: \"127.0.0.1\") */\n host?: string;\n /** Port (default: 3000) */\n port?: number;\n}\n\n/**\n * Create an Express app with MCP Streamable HTTP handler mounted at path. Requires @modelcontextprotocol/sdk (which uses express).\n * Returns app and listen(port?, host?) to start the HTTP server.\n */\nexport function createMCPServerStreamableHttp(\n runtime: PTCRuntime,\n options?: CreateMCPServerStreamableHttpOptions\n): Promise<MCPServerStreamableHttpResult>;\n\nexport function createMCPServerStreamableHttp(\n config: CreateRuntimeOptions,\n options?: CreateMCPServerStreamableHttpOptions\n): Promise<MCPServerStreamableHttpResult>;\n\nexport async function createMCPServerStreamableHttp(\n runtimeOrConfig: PTCRuntime | CreateRuntimeOptions,\n options: CreateMCPServerStreamableHttpOptions = {}\n): Promise<MCPServerStreamableHttpResult> {\n const path = options.path ?? \"/mcp\";\n const host = options.host ?? \"127.0.0.1\";\n const port = options.port ?? 3000;\n const { createMcpExpressApp } = await import(\"@modelcontextprotocol/sdk/server/express.js\");\n const handler =\n \"invoke\" in runtimeOrConfig && typeof runtimeOrConfig.invoke === \"function\"\n ? createMCPStreamableHttpHandler(runtimeOrConfig as PTCRuntime, options)\n : await createMCPStreamableHttpHandler(runtimeOrConfig as CreateRuntimeOptions, options);\n const app = createMcpExpressApp({ host });\n app.post(path, handler);\n\n return {\n app,\n path,\n async listen(listenPort?: number, listenHost?: string): Promise<{ url: string; port: number }> {\n const p = listenPort ?? port;\n const h = listenHost ?? host;\n return new Promise((resolve, reject) => {\n const server = (app as {\n listen: (port: number, host: string, cb?: () => void) => import(\"node:http\").Server;\n }).listen(p, h, () => {\n const addr = server.address();\n const actualPort =\n typeof addr === \"object\" && addr !== null && \"port\" in addr ? addr.port : p;\n resolve({ url: `http://${h}:${actualPort}${path}`, port: actualPort });\n });\n });\n },\n };\n}\n\n/**\n * Run MCP server over stdio using the given runtime.\n * Call this when your process should act as an MCP server (e.g. for Cursor/Claude to connect).\n */\nexport async function runMCPServerOverStdio(\n runtime: PTCRuntime,\n options: MCPServerOptions = {}\n): Promise<MCPServerResult> {\n const result = await createMCPServer(runtime, options);\n await result.connectStdio();\n return result;\n}\n"]}
|