@easynet/agent-tool 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +103 -0
- package/dist/chunk-3YLVPZRJ.cjs +32 -0
- package/dist/chunk-3YLVPZRJ.cjs.map +1 -0
- package/dist/chunk-AXUNV4MK.js +28 -0
- package/dist/chunk-AXUNV4MK.js.map +1 -0
- package/dist/chunk-BM4EVYI5.js +1069 -0
- package/dist/chunk-BM4EVYI5.js.map +1 -0
- package/dist/chunk-P3UEAZHK.cjs +171 -0
- package/dist/chunk-P3UEAZHK.cjs.map +1 -0
- package/dist/chunk-RPAMQCFH.js +167 -0
- package/dist/chunk-RPAMQCFH.js.map +1 -0
- package/dist/chunk-Z7TGIG77.cjs +1108 -0
- package/dist/chunk-Z7TGIG77.cjs.map +1 -0
- package/dist/cli.cjs +154 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.d.ts +10 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +147 -0
- package/dist/cli.js.map +1 -0
- package/dist/codegen/build.d.ts +23 -0
- package/dist/codegen/build.d.ts.map +1 -0
- package/dist/codegen/generator.d.ts +15 -0
- package/dist/codegen/generator.d.ts.map +1 -0
- package/dist/codegen/index.d.ts +21 -0
- package/dist/codegen/index.d.ts.map +1 -0
- package/dist/codegen/init.d.ts +17 -0
- package/dist/codegen/init.d.ts.map +1 -0
- package/dist/codegen/run.d.ts +19 -0
- package/dist/codegen/run.d.ts.map +1 -0
- package/dist/codegen/scan/scanN8n.d.ts +17 -0
- package/dist/codegen/scan/scanN8n.d.ts.map +1 -0
- package/dist/codegen/scan/scanSkill.d.ts +17 -0
- package/dist/codegen/scan/scanSkill.d.ts.map +1 -0
- package/dist/codegen/scan/scanTools.d.ts +31 -0
- package/dist/codegen/scan/scanTools.d.ts.map +1 -0
- package/dist/codegen/scan/scanner.d.ts +26 -0
- package/dist/codegen/scan/scanner.d.ts.map +1 -0
- package/dist/codegen/scan/schemaFromTs.d.ts +16 -0
- package/dist/codegen/scan/schemaFromTs.d.ts.map +1 -0
- package/dist/codegen/types.d.ts +81 -0
- package/dist/codegen/types.d.ts.map +1 -0
- package/dist/core.cjs +20 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.d.ts +8 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +3 -0
- package/dist/core.js.map +1 -0
- package/dist/discovery/MCPProcessManager.d.ts +57 -0
- package/dist/discovery/MCPProcessManager.d.ts.map +1 -0
- package/dist/discovery/errors.d.ts +13 -0
- package/dist/discovery/errors.d.ts.map +1 -0
- package/dist/discovery/load/LangChainLoader.d.ts +7 -0
- package/dist/discovery/load/LangChainLoader.d.ts.map +1 -0
- package/dist/discovery/load/MCPLoader.d.ts +8 -0
- package/dist/discovery/load/MCPLoader.d.ts.map +1 -0
- package/dist/discovery/load/N8nLoader.d.ts +25 -0
- package/dist/discovery/load/N8nLoader.d.ts.map +1 -0
- package/dist/discovery/load/SkillLoader.d.ts +20 -0
- package/dist/discovery/load/SkillLoader.d.ts.map +1 -0
- package/dist/discovery/load/SkillManifest.d.ts +79 -0
- package/dist/discovery/load/SkillManifest.d.ts.map +1 -0
- package/dist/discovery/load/SkillMdParser.d.ts +31 -0
- package/dist/discovery/load/SkillMdParser.d.ts.map +1 -0
- package/dist/discovery/load/index.d.ts +6 -0
- package/dist/discovery/load/index.d.ts.map +1 -0
- package/dist/discovery/load/resolveEntry.d.ts +7 -0
- package/dist/discovery/load/resolveEntry.d.ts.map +1 -0
- package/dist/discovery/scan/DirectoryScanner.d.ts +37 -0
- package/dist/discovery/scan/DirectoryScanner.d.ts.map +1 -0
- package/dist/discovery/scan/scanUtil.d.ts +16 -0
- package/dist/discovery/scan/scanUtil.d.ts.map +1 -0
- package/dist/discovery/types.d.ts +99 -0
- package/dist/discovery/types.d.ts.map +1 -0
- package/dist/index.cjs +3014 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +68 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2778 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/AgentLLMAdapter.d.ts +27 -0
- package/dist/llm/AgentLLMAdapter.d.ts.map +1 -0
- package/dist/llm/LangChainToolsHub.d.ts +31 -0
- package/dist/llm/LangChainToolsHub.d.ts.map +1 -0
- package/dist/llm/OpenAICompatibleClient.d.ts +64 -0
- package/dist/llm/OpenAICompatibleClient.d.ts.map +1 -0
- package/dist/llm/ReActAgent.d.ts +35 -0
- package/dist/llm/ReActAgent.d.ts.map +1 -0
- package/dist/llm-export.cjs +20 -0
- package/dist/llm-export.cjs.map +1 -0
- package/dist/llm-export.d.ts +9 -0
- package/dist/llm-export.d.ts.map +1 -0
- package/dist/llm-export.js +3 -0
- package/dist/llm-export.js.map +1 -0
- package/dist/mcp/MCPClientAdapter.d.ts +34 -0
- package/dist/mcp/MCPClientAdapter.d.ts.map +1 -0
- package/dist/mcp/connectMCP.d.ts +47 -0
- package/dist/mcp/connectMCP.d.ts.map +1 -0
- package/dist/mcp/index.d.ts +10 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/registerMCPTools.d.ts +24 -0
- package/dist/mcp/registerMCPTools.d.ts.map +1 -0
- package/dist/observability/EventLog.d.ts +60 -0
- package/dist/observability/EventLog.d.ts.map +1 -0
- package/dist/observability/Logger.d.ts +33 -0
- package/dist/observability/Logger.d.ts.map +1 -0
- package/dist/observability/Metrics.d.ts +70 -0
- package/dist/observability/Metrics.d.ts.map +1 -0
- package/dist/observability/Tracing.d.ts +69 -0
- package/dist/observability/Tracing.d.ts.map +1 -0
- package/dist/registry/ToolRegistry.d.ts +68 -0
- package/dist/registry/ToolRegistry.d.ts.map +1 -0
- package/dist/report/AgentReportGenerator.d.ts +53 -0
- package/dist/report/AgentReportGenerator.d.ts.map +1 -0
- package/dist/report/agent-report-template.html +362 -0
- package/dist/report/index.d.ts +3 -0
- package/dist/report/index.d.ts.map +1 -0
- package/dist/report/types.d.ts +101 -0
- package/dist/report/types.d.ts.map +1 -0
- package/dist/runAgent.d.ts +37 -0
- package/dist/runAgent.d.ts.map +1 -0
- package/dist/runtime/Budget.d.ts +63 -0
- package/dist/runtime/Budget.d.ts.map +1 -0
- package/dist/runtime/Evidence.d.ts +19 -0
- package/dist/runtime/Evidence.d.ts.map +1 -0
- package/dist/runtime/PTCRuntime.d.ts +115 -0
- package/dist/runtime/PTCRuntime.d.ts.map +1 -0
- package/dist/runtime/PTCRuntimeObservability.d.ts +26 -0
- package/dist/runtime/PTCRuntimeObservability.d.ts.map +1 -0
- package/dist/runtime/PTCRuntimePipeline.d.ts +62 -0
- package/dist/runtime/PTCRuntimePipeline.d.ts.map +1 -0
- package/dist/runtime/PolicyEngine.d.ts +67 -0
- package/dist/runtime/PolicyEngine.d.ts.map +1 -0
- package/dist/runtime/Retry.d.ts +33 -0
- package/dist/runtime/Retry.d.ts.map +1 -0
- package/dist/runtime/SchemaValidator.d.ts +42 -0
- package/dist/runtime/SchemaValidator.d.ts.map +1 -0
- package/dist/templates/mcp-server.js +48 -0
- package/dist/templates/n8n-invoker.js +11 -0
- package/dist/templates/skill-invoker.js +11 -0
- package/dist/templates/tool-index.js +9 -0
- package/dist/toolDescriptor.d.ts +38 -0
- package/dist/toolDescriptor.d.ts.map +1 -0
- package/dist/types/Events.d.ts +99 -0
- package/dist/types/Events.d.ts.map +1 -0
- package/dist/types/ToolIntent.d.ts +40 -0
- package/dist/types/ToolIntent.d.ts.map +1 -0
- package/dist/types/ToolResult.d.ts +30 -0
- package/dist/types/ToolResult.d.ts.map +1 -0
- package/dist/types/ToolSpec.d.ts +99 -0
- package/dist/types/ToolSpec.d.ts.map +1 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -0
- package/extensions/examples/README.md +40 -0
- package/extensions/examples/scripts/agent-tool-react-stock.mjs +30 -0
- package/extensions/examples/tools/instruction-only/skill/SKILL.md +26 -0
- package/extensions/examples/tools/web-search/mcp/mcp.json +8 -0
- package/package.json +122 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/registry/ToolRegistry.ts","../src/runtime/SchemaValidator.ts","../src/runtime/PolicyEngine.ts","../src/runtime/Budget.ts","../src/runtime/Evidence.ts","../src/observability/EventLog.ts","../src/observability/Logger.ts","../src/observability/Metrics.ts","../src/observability/Tracing.ts","../src/runtime/Retry.ts","../src/runtime/PTCRuntimePipeline.ts","../src/runtime/PTCRuntimeObservability.ts","../src/runtime/PTCRuntime.ts","../src/toolDescriptor.ts","../src/discovery/load/MCPLoader.ts","../src/discovery/load/resolveEntry.ts","../src/discovery/load/LangChainLoader.ts","../src/discovery/load/SkillLoader.ts","../src/discovery/scan/DirectoryScanner.ts","../src/discovery/MCPProcessManager.ts","../src/mcp/MCPClientAdapter.ts","../src/mcp/connectMCP.ts","../src/mcp/registerMCPTools.ts","../src/llm/LangChainToolsHub.ts","../src/llm/AgentLLMAdapter.ts","../src/runAgent.ts","../src/report/AgentReportGenerator.ts"],"names":["Ajv","addFormats","bulkhead","circuitBreaker","handleAll","ConsecutiveBreaker","EventEmitter","uuidv4","pRetry","pTimeout","join","readFile","DiscoveryError","stat","pathToFileURL","DEFAULT_EXTENSIONS","readdir","loadSkillDefinition","entryFile","loaded","basename","access","loadN8nTool","DEFAULT_INPUT_SCHEMA","DEFAULT_OUTPUT_SCHEMA","dirname","DynamicTool","resolve","readFileSync","yaml","registerCoreTools","registerExampleTools","createLLMRegistry","ReActAgent","fileURLToPath","existsSync","writeFileSync"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { Capability, ToolKind, ToolSpec } from \"../types/ToolSpec.js\";\n\n/**\n * Search query for tools.\n */\nexport interface ToolSearchQuery {\n /** Text search in name/description/tags */\n text?: string;\n /** Filter by tool kind */\n kind?: ToolKind;\n /** Filter by required capabilities */\n capabilities?: Capability[];\n /** Filter by tags */\n tags?: string[];\n}\n\n/**\n * Tool Registry: manages tool registration, lookup, and search.\n * Supports both static registration and dynamic discovery via adapters.\n */\nexport class ToolRegistry {\n private readonly tools = new Map<string, ToolSpec>();\n private readonly tagIndex = new Map<string, Set<string>>(); // tag → tool names\n private readonly kindIndex = new Map<ToolKind, Set<string>>(); // kind → tool names\n\n /**\n * Register a single tool spec.\n * Overwrites if same name already exists.\n */\n register(spec: ToolSpec): void {\n this.validateSpec(spec);\n this.tools.set(spec.name, spec);\n this.indexTool(spec);\n }\n\n /**\n * Register multiple tool specs at once.\n */\n bulkRegister(specs: ToolSpec[]): void {\n for (const spec of specs) {\n this.register(spec);\n }\n }\n\n /**\n * Unregister a tool by name.\n */\n unregister(name: string): boolean {\n const spec = this.tools.get(name);\n if (!spec) return false;\n this.tools.delete(name);\n this.deindexTool(spec);\n return true;\n }\n\n /**\n * Get a tool spec by name.\n */\n get(name: string): ToolSpec | undefined {\n return this.tools.get(name);\n }\n\n /**\n * Check if a tool exists.\n */\n has(name: string): boolean {\n return this.tools.has(name);\n }\n\n /**\n * Search tools by query.\n */\n search(query: ToolSearchQuery): ToolSpec[] {\n let candidates: ToolSpec[];\n\n // Start with kind filter if specified (uses index)\n if (query.kind) {\n const names = this.kindIndex.get(query.kind);\n if (!names || names.size === 0) return [];\n candidates = [...names]\n .map((n) => this.tools.get(n))\n .filter((s): s is ToolSpec => s !== undefined);\n } else {\n candidates = [...this.tools.values()];\n }\n\n // Filter by tags (uses index for initial candidates if no kind filter)\n if (query.tags && query.tags.length > 0) {\n candidates = candidates.filter((spec) =>\n query.tags!.some((tag) => spec.tags?.includes(tag)),\n );\n }\n\n // Filter by capabilities\n if (query.capabilities && query.capabilities.length > 0) {\n candidates = candidates.filter((spec) =>\n query.capabilities!.every((cap) => spec.capabilities.includes(cap)),\n );\n }\n\n // Filter by text (name, description, tags)\n if (query.text) {\n const lower = query.text.toLowerCase();\n candidates = candidates.filter(\n (spec) =>\n spec.name.toLowerCase().includes(lower) ||\n spec.description?.toLowerCase().includes(lower) ||\n spec.tags?.some((t) => t.toLowerCase().includes(lower)),\n );\n }\n\n return candidates;\n }\n\n /**\n * List all registered tool names.\n */\n list(): string[] {\n return [...this.tools.keys()];\n }\n\n /**\n * Get count of registered tools.\n */\n get size(): number {\n return this.tools.size;\n }\n\n /**\n * Export a snapshot of all registered tools (for debugging/routing).\n */\n snapshot(): ToolSpec[] {\n return [...this.tools.values()];\n }\n\n /**\n * Clear all registered tools.\n */\n clear(): void {\n this.tools.clear();\n this.tagIndex.clear();\n this.kindIndex.clear();\n }\n\n private validateSpec(spec: ToolSpec): void {\n if (!spec.name) throw new Error(\"ToolSpec.name is required\");\n if (!spec.version) throw new Error(\"ToolSpec.version is required\");\n if (!spec.kind) throw new Error(\"ToolSpec.kind is required\");\n if (!spec.inputSchema) throw new Error(\"ToolSpec.inputSchema is required\");\n if (!spec.outputSchema) throw new Error(\"ToolSpec.outputSchema is required\");\n if (!spec.capabilities) throw new Error(\"ToolSpec.capabilities is required\");\n }\n\n private indexTool(spec: ToolSpec): void {\n // Kind index\n let kindSet = this.kindIndex.get(spec.kind);\n if (!kindSet) {\n kindSet = new Set();\n this.kindIndex.set(spec.kind, kindSet);\n }\n kindSet.add(spec.name);\n\n // Tag index\n if (spec.tags) {\n for (const tag of spec.tags) {\n let tagSet = this.tagIndex.get(tag);\n if (!tagSet) {\n tagSet = new Set();\n this.tagIndex.set(tag, tagSet);\n }\n tagSet.add(spec.name);\n }\n }\n }\n\n private deindexTool(spec: ToolSpec): void {\n this.kindIndex.get(spec.kind)?.delete(spec.name);\n if (spec.tags) {\n for (const tag of spec.tags) {\n this.tagIndex.get(tag)?.delete(spec.name);\n }\n }\n }\n}\n","import Ajv, { type ValidateFunction, type ErrorObject } from \"ajv\";\nimport addFormats from \"ajv-formats\";\n\n/**\n * Schema validation result.\n */\nexport interface ValidationResult {\n valid: boolean;\n errors?: ErrorObject[];\n data?: unknown;\n}\n\n/**\n * AJV-based JSON Schema validator with coercion and default enrichment.\n */\nexport class SchemaValidator {\n private readonly ajv: Ajv;\n private readonly cache = new Map<string, ValidateFunction>();\n\n constructor() {\n this.ajv = new Ajv({\n allErrors: true,\n coerceTypes: true,\n useDefaults: true,\n removeAdditional: \"failing\",\n strict: false,\n });\n addFormats(this.ajv);\n }\n\n /**\n * Validate data against a JSON Schema.\n * Coerces types and applies defaults in-place.\n */\n validate(schema: object, data: unknown): ValidationResult {\n const validate = this.getOrCompile(schema);\n const cloned = structuredClone(data);\n const valid = validate(cloned) as boolean;\n\n if (valid) {\n return { valid: true, data: cloned };\n }\n\n return {\n valid: false,\n errors: validate.errors ?? undefined,\n };\n }\n\n /**\n * Validate and return coerced data, or throw a descriptive error.\n */\n validateOrThrow(schema: object, data: unknown, context: string): unknown {\n const result = this.validate(schema, data);\n if (!result.valid) {\n const messages = (result.errors ?? [])\n .map((e) => `${e.instancePath || \"/\"} ${e.message}`)\n .join(\"; \");\n throw new SchemaValidationError(\n `${context}: ${messages}`,\n result.errors ?? [],\n );\n }\n return result.data;\n }\n\n /**\n * Apply default values from schema to data without full validation.\n */\n enrichDefaults(schema: object, data: unknown): unknown {\n const validate = this.getOrCompile(schema);\n const cloned = structuredClone(data);\n validate(cloned);\n return cloned;\n }\n\n private getOrCompile(schema: object): ValidateFunction {\n const 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 \"../types/Events.js\";\n\n/**\n * Event log entry with sequence number.\n */\nexport interface LogEntry {\n seq: number;\n event: AnyToolEvent;\n}\n\n/**\n * Event log listener type.\n */\nexport type EventListener = (entry: LogEntry) => void;\n\n/**\n * Append-only event log for tool invocations.\n * Supports in-memory storage with configurable max size and event subscriptions.\n */\nexport class EventLog {\n private readonly entries: LogEntry[] = [];\n private seq = 0;\n private readonly maxEntries: number;\n private readonly emitter = new EventEmitter();\n\n constructor(options: { maxEntries?: number } = {}) {\n this.maxEntries = options.maxEntries ?? 10_000;\n }\n\n /**\n * Append an event to the log.\n */\n append(event: AnyToolEvent): LogEntry {\n const entry: LogEntry = { seq: ++this.seq, event };\n\n this.entries.push(entry);\n\n // Trim if over max\n if (this.entries.length > this.maxEntries) {\n this.entries.shift();\n }\n\n // Emit to subscribers\n this.emitter.emit(\"event\", entry);\n this.emitter.emit(event.type, entry);\n\n return entry;\n }\n\n /**\n * Subscribe to all events.\n */\n on(listener: EventListener): () => void {\n this.emitter.on(\"event\", listener);\n return () => this.emitter.off(\"event\", listener);\n }\n\n /**\n * Subscribe to events of a specific type.\n */\n onType(type: ToolEventType, listener: EventListener): () => void {\n this.emitter.on(type, listener);\n return () => this.emitter.off(type, listener);\n }\n\n /**\n * Query events by filter.\n */\n query(filter: {\n type?: ToolEventType;\n toolName?: string;\n requestId?: string;\n since?: number; // seq number\n limit?: number;\n }): LogEntry[] {\n let results = this.entries;\n\n if (filter.since !== undefined) {\n results = results.filter((e) => e.seq > filter.since!);\n }\n if (filter.type) {\n results = results.filter((e) => e.event.type === filter.type);\n }\n if (filter.toolName) {\n results = results.filter((e) => e.event.toolName === filter.toolName);\n }\n if (filter.requestId) {\n results = results.filter((e) => e.event.requestId === filter.requestId);\n }\n if (filter.limit) {\n results = results.slice(-filter.limit);\n }\n\n return results;\n }\n\n /**\n * Get all entries.\n */\n getAll(): readonly LogEntry[] {\n return this.entries;\n }\n\n /**\n * Get entry count.\n */\n get size(): number {\n return this.entries.length;\n }\n\n /**\n * Clear all entries (for testing).\n */\n clear(): void {\n this.entries.length = 0;\n this.seq = 0;\n }\n}\n","export type LogLevel = \"silent\" | \"error\" | \"warn\" | \"info\" | \"debug\" | \"trace\";\n\nexport interface DebugOptions {\n enabled?: boolean;\n level?: LogLevel;\n includeArgs?: boolean;\n includeResults?: boolean;\n includeRaw?: boolean;\n logEvents?: boolean;\n prefix?: string;\n}\n\nexport interface ResolvedDebugOptions {\n enabled: boolean;\n level: LogLevel;\n includeArgs: boolean;\n includeResults: boolean;\n includeRaw: boolean;\n logEvents: boolean;\n prefix: string;\n}\n\nexport interface Logger {\n options: ResolvedDebugOptions;\n isEnabled(level: LogLevel): boolean;\n error(message: string, meta?: Record<string, unknown>): void;\n warn(message: string, meta?: Record<string, unknown>): void;\n info(message: string, meta?: Record<string, unknown>): void;\n debug(message: string, meta?: Record<string, unknown>): void;\n trace(message: string, meta?: Record<string, unknown>): void;\n}\n\nconst LEVEL_ORDER: Record<LogLevel, number> = {\n silent: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n trace: 5,\n};\n\nexport function createLogger(options: DebugOptions = {}): Logger {\n const resolved = resolveDebugOptions(options);\n\n const log = (level: LogLevel, message: string, meta?: Record<string, unknown>) => {\n if (!resolved.enabled) return;\n if (LEVEL_ORDER[level] > LEVEL_ORDER[resolved.level]) return;\n\n const prefix = `[${resolved.prefix}]`;\n const levelTag = `[${level.toUpperCase()}]`;\n const metaText = meta ? ` ${safeStringify(meta, 1000)}` : \"\";\n\n switch (level) {\n case \"error\":\n console.error(`${prefix} ${levelTag} ${message}${metaText}`);\n break;\n case \"warn\":\n console.warn(`${prefix} ${levelTag} ${message}${metaText}`);\n break;\n case \"info\":\n console.info(`${prefix} ${levelTag} ${message}${metaText}`);\n break;\n default:\n console.log(`${prefix} ${levelTag} ${message}${metaText}`);\n break;\n }\n };\n\n return {\n options: resolved,\n isEnabled: (level) => resolved.enabled && LEVEL_ORDER[level] <= LEVEL_ORDER[resolved.level],\n error: (message, meta) => log(\"error\", message, meta),\n warn: (message, meta) => log(\"warn\", message, meta),\n info: (message, meta) => log(\"info\", message, meta),\n debug: (message, meta) => log(\"debug\", message, meta),\n trace: (message, meta) => log(\"trace\", message, meta),\n };\n}\n\nexport function resolveDebugOptions(options: DebugOptions = {}): ResolvedDebugOptions {\n const envLevel = parseEnvLogLevel();\n const enabledFromEnv = envLevel !== undefined && envLevel !== \"silent\";\n const enabled = options.enabled ?? enabledFromEnv ?? false;\n const level =\n options.level ?? envLevel ?? (enabled ? \"debug\" : \"silent\");\n\n return {\n enabled,\n level,\n includeArgs: options.includeArgs ?? false,\n includeResults: options.includeResults ?? false,\n includeRaw: options.includeRaw ?? false,\n logEvents: options.logEvents ?? false,\n prefix: options.prefix ?? \"agent-tool\",\n };\n}\n\nexport function sanitizeForLog(value: unknown, maxLen = 500): string {\n const str = safeStringify(value, maxLen);\n return str.replace(\n /\"(password|token|secret|key|auth)\":\\s*\"[^\"]*\"/gi,\n \"\\\"$1\\\":\\\"[REDACTED]\\\"\",\n );\n}\n\nexport function summarizeForLog(value: unknown, maxLen = 200): string {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n if (typeof value === \"string\") {\n return value.length > maxLen ? `${value.slice(0, maxLen)}...` : value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (Array.isArray(value)) {\n return `Array(${value.length})`;\n }\n if (typeof value === \"object\") {\n const keys = Object.keys(value as Record<string, unknown>);\n const shown = keys.slice(0, 5).join(\", \");\n return `Object(keys: ${shown}${keys.length > 5 ? \", ...\" : \"\"})`;\n }\n return String(value);\n}\n\nfunction safeStringify(value: unknown, maxLen: number): string {\n try {\n const json = JSON.stringify(value);\n if (!json) return String(value);\n return json.length > maxLen ? `${json.slice(0, maxLen)}...` : json;\n } catch {\n const fallback = String(value);\n return fallback.length > maxLen ? `${fallback.slice(0, maxLen)}...` : fallback;\n }\n}\n\nfunction parseEnvLogLevel(): LogLevel | undefined {\n const raw =\n process.env.TOOLHUB_LOG_LEVEL ??\n process.env.TOOLHUB_DEBUG ??\n process.env.DEBUG;\n\n if (!raw) return undefined;\n const value = raw.trim().toLowerCase();\n if (!value || value === \"0\" || value === \"false\" || value === \"off\") {\n return \"silent\";\n }\n if (value.includes(\"trace\")) return \"trace\";\n if (value.includes(\"debug\") || value === \"1\" || value === \"true\" || value === \"yes\") {\n return \"debug\";\n }\n if (value.includes(\"info\")) return \"info\";\n if (value.includes(\"warn\")) return \"warn\";\n if (value.includes(\"error\")) return \"error\";\n if (value.includes(\"silent\")) return \"silent\";\n return \"debug\";\n}\n","/**\n * Simple counter metric.\n */\nexport interface CounterValue {\n name: string;\n labels: Record<string, string>;\n value: number;\n}\n\n/**\n * Histogram bucket.\n */\nexport interface HistogramValue {\n name: string;\n labels: Record<string, string>;\n count: number;\n sum: number;\n buckets: Map<number, number>; // upper bound → count\n}\n\n/**\n * Lightweight metrics collector for tool invocations.\n * Provides counters and histograms with label support.\n */\nexport class Metrics {\n private readonly counters = new Map<string, number>();\n private readonly histograms = new Map<\n string,\n { count: number; sum: number; values: number[] }\n >();\n\n private readonly defaultBuckets = [\n 5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000,\n ];\n\n /**\n * Increment a counter.\n */\n increment(name: string, labels: Record<string, string> = {}, value = 1): void {\n const key = this.makeKey(name, labels);\n this.counters.set(key, (this.counters.get(key) ?? 0) + value);\n }\n\n /**\n * Record a value in a histogram.\n */\n observe(name: string, labels: Record<string, string>, value: number): void {\n const key = this.makeKey(name, labels);\n let hist = this.histograms.get(key);\n if (!hist) {\n hist = { count: 0, sum: 0, values: [] };\n this.histograms.set(key, hist);\n }\n hist.count++;\n hist.sum += value;\n hist.values.push(value);\n }\n\n /**\n * Get a counter value.\n */\n getCounter(name: string, labels: Record<string, string> = {}): number {\n return this.counters.get(this.makeKey(name, labels)) ?? 0;\n }\n\n /**\n * Get histogram stats.\n */\n getHistogram(\n name: string,\n labels: Record<string, string>,\n ): HistogramValue | undefined {\n const key = this.makeKey(name, labels);\n const hist = this.histograms.get(key);\n if (!hist) return undefined;\n\n const buckets = new Map<number, number>();\n for (const bound of this.defaultBuckets) {\n buckets.set(bound, hist.values.filter((v) => v <= bound).length);\n }\n\n return { name, labels, count: hist.count, sum: hist.sum, buckets };\n }\n\n /**\n * Get all counter values.\n */\n getAllCounters(): CounterValue[] {\n const results: CounterValue[] = [];\n for (const [key, value] of this.counters) {\n const { name, labels } = this.parseKey(key);\n results.push({ name, labels, value });\n }\n return results;\n }\n\n /**\n * Get all histogram values.\n */\n getAllHistograms(): HistogramValue[] {\n const results: HistogramValue[] = [];\n for (const [key, hist] of this.histograms) {\n const { name, labels } = this.parseKey(key);\n const buckets = new Map<number, number>();\n for (const bound of this.defaultBuckets) {\n buckets.set(bound, hist.values.filter((v) => v <= bound).length);\n }\n results.push({ name, labels, count: hist.count, sum: hist.sum, buckets });\n }\n return results;\n }\n\n /**\n * Record standard tool invocation metrics.\n */\n recordInvocation(toolName: string, ok: boolean, durationMs: number): void {\n this.increment(\"tool_invocations_total\", {\n toolName,\n ok: String(ok),\n });\n this.observe(\"tool_latency_ms\", { toolName }, durationMs);\n }\n\n /**\n * Record a retry event.\n */\n recordRetry(toolName: string): void {\n this.increment(\"tool_retries_total\", { toolName });\n }\n\n /**\n * Record a policy denial.\n */\n recordPolicyDenied(toolName: string, reason: string): void {\n this.increment(\"policy_denied_total\", { toolName, reason });\n }\n\n /**\n * Reset all metrics (for testing).\n */\n reset(): void {\n this.counters.clear();\n this.histograms.clear();\n }\n\n private makeKey(name: string, labels: Record<string, string>): string {\n const sortedLabels = Object.entries(labels)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${k}=${v}`)\n .join(\",\");\n return `${name}{${sortedLabels}}`;\n }\n\n private parseKey(key: string): {\n name: string;\n labels: Record<string, string>;\n } {\n const match = key.match(/^(.+?)\\{(.*)\\}$/);\n if (!match) return { name: key, labels: {} };\n const labels: Record<string, string> = {};\n if (match[2]) {\n for (const part of match[2].split(\",\")) {\n const [k, v] = part.split(\"=\");\n if (k && v !== undefined) labels[k] = v;\n }\n }\n return { name: match[1]!, labels };\n }\n}\n","import { v4 as uuidv4 } from \"uuid\";\n\n/**\n * A trace span representing a unit of work.\n */\nexport interface Span {\n spanId: string;\n traceId: string;\n parentSpanId?: string;\n name: string;\n startTime: number; // ms epoch\n endTime?: number;\n durationMs?: number;\n status: \"ok\" | \"error\" | \"in_progress\";\n attributes: Record<string, string | number | boolean>;\n events: SpanEvent[];\n}\n\n/**\n * An event within a span.\n */\nexport interface SpanEvent {\n name: string;\n timestamp: number;\n attributes?: Record<string, string | number | boolean>;\n}\n\n/**\n * Lightweight tracing system for tool invocation spans.\n * Compatible with OpenTelemetry trace/span ID format.\n */\nexport class Tracing {\n private readonly spans = new Map<string, Span>();\n private readonly traceSpans = new Map<string, string[]>(); // traceId → spanIds\n\n /**\n * Start a new span.\n */\n startSpan(options: {\n name: string;\n traceId?: string;\n parentSpanId?: string;\n attributes?: Record<string, string | number | boolean>;\n }): Span {\n const span: Span = {\n spanId: uuidv4(),\n traceId: options.traceId ?? uuidv4(),\n parentSpanId: options.parentSpanId,\n name: options.name,\n startTime: Date.now(),\n status: \"in_progress\",\n attributes: options.attributes ?? {},\n events: [],\n };\n\n this.spans.set(span.spanId, span);\n\n const traceList = this.traceSpans.get(span.traceId) ?? [];\n traceList.push(span.spanId);\n this.traceSpans.set(span.traceId, traceList);\n\n return span;\n }\n\n /**\n * End a span and calculate duration.\n */\n endSpan(spanId: string, status: \"ok\" | \"error\" = \"ok\"): Span | undefined {\n const span = this.spans.get(spanId);\n if (!span) return undefined;\n\n span.endTime = Date.now();\n span.durationMs = span.endTime - span.startTime;\n span.status = status;\n return span;\n }\n\n /**\n * Add an event to a span.\n */\n addEvent(\n spanId: string,\n name: string,\n attributes?: Record<string, string | number | boolean>,\n ): void {\n const span = this.spans.get(spanId);\n if (!span) return;\n span.events.push({ name, timestamp: Date.now(), attributes });\n }\n\n /**\n * Set attributes on a span.\n */\n setAttributes(\n spanId: string,\n attributes: Record<string, string | number | boolean>,\n ): void {\n const span = this.spans.get(spanId);\n if (!span) return;\n Object.assign(span.attributes, attributes);\n }\n\n /**\n * Get a span by ID.\n */\n getSpan(spanId: string): Span | undefined {\n return this.spans.get(spanId);\n }\n\n /**\n * Get all spans for a trace.\n */\n getTrace(traceId: string): Span[] {\n const spanIds = this.traceSpans.get(traceId) ?? [];\n return spanIds\n .map((id) => this.spans.get(id))\n .filter((s): s is Span => s !== undefined);\n }\n\n /**\n * Create a child span from a parent.\n */\n createChildSpan(\n parentSpanId: string,\n name: string,\n attributes?: Record<string, string | number | boolean>,\n ): Span | undefined {\n const parent = this.spans.get(parentSpanId);\n if (!parent) return undefined;\n return this.startSpan({\n name,\n traceId: parent.traceId,\n parentSpanId: parent.spanId,\n attributes,\n });\n }\n\n /**\n * Clear all traces (for testing).\n */\n clear(): void {\n this.spans.clear();\n this.traceSpans.clear();\n }\n}\n","import pRetry, { type Options as PRetryOptions } from \"p-retry\";\n\n/**\n * Retry configuration.\n */\nexport interface RetryOptions {\n /** Maximum number of retries (default: 2) */\n maxRetries?: number;\n /** Base delay in ms for exponential backoff (default: 1000) */\n baseDelayMs?: number;\n /** Maximum delay in ms (default: 10000) */\n maxDelayMs?: number;\n /** Jitter factor 0-1 (default: 0.1) */\n jitter?: number;\n /** Error filter: return true to retry, false to abort */\n shouldRetry?: (error: Error) => boolean;\n /** Callback on each retry attempt */\n onRetry?: (error: Error, attempt: number) => void;\n}\n\n/**\n * Default errors that should NOT be retried (deterministic failures).\n */\nconst NON_RETRYABLE_ERRORS = new Set([\n \"TOOL_NOT_FOUND\",\n \"INPUT_SCHEMA_INVALID\",\n \"POLICY_DENIED\",\n \"HITL_DENIED\",\n \"OUTPUT_SCHEMA_INVALID\",\n \"PATH_OUTSIDE_SANDBOX\",\n \"FILE_TOO_LARGE\",\n \"HTTP_DISALLOWED_HOST\",\n \"HTTP_TOO_LARGE\",\n]);\n\n/**\n * Determine if an error is retryable.\n */\nexport function isRetryable(error: unknown): boolean {\n if (error instanceof Error) {\n const kind = (error as Error & { kind?: string }).kind;\n if (kind && NON_RETRYABLE_ERRORS.has(kind)) return false;\n }\n return true;\n}\n\n/**\n * Execute a function with retry logic using exponential backoff.\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n options: RetryOptions = {},\n): Promise<T> {\n const {\n maxRetries = 2,\n baseDelayMs = 1000,\n maxDelayMs = 10_000,\n jitter = 0.1,\n shouldRetry,\n onRetry,\n } = options;\n\n if (maxRetries <= 0) {\n return fn();\n }\n\n const pRetryOptions: PRetryOptions = {\n retries: maxRetries,\n minTimeout: baseDelayMs,\n maxTimeout: maxDelayMs,\n randomize: true,\n factor: 2,\n onFailedAttempt: (error) => {\n // Apply jitter\n if (jitter > 0 && error.retriesLeft > 0) {\n // jitterMs calculated but p-retry handles backoff internally\n void (Math.random() * jitter * baseDelayMs);\n }\n\n // Check if should retry\n if (shouldRetry && !shouldRetry(error)) {\n throw error; // Abort retry\n }\n\n if (!isRetryable(error)) {\n throw error; // Non-retryable error kind\n }\n\n onRetry?.(error, maxRetries - error.retriesLeft);\n },\n };\n\n return pRetry(fn, pRetryOptions);\n}\n\n/**\n * Create a tagged error with a kind field for retry classification.\n */\nexport function createTaggedError(\n kind: string,\n message: string,\n details?: unknown,\n): Error & { kind: string; details?: unknown } {\n const error = new Error(message) as Error & {\n kind: string;\n details?: unknown;\n };\n error.kind = kind;\n error.details = details;\n return error;\n}\n","import pTimeout from \"p-timeout\";\nimport type { ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext } from \"../types/ToolIntent.js\";\nimport type { ToolAdapter } from \"../types/ToolSpec.js\";\nimport { SchemaValidator, SchemaValidationError } from \"./SchemaValidator.js\";\nimport { PolicyEngine, PolicyDeniedError } from \"./PolicyEngine.js\";\nimport { BudgetManager } from \"./Budget.js\";\nimport { withRetry, createTaggedError } from \"./Retry.js\";\nimport type {\n PolicyDeniedEvent,\n RetryEvent,\n HitlApprovalRequestedEvent,\n HitlApprovalGrantedEvent,\n HitlApprovalDeniedEvent,\n} from \"../types/Events.js\";\nimport type { HitlSideEffect } from \"../types/ToolSpec.js\";\nimport { EventLog } from \"../observability/EventLog.js\";\nimport { Metrics } from \"../observability/Metrics.js\";\nimport { Tracing } from \"../observability/Tracing.js\";\nimport type { Logger } from \"../observability/Logger.js\";\n\n/** Called when tool has sideEffect external_write/destructive; return true/void to approve, false to deny. */\nexport type OnApprovalRequired = (\n spec: ToolSpec,\n args: unknown,\n ctx: ExecContext,\n) => Promise<boolean | void>;\n\nexport interface PipelineDependencies {\n registry: { get(name: string): ToolSpec | undefined; snapshot(): ToolSpec[] };\n adapters: Map<string, ToolAdapter>;\n validator: SchemaValidator;\n policy: PolicyEngine;\n budget: BudgetManager;\n eventLog: EventLog;\n metrics: Metrics;\n tracing: Tracing;\n logger: Logger;\n defaultMaxRetries?: number;\n /** HITL: when set, tools with sideEffect external_write/destructive require human approval before execute */\n onApprovalRequired?: OnApprovalRequired;\n}\n\n/**\n * Pipeline step: Resolve tool from registry.\n */\nexport function resolveTool(\n toolName: string,\n registry: PipelineDependencies[\"registry\"],\n): ToolSpec {\n const spec = registry.get(toolName);\n if (!spec) {\n throw createTaggedError(\n \"TOOL_NOT_FOUND\",\n `Tool not found: ${toolName}`,\n { availableTools: registry.snapshot().slice(0, 20).map(s => s.name) },\n );\n }\n return spec;\n}\n\n/**\n * Pipeline step: Validate input against schema.\n */\nexport function validateInput(\n spec: ToolSpec,\n args: unknown,\n validator: SchemaValidator,\n): unknown {\n try {\n return validator.validateOrThrow(\n spec.inputSchema,\n args,\n `Input validation failed for ${spec.name}`,\n );\n } catch (error) {\n if (error instanceof SchemaValidationError) {\n throw createTaggedError(\"INPUT_SCHEMA_INVALID\", error.message, {\n errors: error.errors,\n schema: spec.inputSchema,\n });\n }\n throw error;\n }\n}\n\n/**\n * Pipeline step: Enrich args with defaults from schema.\n */\nexport function enrichDefaults(\n spec: ToolSpec,\n args: unknown,\n validator: SchemaValidator,\n): unknown {\n return validator.enrichDefaults(spec.inputSchema, args);\n}\n\n/**\n * Pipeline step: Enforce policy checks.\n */\nexport function enforcePolicy(\n spec: ToolSpec,\n args: unknown,\n ctx: ExecContext,\n deps: Pick<\n PipelineDependencies,\n \"policy\" | \"eventLog\" | \"metrics\" | \"tracing\"\n >,\n): void {\n try {\n deps.policy.enforce(spec, args, ctx);\n } catch (error) {\n if (error instanceof PolicyDeniedError) {\n // Emit policy denied event\n const event: PolicyDeniedEvent = {\n type: \"POLICY_DENIED\",\n timestamp: new Date().toISOString(),\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n toolName: spec.name,\n traceId: ctx.traceId,\n userId: ctx.userId,\n reason: error.message,\n missingCapabilities: error.missingCapabilities?.map(String),\n };\n deps.eventLog.append(event);\n deps.metrics.recordPolicyDenied(spec.name, error.message);\n }\n throw error;\n }\n}\n\nconst HITL_GATED_SIDE_EFFECTS: HitlSideEffect[] = [\"external_write\", \"destructive\"];\n\n/**\n * Pipeline step: Human-in-the-loop approval for external_write/destructive tools.\n * When onApprovalRequired is set, waits for callback resolve(true/void) before continuing; resolve(false) or reject throws HITL_DENIED.\n */\nexport async function requireHumanApproval(\n spec: ToolSpec,\n args: unknown,\n ctx: ExecContext,\n deps: Pick<PipelineDependencies, \"onApprovalRequired\" | \"eventLog\" | \"logger\">,\n): Promise<void> {\n const sideEffect = (spec._meta?.hitl?.sideEffect ?? \"none\") as HitlSideEffect;\n if (!HITL_GATED_SIDE_EFFECTS.includes(sideEffect)) return;\n const onApproval = deps.onApprovalRequired;\n if (!onApproval) return;\n\n const baseEvent = {\n timestamp: new Date().toISOString(),\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n toolName: spec.name,\n traceId: ctx.traceId,\n userId: ctx.userId,\n };\n\n const requested: HitlApprovalRequestedEvent = {\n ...baseEvent,\n type: \"HITL_APPROVAL_REQUESTED\",\n sideEffect,\n };\n deps.eventLog.append(requested);\n deps.logger.trace(\"hitl.requested\", { tool: spec.name, sideEffect, requestId: ctx.requestId });\n\n let approved: boolean | void;\n try {\n approved = await onApproval(spec, args, ctx);\n } catch (err) {\n deps.eventLog.append({\n ...baseEvent,\n type: \"HITL_APPROVAL_DENIED\",\n sideEffect,\n reason: err instanceof Error ? err.message : String(err),\n } as HitlApprovalDeniedEvent);\n throw createTaggedError(\n \"HITL_DENIED\",\n `Human denied approval for ${spec.name} (${sideEffect})`,\n { reason: err instanceof Error ? err.message : String(err) },\n );\n }\n\n if (approved === false) {\n deps.eventLog.append({\n ...baseEvent,\n type: \"HITL_APPROVAL_DENIED\",\n sideEffect,\n reason: \"User rejected\",\n } as HitlApprovalDeniedEvent);\n throw createTaggedError(\"HITL_DENIED\", `Human denied approval for ${spec.name} (${sideEffect})`);\n }\n\n deps.eventLog.append({\n ...baseEvent,\n type: \"HITL_APPROVAL_GRANTED\",\n sideEffect,\n } as HitlApprovalGrantedEvent);\n deps.logger.trace(\"hitl.granted\", { tool: spec.name, sideEffect, requestId: ctx.requestId });\n}\n\n/**\n * Pipeline step: Execute tool with budget, retry, and timeout.\n */\nexport async function executeWithBudget(\n spec: ToolSpec,\n args: unknown,\n ctx: ExecContext,\n spanId: string,\n deps: PipelineDependencies,\n): Promise<{ result: unknown; raw?: unknown }> {\n const adapter = deps.adapters.get(spec.kind);\n if (!adapter) {\n throw createTaggedError(\n \"TOOL_NOT_FOUND\",\n `No adapter registered for kind: ${spec.kind}`,\n );\n }\n\n const timeoutMs = deps.budget.getTimeout(\n spec.name,\n ctx.budget?.timeoutMs,\n );\n const maxRetries = ctx.budget?.maxRetries ?? deps.defaultMaxRetries ?? 2;\n\n const executeFn = async () => {\n return deps.budget.execute(spec.name, async () => {\n deps.tracing.addEvent(spanId, \"execute_start\");\n deps.logger.trace(\"execute.start\", {\n tool: spec.name,\n requestId: ctx.requestId,\n timeoutMs,\n maxRetries,\n });\n const result = await adapter.invoke(spec, args, ctx);\n deps.tracing.addEvent(spanId, \"execute_end\");\n deps.logger.trace(\"execute.end\", {\n tool: spec.name,\n requestId: ctx.requestId,\n });\n return result;\n });\n };\n\n // Wrap with retry\n const retryFn = () =>\n withRetry(executeFn, {\n maxRetries,\n onRetry: (error, attempt) => {\n deps.metrics.recordRetry(spec.name);\n const event: RetryEvent = {\n type: \"RETRY\",\n timestamp: new Date().toISOString(),\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n toolName: spec.name,\n traceId: ctx.traceId,\n userId: ctx.userId,\n attempt,\n maxRetries,\n reason: error.message,\n };\n deps.eventLog.append(event);\n deps.tracing.addEvent(spanId, \"retry\", { attempt, reason: error.message });\n },\n });\n\n // Wrap with timeout\n try {\n return await pTimeout(retryFn(), {\n milliseconds: timeoutMs,\n message: `Tool ${spec.name} timed out after ${timeoutMs}ms`,\n });\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"timed out\")) {\n throw createTaggedError(\"TIMEOUT\", error.message);\n }\n throw error;\n }\n}\n\n/**\n * Pipeline step: Validate output against schema.\n */\nexport function validateOutput(\n spec: ToolSpec,\n result: unknown,\n validator: SchemaValidator,\n): unknown {\n try {\n return validator.validateOrThrow(\n spec.outputSchema,\n result,\n `Output validation failed for ${spec.name}`,\n );\n } catch (error) {\n if (error instanceof SchemaValidationError) {\n throw createTaggedError(\"OUTPUT_SCHEMA_INVALID\", error.message, {\n errors: error.errors,\n });\n }\n throw error;\n }\n}\n","import type { ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext, ToolIntent } from \"../types/ToolIntent.js\";\nimport type { Evidence, ToolResult } from \"../types/ToolResult.js\";\nimport type {\n ToolCalledEvent,\n ToolResultEvent,\n} from \"../types/Events.js\";\nimport { EventLog } from \"../observability/EventLog.js\";\nimport { Metrics } from \"../observability/Metrics.js\";\nimport { Tracing } from \"../observability/Tracing.js\";\nimport { sanitizeForLog, summarizeForLog } from \"../observability/Logger.js\";\nimport type { Logger } from \"../observability/Logger.js\";\n\nexport interface ObservabilityDependencies {\n eventLog: EventLog;\n metrics: Metrics;\n tracing: Tracing;\n logger: Logger;\n}\n\n/**\n * Emit TOOL_CALLED event.\n */\nexport function emitToolCalled(\n intent: ToolIntent,\n ctx: ExecContext,\n deps: ObservabilityDependencies,\n): void {\n const event: ToolCalledEvent = {\n type: \"TOOL_CALLED\",\n timestamp: new Date().toISOString(),\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n toolName: intent.tool,\n traceId: ctx.traceId,\n userId: ctx.userId,\n argsSummary: sanitizeArgs(intent.args),\n purpose: intent.purpose,\n idempotencyKey: intent.idempotencyKey,\n };\n deps.eventLog.append(event);\n}\n\n/**\n * Record successful tool invocation.\n */\nexport function recordSuccess(\n spec: ToolSpec,\n durationMs: number,\n _evidence: Evidence[],\n spanId: string,\n deps: ObservabilityDependencies,\n): void {\n deps.metrics.recordInvocation(spec.name, true, durationMs);\n deps.tracing.setAttributes(spanId, {\n \"tool.duration_ms\": durationMs,\n \"tool.ok\": true,\n });\n deps.tracing.endSpan(spanId, \"ok\");\n}\n\n/**\n * Handle error and return ToolResult.\n */\nexport function handleError(\n error: unknown,\n intent: ToolIntent,\n ctx: ExecContext,\n durationMs: number,\n spanId: string,\n deps: ObservabilityDependencies,\n): ToolResult {\n const kind = (error as any)?.kind ?? \"UPSTREAM_ERROR\";\n const message =\n error instanceof Error ? error.message : String(error);\n const details = (error as any)?.details;\n\n // Metrics & tracing\n deps.metrics.recordInvocation(intent.tool, false, durationMs);\n deps.tracing.setAttributes(spanId, {\n \"tool.duration_ms\": durationMs,\n \"tool.ok\": false,\n \"tool.error_kind\": kind,\n });\n deps.tracing.endSpan(spanId, \"error\");\n\n // Event log\n const event: ToolResultEvent = {\n type: \"TOOL_RESULT\",\n timestamp: new Date().toISOString(),\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n toolName: intent.tool,\n traceId: ctx.traceId,\n userId: ctx.userId,\n ok: false,\n durationMs,\n resultSummary: message,\n evidence: [],\n error: { kind, message, details },\n };\n deps.eventLog.append(event);\n\n deps.logger.warn(\"invoke.error\", {\n tool: intent.tool,\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n traceId: ctx.traceId,\n kind,\n message,\n durationMs,\n details: deps.logger.options.includeResults\n ? summarizeForLog(details)\n : undefined,\n });\n\n return {\n ok: false,\n evidence: [],\n error: { kind, message, details },\n };\n}\n\nfunction sanitizeArgs(args: unknown): string {\n if (!args) return \"{}\";\n return sanitizeForLog(args);\n}\n","import type { ToolAdapter, ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext, ToolIntent } from \"../types/ToolIntent.js\";\nimport type { ToolResult, Evidence } from \"../types/ToolResult.js\";\nimport { ToolRegistry } from \"../registry/ToolRegistry.js\";\nimport { SchemaValidator } from \"./SchemaValidator.js\";\nimport { PolicyEngine } from \"./PolicyEngine.js\";\nimport { BudgetManager } from \"./Budget.js\";\nimport { buildEvidence } from \"./Evidence.js\";\nimport { EventLog } from \"../observability/EventLog.js\";\nimport { createLogger, summarizeForLog, sanitizeForLog } from \"../observability/Logger.js\";\nimport type { DebugOptions, Logger } from \"../observability/Logger.js\";\nimport { Metrics } from \"../observability/Metrics.js\";\nimport { Tracing } from \"../observability/Tracing.js\";\nimport type { PolicyConfig } from \"./PolicyEngine.js\";\nimport type { BudgetOptions } from \"./Budget.js\";\nimport { createTaggedError } from \"./Retry.js\";\nimport {\n resolveTool,\n validateInput,\n enrichDefaults,\n enforcePolicy,\n requireHumanApproval,\n executeWithBudget,\n validateOutput,\n type PipelineDependencies,\n} from \"./PTCRuntimePipeline.js\";\nimport {\n emitToolCalled,\n recordSuccess,\n handleError,\n type ObservabilityDependencies,\n} from \"./PTCRuntimeObservability.js\";\n\n/**\n * PTC Runtime configuration.\n */\nexport interface PTCRuntimeConfig {\n policy?: PolicyConfig;\n budget?: BudgetOptions;\n /** Include raw response in ToolResult (default: true, disable in production) */\n includeRaw?: boolean;\n /** Maximum retries if not specified in context (default: 2) */\n defaultMaxRetries?: number;\n /** Debug/logging configuration */\n debug?: DebugOptions;\n /** HITL: when set, tools with sideEffect external_write/destructive require human approval before execute; callback returns true/void to approve, false to deny */\n onApprovalRequired?: (\n spec: import(\"../types/ToolSpec.js\").ToolSpec,\n args: unknown,\n ctx: import(\"../types/ToolIntent.js\").ExecContext,\n ) => Promise<boolean | void>;\n}\n\n/**\n * PTC Runtime: the unified execution kernel for all tool invocations.\n *\n * Enforces the mandatory 9-step pipeline:\n * 1. Resolve (Registry lookup)\n * 2. Input Validate (AJV)\n * 3. Defaults Enrich\n * 4. Policy Gate\n * 5. Budget check\n * 6. HITL approval (if onApprovalRequired set and tool sideEffect external_write/destructive)\n * 7. Execute (adapter.invoke())\n * 8. Output Validate (AJV)\n * 9. Evidence Build\n * 10. Audit & Metrics\n *\n * Never throws to callers - always returns ToolResult.\n */\nexport class PTCRuntime {\n private readonly registry: ToolRegistry;\n private readonly adapters = new Map<string, ToolAdapter>();\n private readonly validator: SchemaValidator;\n private readonly policy: PolicyEngine;\n private readonly budget: BudgetManager;\n private readonly eventLog: EventLog;\n private readonly metrics: Metrics;\n private readonly tracing: Tracing;\n private readonly config: PTCRuntimeConfig;\n private readonly logger: Logger;\n\n constructor(\n options: {\n registry?: ToolRegistry;\n validator?: SchemaValidator;\n policy?: PolicyEngine;\n budget?: BudgetManager;\n eventLog?: EventLog;\n metrics?: Metrics;\n tracing?: Tracing;\n config?: PTCRuntimeConfig;\n } = {},\n ) {\n this.config = options.config ?? {};\n this.registry = options.registry ?? new ToolRegistry();\n this.validator = options.validator ?? new SchemaValidator();\n this.policy = options.policy ?? new PolicyEngine(this.config.policy);\n this.budget = options.budget ?? new BudgetManager(this.config.budget);\n this.eventLog = options.eventLog ?? new EventLog();\n this.metrics = options.metrics ?? new Metrics();\n this.tracing = options.tracing ?? new Tracing();\n this.logger = createLogger({ ...this.config.debug, prefix: \"PTCRuntime\" });\n\n if (this.logger.options.logEvents) {\n this.eventLog.on((entry) => {\n const event = entry.event;\n this.logger.debug(\"event\", {\n seq: entry.seq,\n type: event.type,\n toolName: event.toolName,\n requestId: event.requestId,\n taskId: event.taskId,\n ok: \"ok\" in event ? event.ok : undefined,\n });\n });\n }\n }\n\n /**\n * Register an adapter for a tool kind.\n */\n registerAdapter(adapter: ToolAdapter): void {\n this.adapters.set(adapter.kind, adapter);\n }\n\n /**\n * Get an adapter by kind (e.g. \"mcp\"). Use to set MCP client via adapter.setClient().\n */\n getAdapter(kind: string): ToolAdapter | undefined {\n return this.adapters.get(kind);\n }\n\n /**\n * Get the tool registry.\n */\n getRegistry(): ToolRegistry {\n return this.registry;\n }\n\n /**\n * Get the event log.\n */\n getEventLog(): EventLog {\n return this.eventLog;\n }\n\n /**\n * Get the metrics collector.\n */\n getMetrics(): Metrics {\n return this.metrics;\n }\n\n /**\n * Get the tracing system.\n */\n getTracing(): Tracing {\n return this.tracing;\n }\n\n /**\n * Invoke a tool through the PTC pipeline.\n * Never throws - always returns a structured ToolResult.\n */\n async invoke(intent: ToolIntent, ctx: ExecContext): Promise<ToolResult> {\n const startTime = Date.now();\n if (this.logger.isEnabled(\"debug\")) {\n this.logger.debug(\"invoke.start\", {\n tool: intent.tool,\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n traceId: ctx.traceId,\n purpose: intent.purpose,\n args: this.logger.options.includeArgs\n ? sanitizeForLog(intent.args)\n : undefined,\n });\n }\n const span = this.tracing.startSpan({\n name: `tool:${intent.tool}`,\n traceId: ctx.traceId,\n attributes: {\n \"tool.name\": intent.tool,\n \"tool.purpose\": intent.purpose,\n requestId: ctx.requestId,\n taskId: ctx.taskId,\n },\n });\n\n // Emit TOOL_CALLED event\n emitToolCalled(intent, ctx, this.getObservabilityDeps());\n\n try {\n // Step 1: Resolve\n const spec = resolveTool(intent.tool, this.registry);\n\n this.tracing.addEvent(span.spanId, \"resolved\", {\n kind: spec.kind,\n version: spec.version,\n });\n\n // Step 2: Input Validate\n const validatedArgs = validateInput(spec, intent.args, this.validator);\n\n // Step 3: Defaults Enrich\n const enrichedArgs = enrichDefaults(spec, validatedArgs, this.validator);\n\n // Step 4: Policy Gate\n enforcePolicy(spec, enrichedArgs, ctx, {\n policy: this.policy,\n eventLog: this.eventLog,\n metrics: this.metrics,\n tracing: this.tracing,\n });\n\n // Step 5: Budget check\n if (!this.budget.checkRateLimit(spec.name)) {\n throw createTaggedError(\n \"BUDGET_EXCEEDED\",\n `Rate limit exceeded for tool: ${spec.name}`,\n );\n }\n\n // Step 6: HITL approval (for external_write/destructive when onApprovalRequired set)\n await requireHumanApproval(spec, enrichedArgs, ctx, {\n onApprovalRequired: this.config.onApprovalRequired,\n eventLog: this.eventLog,\n logger: this.logger,\n });\n\n // Dry-run mode: return without execution\n if (ctx.dryRun) {\n return this.buildDryRunResult(spec, enrichedArgs, ctx, startTime, span.spanId);\n }\n\n // Step 7: Execute with budget (timeout + retry + circuit breaker)\n const { result, raw } = await executeWithBudget(\n spec,\n enrichedArgs,\n ctx,\n span.spanId,\n this.getPipelineDeps(),\n );\n\n // Step 8: Output Validate\n const validatedOutput = validateOutput(spec, result, this.validator);\n\n // Step 9: Evidence Build (merge adapter-provided evidence with built evidence)\n const durationMs = Date.now() - startTime;\n const builtEvidence = buildEvidence({\n spec,\n args: enrichedArgs,\n result: validatedOutput,\n raw,\n ctx,\n durationMs,\n });\n const adapterEvidence: Evidence[] =\n raw &&\n typeof raw === \"object\" &&\n Array.isArray((raw as { evidence?: Evidence[] }).evidence)\n ? ((raw as { evidence: Evidence[] }).evidence as Evidence[])\n : [];\n const evidence = [...adapterEvidence, ...builtEvidence];\n\n // Step 10: Audit & Metrics\n recordSuccess(spec, durationMs, evidence, span.spanId, this.getObservabilityDeps());\n\n if (this.logger.isEnabled(\"debug\")) {\n this.logger.debug(\"invoke.ok\", {\n tool: spec.name,\n durationMs,\n result: this.logger.options.includeResults\n ? summarizeForLog(validatedOutput)\n : undefined,\n raw: this.logger.options.includeRaw\n ? summarizeForLog(raw)\n : undefined,\n });\n }\n\n return {\n ok: true,\n result: validatedOutput,\n evidence,\n raw: this.config.includeRaw !== false ? raw : undefined,\n };\n } catch (error) {\n const durationMs = Date.now() - startTime;\n return handleError(error, intent, ctx, durationMs, span.spanId, this.getObservabilityDeps());\n }\n }\n\n /**\n * Search for tools in the registry.\n */\n searchTools(\n query: string,\n filters?: { kind?: string; capabilities?: string[]; tags?: string[] },\n ): ToolSpec[] {\n return this.registry.search({\n text: query,\n kind: filters?.kind as any,\n capabilities: filters?.capabilities as any,\n tags: filters?.tags,\n });\n }\n\n /**\n * Get the schema for a tool.\n */\n getToolSchema(toolName: string): { input: object; output: object } | undefined {\n const spec = this.registry.get(toolName);\n if (!spec) return undefined;\n return { input: spec.inputSchema, output: spec.outputSchema };\n }\n\n // --- Helper Methods ---\n\n private getPipelineDeps(): PipelineDependencies {\n return {\n registry: this.registry,\n adapters: this.adapters,\n validator: this.validator,\n policy: this.policy,\n budget: this.budget,\n eventLog: this.eventLog,\n metrics: this.metrics,\n tracing: this.tracing,\n logger: this.logger,\n defaultMaxRetries: this.config.defaultMaxRetries,\n onApprovalRequired: this.config.onApprovalRequired,\n };\n }\n\n private getObservabilityDeps(): ObservabilityDependencies {\n return {\n eventLog: this.eventLog,\n metrics: this.metrics,\n tracing: this.tracing,\n logger: this.logger,\n };\n }\n\n private buildDryRunResult(\n spec: ToolSpec,\n args: unknown,\n _ctx: ExecContext,\n startTime: number,\n spanId: string,\n ): ToolResult {\n void (Date.now() - startTime); // durationMs calculated but not used in dry-run\n this.tracing.endSpan(spanId, \"ok\");\n\n return {\n ok: true,\n result: {\n dryRun: true,\n tool: spec.name,\n kind: spec.kind,\n args,\n capabilities: spec.capabilities,\n },\n evidence: [\n {\n type: \"tool\",\n ref: `${spec.name}@${spec.version}`,\n summary: `Dry-run: would execute ${spec.kind}:${spec.name}`,\n createdAt: new Date().toISOString(),\n },\n ],\n };\n }\n\n}\n","/**\n * Tool descriptor format: npm:@scope/package#toolPath\n * Example: npm:@easynet/agent-tool-builtin-tools#fs.readText → core/fs.readText\n */\n\n/** Matches npm:@scope/packageName#toolPath (scope and package can have - and .) */\nconst NPM_TOOL_DESCRIPTOR_REGEX = /^npm:(@[\\w.-]+\\/[\\w.-]+)#(.+)$/;\n\nexport interface NpmToolDescriptor {\n /** Full package id, e.g. @easynet/agent-tool-builtin-tools */\n fullPackage: string;\n /** Tool path after #, e.g. fs.readText or core/fs.readText */\n toolPath: string;\n}\n\n/**\n * Check if a string is an npm tool descriptor (npm:@scope/package#path).\n */\nexport function isNpmToolDescriptor(descriptor: string): boolean {\n return NPM_TOOL_DESCRIPTOR_REGEX.test(descriptor.trim());\n}\n\n/**\n * Parse npm tool descriptor into { fullPackage, toolPath } or null.\n * Format: npm:@scope/packageName#toolPath\n * Example: npm:@easynet/agent-tool-builtin-tools#fs.readText\n */\nexport function parseNpmToolDescriptor(descriptor: string): NpmToolDescriptor | null {\n const s = descriptor.trim();\n const m = s.match(NPM_TOOL_DESCRIPTOR_REGEX);\n if (!m) return null;\n return { fullPackage: m[1], toolPath: m[2] };\n}\n\n/** Known packages: full package id → tool name prefix (e.g. core/, example/) */\nconst KNOWN_PACKAGE_PREFIX: Record<string, string> = {\n \"@easynet/agent-tool-builtin-tools\": \"core/\",\n \"@easynet/agent-tool-buildin-tools\": \"core/\", // alias (e.g. npm:@easynet/agent-tool-buildin#fs.readText)\n \"@easynet/agent-tool-buildin\": \"core/\", // shorthand\n \"@easynet/agent-tool-example-tools\": \"example/\",\n};\n\n/**\n * Resolve an npm tool descriptor to the registry tool name.\n * For known packages we map package + toolPath to the registered name (e.g. core/fs.readText).\n * If toolPath already starts with the package prefix, it is used as-is; otherwise prefix is prepended.\n * Returns null for unknown packages (caller may try dynamic require in the future).\n */\nexport function resolveNpmToolDescriptor(descriptor: string): string | null {\n const parsed = parseNpmToolDescriptor(descriptor);\n if (!parsed) return null;\n const prefix = KNOWN_PACKAGE_PREFIX[parsed.fullPackage];\n if (!prefix) return null;\n const path = parsed.toolPath;\n if (path.startsWith(prefix)) return path;\n return prefix + path;\n}\n\n/**\n * Resolve a single tool descriptor to a tool name.\n * If it is an npm descriptor, resolve it; otherwise return the string as-is (plain tool 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 npm:@scope/package#path) to tool names.\n * Deduplicates and preserves order.\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","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { MCPServerConfig, ToolManifest, LoadedTool } from \"../types.js\";\nimport { DiscoveryError } from \"../errors.js\";\n\n/**\n * Cursor-compatible mcpServers wrapper format.\n * Example: { \"mcpServers\": { \"server-name\": { \"command\": \"npx\", \"args\": [...] } } }\n */\ninterface CursorMCPConfig {\n mcpServers: Record<string, MCPServerConfig>;\n}\n\n/**\n * Check if the parsed JSON is in Cursor's mcpServers wrapper format.\n */\nfunction isCursorFormat(obj: unknown): obj is CursorMCPConfig {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"mcpServers\" in obj &&\n typeof (obj as CursorMCPConfig).mcpServers === \"object\" &&\n (obj as CursorMCPConfig).mcpServers !== null\n );\n}\n\n/**\n * Extract MCPServerConfig from either Cursor wrapper format or bare format.\n * - Cursor format: { \"mcpServers\": { \"name\": { command/url/args/env } } }\n * Uses the first server entry (or the one matching the tool name).\n * - Bare format: { \"command\": \"...\", \"args\": [...] } or { \"url\": \"...\" }\n */\nfunction extractMCPConfig(\n parsed: unknown,\n toolName: string | undefined,\n): MCPServerConfig {\n if (isCursorFormat(parsed)) {\n const servers = parsed.mcpServers;\n const keys = Object.keys(servers);\n if (keys.length === 0) {\n return {};\n }\n // Prefer server matching tool name, otherwise use first entry\n const name = toolName && keys.includes(toolName) ? toolName : keys[0]!;\n return servers[name]!;\n }\n return parsed as MCPServerConfig;\n}\n\n/**\n * Load an MCP tool from its directory.\n * Reads mcp.json and validates it has either command or url.\n * Supports both Cursor's mcpServers wrapper format and bare server config.\n */\nexport async function loadMCPTool(\n dirPath: string,\n manifest: ToolManifest,\n): Promise<LoadedTool> {\n const mcpPath = join(dirPath, manifest.entryPoint ?? \"mcp.json\");\n\n let raw: string;\n try {\n raw = await readFile(mcpPath, \"utf-8\");\n } catch (err) {\n throw new DiscoveryError(\n dirPath,\n \"load\",\n `Failed to read MCP config: ${mcpPath}`,\n err as Error,\n );\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err) {\n throw new DiscoveryError(\n dirPath,\n \"load\",\n `Invalid JSON in ${mcpPath}`,\n err as Error,\n );\n }\n\n // Extract server config from Cursor wrapper or bare format\n const baseName = manifest.name?.split(\"/\").pop();\n const config = extractMCPConfig(parsed, baseName);\n\n if (!config.command && !config.url) {\n throw new DiscoveryError(\n dirPath,\n \"validate\",\n `mcp.json must have either \"command\" or \"url\" field`,\n );\n }\n\n return { manifest, dirPath, mcpConfig: config };\n}\n","import { join } from \"node:path\";\nimport { stat } from \"node:fs/promises\";\n\nconst DEFAULT_EXTENSIONS = [\".js\", \".mjs\"];\n\n/**\n * Resolve the entry point file for a tool directory.\n * If baseName already has an extension, verifies the file exists.\n * Otherwise tries each extension in order.\n */\nexport async function resolveEntryPoint(\n dirPath: string,\n baseName: string,\n extensions: string[] = DEFAULT_EXTENSIONS,\n): Promise<string> {\n // If baseName already has a recognized extension, use it directly\n if (extensions.some((ext) => baseName.endsWith(ext))) {\n const fullPath = join(dirPath, baseName);\n await stat(fullPath); // throws ENOENT if not found\n return fullPath;\n }\n\n // Try each extension\n for (const ext of extensions) {\n const fullPath = join(dirPath, `${baseName}${ext}`);\n try {\n await stat(fullPath);\n return fullPath;\n } catch {\n // try next extension\n }\n }\n\n throw new Error(\n `Could not find entry point in ${dirPath}. Tried: ${extensions.map((e) => baseName + e).join(\", \")}`,\n );\n}\n","import { pathToFileURL } from \"node:url\";\nimport type { ToolManifest, LoadedTool } from \"../types.js\";\nimport { DiscoveryError } from \"../errors.js\";\nimport { resolveEntryPoint } from \"./resolveEntry.js\";\n\n/**\n * Load a LangChain tool from its directory.\n * Dynamically imports the entry point and validates it has an invoke() method.\n */\nexport async function loadLangChainTool(\n dirPath: string,\n manifest: ToolManifest,\n extensions?: string[],\n): Promise<LoadedTool> {\n let entryFile: string;\n try {\n entryFile = await resolveEntryPoint(\n dirPath,\n manifest.entryPoint ?? \"index\",\n extensions,\n );\n } catch (err) {\n throw new DiscoveryError(\n dirPath,\n \"load\",\n `Cannot find LangChain entry point`,\n err as Error,\n );\n }\n\n let mod: Record<string, unknown>;\n try {\n mod = (await import(pathToFileURL(entryFile).href)) as Record<string, unknown>;\n } catch (err) {\n throw new DiscoveryError(\n dirPath,\n \"load\",\n `Failed to import ${entryFile}`,\n err as Error,\n );\n }\n\n // Resolve the tool instance: default export > named \"tool\" > module itself\n const tool = (mod.default ?? mod.tool ?? mod) as Record<string, unknown>;\n\n if (!tool || typeof tool.invoke !== \"function\") {\n throw new DiscoveryError(\n dirPath,\n \"validate\",\n `Entry point must export an object with invoke() method (LangChainToolLike)`,\n );\n }\n\n return { manifest, dirPath, impl: tool };\n}\n","import { readdir } from \"node:fs/promises\";\nimport { pathToFileURL } from \"node:url\";\nimport type { ToolManifest, LoadedTool } from \"../types.js\";\nimport { DiscoveryError } from \"../errors.js\";\nimport { resolveEntryPoint } from \"./resolveEntry.js\";\nimport { loadSkillDefinition } from \"./SkillMdParser.js\";\nimport type { SkillDefinition } from \"./SkillManifest.js\";\n\nconst DEFAULT_EXTENSIONS = [\".js\", \".mjs\"];\n\n/**\n * List top-level .js/.mjs files in the skill directory (exclude lib/, node_modules/, hidden, test files).\n * Used to auto-discover multiple programs when tool.json has no \"programs\" map.\n */\nasync function listSkillProgramFiles(\n dirPath: string,\n extensions: string[] = DEFAULT_EXTENSIONS,\n): Promise<string[]> {\n let entries: Array<{ name: string; isFile: boolean }>;\n try {\n const dirEntries = await readdir(dirPath, { withFileTypes: true });\n entries = dirEntries.map((entry) => ({\n name: entry.name,\n isFile: entry.isFile(),\n }));\n } catch {\n return [];\n }\n return entries\n .filter((e) => e.isFile)\n .map((e) => e.name)\n .filter((name) => {\n if (name.startsWith(\".\") || name.startsWith(\"_\")) return false;\n if (name.includes(\".test.\") || name.includes(\".spec.\")) return false;\n return extensions.some((ext) => name.endsWith(ext));\n })\n .sort((a, b) => {\n // Prefer handler.js or index.js as first (default program)\n if (a === \"handler.js\" || a === \"index.js\") return -1;\n if (b === \"handler.js\" || b === \"index.js\") return 1;\n return a.localeCompare(b);\n });\n}\n\n/**\n * Check if a value is a LangChain-like tool (object with invoke function).\n * Includes instances of StructuredTool and plain { name?, description?, schema?, invoke }.\n */\nfunction isLangChainLikeTool(val: unknown): val is { name?: string; description?: string; schema?: object; invoke: (args: unknown) => Promise<unknown> } {\n return (\n val != null &&\n typeof val === \"object\" &&\n \"invoke\" in val &&\n typeof (val as { invoke: unknown }).invoke === \"function\"\n );\n}\n\n/**\n * Check if a value is a class (constructor) that can be instantiated.\n * Used to detect \"class Foo extends StructuredTool\" exports.\n */\nfunction isConstructable(val: unknown): val is new (...args: unknown[]) => { invoke?: (args: unknown) => Promise<unknown> } {\n return typeof val === \"function\" && typeof (val as { prototype?: unknown }).prototype === \"object\";\n}\n\n/**\n * Load a single skill program (one entry point) and return a LoadedTool.\n * Supports:\n * - Class extending StructuredTool: loader instantiates with new ToolClass(), uses instance.\n * - LangChain-like object (or instance): { name?, description?, schema?, invoke(args) }.\n * - Function: (args, ctx) => Promise<{ result, evidence? }> — name/description from SKILL.md.\n */\nasync function loadOneSkillProgram(\n dirPath: string,\n manifest: ToolManifest,\n entryFile: string,\n skillDef: SkillDefinition,\n programKey: string | undefined,\n extensions: string[] | undefined,\n): Promise<LoadedTool> {\n let impl: unknown;\n try {\n const fullPath = await resolveEntryPoint(dirPath, entryFile, extensions ?? [\".js\", \".mjs\"]);\n const mod = (await import(pathToFileURL(fullPath).href)) as Record<string, unknown>;\n const fn = mod.default ?? mod.handler ?? mod.Tool;\n if (isLangChainLikeTool(fn)) {\n impl = fn;\n } else if (isConstructable(fn)) {\n const instance = new (fn as new () => { invoke: (args: unknown) => Promise<unknown> })();\n if (isLangChainLikeTool(instance)) impl = instance;\n } else if (typeof fn === \"function\") {\n impl = fn;\n }\n } catch {\n // Handler is optional — skills can be instruction-only\n }\n return {\n manifest,\n dirPath,\n impl,\n skillDefinition: skillDef,\n programKey,\n };\n}\n\n/**\n * Load a Skill tool from its directory following Anthropic's Agent Skills spec.\n *\n * Requires a SKILL.md file with YAML frontmatter (name, description).\n * The SKILL.md body provides instructions (Level 2), and bundled files\n * in the directory provide resources (Level 3).\n *\n * Optionally loads a handler function (handler.js/mjs) for programmatic execution.\n *\n * @see https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview\n */\nexport async function loadSkillTool(\n dirPath: string,\n manifest: ToolManifest,\n extensions?: string[],\n): Promise<LoadedTool> {\n const loaded = await loadSkillTools(dirPath, manifest, extensions);\n if (loaded.length === 0) {\n throw new DiscoveryError(dirPath, \"load\", \"No skill programs loaded\", new Error(\"empty\"));\n }\n return loaded[0]!;\n}\n\n/**\n * Load one or more skill programs from a directory.\n * When manifest.programs is set (e.g. { \"default\": \"handler.js\", \"report\": \"report.js\" }),\n * returns one LoadedTool per program; otherwise returns a single LoadedTool (entryPoint or \"handler\").\n */\nexport async function loadSkillTools(\n dirPath: string,\n manifest: ToolManifest,\n extensions?: string[],\n): Promise<LoadedTool[]> {\n let skillDef: SkillDefinition;\n try {\n skillDef = await loadSkillDefinition(dirPath);\n } catch (err) {\n throw new DiscoveryError(\n dirPath,\n \"load\",\n `Failed to parse SKILL.md: ${(err as Error).message}`,\n err as Error,\n );\n }\n\n const programs = manifest.programs;\n if (programs && typeof programs === \"object\" && Object.keys(programs).length > 0) {\n const result: LoadedTool[] = [];\n for (const [programKey, entryFile] of Object.entries(programs)) {\n const loaded = await loadOneSkillProgram(\n dirPath,\n manifest,\n entryFile,\n skillDef,\n programKey,\n extensions,\n );\n result.push(loaded);\n }\n return result;\n }\n\n // Auto-discover: list top-level .js/.mjs; if multiple, treat each as a program\n const exts = extensions ?? DEFAULT_EXTENSIONS;\n const files = await listSkillProgramFiles(dirPath, exts);\n if (files.length >= 2) {\n const result: LoadedTool[] = [];\n for (let i = 0; i < files.length; i++) {\n const file = files[i]!;\n const programKey = i === 0 ? \"default\" : file.replace(/\\.[^.]+$/, \"\");\n const loaded = await loadOneSkillProgram(\n dirPath,\n manifest,\n file,\n skillDef,\n programKey,\n extensions,\n );\n result.push(loaded);\n }\n return result;\n }\n\n // Single program: entryPoint or \"handler\" (or only one file found)\n const entryFile = manifest.entryPoint ?? files[0] ?? \"handler\";\n const loaded = await loadOneSkillProgram(\n dirPath,\n manifest,\n entryFile,\n skillDef,\n undefined,\n extensions,\n );\n return [loaded];\n}\n","import { readdir, readFile, access } from \"node:fs/promises\";\nimport { join, basename } from \"node:path\";\nimport type { ToolSpec } from \"../../types/ToolSpec.js\";\nimport type {\n ToolManifest,\n DirectoryScannerOptions,\n LoadedTool,\n} from \"../types.js\";\nimport { DiscoveryError } from \"../errors.js\";\nimport { loadMCPTool } from \"../load/MCPLoader.js\";\nimport { loadLangChainTool } from \"../load/LangChainLoader.js\";\nimport { loadSkillTools } from \"../load/SkillLoader.js\";\nimport { loadN8nTool } from \"../load/N8nLoader.js\";\nimport { resolveEntryPoint } from \"../load/resolveEntry.js\";\n\nconst DEFAULT_EXTENSIONS = [\".js\", \".mjs\"];\n\n/**\n * Scans filesystem directories for tool definitions.\n * A tool can be declared via tool.json or inferred from conventional files\n * (SKILL.md, workflow.json, mcp.json, or an index entry point).\n */\nexport class DirectoryScanner {\n private readonly roots: Array<{ path: string; namespace: string }>;\n private readonly extensions: string[];\n private readonly onError?: (toolDir: string, error: Error) => void;\n\n constructor(options: DirectoryScannerOptions) {\n const defaultNamespace = options.namespace ?? \"dir\";\n this.roots = options.roots.map((root) => {\n if (typeof root === \"string\") {\n return { path: root, namespace: defaultNamespace };\n }\n return {\n path: root.path,\n namespace: root.namespace ?? defaultNamespace,\n };\n });\n this.extensions = options.extensions ?? DEFAULT_EXTENSIONS;\n this.onError = options.onError;\n }\n\n /**\n * Scan all root directories and return discovered ToolSpecs.\n * Errors in individual tool directories are reported via onError\n * and do not prevent other tools from loading.\n */\n async scan(): Promise<ToolSpec[]> {\n const specs: ToolSpec[] = [];\n\n for (const root of this.roots) {\n const rootSpecs = await this.scanRoot(root.path, root.namespace);\n specs.push(...rootSpecs);\n }\n\n return specs;\n }\n\n private async scanRoot(rootPath: string, namespace: string): Promise<ToolSpec[]> {\n return this.scanRecursive(rootPath, namespace);\n }\n\n /**\n * Recursively scan directories for tool definitions.\n * Directories can be detected via tool.json or inferred markers.\n */\n private async scanRecursive(dirPath: string, namespace: string): Promise<ToolSpec[]> {\n const specs: ToolSpec[] = [];\n\n let dirEntries: Array<{ name: string; isDirectory: boolean }>;\n try {\n const entries = await readdir(dirPath, { withFileTypes: true });\n dirEntries = entries.map((entry) => ({\n name: entry.name,\n isDirectory: entry.isDirectory(),\n }));\n } catch (error) {\n this.onError?.(dirPath, error as Error);\n return specs;\n }\n\n const dirName = basename(dirPath);\n try {\n const loadedSpecs = await this.loadToolDir(dirPath, dirName, namespace);\n if (loadedSpecs.length > 0) {\n specs.push(...loadedSpecs);\n }\n } catch (error) {\n this.onError?.(dirPath, error as Error);\n }\n\n for (const entry of dirEntries) {\n if (!entry.isDirectory) {\n continue;\n }\n const childPath = join(dirPath, entry.name);\n try {\n const childSpecs = await this.scanRecursive(childPath, namespace);\n specs.push(...childSpecs);\n } catch (error) {\n this.onError?.(childPath, error as Error);\n }\n }\n\n return specs;\n }\n\n private async loadToolDir(\n dirPath: string,\n dirName: string,\n namespace: string,\n ): Promise<ToolSpec[]> {\n // Read tool.json manifest if present, otherwise infer.\n const manifestPath = join(dirPath, \"tool.json\");\n let manifestRaw: string;\n try {\n manifestRaw = await readFile(manifestPath, \"utf-8\");\n } catch {\n const inferred = await this.inferManifest(dirPath, dirName);\n if (!inferred) {\n return [];\n }\n if (inferred.kind === \"langchain\") {\n if (inferred.entryPoint) {\n const loaded = await loadLangChainTool(dirPath, inferred, this.extensions);\n return [this.toToolSpec(loaded, dirName, dirPath, namespace)];\n }\n return this.loadLangChainTools(dirPath, dirName, inferred, false, namespace);\n }\n if (inferred.kind === \"skill\") {\n const loadedList = await loadSkillTools(dirPath, inferred, this.extensions);\n return loadedList.map((loaded) =>\n this.toToolSpec(loaded, dirName, dirPath, namespace),\n );\n }\n const loaded = await this.loadByKind(dirPath, inferred);\n return [this.toToolSpec(loaded, dirName, dirPath, namespace)];\n }\n\n let manifest: ToolManifest;\n try {\n manifest = JSON.parse(manifestRaw) as ToolManifest;\n } catch (err) {\n throw new DiscoveryError(\n dirPath,\n \"manifest\",\n \"Invalid JSON in tool.json\",\n err as Error,\n );\n }\n\n // Validate required field\n if (!manifest.kind) {\n throw new DiscoveryError(\n dirPath,\n \"manifest\",\n `tool.json must have a \"kind\" field`,\n );\n }\n\n // Skip disabled tools\n if (manifest.enabled === false) {\n return [];\n }\n\n // Load based on kind\n if (manifest.kind === \"langchain\") {\n if (manifest.entryPoint) {\n const loaded = await loadLangChainTool(dirPath, manifest, this.extensions);\n return [this.toToolSpec(loaded, dirName, dirPath, namespace)];\n }\n return this.loadLangChainTools(dirPath, dirName, manifest, true, namespace);\n }\n if (manifest.kind === \"skill\") {\n const loadedList = await loadSkillTools(dirPath, manifest, this.extensions);\n return loadedList.map((loaded) =>\n this.toToolSpec(loaded, dirName, dirPath, namespace),\n );\n }\n const loaded = await this.loadByKind(dirPath, manifest);\n\n // Convert to ToolSpec\n return [this.toToolSpec(loaded, dirName, dirPath, namespace)];\n }\n\n private async inferManifest(\n dirPath: string,\n dirName: string,\n ): Promise<ToolManifest | null> {\n const hasSkill = await this.fileExists(join(dirPath, \"SKILL.md\"));\n const hasN8n = await this.fileExists(join(dirPath, \"workflow.json\"));\n const hasMcp = await this.fileExists(join(dirPath, \"mcp.json\"));\n const isLangchainDir = dirName === \"langchain\";\n // In a \"skill\" dir, index.js is the skill default program, not a LangChain tool\n const hasLangchain =\n isLangchainDir\n ? await this.hasLangchainFiles(dirPath)\n : dirName !== \"skill\" && (await this.hasEntryPoint(dirPath, \"index\"));\n\n const kinds = [\n hasSkill ? \"skill\" : null,\n hasN8n ? \"n8n\" : null,\n hasMcp ? \"mcp\" : null,\n hasLangchain ? \"langchain\" : null,\n ].filter(Boolean) as ToolManifest[\"kind\"][];\n\n if (kinds.length === 0) return null;\n if (kinds.length > 1) {\n throw new DiscoveryError(\n dirPath,\n \"manifest\",\n `Ambiguous tool kind (found ${kinds.join(\", \")}). Add tool.json to disambiguate.`,\n );\n }\n\n const kind = kinds[0]!;\n const manifest: ToolManifest = { kind };\n if (kind === \"n8n\") manifest.entryPoint = \"workflow.json\";\n if (kind === \"mcp\") manifest.entryPoint = \"mcp.json\";\n if (kind === \"langchain\" && !isLangchainDir) manifest.entryPoint = \"index\";\n if (kind === \"skill\") manifest.entryPoint = \"handler\";\n return manifest;\n }\n\n private async fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n }\n\n private async hasEntryPoint(dirPath: string, baseName: string): Promise<boolean> {\n try {\n await resolveEntryPoint(dirPath, baseName, this.extensions);\n return true;\n } catch {\n return false;\n }\n }\n\n private async hasLangchainFiles(dirPath: string): Promise<boolean> {\n const entryFiles = await this.listLangchainEntryFiles(dirPath);\n return entryFiles.length > 0;\n }\n\n private async listLangchainEntryFiles(dirPath: string): Promise<string[]> {\n let entries: Array<{ name: string; isFile: boolean }>;\n try {\n const dirEntries = await readdir(dirPath, { withFileTypes: true });\n entries = dirEntries.map((entry) => ({\n name: entry.name,\n isFile: entry.isFile(),\n }));\n } catch {\n return [];\n }\n\n return entries\n .filter((entry) => entry.isFile)\n .map((entry) => entry.name)\n .filter((name) => {\n if (name.startsWith(\".\") || name.startsWith(\"_\")) return false;\n if (name.endsWith(\".d.ts\")) return false;\n if (name.includes(\".test.\") || name.includes(\".spec.\")) return false;\n return this.extensions.some((ext) => name.endsWith(ext));\n });\n }\n\n private async loadByKind(\n dirPath: string,\n manifest: ToolManifest,\n ): Promise<LoadedTool> {\n switch (manifest.kind) {\n case \"mcp\":\n return loadMCPTool(dirPath, manifest);\n case \"langchain\":\n return loadLangChainTool(dirPath, manifest, this.extensions);\n case \"skill\": {\n const list = await loadSkillTools(dirPath, manifest, this.extensions);\n if (list.length === 0) {\n throw new DiscoveryError(dirPath, \"load\", \"No skill programs loaded\", new Error(\"empty\"));\n }\n return list[0]!;\n }\n case \"n8n\":\n return loadN8nTool(dirPath, manifest);\n default:\n throw new DiscoveryError(\n dirPath,\n \"manifest\",\n `Unknown tool kind: \"${(manifest as { kind: string }).kind}\"`,\n );\n }\n }\n\n private async loadLangChainTools(\n dirPath: string,\n dirName: string,\n manifest: ToolManifest,\n strict: boolean,\n namespace: string,\n ): Promise<ToolSpec[]> {\n const entryFiles = await this.listLangchainEntryFiles(dirPath);\n if (entryFiles.length === 0) {\n if (strict) {\n throw new DiscoveryError(\n dirPath,\n \"load\",\n \"No LangChain entry files found\",\n );\n }\n return [];\n }\n\n const specs: ToolSpec[] = [];\n const useDirNameForSingle = dirName !== \"langchain\";\n for (const entryFile of entryFiles) {\n const fileManifest: ToolManifest = {\n ...manifest,\n entryPoint: entryFile,\n };\n try {\n const loaded = await loadLangChainTool(dirPath, fileManifest, this.extensions);\n const fileBase = basename(entryFile).replace(/\\.[^.]+$/, \"\");\n const nameHint =\n entryFiles.length === 1 && useDirNameForSingle ? dirName : fileBase;\n specs.push(this.toToolSpec(loaded, nameHint, dirPath, namespace));\n } catch (error) {\n const err = error as Error;\n if (err instanceof DiscoveryError && err.phase === \"validate\") {\n if (strict) {\n throw err;\n }\n continue;\n }\n this.onError?.(join(dirPath, entryFile), err);\n if (strict) {\n throw err;\n }\n }\n }\n\n return specs;\n }\n\n private toToolSpec(\n loaded: LoadedTool,\n dirName: string,\n dirPath: string,\n namespace: string,\n ): ToolSpec {\n const { manifest } = loaded;\n const kindDirNames = new Set([\"mcp\", \"langchain\", \"skill\", \"n8n\"]);\n const parentName = basename(join(dirPath, \"..\"));\n const isKindDir = kindDirNames.has(dirName);\n const defaultDirName = isKindDir ? parentName : dirName;\n const inferredName = isKindDir\n ? `${namespace}/${defaultDirName}-${dirName}`\n : `${namespace}/${defaultDirName}`;\n const name = manifest.name ?? inferredName;\n\n const spec = this.buildBaseSpec(manifest, name, dirName);\n this.applyKindSpecificFields(spec, loaded, manifest, defaultDirName, namespace);\n return spec;\n }\n\n private buildBaseSpec(\n manifest: ToolManifest,\n name: string,\n dirName: string,\n ): ToolSpec {\n return {\n name,\n version: manifest.version ?? \"1.0.0\",\n kind: manifest.kind,\n description: manifest.description ?? `${manifest.kind} tool: ${dirName}`,\n tags: manifest.tags,\n inputSchema: manifest.inputSchema ?? {\n type: \"object\",\n additionalProperties: true,\n },\n outputSchema: manifest.outputSchema ?? {\n type: \"object\",\n additionalProperties: true,\n },\n capabilities: manifest.capabilities ?? [],\n costHints: manifest.costHints,\n };\n }\n\n private applyKindSpecificFields(\n spec: ToolSpec,\n loaded: LoadedTool,\n manifest: ToolManifest,\n defaultDirName: string,\n namespace: string,\n ): void {\n switch (manifest.kind) {\n case \"mcp\":\n if (loaded.mcpConfig?.url) {\n spec.endpoint = loaded.mcpConfig.url;\n }\n spec.impl = loaded.mcpConfig;\n break;\n case \"langchain\":\n spec.impl = loaded.impl;\n if (!manifest.name) {\n const toolName = (loaded.impl as { name?: string } | undefined)?.name;\n if (toolName) {\n spec.name = `${namespace}/${toolName}`;\n }\n }\n if (!manifest.description) {\n const toolDescription = (loaded.impl as { description?: string } | undefined)\n ?.description;\n if (toolDescription) {\n spec.description = toolDescription;\n }\n }\n if (!manifest.inputSchema && loaded.impl) {\n const tool = loaded.impl as { schema?: object };\n if (tool.schema) {\n spec.inputSchema = tool.schema;\n }\n }\n break;\n case \"skill\": {\n if (loaded.skillDefinition) {\n spec.name = manifest.name ?? loaded.skillDefinition.frontmatter.name;\n spec.description = loaded.skillDefinition.frontmatter.description;\n if (loaded.programKey === \"default\") {\n spec.name = `${namespace}/${defaultDirName}`;\n } else if (loaded.programKey) {\n spec.name = `${namespace}/${defaultDirName}/${loaded.programKey}`;\n }\n const impl = loaded.impl as { description?: string; schema?: object; invoke?: unknown } | undefined;\n if (impl && typeof impl === \"object\" && typeof impl.invoke === \"function\") {\n if (impl.description != null && impl.description !== \"\") spec.description = impl.description;\n if (impl.schema != null && typeof impl.schema === \"object\") spec.inputSchema = impl.schema as object;\n }\n spec.impl = {\n ...loaded.skillDefinition,\n handler: loaded.impl,\n };\n } else {\n spec.impl = loaded.impl;\n }\n break;\n }\n case \"n8n\": {\n const workflow = loaded.workflowDef as {\n id?: string;\n name?: string;\n description?: string;\n meta?: { description?: string };\n } | undefined;\n if (workflow?.id) {\n spec.resourceId = String(workflow.id);\n }\n if (!manifest.description && workflow) {\n const workflowDesc =\n workflow.description ??\n workflow.meta?.description ??\n (typeof workflow.name === \"string\" ? workflow.name : undefined);\n if (workflowDesc) {\n spec.description = workflowDesc;\n }\n }\n spec.impl = loaded.workflowDef;\n break;\n }\n }\n }\n}\n","import type { MCPServerConfig } from \"./types.js\";\n\n/**\n * Connection info for an MCP server.\n */\nexport interface MCPConnectionInfo {\n /** Transport type: \"url\" for SSE/HTTP, \"stdio\" for command-based */\n type: \"url\" | \"stdio\";\n /** SSE/HTTP URL (when type=\"url\") */\n url?: string;\n /** Command to spawn (when type=\"stdio\") */\n command?: string;\n /** Command arguments (when type=\"stdio\") */\n args?: string[];\n /** Environment variables (when type=\"stdio\") */\n env?: Record<string, string>;\n /** Working directory when spawning (when type=\"stdio\") */\n cwd?: string;\n}\n\n/**\n * Manages MCP server connection information extracted from directory discovery.\n *\n * This class provides connection configuration for MCP servers discovered\n * from mcp.json files. The actual MCP client creation and lifecycle management\n * is the consumer's responsibility (using @modelcontextprotocol/sdk or similar).\n *\n * Usage:\n * ```ts\n * const manager = new MCPProcessManager();\n * const info = manager.getConnectionInfo(\"my-tool\", mcpConfig);\n * if (info.type === \"stdio\") {\n * // Spawn process with info.command, info.args, info.env\n * } else {\n * // Connect SSE client to info.url\n * }\n * ```\n */\nexport class MCPProcessManager {\n private readonly connections = new Map<string, MCPConnectionInfo>();\n\n /**\n * Get connection info for an MCP tool based on its config.\n * Caches the result by tool name.\n */\n getConnectionInfo(toolName: string, config: MCPServerConfig): MCPConnectionInfo {\n const cached = this.connections.get(toolName);\n if (cached) return cached;\n\n const info: MCPConnectionInfo = config.url\n ? { type: \"url\", url: config.url }\n : {\n type: \"stdio\",\n command: config.command!,\n args: config.args,\n env: config.env,\n cwd: config.cwd,\n };\n\n this.connections.set(toolName, info);\n return info;\n }\n\n /**\n * Remove cached connection info for a tool.\n */\n remove(toolName: string): boolean {\n return this.connections.delete(toolName);\n }\n\n /**\n * Get all registered tool names.\n */\n getToolNames(): string[] {\n return [...this.connections.keys()];\n }\n\n /**\n * Clear all cached connection info.\n */\n dispose(): void {\n this.connections.clear();\n }\n}\n","/**\n * ToolAdapter for MCP tools: holds SDK Client reference, invoke() calls client.callTool.\n * Framework-level support so scripts use registerMCPToolsFromConfig instead of inline MCP logic.\n */\n\nimport type { ToolAdapter, ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext } from \"../types/ToolIntent.js\";\n\n/** SDK Client type (avoid hard typing on @modelcontextprotocol/sdk in this file for optional dep). */\nexport interface MCPClientLike {\n callTool(params: { name: string; arguments: Record<string, unknown> }): Promise<CallToolResult>;\n}\n\nexport interface CallToolResult {\n content?: Array<{ type: string; text?: string }>;\n toolResult?: unknown;\n}\n\nfunction textFromCallToolResult(result: CallToolResult): string {\n if (result.content?.length) {\n const parts = result.content\n .filter((c) => c.type === \"text\" && c.text != null)\n .map((c) => c.text);\n if (parts.length) return parts.join(\"\\n\");\n }\n if (result.toolResult !== undefined) return JSON.stringify(result.toolResult);\n return JSON.stringify(result);\n}\n\n/**\n * Adapter that invokes MCP tools via the SDK Client (callTool).\n * Register with runtime after connecting and listing tools; specs must have kind \"mcp\".\n */\nexport class MCPClientAdapter implements ToolAdapter {\n readonly kind = \"mcp\" as const;\n\n constructor(private readonly client: MCPClientLike) {}\n\n async invoke(\n spec: ToolSpec,\n args: unknown,\n _ctx: ExecContext\n ): Promise<{ result: unknown; raw?: unknown }> {\n const params = args != null && typeof args === \"object\" && !Array.isArray(args)\n ? (args as Record<string, unknown>)\n : {};\n const result = await this.client.callTool({ name: spec.name, arguments: params });\n const text = textFromCallToolResult(result);\n let resultValue: unknown = text;\n try {\n resultValue = JSON.parse(text) as unknown;\n } catch {\n // keep as string\n }\n return { result: resultValue, raw: result };\n }\n}\n","/**\n * Connect to an MCP server via stdio using MCPConnectionInfo.\n * Framework-level: uses @modelcontextprotocol/sdk Client + StdioClientTransport.\n */\n\nimport type { MCPConnectionInfo } from \"../discovery/MCPProcessManager.js\";\nimport type { ToolSpec } from \"../types/ToolSpec.js\";\nimport { DEFAULT_INPUT_SCHEMA, DEFAULT_OUTPUT_SCHEMA } from \"../types/ToolSpec.js\";\n\nexport interface MCPConnectResult {\n /** SDK Client; use listTools() and callTool(). */\n client: MCPClientLike;\n /** Transport; call close() when done. */\n transport: MCPTransportLike;\n}\n\nexport interface MCPClientLike {\n connect(transport: MCPTransportLike): Promise<void>;\n listTools(params?: unknown): Promise<{ tools: MCPToolDef[] }>;\n callTool(params: { name: string; arguments: Record<string, unknown> }): Promise<CallToolResult>;\n}\n\nexport interface MCPTransportLike {\n close(): Promise<void>;\n}\n\nexport interface MCPToolDef {\n name: string;\n description?: string;\n inputSchema?: object;\n}\n\nexport interface CallToolResult {\n content?: Array<{ type: string; text?: string }>;\n toolResult?: unknown;\n}\n\n/**\n * Connect to MCP server via stdio. Only stdio is supported; url/SSE not implemented here.\n * Requires @modelcontextprotocol/sdk. Returns client and transport; caller must call transport.close() when done.\n */\nexport async function connectMCP(connectionInfo: MCPConnectionInfo): Promise<MCPConnectResult> {\n if (connectionInfo.type !== \"stdio\" || !connectionInfo.command) {\n throw new Error(\n `MCP stdio requires connectionInfo.type \"stdio\" and command; got type=${connectionInfo.type}`\n );\n }\n\n const { Client } = await import(\"@modelcontextprotocol/sdk/client\");\n const { StdioClientTransport } = await import(\n \"@modelcontextprotocol/sdk/client/stdio.js\"\n );\n\n const serverParams = {\n command: connectionInfo.command,\n args: connectionInfo.args ?? [],\n env: connectionInfo.env,\n cwd: connectionInfo.cwd,\n };\n const transport = new StdioClientTransport(serverParams);\n const client = new Client({ name: \"agent-tool\", version: \"1.0.0\" });\n await client.connect(transport);\n return {\n client: client as unknown as MCPClientLike,\n transport: transport as unknown as MCPTransportLike,\n };\n}\n\n/**\n * Convert MCP listTools() result to ToolSpec[] (kind \"mcp\") for registry.\n */\nexport function mcpToolsToSpecs(tools: MCPToolDef[]): ToolSpec[] {\n return tools.map((t) => ({\n name: t.name,\n version: \"1.0.0\",\n kind: \"mcp\" as const,\n description: t.description ?? `MCP tool: ${t.name}`,\n inputSchema: t.inputSchema ?? DEFAULT_INPUT_SCHEMA,\n outputSchema: DEFAULT_OUTPUT_SCHEMA,\n capabilities: [],\n }));\n}\n","/**\n * High-level API: load mcp.json, connect to MCP server, register tools with runtime.\n * Framework-level so scripts call registerMCPToolsFromConfig() instead of inline MCP logic.\n */\n\nimport { basename, dirname, join } from \"node:path\";\nimport type { PTCRuntime } from \"../runtime/PTCRuntime.js\";\nimport type { ToolRegistry } from \"../registry/ToolRegistry.js\";\nimport { loadMCPTool } from \"../discovery/load/MCPLoader.js\";\nimport { MCPProcessManager } from \"../discovery/MCPProcessManager.js\";\nimport { connectMCP, mcpToolsToSpecs } from \"./connectMCP.js\";\nimport { MCPClientAdapter } from \"./MCPClientAdapter.js\";\n\nexport interface RegisterMCPToolsOptions {\n /** Path to mcp.json (or dir containing it). Default: process.env.MCP_CONFIG_PATH or \"mcp.json\" in cwd. */\n configPath?: string;\n /** Tool name for getConnectionInfo (default \"mcp\"). */\n toolName?: string;\n}\n\nexport interface RegisterMCPToolsResult {\n /** Transport; caller must call transport.close() when done. */\n transport: { close(): Promise<void> };\n}\n\n/**\n * Load mcp config (from configPath or MCP_CONFIG_PATH), connect via stdio, list tools,\n * register ToolSpec[] with registry and MCPClientAdapter with runtime. Returns transport for cleanup.\n */\nexport async function registerMCPToolsFromConfig(\n runtime: PTCRuntime,\n registry: ToolRegistry,\n options: RegisterMCPToolsOptions = {}\n): Promise<RegisterMCPToolsResult> {\n const configPath = options.configPath ?? process.env.MCP_CONFIG_PATH ?? join(process.cwd(), \"mcp.json\");\n const dirPath = dirname(configPath);\n const entryPoint = basename(configPath);\n const toolName = options.toolName ?? \"mcp\";\n\n const loaded = await loadMCPTool(dirPath, { kind: \"mcp\", name: toolName, entryPoint });\n if (!loaded.mcpConfig) {\n throw new Error(\"mcp.json must have command or url\");\n }\n const manager = new MCPProcessManager();\n const connectionInfo = manager.getConnectionInfo(toolName, loaded.mcpConfig);\n\n const { client, transport } = await connectMCP(connectionInfo);\n const { tools } = await client.listTools();\n const specs = mcpToolsToSpecs(tools);\n registry.bulkRegister(specs);\n runtime.registerAdapter(new MCPClientAdapter(client));\n\n return { transport };\n}\n","/**\n * Exposes all tools from a ToolRegistry + PTCRuntime as LangChain tools\n * for local agent use (e.g. with createReactAgent, AgentExecutor).\n *\n * Use: new LangChainToolsHub(runtime, ctxFactory).getLangChainTools()\n */\n\nimport { DynamicTool } from \"@langchain/core/tools\";\nimport type { PTCRuntime } from \"../runtime/PTCRuntime.js\";\nimport type { ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext } from \"../types/ToolIntent.js\";\nimport type { ToolIntent } from \"../types/ToolIntent.js\";\n\nexport type ExecContextFactory = () => ExecContext;\n\nconst DEFAULT_CTX_FACTORY: ExecContextFactory = () => ({\n requestId: `lc-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n taskId: `task-${Date.now()}`,\n permissions: [\n \"read:web\",\n \"read:fs\",\n \"write:fs\",\n \"read:db\",\n \"write:db\",\n \"network\",\n \"workflow\",\n \"danger:destructive\",\n ],\n});\n\n/**\n * Hub that wraps PTCRuntime and exposes every registered tool as a LangChain\n * DynamicTool, so local agents (LangChain AgentExecutor, createReactAgent, etc.)\n * can use the same tools as MCP and the ReAct agent.\n */\nexport class LangChainToolsHub {\n constructor(\n private readonly runtime: PTCRuntime,\n private readonly ctxFactory: ExecContextFactory = DEFAULT_CTX_FACTORY,\n ) {}\n\n /**\n * Returns all registered tools as LangChain tools (DynamicTool[]).\n * Each tool invokes the runtime through the full pipeline (policy, HITL, etc.).\n */\n getLangChainTools(): DynamicTool[] {\n const registry = this.runtime.getRegistry();\n const specs = registry.snapshot();\n\n return specs.map((spec) => this.specToLangChainTool(spec));\n }\n\n /**\n * Returns LangChain tools for a subset of tools (by name or query).\n */\n getLangChainToolsForNames(toolNames: string[]): DynamicTool[] {\n const registry = this.runtime.getRegistry();\n const set = new Set(toolNames);\n const specs = registry.snapshot().filter((s) => set.has(s.name));\n return specs.map((spec) => this.specToLangChainTool(spec));\n }\n\n private specToLangChainTool(spec: ToolSpec): DynamicTool {\n const runtime = this.runtime;\n const ctxFactory = this.ctxFactory;\n\n return new DynamicTool({\n name: spec.name,\n description: spec.description ?? `Tool: ${spec.name}`,\n func: async (input: string): Promise<string> => {\n const args = parseToolInput(input);\n const intent: ToolIntent = {\n tool: spec.name,\n args,\n purpose: \"langchain\",\n };\n const ctx = ctxFactory();\n const result = await runtime.invoke(intent, ctx);\n\n if (result.ok) {\n return typeof result.result === \"string\"\n ? result.result\n : JSON.stringify(result.result);\n }\n\n const err = result.error;\n const message = err?.message ?? \"Tool failed\";\n const details = err?.details;\n return JSON.stringify(\n details != null ? { error: message, details } : { error: message },\n );\n },\n });\n }\n}\n\nfunction parseToolInput(input: string): Record<string, unknown> {\n const s = input.trim();\n if (!s) return {};\n try {\n const parsed = JSON.parse(s) as unknown;\n if (parsed != null && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n // ignore\n }\n const lastBrace = s.lastIndexOf(\"{\");\n if (lastBrace !== -1) {\n try {\n const parsed = JSON.parse(s.slice(lastBrace)) as unknown;\n if (parsed != null && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n // ignore\n }\n }\n return {};\n}\n","/**\n * Adapter: agent-llm ILLMClient (with chatWithTools) → OpenAICompatibleClient.\n * Use when running ReActAgent with LLM from agent.yaml (createLLMRegistry).\n */\n\nimport type { ILLMClient } from \"@easynet/agent-llm\";\nimport type {\n ChatMessage,\n ChatOptions,\n ChatResult,\n OpenAIToolDefinition,\n AssistantMessageWithToolCalls,\n ChatWithToolsResult,\n} from \"./OpenAICompatibleClient.js\";\n\ntype ToolMessage = { role: \"tool\"; content: string; tool_call_id: string };\ntype AssistantWithTools = Omit<AssistantMessageWithToolCalls, \"role\"> & { role: \"assistant\" };\ntype ChatWithToolsMessage = ChatMessage | ToolMessage | AssistantWithTools;\n\n/**\n * Wraps an agent-llm ILLMClient that implements chatWithTools so ReActAgent\n * can use it as an OpenAICompatibleClient.\n */\nexport function createAgentLLMAdapter(client: ILLMClient): OpenAICompatibleClientLike {\n if (!client.chatWithTools) {\n throw new Error(\n `agent-llm client \"${client.id}\" does not support chatWithTools; ReAct agent requires tool-calling.`\n );\n }\n return new AgentLLMAdapter(client);\n}\n\n/** Minimal interface ReActAgent needs from an LLM client. */\nexport interface OpenAICompatibleClientLike {\n chat(messages: ChatMessage[], options?: ChatOptions): Promise<ChatResult>;\n chatWithTools(\n messages: ChatWithToolsMessage[],\n tools: OpenAIToolDefinition[],\n options?: ChatOptions\n ): Promise<ChatWithToolsResult>;\n}\n\nclass AgentLLMAdapter implements OpenAICompatibleClientLike {\n constructor(private readonly client: ILLMClient) {}\n\n async chat(messages: ChatMessage[], options?: ChatOptions): Promise<ChatResult> {\n const result = await this.client.chat(messages);\n return { content: result.content, raw: result.usage ?? {} };\n }\n\n async chatWithTools(\n messages: ChatWithToolsMessage[],\n tools: OpenAIToolDefinition[],\n options?: ChatOptions\n ): Promise<ChatWithToolsResult> {\n const agentLlmTools = tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.function.name,\n description: t.function.description,\n parameters: t.function.parameters,\n },\n }));\n const result = await this.client.chatWithTools!(messages, agentLlmTools, {\n timeoutMs: options?.timeoutMs,\n });\n return {\n message: result.message,\n raw: result.usage ?? {},\n };\n }\n}\n","/**\n * Run ReAct agent using agent.yaml: llm section from agent-llm, tools from builtin + example.\n * Use: runAgent(agentYamlPath, task, options).\n */\n\nimport { readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport yaml from \"js-yaml\";\nimport { createLLMRegistry } from \"@easynet/agent-llm\";\nimport type { AgentConfigLlmSection } from \"@easynet/agent-llm\";\nimport { createAgentLLMAdapter } from \"./llm/AgentLLMAdapter.js\";\nimport { ReActAgent } from \"./llm/ReActAgent.js\";\nimport type { ReActAgentToolHub, ReActAgentRunOptions, ReActAgentRunResult } from \"./llm/ReActAgent.js\";\nimport type { OpenAICompatibleClient } from \"./llm/OpenAICompatibleClient.js\";\nimport { ToolRegistry } from \"./registry/ToolRegistry.js\";\nimport { PTCRuntime } from \"./runtime/PTCRuntime.js\";\nimport type { ExecContext } from \"./types/ToolIntent.js\";\nimport {\n registerCoreTools,\n type CoreToolsUserConfig,\n} from \"@easynet/agent-tool-builtin-tools\";\nimport {\n registerExampleTools,\n type ExampleToolsUserConfig,\n} from \"@easynet/agent-tool-example-tools\";\nimport { normalizeToolList } from \"./toolDescriptor.js\";\n\nexport interface AgentRunConfig {\n /** Path to agent.yaml (default: cwd/agent.yaml) */\n configPath?: string;\n /** User task (instruction) */\n task: string;\n /** System prompt (optional) */\n systemPrompt?: string;\n /** ReAct run options (maxSteps, timeoutMs) */\n runOptions?: ReActAgentRunOptions;\n /** Sandbox root for core tools (default: cwd) */\n sandboxRoot?: string;\n /** Allowed hosts for HTTP/SSRF (default: [\"*\"]) */\n allowedHosts?: string[];\n}\n\nexport interface AgentRunResult extends ReActAgentRunResult {}\n\n/** Minimal agent.yaml shape: llm section (agent-llm format), optional tools list. */\nexport interface AgentYamlShape {\n llm?: unknown;\n tools?: string[] | Record<string, unknown>;\n mode?: string;\n}\n\nconst DEFAULT_ALLOWED_HOSTS = [\"*\"];\nconst DEFAULT_SANDBOX_ROOT = process.cwd();\n\n/**\n * Load agent.yaml and return parsed llm section and optional tools.\n */\nexport function loadAgentConfig(configPath: string): AgentYamlShape {\n const abs = resolve(configPath);\n const raw = readFileSync(abs, \"utf8\");\n const parsed = yaml.load(raw) as AgentYamlShape | undefined;\n if (!parsed || typeof parsed !== \"object\") return {};\n return parsed;\n}\n\n/**\n * Create PTCRuntime with builtin + example tools registered.\n */\nfunction createRuntimeWithTools(options: {\n sandboxRoot?: string;\n allowedHosts?: string[];\n}): { runtime: PTCRuntime; coreAdapter: ReturnType<typeof registerCoreTools>; exampleAdapter: ReturnType<typeof registerExampleTools> } {\n const sandboxRoot = options.sandboxRoot ?? DEFAULT_SANDBOX_ROOT;\n const allowedHosts = options.allowedHosts ?? DEFAULT_ALLOWED_HOSTS;\n const registry = new ToolRegistry();\n\n const coreConfig: CoreToolsUserConfig = { sandboxRoot, allowedHosts };\n const coreAdapter = registerCoreTools(registry, coreConfig);\n\n const exampleConfig: ExampleToolsUserConfig = { sandboxRoot, allowedHosts };\n const exampleAdapter = registerExampleTools(registry, exampleConfig);\n\n const runtime = new PTCRuntime({ registry });\n runtime.registerAdapter(coreAdapter);\n runtime.registerAdapter(exampleAdapter);\n\n return { runtime, coreAdapter, exampleAdapter };\n}\n\n/**\n * Run the ReAct agent: load agent.yaml llm section → create LLM from agent-llm →\n * wrap with adapter → run ReActAgent with builtin + example tools.\n */\nexport async function runAgent(\n configPath: string,\n task: string,\n options?: Omit<AgentRunConfig, \"configPath\" | \"task\">\n): Promise<AgentRunResult> {\n const config = loadAgentConfig(configPath);\n const llmSection = (config.llm ?? null) as AgentConfigLlmSection | null | undefined;\n\n const registry = createLLMRegistry({ llmSection });\n const defaultId = registry.defaultId();\n if (!defaultId) {\n throw new Error(\n \"agent.yaml has no llm section or no LLM instances. Add an llm block (see agent.yaml.example).\"\n );\n }\n\n const client = registry.get(defaultId);\n if (!client) {\n throw new Error(`LLM \"${defaultId}\" not found in registry.`);\n }\n\n const adapter = createAgentLLMAdapter(client);\n\n const sandboxRoot = options?.sandboxRoot ?? DEFAULT_SANDBOX_ROOT;\n const allowedHosts = options?.allowedHosts ?? DEFAULT_ALLOWED_HOSTS;\n const { runtime } = createRuntimeWithTools({ sandboxRoot, allowedHosts });\n\n const ctxFactory = (): ExecContext => ({\n requestId: `run-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n taskId: `task-${Date.now()}`,\n permissions: [\n \"read:web\",\n \"read:fs\",\n \"write:fs\",\n \"read:db\",\n \"write:db\",\n \"network\",\n \"workflow\",\n \"danger:destructive\",\n \"exec\",\n ],\n });\n\n const hub: ReActAgentToolHub = {\n getRegistry: () => runtime.getRegistry(),\n invokeTool: async (name, args) => {\n const ctx = ctxFactory();\n const result = await runtime.invoke(\n { tool: name, args, purpose: \"langchain\" },\n ctx\n );\n return result;\n },\n };\n\n const agent = new ReActAgent(adapter as unknown as OpenAICompatibleClient, hub);\n const toolNames =\n Array.isArray(config.tools) && config.tools.length > 0\n ? normalizeToolList(config.tools as string[])\n : undefined;\n return agent.run(task, {\n systemPrompt: options?.systemPrompt,\n toolNames,\n ...options?.runOptions,\n });\n}\n","import { readFileSync, writeFileSync, existsSync } from \"node:fs\";\nimport { resolve, join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type {\n AgentReportData,\n AgentReportStep,\n CollectStreamStepsOptions,\n CollectStreamStepsResult,\n RunAgentWithReportOptions,\n RunAgentWithReportResult,\n StreamableAgent,\n WriteReportFromStreamOptions,\n} from \"./types.js\";\n\nconst PLACEHOLDER = \"__REPORT_DATA__\";\n\nfunction getReportTemplateDir(): string {\n if (typeof __dirname !== \"undefined\") return __dirname;\n return dirname(fileURLToPath(import.meta.url));\n}\n\n/** Path to the default HTML template (dist/report/ when built, src/report/ in dev). */\nexport const DEFAULT_REPORT_TEMPLATE_PATH = (() => {\n const dir = getReportTemplateDir();\n const nextToModule = join(dir, \"agent-report-template.html\");\n if (existsSync(nextToModule)) return nextToModule;\n return join(dir, \"report\", \"agent-report-template.html\");\n})();\n\n/**\n * Generate an HTML report from template and data.\n * Uses the built-in HTML template file when templatePath is not provided.\n *\n * @param data - Report data (prompts, markdown, steps)\n * @param options.outputPath - Path to write the HTML file (required)\n * @param options.templatePath - Path to a custom HTML template (optional; uses built-in file if not set)\n * @returns Path to the written file\n */\nexport function generateAgentReport(\n data: AgentReportData,\n options: { outputPath: string; templatePath?: string }\n): string {\n const templatePath = options.templatePath ?? DEFAULT_REPORT_TEMPLATE_PATH;\n const template = readFileSync(templatePath, \"utf8\");\n let json = JSON.stringify(data);\n json = json.replace(/<\\/script/gi, \"<\\\\/script\");\n const html = template.replace(PLACEHOLDER, json);\n const outPath = resolve(options.outputPath);\n writeFileSync(outPath, html, \"utf8\");\n return outPath;\n}\n\n/**\n * Serialize a stream chunk value for the report (messages and metadata to plain JSON).\n */\nexport function serializeStepOutput(value: unknown): unknown {\n if (value === null || value === undefined) return value;\n if (typeof value !== \"object\") return value;\n const v = value as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n if (Array.isArray(v.messages)) {\n out.messages = v.messages.map((m: unknown) => serializeMessage(m));\n }\n if (v.__state__ && typeof v.__state__ === \"object\") {\n const state = v.__state__ as Record<string, unknown>;\n if (Array.isArray(state.messages)) {\n out.messages = state.messages.map((m: unknown) => serializeMessage(m));\n }\n }\n if (Object.keys(out).length === 0) {\n try {\n return JSON.parse(JSON.stringify(value));\n } catch {\n return { _raw: String(value) };\n }\n }\n return out;\n}\n\nfunction serializeMessage(msg: unknown): Record<string, unknown> {\n if (msg === null || typeof msg !== \"object\") return { content: String(msg) };\n const m = msg as Record<string, unknown>;\n const out: Record<string, unknown> = {\n type: m.type ?? \"message\",\n content: m.content ?? \"\",\n };\n if (m.tool_calls) out.tool_calls = m.tool_calls;\n if (m.usage_metadata) out.usage_metadata = m.usage_metadata;\n if (m.name) out.name = m.name;\n return out;\n}\n\n/**\n * Format a step for console progress (e.g. \"[1] agent | tools → foo | tokens: in=10 out=5\").\n */\nexport function formatStepProgress(step: AgentReportStep): string {\n const parts = [` [${step.stepIndex}] ${step.node}`];\n if (step.toolCalls?.length) {\n const toolParts = step.toolCalls.map((tc) => {\n const argStr =\n tc.args && Object.keys(tc.args).length ? \" \" + JSON.stringify(tc.args) : \"\";\n return `${tc.name}${argStr}`;\n });\n parts.push(`tools → ${toolParts.join(\"; \")}`);\n }\n if (step.usage) {\n const inN = step.usage.input_tokens ?? 0;\n const outN = step.usage.output_tokens ?? 0;\n const total = step.usage.total_tokens ?? inN + outN;\n parts.push(`tokens: in=${inN} out=${outN} total=${total}`);\n }\n return parts.join(\" | \");\n}\n\n/**\n * Build a single step from a stream chunk (node + value).\n */\nfunction buildStep(stepIndex: number, node: string, value: unknown): AgentReportStep {\n const v = value as Record<string, unknown> | null | undefined;\n const messages = v?.messages ?? (v?.__state__ as Record<string, unknown> | undefined)?.messages;\n const lastMsg = Array.isArray(messages) ? messages.slice(-1)[0] : undefined;\n const last = lastMsg as Record<string, unknown> | undefined;\n const toolCalls = last?.tool_calls as Array<{ name: string; args?: Record<string, unknown> }> | undefined;\n const usage = last?.usage_metadata as\n | { input_tokens?: number; output_tokens?: number; total_tokens?: number; prompt_tokens?: number; completion_tokens?: number }\n | undefined;\n return {\n stepIndex,\n node,\n input: undefined, // filled later from previous step's output\n output: serializeStepOutput(value),\n toolCalls: toolCalls?.map((tc) => ({ name: tc.name, args: tc.args ?? {} })),\n usage: usage\n ? {\n input_tokens: usage.input_tokens ?? usage.prompt_tokens,\n output_tokens: usage.output_tokens ?? usage.completion_tokens,\n total_tokens: usage.total_tokens,\n }\n : undefined,\n };\n}\n\nfunction isAiMessage(msg: Record<string, unknown> | null | undefined): boolean {\n if (!msg || typeof msg !== \"object\") return false;\n if (msg.type === \"ai\" || msg.type === \"assistant\") return true;\n const getType = msg._getType as (() => string) | undefined;\n if (typeof getType === \"function\" && getType.call(msg) === \"ai\") return true;\n const lcId = msg.lc_id as string[] | undefined;\n if (Array.isArray(lcId) && lcId[lcId.length - 1] === \"AIMessage\") return true;\n return false;\n}\n\nfunction getMessageContent(msg: Record<string, unknown> | null | undefined): string {\n if (!msg || typeof msg !== \"object\") return \"\";\n let c: unknown = msg.content ?? (msg.kwargs as Record<string, unknown> | undefined)?.content;\n if (typeof c === \"string\") return c;\n if (Array.isArray(c)) {\n return (c as Array<{ type?: string; text?: string }>)\n .map((p) => (p && typeof p === \"object\" && \"text\" in p ? p.text : String(p)))\n .filter(Boolean)\n .join(\"\");\n }\n return \"\";\n}\n\nfunction extractAiContent(msg: Record<string, unknown> | null | undefined): string {\n if (!msg || !isAiMessage(msg)) return \"\";\n return getMessageContent(msg);\n}\n\n/**\n * Consume an agent stream and collect steps. Optionally call onStep for each step (e.g. progress logging).\n * Also captures the last AI message content for use as report body when no reportPath is provided.\n *\n * @param stream - AsyncIterable from agent.stream()\n * @param options.onStep - Called for each step\n * @returns Collected steps and last AI content\n */\nexport async function collectStreamSteps(\n stream: AsyncIterable<Record<string, unknown>>,\n options?: CollectStreamStepsOptions\n): Promise<CollectStreamStepsResult> {\n const steps: AgentReportStep[] = [];\n let stepIndex = 0;\n let lastAiContent = \"\";\n for await (const chunk of stream) {\n // LangGraph yields [mode, data] or [ns, mode, data]; the node→value map is the last element\n const nodeMap =\n Array.isArray(chunk) &&\n chunk.length >= 2 &&\n typeof chunk[chunk.length - 1] === \"object\" &&\n chunk[chunk.length - 1] !== null &&\n !Array.isArray(chunk[chunk.length - 1])\n ? (chunk[chunk.length - 1] as Record<string, unknown>)\n : (chunk as Record<string, unknown>);\n for (const [node, value] of Object.entries(nodeMap)) {\n if (value === undefined || value === null) continue;\n stepIndex += 1;\n const step = buildStep(stepIndex, node, value);\n steps.push(step);\n options?.onStep?.(step);\n const v = value as Record<string, unknown>;\n const messages = v?.messages ?? (v?.__state__ as Record<string, unknown> | undefined)?.messages;\n const lastMsg = Array.isArray(messages) ? (messages.slice(-1)[0] as Record<string, unknown>) : undefined;\n let content = extractAiContent(lastMsg);\n // Fallback: from \"agent\" node, use last message content if it looks like final reply (not a tool message)\n if (!content && node === \"agent\" && lastMsg && typeof lastMsg === \"object\" && !(\"tool_call_id\" in lastMsg && lastMsg.tool_call_id)) {\n content = getMessageContent(lastMsg);\n }\n if (content) lastAiContent = content;\n }\n }\n // Input to step N is the output of step N-1 (stream only gives per-node output)\n for (let i = 1; i < steps.length; i++) {\n const prev = steps[i - 1];\n const curr = steps[i];\n if (prev && curr) curr.input = prev.output;\n }\n const first = steps[0];\n if (first && first.input === undefined) {\n first.input = { __info: \"Initial state (see System and User Prompt above)\" };\n }\n return { steps, lastAiContent };\n}\n\n/**\n * Run an agent stream, collect steps, optionally read report file and write HTML report.\n * Use this to support progress callbacks and HTML report generation at the framework level.\n *\n * @param agent - Agent with .stream(input, config) (e.g. LangChain createAgent())\n * @param input - Input to agent.stream()\n * @param options - systemPrompt, userPrompt, reportPath, htmlReportPath, templatePath, streamConfig, onStep\n * @returns { steps, reportMarkdown, htmlPath? }\n */\nexport async function runAgentWithReport(\n agent: StreamableAgent,\n input: unknown,\n options: RunAgentWithReportOptions\n): Promise<RunAgentWithReportResult> {\n const stream = await agent.stream(input, options.streamConfig ?? {});\n const { steps, lastAiContent } = await collectStreamSteps(stream, { onStep: options.onStep });\n\n let reportMarkdown = lastAiContent;\n if (options.reportPath) {\n const reportPath = resolve(options.reportPath);\n if (existsSync(reportPath)) {\n reportMarkdown = readFileSync(reportPath, \"utf8\");\n }\n }\n\n let htmlPath: string | undefined;\n if (options.htmlReportPath) {\n htmlPath = generateAgentReport(\n {\n systemPrompt: options.systemPrompt,\n userPrompt: options.userPrompt,\n reportMarkdown,\n steps,\n },\n {\n outputPath: options.htmlReportPath,\n templatePath: options.templatePath,\n }\n );\n }\n\n return { steps, reportMarkdown, htmlPath };\n}\n\n/**\n * Consume an agent stream and optionally write the HTML report.\n * Use this with regular LangChain usage: get the stream from agent.stream(), then pass it here.\n *\n * @param stream - Stream from agent.stream(input, config)\n * @param options - systemPrompt, userPrompt, reportPath?, htmlReportPath?, templatePath?, onStep?\n * @returns { steps, reportMarkdown, htmlPath? }\n */\nexport async function writeReportFromStream(\n stream: AsyncIterable<Record<string, unknown>>,\n options: WriteReportFromStreamOptions\n): Promise<RunAgentWithReportResult> {\n const { steps, lastAiContent } = await collectStreamSteps(stream, { onStep: options.onStep });\n\n let reportMarkdown = lastAiContent;\n if (options.reportPath) {\n const reportPath = resolve(options.reportPath);\n if (existsSync(reportPath)) {\n reportMarkdown = readFileSync(reportPath, \"utf8\");\n }\n }\n\n let htmlPath: string | undefined;\n if (options.htmlReportPath) {\n htmlPath = generateAgentReport(\n {\n systemPrompt: options.systemPrompt,\n userPrompt: options.userPrompt,\n reportMarkdown,\n steps,\n },\n {\n outputPath: options.htmlReportPath,\n templatePath: options.templatePath,\n }\n );\n }\n\n return { steps, reportMarkdown, htmlPath };\n}\n"]}
|