@easynet/agent-tool 1.0.87 → 1.0.89

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.
@@ -1 +0,0 @@
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/api/runtimeFromConfig.helpers.ts","../src/api/runtimeFromConfig.ts","../src/api/expose/mcpServer.ts","../src/api/expose/openapi.ts","../src/api/expose/openapiHttp.ts"],"names":["packageToolDefaults","list","uuidv4","existsSync","join","resolve","dirname","readFileSync","out","requireFromPackage","createRequire","pathToFileURL","runtime","DEFAULT_CTX","enrichSpecWithCanonicalSchema"],"mappings":"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","file":"chunk-BBNQ6AWK.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 { 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 /** MCP server defaults used by createMcpServer(). */\n mcp?: {\n name?: string;\n version?: string;\n };\n /** OpenAPI/Express defaults used by createOpenAPIServer(). */\n openapi?: {\n host?: string;\n port?: number;\n basePath?: string;\n title?: string;\n version?: string;\n };\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 /** MCP config defaults. */\n mcp?: {\n name?: string;\n version?: string;\n };\n /** OpenAPI config defaults. */\n openapi?: {\n host?: string;\n port?: number;\n basePath?: string;\n title?: string;\n version?: string;\n };\n /** Optional grouping for service expose config. */\n expose?: {\n mcp?: RawToolYaml[\"mcp\"];\n openapi?: RawToolYaml[\"openapi\"];\n };\n spec?: Omit<RawToolYaml, \"spec\">;\n}\n\nfunction normalizeMcpConfig(raw: unknown): ToolYamlShape[\"mcp\"] | undefined {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return undefined;\n const source = raw as Record<string, unknown>;\n const out: NonNullable<ToolYamlShape[\"mcp\"]> = {};\n if (typeof source.name === \"string\" && source.name.trim()) out.name = source.name.trim();\n if (typeof source.version === \"string\" && source.version.trim()) out.version = source.version.trim();\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction normalizeOpenApiConfig(raw: unknown): ToolYamlShape[\"openapi\"] | undefined {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return undefined;\n const source = raw as Record<string, unknown>;\n const out: NonNullable<ToolYamlShape[\"openapi\"]> = {};\n if (typeof source.host === \"string\" && source.host.trim()) out.host = source.host.trim();\n if (typeof source.basePath === \"string\") out.basePath = source.basePath;\n if (typeof source.title === \"string\" && source.title.trim()) out.title = source.title.trim();\n if (typeof source.version === \"string\" && source.version.trim()) out.version = source.version.trim();\n if (typeof source.port === \"number\" && Number.isFinite(source.port)) out.port = source.port;\n return Object.keys(out).length > 0 ? out : undefined;\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 source = parsed.spec && typeof parsed.spec === \"object\" && !Array.isArray(parsed.spec)\n ? parsed.spec\n : parsed;\n const mcpConfig = normalizeMcpConfig(source.expose?.mcp ?? source.mcp);\n const openApiConfig = normalizeOpenApiConfig(source.expose?.openapi ?? source.openapi);\n const toolsBlock = source.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 : source.sandboxedPath,\n enableSandboxValidation:\n typeof toolsBlock.enableSandboxValidation === \"boolean\"\n ? toolsBlock.enableSandboxValidation\n : source.enableSandboxValidation,\n allowedHosts:\n Array.isArray(toolsBlock.allowedHosts) ? toolsBlock.allowedHosts : source.allowedHosts,\n blockedHosts:\n Array.isArray(toolsBlock.blockedHosts) ? toolsBlock.blockedHosts : source.blockedHosts,\n blockedCidrs:\n Array.isArray(toolsBlock.blockedCidrs) ? toolsBlock.blockedCidrs : source.blockedCidrs,\n toolDefaults,\n packageToolDefaults,\n mcp: mcpConfig,\n openapi: openApiConfig,\n };\n }\n const packageToolDefaults =\n typeof source.packageToolDefaults === \"object\" && !Array.isArray(source.packageToolDefaults)\n ? (source.packageToolDefaults as Record<string, { defaults?: Record<string, unknown>; tools?: Record<string, Record<string, unknown>> }>)\n : undefined;\n const list = Array.isArray(source.tools) && source.tools.length > 0 ? source.tools : undefined;\n return {\n tools: list ?? (packageToolDefaults ? Object.keys(packageToolDefaults) : undefined),\n sandboxedPath: source.sandboxedPath,\n enableSandboxValidation:\n typeof source.enableSandboxValidation === \"boolean\" ? source.enableSandboxValidation : undefined,\n allowedHosts: Array.isArray(source.allowedHosts) ? source.allowedHosts : undefined,\n blockedHosts: Array.isArray(source.blockedHosts) ? source.blockedHosts : undefined,\n blockedCidrs: Array.isArray(source.blockedCidrs) ? source.blockedCidrs : undefined,\n toolDefaults:\n typeof source.toolDefaults === \"object\" && !Array.isArray(source.toolDefaults)\n ? (source.toolDefaults as Record<string, Record<string, unknown>>)\n : undefined,\n packageToolDefaults,\n mcp: mcpConfig,\n openapi: openApiConfig,\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\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 { summarizeForLog } from \"@easynet/agent-common\";\n\nexport 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\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 const span = this.beginInvokeSpan(intent, ctx);\n const observability = this.getObservabilityDeps();\n emitToolCalled(intent, ctx, observability);\n\n try {\n const pipeline = await this.runInvokePipeline(intent, ctx, span.spanId);\n if (pipeline.dryRun) {\n return this.buildDryRunResult(pipeline.spec, pipeline.enrichedArgs, ctx, startTime, span.spanId);\n }\n return this.buildInvokeSuccessResult(pipeline, ctx, startTime, span.spanId, observability);\n } catch (error) {\n const durationMs = Date.now() - startTime;\n return handleError(error, intent, ctx, durationMs, span.spanId, observability);\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 beginInvokeSpan(intent: ToolIntent, ctx: ExecContext): { spanId: string } {\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 ? sanitizeForLog(intent.args) : undefined,\n });\n }\n return 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\n private async runInvokePipeline(\n intent: ToolIntent,\n ctx: ExecContext,\n spanId: string,\n ): Promise<{\n spec: ToolSpec;\n enrichedArgs: unknown;\n dryRun: boolean;\n result?: unknown;\n raw?: unknown;\n }> {\n const spec = resolveTool(intent.tool, this.registry);\n this.tracing.addEvent(spanId, \"resolved\", { kind: spec.kind, version: spec.version });\n const normalizedArgs = normalizeInputAliases(spec, intent.args);\n const validatedArgs = validateInput(spec, normalizedArgs, this.validator);\n const enrichedArgs = enrichDefaults(spec, validatedArgs, this.validator);\n enforcePolicy(spec, enrichedArgs, ctx, this.getPipelineDeps());\n if (!this.budget.checkRateLimit(spec.name)) {\n throw createTaggedError(\"BUDGET_EXCEEDED\", `Rate limit exceeded for tool: ${spec.name}`);\n }\n await requireHumanApproval(spec, enrichedArgs, ctx, {\n onApprovalRequired: this.config.onApprovalRequired,\n eventLog: this.eventLog,\n logger: this.logger,\n });\n if (ctx.dryRun) return { spec, enrichedArgs, dryRun: true };\n const execution = await executeWithBudget(spec, enrichedArgs, ctx, spanId, this.getPipelineDeps());\n return { spec, enrichedArgs, dryRun: false, result: execution.result, raw: execution.raw };\n }\n\n private buildInvokeSuccessResult(\n pipeline: { spec: ToolSpec; enrichedArgs: unknown; result?: unknown; raw?: unknown },\n ctx: ExecContext,\n startTime: number,\n spanId: string,\n observability: ObservabilityDependencies,\n ): ToolResult {\n const toolError = asToolReturnedError(pipeline.result);\n if (toolError) {\n const hint = buildInputSchemaHint(pipeline.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 const validatedOutput = validateOutput(pipeline.spec, pipeline.result, this.validator);\n const durationMs = Date.now() - startTime;\n const builtEvidence = buildEvidence({\n spec: pipeline.spec,\n args: pipeline.enrichedArgs,\n result: validatedOutput,\n raw: pipeline.raw,\n ctx,\n durationMs,\n });\n const adapterEvidence = getAdapterEvidence(pipeline.raw);\n const evidence = [...adapterEvidence, ...builtEvidence];\n recordSuccess(pipeline.spec, durationMs, evidence, spanId, observability);\n if (this.logger.isEnabled(\"debug\")) {\n this.logger.debug(\"invoke.ok\", {\n tool: pipeline.spec.name,\n durationMs,\n result: this.logger.options.includeResults ? summarizeForLog(validatedOutput) : undefined,\n raw: this.logger.options.includeRaw ? summarizeForLog(pipeline.raw) : undefined,\n });\n }\n return {\n ok: true,\n result: validatedOutput,\n evidence,\n raw: this.config.includeRaw !== false ? pipeline.raw : undefined,\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\nfunction getAdapterEvidence(raw: unknown): Evidence[] {\n if (!raw || typeof raw !== \"object\") return [];\n const value = (raw as { evidence?: Evidence[] }).evidence;\n return Array.isArray(value) ? (value as Evidence[]) : [];\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 { createRequire } from \"node:module\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { pathToFileURL } from \"node:url\";\nimport { dirname, join, resolve } from \"node:path\";\nimport type { ToolAdapter, ToolKind, ToolSpec } from \"../core/types/ToolSpec.js\";\nimport { normalizeToolName } from \"../core/types/ToolSpec.js\";\nimport type { ToolRegistry } from \"../core/registry/ToolRegistry.js\";\n\nconst requireFromPackage = createRequire(import.meta.url);\n\nexport function 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\nexport function 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\nexport function 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\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\nexport function 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\nexport function 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\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 * 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 { 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\";\nimport {\n createLocalDirectoryAdapter,\n createPrefixingRegistry,\n findNearestPackageJson,\n getInstalledPackageVersion,\n getProjectRequire,\n parseNpmDescriptor,\n} from \"./runtimeFromConfig.helpers.js\";\n\nconst requireFromPackage = createRequire(import.meta.url);\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 select/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\ntype RegisterFn = (r: ToolRegistry, c: CoreToolsUserConfig) => unknown;\nexport type LoadedExtension = { register: RegisterFn; descriptor: string; resolvedVersion: string; packageRoot: string };\ntype LoadedLocalDirectory = { specs: ToolSpec[]; descriptor: string; resolvedVersion: string };\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\nexport { parseNpmDescriptor };\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): LoadedExtension | 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\", packageRoot: resolvedPath };\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): LoadedExtension | 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 ?? installed ?? resolveLatestVersionFromRegistry(parsed.packageName, { cwd: npmCwd });\n if (installed === resolvedVersion) {\n if (stepLog) stepLog(`Loaded ${parsed.packageName}@${resolvedVersion} from node_modules`);\n const pkgRoot = dirname(configRequire.resolve(`${parsed.packageName}/package.json`));\n return { register: fn, descriptor: entryStr, resolvedVersion, packageRoot: pkgRoot };\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, packageRoot: cacheDir };\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. */\nexport function loadAllExtensionsFromToolYamlSync(\n configFilePath: string,\n stepLog?: (message: string) => void,\n): LoadedExtension[] {\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: LoadedExtension[] = [];\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/** 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<LoadedExtension | 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 ?? installed ?? resolveLatestVersionFromRegistry(parsed.packageName, { cwd: npmCwd });\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, packageRoot };\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, packageRoot: cacheDir };\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 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\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\nexport type { McpServer };\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: McpServer;\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: 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) => {\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","/**\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 const prefix = basePath ? `${basePath}/` : \"/\";\n const paths = createBasePaths(prefix);\n const schemaEntries = addPerToolPaths(specs, prefix, paths);\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\nfunction createToolNamesSchema(): Record<string, unknown> {\n return {\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\nfunction createInvokeRequestBodySchema(): Record<string, unknown> {\n return {\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\nfunction createBasePaths(prefix: string): Record<string, unknown> {\n return {\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: { \"application/json\": { schema: createToolNamesSchema() } },\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: { \"application/json\": { schema: createInvokeRequestBodySchema() } },\n },\n responses: {\n \"200\": { description: \"Tool result\", content: { \"application/json\": { schema: resultSchema } } },\n \"400\": { description: \"Bad request\", content: { \"application/json\": { schema: errorSchema } } },\n },\n },\n },\n };\n}\n\nfunction addPerToolPaths(\n specs: ToolSpec[],\n prefix: string,\n paths: Record<string, unknown>,\n): [string, object][] {\n const schemaEntries: [string, object][] = [];\n for (const spec of specs) {\n const key = toolSchemaKey(spec.name);\n schemaEntries.push([key, spec.inputSchema as object]);\n paths[`${prefix}invoke/${toolNameToSlug(spec.name)}`] = createPerToolPathSpec(spec, key);\n }\n return schemaEntries;\n}\n\nfunction createPerToolPathSpec(spec: ToolSpec, key: string): Record<string, unknown> {\n return {\n post: {\n summary: spec.description ?? spec.name,\n description: `Invoke tool \\`${spec.name}\\`. Request body is the tool's arguments (JSON Schema below).`,\n operationId: `invoke_${key}`,\n requestBody: {\n required: true,\n content: { \"application/json\": { schema: { $ref: `#/components/schemas/${key}` } } },\n },\n responses: {\n \"200\": { description: \"Tool result\", content: { \"application/json\": { schema: resultSchema } } },\n \"400\": {\n description: \"Bad request (invalid args or tool error)\",\n content: { \"application/json\": { schema: errorSchema } },\n },\n },\n },\n };\n}\n","/**\n * OpenAPI service on Express: GET / (Swagger UI), GET /openapi.json, GET /tools, POST /invoke.\n * All invokes go through PTCRuntime.invoke(intent, ctx).\n */\n\nimport type { IncomingMessage } from \"node:http\";\nimport express, { type Express, type NextFunction, type Request, type Response } from \"express\";\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\ntype OpenAPIRequest = Request;\ntype OpenAPIResponse = Response;\nexport type OpenAPIExpressApp = Express;\n\nexport interface OpenAPIHttpServerOptions {\n port?: number;\n host?: string;\n basePath?: string;\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\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 safeParseToolArgs(raw: string): { ok: true; value: unknown } | { ok: false; hint: string } {\n const text = String(raw ?? \"\").trim();\n if (!text) return { ok: true, value: {} };\n\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) jsonText = jsonText.slice(0, lastBrace + 1);\n\n try {\n return { ok: true, value: JSON.parse(jsonText) as unknown };\n } catch {\n return {\n ok: false,\n hint: \"Tool arguments must be valid JSON: double-quoted keys/strings, no comments or trailing commas.\",\n };\n }\n}\n\nfunction sendJson(res: OpenAPIResponse, status: number, data: unknown): void {\n res.status(status).json(data);\n}\n\nfunction swaggerUiHtml(specUrl: string): string {\n const specUrlEscaped = specUrl.replace(/\"/g, \"&quot;\");\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\nfunction parseBodyFromExpress(raw: unknown): unknown {\n if (raw == null) return {};\n if (typeof raw === \"object\") return raw;\n const text = Buffer.isBuffer(raw) ? raw.toString(\"utf-8\") : String(raw);\n const parsed = safeParseToolArgs(text);\n if (parsed.ok) return parsed.value;\n throw new BodyParseError(\"Invalid JSON body\", parsed.hint);\n}\n\nfunction sendBadJsonBody(res: OpenAPIResponse, err: unknown): void {\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}\n\nasync function invokeAndSend(\n runtime: PTCRuntime,\n ctx: ExecContext,\n res: OpenAPIResponse,\n tool: string,\n args: unknown,\n): Promise<void> {\n const result = await runtime.invoke({ tool, args, purpose: \"openapi\" }, ctx);\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}\n\n/**\n * Create an Express app exposing OpenAPI routes.\n */\nexport function createOpenAPIHttpServer(\n runtime: PTCRuntime,\n options: OpenAPIHttpServerOptions = {},\n): OpenAPIExpressApp {\n const app = express();\n const router = express.Router();\n const basePath = (options.basePath ?? \"\").replace(/\\/$/, \"\");\n const ctxFactory = options.execContextFactory ?? (() => ({ ...DEFAULT_CTX }));\n\n app.use(express.text({ type: \"*/*\" }));\n\n router.get(\"/\", (_req, res) => {\n const specPath = basePath ? `${basePath}/openapi.json` : \"/openapi.json\";\n res.type(\"text/html; charset=utf-8\").send(swaggerUiHtml(specPath));\n });\n\n router.get(\"/swagger\", (_req, res) => {\n const specPath = basePath ? `${basePath}/openapi.json` : \"/openapi.json\";\n res.type(\"text/html; charset=utf-8\").send(swaggerUiHtml(specPath));\n });\n\n router.get(\"/openapi.json\", (_req, res) => {\n sendJson(\n res,\n 200,\n toolsToOpenAPISpec(runtime.getRegistry(), {\n title: \"Tool API\",\n version: \"1.0.0\",\n basePath: basePath || undefined,\n }),\n );\n });\n\n router.get(\"/spec\", (_req, res) => {\n sendJson(\n res,\n 200,\n toolsToOpenAPISpec(runtime.getRegistry(), {\n title: \"Tool API\",\n version: \"1.0.0\",\n basePath: basePath || undefined,\n }),\n );\n });\n\n router.get(\"/tools\", async (_req, res, next) => {\n try {\n const { enrichSpecWithCanonicalSchema } = await import(\"../../tools/util/canonicalCoreSchemas.js\");\n const tools = runtime.getRegistry().snapshot().map(enrichSpecWithCanonicalSchema).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 } catch (error) {\n next(error);\n }\n });\n\n router.post(\"/invoke\", async (req, res) => {\n let body: { tool?: string; args?: unknown } | null = null;\n try {\n body = parseBodyFromExpress(req.body) as { tool?: string; args?: unknown };\n } catch (err) {\n sendBadJsonBody(res, err);\n return;\n }\n const tool = body.tool;\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 await invokeAndSend(runtime, ctxFactory(req), res, tool.trim(), body.args ?? {});\n });\n\n router.post(\"/invoke/:slug\", async (req, res) => {\n let args: unknown;\n try {\n args = parseBodyFromExpress(req.body);\n } catch (err) {\n sendBadJsonBody(res, err);\n return;\n }\n await invokeAndSend(runtime, ctxFactory(req), res, slugToToolName(req.params?.slug ?? \"\"), args);\n });\n\n if (basePath) {\n app.use(basePath, router);\n } else {\n app.use(router);\n }\n\n app.use((req: OpenAPIRequest, res: OpenAPIResponse) => {\n sendJson(res, 404, { error: \"Not found\", path: req.url ?? \"/\" });\n });\n\n app.use((err: unknown, _req: OpenAPIRequest, res: OpenAPIResponse, _next: NextFunction) => {\n const message = err instanceof Error ? err.message : String(err);\n sendJson(res, 500, { error: message, kind: \"INTERNAL_ERROR\" });\n });\n\n // Apply tool.yaml defaults when caller uses app.listen() with no host/port args.\n const originalListen = app.listen.bind(app);\n const defaultPort = options.port;\n const defaultHost = options.host;\n app.listen = ((...args: unknown[]) => {\n if (args.length === 0) {\n return originalListen(defaultPort ?? 0, defaultHost ?? \"localhost\");\n }\n if (args.length === 1 && typeof args[0] === \"function\") {\n return originalListen(defaultPort ?? 0, defaultHost ?? \"localhost\", args[0] as () => void);\n }\n return (originalListen as (...innerArgs: unknown[]) => import(\"node:http\").Server)(...args);\n }) as typeof app.listen;\n\n return app;\n}\n\nexport function listenOpenAPIHttpServer(\n app: OpenAPIExpressApp,\n options: { port?: number; host?: string } = {},\n): Promise<{ port: number; host: string; httpServer: import(\"node:http\").Server }> {\n return new Promise((resolve, reject) => {\n const port = options.port ?? 0;\n const host = options.host ?? \"localhost\";\n const httpServer = app.listen(port, host, () => {\n const addr = httpServer.address();\n const actualPort = typeof addr === \"object\" && addr?.port != null ? addr.port : port;\n resolve({ port: actualPort, host, httpServer });\n });\n httpServer.on(\"error\", reject);\n });\n}\n\nexport interface HttpServiceResult {\n /** Express app */\n server: OpenAPIExpressApp;\n /** OpenAPI 3.0 spec document */\n openApiSpec: Record<string, unknown>;\n /** Start listening */\n listen: (options?: { port?: number; host?: string }) => Promise<{ port: number; host: string }>;\n /** Close underlying HTTP server after listen() */\n close: () => Promise<void>;\n}\n\nexport interface CreateHttpServiceOptions extends OpenAPIHttpServerOptions {\n title?: string;\n version?: string;\n}\n\nexport function createHttpService(\n runtime: PTCRuntime,\n options?: CreateHttpServiceOptions,\n): Promise<HttpServiceResult>;\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 let activeHttpServer: import(\"node:http\").Server | null = null;\n return {\n server,\n openApiSpec,\n listen: async (listenOpts) => {\n const { port, host, httpServer } = await listenOpenAPIHttpServer(server, listenOpts);\n activeHttpServer = httpServer;\n return { port, host };\n },\n close: async () => {\n if (!activeHttpServer) return;\n await new Promise<void>((resolve, reject) => {\n activeHttpServer!.close((err) => (err ? reject(err) : resolve()));\n });\n activeHttpServer = null;\n },\n };\n}\n"]}