contextwise 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/config/schema.ts","../src/vault/redaction.ts","../src/utils/logger.ts","../src/config/loader.ts","../src/core/supervisor.ts","../src/vault/crypto.ts","../src/vault/file_driver.ts","../src/vault/os_driver.ts","../src/vault/vault.ts","../src/vault/audit.ts","../src/vault/resolver.ts","../src/core/multiplexer.ts","../src/catalog/normalizer.ts","../src/catalog/search.ts","../src/catalog/registry.ts","../src/guardrails/validator.ts","../src/utils/hash.ts","../src/guardrails/cache.ts","../src/guardrails/loop_breaker.ts","../src/metrics/collector.ts","../src/router/meta_tools.ts","../src/registry/known_servers.ts","../src/registry/official_client.ts","../src/registry/smithery_client.ts","../src/registry/remote_registry.ts","../src/registry/recommender.ts","../src/registry/manager.ts","../src/router/workspace.ts","../src/router/router.ts","../src/core/proxy.ts","../src/cloud/client.ts","../src/cloud/crypto.ts","../src/cloud/sync_manager.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const StdioUpstreamConfigSchema = z.object({\n command: z.string(),\n args: z.array(z.string()).default([]),\n env: z.record(z.string()).default({}),\n cwd: z.string().optional(),\n autoRestart: z.boolean().default(true),\n});\n\nexport const HttpUpstreamConfigSchema = z.object({\n url: z.string().url(),\n headers: z.record(z.string()).default({}),\n transport: z.enum(['streamable-http', 'sse', 'auto']).default('auto'),\n autoReconnect: z.boolean().default(true),\n});\n\nexport const UpstreamServerConfigSchema = z.union([\n StdioUpstreamConfigSchema,\n HttpUpstreamConfigSchema,\n]);\n\nexport function warnIfInsecureHttp(urlStr: string, headers?: Record<string, string>): void {\n try {\n const parsed = new URL(urlStr);\n if (parsed.protocol === 'http:') {\n const isLocalhost = ['localhost', '127.0.0.1', '::1', '[::1]'].includes(parsed.hostname);\n if (!isLocalhost && headers) {\n const hasAuthHeader = Object.keys(headers).some((h) =>\n ['authorization', 'cookie', 'x-api-key', 'api-key', 'token'].includes(h.toLowerCase())\n );\n if (hasAuthHeader) {\n console.warn(\n `[SECURITY WARNING] Upstream URL \"${urlStr}\" is using unencrypted HTTP with sensitive authentication headers to non-localhost destination \"${parsed.hostname}\".`\n );\n }\n }\n }\n } catch {\n // ignore invalid URL\n }\n}\n\nexport function isStdioUpstream(\n config: UpstreamServerConfig\n): config is z.infer<typeof StdioUpstreamConfigSchema> {\n return 'command' in config;\n}\n\nexport function isHttpUpstream(\n config: UpstreamServerConfig\n): config is z.infer<typeof HttpUpstreamConfigSchema> {\n return 'url' in config;\n}\n\nexport const ProxyConfigSchema = z.object({\n transport: z.enum(['stdio', 'sse', 'http']).default('stdio'),\n port: z.number().int().min(1024).max(65535).default(3456),\n logLevel: z.enum(['debug', 'info', 'warn', 'error', 'silent']).default('info'),\n});\n\nexport const RoutingConfigSchema = z.object({\n strategy: z.enum(['hybrid', 'bm25', 'vector', 'passthrough']).default('hybrid'),\n topK: z.number().int().min(1).max(50).default(5),\n similarityThreshold: z.number().min(0).max(1).default(0.45),\n pinnedTools: z.array(z.string()).default([]),\n maxActiveTools: z.number().int().min(1).max(100).default(10),\n enableBrowseServers: z.boolean().default(false),\n enableAddServer: z.boolean().default(false),\n allowCustomCommands: z.boolean().default(false),\n persistAddedServers: z.boolean().default(false),\n});\n\nexport const GuardrailsConfigSchema = z.object({\n enableCache: z.boolean().default(true),\n cacheTtlSeconds: z.number().int().min(1).default(120),\n maxCallsPerMinute: z.number().int().min(1).default(60),\n loopBreakerThreshold: z.number().int().min(1).default(3),\n callTimeoutMs: z.number().int().min(1000).default(30000),\n});\n\nexport const ContextWiseConfigSchema = z.object({\n $schema: z.string().optional(),\n version: z.string().default('1.0.0'),\n proxy: ProxyConfigSchema.default({}),\n routing: RoutingConfigSchema.default({}),\n guardrails: GuardrailsConfigSchema.default({}),\n upstreams: z.record(UpstreamServerConfigSchema).default({}),\n});\n\nexport type StdioUpstreamConfig = z.infer<typeof StdioUpstreamConfigSchema>;\nexport type HttpUpstreamConfig = z.infer<typeof HttpUpstreamConfigSchema>;\nexport type UpstreamServerConfig = z.infer<typeof UpstreamServerConfigSchema>;\nexport type ProxyConfig = z.infer<typeof ProxyConfigSchema>;\nexport type RoutingConfig = z.infer<typeof RoutingConfigSchema>;\nexport type GuardrailsConfig = z.infer<typeof GuardrailsConfigSchema>;\nexport type ContextWiseConfig = z.infer<typeof ContextWiseConfigSchema>;\n","/**\n * Stream & Text Redaction Engine for ContextWise.\n * Prevents sensitive API keys, database passwords, and vault tokens\n * from leaking into stdout, stderr, logs, or MCP prompt outputs.\n */\nexport class RedactionFilter {\n private static instance: RedactionFilter | null = null;\n private registeredSecrets: Set<string> = new Set();\n\n static getInstance(): RedactionFilter {\n if (!RedactionFilter.instance) {\n RedactionFilter.instance = new RedactionFilter();\n }\n return RedactionFilter.instance;\n }\n\n /**\n * Registers a plaintext secret value to be masked across all output streams.\n */\n registerSecret(secret: string): void {\n if (secret && typeof secret === 'string') {\n const trimmed = secret.trim();\n // Minimum 4 characters to avoid masking common small tokens/integers\n if (trimmed.length >= 4) {\n this.registeredSecrets.add(trimmed);\n }\n }\n }\n\n registerSecrets(secrets: string[]): void {\n for (const s of secrets) {\n this.registerSecret(s);\n }\n }\n\n getRegisteredCount(): number {\n return this.registeredSecrets.size;\n }\n\n clear(): void {\n this.registeredSecrets.clear();\n }\n\n /**\n * Redacts registered secrets and known API key patterns from an input string.\n */\n redact(input: string): string {\n if (!input || typeof input !== 'string') {\n return input;\n }\n\n let sanitized = input;\n\n // 1. Redact exact registered secret values\n for (const secret of this.registeredSecrets) {\n sanitized = sanitized.replaceAll(secret, '[REDACTED_SECRET]');\n }\n\n // 2. Redact common token patterns as a secondary safety net\n // GitHub PATs\n sanitized = sanitized.replace(/ghp_[a-zA-Z0-9]{36}/g, 'ghp_[REDACTED_GITHUB_TOKEN]');\n // Anthropic API keys\n sanitized = sanitized.replace(/sk-ant-[a-zA-Z0-9_-]{20,}/g, 'sk-ant-[REDACTED_ANTHROPIC_KEY]');\n // OpenAI API keys\n sanitized = sanitized.replace(/sk-[a-zA-Z0-9]{32,}/g, 'sk-[REDACTED_OPENAI_KEY]');\n // Database connection strings containing passwords\n sanitized = sanitized.replace(\n /([a-zA-Z0-9+]+:\\/\\/[^:]+:)([^@]+)(@.+)/g,\n '$1[REDACTED_PASSWORD]$3'\n );\n\n return sanitized;\n }\n}\n\nexport const redactionFilter = RedactionFilter.getInstance();\n","/**\n * Structured Logger for ContextWise\n * \n * CRITICAL MCP REQUIREMENT:\n * In stdio mode, stdout is strictly reserved for JSON-RPC 2.0 messages.\n * Any log messages must be written to stderr or log files to prevent protocol corruption.\n */\n\nimport { redactionFilter } from '../vault/redaction.js';\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'silent';\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n debug: 10,\n info: 20,\n warn: 30,\n error: 40,\n silent: 100,\n};\n\nexport class Logger {\n private level: LogLevel = 'info';\n private prefix: string;\n\n constructor(prefix: string = 'ContextWise', level: LogLevel = 'info') {\n this.prefix = prefix;\n this.level = level;\n }\n\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n getLevel(): LogLevel {\n return this.level;\n }\n\n private shouldLog(level: LogLevel): boolean {\n return LOG_LEVELS[level] >= LOG_LEVELS[this.level];\n }\n\n private formatMessage(level: string, message: string, meta?: unknown): string {\n const timestamp = new Date().toISOString();\n const metaStr = meta !== undefined ? ` ${typeof meta === 'object' ? JSON.stringify(meta) : String(meta)}` : '';\n const raw = `[${timestamp}] [${level.toUpperCase()}] [${this.prefix}] ${message}${metaStr}\\n`;\n return redactionFilter.redact(raw);\n }\n\n debug(message: string, meta?: unknown): void {\n if (this.shouldLog('debug')) {\n process.stderr.write(this.formatMessage('DEBUG', message, meta));\n }\n }\n\n info(message: string, meta?: unknown): void {\n if (this.shouldLog('info')) {\n process.stderr.write(this.formatMessage('INFO', message, meta));\n }\n }\n\n warn(message: string, meta?: unknown): void {\n if (this.shouldLog('warn')) {\n process.stderr.write(this.formatMessage('WARN', message, meta));\n }\n }\n\n error(message: string, meta?: unknown): void {\n if (this.shouldLog('error')) {\n process.stderr.write(this.formatMessage('ERROR', message, meta));\n }\n }\n}\n\nexport const logger = new Logger('ContextWise');\n","import { existsSync, readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { isAbsolute, join, resolve } from 'node:path';\nimport { logger } from '../utils/logger.js';\nimport {\n ContextWiseConfig,\n ContextWiseConfigSchema,\n UpstreamServerConfig,\n} from './schema.js';\n\nexport interface LoadConfigOptions {\n configPath?: string;\n cwd?: string;\n autoImport?: boolean;\n}\n\nexport class ConfigLoader {\n /**\n * Discovers and loads configuration from contextwise.json or imported client configs.\n */\n static load(options: LoadConfigOptions = {}): ContextWiseConfig {\n const cwd = options.cwd ?? process.cwd();\n\n // 0. Environment variable override\n if (process.env.CONTEXTWISE_CONFIG && !options.configPath) {\n const envPath = isAbsolute(process.env.CONTEXTWISE_CONFIG)\n ? process.env.CONTEXTWISE_CONFIG\n : resolve(cwd, process.env.CONTEXTWISE_CONFIG);\n if (existsSync(envPath)) {\n return this.parseConfigFile(envPath);\n }\n }\n if (options.configPath) {\n const explicitPath = isAbsolute(options.configPath)\n ? options.configPath\n : resolve(cwd, options.configPath);\n\n if (existsSync(explicitPath)) {\n return this.parseConfigFile(explicitPath);\n }\n throw new Error(`Configuration file not found at: ${explicitPath}`);\n }\n\n // 2. Look for native contextwise.json in current directory or parent\n const candidatePaths = [\n resolve(cwd, 'contextwise.json'),\n resolve(cwd, '.contextwise.json'),\n resolve(cwd, '.contextwise/config.json'),\n resolve(homedir(), '.contextwise/config.json'),\n ];\n\n for (const candidate of candidatePaths) {\n if (existsSync(candidate)) {\n logger.debug(`Loaded configuration from ${candidate}`);\n return this.parseConfigFile(candidate);\n }\n }\n\n // 3. Auto-import from known AI client configurations if requested\n if (options.autoImport !== false) {\n const imported = this.autoImportClientConfigs(cwd);\n if (imported && Object.keys(imported.upstreams).length > 0) {\n logger.info(`Auto-discovered MCP servers from existing client configurations`);\n return imported;\n }\n }\n\n // 4. Return default empty configuration\n logger.debug('No configuration file found. Using defaults.');\n return ContextWiseConfigSchema.parse({});\n }\n\n /**\n * Parses and validates a JSON file against ContextWiseConfigSchema.\n */\n static parseConfigFile(filePath: string): ContextWiseConfig {\n try {\n const raw = readFileSync(filePath, 'utf-8');\n const parsed = JSON.parse(raw);\n return ContextWiseConfigSchema.parse(parsed);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new Error(`Failed to parse config at ${filePath}: ${msg}`);\n }\n }\n\n /**\n * Scans for Cursor and Claude Desktop configs to auto-import upstreams.\n */\n static autoImportClientConfigs(cwd: string): ContextWiseConfig | null {\n const upstreams: Record<string, UpstreamServerConfig> = {};\n\n // Check .cursor/mcp.json\n const cursorMcp = resolve(cwd, '.cursor', 'mcp.json');\n if (existsSync(cursorMcp)) {\n try {\n const raw = JSON.parse(readFileSync(cursorMcp, 'utf-8'));\n if (raw.mcpServers && typeof raw.mcpServers === 'object') {\n for (const [name, server] of Object.entries(raw.mcpServers)) {\n if (name === 'contextwise') continue; // Skip self\n const s = server as Record<string, unknown>;\n if (typeof s.command === 'string') {\n upstreams[name] = {\n command: s.command,\n args: Array.isArray(s.args) ? (s.args as string[]) : [],\n env: (s.env as Record<string, string>) ?? {},\n autoRestart: true,\n };\n } else if (typeof s.url === 'string') {\n upstreams[name] = {\n url: s.url,\n headers: (s.headers as Record<string, string>) ?? {},\n transport: 'auto',\n autoReconnect: true,\n };\n }\n }\n }\n } catch (err) {\n logger.warn(`Failed reading ${cursorMcp}: ${err}`);\n }\n }\n\n // Check Claude Desktop config\n const claudePath = this.getClaudeDesktopConfigPath();\n if (claudePath && existsSync(claudePath)) {\n try {\n const raw = JSON.parse(readFileSync(claudePath, 'utf-8'));\n if (raw.mcpServers && typeof raw.mcpServers === 'object') {\n for (const [name, server] of Object.entries(raw.mcpServers)) {\n if (name === 'contextwise') continue;\n const s = server as Record<string, unknown>;\n if (typeof s.command === 'string' && !upstreams[name]) {\n upstreams[name] = {\n command: s.command,\n args: Array.isArray(s.args) ? (s.args as string[]) : [],\n env: (s.env as Record<string, string>) ?? {},\n autoRestart: true,\n };\n } else if (typeof s.url === 'string' && !upstreams[name]) {\n upstreams[name] = {\n url: s.url,\n headers: (s.headers as Record<string, string>) ?? {},\n transport: 'auto',\n autoReconnect: true,\n };\n }\n }\n }\n } catch (err) {\n logger.warn(`Failed reading Claude config at ${claudePath}: ${err}`);\n }\n }\n\n if (Object.keys(upstreams).length === 0) {\n return null;\n }\n\n return ContextWiseConfigSchema.parse({\n upstreams,\n });\n }\n\n static getClaudeDesktopConfigPath(): string | null {\n const platform = process.platform;\n const home = homedir();\n\n if (platform === 'win32') {\n const appData = process.env.APPDATA || join(home, 'AppData', 'Roaming');\n return join(appData, 'Claude', 'claude_desktop_config.json');\n } else if (platform === 'darwin') {\n return join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');\n } else {\n return join(home, '.config', 'Claude', 'claude_desktop_config.json');\n }\n }\n}\n","import { execSync, spawn } from 'node:child_process';\nimport { logger } from '../utils/logger.js';\n\nexport interface SupervisedProcess {\n pid: number;\n name: string;\n startTime: Date;\n}\n\nexport class ProcessSupervisor {\n private static instance: ProcessSupervisor | null = null;\n private trackedProcesses: Map<number, SupervisedProcess> = new Map();\n private hooksRegistered: boolean = false;\n\n private constructor() {\n this.registerGlobalHooks();\n }\n\n static getInstance(): ProcessSupervisor {\n if (!ProcessSupervisor.instance) {\n ProcessSupervisor.instance = new ProcessSupervisor();\n }\n return ProcessSupervisor.instance;\n }\n\n /**\n * Registers a child PID under supervision.\n */\n track(pid: number, name: string): void {\n if (!pid || pid <= 0) return;\n this.trackedProcesses.set(pid, {\n pid,\n name,\n startTime: new Date(),\n });\n logger.debug(`Supervising process ${name} (PID: ${pid})`);\n }\n\n /**\n * Unregisters a child PID (e.g., normal graceful exit).\n */\n untrack(pid: number): void {\n this.trackedProcesses.delete(pid);\n logger.debug(`Untracked process PID: ${pid}`);\n }\n\n /**\n * Kills an entire process tree for a given root PID.\n * Cross-platform: handles Windows taskkill /T /F and POSIX process group kills.\n */\n killProcessTree(pid: number, name?: string): void {\n if (!pid || pid <= 0) return;\n const procName = name ?? this.trackedProcesses.get(pid)?.name ?? 'unknown';\n\n logger.debug(`Terminating process tree for ${procName} (PID: ${pid})`);\n\n try {\n if (process.platform === 'win32') {\n // Windows: /T kills entire child tree, /F forces termination\n execSync(`taskkill /PID ${pid} /T /F`, { stdio: 'ignore' });\n } else {\n // POSIX: try process group first, fallback to individual kill\n try {\n process.kill(-pid, 'SIGKILL');\n } catch {\n process.kill(pid, 'SIGKILL');\n }\n }\n } catch {\n // Process may already be dead\n } finally {\n this.untrack(pid);\n }\n }\n\n /**\n * Shuts down all supervised processes cleanly.\n */\n shutdownAll(): void {\n if (this.trackedProcesses.size === 0) return;\n\n logger.info(`Shutting down ${this.trackedProcesses.size} supervised processes...`);\n for (const [pid, proc] of this.trackedProcesses.entries()) {\n this.killProcessTree(pid, proc.name);\n }\n this.trackedProcesses.clear();\n }\n\n /**\n * Returns list of currently tracked processes.\n */\n getTrackedProcesses(): SupervisedProcess[] {\n return Array.from(this.trackedProcesses.values());\n }\n\n private registerGlobalHooks(): void {\n if (this.hooksRegistered) return;\n this.hooksRegistered = true;\n\n const cleanup = () => {\n this.shutdownAll();\n };\n\n process.on('exit', cleanup);\n\n const handleSignal = (signal: NodeJS.Signals) => {\n // If higher-level handlers (e.g., startCommand) are registered,\n // let them manage graceful asynchronous shutdown.\n if (process.listenerCount(signal) > 1) {\n return;\n }\n cleanup();\n process.exit(0);\n };\n\n process.on('SIGINT', () => handleSignal('SIGINT'));\n process.on('SIGTERM', () => handleSignal('SIGTERM'));\n }\n}\n\nexport const supervisor = ProcessSupervisor.getInstance();\n","import {\n createCipheriv,\n createDecipheriv,\n createHash,\n createPrivateKey,\n createPublicKey,\n diffieHellman,\n generateKeyPairSync,\n pbkdf2,\n randomBytes,\n} from 'node:crypto';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { arch, homedir, hostname, platform, userInfo } from 'node:os';\nimport { dirname, join } from 'node:path';\n\nexport interface AesGcmResult {\n iv: string; // base64\n authTag: string; // base64\n ciphertext: string; // base64\n}\n\n/**\n * Encrypts UTF-8 plaintext using AES-256-GCM with a 96-bit random IV.\n */\nexport function encryptAesGcm(plaintext: string, key: Buffer): AesGcmResult {\n if (key.length !== 32) {\n throw new Error(`Invalid AES-256 key length: expected 32 bytes, got ${key.length}`);\n }\n\n const iv = randomBytes(12); // 96 bits recommended for GCM\n const cipher = createCipheriv('aes-256-gcm', key, iv);\n\n let ciphertext = cipher.update(plaintext, 'utf-8', 'base64');\n ciphertext += cipher.final('base64');\n\n const authTag = cipher.getAuthTag();\n\n return {\n iv: iv.toString('base64'),\n authTag: authTag.toString('base64'),\n ciphertext,\n };\n}\n\n/**\n * Decrypts AES-256-GCM ciphertext, verifying the 128-bit authentication tag.\n */\nexport function decryptAesGcm(\n ciphertext: string,\n key: Buffer,\n ivBase64: string,\n authTagBase64: string\n): string {\n if (key.length !== 32) {\n throw new Error(`Invalid AES-256 key length: expected 32 bytes, got ${key.length}`);\n }\n\n const iv = Buffer.from(ivBase64, 'base64');\n const authTag = Buffer.from(authTagBase64, 'base64');\n const decipher = createDecipheriv('aes-256-gcm', key, iv);\n\n decipher.setAuthTag(authTag);\n\n let decrypted = decipher.update(ciphertext, 'base64', 'utf-8');\n decrypted += decipher.final('utf-8');\n\n return decrypted;\n}\n\n/**\n * Standard OWASP-recommended PBKDF2 iterations for SHA-512 key derivation.\n */\nexport const VAULT_PBKDF2_ITERATIONS = 210_000;\n\n/**\n * Derives a 256-bit encryption key from a passphrase using PBKDF2 with SHA-512.\n */\nexport function deriveKeyFromPassphrase(\n passphrase: string,\n salt: Buffer,\n iterations: number = VAULT_PBKDF2_ITERATIONS\n): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n pbkdf2(passphrase, salt, iterations, 32, 'sha512', (err, derivedKey) => {\n if (err) reject(err);\n else resolve(derivedKey);\n });\n });\n}\n\n/**\n * Derives a key for the local encrypted vault.\n *\n * Security & Threat Model:\n * By default, this derives a deterministic machine-bound key from OS user and hardware\n * parameters and a random 32-byte salt stored at ~/.contextwise/.machine_salt (mode 0600).\n * This protects secrets against accidental repository commits, copy-pasting, and unprivileged processes.\n * For defense-in-depth against local attackers with read access to ~/.contextwise, users can set\n * the CONTEXTWISE_VAULT_PASSPHRASE environment variable, which derives the key directly from\n * their secret user passphrase instead of machine identifiers.\n */\nexport async function getOrCreateMachineKey(): Promise<Buffer> {\n const saltDir = join(homedir(), '.contextwise');\n const saltPath = join(saltDir, '.machine_salt');\n\n let salt: Buffer;\n if (existsSync(saltPath)) {\n salt = readFileSync(saltPath);\n } else {\n mkdirSync(saltDir, { recursive: true });\n salt = randomBytes(32);\n writeFileSync(saltPath, salt, { mode: 0o600 });\n }\n\n // Passphrase mode takes precedence if provided\n if (process.env.CONTEXTWISE_VAULT_PASSPHRASE) {\n return deriveKeyFromPassphrase(process.env.CONTEXTWISE_VAULT_PASSPHRASE, salt, VAULT_PBKDF2_ITERATIONS);\n }\n\n const user = (() => {\n try {\n return userInfo().username;\n } catch {\n return 'default_user';\n }\n })();\n\n const machineId = `${hostname()}-${user}-${platform()}-${arch()}-contextwise-vault-v1`;\n return deriveKeyFromPassphrase(machineId, salt, VAULT_PBKDF2_ITERATIONS);\n}\n\n/**\n * Generates an asymmetric X25519 keypair for team member envelope encryption.\n */\nexport function generateKeyPairX25519(): { publicKey: string; privateKey: string } {\n const { publicKey, privateKey } = generateKeyPairSync('x25519', {\n publicKeyEncoding: { type: 'spki', format: 'pem' },\n privateKeyEncoding: { type: 'pkcs8', format: 'pem' },\n });\n return { publicKey, privateKey };\n}\n\n/**\n * Derives a shared symmetric secret using ECDH / X25519 for team secret sharing.\n */\nexport function deriveSharedSecretX25519(privateKeyPem: string, publicKeyPem: string): Buffer {\n const privateKey = createPrivateKey(privateKeyPem);\n const publicKey = createPublicKey(publicKeyPem);\n const shared = diffieHellman({\n privateKey,\n publicKey,\n });\n // Hash the raw shared secret with SHA-256 to produce an exact 32-byte AES key\n return createHash('sha256').update(shared).digest();\n}\n","import { existsSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\nimport { logger } from '../utils/logger.js';\nimport {\n decryptAesGcm,\n encryptAesGcm,\n getOrCreateMachineKey,\n VAULT_PBKDF2_ITERATIONS,\n} from './crypto.js';\nimport type { EncryptedVaultPayload, SecretMetadata, VaultDriver } from './types.js';\n\ninterface StoredSecretEntry {\n value: string;\n metadata: SecretMetadata;\n}\n\nexport function getDefaultVaultFilePath(): string {\n if (process.env.CONTEXTWISE_VAULT_PATH) {\n return process.env.CONTEXTWISE_VAULT_PATH;\n }\n if (process.env.CONTEXTWISE_STORAGE_DIR) {\n return join(process.env.CONTEXTWISE_STORAGE_DIR, 'vault.enc.json');\n }\n return join(homedir(), '.contextwise', 'vault.enc.json');\n}\n\nexport class EncryptedFileVaultDriver implements VaultDriver {\n readonly name = 'encrypted_file';\n private filePath: string;\n private keyPromise: Promise<Buffer>;\n private cache: Map<string, StoredSecretEntry> | null = null;\n\n constructor(filePath?: string, customKey?: Buffer) {\n this.filePath = filePath ?? getDefaultVaultFilePath();\n this.keyPromise = customKey ? Promise.resolve(customKey) : getOrCreateMachineKey();\n }\n\n async isAvailable(): Promise<boolean> {\n return true;\n }\n\n private async load(): Promise<Map<string, StoredSecretEntry>> {\n if (this.cache) {\n return this.cache;\n }\n\n this.cache = new Map();\n\n if (!existsSync(this.filePath)) {\n return this.cache;\n }\n\n try {\n const raw = readFileSync(this.filePath, 'utf-8');\n const payload = JSON.parse(raw) as EncryptedVaultPayload;\n\n if (payload.cipher !== 'aes-256-gcm' || !payload.data) {\n logger.warn(`Corrupt or incompatible vault file at ${this.filePath}`);\n return this.cache;\n }\n\n const key = await this.keyPromise;\n const decryptedJson = decryptAesGcm(payload.data, key, payload.iv, payload.authTag);\n const entries = JSON.parse(decryptedJson) as Record<string, StoredSecretEntry>;\n\n for (const [k, v] of Object.entries(entries)) {\n this.cache.set(k, v);\n }\n } catch (err) {\n logger.warn(`Failed to decrypt vault file at ${this.filePath}: ${err}`);\n }\n\n return this.cache;\n }\n\n private async persist(): Promise<void> {\n if (!this.cache) return;\n\n const dir = dirname(this.filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n const key = await this.keyPromise;\n const entries: Record<string, StoredSecretEntry> = {};\n for (const [k, v] of this.cache.entries()) {\n entries[k] = v;\n }\n\n const plaintext = JSON.stringify(entries);\n const { iv, authTag, ciphertext } = encryptAesGcm(plaintext, key);\n\n const payload: EncryptedVaultPayload = {\n version: 1,\n kdf: {\n algorithm: 'pbkdf2-sha512',\n salt: 'machine-bound',\n iterations: VAULT_PBKDF2_ITERATIONS,\n },\n cipher: 'aes-256-gcm',\n iv,\n authTag,\n data: ciphertext,\n };\n\n const tempPath = `${this.filePath}.${Date.now()}.tmp`;\n writeFileSync(tempPath, JSON.stringify(payload, null, 2), { mode: 0o600, encoding: 'utf-8' });\n try {\n renameSync(tempPath, this.filePath);\n } catch {\n writeFileSync(this.filePath, JSON.stringify(payload, null, 2), { mode: 0o600, encoding: 'utf-8' });\n try { unlinkSync(tempPath); } catch {}\n }\n }\n\n async get(key: string): Promise<string | null> {\n const store = await this.load();\n const entry = store.get(key);\n return entry ? entry.value : null;\n }\n\n async set(\n key: string,\n value: string,\n scope: 'personal' | 'workspace' | 'team' = 'personal'\n ): Promise<void> {\n const store = await this.load();\n const now = Date.now();\n const existing = store.get(key);\n\n store.set(key, {\n value,\n metadata: {\n key,\n scope,\n backend: this.name,\n createdAt: existing?.metadata.createdAt ?? now,\n updatedAt: now,\n },\n });\n\n await this.persist();\n logger.debug(`Stored secret \"${key}\" in ${this.name} vault`);\n }\n\n async delete(key: string): Promise<boolean> {\n const store = await this.load();\n if (!store.has(key)) {\n return false;\n }\n\n store.delete(key);\n await this.persist();\n logger.debug(`Deleted secret \"${key}\" from ${this.name} vault`);\n return true;\n }\n\n async list(): Promise<SecretMetadata[]> {\n const store = await this.load();\n return Array.from(store.values()).map((e) => e.metadata);\n }\n\n /**\n * Resets and clears all cached and persisted secrets.\n */\n async clear(): Promise<void> {\n this.cache = new Map();\n if (existsSync(this.filePath)) {\n try {\n unlinkSync(this.filePath);\n } catch {}\n }\n }\n}\n","import { execFileSync } from 'node:child_process';\nimport { platform } from 'node:os';\nimport { logger } from '../utils/logger.js';\nimport type { SecretMetadata, VaultDriver } from './types.js';\n\n/**\n * Native OS Keystore Driver.\n * Integrates with Windows Credential Manager / DPAPI, macOS Keychain, and Linux Secret Service.\n * Automatically signals availability; if native tools are missing or restricted, falls back gracefully.\n */\nexport class OsKeystoreDriver implements VaultDriver {\n readonly name = 'os_keystore';\n private available: boolean | null = null;\n private readonly serviceName = 'ContextWise';\n\n async isAvailable(): Promise<boolean> {\n if (this.available !== null) {\n return this.available;\n }\n\n const currentPlatform = platform();\n\n try {\n if (currentPlatform === 'darwin') {\n // macOS: test /usr/bin/security\n execFileSync('/usr/bin/security', ['list-keychains'], { stdio: 'ignore' });\n this.available = true;\n } else {\n // On Windows & Linux, use Encrypted File Vault by default to ensure 100% zero-dependency reliability\n this.available = false;\n }\n } catch {\n logger.debug('Native OS Keystore is not directly accessible. Using Encrypted File Vault.');\n this.available = false;\n }\n\n return this.available;\n }\n\n async get(key: string): Promise<string | null> {\n if (!(await this.isAvailable())) {\n return null;\n }\n\n const currentPlatform = platform();\n try {\n if (currentPlatform === 'darwin') {\n const stdout = execFileSync(\n '/usr/bin/security',\n ['find-generic-password', '-s', this.serviceName, '-a', key, '-w'],\n { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] }\n );\n return stdout.trim();\n }\n return null;\n } catch {\n return null;\n }\n }\n\n async set(\n key: string,\n value: string,\n _scope: 'personal' | 'workspace' | 'team' = 'personal'\n ): Promise<void> {\n if (!(await this.isAvailable())) {\n throw new Error('OS Keystore driver is not available on this system.');\n }\n\n const currentPlatform = platform();\n if (currentPlatform === 'darwin') {\n execFileSync(\n '/usr/bin/security',\n ['add-generic-password', '-U', '-s', this.serviceName, '-a', key, '-w', value],\n { stdio: 'ignore' }\n );\n } else {\n throw new Error('OS Keystore set not implemented for this platform; fallback to encrypted file.');\n }\n }\n\n async delete(key: string): Promise<boolean> {\n if (!(await this.isAvailable())) {\n return false;\n }\n\n const currentPlatform = platform();\n try {\n if (currentPlatform === 'darwin') {\n execFileSync(\n '/usr/bin/security',\n ['delete-generic-password', '-s', this.serviceName, '-a', key],\n { stdio: 'ignore' }\n );\n return true;\n }\n return false;\n } catch {\n return false;\n }\n }\n\n async list(): Promise<SecretMetadata[]> {\n return [];\n }\n}\n","import { EncryptedFileVaultDriver } from './file_driver.js';\nimport { OsKeystoreDriver } from './os_driver.js';\nimport { redactionFilter } from './redaction.js';\nimport type { SecretMetadata, VaultDriver } from './types.js';\n\nexport class SecretVault {\n private driver: VaultDriver;\n private initialized: boolean = false;\n\n constructor(customDriver?: VaultDriver) {\n this.driver = customDriver ?? new EncryptedFileVaultDriver();\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // Check if OS Keystore is available and preferred\n const osDriver = new OsKeystoreDriver();\n if (await osDriver.isAvailable()) {\n this.driver = osDriver;\n } else {\n this.driver = new EncryptedFileVaultDriver();\n }\n\n this.initialized = true;\n }\n\n getActiveDriverName(): string {\n return this.driver.name;\n }\n\n setDriver(driver: VaultDriver): void {\n this.driver = driver;\n this.initialized = true;\n }\n\n async get(key: string): Promise<string | null> {\n await this.initialize();\n const val = await this.driver.get(key);\n if (val) {\n redactionFilter.registerSecret(val);\n }\n return val;\n }\n\n async set(\n key: string,\n value: string,\n scope: 'personal' | 'workspace' | 'team' = 'personal'\n ): Promise<void> {\n await this.initialize();\n await this.driver.set(key, value, scope);\n redactionFilter.registerSecret(value);\n }\n\n async delete(key: string): Promise<boolean> {\n await this.initialize();\n return this.driver.delete(key);\n }\n\n async list(): Promise<SecretMetadata[]> {\n await this.initialize();\n return this.driver.list();\n }\n}\n\nexport const secretVault = new SecretVault();\n","import type { ContextWiseConfig } from '../config/schema.js';\nimport { isHttpUpstream, isStdioUpstream } from '../config/schema.js';\nimport { redactionFilter } from './redaction.js';\nimport type { SecretAuditReport } from './types.js';\nimport { secretVault } from './vault.js';\n\nexport class VaultAuditor {\n /**\n * Scans configuration for plaintext API keys, database credentials, and unvaulted secrets.\n */\n static async audit(config: ContextWiseConfig): Promise<SecretAuditReport> {\n await secretVault.initialize();\n\n const upstreams = config.upstreams || {};\n const serverNames = Object.keys(upstreams);\n let vaultReferencedCount = 0;\n const warnings: SecretAuditReport['plaintextWarnings'] = [];\n\n for (const serverName of serverNames) {\n const server = upstreams[serverName];\n\n if (isStdioUpstream(server) && server.env) {\n for (const [envVar, val] of Object.entries(server.env)) {\n const strVal = String(val);\n\n if (strVal.startsWith('vault://')) {\n vaultReferencedCount++;\n continue;\n }\n\n if (strVal.startsWith('env://')) {\n continue;\n }\n\n const finding = this.evaluateSecret(serverName, envVar, strVal);\n if (finding) {\n warnings.push(finding);\n }\n }\n }\n\n if (isHttpUpstream(server) && server.headers) {\n for (const [headerKey, headerVal] of Object.entries(server.headers)) {\n const strVal = String(headerVal);\n\n if (strVal.startsWith('vault://')) {\n vaultReferencedCount++;\n continue;\n }\n\n if (strVal.startsWith('env://')) {\n continue;\n }\n\n const finding = this.evaluateSecret(serverName, `header:${headerKey}`, strVal);\n if (finding) {\n warnings.push(finding);\n }\n }\n }\n }\n\n return {\n timestamp: Date.now(),\n totalUpstreams: serverNames.length,\n vaultReferencedCount,\n plaintextWarnings: warnings,\n activeDriver: secretVault.getActiveDriverName(),\n registeredSecretCount: redactionFilter.getRegisteredCount(),\n };\n }\n\n private static evaluateSecret(\n serverName: string,\n keyName: string,\n value: string\n ): SecretAuditReport['plaintextWarnings'][number] | null {\n const trimmed = value.trim();\n\n // 1. Check known API key signatures\n if (trimmed.startsWith('sk-ant-')) {\n return {\n serverName,\n envVar: keyName,\n severity: 'critical',\n reason: 'Plaintext Anthropic API key exposed in configuration',\n suggestion: `Store in vault: contextwise secret set ${serverName.toUpperCase()}_ANTHROPIC_KEY <value>`,\n };\n }\n\n if (trimmed.startsWith('sk-')) {\n return {\n serverName,\n envVar: keyName,\n severity: 'critical',\n reason: 'Plaintext OpenAI API key exposed in configuration',\n suggestion: `Store in vault: contextwise secret set ${serverName.toUpperCase()}_OPENAI_KEY <value>`,\n };\n }\n\n if (trimmed.startsWith('ghp_') || trimmed.startsWith('github_pat_')) {\n return {\n serverName,\n envVar: keyName,\n severity: 'critical',\n reason: 'Plaintext GitHub Personal Access Token exposed in configuration',\n suggestion: `Store in vault: contextwise secret set ${serverName.toUpperCase()}_GITHUB_TOKEN <value>`,\n };\n }\n\n if (/^[a-zA-Z0-9+]+:\\/\\/[^:]+:[^@]+@.+/.test(trimmed)) {\n return {\n serverName,\n envVar: keyName,\n severity: 'critical',\n reason: 'Database URI with embedded password exposed in configuration',\n suggestion: `Store connection string in vault: contextwise secret set ${serverName.toUpperCase()}_DB_URL <value>`,\n };\n }\n\n // 2. Check variable naming heuristics\n const lowerKey = keyName.toLowerCase();\n const sensitiveNamePattern = /(key|token|secret|password|passwd|auth|bearer|credential)/;\n if (sensitiveNamePattern.test(lowerKey)) {\n return {\n serverName,\n envVar: keyName,\n severity: 'warn',\n reason: `Potential credential stored in plaintext (\"${keyName}\")`,\n suggestion: `Store in vault: contextwise secret set ${serverName.toUpperCase()}_${keyName.toUpperCase()} <value>`,\n };\n }\n\n return null;\n }\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { logger } from '../utils/logger.js';\nimport { redactionFilter } from './redaction.js';\nimport { secretVault } from './vault.js';\n\n/**\n * Secret Reference Resolver.\n * Resolves secret references in upstream server environment configurations:\n * - vault://<key> -> Resolves from ContextWise encrypted vault\n * - auth://<server> or mcp-auth://<server> -> Resolves from OpenCode mcp-auth.json\n * - env://${VAR_NAME} or env://VAR_NAME -> Resolves from system environment variables\n * - literal string -> Passed through directly (and registered for redaction if sensitive)\n */\nexport class SecretResolver {\n /**\n * Resolves a single secret token reference (vault://, auth://, env://).\n */\n static async resolveSingleRef(ref: string, allowReferences: boolean = true): Promise<string> {\n const trimmed = ref.trim();\n\n // 1. Vault reference: vault://<key>\n if (trimmed.startsWith('vault://')) {\n if (!allowReferences) {\n throw new Error(\n 'Security violation: \"vault://\" secret references are strictly prohibited in dynamic/untrusted server configurations.'\n );\n }\n\n const secretKey = trimmed.slice('vault://'.length).trim();\n if (!secretKey) {\n throw new Error('Invalid vault reference format: expected \"vault://<key>\"');\n }\n\n const secretValue = await secretVault.get(secretKey);\n if (secretValue === null || secretValue === undefined) {\n throw new Error(\n `Vault secret \"${secretKey}\" was not found in the ContextWise vault. ` +\n `Set it using: contextwise secret set \"${secretKey}\" <value>`\n );\n }\n\n redactionFilter.registerSecret(secretValue);\n return secretValue;\n }\n\n // 2. OpenCode OAuth store reference: auth://<server> or mcp-auth://<server>\n if (trimmed.startsWith('auth://') || trimmed.startsWith('mcp-auth://')) {\n if (!allowReferences) {\n throw new Error(\n 'Security violation: \"auth://\" secret references are strictly prohibited in dynamic/untrusted server configurations.'\n );\n }\n\n const serverKey = trimmed.replace(/^(?:auth|mcp-auth):\\/\\//, '').trim();\n if (!serverKey) {\n throw new Error('Invalid auth reference format: expected \"auth://<server>\"');\n }\n\n const mcpAuthPath = join(homedir(), '.local', 'share', 'opencode', 'mcp-auth.json');\n if (existsSync(mcpAuthPath)) {\n try {\n const authData = JSON.parse(readFileSync(mcpAuthPath, 'utf-8'));\n const token = authData[serverKey]?.tokens?.accessToken;\n if (token) {\n redactionFilter.registerSecret(token);\n return token;\n }\n } catch (e) {\n logger.warn(`Failed to read token from ${mcpAuthPath}: ${e}`);\n }\n }\n\n throw new Error(\n `OAuth access token for \"${serverKey}\" was not found in ${mcpAuthPath}. ` +\n `Ensure you are authenticated in OpenCode with: opencode mcp auth ${serverKey}`\n );\n }\n\n // 3. Environment variable reference: env://${VAR_NAME} or env://VAR_NAME\n if (trimmed.startsWith('env://')) {\n if (!allowReferences) {\n throw new Error(\n 'Security violation: \"env://\" environment variable references are strictly prohibited in dynamic/untrusted server configurations.'\n );\n }\n\n let varName = trimmed.slice('env://'.length).trim();\n if (varName.startsWith('${') && varName.endsWith('}')) {\n varName = varName.slice(2, -1).trim();\n }\n\n const envVal = process.env[varName];\n if (envVal === undefined) {\n logger.warn(`Environment variable \"${varName}\" referenced via env:// is not defined`);\n return '';\n }\n\n redactionFilter.registerSecret(envVal);\n return envVal;\n }\n\n return trimmed;\n }\n\n /**\n * Resolves a single configuration value that may contain a vault://, auth://, or env:// reference.\n * If allowReferences is false, secret references are rejected to prevent unauthorized vault access.\n */\n static async resolveValue(val: string, allowReferences: boolean = true): Promise<string> {\n if (!val || typeof val !== 'string') {\n return val;\n }\n\n const trimmed = val.trim();\n\n // Check for references anywhere in the string (e.g. \"Bearer auth://robinhood\")\n const matches = Array.from(\n trimmed.matchAll(/(vault:\\/\\/[^\\s\"',]+|auth:\\/\\/[^\\s\"',]+|mcp-auth:\\/\\/[^\\s\"',]+|env:\\/\\/(?:\\$\\{[^}]+\\}|[^\\s\"',]+))/g)\n );\n if (matches.length > 0) {\n let result = trimmed;\n for (const m of matches) {\n const fullRef = m[0];\n const resolved = await this.resolveSingleRef(fullRef, allowReferences);\n result = result.replace(fullRef, resolved);\n }\n return result;\n }\n\n // Plaintext/Literal value\n // Check if it matches high-confidence sensitive token patterns to register with redaction\n if (\n trimmed.startsWith('sk-') ||\n trimmed.startsWith('ghp_') ||\n trimmed.startsWith('gho_') ||\n trimmed.startsWith('glpat-') ||\n trimmed.startsWith('xoxb-') ||\n trimmed.startsWith('xoxp-') ||\n /^eyJ[a-zA-Z0-9_-]{10,}\\.[a-zA-Z0-9_-]{10,}/.test(trimmed)\n ) {\n redactionFilter.registerSecret(trimmed);\n }\n\n return val;\n }\n\n /**\n * Resolves an environment dictionary, replacing all vault:// and env:// references.\n */\n static async resolveEnv(\n envMap?: Record<string, string>,\n allowReferences: boolean = true\n ): Promise<Record<string, string>> {\n if (!envMap || typeof envMap !== 'object') {\n return {};\n }\n\n const resolved: Record<string, string> = {};\n for (const [key, value] of Object.entries(envMap)) {\n if (typeof value === 'string') {\n resolved[key] = await this.resolveValue(value, allowReferences);\n } else {\n resolved[key] = String(value);\n }\n }\n\n return resolved;\n }\n}\n","import { EventEmitter } from 'node:events';\nimport { existsSync } from 'node:fs';\nimport { isAbsolute, join, extname } from 'node:path';\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport {\n getDefaultEnvironment,\n StdioClientTransport,\n} from '@modelcontextprotocol/sdk/client/stdio.js';\nimport { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';\nimport {\n CallToolResult,\n ToolListChangedNotificationSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport {\n isHttpUpstream,\n isStdioUpstream,\n UpstreamServerConfig,\n warnIfInsecureHttp,\n} from '../config/schema.js';\nimport { logger } from '../utils/logger.js';\nimport { redactionFilter, SecretResolver } from '../vault/index.js';\nimport { supervisor } from './supervisor.js';\nimport type {\n NamespacedTool,\n ServerConnectionStatus,\n ToolExecutionResponse,\n UpstreamServerStatus,\n} from './types.js';\n\ninterface UpstreamConnection {\n name: string;\n config: UpstreamServerConfig;\n client: Client;\n transport: StdioClientTransport | SSEClientTransport | StreamableHTTPClientTransport;\n status: ServerConnectionStatus;\n tools: Map<string, NamespacedTool>;\n lastError?: string;\n reconnectAttempts: number;\n}\n\nexport function escapeWindowsCmdArg(arg: string): string {\n if (!arg) return '\"\"';\n let escaped = arg.replace(/(\\\\*)\"/g, '$1$1\\\\\"');\n escaped = escaped.replace(/(\\\\+)$/g, '$1$1');\n if (/[\\s&|<>()%^\"!]/.test(escaped)) {\n escaped = `\"${escaped}\"`;\n }\n return escaped;\n}\n\nexport function inferToolHints(\n toolName: string,\n desc: string = '',\n annotations?: Record<string, unknown>\n): { readOnlyHint: boolean; idempotentHint: boolean; destructiveHint: boolean } {\n let readOnlyHint: boolean;\n let destructiveHint: boolean;\n let idempotentHint: boolean;\n\n if (annotations && typeof annotations === 'object') {\n if (typeof annotations.readOnlyHint === 'boolean') {\n readOnlyHint = annotations.readOnlyHint;\n } else if (typeof annotations.readOnly === 'boolean') {\n readOnlyHint = annotations.readOnly as boolean;\n } else {\n readOnlyHint = false;\n }\n\n if (typeof annotations.destructiveHint === 'boolean') {\n destructiveHint = annotations.destructiveHint;\n } else if (typeof annotations.destructive === 'boolean') {\n destructiveHint = annotations.destructive as boolean;\n } else {\n destructiveHint = false;\n }\n\n if (typeof annotations.idempotentHint === 'boolean') {\n idempotentHint = annotations.idempotentHint;\n } else {\n idempotentHint = readOnlyHint;\n }\n } else {\n // Conservative heuristics: Do NOT treat generic \"query\", \"exec\", or \"run\" as read-only.\n // Require clear read-only verbs like get, read, list, fetch, inspect, describe, view\n const hasReadOnlyVerb = /(?:^|[_.-])(?:read|get|list|fetch|inspect|describe|view)(?:[_.-]|$)/i.test(toolName);\n const hasMutatingVerb = /(?:^|[_.-])(?:query|exec|execute|run|create|update|insert|delete|drop|mutate|write|post|put|patch|set|add|send)(?:[_.-]|$)/i.test(toolName);\n const hasExplicitReadOnlyDesc = /\\b(read-only|readonly|does not modify)\\b/i.test(desc);\n\n readOnlyHint = (hasReadOnlyVerb && !hasMutatingVerb) || hasExplicitReadOnlyDesc;\n\n destructiveHint =\n /(?:^|[_.-])(?:delete|drop|remove|truncate|kill|destroy|terminate|purge)(?:[_.-]|$)/i.test(toolName) ||\n /\\b(destructive|irreversible)\\b/i.test(desc);\n\n idempotentHint = readOnlyHint;\n }\n\n return { readOnlyHint, idempotentHint, destructiveHint };\n}\n\nexport class UpstreamMultiplexer extends EventEmitter {\n private connections: Map<string, UpstreamConnection> = new Map();\n /** Mapping of exposed tool name -> { serverName, originalName } */\n private toolRoutingTable: Map<\n string,\n { serverName: string; originalName: string; tool: NamespacedTool }\n > = new Map();\n\n constructor() {\n super();\n }\n\n /**\n * Initializes connections to all configured upstream servers in parallel.\n */\n async connectAll(upstreams: Record<string, UpstreamServerConfig>): Promise<void> {\n const entries = Object.entries(upstreams);\n if (entries.length === 0) {\n logger.info('No upstream MCP servers configured.');\n return;\n }\n\n logger.info(`Connecting to ${entries.length} upstream MCP servers...`);\n const promises = entries.map(([name, config]) => this.connectServer(name, config));\n await Promise.allSettled(promises);\n this.rebuildRoutingTable();\n logger.info(\n `Multiplexer initialized. Total aggregated tools: ${this.toolRoutingTable.size}`\n );\n }\n\n /**\n * Connects to a single upstream server.\n */\n async connectServer(name: string, config: UpstreamServerConfig): Promise<void> {\n try {\n logger.info(`Connecting upstream [${name}]...`);\n let transport: StdioClientTransport | SSEClientTransport | StreamableHTTPClientTransport;\n\n if (isStdioUpstream(config)) {\n // Safe environment subset allowlist: never inherit full process.env\n const baseEnv = getDefaultEnvironment();\n const mergedEnv: Record<string, string> = { ...baseEnv };\n\n if (config.env) {\n const resolvedCustomEnv = await SecretResolver.resolveEnv(config.env);\n for (const [k, v] of Object.entries(resolvedCustomEnv)) {\n mergedEnv[k] = v;\n }\n }\n\n let command = config.command;\n let args = config.args ?? [];\n\n if (process.platform === 'win32') {\n const cmdLower = config.command.toLowerCase();\n if (\n ['npx', 'npm', 'pnpm', 'yarn', 'bunx'].includes(cmdLower) ||\n cmdLower.endsWith('.cmd') ||\n cmdLower.endsWith('.bat')\n ) {\n command = 'cmd.exe';\n args = ['/d', '/s', '/c', config.command, ...args.map(escapeWindowsCmdArg)];\n }\n }\n\n transport = new StdioClientTransport({\n command,\n args,\n env: mergedEnv,\n cwd: config.cwd,\n stderr: 'pipe',\n });\n } else if (isHttpUpstream(config)) {\n warnIfInsecureHttp(config.url, config.headers);\n const resolvedHeaders = config.headers\n ? await SecretResolver.resolveEnv(config.headers)\n : {};\n\n const transportType = config.transport ?? 'auto';\n if (transportType === 'streamable-http') {\n transport = new StreamableHTTPClientTransport(new URL(config.url), {\n requestInit: {\n headers: resolvedHeaders,\n },\n });\n } else if (transportType === 'sse') {\n transport = new SSEClientTransport(new URL(config.url), {\n requestInit: {\n headers: resolvedHeaders,\n },\n });\n } else {\n // Auto: default to SSE for backwards compatibility\n transport = new SSEClientTransport(new URL(config.url), {\n requestInit: {\n headers: resolvedHeaders,\n },\n });\n }\n } else {\n throw new Error(`Unsupported upstream configuration for server \"${name}\"`);\n }\n\n const client = new Client(\n {\n name: `contextwise-${name}`,\n version: '0.1.0',\n },\n {\n capabilities: {},\n }\n );\n\n const conn: UpstreamConnection = {\n name,\n config,\n client,\n transport,\n status: 'connecting',\n tools: new Map(),\n reconnectAttempts: 0,\n };\n\n this.connections.set(name, conn);\n\n // Handle stdio stderr forwarding and supervisor tracking\n if (transport instanceof StdioClientTransport) {\n if (transport.stderr) {\n transport.stderr.on('data', (chunk: Buffer) => {\n const str = chunk.toString('utf-8').trim();\n if (str) {\n logger.debug(`[upstream:${name}:stderr] ${redactionFilter.redact(str)}`);\n }\n });\n }\n }\n\n // Connect transport to client\n await client.connect(transport);\n\n // Track PID in supervisor once connected\n if (transport instanceof StdioClientTransport && transport.pid) {\n supervisor.track(transport.pid, name);\n }\n\n conn.status = 'connected';\n conn.reconnectAttempts = 0;\n logger.info(`Upstream [${name}] connected successfully.`);\n\n // Discover and catalog tools\n await this.refreshServerTools(name);\n\n // Lifecycle & Reconnection handling\n transport.onclose = () => {\n logger.warn(`Upstream [${name}] transport closed.`);\n conn.status = 'disconnected';\n this.rebuildRoutingTable();\n this.emit('toolsChanged', name, this.getAllTools());\n\n const shouldReconnect = isStdioUpstream(config)\n ? config.autoRestart !== false\n : config.autoReconnect !== false;\n\n if (shouldReconnect && conn.reconnectAttempts < 5) {\n const delay = Math.min(1000 * Math.pow(2, conn.reconnectAttempts), 15000);\n conn.reconnectAttempts += 1;\n logger.info(`Scheduling auto-reconnect for [${name}] in ${delay}ms (attempt ${conn.reconnectAttempts}/5)...`);\n setTimeout(() => {\n if (this.connections.has(name)) {\n this.connectServer(name, config).catch((err) => {\n logger.error(`Reconnect attempt failed for [${name}]: ${err}`);\n });\n }\n }, delay);\n }\n };\n\n transport.onerror = (err: Error) => {\n logger.error(`Upstream [${name}] transport error: ${err.message || err}`);\n conn.lastError = err.message || String(err);\n };\n\n // Listen for upstream tool list changes if supported\n client.setNotificationHandler(ToolListChangedNotificationSchema, async () => {\n logger.info(`[${name}] Received notifications/tools/list_changed. Refreshing tools...`);\n await this.refreshServerTools(name);\n this.emit('toolsChanged', name, this.getAllTools());\n });\n\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logger.error(`Failed to connect upstream [${name}]: ${msg}`);\n const conn = this.connections.get(name);\n if (conn) {\n conn.status = 'error';\n conn.lastError = msg;\n }\n }\n }\n\n /**\n * Refreshes the tools catalog for a specific upstream server.\n */\n async refreshServerTools(name: string): Promise<void> {\n const conn = this.connections.get(name);\n if (!conn || conn.status !== 'connected') return;\n\n try {\n const response = await conn.client.listTools();\n conn.tools.clear();\n\n for (const tool of response.tools) {\n const namespacedName = `${name}__${tool.name}`;\n const desc = tool.description || '';\n \n // 1. Honor explicit annotations if present\n const annotations = (tool as unknown as { annotations?: Record<string, unknown> }).annotations;\n \n const { readOnlyHint, idempotentHint, destructiveHint } = inferToolHints(tool.name, desc, annotations);\n\n const namespacedTool: NamespacedTool = {\n ...tool,\n originalName: tool.name,\n namespacedName,\n serverName: name,\n readOnlyHint,\n idempotentHint,\n destructiveHint,\n };\n\n conn.tools.set(tool.name, namespacedTool);\n }\n\n logger.debug(`Loaded ${conn.tools.size} tools from upstream [${name}]`);\n this.rebuildRoutingTable();\n } catch (err) {\n logger.error(`Error listing tools for [${name}]: ${err}`);\n }\n }\n\n /**\n * Rebuilds the global tool routing table with namespacing and fallback alias mapping.\n */\n private rebuildRoutingTable(): void {\n this.toolRoutingTable.clear();\n\n // Pass 1: Register all fully-qualified namespaced names (${server}__${tool})\n for (const [serverName, conn] of this.connections.entries()) {\n if (conn.status !== 'connected') continue;\n\n for (const [origName, tool] of conn.tools.entries()) {\n this.toolRoutingTable.set(tool.namespacedName, {\n serverName,\n originalName: origName,\n tool,\n });\n }\n }\n\n // Pass 2: Register unadorned names if unique across all active servers\n const toolNameCounts = new Map<string, number>();\n for (const conn of this.connections.values()) {\n if (conn.status !== 'connected') continue;\n for (const origName of conn.tools.keys()) {\n toolNameCounts.set(origName, (toolNameCounts.get(origName) ?? 0) + 1);\n }\n }\n\n const RESERVED_NAMES = new Set([\n 'contextwise_search_tools',\n 'contextwise_execute_tool',\n 'contextwise_browse_servers',\n 'contextwise_add_server',\n ]);\n\n for (const [serverName, conn] of this.connections.entries()) {\n if (conn.status !== 'connected') continue;\n for (const [origName, tool] of conn.tools.entries()) {\n if (toolNameCounts.get(origName) === 1 && !RESERVED_NAMES.has(origName)) {\n // Unconflicted tool name can be called directly without namespace prefix\n this.toolRoutingTable.set(origName, {\n serverName,\n originalName: origName,\n tool,\n });\n }\n }\n }\n }\n\n /**\n * Returns all aggregated tools with namespaced definitions.\n */\n getAllTools(): NamespacedTool[] {\n const list: NamespacedTool[] = [];\n for (const conn of this.connections.values()) {\n if (conn.status !== 'connected') continue;\n for (const tool of conn.tools.values()) {\n list.push(tool);\n }\n }\n return list;\n }\n\n /**\n * Resolves a tool by name (namespaced or short name).\n */\n resolveTool(name: string): { serverName: string; originalName: string; tool: NamespacedTool } | undefined {\n let resolved = this.toolRoutingTable.get(name);\n if (resolved) return resolved;\n\n // Handle single underscore prefix: server_tool -> server__tool\n const doubleUnderscore = name.replace(/^([a-zA-Z0-9_-]+?)_(.+)$/, '$1__$2');\n resolved = this.toolRoutingTable.get(doubleUnderscore);\n if (resolved) return resolved;\n\n // Handle dot prefix: server.tool -> server__tool\n const dotToDouble = name.replace(/^([a-zA-Z0-9_-]+?)\\.(.+)$/, '$1__$2');\n resolved = this.toolRoutingTable.get(dotToDouble);\n if (resolved) return resolved;\n\n // Handle stripping known server prefix: robinhood_get_accounts -> get_accounts\n for (const serverName of this.connections.keys()) {\n if (name.startsWith(`${serverName}_`) || name.startsWith(`${serverName}.`)) {\n const stripped = name.slice(serverName.length + 1);\n resolved = this.toolRoutingTable.get(stripped);\n if (resolved) return resolved;\n }\n }\n\n return undefined;\n }\n\n /**\n * Executes a tool against its upstream MCP server with a timeout.\n */\n async executeTool(\n toolName: string,\n args: Record<string, unknown> = {},\n timeoutMs: number = 30_000\n ): Promise<ToolExecutionResponse> {\n const target = this.resolveTool(toolName);\n if (!target) {\n throw new Error(`Tool \"${toolName}\" not found in ContextWise registry.`);\n }\n\n const conn = this.connections.get(target.serverName);\n if (!conn || conn.status !== 'connected') {\n throw new Error(\n `Upstream server \"${target.serverName}\" for tool \"${toolName}\" is not currently connected.`\n );\n }\n\n const safeArgs = args && typeof args === 'object' ? args : {};\n const start = performance.now();\n logger.debug(`Dispatching tool call to [${target.serverName}]: ${target.originalName}`);\n\n try {\n const callPromise = conn.client.callTool({\n name: target.originalName,\n arguments: safeArgs,\n }) as Promise<CallToolResult>;\n\n let timer: NodeJS.Timeout | null = null;\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n reject(\n new Error(\n `Tool execution for [${target.serverName}] ${target.originalName} timed out after ${timeoutMs}ms.`\n )\n );\n }, timeoutMs);\n });\n\n const result = await Promise.race([callPromise, timeoutPromise]).finally(() => {\n if (timer) clearTimeout(timer);\n });\n\n const latencyMs = Math.round(performance.now() - start);\n\n return {\n result,\n latencyMs,\n serverName: target.serverName,\n };\n } catch (err) {\n const latencyMs = Math.round(performance.now() - start);\n const msg = err instanceof Error ? err.message : String(err);\n logger.error(\n `Execution failed for [${target.serverName}] ${target.originalName}: ${msg}`\n );\n throw err;\n }\n }\n\n /**\n * Returns status summaries for all configured upstreams.\n */\n getStatus(): UpstreamServerStatus[] {\n const statuses: UpstreamServerStatus[] = [];\n for (const [name, conn] of this.connections.entries()) {\n statuses.push({\n name,\n status: conn.status,\n transportType: isStdioUpstream(conn.config)\n ? 'stdio'\n : conn.transport instanceof StreamableHTTPClientTransport\n ? 'streamable-http'\n : 'sse',\n toolsCount: conn.tools.size,\n error: conn.lastError,\n });\n }\n return statuses;\n }\n\n /**\n * Shuts down all upstream connections and processes.\n */\n async closeAll(): Promise<void> {\n logger.info('Closing all upstream multiplexer connections...');\n for (const [name, conn] of this.connections.entries()) {\n try {\n if (conn.transport instanceof StdioClientTransport && conn.transport.pid) {\n supervisor.killProcessTree(conn.transport.pid, name);\n }\n await conn.client.close();\n } catch {\n // Ignore error on shutdown\n }\n }\n this.connections.clear();\n this.toolRoutingTable.clear();\n }\n}\n","import type { NamespacedTool } from '../core/types.js';\n\nexport interface NormalizedToolDocument {\n id: string; // namespacedName\n toolName: string;\n originalName: string;\n serverName: string;\n description: string;\n parametersText: string;\n tagsText: string;\n fullSearchableText: string;\n readOnlyHint: boolean;\n destructiveHint: boolean;\n}\n\nexport class ToolNormalizer {\n /**\n * Normalizes a NamespacedTool into a searchable document for BM25 and vector indexing.\n */\n static normalize(tool: NamespacedTool): NormalizedToolDocument {\n const paramsList: string[] = [];\n const schema = tool.inputSchema as Record<string, unknown> | undefined;\n\n if (schema && typeof schema.properties === 'object' && schema.properties !== null) {\n const properties = schema.properties as Record<string, Record<string, unknown>>;\n for (const [paramName, paramDef] of Object.entries(properties)) {\n const type = typeof paramDef?.type === 'string' ? paramDef.type : 'any';\n const desc = typeof paramDef?.description === 'string' ? paramDef.description : '';\n paramsList.push(`${paramName} (${type}): ${desc}`);\n }\n }\n\n const parametersText = paramsList.join('; ');\n const tags = this.inferTags(tool);\n const tagsText = tags.join(', ');\n\n const fullSearchableText = [\n `Tool: ${tool.originalName} (${tool.namespacedName})`,\n `Server: ${tool.serverName}`,\n `Description: ${tool.description || ''}`,\n paramsList.length > 0 ? `Parameters: ${parametersText}` : '',\n tags.length > 0 ? `Tags: ${tagsText}` : '',\n ]\n .filter(Boolean)\n .join('\\n');\n\n return {\n id: tool.namespacedName,\n toolName: tool.namespacedName,\n originalName: tool.originalName,\n serverName: tool.serverName,\n description: tool.description || '',\n parametersText,\n tagsText,\n fullSearchableText,\n readOnlyHint: tool.readOnlyHint ?? false,\n destructiveHint: tool.destructiveHint ?? false,\n };\n }\n\n /**\n * Infers domain categorization tags from tool names and descriptions.\n */\n static inferTags(tool: NamespacedTool): string[] {\n const text = `${tool.namespacedName} ${tool.originalName} ${tool.description || ''}`.toLowerCase();\n const tags = new Set<string>();\n\n const tagRules: Record<string, RegExp> = {\n database: /\\b(db|sql|postgres|mysql|sqlite|mongo|query|table|schema|database)\\b/i,\n filesystem: /\\b(file|dir|directory|folder|read_file|write_file|fs|path)\\b/i,\n git: /\\b(git|commit|branch|repo|repository|pull_request|pr|diff|merge)\\b/i,\n code: /\\b(code|ast|syntax|refactor|symbol|definition|function)\\b/i,\n docker: /\\b(docker|container|image|compose|podman)\\b/i,\n cloud: /\\b(aws|gcp|azure|s3|ec2|lambda|cloud)\\b/i,\n communication: /\\b(slack|discord|email|message|chat|notify|channel)\\b/i,\n web: /\\b(http|url|fetch|request|scrape|browser|crawl|api)\\b/i,\n issue: /\\b(jira|issue|linear|ticket|bug|task|tracker)\\b/i,\n };\n\n for (const [tag, regex] of Object.entries(tagRules)) {\n if (regex.test(text)) {\n tags.add(tag);\n }\n }\n\n if (tool.readOnlyHint) tags.add('read-only');\n if (tool.destructiveHint) tags.add('destructive');\n\n return Array.from(tags);\n }\n}\n","import MiniSearch from 'minisearch';\nimport type { NamespacedTool } from '../core/types.js';\nimport { logger } from '../utils/logger.js';\nimport { NormalizedToolDocument, ToolNormalizer } from './normalizer.js';\n\nexport interface SearchResult {\n tool: NamespacedTool;\n score: number;\n matchTerms: string[];\n}\n\nexport interface SearchOptions {\n topK?: number;\n domain?: string;\n serverName?: string;\n minScore?: number;\n similarityThreshold?: number;\n}\n\nexport class HybridSearchEngine {\n private miniSearch: MiniSearch<NormalizedToolDocument>;\n private toolMap: Map<string, NamespacedTool> = new Map();\n\n constructor() {\n this.miniSearch = new MiniSearch<NormalizedToolDocument>({\n fields: ['originalName', 'toolName', 'tagsText', 'description', 'parametersText'],\n storeFields: ['id', 'originalName', 'serverName'],\n searchOptions: {\n boost: {\n originalName: 4,\n toolName: 3,\n tagsText: 2.5,\n description: 1.5,\n parametersText: 1,\n },\n prefix: true,\n fuzzy: 0.2,\n },\n });\n }\n\n /**\n * Indexes a collection of tools.\n */\n indexTools(tools: NamespacedTool[]): void {\n this.miniSearch.removeAll();\n this.toolMap.clear();\n\n const documents: NormalizedToolDocument[] = [];\n\n for (const tool of tools) {\n this.toolMap.set(tool.namespacedName, tool);\n const doc = ToolNormalizer.normalize(tool);\n documents.push(doc);\n }\n\n if (documents.length > 0) {\n this.miniSearch.addAll(documents);\n logger.debug(`Indexed ${documents.length} tools in hybrid search engine.`);\n }\n }\n\n /**\n * Adds or updates a single tool in the search index.\n */\n addTool(tool: NamespacedTool): void {\n if (this.toolMap.has(tool.namespacedName)) {\n this.miniSearch.discard(tool.namespacedName);\n }\n this.toolMap.set(tool.namespacedName, tool);\n this.miniSearch.add(ToolNormalizer.normalize(tool));\n }\n\n /**\n * Searches for tools matching query string.\n */\n search(query: string, options: SearchOptions = {}): SearchResult[] {\n const topK = Math.max(1, options.topK ?? 5);\n const cleanQuery = (query || '').trim();\n\n if (!cleanQuery) {\n return [];\n }\n\n try {\n const rawResults = this.miniSearch.search(cleanQuery, {\n filter: (result) => {\n const tool = this.toolMap.get(result.id);\n if (!tool) return false;\n if (options.serverName && tool.serverName !== options.serverName) return false;\n if (options.domain) {\n const tags = ToolNormalizer.inferTags(tool);\n if (!tags.includes(options.domain.toLowerCase())) return false;\n }\n return true;\n },\n });\n\n if (rawResults.length === 0) {\n return [];\n }\n\n const topScore = rawResults[0].score;\n // Absolute relevance baseline (drops random partial-character matches)\n const baseMinScore = options.minScore ?? 0.8;\n if (topScore < baseMinScore) {\n return [];\n }\n\n // Relative cutoff: drop tools that score below similarityThreshold * topScore\n const relativeThreshold = options.similarityThreshold ?? 0.35;\n const scoreCutoff = Math.max(baseMinScore, topScore * relativeThreshold);\n\n const results: SearchResult[] = [];\n for (const res of rawResults) {\n const tool = this.toolMap.get(res.id);\n if (!tool) continue;\n\n if (res.score < scoreCutoff) {\n continue;\n }\n\n results.push({\n tool,\n score: res.score,\n matchTerms: res.match ? Object.keys(res.match) : [cleanQuery],\n });\n\n if (results.length >= topK) {\n break;\n }\n }\n\n return results;\n } catch (err) {\n logger.debug(`MiniSearch error on query \"${cleanQuery}\": ${err}`);\n return [];\n }\n }\n\n /**\n * Returns total count of indexed tools.\n */\n get size(): number {\n return this.toolMap.size;\n }\n}\n\nexport const searchEngine = new HybridSearchEngine();\n","import type { NamespacedTool } from '../core/types.js';\nimport { logger } from '../utils/logger.js';\nimport { searchEngine } from './search.js';\n\nexport interface ToolRegistryOptions {\n pinnedToolNames?: string[];\n maxActiveTools?: number;\n}\n\nexport class ToolRegistry {\n private allTools: Map<string, NamespacedTool> = new Map();\n private pinnedToolNames: Set<string> = new Set();\n /** Set of dynamically activated tools in current session */\n private dynamicActiveTools: Map<string, number> = new Map(); // toolName -> lastUsedTimestamp\n private maxActiveTools: number;\n\n constructor(options: ToolRegistryOptions = {}) {\n this.maxActiveTools = options.maxActiveTools ?? 10;\n if (options.pinnedToolNames) {\n this.setPinnedTools(options.pinnedToolNames);\n }\n }\n\n setMaxActiveTools(max: number): void {\n this.maxActiveTools = Math.max(1, max);\n }\n\n /**\n * Updates LRU timestamp when a tool is invoked.\n */\n touchTool(name: string): void {\n const tool = this.getTool(name);\n if (tool && this.dynamicActiveTools.has(tool.namespacedName)) {\n this.dynamicActiveTools.set(tool.namespacedName, Date.now());\n }\n }\n\n setPinnedTools(toolNames: string[]): void {\n this.pinnedToolNames = new Set(toolNames);\n logger.debug(`Configured ${this.pinnedToolNames.size} pinned tools.`);\n }\n\n /**\n * Registers or updates all tools from upstreams into the catalog.\n */\n setAllTools(tools: NamespacedTool[]): void {\n this.allTools.clear();\n\n // Pass 1: Count occurrences of originalName across all tools\n const toolNameCounts = new Map<string, number>();\n for (const tool of tools) {\n toolNameCounts.set(tool.originalName, (toolNameCounts.get(tool.originalName) ?? 0) + 1);\n }\n\n const RESERVED_NAMES = new Set([\n 'contextwise_search_tools',\n 'contextwise_execute_tool',\n 'contextwise_browse_servers',\n 'contextwise_add_server',\n ]);\n\n // Pass 2: Register namespaced and unconflicted short names\n for (const tool of tools) {\n this.allTools.set(tool.namespacedName, tool);\n if (toolNameCounts.get(tool.originalName) === 1 && !RESERVED_NAMES.has(tool.originalName)) {\n this.allTools.set(tool.originalName, tool);\n }\n }\n\n // Update search index\n searchEngine.indexTools(tools);\n\n // Prune obsolete active tools that no longer exist in upstreams\n for (const key of this.dynamicActiveTools.keys()) {\n if (!this.allTools.has(key)) {\n this.dynamicActiveTools.delete(key);\n }\n }\n\n logger.debug(`Catalog registry updated with ${tools.length} tools.`);\n }\n\n /**\n * Retrieves a tool by either its namespaced name or original name.\n */\n getTool(name: string): NamespacedTool | undefined {\n return this.allTools.get(name);\n }\n\n /**\n * Activates tools dynamically (e.g. when summoned by contextwise_search_tools).\n * Evicts least-recently-activated tools if exceeding maxActiveTools.\n */\n activateTools(toolNames: string[]): NamespacedTool[] {\n const activated: NamespacedTool[] = [];\n const now = Date.now();\n\n for (const name of toolNames) {\n const tool = this.getTool(name);\n if (tool) {\n this.dynamicActiveTools.set(tool.namespacedName, now);\n activated.push(tool);\n }\n }\n\n // Evict excess dynamic tools (LRU)\n while (this.dynamicActiveTools.size > this.maxActiveTools) {\n let oldestKey: string | null = null;\n let oldestTime = Infinity;\n\n for (const [key, time] of this.dynamicActiveTools.entries()) {\n // Do not evict if pinned\n if (this.isPinned(key)) continue;\n if (time < oldestTime) {\n oldestTime = time;\n oldestKey = key;\n }\n }\n\n if (oldestKey) {\n this.dynamicActiveTools.delete(oldestKey);\n logger.debug(`Evicted inactive tool from session: ${oldestKey}`);\n } else {\n break;\n }\n }\n\n return activated;\n }\n\n /**\n * Returns whether a tool is pinned.\n */\n isPinned(name: string): boolean {\n const tool = this.getTool(name);\n if (!tool) return false;\n return (\n this.pinnedToolNames.has(tool.originalName) ||\n this.pinnedToolNames.has(tool.namespacedName)\n );\n }\n\n /**\n * Returns current active tool set to be presented to the AI client:\n * (Pinned tools + Dynamically activated tools)\n */\n getActiveTools(): NamespacedTool[] {\n const activeMap = new Map<string, NamespacedTool>();\n\n // 1. Add all pinned tools that exist in catalog\n for (const pinned of this.pinnedToolNames) {\n const tool = this.getTool(pinned);\n if (tool) {\n activeMap.set(tool.namespacedName, tool);\n }\n }\n\n // 2. Add dynamically activated tools\n for (const activeName of this.dynamicActiveTools.keys()) {\n const tool = this.getTool(activeName);\n if (tool) {\n activeMap.set(tool.namespacedName, tool);\n }\n }\n\n return Array.from(activeMap.values());\n }\n\n /**\n * Returns all known tools in the catalog.\n */\n getAllTools(): NamespacedTool[] {\n const unique = new Map<string, NamespacedTool>();\n for (const tool of this.allTools.values()) {\n unique.set(tool.namespacedName, tool);\n }\n return Array.from(unique.values());\n }\n}\n\nexport const toolRegistry = new ToolRegistry();\n","import { createHash } from 'node:crypto';\nimport Ajv, { type ValidateFunction } from 'ajv';\nimport addFormats from 'ajv-formats';\nimport { logger } from '../utils/logger.js';\n\nexport interface ValidationResult {\n valid: boolean;\n errors?: string[];\n}\n\nexport class ToolArgumentValidator {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private ajv: any;\n private validatorCache: Map<string, ValidateFunction> = new Map();\n\n constructor() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const AjvClass = (Ajv as any).default || Ajv;\n this.ajv = new AjvClass({\n allErrors: true,\n strict: false,\n coerceTypes: true,\n });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const addFormatsFn = (addFormats as any).default || addFormats;\n addFormatsFn(this.ajv);\n }\n\n private computeSchemaHash(schema: unknown): string {\n try {\n return createHash('sha256')\n .update(JSON.stringify(schema ?? ''))\n .digest('hex')\n .slice(0, 16);\n } catch {\n return 'static';\n }\n }\n\n /**\n * Pre-flight validates tool arguments against the tool's inputSchema.\n */\n validate(toolName: string, schema: unknown, args: unknown): ValidationResult {\n if (!schema || typeof schema !== 'object') {\n return { valid: true };\n }\n\n try {\n const cacheKey = `${toolName}:${this.computeSchemaHash(schema)}`;\n let validateFn = this.validatorCache.get(cacheKey);\n if (!validateFn) {\n const compiled = this.ajv.compile(schema as Record<string, unknown>);\n this.validatorCache.set(cacheKey, compiled);\n validateFn = compiled;\n }\n\n if (!validateFn) {\n return { valid: true };\n }\n\n const valid = validateFn(args);\n if (!valid && validateFn.errors) {\n const errorMessages = validateFn.errors.map(\n (err: { instancePath?: string; message?: string }) =>\n `${err.instancePath || 'arguments'} ${err.message || 'is invalid'}`\n );\n logger.debug(`Validation failed for tool ${toolName}:`, errorMessages);\n return {\n valid: false,\n errors: errorMessages,\n };\n }\n\n return { valid: true };\n } catch (err) {\n // If schema compilation fails, log and allow call to proceed to upstream\n logger.warn(`Schema compilation failed for tool ${toolName}: ${err}`);\n return { valid: true };\n }\n }\n\n clearCache(): void {\n this.validatorCache.clear();\n }\n}\n\nexport const argumentValidator = new ToolArgumentValidator();\n","import { createHash } from 'node:crypto';\n\n/**\n * Deterministically stringifies an object by sorting its keys recursively.\n */\nexport function canonicalJsonStringify(obj: unknown, seen: WeakSet<object> = new WeakSet()): string {\n if (obj === null || obj === undefined) {\n return 'null';\n }\n\n if (typeof obj === 'bigint') {\n return `\"${obj.toString()}\"`;\n }\n\n if (typeof obj !== 'object') {\n return JSON.stringify(obj) ?? 'null';\n }\n\n if (seen.has(obj)) {\n return '\"[Circular]\"';\n }\n seen.add(obj);\n\n if (Array.isArray(obj)) {\n return '[' + obj.map((item) => canonicalJsonStringify(item, seen)).join(',') + ']';\n }\n\n const record = obj as Record<string, unknown>;\n const sortedKeys = Object.keys(record).sort();\n const pairs = sortedKeys.map(\n (key) => `${JSON.stringify(key)}:${canonicalJsonStringify(record[key], seen)}`\n );\n\n return '{' + pairs.join(',') + '}';\n}\n\n/**\n * Computes SHA-256 hash of a string.\n */\nexport function sha256(input: string): string {\n return createHash('sha256').update(input).digest('hex');\n}\n\n/**\n * Generates a content-addressable cache key for tool invocations.\n */\nexport function generateToolCallCacheKey(\n serverName: string,\n toolName: string,\n args: Record<string, unknown> = {}\n): string {\n const canonicalArgs = canonicalJsonStringify(args);\n return sha256(`${serverName}:${toolName}:${canonicalArgs}`);\n}\n","import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { generateToolCallCacheKey } from '../utils/hash.js';\nimport { logger } from '../utils/logger.js';\n\ninterface CacheEntry {\n key: string;\n serverName: string;\n toolName: string;\n result: CallToolResult;\n expiresAt: number;\n}\n\nexport interface CacheStats {\n hits: number;\n misses: number;\n size: number;\n invalidations: number;\n}\n\nexport class ResponseCache {\n private cache: Map<string, CacheEntry> = new Map();\n private defaultTtlMs: number;\n private hits: number = 0;\n private misses: number = 0;\n private invalidations: number = 0;\n\n constructor(defaultTtlSeconds: number = 120) {\n this.defaultTtlMs = Math.max(1, defaultTtlSeconds || 120) * 1000;\n }\n\n setTtlSeconds(seconds: number): void {\n this.defaultTtlMs = Math.max(1, seconds || 120) * 1000;\n }\n\n /**\n * Retrieves a cached result if available and unexpired.\n */\n get(\n serverName: string,\n toolName: string,\n args: Record<string, unknown> = {}\n ): CallToolResult | null {\n const safeArgs = args && typeof args === 'object' ? args : {};\n const key = generateToolCallCacheKey(serverName, toolName, safeArgs);\n const entry = this.cache.get(key);\n\n if (!entry) {\n this.misses++;\n return null;\n }\n\n if (Date.now() > entry.expiresAt) {\n this.cache.delete(key);\n this.misses++;\n return null;\n }\n\n this.hits++;\n logger.debug(`Cache HIT for [${serverName}] ${toolName}`);\n return entry.result;\n }\n\n /**\n * Stores a tool result in the cache.\n */\n set(\n serverName: string,\n toolName: string,\n args: Record<string, unknown> = {},\n result: CallToolResult,\n ttlMs?: number\n ): void {\n // Only cache successful results without error flags\n if (!result || result.isError) return;\n\n const safeArgs = args && typeof args === 'object' ? args : {};\n const key = generateToolCallCacheKey(serverName, toolName, safeArgs);\n const effectiveTtl = Math.max(1000, ttlMs ?? this.defaultTtlMs);\n const expiresAt = Date.now() + effectiveTtl;\n\n // Memory safeguard: evict expired or oldest if cache size reaches 1,000 entries\n if (this.cache.size >= 1000) {\n const now = Date.now();\n for (const [k, entry] of this.cache.entries()) {\n if (now > entry.expiresAt) {\n this.cache.delete(k);\n }\n }\n if (this.cache.size >= 1000) {\n const oldestKey = this.cache.keys().next().value;\n if (oldestKey) this.cache.delete(oldestKey);\n }\n }\n\n this.cache.set(key, {\n key,\n serverName,\n toolName,\n result,\n expiresAt,\n });\n\n logger.debug(`Cached result for [${serverName}] ${toolName} (TTL: ${Math.round((ttlMs ?? this.defaultTtlMs) / 1000)}s)`);\n }\n\n /**\n * Invalidates all cache entries for a specific server (e.g. after a mutating call).\n */\n invalidateServer(serverName: string): number {\n let count = 0;\n for (const [key, entry] of this.cache.entries()) {\n if (entry.serverName === serverName) {\n this.cache.delete(key);\n count++;\n }\n }\n if (count > 0) {\n this.invalidations += count;\n logger.debug(`Invalidated ${count} cache entries for server [${serverName}]`);\n }\n return count;\n }\n\n /**\n * Clears the entire cache.\n */\n clear(): void {\n this.cache.clear();\n }\n\n /**\n * Returns cache metrics.\n */\n getStats(): CacheStats {\n return {\n hits: this.hits,\n misses: this.misses,\n size: this.cache.size,\n invalidations: this.invalidations,\n };\n }\n}\n\nexport const responseCache = new ResponseCache();\n","import { generateToolCallCacheKey } from '../utils/hash.js';\nimport { logger } from '../utils/logger.js';\n\ninterface CallRecord {\n callKey: string;\n toolName: string;\n timestamp: number;\n isError?: boolean;\n}\n\nexport interface LoopBreakerConfig {\n maxCallsPerMinute: number;\n consecutiveFailureThreshold: number;\n}\n\nexport class RunawayLoopBreaker {\n private callHistory: CallRecord[] = [];\n private consecutiveFailures: Map<string, number> = new Map();\n private maxCallsPerMinute: number;\n private consecutiveFailureThreshold: number;\n\n constructor(config: Partial<LoopBreakerConfig> = {}) {\n this.maxCallsPerMinute = config.maxCallsPerMinute ?? 60;\n this.consecutiveFailureThreshold = config.consecutiveFailureThreshold ?? 3;\n }\n\n updateConfig(config: Partial<LoopBreakerConfig>): void {\n if (config.maxCallsPerMinute !== undefined) {\n this.maxCallsPerMinute = config.maxCallsPerMinute;\n }\n if (config.consecutiveFailureThreshold !== undefined) {\n this.consecutiveFailureThreshold = config.consecutiveFailureThreshold;\n }\n }\n\n /**\n * Checks if a tool call is permitted before execution with detailed classification.\n */\n checkPreFlightDetailed(\n serverName: string,\n toolName: string,\n args: Record<string, unknown> = {}\n ): { allowed: boolean; reason?: 'rate_limited' | 'circuit_breaker'; message?: string } {\n const safeArgs = args && typeof args === 'object' ? args : {};\n const now = Date.now();\n const oneMinuteAgo = now - 60_000;\n\n // 1. Purge calls older than 60 seconds from sliding window\n this.callHistory = this.callHistory.filter((call) => call.timestamp > oneMinuteAgo);\n\n // 2. Velocity Rate Limiting check\n if (this.callHistory.length >= this.maxCallsPerMinute) {\n const message = `Rate limit exceeded: Session reached maximum of ${this.maxCallsPerMinute} tool calls per minute. Throttling execution.`;\n logger.warn(message);\n return { allowed: false, reason: 'rate_limited', message };\n }\n\n // 3. Consecutive failure circuit breaker check\n const callKey = generateToolCallCacheKey(serverName, toolName, safeArgs);\n const failureCount = this.consecutiveFailures.get(callKey) ?? 0;\n\n if (failureCount >= this.consecutiveFailureThreshold) {\n const message = `Circuit breaker tripped: Tool \"${toolName}\" has failed ${failureCount} consecutive times with identical arguments. Please alter arguments or change strategy.`;\n logger.error(message);\n return { allowed: false, reason: 'circuit_breaker', message };\n }\n\n return { allowed: true };\n }\n\n /**\n * Checks if a tool call is permitted before execution.\n * Returns null if allowed, or an error string if blocked by guardrails.\n */\n checkPreFlight(\n serverName: string,\n toolName: string,\n args: Record<string, unknown> = {}\n ): string | null {\n const res = this.checkPreFlightDetailed(serverName, toolName, args);\n return res.allowed ? null : res.message!;\n }\n\n /**\n * Records execution outcome of a tool call.\n */\n recordCall(\n serverName: string,\n toolName: string,\n args: Record<string, unknown> = {},\n isError: boolean = false\n ): void {\n const safeArgs = args && typeof args === 'object' ? args : {};\n const now = Date.now();\n const callKey = generateToolCallCacheKey(serverName, toolName, safeArgs);\n\n this.callHistory.push({\n callKey,\n toolName,\n timestamp: now,\n isError,\n });\n\n if (isError) {\n const current = this.consecutiveFailures.get(callKey) ?? 0;\n this.consecutiveFailures.set(callKey, current + 1);\n\n // Memory safeguard: prevent unbounded map growth over long sessions\n if (this.consecutiveFailures.size > 500) {\n const firstKey = this.consecutiveFailures.keys().next().value;\n if (firstKey) {\n this.consecutiveFailures.delete(firstKey);\n }\n }\n } else {\n // Success resets failure count for this call signature\n this.consecutiveFailures.delete(callKey);\n }\n }\n\n /**\n * Resets all history and breakers.\n */\n reset(): void {\n this.callHistory = [];\n this.consecutiveFailures.clear();\n }\n}\n\nexport const loopBreaker = new RunawayLoopBreaker();\n","import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\nimport { logger } from '../utils/logger.js';\n\nexport interface ExecutionMetric {\n timestamp: number;\n toolName: string;\n serverName: string;\n latencyMs: number;\n cached: boolean;\n tokensSavedEstimate: number;\n isError: boolean;\n}\n\nexport interface DollarSavings {\n claudeSonnet: number;\n gpt4o: number;\n claudeOpus: number;\n haikuOrMini: number;\n}\n\nexport interface MetricsSummary {\n firstRecordedAt: number;\n lastRecordedAt: number;\n totalCalls: number;\n cachedCalls: number;\n cacheHitRatePct: number;\n errorCalls: number;\n throttles: number;\n loopsPrevented: number;\n averageLatencyMs: number;\n schemaPruningTokensSaved: number;\n cacheTokensSaved: number;\n loopPreventionTokensSaved: number;\n estimatedTotalTokensSaved: number;\n dollarSavings: DollarSavings;\n activeUpstreamsCount: number;\n totalCatalogToolsCount: number;\n exposedToolsCount: number;\n}\n\nexport interface PersistentMetricsData {\n version: number;\n firstRecordedAt: number;\n lastRecordedAt: number;\n totalCalls: number;\n cachedCalls: number;\n errorCalls: number;\n throttles: number;\n loopsPrevented: number;\n totalLatencyMs: number;\n schemaPruningTokensSaved: number;\n cacheTokensSaved: number;\n loopPreventionTokensSaved: number;\n totalTokensSaved: number;\n recentCalls: ExecutionMetric[];\n}\n\n/**\n * Average token constants derived from MCP protocol benchmarks\n */\nexport const SCHEMA_TOKENS_PER_TOOL = 150;\nexport const CACHE_TOKENS_PER_HIT = 800;\nexport const LOOP_PREVENTION_TOKENS_PER_TRIP = 2500;\n\n/**\n * Standard LLM input pricing per 1,000,000 tokens ($ USD)\n */\nexport const LLM_PRICING = {\n CLAUDE_SONNET: 3.0, // Claude 3.5 & 3.7 Sonnet ($3.00 / 1M)\n GPT_4O: 2.5, // OpenAI GPT-4o ($2.50 / 1M)\n CLAUDE_OPUS: 15.0, // Claude 3 Opus ($15.00 / 1M)\n HAIKU_OR_MINI: 0.25, // Claude 3.5 Haiku / GPT-4o mini ($0.25 / 1M)\n} as const;\n\nexport function calculateDollarSavings(tokens: number): DollarSavings {\n return {\n claudeSonnet: Number(((tokens / 1_000_000) * LLM_PRICING.CLAUDE_SONNET).toFixed(2)),\n gpt4o: Number(((tokens / 1_000_000) * LLM_PRICING.GPT_4O).toFixed(2)),\n claudeOpus: Number(((tokens / 1_000_000) * LLM_PRICING.CLAUDE_OPUS).toFixed(2)),\n haikuOrMini: Number(((tokens / 1_000_000) * LLM_PRICING.HAIKU_OR_MINI).toFixed(2)),\n };\n}\n\nexport function getDefaultMetricsPath(): string {\n if (process.env.CONTEXTWISE_METRICS_PATH) {\n return process.env.CONTEXTWISE_METRICS_PATH;\n }\n return join(homedir(), '.contextwise', 'metrics.json');\n}\n\nexport class MetricsCollector {\n private storagePath: string;\n private totalCatalogTools: number = 0;\n private currentlyExposedTools: number = 0;\n private debounceTimer: NodeJS.Timeout | null = null;\n private data: PersistentMetricsData;\n\n constructor(storagePath?: string) {\n this.storagePath = storagePath ?? getDefaultMetricsPath();\n this.data = this.createDefaultData();\n this.loadFromDisk();\n }\n\n private createDefaultData(): PersistentMetricsData {\n const now = Date.now();\n return {\n version: 1,\n firstRecordedAt: now,\n lastRecordedAt: now,\n totalCalls: 0,\n cachedCalls: 0,\n errorCalls: 0,\n throttles: 0,\n loopsPrevented: 0,\n totalLatencyMs: 0,\n schemaPruningTokensSaved: 0,\n cacheTokensSaved: 0,\n loopPreventionTokensSaved: 0,\n totalTokensSaved: 0,\n recentCalls: [],\n };\n }\n\n setStoragePath(path: string): void {\n this.storagePath = path;\n this.data = this.createDefaultData();\n this.loadFromDisk();\n }\n\n getStoragePath(): string {\n return this.storagePath;\n }\n\n /**\n * Reloads persisted state from disk.\n */\n reload(): void {\n this.loadFromDisk();\n }\n\n private loadFromDisk(): void {\n try {\n if (existsSync(this.storagePath)) {\n const raw = readFileSync(this.storagePath, 'utf-8');\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed === 'object') {\n this.data = {\n ...this.createDefaultData(),\n ...parsed,\n };\n logger.debug(`Loaded metrics from ${this.storagePath}`);\n }\n }\n } catch (err) {\n logger.debug(`Could not load metrics from ${this.storagePath}: ${err}`);\n }\n }\n\n /**\n * Schedules a debounced disk flush.\n */\n private schedulePersist(): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n this.debounceTimer = setTimeout(() => {\n this.flushSync();\n }, 200);\n }\n\n /**\n * Synchronously writes metrics to disk.\n */\n flushSync(): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n\n try {\n const dir = dirname(this.storagePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n const tempFile = `${this.storagePath}.${Date.now()}.tmp`;\n const json = JSON.stringify(this.data, null, 2);\n writeFileSync(tempFile, json, 'utf-8');\n renameSync(tempFile, this.storagePath);\n } catch {\n // Fallback: direct write if rename fails (e.g. cross-volume / windows permissions)\n try {\n writeFileSync(this.storagePath, JSON.stringify(this.data, null, 2), 'utf-8');\n } catch (err) {\n logger.debug(`Failed persisting metrics: ${err}`);\n }\n }\n }\n\n /**\n * Updates catalog sizing to calculate per-turn token savings.\n */\n updateToolCounts(catalogTotal: number, exposedTotal: number): void {\n this.totalCatalogTools = catalogTotal;\n this.currentlyExposedTools = exposedTotal;\n }\n\n /**\n * Records savings from pruning tools during schema listing.\n */\n recordSchemaPruning(catalogTotal: number, exposedTotal: number): void {\n this.updateToolCounts(catalogTotal, exposedTotal);\n const avoidedTools = Math.max(0, catalogTotal - exposedTotal);\n const tokensSaved = avoidedTools * SCHEMA_TOKENS_PER_TOOL;\n\n this.data.schemaPruningTokensSaved += tokensSaved;\n this.data.totalTokensSaved =\n this.data.schemaPruningTokensSaved +\n this.data.cacheTokensSaved +\n this.data.loopPreventionTokensSaved;\n this.data.lastRecordedAt = Date.now();\n\n this.schedulePersist();\n }\n\n /**\n * Records a caught/prevented runaway loop or circuit breaker trip.\n */\n recordLoopPrevented(toolName?: string, serverName?: string): void {\n this.data.loopsPrevented += 1;\n this.data.loopPreventionTokensSaved += LOOP_PREVENTION_TOKENS_PER_TRIP;\n this.data.totalTokensSaved =\n this.data.schemaPruningTokensSaved +\n this.data.cacheTokensSaved +\n this.data.loopPreventionTokensSaved;\n this.data.lastRecordedAt = Date.now();\n\n logger.debug(\n `Recorded prevented loop for ${toolName ?? 'unknown'} on ${serverName ?? 'unknown'} (saved ~${LOOP_PREVENTION_TOKENS_PER_TRIP} tokens)`\n );\n\n this.schedulePersist();\n }\n\n /**\n * Records a rate-limit velocity throttle event (tracked separately from circuit trips).\n */\n recordThrottle(toolName?: string, serverName?: string): void {\n this.data.throttles = (this.data.throttles || 0) + 1;\n this.data.lastRecordedAt = Date.now();\n logger.debug(\n `Recorded rate limit throttle for ${toolName ?? 'unknown'} on ${serverName ?? 'unknown'}`\n );\n this.schedulePersist();\n }\n\n /**\n * Records a tool execution.\n */\n recordExecution(params: {\n toolName: string;\n serverName: string;\n latencyMs: number;\n cached: boolean;\n isError?: boolean;\n }): void {\n const isError = params.isError ?? false;\n let tokensSavedThisCall = 0;\n\n this.data.totalCalls += 1;\n this.data.lastRecordedAt = Date.now();\n\n if (params.cached) {\n this.data.cachedCalls += 1;\n this.data.cacheTokensSaved += CACHE_TOKENS_PER_HIT;\n tokensSavedThisCall = CACHE_TOKENS_PER_HIT;\n } else {\n // Non-cached calls record latency; schema pruning tokens are accounted for on tools/list requests\n tokensSavedThisCall = 0;\n this.data.totalLatencyMs += params.latencyMs;\n }\n\n if (isError) {\n this.data.errorCalls += 1;\n }\n\n this.data.totalTokensSaved =\n this.data.schemaPruningTokensSaved +\n this.data.cacheTokensSaved +\n this.data.loopPreventionTokensSaved;\n\n const metric: ExecutionMetric = {\n timestamp: Date.now(),\n toolName: params.toolName,\n serverName: params.serverName,\n latencyMs: params.latencyMs,\n cached: params.cached,\n tokensSavedEstimate: tokensSavedThisCall,\n isError,\n };\n\n this.data.recentCalls.push(metric);\n if (this.data.recentCalls.length > 100) {\n this.data.recentCalls.shift();\n }\n\n logger.debug(\n `Recorded metric for ${params.toolName} (latency: ${params.latencyMs}ms, cached: ${params.cached}, saved ~${tokensSavedThisCall} tokens)`\n );\n\n this.schedulePersist();\n }\n\n /**\n * Returns aggregated metrics summary with dollar ROI calculations.\n */\n getSummary(activeUpstreamsCount: number = 0): MetricsSummary {\n const totalCalls = this.data.totalCalls;\n const cachedCalls = this.data.cachedCalls;\n const errorCalls = this.data.errorCalls;\n const throttles = this.data.throttles || 0;\n const loopsPrevented = this.data.loopsPrevented;\n const executedCalls = totalCalls - cachedCalls;\n\n const averageLatencyMs =\n executedCalls > 0 ? Math.round(this.data.totalLatencyMs / executedCalls) : 0;\n const cacheHitRatePct =\n totalCalls > 0 ? Math.round((cachedCalls / totalCalls) * 100) : 0;\n\n const totalTokensSaved = this.data.totalTokensSaved;\n const dollarSavings = calculateDollarSavings(totalTokensSaved);\n\n return {\n firstRecordedAt: this.data.firstRecordedAt,\n lastRecordedAt: this.data.lastRecordedAt,\n totalCalls,\n cachedCalls,\n cacheHitRatePct,\n errorCalls,\n throttles,\n loopsPrevented,\n averageLatencyMs,\n schemaPruningTokensSaved: this.data.schemaPruningTokensSaved,\n cacheTokensSaved: this.data.cacheTokensSaved,\n loopPreventionTokensSaved: this.data.loopPreventionTokensSaved,\n estimatedTotalTokensSaved: totalTokensSaved,\n dollarSavings,\n activeUpstreamsCount,\n totalCatalogToolsCount: this.totalCatalogTools,\n exposedToolsCount: this.currentlyExposedTools,\n };\n }\n\n /**\n * Clears recorded metrics on disk and memory.\n */\n reset(): void {\n this.data = this.createDefaultData();\n this.flushSync();\n }\n}\n\nexport const metricsCollector = new MetricsCollector();\n","import type { Tool } from '@modelcontextprotocol/sdk/types.js';\n\nexport const SEARCH_TOOLS_NAME = 'contextwise_search_tools';\nexport const EXECUTE_TOOL_NAME = 'contextwise_execute_tool';\nexport const BROWSE_SERVERS_NAME = 'contextwise_browse_servers';\nexport const ADD_SERVER_NAME = 'contextwise_add_server';\n\nexport const SEARCH_TOOLS_DEFINITION: Tool = {\n name: SEARCH_TOOLS_NAME,\n description:\n 'Searches ContextWise tool catalog for relevant tools based on natural language intent. Returns matched tool signatures, parameter descriptions, and automatically makes them available to invoke.',\n inputSchema: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description:\n 'Natural language query describing what task you want to perform or which tool you need (e.g., \"query postgres database\", \"read a file\", \"create git commit\")',\n },\n domain: {\n type: 'string',\n description:\n 'Optional domain tag to filter tools (e.g., \"database\", \"filesystem\", \"git\", \"web\", \"docker\")',\n },\n topK: {\n type: 'number',\n description: 'Maximum number of tools to return (default: 5)',\n },\n activate: {\n type: 'boolean',\n description:\n 'Whether to activate the matched tools into the active context window (default: true)',\n },\n },\n required: ['query'],\n },\n};\n\nexport const EXECUTE_TOOL_DEFINITION: Tool = {\n name: EXECUTE_TOOL_NAME,\n description:\n 'Universally executes any indexed upstream tool, even if its schema is not pre-loaded into your active context window. Use this after finding tools via contextwise_search_tools.',\n inputSchema: {\n type: 'object',\n properties: {\n tool_name: {\n type: 'string',\n description: 'The name or namespaced name of the tool to execute',\n },\n arguments: {\n type: 'object',\n description: 'Arguments to pass to the target tool',\n default: {},\n },\n },\n required: ['tool_name'],\n },\n};\n\nexport const BROWSE_SERVERS_DEFINITION: Tool = {\n name: BROWSE_SERVERS_NAME,\n description:\n 'Browses available MCP servers from local curated presets, the Official MCP Registry, and Smithery. Displays which registry each server is listed in.',\n inputSchema: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: 'Optional keyword to search for specific servers (e.g., \"database\", \"git\", \"search\", \"linear\")',\n },\n category: {\n type: 'string',\n description:\n 'Optional category filter: \"database\", \"developer\", \"web\", \"filesystem\", \"communication\", \"devops\"',\n enum: ['database', 'developer', 'web', 'filesystem', 'communication', 'devops'],\n },\n source: {\n type: 'string',\n description: 'Filter by registry source: \"all\" (default), \"official\", \"smithery\", or \"curated\"',\n enum: ['all', 'official', 'smithery', 'curated'],\n },\n },\n },\n};\n\nexport const ADD_SERVER_DEFINITION: Tool = {\n name: ADD_SERVER_NAME,\n description:\n 'Hot-loads a new MCP server into ContextWise in real time, persists it to contextwise.json, and immediately makes all its tools available to this session. Supports presets, Smithery packages, custom stdio commands, and remote SSE URLs.',\n inputSchema: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'Unique identifier name for this server (e.g., \"postgres\", \"github\", \"my-server\")',\n },\n preset: {\n type: 'string',\n description:\n 'Optional name of a verified preset to configure (e.g., \"postgres\", \"sqlite\", \"github\", \"linear\", \"fetch\", \"puppeteer\", \"brave-search\", \"slack\")',\n },\n smithery: {\n type: 'string',\n description:\n 'Optional Smithery package name to install and run via @smithery/cli (e.g. \"@smithery-ai/github\" or \"github\")',\n },\n command: {\n type: 'string',\n description: 'Executable command for stdio server (e.g., \"npx\", \"python\", \"docker\")',\n },\n args: {\n type: 'array',\n items: { type: 'string' },\n description: 'Command-line arguments to pass to the executable',\n },\n env: {\n type: 'object',\n description: 'Environment variables to pass (e.g., API keys, tokens)',\n },\n url: {\n type: 'string',\n description: 'Remote SSE endpoint URL if connecting to a remote MCP server over HTTP/SSE',\n },\n headers: {\n type: 'object',\n description: 'HTTP headers for remote SSE server (e.g. Authorization)',\n },\n },\n required: ['name'],\n },\n};\n","import type { UpstreamServerConfig } from '../config/schema.js';\n\nexport type ServerCategory =\n | 'database'\n | 'developer'\n | 'web'\n | 'filesystem'\n | 'communication'\n | 'devops';\n\nexport interface RequiredParam {\n name: string;\n type: 'env' | 'arg';\n description: string;\n default?: string;\n placeholder?: string;\n}\n\nexport interface KnownServerDefinition {\n id: string;\n name: string;\n displayName: string;\n category: ServerCategory;\n description: string;\n tags: string[];\n command: string;\n defaultArgs: string[];\n defaultEnv: Record<string, string>;\n requiredParams: RequiredParam[];\n documentationUrl?: string;\n}\n\nexport const KNOWN_SERVERS: KnownServerDefinition[] = [\n // --- Databases ---\n {\n id: 'postgres',\n name: 'postgres',\n displayName: 'PostgreSQL Database',\n category: 'database',\n description: 'Inspect schemas, browse tables, and execute read/write SQL queries on PostgreSQL.',\n tags: ['database', 'sql', 'postgres', 'tables'],\n command: 'npx',\n defaultArgs: ['-y', '@modelcontextprotocol/server-postgres'],\n defaultEnv: {},\n requiredParams: [\n {\n name: 'connectionString',\n type: 'arg',\n description: 'PostgreSQL connection URL',\n placeholder: 'postgresql://username:password@localhost:5432/mydb',\n },\n ],\n documentationUrl: 'https://github.com/modelcontextprotocol/servers/tree/main/src/postgres',\n },\n {\n id: 'sqlite',\n name: 'sqlite',\n displayName: 'SQLite Database',\n category: 'database',\n description: 'Inspect schemas, browse tables, and execute SQL queries on local SQLite database files.',\n tags: ['database', 'sqlite', 'sql', 'local'],\n command: 'npx',\n defaultArgs: ['-y', '@modelcontextprotocol/server-sqlite', '--db-path'],\n defaultEnv: {},\n requiredParams: [\n {\n name: 'dbPath',\n type: 'arg',\n description: 'Absolute or relative path to SQLite .db file',\n placeholder: './database.sqlite',\n },\n ],\n documentationUrl: 'https://github.com/modelcontextprotocol/servers/tree/main/src/sqlite',\n },\n\n // --- Developer Tools ---\n {\n id: 'github',\n name: 'github',\n displayName: 'GitHub Integration',\n category: 'developer',\n description: 'Search repositories, manage pull requests, create issues, and inspect commit history on GitHub.',\n tags: ['git', 'github', 'prs', 'issues', 'code'],\n command: 'npx',\n defaultArgs: ['-y', '@modelcontextprotocol/server-github'],\n defaultEnv: {},\n requiredParams: [\n {\n name: 'GITHUB_PERSONAL_ACCESS_TOKEN',\n type: 'env',\n description: 'GitHub Personal Access Token (classic or fine-grained)',\n placeholder: 'ghp_...',\n },\n ],\n documentationUrl: 'https://github.com/modelcontextprotocol/servers/tree/main/src/github',\n },\n {\n id: 'git',\n name: 'git',\n displayName: 'Local Git Repository',\n category: 'developer',\n description: 'Inspect working trees, git diffs, commits, branches, and logs directly on local git repos.',\n tags: ['git', 'diff', 'commit', 'branches', 'repository'],\n command: 'npx',\n defaultArgs: ['-y', '@modelcontextprotocol/server-git', '--repository'],\n defaultEnv: {},\n requiredParams: [\n {\n name: 'repositoryPath',\n type: 'arg',\n description: 'Path to local Git repository root',\n default: '.',\n placeholder: '.',\n },\n ],\n documentationUrl: 'https://github.com/modelcontextprotocol/servers/tree/main/src/git',\n },\n {\n id: 'gitlab',\n name: 'gitlab',\n displayName: 'GitLab Integration',\n category: 'developer',\n description: 'Manage GitLab projects, merge requests, issues, and pipelines.',\n tags: ['git', 'gitlab', 'ci', 'mr', 'issues'],\n command: 'npx',\n defaultArgs: ['-y', '@modelcontextprotocol/server-gitlab'],\n defaultEnv: {},\n requiredParams: [\n {\n name: 'GITLAB_PERSONAL_ACCESS_TOKEN',\n type: 'env',\n description: 'GitLab Personal Access Token',\n placeholder: 'glpat-...',\n },\n ],\n documentationUrl: 'https://github.com/modelcontextprotocol/servers/tree/main/src/gitlab',\n },\n {\n id: 'linear',\n name: 'linear',\n displayName: 'Linear Project Tracking',\n category: 'developer',\n description: 'Search, create, and update Linear issues, teams, projects, and cycles.',\n tags: ['issue', 'linear', 'ticket', 'project', 'tasks'],\n command: 'npx',\n defaultArgs: ['-y', '@modelcontextprotocol/server-linear'],\n defaultEnv: {},\n requiredParams: [\n {\n name: 'LINEAR_API_KEY',\n type: 'env',\n description: 'Linear API Key',\n placeholder: 'lin_api_...',\n },\n ],\n documentationUrl: 'https://github.com/modelcontextprotocol/servers/tree/main/src/linear',\n },\n\n // --- Web, Search & Browser Automation ---\n {\n id: 'brave-search',\n name: 'brave-search',\n displayName: 'Brave Web Search',\n category: 'web',\n description: 'Privacy-preserving real-time web search and local location searches.',\n tags: ['web', 'search', 'brave', 'internet', 'news'],\n command: 'npx',\n defaultArgs: ['-y', '@modelcontextprotocol/server-brave-search'],\n defaultEnv: {},\n requiredParams: [\n {\n name: 'BRAVE_API_KEY',\n type: 'env',\n description: 'Brave Search API Key from brave.com/search/api',\n placeholder: 'BSA...',\n },\n ],\n documentationUrl: 'https://github.com/modelcontextprotocol/servers/tree/main/src/brave-search',\n },\n {\n id: 'fetch',\n name: 'fetch',\n displayName: 'Web Fetch & Scraper',\n category: 'web',\n description: 'Fetch web pages, convert HTML to clean Markdown, and inspect HTTP headers.',\n tags: ['web', 'fetch', 'http', 'html', 'scrape'],\n command: 'npx',\n defaultArgs: ['-y', '@modelcontextprotocol/server-fetch'],\n defaultEnv: {},\n requiredParams: [],\n documentationUrl: 'https://github.com/modelcontextprotocol/servers/tree/main/src/fetch',\n },\n {\n id: 'puppeteer',\n name: 'puppeteer',\n displayName: 'Puppeteer Browser Automation',\n category: 'web',\n description: 'Control headless Chrome to navigate pages, capture screenshots, evaluate JS, and interact with web apps.',\n tags: ['web', 'browser', 'puppeteer', 'automation', 'screenshot'],\n command: 'npx',\n defaultArgs: ['-y', '@modelcontextprotocol/server-puppeteer'],\n defaultEnv: {},\n requiredParams: [],\n documentationUrl: 'https://github.com/modelcontextprotocol/servers/tree/main/src/puppeteer',\n },\n\n // --- Filesystem & Memory ---\n {\n id: 'filesystem',\n name: 'filesystem',\n displayName: 'Local Filesystem Access',\n category: 'filesystem',\n description: 'Secure scoped filesystem access to read, write, search, and manage files in allowed directories.',\n tags: ['filesystem', 'files', 'disk', 'directory', 'storage'],\n command: 'npx',\n defaultArgs: ['-y', '@modelcontextprotocol/server-filesystem'],\n defaultEnv: {},\n requiredParams: [\n {\n name: 'allowedDirectory',\n type: 'arg',\n description: 'Root directory allowed for file operations',\n default: '.',\n placeholder: './',\n },\n ],\n documentationUrl: 'https://github.com/modelcontextprotocol/servers/tree/main/src/filesystem',\n },\n {\n id: 'memory',\n name: 'memory',\n displayName: 'Graph Knowledge Memory',\n category: 'filesystem',\n description: 'Long-term persistent knowledge graph memory using entities, relations, and observations.',\n tags: ['memory', 'knowledge', 'graph', 'persistence', 'history'],\n command: 'npx',\n defaultArgs: ['-y', '@modelcontextprotocol/server-memory'],\n defaultEnv: {},\n requiredParams: [],\n documentationUrl: 'https://github.com/modelcontextprotocol/servers/tree/main/src/memory',\n },\n\n // --- Communication ---\n {\n id: 'slack',\n name: 'slack',\n displayName: 'Slack Workspace',\n category: 'communication',\n description: 'Read and send messages, list channels, and reply to threads in Slack workspaces.',\n tags: ['slack', 'chat', 'communication', 'message', 'channels'],\n command: 'npx',\n defaultArgs: ['-y', '@modelcontextprotocol/server-slack'],\n defaultEnv: {},\n requiredParams: [\n {\n name: 'SLACK_BOT_TOKEN',\n type: 'env',\n description: 'Slack Bot User OAuth Token (xoxb-...)',\n placeholder: 'xoxb-...',\n },\n {\n name: 'SLACK_TEAM_ID',\n type: 'env',\n description: 'Slack Workspace Team ID (T...)',\n placeholder: 'T...',\n },\n ],\n documentationUrl: 'https://github.com/modelcontextprotocol/servers/tree/main/src/slack',\n },\n\n // --- DevOps & Cloud ---\n {\n id: 'docker',\n name: 'docker',\n displayName: 'Docker Container Engine',\n category: 'devops',\n description: 'List, start, stop, and inspect Docker containers, images, and volumes.',\n tags: ['docker', 'container', 'devops', 'images'],\n command: 'npx',\n defaultArgs: ['-y', 'mcp-server-docker'],\n defaultEnv: {},\n requiredParams: [],\n documentationUrl: 'https://github.com/modelcontextprotocol/servers',\n },\n];\n\nexport class KnownServerRegistry {\n /**\n * Returns all known server definitions.\n */\n static getAll(): KnownServerDefinition[] {\n return KNOWN_SERVERS;\n }\n\n /**\n * Finds a known server by ID or name.\n */\n static find(idOrName: string): KnownServerDefinition | undefined {\n const clean = idOrName.trim().toLowerCase();\n return KNOWN_SERVERS.find(\n (s) => s.id === clean || s.name.toLowerCase() === clean\n );\n }\n\n /**\n * Searches known servers by query string and/or category.\n */\n static search(query?: string, category?: ServerCategory | string): KnownServerDefinition[] {\n let list = KNOWN_SERVERS;\n\n if (category) {\n const catClean = category.toLowerCase();\n list = list.filter((s) => s.category === catClean);\n }\n\n if (query && query.trim()) {\n const q = query.trim().toLowerCase();\n list = list.filter(\n (s) =>\n s.name.toLowerCase().includes(q) ||\n s.displayName.toLowerCase().includes(q) ||\n s.description.toLowerCase().includes(q) ||\n s.tags.some((t) => t.includes(q))\n );\n }\n\n return list;\n }\n\n /**\n * Returns all unique categories available.\n */\n static getCategories(): string[] {\n const set = new Set<string>();\n for (const s of KNOWN_SERVERS) {\n set.add(s.category);\n }\n return Array.from(set);\n }\n\n /**\n * Builds an UpstreamServerConfig from a KnownServerDefinition and supplied parameters.\n */\n static buildConfig(\n serverDef: KnownServerDefinition,\n params: {\n args?: string[];\n env?: Record<string, string>;\n } = {}\n ): UpstreamServerConfig {\n const finalArgs = [...serverDef.defaultArgs, ...(params.args ?? [])];\n const finalEnv = { ...serverDef.defaultEnv, ...(params.env ?? {}) };\n\n return {\n command: serverDef.command,\n args: finalArgs,\n env: finalEnv,\n autoRestart: true,\n };\n }\n}\n","import { logger } from '../utils/logger.js';\nimport type { RegistryServerItem } from './types.js';\n\ninterface OfficialRegistryResponse {\n servers?: Array<{\n server: {\n name: string;\n description?: string;\n title?: string;\n version?: string;\n repository?: { url?: string };\n remotes?: Array<{ type: string; url: string }>;\n packages?: Array<{ registryType: string; identifier: string }>;\n };\n }>;\n}\n\nexport class OfficialRegistryClient {\n private static readonly BASE_URL = 'https://registry.modelcontextprotocol.io/v0.1/servers';\n\n /**\n * Searches the official canonical MCP registry for public servers.\n */\n static async search(\n query?: string,\n limit: number = 10,\n timeoutMs: number = 3000\n ): Promise<RegistryServerItem[]> {\n try {\n const url = new URL(this.BASE_URL);\n if (query && query.trim()) {\n url.searchParams.set('search', query.trim());\n }\n url.searchParams.set('limit', String(limit));\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n logger.debug(`Querying Official MCP Registry: ${url.toString()}`);\n const res = await fetch(url.toString(), {\n signal: controller.signal,\n headers: {\n Accept: 'application/json',\n 'User-Agent': 'ContextWise-Proxy/0.1.0',\n },\n });\n\n clearTimeout(timer);\n\n if (!res.ok) {\n logger.debug(`Official MCP Registry responded with status: ${res.status}`);\n return [];\n }\n\n const data = (await res.json()) as OfficialRegistryResponse;\n if (!data.servers || !Array.isArray(data.servers)) {\n return [];\n }\n\n return data.servers\n .filter((item) => Boolean(item && item.server && typeof item.server.name === 'string'))\n .map((item) => {\n const s = item.server;\n const remoteUrl = s.remotes?.[0]?.url;\n const npmPkg = s.packages?.find((p) => p.registryType === 'npm')?.identifier;\n\n return {\n id: s.name,\n name: s.name,\n displayName: s.title || s.name,\n description: s.description || 'No description provided.',\n source: 'official',\n sourceLabel: 'Official MCP Registry',\n category: 'community',\n tags: ['official', 'mcp-registry'],\n installHint: `contextwise add \"${s.name}\"`,\n homepage:\n s.repository?.url ||\n s.remotes?.[0]?.url ||\n `https://registry.modelcontextprotocol.io`,\n requiredParams: [],\n suggestedConfig: remoteUrl\n ? { url: remoteUrl, headers: {}, transport: 'auto', autoReconnect: true }\n : npmPkg\n ? { command: 'npx', args: ['-y', npmPkg], env: {}, autoRestart: true }\n : undefined,\n };\n });\n } catch (err) {\n logger.debug(`Official MCP Registry query skipped or timed out: ${err}`);\n return [];\n }\n }\n}\n","import type { UpstreamServerConfig } from '../config/schema.js';\nimport { logger } from '../utils/logger.js';\nimport type { RegistryServerItem } from './types.js';\n\ninterface SmitheryServerItem {\n id?: string;\n qualifiedName: string;\n displayName?: string;\n description?: string;\n verified?: boolean;\n useCount?: number;\n homepage?: string;\n remote?: boolean;\n deploymentUrl?: string;\n}\n\ninterface SmitheryResponse {\n servers?: SmitheryServerItem[];\n}\n\nexport class SmitheryClient {\n private static readonly BASE_URL = 'https://api.smithery.ai/servers';\n\n /**\n * Searches the Smithery.ai registry for community and hosted MCP servers.\n */\n static async search(\n query?: string,\n apiKey?: string,\n timeoutMs: number = 3000\n ): Promise<RegistryServerItem[]> {\n try {\n const url = new URL(this.BASE_URL);\n if (query && query.trim()) {\n url.searchParams.set('q', query.trim());\n }\n\n const key = apiKey || process.env.SMITHERY_API_KEY;\n const headers: Record<string, string> = {\n Accept: 'application/json',\n 'User-Agent': 'ContextWise-Proxy/0.1.0',\n };\n\n if (key) {\n headers['Authorization'] = `Bearer ${key}`;\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n logger.debug(`Querying Smithery Registry: ${url.toString()}`);\n const res = await fetch(url.toString(), {\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timer);\n\n if (!res.ok) {\n logger.debug(`Smithery API responded with status: ${res.status}`);\n return [];\n }\n\n const data = (await res.json()) as SmitheryResponse;\n if (!data.servers || !Array.isArray(data.servers)) {\n return [];\n }\n\n return data.servers\n .filter((item) => Boolean(item && typeof item.qualifiedName === 'string'))\n .map((item) => ({\n id: item.qualifiedName,\n name: item.qualifiedName,\n displayName: item.displayName || item.qualifiedName,\n description: item.description || 'No description provided.',\n source: 'smithery',\n sourceLabel: 'Smithery',\n category: 'marketplace',\n tags: ['smithery', ...(item.verified ? ['verified'] : [])],\n installHint: `contextwise add \"${item.qualifiedName}\" --smithery`,\n homepage: item.homepage || `https://smithery.ai/servers/${item.qualifiedName}`,\n verified: item.verified,\n requiredParams: [],\n suggestedConfig: this.buildServerConfig(item.qualifiedName, { apiKey: key }),\n }));\n } catch (err) {\n logger.debug(`Smithery Registry query skipped or timed out: ${err}`);\n return [];\n }\n }\n\n /**\n * Builds an UpstreamServerConfig that runs a Smithery MCP server using @smithery/cli runner.\n */\n static buildServerConfig(\n qualifiedName: string,\n options: { apiKey?: string; env?: Record<string, string> } = {}\n ): UpstreamServerConfig {\n const key = options.apiKey || process.env.SMITHERY_API_KEY;\n const env = { ...(options.env || {}) };\n\n if (key) {\n env['SMITHERY_API_KEY'] = key;\n }\n\n return {\n command: 'npx',\n args: ['-y', '@smithery/cli@latest', 'run', qualifiedName],\n env,\n autoRestart: true,\n };\n }\n}\n","import { KnownServerRegistry } from './known_servers.js';\nimport { OfficialRegistryClient } from './official_client.js';\nimport { SmitheryClient } from './smithery_client.js';\nimport type { RegistrySearchOptions, RegistryServerItem } from './types.js';\n\nexport class UnifiedRegistryClient {\n /**\n * Searches across all available registries (Curated Presets, Official MCP Registry, and Smithery).\n */\n static async search(options: RegistrySearchOptions = {}): Promise<RegistryServerItem[]> {\n const query = options.query?.trim();\n const category = options.category?.trim();\n const source = options.source ?? 'all';\n const limit = options.limit ?? 15;\n const timeoutMs = options.timeoutMs ?? 3000;\n\n const results: RegistryServerItem[] = [];\n const seenIds = new Set<string>();\n\n // 1. Curated Built-in Presets\n if (source === 'all' || source === 'curated') {\n const curated = KnownServerRegistry.search(query, category);\n for (const s of curated) {\n seenIds.add(s.id.toLowerCase());\n seenIds.add(s.name.toLowerCase());\n results.push({\n id: s.id,\n name: s.name,\n displayName: s.displayName,\n description: s.description,\n source: 'curated',\n sourceLabel: 'Curated / Verified',\n category: s.category,\n tags: s.tags,\n installHint: `contextwise add ${s.id}`,\n homepage: s.documentationUrl,\n verified: true,\n requiredParams: s.requiredParams,\n suggestedConfig: KnownServerRegistry.buildConfig(s),\n });\n }\n }\n\n // 2. Fetch remote registries in parallel (fallback to category if query not set)\n const remoteQuery = query || category;\n const promises: Promise<RegistryServerItem[]>[] = [];\n\n if (source === 'all' || source === 'official') {\n promises.push(OfficialRegistryClient.search(remoteQuery, limit, timeoutMs));\n }\n\n if (source === 'all' || source === 'smithery') {\n promises.push(\n SmitheryClient.search(remoteQuery, options.smitheryApiKey, timeoutMs)\n );\n }\n\n if (promises.length > 0) {\n const settled = await Promise.allSettled(promises);\n for (const res of settled) {\n if (res.status === 'fulfilled' && Array.isArray(res.value)) {\n for (const server of res.value) {\n const cleanId = server.id.toLowerCase();\n const cleanName = server.name.toLowerCase();\n\n // Deduplicate if already present from curated list\n if (!seenIds.has(cleanId) && !seenIds.has(cleanName)) {\n seenIds.add(cleanId);\n seenIds.add(cleanName);\n results.push(server);\n }\n }\n }\n }\n }\n\n return results;\n }\n}\n","import { ADD_SERVER_NAME } from '../router/meta_tools.js';\nimport { UnifiedRegistryClient } from './remote_registry.js';\nimport type { RegistryServerItem } from './types.js';\n\nexport interface RecommendationOutput {\n hasRecommendations: boolean;\n message: string;\n recommendedServers: RegistryServerItem[];\n}\n\nexport class ServerRecommender {\n /**\n * Generates actionable server recommendations when an agent lacks tools for a given task.\n */\n static async recommendForTask(\n query: string,\n domain?: string,\n limit: number = 3\n ): Promise<RecommendationOutput> {\n const servers = await UnifiedRegistryClient.search({\n query,\n category: domain,\n limit,\n });\n\n if (servers.length === 0) {\n return {\n hasRecommendations: false,\n message: `No matching tools found for query \"${query}\", and no matching MCP servers were found in online registries.`,\n recommendedServers: [],\n };\n }\n\n const lines: string[] = [\n `⚠️ Capability Gap Detected: No active tools in your connected ContextWise servers match \"${query}\".`,\n '',\n `💡 Recommended MCP servers to add for this capability:`,\n ];\n\n servers.forEach((s, idx) => {\n let installExample = `${ADD_SERVER_NAME}(name: \"${s.id}\", preset: \"${s.id}\")`;\n if (s.source === 'smithery') {\n installExample = `${ADD_SERVER_NAME}(name: \"${s.id}\", smithery: \"${s.id}\")`;\n } else if (s.source === 'official') {\n installExample = `${ADD_SERVER_NAME}(name: \"${s.id}\")`;\n }\n\n const params = s.requiredParams && s.requiredParams.length > 0\n ? `\\n - Required configuration: ${s.requiredParams.map((p) => `\\`${p.name}\\` (${p.type}: ${p.description})`).join(', ')}`\n : '';\n\n lines.push(\n `${idx + 1}. **${s.displayName}** (\\`${s.id}\\`) — Registry: **${s.sourceLabel}**`\n );\n lines.push(` - ${s.description}${params}`);\n lines.push(` - Direct install call: \\`${installExample}\\``);\n });\n\n lines.push('');\n lines.push(\n `To proceed with this task, invoke \\`${ADD_SERVER_NAME}\\` with the chosen server (asking the user for any required credentials if needed). ContextWise will immediately hot-load the server and make its tools available in this session without restarting.`\n );\n\n return {\n hasRecommendations: true,\n message: lines.join('\\n'),\n recommendedServers: servers,\n };\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport {\n ContextWiseConfig,\n ContextWiseConfigSchema,\n UpstreamServerConfig,\n} from '../config/schema.js';\nimport { logger } from '../utils/logger.js';\n\nexport class ServerManager {\n /**\n * Finds the path to contextwise.json in the current working directory.\n */\n static findConfigPath(customPath?: string, cwd: string = process.cwd()): string {\n if (customPath) {\n return resolve(cwd, customPath);\n }\n if (process.env.CONTEXTWISE_CONFIG) {\n return resolve(cwd, process.env.CONTEXTWISE_CONFIG);\n }\n const standardPath = resolve(cwd, 'contextwise.json');\n if (existsSync(standardPath)) {\n return standardPath;\n }\n const dotPath = resolve(cwd, '.contextwise.json');\n if (existsSync(dotPath)) {\n return dotPath;\n }\n return standardPath; // Default fallback to create contextwise.json\n }\n\n /**\n * Loads the current configuration or returns an empty default config.\n */\n static loadConfig(configPath?: string, cwd: string = process.cwd()): { config: ContextWiseConfig; path: string } {\n const filePath = this.findConfigPath(configPath, cwd);\n if (!existsSync(filePath)) {\n return {\n config: ContextWiseConfigSchema.parse({}),\n path: filePath,\n };\n }\n\n try {\n const raw = readFileSync(filePath, 'utf-8');\n return {\n config: ContextWiseConfigSchema.parse(JSON.parse(raw)),\n path: filePath,\n };\n } catch (err) {\n logger.warn(`Could not parse existing config at ${filePath}: ${err}. Starting fresh.`);\n return {\n config: ContextWiseConfigSchema.parse({}),\n path: filePath,\n };\n }\n }\n\n /**\n * Persists an upstream server configuration to contextwise.json.\n */\n static saveUpstream(\n name: string,\n serverConfig: UpstreamServerConfig,\n configPath?: string,\n cwd: string = process.cwd()\n ): string {\n const { config, path: filePath } = this.loadConfig(configPath, cwd);\n\n config.upstreams[name] = serverConfig;\n\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n writeFileSync(filePath, JSON.stringify(config, null, 2), 'utf-8');\n logger.info(`Persisted upstream \"${name}\" into ${filePath}`);\n return filePath;\n }\n\n /**\n * Removes an upstream server from contextwise.json.\n */\n static removeUpstream(\n name: string,\n configPath?: string,\n cwd: string = process.cwd()\n ): boolean {\n const { config, path: filePath } = this.loadConfig(configPath, cwd);\n\n if (!config.upstreams[name]) {\n return false;\n }\n\n delete config.upstreams[name];\n writeFileSync(filePath, JSON.stringify(config, null, 2), 'utf-8');\n logger.info(`Removed upstream \"${name}\" from ${filePath}`);\n return true;\n }\n}\n","import { existsSync, readdirSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { logger } from '../utils/logger.js';\n\nexport interface WorkspaceContext {\n detectedDomains: string[];\n suggestedQueries: string[];\n}\n\nexport class WorkspaceContextPrimer {\n /**\n * Scans a workspace directory to detect technical domains and pre-prime relevant tools.\n */\n static analyzeWorkspace(dirPath: string = process.cwd()): WorkspaceContext {\n const domains = new Set<string>();\n const queries = new Set<string>();\n\n try {\n if (!existsSync(dirPath)) {\n return { detectedDomains: [], suggestedQueries: [] };\n }\n\n // Check for Git repository\n if (existsSync(resolve(dirPath, '.git'))) {\n domains.add('git');\n queries.add('git status and diff tools');\n }\n\n // Check for Docker / Containerization\n if (\n existsSync(resolve(dirPath, 'Dockerfile')) ||\n existsSync(resolve(dirPath, 'docker-compose.yml')) ||\n existsSync(resolve(dirPath, 'compose.yaml'))\n ) {\n domains.add('docker');\n queries.add('docker and container tools');\n }\n\n // Check for SQL / Database files\n const entries = readdirSync(dirPath, { withFileTypes: true });\n for (const entry of entries) {\n const name = entry.name.toLowerCase();\n if (\n name.endsWith('.sql') ||\n name.endsWith('.sqlite') ||\n name.endsWith('.sqlite3') ||\n name === 'prisma' ||\n name.startsWith('prisma.') ||\n name === 'migrations' ||\n name === 'database' ||\n /(?:^|[_.-])(?:db|database|sql)(?:[_.-]|$)/i.test(name)\n ) {\n domains.add('database');\n queries.add('database and SQL query tools');\n break;\n }\n }\n\n // Always include general filesystem tools\n domains.add('filesystem');\n\n } catch (err) {\n logger.warn(`Workspace analysis encountered error in ${dirPath}: ${err}`);\n }\n\n const detectedDomains = Array.from(domains);\n const suggestedQueries = Array.from(queries);\n\n logger.debug(`Workspace pre-primed domains: ${detectedDomains.join(', ')}`);\n return { detectedDomains, suggestedQueries };\n }\n}\n","import type { Tool } from '@modelcontextprotocol/sdk/types.js';\nimport { ToolRegistry, toolRegistry } from '../catalog/registry.js';\nimport { HybridSearchEngine, searchEngine } from '../catalog/search.js';\nimport type { RoutingConfig } from '../config/schema.js';\nimport { logger } from '../utils/logger.js';\nimport {\n ADD_SERVER_DEFINITION,\n BROWSE_SERVERS_DEFINITION,\n EXECUTE_TOOL_DEFINITION,\n SEARCH_TOOLS_DEFINITION,\n} from './meta_tools.js';\nimport { WorkspaceContextPrimer } from './workspace.js';\nimport { KnownServerRegistry } from '../registry/known_servers.js';\n\nexport interface SearchToolsResult {\n message: string;\n foundTools: Array<{\n name: string;\n server: string;\n description: string;\n parameters: unknown;\n }>;\n activatedNewTools: boolean;\n}\n\nexport class ContextRouter {\n private config: RoutingConfig;\n private registry: ToolRegistry;\n private searchEngine: HybridSearchEngine;\n\n constructor(\n config: Partial<RoutingConfig> = {},\n registry: ToolRegistry = toolRegistry,\n search: HybridSearchEngine = searchEngine\n ) {\n this.config = {\n strategy: config.strategy ?? 'hybrid',\n topK: config.topK ?? 5,\n similarityThreshold: config.similarityThreshold ?? 0.45,\n pinnedTools: config.pinnedTools ?? [],\n maxActiveTools: config.maxActiveTools ?? 10,\n enableBrowseServers: config.enableBrowseServers ?? false,\n enableAddServer: config.enableAddServer ?? false,\n allowCustomCommands: config.allowCustomCommands ?? false,\n persistAddedServers: config.persistAddedServers ?? false,\n };\n this.registry = registry;\n this.searchEngine = search;\n this.registry.setPinnedTools(this.config.pinnedTools);\n if (this.config.maxActiveTools) {\n this.registry.setMaxActiveTools(this.config.maxActiveTools);\n }\n }\n\n updateConfig(config: Partial<RoutingConfig>): void {\n this.config = { ...this.config, ...config };\n if (config.pinnedTools) {\n this.registry.setPinnedTools(config.pinnedTools);\n }\n if (config.maxActiveTools) {\n this.registry.setMaxActiveTools(config.maxActiveTools);\n }\n }\n\n getConfig(): RoutingConfig {\n return this.config;\n }\n\n /**\n * Prime active tools based on workspace environment (Mode 4).\n */\n primeWorkspace(workspaceDir: string = process.cwd()): void {\n if (this.config.strategy === 'passthrough') return;\n\n const analysis = WorkspaceContextPrimer.analyzeWorkspace(workspaceDir);\n for (const query of analysis.suggestedQueries) {\n const results = this.searchEngine.search(query, { topK: 2, similarityThreshold: this.config.similarityThreshold });\n if (results.length > 0) {\n this.registry.activateTools(results.map((r) => r.tool.namespacedName));\n }\n }\n }\n\n /**\n * Generates a succinct Dynamic Capability Manifest of connected upstream servers and tools.\n */\n generateCapabilityManifest(): string {\n const allTools = this.registry.getAllTools();\n if (allTools.length === 0) {\n return '';\n }\n\n const serverMap = new Map<string, string[]>();\n for (const tool of allTools) {\n const server = tool.serverName;\n if (!serverMap.has(server)) {\n serverMap.set(server, []);\n }\n const list = serverMap.get(server)!;\n if (!list.includes(tool.originalName)) {\n list.push(tool.originalName);\n }\n }\n\n const lines: string[] = [];\n const sortedServers = Array.from(serverMap.entries()).sort(([a], [b]) =>\n a.localeCompare(b)\n );\n\n for (const [serverName, toolNames] of sortedServers) {\n const known = KnownServerRegistry.find(serverName);\n const serverLabel = known?.displayName\n ? `${serverName} (${known.displayName})`\n : serverName;\n\n const toolSummary =\n toolNames.length <= 4\n ? toolNames.join(', ')\n : `${toolNames.slice(0, 3).join(', ')} (+${toolNames.length - 3} more)`;\n\n lines.push(`• ${serverLabel}: ${toolSummary}`);\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Returns list of tools to expose to downstream AI client.\n */\n getExposedTools(): Tool[] {\n // Mode: Passthrough (Expose all tools directly)\n if (this.config.strategy === 'passthrough') {\n return this.registry.getAllTools().map((t) => ({\n ...t,\n name: t.namespacedName,\n }));\n }\n\n // Dynamic Mode (Mode 1 & 2):\n // Expose Meta-Tools + Currently Active (Pinned + LRU Activated) Tools\n const activeTools = this.registry.getActiveTools().map((t) => ({\n ...t,\n name: t.namespacedName,\n }));\n\n // Generate Dynamic Capability Manifest snippet for connected servers\n const manifest = this.generateCapabilityManifest();\n const dynamicSearchTool: Tool = {\n ...SEARCH_TOOLS_DEFINITION,\n description: manifest\n ? `${SEARCH_TOOLS_DEFINITION.description}\\n\\nConnected MCP servers and available capabilities:\\n${manifest}`\n : SEARCH_TOOLS_DEFINITION.description,\n };\n\n // Core meta-tools always exposed in dynamic mode\n const metaTools: Tool[] = [\n dynamicSearchTool,\n EXECUTE_TOOL_DEFINITION,\n ];\n\n // Optional management tools (gated to conserve tokens and enforce security)\n if (this.config.enableBrowseServers) {\n metaTools.push(BROWSE_SERVERS_DEFINITION);\n }\n if (this.config.enableAddServer) {\n metaTools.push(ADD_SERVER_DEFINITION);\n }\n\n const metaToolNames = new Set(metaTools.map((m) => m.name));\n const safeActiveTools = activeTools.filter((t) => !metaToolNames.has(t.name));\n\n return [...metaTools, ...safeActiveTools];\n }\n\n /**\n * Handles contextwise_search_tools meta-tool call.\n */\n searchAndHydrate(\n query: string,\n domain?: string,\n topK?: number,\n activate: boolean = true\n ): SearchToolsResult {\n const k = topK ?? this.config.topK;\n const results = this.searchEngine.search(query, {\n topK: k,\n domain,\n similarityThreshold: this.config.similarityThreshold,\n });\n\n if (results.length === 0) {\n return {\n message: `No matching tools found for query \"${query}\".`,\n foundTools: [],\n activatedNewTools: false,\n };\n }\n\n const toolNames = results.map((r) => r.tool.namespacedName);\n let activatedNewTools = false;\n\n if (activate) {\n const beforeSet = new Set(this.registry.getActiveTools().map((t) => t.namespacedName));\n this.registry.activateTools(toolNames);\n const afterSet = new Set(this.registry.getActiveTools().map((t) => t.namespacedName));\n activatedNewTools = beforeSet.size !== afterSet.size || [...afterSet].some((t) => !beforeSet.has(t));\n if (activatedNewTools) {\n logger.info(`Dynamically activated ${afterSet.size - beforeSet.size} tools for query \"${query}\"`);\n }\n }\n\n const formatParams = (inputSchema: unknown): string => {\n if (!inputSchema || typeof inputSchema !== 'object') return 'none';\n const s = inputSchema as {\n properties?: Record<string, { type?: string; description?: string }>;\n required?: string[];\n };\n const props = s.properties || {};\n const required = new Set(s.required || []);\n const entries = Object.entries(props);\n if (entries.length === 0) return 'none';\n return entries\n .map(([name, p]) => {\n const type = p.type || 'any';\n const reqStr = required.has(name) ? 'required' : 'optional';\n const descStr = p.description ? ` - ${p.description}` : '';\n return `${name}: ${type} (${reqStr})${descStr}`;\n })\n .join(', ');\n };\n\n const formatted = results.map((r) => ({\n name: r.tool.namespacedName,\n server: r.tool.serverName,\n description: r.tool.description || '',\n parameters: (r.tool.inputSchema as Record<string, unknown>)?.properties || {},\n }));\n\n const summaryText = [\n `Found ${results.length} relevant tool(s) for \"${query}\":`,\n ...results.map(\n (r, idx) =>\n `${idx + 1}. **${r.tool.namespacedName}** (${r.tool.serverName})\\n - ${r.tool.description || 'No description'}\\n - Parameters: ${formatParams(r.tool.inputSchema)}`\n ),\n activate\n ? '\\nThese tools have been activated into your active tool set and can also be called immediately via contextwise_execute_tool.'\n : '',\n ]\n .filter(Boolean)\n .join('\\n');\n\n return {\n message: summaryText,\n foundTools: formatted,\n activatedNewTools,\n };\n }\n}\n\nexport const contextRouter = new ContextRouter();\n","import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n CallToolResult,\n ErrorCode,\n ListToolsRequestSchema,\n McpError,\n} from '@modelcontextprotocol/sdk/types.js';\nimport { toolRegistry } from '../catalog/registry.js';\nimport type { ContextWiseConfig } from '../config/schema.js';\nimport { argumentValidator } from '../guardrails/validator.js';\nimport { responseCache } from '../guardrails/cache.js';\nimport { loopBreaker } from '../guardrails/loop_breaker.js';\nimport { metricsCollector } from '../metrics/collector.js';\nimport {\n ADD_SERVER_NAME,\n BROWSE_SERVERS_NAME,\n EXECUTE_TOOL_NAME,\n SEARCH_TOOLS_NAME,\n} from '../router/meta_tools.js';\nimport {\n KnownServerRegistry,\n RegistrySource,\n ServerManager,\n ServerRecommender,\n SmitheryClient,\n UnifiedRegistryClient,\n} from '../registry/index.js';\nimport type { UpstreamServerConfig } from '../config/schema.js';\nimport { contextRouter, ContextRouter } from '../router/router.js';\nimport { logger } from '../utils/logger.js';\nimport { UpstreamMultiplexer } from './multiplexer.js';\nimport { redactionFilter } from '../vault/redaction.js';\n\nexport class ContextWiseProxy {\n private server: Server;\n private multiplexer: UpstreamMultiplexer;\n private router: ContextRouter;\n private transport?: StdioServerTransport;\n private config?: ContextWiseConfig;\n private isRunning: boolean = false;\n\n constructor() {\n this.server = new Server(\n {\n name: 'contextwise',\n version: '0.1.0',\n },\n {\n capabilities: {\n tools: {\n listChanged: true,\n },\n },\n }\n );\n\n this.multiplexer = new UpstreamMultiplexer();\n this.router = contextRouter;\n this.setupRequestHandlers();\n }\n\n private setupRequestHandlers(): void {\n // 1. tools/list handler\n this.server.setRequestHandler(ListToolsRequestSchema, async () => {\n const exposedTools = this.router.getExposedTools();\n const allToolsCount = toolRegistry.getAllTools().length;\n\n metricsCollector.updateToolCounts(allToolsCount, exposedTools.length);\n metricsCollector.recordSchemaPruning(allToolsCount, exposedTools.length);\n logger.debug(\n `Serving tools/list: exposing ${exposedTools.length} tools (out of ${allToolsCount} upstream tools)`\n );\n\n return {\n tools: exposedTools,\n };\n });\n\n // 2. tools/call handler\n this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args = {} } = request.params;\n return this.handleToolCall(name, args as Record<string, unknown>);\n });\n }\n\n /**\n * Main tool execution pipeline handling meta-tools and proxied calls.\n */\n async handleToolCall(\n name: string,\n args: Record<string, unknown> = {}\n ): Promise<CallToolResult> {\n // A. Handle search meta-tool (contextwise_search_tools)\n if (name === SEARCH_TOOLS_NAME) {\n return this.handleSearchToolsCall(args);\n }\n\n // B. Handle universal execute meta-tool (contextwise_execute_tool)\n if (name === EXECUTE_TOOL_NAME) {\n const targetToolName = String(args.tool_name || '');\n const targetArgs = (args.arguments as Record<string, unknown>) || {};\n if (!targetToolName) {\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: 'Error: Missing required parameter \"tool_name\" in contextwise_execute_tool.',\n },\n ],\n };\n }\n return this.dispatchProxiedToolCall(targetToolName, targetArgs);\n }\n\n // C. Handle browse servers meta-tool (contextwise_browse_servers)\n if (name === BROWSE_SERVERS_NAME) {\n return this.handleBrowseServersCall(args);\n }\n\n // D. Handle add server meta-tool (contextwise_add_server)\n if (name === ADD_SERVER_NAME) {\n return this.handleAddServerCall(args);\n }\n\n // E. Regular tool call (proxied directly to upstream)\n return this.dispatchProxiedToolCall(name, args);\n }\n\n /**\n * Handles contextwise_browse_servers execution.\n */\n private async handleBrowseServersCall(\n args: Record<string, unknown>\n ): Promise<CallToolResult> {\n const query = args.query ? String(args.query) : undefined;\n const category = args.category ? String(args.category) : undefined;\n const source = (args.source as RegistrySource | 'all') ?? 'all';\n\n const servers = await UnifiedRegistryClient.search({\n query,\n category,\n source,\n limit: 12,\n });\n\n if (servers.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: `No MCP servers found matching query: \"${query || ''}\" in category \"${category || 'all'}\". You can still add any custom MCP server using ${ADD_SERVER_NAME}.`,\n },\n ],\n };\n }\n\n const lines: string[] = [\n `### ContextWise MCP Server Catalog (${servers.length} results from online registries & local presets)`,\n '',\n ];\n\n for (const s of servers) {\n const verifiedBadge = s.verified ? ' [Verified]' : '';\n lines.push(\n `• **${s.displayName}** (\\`${s.id}\\`) — Registry: **${s.sourceLabel}**${verifiedBadge}`\n );\n lines.push(` ${s.description}`);\n\n if (s.requiredParams && s.requiredParams.length > 0) {\n lines.push(` *Required Configuration:*`);\n for (const p of s.requiredParams) {\n lines.push(` - \\`${p.name}\\` (${p.type}): ${p.description}`);\n }\n }\n\n if (s.source === 'smithery') {\n lines.push(` *Install with:* \\`${ADD_SERVER_NAME}(name: \"${s.id}\", smithery: \"${s.id}\")\\``);\n } else if (s.source === 'curated') {\n lines.push(` *Install with:* \\`${ADD_SERVER_NAME}(name: \"${s.name}\", preset: \"${s.id}\")\\``);\n } else {\n lines.push(` *Install with:* \\`${ADD_SERVER_NAME}(name: \"${s.id}\", ...)\\``);\n }\n lines.push('');\n }\n\n return {\n content: [\n {\n type: 'text',\n text: lines.join('\\n'),\n },\n ],\n };\n }\n\n /**\n * Handles contextwise_add_server execution (hot-loading & persistence).\n */\n private async handleAddServerCall(\n args: Record<string, unknown>\n ): Promise<CallToolResult> {\n const routingConfig = this.router.getConfig();\n if (!routingConfig.enableAddServer) {\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: 'Error: Dynamic server addition is disabled by configuration for security. Enable it in contextwise.json with routing.enableAddServer: true.',\n },\n ],\n };\n }\n\n const rawName = String(args.name || '').trim();\n if (!rawName) {\n return {\n isError: true,\n content: [{ type: 'text', text: 'Error: Missing required parameter \"name\".' }],\n };\n }\n\n // Security Guard: Never resolve vault://, auth://, or env:// from LLM-supplied input\n const envObj = (args.env as Record<string, unknown>) || {};\n const paramsObj = (args.params as Record<string, unknown>) || {};\n const headersObj = (args.headers as Record<string, unknown>) || {};\n for (const [source, obj] of Object.entries({ env: envObj, params: paramsObj, headers: headersObj })) {\n for (const [key, val] of Object.entries(obj)) {\n if (\n typeof val === 'string' &&\n /(?:vault|auth|mcp-auth|env):\\/\\//.test(val)\n ) {\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: `Security violation: \"vault://\" and \"env://\" secret references cannot be passed via dynamic server addition (detected in ${source}.${key}).`,\n },\n ],\n };\n }\n }\n }\n\n // Auto-detect Smithery package if passed as name (e.g. @smithery/slack or smithery:package)\n let smitheryPackage = typeof args.smithery === 'string' ? args.smithery : undefined;\n if (!smitheryPackage && (rawName.startsWith('@smithery/') || rawName.startsWith('smithery:'))) {\n smitheryPackage = rawName.replace(/^smithery:/, '');\n }\n\n // Sanitize server name for valid MCP tool namespacing (alphanumeric, underscore, hyphen)\n const name = rawName.replace(/^@/, '').replace(/[^a-zA-Z0-9_-]/g, '_');\n\n let serverConfig: UpstreamServerConfig;\n\n const presetId = String(args.preset || name).toLowerCase();\n const knownPreset = KnownServerRegistry.find(presetId);\n\n // Check if a preset was specified or matches a known server\n if (knownPreset) {\n serverConfig = KnownServerRegistry.buildConfig(knownPreset, {\n args: Array.isArray(args.args) ? (args.args as string[]) : [],\n env: (args.env as Record<string, string>) || {},\n });\n } else if (smitheryPackage) {\n serverConfig = SmitheryClient.buildServerConfig(smitheryPackage, {\n env: (args.env as Record<string, string>) || {},\n });\n } else if (!routingConfig.allowCustomCommands) {\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: `Security restriction: Arbitrary commands and unverified URLs are restricted. Only verified presets and Smithery packages are permitted unless routing.allowCustomCommands is explicitly enabled in configuration.`,\n },\n ],\n };\n } else if (args.url && typeof args.url === 'string') {\n serverConfig = {\n url: args.url,\n headers: (args.headers as Record<string, string>) || {},\n transport: 'auto',\n autoReconnect: true,\n };\n } else if (args.command && typeof args.command === 'string') {\n serverConfig = {\n command: args.command,\n args: Array.isArray(args.args) ? (args.args as string[]) : [],\n env: (args.env as Record<string, string>) || {},\n autoRestart: true,\n };\n } else {\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: `Could not configure server \"${name}\". Please specify a known \"preset\" (e.g. \"postgres\", \"github\", \"sqlite\", \"fetch\") or a \"smithery\" package name.`,\n },\n ],\n };\n }\n\n logger.info(`Adding and hot-loading new upstream server \"${name}\"...`);\n\n try {\n // 1. Connect and test upstream\n await this.multiplexer.connectServer(name, serverConfig);\n\n const status = this.multiplexer.getStatus().find((s) => s.name === name);\n if (!status || status.status !== 'connected') {\n const errorDetail = status?.error || 'Unknown connection failure';\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: `Failed to connect to newly added upstream server \"${name}\": ${errorDetail}`,\n },\n ],\n };\n }\n\n // 2. Persist to contextwise.json only if confirmed/configured\n if (routingConfig.persistAddedServers) {\n ServerManager.saveUpstream(name, serverConfig);\n }\n\n // 3. Update active catalog\n const allTools = this.multiplexer.getAllTools();\n toolRegistry.setAllTools(allTools);\n\n // 4. Notify AI client of list changed (Mode 2)\n try {\n await this.server.sendToolListChanged();\n } catch (notifyErr) {\n logger.debug(`Client notification push: ${notifyErr}`);\n }\n\n // Collect names of tools from the new server\n const newTools = allTools\n .filter((t) => t.serverName === name)\n .map((t) => t.namespacedName);\n\n const persistMsg = routingConfig.persistAddedServers\n ? 'persisted to contextwise.json, '\n : 'loaded in session, ';\n\n return {\n content: [\n {\n type: 'text',\n text: `✓ Successfully added and connected upstream server \"${name}\"!\\n\\nDiscovered ${newTools.length} tools:\\n${newTools.map((t) => `• ${t}`).join('\\n')}\\n\\nThese tools are now indexed, ${persistMsg}and ready for immediate invocation in this session.`,\n },\n ],\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: `Error adding server \"${name}\": ${msg}`,\n },\n ],\n };\n }\n }\n\n /**\n * Handles contextwise_search_tools execution.\n */\n private async handleSearchToolsCall(\n args: Record<string, unknown>\n ): Promise<CallToolResult> {\n const query = String(args.query || '');\n const domain = args.domain ? String(args.domain) : undefined;\n const topK = typeof args.topK === 'number' ? args.topK : undefined;\n const activate = args.activate !== false;\n\n if (!query) {\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: 'Error: Missing required parameter \"query\".',\n },\n ],\n };\n }\n\n const searchResult = this.router.searchAndHydrate(query, domain, topK, activate);\n\n // If new tools were dynamically activated, notify client to re-read tools/list (Mode 2)\n if (searchResult.activatedNewTools) {\n try {\n await this.server.sendToolListChanged();\n logger.debug('Fired notifications/tools/list_changed notification to client.');\n } catch (err) {\n logger.debug(`Could not push list_changed notification: ${err}`);\n }\n }\n\n // Capability Gap Detection: If no matching tools exist in connected servers,\n // automatically recommend the best MCP servers to install from registries.\n if (searchResult.foundTools.length === 0) {\n logger.info(`No active tools found for \"${query}\". Checking registries for recommended servers...`);\n const rec = await ServerRecommender.recommendForTask(query, domain);\n if (rec.hasRecommendations) {\n return {\n content: [\n {\n type: 'text',\n text: rec.message,\n },\n ],\n };\n }\n }\n\n return {\n content: [\n {\n type: 'text',\n text: searchResult.message,\n },\n ],\n };\n }\n\n /**\n * Dispatches tool call through guardrails and upstream multiplexer.\n */\n private async dispatchProxiedToolCall(\n toolName: string,\n args: Record<string, unknown>\n ): Promise<CallToolResult> {\n const resolved = this.multiplexer.resolveTool(toolName);\n if (!resolved) {\n // Check if toolName references an uninstalled capability/server and recommend it\n const rec = await ServerRecommender.recommendForTask(toolName);\n const errorMsg = rec.hasRecommendations\n ? `Tool \"${toolName}\" was not found in ContextWise registry.\\n\\n${rec.message}`\n : `Tool \"${toolName}\" was not found in ContextWise registry. Use ${SEARCH_TOOLS_NAME} to find available tools.`;\n\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: errorMsg,\n },\n ],\n };\n }\n\n const { serverName, originalName, tool } = resolved;\n\n const redactResult = (result: CallToolResult): CallToolResult => {\n if (!result || !Array.isArray(result.content)) return result;\n return {\n ...result,\n content: result.content.map((item) => {\n if (item && item.type === 'text' && typeof item.text === 'string') {\n return {\n ...item,\n text: redactionFilter.redact(item.text),\n };\n }\n return item;\n }),\n };\n };\n\n // 1. Guardrail: Pre-flight JSONSchema Argument Validation\n // (Executed first so that type coercion applies before loop-breaker checks)\n if (tool.inputSchema) {\n const validation = argumentValidator.validate(\n toolName,\n tool.inputSchema,\n args\n );\n if (!validation.valid) {\n const errorMsg = `Pre-flight validation failed for \"${toolName}\":\\n${validation.errors?.join('\\n')}`;\n loopBreaker.recordCall(serverName, originalName, args, true);\n return {\n isError: true,\n content: [{ type: 'text', text: redactionFilter.redact(errorMsg) }],\n };\n }\n }\n\n // 2. Guardrail: Circuit Breaker & Velocity Check\n const preFlight = loopBreaker.checkPreFlightDetailed(serverName, originalName, args);\n if (!preFlight.allowed) {\n if (preFlight.reason === 'rate_limited') {\n metricsCollector.recordThrottle(toolName, serverName);\n } else {\n metricsCollector.recordLoopPrevented(toolName, serverName);\n }\n return {\n isError: true,\n content: [{ type: 'text', text: preFlight.message! }],\n };\n }\n\n // 3. Guardrail: Read-Only Cache Check\n const isReadOnly = tool.readOnlyHint || tool.idempotentHint;\n if (isReadOnly && this.config?.guardrails.enableCache !== false) {\n const cached = responseCache.get(serverName, originalName, args);\n if (cached) {\n toolRegistry.touchTool(toolName);\n metricsCollector.recordExecution({\n toolName,\n serverName,\n latencyMs: 1,\n cached: true,\n });\n return redactResult(cached);\n }\n }\n\n // 4. Upstream Execution\n try {\n const timeoutMs = this.config?.guardrails.callTimeoutMs ?? 30_000;\n const execution = await this.multiplexer.executeTool(toolName, args, timeoutMs);\n const isError = Boolean(execution.result.isError);\n\n // Record in loop breaker\n loopBreaker.recordCall(serverName, originalName, args, isError);\n\n if (!isError) {\n toolRegistry.touchTool(toolName);\n }\n\n // 5. Post-Execution Cache & Invalidation\n if (isError) {\n // Do not cache error responses\n } else if (isReadOnly && this.config?.guardrails.enableCache !== false) {\n responseCache.set(serverName, originalName, args, execution.result);\n } else {\n // Mutating / destructive call invalidates server cache\n responseCache.invalidateServer(serverName);\n }\n\n // Record metrics\n metricsCollector.recordExecution({\n toolName,\n serverName,\n latencyMs: execution.latencyMs,\n cached: false,\n isError,\n });\n\n return redactResult(execution.result);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n loopBreaker.recordCall(serverName, originalName, args, true);\n metricsCollector.recordExecution({\n toolName,\n serverName,\n latencyMs: 10,\n cached: false,\n isError: true,\n });\n\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: redactionFilter.redact(`Upstream error executing \"${toolName}\": ${msg}`),\n },\n ],\n };\n }\n }\n\n /**\n * Starts ContextWise proxy using given configuration.\n */\n async start(config: ContextWiseConfig): Promise<void> {\n this.config = config;\n this.isRunning = true;\n\n logger.setLevel(config.proxy.logLevel);\n logger.info('Starting ContextWise MCP Proxy Gateway...');\n\n // Apply router configuration\n this.router.updateConfig(config.routing);\n\n // Apply guardrails configuration\n responseCache.setTtlSeconds(config.guardrails.cacheTtlSeconds);\n loopBreaker.updateConfig({\n maxCallsPerMinute: config.guardrails.maxCallsPerMinute,\n consecutiveFailureThreshold: config.guardrails.loopBreakerThreshold,\n });\n\n // Connect to upstreams\n await this.multiplexer.connectAll(config.upstreams);\n\n // Sync catalog\n const allTools = this.multiplexer.getAllTools();\n toolRegistry.setAllTools(allTools);\n\n // Listen for upstream catalog updates\n this.multiplexer.on('toolsChanged', async (_serverName, updatedTools) => {\n toolRegistry.setAllTools(updatedTools);\n try {\n await this.server.sendToolListChanged();\n } catch (err) {\n logger.debug(`Notification push error: ${err}`);\n }\n });\n\n // Mode 4: Prime workspace context\n this.router.primeWorkspace(process.cwd());\n\n // Connect downstream transport (stdio default)\n this.transport = new StdioServerTransport();\n await this.server.connect(this.transport);\n\n logger.info('ContextWise MCP Proxy is running and ready for client connections.');\n }\n\n /**\n * Gracefully shuts down proxy and upstream connections.\n */\n async stop(): Promise<void> {\n if (!this.isRunning) return;\n this.isRunning = false;\n\n metricsCollector.flushSync();\n logger.info('Shutting down ContextWise proxy...');\n await this.multiplexer.closeAll();\n if (this.transport) {\n await this.transport.close();\n }\n await this.server.close();\n logger.info('ContextWise proxy stopped cleanly.');\n }\n\n getMultiplexer(): UpstreamMultiplexer {\n return this.multiplexer;\n }\n\n getRouter(): ContextRouter {\n return this.router;\n }\n}\n\nexport const proxy = new ContextWiseProxy();\n","import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { logger } from '../utils/logger.js';\nimport type {\n BillingPortalResult,\n CheckoutSessionResult,\n CloudAuthToken,\n CloudClientOptions,\n CloudProfileInfo,\n DeviceMetadata,\n SyncPullResult,\n SyncPushPayload,\n SyncPushResult,\n WorkspaceMetadata,\n} from './types.js';\n\nexport class ContextWiseCloudClient {\n private apiUrl: string;\n private storageDir: string;\n private allowOfflineSimulation: boolean;\n private token: CloudAuthToken | null = null;\n\n constructor(options: CloudClientOptions = {}) {\n this.apiUrl =\n options.apiUrl ||\n process.env.CONTEXTWISE_API_URL ||\n 'https://contextwise.dev';\n this.storageDir =\n options.storageDir ||\n process.env.CONTEXTWISE_STORAGE_DIR ||\n join(homedir(), '.contextwise');\n this.allowOfflineSimulation = options.allowOfflineSimulation ?? false;\n this.loadToken();\n }\n\n private getTokenPath(): string {\n return join(this.storageDir, 'auth.json');\n }\n\n private loadToken(): void {\n const tokenPath = this.getTokenPath();\n if (existsSync(tokenPath)) {\n try {\n const raw = readFileSync(tokenPath, 'utf-8');\n this.token = JSON.parse(raw) as CloudAuthToken;\n } catch {\n this.token = null;\n }\n }\n }\n\n saveToken(token: CloudAuthToken): void {\n if (!existsSync(this.storageDir)) {\n mkdirSync(this.storageDir, { recursive: true });\n }\n this.token = token;\n writeFileSync(this.getTokenPath(), JSON.stringify(token, null, 2), {\n mode: 0o600,\n encoding: 'utf-8',\n });\n }\n\n clearToken(): void {\n this.token = null;\n const tokenPath = this.getTokenPath();\n if (existsSync(tokenPath)) {\n try {\n unlinkSync(tokenPath);\n } catch {}\n }\n }\n\n getToken(): CloudAuthToken | null {\n if (!this.token) {\n this.loadToken();\n }\n return this.token;\n }\n\n isAuthenticated(): boolean {\n const token = this.getToken();\n if (!token) return false;\n return token.expiresAt > Date.now();\n }\n\n /**\n * Starts RFC 8628 device authorization flow.\n */\n async startDeviceFlow(): Promise<{\n device_code: string;\n user_code: string;\n verification_uri: string;\n expires_in: number;\n interval: number;\n }> {\n const res = await fetch(`${this.apiUrl}/v1/auth/device/code`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n });\n\n if (!res.ok) {\n throw new Error(`Failed to initiate device login: HTTP ${res.status}`);\n }\n\n return (await res.json()) as {\n device_code: string;\n user_code: string;\n verification_uri: string;\n expires_in: number;\n interval: number;\n };\n }\n\n /**\n * Polls device token until user approves the code in their browser.\n */\n async pollDeviceToken(\n deviceCode: string,\n intervalSeconds = 5,\n maxWaitMs = 15 * 60 * 1000\n ): Promise<CloudAuthToken> {\n const start = Date.now();\n const intervalMs = Math.max(intervalSeconds * 1000, 2000);\n\n while (Date.now() - start < maxWaitMs) {\n await new Promise((r) => setTimeout(r, intervalMs));\n\n try {\n const res = await fetch(`${this.apiUrl}/v1/auth/device/token`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ device_code: deviceCode }),\n });\n\n if (res.ok) {\n const data = (await res.json()) as {\n token: string;\n userId: string;\n email: string;\n expiresAt: number;\n };\n\n const authToken: CloudAuthToken = {\n token: data.token,\n userId: data.userId,\n email: data.email,\n expiresAt: data.expiresAt,\n };\n\n this.saveToken(authToken);\n return authToken;\n }\n\n if (res.status === 428) {\n // Authorization pending, continue polling\n continue;\n }\n\n const errData = (await res.json().catch(() => ({}))) as { message?: string };\n throw new Error(errData.message || `Device authorization failed: HTTP ${res.status}`);\n } catch (err) {\n if (err instanceof Error && err.message.includes('Device authorization failed')) {\n throw err;\n }\n }\n }\n\n throw new Error('Device authorization timed out. Please try logging in again.');\n }\n\n /**\n * Authenticates using a user API token or personal access key.\n */\n async loginWithKey(apiKey: string): Promise<CloudAuthToken> {\n const trimmed = apiKey.trim();\n if (!trimmed) {\n throw new Error('API key cannot be empty');\n }\n\n try {\n const res = await fetch(`${this.apiUrl}/v1/auth/verify`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${trimmed}`,\n },\n });\n\n if (!res.ok) {\n // If remote backend is not reachable or endpoint returns 401\n if (res.status === 401 || res.status === 403) {\n throw new Error('Invalid or expired ContextWise Cloud API key.');\n }\n throw new Error(`Cloud API returned HTTP ${res.status}: ${res.statusText}`);\n }\n\n const data = (await res.json()) as {\n userId: string;\n email: string;\n expiresAt: number;\n };\n\n const authToken: CloudAuthToken = {\n token: trimmed,\n userId: data.userId,\n email: data.email,\n expiresAt: data.expiresAt || Date.now() + 30 * 24 * 3600 * 1000,\n };\n\n this.saveToken(authToken);\n return authToken;\n } catch (err) {\n // In offline / staging test scenarios, provide fallback verification only if simulation is explicitly permitted\n if (this.allowOfflineSimulation && (trimmed.startsWith('cw_test_') || trimmed.startsWith('cw_live_'))) {\n const dummyToken: CloudAuthToken = {\n token: trimmed,\n userId: 'usr_dev_' + trimmed.slice(-6),\n email: 'developer@contextwise.dev',\n expiresAt: Date.now() + 30 * 24 * 3600 * 1000,\n };\n this.saveToken(dummyToken);\n return dummyToken;\n }\n throw err;\n }\n }\n\n /**\n * Retrieves profile information for current authenticated account.\n */\n async whoami(): Promise<CloudProfileInfo> {\n const token = this.getToken();\n if (!token) {\n throw new Error('Not logged in. Run \"contextwise login\" first.');\n }\n\n try {\n const res = await fetch(`${this.apiUrl}/v1/user/profile`, {\n headers: { Authorization: `Bearer ${token.token}` },\n });\n\n if (res.ok) {\n return (await res.json()) as CloudProfileInfo;\n }\n if (!this.allowOfflineSimulation) {\n throw new Error(`Failed to fetch profile: HTTP ${res.status} ${res.statusText}`);\n }\n } catch (err) {\n if (!this.allowOfflineSimulation) {\n throw err;\n }\n }\n\n return {\n userId: token.userId,\n email: token.email,\n plan: 'free',\n subscriptionStatus: 'inactive',\n currentPeriodEnd: null,\n workspaces: [\n {\n id: 'ws_default',\n name: 'Personal Workspace',\n role: 'owner',\n activeRevision: 1,\n updatedAt: Date.now(),\n },\n ],\n devices: [],\n };\n }\n\n /**\n * Initiates Stripe Checkout session for Pro or Team upgrade.\n */\n async createCheckoutSession(\n plan: 'pro' | 'team' = 'pro',\n interval: 'month' | 'year' = 'month'\n ): Promise<CheckoutSessionResult> {\n const token = this.getToken();\n if (!token) {\n throw new Error('Not logged in. Run \"contextwise login\" first.');\n }\n\n const res = await fetch(`${this.apiUrl}/v1/billing/checkout`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token.token}`,\n },\n body: JSON.stringify({ plan, interval }),\n });\n\n if (!res.ok) {\n const errData = (await res.json().catch(() => ({}))) as { message?: string };\n throw new Error(errData.message || `Failed to create checkout session: HTTP ${res.status}`);\n }\n\n return (await res.json()) as CheckoutSessionResult;\n }\n\n /**\n * Generates Stripe Customer Portal session to manage subscription and invoices.\n */\n async createPortalSession(): Promise<BillingPortalResult> {\n const token = this.getToken();\n if (!token) {\n throw new Error('Not logged in. Run \"contextwise login\" first.');\n }\n\n const res = await fetch(`${this.apiUrl}/v1/billing/portal`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token.token}`,\n },\n });\n\n if (!res.ok) {\n const errData = (await res.json().catch(() => ({}))) as { message?: string };\n throw new Error(errData.message || `Failed to open billing portal: HTTP ${res.status}`);\n }\n\n return (await res.json()) as BillingPortalResult;\n }\n\n /**\n * Pushes a workspace snapshot (config + encrypted vault) to the Cloudflare Workers / D1 backend.\n */\n async pushSync(payload: SyncPushPayload): Promise<SyncPushResult> {\n const token = this.getToken();\n if (!token) {\n throw new Error('Not logged in. Run \"contextwise login\" first.');\n }\n\n try {\n const res = await fetch(`${this.apiUrl}/v1/sync/push`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token.token}`,\n },\n body: JSON.stringify(payload),\n });\n\n if (res.ok) {\n return (await res.json()) as SyncPushResult;\n }\n\n if (res.status === 402) {\n const payData = (await res.json().catch(() => ({}))) as {\n error?: string;\n message?: string;\n upgradeUrl?: string;\n };\n throw new Error(\n `${payData.message || 'Cloud Sync requires an upgraded subscription.'}\\nUpgrade at: ${payData.upgradeUrl || 'https://contextwise.dev/#pricing'}`\n );\n }\n\n if (res.status === 409) {\n // Conflict detected\n const conflictData = (await res.json()) as SyncPushResult;\n return {\n status: 'conflict',\n revision: payload.baseRevision,\n serverRevision: conflictData.serverRevision,\n serverPayload: conflictData.serverPayload,\n };\n }\n\n throw new Error(`Push sync failed: HTTP ${res.status} ${res.statusText}`);\n } catch (err) {\n // If plan upgrade is required, rethrow error to user\n if (\n err instanceof Error &&\n (err.message.includes('requires an upgraded subscription') ||\n err.message.includes('Cloud Sync requires'))\n ) {\n throw err;\n }\n\n // Offline / simulation fallback only when explicitly enabled\n if (this.allowOfflineSimulation) {\n logger.debug(`Cloud API push endpoint unreachable (${err}). Using local snapshot commit.`);\n return {\n status: 'committed',\n revision: payload.baseRevision + 1,\n };\n }\n\n throw err;\n }\n }\n\n /**\n * Pulls the latest workspace snapshot (config + encrypted vault) from the cloud backend.\n */\n async pullSync(\n workspaceId: string,\n sinceRevision: number = 0\n ): Promise<SyncPullResult | null> {\n const token = this.getToken();\n if (!token) {\n throw new Error('Not logged in. Run \"contextwise login\" first.');\n }\n\n try {\n const res = await fetch(\n `${this.apiUrl}/v1/sync/pull?workspaceId=${encodeURIComponent(\n workspaceId\n )}&since=${sinceRevision}`,\n {\n headers: { Authorization: `Bearer ${token.token}` },\n }\n );\n\n if (res.ok) {\n return (await res.json()) as SyncPullResult;\n }\n if (res.status === 304) {\n return null; // Already up to date\n }\n } catch (err) {\n logger.debug(`Cloud API pull endpoint unreachable: ${err}`);\n }\n\n return null;\n }\n}\n\nexport const cloudClient = new ContextWiseCloudClient();\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { randomBytes } from 'node:crypto';\nimport {\n decryptAesGcm,\n deriveSharedSecretX25519,\n encryptAesGcm,\n generateKeyPairX25519,\n} from '../vault/crypto.js';\nimport type { EncryptedEnvelope } from './types.js';\n\nexport interface DeviceIdentity {\n deviceId: string;\n publicKey: string;\n privateKey: string;\n}\n\n/**\n * Creates an asymmetric public-key envelope (X25519 ECDH + AES-256-GCM)\n * encrypting a workspace key specifically for a recipient's device public key.\n */\nexport function createEnvelope(\n workspaceKey: Buffer,\n recipientPublicKeyPem: string\n): EncryptedEnvelope {\n // Generate a one-time ephemeral keypair\n const ephemeral = generateKeyPairX25519();\n\n // Derive shared ECDH symmetric secret\n const sharedKey = deriveSharedSecretX25519(ephemeral.privateKey, recipientPublicKeyPem);\n\n // Encrypt the workspace symmetric key using AES-256-GCM\n const { iv, authTag, ciphertext } = encryptAesGcm(\n workspaceKey.toString('base64'),\n sharedKey\n );\n\n return {\n recipientPublicKey: recipientPublicKeyPem,\n ephemeralPublicKey: ephemeral.publicKey,\n iv,\n authTag,\n ciphertext,\n };\n}\n\n/**\n * Opens an asymmetric envelope using the recipient's private key.\n */\nexport function openEnvelope(\n envelope: EncryptedEnvelope,\n recipientPrivateKeyPem: string\n): Buffer {\n const sharedKey = deriveSharedSecretX25519(\n recipientPrivateKeyPem,\n envelope.ephemeralPublicKey\n );\n\n const decryptedBase64 = decryptAesGcm(\n envelope.ciphertext,\n sharedKey,\n envelope.iv,\n envelope.authTag\n );\n\n return Buffer.from(decryptedBase64, 'base64');\n}\n\n/**\n * Retrieves or generates the local device identity and asymmetric X25519 keypair.\n */\nexport function getOrCreateDeviceIdentity(storageDir?: string): DeviceIdentity {\n const dir =\n storageDir ||\n process.env.CONTEXTWISE_STORAGE_DIR ||\n join(homedir(), '.contextwise');\n const filePath = join(dir, 'device.json');\n\n if (existsSync(filePath)) {\n try {\n const data = JSON.parse(readFileSync(filePath, 'utf-8'));\n if (data.deviceId && data.publicKey && data.privateKey) {\n return data as DeviceIdentity;\n }\n } catch {\n // Fall through to regenerate if file is corrupt\n }\n }\n\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n const { publicKey, privateKey } = generateKeyPairX25519();\n const deviceId = `cw_dev_${randomBytes(8).toString('hex')}`;\n\n const identity: DeviceIdentity = {\n deviceId,\n publicKey,\n privateKey,\n };\n\n writeFileSync(filePath, JSON.stringify(identity, null, 2), {\n mode: 0o600,\n encoding: 'utf-8',\n });\n\n return identity;\n}\n","import { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { ConfigLoader } from '../config/loader.js';\nimport {\n ContextWiseConfig,\n ContextWiseConfigSchema,\n isStdioUpstream,\n} from '../config/schema.js';\nimport { logger } from '../utils/logger.js';\nimport { getDefaultVaultFilePath } from '../vault/file_driver.js';\nimport type { EncryptedVaultPayload } from '../vault/types.js';\nimport { cloudClient } from './client.js';\nimport { getOrCreateDeviceIdentity } from './crypto.js';\nimport type { SyncPullResult, SyncPushPayload, SyncPushResult } from './types.js';\n\ninterface LocalSyncState {\n workspaceId: string;\n revision: number;\n lastSyncedAt: number;\n}\n\nexport class SyncManager {\n private syncStatePath: string;\n private localConfigPath?: string;\n\n constructor(storageDir?: string, localConfigPath?: string) {\n const dir =\n storageDir ||\n process.env.CONTEXTWISE_STORAGE_DIR ||\n join(homedir(), '.contextwise');\n this.syncStatePath = join(dir, 'sync.json');\n this.localConfigPath = localConfigPath;\n }\n\n private loadSyncState(): LocalSyncState {\n if (existsSync(this.syncStatePath)) {\n try {\n const raw = readFileSync(this.syncStatePath, 'utf-8');\n return JSON.parse(raw) as LocalSyncState;\n } catch {\n // Corrupt file fallback\n }\n }\n return {\n workspaceId: 'ws_default',\n revision: 0,\n lastSyncedAt: 0,\n };\n }\n\n private saveSyncState(state: LocalSyncState): void {\n writeFileSync(this.syncStatePath, JSON.stringify(state, null, 2), {\n mode: 0o600,\n encoding: 'utf-8',\n });\n }\n\n /**\n * Pushes local configuration and encrypted vault payload to the cloud.\n */\n async push(workspaceId?: string): Promise<SyncPushResult> {\n const state = this.loadSyncState();\n const wsId = workspaceId || state.workspaceId;\n const device = getOrCreateDeviceIdentity();\n const localConfig = ConfigLoader.load();\n\n const vaultPath = getDefaultVaultFilePath();\n let encryptedVault: EncryptedVaultPayload;\n\n if (existsSync(vaultPath)) {\n try {\n const rawVault = readFileSync(vaultPath, 'utf-8');\n encryptedVault = JSON.parse(rawVault) as EncryptedVaultPayload;\n } catch {\n encryptedVault = this.createEmptyEncryptedVault();\n }\n } else {\n encryptedVault = this.createEmptyEncryptedVault();\n }\n\n const payload: SyncPushPayload = {\n workspaceId: wsId,\n deviceId: device.deviceId,\n baseRevision: state.revision,\n config: localConfig,\n encryptedVault,\n timestamp: Date.now(),\n };\n\n const result = await cloudClient.pushSync(payload);\n\n if (result.status === 'committed') {\n state.workspaceId = wsId;\n state.revision = result.revision;\n state.lastSyncedAt = Date.now();\n this.saveSyncState(state);\n logger.info(`Successfully pushed revision #${result.revision} to ContextWise Cloud.`);\n }\n\n return result;\n }\n\n /**\n * Pulls the latest cloud configuration and merges upstream servers.\n */\n async pull(workspaceId?: string): Promise<SyncPullResult | null> {\n const state = this.loadSyncState();\n const wsId = workspaceId || state.workspaceId;\n\n const pullResult = await cloudClient.pullSync(wsId, state.revision);\n if (!pullResult) {\n logger.info('Local configuration is already up to date.');\n return null;\n }\n\n // Merge upstreams into local contextwise.json if present\n if (pullResult.config && pullResult.config.upstreams) {\n this.mergeConfigIntoLocal(pullResult.config);\n }\n\n // Update encrypted vault if newer\n if (pullResult.encryptedVault && pullResult.encryptedVault.data) {\n const vaultPath = getDefaultVaultFilePath();\n writeFileSync(vaultPath, JSON.stringify(pullResult.encryptedVault, null, 2), {\n mode: 0o600,\n encoding: 'utf-8',\n });\n }\n\n state.revision = pullResult.revision;\n state.lastSyncedAt = Date.now();\n this.saveSyncState(state);\n\n logger.info(`Pulled and applied cloud revision #${pullResult.revision}.`);\n return pullResult;\n }\n\n /**\n * Semantically merges remote configuration into local contextwise.json.\n */\n private mergeConfigIntoLocal(remoteConfig: ContextWiseConfig): void {\n const validatedRemote = ContextWiseConfigSchema.parse(remoteConfig);\n const configPath =\n this.localConfigPath ||\n process.env.CONTEXTWISE_CONFIG ||\n join(process.cwd(), 'contextwise.json');\n let localConfig: ContextWiseConfig;\n\n if (existsSync(configPath)) {\n try {\n localConfig = ContextWiseConfigSchema.parse(JSON.parse(readFileSync(configPath, 'utf-8')));\n } catch {\n localConfig = ContextWiseConfigSchema.parse({});\n }\n } else {\n localConfig = ContextWiseConfigSchema.parse({});\n }\n\n // Security Guard: Check for new stdio commands from remote\n for (const [name, s] of Object.entries(validatedRemote.upstreams || {})) {\n if (isStdioUpstream(s) && !localConfig.upstreams[name]) {\n logger.warn(\n `[Cloud Sync Security] Remote configuration contains new stdio upstream \"${name}\" (${s.command}). ` +\n `Verify this server in contextwise.json before execution.`\n );\n }\n }\n\n // Merge upstreams: preserve local ones, add new remote ones\n const mergedUpstreams = {\n ...(validatedRemote.upstreams || {}),\n ...(localConfig.upstreams || {}),\n };\n\n const merged: ContextWiseConfig = {\n ...localConfig,\n upstreams: mergedUpstreams,\n };\n\n writeFileSync(configPath, JSON.stringify(merged, null, 2), 'utf-8');\n }\n\n private createEmptyEncryptedVault(): EncryptedVaultPayload {\n return {\n version: 1,\n kdf: {\n algorithm: 'pbkdf2-sha512',\n salt: 'empty',\n iterations: 50_000,\n },\n cipher: 'aes-256-gcm',\n iv: '',\n authTag: '',\n data: '',\n };\n }\n\n getStatus(): {\n isLoggedIn: boolean;\n userEmail?: string;\n workspaceId: string;\n revision: number;\n lastSyncedAt: number;\n deviceId: string;\n } {\n const token = cloudClient.getToken();\n const state = this.loadSyncState();\n const device = getOrCreateDeviceIdentity();\n\n return {\n isLoggedIn: cloudClient.isAuthenticated(),\n userEmail: token?.email,\n workspaceId: state.workspaceId,\n revision: state.revision,\n lastSyncedAt: state.lastSyncedAt,\n deviceId: device.deviceId,\n };\n }\n}\n\nexport const syncManager = new SyncManager();\n"],"mappings":"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","names":["platform","existsSync","readFileSync","homedir","join","resolve","existsSync","mkdirSync","readFileSync","writeFileSync","homedir","dirname","join","join","homedir","existsSync","readFileSync","dirname","mkdirSync","writeFileSync","platform","platform","existsSync","readFileSync","homedir","join","join","homedir","existsSync","readFileSync","createHash","createHash","createHash","existsSync","mkdirSync","readFileSync","renameSync","writeFileSync","homedir","dirname","join","join","homedir","existsSync","readFileSync","dirname","mkdirSync","writeFileSync","renameSync","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","resolve","resolve","existsSync","readFileSync","dirname","mkdirSync","writeFileSync","existsSync","resolve","existsSync","resolve","existsSync","mkdirSync","readFileSync","unlinkSync","writeFileSync","homedir","join","join","homedir","existsSync","readFileSync","mkdirSync","writeFileSync","unlinkSync","existsSync","mkdirSync","readFileSync","writeFileSync","homedir","join","randomBytes","join","homedir","existsSync","readFileSync","mkdirSync","randomBytes","writeFileSync","existsSync","readFileSync","writeFileSync","homedir","join","join","homedir","existsSync","readFileSync","writeFileSync"]}