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.
- package/README.md +64 -0
- package/dist/{chunk-P7JW7EPW.js → chunk-5ZMX5TEM.js} +395 -1190
- package/dist/chunk-5ZMX5TEM.js.map +1 -0
- package/dist/chunk-OYCA37PJ.js +710 -0
- package/dist/chunk-OYCA37PJ.js.map +1 -0
- package/dist/chunk-WP7RH2Z2.js +417 -0
- package/dist/chunk-WP7RH2Z2.js.map +1 -0
- package/dist/cli.js +26 -89
- package/dist/cli.js.map +1 -1
- package/dist/client-3GQWPGI3.js +9 -0
- package/dist/client-3GQWPGI3.js.map +1 -0
- package/dist/index.d.ts +56 -24
- package/dist/index.js +49 -31
- package/dist/sync_manager-2WYXXGCN.js +10 -0
- package/dist/sync_manager-2WYXXGCN.js.map +1 -0
- package/package.json +2 -1
- package/dist/chunk-P7JW7EPW.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/supervisor.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"],"sourcesContent":["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 { 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';\nexport const CLOUD_PUSH_NAME = 'contextwise_cloud_push';\nexport const CLOUD_PULL_NAME = 'contextwise_cloud_pull';\nexport const SYNC_STATUS_NAME = 'contextwise_sync_status';\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\nexport const CLOUD_PUSH_DEFINITION: Tool = {\n name: CLOUD_PUSH_NAME,\n description:\n 'Pushes the host ContextWise workspace snapshot (config + encrypted vault) to ContextWise Cloud. Usage-metered via MCPaid.',\n inputSchema: {\n type: 'object',\n properties: {\n workspaceId: {\n type: 'string',\n description: 'Optional workspace ID (defaults to the active workspace)',\n },\n },\n },\n};\n\nexport const CLOUD_PULL_DEFINITION: Tool = {\n name: CLOUD_PULL_NAME,\n description:\n 'Pulls and applies the latest ContextWise Cloud workspace revision to the host. Usage-metered via MCPaid.',\n inputSchema: {\n type: 'object',\n properties: {\n workspaceId: {\n type: 'string',\n description: 'Optional workspace ID (defaults to the active workspace)',\n },\n },\n },\n};\n\nexport const SYNC_STATUS_DEFINITION: Tool = {\n name: SYNC_STATUS_NAME,\n description:\n 'Reports ContextWise Cloud sync status for the host instance (login state, workspace, local revision). Always free.',\n inputSchema: {\n type: 'object',\n properties: {},\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 CLOUD_PULL_DEFINITION,\n CLOUD_PUSH_DEFINITION,\n EXECUTE_TOOL_DEFINITION,\n SEARCH_TOOLS_DEFINITION,\n SYNC_STATUS_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 enableCloudSync: config.enableCloudSync ?? true,\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 // Metered cloud-sync tools (monetized via MCPaid on hosted gateways)\n if (this.config.enableCloudSync) {\n metaTools.push(CLOUD_PUSH_DEFINITION, CLOUD_PULL_DEFINITION, SYNC_STATUS_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 CLOUD_PULL_NAME,\n CLOUD_PUSH_NAME,\n EXECUTE_TOOL_NAME,\n SEARCH_TOOLS_NAME,\n SYNC_STATUS_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 { AsyncLocalStorage } from 'node:async_hooks';\nimport { parseAndVerifyEdgeReceipt, MemoryReceiptStore } from '@mcpaid/sdk';\nimport { redactionFilter } from '../vault/redaction.js';\n\nexport const requestContext = new AsyncLocalStorage<{ receipt?: string }>();\n\nexport class ContextWiseProxy {\n private server: Server;\n private multiplexer: UpstreamMultiplexer;\n private router: ContextRouter;\n private transport?: StdioServerTransport;\n private httpServers: import('node:http').Server[] = [];\n private httpTransports: any[] = [];\n private config?: ContextWiseConfig;\n private isRunning: boolean = false;\n // Single-use receipt registry: bounded (FIFO cap) with expired-first eviction.\n private claimedReceiptNonces = new MemoryReceiptStore();\n\n constructor() {\n this.server = this.createSessionServer();\n\n this.multiplexer = new UpstreamMultiplexer();\n this.router = contextRouter;\n }\n\n /**\n * Builds a Session-scoped MCP Server whose handlers delegate to the shared\n * engine (router, multiplexer, cloud clients). One instance per HTTP\n * session — the MCP SDK binds a Server to a single transport, and sharing\n * one Server across sessions breaks repeat handshakes.\n */\n private createSessionServer(): Server {\n const 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.setupRequestHandlers(server);\n return server;\n }\n\n private setupRequestHandlers(server?: Server): void {\n const target = server ?? this.server;\n // 1. tools/list handler\n target.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 target.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 receipt?: string\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 // F. Handle metered cloud-sync meta-tools (monetized via MCPaid on hosted gateways)\n if (name === CLOUD_PUSH_NAME) {\n return this.handleCloudPushCall(args, receipt);\n }\n if (name === CLOUD_PULL_NAME) {\n return this.handleCloudPullCall(args, receipt);\n }\n if (name === SYNC_STATUS_NAME) {\n return this.handleSyncStatusCall();\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 * Handles metered cloud-sync meta-tool calls. These operate on the host\n * instance's workspace via its stored ContextWise Cloud session.\n */\n private async handleCloudPushCall(args: Record<string, unknown>, receipt?: string): Promise<CallToolResult> {\n const { syncManager } = await import('../cloud/sync_manager.js');\n const { cloudClient } = await import('../cloud/client.js');\n if (!cloudClient.isAuthenticated()) {\n return {\n isError: true,\n content: [{ type: 'text', text: 'Error: Host instance is not logged in to ContextWise Cloud. Run \"contextwise login\" on the host.' }],\n };\n }\n try {\n const workspaceId = typeof args.workspaceId === 'string' ? args.workspaceId : undefined;\n const effectiveReceipt = receipt || requestContext.getStore()?.receipt;\n const res = await syncManager.push(workspaceId, effectiveReceipt);\n if (res.status === 'committed') {\n return { content: [{ type: 'text', text: `Cloud sync push committed as revision #${res.revision}.` }] };\n }\n return {\n isError: true,\n content: [{ type: 'text', text: `Push conflict: server has revision #${res.serverRevision}. Pull first, then retry.` }],\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { isError: true, content: [{ type: 'text', text: redactionFilter.redact(`Cloud push failed: ${msg}`) }] };\n }\n }\n\n private async handleCloudPullCall(args: Record<string, unknown>, receipt?: string): Promise<CallToolResult> {\n const { syncManager } = await import('../cloud/sync_manager.js');\n const { cloudClient } = await import('../cloud/client.js');\n if (!cloudClient.isAuthenticated()) {\n return {\n isError: true,\n content: [{ type: 'text', text: 'Error: Host instance is not logged in to ContextWise Cloud. Run \"contextwise login\" on the host.' }],\n };\n }\n try {\n const workspaceId = typeof args.workspaceId === 'string' ? args.workspaceId : undefined;\n const effectiveReceipt = receipt || requestContext.getStore()?.receipt;\n const res = await syncManager.pull(workspaceId, effectiveReceipt);\n if (res) {\n return { content: [{ type: 'text', text: `Applied cloud revision #${res.revision} to host workspace.` }] };\n }\n return { content: [{ type: 'text', text: 'Host workspace is already up to date.' }] };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { isError: true, content: [{ type: 'text', text: redactionFilter.redact(`Cloud pull failed: ${msg}`) }] };\n }\n }\n\n private async handleSyncStatusCall(): Promise<CallToolResult> {\n const { syncManager } = await import('../cloud/sync_manager.js');\n const status = syncManager.getStatus();\n const lines = [\n `Logged in: ${status.isLoggedIn ? 'yes' : 'no'}`,\n `Workspace: ${status.workspaceId}`,\n `Local revision: ${status.revision}`,\n `Last synced: ${status.lastSyncedAt > 0 ? new Date(status.lastSyncedAt).toISOString() : 'never'}`,\n ];\n return { content: [{ type: 'text', text: lines.join('\\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 * Shared boot: config, guardrails, upstreams, catalog. Transport-agnostic.\n */\n private async boot(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\n /**\n * Starts ContextWise proxy over stdio (default: local AI clients).\n */\n async start(config: ContextWiseConfig): Promise<void> {\n await this.boot(config);\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 * Starts ContextWise proxy over Streamable HTTP (for MCPaid edge publishing\n * via `mcpaid publish`, or any remote MCP client). Stateless: each request\n * gets its own transport, so no session affinity is required.\n */\n async startHttp(config: ContextWiseConfig, options: { port?: number; path?: string } = {}): Promise<import('node:http').Server> {\n const { createServer } = await import('node:http');\n let StreamableHTTPServerTransport: any;\n try {\n ({ StreamableHTTPServerTransport } = await import(\n '@modelcontextprotocol/sdk/server/streamableHttp.js'\n ));\n } catch {\n throw new Error(\n 'HTTP transport requires @modelcontextprotocol/sdk with Streamable HTTP support. Run: npm install @modelcontextprotocol/sdk@latest'\n );\n }\n\n await this.boot(config);\n\n const port = options.port ?? 3000;\n const mcpPath = options.path ?? '/mcp';\n\n // One transport + one Server per client session (the SDK binds a Server\n // to a single transport; sharing either across sessions breaks repeat\n // handshakes). Follows the SDK's stateful example: transports are keyed\n // by Mcp-Session-Id and torn down on close.\n // NOTE: @modelcontextprotocol/sdk >= 1.30 defaults to single-use\n // stateless mode (sessionIdGenerator undefined) which throws\n // \"Stateless transport cannot be reused\" (surfaced as empty 500s) —\n // hence the explicit generator on every transport.\n const { randomUUID } = await import('node:crypto');\n const { isInitializeRequest } = await import('@modelcontextprotocol/sdk/types.js');\n const httpSessions = new Map<string, { transport: any; server: Server }>();\n this.httpTransports.push(httpSessions);\n\n const httpServer = createServer(async (req, res) => {\n try {\n const url = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);\n if (url.pathname !== mcpPath) {\n res.writeHead(404, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'not_found', message: `Expected POST ${mcpPath}` }));\n return;\n }\n if (req.method !== 'POST' && req.method !== 'GET' && req.method !== 'DELETE') {\n res.writeHead(405, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'method_not_allowed' }));\n return;\n }\n\n let body: unknown;\n if (req.method === 'POST') {\n const chunks: Buffer[] = [];\n for await (const chunk of req) chunks.push(chunk as Buffer);\n try {\n body = JSON.parse(Buffer.concat(chunks).toString('utf-8'));\n } catch {\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'invalid_json' }));\n return;\n }\n }\n\n // Headers.get semantics: Node lowercases incoming names; the receipt\n // arrives as 'x-mcpaid-receipt'. (The legacy 'x-sync-payment' alias\n // is intentionally NOT accepted here — nothing sends it anymore and\n // an operator-JSON blob must never be mistaken for a receipt.)\n const rawReceipt = req.headers['x-mcpaid-receipt'];\n const receiptHeader = Array.isArray(rawReceipt) ? rawReceipt[0] : (rawReceipt as string | undefined);\n\n // Verify Edge Receipt on priced tools if MCPAID_RECEIPT_SECRET is set\n const receiptSecret = (process.env.MCPAID_RECEIPT_SECRET || '').trim();\n const previousReceiptSecret = (process.env.MCPAID_PREVIOUS_RECEIPT_SECRET || '').trim();\n\n if (receiptSecret && body && typeof body === 'object') {\n const rpcRequests = Array.isArray(body) ? body : [body];\n for (const rpc of rpcRequests) {\n if (rpc && typeof rpc === 'object' && rpc.method === 'tools/call' && rpc.params?.name) {\n const toolName = String(rpc.params.name);\n if (toolName === CLOUD_PUSH_NAME || toolName === CLOUD_PULL_NAME) {\n const minAmountMicro = toolName === CLOUD_PUSH_NAME ? 10_000n : 5_000n;\n const verifyResult = await parseAndVerifyEdgeReceipt(\n {\n secret: receiptSecret,\n previousSecret: previousReceiptSecret || undefined,\n store: this.claimedReceiptNonces,\n },\n {\n receipt: receiptHeader,\n expectedServer: 'contextwise',\n expectedTool: toolName,\n minAmountMicro,\n }\n );\n\n if (!verifyResult.valid) {\n logger.warn(`Rejected unverified tool call [${toolName}]: ${verifyResult.error}`);\n res.writeHead(402, { 'Content-Type': 'application/json' });\n res.end(\n JSON.stringify({\n jsonrpc: '2.0',\n id: rpc.id ?? null,\n error: {\n code: -32002,\n message: `Payment Required: ${verifyResult.error}`,\n },\n })\n );\n return;\n }\n }\n }\n }\n }\n\n // Route to the session's transport, or create a session on initialize.\n // Edge-gateway origin (X-MCPaid-Gateway: true) is session-less by\n // design — the edge never issues session ids — so each of its\n // requests gets a fresh single-use transport+server (the SDK's\n // stateless pattern). Direct clients use stateful sessions below.\n const isGatewayOrigin = req.headers['x-mcpaid-gateway'] === 'true';\n const rawSession = req.headers['mcp-session-id'];\n const sessionId = Array.isArray(rawSession) ? rawSession[0] : rawSession;\n let session = (sessionId && httpSessions.get(sessionId)) || undefined;\n\n if (!session && isGatewayOrigin && req.method === 'POST') {\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: undefined,\n });\n const server = this.createSessionServer();\n session = { transport, server };\n await server.connect(transport);\n try {\n await requestContext.run({ receipt: receiptHeader }, async () => {\n await session!.transport.handleRequest(req as any, res as any, body);\n });\n } finally {\n try {\n await transport.close();\n } catch {}\n try {\n await server.close();\n } catch {}\n }\n return;\n }\n\n if (!session) {\n if (req.method === 'POST' && body && typeof body === 'object' && isInitializeRequest(body)) {\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n onsessioninitialized: (sid: string) => {\n httpSessions.set(sid, session!);\n },\n });\n const server = this.createSessionServer();\n session = { transport, server };\n transport.onclose = () => {\n const sid = transport.sessionId;\n if (sid && httpSessions.get(sid)?.transport === transport) {\n httpSessions.delete(sid);\n }\n };\n await server.connect(transport);\n } else {\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(\n JSON.stringify({\n jsonrpc: '2.0',\n id: null,\n error: { code: -32000, message: 'Bad Request: No valid session ID provided' },\n })\n );\n return;\n }\n }\n\n await requestContext.run({ receipt: receiptHeader }, async () => {\n await session!.transport.handleRequest(req as any, res as any, body);\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logger.error(`HTTP transport error: ${msg}`);\n if (!res.headersSent) {\n res.writeHead(500, { 'Content-Type': 'application/json' });\n }\n try {\n res.end(JSON.stringify({ error: 'internal_error', message: msg }));\n } catch {}\n }\n });\n\n await new Promise<void>((resolve) => httpServer.listen(port, '127.0.0.1', resolve));\n this.httpServers.push(httpServer);\n logger.info(`ContextWise MCP Proxy listening on http://127.0.0.1:${port}${mcpPath} (Streamable HTTP).`);\n\n return httpServer;\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 for (const srv of this.httpServers) {\n await new Promise<void>((resolve) => srv.close(() => resolve()));\n }\n this.httpServers = [];\n for (const t of this.httpTransports) {\n // startHttp pushes per-session Maps; close every session transport.\n if (t instanceof Map) {\n for (const { transport } of t.values()) {\n await transport.close().catch(() => {});\n }\n } else {\n await t.close().catch(() => {});\n }\n }\n this.httpTransports = [];\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"],"mappings":"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","names":["createHash","existsSync","readFileSync","homedir","join","join","homedir","existsSync","readFileSync","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","existsSync","readFileSync","dirname","mkdirSync","writeFileSync","existsSync","resolve","existsSync","resolve","resolve"]}
|