@mhingston5/conduit 1.1.5 → 1.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/core/config.service.ts","../src/core/logger.ts","../src/transport/socket.transport.ts","../src/core/execution.context.ts","../src/transport/stdio.transport.ts","../src/core/ops.server.ts","../src/core/concurrency.service.ts","../src/core/metrics.service.ts","../src/core/request.controller.ts","../src/gateway/upstream.client.ts","../src/gateway/auth.service.ts","../src/gateway/schema.cache.ts","../src/core/policy.service.ts","../src/gateway/gateway.service.ts","../src/core/network.policy.service.ts","../src/core/session.manager.ts","../src/core/security.service.ts","../src/core/otel.service.ts","../src/executors/deno.executor.ts","../src/core/asset.utils.ts","../src/executors/pyodide.executor.ts","../src/executors/isolate.executor.ts","../src/core/registries/executor.registry.ts","../src/sdk/tool-binding.ts","../src/sdk/sdk-generator.ts","../src/core/execution.service.ts","../src/core/middleware/error.middleware.ts","../src/core/middleware/logging.middleware.ts","../src/core/middleware/auth.middleware.ts","../src/core/middleware/ratelimit.middleware.ts","../src/core/middleware/middleware.builder.ts","../src/auth.cmd.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander';\nimport { ConfigService } from './core/config.service.js';\nimport { createLogger, loggerStorage } from './core/logger.js';\nimport { SocketTransport } from './transport/socket.transport.js';\nimport { StdioTransport } from './transport/stdio.transport.js';\nimport { OpsServer } from './core/ops.server.js';\nimport { ConcurrencyService } from './core/concurrency.service.js';\nimport { RequestController } from './core/request.controller.js';\nimport { GatewayService } from './gateway/gateway.service.js';\nimport { SecurityService } from './core/security.service.js';\nimport { OtelService } from './core/otel.service.js';\nimport { DenoExecutor } from './executors/deno.executor.js';\nimport { PyodideExecutor } from './executors/pyodide.executor.js';\nimport { IsolateExecutor } from './executors/isolate.executor.js';\nimport { ExecutorRegistry } from './core/registries/executor.registry.js';\nimport { ExecutionService } from './core/execution.service.js';\nimport { buildDefaultMiddleware } from './core/middleware/middleware.builder.js';\nimport { handleAuth } from './auth.cmd.js';\n\nconst program = new Command();\n\nprogram\n .name('conduit')\n .description('A secure Code Mode execution substrate for MCP agents')\n .version('1.0.0');\n\nprogram\n .command('serve', { isDefault: true })\n .description('Start the Conduit server')\n .option('--stdio', 'Use stdio transport')\n .action(async (options) => {\n try {\n await startServer();\n } catch (err) {\n console.error('Failed to start Conduit:', err);\n process.exit(1);\n }\n });\n\nprogram\n .command('auth')\n .description('Help set up OAuth for an upstream MCP server')\n .requiredOption('--client-id <id>', 'OAuth Client ID')\n .requiredOption('--client-secret <secret>', 'OAuth Client Secret')\n .option('--auth-url <url>', 'OAuth Authorization URL')\n .option('--token-url <url>', 'OAuth Token URL')\n .option('--mcp-url <url>', 'MCP base URL (auto-discover OAuth metadata)')\n .option('--scopes <scopes>', 'OAuth Scopes (comma separated)')\n .option('--port <port>', 'Port for the local callback server', '3333')\n .option('--pkce', 'Use PKCE for the authorization code flow')\n .action(async (options) => {\n try {\n await handleAuth({\n clientId: options.clientId,\n clientSecret: options.clientSecret,\n authUrl: options.authUrl,\n tokenUrl: options.tokenUrl,\n mcpUrl: options.mcpUrl,\n scopes: options.scopes,\n port: parseInt(options.port, 10),\n usePkce: options.pkce || Boolean(options.mcpUrl),\n });\n console.log('\\nSuccess! Configuration generated.');\n } catch (err: any) {\n console.error('Authentication helper failed:', err.message);\n process.exit(1);\n }\n });\n\nasync function startServer() {\n const configService = new ConfigService();\n const logger = createLogger(configService);\n\n const otelService = new OtelService(logger);\n await otelService.start();\n\n await loggerStorage.run({ correlationId: 'system' }, async () => {\n // Disable auth for Stdio transport (implicitly trusted as it is spawned by the user)\n const isStdio = configService.get('transport') === 'stdio';\n const ipcToken = isStdio ? undefined : configService.get('ipcBearerToken');\n\n const securityService = new SecurityService(logger, ipcToken!);\n\n const gatewayService = new GatewayService(logger, securityService);\n const upstreams = configService.get('upstreams') || [];\n for (const upstream of upstreams) {\n gatewayService.registerUpstream(upstream);\n }\n\n const executorRegistry = new ExecutorRegistry();\n executorRegistry.register('deno', new DenoExecutor(configService.get('denoMaxPoolSize')));\n executorRegistry.register('python', new PyodideExecutor(configService.get('pyodideMaxPoolSize')));\n\n // IsolateExecutor needs gatewayService\n const isolateExecutor = new IsolateExecutor(logger, gatewayService);\n executorRegistry.register('isolate', isolateExecutor);\n\n const executionService = new ExecutionService(\n logger,\n configService.get('resourceLimits'),\n gatewayService,\n securityService,\n executorRegistry\n );\n\n const requestController = new RequestController(\n logger,\n executionService,\n gatewayService,\n buildDefaultMiddleware(securityService)\n );\n\n const opsServer = new OpsServer(logger, configService.all, gatewayService, requestController);\n await opsServer.listen();\n\n const concurrencyService = new ConcurrencyService(logger, {\n maxConcurrent: configService.get('maxConcurrent')\n });\n\n let transport: SocketTransport | StdioTransport;\n let address: string;\n\n if (configService.get('transport') === 'stdio') {\n transport = new StdioTransport(logger, requestController, concurrencyService);\n await transport.start();\n address = 'stdio';\n\n // IMPORTANT: Even in stdio mode, we need a local socket for sandboxes to talk to\n const internalTransport = new SocketTransport(logger, requestController, concurrencyService);\n const internalPort = 0; // Random available port\n const internalAddress = await internalTransport.listen({ port: internalPort });\n executionService.ipcAddress = internalAddress;\n\n // Register internal transport for shutdown\n const originalShutdown = transport.close.bind(transport);\n transport.close = async () => {\n await originalShutdown();\n await internalTransport.close();\n };\n } else {\n transport = new SocketTransport(logger, requestController, concurrencyService);\n const port = configService.get('port');\n address = await transport.listen({ port });\n executionService.ipcAddress = address;\n }\n\n // Pre-warm workers\n await requestController.warmup();\n\n logger.info('Conduit server started');\n\n // Handle graceful shutdown\n const shutdown = async () => {\n logger.info('Shutting down...');\n await Promise.all([\n transport.close(),\n opsServer.close(),\n requestController.shutdown(),\n otelService.shutdown(),\n ]);\n process.exit(0);\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n });\n}\n\nprogram.parse(process.argv);\n","import { z } from 'zod';\nimport dotenv from 'dotenv';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport crypto from 'node:crypto';\nimport yaml from 'js-yaml';\n\n// Silence dotenv logging\nconst originalWrite = process.stdout.write;\n// @ts-ignore\nprocess.stdout.write = () => true;\ndotenv.config();\nprocess.stdout.write = originalWrite;\n\nimport { AppConfig } from './interfaces/app.config.js';\n\n\nexport const ResourceLimitsSchema = z.object({\n timeoutMs: z.number().default(30000),\n memoryLimitMb: z.number().default(256),\n maxOutputBytes: z.number().default(1024 * 1024), // 1MB\n maxLogEntries: z.number().default(10000),\n});\n\nexport const UpstreamCredentialsSchema = z.object({\n type: z.enum(['oauth2', 'apiKey', 'bearer']), // Align with AuthType\n clientId: z.string().optional(),\n clientSecret: z.string().optional(),\n tokenUrl: z.string().optional(),\n refreshToken: z.string().optional(),\n scopes: z.array(z.string()).optional(),\n apiKey: z.string().optional(),\n bearerToken: z.string().optional(),\n headerName: z.string().optional(),\n});\n\nexport const HttpUpstreamSchema = z.object({\n id: z.string(),\n type: z.literal('http').optional().default('http'),\n url: z.string(),\n credentials: UpstreamCredentialsSchema.optional(),\n});\n\nexport const StdioUpstreamSchema = z.object({\n id: z.string(),\n type: z.literal('stdio'),\n command: z.string(),\n args: z.array(z.string()).optional(),\n env: z.record(z.string(), z.string()).optional(),\n});\n\nexport const UpstreamInfoSchema = z.union([HttpUpstreamSchema, StdioUpstreamSchema]);\n\nexport type ResourceLimits = z.infer<typeof ResourceLimitsSchema>;\n\nexport const ConfigSchema = z.object({\n port: z.union([z.string(), z.number()]).default('3000').transform((v) => Number(v)),\n nodeEnv: z.enum(['development', 'production', 'test']).default('development'),\n logLevel: z.enum(['debug', 'info', 'warn', 'error']).default('info'),\n resourceLimits: ResourceLimitsSchema.default({\n timeoutMs: 30000,\n memoryLimitMb: 256,\n maxOutputBytes: 1024 * 1024,\n maxLogEntries: 10000,\n }),\n secretRedactionPatterns: z.array(z.string()).default([\n '[A-Za-z0-9-_]{20,}', // Default pattern from spec\n ]),\n ipcBearerToken: z.string().optional().default(() => crypto.randomUUID()),\n maxConcurrent: z.number().default(10),\n denoMaxPoolSize: z.number().default(10),\n pyodideMaxPoolSize: z.number().default(3),\n metricsUrl: z.string().default('http://127.0.0.1:9464/metrics'),\n opsPort: z.number().optional(),\n transport: z.enum(['socket', 'stdio']).default('socket'),\n upstreams: z.array(UpstreamInfoSchema).default([]),\n});\n\nexport type Config = z.infer<typeof ConfigSchema>;\n\nexport class ConfigService {\n private config: AppConfig;\n\n constructor(overrides: Partial<AppConfig> = {}) {\n const fileConfig = this.loadConfigFile();\n\n const envConfig = {\n port: process.env.PORT,\n nodeEnv: process.env.NODE_ENV,\n logLevel: process.env.LOG_LEVEL,\n metricsUrl: process.env.METRICS_URL,\n ipcBearerToken: process.env.IPC_BEARER_TOKEN,\n transport: process.argv.includes('--stdio') ? 'stdio' : undefined,\n // upstreams: process.env.UPSTREAMS ? JSON.parse(process.env.UPSTREAMS) : undefined, // Removed per user request\n };\n\n // Remove undefined keys from envConfig\n Object.keys(envConfig).forEach(key => envConfig[key as keyof typeof envConfig] === undefined && delete envConfig[key as keyof typeof envConfig]);\n\n const mergedConfig = {\n ...fileConfig,\n ...envConfig,\n ...overrides,\n };\n\n const result = ConfigSchema.safeParse(mergedConfig);\n if (!result.success) {\n const error = result.error.format();\n throw new Error(`Invalid configuration: ${JSON.stringify(error, null, 2)}`);\n }\n\n this.config = result.data as AppConfig;\n\n // Default opsPort if not set\n if (this.config.opsPort === undefined) {\n if (this.config.transport === 'stdio') {\n this.config.opsPort = 0; // Random port for stdio to avoid conflicts\n } else {\n this.config.opsPort = this.config.port === 0 ? 0 : this.config.port + 1;\n }\n }\n }\n\n get<K extends keyof AppConfig>(key: K): AppConfig[K] {\n return this.config[key];\n }\n\n get all(): AppConfig {\n return { ...this.config };\n }\n\n private loadConfigFile(): Partial<AppConfig> {\n const configPath = process.env.CONFIG_FILE ||\n (fs.existsSync(path.resolve(process.cwd(), 'conduit.yaml')) ? 'conduit.yaml' :\n (fs.existsSync(path.resolve(process.cwd(), 'conduit.json')) ? 'conduit.json' : null));\n\n if (!configPath) return {};\n\n try {\n const fullPath = path.resolve(process.cwd(), configPath);\n let fileContent = fs.readFileSync(fullPath, 'utf-8');\n\n // Env var substitution: ${VAR} or ${VAR:-default}\n fileContent = fileContent.replace(/\\$\\{([a-zA-Z0-9_]+)(?::-([^}]+))?\\}/g, (match, varName, defaultValue) => {\n const value = process.env[varName];\n if (value !== undefined) {\n return value;\n }\n return defaultValue !== undefined ? defaultValue : '';\n });\n\n if (configPath.endsWith('.yaml') || configPath.endsWith('.yml')) {\n return yaml.load(fileContent) as Partial<AppConfig>;\n } else {\n return JSON.parse(fileContent);\n }\n } catch (error) {\n console.warn(`Failed to load config file ${configPath}:`, error);\n return {};\n }\n }\n}\n","import pino from 'pino';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { ConfigService } from './config.service.js';\n\nexport const loggerStorage = new AsyncLocalStorage<{ correlationId: string }>();\n\nexport function createLogger(configService: ConfigService) {\n const logLevel = configService.get('logLevel');\n const redactionPatterns = configService.get('secretRedactionPatterns');\n const secretPatterns = redactionPatterns.map(p => new RegExp(p, 'g'));\n\n const redactString = (str: string) => {\n let result = str;\n for (const pattern of secretPatterns) {\n result = result.replace(pattern, '[REDACTED]');\n }\n return result;\n };\n\n return pino({\n level: logLevel,\n hooks: {\n logMethod(inputArgs, method) {\n const redactedArgs = inputArgs.map(arg => {\n try {\n if (typeof arg === 'string') {\n return redactString(arg);\n }\n if (typeof arg === 'object' && arg !== null) {\n // Shallow clone and redact keys if they are strings\n const clone = { ...arg } as any;\n for (const key in clone) {\n if (typeof clone[key] === 'string') {\n clone[key] = redactString(clone[key]);\n }\n }\n return clone;\n }\n } catch (err) {\n return '[REDACTION_ERROR]';\n }\n return arg;\n });\n return method.apply(this, redactedArgs as any);\n }\n },\n redact: {\n paths: ['toolParams.*', 'headers.Authorization', 'headers.authorization', 'params.token'],\n censor: '[REDACTED]',\n },\n mixin() {\n const store = loggerStorage.getStore();\n return {\n correlationId: store?.correlationId,\n };\n },\n // In stdio mode, never use pino-pretty to avoid stdout pollution\n transport: configService.get('transport') !== 'stdio' && configService.get('nodeEnv') === 'development'\n ? { target: 'pino-pretty', options: { colorize: true } }\n : undefined,\n }, configService.get('transport') === 'stdio'\n ? pino.destination(2) // Always write to stderr in stdio mode\n : undefined\n );\n}\n","import net from 'node:net';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { Logger } from 'pino';\nimport { RequestController } from '../core/request.controller.js';\nimport { JSONRPCRequest, ConduitError } from '../core/types.js';\nimport { ExecutionContext } from '../core/execution.context.js';\nimport { ConcurrencyService } from '../core/concurrency.service.js';\nimport { loggerStorage } from '../core/logger.js';\n\nexport interface TransportOptions {\n path?: string; // For Unix Socket or Named Pipe\n port?: number; // For TCP (development)\n host?: string;\n}\n\nexport class SocketTransport {\n private server: net.Server;\n private logger: Logger;\n private requestController: RequestController;\n private concurrencyService: ConcurrencyService;\n\n constructor(\n logger: Logger,\n requestController: RequestController,\n concurrencyService: ConcurrencyService\n ) {\n this.logger = logger;\n this.requestController = requestController;\n this.concurrencyService = concurrencyService;\n this.server = net.createServer((socket) => {\n this.handleConnection(socket);\n });\n\n this.server.on('error', (err) => {\n this.logger.error({ err }, 'Server error');\n });\n }\n\n async listen(options: TransportOptions): Promise<string> {\n return new Promise((resolve, reject) => {\n if (options.path) {\n // Strict IPC mode\n const socketPath = this.formatSocketPath(options.path);\n this.logger.info({ socketPath }, 'Binding to IPC socket');\n\n // Cleanup existing socket if needed (unlikely on Windows, but good for Unix)\n if (os.platform() !== 'win32' && path.isAbsolute(socketPath)) {\n try {\n fs.unlinkSync(socketPath);\n } catch (error: any) {\n if (error.code !== 'ENOENT') {\n this.logger.warn({ err: error, socketPath }, 'Failed to unlink socket before binding');\n }\n }\n }\n\n this.server.listen(socketPath, () => {\n this.resolveAddress(resolve);\n });\n } else if (options.port !== undefined) {\n // Strict TCP mode\n this.logger.info({ port: options.port, host: options.host }, 'Binding to TCP port');\n this.server.listen(options.port, options.host || '127.0.0.1', () => {\n this.resolveAddress(resolve);\n });\n } else {\n reject(new Error('Invalid transport configuration: neither path nor port provided'));\n return;\n }\n\n this.server.on('error', reject);\n });\n }\n\n private resolveAddress(resolve: (value: string) => void) {\n const address = this.server.address();\n const addressStr = typeof address === 'string' ? address : `${address?.address}:${address?.port}`;\n this.logger.info({ address: addressStr }, 'Transport server listening');\n resolve(addressStr);\n }\n\n private formatSocketPath(inputPath: string): string {\n if (os.platform() === 'win32') {\n // Windows Named Pipe format: \\\\.\\pipe\\conduit-[id]\n if (!inputPath.startsWith('\\\\\\\\.\\\\pipe\\\\')) {\n return `\\\\\\\\.\\\\pipe\\\\${inputPath}`;\n }\n return inputPath;\n } else {\n // Unix Socket path\n return path.isAbsolute(inputPath) ? inputPath : path.join(os.tmpdir(), inputPath);\n }\n }\n\n private handleConnection(socket: net.Socket) {\n const remoteAddress = socket.remoteAddress || 'pipe';\n this.logger.debug({ remoteAddress }, 'New connection established');\n\n socket.setEncoding('utf8');\n let buffer = '';\n const MAX_BUFFER_SIZE = 10 * 1024 * 1024; // 10MB limit\n\n socket.on('data', async (chunk) => {\n buffer += chunk;\n\n if (buffer.length > MAX_BUFFER_SIZE) {\n this.logger.error({ remoteAddress }, 'Connection exceeded max buffer size, closing');\n socket.destroy();\n return;\n }\n\n // Backpressure: pause processing new chunks until this buffer is handled\n socket.pause();\n\n try {\n let pos: number;\n while ((pos = buffer.indexOf('\\n')) >= 0) {\n const line = buffer.substring(0, pos).trim();\n buffer = buffer.substring(pos + 1);\n\n if (!line) continue;\n\n let request: JSONRPCRequest;\n try {\n request = JSON.parse(line) as JSONRPCRequest;\n } catch (err) {\n this.logger.error({ err, line }, 'Failed to parse JSON-RPC request');\n const errorResponse = {\n jsonrpc: '2.0',\n id: null,\n error: {\n code: -32700,\n message: 'Parse error',\n },\n };\n socket.write(JSON.stringify(errorResponse) + '\\n');\n continue;\n }\n\n const context = new ExecutionContext({\n logger: this.logger,\n remoteAddress: remoteAddress,\n });\n\n await loggerStorage.run({ correlationId: context.correlationId }, async () => {\n try {\n const response = await this.concurrencyService.run(() =>\n this.requestController.handleRequest(request, context)\n );\n socket.write(JSON.stringify(response) + '\\n');\n } catch (err: any) {\n if (err.name === 'QueueFullError') {\n socket.write(JSON.stringify({\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: ConduitError.ServerBusy,\n message: 'Server busy'\n }\n }) + '\\n');\n } else {\n this.logger.error({ err, requestId: request.id }, 'Request handling failed');\n // Internal error handling usually done by Middleware/RequestController return\n // But if something crashed outside standard flow:\n socket.write(JSON.stringify({\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: ConduitError.InternalError,\n message: 'Internal server error'\n }\n }) + '\\n');\n }\n }\n });\n }\n } catch (err) {\n this.logger.error({ err }, 'Unexpected error in socket data handler');\n socket.destroy();\n } finally {\n socket.resume();\n }\n });\n\n socket.on('close', () => {\n this.logger.debug({ remoteAddress }, 'Connection closed');\n });\n\n socket.on('error', (err) => {\n this.logger.error({ err, remoteAddress }, 'Socket error');\n });\n }\n\n async close(): Promise<void> {\n return new Promise((resolve) => {\n if (this.server.listening) {\n this.server.close(() => {\n this.logger.info('Transport server closed');\n resolve();\n });\n } else {\n resolve();\n }\n });\n }\n}\n","import { v4 as uuidv4 } from 'uuid';\nimport { Logger } from 'pino';\n\nexport interface ExecutionContextOptions {\n tenantId?: string;\n logger: Logger;\n allowedTools?: string[];\n remoteAddress?: string;\n strictValidation?: boolean;\n}\n\nexport class ExecutionContext {\n public readonly correlationId: string;\n public readonly startTime: number;\n public readonly tenantId?: string;\n public logger: Logger;\n public allowedTools?: string[];\n public readonly remoteAddress?: string;\n public readonly strictValidation: boolean;\n\n constructor(options: ExecutionContextOptions) {\n this.correlationId = uuidv4();\n this.startTime = Date.now();\n this.tenantId = options.tenantId;\n this.allowedTools = options.allowedTools;\n this.remoteAddress = options.remoteAddress;\n this.strictValidation = options.strictValidation ?? false;\n this.logger = options.logger.child({\n correlationId: this.correlationId,\n tenantId: this.tenantId,\n });\n }\n\n getDuration(): number {\n return Date.now() - this.startTime;\n }\n}\n","import { Logger } from 'pino';\nimport { RequestController } from '../core/request.controller.js';\nimport { JSONRPCRequest, ConduitError } from '../core/types.js';\nimport { ExecutionContext } from '../core/execution.context.js';\nimport { ConcurrencyService } from '../core/concurrency.service.js';\nimport { loggerStorage } from '../core/logger.js';\n\nexport class StdioTransport {\n private logger: Logger;\n private requestController: RequestController;\n private concurrencyService: ConcurrencyService;\n private buffer: string = '';\n\n constructor(\n logger: Logger,\n requestController: RequestController,\n concurrencyService: ConcurrencyService\n ) {\n this.logger = logger;\n this.requestController = requestController;\n this.concurrencyService = concurrencyService;\n }\n\n async start(): Promise<void> {\n this.logger.info('Starting Stdio transport');\n\n process.stdin.setEncoding('utf8');\n process.stdin.on('data', this.handleData.bind(this));\n\n // Handle stream end if necessary, though usually main process exit handles this\n process.stdin.on('end', () => {\n this.logger.info('Stdin closed');\n });\n }\n\n private handleData(chunk: string) {\n this.buffer += chunk;\n\n let pos: number;\n while ((pos = this.buffer.indexOf('\\n')) >= 0) {\n const line = this.buffer.substring(0, pos).trim();\n this.buffer = this.buffer.substring(pos + 1);\n\n if (!line) continue;\n\n this.processLine(line);\n }\n }\n\n private async processLine(line: string) {\n let request: JSONRPCRequest;\n try {\n request = JSON.parse(line) as JSONRPCRequest;\n } catch (err) {\n this.logger.error({ err, line }, 'Failed to parse JSON-RPC request');\n const errorResponse = {\n jsonrpc: '2.0',\n id: null,\n error: {\n code: -32700,\n message: 'Parse error',\n },\n };\n this.sendResponse(errorResponse);\n return;\n }\n\n const context = new ExecutionContext({\n logger: this.logger,\n remoteAddress: 'stdio',\n });\n\n await loggerStorage.run({ correlationId: context.correlationId }, async () => {\n try {\n const response = await this.concurrencyService.run(() =>\n this.requestController.handleRequest(request, context)\n );\n // Don't send response for notifications (they return null)\n if (response !== null) {\n this.sendResponse(response);\n }\n } catch (err: any) {\n if (err.name === 'QueueFullError') {\n this.sendResponse({\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: ConduitError.ServerBusy,\n message: 'Server busy'\n }\n });\n } else {\n this.logger.error({ err, requestId: request.id }, 'Request handling failed');\n this.sendResponse({\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: ConduitError.InternalError,\n message: 'Internal server error'\n }\n });\n }\n }\n });\n }\n\n private sendResponse(response: any) {\n process.stdout.write(JSON.stringify(response) + '\\n');\n }\n\n async close(): Promise<void> {\n process.stdin.removeAllListeners();\n // We don't close stdout/stdin as they are process-level\n return Promise.resolve();\n }\n}\n","import Fastify from 'fastify';\nimport { Logger } from 'pino';\nimport { AppConfig } from './interfaces/app.config.js';\nimport { GatewayService } from '../gateway/gateway.service.js';\nimport { metrics } from './metrics.service.js';\nimport { RequestController } from './request.controller.js';\nimport axios from 'axios';\n\nexport class OpsServer {\n private fastify = Fastify();\n private logger: Logger;\n private config: AppConfig;\n private gatewayService: GatewayService;\n private requestController: RequestController;\n\n constructor(logger: Logger, config: AppConfig, gatewayService: GatewayService, requestController: RequestController) {\n this.logger = logger;\n this.config = config;\n this.gatewayService = gatewayService;\n this.requestController = requestController;\n\n this.setupRoutes();\n }\n\n private setupRoutes() {\n this.fastify.get('/health', async (request, reply) => {\n const gatewayHealth = await this.gatewayService.healthCheck();\n const requestHealth = await this.requestController.healthCheck();\n\n const overallStatus = gatewayHealth.status === 'ok' && requestHealth.status === 'ok' ? 'ok' : 'error';\n\n return reply.status(overallStatus === 'ok' ? 200 : 503).send({\n status: overallStatus,\n version: '1.0.0',\n gateway: gatewayHealth,\n request: requestHealth,\n });\n });\n\n this.fastify.get('/metrics', async (request, reply) => {\n try {\n // Proxy from OTEL Prometheus exporter\n // Use ConfigService for metrics URL, default to standard localhost:9464\n const metricsUrl = this.config.metricsUrl || 'http://127.0.0.1:9464/metrics';\n const response = await axios.get(metricsUrl);\n return reply.type('text/plain').send(response.data);\n } catch (err) {\n this.logger.error({ err }, 'Failed to fetch OTEL metrics');\n // Fallback to minimal metrics if OTEL exporter is down\n const fallback = '# Metrics consolidated into OpenTelemetry. Check port 9464.\\n' +\n `conduit_uptime_seconds ${process.uptime()}\\n` +\n `conduit_memory_rss_bytes ${process.memoryUsage().rss}\\n`;\n return reply.type('text/plain').send(fallback);\n }\n });\n }\n\n async listen(): Promise<string> {\n // Use explicit opsPort from config\n const port = this.config.opsPort !== undefined ? this.config.opsPort : 3001;\n try {\n const address = await this.fastify.listen({ port, host: '0.0.0.0' });\n this.logger.info({ address }, 'Ops server listening');\n return address;\n } catch (err) {\n this.logger.error({ err }, 'Failed to start Ops server');\n throw err;\n }\n }\n\n async close() {\n await this.fastify.close();\n }\n}\n","import pLimit from 'p-limit';\nimport { Logger } from 'pino';\nimport { trace } from '@opentelemetry/api';\nimport { metrics } from './metrics.service.js';\n\nexport interface ConcurrencyOptions {\n maxConcurrent: number;\n maxQueueSize?: number;\n}\n\nexport class QueueFullError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'QueueFullError';\n }\n}\n\nexport class ConcurrencyService {\n private limit: ReturnType<typeof pLimit>;\n private logger: Logger;\n private maxQueueSize: number;\n private queueDepthHistogram: any; // Using explicit type locally if needed, or rely on metrics service later. Using direct OTEL for now involves refactor.\n // Let's rely on internal state for rejection and let MetricsService handle reporting if possible, or add it here.\n // simpler: usage of metrics service is better pattern.\n\n constructor(logger: Logger, options: ConcurrencyOptions) {\n this.logger = logger;\n this.limit = pLimit(options.maxConcurrent);\n this.maxQueueSize = options.maxQueueSize || 100; // Default to 100\n\n metrics.registerQueueLengthProvider(() => this.limit.pendingCount);\n }\n\n async run<T>(fn: () => Promise<T>): Promise<T> {\n if (this.limit.pendingCount >= this.maxQueueSize) {\n this.logger.warn({ pending: this.limit.pendingCount, max: this.maxQueueSize }, 'Request queue full, rejecting request');\n throw new QueueFullError('Server is too busy, please try again later');\n }\n\n const active = this.limit.activeCount;\n const pending = this.limit.pendingCount;\n\n this.logger.debug({ active, pending }, 'Concurrency status before task');\n\n // Add attributes to current OTEL span if exists\n const span = trace.getActiveSpan();\n if (span) {\n span.setAttributes({\n 'concurrency.active': active,\n 'concurrency.pending': pending,\n });\n }\n\n try {\n return await this.limit(fn);\n } finally {\n this.logger.debug({\n active: this.limit.activeCount,\n pending: this.limit.pendingCount\n }, 'Concurrency status after task');\n }\n }\n\n get stats() {\n return {\n activeCount: this.limit.activeCount,\n pendingCount: this.limit.pendingCount,\n };\n }\n}\n","import { metrics as otelMetrics, Counter, Histogram, ObservableGauge, ValueType } from '@opentelemetry/api';\n\nexport class MetricsService {\n private static instance: MetricsService;\n private meter = otelMetrics.getMeter('conduit');\n\n private executionCounter: Counter;\n private cacheHitsCounter: Counter;\n private cacheMissesCounter: Counter;\n private executionLatency: Histogram;\n private toolExecutionDuration: Histogram;\n private requestQueueLength: ObservableGauge;\n private activeExecutionsGauge: ObservableGauge;\n\n private activeExecutionsCount = 0;\n\n private queueLengthCallback: () => number = () => 0;\n\n private constructor() {\n this.executionCounter = this.meter.createCounter('conduit.executions.total', {\n description: 'Total number of executions',\n });\n\n this.cacheHitsCounter = this.meter.createCounter('conduit.cache.hits.total', {\n description: 'Total number of schema cache hits',\n });\n\n this.cacheMissesCounter = this.meter.createCounter('conduit.cache.misses.total', {\n description: 'Total number of schema cache misses',\n });\n\n this.executionLatency = this.meter.createHistogram('conduit.executions.latency', {\n description: 'Execution latency in milliseconds',\n unit: 'ms',\n valueType: ValueType.DOUBLE,\n });\n\n this.toolExecutionDuration = this.meter.createHistogram('conduit.tool.execution_duration_seconds', {\n description: 'Duration of tool executions',\n unit: 's',\n valueType: ValueType.DOUBLE,\n });\n\n this.requestQueueLength = this.meter.createObservableGauge('conduit.request_queue_length', {\n description: 'Current request queue depth',\n valueType: ValueType.INT,\n });\n\n this.activeExecutionsGauge = this.meter.createObservableGauge('conduit.executions.active', {\n description: 'Current number of active executions',\n });\n\n this.activeExecutionsGauge.addCallback((result) => {\n result.observe(this.activeExecutionsCount);\n });\n\n this.requestQueueLength.addCallback((result) => {\n result.observe(this.queueLengthCallback());\n });\n }\n\n static getInstance(): MetricsService {\n if (!MetricsService.instance) {\n MetricsService.instance = new MetricsService();\n }\n return MetricsService.instance;\n }\n\n recordExecutionStart() {\n this.activeExecutionsCount++;\n this.executionCounter.add(1);\n }\n\n recordExecutionEnd(durationMs: number, toolName?: string) {\n this.activeExecutionsCount = Math.max(0, this.activeExecutionsCount - 1);\n this.executionLatency.record(durationMs, { tool: toolName || 'unknown' });\n }\n\n recordToolExecution(durationMs: number, toolName: string, success: boolean) {\n // Convert ms to seconds for the histogram\n this.toolExecutionDuration.record(durationMs / 1000, {\n tool_name: toolName,\n success: String(success)\n });\n }\n\n recordCacheHit() {\n this.cacheHitsCounter.add(1);\n }\n\n recordCacheMiss() {\n this.cacheMissesCounter.add(1);\n }\n\n // This is now handled by OTEL Prometheus exporter, \n // but we can provide a way to get the endpoint data if needed.\n\n\n getMetrics() {\n return {\n activeExecutions: this.activeExecutionsCount,\n uptime: process.uptime(),\n memory: process.memoryUsage(),\n };\n }\n\n registerQueueLengthProvider(provider: () => number) {\n this.queueLengthCallback = provider;\n }\n}\n\nexport const metrics = MetricsService.getInstance();\n","import { ExecutionContext } from './execution.context.js';\nimport { Logger } from 'pino';\n\nimport { GatewayService } from '../gateway/gateway.service.js';\nimport { metrics } from './metrics.service.js';\nimport { ExecutionService } from './execution.service.js';\n\nimport { Middleware } from './interfaces/middleware.interface.js';\n\nimport { ConduitError } from './types.js';\nimport type { JSONRPCRequest, JSONRPCResponse } from './types.js';\n\nexport { ConduitError };\nexport type { JSONRPCRequest, JSONRPCResponse };\n\nexport class RequestController {\n private logger: Logger;\n private executionService: ExecutionService;\n private gatewayService: GatewayService;\n\n private middlewares: Middleware[] = [];\n\n constructor(\n logger: Logger,\n executionService: ExecutionService,\n gatewayService: GatewayService,\n middlewares: Middleware[] = []\n ) {\n this.logger = logger;\n this.executionService = executionService;\n this.gatewayService = gatewayService;\n this.middlewares = middlewares;\n }\n\n use(middleware: Middleware) {\n this.middlewares.push(middleware);\n }\n\n\n\n async handleRequest(request: JSONRPCRequest, context: ExecutionContext): Promise<JSONRPCResponse | null> {\n return this.executePipeline(request, context);\n }\n\n private async executePipeline(request: JSONRPCRequest, context: ExecutionContext): Promise<JSONRPCResponse | null> {\n let index = -1;\n\n const dispatch = async (i: number): Promise<JSONRPCResponse | null> => {\n if (i <= index) throw new Error('next() called multiple times');\n index = i;\n\n const middleware = this.middlewares[i];\n if (middleware) {\n return middleware.handle(request, context, () => dispatch(i + 1));\n }\n\n return this.finalHandler(request, context);\n };\n\n return dispatch(0);\n }\n\n private async handleValidateTool(request: JSONRPCRequest, context: ExecutionContext): Promise<JSONRPCResponse> {\n const params = request.params as { toolName: string; args: any };\n if (!params || !params.toolName || !params.args) {\n return {\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: -32602,\n message: 'Missing toolName or args params',\n },\n };\n }\n\n try {\n const result = await this.gatewayService.validateTool(params.toolName, params.args, context);\n return {\n jsonrpc: '2.0',\n id: request.id,\n result,\n };\n } catch (error: any) {\n return {\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: -32603,\n message: error.message || 'Validation failed',\n },\n };\n }\n }\n\n private async finalHandler(request: JSONRPCRequest, context: ExecutionContext): Promise<JSONRPCResponse | null> {\n const { method, params, id } = request;\n // Logging and metrics handled by middlewares now\n\n // Try/catch handled by ErrorMiddleware, but we handle logic errors here if needed\n // Actually routing logic should just throw and let middleware catch?\n // Or specific logic.\n\n switch (method) {\n case 'tools/list': // Standard MCP method name\n case 'mcp_discover_tools':\n return this.handleDiscoverTools(params, context, id);\n case 'resources/list':\n case 'prompts/list':\n return { jsonrpc: '2.0', id, result: { items: [] } };\n case 'mcp_list_tool_packages':\n return this.handleListToolPackages(params, context, id);\n case 'mcp_list_tool_stubs':\n return this.handleListToolStubs(params, context, id);\n case 'mcp_read_tool_schema':\n return this.handleReadToolSchema(params, context, id);\n case 'mcp_validate_tool':\n return this.handleValidateTool(request, context);\n case 'mcp_call_tool':\n case 'tools/call':\n return this.handleCallTool(params, context, id);\n case 'mcp_execute_typescript':\n return this.handleExecuteTypeScript(params, context, id);\n case 'mcp_execute_python':\n return this.handleExecutePython(params, context, id);\n case 'mcp_execute_isolate':\n return this.handleExecuteIsolate(params, context, id);\n case 'initialize':\n return this.handleInitialize(params, context, id);\n case 'notifications/initialized':\n return null; // Notifications don't get responses per MCP spec\n case 'ping':\n return { jsonrpc: '2.0', id, result: {} };\n default:\n // metrics.recordExecutionEnd is handled by LoggingMiddleware??\n // Wait, if 404, LoggingMiddleware records execution end?\n // Yes, handle() in LoggingMiddleware wraps next().\n return this.errorResponse(id, -32601, `Method not found: ${method}`);\n }\n }\n\n private async handleDiscoverTools(params: any, context: ExecutionContext, id: string | number): Promise<JSONRPCResponse> {\n const tools = await this.gatewayService.discoverTools(context);\n\n // Filter to only MCP-standard fields for compatibility with strict clients\n const standardizedTools = tools.map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n }));\n\n return {\n jsonrpc: '2.0',\n id,\n result: {\n tools: standardizedTools,\n },\n };\n }\n\n private async handleListToolPackages(params: any, context: ExecutionContext, id: string | number): Promise<JSONRPCResponse> {\n const packages = await this.gatewayService.listToolPackages();\n return {\n jsonrpc: '2.0',\n id,\n result: {\n packages\n }\n };\n }\n\n private async handleListToolStubs(params: any, context: ExecutionContext, id: string | number): Promise<JSONRPCResponse> {\n const { packageId } = params;\n if (!packageId) {\n return this.errorResponse(id, -32602, 'Missing packageId parameter');\n }\n\n try {\n const stubs = await this.gatewayService.listToolStubs(packageId, context);\n return {\n jsonrpc: '2.0',\n id,\n result: {\n stubs\n }\n };\n } catch (error: any) {\n return this.errorResponse(id, -32001, error.message);\n }\n }\n\n private async handleReadToolSchema(params: any, context: ExecutionContext, id: string | number): Promise<JSONRPCResponse> {\n const { toolId } = params;\n if (!toolId) {\n return this.errorResponse(id, -32602, 'Missing toolId parameter');\n }\n\n try {\n const schema = await this.gatewayService.getToolSchema(toolId, context);\n if (!schema) {\n return this.errorResponse(id, -32001, `Tool not found: ${toolId}`);\n }\n return {\n jsonrpc: '2.0',\n id,\n result: {\n schema\n }\n };\n } catch (error: any) {\n return this.errorResponse(id, -32003, error.message);\n }\n }\n\n private async handleCallTool(params: any, context: ExecutionContext, id: string | number): Promise<JSONRPCResponse> {\n if (!params) return this.errorResponse(id, -32602, 'Missing parameters');\n const { name, arguments: toolArgs } = params;\n\n // Route built-in tools to their specific handlers\n switch (name) {\n case 'mcp_execute_typescript':\n return this.handleExecuteToolCall('typescript', toolArgs, context, id);\n case 'mcp_execute_python':\n return this.handleExecuteToolCall('python', toolArgs, context, id);\n case 'mcp_execute_isolate':\n return this.handleExecuteToolCall('isolate', toolArgs, context, id);\n }\n\n const response = await this.gatewayService.callTool(name, toolArgs, context);\n return { ...response, id };\n }\n\n private formatExecutionResult(result: { stdout: string; stderr: string; exitCode: number | null }) {\n const structured = {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n };\n return {\n content: [{\n type: 'text',\n text: JSON.stringify(structured),\n }],\n structuredContent: structured,\n };\n }\n\n private async handleExecuteToolCall(\n mode: 'typescript' | 'python' | 'isolate',\n params: any,\n context: ExecutionContext,\n id: string | number\n ): Promise<JSONRPCResponse> {\n if (!params) return this.errorResponse(id, -32602, 'Missing parameters');\n const { code, limits, allowedTools } = params;\n\n if (Array.isArray(allowedTools)) {\n context.allowedTools = allowedTools;\n }\n\n const result = mode === 'typescript'\n ? await this.executionService.executeTypeScript(code, limits, context, allowedTools)\n : mode === 'python'\n ? await this.executionService.executePython(code, limits, context, allowedTools)\n : await this.executionService.executeIsolate(code, limits, context, allowedTools);\n\n if (result.error) {\n return this.errorResponse(id, result.error.code, result.error.message);\n }\n\n return {\n jsonrpc: '2.0',\n id,\n result: this.formatExecutionResult(result),\n };\n }\n\n private async handleExecuteTypeScript(params: any, context: ExecutionContext, id: string | number): Promise<JSONRPCResponse> {\n if (!params) return this.errorResponse(id, -32602, 'Missing parameters');\n const { code, limits, allowedTools } = params;\n\n if (Array.isArray(allowedTools)) {\n context.allowedTools = allowedTools;\n }\n\n const result = await this.executionService.executeTypeScript(code, limits, context, allowedTools);\n\n if (result.error) {\n return this.errorResponse(id, result.error.code, result.error.message);\n }\n\n return {\n jsonrpc: '2.0',\n id,\n result: {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n },\n };\n }\n\n private async handleExecutePython(params: any, context: ExecutionContext, id: string | number): Promise<JSONRPCResponse> {\n if (!params) return this.errorResponse(id, -32602, 'Missing parameters');\n const { code, limits, allowedTools } = params;\n\n if (Array.isArray(allowedTools)) {\n context.allowedTools = allowedTools;\n }\n\n const result = await this.executionService.executePython(code, limits, context, allowedTools);\n\n if (result.error) {\n return this.errorResponse(id, result.error.code, result.error.message);\n }\n\n return {\n jsonrpc: '2.0',\n id,\n result: {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n },\n };\n }\n\n private async handleInitialize(params: any, context: ExecutionContext, id: string | number): Promise<JSONRPCResponse> {\n // Echo back the client's protocol version for compatibility, or use latest if not provided\n const clientVersion = params?.protocolVersion || '2025-06-18';\n return {\n jsonrpc: '2.0',\n id,\n result: {\n protocolVersion: clientVersion,\n capabilities: {\n tools: {\n listChanged: true\n },\n resources: {\n listChanged: true,\n subscribe: true\n }\n },\n serverInfo: {\n name: 'conduit',\n version: process.env.npm_package_version || '1.1.0'\n }\n }\n };\n }\n\n private async handleExecuteIsolate(params: any, context: ExecutionContext, id: string | number): Promise<JSONRPCResponse> {\n if (!params) return this.errorResponse(id, -32602, 'Missing parameters');\n const { code, limits, allowedTools } = params;\n\n if (Array.isArray(allowedTools)) {\n context.allowedTools = allowedTools;\n }\n\n const result = await this.executionService.executeIsolate(code, limits, context, allowedTools);\n\n if (result.error) {\n return this.errorResponse(id, result.error.code, result.error.message);\n }\n\n return {\n jsonrpc: '2.0',\n id,\n result: {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n },\n };\n }\n\n private errorResponse(id: string | number, code: number, message: string): JSONRPCResponse {\n return {\n jsonrpc: '2.0',\n id,\n error: {\n code,\n message,\n },\n };\n }\n\n async shutdown() {\n await this.executionService.shutdown();\n }\n\n async healthCheck() {\n const pyodideHealth = await this.executionService.healthCheck();\n return {\n status: pyodideHealth.status === 'ok' ? 'ok' : 'error',\n pyodide: pyodideHealth\n };\n }\n\n async warmup() {\n await this.executionService.warmup();\n }\n}\n","import { Logger } from 'pino';\nimport axios from 'axios';\nimport { JSONRPCRequest, JSONRPCResponse, ToolManifest } from '../core/types.js';\nimport { AuthService, UpstreamCredentials } from './auth.service.js';\nimport { ExecutionContext } from '../core/execution.context.js';\nimport { IUrlValidator } from '../core/interfaces/url.validator.interface.js';\n\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';\nimport { z } from 'zod';\n\nexport type UpstreamInfo = {\n id: string;\n credentials?: UpstreamCredentials;\n} & (\n | { type?: 'http'; url: string }\n | { type: 'stdio'; command: string; args?: string[]; env?: Record<string, string> }\n );\n\nexport class UpstreamClient {\n private logger: Logger;\n private info: UpstreamInfo;\n private authService: AuthService;\n private urlValidator: IUrlValidator;\n private mcpClient?: Client;\n private transport?: StdioClientTransport;\n\n constructor(logger: Logger, info: UpstreamInfo, authService: AuthService, urlValidator: IUrlValidator) {\n this.logger = logger.child({ upstreamId: info.id });\n this.info = info;\n this.authService = authService;\n this.urlValidator = urlValidator;\n\n if (this.info.type === 'stdio') {\n const env = { ...process.env, ...this.info.env };\n // Filter undefined values\n const cleanEnv = Object.entries(env).reduce((acc, [k, v]) => {\n if (v !== undefined) acc[k] = v;\n return acc;\n }, {} as Record<string, string>);\n\n this.transport = new StdioClientTransport({\n command: this.info.command,\n args: this.info.args,\n env: cleanEnv,\n });\n this.mcpClient = new Client({\n name: 'conduit-gateway',\n version: '1.0.0',\n }, {\n capabilities: {},\n });\n }\n }\n\n private async ensureConnected() {\n if (!this.mcpClient || !this.transport) return;\n // There isn't a public isConnected property easily accessible, \n // usually we just connect once.\n // We can track connected state or just try/catch connect.\n // For simplicity, we connect once and existing sdk handles reconnection or errors usually kill it.\n // Actually SDK Client.connect() is for the transport.\n try {\n // @ts-ignore - Check internal state or just attempt connect if we haven't\n if (!this.transport.connection) {\n await this.mcpClient.connect(this.transport);\n }\n } catch (e) {\n // connection might already be active\n }\n }\n\n async call(request: JSONRPCRequest, context: ExecutionContext): Promise<JSONRPCResponse> {\n // Helper to determine type safely\n const isStdio = (info: UpstreamInfo): info is { type: 'stdio'; command: string; args?: string[]; env?: Record<string, string>; id: string; credentials?: UpstreamCredentials } => info.type === 'stdio';\n\n if (isStdio(this.info)) {\n return this.callStdio(request);\n } else {\n return this.callHttp(request, context as ExecutionContext);\n }\n }\n\n private async callStdio(request: JSONRPCRequest): Promise<JSONRPCResponse> {\n if (!this.mcpClient) {\n return { jsonrpc: '2.0', id: request.id, error: { code: -32603, message: 'Stdio client not initialized' } };\n }\n\n try {\n await this.ensureConnected();\n\n // Map GatewayService method names to SDK typed methods\n if (request.method === 'list_tools' || request.method === 'tools/list') {\n const result = await this.mcpClient.listTools();\n return {\n jsonrpc: '2.0',\n id: request.id,\n result: result\n };\n } else if (request.method === 'call_tool' || request.method === 'tools/call') {\n const params = request.params as { name: string; arguments?: Record<string, unknown> };\n const result = await this.mcpClient.callTool({\n name: params.name,\n arguments: params.arguments,\n });\n const normalizedResult = (result && Array.isArray((result as any).content))\n ? result\n : {\n content: [{\n type: 'text',\n text: typeof result === 'string' ? result : JSON.stringify(result ?? null),\n }],\n };\n return {\n jsonrpc: '2.0',\n id: request.id,\n result: normalizedResult\n };\n } else {\n // Fallback to generic request for other methods\n const result = await this.mcpClient.request(\n { method: request.method, params: request.params },\n z.any()\n );\n return {\n jsonrpc: '2.0',\n id: request.id,\n result: result\n };\n }\n } catch (error: any) {\n this.logger.error({ err: error }, 'Stdio call failed');\n return {\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: error.code || -32603,\n message: error.message || 'Internal error in stdio transport'\n }\n };\n }\n }\n\n private async callHttp(request: JSONRPCRequest, context: ExecutionContext): Promise<JSONRPCResponse> {\n // Narrowing for TS\n if (this.info.type === 'stdio') throw new Error('Unreachable');\n const url = this.info.url;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Correlation-Id': context.correlationId,\n };\n\n if (context.tenantId) {\n headers['X-Tenant-Id'] = context.tenantId;\n }\n\n if (this.info.credentials) {\n const authHeaders = await this.authService.getAuthHeaders(this.info.credentials);\n Object.assign(headers, authHeaders);\n }\n\n const securityResult = await this.urlValidator.validateUrl(url);\n if (!securityResult.valid) {\n this.logger.error({ url }, 'Blocked upstream URL (SSRF)');\n return {\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: -32003,\n message: securityResult.message || 'Forbidden URL',\n },\n };\n }\n\n try {\n this.logger.debug({ method: request.method }, 'Calling upstream MCP');\n\n // Fix Sev1: Use the resolved safe IP to prevent DNS rebinding\n const originalUrl = new URL(url);\n const requestUrl = securityResult.resolvedIp ?\n `${originalUrl.protocol}//${securityResult.resolvedIp}${originalUrl.port ? ':' + originalUrl.port : ''}${originalUrl.pathname}${originalUrl.search}${originalUrl.hash}` :\n url;\n\n // Ensure Host header is set to the original hostname for virtual hosting/SNI\n headers['Host'] = originalUrl.hostname;\n\n const response = await axios.post(requestUrl, request, {\n headers,\n timeout: 10000,\n maxRedirects: 0,\n });\n\n return response.data as JSONRPCResponse;\n } catch (err: any) {\n this.logger.error({ err: err.message }, 'Upstream MCP call failed');\n return {\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: -32008,\n message: `Upstream error: ${err.message}`,\n },\n };\n }\n }\n async getManifest(context: ExecutionContext): Promise<ToolManifest | null> {\n if (this.info.type !== 'http') return null;\n\n try {\n const baseUrl = this.info.url.replace(/\\/$/, ''); // Remove trailing slash\n const manifestUrl = `${baseUrl}/conduit.manifest.json`;\n\n const headers: Record<string, string> = {\n 'X-Correlation-Id': context.correlationId,\n };\n\n if (this.info.credentials) {\n const authHeaders = await this.authService.getAuthHeaders(this.info.credentials);\n Object.assign(headers, authHeaders);\n }\n\n const securityResult = await this.urlValidator.validateUrl(manifestUrl);\n if (!securityResult.valid) {\n this.logger.warn({ url: manifestUrl }, 'Blocked manifest URL (SSRF)');\n return null;\n }\n\n // Fix Sev1 approach: Use resolved IP\n const originalUrl = new URL(manifestUrl);\n const requestUrl = securityResult.resolvedIp ?\n `${originalUrl.protocol}//${securityResult.resolvedIp}${originalUrl.port ? ':' + originalUrl.port : ''}${originalUrl.pathname}${originalUrl.search}${originalUrl.hash}` :\n manifestUrl;\n\n headers['Host'] = originalUrl.hostname;\n\n const response = await axios.get(requestUrl, {\n headers,\n timeout: 5000,\n maxRedirects: 0,\n });\n\n if (response.status === 200 && response.data && Array.isArray(response.data.tools)) {\n return response.data;\n }\n } catch (error) {\n // Ignore manifest errors and fallback to RPC\n this.logger.debug({ err: error }, 'Failed to fetch manifest (will fallback)');\n }\n return null;\n }\n}\n","import { Logger } from 'pino';\nimport axios from 'axios';\n\nexport type AuthType = 'apiKey' | 'oauth2' | 'bearer';\n\nexport interface UpstreamCredentials {\n type: AuthType;\n apiKey?: string;\n bearerToken?: string;\n clientId?: string;\n clientSecret?: string;\n tokenUrl?: string;\n refreshToken?: string;\n scopes?: string[];\n}\n\ninterface CachedToken {\n accessToken: string;\n expiresAt: number;\n}\n\nexport class AuthService {\n private logger: Logger;\n // Cache tokens separately from credentials to avoid mutation\n private tokenCache = new Map<string, CachedToken>();\n // Prevent concurrent refresh requests for the same client\n private refreshLocks = new Map<string, Promise<string>>();\n\n constructor(logger: Logger) {\n this.logger = logger;\n }\n\n async getAuthHeaders(creds: UpstreamCredentials): Promise<Record<string, string>> {\n switch (creds.type) {\n case 'apiKey':\n return { 'X-API-Key': creds.apiKey || '' };\n case 'bearer':\n return { 'Authorization': `Bearer ${creds.bearerToken}` };\n case 'oauth2':\n return { 'Authorization': await this.getOAuth2Token(creds) };\n default:\n throw new Error(`Unsupported auth type: ${creds.type}`);\n }\n }\n\n private async getOAuth2Token(creds: UpstreamCredentials): Promise<string> {\n if (!creds.tokenUrl || !creds.clientId) {\n throw new Error('OAuth2 credentials missing required fields (tokenUrl, clientId)');\n }\n\n const cacheKey = `${creds.clientId}:${creds.tokenUrl}`;\n\n // Check cache first (with 30s buffer)\n const cached = this.tokenCache.get(cacheKey);\n if (cached && cached.expiresAt > Date.now() + 30000) {\n return `Bearer ${cached.accessToken}`;\n }\n\n // Check if refresh is already in progress\n const existingRefresh = this.refreshLocks.get(cacheKey);\n if (existingRefresh) {\n return existingRefresh;\n }\n\n // Start refresh with lock\n const refreshPromise = this.doRefresh(creds, cacheKey);\n this.refreshLocks.set(cacheKey, refreshPromise);\n\n try {\n return await refreshPromise;\n } finally {\n this.refreshLocks.delete(cacheKey);\n }\n }\n\n private async doRefresh(creds: UpstreamCredentials, cacheKey: string): Promise<string> {\n if (!creds.tokenUrl || !creds.refreshToken || !creds.clientId) {\n throw new Error('OAuth2 credentials missing required fields for refresh');\n }\n\n this.logger.info({ tokenUrl: creds.tokenUrl, clientId: creds.clientId }, 'Refreshing OAuth2 token');\n\n try {\n const body = new URLSearchParams();\n body.set('grant_type', 'refresh_token');\n body.set('refresh_token', creds.refreshToken);\n body.set('client_id', creds.clientId);\n if (creds.clientSecret) {\n body.set('client_secret', creds.clientSecret);\n }\n\n const response = await axios.post(creds.tokenUrl, body, {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'Accept': 'application/json',\n },\n });\n\n const { access_token, expires_in } = response.data;\n const expiresInSeconds = Number(expires_in) || 3600;\n\n // Cache the token (don't mutate the input credentials)\n this.tokenCache.set(cacheKey, {\n accessToken: access_token,\n expiresAt: Date.now() + (expiresInSeconds * 1000),\n });\n\n return `Bearer ${access_token}`;\n } catch (err: any) {\n const errorMsg = err.response?.data?.error_description || err.response?.data?.error || err.message;\n this.logger.error({ err: errorMsg }, 'Failed to refresh OAuth2 token');\n throw new Error(`OAuth2 refresh failed: ${errorMsg}`);\n }\n }\n}\n","import { LRUCache } from 'lru-cache';\nimport { Logger } from 'pino';\nimport { metrics } from '../core/metrics.service.js';\n\nexport interface ToolSchema {\n name: string;\n description?: string;\n inputSchema: any;\n}\n\nexport class SchemaCache {\n private cache: LRUCache<string, ToolSchema[]>;\n private logger: Logger;\n\n constructor(logger: Logger, max: number = 100, ttl: number = 1000 * 60 * 60) { // 1 hour TTL default\n this.logger = logger;\n this.cache = new LRUCache({\n max,\n ttl,\n });\n }\n\n get(upstreamId: string): ToolSchema[] | undefined {\n const result = this.cache.get(upstreamId);\n if (result) {\n metrics.recordCacheHit();\n } else {\n metrics.recordCacheMiss();\n }\n return result;\n }\n\n set(upstreamId: string, tools: ToolSchema[]) {\n this.logger.debug({ upstreamId, count: tools.length }, 'Caching tool schemas');\n this.cache.set(upstreamId, tools);\n }\n\n invalidate(upstreamId: string) {\n this.logger.debug({ upstreamId }, 'Invalidating schema cache');\n this.cache.delete(upstreamId);\n }\n\n clear() {\n this.cache.clear();\n }\n}\n","/**\n * PolicyService - Authorization and tool access control\n * Extracted from GatewayService per architecture-findings.md\n */\n\n/**\n * Structured identifier for a tool, replacing fragile `upstream__toolname` strings.\n */\nexport interface ToolIdentifier {\n namespace: string; // upstream ID (e.g., \"github\")\n name: string; // tool name (e.g., \"createIssue\")\n}\n\nexport class PolicyService {\n /**\n * Parse a qualified tool name string into a structured ToolIdentifier.\n * @param qualifiedName - e.g., \"github__createIssue\" or \"github__api__listRepos\"\n */\n parseToolName(qualifiedName: string): ToolIdentifier {\n const separatorIndex = qualifiedName.indexOf('__');\n if (separatorIndex === -1) {\n // No namespace - treat entire string as name with empty namespace\n return { namespace: '', name: qualifiedName };\n }\n return {\n namespace: qualifiedName.substring(0, separatorIndex),\n name: qualifiedName.substring(separatorIndex + 2)\n };\n }\n\n /**\n * Format a ToolIdentifier back to a qualified string.\n */\n formatToolName(tool: ToolIdentifier): string {\n if (!tool.namespace) {\n return tool.name;\n }\n return `${tool.namespace}__${tool.name}`;\n }\n\n /**\n * Check if a tool matches any pattern in the allowlist.\n * Supports:\n * - Exact match: \"github.createIssue\" matches \"github__createIssue\"\n * - Wildcard: \"github.*\" matches any tool in the github namespace\n * \n * @param tool - ToolIdentifier or qualified string\n * @param allowedTools - Array of patterns (dot-notation, e.g., \"github.*\" or \"github.createIssue\")\n */\n isToolAllowed(tool: ToolIdentifier | string, allowedTools: string[]): boolean {\n const toolId = typeof tool === 'string' ? this.parseToolName(tool) : tool;\n const toolParts = [toolId.namespace, ...toolId.name.split('__')].filter(p => p);\n\n return allowedTools.some(pattern => {\n const patternParts = pattern.split('.');\n\n // Wildcard pattern: \"foo.*\" or \"foo.bar.*\"\n if (patternParts[patternParts.length - 1] === '*') {\n const prefixParts = patternParts.slice(0, -1);\n if (prefixParts.length > toolParts.length) return false;\n\n // Check if prefix parts match tool parts exactly\n for (let i = 0; i < prefixParts.length; i++) {\n if (prefixParts[i] !== toolParts[i]) return false;\n }\n return true;\n }\n\n // Exact match: pattern parts must equal tool parts\n if (patternParts.length !== toolParts.length) return false;\n for (let i = 0; i < patternParts.length; i++) {\n if (patternParts[i] !== toolParts[i]) return false;\n }\n return true;\n });\n }\n}\n","import { Logger } from 'pino';\nimport { UpstreamClient, UpstreamInfo } from './upstream.client.js';\nimport { AuthService } from './auth.service.js';\nimport { SchemaCache, ToolSchema } from './schema.cache.js';\nimport { JSONRPCRequest, JSONRPCResponse, ToolPackage, ToolStub } from '../core/types.js';\nimport { ExecutionContext } from '../core/execution.context.js';\nimport { IUrlValidator } from '../core/interfaces/url.validator.interface.js';\nimport { metrics } from '../core/metrics.service.js';\nimport { PolicyService, ToolIdentifier } from '../core/policy.service.js';\nimport { Ajv } from 'ajv';\nimport addFormats from 'ajv-formats';\n\nconst BUILT_IN_TOOLS: ToolSchema[] = [\n {\n name: 'mcp_execute_typescript',\n description: 'Executes TypeScript code in a secure sandbox. Access MCP tools via the global `tools` object (e.g. `filesystem__list_directory` -> `await tools.filesystem.list_directory(...)`).',\n inputSchema: {\n type: 'object',\n properties: {\n code: {\n type: 'string',\n description: 'The TypeScript code to execute.'\n },\n allowedTools: {\n type: 'array',\n items: { type: 'string' },\n description: 'List of tool names (e.g. \"filesystem.list_directory\" or \"filesystem.*\") that the script is allowed to call.'\n }\n },\n required: ['code']\n }\n },\n {\n name: 'mcp_execute_python',\n description: 'Executes Python code in a secure sandbox. Access MCP tools via the global `tools` object (e.g. `filesystem__list_directory` -> `await tools.filesystem.list_directory(...)`).',\n inputSchema: {\n type: 'object',\n properties: {\n code: {\n type: 'string',\n description: 'The Python code to execute.'\n },\n allowedTools: {\n type: 'array',\n items: { type: 'string' },\n description: 'List of tool names (e.g. \"filesystem.list_directory\" or \"filesystem.*\") that the script is allowed to call.'\n }\n },\n required: ['code']\n }\n },\n {\n name: 'mcp_execute_isolate',\n description: 'Executes JavaScript code in a high-speed V8 isolate. Access MCP tools via the global `tools` object (e.g. `await tools.filesystem.list_directory(...)`). No Deno/Node APIs. Use `console.log` for output.',\n inputSchema: {\n type: 'object',\n properties: {\n code: {\n type: 'string',\n description: 'The JavaScript code to execute.'\n },\n allowedTools: {\n type: 'array',\n items: { type: 'string' },\n description: 'List of tool names (e.g. \"filesystem.list_directory\" or \"filesystem.*\") that the script is allowed to call.'\n }\n },\n required: ['code']\n }\n }\n];\n\nexport class GatewayService {\n private logger: Logger;\n private clients: Map<string, UpstreamClient> = new Map();\n private authService: AuthService;\n private schemaCache: SchemaCache;\n private urlValidator: IUrlValidator;\n private policyService: PolicyService;\n private ajv: Ajv;\n // Cache compiled validators to avoid recompilation on every call\n private validatorCache = new Map<string, any>();\n\n constructor(logger: Logger, urlValidator: IUrlValidator, policyService?: PolicyService) {\n this.logger = logger;\n this.urlValidator = urlValidator;\n this.authService = new AuthService(logger);\n this.schemaCache = new SchemaCache(logger);\n this.policyService = policyService ?? new PolicyService();\n this.ajv = new Ajv({ strict: false }); // Strict mode off for now to be permissive with upstream schemas\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n (addFormats as any).default(this.ajv);\n }\n\n registerUpstream(info: UpstreamInfo) {\n const client = new UpstreamClient(this.logger, info, this.authService, this.urlValidator);\n this.clients.set(info.id, client);\n this.logger.info({ upstreamId: info.id }, 'Registered upstream MCP');\n }\n\n async listToolPackages(): Promise<ToolPackage[]> {\n return Array.from(this.clients.entries()).map(([id, client]) => ({\n id,\n description: `Upstream ${id}`, // NOTE: Upstream description fetching deferred to V2\n version: '1.0.0'\n }));\n }\n\n async listToolStubs(packageId: string, context: ExecutionContext): Promise<ToolStub[]> {\n const client = this.clients.get(packageId);\n if (!client) {\n throw new Error(`Upstream package not found: ${packageId}`);\n }\n\n let tools = this.schemaCache.get(packageId);\n\n // Try manifest first if tools not cached\n if (!tools) {\n try {\n // Try to fetch manifest first\n const manifest = await client.getManifest(context);\n if (manifest) {\n const stubs: ToolStub[] = manifest.tools.map((t: any) => ({\n id: `${packageId}__${t.name}`,\n name: t.name,\n description: t.description\n }));\n\n if (context.allowedTools) {\n return stubs.filter(t => this.policyService.isToolAllowed(t.id, context.allowedTools!));\n }\n return stubs;\n }\n } catch (e) {\n // Manifest fetch failed, fall back\n this.logger.debug({ packageId, err: e }, 'Manifest fetch failed, falling back to RPC');\n }\n\n const response = await client.call({\n jsonrpc: '2.0',\n id: 'discovery',\n method: 'tools/list',\n }, context);\n\n if (response.result?.tools) {\n tools = response.result.tools as ToolSchema[];\n this.schemaCache.set(packageId, tools);\n } else {\n this.logger.warn({ upstreamId: packageId, error: response.error }, 'Failed to discover tools from upstream');\n tools = [];\n }\n }\n\n const stubs: ToolStub[] = tools.map(t => ({\n id: `${packageId}__${t.name}`,\n name: t.name,\n description: t.description\n }));\n\n if (context.allowedTools) {\n return stubs.filter(t => this.policyService.isToolAllowed(t.id, context.allowedTools!));\n }\n\n return stubs;\n }\n\n async getToolSchema(toolId: string, context: ExecutionContext): Promise<ToolSchema | null> {\n if (context.allowedTools && !this.policyService.isToolAllowed(toolId, context.allowedTools)) {\n throw new Error(`Access to tool ${toolId} is forbidden by allowlist`);\n }\n\n const parsed = this.policyService.parseToolName(toolId);\n const toolName = parsed.name; // Use a new variable for the un-namespaced name\n\n // Check for built-in tools\n const builtIn = BUILT_IN_TOOLS.find(t => t.name === toolId); // Compare with the full toolId\n if (builtIn) return builtIn;\n\n const upstreamId = parsed.namespace;\n\n // Ensure we have schemas for this upstream\n if (!this.schemaCache.get(upstreamId)) {\n // Force refresh if missing\n await this.listToolStubs(upstreamId, context);\n }\n\n const tools = this.schemaCache.get(upstreamId) || [];\n const tool = tools.find(t => t.name === toolName);\n\n if (!tool) return null;\n\n // Return schema with namespaced name\n return {\n ...tool,\n name: toolId\n };\n }\n\n async discoverTools(context: ExecutionContext): Promise<ToolSchema[]> {\n const allTools: ToolSchema[] = [...BUILT_IN_TOOLS];\n\n for (const [id, client] of this.clients.entries()) {\n let tools = this.schemaCache.get(id);\n\n if (!tools) {\n const response = await client.call({\n jsonrpc: '2.0',\n id: 'discovery',\n method: 'tools/list', // Standard MCP method\n }, context);\n\n if (response.result?.tools) {\n tools = response.result.tools as ToolSchema[];\n this.schemaCache.set(id, tools);\n } else {\n this.logger.warn({ upstreamId: id, error: response.error }, 'Failed to discover tools from upstream');\n tools = [];\n }\n }\n\n const prefixedTools = tools.map(t => ({ ...t, name: `${id}__${t.name}` }));\n\n if (context.allowedTools) {\n // Support wildcard patterns: \"mock.*\" matches \"mock__hello\"\n allTools.push(...prefixedTools.filter(t => this.policyService.isToolAllowed(t.name, context.allowedTools!)));\n } else {\n allTools.push(...prefixedTools);\n }\n }\n\n return allTools;\n }\n\n async callTool(name: string, params: any, context: ExecutionContext): Promise<JSONRPCResponse> {\n if (context.allowedTools && !this.policyService.isToolAllowed(name, context.allowedTools)) {\n this.logger.warn({ name, allowedTools: context.allowedTools }, 'Tool call blocked by allowlist');\n return {\n jsonrpc: '2.0',\n id: 0,\n error: {\n code: -32003,\n message: `Authorization failed: tool ${name} is not in the allowlist`,\n },\n };\n }\n\n const toolId = this.policyService.parseToolName(name);\n const upstreamId = toolId.namespace;\n const toolName = toolId.name;\n\n const client = this.clients.get(upstreamId);\n if (!client) {\n return {\n jsonrpc: '2.0',\n id: 0,\n error: {\n code: -32003,\n message: `Upstream not found: ${upstreamId}`,\n },\n };\n }\n\n // Lazy load schema if missing (Phase 1)\n if (!this.schemaCache.get(upstreamId)) {\n await this.listToolStubs(upstreamId, context);\n }\n\n const tools = this.schemaCache.get(upstreamId) || [];\n const toolSchema = tools.find(t => t.name === toolName);\n\n if (context.strictValidation) {\n if (!toolSchema) {\n return {\n jsonrpc: '2.0',\n id: 0,\n error: {\n code: -32601, // Method not found / Schema missing\n message: `Strict mode: Tool schema for ${name} not found`,\n },\n };\n }\n if (!toolSchema.inputSchema) {\n return {\n jsonrpc: '2.0',\n id: 0,\n error: {\n code: -32602, // Invalid params\n message: `Strict mode: Tool ${name} has no input schema defined`,\n },\n };\n }\n }\n\n if (toolSchema && toolSchema.inputSchema) {\n const cacheKey = `${upstreamId}__${toolName}`;\n let validate = this.validatorCache.get(cacheKey);\n if (!validate) {\n validate = this.ajv.compile(toolSchema.inputSchema);\n this.validatorCache.set(cacheKey, validate);\n }\n const valid = validate(params);\n if (!valid) {\n return {\n jsonrpc: '2.0',\n id: 0,\n error: {\n code: -32602, // Invalid params\n message: `Invalid parameters for tool ${name}: ${this.ajv.errorsText(validate.errors)}`,\n },\n };\n }\n }\n\n const startTime = performance.now();\n let success = false;\n let response: JSONRPCResponse;\n\n try {\n response = await client.call({\n jsonrpc: '2.0',\n id: context.correlationId,\n method: 'tools/call',\n params: {\n name: toolName,\n arguments: params,\n },\n }, context);\n success = !response.error;\n } catch (error: any) {\n success = false;\n throw error;\n } finally {\n const duration = performance.now() - startTime;\n metrics.recordToolExecution(duration, toolName, success);\n }\n\n if (response.error && response.error.code === -32008) {\n // Potentially refresh cache on certain types of errors\n this.schemaCache.invalidate(upstreamId);\n }\n\n return response;\n }\n\n async healthCheck(): Promise<{ status: string; upstreams: Record<string, string> }> {\n const upstreamStatus: Record<string, string> = {};\n const context = new ExecutionContext({ logger: this.logger });\n\n await Promise.all(\n Array.from(this.clients.entries()).map(async ([id, client]) => {\n try {\n const response = await client.call({\n jsonrpc: '2.0',\n id: 'health',\n method: 'tools/list',\n }, context);\n upstreamStatus[id] = response.error ? 'degraded' : 'active';\n } catch (err) {\n upstreamStatus[id] = 'error';\n }\n })\n );\n\n const allOk = Object.values(upstreamStatus).every(s => s === 'active');\n return {\n status: allOk ? 'ok' : 'degraded',\n upstreams: upstreamStatus,\n };\n }\n async validateTool(name: string, params: any, context: ExecutionContext): Promise<{ valid: boolean; errors?: string[] }> {\n const toolId = this.policyService.parseToolName(name);\n const upstreamId = toolId.namespace;\n const toolName = toolId.name;\n\n // Ensure we have schemas\n if (!this.schemaCache.get(upstreamId)) {\n await this.listToolStubs(upstreamId, context);\n }\n\n const tools = this.schemaCache.get(upstreamId) || [];\n const toolSchema = tools.find(t => t.name === toolName);\n\n if (!toolSchema) {\n return { valid: false, errors: [`Tool ${name} not found`] };\n }\n\n if (context.strictValidation) {\n if (!toolSchema.inputSchema) {\n return { valid: false, errors: [`Strict mode: Tool ${name} has no input schema defined`] };\n }\n }\n\n if (!toolSchema.inputSchema) {\n // No schema means any params are valid (unless strict mode, which we handled above)\n return { valid: true };\n }\n\n const validate = this.ajv.compile(toolSchema.inputSchema);\n const valid = validate(params);\n\n if (!valid) {\n return {\n valid: false,\n errors: validate.errors?.map(e => this.ajv.errorsText([e])) || ['Unknown validation error']\n };\n }\n\n return { valid: true };\n }\n}\n","import { Logger } from 'pino';\nimport dns from 'node:dns/promises';\nimport net from 'node:net';\nimport { LRUCache } from 'lru-cache';\n\nexport class NetworkPolicyService {\n private logger: Logger;\n\n private readonly privateRanges = [\n /^127\\./,\n /^10\\./,\n /^172\\.(1[6-9]|2[0-9]|3[0-1])\\./,\n /^192\\.168\\./,\n /^169\\.254\\./, // Link-local\n /^localhost$/i,\n /^0\\.0\\.0\\.0$/,\n /^::1$/, // IPv6 localhost\n /^fc00:/i, // IPv6 private\n /^fe80:/i, // IPv6 link-local\n ];\n\n private readonly RATE_LIMIT = 30;\n private readonly WINDOW_MS = 60000;\n // Use LRUCache to prevent unbounded memory growth\n private requestCounts: LRUCache<string, { count: number; resetTime: number }>;\n\n constructor(logger: Logger) {\n this.logger = logger;\n this.requestCounts = new LRUCache({\n max: 10000,\n ttl: this.WINDOW_MS,\n });\n }\n\n async validateUrl(url: string): Promise<{ valid: boolean; message?: string; resolvedIp?: string }> {\n try {\n const parsed = new URL(url);\n const hostname = parsed.hostname;\n\n // Check literal hostname against private ranges\n for (const range of this.privateRanges) {\n if (range.test(hostname)) {\n this.logger.warn({ hostname }, 'SSRF attempt detected: private range access');\n return { valid: false, message: 'Access denied: private network access forbidden' };\n }\n }\n\n // DNS resolution check to prevent DNS rebinding and handle tricky hostnames\n if (!net.isIP(hostname)) {\n try {\n const lookup = await dns.lookup(hostname, { all: true });\n // Store resolved IPs to check against blocklist\n const resolvedIps: string[] = [];\n\n for (const address of lookup) {\n let ip = address.address;\n\n // Fix Sev0: Normalize IPv6-mapped IPv4 addresses\n if (ip.startsWith('::ffff:')) {\n ip = ip.substring(7);\n }\n\n for (const range of this.privateRanges) {\n if (range.test(ip)) {\n this.logger.warn({ hostname, ip }, 'SSRF attempt detected: DNS resolves to private IP');\n return { valid: false, message: 'Access denied: hostname resolves to private network' };\n }\n }\n resolvedIps.push(ip);\n }\n\n // Fix Sev1: Return the validated IP to prevent DNS rebinding\n // Use the first resolved IP\n return { valid: true, resolvedIp: resolvedIps[0] };\n } catch (err: any) {\n // Strict SSRF protection: block if DNS lookup fails\n this.logger.warn({ hostname, err: err.message }, 'DNS lookup failed during URL validation, blocking request');\n return { valid: false, message: 'Access denied: hostname resolution failed' };\n }\n }\n\n // If it was already an IP, it's valid if it passed the range check above\n return { valid: true, resolvedIp: hostname };\n } catch (err: any) {\n return { valid: false, message: `Invalid URL: ${err.message}` };\n }\n }\n\n checkRateLimit(key: string): boolean {\n const now = Date.now();\n const record = this.requestCounts.get(key);\n\n if (!record || now > record.resetTime) {\n this.requestCounts.set(key, { count: 1, resetTime: now + this.WINDOW_MS });\n return true;\n }\n\n if (record.count >= this.RATE_LIMIT) {\n this.logger.warn({ key }, 'Rate limit exceeded');\n return false;\n }\n\n record.count++;\n return true;\n }\n}\n","import { Logger } from 'pino';\nimport { v4 as uuidv4 } from 'uuid';\nimport { LRUCache } from 'lru-cache';\n\nexport interface Session {\n allowedTools?: string[];\n createdAt: number;\n}\n\nexport class SessionManager {\n private logger: Logger;\n private sessions: LRUCache<string, Session>;\n private readonly SESSION_TTL_MS = 3600000; // 1 hour\n\n constructor(logger: Logger) {\n this.logger = logger;\n this.sessions = new LRUCache({\n max: 10000,\n ttl: this.SESSION_TTL_MS,\n });\n }\n\n createSession(allowedTools?: string[]): string {\n const token = uuidv4();\n this.sessions.set(token, {\n allowedTools,\n createdAt: Date.now()\n });\n return token;\n }\n\n getSession(token: string): Session | undefined {\n return this.sessions.get(token);\n }\n\n invalidateSession(token: string): void {\n this.sessions.delete(token);\n }\n\n cleanupSessions() {\n // LRUCache handles this automatically via TTL\n this.sessions.purgeStale();\n }\n}\n","import { Logger } from 'pino';\nimport { NetworkPolicyService } from './network.policy.service.js';\nimport { SessionManager } from './session.manager.js';\nimport type { Session } from './session.manager.js';\nimport { IUrlValidator } from './interfaces/url.validator.interface.js';\nimport crypto from 'node:crypto';\n\nexport type { Session };\n\nexport class SecurityService implements IUrlValidator {\n private logger: Logger;\n private ipcToken: string | undefined;\n private networkPolicy: NetworkPolicyService;\n private sessionManager: SessionManager;\n\n constructor(logger: Logger, ipcToken: string | undefined) {\n this.logger = logger;\n this.ipcToken = ipcToken;\n this.networkPolicy = new NetworkPolicyService(logger);\n this.sessionManager = new SessionManager(logger);\n }\n\n validateCode(code: string): { valid: boolean; message?: string } {\n // [IMPORTANT] This is a SANITY CHECK only.\n // We rely on RUNTIME isolation (Deno permissions, Isolate context) for actual security.\n // Static analysis of code is fundamentally unable to prevent all sandbox escapes.\n if (!code || code.length > 1024 * 1024) { // 1MB limit for sanity\n return { valid: false, message: 'Code size exceeds limit or is empty' };\n }\n return { valid: true };\n }\n\n async validateUrl(url: string): Promise<{ valid: boolean; message?: string; resolvedIp?: string }> {\n return this.networkPolicy.validateUrl(url);\n }\n\n checkRateLimit(key: string): boolean {\n return this.networkPolicy.checkRateLimit(key);\n }\n\n validateIpcToken(token: string): boolean {\n // Fix Sev1: Use timing-safe comparison for sensitive tokens\n if (!this.ipcToken) {\n return true;\n }\n\n const expected = Buffer.from(this.ipcToken);\n const actual = Buffer.from(token);\n\n if (expected.length === actual.length && crypto.timingSafeEqual(expected, actual)) {\n return true;\n }\n\n return !!this.sessionManager.getSession(token);\n }\n\n createSession(allowedTools?: string[]): string {\n return this.sessionManager.createSession(allowedTools);\n }\n\n getSession(token: string): Session | undefined {\n return this.sessionManager.getSession(token);\n }\n\n invalidateSession(token: string): void {\n this.sessionManager.invalidateSession(token);\n }\n\n\n getIpcToken(): string | undefined {\n return this.ipcToken;\n }\n}\n","import { NodeSDK } from '@opentelemetry/sdk-node';\nimport { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';\nimport { PrometheusExporter } from '@opentelemetry/exporter-prometheus';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions';\nimport { PinoInstrumentation } from '@opentelemetry/instrumentation-pino';\n\nexport class OtelService {\n private sdk: NodeSDK | null = null;\n\n constructor(private logger: any) { }\n\n async start() {\n this.sdk = new NodeSDK({\n resource: resourceFromAttributes({\n [SemanticResourceAttributes.SERVICE_NAME]: 'conduit',\n }),\n metricReader: new PrometheusExporter({\n port: 9464, // Default prometheus exporter port\n }),\n instrumentations: [\n getNodeAutoInstrumentations(),\n new PinoInstrumentation(),\n ],\n });\n\n try {\n await this.sdk.start();\n this.logger.info('OpenTelemetry SDK started');\n } catch (error) {\n this.logger.error({ error }, 'Error starting OpenTelemetry SDK');\n }\n }\n\n async shutdown() {\n if (this.sdk) {\n await this.sdk.shutdown();\n this.logger.info('OpenTelemetry SDK shut down');\n }\n }\n}\n","import { spawn, exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nconst execAsync = promisify(exec);\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { platform } from 'node:os';\nimport { fileURLToPath } from 'node:url';\nimport { ExecutionContext } from '../core/execution.context.js';\nimport { ResourceLimits } from '../core/config.service.js';\nimport { ConduitError } from '../core/types.js';\nimport { resolveAssetPath } from '../core/asset.utils.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nimport type { Executor, ExecutorConfig, ExecutionResult } from '../core/interfaces/executor.interface.js';\n\nexport { ExecutionResult };\n\n// Deprecated: use ExecutorConfig\nexport interface IPCInfo {\n ipcAddress: string;\n ipcToken: string;\n sdkCode?: string;\n}\n\nexport class DenoExecutor implements Executor {\n private shimContent: string = '';\n // Track active processes for cleanup\n // Using 'any' for the Set because ChildProcess type import can be finicky across node versions/types\n // but at runtime it is a ChildProcess\n private activeProcesses = new Set<any>();\n private maxConcurrentProcesses: number;\n\n constructor(maxConcurrentProcesses = 10) {\n this.maxConcurrentProcesses = maxConcurrentProcesses;\n }\n\n private getShim(): string {\n if (this.shimContent) return this.shimContent;\n try {\n const assetPath = resolveAssetPath('deno-shim.ts');\n this.shimContent = fs.readFileSync(assetPath, 'utf-8');\n return this.shimContent;\n } catch (err: any) {\n throw new Error(`Failed to load Deno shim: ${err.message}`);\n }\n }\n\n async execute(code: string, limits: ResourceLimits, context: ExecutionContext, config?: ExecutorConfig): Promise<ExecutionResult> {\n const { logger } = context;\n\n // Check concurrent process limit\n if (this.activeProcesses.size >= this.maxConcurrentProcesses) {\n return {\n stdout: '',\n stderr: '',\n exitCode: null,\n error: {\n code: ConduitError.ServerBusy,\n message: 'Too many concurrent Deno processes'\n }\n };\n }\n\n let stdout = '';\n let stderr = '';\n let totalOutputBytes = 0;\n let totalLogEntries = 0;\n let isTerminated = false;\n\n let shim = this.getShim()\n .replace('__CONDUIT_IPC_ADDRESS__', config?.ipcAddress || '')\n .replace('__CONDUIT_IPC_TOKEN__', config?.ipcToken || '');\n\n if (shim.includes('__CONDUIT_IPC_ADDRESS__')) {\n throw new Error('Failed to inject IPC address into Deno shim');\n }\n if (shim.includes('__CONDUIT_IPC_TOKEN__')) {\n throw new Error('Failed to inject IPC token into Deno shim');\n }\n\n // Inject SDK if provided\n if (config?.sdkCode) {\n shim = shim.replace('// __CONDUIT_SDK_INJECTION__', config.sdkCode);\n if (shim.includes('// __CONDUIT_SDK_INJECTION__')) {\n // Should have been replaced\n throw new Error('Failed to inject SDK code into Deno shim');\n }\n }\n\n const fullCode = shim + '\\n' + code;\n\n // Use --v8-flags for memory limit if possible, or monitor RSS\n // Deno 2.x supports --v8-flags\n const args = [\n 'run',\n `--v8-flags=--max-heap-size=${limits.memoryLimitMb}`,\n ];\n\n // Security: Restrict permissions. \n // We only allow network access to the IPC host if it's a TCP address.\n // Unix sockets don't need --allow-net.\n if (config?.ipcAddress && !config.ipcAddress.includes('/') && !config.ipcAddress.includes('\\\\')) {\n try {\n // Use URL parser to safely extract hostname (handles IPv6 brackets and ports correctly)\n // Prepend http:// to ensure it parses as a valid URL structure\n const url = new URL(`http://${config.ipcAddress}`);\n let normalizedHost = url.hostname;\n\n // Remove brackets from IPv6 addresses if present (e.g., [::1] -> ::1)\n normalizedHost = normalizedHost.replace(/[\\[\\]]/g, '');\n\n if (normalizedHost === '0.0.0.0' || normalizedHost === '::' || normalizedHost === '::1' || normalizedHost === '') {\n normalizedHost = '127.0.0.1';\n }\n args.push(`--allow-net=${normalizedHost}`);\n } catch (err) {\n // If address is malformed, we simply don't add the permission\n logger.warn({ address: config.ipcAddress, err }, 'Failed to parse IPC address for Deno permissions');\n }\n } else {\n // No network by default\n }\n\n args.push('-'); // Read from stdin\n\n // logger.info({ args }, 'Spawning Deno');\n const child = spawn('deno', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: {\n PATH: process.env.PATH,\n HOME: process.env.HOME,\n TMPDIR: process.env.TMPDIR,\n }\n });\n\n this.activeProcesses.add(child);\n\n child.on('spawn', () => {\n // logger.info('Deno process spawned');\n });\n\n const cleanupProcess = () => {\n this.activeProcesses.delete(child);\n };\n\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n if (!isTerminated) {\n isTerminated = true;\n if (typeof (monitorInterval as any) !== 'undefined') clearInterval(monitorInterval);\n child.kill('SIGKILL');\n logger.warn('Execution timed out, SIGKILL sent');\n cleanupProcess();\n resolve({\n stdout,\n stderr,\n exitCode: null,\n error: {\n code: ConduitError.RequestTimeout,\n message: 'Execution timed out',\n },\n });\n }\n }, limits.timeoutMs);\n\n // RSS Monitoring loop\n // Optimization: increased interval to 2s and added platform check\n const isWindows = platform() === 'win32';\n const monitorInterval = setInterval(async () => {\n if (isTerminated || !child.pid) {\n clearInterval(monitorInterval);\n return;\n }\n try {\n let rssMb = 0;\n if (isWindows) {\n try {\n // Windows: tasklist /FI \"PID eq <pid>\" /FO CSV /NH\n // Output: \"deno.exe\",\"1234\",\"Console\",\"1\",\"12,345 K\"\n const { stdout: tasklistOut } = await execAsync(`tasklist /FI \"PID eq ${child.pid}\" /FO CSV /NH`);\n const match = tasklistOut.match(/\"([^\"]+ K)\"$/m); // Matches the last column with K\n if (match) {\n // Remove ' K' and ',' then parse\n const memStr = match[1].replace(/[ K,]/g, '');\n const memKb = parseInt(memStr, 10);\n if (!isNaN(memKb)) {\n rssMb = memKb / 1024;\n }\n }\n } catch (e) {\n // tasklist might fail if process gone\n }\n } else {\n // On Mac/Linux, ps -o rss= -p [pid] returns RSS in KB\n const { stdout: rssStdout } = await execAsync(`ps -o rss= -p ${child.pid}`);\n const rssKb = parseInt(rssStdout.trim());\n if (!isNaN(rssKb)) {\n rssMb = rssKb / 1024;\n }\n }\n\n if (rssMb > limits.memoryLimitMb) {\n isTerminated = true;\n if (typeof (monitorInterval as any) !== 'undefined') clearInterval(monitorInterval);\n child.kill('SIGKILL');\n logger.warn({ rssMb, limitMb: limits.memoryLimitMb }, 'Deno RSS limit exceeded, SIGKILL sent');\n cleanupProcess();\n resolve({\n stdout,\n stderr,\n exitCode: null,\n error: {\n code: ConduitError.MemoryLimitExceeded,\n message: `Memory limit exceeded: ${rssMb.toFixed(2)}MB > ${limits.memoryLimitMb}MB`,\n },\n });\n }\n } catch (err) {\n // Process might have exited already or ps failed\n clearInterval(monitorInterval);\n }\n }, 2000); // Check every 2000ms\n\n child.stdout.on('data', (chunk: Buffer) => {\n if (isTerminated) return;\n\n totalOutputBytes += chunk.length;\n const newLines = (chunk.toString().match(/\\n/g) || []).length;\n totalLogEntries += newLines;\n\n if (totalOutputBytes > limits.maxOutputBytes || totalLogEntries > limits.maxLogEntries) {\n isTerminated = true;\n if (typeof (monitorInterval as any) !== 'undefined') clearInterval(monitorInterval);\n child.kill('SIGKILL');\n logger.warn({ bytes: totalOutputBytes, lines: totalLogEntries }, 'Limits exceeded, SIGKILL sent');\n cleanupProcess();\n resolve({\n stdout: stdout + chunk.toString().slice(0, limits.maxOutputBytes - (totalOutputBytes - chunk.length)),\n stderr,\n exitCode: null,\n error: {\n code: totalOutputBytes > limits.maxOutputBytes ? ConduitError.OutputLimitExceeded : ConduitError.LogLimitExceeded,\n message: totalOutputBytes > limits.maxOutputBytes ? 'Output limit exceeded' : 'Log entry limit exceeded',\n },\n });\n return;\n }\n stdout += chunk.toString();\n });\n\n child.stderr.on('data', (chunk: Buffer) => {\n if (isTerminated) return;\n\n totalOutputBytes += chunk.length;\n const newLines = (chunk.toString().match(/\\n/g) || []).length;\n totalLogEntries += newLines;\n\n if (totalOutputBytes > limits.maxOutputBytes || totalLogEntries > limits.maxLogEntries) {\n isTerminated = true;\n if (typeof (monitorInterval as any) !== 'undefined') clearInterval(monitorInterval);\n child.kill('SIGKILL');\n logger.warn({ bytes: totalOutputBytes, lines: totalLogEntries }, 'Limits exceeded, SIGKILL sent');\n cleanupProcess();\n resolve({\n stdout,\n stderr: stderr + chunk.toString().slice(0, limits.maxOutputBytes - (totalOutputBytes - chunk.length)),\n exitCode: null,\n error: {\n code: totalOutputBytes > limits.maxOutputBytes ? ConduitError.OutputLimitExceeded : ConduitError.LogLimitExceeded,\n message: totalOutputBytes > limits.maxOutputBytes ? 'Output limit exceeded' : 'Log entry limit exceeded',\n },\n });\n return;\n }\n stderr += chunk.toString();\n });\n\n child.on('close', (code) => {\n clearTimeout(timeout);\n if (typeof (monitorInterval as any) !== 'undefined') clearInterval(monitorInterval);\n cleanupProcess();\n if (isTerminated) return; // Already resolved via timeout or limit\n\n resolve({\n stdout,\n stderr,\n exitCode: code,\n });\n });\n\n child.on('error', (err: any) => {\n clearTimeout(timeout);\n logger.error({ err }, 'Child process error');\n cleanupProcess();\n\n let message = err.message;\n if (err.code === 'ENOENT') {\n message = 'Deno executable not found in PATH. Please ensure Deno is installed.';\n }\n\n resolve({\n stdout,\n stderr,\n exitCode: null,\n error: {\n code: ConduitError.InternalError,\n message: message,\n },\n });\n });\n\n // Write code to stdin\n child.stdin.write(fullCode);\n child.stdin.end();\n });\n }\n\n async shutdown() {\n for (const child of this.activeProcesses) {\n try {\n child.kill('SIGKILL');\n } catch (err) {\n // Ignore, process might be dead already\n }\n }\n this.activeProcesses.clear();\n }\n\n async healthCheck(): Promise<{ status: string; detail?: string }> {\n try {\n const { stdout } = await execAsync('deno --version');\n return { status: 'ok', detail: stdout.split('\\n')[0] };\n } catch (err: any) {\n return { status: 'error', detail: err.message };\n }\n }\n\n async warmup(): Promise<void> {\n // No-op for Deno\n }\n}\n","import path from 'node:path';\nimport fs from 'node:fs';\nimport { fileURLToPath } from 'node:url';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n/**\n * Resolves the absolute path to an asset file, handling both source (dev)\n * and distribution (prod) directory structures.\n * \n * Strategies:\n * 1. ../assets/{filename} (Source: src/core -> src/assets)\n * 2. ./assets/{filename} (Dist: dist/ -> dist/assets, if core is merged or similar)\n * 3. ../../assets/{filename} (Dist: dist/core -> dist/assets)\n * 4. assets/{filename} (Relative to cwd, unlikely but fallback)\n * \n * @param filename The name of the asset file (e.g., 'deno-shim.ts')\n * @returns The absolute path to the asset if found\n * @throws Error if the asset cannot be found\n */\nexport function resolveAssetPath(filename: string): string {\n const candidates = [\n // Source structure: src/core/asset.utils.ts -> src/assets/\n path.resolve(__dirname, '../assets', filename),\n // Dist structure possibility 1: dist/ (flat) with assets/ subdir\n path.resolve(__dirname, './assets', filename),\n // Dist structure possibility 2: dist/core/ -> dist/assets/\n path.resolve(__dirname, '../../assets', filename),\n // Dist structure possibility 3: dist/ -> assets/ (if called from root)\n path.resolve(process.cwd(), 'assets', filename),\n // Dist structure possibility 4: dist/assets/ (from root)\n path.resolve(process.cwd(), 'dist/assets', filename)\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n throw new Error(`Asset not found: ${filename}. Checked paths: ${candidates.join(', ')}`);\n}\n","import { Worker } from 'node:worker_threads';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { ExecutionContext } from '../core/execution.context.js';\nimport { ResourceLimits as ConduitResourceLimits } from '../core/config.service.js';\nimport { ConduitError } from '../core/types.js';\nimport { resolveAssetPath } from '../core/asset.utils.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nimport type { Executor, ExecutorConfig, ExecutionResult } from '../core/interfaces/executor.interface.js';\n\nexport { ExecutionResult };\n\n// Deprecated: use ExecutorConfig\nexport interface IPCInfo {\n ipcAddress: string;\n ipcToken: string;\n sdkCode?: string;\n}\n\n\ninterface PooledWorker {\n worker: Worker;\n busy: boolean;\n runs: number;\n lastUsed: number;\n}\n\nexport class PyodideExecutor implements Executor {\n private shimContent: string = '';\n private pool: PooledWorker[] = [];\n private maxPoolSize: number;\n private maxRunsPerWorker = 1;\n\n constructor(maxPoolSize = 3) {\n this.maxPoolSize = maxPoolSize;\n }\n\n private getShim(): string {\n if (this.shimContent) return this.shimContent;\n try {\n const assetPath = resolveAssetPath('python-shim.py');\n this.shimContent = fs.readFileSync(assetPath, 'utf-8');\n return this.shimContent;\n } catch (err: any) {\n throw new Error(`Failed to load Python shim: ${err.message}`);\n }\n }\n\n private waitQueue: Array<(worker: PooledWorker) => void> = [];\n\n private async getWorker(logger: any, limits?: ConduitResourceLimits): Promise<PooledWorker> {\n // Find available worker\n let pooled = this.pool.find(w => !w.busy);\n if (pooled) {\n pooled.busy = true;\n return pooled;\n }\n\n // Create new worker if pool not full\n if (this.pool.length < this.maxPoolSize) {\n logger.info('Creating new Pyodide worker for pool');\n const worker = this.createWorker(limits);\n pooled = { worker, busy: true, runs: 0, lastUsed: Date.now() };\n this.pool.push(pooled);\n\n // Wait for ready signal\n await new Promise<void>((resolve, reject) => {\n const onMessage = (msg: any) => {\n if (msg.type === 'ready') {\n worker.off('message', onMessage);\n resolve();\n }\n };\n worker.on('message', onMessage);\n worker.on('error', reject);\n setTimeout(() => {\n // Cleanup worker on timeout\n worker.terminate();\n this.pool = this.pool.filter(p => p !== pooled);\n reject(new Error('Worker init timeout'));\n }, 10000);\n });\n\n return pooled;\n }\n\n // Wait for a worker to become available via queue\n return new Promise((resolve) => {\n this.waitQueue.push(resolve);\n });\n }\n\n private createWorker(limits?: ConduitResourceLimits): Worker {\n const candidates = [\n path.resolve(__dirname, './pyodide.worker.js'),\n path.resolve(__dirname, './pyodide.worker.ts'),\n path.resolve(__dirname, './executors/pyodide.worker.js'),\n path.resolve(__dirname, './executors/pyodide.worker.ts'),\n ];\n const workerPath = candidates.find(p => fs.existsSync(p));\n if (!workerPath) {\n throw new Error(`Pyodide worker not found. Tried: ${candidates.join(', ')}`);\n }\n\n return new Worker(workerPath, {\n execArgv: process.execArgv.includes('--loader') ? process.execArgv : [],\n resourceLimits: limits ? {\n maxOldSpaceSizeMb: limits.memoryLimitMb,\n // Stack size and young generation are usually fine with defaults\n } as any : undefined\n });\n }\n\n async warmup(limits: ConduitResourceLimits) {\n // Pre-fill the pool up to maxPoolSize\n const needed = this.maxPoolSize - this.pool.length;\n if (needed <= 0) return;\n\n console.error(`Pre-warming ${needed} Pyodide workers...`);\n const promises = [];\n for (let i = 0; i < needed; i++) {\n promises.push(this.createAndPoolWorker(limits));\n }\n await Promise.all(promises);\n console.error(`Pyodide pool pre-warmed with ${this.pool.length} workers.`);\n }\n\n private async createAndPoolWorker(limits: ConduitResourceLimits) {\n // Small optimization: don't double-fill if racing\n if (this.pool.length >= this.maxPoolSize) return;\n\n const worker = this.createWorker(limits);\n const pooled: PooledWorker = { worker, busy: true, runs: 0, lastUsed: Date.now() };\n this.pool.push(pooled);\n\n // Wait for ready signal\n try {\n await new Promise<void>((resolve, reject) => {\n const onMessage = (msg: any) => {\n if (msg.type === 'ready') {\n worker.off('message', onMessage);\n resolve();\n }\n };\n worker.on('message', onMessage);\n worker.on('error', reject);\n setTimeout(() => reject(new Error('Worker init timeout')), 10000);\n });\n pooled.busy = false;\n\n // Check if anyone is waiting for a worker immediately\n if (this.waitQueue.length > 0) {\n const nextResolve = this.waitQueue.shift();\n if (nextResolve) {\n pooled.busy = true;\n nextResolve(pooled);\n }\n }\n } catch (err) {\n // If failed, remove from pool\n this.pool = this.pool.filter(p => p !== pooled);\n worker.terminate();\n }\n }\n\n async execute(code: string, limits: ConduitResourceLimits, context: ExecutionContext, config?: ExecutorConfig): Promise<ExecutionResult> {\n const { logger } = context;\n const pooledWorker = await this.getWorker(logger, limits);\n const worker = pooledWorker.worker;\n\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n logger.warn('Python execution timed out, terminating worker');\n worker.terminate();\n // Remove from pool\n this.pool = this.pool.filter(w => w !== pooledWorker);\n resolve({\n stdout: '',\n stderr: 'Execution timed out',\n exitCode: null,\n error: {\n code: ConduitError.RequestTimeout,\n message: 'Execution timed out',\n },\n });\n }, limits.timeoutMs);\n\n const onMessage = (msg: any) => {\n if (msg.type === 'ready' || msg.type === 'pong') return;\n\n clearTimeout(timeout);\n worker.off('message', onMessage);\n worker.off('error', onError);\n\n pooledWorker.busy = false;\n\n // Notify next waiter if any\n if (this.waitQueue.length > 0) {\n const nextResolve = this.waitQueue.shift();\n if (nextResolve) {\n pooledWorker.busy = true;\n nextResolve(pooledWorker);\n }\n }\n\n pooledWorker.runs++;\n pooledWorker.lastUsed = Date.now();\n\n // Recycle if too many runs\n if (pooledWorker.runs >= this.maxRunsPerWorker) {\n logger.info('Recycling Pyodide worker after max runs');\n worker.terminate();\n this.pool = this.pool.filter(w => w !== pooledWorker);\n }\n\n if (msg.success) {\n resolve({\n stdout: msg.stdout,\n stderr: msg.stderr,\n exitCode: 0,\n });\n } else {\n logger.warn({ error: msg.error }, 'Python execution failed or limit breached, terminating worker');\n worker.terminate();\n this.pool = this.pool.filter(w => w !== pooledWorker);\n\n logger.debug({ error: msg.error }, 'Python execution error from worker');\n const normalizedError = (msg.error || '').toLowerCase();\n const limitBreached = msg.limitBreached || '';\n\n const isLogLimit = limitBreached === 'log' || normalizedError.includes('[limit_log]');\n const isOutputLimit = limitBreached === 'output' || normalizedError.includes('[limit_output]');\n const isAmbiguousLimit = !isOutputLimit && !isLogLimit && (normalizedError.includes('i/o error') || normalizedError.includes('errno 29') || normalizedError.includes('limit exceeded'));\n\n resolve({\n stdout: msg.stdout,\n stderr: msg.stderr,\n exitCode: 1,\n error: {\n code: isLogLimit ? ConduitError.LogLimitExceeded : ((isOutputLimit || isAmbiguousLimit) ? ConduitError.OutputLimitExceeded : ConduitError.InternalError),\n message: isLogLimit ? 'Log entry limit exceeded' : ((isOutputLimit || isAmbiguousLimit) ? 'Output limit exceeded' : msg.error),\n },\n });\n }\n };\n\n const onError = (err: any) => {\n clearTimeout(timeout);\n worker.off('message', onMessage);\n worker.off('error', onError);\n\n logger.error({ err }, 'Pyodide worker error');\n worker.terminate();\n this.pool = this.pool.filter(w => w !== pooledWorker);\n\n resolve({\n stdout: '',\n stderr: err.message,\n exitCode: null,\n error: {\n code: ConduitError.InternalError,\n message: err.message,\n },\n });\n };\n\n worker.on('message', onMessage);\n worker.on('error', onError);\n\n // Prepare shim with SDK injection\n let shim = this.getShim();\n if (config?.sdkCode) {\n shim = shim.replace('# __CONDUIT_SDK_INJECTION__', config.sdkCode);\n }\n\n worker.postMessage({\n type: 'execute',\n data: { code, limits, ipcInfo: config, shim }\n });\n });\n }\n\n async shutdown() {\n for (const pooled of this.pool) {\n await pooled.worker.terminate();\n }\n this.pool = [];\n }\n\n async healthCheck(): Promise<{ status: string; workers: number; detail?: string }> {\n try {\n // Find an available worker or create a temporary one for health check\n const pooled = await this.getWorker(console, {\n timeoutMs: 5000,\n memoryLimitMb: 128,\n maxOutputBytes: 1024,\n maxLogEntries: 10\n });\n\n return new Promise((resolve) => {\n let timeout: NodeJS.Timeout;\n\n const onMessage = (msg: any) => {\n if (msg.type === 'pong') {\n cleanup();\n pooled.busy = false;\n resolve({ status: 'ok', workers: this.pool.length });\n }\n };\n\n const cleanup = () => {\n clearTimeout(timeout);\n pooled.worker.off('message', onMessage);\n };\n\n timeout = setTimeout(() => {\n cleanup();\n pooled.busy = false;\n resolve({ status: 'error', workers: this.pool.length, detail: 'Health check timeout' });\n }, 2000);\n\n pooled.worker.on('message', onMessage);\n pooled.worker.postMessage({ type: 'ping' });\n });\n } catch (err: any) {\n return { status: 'error', workers: this.pool.length, detail: err.message };\n }\n }\n}\n","import ivm from 'isolated-vm';\nimport { Logger } from 'pino';\nimport { ExecutionContext } from '../core/execution.context.js';\nimport { ResourceLimits } from '../core/config.service.js';\nimport { GatewayService } from '../gateway/gateway.service.js';\nimport { ConduitError } from '../core/types.js';\n\nimport type { Executor, ExecutorConfig, ExecutionResult } from '../core/interfaces/executor.interface.js';\n\nexport { ExecutionResult as IsolateExecutionResult };\n\n/**\n * IsolateExecutor - In-process V8 isolate execution using isolated-vm.\n * \n * Security model: Capability-based (not OS sandbox)\n * - Only approved functions exposed to isolate\n * - Hard time/memory limits\n * - No process/fs/net access\n */\nexport class IsolateExecutor implements Executor {\n private logger: Logger;\n private gatewayService: GatewayService;\n\n constructor(logger: Logger, gatewayService: GatewayService) {\n this.logger = logger;\n this.gatewayService = gatewayService;\n }\n\n async execute(\n code: string,\n limits: ResourceLimits,\n context: ExecutionContext,\n config?: ExecutorConfig\n ): Promise<ExecutionResult> {\n const logs: string[] = [];\n const errors: string[] = [];\n let isolate: ivm.Isolate | null = null;\n\n try {\n // Create isolate with memory limit\n isolate = new ivm.Isolate({ memoryLimit: limits.memoryLimitMb });\n const ctx = await isolate.createContext();\n const jail = ctx.global;\n\n let currentLogBytes = 0;\n let currentErrorBytes = 0;\n\n // Inject console.log/error for output capture\n // Inject console.log/error for output capture\n await jail.set('__log', new ivm.Callback((msg: string) => {\n if (currentLogBytes + msg.length + 1 > limits.maxOutputBytes) {\n // Check log entry count limit? We don't track count here yet effectively, but bytes is safer.\n // The interface says maxOutputBytes applies to total output.\n throw new Error('[LIMIT_LOG]');\n }\n if (currentLogBytes < limits.maxOutputBytes) {\n logs.push(msg);\n currentLogBytes += msg.length + 1; // +1 for newline approximation\n }\n }));\n await jail.set('__error', new ivm.Callback((msg: string) => {\n if (currentErrorBytes + msg.length + 1 > limits.maxOutputBytes) {\n throw new Error('[LIMIT_OUTPUT]');\n }\n if (currentErrorBytes < limits.maxOutputBytes) {\n errors.push(msg);\n currentErrorBytes += msg.length + 1;\n }\n }));\n\n // Async tool bridge (ID-based to avoid Promise transfer issues)\n let requestIdCounter = 0;\n const pendingToolCalls = new Map<number, Promise<any>>(); // Not used by Host, but Host initiates work\n\n await jail.set('__dispatchToolCall', new ivm.Callback((nameStr: string, argsStr: string) => {\n const requestId = ++requestIdCounter;\n const name = nameStr;\n let args = {};\n try {\n args = JSON.parse(argsStr);\n } catch (e) {\n // ignore\n }\n\n // Process async\n this.gatewayService.callTool(name, args, context)\n .then(res => {\n // callback to isolate\n return ctx.evalClosure(`resolveRequest($0, $1, null)`, [requestId, JSON.stringify(res)], { arguments: { copy: true } });\n })\n .catch(err => {\n return ctx.evalClosure(`resolveRequest($0, null, $1)`, [requestId, err.message || 'Unknown error'], { arguments: { copy: true } });\n })\n .catch(e => {\n // Ignore errors calling back into isolate (e.g. if disposed)\n });\n\n return requestId;\n }));\n\n // Bootstrap code: create console and async handling\n const bootstrap = `\n const requests = new Map();\n \n // Host calls this to resolve requests\n globalThis.resolveRequest = (id, resultJson, error) => {\n const req = requests.get(id);\n if (req) {\n requests.delete(id);\n if (error) req.reject(new Error(error));\n else req.resolve(resultJson);\n }\n };\n\n // Internal tool call wrapper\n globalThis.__callTool = (name, argsJson) => {\n return new Promise((resolve, reject) => {\n const id = __dispatchToolCall(name, argsJson);\n requests.set(id, { resolve, reject });\n });\n };\n\n const format = (arg) => {\n if (typeof arg === 'string') return arg;\n if (arg instanceof Error) return arg.stack || arg.message;\n if (typeof arg === 'object' && arg !== null && arg.message && arg.stack) return arg.stack; // Duck typing\n return JSON.stringify(arg);\n };\n const console = {\n log: (...args) => __log(args.map(format).join(' ')),\n error: (...args) => __error(args.map(format).join(' ')),\n };\n `;\n const bootstrapScript = await isolate.compileScript(bootstrap);\n await bootstrapScript.run(ctx, { timeout: 1000 });\n\n // Inject SDK (typed tools or fallback)\n const sdkScript = config?.sdkCode || `\n const tools = {\n $raw: async (name, args) => {\n const resStr = await __callTool(name, JSON.stringify(args || {}));\n return JSON.parse(resStr);\n }\n };\n `;\n const compiledSdk = await isolate.compileScript(sdkScript);\n await compiledSdk.run(ctx, { timeout: 1000 });\n\n // Compile and run user code\n // Async completion tracking\n let executionPromiseResolve: () => void;\n const executionPromise = new Promise<void>((resolve) => {\n executionPromiseResolve = resolve;\n });\n await jail.set('__done', new ivm.Callback(() => {\n if (executionPromiseResolve) executionPromiseResolve();\n }));\n\n let scriptFailed = false;\n await jail.set('__setFailed', new ivm.Callback(() => {\n scriptFailed = true;\n }));\n\n // Compile and run user code\n // Wrap in async IIFE to support top-level await and track completion\n // Use 'void' to ensure the script returns undefined (transferrable) instead of a Promise\n const wrappedCode = `void (async () => {\n try {\n ${code}\n } catch (err) {\n console.error(err);\n __setFailed();\n } finally {\n __done();\n }\n })()`;\n\n const script = await isolate.compileScript(wrappedCode);\n\n // NOTE: Two timeouts exist intentionally:\n // 1. script.run timeout (below) - catches infinite synchronous loops\n // 2. Promise.race timeout (after) - catches stuck async operations (tool calls)\n // Tool calls may continue briefly after timeout; isolate.dispose() cleans up.\n\n // Start execution with synchronous timeout protection\n await script.run(ctx, { timeout: limits.timeoutMs });\n\n // Wait for completion or timeout\n let timedOut = false;\n const timeoutPromise = new Promise<void>((_, reject) => {\n setTimeout(() => {\n timedOut = true;\n reject(new Error('Script execution timed out'));\n }, limits.timeoutMs);\n });\n\n try {\n await Promise.race([executionPromise, timeoutPromise]);\n } catch (err: any) {\n if (err.message === 'Script execution timed out') {\n return {\n stdout: logs.join('\\n'),\n stderr: errors.join('\\n'),\n exitCode: null,\n error: {\n code: ConduitError.RequestTimeout,\n message: 'Execution timed out',\n },\n };\n }\n throw err;\n }\n\n return {\n stdout: logs.join('\\n'),\n stderr: errors.join('\\n'),\n exitCode: scriptFailed ? 1 : 0,\n };\n } catch (err: any) {\n const message = err.message || 'Unknown error';\n\n // Handle specific error types\n if (message.includes('Script execution timed out')) {\n return {\n stdout: logs.join('\\n'),\n stderr: errors.join('\\n'),\n exitCode: null,\n error: {\n code: ConduitError.RequestTimeout,\n message: 'Execution timed out',\n },\n };\n }\n\n if (message.includes('memory limit') || message.includes('disposed')) {\n return {\n stdout: logs.join('\\n'),\n stderr: errors.join('\\n'),\n exitCode: null,\n error: {\n code: ConduitError.MemoryLimitExceeded,\n message: 'Memory limit exceeded',\n },\n };\n }\n\n this.logger.error({ err }, 'Isolate execution failed');\n return {\n stdout: logs.join('\\n'),\n stderr: message,\n exitCode: 1,\n error: {\n code: ConduitError.InternalError,\n message,\n },\n };\n } finally {\n if (isolate) {\n isolate.dispose();\n }\n }\n }\n\n async shutdown(): Promise<void> {\n // No-op\n }\n\n async healthCheck(): Promise<{ status: string; detail?: string }> {\n try {\n const isolate = new ivm.Isolate({ memoryLimit: 8 });\n isolate.dispose();\n return { status: 'ok' };\n } catch (err: any) {\n return { status: 'error', detail: err.message };\n }\n }\n\n async warmup(): Promise<void> {\n // No-op\n }\n}\n","import { Executor } from '../interfaces/executor.interface.js';\n\nexport class ExecutorRegistry {\n private executors = new Map<string, Executor>();\n\n register(name: string, executor: Executor): void {\n this.executors.set(name, executor);\n }\n\n get(name: string): Executor | undefined {\n return this.executors.get(name);\n }\n\n has(name: string): boolean {\n return this.executors.has(name);\n }\n\n async shutdownAll(): Promise<void> {\n for (const executor of this.executors.values()) {\n if (executor.shutdown) {\n await executor.shutdown();\n }\n }\n this.executors.clear();\n }\n}\n","/**\n * Language-agnostic interface for tool bindings.\n * Used to generate typed SDK code for sandbox injection.\n */\nexport interface ToolBinding {\n /** Full qualified name: \"github__createIssue\" */\n name: string;\n /** Upstream ID / namespace: \"github\" */\n namespace: string;\n /** Tool method name: \"createIssue\" */\n methodName: string;\n /** JSON Schema for input validation */\n inputSchema?: object;\n /** Human-readable description */\n description?: string;\n}\n\nexport interface SDKGeneratorOptions {\n /** Tool bindings to include in SDK */\n tools: ToolBinding[];\n /** Allow $raw escape hatch for dynamic calls (default: true) */\n enableRawFallback?: boolean;\n}\n\n// Inline parsing to avoid circular dependency with PolicyService\nfunction parseToolName(qualifiedName: string): { namespace: string; name: string } {\n const separatorIndex = qualifiedName.indexOf('__');\n if (separatorIndex === -1) {\n return { namespace: '', name: qualifiedName };\n }\n return {\n namespace: qualifiedName.substring(0, separatorIndex),\n name: qualifiedName.substring(separatorIndex + 2)\n };\n}\n\n/**\n * Convert a prefixed tool name to a ToolBinding.\n * @param name Full tool name in format \"namespace__methodName\"\n * @param inputSchema Optional JSON Schema\n * @param description Optional description\n */\nexport function toToolBinding(\n name: string,\n inputSchema?: object,\n description?: string\n): ToolBinding {\n const toolId = parseToolName(name);\n\n return {\n name,\n namespace: toolId.namespace || 'default',\n methodName: toolId.name || name,\n inputSchema,\n description,\n };\n}\n\n/**\n * Convert a ToolStub to a ToolBinding.\n * @param stub ToolStub from GatewayService\n */\nexport function fromToolStub(stub: { id: string; name: string; description?: string }): ToolBinding {\n const toolId = parseToolName(stub.id);\n return {\n name: stub.id,\n namespace: toolId.namespace || 'default',\n methodName: stub.name, // stub.name is already the method name (e.g. \"create_issue\")\n description: stub.description,\n };\n}\n\n/**\n * Group tool bindings by namespace for SDK generation.\n */\nexport function groupByNamespace(bindings: ToolBinding[]): Map<string, ToolBinding[]> {\n const groups = new Map<string, ToolBinding[]>();\n\n for (const binding of bindings) {\n const existing = groups.get(binding.namespace) || [];\n existing.push(binding);\n groups.set(binding.namespace, existing);\n }\n\n return groups;\n}\n","import { ToolBinding, groupByNamespace } from './tool-binding.js';\n\n/**\n * Generates in-memory SDK code from discovered tool bindings.\n * The generated code creates a nested object structure where\n * tools.namespace.method(args) => callTool(\"namespace__method\", args)\n */\nexport class SDKGenerator {\n /**\n * Convert camelCase to snake_case for Python\n */\n private toSnakeCase(str: string): string {\n return str.replace(/([A-Z])/g, '_$1').toLowerCase().replace(/^_/, '');\n }\n\n /**\n * Escape a string for use in generated code\n */\n private escapeString(str: string): string {\n return str.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\").replace(/\\n/g, '\\\\n');\n }\n\n /**\n * Generate TypeScript SDK code to be injected into Deno sandbox.\n * Creates: tools.namespace.method(args) => __internalCallTool(\"namespace__method\", args)\n * @param bindings Tool bindings to generate SDK for\n * @param allowedTools Optional allowlist for $raw() enforcement\n * @param enableRawFallback Enable $raw() escape hatch (default: true)\n */\n generateTypeScript(bindings: ToolBinding[], allowedTools?: string[], enableRawFallback = true): string {\n const grouped = groupByNamespace(bindings);\n const lines: string[] = [];\n\n lines.push('// Generated SDK - Do not edit');\n\n // Inject allowlist for SDK-level enforcement\n if (allowedTools && allowedTools.length > 0) {\n const normalizedList = allowedTools.map(t => t.replace(/\\./g, '__'));\n lines.push(`const __allowedTools = ${JSON.stringify(normalizedList)};`);\n } else {\n lines.push('const __allowedTools = null;');\n }\n\n lines.push('const _tools = {');\n\n for (const [namespace, tools] of grouped.entries()) {\n // Validate namespace is a valid identifier\n const safeNamespace = this.isValidIdentifier(namespace) ? namespace : `[\"${this.escapeString(namespace)}\"]`;\n\n if (this.isValidIdentifier(namespace)) {\n lines.push(` ${namespace}: {`);\n } else {\n lines.push(` \"${this.escapeString(namespace)}\": {`);\n }\n\n for (const tool of tools) {\n const methodName = this.isValidIdentifier(tool.methodName)\n ? tool.methodName\n : `[\"${this.escapeString(tool.methodName)}\"]`;\n\n // Add JSDoc if description available\n if (tool.description) {\n lines.push(` /** ${this.escapeString(tool.description)} */`);\n }\n\n if (this.isValidIdentifier(tool.methodName)) {\n lines.push(` async ${tool.methodName}(args) {`);\n } else {\n lines.push(` \"${this.escapeString(tool.methodName)}\": async function(args) {`);\n }\n lines.push(` return await __internalCallTool(\"${this.escapeString(tool.name)}\", args);`);\n lines.push(` },`);\n }\n\n lines.push(` },`);\n }\n\n // Add $raw escape hatch with allowlist validation\n if (enableRawFallback) {\n lines.push(` /** Call a tool by its full name (escape hatch for dynamic/unknown tools) */`);\n lines.push(` async $raw(name, args) {`);\n lines.push(` const normalized = name.replace(/\\\\./g, '__');`);\n lines.push(` if (__allowedTools) {`);\n lines.push(` const allowed = __allowedTools.some(p => {`);\n lines.push(` if (p.endsWith('__*')) return normalized.startsWith(p.slice(0, -1));`);\n lines.push(` return normalized === p;`);\n lines.push(` });`);\n lines.push(` if (!allowed) throw new Error(\\`Tool \\${name} is not in the allowlist\\`);`);\n lines.push(` }`);\n lines.push(` return await __internalCallTool(normalized, args);`);\n lines.push(` },`);\n }\n\n lines.push('};');\n lines.push(`\nconst tools = new Proxy(_tools, {\n get: (target, prop) => {\n if (prop in target) return target[prop];\n if (prop === 'then') return undefined;\n if (typeof prop === 'string') {\n throw new Error(\\`Namespace '\\${prop}' not found. It might be invalid, or all tools in it were disallowed.\\`);\n }\n return undefined;\n }\n});\n`);\n lines.push('(globalThis as any).tools = tools;');\n\n return lines.join('\\n');\n }\n\n /**\n * Generate Python SDK code to be injected into Pyodide sandbox.\n * Creates: tools.namespace.method(args) => _internal_call_tool(\"namespace__method\", args)\n * @param bindings Tool bindings to generate SDK for\n * @param allowedTools Optional allowlist for raw() enforcement\n * @param enableRawFallback Enable raw() escape hatch (default: true)\n */\n generatePython(bindings: ToolBinding[], allowedTools?: string[], enableRawFallback = true): string {\n const grouped = groupByNamespace(bindings);\n const lines: string[] = [];\n\n lines.push('# Generated SDK - Do not edit');\n\n // Inject allowlist for SDK-level enforcement\n if (allowedTools && allowedTools.length > 0) {\n const normalizedList = allowedTools.map(t => t.replace(/\\./g, '__'));\n lines.push(`_allowed_tools = ${JSON.stringify(normalizedList)}`);\n } else {\n lines.push('_allowed_tools = None');\n }\n\n lines.push('');\n lines.push('class _ToolNamespace:');\n lines.push(' def __init__(self, methods):');\n lines.push(' for name, fn in methods.items():');\n lines.push(' setattr(self, name, fn)');\n lines.push('');\n lines.push('class _Tools:');\n lines.push(' def __init__(self):');\n\n for (const [namespace, tools] of grouped.entries()) {\n const safeNamespace = this.toSnakeCase(namespace);\n const methodsDict: string[] = [];\n\n for (const tool of tools) {\n const methodName = this.toSnakeCase(tool.methodName);\n const fullName = tool.name;\n // Use async lambda - Python doesn't have async lambdas natively,\n // so we define methods that return awaitable coroutines\n methodsDict.push(` \"${methodName}\": lambda args, n=\"${this.escapeString(fullName)}\": _internal_call_tool(n, args)`);\n }\n\n lines.push(` self.${safeNamespace} = _ToolNamespace({`);\n lines.push(methodsDict.join(',\\n'));\n lines.push(` })`);\n }\n\n // Add raw escape hatch with allowlist validation\n if (enableRawFallback) {\n lines.push('');\n lines.push(' async def raw(self, name, args):');\n lines.push(' \"\"\"Call a tool by its full name (escape hatch for dynamic/unknown tools)\"\"\"');\n lines.push(' normalized = name.replace(\".\", \"__\")');\n lines.push(' if _allowed_tools is not None:');\n lines.push(' allowed = any(');\n lines.push(' normalized.startswith(p[:-1]) if p.endswith(\"__*\") else normalized == p');\n lines.push(' for p in _allowed_tools');\n lines.push(' )');\n lines.push(' if not allowed:');\n lines.push(' raise PermissionError(f\"Tool {name} is not in the allowlist\")');\n lines.push(' return await _internal_call_tool(normalized, args)');\n }\n\n lines.push('');\n lines.push('tools = _Tools()');\n\n return lines.join('\\n');\n }\n\n /**\n * Generate JavaScript SDK code for isolated-vm (V8 Isolate).\n * Creates: tools.namespace.method(args) => __callToolSync(\"namespace__method\", JSON.stringify(args))\n * @param bindings Tool bindings to generate SDK for\n * @param allowedTools Optional allowlist for $raw() enforcement\n * @param enableRawFallback Enable $raw() escape hatch (default: true)\n */\n generateIsolateSDK(bindings: ToolBinding[], allowedTools?: string[], enableRawFallback = true): string {\n const grouped = groupByNamespace(bindings);\n const lines: string[] = [];\n\n lines.push('// Generated SDK for isolated-vm');\n\n // Inject allowlist for SDK-level enforcement (optional, as Gateway also enforces)\n if (allowedTools && allowedTools.length > 0) {\n const normalizedList = allowedTools.map(t => t.replace(/\\./g, '__'));\n lines.push(`const __allowedTools = ${JSON.stringify(normalizedList)};`);\n } else {\n lines.push('const __allowedTools = null;');\n }\n\n lines.push('const _tools = {');\n\n for (const [namespace, tools] of grouped.entries()) {\n const safeNamespace = this.isValidIdentifier(namespace) ? namespace : `[\"${this.escapeString(namespace)}\"]`;\n\n if (this.isValidIdentifier(namespace)) {\n lines.push(` ${namespace}: {`);\n } else {\n lines.push(` \"${this.escapeString(namespace)}\": {`);\n }\n\n for (const tool of tools) {\n const methodName = this.isValidIdentifier(tool.methodName) ? tool.methodName : `[\"${this.escapeString(tool.methodName)}\"]`;\n\n if (this.isValidIdentifier(tool.methodName)) {\n lines.push(` async ${methodName}(args) {`);\n } else {\n lines.push(` \"${this.escapeString(tool.methodName)}\": async function(args) {`);\n }\n\n lines.push(` const resStr = await __callTool(\"${this.escapeString(tool.name)}\", JSON.stringify(args || {}));`);\n lines.push(` return JSON.parse(resStr);`);\n lines.push(` },`);\n }\n\n lines.push(` },`);\n }\n\n // Add $raw escape hatch\n if (enableRawFallback) {\n lines.push(` async $raw(name, args) {`);\n lines.push(` const normalized = name.replace(/\\\\./g, '__');`);\n lines.push(` if (__allowedTools) {`);\n lines.push(` const allowed = __allowedTools.some(p => {`);\n lines.push(` if (p.endsWith('__*')) return normalized.startsWith(p.slice(0, -1));`);\n lines.push(` return normalized === p;`);\n lines.push(` });`);\n lines.push(` if (!allowed) throw new Error(\\`Tool \\${name} is not in the allowlist\\`);`);\n lines.push(` }`);\n lines.push(` const resStr = await __callTool(normalized, JSON.stringify(args || {}));`);\n lines.push(` return JSON.parse(resStr);`);\n lines.push(` },`);\n }\n\n lines.push('};');\n lines.push(`\nconst tools = new Proxy(_tools, {\n get: (target, prop) => {\n if (prop in target) return target[prop];\n if (prop === 'then') return undefined;\n if (typeof prop === 'string') {\n throw new Error(\\`Namespace '\\${prop}' not found. It might be invalid, or all tools in it were disallowed.\\`);\n }\n return undefined;\n }\n});\n`);\n\n return lines.join('\\n');\n }\n\n /**\n * Check if a string is a valid JavaScript/Python identifier\n */\n private isValidIdentifier(str: string): boolean {\n return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(str);\n }\n}\n","import { Logger } from 'pino';\nimport { ExecutorRegistry } from './registries/executor.registry.js';\nimport type { ResourceLimits } from './config.service.js';\nimport { GatewayService } from '../gateway/gateway.service.js';\nimport { SecurityService } from './security.service.js';\nimport { SDKGenerator, toToolBinding } from '../sdk/index.js';\nimport { ExecutionContext } from './execution.context.js';\nimport { ConduitError } from './types.js';\nimport type { ExecutionResult } from './interfaces/executor.interface.js';\n\nexport type { ExecutionResult };\n\nexport class ExecutionService {\n private logger: Logger;\n private executorRegistry: ExecutorRegistry;\n private sdkGenerator = new SDKGenerator();\n private defaultLimits: ResourceLimits;\n private gatewayService: GatewayService;\n private securityService: SecurityService;\n private _ipcAddress: string = '';\n\n constructor(\n logger: Logger,\n defaultLimits: ResourceLimits,\n gatewayService: GatewayService,\n securityService: SecurityService,\n executorRegistry: ExecutorRegistry\n ) {\n this.logger = logger;\n this.defaultLimits = defaultLimits;\n this.gatewayService = gatewayService;\n this.securityService = securityService;\n this.executorRegistry = executorRegistry;\n }\n\n set ipcAddress(addr: string) {\n this._ipcAddress = addr;\n }\n\n async executeTypeScript(\n code: string,\n limits: ResourceLimits,\n context: ExecutionContext,\n allowedTools?: string[]\n ): Promise<ExecutionResult> {\n const effectiveLimits = { ...this.defaultLimits, ...limits };\n\n // 1. Validation\n const securityResult = this.securityService.validateCode(code);\n if (!securityResult.valid) {\n return this.createErrorResult(ConduitError.Forbidden, securityResult.message || 'Access denied');\n }\n\n // 2. Routing Logic (Isolate vs Deno)\n // Strip simple comments to avoid false positives\n const cleanCode = code.replace(/\\/\\*[\\s\\S]*?\\*\\/|([^:]|^)\\/\\/.*$/gm, '$1');\n const hasImports = /^\\s*import\\s/m.test(cleanCode) ||\n /^\\s*export\\s/m.test(cleanCode) ||\n /\\bDeno\\./.test(cleanCode) ||\n /\\bDeno\\b/.test(cleanCode);\n\n // Try to use IsolateExecutor if available and code is simple\n if (!hasImports && this.executorRegistry.has('isolate')) {\n return await this.executeIsolate(code, effectiveLimits, context, allowedTools);\n }\n\n // Fix Sev2: Ensure IPC address is set before execution if Deno is needed\n if (!this._ipcAddress) {\n return this.createErrorResult(ConduitError.InternalError, 'IPC address not initialized');\n }\n\n // 3. Fallback to Deno\n if (!this.executorRegistry.has('deno')) {\n return this.createErrorResult(ConduitError.InternalError, 'Deno execution not available');\n }\n\n const executor = this.executorRegistry.get('deno')!;\n\n // 4. SDK Generation\n const bindings = await this.getToolBindings(context);\n const sdkCode = this.sdkGenerator.generateTypeScript(bindings, allowedTools);\n\n // 5. Session & Execution\n const sessionToken = this.securityService.createSession(allowedTools);\n try {\n return await executor.execute(code, effectiveLimits, context, {\n ipcAddress: this._ipcAddress,\n ipcToken: sessionToken,\n sdkCode\n });\n } finally {\n this.securityService.invalidateSession(sessionToken);\n }\n }\n\n async executePython(\n code: string,\n limits: ResourceLimits,\n context: ExecutionContext,\n allowedTools?: string[]\n ): Promise<ExecutionResult> {\n const effectiveLimits = { ...this.defaultLimits, ...limits };\n\n if (!this.executorRegistry.has('python')) {\n return this.createErrorResult(ConduitError.InternalError, 'Python execution not available');\n }\n\n // Fix Sev2: Ensure IPC address is set before execution for Python\n if (!this._ipcAddress) {\n return this.createErrorResult(ConduitError.InternalError, 'IPC address not initialized');\n }\n\n const executor = this.executorRegistry.get('python')!;\n\n const securityResult = this.securityService.validateCode(code);\n if (!securityResult.valid) {\n return this.createErrorResult(ConduitError.Forbidden, securityResult.message || 'Access denied');\n }\n\n const bindings = await this.getToolBindings(context);\n const sdkCode = this.sdkGenerator.generatePython(bindings, allowedTools);\n\n const sessionToken = this.securityService.createSession(allowedTools);\n try {\n return await executor.execute(code, effectiveLimits, context, {\n ipcAddress: this._ipcAddress,\n ipcToken: sessionToken,\n sdkCode\n });\n } finally {\n this.securityService.invalidateSession(sessionToken);\n }\n }\n\n private async getToolBindings(context: ExecutionContext) {\n // Phase 1: Lazy loading - fetch stubs instead of full schemas\n const packages = await this.gatewayService.listToolPackages();\n const allBindings = [];\n\n for (const pkg of packages) {\n try {\n // Determine if we need to fetch tools for this package\n // Optimization: if allowedTools is strict, we could filter packages here\n\n const stubs = await this.gatewayService.listToolStubs(pkg.id, context);\n allBindings.push(...stubs.map(s => toToolBinding(s.id, undefined, s.description)));\n } catch (err: any) {\n this.logger.warn({ packageId: pkg.id, err: err.message }, 'Failed to list stubs for package');\n }\n }\n return allBindings;\n }\n\n async executeIsolate(\n code: string,\n limits: ResourceLimits,\n context: ExecutionContext,\n allowedTools?: string[]\n ): Promise<ExecutionResult> {\n if (!this.executorRegistry.has('isolate')) {\n return this.createErrorResult(ConduitError.InternalError, 'IsolateExecutor not available');\n }\n const executor = this.executorRegistry.get('isolate')!;\n\n const effectiveLimits = { ...this.defaultLimits, ...limits };\n const securityResult = this.securityService.validateCode(code);\n if (!securityResult.valid) {\n return this.createErrorResult(ConduitError.Forbidden, securityResult.message || 'Access denied');\n }\n\n const bindings = await this.getToolBindings(context);\n const sdkCode = this.sdkGenerator.generateIsolateSDK(bindings, allowedTools);\n\n try {\n return await executor.execute(code, effectiveLimits, context, { sdkCode });\n } catch (err: any) {\n return this.createErrorResult(ConduitError.InternalError, err.message);\n }\n }\n\n private createErrorResult(code: number, message: string): ExecutionResult {\n return {\n stdout: '',\n stderr: '',\n exitCode: null,\n error: { code, message }\n };\n }\n\n async shutdown(): Promise<void> {\n await this.executorRegistry.shutdownAll();\n }\n\n async warmup(): Promise<void> {\n const pythonExecutor = this.executorRegistry.get('python');\n if (pythonExecutor && 'warmup' in pythonExecutor) {\n // Cast to any because warmup is not in general Executor interface yet\n await (pythonExecutor as any).warmup(this.defaultLimits);\n }\n }\n\n async healthCheck(): Promise<any> {\n const pythonExecutor = this.executorRegistry.get('python');\n if (pythonExecutor && 'healthCheck' in pythonExecutor) {\n return (pythonExecutor as any).healthCheck();\n }\n return { status: 'ok' };\n }\n}\n","import { Middleware, NextFunction } from '../interfaces/middleware.interface.js';\nimport { JSONRPCRequest, JSONRPCResponse, ConduitError } from '../types.js';\nimport { ExecutionContext } from '../execution.context.js';\n\nexport class ErrorHandlingMiddleware implements Middleware {\n async handle(request: JSONRPCRequest, context: ExecutionContext, next: NextFunction): Promise<JSONRPCResponse | null> {\n try {\n return await next();\n } catch (err: any) {\n context.logger.error({ err }, 'Error handling request');\n return {\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: ConduitError.InternalError,\n message: err.message || 'Internal Server Error',\n },\n };\n }\n }\n}\n","import { Middleware, NextFunction } from '../interfaces/middleware.interface.js';\nimport { JSONRPCRequest, JSONRPCResponse } from '../types.js';\nimport { ExecutionContext } from '../execution.context.js';\nimport { metrics } from '../metrics.service.js';\n\nexport class LoggingMiddleware implements Middleware {\n async handle(request: JSONRPCRequest, context: ExecutionContext, next: NextFunction): Promise<JSONRPCResponse | null> {\n const { method, id } = request;\n const childLogger = context.logger.child({ method, id });\n context.logger = childLogger; // Update context logger for downstream\n\n metrics.recordExecutionStart();\n const startTime = Date.now();\n\n try {\n const response = await next();\n metrics.recordExecutionEnd(Date.now() - startTime, method);\n return response;\n } catch (err) {\n // Should be caught by ErrorMiddleware, but just in case\n metrics.recordExecutionEnd(Date.now() - startTime, method);\n throw err;\n }\n }\n}\n","import { Middleware, NextFunction } from '../interfaces/middleware.interface.js';\nimport { JSONRPCRequest, JSONRPCResponse, ConduitError } from '../types.js';\nimport { ExecutionContext } from '../execution.context.js';\nimport { SecurityService } from '../security.service.js';\n\nexport class AuthMiddleware implements Middleware {\n constructor(private securityService: SecurityService) { }\n\n async handle(\n request: JSONRPCRequest,\n context: ExecutionContext,\n next: NextFunction\n ): Promise<JSONRPCResponse | null> {\n const providedToken = request.auth?.bearerToken || '';\n const masterToken = this.securityService.getIpcToken();\n\n // If no master token is set (stdio mode), treat all requests as master (auth disabled)\n const isMaster = !masterToken || providedToken === masterToken;\n const isSession = !isMaster && this.securityService.validateIpcToken(providedToken);\n\n if (!isMaster && !isSession) {\n return {\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: ConduitError.Forbidden,\n message: 'Invalid bearer token'\n }\n };\n }\n\n // Strict scoping for session tokens\n if (isSession) {\n const allowedMethods = ['initialize', 'notifications/initialized', 'mcp_discover_tools', 'mcp_call_tool', 'ping', 'tools/list', 'tools/call'];\n if (!allowedMethods.includes(request.method)) {\n return {\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: ConduitError.Forbidden,\n message: 'Session tokens are restricted to tool discovery and calling only'\n }\n };\n }\n\n // Enrich context with session details if needed\n const session = this.securityService.getSession(providedToken);\n if (session?.allowedTools && !context.allowedTools) {\n // If context didn't already have specific tools (e.g. from request params override which shouldn't happen for sessions generally, \n // but usually session allowedTools wins or merges. \n // In generic logic, let's respect session.\n context.allowedTools = session.allowedTools;\n }\n }\n\n return next();\n }\n}\n","import { Middleware, NextFunction } from '../interfaces/middleware.interface.js';\nimport { JSONRPCRequest, JSONRPCResponse, ConduitError } from '../types.js';\nimport { ExecutionContext } from '../execution.context.js';\nimport { SecurityService } from '../security.service.js';\n\nexport class RateLimitMiddleware implements Middleware {\n constructor(private securityService: SecurityService) { }\n\n async handle(\n request: JSONRPCRequest,\n context: ExecutionContext,\n next: NextFunction\n ): Promise<JSONRPCResponse | null> {\n const providedToken = request.auth?.bearerToken;\n // Use token if available, otherwise fallback to remote address from context\n const rateLimitKey = providedToken || context.remoteAddress || 'unknown';\n\n if (!this.securityService.checkRateLimit(rateLimitKey)) {\n return {\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: -32005, // Rate limit exceeded code\n message: 'Rate limit exceeded'\n }\n };\n }\n\n return next();\n }\n}\n","/**\n * MiddlewareBuilder - Factory for building middleware pipelines\n * Extracted from RequestController per architecture-findings.md\n */\n\nimport { Middleware } from '../interfaces/middleware.interface.js';\nimport { ErrorHandlingMiddleware } from './error.middleware.js';\nimport { LoggingMiddleware } from './logging.middleware.js';\nimport { AuthMiddleware } from './auth.middleware.js';\nimport { RateLimitMiddleware } from './ratelimit.middleware.js';\nimport { SecurityService } from '../security.service.js';\n\n/**\n * Build the default middleware pipeline used by RequestController.\n * This centralizes middleware configuration outside the controller.\n */\nexport function buildDefaultMiddleware(securityService: SecurityService): Middleware[] {\n return [\n new ErrorHandlingMiddleware(),\n new LoggingMiddleware(),\n new AuthMiddleware(securityService),\n new RateLimitMiddleware(securityService),\n ];\n}\n","import Fastify from 'fastify';\nimport axios from 'axios';\nimport open from 'open';\nimport { v4 as uuidv4 } from 'uuid';\nimport crypto from 'node:crypto';\n\nexport interface AuthOptions {\n authUrl?: string;\n tokenUrl?: string;\n clientId: string;\n clientSecret?: string;\n scopes?: string;\n port?: number;\n mcpUrl?: string;\n usePkce?: boolean;\n}\n\ntype DiscoveredOAuth = {\n authUrl: string;\n tokenUrl: string;\n scopes?: string[];\n resource?: string;\n};\n\nconst AUTH_REQUEST_PAYLOAD = {\n jsonrpc: '2.0',\n id: 'conduit-auth',\n method: 'initialize',\n params: {\n clientInfo: {\n name: 'conduit-auth',\n version: '1.0.0',\n },\n },\n};\n\nfunction base64UrlEncode(buffer: Buffer): string {\n return buffer\n .toString('base64')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/g, '');\n}\n\nfunction createCodeVerifier(): string {\n return base64UrlEncode(crypto.randomBytes(32));\n}\n\nfunction createCodeChallenge(verifier: string): string {\n return base64UrlEncode(crypto.createHash('sha256').update(verifier).digest());\n}\n\nfunction parseResourceMetadataHeader(headerValue: string | string[] | undefined): string | null {\n if (!headerValue) return null;\n const header = Array.isArray(headerValue) ? headerValue.join(',') : headerValue;\n const match = header.match(/resource_metadata=\"([^\"]+)\"/i) || header.match(/resource_metadata=([^, ]+)/i);\n return match ? match[1] : null;\n}\n\nasync function discoverOAuthFromMcp(mcpUrl: string): Promise<DiscoveredOAuth> {\n const attempts = [\n () => axios.get(mcpUrl, { validateStatus: () => true }),\n () => axios.post(mcpUrl, AUTH_REQUEST_PAYLOAD, { validateStatus: () => true }),\n ];\n\n let resourceMetadataUrl: string | null = null;\n for (const attempt of attempts) {\n const response = await attempt();\n resourceMetadataUrl = parseResourceMetadataHeader(response.headers['www-authenticate']);\n if (resourceMetadataUrl) break;\n }\n\n if (!resourceMetadataUrl) {\n throw new Error('Unable to discover OAuth metadata (missing WWW-Authenticate resource_metadata)');\n }\n\n const metadataResponse = await axios.get(resourceMetadataUrl);\n const metadata = metadataResponse.data as Record<string, any>;\n\n let authUrl = metadata.authorization_endpoint as string | undefined;\n let tokenUrl = metadata.token_endpoint as string | undefined;\n let scopes = Array.isArray(metadata.scopes_supported) ? metadata.scopes_supported : undefined;\n const resource = typeof metadata.resource === 'string' ? metadata.resource : undefined;\n\n if (!authUrl || !tokenUrl) {\n const authServer = (Array.isArray(metadata.authorization_servers) && metadata.authorization_servers[0]) || metadata.issuer;\n if (!authServer) {\n throw new Error('OAuth metadata did not include authorization server info');\n }\n\n const asMetadataUrl = new URL('/.well-known/oauth-authorization-server', authServer).toString();\n const asMetadataResponse = await axios.get(asMetadataUrl);\n const asMetadata = asMetadataResponse.data as Record<string, any>;\n\n authUrl = authUrl || (asMetadata.authorization_endpoint as string | undefined);\n tokenUrl = tokenUrl || (asMetadata.token_endpoint as string | undefined);\n scopes = scopes || (Array.isArray(asMetadata.scopes_supported) ? asMetadata.scopes_supported : undefined);\n }\n\n if (!authUrl || !tokenUrl) {\n throw new Error('OAuth discovery failed: missing authorization or token endpoint');\n }\n\n return { authUrl, tokenUrl, scopes, resource };\n}\n\nfunction normalizeScopes(rawScopes?: string): string | undefined {\n if (!rawScopes) return undefined;\n return rawScopes\n .split(',')\n .map(scope => scope.trim())\n .filter(Boolean)\n .join(' ');\n}\n\nexport async function handleAuth(options: AuthOptions) {\n const port = options.port || 3333;\n const redirectUri = `http://localhost:${port}/callback`;\n const state = uuidv4();\n const codeVerifier = options.usePkce ? createCodeVerifier() : undefined;\n const codeChallenge = codeVerifier ? createCodeChallenge(codeVerifier) : undefined;\n\n const fastify = Fastify();\n let resolvedScopes = normalizeScopes(options.scopes);\n let resolvedAuthUrl = options.authUrl;\n let resolvedTokenUrl = options.tokenUrl;\n let resolvedResource: string | undefined;\n\n if (options.mcpUrl) {\n const discovered = await discoverOAuthFromMcp(options.mcpUrl);\n resolvedAuthUrl = discovered.authUrl;\n resolvedTokenUrl = discovered.tokenUrl;\n resolvedResource = discovered.resource;\n if (!resolvedScopes && discovered.scopes && discovered.scopes.length > 0) {\n resolvedScopes = discovered.scopes.join(' ');\n }\n }\n\n if (!resolvedAuthUrl || !resolvedTokenUrl) {\n throw new Error('OAuth configuration missing authUrl or tokenUrl (set --mcp-url or provide both)');\n }\n\n return new Promise<void>((resolve, reject) => {\n fastify.get('/callback', async (request, reply) => {\n const { code, state: returnedState, error, error_description } = request.query as any;\n\n if (error) {\n reply.send(`Authentication failed: ${error} - ${error_description}`);\n reject(new Error(`OAuth error: ${error}`));\n return;\n }\n\n if (returnedState !== state) {\n reply.send('Invalid state parameter');\n reject(new Error('State mismatch'));\n return;\n }\n\n try {\n const body = new URLSearchParams();\n body.set('grant_type', 'authorization_code');\n body.set('code', code);\n body.set('redirect_uri', redirectUri);\n body.set('client_id', options.clientId);\n if (options.clientSecret) {\n body.set('client_secret', options.clientSecret);\n }\n if (codeVerifier) {\n body.set('code_verifier', codeVerifier);\n }\n if (resolvedResource) {\n body.set('resource', resolvedResource);\n }\n\n const response = await axios.post(resolvedTokenUrl, body, {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'Accept': 'application/json',\n },\n });\n\n const { refresh_token, access_token } = response.data;\n\n console.log('\\n--- Authentication Successful ---\\n');\n console.log('Use these values in your conduit.yaml:\\n');\n console.log('credentials:');\n console.log(' type: oauth2');\n console.log(` clientId: ${options.clientId}`);\n if (options.clientSecret) {\n console.log(` clientSecret: ${options.clientSecret}`);\n }\n console.log(` tokenUrl: \"${resolvedTokenUrl}\"`);\n console.log(` refreshToken: \"${refresh_token || 'N/A (No refresh token returned)'}\"`);\n if (resolvedScopes) {\n console.log(` scopes: [\"${resolvedScopes.split(' ').join('\", \"')}\"]`);\n }\n\n if (!refresh_token) {\n console.log('\\nWarning: No refresh token was returned. Ensure your app has \"offline_access\" scope or similar.');\n }\n\n console.log('\\nRaw response data:', JSON.stringify(response.data, null, 2));\n\n reply.send('Authentication successful! You can close this window and return to the terminal.');\n resolve();\n } catch (err: any) {\n const msg = err.response?.data?.error_description || err.response?.data?.error || err.message;\n reply.send(`Failed to exchange code for token: ${msg}`);\n reject(new Error(`Token exchange failed: ${msg}`));\n } finally {\n setTimeout(() => fastify.close(), 1000);\n }\n });\n\n fastify.listen({ port: port, host: '127.0.0.1' }, async (err) => {\n if (err) {\n reject(err);\n return;\n }\n\n const authUrl = new URL(resolvedAuthUrl);\n authUrl.searchParams.append('client_id', options.clientId);\n authUrl.searchParams.append('redirect_uri', redirectUri);\n authUrl.searchParams.append('response_type', 'code');\n authUrl.searchParams.append('state', state);\n if (resolvedScopes) {\n authUrl.searchParams.append('scope', resolvedScopes);\n }\n if (codeChallenge) {\n authUrl.searchParams.append('code_challenge', codeChallenge);\n authUrl.searchParams.append('code_challenge_method', 'S256');\n }\n if (resolvedResource) {\n authUrl.searchParams.append('resource', resolvedResource);\n }\n\n console.log(`Opening browser to: ${authUrl.toString()}`);\n console.log('Waiting for callback...');\n await open(authUrl.toString());\n });\n });\n}\n"],"mappings":";;;AACA,SAAS,eAAe;;;ACDxB,SAAS,SAAS;AAClB,OAAO,YAAY;AACnB,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,YAAY;AACnB,OAAO,UAAU;AAGjB,IAAM,gBAAgB,QAAQ,OAAO;AAErC,QAAQ,OAAO,QAAQ,MAAM;AAC7B,OAAO,OAAO;AACd,QAAQ,OAAO,QAAQ;AAKhB,IAAM,uBAAuB,EAAE,OAAO;AAAA,EACzC,WAAW,EAAE,OAAO,EAAE,QAAQ,GAAK;AAAA,EACnC,eAAe,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,EACrC,gBAAgB,EAAE,OAAO,EAAE,QAAQ,OAAO,IAAI;AAAA;AAAA,EAC9C,eAAe,EAAE,OAAO,EAAE,QAAQ,GAAK;AAC3C,CAAC;AAEM,IAAM,4BAA4B,EAAE,OAAO;AAAA,EAC9C,MAAM,EAAE,KAAK,CAAC,UAAU,UAAU,QAAQ,CAAC;AAAA;AAAA,EAC3C,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACrC,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,YAAY,EAAE,OAAO,EAAE,SAAS;AACpC,CAAC;AAEM,IAAM,qBAAqB,EAAE,OAAO;AAAA,EACvC,IAAI,EAAE,OAAO;AAAA,EACb,MAAM,EAAE,QAAQ,MAAM,EAAE,SAAS,EAAE,QAAQ,MAAM;AAAA,EACjD,KAAK,EAAE,OAAO;AAAA,EACd,aAAa,0BAA0B,SAAS;AACpD,CAAC;AAEM,IAAM,sBAAsB,EAAE,OAAO;AAAA,EACxC,IAAI,EAAE,OAAO;AAAA,EACb,MAAM,EAAE,QAAQ,OAAO;AAAA,EACvB,SAAS,EAAE,OAAO;AAAA,EAClB,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,EAAE,SAAS;AACnD,CAAC;AAEM,IAAM,qBAAqB,EAAE,MAAM,CAAC,oBAAoB,mBAAmB,CAAC;AAI5E,IAAM,eAAe,EAAE,OAAO;AAAA,EACjC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,UAAU,CAAC,MAAM,OAAO,CAAC,CAAC;AAAA,EAClF,SAAS,EAAE,KAAK,CAAC,eAAe,cAAc,MAAM,CAAC,EAAE,QAAQ,aAAa;AAAA,EAC5E,UAAU,EAAE,KAAK,CAAC,SAAS,QAAQ,QAAQ,OAAO,CAAC,EAAE,QAAQ,MAAM;AAAA,EACnE,gBAAgB,qBAAqB,QAAQ;AAAA,IACzC,WAAW;AAAA,IACX,eAAe;AAAA,IACf,gBAAgB,OAAO;AAAA,IACvB,eAAe;AAAA,EACnB,CAAC;AAAA,EACD,yBAAyB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ;AAAA,IACjD;AAAA;AAAA,EACJ,CAAC;AAAA,EACD,gBAAgB,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,MAAM,OAAO,WAAW,CAAC;AAAA,EACvE,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,EACpC,iBAAiB,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,EACtC,oBAAoB,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EACxC,YAAY,EAAE,OAAO,EAAE,QAAQ,+BAA+B;AAAA,EAC9D,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,WAAW,EAAE,KAAK,CAAC,UAAU,OAAO,CAAC,EAAE,QAAQ,QAAQ;AAAA,EACvD,WAAW,EAAE,MAAM,kBAAkB,EAAE,QAAQ,CAAC,CAAC;AACrD,CAAC;AAIM,IAAM,gBAAN,MAAoB;AAAA,EACf;AAAA,EAER,YAAY,YAAgC,CAAC,GAAG;AAC5C,UAAM,aAAa,KAAK,eAAe;AAEvC,UAAM,YAAY;AAAA,MACd,MAAM,QAAQ,IAAI;AAAA,MAClB,SAAS,QAAQ,IAAI;AAAA,MACrB,UAAU,QAAQ,IAAI;AAAA,MACtB,YAAY,QAAQ,IAAI;AAAA,MACxB,gBAAgB,QAAQ,IAAI;AAAA,MAC5B,WAAW,QAAQ,KAAK,SAAS,SAAS,IAAI,UAAU;AAAA;AAAA,IAE5D;AAGA,WAAO,KAAK,SAAS,EAAE,QAAQ,SAAO,UAAU,GAA6B,MAAM,UAAa,OAAO,UAAU,GAA6B,CAAC;AAE/I,UAAM,eAAe;AAAA,MACjB,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,IACP;AAEA,UAAM,SAAS,aAAa,UAAU,YAAY;AAClD,QAAI,CAAC,OAAO,SAAS;AACjB,YAAM,QAAQ,OAAO,MAAM,OAAO;AAClC,YAAM,IAAI,MAAM,0BAA0B,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC,EAAE;AAAA,IAC9E;AAEA,SAAK,SAAS,OAAO;AAGrB,QAAI,KAAK,OAAO,YAAY,QAAW;AACnC,UAAI,KAAK,OAAO,cAAc,SAAS;AACnC,aAAK,OAAO,UAAU;AAAA,MAC1B,OAAO;AACH,aAAK,OAAO,UAAU,KAAK,OAAO,SAAS,IAAI,IAAI,KAAK,OAAO,OAAO;AAAA,MAC1E;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,IAA+B,KAAsB;AACjD,WAAO,KAAK,OAAO,GAAG;AAAA,EAC1B;AAAA,EAEA,IAAI,MAAiB;AACjB,WAAO,EAAE,GAAG,KAAK,OAAO;AAAA,EAC5B;AAAA,EAEQ,iBAAqC;AACzC,UAAM,aAAa,QAAQ,IAAI,gBAC1B,GAAG,WAAW,KAAK,QAAQ,QAAQ,IAAI,GAAG,cAAc,CAAC,IAAI,iBACzD,GAAG,WAAW,KAAK,QAAQ,QAAQ,IAAI,GAAG,cAAc,CAAC,IAAI,iBAAiB;AAEvF,QAAI,CAAC,WAAY,QAAO,CAAC;AAEzB,QAAI;AACA,YAAM,WAAW,KAAK,QAAQ,QAAQ,IAAI,GAAG,UAAU;AACvD,UAAI,cAAc,GAAG,aAAa,UAAU,OAAO;AAGnD,oBAAc,YAAY,QAAQ,wCAAwC,CAAC,OAAO,SAAS,iBAAiB;AACxG,cAAM,QAAQ,QAAQ,IAAI,OAAO;AACjC,YAAI,UAAU,QAAW;AACrB,iBAAO;AAAA,QACX;AACA,eAAO,iBAAiB,SAAY,eAAe;AAAA,MACvD,CAAC;AAED,UAAI,WAAW,SAAS,OAAO,KAAK,WAAW,SAAS,MAAM,GAAG;AAC7D,eAAO,KAAK,KAAK,WAAW;AAAA,MAChC,OAAO;AACH,eAAO,KAAK,MAAM,WAAW;AAAA,MACjC;AAAA,IACJ,SAAS,OAAO;AACZ,cAAQ,KAAK,8BAA8B,UAAU,KAAK,KAAK;AAC/D,aAAO,CAAC;AAAA,IACZ;AAAA,EACJ;AACJ;;;ACjKA,OAAO,UAAU;AACjB,SAAS,yBAAyB;AAG3B,IAAM,gBAAgB,IAAI,kBAA6C;AAEvE,SAAS,aAAa,eAA8B;AACvD,QAAM,WAAW,cAAc,IAAI,UAAU;AAC7C,QAAM,oBAAoB,cAAc,IAAI,yBAAyB;AACrE,QAAM,iBAAiB,kBAAkB,IAAI,OAAK,IAAI,OAAO,GAAG,GAAG,CAAC;AAEpE,QAAM,eAAe,CAAC,QAAgB;AAClC,QAAI,SAAS;AACb,eAAW,WAAW,gBAAgB;AAClC,eAAS,OAAO,QAAQ,SAAS,YAAY;AAAA,IACjD;AACA,WAAO;AAAA,EACX;AAEA,SAAO;AAAA,IAAK;AAAA,MACR,OAAO;AAAA,MACP,OAAO;AAAA,QACH,UAAU,WAAW,QAAQ;AACzB,gBAAM,eAAe,UAAU,IAAI,SAAO;AACtC,gBAAI;AACA,kBAAI,OAAO,QAAQ,UAAU;AACzB,uBAAO,aAAa,GAAG;AAAA,cAC3B;AACA,kBAAI,OAAO,QAAQ,YAAY,QAAQ,MAAM;AAEzC,sBAAM,QAAQ,EAAE,GAAG,IAAI;AACvB,2BAAW,OAAO,OAAO;AACrB,sBAAI,OAAO,MAAM,GAAG,MAAM,UAAU;AAChC,0BAAM,GAAG,IAAI,aAAa,MAAM,GAAG,CAAC;AAAA,kBACxC;AAAA,gBACJ;AACA,uBAAO;AAAA,cACX;AAAA,YACJ,SAAS,KAAK;AACV,qBAAO;AAAA,YACX;AACA,mBAAO;AAAA,UACX,CAAC;AACD,iBAAO,OAAO,MAAM,MAAM,YAAmB;AAAA,QACjD;AAAA,MACJ;AAAA,MACA,QAAQ;AAAA,QACJ,OAAO,CAAC,gBAAgB,yBAAyB,yBAAyB,cAAc;AAAA,QACxF,QAAQ;AAAA,MACZ;AAAA,MACA,QAAQ;AACJ,cAAM,QAAQ,cAAc,SAAS;AACrC,eAAO;AAAA,UACH,eAAe,OAAO;AAAA,QAC1B;AAAA,MACJ;AAAA;AAAA,MAEA,WAAW,cAAc,IAAI,WAAW,MAAM,WAAW,cAAc,IAAI,SAAS,MAAM,gBACpF,EAAE,QAAQ,eAAe,SAAS,EAAE,UAAU,KAAK,EAAE,IACrD;AAAA,IACV;AAAA,IAAG,cAAc,IAAI,WAAW,MAAM,UAChC,KAAK,YAAY,CAAC,IAClB;AAAA,EACN;AACJ;;;AChEA,OAAO,SAAS;AAChB,OAAOA,SAAQ;AACf,OAAO,QAAQ;AACf,OAAOC,WAAU;;;ACHjB,SAAS,MAAM,cAAc;AAWtB,IAAM,mBAAN,MAAuB;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACT;AAAA,EACA;AAAA,EACS;AAAA,EACA;AAAA,EAEhB,YAAY,SAAkC;AAC1C,SAAK,gBAAgB,OAAO;AAC5B,SAAK,YAAY,KAAK,IAAI;AAC1B,SAAK,WAAW,QAAQ;AACxB,SAAK,eAAe,QAAQ;AAC5B,SAAK,gBAAgB,QAAQ;AAC7B,SAAK,mBAAmB,QAAQ,oBAAoB;AACpD,SAAK,SAAS,QAAQ,OAAO,MAAM;AAAA,MAC/B,eAAe,KAAK;AAAA,MACpB,UAAU,KAAK;AAAA,IACnB,CAAC;AAAA,EACL;AAAA,EAEA,cAAsB;AAClB,WAAO,KAAK,IAAI,IAAI,KAAK;AAAA,EAC7B;AACJ;;;ADnBO,IAAM,kBAAN,MAAsB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YACI,QACA,mBACA,oBACF;AACE,SAAK,SAAS;AACd,SAAK,oBAAoB;AACzB,SAAK,qBAAqB;AAC1B,SAAK,SAAS,IAAI,aAAa,CAAC,WAAW;AACvC,WAAK,iBAAiB,MAAM;AAAA,IAChC,CAAC;AAED,SAAK,OAAO,GAAG,SAAS,CAAC,QAAQ;AAC7B,WAAK,OAAO,MAAM,EAAE,IAAI,GAAG,cAAc;AAAA,IAC7C,CAAC;AAAA,EACL;AAAA,EAEA,MAAM,OAAO,SAA4C;AACrD,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACpC,UAAI,QAAQ,MAAM;AAEd,cAAM,aAAa,KAAK,iBAAiB,QAAQ,IAAI;AACrD,aAAK,OAAO,KAAK,EAAE,WAAW,GAAG,uBAAuB;AAGxD,YAAI,GAAG,SAAS,MAAM,WAAWC,MAAK,WAAW,UAAU,GAAG;AAC1D,cAAI;AACA,YAAAC,IAAG,WAAW,UAAU;AAAA,UAC5B,SAAS,OAAY;AACjB,gBAAI,MAAM,SAAS,UAAU;AACzB,mBAAK,OAAO,KAAK,EAAE,KAAK,OAAO,WAAW,GAAG,wCAAwC;AAAA,YACzF;AAAA,UACJ;AAAA,QACJ;AAEA,aAAK,OAAO,OAAO,YAAY,MAAM;AACjC,eAAK,eAAe,OAAO;AAAA,QAC/B,CAAC;AAAA,MACL,WAAW,QAAQ,SAAS,QAAW;AAEnC,aAAK,OAAO,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,QAAQ,KAAK,GAAG,qBAAqB;AAClF,aAAK,OAAO,OAAO,QAAQ,MAAM,QAAQ,QAAQ,aAAa,MAAM;AAChE,eAAK,eAAe,OAAO;AAAA,QAC/B,CAAC;AAAA,MACL,OAAO;AACH,eAAO,IAAI,MAAM,iEAAiE,CAAC;AACnF;AAAA,MACJ;AAEA,WAAK,OAAO,GAAG,SAAS,MAAM;AAAA,IAClC,CAAC;AAAA,EACL;AAAA,EAEQ,eAAe,SAAkC;AACrD,UAAM,UAAU,KAAK,OAAO,QAAQ;AACpC,UAAM,aAAa,OAAO,YAAY,WAAW,UAAU,GAAG,SAAS,OAAO,IAAI,SAAS,IAAI;AAC/F,SAAK,OAAO,KAAK,EAAE,SAAS,WAAW,GAAG,4BAA4B;AACtE,YAAQ,UAAU;AAAA,EACtB;AAAA,EAEQ,iBAAiB,WAA2B;AAChD,QAAI,GAAG,SAAS,MAAM,SAAS;AAE3B,UAAI,CAAC,UAAU,WAAW,eAAe,GAAG;AACxC,eAAO,gBAAgB,SAAS;AAAA,MACpC;AACA,aAAO;AAAA,IACX,OAAO;AAEH,aAAOD,MAAK,WAAW,SAAS,IAAI,YAAYA,MAAK,KAAK,GAAG,OAAO,GAAG,SAAS;AAAA,IACpF;AAAA,EACJ;AAAA,EAEQ,iBAAiB,QAAoB;AACzC,UAAM,gBAAgB,OAAO,iBAAiB;AAC9C,SAAK,OAAO,MAAM,EAAE,cAAc,GAAG,4BAA4B;AAEjE,WAAO,YAAY,MAAM;AACzB,QAAI,SAAS;AACb,UAAM,kBAAkB,KAAK,OAAO;AAEpC,WAAO,GAAG,QAAQ,OAAO,UAAU;AAC/B,gBAAU;AAEV,UAAI,OAAO,SAAS,iBAAiB;AACjC,aAAK,OAAO,MAAM,EAAE,cAAc,GAAG,8CAA8C;AACnF,eAAO,QAAQ;AACf;AAAA,MACJ;AAGA,aAAO,MAAM;AAEb,UAAI;AACA,YAAI;AACJ,gBAAQ,MAAM,OAAO,QAAQ,IAAI,MAAM,GAAG;AACtC,gBAAM,OAAO,OAAO,UAAU,GAAG,GAAG,EAAE,KAAK;AAC3C,mBAAS,OAAO,UAAU,MAAM,CAAC;AAEjC,cAAI,CAAC,KAAM;AAEX,cAAI;AACJ,cAAI;AACA,sBAAU,KAAK,MAAM,IAAI;AAAA,UAC7B,SAAS,KAAK;AACV,iBAAK,OAAO,MAAM,EAAE,KAAK,KAAK,GAAG,kCAAkC;AACnE,kBAAM,gBAAgB;AAAA,cAClB,SAAS;AAAA,cACT,IAAI;AAAA,cACJ,OAAO;AAAA,gBACH,MAAM;AAAA,gBACN,SAAS;AAAA,cACb;AAAA,YACJ;AACA,mBAAO,MAAM,KAAK,UAAU,aAAa,IAAI,IAAI;AACjD;AAAA,UACJ;AAEA,gBAAM,UAAU,IAAI,iBAAiB;AAAA,YACjC,QAAQ,KAAK;AAAA,YACb;AAAA,UACJ,CAAC;AAED,gBAAM,cAAc,IAAI,EAAE,eAAe,QAAQ,cAAc,GAAG,YAAY;AAC1E,gBAAI;AACA,oBAAM,WAAW,MAAM,KAAK,mBAAmB;AAAA,gBAAI,MAC/C,KAAK,kBAAkB,cAAc,SAAS,OAAO;AAAA,cACzD;AACA,qBAAO,MAAM,KAAK,UAAU,QAAQ,IAAI,IAAI;AAAA,YAChD,SAAS,KAAU;AACf,kBAAI,IAAI,SAAS,kBAAkB;AAC/B,uBAAO,MAAM,KAAK,UAAU;AAAA,kBACxB,SAAS;AAAA,kBACT,IAAI,QAAQ;AAAA,kBACZ,OAAO;AAAA,oBACH;AAAA,oBACA,SAAS;AAAA,kBACb;AAAA,gBACJ,CAAC,IAAI,IAAI;AAAA,cACb,OAAO;AACH,qBAAK,OAAO,MAAM,EAAE,KAAK,WAAW,QAAQ,GAAG,GAAG,yBAAyB;AAG3E,uBAAO,MAAM,KAAK,UAAU;AAAA,kBACxB,SAAS;AAAA,kBACT,IAAI,QAAQ;AAAA,kBACZ,OAAO;AAAA,oBACH;AAAA,oBACA,SAAS;AAAA,kBACb;AAAA,gBACJ,CAAC,IAAI,IAAI;AAAA,cACb;AAAA,YACJ;AAAA,UACJ,CAAC;AAAA,QACL;AAAA,MACJ,SAAS,KAAK;AACV,aAAK,OAAO,MAAM,EAAE,IAAI,GAAG,yCAAyC;AACpE,eAAO,QAAQ;AAAA,MACnB,UAAE;AACE,eAAO,OAAO;AAAA,MAClB;AAAA,IACJ,CAAC;AAED,WAAO,GAAG,SAAS,MAAM;AACrB,WAAK,OAAO,MAAM,EAAE,cAAc,GAAG,mBAAmB;AAAA,IAC5D,CAAC;AAED,WAAO,GAAG,SAAS,CAAC,QAAQ;AACxB,WAAK,OAAO,MAAM,EAAE,KAAK,cAAc,GAAG,cAAc;AAAA,IAC5D,CAAC;AAAA,EACL;AAAA,EAEA,MAAM,QAAuB;AACzB,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC5B,UAAI,KAAK,OAAO,WAAW;AACvB,aAAK,OAAO,MAAM,MAAM;AACpB,eAAK,OAAO,KAAK,yBAAyB;AAC1C,kBAAQ;AAAA,QACZ,CAAC;AAAA,MACL,OAAO;AACH,gBAAQ;AAAA,MACZ;AAAA,IACJ,CAAC;AAAA,EACL;AACJ;;;AExMO,IAAM,iBAAN,MAAqB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAiB;AAAA,EAEzB,YACI,QACA,mBACA,oBACF;AACE,SAAK,SAAS;AACd,SAAK,oBAAoB;AACzB,SAAK,qBAAqB;AAAA,EAC9B;AAAA,EAEA,MAAM,QAAuB;AACzB,SAAK,OAAO,KAAK,0BAA0B;AAE3C,YAAQ,MAAM,YAAY,MAAM;AAChC,YAAQ,MAAM,GAAG,QAAQ,KAAK,WAAW,KAAK,IAAI,CAAC;AAGnD,YAAQ,MAAM,GAAG,OAAO,MAAM;AAC1B,WAAK,OAAO,KAAK,cAAc;AAAA,IACnC,CAAC;AAAA,EACL;AAAA,EAEQ,WAAW,OAAe;AAC9B,SAAK,UAAU;AAEf,QAAI;AACJ,YAAQ,MAAM,KAAK,OAAO,QAAQ,IAAI,MAAM,GAAG;AAC3C,YAAM,OAAO,KAAK,OAAO,UAAU,GAAG,GAAG,EAAE,KAAK;AAChD,WAAK,SAAS,KAAK,OAAO,UAAU,MAAM,CAAC;AAE3C,UAAI,CAAC,KAAM;AAEX,WAAK,YAAY,IAAI;AAAA,IACzB;AAAA,EACJ;AAAA,EAEA,MAAc,YAAY,MAAc;AACpC,QAAI;AACJ,QAAI;AACA,gBAAU,KAAK,MAAM,IAAI;AAAA,IAC7B,SAAS,KAAK;AACV,WAAK,OAAO,MAAM,EAAE,KAAK,KAAK,GAAG,kCAAkC;AACnE,YAAM,gBAAgB;AAAA,QAClB,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,OAAO;AAAA,UACH,MAAM;AAAA,UACN,SAAS;AAAA,QACb;AAAA,MACJ;AACA,WAAK,aAAa,aAAa;AAC/B;AAAA,IACJ;AAEA,UAAM,UAAU,IAAI,iBAAiB;AAAA,MACjC,QAAQ,KAAK;AAAA,MACb,eAAe;AAAA,IACnB,CAAC;AAED,UAAM,cAAc,IAAI,EAAE,eAAe,QAAQ,cAAc,GAAG,YAAY;AAC1E,UAAI;AACA,cAAM,WAAW,MAAM,KAAK,mBAAmB;AAAA,UAAI,MAC/C,KAAK,kBAAkB,cAAc,SAAS,OAAO;AAAA,QACzD;AAEA,YAAI,aAAa,MAAM;AACnB,eAAK,aAAa,QAAQ;AAAA,QAC9B;AAAA,MACJ,SAAS,KAAU;AACf,YAAI,IAAI,SAAS,kBAAkB;AAC/B,eAAK,aAAa;AAAA,YACd,SAAS;AAAA,YACT,IAAI,QAAQ;AAAA,YACZ,OAAO;AAAA,cACH;AAAA,cACA,SAAS;AAAA,YACb;AAAA,UACJ,CAAC;AAAA,QACL,OAAO;AACH,eAAK,OAAO,MAAM,EAAE,KAAK,WAAW,QAAQ,GAAG,GAAG,yBAAyB;AAC3E,eAAK,aAAa;AAAA,YACd,SAAS;AAAA,YACT,IAAI,QAAQ;AAAA,YACZ,OAAO;AAAA,cACH;AAAA,cACA,SAAS;AAAA,YACb;AAAA,UACJ,CAAC;AAAA,QACL;AAAA,MACJ;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EAEQ,aAAa,UAAe;AAChC,YAAQ,OAAO,MAAM,KAAK,UAAU,QAAQ,IAAI,IAAI;AAAA,EACxD;AAAA,EAEA,MAAM,QAAuB;AACzB,YAAQ,MAAM,mBAAmB;AAEjC,WAAO,QAAQ,QAAQ;AAAA,EAC3B;AACJ;;;ACnHA,OAAO,aAAa;AAMpB,OAAO,WAAW;AAEX,IAAM,YAAN,MAAgB;AAAA,EACX,UAAU,QAAQ;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,QAAgB,QAAmB,gBAAgC,mBAAsC;AACjH,SAAK,SAAS;AACd,SAAK,SAAS;AACd,SAAK,iBAAiB;AACtB,SAAK,oBAAoB;AAEzB,SAAK,YAAY;AAAA,EACrB;AAAA,EAEQ,cAAc;AAClB,SAAK,QAAQ,IAAI,WAAW,OAAO,SAAS,UAAU;AAClD,YAAM,gBAAgB,MAAM,KAAK,eAAe,YAAY;AAC5D,YAAM,gBAAgB,MAAM,KAAK,kBAAkB,YAAY;AAE/D,YAAM,gBAAgB,cAAc,WAAW,QAAQ,cAAc,WAAW,OAAO,OAAO;AAE9F,aAAO,MAAM,OAAO,kBAAkB,OAAO,MAAM,GAAG,EAAE,KAAK;AAAA,QACzD,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,MACb,CAAC;AAAA,IACL,CAAC;AAED,SAAK,QAAQ,IAAI,YAAY,OAAO,SAAS,UAAU;AACnD,UAAI;AAGA,cAAM,aAAa,KAAK,OAAO,cAAc;AAC7C,cAAM,WAAW,MAAM,MAAM,IAAI,UAAU;AAC3C,eAAO,MAAM,KAAK,YAAY,EAAE,KAAK,SAAS,IAAI;AAAA,MACtD,SAAS,KAAK;AACV,aAAK,OAAO,MAAM,EAAE,IAAI,GAAG,8BAA8B;AAEzD,cAAM,WAAW;AAAA,yBACa,QAAQ,OAAO,CAAC;AAAA,2BACd,QAAQ,YAAY,EAAE,GAAG;AAAA;AACzD,eAAO,MAAM,KAAK,YAAY,EAAE,KAAK,QAAQ;AAAA,MACjD;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EAEA,MAAM,SAA0B;AAE5B,UAAM,OAAO,KAAK,OAAO,YAAY,SAAY,KAAK,OAAO,UAAU;AACvE,QAAI;AACA,YAAM,UAAU,MAAM,KAAK,QAAQ,OAAO,EAAE,MAAM,MAAM,UAAU,CAAC;AACnE,WAAK,OAAO,KAAK,EAAE,QAAQ,GAAG,sBAAsB;AACpD,aAAO;AAAA,IACX,SAAS,KAAK;AACV,WAAK,OAAO,MAAM,EAAE,IAAI,GAAG,4BAA4B;AACvD,YAAM;AAAA,IACV;AAAA,EACJ;AAAA,EAEA,MAAM,QAAQ;AACV,UAAM,KAAK,QAAQ,MAAM;AAAA,EAC7B;AACJ;;;ACzEA,OAAO,YAAY;AAEnB,SAAS,aAAa;;;ACFtB,SAAS,WAAW,aAAkD,iBAAiB;AAEhF,IAAM,iBAAN,MAAM,gBAAe;AAAA,EACxB,OAAe;AAAA,EACP,QAAQ,YAAY,SAAS,SAAS;AAAA,EAEtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,wBAAwB;AAAA,EAExB,sBAAoC,MAAM;AAAA,EAE1C,cAAc;AAClB,SAAK,mBAAmB,KAAK,MAAM,cAAc,4BAA4B;AAAA,MACzE,aAAa;AAAA,IACjB,CAAC;AAED,SAAK,mBAAmB,KAAK,MAAM,cAAc,4BAA4B;AAAA,MACzE,aAAa;AAAA,IACjB,CAAC;AAED,SAAK,qBAAqB,KAAK,MAAM,cAAc,8BAA8B;AAAA,MAC7E,aAAa;AAAA,IACjB,CAAC;AAED,SAAK,mBAAmB,KAAK,MAAM,gBAAgB,8BAA8B;AAAA,MAC7E,aAAa;AAAA,MACb,MAAM;AAAA,MACN,WAAW,UAAU;AAAA,IACzB,CAAC;AAED,SAAK,wBAAwB,KAAK,MAAM,gBAAgB,2CAA2C;AAAA,MAC/F,aAAa;AAAA,MACb,MAAM;AAAA,MACN,WAAW,UAAU;AAAA,IACzB,CAAC;AAED,SAAK,qBAAqB,KAAK,MAAM,sBAAsB,gCAAgC;AAAA,MACvF,aAAa;AAAA,MACb,WAAW,UAAU;AAAA,IACzB,CAAC;AAED,SAAK,wBAAwB,KAAK,MAAM,sBAAsB,6BAA6B;AAAA,MACvF,aAAa;AAAA,IACjB,CAAC;AAED,SAAK,sBAAsB,YAAY,CAAC,WAAW;AAC/C,aAAO,QAAQ,KAAK,qBAAqB;AAAA,IAC7C,CAAC;AAED,SAAK,mBAAmB,YAAY,CAAC,WAAW;AAC5C,aAAO,QAAQ,KAAK,oBAAoB,CAAC;AAAA,IAC7C,CAAC;AAAA,EACL;AAAA,EAEA,OAAO,cAA8B;AACjC,QAAI,CAAC,gBAAe,UAAU;AAC1B,sBAAe,WAAW,IAAI,gBAAe;AAAA,IACjD;AACA,WAAO,gBAAe;AAAA,EAC1B;AAAA,EAEA,uBAAuB;AACnB,SAAK;AACL,SAAK,iBAAiB,IAAI,CAAC;AAAA,EAC/B;AAAA,EAEA,mBAAmB,YAAoB,UAAmB;AACtD,SAAK,wBAAwB,KAAK,IAAI,GAAG,KAAK,wBAAwB,CAAC;AACvE,SAAK,iBAAiB,OAAO,YAAY,EAAE,MAAM,YAAY,UAAU,CAAC;AAAA,EAC5E;AAAA,EAEA,oBAAoB,YAAoB,UAAkB,SAAkB;AAExE,SAAK,sBAAsB,OAAO,aAAa,KAAM;AAAA,MACjD,WAAW;AAAA,MACX,SAAS,OAAO,OAAO;AAAA,IAC3B,CAAC;AAAA,EACL;AAAA,EAEA,iBAAiB;AACb,SAAK,iBAAiB,IAAI,CAAC;AAAA,EAC/B;AAAA,EAEA,kBAAkB;AACd,SAAK,mBAAmB,IAAI,CAAC;AAAA,EACjC;AAAA;AAAA;AAAA,EAMA,aAAa;AACT,WAAO;AAAA,MACH,kBAAkB,KAAK;AAAA,MACvB,QAAQ,QAAQ,OAAO;AAAA,MACvB,QAAQ,QAAQ,YAAY;AAAA,IAChC;AAAA,EACJ;AAAA,EAEA,4BAA4B,UAAwB;AAChD,SAAK,sBAAsB;AAAA,EAC/B;AACJ;AAEO,IAAM,UAAU,eAAe,YAAY;;;ADrG3C,IAAM,iBAAN,cAA6B,MAAM;AAAA,EACtC,YAAY,SAAiB;AACzB,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EAChB;AACJ;AAEO,IAAM,qBAAN,MAAyB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA,EAIR,YAAY,QAAgB,SAA6B;AACrD,SAAK,SAAS;AACd,SAAK,QAAQ,OAAO,QAAQ,aAAa;AACzC,SAAK,eAAe,QAAQ,gBAAgB;AAE5C,YAAQ,4BAA4B,MAAM,KAAK,MAAM,YAAY;AAAA,EACrE;AAAA,EAEA,MAAM,IAAO,IAAkC;AAC3C,QAAI,KAAK,MAAM,gBAAgB,KAAK,cAAc;AAC9C,WAAK,OAAO,KAAK,EAAE,SAAS,KAAK,MAAM,cAAc,KAAK,KAAK,aAAa,GAAG,uCAAuC;AACtH,YAAM,IAAI,eAAe,4CAA4C;AAAA,IACzE;AAEA,UAAM,SAAS,KAAK,MAAM;AAC1B,UAAM,UAAU,KAAK,MAAM;AAE3B,SAAK,OAAO,MAAM,EAAE,QAAQ,QAAQ,GAAG,gCAAgC;AAGvE,UAAM,OAAO,MAAM,cAAc;AACjC,QAAI,MAAM;AACN,WAAK,cAAc;AAAA,QACf,sBAAsB;AAAA,QACtB,uBAAuB;AAAA,MAC3B,CAAC;AAAA,IACL;AAEA,QAAI;AACA,aAAO,MAAM,KAAK,MAAM,EAAE;AAAA,IAC9B,UAAE;AACE,WAAK,OAAO,MAAM;AAAA,QACd,QAAQ,KAAK,MAAM;AAAA,QACnB,SAAS,KAAK,MAAM;AAAA,MACxB,GAAG,+BAA+B;AAAA,IACtC;AAAA,EACJ;AAAA,EAEA,IAAI,QAAQ;AACR,WAAO;AAAA,MACH,aAAa,KAAK,MAAM;AAAA,MACxB,cAAc,KAAK,MAAM;AAAA,IAC7B;AAAA,EACJ;AACJ;;;AEtDO,IAAM,oBAAN,MAAwB;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EAEA,cAA4B,CAAC;AAAA,EAErC,YACI,QACA,kBACA,gBACA,cAA4B,CAAC,GAC/B;AACE,SAAK,SAAS;AACd,SAAK,mBAAmB;AACxB,SAAK,iBAAiB;AACtB,SAAK,cAAc;AAAA,EACvB;AAAA,EAEA,IAAI,YAAwB;AACxB,SAAK,YAAY,KAAK,UAAU;AAAA,EACpC;AAAA,EAIA,MAAM,cAAc,SAAyB,SAA4D;AACrG,WAAO,KAAK,gBAAgB,SAAS,OAAO;AAAA,EAChD;AAAA,EAEA,MAAc,gBAAgB,SAAyB,SAA4D;AAC/G,QAAI,QAAQ;AAEZ,UAAM,WAAW,OAAO,MAA+C;AACnE,UAAI,KAAK,MAAO,OAAM,IAAI,MAAM,8BAA8B;AAC9D,cAAQ;AAER,YAAM,aAAa,KAAK,YAAY,CAAC;AACrC,UAAI,YAAY;AACZ,eAAO,WAAW,OAAO,SAAS,SAAS,MAAM,SAAS,IAAI,CAAC,CAAC;AAAA,MACpE;AAEA,aAAO,KAAK,aAAa,SAAS,OAAO;AAAA,IAC7C;AAEA,WAAO,SAAS,CAAC;AAAA,EACrB;AAAA,EAEA,MAAc,mBAAmB,SAAyB,SAAqD;AAC3G,UAAM,SAAS,QAAQ;AACvB,QAAI,CAAC,UAAU,CAAC,OAAO,YAAY,CAAC,OAAO,MAAM;AAC7C,aAAO;AAAA,QACH,SAAS;AAAA,QACT,IAAI,QAAQ;AAAA,QACZ,OAAO;AAAA,UACH,MAAM;AAAA,UACN,SAAS;AAAA,QACb;AAAA,MACJ;AAAA,IACJ;AAEA,QAAI;AACA,YAAM,SAAS,MAAM,KAAK,eAAe,aAAa,OAAO,UAAU,OAAO,MAAM,OAAO;AAC3F,aAAO;AAAA,QACH,SAAS;AAAA,QACT,IAAI,QAAQ;AAAA,QACZ;AAAA,MACJ;AAAA,IACJ,SAAS,OAAY;AACjB,aAAO;AAAA,QACH,SAAS;AAAA,QACT,IAAI,QAAQ;AAAA,QACZ,OAAO;AAAA,UACH,MAAM;AAAA,UACN,SAAS,MAAM,WAAW;AAAA,QAC9B;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAc,aAAa,SAAyB,SAA4D;AAC5G,UAAM,EAAE,QAAQ,QAAQ,GAAG,IAAI;AAO/B,YAAQ,QAAQ;AAAA,MACZ,KAAK;AAAA;AAAA,MACL,KAAK;AACD,eAAO,KAAK,oBAAoB,QAAQ,SAAS,EAAE;AAAA,MACvD,KAAK;AAAA,MACL,KAAK;AACD,eAAO,EAAE,SAAS,OAAO,IAAI,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE;AAAA,MACvD,KAAK;AACD,eAAO,KAAK,uBAAuB,QAAQ,SAAS,EAAE;AAAA,MAC1D,KAAK;AACD,eAAO,KAAK,oBAAoB,QAAQ,SAAS,EAAE;AAAA,MACvD,KAAK;AACD,eAAO,KAAK,qBAAqB,QAAQ,SAAS,EAAE;AAAA,MACxD,KAAK;AACD,eAAO,KAAK,mBAAmB,SAAS,OAAO;AAAA,MACnD,KAAK;AAAA,MACL,KAAK;AACD,eAAO,KAAK,eAAe,QAAQ,SAAS,EAAE;AAAA,MAClD,KAAK;AACD,eAAO,KAAK,wBAAwB,QAAQ,SAAS,EAAE;AAAA,MAC3D,KAAK;AACD,eAAO,KAAK,oBAAoB,QAAQ,SAAS,EAAE;AAAA,MACvD,KAAK;AACD,eAAO,KAAK,qBAAqB,QAAQ,SAAS,EAAE;AAAA,MACxD,KAAK;AACD,eAAO,KAAK,iBAAiB,QAAQ,SAAS,EAAE;AAAA,MACpD,KAAK;AACD,eAAO;AAAA;AAAA,MACX,KAAK;AACD,eAAO,EAAE,SAAS,OAAO,IAAI,QAAQ,CAAC,EAAE;AAAA,MAC5C;AAII,eAAO,KAAK,cAAc,IAAI,QAAQ,qBAAqB,MAAM,EAAE;AAAA,IAC3E;AAAA,EACJ;AAAA,EAEA,MAAc,oBAAoB,QAAa,SAA2B,IAA+C;AACrH,UAAM,QAAQ,MAAM,KAAK,eAAe,cAAc,OAAO;AAG7D,UAAM,oBAAoB,MAAM,IAAI,QAAM;AAAA,MACtC,MAAM,EAAE;AAAA,MACR,aAAa,EAAE;AAAA,MACf,aAAa,EAAE;AAAA,IACnB,EAAE;AAEF,WAAO;AAAA,MACH,SAAS;AAAA,MACT;AAAA,MACA,QAAQ;AAAA,QACJ,OAAO;AAAA,MACX;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAc,uBAAuB,QAAa,SAA2B,IAA+C;AACxH,UAAM,WAAW,MAAM,KAAK,eAAe,iBAAiB;AAC5D,WAAO;AAAA,MACH,SAAS;AAAA,MACT;AAAA,MACA,QAAQ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAc,oBAAoB,QAAa,SAA2B,IAA+C;AACrH,UAAM,EAAE,UAAU,IAAI;AACtB,QAAI,CAAC,WAAW;AACZ,aAAO,KAAK,cAAc,IAAI,QAAQ,6BAA6B;AAAA,IACvE;AAEA,QAAI;AACA,YAAM,QAAQ,MAAM,KAAK,eAAe,cAAc,WAAW,OAAO;AACxE,aAAO;AAAA,QACH,SAAS;AAAA,QACT;AAAA,QACA,QAAQ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,SAAS,OAAY;AACjB,aAAO,KAAK,cAAc,IAAI,QAAQ,MAAM,OAAO;AAAA,IACvD;AAAA,EACJ;AAAA,EAEA,MAAc,qBAAqB,QAAa,SAA2B,IAA+C;AACtH,UAAM,EAAE,OAAO,IAAI;AACnB,QAAI,CAAC,QAAQ;AACT,aAAO,KAAK,cAAc,IAAI,QAAQ,0BAA0B;AAAA,IACpE;AAEA,QAAI;AACA,YAAM,SAAS,MAAM,KAAK,eAAe,cAAc,QAAQ,OAAO;AACtE,UAAI,CAAC,QAAQ;AACT,eAAO,KAAK,cAAc,IAAI,QAAQ,mBAAmB,MAAM,EAAE;AAAA,MACrE;AACA,aAAO;AAAA,QACH,SAAS;AAAA,QACT;AAAA,QACA,QAAQ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,SAAS,OAAY;AACjB,aAAO,KAAK,cAAc,IAAI,QAAQ,MAAM,OAAO;AAAA,IACvD;AAAA,EACJ;AAAA,EAEA,MAAc,eAAe,QAAa,SAA2B,IAA+C;AAChH,QAAI,CAAC,OAAQ,QAAO,KAAK,cAAc,IAAI,QAAQ,oBAAoB;AACvE,UAAM,EAAE,MAAM,WAAW,SAAS,IAAI;AAGtC,YAAQ,MAAM;AAAA,MACV,KAAK;AACD,eAAO,KAAK,sBAAsB,cAAc,UAAU,SAAS,EAAE;AAAA,MACzE,KAAK;AACD,eAAO,KAAK,sBAAsB,UAAU,UAAU,SAAS,EAAE;AAAA,MACrE,KAAK;AACD,eAAO,KAAK,sBAAsB,WAAW,UAAU,SAAS,EAAE;AAAA,IAC1E;AAEA,UAAM,WAAW,MAAM,KAAK,eAAe,SAAS,MAAM,UAAU,OAAO;AAC3E,WAAO,EAAE,GAAG,UAAU,GAAG;AAAA,EAC7B;AAAA,EAEQ,sBAAsB,QAAqE;AAC/F,UAAM,aAAa;AAAA,MACf,QAAQ,OAAO;AAAA,MACf,QAAQ,OAAO;AAAA,MACf,UAAU,OAAO;AAAA,IACrB;AACA,WAAO;AAAA,MACH,SAAS,CAAC;AAAA,QACN,MAAM;AAAA,QACN,MAAM,KAAK,UAAU,UAAU;AAAA,MACnC,CAAC;AAAA,MACD,mBAAmB;AAAA,IACvB;AAAA,EACJ;AAAA,EAEA,MAAc,sBACV,MACA,QACA,SACA,IACwB;AACxB,QAAI,CAAC,OAAQ,QAAO,KAAK,cAAc,IAAI,QAAQ,oBAAoB;AACvE,UAAM,EAAE,MAAM,QAAQ,aAAa,IAAI;AAEvC,QAAI,MAAM,QAAQ,YAAY,GAAG;AAC7B,cAAQ,eAAe;AAAA,IAC3B;AAEA,UAAM,SAAS,SAAS,eAClB,MAAM,KAAK,iBAAiB,kBAAkB,MAAM,QAAQ,SAAS,YAAY,IACjF,SAAS,WACL,MAAM,KAAK,iBAAiB,cAAc,MAAM,QAAQ,SAAS,YAAY,IAC7E,MAAM,KAAK,iBAAiB,eAAe,MAAM,QAAQ,SAAS,YAAY;AAExF,QAAI,OAAO,OAAO;AACd,aAAO,KAAK,cAAc,IAAI,OAAO,MAAM,MAAM,OAAO,MAAM,OAAO;AAAA,IACzE;AAEA,WAAO;AAAA,MACH,SAAS;AAAA,MACT;AAAA,MACA,QAAQ,KAAK,sBAAsB,MAAM;AAAA,IAC7C;AAAA,EACJ;AAAA,EAEA,MAAc,wBAAwB,QAAa,SAA2B,IAA+C;AACzH,QAAI,CAAC,OAAQ,QAAO,KAAK,cAAc,IAAI,QAAQ,oBAAoB;AACvE,UAAM,EAAE,MAAM,QAAQ,aAAa,IAAI;AAEvC,QAAI,MAAM,QAAQ,YAAY,GAAG;AAC7B,cAAQ,eAAe;AAAA,IAC3B;AAEA,UAAM,SAAS,MAAM,KAAK,iBAAiB,kBAAkB,MAAM,QAAQ,SAAS,YAAY;AAEhG,QAAI,OAAO,OAAO;AACd,aAAO,KAAK,cAAc,IAAI,OAAO,MAAM,MAAM,OAAO,MAAM,OAAO;AAAA,IACzE;AAEA,WAAO;AAAA,MACH,SAAS;AAAA,MACT;AAAA,MACA,QAAQ;AAAA,QACJ,QAAQ,OAAO;AAAA,QACf,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO;AAAA,MACrB;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAc,oBAAoB,QAAa,SAA2B,IAA+C;AACrH,QAAI,CAAC,OAAQ,QAAO,KAAK,cAAc,IAAI,QAAQ,oBAAoB;AACvE,UAAM,EAAE,MAAM,QAAQ,aAAa,IAAI;AAEvC,QAAI,MAAM,QAAQ,YAAY,GAAG;AAC7B,cAAQ,eAAe;AAAA,IAC3B;AAEA,UAAM,SAAS,MAAM,KAAK,iBAAiB,cAAc,MAAM,QAAQ,SAAS,YAAY;AAE5F,QAAI,OAAO,OAAO;AACd,aAAO,KAAK,cAAc,IAAI,OAAO,MAAM,MAAM,OAAO,MAAM,OAAO;AAAA,IACzE;AAEA,WAAO;AAAA,MACH,SAAS;AAAA,MACT;AAAA,MACA,QAAQ;AAAA,QACJ,QAAQ,OAAO;AAAA,QACf,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO;AAAA,MACrB;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAc,iBAAiB,QAAa,SAA2B,IAA+C;AAElH,UAAM,gBAAgB,QAAQ,mBAAmB;AACjD,WAAO;AAAA,MACH,SAAS;AAAA,MACT;AAAA,MACA,QAAQ;AAAA,QACJ,iBAAiB;AAAA,QACjB,cAAc;AAAA,UACV,OAAO;AAAA,YACH,aAAa;AAAA,UACjB;AAAA,UACA,WAAW;AAAA,YACP,aAAa;AAAA,YACb,WAAW;AAAA,UACf;AAAA,QACJ;AAAA,QACA,YAAY;AAAA,UACR,MAAM;AAAA,UACN,SAAS,QAAQ,IAAI,uBAAuB;AAAA,QAChD;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAc,qBAAqB,QAAa,SAA2B,IAA+C;AACtH,QAAI,CAAC,OAAQ,QAAO,KAAK,cAAc,IAAI,QAAQ,oBAAoB;AACvE,UAAM,EAAE,MAAM,QAAQ,aAAa,IAAI;AAEvC,QAAI,MAAM,QAAQ,YAAY,GAAG;AAC7B,cAAQ,eAAe;AAAA,IAC3B;AAEA,UAAM,SAAS,MAAM,KAAK,iBAAiB,eAAe,MAAM,QAAQ,SAAS,YAAY;AAE7F,QAAI,OAAO,OAAO;AACd,aAAO,KAAK,cAAc,IAAI,OAAO,MAAM,MAAM,OAAO,MAAM,OAAO;AAAA,IACzE;AAEA,WAAO;AAAA,MACH,SAAS;AAAA,MACT;AAAA,MACA,QAAQ;AAAA,QACJ,QAAQ,OAAO;AAAA,QACf,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO;AAAA,MACrB;AAAA,IACJ;AAAA,EACJ;AAAA,EAEQ,cAAc,IAAqB,MAAc,SAAkC;AACvF,WAAO;AAAA,MACH,SAAS;AAAA,MACT;AAAA,MACA,OAAO;AAAA,QACH;AAAA,QACA;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAM,WAAW;AACb,UAAM,KAAK,iBAAiB,SAAS;AAAA,EACzC;AAAA,EAEA,MAAM,cAAc;AAChB,UAAM,gBAAgB,MAAM,KAAK,iBAAiB,YAAY;AAC9D,WAAO;AAAA,MACH,QAAQ,cAAc,WAAW,OAAO,OAAO;AAAA,MAC/C,SAAS;AAAA,IACb;AAAA,EACJ;AAAA,EAEA,MAAM,SAAS;AACX,UAAM,KAAK,iBAAiB,OAAO;AAAA,EACvC;AACJ;;;ACjZA,OAAOE,YAAW;AAMlB,SAAS,cAAc;AACvB,SAAS,4BAA4B;AACrC,SAAS,KAAAC,UAAS;AAUX,IAAM,iBAAN,MAAqB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,QAAgB,MAAoB,aAA0B,cAA6B;AACnG,SAAK,SAAS,OAAO,MAAM,EAAE,YAAY,KAAK,GAAG,CAAC;AAClD,SAAK,OAAO;AACZ,SAAK,cAAc;AACnB,SAAK,eAAe;AAEpB,QAAI,KAAK,KAAK,SAAS,SAAS;AAC5B,YAAM,MAAM,EAAE,GAAG,QAAQ,KAAK,GAAG,KAAK,KAAK,IAAI;AAE/C,YAAM,WAAW,OAAO,QAAQ,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM;AACzD,YAAI,MAAM,OAAW,KAAI,CAAC,IAAI;AAC9B,eAAO;AAAA,MACX,GAAG,CAAC,CAA2B;AAE/B,WAAK,YAAY,IAAI,qBAAqB;AAAA,QACtC,SAAS,KAAK,KAAK;AAAA,QACnB,MAAM,KAAK,KAAK;AAAA,QAChB,KAAK;AAAA,MACT,CAAC;AACD,WAAK,YAAY,IAAI,OAAO;AAAA,QACxB,MAAM;AAAA,QACN,SAAS;AAAA,MACb,GAAG;AAAA,QACC,cAAc,CAAC;AAAA,MACnB,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EAEA,MAAc,kBAAkB;AAC5B,QAAI,CAAC,KAAK,aAAa,CAAC,KAAK,UAAW;AAMxC,QAAI;AAEA,UAAI,CAAC,KAAK,UAAU,YAAY;AAC5B,cAAM,KAAK,UAAU,QAAQ,KAAK,SAAS;AAAA,MAC/C;AAAA,IACJ,SAAS,GAAG;AAAA,IAEZ;AAAA,EACJ;AAAA,EAEA,MAAM,KAAK,SAAyB,SAAqD;AAErF,UAAM,UAAU,CAAC,SAAiK,KAAK,SAAS;AAEhM,QAAI,QAAQ,KAAK,IAAI,GAAG;AACpB,aAAO,KAAK,UAAU,OAAO;AAAA,IACjC,OAAO;AACH,aAAO,KAAK,SAAS,SAAS,OAA2B;AAAA,IAC7D;AAAA,EACJ;AAAA,EAEA,MAAc,UAAU,SAAmD;AACvE,QAAI,CAAC,KAAK,WAAW;AACjB,aAAO,EAAE,SAAS,OAAO,IAAI,QAAQ,IAAI,OAAO,EAAE,MAAM,QAAQ,SAAS,+BAA+B,EAAE;AAAA,IAC9G;AAEA,QAAI;AACA,YAAM,KAAK,gBAAgB;AAG3B,UAAI,QAAQ,WAAW,gBAAgB,QAAQ,WAAW,cAAc;AACpE,cAAM,SAAS,MAAM,KAAK,UAAU,UAAU;AAC9C,eAAO;AAAA,UACH,SAAS;AAAA,UACT,IAAI,QAAQ;AAAA,UACZ;AAAA,QACJ;AAAA,MACJ,WAAW,QAAQ,WAAW,eAAe,QAAQ,WAAW,cAAc;AAC1E,cAAM,SAAS,QAAQ;AACvB,cAAM,SAAS,MAAM,KAAK,UAAU,SAAS;AAAA,UACzC,MAAM,OAAO;AAAA,UACb,WAAW,OAAO;AAAA,QACtB,CAAC;AACD,cAAM,mBAAoB,UAAU,MAAM,QAAS,OAAe,OAAO,IACnE,SACA;AAAA,UACE,SAAS,CAAC;AAAA,YACN,MAAM;AAAA,YACN,MAAM,OAAO,WAAW,WAAW,SAAS,KAAK,UAAU,UAAU,IAAI;AAAA,UAC7E,CAAC;AAAA,QACL;AACJ,eAAO;AAAA,UACH,SAAS;AAAA,UACT,IAAI,QAAQ;AAAA,UACZ,QAAQ;AAAA,QACZ;AAAA,MACJ,OAAO;AAEH,cAAM,SAAS,MAAM,KAAK,UAAU;AAAA,UAChC,EAAE,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,OAAO;AAAA,UACjDA,GAAE,IAAI;AAAA,QACV;AACA,eAAO;AAAA,UACH,SAAS;AAAA,UACT,IAAI,QAAQ;AAAA,UACZ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,SAAS,OAAY;AACjB,WAAK,OAAO,MAAM,EAAE,KAAK,MAAM,GAAG,mBAAmB;AACrD,aAAO;AAAA,QACH,SAAS;AAAA,QACT,IAAI,QAAQ;AAAA,QACZ,OAAO;AAAA,UACH,MAAM,MAAM,QAAQ;AAAA,UACpB,SAAS,MAAM,WAAW;AAAA,QAC9B;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAc,SAAS,SAAyB,SAAqD;AAEjG,QAAI,KAAK,KAAK,SAAS,QAAS,OAAM,IAAI,MAAM,aAAa;AAC7D,UAAM,MAAM,KAAK,KAAK;AAEtB,UAAM,UAAkC;AAAA,MACpC,gBAAgB;AAAA,MAChB,oBAAoB,QAAQ;AAAA,IAChC;AAEA,QAAI,QAAQ,UAAU;AAClB,cAAQ,aAAa,IAAI,QAAQ;AAAA,IACrC;AAEA,QAAI,KAAK,KAAK,aAAa;AACvB,YAAM,cAAc,MAAM,KAAK,YAAY,eAAe,KAAK,KAAK,WAAW;AAC/E,aAAO,OAAO,SAAS,WAAW;AAAA,IACtC;AAEA,UAAM,iBAAiB,MAAM,KAAK,aAAa,YAAY,GAAG;AAC9D,QAAI,CAAC,eAAe,OAAO;AACvB,WAAK,OAAO,MAAM,EAAE,IAAI,GAAG,6BAA6B;AACxD,aAAO;AAAA,QACH,SAAS;AAAA,QACT,IAAI,QAAQ;AAAA,QACZ,OAAO;AAAA,UACH,MAAM;AAAA,UACN,SAAS,eAAe,WAAW;AAAA,QACvC;AAAA,MACJ;AAAA,IACJ;AAEA,QAAI;AACA,WAAK,OAAO,MAAM,EAAE,QAAQ,QAAQ,OAAO,GAAG,sBAAsB;AAGpE,YAAM,cAAc,IAAI,IAAI,GAAG;AAC/B,YAAM,aAAa,eAAe,aAC9B,GAAG,YAAY,QAAQ,KAAK,eAAe,UAAU,GAAG,YAAY,OAAO,MAAM,YAAY,OAAO,EAAE,GAAG,YAAY,QAAQ,GAAG,YAAY,MAAM,GAAG,YAAY,IAAI,KACrK;AAGJ,cAAQ,MAAM,IAAI,YAAY;AAE9B,YAAM,WAAW,MAAMD,OAAM,KAAK,YAAY,SAAS;AAAA,QACnD;AAAA,QACA,SAAS;AAAA,QACT,cAAc;AAAA,MAClB,CAAC;AAED,aAAO,SAAS;AAAA,IACpB,SAAS,KAAU;AACf,WAAK,OAAO,MAAM,EAAE,KAAK,IAAI,QAAQ,GAAG,0BAA0B;AAClE,aAAO;AAAA,QACH,SAAS;AAAA,QACT,IAAI,QAAQ;AAAA,QACZ,OAAO;AAAA,UACH,MAAM;AAAA,UACN,SAAS,mBAAmB,IAAI,OAAO;AAAA,QAC3C;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EACA,MAAM,YAAY,SAAyD;AACvE,QAAI,KAAK,KAAK,SAAS,OAAQ,QAAO;AAEtC,QAAI;AACA,YAAM,UAAU,KAAK,KAAK,IAAI,QAAQ,OAAO,EAAE;AAC/C,YAAM,cAAc,GAAG,OAAO;AAE9B,YAAM,UAAkC;AAAA,QACpC,oBAAoB,QAAQ;AAAA,MAChC;AAEA,UAAI,KAAK,KAAK,aAAa;AACvB,cAAM,cAAc,MAAM,KAAK,YAAY,eAAe,KAAK,KAAK,WAAW;AAC/E,eAAO,OAAO,SAAS,WAAW;AAAA,MACtC;AAEA,YAAM,iBAAiB,MAAM,KAAK,aAAa,YAAY,WAAW;AACtE,UAAI,CAAC,eAAe,OAAO;AACvB,aAAK,OAAO,KAAK,EAAE,KAAK,YAAY,GAAG,6BAA6B;AACpE,eAAO;AAAA,MACX;AAGA,YAAM,cAAc,IAAI,IAAI,WAAW;AACvC,YAAM,aAAa,eAAe,aAC9B,GAAG,YAAY,QAAQ,KAAK,eAAe,UAAU,GAAG,YAAY,OAAO,MAAM,YAAY,OAAO,EAAE,GAAG,YAAY,QAAQ,GAAG,YAAY,MAAM,GAAG,YAAY,IAAI,KACrK;AAEJ,cAAQ,MAAM,IAAI,YAAY;AAE9B,YAAM,WAAW,MAAMA,OAAM,IAAI,YAAY;AAAA,QACzC;AAAA,QACA,SAAS;AAAA,QACT,cAAc;AAAA,MAClB,CAAC;AAED,UAAI,SAAS,WAAW,OAAO,SAAS,QAAQ,MAAM,QAAQ,SAAS,KAAK,KAAK,GAAG;AAChF,eAAO,SAAS;AAAA,MACpB;AAAA,IACJ,SAAS,OAAO;AAEZ,WAAK,OAAO,MAAM,EAAE,KAAK,MAAM,GAAG,0CAA0C;AAAA,IAChF;AACA,WAAO;AAAA,EACX;AACJ;;;AC1PA,OAAOE,YAAW;AAoBX,IAAM,cAAN,MAAkB;AAAA,EACb;AAAA;AAAA,EAEA,aAAa,oBAAI,IAAyB;AAAA;AAAA,EAE1C,eAAe,oBAAI,IAA6B;AAAA,EAExD,YAAY,QAAgB;AACxB,SAAK,SAAS;AAAA,EAClB;AAAA,EAEA,MAAM,eAAe,OAA6D;AAC9E,YAAQ,MAAM,MAAM;AAAA,MAChB,KAAK;AACD,eAAO,EAAE,aAAa,MAAM,UAAU,GAAG;AAAA,MAC7C,KAAK;AACD,eAAO,EAAE,iBAAiB,UAAU,MAAM,WAAW,GAAG;AAAA,MAC5D,KAAK;AACD,eAAO,EAAE,iBAAiB,MAAM,KAAK,eAAe,KAAK,EAAE;AAAA,MAC/D;AACI,cAAM,IAAI,MAAM,0BAA0B,MAAM,IAAI,EAAE;AAAA,IAC9D;AAAA,EACJ;AAAA,EAEA,MAAc,eAAe,OAA6C;AACtE,QAAI,CAAC,MAAM,YAAY,CAAC,MAAM,UAAU;AACpC,YAAM,IAAI,MAAM,iEAAiE;AAAA,IACrF;AAEA,UAAM,WAAW,GAAG,MAAM,QAAQ,IAAI,MAAM,QAAQ;AAGpD,UAAM,SAAS,KAAK,WAAW,IAAI,QAAQ;AAC3C,QAAI,UAAU,OAAO,YAAY,KAAK,IAAI,IAAI,KAAO;AACjD,aAAO,UAAU,OAAO,WAAW;AAAA,IACvC;AAGA,UAAM,kBAAkB,KAAK,aAAa,IAAI,QAAQ;AACtD,QAAI,iBAAiB;AACjB,aAAO;AAAA,IACX;AAGA,UAAM,iBAAiB,KAAK,UAAU,OAAO,QAAQ;AACrD,SAAK,aAAa,IAAI,UAAU,cAAc;AAE9C,QAAI;AACA,aAAO,MAAM;AAAA,IACjB,UAAE;AACE,WAAK,aAAa,OAAO,QAAQ;AAAA,IACrC;AAAA,EACJ;AAAA,EAEA,MAAc,UAAU,OAA4B,UAAmC;AACnF,QAAI,CAAC,MAAM,YAAY,CAAC,MAAM,gBAAgB,CAAC,MAAM,UAAU;AAC3D,YAAM,IAAI,MAAM,wDAAwD;AAAA,IAC5E;AAEA,SAAK,OAAO,KAAK,EAAE,UAAU,MAAM,UAAU,UAAU,MAAM,SAAS,GAAG,yBAAyB;AAElG,QAAI;AACA,YAAM,OAAO,IAAI,gBAAgB;AACjC,WAAK,IAAI,cAAc,eAAe;AACtC,WAAK,IAAI,iBAAiB,MAAM,YAAY;AAC5C,WAAK,IAAI,aAAa,MAAM,QAAQ;AACpC,UAAI,MAAM,cAAc;AACpB,aAAK,IAAI,iBAAiB,MAAM,YAAY;AAAA,MAChD;AAEA,YAAM,WAAW,MAAMA,OAAM,KAAK,MAAM,UAAU,MAAM;AAAA,QACpD,SAAS;AAAA,UACL,gBAAgB;AAAA,UAChB,UAAU;AAAA,QACd;AAAA,MACJ,CAAC;AAED,YAAM,EAAE,cAAc,WAAW,IAAI,SAAS;AAC9C,YAAM,mBAAmB,OAAO,UAAU,KAAK;AAG/C,WAAK,WAAW,IAAI,UAAU;AAAA,QAC1B,aAAa;AAAA,QACb,WAAW,KAAK,IAAI,IAAK,mBAAmB;AAAA,MAChD,CAAC;AAED,aAAO,UAAU,YAAY;AAAA,IACjC,SAAS,KAAU;AACf,YAAM,WAAW,IAAI,UAAU,MAAM,qBAAqB,IAAI,UAAU,MAAM,SAAS,IAAI;AAC3F,WAAK,OAAO,MAAM,EAAE,KAAK,SAAS,GAAG,gCAAgC;AACrE,YAAM,IAAI,MAAM,0BAA0B,QAAQ,EAAE;AAAA,IACxD;AAAA,EACJ;AACJ;;;AClHA,SAAS,gBAAgB;AAUlB,IAAM,cAAN,MAAkB;AAAA,EACb;AAAA,EACA;AAAA,EAER,YAAY,QAAgB,MAAc,KAAK,MAAc,MAAO,KAAK,IAAI;AACzE,SAAK,SAAS;AACd,SAAK,QAAQ,IAAI,SAAS;AAAA,MACtB;AAAA,MACA;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EAEA,IAAI,YAA8C;AAC9C,UAAM,SAAS,KAAK,MAAM,IAAI,UAAU;AACxC,QAAI,QAAQ;AACR,cAAQ,eAAe;AAAA,IAC3B,OAAO;AACH,cAAQ,gBAAgB;AAAA,IAC5B;AACA,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,YAAoB,OAAqB;AACzC,SAAK,OAAO,MAAM,EAAE,YAAY,OAAO,MAAM,OAAO,GAAG,sBAAsB;AAC7E,SAAK,MAAM,IAAI,YAAY,KAAK;AAAA,EACpC;AAAA,EAEA,WAAW,YAAoB;AAC3B,SAAK,OAAO,MAAM,EAAE,WAAW,GAAG,2BAA2B;AAC7D,SAAK,MAAM,OAAO,UAAU;AAAA,EAChC;AAAA,EAEA,QAAQ;AACJ,SAAK,MAAM,MAAM;AAAA,EACrB;AACJ;;;AChCO,IAAM,gBAAN,MAAoB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKvB,cAAc,eAAuC;AACjD,UAAM,iBAAiB,cAAc,QAAQ,IAAI;AACjD,QAAI,mBAAmB,IAAI;AAEvB,aAAO,EAAE,WAAW,IAAI,MAAM,cAAc;AAAA,IAChD;AACA,WAAO;AAAA,MACH,WAAW,cAAc,UAAU,GAAG,cAAc;AAAA,MACpD,MAAM,cAAc,UAAU,iBAAiB,CAAC;AAAA,IACpD;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,MAA8B;AACzC,QAAI,CAAC,KAAK,WAAW;AACjB,aAAO,KAAK;AAAA,IAChB;AACA,WAAO,GAAG,KAAK,SAAS,KAAK,KAAK,IAAI;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,cAAc,MAA+B,cAAiC;AAC1E,UAAM,SAAS,OAAO,SAAS,WAAW,KAAK,cAAc,IAAI,IAAI;AACrE,UAAM,YAAY,CAAC,OAAO,WAAW,GAAG,OAAO,KAAK,MAAM,IAAI,CAAC,EAAE,OAAO,OAAK,CAAC;AAE9E,WAAO,aAAa,KAAK,aAAW;AAChC,YAAM,eAAe,QAAQ,MAAM,GAAG;AAGtC,UAAI,aAAa,aAAa,SAAS,CAAC,MAAM,KAAK;AAC/C,cAAM,cAAc,aAAa,MAAM,GAAG,EAAE;AAC5C,YAAI,YAAY,SAAS,UAAU,OAAQ,QAAO;AAGlD,iBAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AACzC,cAAI,YAAY,CAAC,MAAM,UAAU,CAAC,EAAG,QAAO;AAAA,QAChD;AACA,eAAO;AAAA,MACX;AAGA,UAAI,aAAa,WAAW,UAAU,OAAQ,QAAO;AACrD,eAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC1C,YAAI,aAAa,CAAC,MAAM,UAAU,CAAC,EAAG,QAAO;AAAA,MACjD;AACA,aAAO;AAAA,IACX,CAAC;AAAA,EACL;AACJ;;;ACnEA,SAAS,WAAW;AACpB,OAAO,gBAAgB;AAEvB,IAAM,iBAA+B;AAAA,EACjC;AAAA,IACI,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACT,MAAM;AAAA,MACN,YAAY;AAAA,QACR,MAAM;AAAA,UACF,MAAM;AAAA,UACN,aAAa;AAAA,QACjB;AAAA,QACA,cAAc;AAAA,UACV,MAAM;AAAA,UACN,OAAO,EAAE,MAAM,SAAS;AAAA,UACxB,aAAa;AAAA,QACjB;AAAA,MACJ;AAAA,MACA,UAAU,CAAC,MAAM;AAAA,IACrB;AAAA,EACJ;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACT,MAAM;AAAA,MACN,YAAY;AAAA,QACR,MAAM;AAAA,UACF,MAAM;AAAA,UACN,aAAa;AAAA,QACjB;AAAA,QACA,cAAc;AAAA,UACV,MAAM;AAAA,UACN,OAAO,EAAE,MAAM,SAAS;AAAA,UACxB,aAAa;AAAA,QACjB;AAAA,MACJ;AAAA,MACA,UAAU,CAAC,MAAM;AAAA,IACrB;AAAA,EACJ;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACT,MAAM;AAAA,MACN,YAAY;AAAA,QACR,MAAM;AAAA,UACF,MAAM;AAAA,UACN,aAAa;AAAA,QACjB;AAAA,QACA,cAAc;AAAA,UACV,MAAM;AAAA,UACN,OAAO,EAAE,MAAM,SAAS;AAAA,UACxB,aAAa;AAAA,QACjB;AAAA,MACJ;AAAA,MACA,UAAU,CAAC,MAAM;AAAA,IACrB;AAAA,EACJ;AACJ;AAEO,IAAM,iBAAN,MAAqB;AAAA,EAChB;AAAA,EACA,UAAuC,oBAAI,IAAI;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA,iBAAiB,oBAAI,IAAiB;AAAA,EAE9C,YAAY,QAAgB,cAA6B,eAA+B;AACpF,SAAK,SAAS;AACd,SAAK,eAAe;AACpB,SAAK,cAAc,IAAI,YAAY,MAAM;AACzC,SAAK,cAAc,IAAI,YAAY,MAAM;AACzC,SAAK,gBAAgB,iBAAiB,IAAI,cAAc;AACxD,SAAK,MAAM,IAAI,IAAI,EAAE,QAAQ,MAAM,CAAC;AAEpC,IAAC,WAAmB,QAAQ,KAAK,GAAG;AAAA,EACxC;AAAA,EAEA,iBAAiB,MAAoB;AACjC,UAAM,SAAS,IAAI,eAAe,KAAK,QAAQ,MAAM,KAAK,aAAa,KAAK,YAAY;AACxF,SAAK,QAAQ,IAAI,KAAK,IAAI,MAAM;AAChC,SAAK,OAAO,KAAK,EAAE,YAAY,KAAK,GAAG,GAAG,yBAAyB;AAAA,EACvE;AAAA,EAEA,MAAM,mBAA2C;AAC7C,WAAO,MAAM,KAAK,KAAK,QAAQ,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,MAAM,OAAO;AAAA,MAC7D;AAAA,MACA,aAAa,YAAY,EAAE;AAAA;AAAA,MAC3B,SAAS;AAAA,IACb,EAAE;AAAA,EACN;AAAA,EAEA,MAAM,cAAc,WAAmB,SAAgD;AACnF,UAAM,SAAS,KAAK,QAAQ,IAAI,SAAS;AACzC,QAAI,CAAC,QAAQ;AACT,YAAM,IAAI,MAAM,+BAA+B,SAAS,EAAE;AAAA,IAC9D;AAEA,QAAI,QAAQ,KAAK,YAAY,IAAI,SAAS;AAG1C,QAAI,CAAC,OAAO;AACR,UAAI;AAEA,cAAM,WAAW,MAAM,OAAO,YAAY,OAAO;AACjD,YAAI,UAAU;AACV,gBAAMC,SAAoB,SAAS,MAAM,IAAI,CAAC,OAAY;AAAA,YACtD,IAAI,GAAG,SAAS,KAAK,EAAE,IAAI;AAAA,YAC3B,MAAM,EAAE;AAAA,YACR,aAAa,EAAE;AAAA,UACnB,EAAE;AAEF,cAAI,QAAQ,cAAc;AACtB,mBAAOA,OAAM,OAAO,OAAK,KAAK,cAAc,cAAc,EAAE,IAAI,QAAQ,YAAa,CAAC;AAAA,UAC1F;AACA,iBAAOA;AAAA,QACX;AAAA,MACJ,SAAS,GAAG;AAER,aAAK,OAAO,MAAM,EAAE,WAAW,KAAK,EAAE,GAAG,4CAA4C;AAAA,MACzF;AAEA,YAAM,WAAW,MAAM,OAAO,KAAK;AAAA,QAC/B,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,QAAQ;AAAA,MACZ,GAAG,OAAO;AAEV,UAAI,SAAS,QAAQ,OAAO;AACxB,gBAAQ,SAAS,OAAO;AACxB,aAAK,YAAY,IAAI,WAAW,KAAK;AAAA,MACzC,OAAO;AACH,aAAK,OAAO,KAAK,EAAE,YAAY,WAAW,OAAO,SAAS,MAAM,GAAG,wCAAwC;AAC3G,gBAAQ,CAAC;AAAA,MACb;AAAA,IACJ;AAEA,UAAM,QAAoB,MAAM,IAAI,QAAM;AAAA,MACtC,IAAI,GAAG,SAAS,KAAK,EAAE,IAAI;AAAA,MAC3B,MAAM,EAAE;AAAA,MACR,aAAa,EAAE;AAAA,IACnB,EAAE;AAEF,QAAI,QAAQ,cAAc;AACtB,aAAO,MAAM,OAAO,OAAK,KAAK,cAAc,cAAc,EAAE,IAAI,QAAQ,YAAa,CAAC;AAAA,IAC1F;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,cAAc,QAAgB,SAAuD;AACvF,QAAI,QAAQ,gBAAgB,CAAC,KAAK,cAAc,cAAc,QAAQ,QAAQ,YAAY,GAAG;AACzF,YAAM,IAAI,MAAM,kBAAkB,MAAM,4BAA4B;AAAA,IACxE;AAEA,UAAM,SAAS,KAAK,cAAc,cAAc,MAAM;AACtD,UAAM,WAAW,OAAO;AAGxB,UAAM,UAAU,eAAe,KAAK,OAAK,EAAE,SAAS,MAAM;AAC1D,QAAI,QAAS,QAAO;AAEpB,UAAM,aAAa,OAAO;AAG1B,QAAI,CAAC,KAAK,YAAY,IAAI,UAAU,GAAG;AAEnC,YAAM,KAAK,cAAc,YAAY,OAAO;AAAA,IAChD;AAEA,UAAM,QAAQ,KAAK,YAAY,IAAI,UAAU,KAAK,CAAC;AACnD,UAAM,OAAO,MAAM,KAAK,OAAK,EAAE,SAAS,QAAQ;AAEhD,QAAI,CAAC,KAAM,QAAO;AAGlB,WAAO;AAAA,MACH,GAAG;AAAA,MACH,MAAM;AAAA,IACV;AAAA,EACJ;AAAA,EAEA,MAAM,cAAc,SAAkD;AAClE,UAAM,WAAyB,CAAC,GAAG,cAAc;AAEjD,eAAW,CAAC,IAAI,MAAM,KAAK,KAAK,QAAQ,QAAQ,GAAG;AAC/C,UAAI,QAAQ,KAAK,YAAY,IAAI,EAAE;AAEnC,UAAI,CAAC,OAAO;AACR,cAAM,WAAW,MAAM,OAAO,KAAK;AAAA,UAC/B,SAAS;AAAA,UACT,IAAI;AAAA,UACJ,QAAQ;AAAA;AAAA,QACZ,GAAG,OAAO;AAEV,YAAI,SAAS,QAAQ,OAAO;AACxB,kBAAQ,SAAS,OAAO;AACxB,eAAK,YAAY,IAAI,IAAI,KAAK;AAAA,QAClC,OAAO;AACH,eAAK,OAAO,KAAK,EAAE,YAAY,IAAI,OAAO,SAAS,MAAM,GAAG,wCAAwC;AACpG,kBAAQ,CAAC;AAAA,QACb;AAAA,MACJ;AAEA,YAAM,gBAAgB,MAAM,IAAI,QAAM,EAAE,GAAG,GAAG,MAAM,GAAG,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE;AAEzE,UAAI,QAAQ,cAAc;AAEtB,iBAAS,KAAK,GAAG,cAAc,OAAO,OAAK,KAAK,cAAc,cAAc,EAAE,MAAM,QAAQ,YAAa,CAAC,CAAC;AAAA,MAC/G,OAAO;AACH,iBAAS,KAAK,GAAG,aAAa;AAAA,MAClC;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,SAAS,MAAc,QAAa,SAAqD;AAC3F,QAAI,QAAQ,gBAAgB,CAAC,KAAK,cAAc,cAAc,MAAM,QAAQ,YAAY,GAAG;AACvF,WAAK,OAAO,KAAK,EAAE,MAAM,cAAc,QAAQ,aAAa,GAAG,gCAAgC;AAC/F,aAAO;AAAA,QACH,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,OAAO;AAAA,UACH,MAAM;AAAA,UACN,SAAS,8BAA8B,IAAI;AAAA,QAC/C;AAAA,MACJ;AAAA,IACJ;AAEA,UAAM,SAAS,KAAK,cAAc,cAAc,IAAI;AACpD,UAAM,aAAa,OAAO;AAC1B,UAAM,WAAW,OAAO;AAExB,UAAM,SAAS,KAAK,QAAQ,IAAI,UAAU;AAC1C,QAAI,CAAC,QAAQ;AACT,aAAO;AAAA,QACH,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,OAAO;AAAA,UACH,MAAM;AAAA,UACN,SAAS,uBAAuB,UAAU;AAAA,QAC9C;AAAA,MACJ;AAAA,IACJ;AAGA,QAAI,CAAC,KAAK,YAAY,IAAI,UAAU,GAAG;AACnC,YAAM,KAAK,cAAc,YAAY,OAAO;AAAA,IAChD;AAEA,UAAM,QAAQ,KAAK,YAAY,IAAI,UAAU,KAAK,CAAC;AACnD,UAAM,aAAa,MAAM,KAAK,OAAK,EAAE,SAAS,QAAQ;AAEtD,QAAI,QAAQ,kBAAkB;AAC1B,UAAI,CAAC,YAAY;AACb,eAAO;AAAA,UACH,SAAS;AAAA,UACT,IAAI;AAAA,UACJ,OAAO;AAAA,YACH,MAAM;AAAA;AAAA,YACN,SAAS,gCAAgC,IAAI;AAAA,UACjD;AAAA,QACJ;AAAA,MACJ;AACA,UAAI,CAAC,WAAW,aAAa;AACzB,eAAO;AAAA,UACH,SAAS;AAAA,UACT,IAAI;AAAA,UACJ,OAAO;AAAA,YACH,MAAM;AAAA;AAAA,YACN,SAAS,qBAAqB,IAAI;AAAA,UACtC;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,QAAI,cAAc,WAAW,aAAa;AACtC,YAAM,WAAW,GAAG,UAAU,KAAK,QAAQ;AAC3C,UAAI,WAAW,KAAK,eAAe,IAAI,QAAQ;AAC/C,UAAI,CAAC,UAAU;AACX,mBAAW,KAAK,IAAI,QAAQ,WAAW,WAAW;AAClD,aAAK,eAAe,IAAI,UAAU,QAAQ;AAAA,MAC9C;AACA,YAAM,QAAQ,SAAS,MAAM;AAC7B,UAAI,CAAC,OAAO;AACR,eAAO;AAAA,UACH,SAAS;AAAA,UACT,IAAI;AAAA,UACJ,OAAO;AAAA,YACH,MAAM;AAAA;AAAA,YACN,SAAS,+BAA+B,IAAI,KAAK,KAAK,IAAI,WAAW,SAAS,MAAM,CAAC;AAAA,UACzF;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,UAAM,YAAY,YAAY,IAAI;AAClC,QAAI,UAAU;AACd,QAAI;AAEJ,QAAI;AACA,iBAAW,MAAM,OAAO,KAAK;AAAA,QACzB,SAAS;AAAA,QACT,IAAI,QAAQ;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ;AAAA,UACJ,MAAM;AAAA,UACN,WAAW;AAAA,QACf;AAAA,MACJ,GAAG,OAAO;AACV,gBAAU,CAAC,SAAS;AAAA,IACxB,SAAS,OAAY;AACjB,gBAAU;AACV,YAAM;AAAA,IACV,UAAE;AACE,YAAM,WAAW,YAAY,IAAI,IAAI;AACrC,cAAQ,oBAAoB,UAAU,UAAU,OAAO;AAAA,IAC3D;AAEA,QAAI,SAAS,SAAS,SAAS,MAAM,SAAS,QAAQ;AAElD,WAAK,YAAY,WAAW,UAAU;AAAA,IAC1C;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,cAA8E;AAChF,UAAM,iBAAyC,CAAC;AAChD,UAAM,UAAU,IAAI,iBAAiB,EAAE,QAAQ,KAAK,OAAO,CAAC;AAE5D,UAAM,QAAQ;AAAA,MACV,MAAM,KAAK,KAAK,QAAQ,QAAQ,CAAC,EAAE,IAAI,OAAO,CAAC,IAAI,MAAM,MAAM;AAC3D,YAAI;AACA,gBAAM,WAAW,MAAM,OAAO,KAAK;AAAA,YAC/B,SAAS;AAAA,YACT,IAAI;AAAA,YACJ,QAAQ;AAAA,UACZ,GAAG,OAAO;AACV,yBAAe,EAAE,IAAI,SAAS,QAAQ,aAAa;AAAA,QACvD,SAAS,KAAK;AACV,yBAAe,EAAE,IAAI;AAAA,QACzB;AAAA,MACJ,CAAC;AAAA,IACL;AAEA,UAAM,QAAQ,OAAO,OAAO,cAAc,EAAE,MAAM,OAAK,MAAM,QAAQ;AACrE,WAAO;AAAA,MACH,QAAQ,QAAQ,OAAO;AAAA,MACvB,WAAW;AAAA,IACf;AAAA,EACJ;AAAA,EACA,MAAM,aAAa,MAAc,QAAa,SAA2E;AACrH,UAAM,SAAS,KAAK,cAAc,cAAc,IAAI;AACpD,UAAM,aAAa,OAAO;AAC1B,UAAM,WAAW,OAAO;AAGxB,QAAI,CAAC,KAAK,YAAY,IAAI,UAAU,GAAG;AACnC,YAAM,KAAK,cAAc,YAAY,OAAO;AAAA,IAChD;AAEA,UAAM,QAAQ,KAAK,YAAY,IAAI,UAAU,KAAK,CAAC;AACnD,UAAM,aAAa,MAAM,KAAK,OAAK,EAAE,SAAS,QAAQ;AAEtD,QAAI,CAAC,YAAY;AACb,aAAO,EAAE,OAAO,OAAO,QAAQ,CAAC,QAAQ,IAAI,YAAY,EAAE;AAAA,IAC9D;AAEA,QAAI,QAAQ,kBAAkB;AAC1B,UAAI,CAAC,WAAW,aAAa;AACzB,eAAO,EAAE,OAAO,OAAO,QAAQ,CAAC,qBAAqB,IAAI,8BAA8B,EAAE;AAAA,MAC7F;AAAA,IACJ;AAEA,QAAI,CAAC,WAAW,aAAa;AAEzB,aAAO,EAAE,OAAO,KAAK;AAAA,IACzB;AAEA,UAAM,WAAW,KAAK,IAAI,QAAQ,WAAW,WAAW;AACxD,UAAM,QAAQ,SAAS,MAAM;AAE7B,QAAI,CAAC,OAAO;AACR,aAAO;AAAA,QACH,OAAO;AAAA,QACP,QAAQ,SAAS,QAAQ,IAAI,OAAK,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,0BAA0B;AAAA,MAC9F;AAAA,IACJ;AAEA,WAAO,EAAE,OAAO,KAAK;AAAA,EACzB;AACJ;;;ACxZA,OAAO,SAAS;AAChB,OAAOC,UAAS;AAChB,SAAS,YAAAC,iBAAgB;AAElB,IAAM,uBAAN,MAA2B;AAAA,EACtB;AAAA,EAES,gBAAgB;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA,EACJ;AAAA,EAEiB,aAAa;AAAA,EACb,YAAY;AAAA;AAAA,EAErB;AAAA,EAER,YAAY,QAAgB;AACxB,SAAK,SAAS;AACd,SAAK,gBAAgB,IAAIA,UAAS;AAAA,MAC9B,KAAK;AAAA,MACL,KAAK,KAAK;AAAA,IACd,CAAC;AAAA,EACL;AAAA,EAEA,MAAM,YAAY,KAAiF;AAC/F,QAAI;AACA,YAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,YAAM,WAAW,OAAO;AAGxB,iBAAW,SAAS,KAAK,eAAe;AACpC,YAAI,MAAM,KAAK,QAAQ,GAAG;AACtB,eAAK,OAAO,KAAK,EAAE,SAAS,GAAG,6CAA6C;AAC5E,iBAAO,EAAE,OAAO,OAAO,SAAS,kDAAkD;AAAA,QACtF;AAAA,MACJ;AAGA,UAAI,CAACD,KAAI,KAAK,QAAQ,GAAG;AACrB,YAAI;AACA,gBAAM,SAAS,MAAM,IAAI,OAAO,UAAU,EAAE,KAAK,KAAK,CAAC;AAEvD,gBAAM,cAAwB,CAAC;AAE/B,qBAAW,WAAW,QAAQ;AAC1B,gBAAI,KAAK,QAAQ;AAGjB,gBAAI,GAAG,WAAW,SAAS,GAAG;AAC1B,mBAAK,GAAG,UAAU,CAAC;AAAA,YACvB;AAEA,uBAAW,SAAS,KAAK,eAAe;AACpC,kBAAI,MAAM,KAAK,EAAE,GAAG;AAChB,qBAAK,OAAO,KAAK,EAAE,UAAU,GAAG,GAAG,mDAAmD;AACtF,uBAAO,EAAE,OAAO,OAAO,SAAS,sDAAsD;AAAA,cAC1F;AAAA,YACJ;AACA,wBAAY,KAAK,EAAE;AAAA,UACvB;AAIA,iBAAO,EAAE,OAAO,MAAM,YAAY,YAAY,CAAC,EAAE;AAAA,QACrD,SAAS,KAAU;AAEf,eAAK,OAAO,KAAK,EAAE,UAAU,KAAK,IAAI,QAAQ,GAAG,2DAA2D;AAC5G,iBAAO,EAAE,OAAO,OAAO,SAAS,4CAA4C;AAAA,QAChF;AAAA,MACJ;AAGA,aAAO,EAAE,OAAO,MAAM,YAAY,SAAS;AAAA,IAC/C,SAAS,KAAU;AACf,aAAO,EAAE,OAAO,OAAO,SAAS,gBAAgB,IAAI,OAAO,GAAG;AAAA,IAClE;AAAA,EACJ;AAAA,EAEA,eAAe,KAAsB;AACjC,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,SAAS,KAAK,cAAc,IAAI,GAAG;AAEzC,QAAI,CAAC,UAAU,MAAM,OAAO,WAAW;AACnC,WAAK,cAAc,IAAI,KAAK,EAAE,OAAO,GAAG,WAAW,MAAM,KAAK,UAAU,CAAC;AACzE,aAAO;AAAA,IACX;AAEA,QAAI,OAAO,SAAS,KAAK,YAAY;AACjC,WAAK,OAAO,KAAK,EAAE,IAAI,GAAG,qBAAqB;AAC/C,aAAO;AAAA,IACX;AAEA,WAAO;AACP,WAAO;AAAA,EACX;AACJ;;;ACxGA,SAAS,MAAME,eAAc;AAC7B,SAAS,YAAAC,iBAAgB;AAOlB,IAAM,iBAAN,MAAqB;AAAA,EAChB;AAAA,EACA;AAAA,EACS,iBAAiB;AAAA;AAAA,EAElC,YAAY,QAAgB;AACxB,SAAK,SAAS;AACd,SAAK,WAAW,IAAIA,UAAS;AAAA,MACzB,KAAK;AAAA,MACL,KAAK,KAAK;AAAA,IACd,CAAC;AAAA,EACL;AAAA,EAEA,cAAc,cAAiC;AAC3C,UAAM,QAAQD,QAAO;AACrB,SAAK,SAAS,IAAI,OAAO;AAAA,MACrB;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,IACxB,CAAC;AACD,WAAO;AAAA,EACX;AAAA,EAEA,WAAW,OAAoC;AAC3C,WAAO,KAAK,SAAS,IAAI,KAAK;AAAA,EAClC;AAAA,EAEA,kBAAkB,OAAqB;AACnC,SAAK,SAAS,OAAO,KAAK;AAAA,EAC9B;AAAA,EAEA,kBAAkB;AAEd,SAAK,SAAS,WAAW;AAAA,EAC7B;AACJ;;;ACtCA,OAAOE,aAAY;AAIZ,IAAM,kBAAN,MAA+C;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,QAAgB,UAA8B;AACtD,SAAK,SAAS;AACd,SAAK,WAAW;AAChB,SAAK,gBAAgB,IAAI,qBAAqB,MAAM;AACpD,SAAK,iBAAiB,IAAI,eAAe,MAAM;AAAA,EACnD;AAAA,EAEA,aAAa,MAAoD;AAI7D,QAAI,CAAC,QAAQ,KAAK,SAAS,OAAO,MAAM;AACpC,aAAO,EAAE,OAAO,OAAO,SAAS,sCAAsC;AAAA,IAC1E;AACA,WAAO,EAAE,OAAO,KAAK;AAAA,EACzB;AAAA,EAEA,MAAM,YAAY,KAAiF;AAC/F,WAAO,KAAK,cAAc,YAAY,GAAG;AAAA,EAC7C;AAAA,EAEA,eAAe,KAAsB;AACjC,WAAO,KAAK,cAAc,eAAe,GAAG;AAAA,EAChD;AAAA,EAEA,iBAAiB,OAAwB;AAErC,QAAI,CAAC,KAAK,UAAU;AAChB,aAAO;AAAA,IACX;AAEA,UAAM,WAAW,OAAO,KAAK,KAAK,QAAQ;AAC1C,UAAM,SAAS,OAAO,KAAK,KAAK;AAEhC,QAAI,SAAS,WAAW,OAAO,UAAUA,QAAO,gBAAgB,UAAU,MAAM,GAAG;AAC/E,aAAO;AAAA,IACX;AAEA,WAAO,CAAC,CAAC,KAAK,eAAe,WAAW,KAAK;AAAA,EACjD;AAAA,EAEA,cAAc,cAAiC;AAC3C,WAAO,KAAK,eAAe,cAAc,YAAY;AAAA,EACzD;AAAA,EAEA,WAAW,OAAoC;AAC3C,WAAO,KAAK,eAAe,WAAW,KAAK;AAAA,EAC/C;AAAA,EAEA,kBAAkB,OAAqB;AACnC,SAAK,eAAe,kBAAkB,KAAK;AAAA,EAC/C;AAAA,EAGA,cAAkC;AAC9B,WAAO,KAAK;AAAA,EAChB;AACJ;;;ACxEA,SAAS,eAAe;AACxB,SAAS,mCAAmC;AAC5C,SAAS,0BAA0B;AACnC,SAAS,8BAA8B;AACvC,SAAS,kCAAkC;AAC3C,SAAS,2BAA2B;AAE7B,IAAM,cAAN,MAAkB;AAAA,EAGrB,YAAoB,QAAa;AAAb;AAAA,EAAe;AAAA,EAF3B,MAAsB;AAAA,EAI9B,MAAM,QAAQ;AACV,SAAK,MAAM,IAAI,QAAQ;AAAA,MACnB,UAAU,uBAAuB;AAAA,QAC7B,CAAC,2BAA2B,YAAY,GAAG;AAAA,MAC/C,CAAC;AAAA,MACD,cAAc,IAAI,mBAAmB;AAAA,QACjC,MAAM;AAAA;AAAA,MACV,CAAC;AAAA,MACD,kBAAkB;AAAA,QACd,4BAA4B;AAAA,QAC5B,IAAI,oBAAoB;AAAA,MAC5B;AAAA,IACJ,CAAC;AAED,QAAI;AACA,YAAM,KAAK,IAAI,MAAM;AACrB,WAAK,OAAO,KAAK,2BAA2B;AAAA,IAChD,SAAS,OAAO;AACZ,WAAK,OAAO,MAAM,EAAE,MAAM,GAAG,kCAAkC;AAAA,IACnE;AAAA,EACJ;AAAA,EAEA,MAAM,WAAW;AACb,QAAI,KAAK,KAAK;AACV,YAAM,KAAK,IAAI,SAAS;AACxB,WAAK,OAAO,KAAK,6BAA6B;AAAA,IAClD;AAAA,EACJ;AACJ;;;ACxCA,SAAS,OAAO,YAAY;AAC5B,SAAS,iBAAiB;AAE1B,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,gBAAgB;AACzB,SAAS,iBAAAC,sBAAqB;;;ACN9B,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AACf,SAAS,qBAAqB;AAE9B,IAAM,YAAYD,MAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAgBtD,SAAS,iBAAiB,UAA0B;AACvD,QAAM,aAAa;AAAA;AAAA,IAEfA,MAAK,QAAQ,WAAW,aAAa,QAAQ;AAAA;AAAA,IAE7CA,MAAK,QAAQ,WAAW,YAAY,QAAQ;AAAA;AAAA,IAE5CA,MAAK,QAAQ,WAAW,gBAAgB,QAAQ;AAAA;AAAA,IAEhDA,MAAK,QAAQ,QAAQ,IAAI,GAAG,UAAU,QAAQ;AAAA;AAAA,IAE9CA,MAAK,QAAQ,QAAQ,IAAI,GAAG,eAAe,QAAQ;AAAA,EACvD;AAEA,aAAW,aAAa,YAAY;AAChC,QAAIC,IAAG,WAAW,SAAS,GAAG;AAC1B,aAAO;AAAA,IACX;AAAA,EACJ;AAEA,QAAM,IAAI,MAAM,oBAAoB,QAAQ,oBAAoB,WAAW,KAAK,IAAI,CAAC,EAAE;AAC3F;;;ADvCA,IAAM,YAAY,UAAU,IAAI;AAUhC,IAAMC,aAAYC,MAAK,QAAQC,eAAc,YAAY,GAAG,CAAC;AAatD,IAAM,eAAN,MAAuC;AAAA,EAClC,cAAsB;AAAA;AAAA;AAAA;AAAA,EAItB,kBAAkB,oBAAI,IAAS;AAAA,EAC/B;AAAA,EAER,YAAY,yBAAyB,IAAI;AACrC,SAAK,yBAAyB;AAAA,EAClC;AAAA,EAEQ,UAAkB;AACtB,QAAI,KAAK,YAAa,QAAO,KAAK;AAClC,QAAI;AACA,YAAM,YAAY,iBAAiB,cAAc;AACjD,WAAK,cAAcC,IAAG,aAAa,WAAW,OAAO;AACrD,aAAO,KAAK;AAAA,IAChB,SAAS,KAAU;AACf,YAAM,IAAI,MAAM,6BAA6B,IAAI,OAAO,EAAE;AAAA,IAC9D;AAAA,EACJ;AAAA,EAEA,MAAM,QAAQ,MAAc,QAAwB,SAA2B,QAAmD;AAC9H,UAAM,EAAE,OAAO,IAAI;AAGnB,QAAI,KAAK,gBAAgB,QAAQ,KAAK,wBAAwB;AAC1D,aAAO;AAAA,QACH,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,OAAO;AAAA,UACH;AAAA,UACA,SAAS;AAAA,QACb;AAAA,MACJ;AAAA,IACJ;AAEA,QAAI,SAAS;AACb,QAAI,SAAS;AACb,QAAI,mBAAmB;AACvB,QAAI,kBAAkB;AACtB,QAAI,eAAe;AAEnB,QAAI,OAAO,KAAK,QAAQ,EACnB,QAAQ,2BAA2B,QAAQ,cAAc,EAAE,EAC3D,QAAQ,yBAAyB,QAAQ,YAAY,EAAE;AAE5D,QAAI,KAAK,SAAS,yBAAyB,GAAG;AAC1C,YAAM,IAAI,MAAM,6CAA6C;AAAA,IACjE;AACA,QAAI,KAAK,SAAS,uBAAuB,GAAG;AACxC,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC/D;AAGA,QAAI,QAAQ,SAAS;AACjB,aAAO,KAAK,QAAQ,gCAAgC,OAAO,OAAO;AAClE,UAAI,KAAK,SAAS,8BAA8B,GAAG;AAE/C,cAAM,IAAI,MAAM,0CAA0C;AAAA,MAC9D;AAAA,IACJ;AAEA,UAAM,WAAW,OAAO,OAAO;AAI/B,UAAM,OAAO;AAAA,MACT;AAAA,MACA,8BAA8B,OAAO,aAAa;AAAA,IACtD;AAKA,QAAI,QAAQ,cAAc,CAAC,OAAO,WAAW,SAAS,GAAG,KAAK,CAAC,OAAO,WAAW,SAAS,IAAI,GAAG;AAC7F,UAAI;AAGA,cAAM,MAAM,IAAI,IAAI,UAAU,OAAO,UAAU,EAAE;AACjD,YAAI,iBAAiB,IAAI;AAGzB,yBAAiB,eAAe,QAAQ,WAAW,EAAE;AAErD,YAAI,mBAAmB,aAAa,mBAAmB,QAAQ,mBAAmB,SAAS,mBAAmB,IAAI;AAC9G,2BAAiB;AAAA,QACrB;AACA,aAAK,KAAK,eAAe,cAAc,EAAE;AAAA,MAC7C,SAAS,KAAK;AAEV,eAAO,KAAK,EAAE,SAAS,OAAO,YAAY,IAAI,GAAG,kDAAkD;AAAA,MACvG;AAAA,IACJ,OAAO;AAAA,IAEP;AAEA,SAAK,KAAK,GAAG;AAGb,UAAM,QAAQ,MAAM,QAAQ,MAAM;AAAA,MAC9B,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAC9B,KAAK;AAAA,QACD,MAAM,QAAQ,IAAI;AAAA,QAClB,MAAM,QAAQ,IAAI;AAAA,QAClB,QAAQ,QAAQ,IAAI;AAAA,MACxB;AAAA,IACJ,CAAC;AAED,SAAK,gBAAgB,IAAI,KAAK;AAE9B,UAAM,GAAG,SAAS,MAAM;AAAA,IAExB,CAAC;AAED,UAAM,iBAAiB,MAAM;AACzB,WAAK,gBAAgB,OAAO,KAAK;AAAA,IACrC;AAEA,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC5B,YAAM,UAAU,WAAW,MAAM;AAC7B,YAAI,CAAC,cAAc;AACf,yBAAe;AACf,cAAI,OAAQ,oBAA4B,YAAa,eAAc,eAAe;AAClF,gBAAM,KAAK,SAAS;AACpB,iBAAO,KAAK,mCAAmC;AAC/C,yBAAe;AACf,kBAAQ;AAAA,YACJ;AAAA,YACA;AAAA,YACA,UAAU;AAAA,YACV,OAAO;AAAA,cACH;AAAA,cACA,SAAS;AAAA,YACb;AAAA,UACJ,CAAC;AAAA,QACL;AAAA,MACJ,GAAG,OAAO,SAAS;AAInB,YAAM,YAAY,SAAS,MAAM;AACjC,YAAM,kBAAkB,YAAY,YAAY;AAC5C,YAAI,gBAAgB,CAAC,MAAM,KAAK;AAC5B,wBAAc,eAAe;AAC7B;AAAA,QACJ;AACA,YAAI;AACA,cAAI,QAAQ;AACZ,cAAI,WAAW;AACX,gBAAI;AAGA,oBAAM,EAAE,QAAQ,YAAY,IAAI,MAAM,UAAU,wBAAwB,MAAM,GAAG,eAAe;AAChG,oBAAM,QAAQ,YAAY,MAAM,eAAe;AAC/C,kBAAI,OAAO;AAEP,sBAAM,SAAS,MAAM,CAAC,EAAE,QAAQ,UAAU,EAAE;AAC5C,sBAAM,QAAQ,SAAS,QAAQ,EAAE;AACjC,oBAAI,CAAC,MAAM,KAAK,GAAG;AACf,0BAAQ,QAAQ;AAAA,gBACpB;AAAA,cACJ;AAAA,YACJ,SAAS,GAAG;AAAA,YAEZ;AAAA,UACJ,OAAO;AAEH,kBAAM,EAAE,QAAQ,UAAU,IAAI,MAAM,UAAU,iBAAiB,MAAM,GAAG,EAAE;AAC1E,kBAAM,QAAQ,SAAS,UAAU,KAAK,CAAC;AACvC,gBAAI,CAAC,MAAM,KAAK,GAAG;AACf,sBAAQ,QAAQ;AAAA,YACpB;AAAA,UACJ;AAEA,cAAI,QAAQ,OAAO,eAAe;AAC9B,2BAAe;AACf,gBAAI,OAAQ,oBAA4B,YAAa,eAAc,eAAe;AAClF,kBAAM,KAAK,SAAS;AACpB,mBAAO,KAAK,EAAE,OAAO,SAAS,OAAO,cAAc,GAAG,uCAAuC;AAC7F,2BAAe;AACf,oBAAQ;AAAA,cACJ;AAAA,cACA;AAAA,cACA,UAAU;AAAA,cACV,OAAO;AAAA,gBACH;AAAA,gBACA,SAAS,0BAA0B,MAAM,QAAQ,CAAC,CAAC,QAAQ,OAAO,aAAa;AAAA,cACnF;AAAA,YACJ,CAAC;AAAA,UACL;AAAA,QACJ,SAAS,KAAK;AAEV,wBAAc,eAAe;AAAA,QACjC;AAAA,MACJ,GAAG,GAAI;AAEP,YAAM,OAAO,GAAG,QAAQ,CAAC,UAAkB;AACvC,YAAI,aAAc;AAElB,4BAAoB,MAAM;AAC1B,cAAM,YAAY,MAAM,SAAS,EAAE,MAAM,KAAK,KAAK,CAAC,GAAG;AACvD,2BAAmB;AAEnB,YAAI,mBAAmB,OAAO,kBAAkB,kBAAkB,OAAO,eAAe;AACpF,yBAAe;AACf,cAAI,OAAQ,oBAA4B,YAAa,eAAc,eAAe;AAClF,gBAAM,KAAK,SAAS;AACpB,iBAAO,KAAK,EAAE,OAAO,kBAAkB,OAAO,gBAAgB,GAAG,+BAA+B;AAChG,yBAAe;AACf,kBAAQ;AAAA,YACJ,QAAQ,SAAS,MAAM,SAAS,EAAE,MAAM,GAAG,OAAO,kBAAkB,mBAAmB,MAAM,OAAO;AAAA,YACpG;AAAA,YACA,UAAU;AAAA,YACV,OAAO;AAAA,cACH,MAAM,mBAAmB,OAAO;AAAA,cAChC,SAAS,mBAAmB,OAAO,iBAAiB,0BAA0B;AAAA,YAClF;AAAA,UACJ,CAAC;AACD;AAAA,QACJ;AACA,kBAAU,MAAM,SAAS;AAAA,MAC7B,CAAC;AAED,YAAM,OAAO,GAAG,QAAQ,CAAC,UAAkB;AACvC,YAAI,aAAc;AAElB,4BAAoB,MAAM;AAC1B,cAAM,YAAY,MAAM,SAAS,EAAE,MAAM,KAAK,KAAK,CAAC,GAAG;AACvD,2BAAmB;AAEnB,YAAI,mBAAmB,OAAO,kBAAkB,kBAAkB,OAAO,eAAe;AACpF,yBAAe;AACf,cAAI,OAAQ,oBAA4B,YAAa,eAAc,eAAe;AAClF,gBAAM,KAAK,SAAS;AACpB,iBAAO,KAAK,EAAE,OAAO,kBAAkB,OAAO,gBAAgB,GAAG,+BAA+B;AAChG,yBAAe;AACf,kBAAQ;AAAA,YACJ;AAAA,YACA,QAAQ,SAAS,MAAM,SAAS,EAAE,MAAM,GAAG,OAAO,kBAAkB,mBAAmB,MAAM,OAAO;AAAA,YACpG,UAAU;AAAA,YACV,OAAO;AAAA,cACH,MAAM,mBAAmB,OAAO;AAAA,cAChC,SAAS,mBAAmB,OAAO,iBAAiB,0BAA0B;AAAA,YAClF;AAAA,UACJ,CAAC;AACD;AAAA,QACJ;AACA,kBAAU,MAAM,SAAS;AAAA,MAC7B,CAAC;AAED,YAAM,GAAG,SAAS,CAACC,UAAS;AACxB,qBAAa,OAAO;AACpB,YAAI,OAAQ,oBAA4B,YAAa,eAAc,eAAe;AAClF,uBAAe;AACf,YAAI,aAAc;AAElB,gBAAQ;AAAA,UACJ;AAAA,UACA;AAAA,UACA,UAAUA;AAAA,QACd,CAAC;AAAA,MACL,CAAC;AAED,YAAM,GAAG,SAAS,CAAC,QAAa;AAC5B,qBAAa,OAAO;AACpB,eAAO,MAAM,EAAE,IAAI,GAAG,qBAAqB;AAC3C,uBAAe;AAEf,YAAI,UAAU,IAAI;AAClB,YAAI,IAAI,SAAS,UAAU;AACvB,oBAAU;AAAA,QACd;AAEA,gBAAQ;AAAA,UACJ;AAAA,UACA;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,YACH;AAAA,YACA;AAAA,UACJ;AAAA,QACJ,CAAC;AAAA,MACL,CAAC;AAGD,YAAM,MAAM,MAAM,QAAQ;AAC1B,YAAM,MAAM,IAAI;AAAA,IACpB,CAAC;AAAA,EACL;AAAA,EAEA,MAAM,WAAW;AACb,eAAW,SAAS,KAAK,iBAAiB;AACtC,UAAI;AACA,cAAM,KAAK,SAAS;AAAA,MACxB,SAAS,KAAK;AAAA,MAEd;AAAA,IACJ;AACA,SAAK,gBAAgB,MAAM;AAAA,EAC/B;AAAA,EAEA,MAAM,cAA4D;AAC9D,QAAI;AACA,YAAM,EAAE,OAAO,IAAI,MAAM,UAAU,gBAAgB;AACnD,aAAO,EAAE,QAAQ,MAAM,QAAQ,OAAO,MAAM,IAAI,EAAE,CAAC,EAAE;AAAA,IACzD,SAAS,KAAU;AACf,aAAO,EAAE,QAAQ,SAAS,QAAQ,IAAI,QAAQ;AAAA,IAClD;AAAA,EACJ;AAAA,EAEA,MAAM,SAAwB;AAAA,EAE9B;AACJ;;;AErVA,SAAS,cAAc;AACvB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,iBAAAC,sBAAqB;AAM9B,IAAMC,aAAYC,MAAK,QAAQC,eAAc,YAAY,GAAG,CAAC;AAqBtD,IAAM,kBAAN,MAA0C;AAAA,EACrC,cAAsB;AAAA,EACtB,OAAuB,CAAC;AAAA,EACxB;AAAA,EACA,mBAAmB;AAAA,EAE3B,YAAY,cAAc,GAAG;AACzB,SAAK,cAAc;AAAA,EACvB;AAAA,EAEQ,UAAkB;AACtB,QAAI,KAAK,YAAa,QAAO,KAAK;AAClC,QAAI;AACA,YAAM,YAAY,iBAAiB,gBAAgB;AACnD,WAAK,cAAcC,IAAG,aAAa,WAAW,OAAO;AACrD,aAAO,KAAK;AAAA,IAChB,SAAS,KAAU;AACf,YAAM,IAAI,MAAM,+BAA+B,IAAI,OAAO,EAAE;AAAA,IAChE;AAAA,EACJ;AAAA,EAEQ,YAAmD,CAAC;AAAA,EAE5D,MAAc,UAAU,QAAa,QAAuD;AAExF,QAAI,SAAS,KAAK,KAAK,KAAK,OAAK,CAAC,EAAE,IAAI;AACxC,QAAI,QAAQ;AACR,aAAO,OAAO;AACd,aAAO;AAAA,IACX;AAGA,QAAI,KAAK,KAAK,SAAS,KAAK,aAAa;AACrC,aAAO,KAAK,sCAAsC;AAClD,YAAM,SAAS,KAAK,aAAa,MAAM;AACvC,eAAS,EAAE,QAAQ,MAAM,MAAM,MAAM,GAAG,UAAU,KAAK,IAAI,EAAE;AAC7D,WAAK,KAAK,KAAK,MAAM;AAGrB,YAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AACzC,cAAM,YAAY,CAAC,QAAa;AAC5B,cAAI,IAAI,SAAS,SAAS;AACtB,mBAAO,IAAI,WAAW,SAAS;AAC/B,oBAAQ;AAAA,UACZ;AAAA,QACJ;AACA,eAAO,GAAG,WAAW,SAAS;AAC9B,eAAO,GAAG,SAAS,MAAM;AACzB,mBAAW,MAAM;AAEb,iBAAO,UAAU;AACjB,eAAK,OAAO,KAAK,KAAK,OAAO,OAAK,MAAM,MAAM;AAC9C,iBAAO,IAAI,MAAM,qBAAqB,CAAC;AAAA,QAC3C,GAAG,GAAK;AAAA,MACZ,CAAC;AAED,aAAO;AAAA,IACX;AAGA,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC5B,WAAK,UAAU,KAAK,OAAO;AAAA,IAC/B,CAAC;AAAA,EACL;AAAA,EAEQ,aAAa,QAAwC;AACzD,UAAM,aAAa;AAAA,MACfC,MAAK,QAAQC,YAAW,qBAAqB;AAAA,MAC7CD,MAAK,QAAQC,YAAW,qBAAqB;AAAA,MAC7CD,MAAK,QAAQC,YAAW,+BAA+B;AAAA,MACvDD,MAAK,QAAQC,YAAW,+BAA+B;AAAA,IAC3D;AACA,UAAM,aAAa,WAAW,KAAK,OAAKF,IAAG,WAAW,CAAC,CAAC;AACxD,QAAI,CAAC,YAAY;AACb,YAAM,IAAI,MAAM,oCAAoC,WAAW,KAAK,IAAI,CAAC,EAAE;AAAA,IAC/E;AAEA,WAAO,IAAI,OAAO,YAAY;AAAA,MAC1B,UAAU,QAAQ,SAAS,SAAS,UAAU,IAAI,QAAQ,WAAW,CAAC;AAAA,MACtE,gBAAgB,SAAS;AAAA,QACrB,mBAAmB,OAAO;AAAA;AAAA,MAE9B,IAAW;AAAA,IACf,CAAC;AAAA,EACL;AAAA,EAEA,MAAM,OAAO,QAA+B;AAExC,UAAM,SAAS,KAAK,cAAc,KAAK,KAAK;AAC5C,QAAI,UAAU,EAAG;AAEjB,YAAQ,MAAM,eAAe,MAAM,qBAAqB;AACxD,UAAM,WAAW,CAAC;AAClB,aAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC7B,eAAS,KAAK,KAAK,oBAAoB,MAAM,CAAC;AAAA,IAClD;AACA,UAAM,QAAQ,IAAI,QAAQ;AAC1B,YAAQ,MAAM,gCAAgC,KAAK,KAAK,MAAM,WAAW;AAAA,EAC7E;AAAA,EAEA,MAAc,oBAAoB,QAA+B;AAE7D,QAAI,KAAK,KAAK,UAAU,KAAK,YAAa;AAE1C,UAAM,SAAS,KAAK,aAAa,MAAM;AACvC,UAAM,SAAuB,EAAE,QAAQ,MAAM,MAAM,MAAM,GAAG,UAAU,KAAK,IAAI,EAAE;AACjF,SAAK,KAAK,KAAK,MAAM;AAGrB,QAAI;AACA,YAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AACzC,cAAM,YAAY,CAAC,QAAa;AAC5B,cAAI,IAAI,SAAS,SAAS;AACtB,mBAAO,IAAI,WAAW,SAAS;AAC/B,oBAAQ;AAAA,UACZ;AAAA,QACJ;AACA,eAAO,GAAG,WAAW,SAAS;AAC9B,eAAO,GAAG,SAAS,MAAM;AACzB,mBAAW,MAAM,OAAO,IAAI,MAAM,qBAAqB,CAAC,GAAG,GAAK;AAAA,MACpE,CAAC;AACD,aAAO,OAAO;AAGd,UAAI,KAAK,UAAU,SAAS,GAAG;AAC3B,cAAM,cAAc,KAAK,UAAU,MAAM;AACzC,YAAI,aAAa;AACb,iBAAO,OAAO;AACd,sBAAY,MAAM;AAAA,QACtB;AAAA,MACJ;AAAA,IACJ,SAAS,KAAK;AAEV,WAAK,OAAO,KAAK,KAAK,OAAO,OAAK,MAAM,MAAM;AAC9C,aAAO,UAAU;AAAA,IACrB;AAAA,EACJ;AAAA,EAEA,MAAM,QAAQ,MAAc,QAA+B,SAA2B,QAAmD;AACrI,UAAM,EAAE,OAAO,IAAI;AACnB,UAAM,eAAe,MAAM,KAAK,UAAU,QAAQ,MAAM;AACxD,UAAM,SAAS,aAAa;AAE5B,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC5B,YAAM,UAAU,WAAW,MAAM;AAC7B,eAAO,KAAK,gDAAgD;AAC5D,eAAO,UAAU;AAEjB,aAAK,OAAO,KAAK,KAAK,OAAO,OAAK,MAAM,YAAY;AACpD,gBAAQ;AAAA,UACJ,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,YACH;AAAA,YACA,SAAS;AAAA,UACb;AAAA,QACJ,CAAC;AAAA,MACL,GAAG,OAAO,SAAS;AAEnB,YAAM,YAAY,CAAC,QAAa;AAC5B,YAAI,IAAI,SAAS,WAAW,IAAI,SAAS,OAAQ;AAEjD,qBAAa,OAAO;AACpB,eAAO,IAAI,WAAW,SAAS;AAC/B,eAAO,IAAI,SAAS,OAAO;AAE3B,qBAAa,OAAO;AAGpB,YAAI,KAAK,UAAU,SAAS,GAAG;AAC3B,gBAAM,cAAc,KAAK,UAAU,MAAM;AACzC,cAAI,aAAa;AACb,yBAAa,OAAO;AACpB,wBAAY,YAAY;AAAA,UAC5B;AAAA,QACJ;AAEA,qBAAa;AACb,qBAAa,WAAW,KAAK,IAAI;AAGjC,YAAI,aAAa,QAAQ,KAAK,kBAAkB;AAC5C,iBAAO,KAAK,yCAAyC;AACrD,iBAAO,UAAU;AACjB,eAAK,OAAO,KAAK,KAAK,OAAO,OAAK,MAAM,YAAY;AAAA,QACxD;AAEA,YAAI,IAAI,SAAS;AACb,kBAAQ;AAAA,YACJ,QAAQ,IAAI;AAAA,YACZ,QAAQ,IAAI;AAAA,YACZ,UAAU;AAAA,UACd,CAAC;AAAA,QACL,OAAO;AACH,iBAAO,KAAK,EAAE,OAAO,IAAI,MAAM,GAAG,+DAA+D;AACjG,iBAAO,UAAU;AACjB,eAAK,OAAO,KAAK,KAAK,OAAO,OAAK,MAAM,YAAY;AAEpD,iBAAO,MAAM,EAAE,OAAO,IAAI,MAAM,GAAG,oCAAoC;AACvE,gBAAM,mBAAmB,IAAI,SAAS,IAAI,YAAY;AACtD,gBAAM,gBAAgB,IAAI,iBAAiB;AAE3C,gBAAM,aAAa,kBAAkB,SAAS,gBAAgB,SAAS,aAAa;AACpF,gBAAM,gBAAgB,kBAAkB,YAAY,gBAAgB,SAAS,gBAAgB;AAC7F,gBAAM,mBAAmB,CAAC,iBAAiB,CAAC,eAAe,gBAAgB,SAAS,WAAW,KAAK,gBAAgB,SAAS,UAAU,KAAK,gBAAgB,SAAS,gBAAgB;AAErL,kBAAQ;AAAA,YACJ,QAAQ,IAAI;AAAA,YACZ,QAAQ,IAAI;AAAA,YACZ,UAAU;AAAA,YACV,OAAO;AAAA,cACH,MAAM,6CAA+C,iBAAiB;AAAA,cACtE,SAAS,aAAa,6BAA+B,iBAAiB,mBAAoB,0BAA0B,IAAI;AAAA,YAC5H;AAAA,UACJ,CAAC;AAAA,QACL;AAAA,MACJ;AAEA,YAAM,UAAU,CAAC,QAAa;AAC1B,qBAAa,OAAO;AACpB,eAAO,IAAI,WAAW,SAAS;AAC/B,eAAO,IAAI,SAAS,OAAO;AAE3B,eAAO,MAAM,EAAE,IAAI,GAAG,sBAAsB;AAC5C,eAAO,UAAU;AACjB,aAAK,OAAO,KAAK,KAAK,OAAO,OAAK,MAAM,YAAY;AAEpD,gBAAQ;AAAA,UACJ,QAAQ;AAAA,UACR,QAAQ,IAAI;AAAA,UACZ,UAAU;AAAA,UACV,OAAO;AAAA,YACH;AAAA,YACA,SAAS,IAAI;AAAA,UACjB;AAAA,QACJ,CAAC;AAAA,MACL;AAEA,aAAO,GAAG,WAAW,SAAS;AAC9B,aAAO,GAAG,SAAS,OAAO;AAG1B,UAAI,OAAO,KAAK,QAAQ;AACxB,UAAI,QAAQ,SAAS;AACjB,eAAO,KAAK,QAAQ,+BAA+B,OAAO,OAAO;AAAA,MACrE;AAEA,aAAO,YAAY;AAAA,QACf,MAAM;AAAA,QACN,MAAM,EAAE,MAAM,QAAQ,SAAS,QAAQ,KAAK;AAAA,MAChD,CAAC;AAAA,IACL,CAAC;AAAA,EACL;AAAA,EAEA,MAAM,WAAW;AACb,eAAW,UAAU,KAAK,MAAM;AAC5B,YAAM,OAAO,OAAO,UAAU;AAAA,IAClC;AACA,SAAK,OAAO,CAAC;AAAA,EACjB;AAAA,EAEA,MAAM,cAA6E;AAC/E,QAAI;AAEA,YAAM,SAAS,MAAM,KAAK,UAAU,SAAS;AAAA,QACzC,WAAW;AAAA,QACX,eAAe;AAAA,QACf,gBAAgB;AAAA,QAChB,eAAe;AAAA,MACnB,CAAC;AAED,aAAO,IAAI,QAAQ,CAAC,YAAY;AAC5B,YAAI;AAEJ,cAAM,YAAY,CAAC,QAAa;AAC5B,cAAI,IAAI,SAAS,QAAQ;AACrB,oBAAQ;AACR,mBAAO,OAAO;AACd,oBAAQ,EAAE,QAAQ,MAAM,SAAS,KAAK,KAAK,OAAO,CAAC;AAAA,UACvD;AAAA,QACJ;AAEA,cAAM,UAAU,MAAM;AAClB,uBAAa,OAAO;AACpB,iBAAO,OAAO,IAAI,WAAW,SAAS;AAAA,QAC1C;AAEA,kBAAU,WAAW,MAAM;AACvB,kBAAQ;AACR,iBAAO,OAAO;AACd,kBAAQ,EAAE,QAAQ,SAAS,SAAS,KAAK,KAAK,QAAQ,QAAQ,uBAAuB,CAAC;AAAA,QAC1F,GAAG,GAAI;AAEP,eAAO,OAAO,GAAG,WAAW,SAAS;AACrC,eAAO,OAAO,YAAY,EAAE,MAAM,OAAO,CAAC;AAAA,MAC9C,CAAC;AAAA,IACL,SAAS,KAAU;AACf,aAAO,EAAE,QAAQ,SAAS,SAAS,KAAK,KAAK,QAAQ,QAAQ,IAAI,QAAQ;AAAA,IAC7E;AAAA,EACJ;AACJ;;;AC3UA,OAAO,SAAS;AAmBT,IAAM,kBAAN,MAA0C;AAAA,EACrC;AAAA,EACA;AAAA,EAER,YAAY,QAAgB,gBAAgC;AACxD,SAAK,SAAS;AACd,SAAK,iBAAiB;AAAA,EAC1B;AAAA,EAEA,MAAM,QACF,MACA,QACA,SACA,QACwB;AACxB,UAAM,OAAiB,CAAC;AACxB,UAAM,SAAmB,CAAC;AAC1B,QAAI,UAA8B;AAElC,QAAI;AAEA,gBAAU,IAAI,IAAI,QAAQ,EAAE,aAAa,OAAO,cAAc,CAAC;AAC/D,YAAM,MAAM,MAAM,QAAQ,cAAc;AACxC,YAAM,OAAO,IAAI;AAEjB,UAAI,kBAAkB;AACtB,UAAI,oBAAoB;AAIxB,YAAM,KAAK,IAAI,SAAS,IAAI,IAAI,SAAS,CAAC,QAAgB;AACtD,YAAI,kBAAkB,IAAI,SAAS,IAAI,OAAO,gBAAgB;AAG1D,gBAAM,IAAI,MAAM,aAAa;AAAA,QACjC;AACA,YAAI,kBAAkB,OAAO,gBAAgB;AACzC,eAAK,KAAK,GAAG;AACb,6BAAmB,IAAI,SAAS;AAAA,QACpC;AAAA,MACJ,CAAC,CAAC;AACF,YAAM,KAAK,IAAI,WAAW,IAAI,IAAI,SAAS,CAAC,QAAgB;AACxD,YAAI,oBAAoB,IAAI,SAAS,IAAI,OAAO,gBAAgB;AAC5D,gBAAM,IAAI,MAAM,gBAAgB;AAAA,QACpC;AACA,YAAI,oBAAoB,OAAO,gBAAgB;AAC3C,iBAAO,KAAK,GAAG;AACf,+BAAqB,IAAI,SAAS;AAAA,QACtC;AAAA,MACJ,CAAC,CAAC;AAGF,UAAI,mBAAmB;AACvB,YAAM,mBAAmB,oBAAI,IAA0B;AAEvD,YAAM,KAAK,IAAI,sBAAsB,IAAI,IAAI,SAAS,CAAC,SAAiB,YAAoB;AACxF,cAAM,YAAY,EAAE;AACpB,cAAM,OAAO;AACb,YAAI,OAAO,CAAC;AACZ,YAAI;AACA,iBAAO,KAAK,MAAM,OAAO;AAAA,QAC7B,SAAS,GAAG;AAAA,QAEZ;AAGA,aAAK,eAAe,SAAS,MAAM,MAAM,OAAO,EAC3C,KAAK,SAAO;AAET,iBAAO,IAAI,YAAY,gCAAgC,CAAC,WAAW,KAAK,UAAU,GAAG,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,KAAK,EAAE,CAAC;AAAA,QAC1H,CAAC,EACA,MAAM,SAAO;AACV,iBAAO,IAAI,YAAY,gCAAgC,CAAC,WAAW,IAAI,WAAW,eAAe,GAAG,EAAE,WAAW,EAAE,MAAM,KAAK,EAAE,CAAC;AAAA,QACrI,CAAC,EACA,MAAM,OAAK;AAAA,QAEZ,CAAC;AAEL,eAAO;AAAA,MACX,CAAC,CAAC;AAGF,YAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgClB,YAAM,kBAAkB,MAAM,QAAQ,cAAc,SAAS;AAC7D,YAAM,gBAAgB,IAAI,KAAK,EAAE,SAAS,IAAK,CAAC;AAGhD,YAAM,YAAY,QAAQ,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQrC,YAAM,cAAc,MAAM,QAAQ,cAAc,SAAS;AACzD,YAAM,YAAY,IAAI,KAAK,EAAE,SAAS,IAAK,CAAC;AAI5C,UAAI;AACJ,YAAM,mBAAmB,IAAI,QAAc,CAAC,YAAY;AACpD,kCAA0B;AAAA,MAC9B,CAAC;AACD,YAAM,KAAK,IAAI,UAAU,IAAI,IAAI,SAAS,MAAM;AAC5C,YAAI,wBAAyB,yBAAwB;AAAA,MACzD,CAAC,CAAC;AAEF,UAAI,eAAe;AACnB,YAAM,KAAK,IAAI,eAAe,IAAI,IAAI,SAAS,MAAM;AACjD,uBAAe;AAAA,MACnB,CAAC,CAAC;AAKF,YAAM,cAAc;AAAA;AAAA,sBAEV,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASd,YAAM,SAAS,MAAM,QAAQ,cAAc,WAAW;AAQtD,YAAM,OAAO,IAAI,KAAK,EAAE,SAAS,OAAO,UAAU,CAAC;AAGnD,UAAI,WAAW;AACf,YAAM,iBAAiB,IAAI,QAAc,CAAC,GAAG,WAAW;AACpD,mBAAW,MAAM;AACb,qBAAW;AACX,iBAAO,IAAI,MAAM,4BAA4B,CAAC;AAAA,QAClD,GAAG,OAAO,SAAS;AAAA,MACvB,CAAC;AAED,UAAI;AACA,cAAM,QAAQ,KAAK,CAAC,kBAAkB,cAAc,CAAC;AAAA,MACzD,SAAS,KAAU;AACf,YAAI,IAAI,YAAY,8BAA8B;AAC9C,iBAAO;AAAA,YACH,QAAQ,KAAK,KAAK,IAAI;AAAA,YACtB,QAAQ,OAAO,KAAK,IAAI;AAAA,YACxB,UAAU;AAAA,YACV,OAAO;AAAA,cACH;AAAA,cACA,SAAS;AAAA,YACb;AAAA,UACJ;AAAA,QACJ;AACA,cAAM;AAAA,MACV;AAEA,aAAO;AAAA,QACH,QAAQ,KAAK,KAAK,IAAI;AAAA,QACtB,QAAQ,OAAO,KAAK,IAAI;AAAA,QACxB,UAAU,eAAe,IAAI;AAAA,MACjC;AAAA,IACJ,SAAS,KAAU;AACf,YAAM,UAAU,IAAI,WAAW;AAG/B,UAAI,QAAQ,SAAS,4BAA4B,GAAG;AAChD,eAAO;AAAA,UACH,QAAQ,KAAK,KAAK,IAAI;AAAA,UACtB,QAAQ,OAAO,KAAK,IAAI;AAAA,UACxB,UAAU;AAAA,UACV,OAAO;AAAA,YACH;AAAA,YACA,SAAS;AAAA,UACb;AAAA,QACJ;AAAA,MACJ;AAEA,UAAI,QAAQ,SAAS,cAAc,KAAK,QAAQ,SAAS,UAAU,GAAG;AAClE,eAAO;AAAA,UACH,QAAQ,KAAK,KAAK,IAAI;AAAA,UACtB,QAAQ,OAAO,KAAK,IAAI;AAAA,UACxB,UAAU;AAAA,UACV,OAAO;AAAA,YACH;AAAA,YACA,SAAS;AAAA,UACb;AAAA,QACJ;AAAA,MACJ;AAEA,WAAK,OAAO,MAAM,EAAE,IAAI,GAAG,0BAA0B;AACrD,aAAO;AAAA,QACH,QAAQ,KAAK,KAAK,IAAI;AAAA,QACtB,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,OAAO;AAAA,UACH;AAAA,UACA;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,UAAE;AACE,UAAI,SAAS;AACT,gBAAQ,QAAQ;AAAA,MACpB;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAM,WAA0B;AAAA,EAEhC;AAAA,EAEA,MAAM,cAA4D;AAC9D,QAAI;AACA,YAAM,UAAU,IAAI,IAAI,QAAQ,EAAE,aAAa,EAAE,CAAC;AAClD,cAAQ,QAAQ;AAChB,aAAO,EAAE,QAAQ,KAAK;AAAA,IAC1B,SAAS,KAAU;AACf,aAAO,EAAE,QAAQ,SAAS,QAAQ,IAAI,QAAQ;AAAA,IAClD;AAAA,EACJ;AAAA,EAEA,MAAM,SAAwB;AAAA,EAE9B;AACJ;;;ACtRO,IAAM,mBAAN,MAAuB;AAAA,EAClB,YAAY,oBAAI,IAAsB;AAAA,EAE9C,SAAS,MAAc,UAA0B;AAC7C,SAAK,UAAU,IAAI,MAAM,QAAQ;AAAA,EACrC;AAAA,EAEA,IAAI,MAAoC;AACpC,WAAO,KAAK,UAAU,IAAI,IAAI;AAAA,EAClC;AAAA,EAEA,IAAI,MAAuB;AACvB,WAAO,KAAK,UAAU,IAAI,IAAI;AAAA,EAClC;AAAA,EAEA,MAAM,cAA6B;AAC/B,eAAW,YAAY,KAAK,UAAU,OAAO,GAAG;AAC5C,UAAI,SAAS,UAAU;AACnB,cAAM,SAAS,SAAS;AAAA,MAC5B;AAAA,IACJ;AACA,SAAK,UAAU,MAAM;AAAA,EACzB;AACJ;;;ACAA,SAAS,cAAc,eAA4D;AAC/E,QAAM,iBAAiB,cAAc,QAAQ,IAAI;AACjD,MAAI,mBAAmB,IAAI;AACvB,WAAO,EAAE,WAAW,IAAI,MAAM,cAAc;AAAA,EAChD;AACA,SAAO;AAAA,IACH,WAAW,cAAc,UAAU,GAAG,cAAc;AAAA,IACpD,MAAM,cAAc,UAAU,iBAAiB,CAAC;AAAA,EACpD;AACJ;AAQO,SAAS,cACZ,MACA,aACA,aACW;AACX,QAAM,SAAS,cAAc,IAAI;AAEjC,SAAO;AAAA,IACH;AAAA,IACA,WAAW,OAAO,aAAa;AAAA,IAC/B,YAAY,OAAO,QAAQ;AAAA,IAC3B;AAAA,IACA;AAAA,EACJ;AACJ;AAmBO,SAAS,iBAAiB,UAAqD;AAClF,QAAM,SAAS,oBAAI,IAA2B;AAE9C,aAAW,WAAW,UAAU;AAC5B,UAAM,WAAW,OAAO,IAAI,QAAQ,SAAS,KAAK,CAAC;AACnD,aAAS,KAAK,OAAO;AACrB,WAAO,IAAI,QAAQ,WAAW,QAAQ;AAAA,EAC1C;AAEA,SAAO;AACX;;;AC9EO,IAAM,eAAN,MAAmB;AAAA;AAAA;AAAA;AAAA,EAId,YAAY,KAAqB;AACrC,WAAO,IAAI,QAAQ,YAAY,KAAK,EAAE,YAAY,EAAE,QAAQ,MAAM,EAAE;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,KAAqB;AACtC,WAAO,IAAI,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAK,EAAE,QAAQ,OAAO,KAAK;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,mBAAmB,UAAyB,cAAyB,oBAAoB,MAAc;AACnG,UAAM,UAAU,iBAAiB,QAAQ;AACzC,UAAM,QAAkB,CAAC;AAEzB,UAAM,KAAK,gCAAgC;AAG3C,QAAI,gBAAgB,aAAa,SAAS,GAAG;AACzC,YAAM,iBAAiB,aAAa,IAAI,OAAK,EAAE,QAAQ,OAAO,IAAI,CAAC;AACnE,YAAM,KAAK,0BAA0B,KAAK,UAAU,cAAc,CAAC,GAAG;AAAA,IAC1E,OAAO;AACH,YAAM,KAAK,8BAA8B;AAAA,IAC7C;AAEA,UAAM,KAAK,kBAAkB;AAE7B,eAAW,CAAC,WAAW,KAAK,KAAK,QAAQ,QAAQ,GAAG;AAEhD,YAAM,gBAAgB,KAAK,kBAAkB,SAAS,IAAI,YAAY,KAAK,KAAK,aAAa,SAAS,CAAC;AAEvG,UAAI,KAAK,kBAAkB,SAAS,GAAG;AACnC,cAAM,KAAK,KAAK,SAAS,KAAK;AAAA,MAClC,OAAO;AACH,cAAM,KAAK,MAAM,KAAK,aAAa,SAAS,CAAC,MAAM;AAAA,MACvD;AAEA,iBAAW,QAAQ,OAAO;AACtB,cAAM,aAAa,KAAK,kBAAkB,KAAK,UAAU,IACnD,KAAK,aACL,KAAK,KAAK,aAAa,KAAK,UAAU,CAAC;AAG7C,YAAI,KAAK,aAAa;AAClB,gBAAM,KAAK,WAAW,KAAK,aAAa,KAAK,WAAW,CAAC,KAAK;AAAA,QAClE;AAEA,YAAI,KAAK,kBAAkB,KAAK,UAAU,GAAG;AACzC,gBAAM,KAAK,aAAa,KAAK,UAAU,UAAU;AAAA,QACrD,OAAO;AACH,gBAAM,KAAK,QAAQ,KAAK,aAAa,KAAK,UAAU,CAAC,2BAA2B;AAAA,QACpF;AACA,cAAM,KAAK,0CAA0C,KAAK,aAAa,KAAK,IAAI,CAAC,WAAW;AAC5F,cAAM,KAAK,QAAQ;AAAA,MACvB;AAEA,YAAM,KAAK,MAAM;AAAA,IACrB;AAGA,QAAI,mBAAmB;AACnB,YAAM,KAAK,gFAAgF;AAC3F,YAAM,KAAK,4BAA4B;AACvC,YAAM,KAAK,oDAAoD;AAC/D,YAAM,KAAK,2BAA2B;AACtC,YAAM,KAAK,kDAAkD;AAC7D,YAAM,KAAK,8EAA8E;AACzF,YAAM,KAAK,kCAAkC;AAC7C,YAAM,KAAK,WAAW;AACtB,YAAM,KAAK,iFAAiF;AAC5F,YAAM,KAAK,OAAO;AAClB,YAAM,KAAK,wDAAwD;AACnE,YAAM,KAAK,MAAM;AAAA,IACrB;AAEA,UAAM,KAAK,IAAI;AACf,UAAM,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAWlB;AACO,UAAM,KAAK,oCAAoC;AAE/C,WAAO,MAAM,KAAK,IAAI;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eAAe,UAAyB,cAAyB,oBAAoB,MAAc;AAC/F,UAAM,UAAU,iBAAiB,QAAQ;AACzC,UAAM,QAAkB,CAAC;AAEzB,UAAM,KAAK,+BAA+B;AAG1C,QAAI,gBAAgB,aAAa,SAAS,GAAG;AACzC,YAAM,iBAAiB,aAAa,IAAI,OAAK,EAAE,QAAQ,OAAO,IAAI,CAAC;AACnE,YAAM,KAAK,oBAAoB,KAAK,UAAU,cAAc,CAAC,EAAE;AAAA,IACnE,OAAO;AACH,YAAM,KAAK,uBAAuB;AAAA,IACtC;AAEA,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,uBAAuB;AAClC,UAAM,KAAK,kCAAkC;AAC7C,UAAM,KAAK,0CAA0C;AACrD,UAAM,KAAK,qCAAqC;AAChD,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,eAAe;AAC1B,UAAM,KAAK,yBAAyB;AAEpC,eAAW,CAAC,WAAW,KAAK,KAAK,QAAQ,QAAQ,GAAG;AAChD,YAAM,gBAAgB,KAAK,YAAY,SAAS;AAChD,YAAM,cAAwB,CAAC;AAE/B,iBAAW,QAAQ,OAAO;AACtB,cAAM,aAAa,KAAK,YAAY,KAAK,UAAU;AACnD,cAAM,WAAW,KAAK;AAGtB,oBAAY,KAAK,gBAAgB,UAAU,sBAAsB,KAAK,aAAa,QAAQ,CAAC,iCAAiC;AAAA,MACjI;AAEA,YAAM,KAAK,gBAAgB,aAAa,qBAAqB;AAC7D,YAAM,KAAK,YAAY,KAAK,KAAK,CAAC;AAClC,YAAM,KAAK,YAAY;AAAA,IAC3B;AAGA,QAAI,mBAAmB;AACnB,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,sCAAsC;AACjD,YAAM,KAAK,qFAAqF;AAChG,YAAM,KAAK,8CAA8C;AACzD,YAAM,KAAK,wCAAwC;AACnD,YAAM,KAAK,4BAA4B;AACvC,YAAM,KAAK,yFAAyF;AACpG,YAAM,KAAK,yCAAyC;AACpD,YAAM,KAAK,eAAe;AAC1B,YAAM,KAAK,6BAA6B;AACxC,YAAM,KAAK,+EAA+E;AAC1F,YAAM,KAAK,4DAA4D;AAAA,IAC3E;AAEA,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,kBAAkB;AAE7B,WAAO,MAAM,KAAK,IAAI;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,mBAAmB,UAAyB,cAAyB,oBAAoB,MAAc;AACnG,UAAM,UAAU,iBAAiB,QAAQ;AACzC,UAAM,QAAkB,CAAC;AAEzB,UAAM,KAAK,kCAAkC;AAG7C,QAAI,gBAAgB,aAAa,SAAS,GAAG;AACzC,YAAM,iBAAiB,aAAa,IAAI,OAAK,EAAE,QAAQ,OAAO,IAAI,CAAC;AACnE,YAAM,KAAK,0BAA0B,KAAK,UAAU,cAAc,CAAC,GAAG;AAAA,IAC1E,OAAO;AACH,YAAM,KAAK,8BAA8B;AAAA,IAC7C;AAEA,UAAM,KAAK,kBAAkB;AAE7B,eAAW,CAAC,WAAW,KAAK,KAAK,QAAQ,QAAQ,GAAG;AAChD,YAAM,gBAAgB,KAAK,kBAAkB,SAAS,IAAI,YAAY,KAAK,KAAK,aAAa,SAAS,CAAC;AAEvG,UAAI,KAAK,kBAAkB,SAAS,GAAG;AACnC,cAAM,KAAK,KAAK,SAAS,KAAK;AAAA,MAClC,OAAO;AACH,cAAM,KAAK,MAAM,KAAK,aAAa,SAAS,CAAC,MAAM;AAAA,MACvD;AAEA,iBAAW,QAAQ,OAAO;AACtB,cAAM,aAAa,KAAK,kBAAkB,KAAK,UAAU,IAAI,KAAK,aAAa,KAAK,KAAK,aAAa,KAAK,UAAU,CAAC;AAEtH,YAAI,KAAK,kBAAkB,KAAK,UAAU,GAAG;AACzC,gBAAM,KAAK,aAAa,UAAU,UAAU;AAAA,QAChD,OAAO;AACH,gBAAM,KAAK,QAAQ,KAAK,aAAa,KAAK,UAAU,CAAC,2BAA2B;AAAA,QACpF;AAEA,cAAM,KAAK,0CAA0C,KAAK,aAAa,KAAK,IAAI,CAAC,iCAAiC;AAClH,cAAM,KAAK,kCAAkC;AAC7C,cAAM,KAAK,QAAQ;AAAA,MACvB;AAEA,YAAM,KAAK,MAAM;AAAA,IACrB;AAGA,QAAI,mBAAmB;AACnB,YAAM,KAAK,4BAA4B;AACvC,YAAM,KAAK,oDAAoD;AAC/D,YAAM,KAAK,2BAA2B;AACtC,YAAM,KAAK,kDAAkD;AAC7D,YAAM,KAAK,8EAA8E;AACzF,YAAM,KAAK,kCAAkC;AAC7C,YAAM,KAAK,WAAW;AACtB,YAAM,KAAK,iFAAiF;AAC5F,YAAM,KAAK,OAAO;AAClB,YAAM,KAAK,8EAA8E;AACzF,YAAM,KAAK,gCAAgC;AAC3C,YAAM,KAAK,MAAM;AAAA,IACrB;AAEA,UAAM,KAAK,IAAI;AACf,UAAM,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAWlB;AAEO,WAAO,MAAM,KAAK,IAAI;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,KAAsB;AAC5C,WAAO,6BAA6B,KAAK,GAAG;AAAA,EAChD;AACJ;;;AChQO,IAAM,mBAAN,MAAuB;AAAA,EAClB;AAAA,EACA;AAAA,EACA,eAAe,IAAI,aAAa;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAsB;AAAA,EAE9B,YACI,QACA,eACA,gBACA,iBACA,kBACF;AACE,SAAK,SAAS;AACd,SAAK,gBAAgB;AACrB,SAAK,iBAAiB;AACtB,SAAK,kBAAkB;AACvB,SAAK,mBAAmB;AAAA,EAC5B;AAAA,EAEA,IAAI,WAAW,MAAc;AACzB,SAAK,cAAc;AAAA,EACvB;AAAA,EAEA,MAAM,kBACF,MACA,QACA,SACA,cACwB;AACxB,UAAM,kBAAkB,EAAE,GAAG,KAAK,eAAe,GAAG,OAAO;AAG3D,UAAM,iBAAiB,KAAK,gBAAgB,aAAa,IAAI;AAC7D,QAAI,CAAC,eAAe,OAAO;AACvB,aAAO,KAAK,0CAA0C,eAAe,WAAW,eAAe;AAAA,IACnG;AAIA,UAAM,YAAY,KAAK,QAAQ,sCAAsC,IAAI;AACzE,UAAM,aAAa,gBAAgB,KAAK,SAAS,KAC7C,gBAAgB,KAAK,SAAS,KAC9B,WAAW,KAAK,SAAS,KACzB,WAAW,KAAK,SAAS;AAG7B,QAAI,CAAC,cAAc,KAAK,iBAAiB,IAAI,SAAS,GAAG;AACrD,aAAO,MAAM,KAAK,eAAe,MAAM,iBAAiB,SAAS,YAAY;AAAA,IACjF;AAGA,QAAI,CAAC,KAAK,aAAa;AACnB,aAAO,KAAK,8CAA8C,6BAA6B;AAAA,IAC3F;AAGA,QAAI,CAAC,KAAK,iBAAiB,IAAI,MAAM,GAAG;AACpC,aAAO,KAAK,8CAA8C,8BAA8B;AAAA,IAC5F;AAEA,UAAM,WAAW,KAAK,iBAAiB,IAAI,MAAM;AAGjD,UAAM,WAAW,MAAM,KAAK,gBAAgB,OAAO;AACnD,UAAM,UAAU,KAAK,aAAa,mBAAmB,UAAU,YAAY;AAG3E,UAAM,eAAe,KAAK,gBAAgB,cAAc,YAAY;AACpE,QAAI;AACA,aAAO,MAAM,SAAS,QAAQ,MAAM,iBAAiB,SAAS;AAAA,QAC1D,YAAY,KAAK;AAAA,QACjB,UAAU;AAAA,QACV;AAAA,MACJ,CAAC;AAAA,IACL,UAAE;AACE,WAAK,gBAAgB,kBAAkB,YAAY;AAAA,IACvD;AAAA,EACJ;AAAA,EAEA,MAAM,cACF,MACA,QACA,SACA,cACwB;AACxB,UAAM,kBAAkB,EAAE,GAAG,KAAK,eAAe,GAAG,OAAO;AAE3D,QAAI,CAAC,KAAK,iBAAiB,IAAI,QAAQ,GAAG;AACtC,aAAO,KAAK,8CAA8C,gCAAgC;AAAA,IAC9F;AAGA,QAAI,CAAC,KAAK,aAAa;AACnB,aAAO,KAAK,8CAA8C,6BAA6B;AAAA,IAC3F;AAEA,UAAM,WAAW,KAAK,iBAAiB,IAAI,QAAQ;AAEnD,UAAM,iBAAiB,KAAK,gBAAgB,aAAa,IAAI;AAC7D,QAAI,CAAC,eAAe,OAAO;AACvB,aAAO,KAAK,0CAA0C,eAAe,WAAW,eAAe;AAAA,IACnG;AAEA,UAAM,WAAW,MAAM,KAAK,gBAAgB,OAAO;AACnD,UAAM,UAAU,KAAK,aAAa,eAAe,UAAU,YAAY;AAEvE,UAAM,eAAe,KAAK,gBAAgB,cAAc,YAAY;AACpE,QAAI;AACA,aAAO,MAAM,SAAS,QAAQ,MAAM,iBAAiB,SAAS;AAAA,QAC1D,YAAY,KAAK;AAAA,QACjB,UAAU;AAAA,QACV;AAAA,MACJ,CAAC;AAAA,IACL,UAAE;AACE,WAAK,gBAAgB,kBAAkB,YAAY;AAAA,IACvD;AAAA,EACJ;AAAA,EAEA,MAAc,gBAAgB,SAA2B;AAErD,UAAM,WAAW,MAAM,KAAK,eAAe,iBAAiB;AAC5D,UAAM,cAAc,CAAC;AAErB,eAAW,OAAO,UAAU;AACxB,UAAI;AAIA,cAAM,QAAQ,MAAM,KAAK,eAAe,cAAc,IAAI,IAAI,OAAO;AACrE,oBAAY,KAAK,GAAG,MAAM,IAAI,OAAK,cAAc,EAAE,IAAI,QAAW,EAAE,WAAW,CAAC,CAAC;AAAA,MACrF,SAAS,KAAU;AACf,aAAK,OAAO,KAAK,EAAE,WAAW,IAAI,IAAI,KAAK,IAAI,QAAQ,GAAG,kCAAkC;AAAA,MAChG;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,eACF,MACA,QACA,SACA,cACwB;AACxB,QAAI,CAAC,KAAK,iBAAiB,IAAI,SAAS,GAAG;AACvC,aAAO,KAAK,8CAA8C,+BAA+B;AAAA,IAC7F;AACA,UAAM,WAAW,KAAK,iBAAiB,IAAI,SAAS;AAEpD,UAAM,kBAAkB,EAAE,GAAG,KAAK,eAAe,GAAG,OAAO;AAC3D,UAAM,iBAAiB,KAAK,gBAAgB,aAAa,IAAI;AAC7D,QAAI,CAAC,eAAe,OAAO;AACvB,aAAO,KAAK,0CAA0C,eAAe,WAAW,eAAe;AAAA,IACnG;AAEA,UAAM,WAAW,MAAM,KAAK,gBAAgB,OAAO;AACnD,UAAM,UAAU,KAAK,aAAa,mBAAmB,UAAU,YAAY;AAE3E,QAAI;AACA,aAAO,MAAM,SAAS,QAAQ,MAAM,iBAAiB,SAAS,EAAE,QAAQ,CAAC;AAAA,IAC7E,SAAS,KAAU;AACf,aAAO,KAAK,8CAA8C,IAAI,OAAO;AAAA,IACzE;AAAA,EACJ;AAAA,EAEQ,kBAAkB,MAAc,SAAkC;AACtE,WAAO;AAAA,MACH,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,OAAO,EAAE,MAAM,QAAQ;AAAA,IAC3B;AAAA,EACJ;AAAA,EAEA,MAAM,WAA0B;AAC5B,UAAM,KAAK,iBAAiB,YAAY;AAAA,EAC5C;AAAA,EAEA,MAAM,SAAwB;AAC1B,UAAM,iBAAiB,KAAK,iBAAiB,IAAI,QAAQ;AACzD,QAAI,kBAAkB,YAAY,gBAAgB;AAE9C,YAAO,eAAuB,OAAO,KAAK,aAAa;AAAA,IAC3D;AAAA,EACJ;AAAA,EAEA,MAAM,cAA4B;AAC9B,UAAM,iBAAiB,KAAK,iBAAiB,IAAI,QAAQ;AACzD,QAAI,kBAAkB,iBAAiB,gBAAgB;AACnD,aAAQ,eAAuB,YAAY;AAAA,IAC/C;AACA,WAAO,EAAE,QAAQ,KAAK;AAAA,EAC1B;AACJ;;;AC5MO,IAAM,0BAAN,MAAoD;AAAA,EACvD,MAAM,OAAO,SAAyB,SAA2B,MAAqD;AAClH,QAAI;AACA,aAAO,MAAM,KAAK;AAAA,IACtB,SAAS,KAAU;AACf,cAAQ,OAAO,MAAM,EAAE,IAAI,GAAG,wBAAwB;AACtD,aAAO;AAAA,QACH,SAAS;AAAA,QACT,IAAI,QAAQ;AAAA,QACZ,OAAO;AAAA,UACH;AAAA,UACA,SAAS,IAAI,WAAW;AAAA,QAC5B;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AACJ;;;ACfO,IAAM,oBAAN,MAA8C;AAAA,EACjD,MAAM,OAAO,SAAyB,SAA2B,MAAqD;AAClH,UAAM,EAAE,QAAQ,GAAG,IAAI;AACvB,UAAM,cAAc,QAAQ,OAAO,MAAM,EAAE,QAAQ,GAAG,CAAC;AACvD,YAAQ,SAAS;AAEjB,YAAQ,qBAAqB;AAC7B,UAAM,YAAY,KAAK,IAAI;AAE3B,QAAI;AACA,YAAM,WAAW,MAAM,KAAK;AAC5B,cAAQ,mBAAmB,KAAK,IAAI,IAAI,WAAW,MAAM;AACzD,aAAO;AAAA,IACX,SAAS,KAAK;AAEV,cAAQ,mBAAmB,KAAK,IAAI,IAAI,WAAW,MAAM;AACzD,YAAM;AAAA,IACV;AAAA,EACJ;AACJ;;;ACnBO,IAAM,iBAAN,MAA2C;AAAA,EAC9C,YAAoB,iBAAkC;AAAlC;AAAA,EAAoC;AAAA,EAExD,MAAM,OACF,SACA,SACA,MAC+B;AAC/B,UAAM,gBAAgB,QAAQ,MAAM,eAAe;AACnD,UAAM,cAAc,KAAK,gBAAgB,YAAY;AAGrD,UAAM,WAAW,CAAC,eAAe,kBAAkB;AACnD,UAAM,YAAY,CAAC,YAAY,KAAK,gBAAgB,iBAAiB,aAAa;AAElF,QAAI,CAAC,YAAY,CAAC,WAAW;AACzB,aAAO;AAAA,QACH,SAAS;AAAA,QACT,IAAI,QAAQ;AAAA,QACZ,OAAO;AAAA,UACH;AAAA,UACA,SAAS;AAAA,QACb;AAAA,MACJ;AAAA,IACJ;AAGA,QAAI,WAAW;AACX,YAAM,iBAAiB,CAAC,cAAc,6BAA6B,sBAAsB,iBAAiB,QAAQ,cAAc,YAAY;AAC5I,UAAI,CAAC,eAAe,SAAS,QAAQ,MAAM,GAAG;AAC1C,eAAO;AAAA,UACH,SAAS;AAAA,UACT,IAAI,QAAQ;AAAA,UACZ,OAAO;AAAA,YACH;AAAA,YACA,SAAS;AAAA,UACb;AAAA,QACJ;AAAA,MACJ;AAGA,YAAM,UAAU,KAAK,gBAAgB,WAAW,aAAa;AAC7D,UAAI,SAAS,gBAAgB,CAAC,QAAQ,cAAc;AAIhD,gBAAQ,eAAe,QAAQ;AAAA,MACnC;AAAA,IACJ;AAEA,WAAO,KAAK;AAAA,EAChB;AACJ;;;ACpDO,IAAM,sBAAN,MAAgD;AAAA,EACnD,YAAoB,iBAAkC;AAAlC;AAAA,EAAoC;AAAA,EAExD,MAAM,OACF,SACA,SACA,MAC+B;AAC/B,UAAM,gBAAgB,QAAQ,MAAM;AAEpC,UAAM,eAAe,iBAAiB,QAAQ,iBAAiB;AAE/D,QAAI,CAAC,KAAK,gBAAgB,eAAe,YAAY,GAAG;AACpD,aAAO;AAAA,QACH,SAAS;AAAA,QACT,IAAI,QAAQ;AAAA,QACZ,OAAO;AAAA,UACH,MAAM;AAAA;AAAA,UACN,SAAS;AAAA,QACb;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO,KAAK;AAAA,EAChB;AACJ;;;ACdO,SAAS,uBAAuB,iBAAgD;AACnF,SAAO;AAAA,IACH,IAAI,wBAAwB;AAAA,IAC5B,IAAI,kBAAkB;AAAA,IACtB,IAAI,eAAe,eAAe;AAAA,IAClC,IAAI,oBAAoB,eAAe;AAAA,EAC3C;AACJ;;;ACvBA,OAAOG,cAAa;AACpB,OAAOC,YAAW;AAClB,OAAO,UAAU;AACjB,SAAS,MAAMC,eAAc;AAC7B,OAAOC,aAAY;AAoBnB,IAAM,uBAAuB;AAAA,EACzB,SAAS;AAAA,EACT,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,QAAQ;AAAA,IACJ,YAAY;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA,IACb;AAAA,EACJ;AACJ;AAEA,SAAS,gBAAgB,QAAwB;AAC7C,SAAO,OACF,SAAS,QAAQ,EACjB,QAAQ,OAAO,GAAG,EAClB,QAAQ,OAAO,GAAG,EAClB,QAAQ,QAAQ,EAAE;AAC3B;AAEA,SAAS,qBAA6B;AAClC,SAAO,gBAAgBA,QAAO,YAAY,EAAE,CAAC;AACjD;AAEA,SAAS,oBAAoB,UAA0B;AACnD,SAAO,gBAAgBA,QAAO,WAAW,QAAQ,EAAE,OAAO,QAAQ,EAAE,OAAO,CAAC;AAChF;AAEA,SAAS,4BAA4B,aAA2D;AAC5F,MAAI,CAAC,YAAa,QAAO;AACzB,QAAM,SAAS,MAAM,QAAQ,WAAW,IAAI,YAAY,KAAK,GAAG,IAAI;AACpE,QAAM,QAAQ,OAAO,MAAM,8BAA8B,KAAK,OAAO,MAAM,6BAA6B;AACxG,SAAO,QAAQ,MAAM,CAAC,IAAI;AAC9B;AAEA,eAAe,qBAAqB,QAA0C;AAC1E,QAAM,WAAW;AAAA,IACb,MAAMF,OAAM,IAAI,QAAQ,EAAE,gBAAgB,MAAM,KAAK,CAAC;AAAA,IACtD,MAAMA,OAAM,KAAK,QAAQ,sBAAsB,EAAE,gBAAgB,MAAM,KAAK,CAAC;AAAA,EACjF;AAEA,MAAI,sBAAqC;AACzC,aAAW,WAAW,UAAU;AAC5B,UAAM,WAAW,MAAM,QAAQ;AAC/B,0BAAsB,4BAA4B,SAAS,QAAQ,kBAAkB,CAAC;AACtF,QAAI,oBAAqB;AAAA,EAC7B;AAEA,MAAI,CAAC,qBAAqB;AACtB,UAAM,IAAI,MAAM,gFAAgF;AAAA,EACpG;AAEA,QAAM,mBAAmB,MAAMA,OAAM,IAAI,mBAAmB;AAC5D,QAAM,WAAW,iBAAiB;AAElC,MAAI,UAAU,SAAS;AACvB,MAAI,WAAW,SAAS;AACxB,MAAI,SAAS,MAAM,QAAQ,SAAS,gBAAgB,IAAI,SAAS,mBAAmB;AACpF,QAAM,WAAW,OAAO,SAAS,aAAa,WAAW,SAAS,WAAW;AAE7E,MAAI,CAAC,WAAW,CAAC,UAAU;AACvB,UAAM,aAAc,MAAM,QAAQ,SAAS,qBAAqB,KAAK,SAAS,sBAAsB,CAAC,KAAM,SAAS;AACpH,QAAI,CAAC,YAAY;AACb,YAAM,IAAI,MAAM,0DAA0D;AAAA,IAC9E;AAEA,UAAM,gBAAgB,IAAI,IAAI,2CAA2C,UAAU,EAAE,SAAS;AAC9F,UAAM,qBAAqB,MAAMA,OAAM,IAAI,aAAa;AACxD,UAAM,aAAa,mBAAmB;AAEtC,cAAU,WAAY,WAAW;AACjC,eAAW,YAAa,WAAW;AACnC,aAAS,WAAW,MAAM,QAAQ,WAAW,gBAAgB,IAAI,WAAW,mBAAmB;AAAA,EACnG;AAEA,MAAI,CAAC,WAAW,CAAC,UAAU;AACvB,UAAM,IAAI,MAAM,iEAAiE;AAAA,EACrF;AAEA,SAAO,EAAE,SAAS,UAAU,QAAQ,SAAS;AACjD;AAEA,SAAS,gBAAgB,WAAwC;AAC7D,MAAI,CAAC,UAAW,QAAO;AACvB,SAAO,UACF,MAAM,GAAG,EACT,IAAI,WAAS,MAAM,KAAK,CAAC,EACzB,OAAO,OAAO,EACd,KAAK,GAAG;AACjB;AAEA,eAAsB,WAAW,SAAsB;AACnD,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,cAAc,oBAAoB,IAAI;AAC5C,QAAM,QAAQC,QAAO;AACrB,QAAM,eAAe,QAAQ,UAAU,mBAAmB,IAAI;AAC9D,QAAM,gBAAgB,eAAe,oBAAoB,YAAY,IAAI;AAEzE,QAAM,UAAUF,SAAQ;AACxB,MAAI,iBAAiB,gBAAgB,QAAQ,MAAM;AACnD,MAAI,kBAAkB,QAAQ;AAC9B,MAAI,mBAAmB,QAAQ;AAC/B,MAAI;AAEJ,MAAI,QAAQ,QAAQ;AAChB,UAAM,aAAa,MAAM,qBAAqB,QAAQ,MAAM;AAC5D,sBAAkB,WAAW;AAC7B,uBAAmB,WAAW;AAC9B,uBAAmB,WAAW;AAC9B,QAAI,CAAC,kBAAkB,WAAW,UAAU,WAAW,OAAO,SAAS,GAAG;AACtE,uBAAiB,WAAW,OAAO,KAAK,GAAG;AAAA,IAC/C;AAAA,EACJ;AAEA,MAAI,CAAC,mBAAmB,CAAC,kBAAkB;AACvC,UAAM,IAAI,MAAM,iFAAiF;AAAA,EACrG;AAEA,SAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC1C,YAAQ,IAAI,aAAa,OAAO,SAAS,UAAU;AAC/C,YAAM,EAAE,MAAM,OAAO,eAAe,OAAO,kBAAkB,IAAI,QAAQ;AAEzE,UAAI,OAAO;AACP,cAAM,KAAK,0BAA0B,KAAK,MAAM,iBAAiB,EAAE;AACnE,eAAO,IAAI,MAAM,gBAAgB,KAAK,EAAE,CAAC;AACzC;AAAA,MACJ;AAEA,UAAI,kBAAkB,OAAO;AACzB,cAAM,KAAK,yBAAyB;AACpC,eAAO,IAAI,MAAM,gBAAgB,CAAC;AAClC;AAAA,MACJ;AAEA,UAAI;AACA,cAAM,OAAO,IAAI,gBAAgB;AACjC,aAAK,IAAI,cAAc,oBAAoB;AAC3C,aAAK,IAAI,QAAQ,IAAI;AACrB,aAAK,IAAI,gBAAgB,WAAW;AACpC,aAAK,IAAI,aAAa,QAAQ,QAAQ;AACtC,YAAI,QAAQ,cAAc;AACtB,eAAK,IAAI,iBAAiB,QAAQ,YAAY;AAAA,QAClD;AACA,YAAI,cAAc;AACd,eAAK,IAAI,iBAAiB,YAAY;AAAA,QAC1C;AACA,YAAI,kBAAkB;AAClB,eAAK,IAAI,YAAY,gBAAgB;AAAA,QACzC;AAEA,cAAM,WAAW,MAAMC,OAAM,KAAK,kBAAkB,MAAM;AAAA,UACtD,SAAS;AAAA,YACL,gBAAgB;AAAA,YAChB,UAAU;AAAA,UACd;AAAA,QACJ,CAAC;AAED,cAAM,EAAE,eAAe,aAAa,IAAI,SAAS;AAEjD,gBAAQ,IAAI,uCAAuC;AACnD,gBAAQ,IAAI,0CAA0C;AACtD,gBAAQ,IAAI,cAAc;AAC1B,gBAAQ,IAAI,gBAAgB;AAC5B,gBAAQ,IAAI,eAAe,QAAQ,QAAQ,EAAE;AAC7C,YAAI,QAAQ,cAAc;AACtB,kBAAQ,IAAI,mBAAmB,QAAQ,YAAY,EAAE;AAAA,QACzD;AACA,gBAAQ,IAAI,gBAAgB,gBAAgB,GAAG;AAC/C,gBAAQ,IAAI,oBAAoB,iBAAiB,iCAAiC,GAAG;AACrF,YAAI,gBAAgB;AAChB,kBAAQ,IAAI,eAAe,eAAe,MAAM,GAAG,EAAE,KAAK,MAAM,CAAC,IAAI;AAAA,QACzE;AAEA,YAAI,CAAC,eAAe;AAChB,kBAAQ,IAAI,kGAAkG;AAAA,QAClH;AAEA,gBAAQ,IAAI,wBAAwB,KAAK,UAAU,SAAS,MAAM,MAAM,CAAC,CAAC;AAE1E,cAAM,KAAK,kFAAkF;AAC7F,gBAAQ;AAAA,MACZ,SAAS,KAAU;AACf,cAAM,MAAM,IAAI,UAAU,MAAM,qBAAqB,IAAI,UAAU,MAAM,SAAS,IAAI;AACtF,cAAM,KAAK,sCAAsC,GAAG,EAAE;AACtD,eAAO,IAAI,MAAM,0BAA0B,GAAG,EAAE,CAAC;AAAA,MACrD,UAAE;AACE,mBAAW,MAAM,QAAQ,MAAM,GAAG,GAAI;AAAA,MAC1C;AAAA,IACJ,CAAC;AAED,YAAQ,OAAO,EAAE,MAAY,MAAM,YAAY,GAAG,OAAO,QAAQ;AAC7D,UAAI,KAAK;AACL,eAAO,GAAG;AACV;AAAA,MACJ;AAEA,YAAM,UAAU,IAAI,IAAI,eAAe;AACvC,cAAQ,aAAa,OAAO,aAAa,QAAQ,QAAQ;AACzD,cAAQ,aAAa,OAAO,gBAAgB,WAAW;AACvD,cAAQ,aAAa,OAAO,iBAAiB,MAAM;AACnD,cAAQ,aAAa,OAAO,SAAS,KAAK;AAC1C,UAAI,gBAAgB;AAChB,gBAAQ,aAAa,OAAO,SAAS,cAAc;AAAA,MACvD;AACA,UAAI,eAAe;AACf,gBAAQ,aAAa,OAAO,kBAAkB,aAAa;AAC3D,gBAAQ,aAAa,OAAO,yBAAyB,MAAM;AAAA,MAC/D;AACA,UAAI,kBAAkB;AAClB,gBAAQ,aAAa,OAAO,YAAY,gBAAgB;AAAA,MAC5D;AAEA,cAAQ,IAAI,uBAAuB,QAAQ,SAAS,CAAC,EAAE;AACvD,cAAQ,IAAI,yBAAyB;AACrC,YAAM,KAAK,QAAQ,SAAS,CAAC;AAAA,IACjC,CAAC;AAAA,EACL,CAAC;AACL;;;AhC7NA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACK,KAAK,SAAS,EACd,YAAY,uDAAuD,EACnE,QAAQ,OAAO;AAEpB,QACK,QAAQ,SAAS,EAAE,WAAW,KAAK,CAAC,EACpC,YAAY,0BAA0B,EACtC,OAAO,WAAW,qBAAqB,EACvC,OAAO,OAAO,YAAY;AACvB,MAAI;AACA,UAAM,YAAY;AAAA,EACtB,SAAS,KAAK;AACV,YAAQ,MAAM,4BAA4B,GAAG;AAC7C,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ,CAAC;AAEL,QACK,QAAQ,MAAM,EACd,YAAY,8CAA8C,EAC1D,eAAe,oBAAoB,iBAAiB,EACpD,eAAe,4BAA4B,qBAAqB,EAChE,OAAO,oBAAoB,yBAAyB,EACpD,OAAO,qBAAqB,iBAAiB,EAC7C,OAAO,mBAAmB,6CAA6C,EACvE,OAAO,qBAAqB,gCAAgC,EAC5D,OAAO,iBAAiB,sCAAsC,MAAM,EACpE,OAAO,UAAU,0CAA0C,EAC3D,OAAO,OAAO,YAAY;AACvB,MAAI;AACA,UAAM,WAAW;AAAA,MACb,UAAU,QAAQ;AAAA,MAClB,cAAc,QAAQ;AAAA,MACtB,SAAS,QAAQ;AAAA,MACjB,UAAU,QAAQ;AAAA,MAClB,QAAQ,QAAQ;AAAA,MAChB,QAAQ,QAAQ;AAAA,MAChB,MAAM,SAAS,QAAQ,MAAM,EAAE;AAAA,MAC/B,SAAS,QAAQ,QAAQ,QAAQ,QAAQ,MAAM;AAAA,IACnD,CAAC;AACD,YAAQ,IAAI,qCAAqC;AAAA,EACrD,SAAS,KAAU;AACf,YAAQ,MAAM,iCAAiC,IAAI,OAAO;AAC1D,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ,CAAC;AAEL,eAAe,cAAc;AACzB,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,aAAa,aAAa;AAEzC,QAAM,cAAc,IAAI,YAAY,MAAM;AAC1C,QAAM,YAAY,MAAM;AAExB,QAAM,cAAc,IAAI,EAAE,eAAe,SAAS,GAAG,YAAY;AAE7D,UAAM,UAAU,cAAc,IAAI,WAAW,MAAM;AACnD,UAAM,WAAW,UAAU,SAAY,cAAc,IAAI,gBAAgB;AAEzE,UAAM,kBAAkB,IAAI,gBAAgB,QAAQ,QAAS;AAE7D,UAAM,iBAAiB,IAAI,eAAe,QAAQ,eAAe;AACjE,UAAM,YAAY,cAAc,IAAI,WAAW,KAAK,CAAC;AACrD,eAAW,YAAY,WAAW;AAC9B,qBAAe,iBAAiB,QAAQ;AAAA,IAC5C;AAEA,UAAM,mBAAmB,IAAI,iBAAiB;AAC9C,qBAAiB,SAAS,QAAQ,IAAI,aAAa,cAAc,IAAI,iBAAiB,CAAC,CAAC;AACxF,qBAAiB,SAAS,UAAU,IAAI,gBAAgB,cAAc,IAAI,oBAAoB,CAAC,CAAC;AAGhG,UAAM,kBAAkB,IAAI,gBAAgB,QAAQ,cAAc;AAClE,qBAAiB,SAAS,WAAW,eAAe;AAEpD,UAAM,mBAAmB,IAAI;AAAA,MACzB;AAAA,MACA,cAAc,IAAI,gBAAgB;AAAA,MAClC;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAEA,UAAM,oBAAoB,IAAI;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA,uBAAuB,eAAe;AAAA,IAC1C;AAEA,UAAM,YAAY,IAAI,UAAU,QAAQ,cAAc,KAAK,gBAAgB,iBAAiB;AAC5F,UAAM,UAAU,OAAO;AAEvB,UAAM,qBAAqB,IAAI,mBAAmB,QAAQ;AAAA,MACtD,eAAe,cAAc,IAAI,eAAe;AAAA,IACpD,CAAC;AAED,QAAI;AACJ,QAAI;AAEJ,QAAI,cAAc,IAAI,WAAW,MAAM,SAAS;AAC5C,kBAAY,IAAI,eAAe,QAAQ,mBAAmB,kBAAkB;AAC5E,YAAM,UAAU,MAAM;AACtB,gBAAU;AAGV,YAAM,oBAAoB,IAAI,gBAAgB,QAAQ,mBAAmB,kBAAkB;AAC3F,YAAM,eAAe;AACrB,YAAM,kBAAkB,MAAM,kBAAkB,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7E,uBAAiB,aAAa;AAG9B,YAAM,mBAAmB,UAAU,MAAM,KAAK,SAAS;AACvD,gBAAU,QAAQ,YAAY;AAC1B,cAAM,iBAAiB;AACvB,cAAM,kBAAkB,MAAM;AAAA,MAClC;AAAA,IACJ,OAAO;AACH,kBAAY,IAAI,gBAAgB,QAAQ,mBAAmB,kBAAkB;AAC7E,YAAM,OAAO,cAAc,IAAI,MAAM;AACrC,gBAAU,MAAM,UAAU,OAAO,EAAE,KAAK,CAAC;AACzC,uBAAiB,aAAa;AAAA,IAClC;AAGA,UAAM,kBAAkB,OAAO;AAE/B,WAAO,KAAK,wBAAwB;AAGpC,UAAM,WAAW,YAAY;AACzB,aAAO,KAAK,kBAAkB;AAC9B,YAAM,QAAQ,IAAI;AAAA,QACd,UAAU,MAAM;AAAA,QAChB,UAAU,MAAM;AAAA,QAChB,kBAAkB,SAAS;AAAA,QAC3B,YAAY,SAAS;AAAA,MACzB,CAAC;AACD,cAAQ,KAAK,CAAC;AAAA,IAClB;AAEA,YAAQ,GAAG,UAAU,QAAQ;AAC7B,YAAQ,GAAG,WAAW,QAAQ;AAAA,EAClC,CAAC;AACL;AAEA,QAAQ,MAAM,QAAQ,IAAI;","names":["fs","path","path","fs","axios","z","axios","stubs","net","LRUCache","uuidv4","LRUCache","crypto","fs","path","fileURLToPath","path","fs","__dirname","path","fileURLToPath","fs","code","fs","path","fileURLToPath","__dirname","path","fileURLToPath","fs","path","__dirname","Fastify","axios","uuidv4","crypto"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/core/config.service.ts","../src/core/logger.ts","../src/transport/socket.transport.ts","../src/core/execution.context.ts","../src/transport/stdio.transport.ts","../src/core/ops.server.ts","../src/core/concurrency.service.ts","../src/core/metrics.service.ts","../src/core/request.controller.ts","../src/gateway/upstream.client.ts","../src/gateway/auth.service.ts","../src/gateway/schema.cache.ts","../src/core/policy.service.ts","../src/gateway/gateway.service.ts","../src/core/network.policy.service.ts","../src/core/session.manager.ts","../src/core/security.service.ts","../src/core/otel.service.ts","../src/executors/deno.executor.ts","../src/core/asset.utils.ts","../src/executors/pyodide.executor.ts","../src/executors/isolate.executor.ts","../src/core/registries/executor.registry.ts","../src/sdk/tool-binding.ts","../src/sdk/sdk-generator.ts","../src/core/execution.service.ts","../src/core/middleware/error.middleware.ts","../src/core/middleware/logging.middleware.ts","../src/core/middleware/auth.middleware.ts","../src/core/middleware/ratelimit.middleware.ts","../src/core/middleware/middleware.builder.ts","../src/auth.cmd.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander';\nimport { ConfigService } from './core/config.service.js';\nimport { createLogger, loggerStorage } from './core/logger.js';\nimport { SocketTransport } from './transport/socket.transport.js';\nimport { StdioTransport } from './transport/stdio.transport.js';\nimport { OpsServer } from './core/ops.server.js';\nimport { ConcurrencyService } from './core/concurrency.service.js';\nimport { RequestController } from './core/request.controller.js';\nimport { GatewayService } from './gateway/gateway.service.js';\nimport { SecurityService } from './core/security.service.js';\nimport { OtelService } from './core/otel.service.js';\nimport { DenoExecutor } from './executors/deno.executor.js';\nimport { PyodideExecutor } from './executors/pyodide.executor.js';\nimport { IsolateExecutor } from './executors/isolate.executor.js';\nimport { ExecutorRegistry } from './core/registries/executor.registry.js';\nimport { ExecutionService } from './core/execution.service.js';\nimport { buildDefaultMiddleware } from './core/middleware/middleware.builder.js';\nimport { handleAuth } from './auth.cmd.js';\n\nconst program = new Command();\n\nprogram\n .name('conduit')\n .description('A secure Code Mode execution substrate for MCP agents')\n .version('1.0.0');\n\nprogram\n .command('serve', { isDefault: true })\n .description('Start the Conduit server')\n .option('--stdio', 'Use stdio transport')\n .option('--config <path>', 'Path to config file')\n .action(async (options) => {\n try {\n await startServer(options);\n } catch (err) {\n console.error('Failed to start Conduit:', err);\n process.exit(1);\n }\n });\n\nprogram\n .command('auth')\n .description('Help set up OAuth for an upstream MCP server')\n .requiredOption('--client-id <id>', 'OAuth Client ID')\n .requiredOption('--client-secret <secret>', 'OAuth Client Secret')\n .option('--auth-url <url>', 'OAuth Authorization URL')\n .option('--token-url <url>', 'OAuth Token URL')\n .option('--mcp-url <url>', 'MCP base URL (auto-discover OAuth metadata)')\n .option('--scopes <scopes>', 'OAuth Scopes (comma separated)')\n .option('--port <port>', 'Port for the local callback server', '3333')\n .option('--pkce', 'Use PKCE for the authorization code flow')\n .action(async (options) => {\n try {\n await handleAuth({\n clientId: options.clientId,\n clientSecret: options.clientSecret,\n authUrl: options.authUrl,\n tokenUrl: options.tokenUrl,\n mcpUrl: options.mcpUrl,\n scopes: options.scopes,\n port: parseInt(options.port, 10),\n usePkce: options.pkce || Boolean(options.mcpUrl),\n });\n console.log('\\nSuccess! Configuration generated.');\n } catch (err: any) {\n console.error('Authentication helper failed:', err.message);\n process.exit(1);\n }\n });\n\nasync function startServer(options: any = {}) {\n // Merge command line options into config overrides\n const overrides: any = {};\n if (options.stdio) overrides.transport = 'stdio';\n if (options.config) process.env.CONFIG_FILE = options.config;\n\n const configService = new ConfigService(overrides);\n const logger = createLogger(configService);\n\n const otelService = new OtelService(logger);\n await otelService.start();\n\n await loggerStorage.run({ correlationId: 'system' }, async () => {\n // Disable auth for Stdio transport (implicitly trusted as it is spawned by the user)\n const isStdio = configService.get('transport') === 'stdio';\n const ipcToken = isStdio ? undefined : configService.get('ipcBearerToken');\n\n const securityService = new SecurityService(logger, ipcToken!);\n\n const gatewayService = new GatewayService(logger, securityService);\n const upstreams = configService.get('upstreams') || [];\n logger.info({ upstreamCount: upstreams.length, upstreamIds: upstreams.map((u: any) => u.id) }, 'Registering upstreams from config');\n for (const upstream of upstreams) {\n gatewayService.registerUpstream(upstream);\n }\n\n const executorRegistry = new ExecutorRegistry();\n executorRegistry.register('deno', new DenoExecutor(configService.get('denoMaxPoolSize')));\n executorRegistry.register('python', new PyodideExecutor(configService.get('pyodideMaxPoolSize')));\n\n // IsolateExecutor needs gatewayService\n const isolateExecutor = new IsolateExecutor(logger, gatewayService);\n executorRegistry.register('isolate', isolateExecutor);\n\n const executionService = new ExecutionService(\n logger,\n configService.get('resourceLimits'),\n gatewayService,\n securityService,\n executorRegistry\n );\n\n const requestController = new RequestController(\n logger,\n executionService,\n gatewayService,\n buildDefaultMiddleware(securityService)\n );\n\n const opsServer = new OpsServer(logger, configService.all, gatewayService, requestController);\n await opsServer.listen();\n\n const concurrencyService = new ConcurrencyService(logger, {\n maxConcurrent: configService.get('maxConcurrent')\n });\n\n let transport: SocketTransport | StdioTransport;\n let address: string;\n\n if (configService.get('transport') === 'stdio') {\n const stdioTransport = new StdioTransport(logger, requestController, concurrencyService);\n transport = stdioTransport;\n await transport.start();\n gatewayService.registerHost(stdioTransport);\n address = 'stdio';\n\n // IMPORTANT: Even in stdio mode, we need a local socket for sandboxes to talk to\n const internalTransport = new SocketTransport(logger, requestController, concurrencyService);\n const internalPort = 0; // Random available port\n const internalAddress = await internalTransport.listen({ port: internalPort });\n executionService.ipcAddress = internalAddress;\n\n // Register internal transport for shutdown\n const originalShutdown = transport.close.bind(transport);\n transport.close = async () => {\n await originalShutdown();\n await internalTransport.close();\n };\n } else {\n transport = new SocketTransport(logger, requestController, concurrencyService);\n const port = configService.get('port');\n address = await transport.listen({ port });\n executionService.ipcAddress = address;\n }\n\n // Pre-warm workers\n await requestController.warmup();\n\n logger.info('Conduit server started');\n\n // Handle graceful shutdown\n const shutdown = async () => {\n logger.info('Shutting down...');\n await Promise.all([\n transport.close(),\n opsServer.close(),\n requestController.shutdown(),\n otelService.shutdown(),\n ]);\n process.exit(0);\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n });\n}\n\nprogram.parse(process.argv);\n","import { z } from 'zod';\nimport dotenv from 'dotenv';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport crypto from 'node:crypto';\nimport yaml from 'js-yaml';\n\n// Silence dotenv logging\nconst originalWrite = process.stdout.write;\n// @ts-ignore\nprocess.stdout.write = () => true;\ndotenv.config();\nprocess.stdout.write = originalWrite;\n\nimport { AppConfig } from './interfaces/app.config.js';\n\n\nexport const ResourceLimitsSchema = z.object({\n timeoutMs: z.number().default(30000),\n memoryLimitMb: z.number().default(256),\n maxOutputBytes: z.number().default(1024 * 1024), // 1MB\n maxLogEntries: z.number().default(10000),\n});\n\nexport const UpstreamCredentialsSchema = z.object({\n type: z.enum(['oauth2', 'apiKey', 'bearer']), // Align with AuthType\n clientId: z.string().optional(),\n clientSecret: z.string().optional(),\n tokenUrl: z.string().optional(),\n refreshToken: z.string().optional(),\n scopes: z.array(z.string()).optional(),\n apiKey: z.string().optional(),\n bearerToken: z.string().optional(),\n headerName: z.string().optional(),\n});\n\nexport const HttpUpstreamSchema = z.object({\n id: z.string(),\n type: z.literal('http').optional().default('http'),\n url: z.string(),\n credentials: UpstreamCredentialsSchema.optional(),\n});\n\nexport const StdioUpstreamSchema = z.object({\n id: z.string(),\n type: z.literal('stdio'),\n command: z.string(),\n args: z.array(z.string()).optional(),\n env: z.record(z.string(), z.string()).optional(),\n});\n\nexport const UpstreamInfoSchema = z.union([HttpUpstreamSchema, StdioUpstreamSchema]);\n\nexport type ResourceLimits = z.infer<typeof ResourceLimitsSchema>;\n\nexport const ConfigSchema = z.object({\n port: z.union([z.string(), z.number()]).default('3000').transform((v) => Number(v)),\n nodeEnv: z.enum(['development', 'production', 'test']).default('development'),\n logLevel: z.enum(['debug', 'info', 'warn', 'error']).default('info'),\n resourceLimits: ResourceLimitsSchema.default({\n timeoutMs: 30000,\n memoryLimitMb: 256,\n maxOutputBytes: 1024 * 1024,\n maxLogEntries: 10000,\n }),\n secretRedactionPatterns: z.array(z.string()).default([\n '[A-Za-z0-9-_]{20,}', // Default pattern from spec\n ]),\n ipcBearerToken: z.string().optional().default(() => crypto.randomUUID()),\n maxConcurrent: z.number().default(10),\n denoMaxPoolSize: z.number().default(10),\n pyodideMaxPoolSize: z.number().default(3),\n metricsUrl: z.string().default('http://127.0.0.1:9464/metrics'),\n opsPort: z.number().optional(),\n transport: z.enum(['socket', 'stdio']).default('socket'),\n upstreams: z.array(UpstreamInfoSchema).default([]),\n});\n\nexport type Config = z.infer<typeof ConfigSchema>;\n\nexport class ConfigService {\n private config: AppConfig;\n\n constructor(overrides: Partial<AppConfig> = {}) {\n const fileConfig = this.loadConfigFile();\n\n const envConfig = {\n port: process.env.PORT,\n nodeEnv: process.env.NODE_ENV,\n logLevel: process.env.LOG_LEVEL,\n metricsUrl: process.env.METRICS_URL,\n ipcBearerToken: process.env.IPC_BEARER_TOKEN,\n transport: process.argv.includes('--stdio') ? 'stdio' : undefined,\n // upstreams: process.env.UPSTREAMS ? JSON.parse(process.env.UPSTREAMS) : undefined, // Removed per user request\n };\n\n // Remove undefined keys from envConfig\n Object.keys(envConfig).forEach(key => envConfig[key as keyof typeof envConfig] === undefined && delete envConfig[key as keyof typeof envConfig]);\n\n const mergedConfig = {\n ...fileConfig,\n ...envConfig,\n ...overrides,\n };\n\n const result = ConfigSchema.safeParse(mergedConfig);\n if (!result.success) {\n const error = result.error.format();\n throw new Error(`Invalid configuration: ${JSON.stringify(error, null, 2)}`);\n }\n\n this.config = result.data as AppConfig;\n\n // Default opsPort if not set\n if (this.config.opsPort === undefined) {\n if (this.config.transport === 'stdio') {\n this.config.opsPort = 0; // Random port for stdio to avoid conflicts\n } else {\n this.config.opsPort = this.config.port === 0 ? 0 : this.config.port + 1;\n }\n }\n }\n\n get<K extends keyof AppConfig>(key: K): AppConfig[K] {\n return this.config[key];\n }\n\n get all(): AppConfig {\n return { ...this.config };\n }\n\n private loadConfigFile(): Partial<AppConfig> {\n const configPath = process.env.CONFIG_FILE ||\n (fs.existsSync(path.resolve(process.cwd(), 'conduit.yaml')) ? 'conduit.yaml' :\n (fs.existsSync(path.resolve(process.cwd(), 'conduit.json')) ? 'conduit.json' : null));\n\n if (!configPath) {\n console.warn(`[Conduit] No config file found in ${process.cwd()}. Running with default settings.`);\n return {};\n }\n\n try {\n const fullPath = path.resolve(process.cwd(), configPath);\n console.error(`[Conduit] Loading config from ${fullPath}`);\n let fileContent = fs.readFileSync(fullPath, 'utf-8');\n\n // Env var substitution: ${VAR} or ${VAR:-default}\n fileContent = fileContent.replace(/\\$\\{([a-zA-Z0-9_]+)(?::-([^}]+))?\\}/g, (match, varName, defaultValue) => {\n const value = process.env[varName];\n if (value !== undefined) {\n return value;\n }\n return defaultValue !== undefined ? defaultValue : '';\n });\n\n if (configPath.endsWith('.yaml') || configPath.endsWith('.yml')) {\n return yaml.load(fileContent) as Partial<AppConfig>;\n } else {\n return JSON.parse(fileContent);\n }\n } catch (error) {\n console.warn(`Failed to load config file ${configPath}:`, error);\n return {};\n }\n }\n}\n","import pino from 'pino';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { ConfigService } from './config.service.js';\n\nexport const loggerStorage = new AsyncLocalStorage<{ correlationId: string }>();\n\nexport function createLogger(configService: ConfigService) {\n const logLevel = configService.get('logLevel');\n const redactionPatterns = configService.get('secretRedactionPatterns');\n const secretPatterns = redactionPatterns.map(p => new RegExp(p, 'g'));\n\n const redactString = (str: string) => {\n let result = str;\n for (const pattern of secretPatterns) {\n result = result.replace(pattern, '[REDACTED]');\n }\n return result;\n };\n\n return pino({\n level: logLevel,\n hooks: {\n logMethod(inputArgs, method) {\n const redactedArgs = inputArgs.map(arg => {\n try {\n if (typeof arg === 'string') {\n return redactString(arg);\n }\n if (typeof arg === 'object' && arg !== null) {\n // Shallow clone and redact keys if they are strings\n const clone = { ...arg } as any;\n for (const key in clone) {\n if (typeof clone[key] === 'string') {\n clone[key] = redactString(clone[key]);\n }\n }\n return clone;\n }\n } catch (err) {\n return '[REDACTION_ERROR]';\n }\n return arg;\n });\n return method.apply(this, redactedArgs as any);\n }\n },\n redact: {\n paths: ['toolParams.*', 'headers.Authorization', 'headers.authorization', 'params.token'],\n censor: '[REDACTED]',\n },\n mixin() {\n const store = loggerStorage.getStore();\n return {\n correlationId: store?.correlationId,\n };\n },\n // In stdio mode, never use pino-pretty to avoid stdout pollution\n transport: configService.get('transport') !== 'stdio' && configService.get('nodeEnv') === 'development'\n ? { target: 'pino-pretty', options: { colorize: true } }\n : undefined,\n }, configService.get('transport') === 'stdio'\n ? pino.destination(2) // Always write to stderr in stdio mode\n : undefined\n );\n}\n","import net from 'node:net';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { Logger } from 'pino';\nimport { RequestController } from '../core/request.controller.js';\nimport { JSONRPCRequest, ConduitError } from '../core/types.js';\nimport { ExecutionContext } from '../core/execution.context.js';\nimport { ConcurrencyService } from '../core/concurrency.service.js';\nimport { loggerStorage } from '../core/logger.js';\n\nexport interface TransportOptions {\n path?: string; // For Unix Socket or Named Pipe\n port?: number; // For TCP (development)\n host?: string;\n}\n\nexport class SocketTransport {\n private server: net.Server;\n private logger: Logger;\n private requestController: RequestController;\n private concurrencyService: ConcurrencyService;\n\n constructor(\n logger: Logger,\n requestController: RequestController,\n concurrencyService: ConcurrencyService\n ) {\n this.logger = logger;\n this.requestController = requestController;\n this.concurrencyService = concurrencyService;\n this.server = net.createServer((socket) => {\n this.handleConnection(socket);\n });\n\n this.server.on('error', (err) => {\n this.logger.error({ err }, 'Server error');\n });\n }\n\n async listen(options: TransportOptions): Promise<string> {\n return new Promise((resolve, reject) => {\n if (options.path) {\n // Strict IPC mode\n const socketPath = this.formatSocketPath(options.path);\n this.logger.info({ socketPath }, 'Binding to IPC socket');\n\n // Cleanup existing socket if needed (unlikely on Windows, but good for Unix)\n if (os.platform() !== 'win32' && path.isAbsolute(socketPath)) {\n try {\n fs.unlinkSync(socketPath);\n } catch (error: any) {\n if (error.code !== 'ENOENT') {\n this.logger.warn({ err: error, socketPath }, 'Failed to unlink socket before binding');\n }\n }\n }\n\n this.server.listen(socketPath, () => {\n this.resolveAddress(resolve);\n });\n } else if (options.port !== undefined) {\n // Strict TCP mode\n this.logger.info({ port: options.port, host: options.host }, 'Binding to TCP port');\n this.server.listen(options.port, options.host || '127.0.0.1', () => {\n this.resolveAddress(resolve);\n });\n } else {\n reject(new Error('Invalid transport configuration: neither path nor port provided'));\n return;\n }\n\n this.server.on('error', reject);\n });\n }\n\n private resolveAddress(resolve: (value: string) => void) {\n const address = this.server.address();\n const addressStr = typeof address === 'string' ? address : `${address?.address}:${address?.port}`;\n this.logger.info({ address: addressStr }, 'Transport server listening');\n resolve(addressStr);\n }\n\n private formatSocketPath(inputPath: string): string {\n if (os.platform() === 'win32') {\n // Windows Named Pipe format: \\\\.\\pipe\\conduit-[id]\n if (!inputPath.startsWith('\\\\\\\\.\\\\pipe\\\\')) {\n return `\\\\\\\\.\\\\pipe\\\\${inputPath}`;\n }\n return inputPath;\n } else {\n // Unix Socket path\n return path.isAbsolute(inputPath) ? inputPath : path.join(os.tmpdir(), inputPath);\n }\n }\n\n private handleConnection(socket: net.Socket) {\n const remoteAddress = socket.remoteAddress || 'pipe';\n this.logger.debug({ remoteAddress }, 'New connection established');\n\n socket.setEncoding('utf8');\n let buffer = '';\n const MAX_BUFFER_SIZE = 10 * 1024 * 1024; // 10MB limit\n\n socket.on('data', async (chunk) => {\n buffer += chunk;\n\n if (buffer.length > MAX_BUFFER_SIZE) {\n this.logger.error({ remoteAddress }, 'Connection exceeded max buffer size, closing');\n socket.destroy();\n return;\n }\n\n // Backpressure: pause processing new chunks until this buffer is handled\n socket.pause();\n\n try {\n let pos: number;\n while ((pos = buffer.indexOf('\\n')) >= 0) {\n const line = buffer.substring(0, pos).trim();\n buffer = buffer.substring(pos + 1);\n\n if (!line) continue;\n\n let request: JSONRPCRequest;\n try {\n request = JSON.parse(line) as JSONRPCRequest;\n } catch (err) {\n this.logger.error({ err, line }, 'Failed to parse JSON-RPC request');\n const errorResponse = {\n jsonrpc: '2.0',\n id: null,\n error: {\n code: -32700,\n message: 'Parse error',\n },\n };\n socket.write(JSON.stringify(errorResponse) + '\\n');\n continue;\n }\n\n const context = new ExecutionContext({\n logger: this.logger,\n remoteAddress: remoteAddress,\n });\n\n await loggerStorage.run({ correlationId: context.correlationId }, async () => {\n try {\n const response = await this.concurrencyService.run(() =>\n this.requestController.handleRequest(request, context)\n );\n socket.write(JSON.stringify(response) + '\\n');\n } catch (err: any) {\n if (err.name === 'QueueFullError') {\n socket.write(JSON.stringify({\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: ConduitError.ServerBusy,\n message: 'Server busy'\n }\n }) + '\\n');\n } else {\n this.logger.error({ err, requestId: request.id }, 'Request handling failed');\n // Internal error handling usually done by Middleware/RequestController return\n // But if something crashed outside standard flow:\n socket.write(JSON.stringify({\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: ConduitError.InternalError,\n message: 'Internal server error'\n }\n }) + '\\n');\n }\n }\n });\n }\n } catch (err) {\n this.logger.error({ err }, 'Unexpected error in socket data handler');\n socket.destroy();\n } finally {\n socket.resume();\n }\n });\n\n socket.on('close', () => {\n this.logger.debug({ remoteAddress }, 'Connection closed');\n });\n\n socket.on('error', (err) => {\n this.logger.error({ err, remoteAddress }, 'Socket error');\n });\n }\n\n async close(): Promise<void> {\n return new Promise((resolve) => {\n if (this.server.listening) {\n this.server.close(() => {\n this.logger.info('Transport server closed');\n resolve();\n });\n } else {\n resolve();\n }\n });\n }\n}\n","import { v4 as uuidv4 } from 'uuid';\nimport { Logger } from 'pino';\n\nexport interface ExecutionContextOptions {\n tenantId?: string;\n logger: Logger;\n allowedTools?: string[];\n remoteAddress?: string;\n strictValidation?: boolean;\n}\n\nexport class ExecutionContext {\n public readonly correlationId: string;\n public readonly startTime: number;\n public readonly tenantId?: string;\n public logger: Logger;\n public allowedTools?: string[];\n public readonly remoteAddress?: string;\n public readonly strictValidation: boolean;\n\n constructor(options: ExecutionContextOptions) {\n this.correlationId = uuidv4();\n this.startTime = Date.now();\n this.tenantId = options.tenantId;\n this.allowedTools = options.allowedTools;\n this.remoteAddress = options.remoteAddress;\n this.strictValidation = options.strictValidation ?? false;\n this.logger = options.logger.child({\n correlationId: this.correlationId,\n tenantId: this.tenantId,\n });\n }\n\n getDuration(): number {\n return Date.now() - this.startTime;\n }\n}\n","import { Logger } from 'pino';\nimport { RequestController } from '../core/request.controller.js';\nimport { JSONRPCRequest, ConduitError } from '../core/types.js';\nimport { ExecutionContext } from '../core/execution.context.js';\nimport { ConcurrencyService } from '../core/concurrency.service.js';\nimport { loggerStorage } from '../core/logger.js';\n\nexport class StdioTransport {\n private logger: Logger;\n private requestController: RequestController;\n private concurrencyService: ConcurrencyService;\n private buffer: string = '';\n private pendingRequests = new Map<string | number, (response: any) => void>();\n\n constructor(\n logger: Logger,\n requestController: RequestController,\n concurrencyService: ConcurrencyService\n ) {\n this.logger = logger;\n this.requestController = requestController;\n this.concurrencyService = concurrencyService;\n }\n\n async start(): Promise<void> {\n this.logger.info('Starting Stdio transport');\n\n process.stdin.setEncoding('utf8');\n process.stdin.on('data', this.handleData.bind(this));\n\n // Handle stream end if necessary, though usually main process exit handles this\n process.stdin.on('end', () => {\n this.logger.info('Stdin closed');\n });\n }\n\n async callHost(method: string, params: any): Promise<any> {\n const id = Math.random().toString(36).substring(7);\n const request = {\n jsonrpc: '2.0',\n id,\n method,\n params\n };\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingRequests.delete(id);\n reject(new Error(`Timeout waiting for host response to ${method}`));\n }, 30000);\n\n this.pendingRequests.set(id, (response) => {\n clearTimeout(timeout);\n if (response.error) {\n reject(new Error(response.error.message));\n } else {\n resolve(response.result);\n }\n });\n\n this.sendResponse(request);\n });\n }\n\n private handleData(chunk: string) {\n this.buffer += chunk;\n\n let pos: number;\n while ((pos = this.buffer.indexOf('\\n')) >= 0) {\n const line = this.buffer.substring(0, pos).trim();\n this.buffer = this.buffer.substring(pos + 1);\n\n if (!line) continue;\n\n this.processLine(line);\n }\n }\n\n private async processLine(line: string) {\n let message: any;\n try {\n message = JSON.parse(line);\n } catch (err) {\n this.logger.error({ err, line }, 'Failed to parse JSON-RPC message');\n const errorResponse = {\n jsonrpc: '2.0',\n id: null,\n error: {\n code: -32700,\n message: 'Parse error',\n },\n };\n this.sendResponse(errorResponse);\n return;\n }\n\n // Handle Response\n if (message.id !== undefined && (message.result !== undefined || message.error !== undefined)) {\n const pending = this.pendingRequests.get(message.id);\n if (pending) {\n this.pendingRequests.delete(message.id);\n pending(message);\n return;\n }\n }\n\n // Handle Request\n const request = message as JSONRPCRequest;\n const context = new ExecutionContext({\n logger: this.logger,\n remoteAddress: 'stdio',\n });\n\n await loggerStorage.run({ correlationId: context.correlationId }, async () => {\n try {\n const response = await this.concurrencyService.run(() =>\n this.requestController.handleRequest(request, context)\n );\n // Don't send response for notifications (they return null)\n if (response !== null) {\n this.sendResponse(response);\n }\n } catch (err: any) {\n if (err.name === 'QueueFullError') {\n this.sendResponse({\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: ConduitError.ServerBusy,\n message: 'Server busy'\n }\n });\n } else {\n this.logger.error({ err, requestId: request.id }, 'Request handling failed');\n this.sendResponse({\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: ConduitError.InternalError,\n message: 'Internal server error'\n }\n });\n }\n }\n });\n }\n\n private sendResponse(response: any) {\n process.stdout.write(JSON.stringify(response) + '\\n');\n }\n\n async close(): Promise<void> {\n process.stdin.removeAllListeners();\n // We don't close stdout/stdin as they are process-level\n return Promise.resolve();\n }\n}\n","import Fastify from 'fastify';\nimport { Logger } from 'pino';\nimport { AppConfig } from './interfaces/app.config.js';\nimport { GatewayService } from '../gateway/gateway.service.js';\nimport { metrics } from './metrics.service.js';\nimport { RequestController } from './request.controller.js';\nimport axios from 'axios';\n\nexport class OpsServer {\n private fastify = Fastify();\n private logger: Logger;\n private config: AppConfig;\n private gatewayService: GatewayService;\n private requestController: RequestController;\n\n constructor(logger: Logger, config: AppConfig, gatewayService: GatewayService, requestController: RequestController) {\n this.logger = logger;\n this.config = config;\n this.gatewayService = gatewayService;\n this.requestController = requestController;\n\n this.setupRoutes();\n }\n\n private setupRoutes() {\n this.fastify.get('/health', async (request, reply) => {\n const gatewayHealth = await this.gatewayService.healthCheck();\n const requestHealth = await this.requestController.healthCheck();\n\n const overallStatus = gatewayHealth.status === 'ok' && requestHealth.status === 'ok' ? 'ok' : 'error';\n\n return reply.status(overallStatus === 'ok' ? 200 : 503).send({\n status: overallStatus,\n version: '1.0.0',\n gateway: gatewayHealth,\n request: requestHealth,\n });\n });\n\n this.fastify.get('/metrics', async (request, reply) => {\n try {\n // Proxy from OTEL Prometheus exporter\n // Use ConfigService for metrics URL, default to standard localhost:9464\n const metricsUrl = this.config.metricsUrl || 'http://127.0.0.1:9464/metrics';\n const response = await axios.get(metricsUrl);\n return reply.type('text/plain').send(response.data);\n } catch (err) {\n this.logger.error({ err }, 'Failed to fetch OTEL metrics');\n // Fallback to minimal metrics if OTEL exporter is down\n const fallback = '# Metrics consolidated into OpenTelemetry. Check port 9464.\\n' +\n `conduit_uptime_seconds ${process.uptime()}\\n` +\n `conduit_memory_rss_bytes ${process.memoryUsage().rss}\\n`;\n return reply.type('text/plain').send(fallback);\n }\n });\n }\n\n async listen(): Promise<string> {\n // Use explicit opsPort from config\n const port = this.config.opsPort !== undefined ? this.config.opsPort : 3001;\n try {\n const address = await this.fastify.listen({ port, host: '0.0.0.0' });\n this.logger.info({ address }, 'Ops server listening');\n return address;\n } catch (err) {\n this.logger.error({ err }, 'Failed to start Ops server');\n throw err;\n }\n }\n\n async close() {\n await this.fastify.close();\n }\n}\n","import pLimit from 'p-limit';\nimport { Logger } from 'pino';\nimport { trace } from '@opentelemetry/api';\nimport { metrics } from './metrics.service.js';\n\nexport interface ConcurrencyOptions {\n maxConcurrent: number;\n maxQueueSize?: number;\n}\n\nexport class QueueFullError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'QueueFullError';\n }\n}\n\nexport class ConcurrencyService {\n private limit: ReturnType<typeof pLimit>;\n private logger: Logger;\n private maxQueueSize: number;\n private queueDepthHistogram: any; // Using explicit type locally if needed, or rely on metrics service later. Using direct OTEL for now involves refactor.\n // Let's rely on internal state for rejection and let MetricsService handle reporting if possible, or add it here.\n // simpler: usage of metrics service is better pattern.\n\n constructor(logger: Logger, options: ConcurrencyOptions) {\n this.logger = logger;\n this.limit = pLimit(options.maxConcurrent);\n this.maxQueueSize = options.maxQueueSize || 100; // Default to 100\n\n metrics.registerQueueLengthProvider(() => this.limit.pendingCount);\n }\n\n async run<T>(fn: () => Promise<T>): Promise<T> {\n if (this.limit.pendingCount >= this.maxQueueSize) {\n this.logger.warn({ pending: this.limit.pendingCount, max: this.maxQueueSize }, 'Request queue full, rejecting request');\n throw new QueueFullError('Server is too busy, please try again later');\n }\n\n const active = this.limit.activeCount;\n const pending = this.limit.pendingCount;\n\n this.logger.debug({ active, pending }, 'Concurrency status before task');\n\n // Add attributes to current OTEL span if exists\n const span = trace.getActiveSpan();\n if (span) {\n span.setAttributes({\n 'concurrency.active': active,\n 'concurrency.pending': pending,\n });\n }\n\n try {\n return await this.limit(fn);\n } finally {\n this.logger.debug({\n active: this.limit.activeCount,\n pending: this.limit.pendingCount\n }, 'Concurrency status after task');\n }\n }\n\n get stats() {\n return {\n activeCount: this.limit.activeCount,\n pendingCount: this.limit.pendingCount,\n };\n }\n}\n","import { metrics as otelMetrics, Counter, Histogram, ObservableGauge, ValueType } from '@opentelemetry/api';\n\nexport class MetricsService {\n private static instance: MetricsService;\n private meter = otelMetrics.getMeter('conduit');\n\n private executionCounter: Counter;\n private cacheHitsCounter: Counter;\n private cacheMissesCounter: Counter;\n private executionLatency: Histogram;\n private toolExecutionDuration: Histogram;\n private requestQueueLength: ObservableGauge;\n private activeExecutionsGauge: ObservableGauge;\n\n private activeExecutionsCount = 0;\n\n private queueLengthCallback: () => number = () => 0;\n\n private constructor() {\n this.executionCounter = this.meter.createCounter('conduit.executions.total', {\n description: 'Total number of executions',\n });\n\n this.cacheHitsCounter = this.meter.createCounter('conduit.cache.hits.total', {\n description: 'Total number of schema cache hits',\n });\n\n this.cacheMissesCounter = this.meter.createCounter('conduit.cache.misses.total', {\n description: 'Total number of schema cache misses',\n });\n\n this.executionLatency = this.meter.createHistogram('conduit.executions.latency', {\n description: 'Execution latency in milliseconds',\n unit: 'ms',\n valueType: ValueType.DOUBLE,\n });\n\n this.toolExecutionDuration = this.meter.createHistogram('conduit.tool.execution_duration_seconds', {\n description: 'Duration of tool executions',\n unit: 's',\n valueType: ValueType.DOUBLE,\n });\n\n this.requestQueueLength = this.meter.createObservableGauge('conduit.request_queue_length', {\n description: 'Current request queue depth',\n valueType: ValueType.INT,\n });\n\n this.activeExecutionsGauge = this.meter.createObservableGauge('conduit.executions.active', {\n description: 'Current number of active executions',\n });\n\n this.activeExecutionsGauge.addCallback((result) => {\n result.observe(this.activeExecutionsCount);\n });\n\n this.requestQueueLength.addCallback((result) => {\n result.observe(this.queueLengthCallback());\n });\n }\n\n static getInstance(): MetricsService {\n if (!MetricsService.instance) {\n MetricsService.instance = new MetricsService();\n }\n return MetricsService.instance;\n }\n\n recordExecutionStart() {\n this.activeExecutionsCount++;\n this.executionCounter.add(1);\n }\n\n recordExecutionEnd(durationMs: number, toolName?: string) {\n this.activeExecutionsCount = Math.max(0, this.activeExecutionsCount - 1);\n this.executionLatency.record(durationMs, { tool: toolName || 'unknown' });\n }\n\n recordToolExecution(durationMs: number, toolName: string, success: boolean) {\n // Convert ms to seconds for the histogram\n this.toolExecutionDuration.record(durationMs / 1000, {\n tool_name: toolName,\n success: String(success)\n });\n }\n\n recordCacheHit() {\n this.cacheHitsCounter.add(1);\n }\n\n recordCacheMiss() {\n this.cacheMissesCounter.add(1);\n }\n\n // This is now handled by OTEL Prometheus exporter, \n // but we can provide a way to get the endpoint data if needed.\n\n\n getMetrics() {\n return {\n activeExecutions: this.activeExecutionsCount,\n uptime: process.uptime(),\n memory: process.memoryUsage(),\n };\n }\n\n registerQueueLengthProvider(provider: () => number) {\n this.queueLengthCallback = provider;\n }\n}\n\nexport const metrics = MetricsService.getInstance();\n","import { ExecutionContext } from './execution.context.js';\nimport { Logger } from 'pino';\n\nimport { GatewayService } from '../gateway/gateway.service.js';\nimport { metrics } from './metrics.service.js';\nimport { ExecutionService } from './execution.service.js';\n\nimport { Middleware } from './interfaces/middleware.interface.js';\n\nimport { ConduitError } from './types.js';\nimport type { JSONRPCRequest, JSONRPCResponse } from './types.js';\n\nexport { ConduitError };\nexport type { JSONRPCRequest, JSONRPCResponse };\n\nexport class RequestController {\n private logger: Logger;\n private executionService: ExecutionService;\n private gatewayService: GatewayService;\n\n private middlewares: Middleware[] = [];\n\n constructor(\n logger: Logger,\n executionService: ExecutionService,\n gatewayService: GatewayService,\n middlewares: Middleware[] = []\n ) {\n this.logger = logger;\n this.executionService = executionService;\n this.gatewayService = gatewayService;\n this.middlewares = middlewares;\n }\n\n use(middleware: Middleware) {\n this.middlewares.push(middleware);\n }\n\n\n\n async handleRequest(request: JSONRPCRequest, context: ExecutionContext): Promise<JSONRPCResponse | null> {\n return this.executePipeline(request, context);\n }\n\n private async executePipeline(request: JSONRPCRequest, context: ExecutionContext): Promise<JSONRPCResponse | null> {\n let index = -1;\n\n const dispatch = async (i: number): Promise<JSONRPCResponse | null> => {\n if (i <= index) throw new Error('next() called multiple times');\n index = i;\n\n const middleware = this.middlewares[i];\n if (middleware) {\n return middleware.handle(request, context, () => dispatch(i + 1));\n }\n\n return this.finalHandler(request, context);\n };\n\n return dispatch(0);\n }\n\n private async handleValidateTool(request: JSONRPCRequest, context: ExecutionContext): Promise<JSONRPCResponse> {\n const params = request.params as { toolName: string; args: any };\n if (!params || !params.toolName || !params.args) {\n return {\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: -32602,\n message: 'Missing toolName or args params',\n },\n };\n }\n\n try {\n const result = await this.gatewayService.validateTool(params.toolName, params.args, context);\n return {\n jsonrpc: '2.0',\n id: request.id,\n result,\n };\n } catch (error: any) {\n return {\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: -32603,\n message: error.message || 'Validation failed',\n },\n };\n }\n }\n\n private async finalHandler(request: JSONRPCRequest, context: ExecutionContext): Promise<JSONRPCResponse | null> {\n const { method, params, id } = request;\n // Logging and metrics handled by middlewares now\n\n // Try/catch handled by ErrorMiddleware, but we handle logic errors here if needed\n // Actually routing logic should just throw and let middleware catch?\n // Or specific logic.\n\n switch (method) {\n case 'tools/list': // Standard MCP method name\n case 'mcp_discover_tools':\n return this.handleDiscoverTools(params, context, id);\n case 'resources/list':\n case 'prompts/list':\n return { jsonrpc: '2.0', id, result: { items: [] } };\n case 'mcp_list_tool_packages':\n return this.handleListToolPackages(params, context, id);\n case 'mcp_list_tool_stubs':\n return this.handleListToolStubs(params, context, id);\n case 'mcp_read_tool_schema':\n return this.handleReadToolSchema(params, context, id);\n case 'mcp_validate_tool':\n return this.handleValidateTool(request, context);\n case 'mcp_call_tool':\n case 'tools/call':\n return this.handleCallTool(params, context, id);\n case 'mcp_execute_typescript':\n return this.handleExecuteTypeScript(params, context, id);\n case 'mcp_execute_python':\n return this.handleExecutePython(params, context, id);\n case 'mcp_execute_isolate':\n return this.handleExecuteIsolate(params, context, id);\n case 'initialize':\n return this.handleInitialize(params, context, id);\n case 'notifications/initialized':\n return null; // Notifications don't get responses per MCP spec\n case 'mcp_register_upstream':\n return this.handleRegisterUpstream(params, context, id);\n case 'ping':\n return { jsonrpc: '2.0', id, result: {} };\n default:\n // metrics.recordExecutionEnd is handled by LoggingMiddleware??\n // Wait, if 404, LoggingMiddleware records execution end?\n // Yes, handle() in LoggingMiddleware wraps next().\n return this.errorResponse(id, -32601, `Method not found: ${method}`);\n }\n }\n\n private async handleRegisterUpstream(params: any, context: ExecutionContext, id: string | number): Promise<JSONRPCResponse> {\n if (!params || !params.id || !params.type || (!params.url && !params.command)) {\n return this.errorResponse(id, -32602, 'Missing registration parameters (id, type, url/command)');\n }\n\n try {\n this.gatewayService.registerUpstream(params);\n return {\n jsonrpc: '2.0',\n id,\n result: { success: true }\n };\n } catch (err: any) {\n return this.errorResponse(id, -32001, err.message);\n }\n }\n\n private async handleDiscoverTools(params: any, context: ExecutionContext, id: string | number): Promise<JSONRPCResponse> {\n const tools = await this.gatewayService.discoverTools(context);\n\n // Filter to only MCP-standard fields for compatibility with strict clients\n const standardizedTools = tools.map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n }));\n\n return {\n jsonrpc: '2.0',\n id,\n result: {\n tools: standardizedTools,\n },\n };\n }\n\n private async handleListToolPackages(params: any, context: ExecutionContext, id: string | number): Promise<JSONRPCResponse> {\n const packages = await this.gatewayService.listToolPackages();\n return {\n jsonrpc: '2.0',\n id,\n result: {\n packages\n }\n };\n }\n\n private async handleListToolStubs(params: any, context: ExecutionContext, id: string | number): Promise<JSONRPCResponse> {\n const { packageId } = params;\n if (!packageId) {\n return this.errorResponse(id, -32602, 'Missing packageId parameter');\n }\n\n try {\n const stubs = await this.gatewayService.listToolStubs(packageId, context);\n return {\n jsonrpc: '2.0',\n id,\n result: {\n stubs\n }\n };\n } catch (error: any) {\n return this.errorResponse(id, -32001, error.message);\n }\n }\n\n private async handleReadToolSchema(params: any, context: ExecutionContext, id: string | number): Promise<JSONRPCResponse> {\n const { toolId } = params;\n if (!toolId) {\n return this.errorResponse(id, -32602, 'Missing toolId parameter');\n }\n\n try {\n const schema = await this.gatewayService.getToolSchema(toolId, context);\n if (!schema) {\n return this.errorResponse(id, -32001, `Tool not found: ${toolId}`);\n }\n return {\n jsonrpc: '2.0',\n id,\n result: {\n schema\n }\n };\n } catch (error: any) {\n return this.errorResponse(id, -32003, error.message);\n }\n }\n\n private async handleCallTool(params: any, context: ExecutionContext, id: string | number): Promise<JSONRPCResponse> {\n if (!params) return this.errorResponse(id, -32602, 'Missing parameters');\n const { name, arguments: toolArgs } = params;\n\n const toolId = this.gatewayService.policyService.parseToolName(name);\n const baseName = toolId.name;\n const isConduit = toolId.namespace === 'conduit' || toolId.namespace === '';\n\n // Route built-in tools to their specific handlers\n if (isConduit) {\n switch (baseName) {\n case 'mcp_execute_typescript':\n return this.handleExecuteToolCall('typescript', toolArgs, context, id);\n case 'mcp_execute_python':\n return this.handleExecuteToolCall('python', toolArgs, context, id);\n case 'mcp_execute_isolate':\n return this.handleExecuteToolCall('isolate', toolArgs, context, id);\n }\n }\n\n const response = await this.gatewayService.callTool(name, toolArgs, context);\n return { ...response, id };\n }\n\n private formatExecutionResult(result: { stdout: string; stderr: string; exitCode: number | null }) {\n const structured = {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n };\n return {\n content: [{\n type: 'text',\n text: JSON.stringify(structured),\n }],\n structuredContent: structured,\n };\n }\n\n private async handleExecuteToolCall(\n mode: 'typescript' | 'python' | 'isolate',\n params: any,\n context: ExecutionContext,\n id: string | number\n ): Promise<JSONRPCResponse> {\n if (!params) return this.errorResponse(id, -32602, 'Missing parameters');\n const { code, limits, allowedTools } = params;\n\n if (Array.isArray(allowedTools)) {\n context.allowedTools = allowedTools;\n }\n\n const result = mode === 'typescript'\n ? await this.executionService.executeTypeScript(code, limits, context, allowedTools)\n : mode === 'python'\n ? await this.executionService.executePython(code, limits, context, allowedTools)\n : await this.executionService.executeIsolate(code, limits, context, allowedTools);\n\n if (result.error) {\n return this.errorResponse(id, result.error.code, result.error.message);\n }\n\n return {\n jsonrpc: '2.0',\n id,\n result: this.formatExecutionResult(result),\n };\n }\n\n private async handleExecuteTypeScript(params: any, context: ExecutionContext, id: string | number): Promise<JSONRPCResponse> {\n if (!params) return this.errorResponse(id, -32602, 'Missing parameters');\n const { code, limits, allowedTools } = params;\n\n if (Array.isArray(allowedTools)) {\n context.allowedTools = allowedTools;\n }\n\n const result = await this.executionService.executeTypeScript(code, limits, context, allowedTools);\n\n if (result.error) {\n return this.errorResponse(id, result.error.code, result.error.message);\n }\n\n return {\n jsonrpc: '2.0',\n id,\n result: {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n },\n };\n }\n\n private async handleExecutePython(params: any, context: ExecutionContext, id: string | number): Promise<JSONRPCResponse> {\n if (!params) return this.errorResponse(id, -32602, 'Missing parameters');\n const { code, limits, allowedTools } = params;\n\n if (Array.isArray(allowedTools)) {\n context.allowedTools = allowedTools;\n }\n\n const result = await this.executionService.executePython(code, limits, context, allowedTools);\n\n if (result.error) {\n return this.errorResponse(id, result.error.code, result.error.message);\n }\n\n return {\n jsonrpc: '2.0',\n id,\n result: {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n },\n };\n }\n\n private async handleInitialize(params: any, context: ExecutionContext, id: string | number): Promise<JSONRPCResponse> {\n // Echo back the client's protocol version for compatibility, or use latest if not provided\n const clientVersion = params?.protocolVersion || '2025-06-18';\n return {\n jsonrpc: '2.0',\n id,\n result: {\n protocolVersion: clientVersion,\n capabilities: {\n tools: {\n listChanged: true\n },\n resources: {\n listChanged: true,\n subscribe: true\n }\n },\n serverInfo: {\n name: 'conduit',\n version: process.env.npm_package_version || '1.1.0'\n }\n }\n };\n }\n\n private async handleExecuteIsolate(params: any, context: ExecutionContext, id: string | number): Promise<JSONRPCResponse> {\n if (!params) return this.errorResponse(id, -32602, 'Missing parameters');\n const { code, limits, allowedTools } = params;\n\n if (Array.isArray(allowedTools)) {\n context.allowedTools = allowedTools;\n }\n\n const result = await this.executionService.executeIsolate(code, limits, context, allowedTools);\n\n if (result.error) {\n return this.errorResponse(id, result.error.code, result.error.message);\n }\n\n return {\n jsonrpc: '2.0',\n id,\n result: {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n },\n };\n }\n\n private errorResponse(id: string | number, code: number, message: string): JSONRPCResponse {\n return {\n jsonrpc: '2.0',\n id,\n error: {\n code,\n message,\n },\n };\n }\n\n async shutdown() {\n await this.executionService.shutdown();\n }\n\n async healthCheck() {\n const pyodideHealth = await this.executionService.healthCheck();\n return {\n status: pyodideHealth.status === 'ok' ? 'ok' : 'error',\n pyodide: pyodideHealth\n };\n }\n\n async warmup() {\n await this.executionService.warmup();\n }\n}\n","import { Logger } from 'pino';\nimport axios from 'axios';\nimport { JSONRPCRequest, JSONRPCResponse, ToolManifest } from '../core/types.js';\nimport { AuthService, UpstreamCredentials } from './auth.service.js';\nimport { ExecutionContext } from '../core/execution.context.js';\nimport { IUrlValidator } from '../core/interfaces/url.validator.interface.js';\n\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';\nimport { z } from 'zod';\n\nexport type UpstreamInfo = {\n id: string;\n credentials?: UpstreamCredentials;\n} & (\n | { type?: 'http'; url: string }\n | { type: 'stdio'; command: string; args?: string[]; env?: Record<string, string> }\n );\n\nexport class UpstreamClient {\n private logger: Logger;\n private info: UpstreamInfo;\n private authService: AuthService;\n private urlValidator: IUrlValidator;\n private mcpClient?: Client;\n private transport?: StdioClientTransport;\n private connected: boolean = false;\n\n constructor(logger: Logger, info: UpstreamInfo, authService: AuthService, urlValidator: IUrlValidator) {\n this.logger = logger.child({ upstreamId: info.id });\n this.info = info;\n this.authService = authService;\n this.urlValidator = urlValidator;\n\n if (this.info.type === 'stdio') {\n const env = { ...process.env, ...this.info.env };\n // Filter undefined values\n const cleanEnv = Object.entries(env).reduce((acc, [k, v]) => {\n if (v !== undefined) acc[k] = v;\n return acc;\n }, {} as Record<string, string>);\n\n this.transport = new StdioClientTransport({\n command: this.info.command,\n args: this.info.args,\n env: cleanEnv,\n });\n this.mcpClient = new Client({\n name: 'conduit-gateway',\n version: '1.0.0',\n }, {\n capabilities: {},\n });\n }\n }\n\n private async ensureConnected() {\n if (!this.mcpClient || !this.transport) return;\n if (this.connected) return;\n\n try {\n this.logger.debug('Connecting to upstream transport...');\n await this.mcpClient.connect(this.transport);\n this.connected = true;\n this.logger.info('Connected to upstream MCP');\n } catch (e: any) {\n this.logger.error({ err: e.message }, 'Failed to connect to upstream');\n throw e;\n }\n }\n\n async call(request: JSONRPCRequest, context: ExecutionContext): Promise<JSONRPCResponse> {\n // Helper to determine type safely\n const isStdio = (info: UpstreamInfo): info is { type: 'stdio'; command: string; args?: string[]; env?: Record<string, string>; id: string; credentials?: UpstreamCredentials } => info.type === 'stdio';\n\n if (isStdio(this.info)) {\n return this.callStdio(request);\n } else {\n return this.callHttp(request, context as ExecutionContext);\n }\n }\n\n private async callStdio(request: JSONRPCRequest): Promise<JSONRPCResponse> {\n if (!this.mcpClient) {\n return { jsonrpc: '2.0', id: request.id, error: { code: -32603, message: 'Stdio client not initialized' } };\n }\n\n try {\n await this.ensureConnected();\n\n // Map GatewayService method names to SDK typed methods\n if (request.method === 'list_tools' || request.method === 'tools/list') {\n const result = await this.mcpClient.listTools();\n return {\n jsonrpc: '2.0',\n id: request.id,\n result: result\n };\n } else if (request.method === 'call_tool' || request.method === 'tools/call') {\n const params = request.params as { name: string; arguments?: Record<string, unknown> };\n const result = await this.mcpClient.callTool({\n name: params.name,\n arguments: params.arguments,\n });\n const normalizedResult = (result && Array.isArray((result as any).content))\n ? result\n : {\n content: [{\n type: 'text',\n text: typeof result === 'string' ? result : JSON.stringify(result ?? null),\n }],\n };\n return {\n jsonrpc: '2.0',\n id: request.id,\n result: normalizedResult\n };\n } else {\n // Fallback to generic request for other methods\n const result = await this.mcpClient.request(\n { method: request.method, params: request.params },\n z.any()\n );\n return {\n jsonrpc: '2.0',\n id: request.id,\n result: result\n };\n }\n } catch (error: any) {\n this.logger.error({ err: error }, 'Stdio call failed');\n return {\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: error.code || -32603,\n message: error.message || 'Internal error in stdio transport'\n }\n };\n }\n }\n\n private async callHttp(request: JSONRPCRequest, context: ExecutionContext): Promise<JSONRPCResponse> {\n // Narrowing for TS\n if (this.info.type === 'stdio') throw new Error('Unreachable');\n const url = this.info.url;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Correlation-Id': context.correlationId,\n };\n\n if (context.tenantId) {\n headers['X-Tenant-Id'] = context.tenantId;\n }\n\n if (this.info.credentials) {\n const authHeaders = await this.authService.getAuthHeaders(this.info.credentials);\n Object.assign(headers, authHeaders);\n }\n\n const securityResult = await this.urlValidator.validateUrl(url);\n if (!securityResult.valid) {\n this.logger.error({ url }, 'Blocked upstream URL (SSRF)');\n return {\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: -32003,\n message: securityResult.message || 'Forbidden URL',\n },\n };\n }\n\n try {\n this.logger.debug({ method: request.method }, 'Calling upstream MCP');\n\n // Fix Sev1: Use the resolved safe IP to prevent DNS rebinding\n const originalUrl = new URL(url);\n const requestUrl = securityResult.resolvedIp ?\n `${originalUrl.protocol}//${securityResult.resolvedIp}${originalUrl.port ? ':' + originalUrl.port : ''}${originalUrl.pathname}${originalUrl.search}${originalUrl.hash}` :\n url;\n\n // Ensure Host header is set to the original hostname for virtual hosting/SNI\n headers['Host'] = originalUrl.hostname;\n\n const response = await axios.post(requestUrl, request, {\n headers,\n timeout: 10000,\n maxRedirects: 0,\n });\n\n return response.data as JSONRPCResponse;\n } catch (err: any) {\n this.logger.error({ err: err.message }, 'Upstream MCP call failed');\n return {\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: -32008,\n message: `Upstream error: ${err.message}`,\n },\n };\n }\n }\n async getManifest(context: ExecutionContext): Promise<ToolManifest | null> {\n if (this.info.type !== 'http') return null;\n\n try {\n const baseUrl = this.info.url.replace(/\\/$/, ''); // Remove trailing slash\n const manifestUrl = `${baseUrl}/conduit.manifest.json`;\n\n const headers: Record<string, string> = {\n 'X-Correlation-Id': context.correlationId,\n };\n\n if (this.info.credentials) {\n const authHeaders = await this.authService.getAuthHeaders(this.info.credentials);\n Object.assign(headers, authHeaders);\n }\n\n const securityResult = await this.urlValidator.validateUrl(manifestUrl);\n if (!securityResult.valid) {\n this.logger.warn({ url: manifestUrl }, 'Blocked manifest URL (SSRF)');\n return null;\n }\n\n // Fix Sev1 approach: Use resolved IP\n const originalUrl = new URL(manifestUrl);\n const requestUrl = securityResult.resolvedIp ?\n `${originalUrl.protocol}//${securityResult.resolvedIp}${originalUrl.port ? ':' + originalUrl.port : ''}${originalUrl.pathname}${originalUrl.search}${originalUrl.hash}` :\n manifestUrl;\n\n headers['Host'] = originalUrl.hostname;\n\n const response = await axios.get(requestUrl, {\n headers,\n timeout: 5000,\n maxRedirects: 0,\n });\n\n if (response.status === 200 && response.data && Array.isArray(response.data.tools)) {\n return response.data;\n }\n } catch (error) {\n // Ignore manifest errors and fallback to RPC\n this.logger.debug({ err: error }, 'Failed to fetch manifest (will fallback)');\n }\n return null;\n }\n}\n","import { Logger } from 'pino';\nimport axios from 'axios';\n\nexport type AuthType = 'apiKey' | 'oauth2' | 'bearer';\n\nexport interface UpstreamCredentials {\n type: AuthType;\n apiKey?: string;\n bearerToken?: string;\n clientId?: string;\n clientSecret?: string;\n tokenUrl?: string;\n refreshToken?: string;\n scopes?: string[];\n}\n\ninterface CachedToken {\n accessToken: string;\n expiresAt: number;\n}\n\nexport class AuthService {\n private logger: Logger;\n // Cache tokens separately from credentials to avoid mutation\n private tokenCache = new Map<string, CachedToken>();\n // Prevent concurrent refresh requests for the same client\n private refreshLocks = new Map<string, Promise<string>>();\n\n constructor(logger: Logger) {\n this.logger = logger;\n }\n\n async getAuthHeaders(creds: UpstreamCredentials): Promise<Record<string, string>> {\n switch (creds.type) {\n case 'apiKey':\n return { 'X-API-Key': creds.apiKey || '' };\n case 'bearer':\n return { 'Authorization': `Bearer ${creds.bearerToken}` };\n case 'oauth2':\n return { 'Authorization': await this.getOAuth2Token(creds) };\n default:\n throw new Error(`Unsupported auth type: ${creds.type}`);\n }\n }\n\n private async getOAuth2Token(creds: UpstreamCredentials): Promise<string> {\n if (!creds.tokenUrl || !creds.clientId) {\n throw new Error('OAuth2 credentials missing required fields (tokenUrl, clientId)');\n }\n\n const cacheKey = `${creds.clientId}:${creds.tokenUrl}`;\n\n // Check cache first (with 30s buffer)\n const cached = this.tokenCache.get(cacheKey);\n if (cached && cached.expiresAt > Date.now() + 30000) {\n return `Bearer ${cached.accessToken}`;\n }\n\n // Check if refresh is already in progress\n const existingRefresh = this.refreshLocks.get(cacheKey);\n if (existingRefresh) {\n return existingRefresh;\n }\n\n // Start refresh with lock\n const refreshPromise = this.doRefresh(creds, cacheKey);\n this.refreshLocks.set(cacheKey, refreshPromise);\n\n try {\n return await refreshPromise;\n } finally {\n this.refreshLocks.delete(cacheKey);\n }\n }\n\n private async doRefresh(creds: UpstreamCredentials, cacheKey: string): Promise<string> {\n if (!creds.tokenUrl || !creds.refreshToken || !creds.clientId) {\n throw new Error('OAuth2 credentials missing required fields for refresh');\n }\n\n this.logger.info({ tokenUrl: creds.tokenUrl, clientId: creds.clientId }, 'Refreshing OAuth2 token');\n\n try {\n const body = new URLSearchParams();\n body.set('grant_type', 'refresh_token');\n body.set('refresh_token', creds.refreshToken);\n body.set('client_id', creds.clientId);\n if (creds.clientSecret) {\n body.set('client_secret', creds.clientSecret);\n }\n\n const response = await axios.post(creds.tokenUrl, body, {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'Accept': 'application/json',\n },\n });\n\n const { access_token, expires_in } = response.data;\n const expiresInSeconds = Number(expires_in) || 3600;\n\n // Cache the token (don't mutate the input credentials)\n this.tokenCache.set(cacheKey, {\n accessToken: access_token,\n expiresAt: Date.now() + (expiresInSeconds * 1000),\n });\n\n return `Bearer ${access_token}`;\n } catch (err: any) {\n const errorMsg = err.response?.data?.error_description || err.response?.data?.error || err.message;\n this.logger.error({ err: errorMsg }, 'Failed to refresh OAuth2 token');\n throw new Error(`OAuth2 refresh failed: ${errorMsg}`);\n }\n }\n}\n","import { LRUCache } from 'lru-cache';\nimport { Logger } from 'pino';\nimport { metrics } from '../core/metrics.service.js';\n\nexport interface ToolSchema {\n name: string;\n description?: string;\n inputSchema: any;\n}\n\nexport class SchemaCache {\n private cache: LRUCache<string, ToolSchema[]>;\n private logger: Logger;\n\n constructor(logger: Logger, max: number = 100, ttl: number = 1000 * 60 * 60) { // 1 hour TTL default\n this.logger = logger;\n this.cache = new LRUCache({\n max,\n ttl,\n });\n }\n\n get(upstreamId: string): ToolSchema[] | undefined {\n const result = this.cache.get(upstreamId);\n if (result) {\n metrics.recordCacheHit();\n } else {\n metrics.recordCacheMiss();\n }\n return result;\n }\n\n set(upstreamId: string, tools: ToolSchema[]) {\n this.logger.debug({ upstreamId, count: tools.length }, 'Caching tool schemas');\n this.cache.set(upstreamId, tools);\n }\n\n invalidate(upstreamId: string) {\n this.logger.debug({ upstreamId }, 'Invalidating schema cache');\n this.cache.delete(upstreamId);\n }\n\n clear() {\n this.cache.clear();\n }\n}\n","/**\n * PolicyService - Authorization and tool access control\n * Extracted from GatewayService per architecture-findings.md\n */\n\n/**\n * Structured identifier for a tool, replacing fragile `upstream__toolname` strings.\n */\nexport interface ToolIdentifier {\n namespace: string; // upstream ID (e.g., \"github\")\n name: string; // tool name (e.g., \"createIssue\")\n}\n\nexport class PolicyService {\n /**\n * Parse a qualified tool name string into a structured ToolIdentifier.\n * @param qualifiedName - e.g., \"github__createIssue\" or \"github__api__listRepos\"\n */\n parseToolName(qualifiedName: string): ToolIdentifier {\n const separatorIndex = qualifiedName.indexOf('__');\n if (separatorIndex === -1) {\n // No namespace - treat entire string as name with empty namespace\n return { namespace: '', name: qualifiedName };\n }\n return {\n namespace: qualifiedName.substring(0, separatorIndex),\n name: qualifiedName.substring(separatorIndex + 2)\n };\n }\n\n /**\n * Format a ToolIdentifier back to a qualified string.\n */\n formatToolName(tool: ToolIdentifier): string {\n if (!tool.namespace) {\n return tool.name;\n }\n return `${tool.namespace}__${tool.name}`;\n }\n\n /**\n * Check if a tool matches any pattern in the allowlist.\n * Supports:\n * - Exact match: \"github.createIssue\" matches \"github__createIssue\"\n * - Wildcard: \"github.*\" matches any tool in the github namespace\n * \n * @param tool - ToolIdentifier or qualified string\n * @param allowedTools - Array of patterns (dot-notation, e.g., \"github.*\" or \"github.createIssue\")\n */\n isToolAllowed(tool: ToolIdentifier | string, allowedTools: string[]): boolean {\n const toolId = typeof tool === 'string' ? this.parseToolName(tool) : tool;\n const toolParts = [toolId.namespace, ...toolId.name.split('__')].filter(p => p);\n\n return allowedTools.some(pattern => {\n const patternParts = pattern.split('.');\n\n // Wildcard pattern: \"foo.*\" or \"foo.bar.*\"\n if (patternParts[patternParts.length - 1] === '*') {\n const prefixParts = patternParts.slice(0, -1);\n if (prefixParts.length > toolParts.length) return false;\n\n // Check if prefix parts match tool parts exactly\n for (let i = 0; i < prefixParts.length; i++) {\n if (prefixParts[i] !== toolParts[i]) return false;\n }\n return true;\n }\n\n // Improved matching: if pattern has only one part, match it against the tool's name part\n if (patternParts.length === 1 && toolParts.length > 1) {\n return patternParts[0] === toolParts[toolParts.length - 1];\n }\n\n // Exact match: pattern parts must equal tool parts\n if (patternParts.length !== toolParts.length) return false;\n for (let i = 0; i < patternParts.length; i++) {\n if (patternParts[i] !== toolParts[i]) return false;\n }\n return true;\n });\n }\n}\n","import { Logger } from 'pino';\nimport { HostClient } from './host.client.js';\nimport { StdioTransport } from '../transport/stdio.transport.js';\nimport { UpstreamClient, UpstreamInfo } from './upstream.client.js';\nimport { AuthService } from './auth.service.js';\nimport { SchemaCache, ToolSchema } from './schema.cache.js';\nimport { JSONRPCRequest, JSONRPCResponse, ToolPackage, ToolStub } from '../core/types.js';\nimport { ExecutionContext } from '../core/execution.context.js';\nimport { IUrlValidator } from '../core/interfaces/url.validator.interface.js';\nimport { metrics } from '../core/metrics.service.js';\nimport { PolicyService, ToolIdentifier } from '../core/policy.service.js';\nimport { Ajv } from 'ajv';\nimport addFormats from 'ajv-formats';\n\nconst BUILT_IN_TOOLS: ToolSchema[] = [\n {\n name: 'mcp_execute_typescript',\n description: 'Executes TypeScript code in a secure sandbox. Access MCP tools via the global `tools` object (e.g. `filesystem__list_directory` -> `await tools.filesystem.list_directory(...)`).',\n inputSchema: {\n type: 'object',\n properties: {\n code: {\n type: 'string',\n description: 'The TypeScript code to execute.'\n },\n allowedTools: {\n type: 'array',\n items: { type: 'string' },\n description: 'List of tool names (e.g. \"filesystem.list_directory\" or \"filesystem.*\") that the script is allowed to call.'\n }\n },\n required: ['code']\n }\n },\n {\n name: 'mcp_execute_python',\n description: 'Executes Python code in a secure sandbox. Access MCP tools via the global `tools` object (e.g. `filesystem__list_directory` -> `await tools.filesystem.list_directory(...)`).',\n inputSchema: {\n type: 'object',\n properties: {\n code: {\n type: 'string',\n description: 'The Python code to execute.'\n },\n allowedTools: {\n type: 'array',\n items: { type: 'string' },\n description: 'List of tool names (e.g. \"filesystem.list_directory\" or \"filesystem.*\") that the script is allowed to call.'\n }\n },\n required: ['code']\n }\n },\n {\n name: 'mcp_execute_isolate',\n description: 'Executes JavaScript code in a high-speed V8 isolate. Access MCP tools via the global `tools` object (e.g. `await tools.filesystem.list_directory(...)`). No Deno/Node APIs. Use `console.log` for output.',\n inputSchema: {\n type: 'object',\n properties: {\n code: {\n type: 'string',\n description: 'The JavaScript code to execute.'\n },\n allowedTools: {\n type: 'array',\n items: { type: 'string' },\n description: 'List of tool names (e.g. \"filesystem.list_directory\" or \"filesystem.*\") that the script is allowed to call.'\n }\n },\n required: ['code']\n }\n }\n];\n\nexport class GatewayService {\n private logger: Logger;\n private clients: Map<string, any> = new Map();\n private authService: AuthService;\n private schemaCache: SchemaCache;\n private urlValidator: IUrlValidator;\n public policyService: PolicyService;\n private ajv: Ajv;\n // Cache compiled validators to avoid recompilation on every call\n private validatorCache = new Map<string, any>();\n\n constructor(logger: Logger, urlValidator: IUrlValidator, policyService?: PolicyService) {\n this.logger = logger.child({ component: 'GatewayService' });\n this.logger.debug('GatewayService instance created');\n this.urlValidator = urlValidator;\n this.authService = new AuthService(logger);\n this.schemaCache = new SchemaCache(logger);\n this.policyService = policyService ?? new PolicyService();\n this.ajv = new Ajv({ strict: false });\n (addFormats as any).default(this.ajv);\n }\n\n registerUpstream(info: UpstreamInfo) {\n const client = new UpstreamClient(this.logger, info, this.authService, this.urlValidator);\n this.clients.set(info.id, client);\n this.logger.info({ upstreamId: info.id, totalRegistered: this.clients.size }, 'Registered upstream MCP');\n }\n\n registerHost(transport: StdioTransport) {\n // NOTE: The host (VS Code) cannot receive tools/call requests - it's the CLIENT.\n // We only register it for potential future use (e.g., sampling requests).\n // DO NOT use the host as a tool provider fallback.\n this.logger.debug('Host transport available but not registered as tool upstream (protocol limitation)');\n }\n\n async listToolPackages(): Promise<ToolPackage[]> {\n const upstreams = Array.from(this.clients.entries()).map(([id, client]) => ({\n id,\n description: `Upstream ${id}`,\n version: '1.0.0'\n }));\n\n return [\n { id: 'conduit', description: 'Conduit built-in execution tools', version: '1.0.0' },\n ...upstreams\n ];\n }\n\n getBuiltInTools(): ToolSchema[] {\n return BUILT_IN_TOOLS;\n }\n\n async listToolStubs(packageId: string, context: ExecutionContext): Promise<ToolStub[]> {\n if (packageId === 'conduit') {\n const stubs = BUILT_IN_TOOLS.map(t => ({\n id: `conduit__${t.name}`,\n name: t.name,\n description: t.description\n }));\n if (context.allowedTools) {\n return stubs.filter(t => this.policyService.isToolAllowed(t.id, context.allowedTools!));\n }\n return stubs;\n }\n\n const client = this.clients.get(packageId);\n if (!client) {\n throw new Error(`Upstream package not found: ${packageId}`);\n }\n\n let tools = this.schemaCache.get(packageId);\n\n // Try manifest first if tools not cached\n if (!tools) {\n try {\n // Try to get manifest FIRST\n const manifest = await client.getManifest(context);\n if (manifest && manifest.tools) {\n tools = manifest.tools as ToolSchema[];\n } else {\n // Fall back to RPC discovery\n if (typeof (client as any).listTools === 'function') {\n tools = await (client as any).listTools();\n } else {\n const response = await client.call({\n jsonrpc: '2.0',\n id: 'discovery',\n method: 'tools/list',\n }, context);\n\n if (response.result?.tools) {\n tools = response.result.tools as ToolSchema[];\n } else {\n this.logger.warn({ upstreamId: packageId, error: response.error }, 'Failed to discover tools via RPC');\n }\n }\n }\n\n if (tools && tools.length > 0) {\n this.schemaCache.set(packageId, tools);\n this.logger.info({ upstreamId: packageId, toolCount: tools.length }, 'Discovered tools from upstream');\n }\n } catch (e: any) {\n this.logger.error({ upstreamId: packageId, err: e.message }, 'Error during tool discovery');\n }\n }\n\n if (!tools) tools = [];\n\n const stubs: ToolStub[] = tools.map(t => ({\n id: `${packageId}__${t.name}`,\n name: t.name,\n description: t.description\n }));\n\n if (context.allowedTools) {\n return stubs.filter(t => this.policyService.isToolAllowed(t.id, context.allowedTools!));\n }\n\n return stubs;\n }\n\n async getToolSchema(toolId: string, context: ExecutionContext): Promise<ToolSchema | null> {\n if (context.allowedTools && !this.policyService.isToolAllowed(toolId, context.allowedTools)) {\n throw new Error(`Access to tool ${toolId} is forbidden by allowlist`);\n }\n\n const parsed = this.policyService.parseToolName(toolId);\n const namespace = parsed.namespace;\n const toolName = parsed.name;\n\n // Check for built-in tools (now namespaced as conduit__*)\n if (namespace === 'conduit' || namespace === '') {\n const builtIn = BUILT_IN_TOOLS.find(t => t.name === toolName);\n if (builtIn) {\n return { ...builtIn, name: `conduit__${builtIn.name}` };\n }\n }\n\n const upstreamId = namespace;\n if (!upstreamId) {\n // Un-namespaced tool lookup: try all upstreams\n for (const id of this.clients.keys()) {\n const schema = await this.getToolSchema(`${id}__${toolName}`, context);\n if (schema) return schema;\n }\n return null;\n }\n\n // Ensure we have schemas for this upstream\n if (!this.schemaCache.get(upstreamId)) {\n await this.listToolStubs(upstreamId, context);\n }\n\n const tools = this.schemaCache.get(upstreamId) || [];\n const tool = tools.find(t => t.name === toolName);\n\n if (!tool) return null;\n\n return {\n ...tool,\n name: toolId\n };\n }\n\n async discoverTools(context: ExecutionContext): Promise<ToolSchema[]> {\n const allTools: ToolSchema[] = BUILT_IN_TOOLS.map(t => ({\n ...t,\n name: `conduit__${t.name}`\n }));\n\n this.logger.debug({ clientCount: this.clients.size, clientIds: Array.from(this.clients.keys()) }, 'Starting tool discovery');\n\n for (const [id, client] of this.clients.entries()) {\n // Skip host - it's not a tool provider\n if (id === 'host') {\n continue;\n }\n\n this.logger.debug({ upstreamId: id }, 'Discovering tools from upstream');\n\n // reuse unified discovery logic\n try {\n await this.listToolStubs(id, context);\n } catch (e: any) {\n this.logger.error({ upstreamId: id, err: e.message }, 'Failed to list tool stubs');\n }\n const tools = this.schemaCache.get(id) || [];\n\n this.logger.debug({ upstreamId: id, toolCount: tools.length }, 'Discovery result');\n\n if (tools && tools.length > 0) {\n const prefixedTools = tools.map(t => ({ ...t, name: `${id}__${t.name}` }));\n if (context.allowedTools) {\n allTools.push(...prefixedTools.filter(t => this.policyService.isToolAllowed(t.name, context.allowedTools!)));\n } else {\n allTools.push(...prefixedTools);\n }\n }\n }\n\n this.logger.info({ totalTools: allTools.length }, 'Tool discovery complete');\n return allTools;\n }\n\n async callTool(name: string, params: any, context: ExecutionContext): Promise<JSONRPCResponse> {\n this.logger.debug({ name, upstreamCount: this.clients.size }, 'GatewayService.callTool called');\n\n if (context.allowedTools && !this.policyService.isToolAllowed(name, context.allowedTools)) {\n this.logger.warn({ name, allowedTools: context.allowedTools }, 'Tool call blocked by allowlist');\n return {\n jsonrpc: '2.0',\n id: 0,\n error: {\n code: -32003,\n message: `Authorization failed: tool ${name} is not in the allowlist`,\n },\n };\n }\n\n const toolId = this.policyService.parseToolName(name);\n const upstreamId = toolId.namespace;\n const toolName = toolId.name;\n\n this.logger.debug({ name, upstreamId, toolName }, 'Parsed tool name');\n\n // Fallback for namespaceless calls: try to find the tool in any registered upstream\n if (!upstreamId) {\n this.logger.debug({ toolName }, 'Namespaceless call, attempting discovery across upstreams');\n const allStubs = await this.discoverTools(context);\n const found = allStubs.find(t => {\n const parts = t.name.split('__');\n return parts[parts.length - 1] === toolName;\n });\n\n if (found) {\n this.logger.debug({ original: name, resolved: found.name }, 'Resolved namespaceless tool');\n return this.callTool(found.name, params, context);\n }\n\n // No fallback to host - it doesn't support server-to-client tool calls\n const upstreamList = Array.from(this.clients.keys()).filter(k => k !== 'host');\n return {\n jsonrpc: '2.0',\n id: 0,\n error: {\n code: -32601,\n message: `Tool '${toolName}' not found. Discovered ${allStubs.length} tools from upstreams: [${upstreamList.join(', ') || 'none'}]. Available tools: ${allStubs.map(t => t.name).slice(0, 10).join(', ')}${allStubs.length > 10 ? '...' : ''}`,\n },\n };\n }\n\n const client = this.clients.get(upstreamId);\n if (!client) {\n this.logger.error({ upstreamId, availableUpstreams: Array.from(this.clients.keys()) }, 'Upstream not found');\n return {\n jsonrpc: '2.0',\n id: 0,\n error: {\n code: -32003,\n message: `Upstream not found: '${upstreamId}'. Available: ${Array.from(this.clients.keys()).join(', ') || 'none'}`,\n },\n };\n }\n\n // Lazy load schema if missing (Phase 1)\n if (!this.schemaCache.get(upstreamId)) {\n await this.listToolStubs(upstreamId, context);\n }\n\n const tools = this.schemaCache.get(upstreamId) || [];\n const toolSchema = tools.find(t => t.name === toolName);\n\n if (context.strictValidation) {\n if (!toolSchema) {\n return {\n jsonrpc: '2.0',\n id: 0,\n error: {\n code: -32601, // Method not found / Schema missing\n message: `Strict mode: Tool schema for ${name} not found`,\n },\n };\n }\n if (!toolSchema.inputSchema) {\n return {\n jsonrpc: '2.0',\n id: 0,\n error: {\n code: -32602, // Invalid params\n message: `Strict mode: Tool ${name} has no input schema defined`,\n },\n };\n }\n }\n\n if (toolSchema && toolSchema.inputSchema) {\n const cacheKey = `${upstreamId}__${toolName}`;\n let validate = this.validatorCache.get(cacheKey);\n if (!validate) {\n validate = this.ajv.compile(toolSchema.inputSchema);\n this.validatorCache.set(cacheKey, validate);\n }\n const valid = validate(params);\n if (!valid) {\n return {\n jsonrpc: '2.0',\n id: 0,\n error: {\n code: -32602, // Invalid params\n message: `Invalid parameters for tool ${name}: ${this.ajv.errorsText(validate.errors)}`,\n },\n };\n }\n }\n\n const startTime = performance.now();\n let success = false;\n let response: JSONRPCResponse;\n\n try {\n response = await client.call({\n jsonrpc: '2.0',\n id: context.correlationId,\n method: 'tools/call',\n params: {\n name: toolName,\n arguments: params,\n },\n }, context);\n success = !response.error;\n } catch (error: any) {\n success = false;\n throw error;\n } finally {\n const duration = performance.now() - startTime;\n metrics.recordToolExecution(duration, toolName, success);\n }\n\n if (response.error && response.error.code === -32008) {\n // Potentially refresh cache on certain types of errors\n this.schemaCache.invalidate(upstreamId);\n }\n\n return response;\n }\n\n async healthCheck(): Promise<{ status: string; upstreams: Record<string, string> }> {\n const upstreamStatus: Record<string, string> = {};\n const context = new ExecutionContext({ logger: this.logger });\n\n await Promise.all(\n Array.from(this.clients.entries()).map(async ([id, client]) => {\n try {\n const response = await client.call({\n jsonrpc: '2.0',\n id: 'health',\n method: 'tools/list',\n }, context);\n upstreamStatus[id] = response.error ? 'degraded' : 'active';\n } catch (err) {\n upstreamStatus[id] = 'error';\n }\n })\n );\n\n const allOk = Object.values(upstreamStatus).every(s => s === 'active');\n return {\n status: allOk ? 'ok' : 'degraded',\n upstreams: upstreamStatus,\n };\n }\n async validateTool(name: string, params: any, context: ExecutionContext): Promise<{ valid: boolean; errors?: string[] }> {\n const toolId = this.policyService.parseToolName(name);\n const upstreamId = toolId.namespace;\n const toolName = toolId.name;\n\n // Ensure we have schemas\n if (!this.schemaCache.get(upstreamId)) {\n await this.listToolStubs(upstreamId, context);\n }\n\n const tools = this.schemaCache.get(upstreamId) || [];\n const toolSchema = tools.find(t => t.name === toolName);\n\n if (!toolSchema) {\n return { valid: false, errors: [`Tool ${name} not found`] };\n }\n\n if (context.strictValidation) {\n if (!toolSchema.inputSchema) {\n return { valid: false, errors: [`Strict mode: Tool ${name} has no input schema defined`] };\n }\n }\n\n if (!toolSchema.inputSchema) {\n // No schema means any params are valid (unless strict mode, which we handled above)\n return { valid: true };\n }\n\n const validate = this.ajv.compile(toolSchema.inputSchema);\n const valid = validate(params);\n\n if (!valid) {\n return {\n valid: false,\n errors: validate.errors?.map(e => this.ajv.errorsText([e])) || ['Unknown validation error']\n };\n }\n\n return { valid: true };\n }\n}\n","import { Logger } from 'pino';\nimport dns from 'node:dns/promises';\nimport net from 'node:net';\nimport { LRUCache } from 'lru-cache';\n\nexport class NetworkPolicyService {\n private logger: Logger;\n\n private readonly privateRanges = [\n /^127\\./,\n /^10\\./,\n /^172\\.(1[6-9]|2[0-9]|3[0-1])\\./,\n /^192\\.168\\./,\n /^169\\.254\\./, // Link-local\n /^localhost$/i,\n /^0\\.0\\.0\\.0$/,\n /^::1$/, // IPv6 localhost\n /^fc00:/i, // IPv6 private\n /^fe80:/i, // IPv6 link-local\n ];\n\n private readonly RATE_LIMIT = 30;\n private readonly WINDOW_MS = 60000;\n // Use LRUCache to prevent unbounded memory growth\n private requestCounts: LRUCache<string, { count: number; resetTime: number }>;\n\n constructor(logger: Logger) {\n this.logger = logger;\n this.requestCounts = new LRUCache({\n max: 10000,\n ttl: this.WINDOW_MS,\n });\n }\n\n async validateUrl(url: string): Promise<{ valid: boolean; message?: string; resolvedIp?: string }> {\n try {\n const parsed = new URL(url);\n const hostname = parsed.hostname;\n\n // Check literal hostname against private ranges\n for (const range of this.privateRanges) {\n if (range.test(hostname)) {\n this.logger.warn({ hostname }, 'SSRF attempt detected: private range access');\n return { valid: false, message: 'Access denied: private network access forbidden' };\n }\n }\n\n // DNS resolution check to prevent DNS rebinding and handle tricky hostnames\n if (!net.isIP(hostname)) {\n try {\n const lookup = await dns.lookup(hostname, { all: true });\n // Store resolved IPs to check against blocklist\n const resolvedIps: string[] = [];\n\n for (const address of lookup) {\n let ip = address.address;\n\n // Fix Sev0: Normalize IPv6-mapped IPv4 addresses\n if (ip.startsWith('::ffff:')) {\n ip = ip.substring(7);\n }\n\n for (const range of this.privateRanges) {\n if (range.test(ip)) {\n this.logger.warn({ hostname, ip }, 'SSRF attempt detected: DNS resolves to private IP');\n return { valid: false, message: 'Access denied: hostname resolves to private network' };\n }\n }\n resolvedIps.push(ip);\n }\n\n // Fix Sev1: Return the validated IP to prevent DNS rebinding\n // Use the first resolved IP\n return { valid: true, resolvedIp: resolvedIps[0] };\n } catch (err: any) {\n // Strict SSRF protection: block if DNS lookup fails\n this.logger.warn({ hostname, err: err.message }, 'DNS lookup failed during URL validation, blocking request');\n return { valid: false, message: 'Access denied: hostname resolution failed' };\n }\n }\n\n // If it was already an IP, it's valid if it passed the range check above\n return { valid: true, resolvedIp: hostname };\n } catch (err: any) {\n return { valid: false, message: `Invalid URL: ${err.message}` };\n }\n }\n\n checkRateLimit(key: string): boolean {\n const now = Date.now();\n const record = this.requestCounts.get(key);\n\n if (!record || now > record.resetTime) {\n this.requestCounts.set(key, { count: 1, resetTime: now + this.WINDOW_MS });\n return true;\n }\n\n if (record.count >= this.RATE_LIMIT) {\n this.logger.warn({ key }, 'Rate limit exceeded');\n return false;\n }\n\n record.count++;\n return true;\n }\n}\n","import { Logger } from 'pino';\nimport { v4 as uuidv4 } from 'uuid';\nimport { LRUCache } from 'lru-cache';\n\nexport interface Session {\n allowedTools?: string[];\n createdAt: number;\n}\n\nexport class SessionManager {\n private logger: Logger;\n private sessions: LRUCache<string, Session>;\n private readonly SESSION_TTL_MS = 3600000; // 1 hour\n\n constructor(logger: Logger) {\n this.logger = logger;\n this.sessions = new LRUCache({\n max: 10000,\n ttl: this.SESSION_TTL_MS,\n });\n }\n\n createSession(allowedTools?: string[]): string {\n const token = uuidv4();\n this.sessions.set(token, {\n allowedTools,\n createdAt: Date.now()\n });\n return token;\n }\n\n getSession(token: string): Session | undefined {\n return this.sessions.get(token);\n }\n\n invalidateSession(token: string): void {\n this.sessions.delete(token);\n }\n\n cleanupSessions() {\n // LRUCache handles this automatically via TTL\n this.sessions.purgeStale();\n }\n}\n","import { Logger } from 'pino';\nimport { NetworkPolicyService } from './network.policy.service.js';\nimport { SessionManager } from './session.manager.js';\nimport type { Session } from './session.manager.js';\nimport { IUrlValidator } from './interfaces/url.validator.interface.js';\nimport crypto from 'node:crypto';\n\nexport type { Session };\n\nexport class SecurityService implements IUrlValidator {\n private logger: Logger;\n private ipcToken: string | undefined;\n private networkPolicy: NetworkPolicyService;\n private sessionManager: SessionManager;\n\n constructor(logger: Logger, ipcToken: string | undefined) {\n this.logger = logger;\n this.ipcToken = ipcToken;\n this.networkPolicy = new NetworkPolicyService(logger);\n this.sessionManager = new SessionManager(logger);\n }\n\n validateCode(code: string): { valid: boolean; message?: string } {\n // [IMPORTANT] This is a SANITY CHECK only.\n // We rely on RUNTIME isolation (Deno permissions, Isolate context) for actual security.\n // Static analysis of code is fundamentally unable to prevent all sandbox escapes.\n if (!code || code.length > 1024 * 1024) { // 1MB limit for sanity\n return { valid: false, message: 'Code size exceeds limit or is empty' };\n }\n return { valid: true };\n }\n\n async validateUrl(url: string): Promise<{ valid: boolean; message?: string; resolvedIp?: string }> {\n return this.networkPolicy.validateUrl(url);\n }\n\n checkRateLimit(key: string): boolean {\n return this.networkPolicy.checkRateLimit(key);\n }\n\n validateIpcToken(token: string): boolean {\n // Fix Sev1: Use timing-safe comparison for sensitive tokens\n if (!this.ipcToken) {\n return true;\n }\n\n const expected = Buffer.from(this.ipcToken);\n const actual = Buffer.from(token);\n\n if (expected.length === actual.length && crypto.timingSafeEqual(expected, actual)) {\n return true;\n }\n\n return !!this.sessionManager.getSession(token);\n }\n\n createSession(allowedTools?: string[]): string {\n return this.sessionManager.createSession(allowedTools);\n }\n\n getSession(token: string): Session | undefined {\n return this.sessionManager.getSession(token);\n }\n\n invalidateSession(token: string): void {\n this.sessionManager.invalidateSession(token);\n }\n\n\n getIpcToken(): string | undefined {\n return this.ipcToken;\n }\n}\n","import { NodeSDK } from '@opentelemetry/sdk-node';\nimport { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';\nimport { PrometheusExporter } from '@opentelemetry/exporter-prometheus';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions';\nimport { PinoInstrumentation } from '@opentelemetry/instrumentation-pino';\n\nexport class OtelService {\n private sdk: NodeSDK | null = null;\n\n constructor(private logger: any) { }\n\n async start() {\n this.sdk = new NodeSDK({\n resource: resourceFromAttributes({\n [SemanticResourceAttributes.SERVICE_NAME]: 'conduit',\n }),\n metricReader: new PrometheusExporter({\n port: 9464, // Default prometheus exporter port\n }),\n instrumentations: [\n getNodeAutoInstrumentations(),\n new PinoInstrumentation(),\n ],\n });\n\n try {\n await this.sdk.start();\n this.logger.info('OpenTelemetry SDK started');\n } catch (error) {\n this.logger.error({ error }, 'Error starting OpenTelemetry SDK');\n }\n }\n\n async shutdown() {\n if (this.sdk) {\n await this.sdk.shutdown();\n this.logger.info('OpenTelemetry SDK shut down');\n }\n }\n}\n","import { spawn, exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nconst execAsync = promisify(exec);\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { platform } from 'node:os';\nimport { fileURLToPath } from 'node:url';\nimport { ExecutionContext } from '../core/execution.context.js';\nimport { ResourceLimits } from '../core/config.service.js';\nimport { ConduitError } from '../core/types.js';\nimport { resolveAssetPath } from '../core/asset.utils.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nimport type { Executor, ExecutorConfig, ExecutionResult } from '../core/interfaces/executor.interface.js';\n\nexport { ExecutionResult };\n\n// Deprecated: use ExecutorConfig\nexport interface IPCInfo {\n ipcAddress: string;\n ipcToken: string;\n sdkCode?: string;\n}\n\nexport class DenoExecutor implements Executor {\n private shimContent: string = '';\n // Track active processes for cleanup\n // Using 'any' for the Set because ChildProcess type import can be finicky across node versions/types\n // but at runtime it is a ChildProcess\n private activeProcesses = new Set<any>();\n private maxConcurrentProcesses: number;\n\n constructor(maxConcurrentProcesses = 10) {\n this.maxConcurrentProcesses = maxConcurrentProcesses;\n }\n\n private getShim(): string {\n if (this.shimContent) return this.shimContent;\n try {\n const assetPath = resolveAssetPath('deno-shim.ts');\n this.shimContent = fs.readFileSync(assetPath, 'utf-8');\n return this.shimContent;\n } catch (err: any) {\n throw new Error(`Failed to load Deno shim: ${err.message}`);\n }\n }\n\n async execute(code: string, limits: ResourceLimits, context: ExecutionContext, config?: ExecutorConfig): Promise<ExecutionResult> {\n const { logger } = context;\n\n // Check concurrent process limit\n if (this.activeProcesses.size >= this.maxConcurrentProcesses) {\n return {\n stdout: '',\n stderr: '',\n exitCode: null,\n error: {\n code: ConduitError.ServerBusy,\n message: 'Too many concurrent Deno processes'\n }\n };\n }\n\n let stdout = '';\n let stderr = '';\n let totalOutputBytes = 0;\n let totalLogEntries = 0;\n let isTerminated = false;\n\n let shim = this.getShim()\n .replace('__CONDUIT_IPC_ADDRESS__', config?.ipcAddress || '')\n .replace('__CONDUIT_IPC_TOKEN__', config?.ipcToken || '');\n\n if (shim.includes('__CONDUIT_IPC_ADDRESS__')) {\n throw new Error('Failed to inject IPC address into Deno shim');\n }\n if (shim.includes('__CONDUIT_IPC_TOKEN__')) {\n throw new Error('Failed to inject IPC token into Deno shim');\n }\n\n // Inject SDK if provided\n if (config?.sdkCode) {\n shim = shim.replace('// __CONDUIT_SDK_INJECTION__', config.sdkCode);\n if (shim.includes('// __CONDUIT_SDK_INJECTION__')) {\n // Should have been replaced\n throw new Error('Failed to inject SDK code into Deno shim');\n }\n }\n\n const fullCode = shim + '\\n' + code;\n\n // Use --v8-flags for memory limit if possible, or monitor RSS\n // Deno 2.x supports --v8-flags\n const args = [\n 'run',\n `--v8-flags=--max-heap-size=${limits.memoryLimitMb}`,\n ];\n\n // Security: Restrict permissions. \n // We only allow network access to the IPC host if it's a TCP address.\n // Unix sockets don't need --allow-net.\n if (config?.ipcAddress && !config.ipcAddress.includes('/') && !config.ipcAddress.includes('\\\\')) {\n try {\n // Use URL parser to safely extract hostname (handles IPv6 brackets and ports correctly)\n // Prepend http:// to ensure it parses as a valid URL structure\n const url = new URL(`http://${config.ipcAddress}`);\n let normalizedHost = url.hostname;\n\n // Remove brackets from IPv6 addresses if present (e.g., [::1] -> ::1)\n normalizedHost = normalizedHost.replace(/[\\[\\]]/g, '');\n\n if (normalizedHost === '0.0.0.0' || normalizedHost === '::' || normalizedHost === '::1' || normalizedHost === '') {\n normalizedHost = '127.0.0.1';\n }\n args.push(`--allow-net=${normalizedHost}`);\n } catch (err) {\n // If address is malformed, we simply don't add the permission\n logger.warn({ address: config.ipcAddress, err }, 'Failed to parse IPC address for Deno permissions');\n }\n } else {\n // No network by default\n }\n\n args.push('-'); // Read from stdin\n\n // logger.info({ args }, 'Spawning Deno');\n const child = spawn('deno', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: {\n PATH: process.env.PATH,\n HOME: process.env.HOME,\n TMPDIR: process.env.TMPDIR,\n }\n });\n\n this.activeProcesses.add(child);\n\n child.on('spawn', () => {\n // logger.info('Deno process spawned');\n });\n\n const cleanupProcess = () => {\n this.activeProcesses.delete(child);\n };\n\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n if (!isTerminated) {\n isTerminated = true;\n if (typeof (monitorInterval as any) !== 'undefined') clearInterval(monitorInterval);\n child.kill('SIGKILL');\n logger.warn('Execution timed out, SIGKILL sent');\n cleanupProcess();\n resolve({\n stdout,\n stderr,\n exitCode: null,\n error: {\n code: ConduitError.RequestTimeout,\n message: 'Execution timed out',\n },\n });\n }\n }, limits.timeoutMs);\n\n // RSS Monitoring loop\n // Optimization: increased interval to 2s and added platform check\n const isWindows = platform() === 'win32';\n const monitorInterval = setInterval(async () => {\n if (isTerminated || !child.pid) {\n clearInterval(monitorInterval);\n return;\n }\n try {\n let rssMb = 0;\n if (isWindows) {\n try {\n // Windows: tasklist /FI \"PID eq <pid>\" /FO CSV /NH\n // Output: \"deno.exe\",\"1234\",\"Console\",\"1\",\"12,345 K\"\n const { stdout: tasklistOut } = await execAsync(`tasklist /FI \"PID eq ${child.pid}\" /FO CSV /NH`);\n const match = tasklistOut.match(/\"([^\"]+ K)\"$/m); // Matches the last column with K\n if (match) {\n // Remove ' K' and ',' then parse\n const memStr = match[1].replace(/[ K,]/g, '');\n const memKb = parseInt(memStr, 10);\n if (!isNaN(memKb)) {\n rssMb = memKb / 1024;\n }\n }\n } catch (e) {\n // tasklist might fail if process gone\n }\n } else {\n // On Mac/Linux, ps -o rss= -p [pid] returns RSS in KB\n const { stdout: rssStdout } = await execAsync(`ps -o rss= -p ${child.pid}`);\n const rssKb = parseInt(rssStdout.trim());\n if (!isNaN(rssKb)) {\n rssMb = rssKb / 1024;\n }\n }\n\n if (rssMb > limits.memoryLimitMb) {\n isTerminated = true;\n if (typeof (monitorInterval as any) !== 'undefined') clearInterval(monitorInterval);\n child.kill('SIGKILL');\n logger.warn({ rssMb, limitMb: limits.memoryLimitMb }, 'Deno RSS limit exceeded, SIGKILL sent');\n cleanupProcess();\n resolve({\n stdout,\n stderr,\n exitCode: null,\n error: {\n code: ConduitError.MemoryLimitExceeded,\n message: `Memory limit exceeded: ${rssMb.toFixed(2)}MB > ${limits.memoryLimitMb}MB`,\n },\n });\n }\n } catch (err) {\n // Process might have exited already or ps failed\n clearInterval(monitorInterval);\n }\n }, 2000); // Check every 2000ms\n\n child.stdout.on('data', (chunk: Buffer) => {\n if (isTerminated) return;\n\n totalOutputBytes += chunk.length;\n const newLines = (chunk.toString().match(/\\n/g) || []).length;\n totalLogEntries += newLines;\n\n if (totalOutputBytes > limits.maxOutputBytes || totalLogEntries > limits.maxLogEntries) {\n isTerminated = true;\n if (typeof (monitorInterval as any) !== 'undefined') clearInterval(monitorInterval);\n child.kill('SIGKILL');\n logger.warn({ bytes: totalOutputBytes, lines: totalLogEntries }, 'Limits exceeded, SIGKILL sent');\n cleanupProcess();\n resolve({\n stdout: stdout + chunk.toString().slice(0, limits.maxOutputBytes - (totalOutputBytes - chunk.length)),\n stderr,\n exitCode: null,\n error: {\n code: totalOutputBytes > limits.maxOutputBytes ? ConduitError.OutputLimitExceeded : ConduitError.LogLimitExceeded,\n message: totalOutputBytes > limits.maxOutputBytes ? 'Output limit exceeded' : 'Log entry limit exceeded',\n },\n });\n return;\n }\n stdout += chunk.toString();\n });\n\n child.stderr.on('data', (chunk: Buffer) => {\n if (isTerminated) return;\n\n totalOutputBytes += chunk.length;\n const newLines = (chunk.toString().match(/\\n/g) || []).length;\n totalLogEntries += newLines;\n\n if (totalOutputBytes > limits.maxOutputBytes || totalLogEntries > limits.maxLogEntries) {\n isTerminated = true;\n if (typeof (monitorInterval as any) !== 'undefined') clearInterval(monitorInterval);\n child.kill('SIGKILL');\n logger.warn({ bytes: totalOutputBytes, lines: totalLogEntries }, 'Limits exceeded, SIGKILL sent');\n cleanupProcess();\n resolve({\n stdout,\n stderr: stderr + chunk.toString().slice(0, limits.maxOutputBytes - (totalOutputBytes - chunk.length)),\n exitCode: null,\n error: {\n code: totalOutputBytes > limits.maxOutputBytes ? ConduitError.OutputLimitExceeded : ConduitError.LogLimitExceeded,\n message: totalOutputBytes > limits.maxOutputBytes ? 'Output limit exceeded' : 'Log entry limit exceeded',\n },\n });\n return;\n }\n stderr += chunk.toString();\n });\n\n child.on('close', (code) => {\n clearTimeout(timeout);\n if (typeof (monitorInterval as any) !== 'undefined') clearInterval(monitorInterval);\n cleanupProcess();\n if (isTerminated) return; // Already resolved via timeout or limit\n\n resolve({\n stdout,\n stderr,\n exitCode: code,\n });\n });\n\n child.on('error', (err: any) => {\n clearTimeout(timeout);\n logger.error({ err }, 'Child process error');\n cleanupProcess();\n\n let message = err.message;\n if (err.code === 'ENOENT') {\n message = 'Deno executable not found in PATH. Please ensure Deno is installed.';\n }\n\n resolve({\n stdout,\n stderr,\n exitCode: null,\n error: {\n code: ConduitError.InternalError,\n message: message,\n },\n });\n });\n\n // Write code to stdin\n child.stdin.write(fullCode);\n child.stdin.end();\n });\n }\n\n async shutdown() {\n for (const child of this.activeProcesses) {\n try {\n child.kill('SIGKILL');\n } catch (err) {\n // Ignore, process might be dead already\n }\n }\n this.activeProcesses.clear();\n }\n\n async healthCheck(): Promise<{ status: string; detail?: string }> {\n try {\n const { stdout } = await execAsync('deno --version');\n return { status: 'ok', detail: stdout.split('\\n')[0] };\n } catch (err: any) {\n return { status: 'error', detail: err.message };\n }\n }\n\n async warmup(): Promise<void> {\n // No-op for Deno\n }\n}\n","import path from 'node:path';\nimport fs from 'node:fs';\nimport { fileURLToPath } from 'node:url';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n/**\n * Resolves the absolute path to an asset file, handling both source (dev)\n * and distribution (prod) directory structures.\n * \n * Strategies:\n * 1. ../assets/{filename} (Source: src/core -> src/assets)\n * 2. ./assets/{filename} (Dist: dist/ -> dist/assets, if core is merged or similar)\n * 3. ../../assets/{filename} (Dist: dist/core -> dist/assets)\n * 4. assets/{filename} (Relative to cwd, unlikely but fallback)\n * \n * @param filename The name of the asset file (e.g., 'deno-shim.ts')\n * @returns The absolute path to the asset if found\n * @throws Error if the asset cannot be found\n */\nexport function resolveAssetPath(filename: string): string {\n const candidates = [\n // Source structure: src/core/asset.utils.ts -> src/assets/\n path.resolve(__dirname, '../assets', filename),\n // Dist structure possibility 1: dist/ (flat) with assets/ subdir\n path.resolve(__dirname, './assets', filename),\n // Dist structure possibility 2: dist/core/ -> dist/assets/\n path.resolve(__dirname, '../../assets', filename),\n // Dist structure possibility 3: dist/ -> assets/ (if called from root)\n path.resolve(process.cwd(), 'assets', filename),\n // Dist structure possibility 4: dist/assets/ (from root)\n path.resolve(process.cwd(), 'dist/assets', filename)\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n throw new Error(`Asset not found: ${filename}. Checked paths: ${candidates.join(', ')}`);\n}\n","import { Worker } from 'node:worker_threads';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { ExecutionContext } from '../core/execution.context.js';\nimport { ResourceLimits as ConduitResourceLimits } from '../core/config.service.js';\nimport { ConduitError } from '../core/types.js';\nimport { resolveAssetPath } from '../core/asset.utils.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nimport type { Executor, ExecutorConfig, ExecutionResult } from '../core/interfaces/executor.interface.js';\n\nexport { ExecutionResult };\n\n// Deprecated: use ExecutorConfig\nexport interface IPCInfo {\n ipcAddress: string;\n ipcToken: string;\n sdkCode?: string;\n}\n\n\ninterface PooledWorker {\n worker: Worker;\n busy: boolean;\n runs: number;\n lastUsed: number;\n}\n\nexport class PyodideExecutor implements Executor {\n private shimContent: string = '';\n private pool: PooledWorker[] = [];\n private maxPoolSize: number;\n private maxRunsPerWorker = 1;\n\n constructor(maxPoolSize = 3) {\n this.maxPoolSize = maxPoolSize;\n }\n\n private getShim(): string {\n if (this.shimContent) return this.shimContent;\n try {\n const assetPath = resolveAssetPath('python-shim.py');\n this.shimContent = fs.readFileSync(assetPath, 'utf-8');\n return this.shimContent;\n } catch (err: any) {\n throw new Error(`Failed to load Python shim: ${err.message}`);\n }\n }\n\n private waitQueue: Array<(worker: PooledWorker) => void> = [];\n\n private async getWorker(logger: any, limits?: ConduitResourceLimits): Promise<PooledWorker> {\n // Find available worker\n let pooled = this.pool.find(w => !w.busy);\n if (pooled) {\n pooled.busy = true;\n return pooled;\n }\n\n // Create new worker if pool not full\n if (this.pool.length < this.maxPoolSize) {\n logger.info('Creating new Pyodide worker for pool');\n const worker = this.createWorker(limits);\n pooled = { worker, busy: true, runs: 0, lastUsed: Date.now() };\n this.pool.push(pooled);\n\n // Wait for ready signal\n await new Promise<void>((resolve, reject) => {\n const onMessage = (msg: any) => {\n if (msg.type === 'ready') {\n worker.off('message', onMessage);\n resolve();\n }\n };\n worker.on('message', onMessage);\n worker.on('error', reject);\n setTimeout(() => {\n // Cleanup worker on timeout\n worker.terminate();\n this.pool = this.pool.filter(p => p !== pooled);\n reject(new Error('Worker init timeout'));\n }, 10000);\n });\n\n return pooled;\n }\n\n // Wait for a worker to become available via queue\n return new Promise((resolve) => {\n this.waitQueue.push(resolve);\n });\n }\n\n private createWorker(limits?: ConduitResourceLimits): Worker {\n const candidates = [\n path.resolve(__dirname, './pyodide.worker.js'),\n path.resolve(__dirname, './pyodide.worker.ts'),\n path.resolve(__dirname, './executors/pyodide.worker.js'),\n path.resolve(__dirname, './executors/pyodide.worker.ts'),\n ];\n const workerPath = candidates.find(p => fs.existsSync(p));\n if (!workerPath) {\n throw new Error(`Pyodide worker not found. Tried: ${candidates.join(', ')}`);\n }\n\n return new Worker(workerPath, {\n execArgv: process.execArgv.includes('--loader') ? process.execArgv : [],\n resourceLimits: limits ? {\n maxOldSpaceSizeMb: limits.memoryLimitMb,\n // Stack size and young generation are usually fine with defaults\n } as any : undefined\n });\n }\n\n async warmup(limits: ConduitResourceLimits) {\n // Pre-fill the pool up to maxPoolSize\n const needed = this.maxPoolSize - this.pool.length;\n if (needed <= 0) return;\n\n console.error(`Pre-warming ${needed} Pyodide workers...`);\n const promises = [];\n for (let i = 0; i < needed; i++) {\n promises.push(this.createAndPoolWorker(limits));\n }\n await Promise.all(promises);\n console.error(`Pyodide pool pre-warmed with ${this.pool.length} workers.`);\n }\n\n private async createAndPoolWorker(limits: ConduitResourceLimits) {\n // Small optimization: don't double-fill if racing\n if (this.pool.length >= this.maxPoolSize) return;\n\n const worker = this.createWorker(limits);\n const pooled: PooledWorker = { worker, busy: true, runs: 0, lastUsed: Date.now() };\n this.pool.push(pooled);\n\n // Wait for ready signal\n try {\n await new Promise<void>((resolve, reject) => {\n const onMessage = (msg: any) => {\n if (msg.type === 'ready') {\n worker.off('message', onMessage);\n resolve();\n }\n };\n worker.on('message', onMessage);\n worker.on('error', reject);\n setTimeout(() => reject(new Error('Worker init timeout')), 10000);\n });\n pooled.busy = false;\n\n // Check if anyone is waiting for a worker immediately\n if (this.waitQueue.length > 0) {\n const nextResolve = this.waitQueue.shift();\n if (nextResolve) {\n pooled.busy = true;\n nextResolve(pooled);\n }\n }\n } catch (err) {\n // If failed, remove from pool\n this.pool = this.pool.filter(p => p !== pooled);\n worker.terminate();\n }\n }\n\n async execute(code: string, limits: ConduitResourceLimits, context: ExecutionContext, config?: ExecutorConfig): Promise<ExecutionResult> {\n const { logger } = context;\n const pooledWorker = await this.getWorker(logger, limits);\n const worker = pooledWorker.worker;\n\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n logger.warn('Python execution timed out, terminating worker');\n worker.terminate();\n // Remove from pool\n this.pool = this.pool.filter(w => w !== pooledWorker);\n resolve({\n stdout: '',\n stderr: 'Execution timed out',\n exitCode: null,\n error: {\n code: ConduitError.RequestTimeout,\n message: 'Execution timed out',\n },\n });\n }, limits.timeoutMs);\n\n const onMessage = (msg: any) => {\n if (msg.type === 'ready' || msg.type === 'pong') return;\n\n clearTimeout(timeout);\n worker.off('message', onMessage);\n worker.off('error', onError);\n\n pooledWorker.busy = false;\n\n // Notify next waiter if any\n if (this.waitQueue.length > 0) {\n const nextResolve = this.waitQueue.shift();\n if (nextResolve) {\n pooledWorker.busy = true;\n nextResolve(pooledWorker);\n }\n }\n\n pooledWorker.runs++;\n pooledWorker.lastUsed = Date.now();\n\n // Recycle if too many runs\n if (pooledWorker.runs >= this.maxRunsPerWorker) {\n logger.info('Recycling Pyodide worker after max runs');\n worker.terminate();\n this.pool = this.pool.filter(w => w !== pooledWorker);\n }\n\n if (msg.success) {\n resolve({\n stdout: msg.stdout,\n stderr: msg.stderr,\n exitCode: 0,\n });\n } else {\n logger.warn({ error: msg.error }, 'Python execution failed or limit breached, terminating worker');\n worker.terminate();\n this.pool = this.pool.filter(w => w !== pooledWorker);\n\n logger.debug({ error: msg.error }, 'Python execution error from worker');\n const normalizedError = (msg.error || '').toLowerCase();\n const limitBreached = msg.limitBreached || '';\n\n const isLogLimit = limitBreached === 'log' || normalizedError.includes('[limit_log]');\n const isOutputLimit = limitBreached === 'output' || normalizedError.includes('[limit_output]');\n const isAmbiguousLimit = !isOutputLimit && !isLogLimit && (normalizedError.includes('i/o error') || normalizedError.includes('errno 29') || normalizedError.includes('limit exceeded'));\n\n resolve({\n stdout: msg.stdout,\n stderr: msg.stderr,\n exitCode: 1,\n error: {\n code: isLogLimit ? ConduitError.LogLimitExceeded : ((isOutputLimit || isAmbiguousLimit) ? ConduitError.OutputLimitExceeded : ConduitError.InternalError),\n message: isLogLimit ? 'Log entry limit exceeded' : ((isOutputLimit || isAmbiguousLimit) ? 'Output limit exceeded' : msg.error),\n },\n });\n }\n };\n\n const onError = (err: any) => {\n clearTimeout(timeout);\n worker.off('message', onMessage);\n worker.off('error', onError);\n\n logger.error({ err }, 'Pyodide worker error');\n worker.terminate();\n this.pool = this.pool.filter(w => w !== pooledWorker);\n\n resolve({\n stdout: '',\n stderr: err.message,\n exitCode: null,\n error: {\n code: ConduitError.InternalError,\n message: err.message,\n },\n });\n };\n\n worker.on('message', onMessage);\n worker.on('error', onError);\n\n // Prepare shim with SDK injection\n let shim = this.getShim();\n if (config?.sdkCode) {\n shim = shim.replace('# __CONDUIT_SDK_INJECTION__', config.sdkCode);\n }\n\n worker.postMessage({\n type: 'execute',\n data: { code, limits, ipcInfo: config, shim }\n });\n });\n }\n\n async shutdown() {\n for (const pooled of this.pool) {\n await pooled.worker.terminate();\n }\n this.pool = [];\n }\n\n async healthCheck(): Promise<{ status: string; workers: number; detail?: string }> {\n try {\n // Find an available worker or create a temporary one for health check\n const pooled = await this.getWorker(console, {\n timeoutMs: 5000,\n memoryLimitMb: 128,\n maxOutputBytes: 1024,\n maxLogEntries: 10\n });\n\n return new Promise((resolve) => {\n let timeout: NodeJS.Timeout;\n\n const onMessage = (msg: any) => {\n if (msg.type === 'pong') {\n cleanup();\n pooled.busy = false;\n resolve({ status: 'ok', workers: this.pool.length });\n }\n };\n\n const cleanup = () => {\n clearTimeout(timeout);\n pooled.worker.off('message', onMessage);\n };\n\n timeout = setTimeout(() => {\n cleanup();\n pooled.busy = false;\n resolve({ status: 'error', workers: this.pool.length, detail: 'Health check timeout' });\n }, 2000);\n\n pooled.worker.on('message', onMessage);\n pooled.worker.postMessage({ type: 'ping' });\n });\n } catch (err: any) {\n return { status: 'error', workers: this.pool.length, detail: err.message };\n }\n }\n}\n","import ivm from 'isolated-vm';\nimport { Logger } from 'pino';\nimport { ExecutionContext } from '../core/execution.context.js';\nimport { ResourceLimits } from '../core/config.service.js';\nimport { GatewayService } from '../gateway/gateway.service.js';\nimport { ConduitError } from '../core/types.js';\n\nimport type { Executor, ExecutorConfig, ExecutionResult } from '../core/interfaces/executor.interface.js';\n\nexport { ExecutionResult as IsolateExecutionResult };\n\n/**\n * IsolateExecutor - In-process V8 isolate execution using isolated-vm.\n * \n * Security model: Capability-based (not OS sandbox)\n * - Only approved functions exposed to isolate\n * - Hard time/memory limits\n * - No process/fs/net access\n */\nexport class IsolateExecutor implements Executor {\n private logger: Logger;\n private gatewayService: GatewayService;\n\n constructor(logger: Logger, gatewayService: GatewayService) {\n this.logger = logger;\n this.gatewayService = gatewayService;\n }\n\n async execute(\n code: string,\n limits: ResourceLimits,\n context: ExecutionContext,\n config?: ExecutorConfig\n ): Promise<ExecutionResult> {\n const logs: string[] = [];\n const errors: string[] = [];\n let isolate: ivm.Isolate | null = null;\n\n try {\n // Create isolate with memory limit\n isolate = new ivm.Isolate({ memoryLimit: limits.memoryLimitMb });\n const ctx = await isolate.createContext();\n const jail = ctx.global;\n\n let currentLogBytes = 0;\n let currentErrorBytes = 0;\n\n // Inject console.log/error for output capture\n // Inject console.log/error for output capture\n await jail.set('__log', new ivm.Callback((msg: string) => {\n if (currentLogBytes + msg.length + 1 > limits.maxOutputBytes) {\n // Check log entry count limit? We don't track count here yet effectively, but bytes is safer.\n // The interface says maxOutputBytes applies to total output.\n throw new Error('[LIMIT_LOG]');\n }\n if (currentLogBytes < limits.maxOutputBytes) {\n logs.push(msg);\n currentLogBytes += msg.length + 1; // +1 for newline approximation\n }\n }));\n await jail.set('__error', new ivm.Callback((msg: string) => {\n if (currentErrorBytes + msg.length + 1 > limits.maxOutputBytes) {\n throw new Error('[LIMIT_OUTPUT]');\n }\n if (currentErrorBytes < limits.maxOutputBytes) {\n errors.push(msg);\n currentErrorBytes += msg.length + 1;\n }\n }));\n\n // Async tool bridge (ID-based to avoid Promise transfer issues)\n let requestIdCounter = 0;\n const pendingToolCalls = new Map<number, Promise<any>>(); // Not used by Host, but Host initiates work\n\n await jail.set('__dispatchToolCall', new ivm.Callback((nameStr: string, argsStr: string) => {\n const requestId = ++requestIdCounter;\n const name = nameStr;\n let args = {};\n try {\n args = JSON.parse(argsStr);\n } catch (e) {\n // ignore\n }\n\n // Process async\n this.gatewayService.callTool(name, args, context)\n .then(res => {\n // callback to isolate\n return ctx.evalClosure(`resolveRequest($0, $1, null)`, [requestId, JSON.stringify(res)], { arguments: { copy: true } });\n })\n .catch(err => {\n return ctx.evalClosure(`resolveRequest($0, null, $1)`, [requestId, err.message || 'Unknown error'], { arguments: { copy: true } });\n })\n .catch(e => {\n // Ignore errors calling back into isolate (e.g. if disposed)\n });\n\n return requestId;\n }));\n\n // Bootstrap code: create console and async handling\n const bootstrap = `\n const requests = new Map();\n \n // Host calls this to resolve requests\n globalThis.resolveRequest = (id, resultJson, error) => {\n const req = requests.get(id);\n if (req) {\n requests.delete(id);\n if (error) req.reject(new Error(error));\n else req.resolve(resultJson);\n }\n };\n\n // Internal tool call wrapper\n globalThis.__callTool = (name, argsJson) => {\n return new Promise((resolve, reject) => {\n const id = __dispatchToolCall(name, argsJson);\n requests.set(id, { resolve, reject });\n });\n };\n\n const format = (arg) => {\n if (typeof arg === 'string') return arg;\n if (arg instanceof Error) return arg.stack || arg.message;\n if (typeof arg === 'object' && arg !== null && arg.message && arg.stack) return arg.stack; // Duck typing\n return JSON.stringify(arg);\n };\n const console = {\n log: (...args) => __log(args.map(format).join(' ')),\n error: (...args) => __error(args.map(format).join(' ')),\n };\n `;\n const bootstrapScript = await isolate.compileScript(bootstrap);\n await bootstrapScript.run(ctx, { timeout: 1000 });\n\n // Inject SDK (typed tools or fallback)\n const sdkScript = config?.sdkCode || `\n const tools = {\n $raw: async (name, args) => {\n const resStr = await __callTool(name, JSON.stringify(args || {}));\n return JSON.parse(resStr);\n }\n };\n `;\n const compiledSdk = await isolate.compileScript(sdkScript);\n await compiledSdk.run(ctx, { timeout: 1000 });\n\n // Compile and run user code\n // Async completion tracking\n let executionPromiseResolve: () => void;\n const executionPromise = new Promise<void>((resolve) => {\n executionPromiseResolve = resolve;\n });\n await jail.set('__done', new ivm.Callback(() => {\n if (executionPromiseResolve) executionPromiseResolve();\n }));\n\n let scriptFailed = false;\n await jail.set('__setFailed', new ivm.Callback(() => {\n scriptFailed = true;\n }));\n\n // Compile and run user code\n // Wrap in async IIFE to support top-level await and track completion\n // Use 'void' to ensure the script returns undefined (transferrable) instead of a Promise\n const wrappedCode = `void (async () => {\n try {\n ${code}\n } catch (err) {\n console.error(err);\n __setFailed();\n } finally {\n __done();\n }\n })()`;\n\n const script = await isolate.compileScript(wrappedCode);\n\n // NOTE: Two timeouts exist intentionally:\n // 1. script.run timeout (below) - catches infinite synchronous loops\n // 2. Promise.race timeout (after) - catches stuck async operations (tool calls)\n // Tool calls may continue briefly after timeout; isolate.dispose() cleans up.\n\n // Start execution with synchronous timeout protection\n await script.run(ctx, { timeout: limits.timeoutMs });\n\n // Wait for completion or timeout\n let timedOut = false;\n const timeoutPromise = new Promise<void>((_, reject) => {\n setTimeout(() => {\n timedOut = true;\n reject(new Error('Script execution timed out'));\n }, limits.timeoutMs);\n });\n\n try {\n await Promise.race([executionPromise, timeoutPromise]);\n } catch (err: any) {\n if (err.message === 'Script execution timed out') {\n return {\n stdout: logs.join('\\n'),\n stderr: errors.join('\\n'),\n exitCode: null,\n error: {\n code: ConduitError.RequestTimeout,\n message: 'Execution timed out',\n },\n };\n }\n throw err;\n }\n\n return {\n stdout: logs.join('\\n'),\n stderr: errors.join('\\n'),\n exitCode: scriptFailed ? 1 : 0,\n };\n } catch (err: any) {\n const message = err.message || 'Unknown error';\n\n // Handle specific error types\n if (message.includes('Script execution timed out')) {\n return {\n stdout: logs.join('\\n'),\n stderr: errors.join('\\n'),\n exitCode: null,\n error: {\n code: ConduitError.RequestTimeout,\n message: 'Execution timed out',\n },\n };\n }\n\n if (message.includes('memory limit') || message.includes('disposed')) {\n return {\n stdout: logs.join('\\n'),\n stderr: errors.join('\\n'),\n exitCode: null,\n error: {\n code: ConduitError.MemoryLimitExceeded,\n message: 'Memory limit exceeded',\n },\n };\n }\n\n this.logger.error({ err }, 'Isolate execution failed');\n return {\n stdout: logs.join('\\n'),\n stderr: message,\n exitCode: 1,\n error: {\n code: ConduitError.InternalError,\n message,\n },\n };\n } finally {\n if (isolate) {\n isolate.dispose();\n }\n }\n }\n\n async shutdown(): Promise<void> {\n // No-op\n }\n\n async healthCheck(): Promise<{ status: string; detail?: string }> {\n try {\n const isolate = new ivm.Isolate({ memoryLimit: 8 });\n isolate.dispose();\n return { status: 'ok' };\n } catch (err: any) {\n return { status: 'error', detail: err.message };\n }\n }\n\n async warmup(): Promise<void> {\n // No-op\n }\n}\n","import { Executor } from '../interfaces/executor.interface.js';\n\nexport class ExecutorRegistry {\n private executors = new Map<string, Executor>();\n\n register(name: string, executor: Executor): void {\n this.executors.set(name, executor);\n }\n\n get(name: string): Executor | undefined {\n return this.executors.get(name);\n }\n\n has(name: string): boolean {\n return this.executors.has(name);\n }\n\n async shutdownAll(): Promise<void> {\n for (const executor of this.executors.values()) {\n if (executor.shutdown) {\n await executor.shutdown();\n }\n }\n this.executors.clear();\n }\n}\n","/**\n * Language-agnostic interface for tool bindings.\n * Used to generate typed SDK code for sandbox injection.\n */\nexport interface ToolBinding {\n /** Full qualified name: \"github__createIssue\" */\n name: string;\n /** Upstream ID / namespace: \"github\" */\n namespace: string;\n /** Tool method name: \"createIssue\" */\n methodName: string;\n /** JSON Schema for input validation */\n inputSchema?: object;\n /** Human-readable description */\n description?: string;\n}\n\nexport interface SDKGeneratorOptions {\n /** Tool bindings to include in SDK */\n tools: ToolBinding[];\n /** Allow $raw escape hatch for dynamic calls (default: true) */\n enableRawFallback?: boolean;\n}\n\n// Inline parsing to avoid circular dependency with PolicyService\nfunction parseToolName(qualifiedName: string): { namespace: string; name: string } {\n const separatorIndex = qualifiedName.indexOf('__');\n if (separatorIndex === -1) {\n return { namespace: '', name: qualifiedName };\n }\n return {\n namespace: qualifiedName.substring(0, separatorIndex),\n name: qualifiedName.substring(separatorIndex + 2)\n };\n}\n\n/**\n * Convert a prefixed tool name to a ToolBinding.\n * @param name Full tool name in format \"namespace__methodName\"\n * @param inputSchema Optional JSON Schema\n * @param description Optional description\n */\nexport function toToolBinding(\n name: string,\n inputSchema?: object,\n description?: string\n): ToolBinding {\n const toolId = parseToolName(name);\n\n return {\n name,\n namespace: toolId.namespace || 'default',\n methodName: toolId.name || name,\n inputSchema,\n description,\n };\n}\n\n/**\n * Convert a ToolStub to a ToolBinding.\n * @param stub ToolStub from GatewayService\n */\nexport function fromToolStub(stub: { id: string; name: string; description?: string }): ToolBinding {\n const toolId = parseToolName(stub.id);\n return {\n name: stub.id,\n namespace: toolId.namespace || 'default',\n methodName: stub.name, // stub.name is already the method name (e.g. \"create_issue\")\n description: stub.description,\n };\n}\n\n/**\n * Group tool bindings by namespace for SDK generation.\n */\nexport function groupByNamespace(bindings: ToolBinding[]): Map<string, ToolBinding[]> {\n const groups = new Map<string, ToolBinding[]>();\n\n for (const binding of bindings) {\n const existing = groups.get(binding.namespace) || [];\n existing.push(binding);\n groups.set(binding.namespace, existing);\n }\n\n return groups;\n}\n","import { ToolBinding, groupByNamespace } from './tool-binding.js';\n\n/**\n * Generates in-memory SDK code from discovered tool bindings.\n * The generated code creates a nested object structure where\n * tools.namespace.method(args) => callTool(\"namespace__method\", args)\n */\nexport class SDKGenerator {\n /**\n * Convert camelCase to snake_case for Python\n */\n private toSnakeCase(str: string): string {\n const snake = str.replace(/([A-Z])/g, '_$1').toLowerCase().replace(/^_/, '').replace(/[^a-z0-9_]/g, '_');\n // Ensure it doesn't start with a number\n return /^[0-9]/.test(snake) ? `_${snake}` : snake;\n }\n\n /**\n * Escape a string for use in generated code\n */\n private escapeString(str: string): string {\n return str.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\").replace(/\\n/g, '\\\\n');\n }\n\n /**\n * Generate TypeScript SDK code to be injected into Deno sandbox.\n * Creates: tools.namespace.method(args) => __internalCallTool(\"namespace__method\", args)\n * @param bindings Tool bindings to generate SDK for\n * @param allowedTools Optional allowlist for $raw() enforcement\n * @param enableRawFallback Enable $raw() escape hatch (default: true)\n */\n generateTypeScript(bindings: ToolBinding[], allowedTools?: string[], enableRawFallback = true): string {\n const grouped = groupByNamespace(bindings);\n const lines: string[] = [];\n\n lines.push('// Generated SDK - Do not edit');\n\n // Inject allowlist for SDK-level enforcement\n if (allowedTools && allowedTools.length > 0) {\n const normalizedList = allowedTools.map(t => t.replace(/\\./g, '__'));\n lines.push(`const __allowedTools = ${JSON.stringify(normalizedList)};`);\n } else {\n lines.push('const __allowedTools = null;');\n }\n\n lines.push('const _tools = {');\n\n for (const [namespace, tools] of grouped.entries()) {\n // Validate namespace is a valid identifier\n const safeNamespace = this.isValidIdentifier(namespace) ? namespace : `[\"${this.escapeString(namespace)}\"]`;\n\n if (this.isValidIdentifier(namespace)) {\n lines.push(` ${namespace}: {`);\n } else {\n lines.push(` \"${this.escapeString(namespace)}\": {`);\n }\n\n for (const tool of tools) {\n const methodName = this.isValidIdentifier(tool.methodName)\n ? tool.methodName\n : `[\"${this.escapeString(tool.methodName)}\"]`;\n\n // Add JSDoc if description available\n if (tool.description) {\n lines.push(` /** ${this.escapeString(tool.description)} */`);\n }\n\n if (this.isValidIdentifier(tool.methodName)) {\n lines.push(` async ${tool.methodName}(args) {`);\n } else {\n lines.push(` \"${this.escapeString(tool.methodName)}\": async function(args) {`);\n }\n lines.push(` return await __internalCallTool(\"${this.escapeString(tool.name)}\", args);`);\n lines.push(` },`);\n }\n\n lines.push(` },`);\n }\n\n // Add $raw escape hatch with allowlist validation\n if (enableRawFallback) {\n lines.push(` /** Call a tool by its full name (escape hatch for dynamic/unknown tools) */`);\n lines.push(` async $raw(name, args) {`);\n lines.push(` const normalized = name.replace(/\\\\./g, '__');`);\n lines.push(` if (__allowedTools) {`);\n lines.push(` const allowed = __allowedTools.some(p => {`);\n lines.push(` if (p.endsWith('__*')) return normalized.startsWith(p.slice(0, -1));`);\n lines.push(` return normalized === p;`);\n lines.push(` });`);\n lines.push(` if (!allowed) throw new Error(\\`Tool \\${name} is not in the allowlist\\`);`);\n lines.push(` }`);\n lines.push(` return await __internalCallTool(normalized, args);`);\n lines.push(` },`);\n }\n\n lines.push('};');\n lines.push(`\nconst tools = new Proxy(_tools, {\n get: (target, prop) => {\n if (prop in target) return target[prop];\n if (prop === 'then') return undefined;\n if (typeof prop === 'string') {\n // Flat tool access fallback: search all namespaces for a matching tool\n for (const nsName of Object.keys(target)) {\n if (nsName === '$raw') continue;\n const ns = target[nsName];\n if (ns && typeof ns === 'object' && ns[prop]) {\n return ns[prop];\n }\n }\n\n const forbidden = ['\\x24raw'];\n const namespaces = Object.keys(target).filter(k => !forbidden.includes(k));\n throw new Error(\\`Namespace or Tool '\\${prop}' not found. Available namespaces: \\${namespaces.join(', ') || 'none'}. Use tools.$raw(name, args) for dynamic calls.\\`);\n }\n return undefined;\n }\n});\n`);\n lines.push('(globalThis as any).tools = tools;');\n\n return lines.join('\\n');\n }\n\n /**\n * Generate Python SDK code to be injected into Pyodide sandbox.\n * Creates: tools.namespace.method(args) => _internal_call_tool(\"namespace__method\", args)\n * @param bindings Tool bindings to generate SDK for\n * @param allowedTools Optional allowlist for raw() enforcement\n * @param enableRawFallback Enable raw() escape hatch (default: true)\n */\n generatePython(bindings: ToolBinding[], allowedTools?: string[], enableRawFallback = true): string {\n const grouped = groupByNamespace(bindings);\n const lines: string[] = [];\n\n lines.push('# Generated SDK - Do not edit');\n\n // Inject allowlist for SDK-level enforcement\n if (allowedTools && allowedTools.length > 0) {\n const normalizedList = allowedTools.map(t => t.replace(/\\./g, '__'));\n lines.push(`_allowed_tools = ${JSON.stringify(normalizedList)}`);\n } else {\n lines.push('_allowed_tools = None');\n }\n\n lines.push('');\n\n // Generate namespace classes\n for (const [namespace, tools] of grouped.entries()) {\n const safeNamespace = this.toSnakeCase(namespace);\n lines.push(`class _${safeNamespace}_Namespace:`);\n\n for (const tool of tools) {\n const methodName = this.toSnakeCase(tool.methodName);\n const fullName = tool.name;\n // Accept both dict as first arg OR kwargs for flexibility\n lines.push(` async def ${methodName}(self, args=None, **kwargs):`);\n lines.push(` params = args if args is not None else kwargs`);\n lines.push(` return await _internal_call_tool(\"${this.escapeString(fullName)}\", params)`);\n }\n lines.push('');\n }\n\n // Generate the main Tools class\n lines.push('class _Tools:');\n lines.push(' def __init__(self):');\n if (grouped.size === 0) {\n lines.push(' pass');\n } else {\n for (const [namespace] of grouped.entries()) {\n const safeNamespace = this.toSnakeCase(namespace);\n lines.push(` self.${safeNamespace} = _${safeNamespace}_Namespace()`);\n }\n }\n\n lines.push('');\n lines.push(' def __getattr__(self, name):');\n lines.push(' # Flat access fallback: search all namespaces');\n lines.push(' for attr_name in dir(self):');\n lines.push(' attr = getattr(self, attr_name, None)');\n lines.push(' if attr and hasattr(attr, name):');\n lines.push(' return getattr(attr, name)');\n lines.push(' raise AttributeError(f\"Namespace or Tool \\'{name}\\' not found\")');\n\n if (enableRawFallback) {\n lines.push('');\n lines.push(' async def raw(self, name, args=None):');\n lines.push(' \"\"\"Call a tool by its full name (escape hatch for dynamic/unknown tools)\"\"\"');\n lines.push(' normalized = name.replace(\".\", \"__\")');\n lines.push(' if _allowed_tools is not None:');\n lines.push(' allowed = any(');\n lines.push(' normalized.startswith(p[:-1]) if p.endswith(\"__*\") else normalized == p');\n lines.push(' for p in _allowed_tools');\n lines.push(' )');\n lines.push(' if not allowed:');\n lines.push(' raise PermissionError(f\"Tool {name} is not in the allowlist\")');\n lines.push(' return await _internal_call_tool(normalized, args or {})');\n }\n\n lines.push('');\n lines.push('tools = _Tools()');\n\n return lines.join('\\n');\n }\n\n /**\n * Generate JavaScript SDK code for isolated-vm (V8 Isolate).\n * Creates: tools.namespace.method(args) => __callToolSync(\"namespace__method\", JSON.stringify(args))\n * @param bindings Tool bindings to generate SDK for\n * @param allowedTools Optional allowlist for $raw() enforcement\n * @param enableRawFallback Enable $raw() escape hatch (default: true)\n */\n generateIsolateSDK(bindings: ToolBinding[], allowedTools?: string[], enableRawFallback = true): string {\n const grouped = groupByNamespace(bindings);\n const lines: string[] = [];\n\n lines.push('// Generated SDK for isolated-vm');\n\n // Inject allowlist for SDK-level enforcement (optional, as Gateway also enforces)\n if (allowedTools && allowedTools.length > 0) {\n const normalizedList = allowedTools.map(t => t.replace(/\\./g, '__'));\n lines.push(`const __allowedTools = ${JSON.stringify(normalizedList)};`);\n } else {\n lines.push('const __allowedTools = null;');\n }\n\n lines.push('const _tools = {');\n\n for (const [namespace, tools] of grouped.entries()) {\n const safeNamespace = this.isValidIdentifier(namespace) ? namespace : `[\"${this.escapeString(namespace)}\"]`;\n\n if (this.isValidIdentifier(namespace)) {\n lines.push(` ${namespace}: {`);\n } else {\n lines.push(` \"${this.escapeString(namespace)}\": {`);\n }\n\n for (const tool of tools) {\n const methodName = this.isValidIdentifier(tool.methodName) ? tool.methodName : `[\"${this.escapeString(tool.methodName)}\"]`;\n\n if (this.isValidIdentifier(tool.methodName)) {\n lines.push(` async ${methodName}(args) {`);\n } else {\n lines.push(` \"${this.escapeString(tool.methodName)}\": async function(args) {`);\n }\n\n lines.push(` const resStr = await __callTool(\"${this.escapeString(tool.name)}\", JSON.stringify(args || {}));`);\n lines.push(` return JSON.parse(resStr);`);\n lines.push(` },`);\n }\n\n lines.push(' },');\n }\n\n // Add $raw escape hatch\n if (enableRawFallback) {\n lines.push(' async $raw(name, args) {');\n lines.push(` const normalized = name.replace(/\\\\./g, '__');`);\n lines.push(' if (__allowedTools) {');\n lines.push(` const allowed = __allowedTools.some(p => {`);\n lines.push(` if (p.endsWith('__*')) return normalized.startsWith(p.slice(0, -1));`);\n lines.push(' return normalized === p;');\n lines.push(' });');\n lines.push(' if (!allowed) throw new Error(`Tool ${name} is not in the allowlist`);');\n lines.push(' }');\n lines.push(' const resStr = await __callTool(normalized, JSON.stringify(args || {}));');\n lines.push(' return JSON.parse(resStr);');\n lines.push(' },');\n }\n\n lines.push('};');\n lines.push(`\nconst tools = new Proxy(_tools, {\n get: (target, prop) => {\n if (prop in target) return target[prop];\n if (prop === 'then') return undefined;\n if (typeof prop === 'string') {\n // Flat tool access fallback: search all namespaces for a matching tool\n for (const nsName of Object.keys(target)) {\n if (nsName === '$raw') continue;\n const ns = target[nsName];\n if (ns && typeof ns === 'object' && ns[prop]) {\n return ns[prop];\n }\n }\n\n const forbidden = ['\\x24raw'];\n const namespaces = Object.keys(target).filter(k => !forbidden.includes(k));\n throw new Error(\\`Namespace or Tool '\\${prop}' not found. Available namespaces: \\${namespaces.join(', ') || 'none'}. Use tools.$raw(name, args) for dynamic calls.\\`);\n }\n return undefined;\n }\n});\n`);\n\n return lines.join('\\n');\n }\n\n /**\n * Check if a string is a valid JavaScript/Python identifier\n */\n private isValidIdentifier(str: string): boolean {\n return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(str);\n }\n}\n","import { Logger } from 'pino';\nimport { ExecutorRegistry } from './registries/executor.registry.js';\nimport type { ResourceLimits } from './config.service.js';\nimport { GatewayService } from '../gateway/gateway.service.js';\nimport { SecurityService } from './security.service.js';\nimport { SDKGenerator, toToolBinding } from '../sdk/index.js';\nimport { ExecutionContext } from './execution.context.js';\nimport { ConduitError } from './types.js';\nimport type { ExecutionResult } from './interfaces/executor.interface.js';\n\nexport type { ExecutionResult };\n\nexport class ExecutionService {\n private logger: Logger;\n private executorRegistry: ExecutorRegistry;\n private sdkGenerator = new SDKGenerator();\n private defaultLimits: ResourceLimits;\n private gatewayService: GatewayService;\n private securityService: SecurityService;\n private _ipcAddress: string = '';\n\n constructor(\n logger: Logger,\n defaultLimits: ResourceLimits,\n gatewayService: GatewayService,\n securityService: SecurityService,\n executorRegistry: ExecutorRegistry\n ) {\n this.logger = logger;\n this.defaultLimits = defaultLimits;\n this.gatewayService = gatewayService;\n this.securityService = securityService;\n this.executorRegistry = executorRegistry;\n }\n\n set ipcAddress(addr: string) {\n this._ipcAddress = addr;\n }\n\n async executeTypeScript(\n code: string,\n limits: ResourceLimits,\n context: ExecutionContext,\n allowedTools?: string[]\n ): Promise<ExecutionResult> {\n const effectiveLimits = { ...this.defaultLimits, ...limits };\n\n // 1. Validation\n const securityResult = this.securityService.validateCode(code);\n if (!securityResult.valid) {\n return this.createErrorResult(ConduitError.Forbidden, securityResult.message || 'Access denied');\n }\n\n // 2. Routing Logic (Isolate vs Deno)\n // Strip simple comments to avoid false positives\n const cleanCode = code.replace(/\\/\\*[\\s\\S]*?\\*\\/|([^:]|^)\\/\\/.*$/gm, '$1');\n const hasImports = /^\\s*import\\s/m.test(cleanCode) ||\n /^\\s*export\\s/m.test(cleanCode) ||\n /\\bDeno\\./.test(cleanCode) ||\n /\\bDeno\\b/.test(cleanCode);\n\n // Try to use IsolateExecutor if available and code is simple\n if (!hasImports && this.executorRegistry.has('isolate')) {\n return await this.executeIsolate(code, effectiveLimits, context, allowedTools);\n }\n\n // Fix Sev2: Ensure IPC address is set before execution if Deno is needed\n if (!this._ipcAddress) {\n return this.createErrorResult(ConduitError.InternalError, 'IPC address not initialized');\n }\n\n // 3. Fallback to Deno\n if (!this.executorRegistry.has('deno')) {\n return this.createErrorResult(ConduitError.InternalError, 'Deno execution not available');\n }\n\n const executor = this.executorRegistry.get('deno')!;\n\n // 4. SDK Generation\n const bindings = await this.getToolBindings(context);\n const sdkCode = this.sdkGenerator.generateTypeScript(bindings, allowedTools);\n\n // 5. Session & Execution\n const sessionToken = this.securityService.createSession(allowedTools);\n try {\n return await executor.execute(code, effectiveLimits, context, {\n ipcAddress: this._ipcAddress,\n ipcToken: sessionToken,\n sdkCode\n });\n } finally {\n this.securityService.invalidateSession(sessionToken);\n }\n }\n\n async executePython(\n code: string,\n limits: ResourceLimits,\n context: ExecutionContext,\n allowedTools?: string[]\n ): Promise<ExecutionResult> {\n const effectiveLimits = { ...this.defaultLimits, ...limits };\n\n if (!this.executorRegistry.has('python')) {\n return this.createErrorResult(ConduitError.InternalError, 'Python execution not available');\n }\n\n // Fix Sev2: Ensure IPC address is set before execution for Python\n if (!this._ipcAddress) {\n return this.createErrorResult(ConduitError.InternalError, 'IPC address not initialized');\n }\n\n const executor = this.executorRegistry.get('python')!;\n\n const securityResult = this.securityService.validateCode(code);\n if (!securityResult.valid) {\n return this.createErrorResult(ConduitError.Forbidden, securityResult.message || 'Access denied');\n }\n\n const bindings = await this.getToolBindings(context);\n const sdkCode = this.sdkGenerator.generatePython(bindings, allowedTools);\n\n const sessionToken = this.securityService.createSession(allowedTools);\n try {\n return await executor.execute(code, effectiveLimits, context, {\n ipcAddress: this._ipcAddress,\n ipcToken: sessionToken,\n sdkCode\n });\n } finally {\n this.securityService.invalidateSession(sessionToken);\n }\n }\n\n private async getToolBindings(context: ExecutionContext) {\n // Phase 1: Lazy loading - fetch stubs instead of full schemas\n const packages = await this.gatewayService.listToolPackages();\n const allBindings = [];\n\n this.logger.debug({ packageCount: packages.length, packages: packages.map(p => p.id) }, 'Fetching tool bindings');\n\n for (const pkg of packages) {\n try {\n // Determine if we need to fetch tools for this package\n // Optimization: if allowedTools is strict, we could filter packages here\n\n const stubs = await this.gatewayService.listToolStubs(pkg.id, context);\n this.logger.debug({ packageId: pkg.id, stubCount: stubs.length }, 'Got stubs from package');\n allBindings.push(...stubs.map(s => toToolBinding(s.id, undefined, s.description)));\n } catch (err: any) {\n this.logger.warn({ packageId: pkg.id, err: err.message }, 'Failed to list stubs for package');\n }\n }\n\n this.logger.info({ totalBindings: allBindings.length }, 'Tool bindings ready for SDK generation');\n return allBindings;\n }\n\n async executeIsolate(\n code: string,\n limits: ResourceLimits,\n context: ExecutionContext,\n allowedTools?: string[]\n ): Promise<ExecutionResult> {\n if (!this.executorRegistry.has('isolate')) {\n return this.createErrorResult(ConduitError.InternalError, 'IsolateExecutor not available');\n }\n const executor = this.executorRegistry.get('isolate')!;\n\n const effectiveLimits = { ...this.defaultLimits, ...limits };\n const securityResult = this.securityService.validateCode(code);\n if (!securityResult.valid) {\n return this.createErrorResult(ConduitError.Forbidden, securityResult.message || 'Access denied');\n }\n\n const bindings = await this.getToolBindings(context);\n const sdkCode = this.sdkGenerator.generateIsolateSDK(bindings, allowedTools);\n\n try {\n return await executor.execute(code, effectiveLimits, context, { sdkCode });\n } catch (err: any) {\n return this.createErrorResult(ConduitError.InternalError, err.message);\n }\n }\n\n private createErrorResult(code: number, message: string): ExecutionResult {\n return {\n stdout: '',\n stderr: '',\n exitCode: null,\n error: { code, message }\n };\n }\n\n async shutdown(): Promise<void> {\n await this.executorRegistry.shutdownAll();\n }\n\n async warmup(): Promise<void> {\n const pythonExecutor = this.executorRegistry.get('python');\n if (pythonExecutor && 'warmup' in pythonExecutor) {\n // Cast to any because warmup is not in general Executor interface yet\n await (pythonExecutor as any).warmup(this.defaultLimits);\n }\n }\n\n async healthCheck(): Promise<any> {\n const pythonExecutor = this.executorRegistry.get('python');\n if (pythonExecutor && 'healthCheck' in pythonExecutor) {\n return (pythonExecutor as any).healthCheck();\n }\n return { status: 'ok' };\n }\n}\n","import { Middleware, NextFunction } from '../interfaces/middleware.interface.js';\nimport { JSONRPCRequest, JSONRPCResponse, ConduitError } from '../types.js';\nimport { ExecutionContext } from '../execution.context.js';\n\nexport class ErrorHandlingMiddleware implements Middleware {\n async handle(request: JSONRPCRequest, context: ExecutionContext, next: NextFunction): Promise<JSONRPCResponse | null> {\n try {\n return await next();\n } catch (err: any) {\n context.logger.error({ err }, 'Error handling request');\n return {\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: ConduitError.InternalError,\n message: err.message || 'Internal Server Error',\n },\n };\n }\n }\n}\n","import { Middleware, NextFunction } from '../interfaces/middleware.interface.js';\nimport { JSONRPCRequest, JSONRPCResponse } from '../types.js';\nimport { ExecutionContext } from '../execution.context.js';\nimport { metrics } from '../metrics.service.js';\n\nexport class LoggingMiddleware implements Middleware {\n async handle(request: JSONRPCRequest, context: ExecutionContext, next: NextFunction): Promise<JSONRPCResponse | null> {\n const { method, id } = request;\n const childLogger = context.logger.child({ method, id });\n context.logger = childLogger; // Update context logger for downstream\n\n metrics.recordExecutionStart();\n const startTime = Date.now();\n\n try {\n const response = await next();\n metrics.recordExecutionEnd(Date.now() - startTime, method);\n return response;\n } catch (err) {\n // Should be caught by ErrorMiddleware, but just in case\n metrics.recordExecutionEnd(Date.now() - startTime, method);\n throw err;\n }\n }\n}\n","import { Middleware, NextFunction } from '../interfaces/middleware.interface.js';\nimport { JSONRPCRequest, JSONRPCResponse, ConduitError } from '../types.js';\nimport { ExecutionContext } from '../execution.context.js';\nimport { SecurityService } from '../security.service.js';\n\nexport class AuthMiddleware implements Middleware {\n constructor(private securityService: SecurityService) { }\n\n async handle(\n request: JSONRPCRequest,\n context: ExecutionContext,\n next: NextFunction\n ): Promise<JSONRPCResponse | null> {\n const providedToken = request.auth?.bearerToken || '';\n const masterToken = this.securityService.getIpcToken();\n\n // If no master token is set (stdio mode), treat all requests as master (auth disabled)\n const isMaster = !masterToken || providedToken === masterToken;\n const isSession = !isMaster && this.securityService.validateIpcToken(providedToken);\n\n if (!isMaster && !isSession) {\n return {\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: ConduitError.Forbidden,\n message: 'Invalid bearer token'\n }\n };\n }\n\n // Strict scoping for session tokens\n if (isSession) {\n const allowedMethods = ['initialize', 'notifications/initialized', 'mcp_discover_tools', 'mcp_call_tool', 'ping', 'tools/list', 'tools/call'];\n if (!allowedMethods.includes(request.method)) {\n return {\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: ConduitError.Forbidden,\n message: 'Session tokens are restricted to tool discovery and calling only'\n }\n };\n }\n\n // Enrich context with session details if needed\n const session = this.securityService.getSession(providedToken);\n if (session?.allowedTools && !context.allowedTools) {\n // If context didn't already have specific tools (e.g. from request params override which shouldn't happen for sessions generally, \n // but usually session allowedTools wins or merges. \n // In generic logic, let's respect session.\n context.allowedTools = session.allowedTools;\n }\n }\n\n return next();\n }\n}\n","import { Middleware, NextFunction } from '../interfaces/middleware.interface.js';\nimport { JSONRPCRequest, JSONRPCResponse, ConduitError } from '../types.js';\nimport { ExecutionContext } from '../execution.context.js';\nimport { SecurityService } from '../security.service.js';\n\nexport class RateLimitMiddleware implements Middleware {\n constructor(private securityService: SecurityService) { }\n\n async handle(\n request: JSONRPCRequest,\n context: ExecutionContext,\n next: NextFunction\n ): Promise<JSONRPCResponse | null> {\n const providedToken = request.auth?.bearerToken;\n // Use token if available, otherwise fallback to remote address from context\n const rateLimitKey = providedToken || context.remoteAddress || 'unknown';\n\n if (!this.securityService.checkRateLimit(rateLimitKey)) {\n return {\n jsonrpc: '2.0',\n id: request.id,\n error: {\n code: -32005, // Rate limit exceeded code\n message: 'Rate limit exceeded'\n }\n };\n }\n\n return next();\n }\n}\n","/**\n * MiddlewareBuilder - Factory for building middleware pipelines\n * Extracted from RequestController per architecture-findings.md\n */\n\nimport { Middleware } from '../interfaces/middleware.interface.js';\nimport { ErrorHandlingMiddleware } from './error.middleware.js';\nimport { LoggingMiddleware } from './logging.middleware.js';\nimport { AuthMiddleware } from './auth.middleware.js';\nimport { RateLimitMiddleware } from './ratelimit.middleware.js';\nimport { SecurityService } from '../security.service.js';\n\n/**\n * Build the default middleware pipeline used by RequestController.\n * This centralizes middleware configuration outside the controller.\n */\nexport function buildDefaultMiddleware(securityService: SecurityService): Middleware[] {\n return [\n new ErrorHandlingMiddleware(),\n new LoggingMiddleware(),\n new AuthMiddleware(securityService),\n new RateLimitMiddleware(securityService),\n ];\n}\n","import Fastify from 'fastify';\nimport axios from 'axios';\nimport open from 'open';\nimport { v4 as uuidv4 } from 'uuid';\nimport crypto from 'node:crypto';\n\nexport interface AuthOptions {\n authUrl?: string;\n tokenUrl?: string;\n clientId: string;\n clientSecret?: string;\n scopes?: string;\n port?: number;\n mcpUrl?: string;\n usePkce?: boolean;\n}\n\ntype DiscoveredOAuth = {\n authUrl: string;\n tokenUrl: string;\n scopes?: string[];\n resource?: string;\n};\n\nconst AUTH_REQUEST_PAYLOAD = {\n jsonrpc: '2.0',\n id: 'conduit-auth',\n method: 'initialize',\n params: {\n clientInfo: {\n name: 'conduit-auth',\n version: '1.0.0',\n },\n },\n};\n\nfunction base64UrlEncode(buffer: Buffer): string {\n return buffer\n .toString('base64')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/g, '');\n}\n\nfunction createCodeVerifier(): string {\n return base64UrlEncode(crypto.randomBytes(32));\n}\n\nfunction createCodeChallenge(verifier: string): string {\n return base64UrlEncode(crypto.createHash('sha256').update(verifier).digest());\n}\n\nfunction parseResourceMetadataHeader(headerValue: string | string[] | undefined): string | null {\n if (!headerValue) return null;\n const header = Array.isArray(headerValue) ? headerValue.join(',') : headerValue;\n const match = header.match(/resource_metadata=\"([^\"]+)\"/i) || header.match(/resource_metadata=([^, ]+)/i);\n return match ? match[1] : null;\n}\n\nasync function discoverOAuthFromMcp(mcpUrl: string): Promise<DiscoveredOAuth> {\n const attempts = [\n () => axios.get(mcpUrl, { validateStatus: () => true }),\n () => axios.post(mcpUrl, AUTH_REQUEST_PAYLOAD, { validateStatus: () => true }),\n ];\n\n let resourceMetadataUrl: string | null = null;\n for (const attempt of attempts) {\n const response = await attempt();\n resourceMetadataUrl = parseResourceMetadataHeader(response.headers['www-authenticate']);\n if (resourceMetadataUrl) break;\n }\n\n if (!resourceMetadataUrl) {\n throw new Error('Unable to discover OAuth metadata (missing WWW-Authenticate resource_metadata)');\n }\n\n const metadataResponse = await axios.get(resourceMetadataUrl);\n const metadata = metadataResponse.data as Record<string, any>;\n\n let authUrl = metadata.authorization_endpoint as string | undefined;\n let tokenUrl = metadata.token_endpoint as string | undefined;\n let scopes = Array.isArray(metadata.scopes_supported) ? metadata.scopes_supported : undefined;\n const resource = typeof metadata.resource === 'string' ? metadata.resource : undefined;\n\n if (!authUrl || !tokenUrl) {\n const authServer = (Array.isArray(metadata.authorization_servers) && metadata.authorization_servers[0]) || metadata.issuer;\n if (!authServer) {\n throw new Error('OAuth metadata did not include authorization server info');\n }\n\n const asMetadataUrl = new URL('/.well-known/oauth-authorization-server', authServer).toString();\n const asMetadataResponse = await axios.get(asMetadataUrl);\n const asMetadata = asMetadataResponse.data as Record<string, any>;\n\n authUrl = authUrl || (asMetadata.authorization_endpoint as string | undefined);\n tokenUrl = tokenUrl || (asMetadata.token_endpoint as string | undefined);\n scopes = scopes || (Array.isArray(asMetadata.scopes_supported) ? asMetadata.scopes_supported : undefined);\n }\n\n if (!authUrl || !tokenUrl) {\n throw new Error('OAuth discovery failed: missing authorization or token endpoint');\n }\n\n return { authUrl, tokenUrl, scopes, resource };\n}\n\nfunction normalizeScopes(rawScopes?: string): string | undefined {\n if (!rawScopes) return undefined;\n return rawScopes\n .split(',')\n .map(scope => scope.trim())\n .filter(Boolean)\n .join(' ');\n}\n\nexport async function handleAuth(options: AuthOptions) {\n const port = options.port || 3333;\n const redirectUri = `http://localhost:${port}/callback`;\n const state = uuidv4();\n const codeVerifier = options.usePkce ? createCodeVerifier() : undefined;\n const codeChallenge = codeVerifier ? createCodeChallenge(codeVerifier) : undefined;\n\n const fastify = Fastify();\n let resolvedScopes = normalizeScopes(options.scopes);\n let resolvedAuthUrl = options.authUrl;\n let resolvedTokenUrl = options.tokenUrl;\n let resolvedResource: string | undefined;\n\n if (options.mcpUrl) {\n const discovered = await discoverOAuthFromMcp(options.mcpUrl);\n resolvedAuthUrl = discovered.authUrl;\n resolvedTokenUrl = discovered.tokenUrl;\n resolvedResource = discovered.resource;\n if (!resolvedScopes && discovered.scopes && discovered.scopes.length > 0) {\n resolvedScopes = discovered.scopes.join(' ');\n }\n }\n\n if (!resolvedAuthUrl || !resolvedTokenUrl) {\n throw new Error('OAuth configuration missing authUrl or tokenUrl (set --mcp-url or provide both)');\n }\n\n return new Promise<void>((resolve, reject) => {\n fastify.get('/callback', async (request, reply) => {\n const { code, state: returnedState, error, error_description } = request.query as any;\n\n if (error) {\n reply.send(`Authentication failed: ${error} - ${error_description}`);\n reject(new Error(`OAuth error: ${error}`));\n return;\n }\n\n if (returnedState !== state) {\n reply.send('Invalid state parameter');\n reject(new Error('State mismatch'));\n return;\n }\n\n try {\n const body = new URLSearchParams();\n body.set('grant_type', 'authorization_code');\n body.set('code', code);\n body.set('redirect_uri', redirectUri);\n body.set('client_id', options.clientId);\n if (options.clientSecret) {\n body.set('client_secret', options.clientSecret);\n }\n if (codeVerifier) {\n body.set('code_verifier', codeVerifier);\n }\n if (resolvedResource) {\n body.set('resource', resolvedResource);\n }\n\n const response = await axios.post(resolvedTokenUrl, body, {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'Accept': 'application/json',\n },\n });\n\n const { refresh_token, access_token } = response.data;\n\n console.log('\\n--- Authentication Successful ---\\n');\n console.log('Use these values in your conduit.yaml:\\n');\n console.log('credentials:');\n console.log(' type: oauth2');\n console.log(` clientId: ${options.clientId}`);\n if (options.clientSecret) {\n console.log(` clientSecret: ${options.clientSecret}`);\n }\n console.log(` tokenUrl: \"${resolvedTokenUrl}\"`);\n console.log(` refreshToken: \"${refresh_token || 'N/A (No refresh token returned)'}\"`);\n if (resolvedScopes) {\n console.log(` scopes: [\"${resolvedScopes.split(' ').join('\", \"')}\"]`);\n }\n\n if (!refresh_token) {\n console.log('\\nWarning: No refresh token was returned. Ensure your app has \"offline_access\" scope or similar.');\n }\n\n console.log('\\nRaw response data:', JSON.stringify(response.data, null, 2));\n\n reply.send('Authentication successful! You can close this window and return to the terminal.');\n resolve();\n } catch (err: any) {\n const msg = err.response?.data?.error_description || err.response?.data?.error || err.message;\n reply.send(`Failed to exchange code for token: ${msg}`);\n reject(new Error(`Token exchange failed: ${msg}`));\n } finally {\n setTimeout(() => fastify.close(), 1000);\n }\n });\n\n fastify.listen({ port: port, host: '127.0.0.1' }, async (err) => {\n if (err) {\n reject(err);\n return;\n }\n\n const authUrl = new URL(resolvedAuthUrl);\n authUrl.searchParams.append('client_id', options.clientId);\n authUrl.searchParams.append('redirect_uri', redirectUri);\n authUrl.searchParams.append('response_type', 'code');\n authUrl.searchParams.append('state', state);\n if (resolvedScopes) {\n authUrl.searchParams.append('scope', resolvedScopes);\n }\n if (codeChallenge) {\n authUrl.searchParams.append('code_challenge', codeChallenge);\n authUrl.searchParams.append('code_challenge_method', 'S256');\n }\n if (resolvedResource) {\n authUrl.searchParams.append('resource', resolvedResource);\n }\n\n console.log(`Opening browser to: ${authUrl.toString()}`);\n console.log('Waiting for callback...');\n await open(authUrl.toString());\n });\n });\n}\n"],"mappings":"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","names":["fs","path","path","fs","axios","z","axios","stubs","net","LRUCache","uuidv4","LRUCache","crypto","fs","path","fileURLToPath","path","fs","__dirname","path","fileURLToPath","fs","code","fs","path","fileURLToPath","__dirname","path","fileURLToPath","fs","path","__dirname","Fastify","axios","uuidv4","crypto"]}