@vibecheckai/mcp-server 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../shared-config/src/schema.ts","../../shared-config/src/redaction.ts","../../shared-config/src/loader.ts","../../shared-config/src/index.ts","../../core/dist/chunk-DGUM43GV.js","../../core/src/prompt/templates/registry.ts","../../core/src/prompt/prompt-builder.ts","../../core/src/prompt/context-injector.ts","../../core/src/prompt/quality-analyzer.ts","../../core/src/prompt/task-planner.ts","../../core/src/prompt/prompt-verifier.ts","../../core/src/prompt/templates/code-generation.ts","../../core/src/prompt/templates/code-review.ts","../../core/src/prompt/templates/explanation.ts","../../core/src/prompt/templates/types.ts","../../core/dist/prompt/index.js","../src/transport/index.ts","../../core/src/utils/cache.ts","../../core/src/utils/errors.ts","../../core/src/utils/logger.ts","../../core/src/utils/performance.ts","../../core/src/truthpack/scanners/route-scanner.ts","../../core/src/truthpack/scanners/env-scanner.ts","../../core/src/truthpack/scanners/auth-scanner.ts","../../core/src/truthpack/scanners/contract-scanner.ts","../../core/src/truthpack/generator.ts","../../core/src/truthpack/validators.ts","../../core/src/truthpack/schemas/routes.schema.ts","../../core/src/truthpack/schemas/env.schema.ts","../../core/src/truthpack/schemas/auth.schema.ts","../../core/src/truthpack/schemas/contracts.schema.ts","../../core/src/truthpack/schemas/ui-graph.schema.ts","../../core/dist/truthpack/index.js","../src/tools/truthpack-tools.ts","../src/ui/styles.ts","../src/ui/response-builder.ts","../src/ui/text-formatters.ts","../src/ui/unified-response.ts","../src/tools/context-tools.ts","../../core/src/utils/deterministic-ids.ts","../../core/src/utils/validation.ts","../../core/src/utils/retry.ts","../../core/src/firewall/intent-validator.ts","../../core/src/firewall/claim-extractor.ts","../../core/src/firewall/evidence-resolver.ts","../../core/src/firewall/policy-engine.ts","../../core/src/firewall/unblock-planner.ts","../../core/src/firewall/agent-firewall.ts","../../core/src/firewall/intent-store.ts","../../core/dist/firewall/index.js","../src/tools/firewall-tools.ts","../src/tools/validation-tools.ts","../src/tools/registration-tools.ts","../src/tools/intent-tools.ts","../src/tools/prompt-tools.ts","../src/tools/forge-tools.ts","../../core/src/agent-runtime/types.ts","../src/tools/agent-runtime-tools.ts","../src/middleware/intent-middleware.ts","../src/middleware/tracing-middleware.ts","../src/hooks/pre-generation-hook.ts","../src/hooks/post-generation-hook.ts","../src/hooks/file-write-hook.ts","../src/server.ts","../src/index.ts"],"names":["path","__filename","DEFAULT_CONFIG","section","resolve","response","duration","durationMs","stat","line","path8","glob","z","fs","textParts","getProjectRoot","getTruthpackPath","fs2","path3","fs3","timestamp","path2","claimExtractorInstance","evidenceResolverInstance","getClaimExtractor","getEvidenceResolver","path4","getKnowledgePath","fs4","loadJson","loadTruthpack","path5","fs5","TaskPlanner","PromptVerifier","path6","fs6","readFile","loadConfig"],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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","file":"index.js","sourcesContent":["/**\n * Configuration Schema\n * \n * Defines all environment variables with validation, types, and defaults.\n */\n\nimport { z } from 'zod';\n\n/**\n * Complete configuration schema for all VibeCheck components\n */\nexport const configSchema = z.object({\n // ============================================================================\n // Server Configuration\n // ============================================================================\n NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),\n PORT: z.coerce.number().int().min(1).max(65535).default(3001),\n HOST: z.string().default('0.0.0.0'),\n\n // ============================================================================\n // Database Configuration\n // ============================================================================\n DATABASE_URL: z.string().url().optional(),\n\n // ============================================================================\n // Redis Configuration\n // ============================================================================\n REDIS_URL: z.string().url().default('redis://localhost:6379'),\n REDIS_PASSWORD: z.string().optional(), // Redis password (if not in URL)\n\n // ============================================================================\n // JWT Configuration\n // ============================================================================\n JWT_SECRET: z.string().min(32).optional(),\n JWT_REFRESH_SECRET: z.string().min(32).optional(),\n JWT_ACCESS_EXPIRY: z.string().default('1h'),\n JWT_REFRESH_EXPIRY: z.string().default('7d'),\n\n // ============================================================================\n // Cookie Configuration\n // ============================================================================\n COOKIE_SECRET: z.string().min(32).optional(),\n COOKIE_DOMAIN: z.string().optional(),\n\n // ============================================================================\n // OAuth - Google\n // ============================================================================\n GOOGLE_CLIENT_ID: z.string().optional(),\n GOOGLE_CLIENT_SECRET: z.string().optional(),\n\n // ============================================================================\n // OAuth - GitHub\n // ============================================================================\n GITHUB_CLIENT_ID: z.string().optional(),\n GITHUB_CLIENT_SECRET: z.string().optional(),\n\n // ============================================================================\n // GitHub App Configuration\n // ============================================================================\n GITHUB_APP_ID: z.string().optional(),\n GITHUB_APP_PRIVATE_KEY: z.string().optional(),\n GITHUB_WEBHOOK_SECRET: z.string().optional(),\n\n // ============================================================================\n // Stripe Configuration\n // ============================================================================\n STRIPE_SECRET_KEY: z.string().optional(),\n STRIPE_WEBHOOK_SECRET: z.string().optional(),\n STRIPE_TEAM_PRICE_ID: z.string().optional(),\n STRIPE_ENTERPRISE_PRICE_ID: z.string().optional(),\n\n // ============================================================================\n // URL Configuration\n // ============================================================================\n API_URL: z.string().url().default('http://localhost:3001'),\n WEB_URL: z.string().url().default('http://localhost:5173'),\n\n // ============================================================================\n // Rate Limiting\n // ============================================================================\n RATE_LIMIT_MAX: z.coerce.number().int().min(1).default(100),\n RATE_LIMIT_WINDOW_MS: z.coerce.number().int().min(1000).default(60000),\n\n // ============================================================================\n // Logging\n // ============================================================================\n LOG_LEVEL: z.enum(['fatal', 'error', 'warn', 'info', 'debug', 'trace']).default('info'),\n\n // ============================================================================\n // Security\n // ============================================================================\n MAX_REQUEST_SIZE: z.coerce.number().int().min(1024).default(1048576), // 1MB default\n REQUEST_TIMEOUT_MS: z.coerce.number().int().min(1000).default(30000), // 30s default\n CONNECTION_TIMEOUT_MS: z.coerce.number().int().min(1000).default(10000), // 10s default\n HEALTH_CHECK_TOKEN: z.string().min(16).optional(), // Token for detailed health check authentication\n\n // ============================================================================\n // MCP Server Configuration\n // ============================================================================\n VIBECHECK_MODE: z.enum(['local', 'cloud', 'hybrid']).default('local'),\n VIBECHECK_TRANSPORT: z.enum(['stdio', 'http', 'websocket']).optional(),\n VIBECHECK_PORT: z.coerce.number().int().min(1).max(65535).optional(),\n VIBECHECK_HOST: z.string().optional(),\n VIBECHECK_PATH: z.string().optional(),\n VIBECHECK_PROJECT_ROOT: z.string().optional(),\n\n // ============================================================================\n // Monitoring & Observability\n // ============================================================================\n SENTRY_DSN: z.string().url().optional(),\n SENTRY_TRACES_SAMPLE_RATE: z.coerce.number().min(0).max(1).default(0.1),\n PROMETHEUS_PORT: z.coerce.number().int().min(1).max(65535).default(9090),\n\n // ============================================================================\n // CORS Configuration\n // ============================================================================\n CORS_ORIGIN: z.string().optional(),\n\n // ============================================================================\n // Email Configuration (Resend)\n // ============================================================================\n RESEND_API_KEY: z.string().optional(),\n EMAIL_FROM: z.string().email().default('noreply@vibecheckai.dev'),\n\n // ============================================================================\n // CLI Configuration\n // ============================================================================\n VIBECHECK_DEBUG: z.coerce.boolean().default(false),\n VIBECHECK_VERBOSE: z.coerce.boolean().default(false),\n VIBECHECK_QUIET: z.coerce.boolean().default(false),\n VIBECHECK_NO_COLOR: z.coerce.boolean().default(false),\n VIBECHECK_NO_UNICODE: z.coerce.boolean().default(false),\n VIBECHECK_UNICODE: z.coerce.boolean().default(false),\n});\n\nexport type ConfigSchema = z.infer<typeof configSchema>;\n\n/**\n * Critical secrets that must be set in production\n */\nexport const CRITICAL_SECRETS = [\n 'JWT_SECRET',\n 'JWT_REFRESH_SECRET',\n 'COOKIE_SECRET',\n 'DATABASE_URL',\n] as const;\n\n/**\n * Secrets that should be redacted when printing config\n */\nexport const SECRET_KEYS = [\n 'JWT_SECRET',\n 'JWT_REFRESH_SECRET',\n 'COOKIE_SECRET',\n 'GOOGLE_CLIENT_SECRET',\n 'GITHUB_CLIENT_SECRET',\n 'GITHUB_APP_PRIVATE_KEY',\n 'GITHUB_WEBHOOK_SECRET',\n 'STRIPE_SECRET_KEY',\n 'STRIPE_WEBHOOK_SECRET',\n 'DATABASE_URL', // Contains credentials\n 'REDIS_URL', // May contain credentials\n 'SENTRY_DSN', // Contains sensitive tokens\n 'RESEND_API_KEY', // Email service API key\n] as const;\n","/**\r\n * Secret Redaction Utilities\r\n * \r\n * Safely redacts secrets from configuration objects for debugging/logging.\r\n */\r\n\r\nimport type { Config } from './loader.js';\r\nimport { SECRET_KEYS } from './schema.js';\r\n\r\nconst REDACTION_PLACEHOLDER = '***REDACTED***';\r\n\r\n/**\r\n * Redact secrets from a configuration object\r\n */\r\nexport function redactSecrets<T extends Record<string, unknown>>(config: T): T {\r\n const redacted: Record<string, unknown> = { ...config };\r\n \r\n for (const key of SECRET_KEYS) {\r\n if (key in redacted && redacted[key] !== undefined && redacted[key] !== null) {\r\n const value = String(redacted[key]);\r\n \r\n // For URLs, redact credentials but keep structure\r\n if (value.includes('://')) {\r\n try {\r\n const url = new URL(value);\r\n if (url.username || url.password) {\r\n url.username = '';\r\n url.password = '';\r\n redacted[key] = `${url.protocol}//${REDACTION_PLACEHOLDER}@${url.host}${url.pathname}${url.search}${url.hash}`;\r\n } else {\r\n redacted[key] = REDACTION_PLACEHOLDER;\r\n }\r\n } catch {\r\n // Not a valid URL, just redact\r\n redacted[key] = REDACTION_PLACEHOLDER;\r\n }\r\n } else {\r\n // For non-URLs, show first 4 and last 4 chars if long enough\r\n if (value.length > 8) {\r\n redacted[key] = `${value.slice(0, 4)}${REDACTION_PLACEHOLDER}${value.slice(-4)}`;\r\n } else {\r\n redacted[key] = REDACTION_PLACEHOLDER;\r\n }\r\n }\r\n }\r\n }\r\n \r\n return redacted as T;\r\n}\r\n\r\n/**\r\n * Check if a key should be redacted\r\n */\r\nexport function isSecretKey(key: string): boolean {\r\n return SECRET_KEYS.includes(key as typeof SECRET_KEYS[number]);\r\n}\r\n","/**\r\n * Configuration Loader\r\n * \r\n * Loads and validates configuration from environment variables.\r\n * Supports .env files in development only (never in production).\r\n */\r\n\r\nimport { readFileSync, existsSync } from 'node:fs';\r\nimport { resolve, dirname } from 'node:path';\r\nimport { fileURLToPath } from 'node:url';\r\nimport { configSchema, type ConfigSchema, CRITICAL_SECRETS } from './schema.js';\r\nimport { redactSecrets } from './redaction.js';\r\n\r\nconst __filename = fileURLToPath(import.meta.url);\r\nconst __dirname = dirname(__filename);\r\n\r\nexport type Config = ConfigSchema;\r\n\r\nexport interface ConfigOptions {\r\n /**\r\n * Whether to load .env files (default: true in dev, false in prod)\r\n */\r\n loadEnvFile?: boolean;\r\n \r\n /**\r\n * Path to .env file (default: searches for .env in project root)\r\n */\r\n envFilePath?: string;\r\n \r\n /**\r\n * Whether to fail fast on missing critical config (default: true in prod)\r\n */\r\n failFast?: boolean;\r\n \r\n /**\r\n * Whether to use safe defaults for dev (default: true in dev)\r\n */\r\n useDefaults?: boolean;\r\n}\r\n\r\nlet cachedConfig: Config | null = null;\r\n\r\n/**\r\n * Parse .env file content into key-value pairs\r\n */\r\nfunction parseEnvFile(content: string): Record<string, string> {\r\n const result: Record<string, string> = {};\r\n const lines = content.split('\\n');\r\n \r\n for (const line of lines) {\r\n const trimmed = line.trim();\r\n \r\n // Skip empty lines and comments\r\n if (!trimmed || trimmed.startsWith('#')) {\r\n continue;\r\n }\r\n \r\n // Parse KEY=VALUE format\r\n const match = trimmed.match(/^([^#=]+)=(.*)$/);\r\n if (match && match[1] && match[2] !== undefined) {\r\n const key = match[1].trim();\r\n let value = match[2].trim();\r\n \r\n // Remove quotes if present\r\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\r\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\r\n value = value.slice(1, -1);\r\n }\r\n \r\n result[key] = value;\r\n }\r\n }\r\n \r\n return result;\r\n}\r\n\r\n/**\r\n * Find .env file in project root\r\n */\r\nfunction findEnvFile(startPath: string = process.cwd()): string | null {\r\n const searchPaths = [\r\n resolve(startPath, '.env'),\r\n resolve(startPath, '.env.local'),\r\n resolve(startPath, '.env.development'),\r\n ];\r\n \r\n for (const path of searchPaths) {\r\n if (existsSync(path)) {\r\n return path;\r\n }\r\n }\r\n \r\n return null;\r\n}\r\n\r\n/**\r\n * Load environment variables from .env file (dev only)\r\n */\r\nfunction loadEnvFile(filePath?: string): Record<string, string> {\r\n const nodeEnv = process.env.NODE_ENV || 'development';\r\n \r\n // Never load .env files in production\r\n if (nodeEnv === 'production') {\r\n return {};\r\n }\r\n \r\n const envPath = filePath || findEnvFile();\r\n if (!envPath) {\r\n return {};\r\n }\r\n \r\n try {\r\n const content = readFileSync(envPath, 'utf-8');\r\n return parseEnvFile(content);\r\n } catch (error) {\r\n // Silently fail if .env file doesn't exist or can't be read\r\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\r\n return {};\r\n }\r\n throw new Error(`Failed to load .env file at ${envPath}: ${error instanceof Error ? error.message : String(error)}`);\r\n }\r\n}\r\n\r\n/**\r\n * Merge environment variables (process.env takes precedence over .env file)\r\n */\r\nfunction mergeEnvVars(envFileVars: Record<string, string>): Record<string, string> {\r\n const result: Record<string, string> = { ...envFileVars };\r\n \r\n // Only copy defined values from process.env\r\n for (const [key, value] of Object.entries(process.env)) {\r\n if (value !== undefined) {\r\n result[key] = value;\r\n }\r\n }\r\n \r\n return result;\r\n}\r\n\r\n/**\r\n * Apply safe defaults for development\r\n */\r\nfunction applyDefaults(config: Partial<ConfigSchema>, isProduction: boolean): ConfigSchema {\r\n if (isProduction) {\r\n // In production, don't apply defaults for critical secrets\r\n return configSchema.parse(config);\r\n }\r\n \r\n // In development, apply safe defaults\r\n const defaults: Partial<ConfigSchema> = {\r\n JWT_SECRET: config.JWT_SECRET ?? 'development-jwt-secret-change-in-production-32chars',\r\n JWT_REFRESH_SECRET: config.JWT_REFRESH_SECRET ?? 'development-refresh-secret-change-in-prod-32chars',\r\n COOKIE_SECRET: config.COOKIE_SECRET ?? 'development-cookie-secret-change-in-production',\r\n DATABASE_URL: config.DATABASE_URL ?? 'postgres://vibecheck:vibecheck@localhost:5432/vibecheck',\r\n };\r\n \r\n return configSchema.parse({\r\n ...defaults,\r\n ...config,\r\n });\r\n}\r\n\r\n/**\r\n * Validate critical secrets in production\r\n */\r\nfunction validateProductionSecrets(config: ConfigSchema, failFast: boolean): void {\r\n const nodeEnv = config.NODE_ENV;\r\n \r\n if (nodeEnv !== 'production') {\r\n return;\r\n }\r\n \r\n const missingSecrets: string[] = [];\r\n \r\n for (const secret of CRITICAL_SECRETS) {\r\n const value = config[secret];\r\n \r\n if (!value) {\r\n missingSecrets.push(secret);\r\n continue;\r\n }\r\n \r\n // Check for development defaults\r\n if (typeof value === 'string') {\r\n if (value.includes('development') || value.length < 32) {\r\n missingSecrets.push(secret);\r\n }\r\n }\r\n }\r\n \r\n if (missingSecrets.length > 0) {\r\n const errorMessage = [\r\n '⚠️ SECURITY WARNING: Missing or weak secrets in production!',\r\n ` Required secrets: ${missingSecrets.join(', ')}`,\r\n ' Set strong, random secrets as environment variables.',\r\n ' Generate secrets: openssl rand -base64 32',\r\n ].join('\\n');\r\n \r\n if (failFast) {\r\n throw new Error(`Production requires strong secrets: ${missingSecrets.join(', ')}\\n${errorMessage}`);\r\n }\r\n \r\n // eslint-disable-next-line no-console\r\n console.error(errorMessage);\r\n }\r\n}\r\n\r\n/**\r\n * Load and validate configuration\r\n */\r\nexport function loadConfig(options: ConfigOptions = {}): Config {\r\n // Return cached config if available\r\n if (cachedConfig) {\r\n return cachedConfig;\r\n }\r\n \r\n // Read NODE_ENV directly (before loading .env) to determine defaults\r\n const nodeEnv = process.env.NODE_ENV || 'development';\r\n const isProduction = nodeEnv === 'production';\r\n \r\n const {\r\n loadEnvFile: shouldLoadEnvFile = !isProduction,\r\n envFilePath,\r\n failFast = isProduction,\r\n useDefaults = !isProduction,\r\n } = options;\r\n \r\n // Load .env file if enabled\r\n const envFileVars = shouldLoadEnvFile ? loadEnvFile(envFilePath) : {};\r\n \r\n // Merge environment variables (process.env takes precedence)\r\n const envVars = mergeEnvVars(envFileVars);\r\n \r\n // Parse and validate with Zod\r\n const parseResult = configSchema.safeParse(envVars);\r\n \r\n if (!parseResult.success) {\r\n const errors = parseResult.error.errors\r\n .map((err) => {\r\n const path = err.path.join('.');\r\n return ` • ${path || 'root'}: ${err.message}`;\r\n })\r\n .join('\\n');\r\n \r\n throw new Error(`Invalid configuration:\\n${errors}`);\r\n }\r\n \r\n // Apply defaults if enabled\r\n const config = useDefaults\r\n ? applyDefaults(parseResult.data, isProduction)\r\n : parseResult.data;\r\n \r\n // Validate production secrets\r\n validateProductionSecrets(config, failFast);\r\n \r\n // Cache the config\r\n cachedConfig = config;\r\n \r\n return config;\r\n}\r\n\r\n/**\r\n * Print configuration (with secret redaction)\r\n */\r\nexport function printConfig(config?: Config, options: { redactSecrets?: boolean } = {}): void {\r\n const configToPrint = config || loadConfig();\r\n const { redactSecrets: shouldRedact = true } = options;\r\n \r\n const output = shouldRedact\r\n ? redactSecrets(configToPrint)\r\n : configToPrint;\r\n \r\n // eslint-disable-next-line no-console\r\n console.log(JSON.stringify(output, null, 2));\r\n}\r\n\r\n/**\r\n * Clear cached configuration (useful for testing)\r\n */\r\nexport function clearConfigCache(): void {\r\n cachedConfig = null;\r\n}\r\n\r\n/**\r\n * Get config value by key (type-safe)\r\n */\r\nexport function getConfigValue<K extends keyof Config>(key: K): Config[K] {\r\n const config = loadConfig();\r\n return config[key];\r\n}\r\n","/**\r\n * Centralized Configuration System\r\n * \r\n * Single source of truth for all environment variables and configuration.\r\n * Provides type-safe, validated configuration with:\r\n * - Schema validation via Zod\r\n * - Type normalization (numbers, booleans, URLs)\r\n * - Safe defaults for dev only\r\n * - Fail-fast in production\r\n * - Secret redaction for debugging\r\n */\r\n\r\nexport { loadConfig, printConfig, type Config, type ConfigOptions } from './loader.js';\r\nexport { configSchema, type ConfigSchema } from './schema.js';\r\nexport { redactSecrets } from './redaction.js';\r\n","var __require = /* @__PURE__ */ ((x) => typeof require !== \"undefined\" ? require : typeof Proxy !== \"undefined\" ? new Proxy(x, {\n get: (a, b) => (typeof require !== \"undefined\" ? require : a)[b]\n}) : x)(function(x) {\n if (typeof require !== \"undefined\") return require.apply(this, arguments);\n throw Error('Dynamic require of \"' + x + '\" is not supported');\n});\n\nexport { __require };\n//# sourceMappingURL=chunk-DGUM43GV.js.map\n//# sourceMappingURL=chunk-DGUM43GV.js.map","/**\r\n * Prompt Template Registry\r\n *\r\n * Centralized registry of all prompt templates.\r\n * Templates are organized by category with Pro tier gating.\r\n */\r\n\r\nimport type { PromptTemplate, PromptCategory, WorkspaceContext } from './types.js';\r\n\r\n// ============================================================================\r\n// SMART VARIABLES\r\n// ============================================================================\r\n\r\nexport const SMART_VARIABLES: Record<string, (ctx: WorkspaceContext) => string> = {\r\n '{{PROJECT_NAME}}': (ctx) => ctx.projectName,\r\n '{{FRAMEWORK}}': (ctx) => ctx.framework,\r\n '{{LANGUAGE}}': (ctx) => (ctx.language === 'typescript' ? 'TypeScript' : 'JavaScript'),\r\n '{{CURRENT_FILE}}': (ctx) => ctx.currentFile || 'N/A',\r\n '{{FILE_LANGUAGE}}': (ctx) => ctx.currentFileLanguage || 'unknown',\r\n '{{SELECTION}}': (ctx) => ctx.selectedText || '',\r\n '{{PACKAGE_MANAGER}}': (ctx) => ctx.packageManager,\r\n '{{DATABASE}}': (ctx) => {\r\n if (ctx.hasSupabase) return 'Supabase';\r\n if (ctx.hasPrisma && ctx.hasPostgres) return 'PostgreSQL with Prisma';\r\n if (ctx.hasDrizzle) return 'Drizzle ORM';\r\n if (ctx.hasMongoDB) return 'MongoDB';\r\n if (ctx.hasFirebase) return 'Firebase';\r\n return 'PostgreSQL';\r\n },\r\n '{{AUTH_LIBRARY}}': (ctx) => {\r\n if (ctx.hasClerk) return 'Clerk';\r\n if (ctx.hasNextAuth || ctx.hasAuthJs) return 'NextAuth.js / Auth.js';\r\n if (ctx.hasSupabase) return 'Supabase Auth';\r\n if (ctx.hasFirebase) return 'Firebase Auth';\r\n return 'NextAuth.js';\r\n },\r\n '{{UI_LIBRARY}}': (ctx) => {\r\n if (ctx.hasShadcn) return 'shadcn/ui';\r\n if (ctx.hasRadix) return 'Radix UI';\r\n if (ctx.hasTailwind) return 'Tailwind CSS';\r\n return 'Tailwind CSS';\r\n },\r\n '{{TEST_FRAMEWORK}}': (ctx) => ctx.testFramework || 'Vitest',\r\n};\r\n\r\n// ============================================================================\r\n// FREE TIER TEMPLATES (5 core templates)\r\n// ============================================================================\r\n\r\nconst FREE_TEMPLATES: PromptTemplate[] = [\r\n // General - Implement Feature\r\n {\r\n id: 'general-feature',\r\n name: 'Implement Feature',\r\n category: 'general',\r\n description: 'Build a new feature from scratch',\r\n icon: '✨',\r\n keywords: ['feature', 'implement', 'build', 'create', 'add', 'new'],\r\n popularity: 100,\r\n isPro: false,\r\n contextQuestions: [\r\n {\r\n id: 'feature',\r\n label: 'Feature Description',\r\n placeholder: 'What feature do you want to build?',\r\n type: 'text',\r\n required: true,\r\n },\r\n {\r\n id: 'scope',\r\n label: 'Scope',\r\n placeholder: 'Select implementation scope',\r\n type: 'select',\r\n options: [\r\n { label: 'Full Stack', value: 'fullstack', default: true },\r\n { label: 'Frontend Only', value: 'frontend' },\r\n { label: 'Backend Only', value: 'backend' },\r\n ],\r\n required: true,\r\n },\r\n ],\r\n outputSections: ['Plan', 'Files', 'Code', 'Tests'],\r\n template: `You are a senior engineer. IMPLEMENT the following feature:\r\n\r\n**Feature**: {{feature}}\r\n\r\n## Project Context\r\n- **Framework**: {{FRAMEWORK}}\r\n- **Language**: {{LANGUAGE}}\r\n- **Database**: {{DATABASE}}\r\n- **Scope**: {{scope}}\r\n\r\n## Requirements\r\n1. Production-ready code with proper error handling\r\n2. TypeScript types for all code\r\n3. Follow existing project patterns\r\n4. Include validation where needed\r\n\r\n## Output Format\r\nA) Implementation Plan (10 bullets max)\r\nB) Files to Create/Modify\r\nC) Complete Code for each file\r\nD) Testing suggestions\r\n\r\nProvide complete, copy-paste ready code.`,\r\n },\r\n\r\n // Debugging - Fix Error\r\n {\r\n id: 'debugging-error',\r\n name: 'Debug Error',\r\n category: 'debugging',\r\n description: 'Analyze and fix an error',\r\n icon: '🐛',\r\n keywords: ['error', 'bug', 'fix', 'debug', 'issue', 'problem', 'crash'],\r\n popularity: 95,\r\n isPro: false,\r\n contextQuestions: [\r\n {\r\n id: 'error',\r\n label: 'Error Message',\r\n placeholder: 'Paste the error message/stack trace',\r\n type: 'text',\r\n required: true,\r\n },\r\n {\r\n id: 'context',\r\n label: 'What were you trying to do?',\r\n placeholder: 'Describe the action that caused the error',\r\n type: 'text',\r\n required: true,\r\n },\r\n ],\r\n outputSections: ['Analysis', 'Root Cause', 'Fix', 'Prevention'],\r\n template: `You are a senior debugging expert. Analyze and fix this error:\r\n\r\n**Error**:\r\n\\`\\`\\`\r\n{{error}}\r\n\\`\\`\\`\r\n\r\n**Context**: {{context}}\r\n\r\n## Project Context\r\n- **Framework**: {{FRAMEWORK}}\r\n- **Language**: {{LANGUAGE}}\r\n{{#if CURRENT_FILE}}\r\n- **Current File**: {{CURRENT_FILE}}\r\n{{/if}}\r\n\r\n## Output Format\r\nA) Error Analysis - What the error means\r\nB) Root Cause - Why it happened\r\nC) Fix - Exact code changes needed\r\nD) Prevention - How to avoid in future\r\n\r\nBe specific with line numbers and file paths.`,\r\n },\r\n\r\n // Refactoring\r\n {\r\n id: 'refactoring-code',\r\n name: 'Refactor Code',\r\n category: 'refactoring',\r\n description: 'Improve code quality and structure',\r\n icon: '♻️',\r\n keywords: ['refactor', 'improve', 'clean', 'optimize', 'restructure'],\r\n popularity: 85,\r\n isPro: false,\r\n contextQuestions: [\r\n {\r\n id: 'goal',\r\n label: 'Refactoring Goal',\r\n placeholder: 'What do you want to improve?',\r\n type: 'select',\r\n options: [\r\n { label: 'Readability', value: 'readability', default: true },\r\n { label: 'Performance', value: 'performance' },\r\n { label: 'Type Safety', value: 'type-safety' },\r\n { label: 'Extract Component/Function', value: 'extract' },\r\n { label: 'Remove Duplication', value: 'dedup' },\r\n ],\r\n required: true,\r\n },\r\n ],\r\n outputSections: ['Analysis', 'Changes', 'Code'],\r\n template: `You are a senior engineer. Refactor this code for **{{goal}}**:\r\n\r\n{{#if SELECTION}}\r\n**Code to Refactor**:\r\n\\`\\`\\`{{FILE_LANGUAGE}}\r\n{{SELECTION}}\r\n\\`\\`\\`\r\n{{/if}}\r\n\r\n## Project Context\r\n- **Framework**: {{FRAMEWORK}}\r\n- **Language**: {{LANGUAGE}}\r\n{{#if CURRENT_FILE}}\r\n- **File**: {{CURRENT_FILE}}\r\n{{/if}}\r\n\r\n## Output Format\r\nA) Current Issues\r\nB) Proposed Changes\r\nC) Refactored Code (complete)\r\nD) Benefits of changes\r\n\r\nMaintain functionality while improving {{goal}}.`,\r\n },\r\n\r\n // Testing - Basic Unit Tests\r\n {\r\n id: 'testing-basic',\r\n name: 'Write Unit Tests',\r\n category: 'testing',\r\n description: 'Create unit tests for code',\r\n icon: '🧪',\r\n keywords: ['test', 'unit', 'testing', 'spec', 'coverage'],\r\n popularity: 80,\r\n isPro: false,\r\n contextQuestions: [\r\n {\r\n id: 'target',\r\n label: 'Code to Test',\r\n placeholder: 'Describe function/component to test',\r\n type: 'text',\r\n required: true,\r\n },\r\n ],\r\n outputSections: ['Test Plan', 'Tests', 'Coverage'],\r\n template: `You are a senior QA engineer. Write comprehensive unit tests:\r\n\r\n**Target**: {{target}}\r\n\r\n{{#if SELECTION}}\r\n**Code**:\r\n\\`\\`\\`{{FILE_LANGUAGE}}\r\n{{SELECTION}}\r\n\\`\\`\\`\r\n{{/if}}\r\n\r\n## Project Context\r\n- **Framework**: {{FRAMEWORK}}\r\n- **Test Framework**: {{TEST_FRAMEWORK}}\r\n\r\n## Requirements\r\n1. Cover happy path\r\n2. Cover edge cases\r\n3. Cover error cases\r\n4. Use descriptive test names\r\n\r\n## Output Format\r\nA) Test Plan - What to test\r\nB) Complete Test File\r\nC) Coverage notes\r\n\r\nProvide complete, runnable tests.`,\r\n },\r\n\r\n // Documentation\r\n {\r\n id: 'documentation-readme',\r\n name: 'Generate README',\r\n category: 'documentation',\r\n description: 'Create or update README documentation',\r\n icon: '📚',\r\n keywords: ['readme', 'documentation', 'docs', 'document'],\r\n popularity: 70,\r\n isPro: false,\r\n contextQuestions: [\r\n {\r\n id: 'type',\r\n label: 'README Type',\r\n placeholder: 'Select README type',\r\n type: 'select',\r\n options: [\r\n { label: 'Project README', value: 'project', default: true },\r\n { label: 'API Documentation', value: 'api' },\r\n { label: 'Component Documentation', value: 'component' },\r\n ],\r\n required: true,\r\n },\r\n ],\r\n outputSections: ['README'],\r\n template: `Generate a professional {{type}} README for:\r\n\r\n**Project**: {{PROJECT_NAME}}\r\n**Framework**: {{FRAMEWORK}}\r\n**Language**: {{LANGUAGE}}\r\n\r\nInclude:\r\n- Project description\r\n- Installation instructions\r\n- Usage examples\r\n- API reference (if applicable)\r\n- Contributing guidelines\r\n- License\r\n\r\nUse proper markdown formatting with badges.`,\r\n },\r\n];\r\n\r\n// ============================================================================\r\n// PRO TIER TEMPLATES (20+ templates)\r\n// ============================================================================\r\n\r\nconst PRO_TEMPLATES: PromptTemplate[] = [\r\n // Authentication - OAuth\r\n {\r\n id: 'auth-oauth',\r\n name: 'OAuth Login (Google, GitHub)',\r\n category: 'authentication',\r\n description: 'Social login with OAuth providers',\r\n icon: '🔐',\r\n keywords: ['login', 'oauth', 'google', 'github', 'auth', 'social'],\r\n popularity: 100,\r\n isPro: true,\r\n contextQuestions: [\r\n {\r\n id: 'providers',\r\n label: 'OAuth Providers',\r\n placeholder: 'Select providers',\r\n type: 'multiselect',\r\n options: [\r\n { label: 'Google', value: 'google', default: true },\r\n { label: 'GitHub', value: 'github', default: true },\r\n { label: 'Discord', value: 'discord' },\r\n { label: 'Microsoft', value: 'microsoft' },\r\n ],\r\n required: true,\r\n },\r\n {\r\n id: 'authLibrary',\r\n label: 'Auth Library',\r\n placeholder: 'Select library',\r\n type: 'select',\r\n options: [\r\n { label: 'NextAuth.js', value: 'nextauth', default: true },\r\n { label: 'Clerk', value: 'clerk' },\r\n { label: 'Supabase Auth', value: 'supabase' },\r\n ],\r\n required: true,\r\n },\r\n ],\r\n outputSections: ['Plan', 'Files', 'Code', 'Env', 'Setup'],\r\n template: `You are a senior full-stack engineer. IMPLEMENT OAuth authentication with **{{providers}}**.\r\n\r\n## Context\r\n- **Framework**: {{FRAMEWORK}}\r\n- **Auth Library**: {{authLibrary}}\r\n- **Database**: {{DATABASE}}\r\n\r\n## Requirements\r\n1. Login page with provider buttons\r\n2. Proper callback handling\r\n3. Session management\r\n4. Protected routes\r\n5. Sign out functionality\r\n\r\n## Output Format\r\nA) Implementation Plan\r\nB) Files to Create\r\nC) Complete Code\r\nD) Environment Variables\r\nE) Provider Setup Guide\r\n\r\nProvide production-ready code.`,\r\n },\r\n\r\n // Authentication - Email/Password\r\n {\r\n id: 'auth-credentials',\r\n name: 'Email & Password Auth',\r\n category: 'authentication',\r\n description: 'Traditional email/password with verification',\r\n icon: '📧',\r\n keywords: ['email', 'password', 'register', 'signup', 'login'],\r\n popularity: 95,\r\n isPro: true,\r\n contextQuestions: [\r\n {\r\n id: 'features',\r\n label: 'Features',\r\n placeholder: 'Select features',\r\n type: 'multiselect',\r\n options: [\r\n { label: 'Registration', value: 'registration', default: true },\r\n { label: 'Email verification', value: 'verification', default: true },\r\n { label: 'Password reset', value: 'reset', default: true },\r\n { label: '2FA', value: '2fa' },\r\n ],\r\n required: true,\r\n },\r\n ],\r\n outputSections: ['Plan', 'Schema', 'Code', 'Email', 'Security'],\r\n template: `Implement email/password authentication with {{features}}.\r\n\r\n## Context\r\n- **Framework**: {{FRAMEWORK}}\r\n- **Database**: {{DATABASE}}\r\n\r\n## Security Requirements\r\n- Password hashing: bcrypt 12+ rounds\r\n- Verification tokens: 24hr expiry\r\n- Reset tokens: 1hr expiry\r\n- Rate limiting on auth endpoints\r\n\r\nProvide complete implementation.`,\r\n },\r\n\r\n // API - REST CRUD\r\n {\r\n id: 'api-rest-crud',\r\n name: 'REST API with CRUD',\r\n category: 'api',\r\n description: 'Full CRUD API with validation',\r\n icon: '🔌',\r\n keywords: ['api', 'rest', 'crud', 'endpoint'],\r\n popularity: 90,\r\n isPro: true,\r\n contextQuestions: [\r\n {\r\n id: 'resource',\r\n label: 'Resource Name',\r\n placeholder: 'e.g., users, products',\r\n type: 'text',\r\n required: true,\r\n },\r\n {\r\n id: 'operations',\r\n label: 'Operations',\r\n placeholder: 'Select operations',\r\n type: 'multiselect',\r\n options: [\r\n { label: 'Create', value: 'create', default: true },\r\n { label: 'Read', value: 'read', default: true },\r\n { label: 'Update', value: 'update', default: true },\r\n { label: 'Delete', value: 'delete', default: true },\r\n { label: 'Pagination', value: 'pagination', default: true },\r\n ],\r\n required: true,\r\n },\r\n ],\r\n outputSections: ['Plan', 'Schema', 'Routes', 'Code', 'Tests'],\r\n template: `Implement REST API for **{{resource}}** with {{operations}}.\r\n\r\n## Context\r\n- **Framework**: {{FRAMEWORK}}\r\n- **Database**: {{DATABASE}}\r\n\r\n## Requirements\r\n- Zod validation\r\n- Proper HTTP status codes\r\n- Error handling\r\n- TypeScript types\r\n\r\nProvide complete implementation.`,\r\n },\r\n\r\n // API - tRPC\r\n {\r\n id: 'api-trpc',\r\n name: 'tRPC API',\r\n category: 'api',\r\n description: 'End-to-end typesafe APIs',\r\n icon: '🔷',\r\n keywords: ['trpc', 'api', 'typesafe'],\r\n popularity: 80,\r\n isPro: true,\r\n isNew: true,\r\n contextQuestions: [\r\n {\r\n id: 'resource',\r\n label: 'Router Name',\r\n placeholder: 'e.g., user, post',\r\n type: 'text',\r\n required: true,\r\n },\r\n ],\r\n outputSections: ['Router', 'Procedures', 'Client', 'Hooks'],\r\n template: `Implement tRPC router for **{{resource}}**.\r\n\r\n## Context\r\n- **Framework**: {{FRAMEWORK}}\r\n- **Database**: {{DATABASE}}\r\n\r\nProvide router, procedures, and React Query hooks.`,\r\n },\r\n\r\n // Frontend - React Component\r\n {\r\n id: 'frontend-component',\r\n name: 'React Component',\r\n category: 'frontend',\r\n description: 'Production-ready component',\r\n icon: '⚛️',\r\n keywords: ['react', 'component', 'ui'],\r\n popularity: 95,\r\n isPro: true,\r\n contextQuestions: [\r\n {\r\n id: 'componentName',\r\n label: 'Component Name',\r\n placeholder: 'e.g., DataTable, Modal',\r\n type: 'text',\r\n required: true,\r\n },\r\n {\r\n id: 'features',\r\n label: 'Features',\r\n placeholder: 'Select features',\r\n type: 'multiselect',\r\n options: [\r\n { label: 'TypeScript', value: 'typescript', default: true },\r\n { label: 'Accessibility', value: 'a11y', default: true },\r\n { label: 'Dark mode', value: 'dark', default: true },\r\n { label: 'Variants (CVA)', value: 'variants' },\r\n ],\r\n required: false,\r\n },\r\n ],\r\n outputSections: ['Props', 'Code', 'Variants', 'Usage'],\r\n template: `Create React component: **{{componentName}}** with {{features}}.\r\n\r\n## Context\r\n- **Framework**: {{FRAMEWORK}}\r\n- **Styling**: {{UI_LIBRARY}}\r\n\r\n## Requirements\r\n- TypeScript props interface\r\n- forwardRef pattern\r\n- Accessible (ARIA)\r\n- CVA variants if requested\r\n\r\nProvide complete implementation.`,\r\n },\r\n\r\n // Frontend - Form\r\n {\r\n id: 'frontend-form',\r\n name: 'Form with Validation',\r\n category: 'frontend',\r\n description: 'React Hook Form + Zod',\r\n icon: '📝',\r\n keywords: ['form', 'validation', 'input'],\r\n popularity: 90,\r\n isPro: true,\r\n contextQuestions: [\r\n {\r\n id: 'formName',\r\n label: 'Form Purpose',\r\n placeholder: 'e.g., Registration, Contact',\r\n type: 'text',\r\n required: true,\r\n },\r\n {\r\n id: 'fields',\r\n label: 'Fields',\r\n placeholder: 'e.g., name, email, password',\r\n type: 'text',\r\n required: true,\r\n },\r\n ],\r\n outputSections: ['Schema', 'Component', 'Validation', 'Usage'],\r\n template: `Create form: **{{formName}}** with fields: {{fields}}.\r\n\r\n## Context\r\n- **Framework**: {{FRAMEWORK}}\r\n- **Styling**: {{UI_LIBRARY}}\r\n\r\nUse React Hook Form + Zod. Include validation and error handling.`,\r\n },\r\n\r\n // Database - Schema\r\n {\r\n id: 'database-schema',\r\n name: 'Database Schema',\r\n category: 'database',\r\n description: 'Schema with relationships',\r\n icon: '🗄️',\r\n keywords: ['database', 'schema', 'model'],\r\n popularity: 85,\r\n isPro: true,\r\n contextQuestions: [\r\n {\r\n id: 'domain',\r\n label: 'Domain',\r\n placeholder: 'e.g., e-commerce, blog',\r\n type: 'text',\r\n required: true,\r\n },\r\n {\r\n id: 'entities',\r\n label: 'Entities',\r\n placeholder: 'e.g., users, products',\r\n type: 'text',\r\n required: true,\r\n },\r\n ],\r\n outputSections: ['ERD', 'Schema', 'Migrations', 'Seeds'],\r\n template: `Design database schema for **{{domain}}** with entities: {{entities}}.\r\n\r\n## Context\r\n- **Database**: {{DATABASE}}\r\n\r\n## Requirements\r\n- Normalized (3NF)\r\n- Proper relationships\r\n- Strategic indexes\r\n\r\nProvide complete Prisma/Drizzle schema.`,\r\n },\r\n\r\n // Testing - E2E\r\n {\r\n id: 'testing-e2e',\r\n name: 'E2E Tests (Playwright)',\r\n category: 'testing',\r\n description: 'End-to-end test suite',\r\n icon: '🎭',\r\n keywords: ['e2e', 'playwright', 'integration'],\r\n popularity: 75,\r\n isPro: true,\r\n contextQuestions: [\r\n {\r\n id: 'flow',\r\n label: 'User Flow',\r\n placeholder: 'e.g., Login, Checkout',\r\n type: 'text',\r\n required: true,\r\n },\r\n ],\r\n outputSections: ['Test Plan', 'Page Objects', 'Tests'],\r\n template: `Create Playwright E2E tests for **{{flow}}** user flow.\r\n\r\n## Context\r\n- **Framework**: {{FRAMEWORK}}\r\n\r\nInclude page objects, fixtures, and test cases.`,\r\n },\r\n\r\n // Deployment - Docker\r\n {\r\n id: 'deployment-docker',\r\n name: 'Docker Setup',\r\n category: 'deployment',\r\n description: 'Dockerfile and compose',\r\n icon: '🐳',\r\n keywords: ['docker', 'container', 'deployment'],\r\n popularity: 80,\r\n isPro: true,\r\n contextQuestions: [\r\n {\r\n id: 'services',\r\n label: 'Services',\r\n placeholder: 'Select services',\r\n type: 'multiselect',\r\n options: [\r\n { label: 'App', value: 'app', default: true },\r\n { label: 'Database', value: 'db', default: true },\r\n { label: 'Redis', value: 'redis' },\r\n { label: 'Nginx', value: 'nginx' },\r\n ],\r\n required: true,\r\n },\r\n ],\r\n outputSections: ['Dockerfile', 'Compose', 'Scripts'],\r\n template: `Create Docker setup for {{services}}.\r\n\r\n## Context\r\n- **Framework**: {{FRAMEWORK}}\r\n- **Database**: {{DATABASE}}\r\n\r\nInclude multi-stage Dockerfile and docker-compose.yml.`,\r\n },\r\n\r\n // Deployment - CI/CD\r\n {\r\n id: 'deployment-cicd',\r\n name: 'CI/CD Pipeline',\r\n category: 'deployment',\r\n description: 'GitHub Actions workflow',\r\n icon: '🔄',\r\n keywords: ['ci', 'cd', 'github', 'actions', 'pipeline'],\r\n popularity: 75,\r\n isPro: true,\r\n contextQuestions: [\r\n {\r\n id: 'platform',\r\n label: 'CI Platform',\r\n placeholder: 'Select platform',\r\n type: 'select',\r\n options: [\r\n { label: 'GitHub Actions', value: 'github', default: true },\r\n { label: 'GitLab CI', value: 'gitlab' },\r\n ],\r\n required: true,\r\n },\r\n {\r\n id: 'deployTarget',\r\n label: 'Deploy Target',\r\n placeholder: 'Select target',\r\n type: 'select',\r\n options: [\r\n { label: 'Vercel', value: 'vercel', default: true },\r\n { label: 'AWS', value: 'aws' },\r\n { label: 'Docker', value: 'docker' },\r\n ],\r\n required: true,\r\n },\r\n ],\r\n outputSections: ['Workflow', 'Stages', 'Secrets'],\r\n template: `Create {{platform}} CI/CD pipeline deploying to {{deployTarget}}.\r\n\r\n## Context\r\n- **Framework**: {{FRAMEWORK}}\r\n\r\nInclude lint, test, build, and deploy stages.`,\r\n },\r\n\r\n // Performance - Optimization\r\n {\r\n id: 'performance-optimize',\r\n name: 'Performance Optimization',\r\n category: 'performance',\r\n description: 'Analyze and optimize performance',\r\n icon: '⚡',\r\n keywords: ['performance', 'optimize', 'speed', 'slow'],\r\n popularity: 70,\r\n isPro: true,\r\n contextQuestions: [\r\n {\r\n id: 'area',\r\n label: 'Optimization Area',\r\n placeholder: 'Select area',\r\n type: 'select',\r\n options: [\r\n { label: 'Bundle Size', value: 'bundle', default: true },\r\n { label: 'Runtime Performance', value: 'runtime' },\r\n { label: 'Database Queries', value: 'database' },\r\n { label: 'API Response Time', value: 'api' },\r\n ],\r\n required: true,\r\n },\r\n ],\r\n outputSections: ['Analysis', 'Recommendations', 'Implementation'],\r\n template: `Analyze and optimize **{{area}}** performance.\r\n\r\n## Context\r\n- **Framework**: {{FRAMEWORK}}\r\n\r\n{{#if SELECTION}}\r\n**Code**:\r\n\\`\\`\\`\r\n{{SELECTION}}\r\n\\`\\`\\`\r\n{{/if}}\r\n\r\nProvide specific, actionable improvements.`,\r\n },\r\n\r\n // Security - Audit\r\n {\r\n id: 'security-audit',\r\n name: 'Security Audit',\r\n category: 'security',\r\n description: 'Security review and fixes',\r\n icon: '🛡️',\r\n keywords: ['security', 'audit', 'vulnerability'],\r\n popularity: 65,\r\n isPro: true,\r\n contextQuestions: [\r\n {\r\n id: 'scope',\r\n label: 'Audit Scope',\r\n placeholder: 'Select scope',\r\n type: 'select',\r\n options: [\r\n { label: 'Full Application', value: 'full', default: true },\r\n { label: 'Authentication', value: 'auth' },\r\n { label: 'API Endpoints', value: 'api' },\r\n { label: 'Dependencies', value: 'deps' },\r\n ],\r\n required: true,\r\n },\r\n ],\r\n outputSections: ['Findings', 'Severity', 'Fixes'],\r\n template: `Perform security audit on **{{scope}}**.\r\n\r\n## Context\r\n- **Framework**: {{FRAMEWORK}}\r\n\r\nCheck for:\r\n- OWASP Top 10 vulnerabilities\r\n- Hardcoded secrets\r\n- Insecure configurations\r\n- Dependency vulnerabilities\r\n\r\nProvide findings with severity and fixes.`,\r\n },\r\n\r\n // AI Integration\r\n {\r\n id: 'ai-integration',\r\n name: 'AI Integration',\r\n category: 'ai-ml',\r\n description: 'OpenAI/Anthropic integration',\r\n icon: '🤖',\r\n keywords: ['ai', 'openai', 'llm', 'chatgpt', 'claude'],\r\n popularity: 85,\r\n isPro: true,\r\n isNew: true,\r\n contextQuestions: [\r\n {\r\n id: 'provider',\r\n label: 'AI Provider',\r\n placeholder: 'Select provider',\r\n type: 'select',\r\n options: [\r\n { label: 'OpenAI', value: 'openai', default: true },\r\n { label: 'Anthropic', value: 'anthropic' },\r\n { label: 'Vercel AI SDK', value: 'vercel-ai' },\r\n ],\r\n required: true,\r\n },\r\n {\r\n id: 'feature',\r\n label: 'Feature Type',\r\n placeholder: 'Select feature',\r\n type: 'select',\r\n options: [\r\n { label: 'Chat Interface', value: 'chat', default: true },\r\n { label: 'Text Generation', value: 'generation' },\r\n { label: 'RAG/Embeddings', value: 'rag' },\r\n { label: 'Streaming', value: 'streaming' },\r\n ],\r\n required: true,\r\n },\r\n ],\r\n outputSections: ['Setup', 'API', 'UI', 'Error Handling'],\r\n template: `Implement {{feature}} using {{provider}}.\r\n\r\n## Context\r\n- **Framework**: {{FRAMEWORK}}\r\n\r\n## Requirements\r\n- Type-safe API client\r\n- Error handling with retries\r\n- Rate limiting consideration\r\n- Cost optimization tips\r\n\r\nProvide complete implementation.`,\r\n },\r\n];\r\n\r\n// ============================================================================\r\n// REGISTRY\r\n// ============================================================================\r\n\r\n/** All registered templates */\r\nexport const PROMPT_TEMPLATES: PromptTemplate[] = [...FREE_TEMPLATES, ...PRO_TEMPLATES];\r\n\r\n/** Get templates by category */\r\nexport function getTemplatesByCategory(category: PromptCategory): PromptTemplate[] {\r\n return PROMPT_TEMPLATES.filter((t) => t.category === category).sort(\r\n (a, b) => (b.popularity || 0) - (a.popularity || 0)\r\n );\r\n}\r\n\r\n/** Get free tier templates only */\r\nexport function getFreeTemplates(): PromptTemplate[] {\r\n return PROMPT_TEMPLATES.filter((t) => !t.isPro);\r\n}\r\n\r\n/** Get Pro tier templates only */\r\nexport function getProTemplates(): PromptTemplate[] {\r\n return PROMPT_TEMPLATES.filter((t) => t.isPro);\r\n}\r\n\r\n/** Get template by ID */\r\nexport function getTemplateById(id: string): PromptTemplate | undefined {\r\n return PROMPT_TEMPLATES.find((t) => t.id === id);\r\n}\r\n\r\n/** Get all categories with template counts */\r\nexport function getCategoriesWithCounts(): Array<{ category: PromptCategory; count: number }> {\r\n const counts = new Map<PromptCategory, number>();\r\n for (const template of PROMPT_TEMPLATES) {\r\n counts.set(template.category, (counts.get(template.category) || 0) + 1);\r\n }\r\n return Array.from(counts.entries())\r\n .map(([category, count]) => ({ category, count }))\r\n .sort((a, b) => b.count - a.count);\r\n}\r\n\r\n/** Search templates by keyword */\r\nexport function searchTemplates(query: string): PromptTemplate[] {\r\n const q = query.toLowerCase();\r\n return PROMPT_TEMPLATES.filter(\r\n (t) =>\r\n t.name.toLowerCase().includes(q) ||\r\n t.description.toLowerCase().includes(q) ||\r\n t.keywords.some((k) => k.includes(q))\r\n ).sort((a, b) => (b.popularity || 0) - (a.popularity || 0));\r\n}\r\n\r\n/** Detect template from user input */\r\nexport function detectTemplate(input: string): PromptTemplate | null {\r\n const q = input.toLowerCase();\r\n\r\n for (const template of PROMPT_TEMPLATES.sort((a, b) => (b.popularity || 0) - (a.popularity || 0))) {\r\n for (const keyword of template.keywords) {\r\n if (q.includes(keyword)) {\r\n return template;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n","/**\r\n * Prompt Builder\r\n * \r\n * Constructs high-quality prompts with verified context\r\n * to minimize hallucination risk during generation.\r\n */\r\n\r\nimport type { ContextItem } from '../context/advanced-context-manager.js';\r\n\r\nexport interface PromptConfig {\r\n maxTokens: number;\r\n includeExamples: boolean;\r\n includeConventions: boolean;\r\n includeTruthpack: boolean;\r\n template: string;\r\n}\r\n\r\nexport interface BuiltPrompt {\r\n content: string;\r\n tokenCount: number;\r\n contextSources: string[];\r\n quality: {\r\n score: number;\r\n warnings: string[];\r\n };\r\n}\r\n\r\nexport interface PromptSection {\r\n name: string;\r\n content: string;\r\n priority: number;\r\n required: boolean;\r\n}\r\n\r\nconst DEFAULT_CONFIG: PromptConfig = {\r\n maxTokens: 8000,\r\n includeExamples: true,\r\n includeConventions: true,\r\n includeTruthpack: true,\r\n template: 'code-generation',\r\n};\r\n\r\nexport class PromptBuilder {\r\n private config: PromptConfig;\r\n private sections: PromptSection[] = [];\r\n\r\n constructor(config: Partial<PromptConfig> = {}) {\r\n this.config = { ...DEFAULT_CONFIG, ...config };\r\n }\r\n\r\n /**\r\n * Add a section to the prompt\r\n */\r\n addSection(section: PromptSection): this {\r\n this.sections.push(section);\r\n return this;\r\n }\r\n\r\n /**\r\n * Add context items to the prompt\r\n */\r\n addContext(items: ContextItem[]): this {\r\n for (const item of items) {\r\n this.sections.push({\r\n name: `context-${item.id}`,\r\n content: this.formatContextItem(item),\r\n priority: this.getPriorityForLayer(item.layer.name),\r\n required: item.layer.required,\r\n });\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Add the user's task description\r\n */\r\n setTask(task: string): this {\r\n this.sections.push({\r\n name: 'task',\r\n content: `## Task\\n\\n${task}`,\r\n priority: 0,\r\n required: true,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Build the final prompt\r\n */\r\n build(): BuiltPrompt {\r\n // Sort sections by priority\r\n const sortedSections = [...this.sections].sort((a, b) => a.priority - b.priority);\r\n \r\n // Build content respecting token limit\r\n let content = '';\r\n let tokenCount = 0;\r\n const includedSources: string[] = [];\r\n const warnings: string[] = [];\r\n\r\n for (const section of sortedSections) {\r\n const sectionTokens = this.estimateTokens(section.content);\r\n \r\n if (tokenCount + sectionTokens <= this.config.maxTokens) {\r\n content += section.content + '\\n\\n';\r\n tokenCount += sectionTokens;\r\n includedSources.push(section.name);\r\n } else if (section.required) {\r\n // Truncate required sections to fit\r\n const availableTokens = this.config.maxTokens - tokenCount;\r\n const truncated = this.truncateToTokens(section.content, availableTokens);\r\n content += truncated + '\\n\\n';\r\n tokenCount += availableTokens;\r\n includedSources.push(section.name);\r\n warnings.push(`Section \"${section.name}\" was truncated to fit token limit`);\r\n } else {\r\n warnings.push(`Section \"${section.name}\" was omitted due to token limit`);\r\n }\r\n }\r\n\r\n const quality = this.assessQuality(includedSources, warnings);\r\n\r\n return {\r\n content: content.trim(),\r\n tokenCount,\r\n contextSources: includedSources,\r\n quality,\r\n };\r\n }\r\n\r\n /**\r\n * Reset the builder for a new prompt\r\n */\r\n reset(): this {\r\n this.sections = [];\r\n return this;\r\n }\r\n\r\n private formatContextItem(item: ContextItem): string {\r\n return `### ${item.layer.name}: ${item.source}\\n\\n${item.content}`;\r\n }\r\n\r\n private getPriorityForLayer(layerName: string): number {\r\n const priorities: Record<string, number> = {\r\n truthpack: 1,\r\n codebase_structure: 2,\r\n recent_changes: 3,\r\n conventions: 4,\r\n documentation: 5,\r\n examples: 6,\r\n };\r\n return priorities[layerName] ?? 10;\r\n }\r\n\r\n private estimateTokens(content: string): number {\r\n // Rough estimate: ~4 characters per token\r\n return Math.ceil(content.length / 4);\r\n }\r\n\r\n private truncateToTokens(content: string, maxTokens: number): string {\r\n const maxChars = maxTokens * 4;\r\n if (content.length <= maxChars) return content;\r\n return content.slice(0, maxChars - 3) + '...';\r\n }\r\n\r\n private assessQuality(\r\n includedSources: string[],\r\n warnings: string[]\r\n ): { score: number; warnings: string[] } {\r\n let score = 1.0;\r\n\r\n // Penalize for missing critical sections\r\n if (!includedSources.some((s) => s.includes('truthpack'))) {\r\n score -= 0.2;\r\n warnings.push('Missing truthpack context - hallucination risk increased');\r\n }\r\n if (!includedSources.includes('task')) {\r\n score -= 0.3;\r\n warnings.push('Missing task description');\r\n }\r\n\r\n // Penalize for truncations\r\n score -= warnings.filter((w) => w.includes('truncated')).length * 0.05;\r\n\r\n return {\r\n score: Math.max(0, score),\r\n warnings,\r\n };\r\n }\r\n}\r\n","/**\r\n * Context Injector\r\n * \r\n * Intelligently injects relevant context into prompts\r\n * based on the task at hand.\r\n */\r\n\r\nimport type { ContextItem } from '../context/advanced-context-manager.js';\r\n\r\nexport interface InjectionConfig {\r\n maxContextItems: number;\r\n minRelevanceScore: number;\r\n preferFresh: boolean;\r\n requiredCategories: string[];\r\n}\r\n\r\nexport interface InjectionResult {\r\n injectedItems: ContextItem[];\r\n totalTokens: number;\r\n coverage: Record<string, number>;\r\n}\r\n\r\nconst DEFAULT_CONFIG: InjectionConfig = {\r\n maxContextItems: 10,\r\n minRelevanceScore: 0.5,\r\n preferFresh: true,\r\n requiredCategories: ['truthpack'],\r\n};\r\n\r\nexport class ContextInjector {\r\n private config: InjectionConfig;\r\n\r\n constructor(config: Partial<InjectionConfig> = {}) {\r\n this.config = { ...DEFAULT_CONFIG, ...config };\r\n }\r\n\r\n /**\r\n * Select and inject context items for a task\r\n */\r\n inject(\r\n availableContext: ContextItem[],\r\n task: string,\r\n maxTokens: number\r\n ): InjectionResult {\r\n // Score items by relevance to task\r\n const scoredItems = this.scoreItems(availableContext, task);\r\n\r\n // Filter by minimum relevance\r\n const relevantItems = scoredItems.filter(\r\n (item) => item.score >= this.config.minRelevanceScore\r\n );\r\n\r\n // Ensure required categories are included\r\n const selectedItems = this.selectItems(relevantItems, maxTokens);\r\n\r\n return {\r\n injectedItems: selectedItems.map((s) => s.item),\r\n totalTokens: selectedItems.reduce((sum, s) => sum + s.tokens, 0),\r\n coverage: this.calculateCoverage(selectedItems.map((s) => s.item)),\r\n };\r\n }\r\n\r\n /**\r\n * Inject context for a specific file edit\r\n */\r\n injectForFileEdit(\r\n availableContext: ContextItem[],\r\n filePath: string,\r\n maxTokens: number\r\n ): InjectionResult {\r\n // Prioritize context related to the file\r\n const fileRelated = availableContext.filter(\r\n (item) => item.metadata.relatedFiles?.includes(filePath) ||\r\n item.source.includes(filePath)\r\n );\r\n\r\n const otherContext = availableContext.filter(\r\n (item) => !fileRelated.includes(item)\r\n );\r\n\r\n // Combine with file-related items first\r\n const combined = [...fileRelated, ...otherContext];\r\n \r\n return this.inject(combined, `Editing file: ${filePath}`, maxTokens);\r\n }\r\n\r\n private scoreItems(\r\n items: ContextItem[],\r\n task: string\r\n ): Array<{ item: ContextItem; score: number; tokens: number }> {\r\n return items.map((item) => ({\r\n item,\r\n score: this.calculateRelevance(item, task),\r\n tokens: this.estimateTokens(item.content),\r\n }));\r\n }\r\n\r\n private calculateRelevance(item: ContextItem, task: string): number {\r\n let score = 0.5; // Base score\r\n\r\n // Boost for freshness\r\n if (this.config.preferFresh && item.freshness.score > 0.7) {\r\n score += 0.2;\r\n }\r\n\r\n // Boost for required categories\r\n if (this.config.requiredCategories.includes(item.layer.name)) {\r\n score += 0.3;\r\n }\r\n\r\n // TODO: Implement semantic similarity scoring\r\n // - Use embeddings to compare task to context\r\n // - Adjust score based on similarity\r\n\r\n // Simple keyword matching for now\r\n const taskWords = task.toLowerCase().split(/\\W+/);\r\n const contentWords = item.content.toLowerCase().split(/\\W+/);\r\n const overlap = taskWords.filter((w) => contentWords.includes(w)).length;\r\n score += Math.min(0.3, overlap * 0.05);\r\n\r\n return Math.min(1, score);\r\n }\r\n\r\n private selectItems(\r\n scoredItems: Array<{ item: ContextItem; score: number; tokens: number }>,\r\n maxTokens: number\r\n ): Array<{ item: ContextItem; score: number; tokens: number }> {\r\n // Sort by score descending\r\n const sorted = [...scoredItems].sort((a, b) => b.score - a.score);\r\n\r\n const selected: Array<{ item: ContextItem; score: number; tokens: number }> = [];\r\n let totalTokens = 0;\r\n\r\n // First, ensure required categories are included\r\n for (const category of this.config.requiredCategories) {\r\n const categoryItem = sorted.find(\r\n (s) => s.item.layer.name === category && !selected.includes(s)\r\n );\r\n if (categoryItem && totalTokens + categoryItem.tokens <= maxTokens) {\r\n selected.push(categoryItem);\r\n totalTokens += categoryItem.tokens;\r\n }\r\n }\r\n\r\n // Fill remaining space with highest-scoring items\r\n for (const item of sorted) {\r\n if (selected.length >= this.config.maxContextItems) break;\r\n if (selected.includes(item)) continue;\r\n if (totalTokens + item.tokens > maxTokens) continue;\r\n\r\n selected.push(item);\r\n totalTokens += item.tokens;\r\n }\r\n\r\n return selected;\r\n }\r\n\r\n private calculateCoverage(items: ContextItem[]): Record<string, number> {\r\n const coverage: Record<string, number> = {};\r\n \r\n for (const item of items) {\r\n const layer = item.layer.name;\r\n coverage[layer] = (coverage[layer] ?? 0) + 1;\r\n }\r\n\r\n return coverage;\r\n }\r\n\r\n private estimateTokens(content: string): number {\r\n return Math.ceil(content.length / 4);\r\n }\r\n}\r\n","/**\r\n * Quality Analyzer\r\n * \r\n * Analyzes prompt quality and provides recommendations\r\n * for improvement to reduce hallucination risk.\r\n */\r\n\r\nexport interface QualityReport {\r\n score: number;\r\n grade: 'A' | 'B' | 'C' | 'D' | 'F';\r\n factors: QualityFactor[];\r\n recommendations: string[];\r\n hallucinationRisk: 'low' | 'medium' | 'high';\r\n}\r\n\r\nexport interface QualityFactor {\r\n name: string;\r\n score: number;\r\n weight: number;\r\n details: string;\r\n}\r\n\r\nexport interface AnalyzerConfig {\r\n minAcceptableScore: number;\r\n requiredFactors: string[];\r\n}\r\n\r\nconst DEFAULT_CONFIG: AnalyzerConfig = {\r\n minAcceptableScore: 0.6,\r\n requiredFactors: ['context_coverage', 'task_clarity'],\r\n};\r\n\r\nexport class QualityAnalyzer {\r\n private config: AnalyzerConfig;\r\n\r\n constructor(config: Partial<AnalyzerConfig> = {}) {\r\n this.config = { ...DEFAULT_CONFIG, ...config };\r\n }\r\n\r\n /**\r\n * Analyze prompt quality\r\n */\r\n analyze(prompt: string, contextSources: string[]): QualityReport {\r\n const factors: QualityFactor[] = [];\r\n\r\n // Analyze context coverage\r\n factors.push(this.analyzeContextCoverage(contextSources));\r\n\r\n // Analyze task clarity\r\n factors.push(this.analyzeTaskClarity(prompt));\r\n\r\n // Analyze specificity\r\n factors.push(this.analyzeSpecificity(prompt));\r\n\r\n // Analyze length\r\n factors.push(this.analyzeLength(prompt));\r\n\r\n // Analyze grounding\r\n factors.push(this.analyzeGrounding(prompt, contextSources));\r\n\r\n const score = this.calculateOverallScore(factors);\r\n const grade = this.scoreToGrade(score);\r\n const recommendations = this.generateRecommendations(factors);\r\n const hallucinationRisk = this.assessHallucinationRisk(score, factors);\r\n\r\n return {\r\n score,\r\n grade,\r\n factors,\r\n recommendations,\r\n hallucinationRisk,\r\n };\r\n }\r\n\r\n /**\r\n * Quick quality check\r\n */\r\n quickCheck(prompt: string): { acceptable: boolean; issues: string[] } {\r\n const issues: string[] = [];\r\n\r\n if (prompt.length < 100) {\r\n issues.push('Prompt is too short - add more context');\r\n }\r\n\r\n if (!prompt.includes('##') && !prompt.includes('Task')) {\r\n issues.push('Prompt lacks clear structure');\r\n }\r\n\r\n if (prompt.split(/\\s+/).length < 50) {\r\n issues.push('Prompt may lack sufficient detail');\r\n }\r\n\r\n return {\r\n acceptable: issues.length === 0,\r\n issues,\r\n };\r\n }\r\n\r\n private analyzeContextCoverage(contextSources: string[]): QualityFactor {\r\n const expectedSources = ['truthpack', 'conventions', 'examples'];\r\n const covered = expectedSources.filter((s) => \r\n contextSources.some((cs) => cs.includes(s))\r\n );\r\n \r\n const score = covered.length / expectedSources.length;\r\n\r\n return {\r\n name: 'context_coverage',\r\n score,\r\n weight: 0.3,\r\n details: `${covered.length}/${expectedSources.length} expected context types included`,\r\n };\r\n }\r\n\r\n private analyzeTaskClarity(prompt: string): QualityFactor {\r\n let score = 0.5;\r\n\r\n // Check for clear task section\r\n if (prompt.includes('## Task') || prompt.includes('Task:')) {\r\n score += 0.2;\r\n }\r\n\r\n // Check for actionable verbs\r\n const actionVerbs = ['create', 'implement', 'fix', 'add', 'update', 'modify', 'refactor'];\r\n if (actionVerbs.some((v) => prompt.toLowerCase().includes(v))) {\r\n score += 0.15;\r\n }\r\n\r\n // Check for specificity indicators\r\n if (prompt.includes('should') || prompt.includes('must')) {\r\n score += 0.15;\r\n }\r\n\r\n return {\r\n name: 'task_clarity',\r\n score: Math.min(1, score),\r\n weight: 0.25,\r\n details: 'Task description clarity assessment',\r\n };\r\n }\r\n\r\n private analyzeSpecificity(prompt: string): QualityFactor {\r\n let score = 0.5;\r\n\r\n // Check for file references\r\n if (/\\w+\\.(ts|js|tsx|jsx|json)/.test(prompt)) {\r\n score += 0.2;\r\n }\r\n\r\n // Check for code examples\r\n if (prompt.includes('```')) {\r\n score += 0.15;\r\n }\r\n\r\n // Check for type references\r\n if (/:\\s*\\w+/.test(prompt)) {\r\n score += 0.15;\r\n }\r\n\r\n return {\r\n name: 'specificity',\r\n score: Math.min(1, score),\r\n weight: 0.2,\r\n details: 'Level of specific details and references',\r\n };\r\n }\r\n\r\n private analyzeLength(prompt: string): QualityFactor {\r\n const wordCount = prompt.split(/\\s+/).length;\r\n \r\n let score: number;\r\n if (wordCount < 100) {\r\n score = 0.3;\r\n } else if (wordCount < 300) {\r\n score = 0.6;\r\n } else if (wordCount < 1000) {\r\n score = 0.9;\r\n } else if (wordCount < 2000) {\r\n score = 1.0;\r\n } else {\r\n score = 0.8; // Too long can be problematic\r\n }\r\n\r\n return {\r\n name: 'length',\r\n score,\r\n weight: 0.1,\r\n details: `${wordCount} words`,\r\n };\r\n }\r\n\r\n private analyzeGrounding(prompt: string, contextSources: string[]): QualityFactor {\r\n let score = 0.5;\r\n\r\n // Check for truthpack grounding\r\n if (contextSources.some((s) => s.includes('truthpack'))) {\r\n score += 0.3;\r\n }\r\n\r\n // Check for explicit grounding statements\r\n if (prompt.includes('based on') || prompt.includes('according to')) {\r\n score += 0.1;\r\n }\r\n\r\n // Check for verification instructions\r\n if (prompt.includes('verify') || prompt.includes('check')) {\r\n score += 0.1;\r\n }\r\n\r\n return {\r\n name: 'grounding',\r\n score: Math.min(1, score),\r\n weight: 0.15,\r\n details: 'Level of grounding in verified facts',\r\n };\r\n }\r\n\r\n private calculateOverallScore(factors: QualityFactor[]): number {\r\n const weightSum = factors.reduce((sum, f) => sum + f.weight, 0);\r\n const weightedScore = factors.reduce((sum, f) => sum + f.score * f.weight, 0);\r\n return weightedScore / weightSum;\r\n }\r\n\r\n private scoreToGrade(score: number): 'A' | 'B' | 'C' | 'D' | 'F' {\r\n if (score >= 0.9) return 'A';\r\n if (score >= 0.8) return 'B';\r\n if (score >= 0.7) return 'C';\r\n if (score >= 0.6) return 'D';\r\n return 'F';\r\n }\r\n\r\n private generateRecommendations(factors: QualityFactor[]): string[] {\r\n const recommendations: string[] = [];\r\n\r\n for (const factor of factors) {\r\n if (factor.score < 0.6) {\r\n switch (factor.name) {\r\n case 'context_coverage':\r\n recommendations.push('Add more context types (truthpack, conventions, examples)');\r\n break;\r\n case 'task_clarity':\r\n recommendations.push('Make the task description more specific with clear action verbs');\r\n break;\r\n case 'specificity':\r\n recommendations.push('Include file names, type references, or code examples');\r\n break;\r\n case 'length':\r\n recommendations.push('Add more detail to the prompt');\r\n break;\r\n case 'grounding':\r\n recommendations.push('Ground the request in verified truthpack data');\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return recommendations;\r\n }\r\n\r\n private assessHallucinationRisk(\r\n score: number,\r\n factors: QualityFactor[]\r\n ): 'low' | 'medium' | 'high' {\r\n const groundingFactor = factors.find((f) => f.name === 'grounding');\r\n const contextFactor = factors.find((f) => f.name === 'context_coverage');\r\n\r\n if (score >= 0.8 && groundingFactor && groundingFactor.score >= 0.7) {\r\n return 'low';\r\n }\r\n\r\n if (score < 0.5 || (contextFactor && contextFactor.score < 0.5)) {\r\n return 'high';\r\n }\r\n\r\n return 'medium';\r\n }\r\n}\r\n","/**\r\n * Task Planner\r\n * \r\n * Breaks down complex tasks into smaller, verifiable sub-tasks.\r\n * Each sub-task can be independently verified against the truthpack.\r\n */\r\n\r\nexport interface Task {\r\n id: string;\r\n description: string;\r\n type: 'create' | 'modify' | 'delete' | 'refactor' | 'test' | 'document';\r\n scope: {\r\n files: string[];\r\n modules: string[];\r\n };\r\n dependencies: string[];\r\n verificationPoints: VerificationPoint[];\r\n estimatedComplexity: 'trivial' | 'simple' | 'moderate' | 'complex';\r\n}\r\n\r\nexport interface VerificationPoint {\r\n id: string;\r\n type: 'import' | 'export' | 'type' | 'api' | 'env' | 'test' | 'lint';\r\n description: string;\r\n checkCommand?: string;\r\n expectedOutcome: string;\r\n}\r\n\r\nexport interface TaskPlan {\r\n originalTask: string;\r\n tasks: Task[];\r\n executionOrder: string[];\r\n totalComplexity: 'trivial' | 'simple' | 'moderate' | 'complex';\r\n warnings: string[];\r\n requiredContext: string[];\r\n}\r\n\r\nexport interface PlannerConfig {\r\n maxTasksPerPlan: number;\r\n includeTests: boolean;\r\n includeDocumentation: boolean;\r\n verboseVerification: boolean;\r\n}\r\n\r\nconst DEFAULT_CONFIG: PlannerConfig = {\r\n maxTasksPerPlan: 10,\r\n includeTests: true,\r\n includeDocumentation: false,\r\n verboseVerification: true,\r\n};\r\n\r\n// Task type patterns\r\nconst TASK_PATTERNS = {\r\n create: /\\b(create|add|implement|build|make|generate|write)\\b/i,\r\n modify: /\\b(update|change|modify|edit|fix|improve|enhance|refactor)\\b/i,\r\n delete: /\\b(remove|delete|drop|clear|clean)\\b/i,\r\n refactor: /\\b(refactor|restructure|reorganize|optimize|simplify)\\b/i,\r\n test: /\\b(test|spec|coverage|verify)\\b/i,\r\n document: /\\b(document|comment|readme|docs)\\b/i,\r\n};\r\n\r\n// Scope indicators\r\nconst SCOPE_PATTERNS = {\r\n component: /\\b(component|widget|element|ui)\\b/i,\r\n service: /\\b(service|provider|manager|handler)\\b/i,\r\n api: /\\b(api|endpoint|route|controller)\\b/i,\r\n model: /\\b(model|schema|type|interface|entity)\\b/i,\r\n util: /\\b(util|helper|function|method)\\b/i,\r\n config: /\\b(config|setting|option|env)\\b/i,\r\n test: /\\b(test|spec|mock)\\b/i,\r\n};\r\n\r\nexport class TaskPlanner {\r\n private config: PlannerConfig;\r\n\r\n constructor(config: Partial<PlannerConfig> = {}) {\r\n this.config = { ...DEFAULT_CONFIG, ...config };\r\n }\r\n\r\n /**\r\n * Create a plan from a task description\r\n */\r\n plan(taskDescription: string): TaskPlan {\r\n const warnings: string[] = [];\r\n const requiredContext: string[] = [];\r\n\r\n // Analyze the task\r\n const taskType = this.detectTaskType(taskDescription);\r\n const scope = this.detectScope(taskDescription);\r\n const complexity = this.estimateComplexity(taskDescription, scope);\r\n\r\n // Check for ambiguous or risky tasks\r\n const riskAnalysis = this.analyzeRisks(taskDescription);\r\n warnings.push(...riskAnalysis.warnings);\r\n\r\n // Determine required context\r\n if (scope.includes('api')) {\r\n requiredContext.push('routes', 'contracts');\r\n }\r\n if (scope.includes('config') || taskDescription.toLowerCase().includes('env')) {\r\n requiredContext.push('env');\r\n }\r\n if (scope.includes('service') || scope.includes('model')) {\r\n requiredContext.push('auth');\r\n }\r\n\r\n // Break down into sub-tasks\r\n const tasks = this.breakdownTask(taskDescription, taskType, scope, complexity);\r\n\r\n // Determine execution order based on dependencies\r\n const executionOrder = this.determineExecutionOrder(tasks);\r\n\r\n // Calculate total complexity\r\n const totalComplexity = this.aggregateComplexity(tasks);\r\n\r\n return {\r\n originalTask: taskDescription,\r\n tasks,\r\n executionOrder,\r\n totalComplexity,\r\n warnings,\r\n requiredContext,\r\n };\r\n }\r\n\r\n private detectTaskType(description: string): Task['type'] {\r\n for (const [type, pattern] of Object.entries(TASK_PATTERNS)) {\r\n if (pattern.test(description)) {\r\n return type as Task['type'];\r\n }\r\n }\r\n return 'modify';\r\n }\r\n\r\n private detectScope(description: string): string[] {\r\n const scopes: string[] = [];\r\n \r\n for (const [scope, pattern] of Object.entries(SCOPE_PATTERNS)) {\r\n if (pattern.test(description)) {\r\n scopes.push(scope);\r\n }\r\n }\r\n\r\n return scopes.length > 0 ? scopes : ['general'];\r\n }\r\n\r\n private estimateComplexity(\r\n description: string, \r\n scope: string[]\r\n ): Task['estimatedComplexity'] {\r\n let score = 0;\r\n\r\n if (description.length > 200) score += 2;\r\n else if (description.length > 100) score += 1;\r\n\r\n score += scope.length;\r\n\r\n const complexKeywords = [\r\n 'multiple', 'all', 'entire', 'database', 'migration',\r\n 'authentication', 'authorization', 'security', 'performance',\r\n 'refactor', 'restructure', 'integration',\r\n ];\r\n\r\n for (const keyword of complexKeywords) {\r\n if (description.toLowerCase().includes(keyword)) {\r\n score += 1;\r\n }\r\n }\r\n\r\n if (score <= 1) return 'trivial';\r\n if (score <= 3) return 'simple';\r\n if (score <= 5) return 'moderate';\r\n return 'complex';\r\n }\r\n\r\n private analyzeRisks(description: string): { warnings: string[] } {\r\n const warnings: string[] = [];\r\n\r\n if (description.length < 20) {\r\n warnings.push('Task description is very short - consider adding more detail');\r\n }\r\n\r\n if (/\\b(the|that|this)\\s+(function|file|component|class)\\b/i.test(description)) {\r\n warnings.push('Task contains ambiguous references - specify exact names');\r\n }\r\n\r\n if (/\\b(all|every|entire)\\s+(file|component|function)/i.test(description)) {\r\n warnings.push('Task scope is very broad - consider breaking into smaller tasks');\r\n }\r\n\r\n if (description.toLowerCase().includes('delete all') || description.toLowerCase().includes('drop')) {\r\n warnings.push('Task involves destructive operations - verify intent');\r\n }\r\n\r\n if ((description.match(/\\band\\b/gi) || []).length > 2) {\r\n warnings.push('Task may be doing too many things - consider splitting');\r\n }\r\n\r\n return { warnings };\r\n }\r\n\r\n private breakdownTask(\r\n description: string,\r\n taskType: Task['type'],\r\n scope: string[],\r\n complexity: Task['estimatedComplexity']\r\n ): Task[] {\r\n const tasks: Task[] = [];\r\n const taskId = () => `task-${tasks.length + 1}`;\r\n\r\n if (complexity === 'trivial' || complexity === 'simple') {\r\n tasks.push(this.createTask(taskId(), description, taskType, scope, []));\r\n return tasks;\r\n }\r\n\r\n if (taskType === 'create' || taskType === 'modify') {\r\n tasks.push(this.createTask(\r\n taskId(),\r\n `Analyze requirements and identify affected files for: ${description}`,\r\n 'modify',\r\n scope,\r\n []\r\n ));\r\n }\r\n\r\n if (scope.includes('model') || scope.includes('api')) {\r\n tasks.push(this.createTask(\r\n taskId(),\r\n 'Define or update type definitions and interfaces',\r\n taskType,\r\n ['model'],\r\n [tasks[tasks.length - 1]?.id].filter(Boolean)\r\n ));\r\n }\r\n\r\n tasks.push(this.createTask(\r\n taskId(),\r\n `Implement core changes: ${description}`,\r\n taskType,\r\n scope,\r\n tasks.map(t => t.id)\r\n ));\r\n\r\n if (scope.length > 1 || scope.includes('api') || scope.includes('service')) {\r\n tasks.push(this.createTask(\r\n taskId(),\r\n 'Integrate changes and update imports/exports',\r\n 'modify',\r\n scope,\r\n [tasks[tasks.length - 1].id]\r\n ));\r\n }\r\n\r\n if (this.config.includeTests && taskType !== 'test') {\r\n tasks.push(this.createTask(\r\n taskId(),\r\n 'Add or update tests for the changes',\r\n 'test',\r\n ['test'],\r\n [tasks[tasks.length - 1].id]\r\n ));\r\n }\r\n\r\n if (this.config.includeDocumentation) {\r\n tasks.push(this.createTask(\r\n taskId(),\r\n 'Update documentation and comments',\r\n 'document',\r\n ['general'],\r\n [tasks[tasks.length - 1].id]\r\n ));\r\n }\r\n\r\n return tasks.slice(0, this.config.maxTasksPerPlan);\r\n }\r\n\r\n private createTask(\r\n id: string,\r\n description: string,\r\n type: Task['type'],\r\n scope: string[],\r\n dependencies: string[]\r\n ): Task {\r\n const verificationPoints = this.generateVerificationPoints(type, scope);\r\n \r\n return {\r\n id,\r\n description,\r\n type,\r\n scope: {\r\n files: this.inferFiles(description, scope),\r\n modules: scope,\r\n },\r\n dependencies,\r\n verificationPoints,\r\n estimatedComplexity: this.estimateComplexity(description, scope),\r\n };\r\n }\r\n\r\n private generateVerificationPoints(\r\n type: Task['type'],\r\n scope: string[]\r\n ): VerificationPoint[] {\r\n const points: VerificationPoint[] = [];\r\n const pointId = () => `verify-${points.length + 1}`;\r\n\r\n points.push({\r\n id: pointId(),\r\n type: 'lint',\r\n description: 'Code passes linting',\r\n checkCommand: 'pnpm lint',\r\n expectedOutcome: 'No lint errors',\r\n });\r\n\r\n if (scope.includes('model') || scope.includes('api')) {\r\n points.push({\r\n id: pointId(),\r\n type: 'type',\r\n description: 'TypeScript compiles without errors',\r\n checkCommand: 'pnpm check-types',\r\n expectedOutcome: 'No type errors',\r\n });\r\n }\r\n\r\n if (type === 'create' || type === 'modify') {\r\n points.push({\r\n id: pointId(),\r\n type: 'import',\r\n description: 'All imports resolve to existing modules',\r\n expectedOutcome: 'No ghost imports',\r\n });\r\n }\r\n\r\n if (scope.includes('api')) {\r\n points.push({\r\n id: pointId(),\r\n type: 'api',\r\n description: 'API endpoints match truthpack routes',\r\n expectedOutcome: 'All routes exist in truthpack',\r\n });\r\n }\r\n\r\n if (scope.includes('config')) {\r\n points.push({\r\n id: pointId(),\r\n type: 'env',\r\n description: 'Environment variables are declared',\r\n expectedOutcome: 'All env vars in .env.example',\r\n });\r\n }\r\n\r\n if (type === 'test' || this.config.includeTests) {\r\n points.push({\r\n id: pointId(),\r\n type: 'test',\r\n description: 'Tests pass',\r\n checkCommand: 'pnpm test',\r\n expectedOutcome: 'All tests pass',\r\n });\r\n }\r\n\r\n return points;\r\n }\r\n\r\n private inferFiles(description: string, scope: string[]): string[] {\r\n const files: string[] = [];\r\n\r\n const filePatterns = [\r\n /`([^`]+\\.(ts|tsx|js|jsx))`/g,\r\n /['\"]([^'\"]+\\.(ts|tsx|js|jsx))['\"]/g,\r\n /\\b(\\w+\\.(?:ts|tsx|js|jsx))\\b/g,\r\n ];\r\n\r\n for (const pattern of filePatterns) {\r\n let match;\r\n while ((match = pattern.exec(description)) !== null) {\r\n files.push(match[1]);\r\n }\r\n }\r\n\r\n const scopeToDir: Record<string, string> = {\r\n component: 'src/components/',\r\n service: 'src/services/',\r\n api: 'src/api/',\r\n model: 'src/types/',\r\n util: 'src/utils/',\r\n config: 'src/config/',\r\n test: '__tests__/',\r\n };\r\n\r\n for (const s of scope) {\r\n if (scopeToDir[s]) {\r\n files.push(`${scopeToDir[s]}**/*`);\r\n }\r\n }\r\n\r\n return [...new Set(files)];\r\n }\r\n\r\n private determineExecutionOrder(tasks: Task[]): string[] {\r\n const order: string[] = [];\r\n const remaining = new Set(tasks.map(t => t.id));\r\n const completed = new Set<string>();\r\n\r\n while (remaining.size > 0) {\r\n let progress = false;\r\n\r\n for (const task of tasks) {\r\n if (!remaining.has(task.id)) continue;\r\n\r\n const depsCompleted = task.dependencies.every(d => completed.has(d));\r\n \r\n if (depsCompleted) {\r\n order.push(task.id);\r\n completed.add(task.id);\r\n remaining.delete(task.id);\r\n progress = true;\r\n }\r\n }\r\n\r\n if (!progress && remaining.size > 0) {\r\n for (const id of remaining) {\r\n order.push(id);\r\n }\r\n break;\r\n }\r\n }\r\n\r\n return order;\r\n }\r\n\r\n private aggregateComplexity(tasks: Task[]): Task['estimatedComplexity'] {\r\n if (tasks.length === 0) return 'trivial';\r\n if (tasks.length <= 2) return 'simple';\r\n if (tasks.length <= 4) return 'moderate';\r\n return 'complex';\r\n }\r\n\r\n /**\r\n * Generate a prompt for a specific task\r\n */\r\n generateTaskPrompt(task: Task, truthpackContext?: Record<string, unknown>): string {\r\n const sections: string[] = [];\r\n\r\n sections.push(`## Task: ${task.description}`);\r\n sections.push('');\r\n sections.push(`**Type:** ${task.type}`);\r\n sections.push(`**Complexity:** ${task.estimatedComplexity}`);\r\n sections.push(`**Scope:** ${task.scope.modules.join(', ')}`);\r\n \r\n if (task.scope.files.length > 0) {\r\n sections.push(`**Files:** ${task.scope.files.join(', ')}`);\r\n }\r\n\r\n sections.push('');\r\n sections.push('### Verification Requirements');\r\n sections.push('');\r\n \r\n for (const point of task.verificationPoints) {\r\n sections.push(`- [ ] ${point.description}`);\r\n if (point.checkCommand) {\r\n sections.push(` Command: \\`${point.checkCommand}\\``);\r\n }\r\n }\r\n\r\n if (truthpackContext && Object.keys(truthpackContext).length > 0) {\r\n sections.push('');\r\n sections.push('### Context from Truthpack');\r\n sections.push('');\r\n sections.push('```json');\r\n sections.push(JSON.stringify(truthpackContext, null, 2));\r\n sections.push('```');\r\n }\r\n\r\n return sections.join('\\n');\r\n }\r\n}\r\n","/**\r\n * Prompt Verifier\r\n * \r\n * Verifies prompts before they are sent to AI models.\r\n * Detects potential issues that could lead to hallucinations.\r\n */\r\n\r\nexport interface VerificationIssue {\r\n type: 'warning' | 'error' | 'info';\r\n category: 'ambiguity' | 'scope' | 'safety' | 'context' | 'feasibility';\r\n message: string;\r\n suggestion?: string;\r\n location?: {\r\n start: number;\r\n end: number;\r\n };\r\n}\r\n\r\nexport interface PromptVerificationResult {\r\n valid: boolean;\r\n score: number;\r\n issues: VerificationIssue[];\r\n enhancedPrompt?: string;\r\n requiredContext: string[];\r\n estimatedRisk: 'low' | 'medium' | 'high';\r\n}\r\n\r\nexport interface VerifierConfig {\r\n strictMode: boolean;\r\n maxPromptLength: number;\r\n requireExplicitFiles: boolean;\r\n blockDangerousPatterns: boolean;\r\n}\r\n\r\nconst DEFAULT_CONFIG: VerifierConfig = {\r\n strictMode: true,\r\n maxPromptLength: 10000,\r\n requireExplicitFiles: false,\r\n blockDangerousPatterns: true,\r\n};\r\n\r\nconst AMBIGUOUS_PATTERNS = [\r\n { pattern: /\\bthe file\\b/i, message: 'Ambiguous file reference - specify the exact filename' },\r\n { pattern: /\\bthat function\\b/i, message: 'Ambiguous function reference - specify the exact function name' },\r\n { pattern: /\\bthe component\\b/i, message: 'Ambiguous component reference - specify the exact component name' },\r\n { pattern: /\\bthe class\\b/i, message: 'Ambiguous class reference - specify the exact class name' },\r\n { pattern: /\\bsomewhere\\b/i, message: 'Vague location reference - specify exact location' },\r\n { pattern: /\\bmaybe\\b/i, message: 'Uncertain instruction - be more specific' },\r\n { pattern: /\\bsimilar to\\b/i, message: 'Reference by similarity - provide exact example or specification' },\r\n];\r\n\r\nconst DANGEROUS_PATTERNS = [\r\n { pattern: /\\bdelete all\\b/i, message: 'Bulk delete operation - be specific about what to delete' },\r\n { pattern: /\\bdrop\\s+(table|database)\\b/i, message: 'Database drop operation - verify intent' },\r\n { pattern: /\\brm\\s+-rf\\b/i, message: 'Recursive delete command - extremely dangerous' },\r\n { pattern: /\\beval\\b/i, message: 'eval usage detected - avoid if possible' },\r\n];\r\n\r\nconst SCOPE_EXPLOSION_PATTERNS = [\r\n { pattern: /\\ball files\\b/i, threshold: 'high' as const },\r\n { pattern: /\\bentire project\\b/i, threshold: 'high' as const },\r\n { pattern: /\\beverything\\b/i, threshold: 'high' as const },\r\n { pattern: /\\brefactor all\\b/i, threshold: 'high' as const },\r\n { pattern: /\\bmultiple\\b/i, threshold: 'medium' as const },\r\n];\r\n\r\nconst CONTEXT_INDICATORS = {\r\n routes: /\\b(api|endpoint|route|fetch|request)\\b/i,\r\n env: /\\b(env|environment|config|process\\.env)\\b/i,\r\n auth: /\\b(auth|login|permission|role|token)\\b/i,\r\n contracts: /\\b(schema|type|interface|contract|zod)\\b/i,\r\n};\r\n\r\nexport class PromptVerifier {\r\n private config: VerifierConfig;\r\n\r\n constructor(config: Partial<VerifierConfig> = {}) {\r\n this.config = { ...DEFAULT_CONFIG, ...config };\r\n }\r\n\r\n /**\r\n * Verify a prompt and return issues\r\n */\r\n verify(prompt: string): PromptVerificationResult {\r\n const issues: VerificationIssue[] = [];\r\n let score = 100;\r\n\r\n if (prompt.length > this.config.maxPromptLength) {\r\n issues.push({\r\n type: 'warning',\r\n category: 'scope',\r\n message: `Prompt is very long (${prompt.length} chars) - consider breaking into smaller requests`,\r\n });\r\n score -= 10;\r\n }\r\n\r\n if (prompt.length < 20) {\r\n issues.push({\r\n type: 'warning',\r\n category: 'ambiguity',\r\n message: 'Prompt is very short - consider adding more detail',\r\n });\r\n score -= 15;\r\n }\r\n\r\n for (const { pattern, message } of AMBIGUOUS_PATTERNS) {\r\n const match = prompt.match(pattern);\r\n if (match) {\r\n issues.push({\r\n type: 'warning',\r\n category: 'ambiguity',\r\n message,\r\n location: match.index !== undefined ? {\r\n start: match.index,\r\n end: match.index + match[0].length,\r\n } : undefined,\r\n });\r\n score -= 5;\r\n }\r\n }\r\n\r\n for (const { pattern, message } of DANGEROUS_PATTERNS) {\r\n const match = prompt.match(pattern);\r\n if (match) {\r\n const issueType = this.config.blockDangerousPatterns ? 'error' : 'warning';\r\n issues.push({\r\n type: issueType,\r\n category: 'safety',\r\n message,\r\n suggestion: 'Review this operation carefully before proceeding',\r\n location: match.index !== undefined ? {\r\n start: match.index,\r\n end: match.index + match[0].length,\r\n } : undefined,\r\n });\r\n score -= issueType === 'error' ? 20 : 10;\r\n }\r\n }\r\n\r\n let scopeRisk = 0;\r\n for (const { pattern, threshold } of SCOPE_EXPLOSION_PATTERNS) {\r\n if (pattern.test(prompt)) {\r\n const riskValue = { low: 1, medium: 2, high: 3 }[threshold];\r\n scopeRisk += riskValue;\r\n }\r\n }\r\n\r\n if (scopeRisk >= 3) {\r\n issues.push({\r\n type: 'warning',\r\n category: 'scope',\r\n message: 'Prompt has high scope - consider breaking into smaller, focused tasks',\r\n suggestion: 'Split this into multiple smaller requests',\r\n });\r\n score -= 15;\r\n }\r\n\r\n const requiredContext = this.detectRequiredContext(prompt);\r\n\r\n if (this.config.requireExplicitFiles) {\r\n const hasExplicitFile = /\\b\\w+\\.(ts|tsx|js|jsx|json|md)\\b/.test(prompt);\r\n if (!hasExplicitFile) {\r\n issues.push({\r\n type: 'warning',\r\n category: 'context',\r\n message: 'No specific file referenced - specify target file(s)',\r\n });\r\n score -= 10;\r\n }\r\n }\r\n\r\n const hasErrors = issues.some(i => i.type === 'error');\r\n const valid = this.config.strictMode \r\n ? !hasErrors && score >= 50\r\n : !hasErrors;\r\n\r\n const estimatedRisk = this.calculateRisk(issues, scopeRisk);\r\n\r\n const enhancedPrompt = issues.length > 0 \r\n ? this.generateEnhancedPrompt(prompt, issues) \r\n : undefined;\r\n\r\n return {\r\n valid,\r\n score: Math.max(0, score),\r\n issues,\r\n enhancedPrompt,\r\n requiredContext,\r\n estimatedRisk,\r\n };\r\n }\r\n\r\n private detectRequiredContext(prompt: string): string[] {\r\n const required: string[] = [];\r\n\r\n for (const [context, pattern] of Object.entries(CONTEXT_INDICATORS)) {\r\n if (pattern.test(prompt)) {\r\n required.push(context);\r\n }\r\n }\r\n\r\n return required;\r\n }\r\n\r\n private calculateRisk(\r\n issues: VerificationIssue[], \r\n scopeRisk: number\r\n ): 'low' | 'medium' | 'high' {\r\n const errorCount = issues.filter(i => i.type === 'error').length;\r\n const warningCount = issues.filter(i => i.type === 'warning').length;\r\n const safetyIssues = issues.filter(i => i.category === 'safety').length;\r\n\r\n if (errorCount > 0 || safetyIssues > 0 || scopeRisk >= 4) {\r\n return 'high';\r\n }\r\n\r\n if (warningCount > 3 || scopeRisk >= 2) {\r\n return 'medium';\r\n }\r\n\r\n return 'low';\r\n }\r\n\r\n private generateEnhancedPrompt(\r\n original: string, \r\n issues: VerificationIssue[]\r\n ): string {\r\n const sections: string[] = [];\r\n\r\n sections.push('## Enhanced Prompt');\r\n sections.push('');\r\n sections.push('### Original Request');\r\n sections.push(original);\r\n sections.push('');\r\n sections.push('### Clarifications Needed');\r\n sections.push('');\r\n\r\n const byCategory = issues.reduce((acc, issue) => {\r\n if (!acc[issue.category]) acc[issue.category] = [];\r\n acc[issue.category].push(issue);\r\n return acc;\r\n }, {} as Record<string, VerificationIssue[]>);\r\n\r\n for (const [category, categoryIssues] of Object.entries(byCategory)) {\r\n sections.push(`**${category.charAt(0).toUpperCase() + category.slice(1)}:**`);\r\n for (const issue of categoryIssues) {\r\n sections.push(`- ${issue.message}`);\r\n if (issue.suggestion) {\r\n sections.push(` _Suggestion: ${issue.suggestion}_`);\r\n }\r\n }\r\n sections.push('');\r\n }\r\n\r\n return sections.join('\\n');\r\n }\r\n\r\n /**\r\n * Quick check for immediate blocking issues\r\n */\r\n quickCheck(prompt: string): { blocked: boolean; reason?: string } {\r\n if (!this.config.blockDangerousPatterns) {\r\n return { blocked: false };\r\n }\r\n\r\n for (const { pattern, message } of DANGEROUS_PATTERNS) {\r\n if (pattern.test(prompt)) {\r\n return { blocked: true, reason: message };\r\n }\r\n }\r\n\r\n return { blocked: false };\r\n }\r\n}\r\n","/**\r\n * Code Generation Template\r\n * \r\n * Template for generating code with hallucination prevention.\r\n */\r\n\r\nexport interface CodeGenerationParams {\r\n task: string;\r\n targetFile: string;\r\n context: {\r\n existingCode?: string;\r\n relatedFiles?: string[];\r\n conventions?: string;\r\n truthpack?: string;\r\n };\r\n constraints?: {\r\n maxLines?: number;\r\n style?: string;\r\n framework?: string;\r\n };\r\n}\r\n\r\nexport class CodeGenerationTemplate {\r\n /**\r\n * Generate a prompt for code generation\r\n */\r\n static generate(params: CodeGenerationParams): string {\r\n const sections: string[] = [];\r\n\r\n // System context\r\n sections.push(this.generateSystemSection());\r\n\r\n // Truthpack grounding\r\n if (params.context.truthpack) {\r\n sections.push(this.generateTruthpackSection(params.context.truthpack));\r\n }\r\n\r\n // Conventions\r\n if (params.context.conventions) {\r\n sections.push(this.generateConventionsSection(params.context.conventions));\r\n }\r\n\r\n // Existing code context\r\n if (params.context.existingCode) {\r\n sections.push(this.generateExistingCodeSection(params.context.existingCode));\r\n }\r\n\r\n // Related files\r\n if (params.context.relatedFiles?.length) {\r\n sections.push(this.generateRelatedFilesSection(params.context.relatedFiles));\r\n }\r\n\r\n // Task\r\n sections.push(this.generateTaskSection(params.task, params.targetFile));\r\n\r\n // Constraints\r\n if (params.constraints) {\r\n sections.push(this.generateConstraintsSection(params.constraints));\r\n }\r\n\r\n // Verification instructions\r\n sections.push(this.generateVerificationSection());\r\n\r\n return sections.join('\\n\\n');\r\n }\r\n\r\n private static generateSystemSection(): string {\r\n return `## System Instructions\r\n\r\nYou are a code generation assistant with strict hallucination prevention.\r\nFollow these rules:\r\n1. ONLY use imports, types, and functions that are verified in the truthpack\r\n2. NEVER invent API endpoints or environment variables\r\n3. Follow the project conventions exactly\r\n4. If uncertain about something, ask for clarification\r\n5. Reference existing code patterns when available`;\r\n }\r\n\r\n private static generateTruthpackSection(truthpack: string): string {\r\n return `## Verified Ground Truth (Truthpack)\r\n\r\nThe following information is verified and authoritative:\r\n\r\n${truthpack}\r\n\r\nUse ONLY these verified facts. Do not assume or invent additional APIs, routes, or configurations.`;\r\n }\r\n\r\n private static generateConventionsSection(conventions: string): string {\r\n return `## Project Conventions\r\n\r\nFollow these conventions:\r\n\r\n${conventions}`;\r\n }\r\n\r\n private static generateExistingCodeSection(existingCode: string): string {\r\n return `## Existing Code Context\r\n\r\nCurrent file content:\r\n\r\n\\`\\`\\`typescript\r\n${existingCode}\r\n\\`\\`\\``;\r\n }\r\n\r\n private static generateRelatedFilesSection(relatedFiles: string[]): string {\r\n return `## Related Files\r\n\r\nConsider these related files for reference:\r\n${relatedFiles.map((f) => `- ${f}`).join('\\n')}`;\r\n }\r\n\r\n private static generateTaskSection(task: string, targetFile: string): string {\r\n return `## Task\r\n\r\nTarget file: \\`${targetFile}\\`\r\n\r\n${task}`;\r\n }\r\n\r\n private static generateConstraintsSection(constraints: {\r\n maxLines?: number;\r\n style?: string;\r\n framework?: string;\r\n }): string {\r\n const lines: string[] = ['## Constraints'];\r\n \r\n if (constraints.maxLines) {\r\n lines.push(`- Maximum lines: ${constraints.maxLines}`);\r\n }\r\n if (constraints.style) {\r\n lines.push(`- Style: ${constraints.style}`);\r\n }\r\n if (constraints.framework) {\r\n lines.push(`- Framework: ${constraints.framework}`);\r\n }\r\n\r\n return lines.join('\\n');\r\n }\r\n\r\n private static generateVerificationSection(): string {\r\n return `## Verification Checklist\r\n\r\nBefore responding, verify:\r\n- [ ] All imports exist in package.json or are local files\r\n- [ ] All API endpoints exist in truthpack/routes.json\r\n- [ ] All environment variables exist in truthpack/env.json\r\n- [ ] All types match the truthpack/contracts.json schemas\r\n- [ ] Code follows project conventions`;\r\n }\r\n}\r\n","/**\r\n * Code Review Template\r\n * \r\n * Template for reviewing code with hallucination detection.\r\n */\r\n\r\nexport interface CodeReviewParams {\r\n code: string;\r\n filePath: string;\r\n context: {\r\n truthpack?: string;\r\n conventions?: string;\r\n previousVersion?: string;\r\n };\r\n reviewFocus?: ('correctness' | 'security' | 'performance' | 'style')[];\r\n}\r\n\r\nexport class CodeReviewTemplate {\r\n /**\r\n * Generate a prompt for code review\r\n */\r\n static generate(params: CodeReviewParams): string {\r\n const sections: string[] = [];\r\n\r\n // System context\r\n sections.push(this.generateSystemSection());\r\n\r\n // Truthpack for verification\r\n if (params.context.truthpack) {\r\n sections.push(this.generateTruthpackSection(params.context.truthpack));\r\n }\r\n\r\n // Conventions for style checking\r\n if (params.context.conventions) {\r\n sections.push(this.generateConventionsSection(params.context.conventions));\r\n }\r\n\r\n // Code to review\r\n sections.push(this.generateCodeSection(params.code, params.filePath));\r\n\r\n // Previous version for diff\r\n if (params.context.previousVersion) {\r\n sections.push(this.generatePreviousVersionSection(params.context.previousVersion));\r\n }\r\n\r\n // Review focus areas\r\n sections.push(this.generateReviewFocusSection(params.reviewFocus));\r\n\r\n // Output format\r\n sections.push(this.generateOutputFormatSection());\r\n\r\n return sections.join('\\n\\n');\r\n }\r\n\r\n private static generateSystemSection(): string {\r\n return `## System Instructions\r\n\r\nYou are a code reviewer with expertise in detecting hallucinations and inconsistencies.\r\nYour job is to:\r\n1. Verify all imports, types, and API calls against the truthpack\r\n2. Identify potential hallucinations (invented APIs, wrong signatures, etc.)\r\n3. Check for convention violations\r\n4. Flag security issues\r\n5. Suggest improvements with verified alternatives`;\r\n }\r\n\r\n private static generateTruthpackSection(truthpack: string): string {\r\n return `## Verified Ground Truth\r\n\r\nUse this to verify claims in the code:\r\n\r\n${truthpack}\r\n\r\nFlag any code that references APIs, types, or endpoints NOT in this truthpack.`;\r\n }\r\n\r\n private static generateConventionsSection(conventions: string): string {\r\n return `## Project Conventions\r\n\r\nCheck code against these conventions:\r\n\r\n${conventions}`;\r\n }\r\n\r\n private static generateCodeSection(code: string, filePath: string): string {\r\n return `## Code to Review\r\n\r\nFile: \\`${filePath}\\`\r\n\r\n\\`\\`\\`typescript\r\n${code}\r\n\\`\\`\\``;\r\n }\r\n\r\n private static generatePreviousVersionSection(previousVersion: string): string {\r\n return `## Previous Version\r\n\r\nFor reference, here's the previous version:\r\n\r\n\\`\\`\\`typescript\r\n${previousVersion}\r\n\\`\\`\\``;\r\n }\r\n\r\n private static generateReviewFocusSection(\r\n focus?: ('correctness' | 'security' | 'performance' | 'style')[]\r\n ): string {\r\n const areas = focus ?? ['correctness', 'security', 'performance', 'style'];\r\n \r\n return `## Review Focus Areas\r\n\r\nPrioritize these areas:\r\n${areas.map((f) => `- ${f.charAt(0).toUpperCase() + f.slice(1)}`).join('\\n')}`;\r\n }\r\n\r\n private static generateOutputFormatSection(): string {\r\n return `## Output Format\r\n\r\nProvide your review in this format:\r\n\r\n### Hallucination Check\r\n- List any potential hallucinations (invented APIs, wrong signatures, etc.)\r\n- For each, explain why it's suspicious and what the correct approach would be\r\n\r\n### Issues Found\r\n- List issues categorized by severity (critical, warning, info)\r\n- Include line numbers and specific recommendations\r\n\r\n### Convention Violations\r\n- List any violations of project conventions\r\n- Suggest corrections\r\n\r\n### Summary\r\n- Overall assessment\r\n- Risk level (low/medium/high)\r\n- Recommended actions`;\r\n }\r\n}\r\n","/**\r\n * Explanation Template\r\n * \r\n * Template for generating code explanations with factual grounding.\r\n */\r\n\r\nexport interface ExplanationParams {\r\n code: string;\r\n filePath: string;\r\n context: {\r\n truthpack?: string;\r\n relatedDocs?: string;\r\n };\r\n questions?: string[];\r\n audience?: 'beginner' | 'intermediate' | 'expert';\r\n}\r\n\r\nexport class ExplanationTemplate {\r\n /**\r\n * Generate a prompt for code explanation\r\n */\r\n static generate(params: ExplanationParams): string {\r\n const sections: string[] = [];\r\n\r\n // System context\r\n sections.push(this.generateSystemSection(params.audience ?? 'intermediate'));\r\n\r\n // Truthpack for grounding\r\n if (params.context.truthpack) {\r\n sections.push(this.generateTruthpackSection(params.context.truthpack));\r\n }\r\n\r\n // Related documentation\r\n if (params.context.relatedDocs) {\r\n sections.push(this.generateDocsSection(params.context.relatedDocs));\r\n }\r\n\r\n // Code to explain\r\n sections.push(this.generateCodeSection(params.code, params.filePath));\r\n\r\n // Specific questions\r\n if (params.questions?.length) {\r\n sections.push(this.generateQuestionsSection(params.questions));\r\n }\r\n\r\n // Output guidelines\r\n sections.push(this.generateOutputGuidelinesSection(params.audience ?? 'intermediate'));\r\n\r\n return sections.join('\\n\\n');\r\n }\r\n\r\n private static generateSystemSection(audience: string): string {\r\n const audienceDescriptions: Record<string, string> = {\r\n beginner: 'someone new to programming',\r\n intermediate: 'a developer familiar with the basics',\r\n expert: 'an experienced developer',\r\n };\r\n\r\n return `## System Instructions\r\n\r\nYou are a code explanation assistant that provides accurate, grounded explanations.\r\nYour audience is ${audienceDescriptions[audience]}.\r\n\r\nRules:\r\n1. Base all explanations on verifiable facts from the truthpack and code\r\n2. Do NOT invent or assume functionality not present in the code\r\n3. Clearly distinguish between what the code does vs. what it might be intended to do\r\n4. Use accurate technical terminology\r\n5. If uncertain about something, explicitly state the uncertainty`;\r\n }\r\n\r\n private static generateTruthpackSection(truthpack: string): string {\r\n return `## Verified Context\r\n\r\nGround your explanation in these verified facts:\r\n\r\n${truthpack}\r\n\r\nReference these facts when explaining how the code interacts with other parts of the system.`;\r\n }\r\n\r\n private static generateDocsSection(docs: string): string {\r\n return `## Related Documentation\r\n\r\n${docs}`;\r\n }\r\n\r\n private static generateCodeSection(code: string, filePath: string): string {\r\n return `## Code to Explain\r\n\r\nFile: \\`${filePath}\\`\r\n\r\n\\`\\`\\`typescript\r\n${code}\r\n\\`\\`\\``;\r\n }\r\n\r\n private static generateQuestionsSection(questions: string[]): string {\r\n return `## Specific Questions to Address\r\n\r\n${questions.map((q, i) => `${i + 1}. ${q}`).join('\\n')}`;\r\n }\r\n\r\n private static generateOutputGuidelinesSection(audience: string): string {\r\n const guidelines: Record<string, string[]> = {\r\n beginner: [\r\n 'Use simple language and avoid jargon',\r\n 'Explain technical terms when first used',\r\n 'Use analogies where helpful',\r\n 'Break down complex concepts step by step',\r\n ],\r\n intermediate: [\r\n 'Use standard technical terminology',\r\n 'Focus on the \"why\" behind design decisions',\r\n 'Highlight patterns and best practices',\r\n 'Connect to broader architectural concepts',\r\n ],\r\n expert: [\r\n 'Be concise and technical',\r\n 'Focus on non-obvious aspects',\r\n 'Discuss trade-offs and alternatives',\r\n 'Reference relevant design patterns',\r\n ],\r\n };\r\n\r\n return `## Output Guidelines\r\n\r\n${guidelines[audience].map((g) => `- ${g}`).join('\\n')}\r\n\r\n### Structure\r\n\r\n1. **Overview**: Brief summary of what the code does\r\n2. **Key Components**: Explain each major part\r\n3. **Data Flow**: How data moves through the code\r\n4. **Integration Points**: How this connects to other parts of the system (ground in truthpack)\r\n5. **Potential Issues**: Any concerns or edge cases (only mention verified issues)`;\r\n }\r\n}\r\n","/**\r\n * Prompt Template Types\r\n *\r\n * Shared type definitions for the unified Prompt Template Builder.\r\n */\r\n\r\n// ============================================================================\r\n// TEMPLATE TYPES\r\n// ============================================================================\r\n\r\nexport type PromptCategory =\r\n | 'authentication'\r\n | 'api'\r\n | 'database'\r\n | 'frontend'\r\n | 'backend'\r\n | 'testing'\r\n | 'deployment'\r\n | 'refactoring'\r\n | 'debugging'\r\n | 'performance'\r\n | 'security'\r\n | 'documentation'\r\n | 'ai-ml'\r\n | 'mobile'\r\n | 'general';\r\n\r\nexport interface PromptTemplate {\r\n /** Unique template identifier (stable across versions) */\r\n id: string;\r\n /** Human-readable name */\r\n name: string;\r\n /** Template category */\r\n category: PromptCategory;\r\n /** Short description */\r\n description: string;\r\n /** Emoji icon */\r\n icon: string;\r\n /** Keywords for matching/search */\r\n keywords: string[];\r\n /** Template body with variable placeholders */\r\n template: string;\r\n /** Questions to ask user for context */\r\n contextQuestions: ContextQuestion[];\r\n /** Expected output sections */\r\n outputSections: string[];\r\n /** Popularity score (for sorting) */\r\n popularity?: number;\r\n /** Mark as new */\r\n isNew?: boolean;\r\n /** Requires Pro tier */\r\n isPro?: boolean;\r\n}\r\n\r\nexport interface ContextQuestion {\r\n /** Question identifier */\r\n id: string;\r\n /** Display label */\r\n label: string;\r\n /** Placeholder text */\r\n placeholder: string;\r\n /** Input type */\r\n type: 'select' | 'text' | 'multiselect' | 'boolean';\r\n /** Options for select/multiselect */\r\n options?: Array<{ label: string; value: string; default?: boolean }>;\r\n /** Whether answer is required */\r\n required: boolean;\r\n /** Conditional display based on another question */\r\n dependsOn?: string;\r\n}\r\n\r\n// ============================================================================\r\n// WORKSPACE CONTEXT\r\n// ============================================================================\r\n\r\nexport interface WorkspaceContext {\r\n projectName: string;\r\n hasTypeScript: boolean;\r\n hasNextJs: boolean;\r\n hasReact: boolean;\r\n hasVue: boolean;\r\n hasSvelte: boolean;\r\n hasAngular: boolean;\r\n hasVite: boolean;\r\n hasExpress: boolean;\r\n hasFastify: boolean;\r\n hasNestJs: boolean;\r\n hasPrisma: boolean;\r\n hasDrizzle: boolean;\r\n hasMongoDB: boolean;\r\n hasPostgres: boolean;\r\n hasSupabase: boolean;\r\n hasFirebase: boolean;\r\n hasClerk: boolean;\r\n hasNextAuth: boolean;\r\n hasAuthJs: boolean;\r\n hasTailwind: boolean;\r\n hasShadcn: boolean;\r\n hasRadix: boolean;\r\n packageManager: 'npm' | 'yarn' | 'pnpm' | 'bun';\r\n framework: string;\r\n language: 'typescript' | 'javascript';\r\n testFramework: string | null;\r\n hasDocker: boolean;\r\n hasGit: boolean;\r\n hasTurbo: boolean;\r\n isMonorepo: boolean;\r\n currentFile?: string;\r\n currentFileLanguage?: string;\r\n selectedText?: string;\r\n}\r\n\r\n// ============================================================================\r\n// BUILT PROMPT\r\n// ============================================================================\r\n\r\nexport interface BuiltPrompt {\r\n /** Unique instance ID */\r\n id: string;\r\n /** When the prompt was built */\r\n timestamp: Date;\r\n /** Original user input */\r\n originalInput: string;\r\n /** Template category */\r\n category: PromptCategory;\r\n /** Template ID used */\r\n templateId: string;\r\n /** Expanded prompt text */\r\n expandedPrompt: string;\r\n /** Context values used */\r\n context: Record<string, string>;\r\n /** Quality assessment */\r\n quality: PromptQuality;\r\n /** Favorite flag */\r\n isFavorite?: boolean;\r\n}\r\n\r\nexport interface PromptQuality {\r\n /** Overall score 0-100 */\r\n score: number;\r\n /** Completeness 0-100 */\r\n completeness: number;\r\n /** Specificity 0-100 */\r\n specificity: number;\r\n /** Clarity 0-100 */\r\n clarity: number;\r\n /** Suggestions for improvement */\r\n suggestions: string[];\r\n}\r\n\r\n// ============================================================================\r\n// SMART SUGGESTION\r\n// ============================================================================\r\n\r\nexport interface SmartSuggestion {\r\n type: 'template' | 'enhancement' | 'context';\r\n title: string;\r\n description: string;\r\n action: string;\r\n data?: unknown;\r\n}\r\n\r\n// ============================================================================\r\n// CATEGORY METADATA\r\n// ============================================================================\r\n\r\nexport interface CategoryMetadata {\r\n id: PromptCategory;\r\n name: string;\r\n icon: string;\r\n description: string;\r\n templateCount: number;\r\n}\r\n\r\nexport const CATEGORY_METADATA: Record<PromptCategory, Omit<CategoryMetadata, 'templateCount'>> = {\r\n authentication: {\r\n id: 'authentication',\r\n name: 'Authentication',\r\n icon: '🔐',\r\n description: 'Login, signup, OAuth, session management',\r\n },\r\n api: {\r\n id: 'api',\r\n name: 'API',\r\n icon: '🔌',\r\n description: 'REST, GraphQL, tRPC endpoints',\r\n },\r\n database: {\r\n id: 'database',\r\n name: 'Database',\r\n icon: '🗄️',\r\n description: 'Schema design, migrations, queries',\r\n },\r\n frontend: {\r\n id: 'frontend',\r\n name: 'Frontend',\r\n icon: '⚛️',\r\n description: 'Components, forms, state management',\r\n },\r\n backend: {\r\n id: 'backend',\r\n name: 'Backend',\r\n icon: '⚙️',\r\n description: 'Server logic, middleware, services',\r\n },\r\n testing: {\r\n id: 'testing',\r\n name: 'Testing',\r\n icon: '🧪',\r\n description: 'Unit, integration, E2E tests',\r\n },\r\n deployment: {\r\n id: 'deployment',\r\n name: 'Deployment',\r\n icon: '🚀',\r\n description: 'Docker, CI/CD, infrastructure',\r\n },\r\n refactoring: {\r\n id: 'refactoring',\r\n name: 'Refactoring',\r\n icon: '♻️',\r\n description: 'Code cleanup, optimization',\r\n },\r\n debugging: {\r\n id: 'debugging',\r\n name: 'Debugging',\r\n icon: '🐛',\r\n description: 'Error analysis, troubleshooting',\r\n },\r\n performance: {\r\n id: 'performance',\r\n name: 'Performance',\r\n icon: '⚡',\r\n description: 'Optimization, profiling',\r\n },\r\n security: {\r\n id: 'security',\r\n name: 'Security',\r\n icon: '🛡️',\r\n description: 'Vulnerabilities, hardening',\r\n },\r\n documentation: {\r\n id: 'documentation',\r\n name: 'Documentation',\r\n icon: '📚',\r\n description: 'README, API docs, comments',\r\n },\r\n 'ai-ml': {\r\n id: 'ai-ml',\r\n name: 'AI/ML',\r\n icon: '🤖',\r\n description: 'AI integrations, ML pipelines',\r\n },\r\n mobile: {\r\n id: 'mobile',\r\n name: 'Mobile',\r\n icon: '📱',\r\n description: 'React Native, mobile apps',\r\n },\r\n general: {\r\n id: 'general',\r\n name: 'General',\r\n icon: '✨',\r\n description: 'Feature implementation, misc',\r\n },\r\n};\r\n","export { CATEGORY_METADATA, CodeGenerationTemplate, CodeReviewTemplate, ContextInjector, ExplanationTemplate, PROMPT_TEMPLATES, PromptBuilder, PromptVerifier, QualityAnalyzer, SMART_VARIABLES, TaskPlanner, detectTemplate, getCategoriesWithCounts, getFreeTemplates, getProTemplates, getTemplateById, getTemplatesByCategory, searchTemplates } from '../chunk-DYWJP623.js';\nimport '../chunk-DGUM43GV.js';\n//# sourceMappingURL=index.js.map\n//# sourceMappingURL=index.js.map","/**\r\n * Transport Layer for MCP Server\r\n * \r\n * Provides abstraction for different transport mechanisms:\r\n * - Stdio (default for CLI/local)\r\n * - HTTP (for cloud mode)\r\n * - WebSocket (for real-time cloud mode)\r\n */\r\n\r\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\r\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\r\nimport { createServer, type Server as HttpServer, type IncomingMessage, type ServerResponse } from 'http';\r\nimport { WebSocketServer, type WebSocket } from 'ws';\r\nimport { EventEmitter } from 'events';\r\nimport { loadConfig } from '@repo/shared-config';\r\n\r\nexport type TransportType = 'stdio' | 'http' | 'websocket';\r\n\r\nexport interface TransportConfig {\r\n type: TransportType;\r\n port?: number;\r\n host?: string;\r\n path?: string;\r\n}\r\n\r\n/**\r\n * Create a transport based on configuration\r\n */\r\nexport function createTransport(config: TransportConfig): Transport {\r\n switch (config.type) {\r\n case 'stdio':\r\n return new StdioServerTransport();\r\n case 'http':\r\n return new HTTPTransport({\r\n port: config.port ?? 3001,\r\n host: config.host ?? 'localhost',\r\n path: config.path ?? '/mcp',\r\n });\r\n case 'websocket':\r\n return new WebSocketTransport({\r\n port: config.port ?? 3002,\r\n host: config.host ?? 'localhost',\r\n path: config.path ?? '/mcp',\r\n });\r\n default:\r\n throw new Error(`Unknown transport type: ${config.type}`);\r\n }\r\n}\r\n\r\n/**\r\n * Get transport config from environment\r\n */\r\nexport function getTransportConfigFromEnv(): TransportConfig {\r\n const config = loadConfig();\r\n const mode = config.VIBECHECK_MODE;\r\n const transportType = config.VIBECHECK_TRANSPORT;\r\n \r\n if (transportType) {\r\n return {\r\n type: transportType,\r\n port: config.VIBECHECK_PORT,\r\n host: config.VIBECHECK_HOST,\r\n path: config.VIBECHECK_PATH,\r\n };\r\n }\r\n \r\n // Default based on mode\r\n if (mode === 'cloud') {\r\n return { type: 'http', port: 3001 };\r\n }\r\n \r\n return { type: 'stdio' };\r\n}\r\n\r\ninterface HTTPTransportConfig {\r\n port: number;\r\n host: string;\r\n path: string;\r\n}\r\n\r\n/**\r\n * HTTP Transport for MCP\r\n * \r\n * Implements request/response pattern over HTTP POST\r\n */\r\nexport class HTTPTransport extends EventEmitter implements Transport {\r\n private server: HttpServer | null = null;\r\n private config: HTTPTransportConfig;\r\n private messageHandler: ((message: unknown) => void) | null = null;\r\n \r\n constructor(config: HTTPTransportConfig) {\r\n super();\r\n this.config = config;\r\n }\r\n\r\n async start(): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n this.server = createServer((req: IncomingMessage, res: ServerResponse) => {\r\n this.handleRequest(req, res);\r\n });\r\n\r\n this.server.on('error', (error) => {\r\n this.emit('error', error);\r\n reject(error);\r\n });\r\n\r\n this.server.listen(this.config.port, this.config.host, () => {\r\n console.error(`MCP HTTP Transport listening on http://${this.config.host}:${this.config.port}${this.config.path}`);\r\n resolve();\r\n });\r\n });\r\n }\r\n\r\n private handleRequest(req: IncomingMessage, res: ServerResponse): void {\r\n // CORS headers for browser access\r\n res.setHeader('Access-Control-Allow-Origin', '*');\r\n res.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS');\r\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');\r\n\r\n if (req.method === 'OPTIONS') {\r\n res.writeHead(204);\r\n res.end();\r\n return;\r\n }\r\n\r\n if (req.method !== 'POST' || req.url !== this.config.path) {\r\n res.writeHead(404, { 'Content-Type': 'application/json' });\r\n res.end(JSON.stringify({ error: 'Not found' }));\r\n return;\r\n }\r\n\r\n let body = '';\r\n req.on('data', (chunk) => {\r\n body += chunk.toString();\r\n });\r\n\r\n req.on('end', async () => {\r\n try {\r\n const message = JSON.parse(body);\r\n \r\n // Store the response handler for this request\r\n const responsePromise = new Promise<unknown>((resolve) => {\r\n // The MCP server will call send() with the response\r\n const originalHandler = this.messageHandler;\r\n this.messageHandler = (response: unknown) => {\r\n resolve(response);\r\n this.messageHandler = originalHandler;\r\n };\r\n });\r\n\r\n // Emit the message for the MCP server to handle\r\n this.emit('message', message);\r\n \r\n // Wait for response (with timeout)\r\n const timeoutPromise = new Promise((_, reject) => {\r\n setTimeout(() => reject(new Error('Request timeout')), 30000);\r\n });\r\n\r\n const response = await Promise.race([responsePromise, timeoutPromise]);\r\n \r\n res.writeHead(200, { 'Content-Type': 'application/json' });\r\n res.end(JSON.stringify(response));\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\r\n res.writeHead(400, { 'Content-Type': 'application/json' });\r\n res.end(JSON.stringify({ error: errorMessage }));\r\n }\r\n });\r\n }\r\n\r\n async send(message: unknown): Promise<void> {\r\n if (this.messageHandler) {\r\n this.messageHandler(message);\r\n }\r\n }\r\n\r\n async close(): Promise<void> {\r\n return new Promise((resolve) => {\r\n if (this.server) {\r\n this.server.close(() => {\r\n this.server = null;\r\n resolve();\r\n });\r\n } else {\r\n resolve();\r\n }\r\n });\r\n }\r\n\r\n onmessage?: (message: unknown) => void;\r\n onerror?: (error: Error) => void;\r\n onclose?: () => void;\r\n}\r\n\r\ninterface WebSocketTransportConfig {\r\n port: number;\r\n host: string;\r\n path: string;\r\n}\r\n\r\n/**\r\n * WebSocket Transport for MCP\r\n * \r\n * Implements bidirectional streaming over WebSocket\r\n */\r\nexport class WebSocketTransport extends EventEmitter implements Transport {\r\n private wss: WebSocketServer | null = null;\r\n private httpServer: HttpServer | null = null;\r\n private clients: Set<WebSocket> = new Set();\r\n private config: WebSocketTransportConfig;\r\n\r\n constructor(config: WebSocketTransportConfig) {\r\n super();\r\n this.config = config;\r\n }\r\n\r\n async start(): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n this.httpServer = createServer();\r\n \r\n this.wss = new WebSocketServer({\r\n server: this.httpServer,\r\n path: this.config.path,\r\n });\r\n\r\n this.wss.on('connection', (ws: WebSocket) => {\r\n this.clients.add(ws);\r\n console.error('MCP WebSocket client connected');\r\n\r\n ws.on('message', (data) => {\r\n try {\r\n const message = JSON.parse(data.toString());\r\n this.emit('message', message);\r\n if (this.onmessage) {\r\n this.onmessage(message);\r\n }\r\n } catch (error) {\r\n console.error('Failed to parse WebSocket message:', error);\r\n }\r\n });\r\n\r\n ws.on('close', () => {\r\n this.clients.delete(ws);\r\n console.error('MCP WebSocket client disconnected');\r\n });\r\n\r\n ws.on('error', (error) => {\r\n console.error('WebSocket error:', error);\r\n this.clients.delete(ws);\r\n });\r\n });\r\n\r\n this.wss.on('error', (error) => {\r\n this.emit('error', error);\r\n if (this.onerror) {\r\n this.onerror(error);\r\n }\r\n reject(error);\r\n });\r\n\r\n this.httpServer.listen(this.config.port, this.config.host, () => {\r\n console.error(`MCP WebSocket Transport listening on ws://${this.config.host}:${this.config.port}${this.config.path}`);\r\n resolve();\r\n });\r\n });\r\n }\r\n\r\n async send(message: unknown): Promise<void> {\r\n const data = JSON.stringify(message);\r\n for (const client of this.clients) {\r\n if (client.readyState === 1) { // WebSocket.OPEN\r\n client.send(data);\r\n }\r\n }\r\n }\r\n\r\n async close(): Promise<void> {\r\n // Close all client connections\r\n for (const client of this.clients) {\r\n client.close();\r\n }\r\n this.clients.clear();\r\n\r\n // Close WebSocket server\r\n return new Promise((resolve) => {\r\n if (this.wss) {\r\n this.wss.close(() => {\r\n if (this.httpServer) {\r\n this.httpServer.close(() => {\r\n this.wss = null;\r\n this.httpServer = null;\r\n resolve();\r\n });\r\n } else {\r\n resolve();\r\n }\r\n });\r\n } else {\r\n resolve();\r\n }\r\n });\r\n }\r\n\r\n onmessage?: (message: unknown) => void;\r\n onerror?: (error: Error) => void;\r\n onclose?: () => void;\r\n}\r\n\r\nexport { StdioServerTransport };\r\n","/**\r\n * Cache Manager\r\n * \r\n * Provides in-memory caching with TTL, size limits, and statistics.\r\n */\r\n\r\nexport interface CacheEntry<T> {\r\n value: T;\r\n createdAt: number;\r\n expiresAt: number;\r\n hits: number;\r\n size: number;\r\n}\r\n\r\nexport interface CacheConfig {\r\n maxSize: number;\r\n defaultTtlMs: number;\r\n cleanupIntervalMs: number;\r\n onEvict?: (key: string, reason: 'expired' | 'size' | 'manual') => void;\r\n}\r\n\r\nexport interface CacheStats {\r\n size: number;\r\n hits: number;\r\n misses: number;\r\n hitRate: number;\r\n evictions: number;\r\n oldestEntryAge: number;\r\n}\r\n\r\nconst DEFAULT_CONFIG: CacheConfig = {\r\n maxSize: 1000,\r\n defaultTtlMs: 5 * 60 * 1000, // 5 minutes\r\n cleanupIntervalMs: 60 * 1000, // 1 minute\r\n};\r\n\r\n/**\r\n * Generic cache with TTL support\r\n */\r\nexport class Cache<T = unknown> {\r\n private config: CacheConfig;\r\n private entries: Map<string, CacheEntry<T>> = new Map();\r\n private stats = { hits: 0, misses: 0, evictions: 0 };\r\n private cleanupTimer: ReturnType<typeof setInterval> | null = null;\r\n\r\n constructor(config: Partial<CacheConfig> = {}) {\r\n this.config = { ...DEFAULT_CONFIG, ...config };\r\n this.startCleanup();\r\n }\r\n\r\n /**\r\n * Get a value from cache\r\n */\r\n get(key: string): T | undefined {\r\n const entry = this.entries.get(key);\r\n \r\n if (!entry) {\r\n this.stats.misses++;\r\n return undefined;\r\n }\r\n\r\n // Check expiration\r\n if (Date.now() > entry.expiresAt) {\r\n this.delete(key, 'expired');\r\n this.stats.misses++;\r\n return undefined;\r\n }\r\n\r\n entry.hits++;\r\n this.stats.hits++;\r\n return entry.value;\r\n }\r\n\r\n /**\r\n * Get a value or compute it if missing\r\n */\r\n async getOrCompute(\r\n key: string,\r\n compute: () => T | Promise<T>,\r\n ttlMs?: number\r\n ): Promise<T> {\r\n const cached = this.get(key);\r\n if (cached !== undefined) {\r\n return cached;\r\n }\r\n\r\n const value = await compute();\r\n this.set(key, value, ttlMs);\r\n return value;\r\n }\r\n\r\n /**\r\n * Set a value in cache\r\n */\r\n set(key: string, value: T, ttlMs?: number): void {\r\n // Enforce size limit\r\n if (this.entries.size >= this.config.maxSize && !this.entries.has(key)) {\r\n this.evictOldest();\r\n }\r\n\r\n const now = Date.now();\r\n const size = this.estimateSize(value);\r\n\r\n this.entries.set(key, {\r\n value,\r\n createdAt: now,\r\n expiresAt: now + (ttlMs ?? this.config.defaultTtlMs),\r\n hits: 0,\r\n size,\r\n });\r\n }\r\n\r\n /**\r\n * Check if key exists and is not expired\r\n */\r\n has(key: string): boolean {\r\n const entry = this.entries.get(key);\r\n if (!entry) return false;\r\n if (Date.now() > entry.expiresAt) {\r\n this.delete(key, 'expired');\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Delete a key from cache\r\n */\r\n delete(key: string, reason: 'expired' | 'size' | 'manual' = 'manual'): boolean {\r\n const existed = this.entries.has(key);\r\n if (existed) {\r\n this.entries.delete(key);\r\n this.stats.evictions++;\r\n this.config.onEvict?.(key, reason);\r\n }\r\n return existed;\r\n }\r\n\r\n /**\r\n * Clear all entries\r\n */\r\n clear(): void {\r\n const keys = Array.from(this.entries.keys());\r\n this.entries.clear();\r\n for (const key of keys) {\r\n this.config.onEvict?.(key, 'manual');\r\n }\r\n this.stats.evictions += keys.length;\r\n }\r\n\r\n /**\r\n * Get cache statistics\r\n */\r\n getStats(): CacheStats {\r\n const now = Date.now();\r\n let oldestAge = 0;\r\n\r\n for (const entry of this.entries.values()) {\r\n const age = now - entry.createdAt;\r\n if (age > oldestAge) oldestAge = age;\r\n }\r\n\r\n const totalRequests = this.stats.hits + this.stats.misses;\r\n return {\r\n size: this.entries.size,\r\n hits: this.stats.hits,\r\n misses: this.stats.misses,\r\n hitRate: totalRequests > 0 ? this.stats.hits / totalRequests : 0,\r\n evictions: this.stats.evictions,\r\n oldestEntryAge: oldestAge,\r\n };\r\n }\r\n\r\n /**\r\n * Get all keys\r\n */\r\n keys(): string[] {\r\n return Array.from(this.entries.keys());\r\n }\r\n\r\n /**\r\n * Stop cleanup timer and release resources\r\n */\r\n dispose(): void {\r\n if (this.cleanupTimer) {\r\n clearInterval(this.cleanupTimer);\r\n this.cleanupTimer = null;\r\n }\r\n }\r\n\r\n private startCleanup(): void {\r\n this.cleanupTimer = setInterval(() => {\r\n this.cleanup();\r\n }, this.config.cleanupIntervalMs);\r\n\r\n // Don't prevent process exit\r\n if (this.cleanupTimer.unref) {\r\n this.cleanupTimer.unref();\r\n }\r\n }\r\n\r\n private cleanup(): void {\r\n const now = Date.now();\r\n const toDelete: string[] = [];\r\n\r\n for (const [key, entry] of this.entries) {\r\n if (now > entry.expiresAt) {\r\n toDelete.push(key);\r\n }\r\n }\r\n\r\n for (const key of toDelete) {\r\n this.delete(key, 'expired');\r\n }\r\n }\r\n\r\n private evictOldest(): void {\r\n let oldestKey: string | null = null;\r\n let oldestTime = Infinity;\r\n\r\n for (const [key, entry] of this.entries) {\r\n // Prefer evicting expired entries first\r\n if (Date.now() > entry.expiresAt) {\r\n this.delete(key, 'expired');\r\n return;\r\n }\r\n\r\n // Then evict least recently created with fewest hits\r\n const score = entry.createdAt - entry.hits * 1000;\r\n if (score < oldestTime) {\r\n oldestTime = score;\r\n oldestKey = key;\r\n }\r\n }\r\n\r\n if (oldestKey) {\r\n this.delete(oldestKey, 'size');\r\n }\r\n }\r\n\r\n private estimateSize(value: T): number {\r\n if (value === null || value === undefined) return 0;\r\n if (typeof value === 'string') return value.length * 2;\r\n if (typeof value === 'number') return 8;\r\n if (typeof value === 'boolean') return 4;\r\n if (Array.isArray(value)) return value.length * 50;\r\n if (typeof value === 'object') return JSON.stringify(value).length * 2;\r\n return 100;\r\n }\r\n}\r\n\r\n/**\r\n * Create a memoized function with caching\r\n */\r\nexport function memoize<TArgs extends unknown[], TResult>(\r\n fn: (...args: TArgs) => TResult | Promise<TResult>,\r\n options: {\r\n keyFn?: (...args: TArgs) => string;\r\n ttlMs?: number;\r\n maxSize?: number;\r\n } = {}\r\n): (...args: TArgs) => Promise<TResult> {\r\n const cache = new Cache<TResult>({\r\n maxSize: options.maxSize ?? 100,\r\n defaultTtlMs: options.ttlMs ?? 60000,\r\n });\r\n\r\n const keyFn = options.keyFn ?? ((...args: TArgs) => JSON.stringify(args));\r\n\r\n return async (...args: TArgs): Promise<TResult> => {\r\n const key = keyFn(...args);\r\n return cache.getOrCompute(key, () => fn(...args));\r\n };\r\n}\r\n\r\n// Global cache instances\r\nconst globalCaches = new Map<string, Cache>();\r\n\r\n/**\r\n * Get or create a named cache\r\n */\r\nexport function getCache<T>(name: string, config?: Partial<CacheConfig>): Cache<T> {\r\n let cache = globalCaches.get(name);\r\n if (!cache) {\r\n cache = new Cache<T>(config);\r\n globalCaches.set(name, cache);\r\n }\r\n return cache as Cache<T>;\r\n}\r\n\r\n/**\r\n * Clear all global caches\r\n */\r\nexport function clearAllCaches(): void {\r\n for (const cache of globalCaches.values()) {\r\n cache.clear();\r\n }\r\n}\r\n","/**\r\n * Custom Error Classes\r\n * \r\n * Provides structured error handling with error codes, context, and recovery hints.\r\n */\r\n\r\nexport type ErrorCode =\r\n | 'VALIDATION_ERROR'\r\n | 'FIREWALL_BLOCKED'\r\n | 'EVIDENCE_NOT_FOUND'\r\n | 'TRUTHPACK_LOAD_FAILED'\r\n | 'CONFIG_INVALID'\r\n | 'TIMEOUT'\r\n | 'RATE_LIMITED'\r\n | 'PERMISSION_DENIED'\r\n | 'RESOURCE_NOT_FOUND'\r\n | 'NETWORK_ERROR'\r\n | 'PARSE_ERROR'\r\n | 'INTERNAL_ERROR'\r\n | 'DEPENDENCY_MISSING'\r\n | 'OPERATION_CANCELLED';\r\n\r\nexport interface ErrorContext {\r\n code: ErrorCode;\r\n component: string;\r\n operation: string;\r\n details?: Record<string, unknown>;\r\n recoveryHint?: string;\r\n retryable?: boolean;\r\n}\r\n\r\n/**\r\n * Base error class for all VibeCheck errors\r\n */\r\nexport class VibeCheckError extends Error {\r\n public readonly code: ErrorCode;\r\n public readonly component: string;\r\n public readonly operation: string;\r\n public readonly details: Record<string, unknown>;\r\n public readonly recoveryHint?: string;\r\n public readonly retryable: boolean;\r\n public readonly timestamp: Date;\r\n public readonly cause?: Error;\r\n\r\n constructor(message: string, context: ErrorContext, cause?: Error) {\r\n super(message);\r\n this.name = 'VibeCheckError';\r\n this.code = context.code;\r\n this.component = context.component;\r\n this.operation = context.operation;\r\n this.details = context.details ?? {};\r\n this.recoveryHint = context.recoveryHint;\r\n this.retryable = context.retryable ?? false;\r\n this.timestamp = new Date();\r\n this.cause = cause;\r\n\r\n // Maintain proper stack trace\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, VibeCheckError);\r\n }\r\n }\r\n\r\n toJSON(): Record<string, unknown> {\r\n return {\r\n name: this.name,\r\n message: this.message,\r\n code: this.code,\r\n component: this.component,\r\n operation: this.operation,\r\n details: this.details,\r\n recoveryHint: this.recoveryHint,\r\n retryable: this.retryable,\r\n timestamp: this.timestamp.toISOString(),\r\n stack: this.stack,\r\n cause: this.cause?.message,\r\n };\r\n }\r\n\r\n toString(): string {\r\n return `[${this.code}] ${this.component}.${this.operation}: ${this.message}`;\r\n }\r\n}\r\n\r\n/**\r\n * Validation error for invalid inputs\r\n */\r\nexport class ValidationError extends VibeCheckError {\r\n public readonly field?: string;\r\n public readonly value?: unknown;\r\n public readonly constraints?: string[];\r\n\r\n constructor(\r\n message: string,\r\n options: {\r\n component: string;\r\n operation: string;\r\n field?: string;\r\n value?: unknown;\r\n constraints?: string[];\r\n recoveryHint?: string;\r\n }\r\n ) {\r\n super(message, {\r\n code: 'VALIDATION_ERROR',\r\n component: options.component,\r\n operation: options.operation,\r\n details: { field: options.field, constraints: options.constraints },\r\n recoveryHint: options.recoveryHint ?? `Check the ${options.field ?? 'input'} value`,\r\n retryable: false,\r\n });\r\n this.name = 'ValidationError';\r\n this.field = options.field;\r\n this.value = options.value;\r\n this.constraints = options.constraints;\r\n }\r\n}\r\n\r\n/**\r\n * Firewall block error\r\n */\r\nexport class FirewallBlockedError extends VibeCheckError {\r\n public readonly violations: Array<{ policy: string; message: string; severity: string }>;\r\n public readonly auditId: string;\r\n\r\n constructor(\r\n message: string,\r\n options: {\r\n component: string;\r\n violations: Array<{ policy: string; message: string; severity: string }>;\r\n auditId: string;\r\n recoveryHint?: string;\r\n }\r\n ) {\r\n super(message, {\r\n code: 'FIREWALL_BLOCKED',\r\n component: options.component,\r\n operation: 'evaluate',\r\n details: { violationCount: options.violations.length, auditId: options.auditId },\r\n recoveryHint: options.recoveryHint ?? 'Review the violations and fix the identified issues',\r\n retryable: false,\r\n });\r\n this.name = 'FirewallBlockedError';\r\n this.violations = options.violations;\r\n this.auditId = options.auditId;\r\n }\r\n}\r\n\r\n/**\r\n * Timeout error\r\n */\r\nexport class TimeoutError extends VibeCheckError {\r\n public readonly timeoutMs: number;\r\n public readonly elapsed: number;\r\n\r\n constructor(\r\n message: string,\r\n options: {\r\n component: string;\r\n operation: string;\r\n timeoutMs: number;\r\n elapsed: number;\r\n }\r\n ) {\r\n super(message, {\r\n code: 'TIMEOUT',\r\n component: options.component,\r\n operation: options.operation,\r\n details: { timeoutMs: options.timeoutMs, elapsed: options.elapsed },\r\n recoveryHint: 'Consider increasing timeout or optimizing the operation',\r\n retryable: true,\r\n });\r\n this.name = 'TimeoutError';\r\n this.timeoutMs = options.timeoutMs;\r\n this.elapsed = options.elapsed;\r\n }\r\n}\r\n\r\n/**\r\n * Resource not found error\r\n */\r\nexport class ResourceNotFoundError extends VibeCheckError {\r\n public readonly resourceType: string;\r\n public readonly resourceId: string;\r\n\r\n constructor(\r\n message: string,\r\n options: {\r\n component: string;\r\n operation: string;\r\n resourceType: string;\r\n resourceId: string;\r\n recoveryHint?: string;\r\n }\r\n ) {\r\n super(message, {\r\n code: 'RESOURCE_NOT_FOUND',\r\n component: options.component,\r\n operation: options.operation,\r\n details: { resourceType: options.resourceType, resourceId: options.resourceId },\r\n recoveryHint: options.recoveryHint ?? `Verify the ${options.resourceType} exists`,\r\n retryable: false,\r\n });\r\n this.name = 'ResourceNotFoundError';\r\n this.resourceType = options.resourceType;\r\n this.resourceId = options.resourceId;\r\n }\r\n}\r\n\r\n/**\r\n * Configuration error\r\n */\r\nexport class ConfigError extends VibeCheckError {\r\n public readonly configKey?: string;\r\n\r\n constructor(\r\n message: string,\r\n options: {\r\n component: string;\r\n configKey?: string;\r\n recoveryHint?: string;\r\n }\r\n ) {\r\n super(message, {\r\n code: 'CONFIG_INVALID',\r\n component: options.component,\r\n operation: 'configure',\r\n details: { configKey: options.configKey },\r\n recoveryHint: options.recoveryHint ?? 'Check configuration values',\r\n retryable: false,\r\n });\r\n this.name = 'ConfigError';\r\n this.configKey = options.configKey;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// New Module Error Classes (Vibecheck-4 Integration)\r\n// ============================================================================\r\n\r\n/**\r\n * Checkpoint system error\r\n */\r\nexport class CheckpointError extends VibeCheckError {\r\n public readonly checkpointId?: string;\r\n\r\n constructor(\r\n message: string,\r\n options: {\r\n operation: string;\r\n checkpointId?: string;\r\n details?: Record<string, unknown>;\r\n recoveryHint?: string;\r\n cause?: Error;\r\n }\r\n ) {\r\n super(message, {\r\n code: 'INTERNAL_ERROR',\r\n component: 'Checkpoint',\r\n operation: options.operation,\r\n details: { checkpointId: options.checkpointId, ...options.details },\r\n recoveryHint: options.recoveryHint,\r\n retryable: false,\r\n }, options.cause);\r\n this.name = 'CheckpointError';\r\n this.checkpointId = options.checkpointId;\r\n }\r\n}\r\n\r\n/**\r\n * Secrets scanner error\r\n */\r\nexport class SecretsError extends VibeCheckError {\r\n public readonly filePath?: string;\r\n\r\n constructor(\r\n message: string,\r\n options: {\r\n operation: string;\r\n filePath?: string;\r\n details?: Record<string, unknown>;\r\n recoveryHint?: string;\r\n cause?: Error;\r\n }\r\n ) {\r\n super(message, {\r\n code: 'INTERNAL_ERROR',\r\n component: 'Secrets',\r\n operation: options.operation,\r\n details: { filePath: options.filePath, ...options.details },\r\n recoveryHint: options.recoveryHint,\r\n retryable: false,\r\n }, options.cause);\r\n this.name = 'SecretsError';\r\n this.filePath = options.filePath;\r\n }\r\n}\r\n\r\n/**\r\n * Formatter error (SARIF, HTML, etc.)\r\n */\r\nexport class FormatterError extends VibeCheckError {\r\n public readonly format?: string;\r\n\r\n constructor(\r\n message: string,\r\n options: {\r\n operation: string;\r\n format?: string;\r\n details?: Record<string, unknown>;\r\n recoveryHint?: string;\r\n cause?: Error;\r\n }\r\n ) {\r\n super(message, {\r\n code: 'INTERNAL_ERROR',\r\n component: 'Formatter',\r\n operation: options.operation,\r\n details: { format: options.format, ...options.details },\r\n recoveryHint: options.recoveryHint,\r\n retryable: false,\r\n }, options.cause);\r\n this.name = 'FormatterError';\r\n this.format = options.format;\r\n }\r\n}\r\n\r\n/**\r\n * CLI Registry error\r\n */\r\nexport class RegistryError extends VibeCheckError {\r\n public readonly commandName?: string;\r\n\r\n constructor(\r\n message: string,\r\n options: {\r\n operation: string;\r\n commandName?: string;\r\n details?: Record<string, unknown>;\r\n recoveryHint?: string;\r\n }\r\n ) {\r\n super(message, {\r\n code: 'INTERNAL_ERROR',\r\n component: 'Registry',\r\n operation: options.operation,\r\n details: { commandName: options.commandName, ...options.details },\r\n recoveryHint: options.recoveryHint,\r\n retryable: false,\r\n });\r\n this.name = 'RegistryError';\r\n this.commandName = options.commandName;\r\n }\r\n}\r\n\r\n/**\r\n * Visualization error\r\n */\r\nexport class VisualizationError extends VibeCheckError {\r\n public readonly outputFormat?: string;\r\n\r\n constructor(\r\n message: string,\r\n options: {\r\n operation: string;\r\n outputFormat?: string;\r\n details?: Record<string, unknown>;\r\n recoveryHint?: string;\r\n cause?: Error;\r\n }\r\n ) {\r\n super(message, {\r\n code: 'INTERNAL_ERROR',\r\n component: 'Visualization',\r\n operation: options.operation,\r\n details: { outputFormat: options.outputFormat, ...options.details },\r\n recoveryHint: options.recoveryHint,\r\n retryable: false,\r\n }, options.cause);\r\n this.name = 'VisualizationError';\r\n this.outputFormat = options.outputFormat;\r\n }\r\n}\r\n\r\n/**\r\n * Check if an error is a VibeCheckError\r\n */\r\nexport function isVibeCheckError(error: unknown): error is VibeCheckError {\r\n return error instanceof VibeCheckError;\r\n}\r\n\r\n/**\r\n * Wrap unknown errors in a VibeCheckError\r\n */\r\nexport function wrapError(\r\n error: unknown,\r\n context: { component: string; operation: string }\r\n): VibeCheckError {\r\n if (isVibeCheckError(error)) {\r\n return error;\r\n }\r\n\r\n const message = error instanceof Error ? error.message : String(error);\r\n const cause = error instanceof Error ? error : undefined;\r\n\r\n return new VibeCheckError(message, {\r\n code: 'INTERNAL_ERROR',\r\n component: context.component,\r\n operation: context.operation,\r\n retryable: false,\r\n }, cause);\r\n}\r\n\r\n/**\r\n * Assert a condition and throw if false\r\n */\r\nexport function assertCondition(\r\n condition: boolean,\r\n message: string,\r\n context: { component: string; operation: string; code?: ErrorCode }\r\n): asserts condition {\r\n if (!condition) {\r\n throw new VibeCheckError(message, {\r\n code: context.code ?? 'VALIDATION_ERROR',\r\n component: context.component,\r\n operation: context.operation,\r\n });\r\n }\r\n}\r\n","/**\r\n * Structured Logger\r\n * \r\n * Provides consistent, structured logging across all components.\r\n */\r\n\r\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\r\n\r\nexport interface LogEntry {\r\n timestamp: string;\r\n level: LogLevel;\r\n component: string;\r\n message: string;\r\n context?: Record<string, unknown>;\r\n duration?: number;\r\n error?: {\r\n name: string;\r\n message: string;\r\n code?: string;\r\n stack?: string;\r\n };\r\n}\r\n\r\nexport interface LoggerConfig {\r\n level: LogLevel;\r\n component: string;\r\n enableConsole: boolean;\r\n enableStructured: boolean;\r\n onLog?: (entry: LogEntry) => void;\r\n}\r\n\r\nconst LOG_LEVELS: Record<LogLevel, number> = {\r\n debug: 0,\r\n info: 1,\r\n warn: 2,\r\n error: 3,\r\n};\r\n\r\nconst DEFAULT_CONFIG: LoggerConfig = {\r\n level: 'info',\r\n component: 'vibecheck',\r\n enableConsole: true,\r\n enableStructured: false,\r\n};\r\n\r\n/**\r\n * Create a scoped logger instance\r\n */\r\nexport class Logger {\r\n private config: LoggerConfig;\r\n\r\n constructor(config: Partial<LoggerConfig> = {}) {\r\n this.config = { ...DEFAULT_CONFIG, ...config };\r\n }\r\n\r\n /**\r\n * Create a child logger with a new component name\r\n */\r\n child(component: string): Logger {\r\n return new Logger({\r\n ...this.config,\r\n component: `${this.config.component}.${component}`,\r\n });\r\n }\r\n\r\n /**\r\n * Log at debug level\r\n */\r\n debug(message: string, context?: Record<string, unknown>): void {\r\n this.log('debug', message, context);\r\n }\r\n\r\n /**\r\n * Log at info level\r\n */\r\n info(message: string, context?: Record<string, unknown>): void {\r\n this.log('info', message, context);\r\n }\r\n\r\n /**\r\n * Log at warn level\r\n */\r\n warn(message: string, context?: Record<string, unknown>): void {\r\n this.log('warn', message, context);\r\n }\r\n\r\n /**\r\n * Log at error level\r\n */\r\n error(message: string, error?: Error, context?: Record<string, unknown>): void {\r\n const errorInfo = error ? {\r\n name: error.name,\r\n message: error.message,\r\n code: (error as { code?: string }).code,\r\n stack: error.stack,\r\n } : undefined;\r\n\r\n this.log('error', message, context, errorInfo);\r\n }\r\n\r\n /**\r\n * Log with timing\r\n */\r\n timed<T>(\r\n operation: string,\r\n fn: () => T | Promise<T>,\r\n context?: Record<string, unknown>\r\n ): T | Promise<T> {\r\n const start = performance.now();\r\n \r\n const logCompletion = (success: boolean, error?: Error) => {\r\n const duration = Math.round(performance.now() - start);\r\n if (success) {\r\n this.debug(`${operation} completed`, { ...context, duration });\r\n } else {\r\n this.error(`${operation} failed`, error, { ...context, duration });\r\n }\r\n };\r\n\r\n try {\r\n const result = fn();\r\n \r\n if (result instanceof Promise) {\r\n return result\r\n .then((value) => {\r\n logCompletion(true);\r\n return value;\r\n })\r\n .catch((error) => {\r\n logCompletion(false, error);\r\n throw error;\r\n }) as Promise<T>;\r\n }\r\n \r\n logCompletion(true);\r\n return result;\r\n } catch (error) {\r\n logCompletion(false, error as Error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Create a log group for related operations\r\n */\r\n group(name: string): LogGroup {\r\n return new LogGroup(this, name);\r\n }\r\n\r\n private log(\r\n level: LogLevel,\r\n message: string,\r\n context?: Record<string, unknown>,\r\n error?: LogEntry['error']\r\n ): void {\r\n if (LOG_LEVELS[level] < LOG_LEVELS[this.config.level]) {\r\n return;\r\n }\r\n\r\n const entry: LogEntry = {\r\n timestamp: new Date().toISOString(),\r\n level,\r\n component: this.config.component,\r\n message,\r\n context,\r\n error,\r\n };\r\n\r\n // Call custom handler if provided\r\n if (this.config.onLog) {\r\n this.config.onLog(entry);\r\n }\r\n\r\n // Console output\r\n if (this.config.enableConsole) {\r\n this.writeToConsole(entry);\r\n }\r\n }\r\n\r\n private writeToConsole(entry: LogEntry): void {\r\n const prefix = `[${entry.timestamp}] [${entry.level.toUpperCase()}] [${entry.component}]`;\r\n const contextStr = entry.context ? ` ${JSON.stringify(entry.context)}` : '';\r\n\r\n if (this.config.enableStructured) {\r\n // Structured JSON output\r\n const output = JSON.stringify(entry);\r\n switch (entry.level) {\r\n case 'error':\r\n console.error(output);\r\n break;\r\n case 'warn':\r\n console.warn(output);\r\n break;\r\n default:\r\n console.log(output);\r\n }\r\n } else {\r\n // Human-readable output\r\n const message = `${prefix} ${entry.message}${contextStr}`;\r\n switch (entry.level) {\r\n case 'error':\r\n console.error(message);\r\n if (entry.error?.stack) {\r\n console.error(entry.error.stack);\r\n }\r\n break;\r\n case 'warn':\r\n console.warn(message);\r\n break;\r\n case 'debug':\r\n console.debug(message);\r\n break;\r\n default:\r\n console.log(message);\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Log group for tracking related operations\r\n */\r\nexport class LogGroup {\r\n private logger: Logger;\r\n private name: string;\r\n private startTime: number;\r\n private operations: Array<{ name: string; duration: number; success: boolean }> = [];\r\n\r\n constructor(logger: Logger, name: string) {\r\n this.logger = logger;\r\n this.name = name;\r\n this.startTime = performance.now();\r\n this.logger.debug(`Starting: ${name}`);\r\n }\r\n\r\n /**\r\n * Add an operation to the group\r\n */\r\n addOperation(name: string, duration: number, success: boolean): void {\r\n this.operations.push({ name, duration, success });\r\n }\r\n\r\n /**\r\n * End the group and log summary\r\n */\r\n end(success = true): void {\r\n const totalDuration = Math.round(performance.now() - this.startTime);\r\n const failed = this.operations.filter(op => !op.success).length;\r\n \r\n if (success && failed === 0) {\r\n this.logger.info(`Completed: ${this.name}`, {\r\n duration: totalDuration,\r\n operationCount: this.operations.length,\r\n });\r\n } else {\r\n this.logger.warn(`Completed with issues: ${this.name}`, {\r\n duration: totalDuration,\r\n operationCount: this.operations.length,\r\n failedCount: failed,\r\n });\r\n }\r\n }\r\n}\r\n\r\n// Default logger instance\r\nlet defaultLogger: Logger | null = null;\r\n\r\n/**\r\n * Get or create the default logger\r\n */\r\nexport function getLogger(component?: string): Logger {\r\n if (!defaultLogger) {\r\n defaultLogger = new Logger({ level: 'info', component: 'vibecheck' });\r\n }\r\n return component ? defaultLogger.child(component) : defaultLogger;\r\n}\r\n\r\n/**\r\n * Configure the default logger\r\n */\r\nexport function configureLogger(config: Partial<LoggerConfig>): void {\r\n defaultLogger = new Logger(config);\r\n}\r\n","/**\r\n * Performance Monitoring Utilities\r\n * \r\n * Provides performance tracking, metrics collection, and optimization helpers.\r\n */\r\n\r\nexport interface PerformanceMetric {\r\n name: string;\r\n count: number;\r\n totalMs: number;\r\n minMs: number;\r\n maxMs: number;\r\n avgMs: number;\r\n p50Ms: number;\r\n p95Ms: number;\r\n p99Ms: number;\r\n}\r\n\r\nexport interface TimingResult<T> {\r\n result: T;\r\n durationMs: number;\r\n}\r\n\r\n/**\r\n * Performance tracker for collecting metrics\r\n */\r\nexport class PerformanceTracker {\r\n private metrics: Map<string, number[]> = new Map();\r\n private maxSamples: number;\r\n\r\n constructor(maxSamples = 1000) {\r\n this.maxSamples = maxSamples;\r\n }\r\n\r\n /**\r\n * Record a timing\r\n */\r\n record(name: string, durationMs: number): void {\r\n let samples = this.metrics.get(name);\r\n if (!samples) {\r\n samples = [];\r\n this.metrics.set(name, samples);\r\n }\r\n\r\n samples.push(durationMs);\r\n\r\n // Trim old samples\r\n if (samples.length > this.maxSamples) {\r\n samples.shift();\r\n }\r\n }\r\n\r\n /**\r\n * Time an operation\r\n */\r\n async time<T>(name: string, fn: () => Promise<T>): Promise<TimingResult<T>> {\r\n const start = performance.now();\r\n try {\r\n const result = await fn();\r\n const durationMs = performance.now() - start;\r\n this.record(name, durationMs);\r\n return { result, durationMs };\r\n } catch (error) {\r\n const durationMs = performance.now() - start;\r\n this.record(`${name}.error`, durationMs);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Time a sync operation\r\n */\r\n timeSync<T>(name: string, fn: () => T): TimingResult<T> {\r\n const start = performance.now();\r\n try {\r\n const result = fn();\r\n const durationMs = performance.now() - start;\r\n this.record(name, durationMs);\r\n return { result, durationMs };\r\n } catch (error) {\r\n const durationMs = performance.now() - start;\r\n this.record(`${name}.error`, durationMs);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Get metric for a specific operation\r\n */\r\n getMetric(name: string): PerformanceMetric | null {\r\n const samples = this.metrics.get(name);\r\n if (!samples || samples.length === 0) return null;\r\n\r\n const sorted = [...samples].sort((a, b) => a - b);\r\n const count = sorted.length;\r\n const total = sorted.reduce((a, b) => a + b, 0);\r\n\r\n return {\r\n name,\r\n count,\r\n totalMs: total,\r\n minMs: sorted[0],\r\n maxMs: sorted[count - 1],\r\n avgMs: total / count,\r\n p50Ms: sorted[Math.floor(count * 0.5)],\r\n p95Ms: sorted[Math.floor(count * 0.95)],\r\n p99Ms: sorted[Math.floor(count * 0.99)],\r\n };\r\n }\r\n\r\n /**\r\n * Get all metrics\r\n */\r\n getAllMetrics(): PerformanceMetric[] {\r\n const metrics: PerformanceMetric[] = [];\r\n for (const name of this.metrics.keys()) {\r\n const metric = this.getMetric(name);\r\n if (metric) metrics.push(metric);\r\n }\r\n return metrics.sort((a, b) => b.totalMs - a.totalMs);\r\n }\r\n\r\n /**\r\n * Get metrics summary\r\n */\r\n getSummary(): {\r\n totalOperations: number;\r\n totalTimeMs: number;\r\n slowestOperation: string | null;\r\n fastestOperation: string | null;\r\n } {\r\n const metrics = this.getAllMetrics();\r\n \r\n return {\r\n totalOperations: metrics.reduce((sum, m) => sum + m.count, 0),\r\n totalTimeMs: metrics.reduce((sum, m) => sum + m.totalMs, 0),\r\n slowestOperation: metrics.length > 0 ? metrics[0].name : null,\r\n fastestOperation: metrics.length > 0 ? metrics[metrics.length - 1].name : null,\r\n };\r\n }\r\n\r\n /**\r\n * Clear all metrics\r\n */\r\n clear(): void {\r\n this.metrics.clear();\r\n }\r\n\r\n /**\r\n * Export metrics as JSON\r\n */\r\n export(): Record<string, PerformanceMetric> {\r\n const result: Record<string, PerformanceMetric> = {};\r\n for (const metric of this.getAllMetrics()) {\r\n result[metric.name] = metric;\r\n }\r\n return result;\r\n }\r\n}\r\n\r\n/**\r\n * Batch processor for efficient bulk operations\r\n */\r\nexport class BatchProcessor<TInput, TOutput> {\r\n private batchSize: number;\r\n private concurrency: number;\r\n private processor: (items: TInput[]) => Promise<TOutput[]>;\r\n\r\n constructor(options: {\r\n batchSize: number;\r\n concurrency: number;\r\n processor: (items: TInput[]) => Promise<TOutput[]>;\r\n }) {\r\n this.batchSize = options.batchSize;\r\n this.concurrency = options.concurrency;\r\n this.processor = options.processor;\r\n }\r\n\r\n /**\r\n * Process items in batches\r\n */\r\n async process(items: TInput[]): Promise<TOutput[]> {\r\n if (items.length === 0) return [];\r\n\r\n // Split into batches\r\n const batches: TInput[][] = [];\r\n for (let i = 0; i < items.length; i += this.batchSize) {\r\n batches.push(items.slice(i, i + this.batchSize));\r\n }\r\n\r\n // Process batches with concurrency limit\r\n const results: TOutput[] = [];\r\n \r\n for (let i = 0; i < batches.length; i += this.concurrency) {\r\n const batchGroup = batches.slice(i, i + this.concurrency);\r\n const batchResults = await Promise.all(\r\n batchGroup.map(batch => this.processor(batch))\r\n );\r\n results.push(...batchResults.flat());\r\n }\r\n\r\n return results;\r\n }\r\n}\r\n\r\n/**\r\n * Resource pool for reusable resources\r\n */\r\nexport class ResourcePool<T> {\r\n private available: T[] = [];\r\n private inUse = new Set<T>();\r\n private factory: () => T | Promise<T>;\r\n private maxSize: number;\r\n private validator?: (resource: T) => boolean;\r\n\r\n constructor(options: {\r\n factory: () => T | Promise<T>;\r\n maxSize: number;\r\n validator?: (resource: T) => boolean;\r\n initialSize?: number;\r\n }) {\r\n this.factory = options.factory;\r\n this.maxSize = options.maxSize;\r\n this.validator = options.validator;\r\n }\r\n\r\n /**\r\n * Acquire a resource from the pool\r\n */\r\n async acquire(): Promise<T> {\r\n // Try to get an available resource\r\n while (this.available.length > 0) {\r\n const resource = this.available.pop()!;\r\n \r\n // Validate if validator is provided\r\n if (this.validator && !this.validator(resource)) {\r\n continue; // Skip invalid resource\r\n }\r\n\r\n this.inUse.add(resource);\r\n return resource;\r\n }\r\n\r\n // Create new resource if under limit\r\n if (this.inUse.size < this.maxSize) {\r\n const resource = await this.factory();\r\n this.inUse.add(resource);\r\n return resource;\r\n }\r\n\r\n // Wait for a resource to become available\r\n return new Promise((resolve) => {\r\n const checkInterval = setInterval(async () => {\r\n if (this.available.length > 0) {\r\n clearInterval(checkInterval);\r\n resolve(await this.acquire());\r\n }\r\n }, 10);\r\n });\r\n }\r\n\r\n /**\r\n * Release a resource back to the pool\r\n */\r\n release(resource: T): void {\r\n if (this.inUse.has(resource)) {\r\n this.inUse.delete(resource);\r\n this.available.push(resource);\r\n }\r\n }\r\n\r\n /**\r\n * Execute with a pooled resource\r\n */\r\n async withResource<R>(fn: (resource: T) => Promise<R>): Promise<R> {\r\n const resource = await this.acquire();\r\n try {\r\n return await fn(resource);\r\n } finally {\r\n this.release(resource);\r\n }\r\n }\r\n\r\n /**\r\n * Get pool statistics\r\n */\r\n getStats(): { available: number; inUse: number; total: number } {\r\n return {\r\n available: this.available.length,\r\n inUse: this.inUse.size,\r\n total: this.available.length + this.inUse.size,\r\n };\r\n }\r\n\r\n /**\r\n * Clear the pool\r\n */\r\n clear(): void {\r\n this.available = [];\r\n this.inUse.clear();\r\n }\r\n}\r\n\r\n/**\r\n * Run operations in parallel with a concurrency limit\r\n * \r\n * Optimized implementation that efficiently tracks executing promises\r\n * without O(n²) promise checks.\r\n */\r\nexport async function parallelLimit<T, R>(\r\n items: T[],\r\n limit: number,\r\n fn: (item: T, index: number) => Promise<R>\r\n): Promise<R[]> {\r\n if (items.length === 0) return [];\r\n if (limit <= 0) throw new Error('Concurrency limit must be positive');\r\n\r\n const results: R[] = new Array(items.length);\r\n const executing = new Set<Promise<void>>();\r\n let nextIndex = 0;\r\n\r\n // Helper to start next task\r\n const startNext = async (): Promise<void> => {\r\n if (nextIndex >= items.length) return;\r\n\r\n const index = nextIndex++;\r\n const promise = fn(items[index], index)\r\n .then(result => {\r\n results[index] = result;\r\n })\r\n .catch(error => {\r\n // Store error in results array\r\n throw error;\r\n })\r\n .finally(() => {\r\n executing.delete(promise);\r\n // Start next task if available\r\n if (nextIndex < items.length) {\r\n startNext();\r\n }\r\n });\r\n\r\n executing.add(promise);\r\n };\r\n\r\n // Start initial batch\r\n const initialBatch = Math.min(limit, items.length);\r\n for (let i = 0; i < initialBatch; i++) {\r\n startNext();\r\n }\r\n\r\n // Wait for all to complete\r\n while (executing.size > 0) {\r\n await Promise.race(executing);\r\n }\r\n\r\n return results;\r\n}\r\n\r\n/**\r\n * Measure memory usage\r\n */\r\nexport function getMemoryUsage(): {\r\n heapUsed: number;\r\n heapTotal: number;\r\n external: number;\r\n rss: number;\r\n} {\r\n if (typeof process !== 'undefined' && process.memoryUsage) {\r\n const usage = process.memoryUsage();\r\n return {\r\n heapUsed: usage.heapUsed,\r\n heapTotal: usage.heapTotal,\r\n external: usage.external,\r\n rss: usage.rss,\r\n };\r\n }\r\n return { heapUsed: 0, heapTotal: 0, external: 0, rss: 0 };\r\n}\r\n\r\n// Global performance tracker\r\nlet globalTracker: PerformanceTracker | null = null;\r\n\r\n/**\r\n * Get the global performance tracker\r\n */\r\nexport function getPerformanceTracker(): PerformanceTracker {\r\n if (!globalTracker) {\r\n globalTracker = new PerformanceTracker();\r\n }\r\n return globalTracker;\r\n}\r\n","/**\r\n * Route Scanner\r\n * \r\n * Scans codebase to extract route definitions from various frameworks\r\n * (Express, Fastify, Next.js, Hono, Koa, NestJS).\r\n * \r\n * Features:\r\n * - Multi-framework support\r\n * - Parameter extraction and type inference\r\n * - Middleware and auth detection\r\n * - Parallel file processing\r\n * - Performance tracking\r\n */\r\n\r\nimport { glob } from 'glob';\r\nimport * as fs from 'fs/promises';\r\nimport * as path from 'path';\r\nimport type { RouteDefinition } from '../schemas/routes.schema.js';\r\nimport { getLogger, type Logger } from '../../utils/logger.js';\r\nimport { PerformanceTracker } from '../../utils/performance.js';\r\nimport { parallelLimit } from '../../utils/performance.js';\r\nimport { wrapError } from '../../utils/errors.js';\r\n\r\nexport interface RouteScannerConfig {\r\n frameworks: ('express' | 'fastify' | 'nextjs' | 'hono' | 'koa' | 'nestjs')[];\r\n includePatterns: string[];\r\n excludePatterns: string[];\r\n maxFileSize: number;\r\n parallelLimit: number;\r\n}\r\n\r\nconst DEFAULT_CONFIG: RouteScannerConfig = {\r\n frameworks: ['express', 'nextjs', 'fastify', 'hono'],\r\n includePatterns: ['**/*.ts', '**/*.js', '**/route.ts', '**/route.js'],\r\n excludePatterns: ['node_modules/**', 'dist/**', 'build/**', '.next/**', 'coverage/**', '**/*.test.*', '**/*.spec.*'],\r\n maxFileSize: 512 * 1024, // 512KB\r\n parallelLimit: 20,\r\n};\r\n\r\n// HTTP methods to detect\r\nconst HTTP_METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS', 'HEAD'] as const;\r\ntype HttpMethod = typeof HTTP_METHODS[number];\r\n\r\n// Common auth middleware patterns\r\nconst AUTH_PATTERNS = /(?:auth|authenticate|requireAuth|isAuthenticated|protect|guard|verify(?:Token|JWT|Session)|ensureLoggedIn|passport\\.authenticate)/i;\r\n\r\n// Common middleware patterns\r\nconst MIDDLEWARE_PATTERNS = [\r\n /(\\w+Middleware)/g,\r\n /(authenticate|authorize|validate\\w*|rateLimit|cors|helmet|compression|bodyParser|multer|passport|session|csrf|sanitize)/gi,\r\n];\r\n\r\nexport class RouteScanner {\r\n private projectRoot: string;\r\n private config: RouteScannerConfig;\r\n private logger: Logger;\r\n private performanceTracker: PerformanceTracker;\r\n private fileCache: Map<string, string> = new Map();\r\n\r\n constructor(projectRoot: string, config: Partial<RouteScannerConfig> = {}) {\r\n this.projectRoot = projectRoot;\r\n this.config = { ...DEFAULT_CONFIG, ...config };\r\n this.logger = getLogger('route-scanner');\r\n this.performanceTracker = new PerformanceTracker();\r\n }\r\n\r\n /**\r\n * Scan project for route definitions\r\n */\r\n async scan(): Promise<RouteDefinition[]> {\r\n const startTime = performance.now();\r\n const routes: RouteDefinition[] = [];\r\n\r\n this.logger.info('Starting route scan', {\r\n projectRoot: this.projectRoot,\r\n frameworks: this.config.frameworks,\r\n });\r\n\r\n try {\r\n // Scan for each framework in parallel\r\n const scanPromises = this.config.frameworks.map(async (framework) => {\r\n const { result: frameworkRoutes, durationMs } = await this.performanceTracker.time(\r\n `scan_${framework}`,\r\n async () => {\r\n switch (framework) {\r\n case 'express':\r\n return this.scanExpress();\r\n case 'fastify':\r\n return this.scanFastify();\r\n case 'nextjs':\r\n return this.scanNextJs();\r\n case 'hono':\r\n return this.scanHono();\r\n case 'koa':\r\n return this.scanKoa();\r\n case 'nestjs':\r\n return this.scanNestJs();\r\n default:\r\n return [];\r\n }\r\n }\r\n );\r\n\r\n this.logger.debug(`Scanned ${framework}`, {\r\n routeCount: frameworkRoutes.length,\r\n durationMs: Math.round(durationMs),\r\n });\r\n\r\n return frameworkRoutes;\r\n });\r\n\r\n const allRoutes = await Promise.all(scanPromises);\r\n routes.push(...allRoutes.flat());\r\n\r\n // Deduplicate routes\r\n const deduped = this.deduplicateRoutes(routes);\r\n const durationMs = performance.now() - startTime;\r\n\r\n this.logger.info('Route scan complete', {\r\n totalRoutes: deduped.length,\r\n duplicatesRemoved: routes.length - deduped.length,\r\n durationMs: Math.round(durationMs),\r\n });\r\n\r\n return deduped;\r\n } catch (error) {\r\n this.logger.error('Route scan failed', error as Error);\r\n throw wrapError(error, { component: 'RouteScanner', operation: 'scan' });\r\n } finally {\r\n // Clear file cache to free memory\r\n this.fileCache.clear();\r\n }\r\n }\r\n\r\n /**\r\n * Get performance metrics\r\n */\r\n getPerformanceMetrics(): Record<string, unknown> {\r\n return this.performanceTracker.export();\r\n }\r\n\r\n /**\r\n * Get files matching patterns with caching\r\n */\r\n private async getFiles(patterns: string[]): Promise<string[]> {\r\n const files: string[] = [];\r\n \r\n for (const pattern of patterns) {\r\n try {\r\n const matches = await glob(pattern, {\r\n cwd: this.projectRoot,\r\n ignore: this.config.excludePatterns,\r\n absolute: true,\r\n nodir: true,\r\n });\r\n files.push(...matches);\r\n } catch (error) {\r\n this.logger.warn(`Glob pattern failed: ${pattern}`, { error: error instanceof Error ? error.message : 'Unknown' });\r\n }\r\n }\r\n\r\n return [...new Set(files)];\r\n }\r\n\r\n /**\r\n * Read file with caching and size limit\r\n */\r\n private async readFile(filePath: string): Promise<string | null> {\r\n // Check cache\r\n const cached = this.fileCache.get(filePath);\r\n if (cached !== undefined) return cached;\r\n\r\n try {\r\n // Check file size\r\n const stat = await fs.stat(filePath);\r\n if (stat.size > this.config.maxFileSize) {\r\n this.logger.debug(`Skipping large file: ${filePath}`, { size: stat.size });\r\n return null;\r\n }\r\n\r\n const content = await fs.readFile(filePath, 'utf-8');\r\n this.fileCache.set(filePath, content);\r\n return content;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Extract route parameters from path (e.g., :id, [id])\r\n */\r\n private extractParameters(routePath: string): RouteDefinition['parameters'] {\r\n const params: NonNullable<RouteDefinition['parameters']> = [];\r\n\r\n // Express/Fastify style: :param or :param?\r\n const colonParams = routePath.match(/:(\\w+)\\??/g);\r\n if (colonParams) {\r\n for (const param of colonParams) {\r\n const name = param.replace(/[:?]/g, '');\r\n params.push({\r\n name,\r\n type: this.inferParamType(name),\r\n required: !param.endsWith('?'),\r\n });\r\n }\r\n }\r\n\r\n // Next.js style: [param] or [[...param]] or [...param]\r\n const bracketParams = routePath.match(/\\[+\\.{0,3}(\\w+)\\]+/g);\r\n if (bracketParams) {\r\n for (const param of bracketParams) {\r\n const name = param.replace(/[\\[\\]\\.]/g, '');\r\n const isCatchAll = param.includes('...');\r\n const isOptional = param.startsWith('[[');\r\n params.push({\r\n name,\r\n type: isCatchAll ? 'string' : this.inferParamType(name),\r\n required: !isOptional,\r\n });\r\n }\r\n }\r\n\r\n // Fastify style: :param(regex)\r\n const regexParams = routePath.match(/:(\\w+)\\([^)]+\\)/g);\r\n if (regexParams) {\r\n for (const param of regexParams) {\r\n const name = param.match(/:(\\w+)/)?.[1] ?? param;\r\n if (!params.some(p => p.name === name)) {\r\n params.push({\r\n name,\r\n type: this.inferParamType(name),\r\n required: true,\r\n });\r\n }\r\n }\r\n }\r\n\r\n return params;\r\n }\r\n\r\n /**\r\n * Infer parameter type from its name\r\n */\r\n private inferParamType(name: string): 'string' | 'number' | 'boolean' | 'uuid' {\r\n const nameLower = name.toLowerCase();\r\n \r\n // UUID patterns\r\n if (nameLower === 'id' || nameLower === 'uuid' || nameLower.endsWith('id') || nameLower.endsWith('uuid')) {\r\n return 'uuid';\r\n }\r\n \r\n // Number patterns\r\n if (\r\n nameLower.includes('count') ||\r\n nameLower.includes('page') ||\r\n nameLower.includes('limit') ||\r\n nameLower.includes('offset') ||\r\n nameLower.includes('index') ||\r\n nameLower.includes('number') ||\r\n nameLower.includes('size') ||\r\n nameLower.includes('year') ||\r\n nameLower.includes('month') ||\r\n nameLower.includes('day')\r\n ) {\r\n return 'number';\r\n }\r\n\r\n // Boolean patterns\r\n if (\r\n nameLower.includes('active') ||\r\n nameLower.includes('enabled') ||\r\n nameLower.includes('flag')\r\n ) {\r\n return 'boolean';\r\n }\r\n\r\n return 'string';\r\n }\r\n\r\n /**\r\n * Extract middleware names from a line\r\n */\r\n private extractMiddleware(content: string): string[] {\r\n const middleware: string[] = [];\r\n\r\n for (const pattern of MIDDLEWARE_PATTERNS) {\r\n pattern.lastIndex = 0;\r\n let match;\r\n while ((match = pattern.exec(content)) !== null) {\r\n const name = match[1];\r\n if (name && !middleware.includes(name)) {\r\n middleware.push(name);\r\n }\r\n }\r\n }\r\n\r\n return middleware;\r\n }\r\n\r\n /**\r\n * Find line number for a position in content\r\n */\r\n private findLineNumber(content: string, position: number): number {\r\n let lineNumber = 1;\r\n let charCount = 0;\r\n \r\n for (const line of content.split('\\n')) {\r\n charCount += line.length + 1;\r\n if (charCount > position) break;\r\n lineNumber++;\r\n }\r\n \r\n return lineNumber;\r\n }\r\n\r\n /**\r\n * Scan for Express routes\r\n */\r\n private async scanExpress(): Promise<RouteDefinition[]> {\r\n const routes: RouteDefinition[] = [];\r\n const files = await this.getFiles(['**/*.ts', '**/*.js']);\r\n\r\n // Patterns to match Express routes\r\n const routePatterns = [\r\n // app.METHOD or router.METHOD\r\n /(?:app|router)\\.(get|post|put|patch|delete|options|head|all)\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/gi,\r\n // Route with array of paths\r\n /(?:app|router)\\.(get|post|put|patch|delete|options|head)\\s*\\(\\s*\\[\\s*['\"`]([^'\"`]+)['\"`]/gi,\r\n ];\r\n\r\n await parallelLimit(files, this.config.parallelLimit, async (filePath) => {\r\n const content = await this.readFile(filePath);\r\n if (!content) return;\r\n\r\n // Check if file uses express\r\n if (!content.includes('express') && !content.includes('Router') && !content.includes('router.')) {\r\n return;\r\n }\r\n\r\n const relativePath = path.relative(this.projectRoot, filePath);\r\n\r\n for (const pattern of routePatterns) {\r\n pattern.lastIndex = 0;\r\n let match;\r\n \r\n while ((match = pattern.exec(content)) !== null) {\r\n const method = (match[1] || 'get').toUpperCase() as HttpMethod;\r\n const routePath = match[2] || match[1];\r\n const lineNumber = this.findLineNumber(content, match.index);\r\n\r\n // Get surrounding context for middleware detection\r\n const lineStart = content.lastIndexOf('\\n', match.index) + 1;\r\n const lineEnd = content.indexOf('\\n', match.index);\r\n const lineContent = content.slice(lineStart, lineEnd === -1 ? undefined : lineEnd);\r\n\r\n // Extract handler name\r\n const afterMatch = content.slice(match.index + match[0].length, match.index + match[0].length + 200);\r\n const handlerMatch = afterMatch.match(/,\\s*(\\w+)|,\\s*(?:async\\s+)?(?:function\\s+)?(\\w+)/);\r\n const handler = handlerMatch ? (handlerMatch[1] || handlerMatch[2] || 'anonymous') : 'anonymous';\r\n\r\n // Check for auth middleware\r\n const hasAuth = AUTH_PATTERNS.test(lineContent);\r\n\r\n routes.push({\r\n path: routePath,\r\n method: method === 'ALL' ? 'GET' : method,\r\n handler,\r\n file: relativePath,\r\n line: lineNumber,\r\n parameters: this.extractParameters(routePath),\r\n middleware: this.extractMiddleware(lineContent),\r\n auth: hasAuth ? { required: true } : undefined,\r\n });\r\n }\r\n }\r\n });\r\n\r\n return routes;\r\n }\r\n\r\n /**\r\n * Scan for Fastify routes\r\n */\r\n private async scanFastify(): Promise<RouteDefinition[]> {\r\n const routes: RouteDefinition[] = [];\r\n const files = await this.getFiles(['**/*.ts', '**/*.js']);\r\n\r\n const routePatterns = [\r\n // fastify.METHOD('/path', ...)\r\n /(?:fastify|app|server)\\.(get|post|put|patch|delete|options|head)\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/gi,\r\n // .route({ method: 'GET', url: '/path' })\r\n /\\.route\\s*\\(\\s*\\{[^}]*method\\s*:\\s*['\"`](\\w+)['\"`][^}]*url\\s*:\\s*['\"`]([^'\"`]+)['\"`]/gi,\r\n // Reverse order in route config\r\n /\\.route\\s*\\(\\s*\\{[^}]*url\\s*:\\s*['\"`]([^'\"`]+)['\"`][^}]*method\\s*:\\s*['\"`](\\w+)['\"`]/gi,\r\n ];\r\n\r\n await parallelLimit(files, this.config.parallelLimit, async (filePath) => {\r\n const content = await this.readFile(filePath);\r\n if (!content) return;\r\n\r\n if (!content.includes('fastify') && !content.includes('Fastify')) {\r\n return;\r\n }\r\n\r\n const relativePath = path.relative(this.projectRoot, filePath);\r\n\r\n for (const pattern of routePatterns) {\r\n pattern.lastIndex = 0;\r\n let match;\r\n \r\n while ((match = pattern.exec(content)) !== null) {\r\n // Handle different match orders\r\n let method: string;\r\n let routePath: string;\r\n \r\n if (pattern.source.includes('url.*method')) {\r\n routePath = match[1];\r\n method = match[2];\r\n } else {\r\n method = match[1];\r\n routePath = match[2];\r\n }\r\n\r\n routes.push({\r\n path: routePath,\r\n method: method.toUpperCase() as HttpMethod,\r\n handler: 'handler',\r\n file: relativePath,\r\n line: this.findLineNumber(content, match.index),\r\n parameters: this.extractParameters(routePath),\r\n });\r\n }\r\n }\r\n });\r\n\r\n return routes;\r\n }\r\n\r\n /**\r\n * Scan for Next.js App Router routes\r\n */\r\n private async scanNextJs(): Promise<RouteDefinition[]> {\r\n const routes: RouteDefinition[] = [];\r\n \r\n // Look for route.ts/route.js files in app directory\r\n const routeFiles = await this.getFiles(['**/app/**/route.ts', '**/app/**/route.js', '**/pages/api/**/*.ts', '**/pages/api/**/*.js']);\r\n\r\n await parallelLimit(routeFiles, this.config.parallelLimit, async (filePath) => {\r\n const content = await this.readFile(filePath);\r\n if (!content) return;\r\n\r\n const relativePath = path.relative(this.projectRoot, filePath);\r\n const routePath = this.filePathToNextJsRoute(filePath);\r\n\r\n // Check for App Router route handlers\r\n if (filePath.includes('/app/')) {\r\n for (const method of HTTP_METHODS) {\r\n // Match: export async function GET, export function POST, export const GET\r\n const patterns = [\r\n new RegExp(`export\\\\s+(?:async\\\\s+)?function\\\\s+${method}\\\\b`, 'i'),\r\n new RegExp(`export\\\\s+const\\\\s+${method}\\\\s*=`, 'i'),\r\n ];\r\n\r\n for (const pattern of patterns) {\r\n const match = content.match(pattern);\r\n if (match) {\r\n routes.push({\r\n path: routePath,\r\n method,\r\n handler: method,\r\n file: relativePath,\r\n line: this.findLineNumber(content, match.index || 0),\r\n parameters: this.extractParameters(routePath),\r\n });\r\n break;\r\n }\r\n }\r\n }\r\n } else {\r\n // Pages API routes - default export handles all methods\r\n const hasExport = /export\\s+default\\s+(?:async\\s+)?function|module\\.exports\\s*=/.test(content);\r\n if (hasExport) {\r\n // Try to detect which methods are handled\r\n const handledMethods: HttpMethod[] = [];\r\n \r\n for (const method of HTTP_METHODS) {\r\n if (new RegExp(`req\\\\.method\\\\s*===?\\\\s*['\"\\`]${method}['\"\\`]`, 'i').test(content)) {\r\n handledMethods.push(method);\r\n }\r\n }\r\n\r\n // If no specific methods detected, assume GET\r\n if (handledMethods.length === 0) {\r\n handledMethods.push('GET');\r\n }\r\n\r\n for (const method of handledMethods) {\r\n routes.push({\r\n path: routePath,\r\n method,\r\n handler: 'default',\r\n file: relativePath,\r\n line: 1,\r\n parameters: this.extractParameters(routePath),\r\n });\r\n }\r\n }\r\n }\r\n });\r\n\r\n return routes;\r\n }\r\n\r\n /**\r\n * Convert Next.js file path to route path\r\n */\r\n private filePathToNextJsRoute(filePath: string): string {\r\n // App Router: app/api/users/[id]/route.ts -> /api/users/[id]\r\n const appMatch = filePath.match(/[/\\\\]app[/\\\\](.+)[/\\\\]route\\.[tj]s$/i);\r\n if (appMatch) {\r\n let routePath = '/' + appMatch[1].replace(/\\\\/g, '/');\r\n routePath = routePath.replace(/\\[\\[\\.\\.\\.(\\w+)\\]\\]/g, '[...$1]');\r\n return routePath;\r\n }\r\n\r\n // Pages API: pages/api/users/[id].ts -> /api/users/[id]\r\n const pagesMatch = filePath.match(/[/\\\\]pages[/\\\\]api[/\\\\](.+)\\.[tj]s$/i);\r\n if (pagesMatch) {\r\n let routePath = '/api/' + pagesMatch[1].replace(/\\\\/g, '/');\r\n // Handle index files\r\n routePath = routePath.replace(/\\/index$/, '');\r\n return routePath || '/api';\r\n }\r\n\r\n return '/';\r\n }\r\n\r\n /**\r\n * Scan for Hono routes\r\n */\r\n private async scanHono(): Promise<RouteDefinition[]> {\r\n const routes: RouteDefinition[] = [];\r\n const files = await this.getFiles(['**/*.ts', '**/*.js']);\r\n\r\n const routePatterns = [\r\n /(?:app|hono)\\.(get|post|put|patch|delete|options|head|all)\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/gi,\r\n ];\r\n\r\n await parallelLimit(files, this.config.parallelLimit, async (filePath) => {\r\n const content = await this.readFile(filePath);\r\n if (!content) return;\r\n\r\n if (!content.includes('Hono') && !content.includes('hono')) {\r\n return;\r\n }\r\n\r\n const relativePath = path.relative(this.projectRoot, filePath);\r\n\r\n for (const pattern of routePatterns) {\r\n pattern.lastIndex = 0;\r\n let match;\r\n \r\n while ((match = pattern.exec(content)) !== null) {\r\n const method = match[1].toUpperCase() as HttpMethod;\r\n const routePath = match[2];\r\n\r\n routes.push({\r\n path: routePath,\r\n method: method === 'ALL' ? 'GET' : method,\r\n handler: 'handler',\r\n file: relativePath,\r\n line: this.findLineNumber(content, match.index),\r\n parameters: this.extractParameters(routePath),\r\n });\r\n }\r\n }\r\n });\r\n\r\n return routes;\r\n }\r\n\r\n /**\r\n * Scan for Koa routes\r\n */\r\n private async scanKoa(): Promise<RouteDefinition[]> {\r\n const routes: RouteDefinition[] = [];\r\n const files = await this.getFiles(['**/*.ts', '**/*.js']);\r\n\r\n const routePatterns = [\r\n // koa-router style\r\n /router\\.(get|post|put|patch|delete|options|head|all)\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/gi,\r\n ];\r\n\r\n await parallelLimit(files, this.config.parallelLimit, async (filePath) => {\r\n const content = await this.readFile(filePath);\r\n if (!content) return;\r\n\r\n if (!content.includes('koa-router') && !content.includes('@koa/router')) {\r\n return;\r\n }\r\n\r\n const relativePath = path.relative(this.projectRoot, filePath);\r\n\r\n for (const pattern of routePatterns) {\r\n pattern.lastIndex = 0;\r\n let match;\r\n \r\n while ((match = pattern.exec(content)) !== null) {\r\n const method = match[1].toUpperCase() as HttpMethod;\r\n const routePath = match[2];\r\n\r\n routes.push({\r\n path: routePath,\r\n method: method === 'ALL' ? 'GET' : method,\r\n handler: 'handler',\r\n file: relativePath,\r\n line: this.findLineNumber(content, match.index),\r\n parameters: this.extractParameters(routePath),\r\n });\r\n }\r\n }\r\n });\r\n\r\n return routes;\r\n }\r\n\r\n /**\r\n * Scan for NestJS routes\r\n */\r\n private async scanNestJs(): Promise<RouteDefinition[]> {\r\n const routes: RouteDefinition[] = [];\r\n const files = await this.getFiles(['**/*.controller.ts', '**/*.controller.js']);\r\n\r\n await parallelLimit(files, this.config.parallelLimit, async (filePath) => {\r\n const content = await this.readFile(filePath);\r\n if (!content) return;\r\n\r\n const relativePath = path.relative(this.projectRoot, filePath);\r\n\r\n // Extract controller path\r\n const controllerMatch = content.match(/@Controller\\s*\\(\\s*['\"`]([^'\"`]*)['\"`]\\s*\\)/);\r\n const basePath = controllerMatch ? `/${controllerMatch[1]}` : '';\r\n\r\n // Find method decorators\r\n const methodPatterns = [\r\n /@(Get|Post|Put|Patch|Delete|Options|Head)\\s*\\(\\s*['\"`]?([^'\"`)\\s]*)['\"`]?\\s*\\)/gi,\r\n ];\r\n\r\n for (const pattern of methodPatterns) {\r\n pattern.lastIndex = 0;\r\n let match;\r\n \r\n while ((match = pattern.exec(content)) !== null) {\r\n const method = match[1].toUpperCase() as HttpMethod;\r\n const methodPath = match[2] || '';\r\n const fullPath = `${basePath}/${methodPath}`.replace(/\\/+/g, '/') || '/';\r\n\r\n // Find the method name (next line typically has the method definition)\r\n const afterDecorator = content.slice(match.index + match[0].length, match.index + match[0].length + 200);\r\n const methodNameMatch = afterDecorator.match(/(?:async\\s+)?(\\w+)\\s*\\(/);\r\n const handler = methodNameMatch?.[1] ?? 'handler';\r\n\r\n routes.push({\r\n path: fullPath,\r\n method,\r\n handler,\r\n file: relativePath,\r\n line: this.findLineNumber(content, match.index),\r\n parameters: this.extractParameters(fullPath),\r\n });\r\n }\r\n }\r\n });\r\n\r\n return routes;\r\n }\r\n\r\n private deduplicateRoutes(routes: RouteDefinition[]): RouteDefinition[] {\r\n const seen = new Map<string, RouteDefinition>();\r\n \r\n for (const route of routes) {\r\n const key = `${route.method}:${route.path}`;\r\n \r\n // Keep the first occurrence (usually more detailed)\r\n if (!seen.has(key)) {\r\n seen.set(key, route);\r\n }\r\n }\r\n \r\n return Array.from(seen.values());\r\n }\r\n}\r\n","/**\r\n * Environment Scanner\r\n * \r\n * Scans codebase to extract environment variable usage\r\n * and validate against .env files.\r\n */\r\n\r\nimport { glob } from 'glob';\r\nimport * as fs from 'fs/promises';\r\nimport * as path from 'path';\r\nimport type { EnvVariable } from '../schemas/env.schema.js';\r\n\r\nexport interface EnvScannerConfig {\r\n envFiles: string[];\r\n codePatterns: string[];\r\n excludePatterns: string[];\r\n}\r\n\r\nconst DEFAULT_CONFIG: EnvScannerConfig = {\r\n envFiles: ['.env', '.env.local', '.env.development', '.env.production', '.env.example'],\r\n codePatterns: ['**/*.ts', '**/*.js', '**/*.tsx', '**/*.jsx'],\r\n excludePatterns: ['node_modules/**', 'dist/**', 'build/**'],\r\n};\r\n\r\nexport class EnvScanner {\r\n private projectRoot: string;\r\n private config: EnvScannerConfig;\r\n\r\n constructor(projectRoot: string, config: Partial<EnvScannerConfig> = {}) {\r\n this.projectRoot = projectRoot;\r\n this.config = { ...DEFAULT_CONFIG, ...config };\r\n }\r\n\r\n /**\r\n * Scan project for environment variable definitions and usage\r\n */\r\n async scan(): Promise<EnvVariable[]> {\r\n const definedVars = await this.scanEnvFiles();\r\n const usedVars = await this.scanCodeUsage();\r\n\r\n return this.mergeVariables(definedVars, usedVars);\r\n }\r\n\r\n /**\r\n * Parse .env files to extract variable definitions\r\n */\r\n private async scanEnvFiles(): Promise<Map<string, Partial<EnvVariable>>> {\r\n const variables = new Map<string, Partial<EnvVariable>>();\r\n\r\n for (const envFile of this.config.envFiles) {\r\n const filePath = path.join(this.projectRoot, envFile);\r\n try {\r\n const content = await fs.readFile(filePath, 'utf-8');\r\n const parsed = this.parseEnvFile(content, envFile);\r\n \r\n for (const [name, info] of parsed) {\r\n // Merge with existing, preferring non-example files\r\n const existing = variables.get(name);\r\n if (!existing || !envFile.includes('example')) {\r\n variables.set(name, { ...existing, ...info });\r\n }\r\n }\r\n } catch {\r\n // File doesn't exist, skip\r\n }\r\n }\r\n\r\n return variables;\r\n }\r\n\r\n /**\r\n * Parse a single .env file content\r\n */\r\n private parseEnvFile(content: string, fileName: string): Map<string, Partial<EnvVariable>> {\r\n const variables = new Map<string, Partial<EnvVariable>>();\r\n const lines = content.split('\\n');\r\n let currentComment = '';\r\n\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i].trim();\r\n\r\n // Handle comments (may be description for next variable)\r\n if (line.startsWith('#')) {\r\n currentComment = line.slice(1).trim();\r\n continue;\r\n }\r\n\r\n // Skip empty lines\r\n if (!line) {\r\n currentComment = '';\r\n continue;\r\n }\r\n\r\n // Parse KEY=value\r\n const match = line.match(/^([A-Z_][A-Z0-9_]*)\\s*=\\s*(.*)$/i);\r\n if (match) {\r\n const name = match[1];\r\n let value = match[2];\r\n\r\n // Remove quotes from value\r\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\r\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\r\n value = value.slice(1, -1);\r\n }\r\n\r\n // Determine if this is from an example file (making it required)\r\n const isExample = fileName.includes('example');\r\n\r\n variables.set(name, {\r\n name,\r\n type: this.inferType(name),\r\n required: isExample, // Variables in .env.example are typically required\r\n defaultValue: isExample ? undefined : value,\r\n description: currentComment || undefined,\r\n sensitive: this.isSensitive(name),\r\n });\r\n\r\n currentComment = '';\r\n }\r\n }\r\n\r\n return variables;\r\n }\r\n\r\n /**\r\n * Scan code files for environment variable usage\r\n */\r\n private async scanCodeUsage(): Promise<Map<string, { file: string; line: number }[]>> {\r\n const usage = new Map<string, { file: string; line: number }[]>();\r\n\r\n // Get all code files\r\n const files: string[] = [];\r\n for (const pattern of this.config.codePatterns) {\r\n const matches = await glob(pattern, {\r\n cwd: this.projectRoot,\r\n ignore: this.config.excludePatterns,\r\n absolute: true,\r\n });\r\n files.push(...matches);\r\n }\r\n\r\n // Patterns to match env variable access\r\n const envPatterns = [\r\n // process.env.VAR_NAME or process.env['VAR_NAME']\r\n /process\\.env\\.([A-Z_][A-Z0-9_]*)/gi,\r\n /process\\.env\\[['\"]([A-Z_][A-Z0-9_]*)['\"]\\]/gi,\r\n // import.meta.env.VAR_NAME (Vite)\r\n /import\\.meta\\.env\\.([A-Z_][A-Z0-9_]*)/gi,\r\n // Deno.env.get('VAR_NAME')\r\n /Deno\\.env\\.get\\(['\"]([A-Z_][A-Z0-9_]*)['\"]\\)/gi,\r\n // env('VAR_NAME') or getenv('VAR_NAME')\r\n /(?:env|getenv)\\(['\"]([A-Z_][A-Z0-9_]*)['\"]\\)/gi,\r\n ];\r\n\r\n for (const filePath of files) {\r\n try {\r\n const content = await fs.readFile(filePath, 'utf-8');\r\n const lines = content.split('\\n');\r\n const relativePath = path.relative(this.projectRoot, filePath);\r\n\r\n for (const pattern of envPatterns) {\r\n pattern.lastIndex = 0;\r\n let match;\r\n while ((match = pattern.exec(content)) !== null) {\r\n const varName = match[1];\r\n \r\n // Find line number\r\n const position = match.index;\r\n let lineNumber = 1;\r\n let charCount = 0;\r\n for (const line of lines) {\r\n charCount += line.length + 1;\r\n if (charCount > position) break;\r\n lineNumber++;\r\n }\r\n\r\n // Add to usage map\r\n const existingUsage = usage.get(varName) || [];\r\n existingUsage.push({ file: relativePath, line: lineNumber });\r\n usage.set(varName, existingUsage);\r\n }\r\n }\r\n } catch {\r\n // Skip files that can't be read\r\n }\r\n }\r\n\r\n return usage;\r\n }\r\n\r\n /**\r\n * Merge defined and used variables\r\n */\r\n private mergeVariables(\r\n defined: Map<string, Partial<EnvVariable>>,\r\n used: Map<string, { file: string; line: number }[]>\r\n ): EnvVariable[] {\r\n const merged: EnvVariable[] = [];\r\n\r\n // Combine defined and used variables\r\n const allNames = new Set([...defined.keys(), ...used.keys()]);\r\n\r\n for (const name of allNames) {\r\n const def = defined.get(name) ?? {};\r\n const usedIn = used.get(name) ?? [];\r\n\r\n merged.push({\r\n name,\r\n type: def.type ?? this.inferType(name),\r\n required: def.required ?? usedIn.length > 0,\r\n defaultValue: def.defaultValue,\r\n description: def.description,\r\n usedIn,\r\n sensitive: this.isSensitive(name),\r\n });\r\n }\r\n\r\n // Sort by name for consistent output\r\n return merged.sort((a, b) => a.name.localeCompare(b.name));\r\n }\r\n\r\n /**\r\n * Infer the type of an environment variable from its name\r\n */\r\n private inferType(name: string): 'string' | 'number' | 'boolean' | 'url' | 'secret' {\r\n const nameLower = name.toLowerCase();\r\n \r\n if (nameLower.includes('url') || nameLower.includes('uri') || nameLower.includes('endpoint')) {\r\n return 'url';\r\n }\r\n if (nameLower.includes('port') || nameLower.includes('count') || nameLower.includes('size') || \r\n nameLower.includes('limit') || nameLower.includes('timeout') || nameLower.includes('max') ||\r\n nameLower.includes('min')) {\r\n return 'number';\r\n }\r\n if (nameLower.includes('enabled') || nameLower.includes('debug') || nameLower.includes('is_') ||\r\n nameLower.includes('has_') || nameLower.includes('use_') || nameLower.includes('allow')) {\r\n return 'boolean';\r\n }\r\n if (this.isSensitive(name)) {\r\n return 'secret';\r\n }\r\n \r\n return 'string';\r\n }\r\n\r\n /**\r\n * Check if a variable name indicates sensitive data\r\n */\r\n private isSensitive(name: string): boolean {\r\n const sensitivePatterns = [\r\n 'secret', 'password', 'passwd', 'pwd',\r\n 'token', 'key', 'api_key', 'apikey', 'api-key',\r\n 'private', 'credential', 'auth',\r\n 'access_token', 'refresh_token',\r\n 'client_secret', 'signing_key',\r\n 'encryption', 'decrypt', 'cert',\r\n ];\r\n const nameLower = name.toLowerCase();\r\n return sensitivePatterns.some((p) => nameLower.includes(p));\r\n }\r\n}\r\n","/**\r\n * Auth Scanner\r\n * \r\n * Scans codebase to extract authentication and authorization patterns.\r\n */\r\n\r\nimport { glob } from 'glob';\r\nimport * as fs from 'fs/promises';\r\nimport * as path from 'path';\r\nimport type { AuthConfig, Role, ProtectedResource } from '../schemas/auth.schema.js';\r\n\r\nexport interface AuthScannerConfig {\r\n patterns: string[];\r\n excludePatterns: string[];\r\n knownMiddleware: string[];\r\n}\r\n\r\nconst DEFAULT_CONFIG: AuthScannerConfig = {\r\n patterns: ['**/*.ts', '**/*.js'],\r\n excludePatterns: ['node_modules/**', 'dist/**', 'build/**'],\r\n knownMiddleware: [\r\n 'authenticate', 'requireAuth', 'isAuthenticated',\r\n 'authorize', 'requireRole', 'checkPermission',\r\n 'authMiddleware', 'auth', 'protect', 'guard',\r\n 'verifyToken', 'verifyJWT', 'ensureAuthenticated',\r\n ],\r\n};\r\n\r\nexport class AuthScanner {\r\n private projectRoot: string;\r\n private config: AuthScannerConfig;\r\n\r\n constructor(projectRoot: string, config: Partial<AuthScannerConfig> = {}) {\r\n this.projectRoot = projectRoot;\r\n this.config = { ...DEFAULT_CONFIG, ...config };\r\n }\r\n\r\n /**\r\n * Get files matching patterns\r\n */\r\n private async getFiles(): Promise<string[]> {\r\n const files: string[] = [];\r\n for (const pattern of this.config.patterns) {\r\n const matches = await glob(pattern, {\r\n cwd: this.projectRoot,\r\n ignore: this.config.excludePatterns,\r\n absolute: true,\r\n });\r\n files.push(...matches);\r\n }\r\n return [...new Set(files)];\r\n }\r\n\r\n /**\r\n * Scan project for auth configuration\r\n */\r\n async scan(): Promise<Partial<AuthConfig>> {\r\n const roles = await this.scanRoles();\r\n const protectedResources = await this.scanProtectedResources();\r\n const providers = await this.scanAuthProviders();\r\n\r\n return {\r\n roles,\r\n protectedResources,\r\n providers,\r\n publicPaths: this.inferPublicPaths(protectedResources),\r\n };\r\n }\r\n\r\n /**\r\n * Scan for role definitions\r\n */\r\n private async scanRoles(): Promise<Role[]> {\r\n const roles: Role[] = [];\r\n const files = await this.getFiles();\r\n\r\n // Patterns to find role definitions\r\n const rolePatterns = [\r\n // const ROLES = { admin: {...}, user: {...} }\r\n /(?:const|let|var)\\s+(?:ROLES|Roles|roles|USER_ROLES)\\s*=\\s*\\{([^}]+)\\}/gi,\r\n // enum Role { Admin = 'admin', User = 'user' }\r\n /enum\\s+(?:Role|Roles|UserRole)\\s*\\{([^}]+)\\}/gi,\r\n // type Role = 'admin' | 'user'\r\n /type\\s+Role\\s*=\\s*([^;]+);/gi,\r\n // const roles = ['admin', 'user'] as const\r\n /(?:const|let|var)\\s+roles\\s*=\\s*\\[([^\\]]+)\\]/gi,\r\n ];\r\n\r\n // Patterns to find permissions\r\n const permissionPatterns = [\r\n // permissions: ['read', 'write']\r\n /permissions\\s*:\\s*\\[([^\\]]+)\\]/gi,\r\n // PERMISSIONS = { ... }\r\n /(?:const|let|var)\\s+PERMISSIONS\\s*=\\s*\\{([^}]+)\\}/gi,\r\n ];\r\n\r\n for (const filePath of files) {\r\n try {\r\n const content = await fs.readFile(filePath, 'utf-8');\r\n\r\n // Extract role names\r\n for (const pattern of rolePatterns) {\r\n pattern.lastIndex = 0;\r\n let match;\r\n while ((match = pattern.exec(content)) !== null) {\r\n const roleContent = match[1];\r\n const roleNames = this.extractIdentifiers(roleContent);\r\n \r\n for (const roleName of roleNames) {\r\n // Check if role already exists\r\n if (!roles.find(r => r.name.toLowerCase() === roleName.toLowerCase())) {\r\n // Try to find associated permissions\r\n const permissions = this.findPermissionsForRole(content, roleName);\r\n \r\n roles.push({\r\n name: roleName,\r\n permissions,\r\n description: this.inferRoleDescription(roleName),\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Also look for role definitions in comments or JSDoc\r\n const docRoleMatch = content.match(/@role\\s+(\\w+)/gi);\r\n if (docRoleMatch) {\r\n for (const match of docRoleMatch) {\r\n const roleName = match.replace(/@role\\s+/i, '');\r\n if (!roles.find(r => r.name.toLowerCase() === roleName.toLowerCase())) {\r\n roles.push({\r\n name: roleName,\r\n permissions: [],\r\n });\r\n }\r\n }\r\n }\r\n } catch {\r\n // Skip files that can't be read\r\n }\r\n }\r\n\r\n // Add common default roles if none found\r\n if (roles.length === 0) {\r\n return [\r\n { name: 'admin', permissions: ['*'], description: 'Administrator with full access' },\r\n { name: 'user', permissions: ['read'], description: 'Standard user' },\r\n ];\r\n }\r\n\r\n return roles;\r\n }\r\n\r\n /**\r\n * Extract identifiers from a code snippet\r\n */\r\n private extractIdentifiers(content: string): string[] {\r\n const identifiers: string[] = [];\r\n \r\n // Match quoted strings\r\n const quotedMatch = content.match(/['\"](\\w+)['\"]/g);\r\n if (quotedMatch) {\r\n identifiers.push(...quotedMatch.map(m => m.replace(/['\"]/g, '')));\r\n }\r\n\r\n // Match object keys\r\n const keyMatch = content.match(/(\\w+)\\s*:/g);\r\n if (keyMatch) {\r\n identifiers.push(...keyMatch.map(m => m.replace(/\\s*:/g, '')));\r\n }\r\n\r\n // Match enum values\r\n const enumMatch = content.match(/(\\w+)\\s*=/g);\r\n if (enumMatch) {\r\n identifiers.push(...enumMatch.map(m => m.replace(/\\s*=/g, '')));\r\n }\r\n\r\n return [...new Set(identifiers)].filter(id => \r\n !['true', 'false', 'null', 'undefined', 'const', 'let', 'var'].includes(id.toLowerCase())\r\n );\r\n }\r\n\r\n /**\r\n * Find permissions associated with a role\r\n */\r\n private findPermissionsForRole(content: string, roleName: string): string[] {\r\n const permissions: string[] = [];\r\n \r\n // Look for role definition with permissions\r\n const roleDefPattern = new RegExp(\r\n `${roleName}\\\\s*:\\\\s*\\\\{[^}]*permissions\\\\s*:\\\\s*\\\\[([^\\\\]]+)\\\\]`,\r\n 'gi'\r\n );\r\n const match = roleDefPattern.exec(content);\r\n if (match) {\r\n const permContent = match[1];\r\n const perms = permContent.match(/['\"]([^'\"]+)['\"]/g);\r\n if (perms) {\r\n permissions.push(...perms.map(p => p.replace(/['\"]/g, '')));\r\n }\r\n }\r\n\r\n return permissions;\r\n }\r\n\r\n /**\r\n * Infer role description from name\r\n */\r\n private inferRoleDescription(roleName: string): string | undefined {\r\n const descriptions: Record<string, string> = {\r\n admin: 'Administrator with full system access',\r\n administrator: 'Administrator with full system access',\r\n user: 'Standard user with basic permissions',\r\n guest: 'Guest user with limited access',\r\n moderator: 'Moderator with content management permissions',\r\n editor: 'Editor with content creation and editing permissions',\r\n viewer: 'Read-only access',\r\n superadmin: 'Super administrator with unrestricted access',\r\n };\r\n return descriptions[roleName.toLowerCase()];\r\n }\r\n\r\n /**\r\n * Scan for protected resources (routes with auth middleware)\r\n */\r\n private async scanProtectedResources(): Promise<ProtectedResource[]> {\r\n const resources: ProtectedResource[] = [];\r\n const files = await this.getFiles();\r\n\r\n // Build regex pattern for known middleware\r\n const middlewarePattern = new RegExp(\r\n `(${this.config.knownMiddleware.join('|')})`,\r\n 'gi'\r\n );\r\n\r\n for (const filePath of files) {\r\n try {\r\n const content = await fs.readFile(filePath, 'utf-8');\r\n\r\n // Look for routes with auth middleware\r\n // Pattern: app.get('/path', authMiddleware, handler)\r\n const routePatterns = [\r\n /(?:app|router)\\.(get|post|put|patch|delete)\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]\\s*,\\s*([^,)]+)/gi,\r\n /\\.route\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]\\s*\\)[^;]*\\.(get|post|put|patch|delete)\\s*\\(\\s*([^)]+)\\)/gi,\r\n ];\r\n\r\n for (const pattern of routePatterns) {\r\n pattern.lastIndex = 0;\r\n let match;\r\n while ((match = pattern.exec(content)) !== null) {\r\n const method = match[1]?.toUpperCase() || match[2]?.toUpperCase();\r\n const routePath = match[2] || match[1];\r\n const middlewareSection = match[3];\r\n\r\n // Check if auth middleware is used\r\n if (middlewarePattern.test(middlewareSection)) {\r\n // Try to extract required roles\r\n const roles = this.extractRolesFromMiddleware(middlewareSection);\r\n \r\n resources.push({\r\n path: routePath,\r\n method,\r\n requiredRoles: roles,\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Look for @Authorized decorators (TypeScript decorators)\r\n const decoratorPattern = /@(?:Authorized|RequireAuth|Auth|Protected)\\s*\\(\\s*(?:\\[([^\\]]+)\\]|['\"]([^'\"]+)['\"])?\\s*\\)/gi;\r\n let decoratorMatch;\r\n while ((decoratorMatch = decoratorPattern.exec(content)) !== null) {\r\n const roles: string[] = [];\r\n if (decoratorMatch[1]) {\r\n const roleMatches = decoratorMatch[1].match(/['\"]([^'\"]+)['\"]/g);\r\n if (roleMatches) {\r\n roles.push(...roleMatches.map(r => r.replace(/['\"]/g, '')));\r\n }\r\n } else if (decoratorMatch[2]) {\r\n roles.push(decoratorMatch[2]);\r\n }\r\n\r\n // Find the associated route path (look ahead for route decorator)\r\n const afterDecorator = content.slice(decoratorMatch.index);\r\n const routeMatch = afterDecorator.match(/@(?:Get|Post|Put|Patch|Delete)\\s*\\(\\s*['\"]([^'\"]+)['\"]\\)/i);\r\n if (routeMatch) {\r\n const methodMatch = afterDecorator.match(/@(Get|Post|Put|Patch|Delete)/i);\r\n resources.push({\r\n path: routeMatch[1],\r\n method: methodMatch ? methodMatch[1].toUpperCase() : undefined,\r\n requiredRoles: roles,\r\n });\r\n }\r\n }\r\n\r\n // Look for Next.js middleware or route protection patterns\r\n const nextAuthPattern = /getServerSession|useSession|withAuth/gi;\r\n if (nextAuthPattern.test(content)) {\r\n // This file likely has auth protection\r\n const routeMatch = filePath.match(/app\\/(.+)\\/(?:route|page)\\.[tj]sx?$/);\r\n if (routeMatch) {\r\n const routePath = '/' + routeMatch[1].replace(/\\\\/g, '/');\r\n if (!resources.find(r => r.path === routePath)) {\r\n resources.push({\r\n path: routePath,\r\n requiredRoles: [],\r\n });\r\n }\r\n }\r\n }\r\n } catch {\r\n // Skip files that can't be read\r\n }\r\n }\r\n\r\n return resources;\r\n }\r\n\r\n /**\r\n * Extract role names from middleware call\r\n */\r\n private extractRolesFromMiddleware(middlewareSection: string): string[] {\r\n const roles: string[] = [];\r\n \r\n // Look for role specifications like requireRole('admin') or authorize(['admin', 'user'])\r\n const rolePatterns = [\r\n /requireRole\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/gi,\r\n /authorize\\s*\\(\\s*\\[([^\\]]+)\\]\\s*\\)/gi,\r\n /roles?\\s*:\\s*\\[([^\\]]+)\\]/gi,\r\n ];\r\n\r\n for (const pattern of rolePatterns) {\r\n let match;\r\n while ((match = pattern.exec(middlewareSection)) !== null) {\r\n const roleContent = match[1];\r\n const extracted = roleContent.match(/['\"]([^'\"]+)['\"]/g);\r\n if (extracted) {\r\n roles.push(...extracted.map(r => r.replace(/['\"]/g, '')));\r\n } else if (!roleContent.includes(',')) {\r\n roles.push(roleContent.trim());\r\n }\r\n }\r\n }\r\n\r\n return [...new Set(roles)];\r\n }\r\n\r\n /**\r\n * Scan for authentication providers\r\n * Returns providers with types matching schema: 'jwt' | 'session' | 'oauth' | 'api-key' | 'custom'\r\n */\r\n private async scanAuthProviders(): Promise<{ type: 'jwt' | 'session' | 'oauth' | 'api-key' | 'custom'; config: Record<string, unknown> }[]> {\r\n const providers: { type: 'jwt' | 'session' | 'oauth' | 'api-key' | 'custom'; config: Record<string, unknown> }[] = [];\r\n const files = await this.getFiles();\r\n\r\n for (const filePath of files) {\r\n try {\r\n const content = await fs.readFile(filePath, 'utf-8');\r\n\r\n // Detect JWT\r\n if (/jsonwebtoken|jwt\\.sign|jwt\\.verify|JwtModule/i.test(content)) {\r\n if (!providers.find(p => p.type === 'jwt')) {\r\n providers.push({\r\n type: 'jwt',\r\n config: {\r\n detected: true,\r\n file: path.relative(this.projectRoot, filePath),\r\n },\r\n });\r\n }\r\n }\r\n\r\n // Detect OAuth/OAuth2 (including passport, NextAuth, Clerk - they use OAuth under the hood)\r\n if (/oauth|passport|OAuth2Client|google-auth|facebook-auth|next-auth|NextAuth|clerk|@clerk/i.test(content)) {\r\n if (!providers.find(p => p.type === 'oauth')) {\r\n const oauthProviders: string[] = [];\r\n if (/google/i.test(content)) oauthProviders.push('google');\r\n if (/facebook/i.test(content)) oauthProviders.push('facebook');\r\n if (/github/i.test(content)) oauthProviders.push('github');\r\n if (/twitter/i.test(content)) oauthProviders.push('twitter');\r\n if (/next-auth|NextAuth/i.test(content)) oauthProviders.push('nextauth');\r\n if (/clerk|@clerk/i.test(content)) oauthProviders.push('clerk');\r\n \r\n providers.push({\r\n type: 'oauth',\r\n config: {\r\n providers: oauthProviders,\r\n file: path.relative(this.projectRoot, filePath),\r\n },\r\n });\r\n }\r\n }\r\n\r\n // Detect Session-based auth\r\n if (/express-session|cookie-session|session\\s*\\(/i.test(content)) {\r\n if (!providers.find(p => p.type === 'session')) {\r\n providers.push({\r\n type: 'session',\r\n config: {\r\n detected: true,\r\n file: path.relative(this.projectRoot, filePath),\r\n },\r\n });\r\n }\r\n }\r\n\r\n // Detect API Key auth\r\n if (/api[_-]?key|x-api-key|apiKey/i.test(content) && /middleware|auth/i.test(filePath)) {\r\n if (!providers.find(p => p.type === 'api-key')) {\r\n providers.push({\r\n type: 'api-key',\r\n config: {\r\n detected: true,\r\n file: path.relative(this.projectRoot, filePath),\r\n },\r\n });\r\n }\r\n }\r\n\r\n // Detect custom auth implementations\r\n if (/custom[_-]?auth|authenticate|verifyCredentials/i.test(content) && /middleware|auth/i.test(filePath)) {\r\n if (!providers.find(p => p.type === 'custom')) {\r\n providers.push({\r\n type: 'custom',\r\n config: {\r\n detected: true,\r\n file: path.relative(this.projectRoot, filePath),\r\n },\r\n });\r\n }\r\n }\r\n } catch {\r\n // Skip files that can't be read\r\n }\r\n }\r\n\r\n return providers;\r\n }\r\n\r\n /**\r\n * Infer public paths based on common patterns\r\n */\r\n private inferPublicPaths(protectedResources: ProtectedResource[]): string[] {\r\n const publicPaths: string[] = [\r\n '/api/health',\r\n '/api/status',\r\n '/api/ping',\r\n '/health',\r\n '/healthz',\r\n '/ready',\r\n '/api/public',\r\n '/login',\r\n '/register',\r\n '/signup',\r\n '/api/auth/login',\r\n '/api/auth/register',\r\n '/api/auth/callback',\r\n ];\r\n\r\n // Add any paths that are explicitly public (no auth middleware)\r\n // This would require more sophisticated analysis\r\n \r\n return publicPaths;\r\n }\r\n}\r\n","/**\r\n * Contract Scanner\r\n * \r\n * Scans codebase to extract API contracts from various sources\r\n * (OpenAPI specs, Zod schemas, TypeScript types).\r\n */\r\n\r\nimport { glob } from 'glob';\r\nimport * as fs from 'fs/promises';\r\nimport * as path from 'path';\r\nimport type { ApiContract } from '../schemas/contracts.schema.js';\r\n\r\nexport interface ContractScannerConfig {\r\n sources: ('openapi' | 'zod' | 'typescript' | 'jsdoc')[];\r\n patterns: string[];\r\n excludePatterns: string[];\r\n}\r\n\r\nconst DEFAULT_CONFIG: ContractScannerConfig = {\r\n sources: ['zod', 'typescript', 'openapi'],\r\n patterns: ['**/*.ts', '**/*.yaml', '**/*.json', '**/*.yml'],\r\n excludePatterns: ['node_modules/**', 'dist/**', 'build/**'],\r\n};\r\n\r\nexport class ContractScanner {\r\n private projectRoot: string;\r\n private config: ContractScannerConfig;\r\n\r\n constructor(projectRoot: string, config: Partial<ContractScannerConfig> = {}) {\r\n this.projectRoot = projectRoot;\r\n this.config = { ...DEFAULT_CONFIG, ...config };\r\n }\r\n\r\n /**\r\n * Get files matching a specific pattern\r\n */\r\n private async getFiles(patterns: string[]): Promise<string[]> {\r\n const files: string[] = [];\r\n for (const pattern of patterns) {\r\n const matches = await glob(pattern, {\r\n cwd: this.projectRoot,\r\n ignore: this.config.excludePatterns,\r\n absolute: true,\r\n });\r\n files.push(...matches);\r\n }\r\n return [...new Set(files)];\r\n }\r\n\r\n /**\r\n * Scan project for API contracts\r\n */\r\n async scan(): Promise<ApiContract[]> {\r\n const contracts: ApiContract[] = [];\r\n\r\n for (const source of this.config.sources) {\r\n switch (source) {\r\n case 'openapi':\r\n contracts.push(...await this.scanOpenApi());\r\n break;\r\n case 'zod':\r\n contracts.push(...await this.scanZodSchemas());\r\n break;\r\n case 'typescript':\r\n contracts.push(...await this.scanTypeScriptTypes());\r\n break;\r\n case 'jsdoc':\r\n contracts.push(...await this.scanJsDoc());\r\n break;\r\n }\r\n }\r\n\r\n return this.mergeContracts(contracts);\r\n }\r\n\r\n /**\r\n * Scan for OpenAPI/Swagger specifications\r\n */\r\n private async scanOpenApi(): Promise<ApiContract[]> {\r\n const contracts: ApiContract[] = [];\r\n const files = await this.getFiles([\r\n '**/openapi.yaml', '**/openapi.yml', '**/openapi.json',\r\n '**/swagger.yaml', '**/swagger.yml', '**/swagger.json',\r\n '**/api-spec.yaml', '**/api-spec.json',\r\n ]);\r\n\r\n for (const filePath of files) {\r\n try {\r\n const content = await fs.readFile(filePath, 'utf-8');\r\n let spec: Record<string, unknown>;\r\n\r\n // Parse YAML or JSON\r\n if (filePath.endsWith('.json')) {\r\n spec = JSON.parse(content);\r\n } else {\r\n // Simple YAML parsing for common patterns\r\n spec = this.parseSimpleYaml(content);\r\n }\r\n\r\n // Extract paths from OpenAPI spec\r\n const paths = (spec.paths || {}) as Record<string, Record<string, unknown>>;\r\n \r\n for (const [pathKey, pathValue] of Object.entries(paths)) {\r\n for (const [method, operation] of Object.entries(pathValue)) {\r\n if (['get', 'post', 'put', 'patch', 'delete', 'options', 'head'].includes(method)) {\r\n const op = operation as Record<string, unknown>;\r\n \r\n contracts.push({\r\n path: pathKey,\r\n method: method.toUpperCase(),\r\n operationId: op.operationId as string | undefined,\r\n summary: op.summary as string | undefined,\r\n description: op.description as string | undefined,\r\n tags: op.tags as string[] | undefined,\r\n request: this.extractOpenApiRequest(op),\r\n responses: this.extractOpenApiResponses(op),\r\n });\r\n }\r\n }\r\n }\r\n } catch {\r\n // Skip files that can't be parsed\r\n }\r\n }\r\n\r\n return contracts;\r\n }\r\n\r\n /**\r\n * Simple YAML parser for common patterns (basic implementation)\r\n */\r\n private parseSimpleYaml(content: string): Record<string, unknown> {\r\n const result: Record<string, unknown> = {};\r\n const lines = content.split('\\n');\r\n let currentPath: string[] = [];\r\n let currentIndent = 0;\r\n\r\n for (const line of lines) {\r\n if (line.trim().startsWith('#') || !line.trim()) continue;\r\n\r\n const indent = line.search(/\\S/);\r\n const trimmed = line.trim();\r\n \r\n // Handle key: value pairs\r\n const kvMatch = trimmed.match(/^(\\w+):\\s*(.*)$/);\r\n if (kvMatch) {\r\n const [, key, value] = kvMatch;\r\n \r\n // Adjust current path based on indentation\r\n while (currentPath.length > 0 && indent <= currentIndent) {\r\n currentPath.pop();\r\n currentIndent -= 2;\r\n }\r\n \r\n if (value) {\r\n // Simple value\r\n this.setNestedValue(result, [...currentPath, key], value.replace(/^['\"]|['\"]$/g, ''));\r\n } else {\r\n // Object/array starts\r\n currentPath.push(key);\r\n currentIndent = indent;\r\n this.setNestedValue(result, currentPath, {});\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Set a nested value in an object\r\n */\r\n private setNestedValue(obj: Record<string, unknown>, path: string[], value: unknown): void {\r\n let current: Record<string, unknown> = obj;\r\n for (let i = 0; i < path.length - 1; i++) {\r\n if (!current[path[i]]) {\r\n current[path[i]] = {};\r\n }\r\n current = current[path[i]] as Record<string, unknown>;\r\n }\r\n current[path[path.length - 1]] = value;\r\n }\r\n\r\n /**\r\n * Extract request info from OpenAPI operation\r\n */\r\n private extractOpenApiRequest(operation: Record<string, unknown>): ApiContract['request'] {\r\n const request: ApiContract['request'] = {};\r\n \r\n // Extract parameters\r\n const params = operation.parameters as Array<Record<string, unknown>> | undefined;\r\n if (params) {\r\n for (const param of params) {\r\n const location = param.in as string;\r\n const name = param.name as string;\r\n const schema = param.schema as Record<string, unknown> | undefined;\r\n \r\n if (location === 'path') {\r\n request.params = request.params || {};\r\n request.params[name] = {\r\n type: (schema?.type as string) || 'string',\r\n required: param.required as boolean || false,\r\n description: param.description as string | undefined,\r\n };\r\n } else if (location === 'query') {\r\n request.query = request.query || {};\r\n request.query[name] = {\r\n type: (schema?.type as string) || 'string',\r\n required: param.required as boolean || false,\r\n description: param.description as string | undefined,\r\n };\r\n } else if (location === 'header') {\r\n request.headers = request.headers || {};\r\n request.headers[name] = {\r\n type: 'string',\r\n required: param.required as boolean || false,\r\n description: param.description as string | undefined,\r\n };\r\n }\r\n }\r\n }\r\n\r\n // Extract request body\r\n const requestBody = operation.requestBody as Record<string, unknown> | undefined;\r\n if (requestBody) {\r\n const content = requestBody.content as Record<string, Record<string, unknown>> | undefined;\r\n const jsonContent = content?.['application/json'];\r\n if (jsonContent?.schema) {\r\n request.body = this.schemaToProperty(jsonContent.schema as Record<string, unknown>);\r\n }\r\n }\r\n\r\n return request;\r\n }\r\n\r\n /**\r\n * Extract responses from OpenAPI operation\r\n */\r\n private extractOpenApiResponses(operation: Record<string, unknown>): ApiContract['responses'] {\r\n const responses: ApiContract['responses'] = [];\r\n const opResponses = operation.responses as Record<string, Record<string, unknown>> | undefined;\r\n\r\n if (opResponses) {\r\n for (const [statusCode, response] of Object.entries(opResponses)) {\r\n const content = response.content as Record<string, Record<string, unknown>> | undefined;\r\n const jsonContent = content?.['application/json'];\r\n \r\n responses.push({\r\n statusCode: parseInt(statusCode, 10) || 200,\r\n description: response.description as string | undefined,\r\n body: jsonContent?.schema ? this.schemaToProperty(jsonContent.schema as Record<string, unknown>) : undefined,\r\n });\r\n }\r\n }\r\n\r\n return responses;\r\n }\r\n\r\n /**\r\n * Convert OpenAPI schema to our property format\r\n */\r\n private schemaToProperty(schema: Record<string, unknown>): unknown {\r\n const type = schema.type as string;\r\n return {\r\n type: type || 'object',\r\n required: schema.required as boolean | undefined,\r\n description: schema.description as string | undefined,\r\n properties: schema.properties,\r\n items: schema.items,\r\n enum: schema.enum,\r\n };\r\n }\r\n\r\n /**\r\n * Scan for Zod schema definitions\r\n */\r\n private async scanZodSchemas(): Promise<ApiContract[]> {\r\n const contracts: ApiContract[] = [];\r\n const files = await this.getFiles(['**/*.ts', '**/*.js']);\r\n\r\n // Patterns to find Zod schemas that look like API contracts\r\n const schemaPatterns = [\r\n // export const userSchema = z.object({...})\r\n /export\\s+const\\s+(\\w+(?:Schema|Request|Response|Body|Params|Query))\\s*=\\s*z\\.object\\s*\\(\\s*\\{([^}]+(?:\\{[^}]*\\}[^}]*)*)\\}\\s*\\)/gi,\r\n // const requestSchema = z.object({...})\r\n /const\\s+(\\w+(?:Request|Body|Params|Query)Schema)\\s*=\\s*z\\.object\\s*\\(\\s*\\{([^}]+(?:\\{[^}]*\\}[^}]*)*)\\}\\s*\\)/gi,\r\n ];\r\n\r\n // Pattern to find routes that use these schemas\r\n const routeSchemaPatterns = [\r\n // .input(schema) or .body(schema)\r\n /\\.(get|post|put|patch|delete)\\s*\\(\\s*['\"`]([^'\"`]+)['\"`][^)]*\\)\\.(?:input|body)\\s*\\(\\s*(\\w+)\\s*\\)/gi,\r\n // validate(schema) as middleware\r\n /\\.(get|post|put|patch|delete)\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]\\s*,\\s*validate\\s*\\(\\s*(\\w+)\\s*\\)/gi,\r\n ];\r\n\r\n for (const filePath of files) {\r\n try {\r\n const content = await fs.readFile(filePath, 'utf-8');\r\n const relativePath = path.relative(this.projectRoot, filePath);\r\n\r\n // Skip files without zod\r\n if (!content.includes('zod') && !content.includes('z.')) {\r\n continue;\r\n }\r\n\r\n // Extract schema definitions\r\n const schemas = new Map<string, string>();\r\n for (const pattern of schemaPatterns) {\r\n pattern.lastIndex = 0;\r\n let match;\r\n while ((match = pattern.exec(content)) !== null) {\r\n const schemaName = match[1];\r\n const schemaContent = match[2];\r\n schemas.set(schemaName, schemaContent);\r\n }\r\n }\r\n\r\n // If schemas found, try to link them to routes\r\n if (schemas.size > 0) {\r\n // Look for routes in the same file or related files\r\n for (const routePattern of routeSchemaPatterns) {\r\n routePattern.lastIndex = 0;\r\n let match;\r\n while ((match = routePattern.exec(content)) !== null) {\r\n const method = match[1].toUpperCase();\r\n const routePath = match[2];\r\n const schemaRef = match[3];\r\n\r\n const schemaContent = schemas.get(schemaRef);\r\n \r\n contracts.push({\r\n path: routePath,\r\n method,\r\n description: `Schema: ${schemaRef}`,\r\n request: schemaContent ? {\r\n body: this.parseZodSchemaContent(schemaContent),\r\n } : {},\r\n responses: [{\r\n statusCode: 200,\r\n description: 'Success',\r\n }],\r\n });\r\n }\r\n }\r\n\r\n // Also create contracts for standalone schemas (might be used elsewhere)\r\n for (const [schemaName, schemaContent] of schemas) {\r\n // Infer if it's a request or response schema\r\n const isRequest = /request|body|input|params|query/i.test(schemaName);\r\n const isResponse = /response|output|result/i.test(schemaName);\r\n \r\n // Try to infer the path from the schema name\r\n const pathMatch = schemaName.match(/(\\w+?)(?:Request|Response|Schema|Body)/i);\r\n const inferredPath = pathMatch ? `/api/${pathMatch[1].toLowerCase()}` : undefined;\r\n\r\n if (inferredPath && !contracts.find(c => c.path === inferredPath)) {\r\n contracts.push({\r\n path: inferredPath,\r\n method: isRequest ? 'POST' : 'GET',\r\n description: `Inferred from schema: ${schemaName}`,\r\n request: isRequest ? { body: this.parseZodSchemaContent(schemaContent) } : {},\r\n responses: isResponse ? [{\r\n statusCode: 200,\r\n body: this.parseZodSchemaContent(schemaContent),\r\n }] : [],\r\n });\r\n }\r\n }\r\n }\r\n } catch {\r\n // Skip files that can't be read\r\n }\r\n }\r\n\r\n return contracts;\r\n }\r\n\r\n /**\r\n * Parse Zod schema content into a simplified structure\r\n */\r\n private parseZodSchemaContent(content: string): unknown {\r\n const properties: Record<string, unknown> = {};\r\n \r\n // Match field definitions like: name: z.string(), age: z.number().optional()\r\n const fieldPattern = /(\\w+)\\s*:\\s*z\\.(\\w+)\\(\\)(?:\\.(\\w+)\\(\\))?/g;\r\n let match;\r\n while ((match = fieldPattern.exec(content)) !== null) {\r\n const [, fieldName, zodType, modifier] = match;\r\n properties[fieldName] = {\r\n type: this.zodTypeToJsonType(zodType),\r\n required: modifier !== 'optional' && modifier !== 'nullable',\r\n };\r\n }\r\n\r\n return {\r\n type: 'object',\r\n properties,\r\n };\r\n }\r\n\r\n /**\r\n * Convert Zod type to JSON schema type\r\n */\r\n private zodTypeToJsonType(zodType: string): string {\r\n const mapping: Record<string, string> = {\r\n string: 'string',\r\n number: 'number',\r\n boolean: 'boolean',\r\n array: 'array',\r\n object: 'object',\r\n date: 'string',\r\n bigint: 'number',\r\n null: 'null',\r\n undefined: 'null',\r\n any: 'object',\r\n unknown: 'object',\r\n };\r\n return mapping[zodType.toLowerCase()] || 'string';\r\n }\r\n\r\n /**\r\n * Scan for TypeScript interface/type definitions\r\n */\r\n private async scanTypeScriptTypes(): Promise<ApiContract[]> {\r\n const contracts: ApiContract[] = [];\r\n const files = await this.getFiles(['**/*.ts', '**/*.tsx']);\r\n\r\n // Patterns to find API-related type definitions\r\n const typePatterns = [\r\n // interface UserRequest { ... }\r\n /interface\\s+(\\w+(?:Request|Response|Params|Query|Body))\\s*\\{([^}]+)\\}/gi,\r\n // type UserRequest = { ... }\r\n /type\\s+(\\w+(?:Request|Response|Params|Query|Body))\\s*=\\s*\\{([^}]+)\\}/gi,\r\n ];\r\n\r\n for (const filePath of files) {\r\n try {\r\n const content = await fs.readFile(filePath, 'utf-8');\r\n const relativePath = path.relative(this.projectRoot, filePath);\r\n\r\n for (const pattern of typePatterns) {\r\n pattern.lastIndex = 0;\r\n let match;\r\n while ((match = pattern.exec(content)) !== null) {\r\n const typeName = match[1];\r\n const typeContent = match[2];\r\n\r\n // Parse the type content\r\n const properties = this.parseTypeScriptTypeContent(typeContent);\r\n \r\n // Infer path and method from type name\r\n const pathMatch = typeName.match(/(\\w+?)(?:Request|Response|Params|Query|Body)/i);\r\n const isRequest = /request|body|params|query/i.test(typeName);\r\n const inferredPath = pathMatch ? `/api/${pathMatch[1].toLowerCase()}` : undefined;\r\n\r\n if (inferredPath) {\r\n const existingContract = contracts.find(c => c.path === inferredPath);\r\n \r\n if (existingContract) {\r\n // Merge with existing\r\n if (isRequest) {\r\n existingContract.request = { ...existingContract.request, body: properties };\r\n } else {\r\n existingContract.responses = existingContract.responses || [];\r\n existingContract.responses.push({ statusCode: 200, body: properties });\r\n }\r\n } else {\r\n contracts.push({\r\n path: inferredPath,\r\n method: isRequest ? 'POST' : 'GET',\r\n description: `Inferred from type: ${typeName}`,\r\n request: isRequest ? { body: properties } : {},\r\n responses: isRequest ? [] : [{ statusCode: 200, body: properties }],\r\n });\r\n }\r\n }\r\n }\r\n }\r\n } catch {\r\n // Skip files that can't be read\r\n }\r\n }\r\n\r\n return contracts;\r\n }\r\n\r\n /**\r\n * Parse TypeScript type content into a simplified structure\r\n */\r\n private parseTypeScriptTypeContent(content: string): unknown {\r\n const properties: Record<string, unknown> = {};\r\n \r\n // Match field definitions like: name: string; age?: number;\r\n const fieldPattern = /(\\w+)(\\??)\\s*:\\s*([^;,\\n]+)/g;\r\n let match;\r\n while ((match = fieldPattern.exec(content)) !== null) {\r\n const [, fieldName, optional, fieldType] = match;\r\n properties[fieldName] = {\r\n type: this.tsTypeToJsonType(fieldType.trim()),\r\n required: optional !== '?',\r\n };\r\n }\r\n\r\n return {\r\n type: 'object',\r\n properties,\r\n };\r\n }\r\n\r\n /**\r\n * Convert TypeScript type to JSON schema type\r\n */\r\n private tsTypeToJsonType(tsType: string): string {\r\n const cleanType = tsType.toLowerCase().replace(/\\s/g, '');\r\n \r\n if (cleanType.includes('string')) return 'string';\r\n if (cleanType.includes('number')) return 'number';\r\n if (cleanType.includes('boolean')) return 'boolean';\r\n if (cleanType.includes('[]') || cleanType.includes('array')) return 'array';\r\n if (cleanType.includes('null')) return 'null';\r\n if (cleanType.includes('date')) return 'string';\r\n \r\n return 'object';\r\n }\r\n\r\n /**\r\n * Scan JSDoc comments for API documentation\r\n */\r\n private async scanJsDoc(): Promise<ApiContract[]> {\r\n const contracts: ApiContract[] = [];\r\n const files = await this.getFiles(['**/*.ts', '**/*.js']);\r\n\r\n // Pattern to find JSDoc blocks with API annotations\r\n const jsdocPattern = /\\/\\*\\*[\\s\\S]*?@(?:api|route|endpoint)[\\s\\S]*?\\*\\//g;\r\n\r\n for (const filePath of files) {\r\n try {\r\n const content = await fs.readFile(filePath, 'utf-8');\r\n\r\n let match;\r\n while ((match = jsdocPattern.exec(content)) !== null) {\r\n const docBlock = match[0];\r\n\r\n // Extract API info from JSDoc\r\n const methodMatch = docBlock.match(/@(?:method|httpMethod)\\s+(\\w+)/i);\r\n const pathMatch = docBlock.match(/@(?:route|path|endpoint|api)\\s+(\\S+)/i);\r\n const descMatch = docBlock.match(/@(?:description|desc|summary)\\s+(.+)/i);\r\n \r\n if (pathMatch) {\r\n const contract: ApiContract = {\r\n path: pathMatch[1],\r\n method: methodMatch?.[1]?.toUpperCase() || 'GET',\r\n description: descMatch?.[1],\r\n request: {},\r\n responses: [],\r\n };\r\n\r\n // Extract @param annotations\r\n const paramMatches = docBlock.matchAll(/@param\\s+\\{([^}]+)\\}\\s+(\\w+)(?:\\s+-\\s*(.+))?/gi);\r\n for (const paramMatch of paramMatches) {\r\n const [, type, name, desc] = paramMatch;\r\n contract.request.params = contract.request.params || {};\r\n contract.request.params[name] = {\r\n type: this.tsTypeToJsonType(type),\r\n description: desc,\r\n };\r\n }\r\n\r\n // Extract @returns annotation\r\n const returnsMatch = docBlock.match(/@returns?\\s+\\{([^}]+)\\}(?:\\s+(.+))?/i);\r\n if (returnsMatch) {\r\n contract.responses.push({\r\n statusCode: 200,\r\n description: returnsMatch[2],\r\n body: { type: this.tsTypeToJsonType(returnsMatch[1]) },\r\n });\r\n }\r\n\r\n contracts.push(contract);\r\n }\r\n }\r\n } catch {\r\n // Skip files that can't be read\r\n }\r\n }\r\n\r\n return contracts;\r\n }\r\n\r\n /**\r\n * Merge contracts from different sources\r\n */\r\n private mergeContracts(contracts: ApiContract[]): ApiContract[] {\r\n const merged = new Map<string, ApiContract>();\r\n\r\n for (const contract of contracts) {\r\n const key = `${contract.method}:${contract.path}`;\r\n const existing = merged.get(key);\r\n\r\n if (existing) {\r\n merged.set(key, this.mergeTwo(existing, contract));\r\n } else {\r\n merged.set(key, contract);\r\n }\r\n }\r\n\r\n return Array.from(merged.values());\r\n }\r\n\r\n /**\r\n * Merge two contracts\r\n */\r\n private mergeTwo(a: ApiContract, b: ApiContract): ApiContract {\r\n return {\r\n ...a,\r\n ...b,\r\n description: a.description || b.description,\r\n summary: a.summary || b.summary,\r\n tags: [...new Set([...(a.tags || []), ...(b.tags || [])])],\r\n request: {\r\n headers: { ...a.request.headers, ...b.request.headers },\r\n params: { ...a.request.params, ...b.request.params },\r\n query: { ...a.request.query, ...b.request.query },\r\n body: a.request.body || b.request.body,\r\n },\r\n responses: this.mergeResponses(a.responses, b.responses),\r\n };\r\n }\r\n\r\n /**\r\n * Merge response arrays, avoiding duplicates by status code\r\n */\r\n private mergeResponses(\r\n a: ApiContract['responses'],\r\n b: ApiContract['responses']\r\n ): ApiContract['responses'] {\r\n const byStatus = new Map<number, ApiContract['responses'][0]>();\r\n \r\n for (const resp of [...a, ...b]) {\r\n const existing = byStatus.get(resp.statusCode);\r\n if (existing) {\r\n byStatus.set(resp.statusCode, {\r\n ...existing,\r\n ...resp,\r\n description: existing.description || resp.description,\r\n });\r\n } else {\r\n byStatus.set(resp.statusCode, resp);\r\n }\r\n }\r\n\r\n return Array.from(byStatus.values());\r\n }\r\n}\r\n","/**\r\n * Truthpack Generator\r\n * \r\n * Orchestrates the generation of truthpack files by running\r\n * scanners and consolidating results into verified ground truth.\r\n */\r\n\r\nimport * as fs from 'fs/promises';\r\nimport * as path from 'path';\r\nimport * as crypto from 'crypto';\r\nimport { RouteScanner } from './scanners/route-scanner.js';\r\nimport { EnvScanner } from './scanners/env-scanner.js';\r\nimport { AuthScanner } from './scanners/auth-scanner.js';\r\nimport { ContractScanner } from './scanners/contract-scanner.js';\r\nimport { PerformanceTracker, getPerformanceTracker } from '../utils/performance.js';\r\nimport { IncrementalScanner } from './incremental-scanner.js';\r\nimport type { RouteDefinition } from './schemas/routes.schema.js';\r\nimport type { EnvVariable } from './schemas/env.schema.js';\r\nimport type { AuthConfig } from './schemas/auth.schema.js';\r\nimport type { ApiContract } from './schemas/contracts.schema.js';\r\n\r\nexport interface TruthpackConfig {\r\n projectRoot: string;\r\n outputDir: string;\r\n scanners: {\r\n routes: boolean;\r\n env: boolean;\r\n auth: boolean;\r\n contracts: boolean;\r\n uiGraph: boolean;\r\n };\r\n watchMode: boolean;\r\n watchDebounceMs: number;\r\n /** Enable incremental scanning (default: true) */\r\n incremental?: boolean;\r\n}\r\n\r\nexport interface TruthpackResult {\r\n version: string;\r\n routes: RouteDefinition[];\r\n env: EnvVariable[];\r\n auth: Partial<AuthConfig>;\r\n contracts: ApiContract[];\r\n uiGraph?: unknown;\r\n generatedAt: Date;\r\n hash: string;\r\n}\r\n\r\nexport interface TruthpackMeta {\r\n version: string;\r\n generatedAt: string;\r\n hash: string;\r\n scannerVersions: Record<string, string>;\r\n summary: {\r\n routes: number;\r\n envVars: number;\r\n authRules: number;\r\n contracts: number;\r\n };\r\n}\r\n\r\nexport interface ValidationResult {\r\n valid: boolean;\r\n stale: boolean;\r\n drifts: DriftItem[];\r\n missing: DriftItem[];\r\n extra: DriftItem[];\r\n}\r\n\r\nexport interface DriftItem {\r\n type: 'route' | 'env' | 'auth' | 'contract';\r\n identifier: string;\r\n expected?: unknown;\r\n actual?: unknown;\r\n message: string;\r\n}\r\n\r\nconst DEFAULT_CONFIG: TruthpackConfig = {\r\n projectRoot: process.cwd(),\r\n outputDir: '.vibecheck/truthpack',\r\n scanners: {\r\n routes: true,\r\n env: true,\r\n auth: true,\r\n contracts: true,\r\n uiGraph: false,\r\n },\r\n watchMode: false,\r\n watchDebounceMs: 1000,\r\n};\r\n\r\nconst VERSION = '1.0.0';\r\n\r\nexport interface GenerationTimings {\r\n routeScan?: number;\r\n envScan?: number;\r\n authScan?: number;\r\n contractScan?: number;\r\n hashComputation?: number;\r\n total?: number;\r\n}\r\n\r\nexport class TruthpackGenerator {\r\n private config: TruthpackConfig;\r\n private routeScanner: RouteScanner;\r\n private envScanner: EnvScanner;\r\n private authScanner: AuthScanner;\r\n private contractScanner: ContractScanner;\r\n private watchAbortController: AbortController | null = null;\r\n private cachedResult: TruthpackResult | null = null;\r\n private performanceTracker: PerformanceTracker;\r\n private lastTimings: GenerationTimings = {};\r\n private incrementalScanner: IncrementalScanner | null = null;\r\n\r\n constructor(config: Partial<TruthpackConfig> = {}) {\r\n this.config = { ...DEFAULT_CONFIG, incremental: true, ...config };\r\n this.routeScanner = new RouteScanner(this.config.projectRoot);\r\n this.envScanner = new EnvScanner(this.config.projectRoot);\r\n this.authScanner = new AuthScanner(this.config.projectRoot);\r\n this.contractScanner = new ContractScanner(this.config.projectRoot);\r\n this.performanceTracker = getPerformanceTracker();\r\n \r\n if (this.config.incremental) {\r\n this.incrementalScanner = new IncrementalScanner(this.config.projectRoot);\r\n }\r\n }\r\n\r\n /**\r\n * Get last generation timings\r\n */\r\n getLastTimings(): GenerationTimings {\r\n return { ...this.lastTimings };\r\n }\r\n\r\n /**\r\n * Get the output directory path\r\n */\r\n getOutputDir(): string {\r\n return path.isAbsolute(this.config.outputDir)\r\n ? this.config.outputDir\r\n : path.join(this.config.projectRoot, this.config.outputDir);\r\n }\r\n\r\n /**\r\n * Generate complete truthpack\r\n */\r\n async generate(): Promise<TruthpackResult> {\r\n const generateStart = Date.now();\r\n const timings: GenerationTimings = {};\r\n \r\n const result: TruthpackResult = {\r\n version: VERSION,\r\n routes: [],\r\n env: [],\r\n auth: {},\r\n contracts: [],\r\n generatedAt: new Date(),\r\n hash: '',\r\n };\r\n\r\n // Run scanners in parallel for performance, tracking timing\r\n const scanPromises: Promise<void>[] = [];\r\n\r\n if (this.config.scanners.routes) {\r\n scanPromises.push(\r\n this.performanceTracker.time('truthpack.scan.routes', async () => {\r\n const routes = await this.routeScanner.scan();\r\n result.routes = routes;\r\n }).then(timing => {\r\n timings.routeScan = timing.durationMs;\r\n })\r\n );\r\n }\r\n\r\n if (this.config.scanners.env) {\r\n scanPromises.push(\r\n this.performanceTracker.time('truthpack.scan.env', async () => {\r\n const env = await this.envScanner.scan();\r\n result.env = env;\r\n }).then(timing => {\r\n timings.envScan = timing.durationMs;\r\n })\r\n );\r\n }\r\n\r\n if (this.config.scanners.auth) {\r\n scanPromises.push(\r\n this.performanceTracker.time('truthpack.scan.auth', async () => {\r\n const auth = await this.authScanner.scan();\r\n result.auth = auth;\r\n }).then(timing => {\r\n timings.authScan = timing.durationMs;\r\n })\r\n );\r\n }\r\n\r\n if (this.config.scanners.contracts) {\r\n scanPromises.push(\r\n this.performanceTracker.time('truthpack.scan.contracts', async () => {\r\n const contracts = await this.contractScanner.scan();\r\n result.contracts = contracts;\r\n }).then(timing => {\r\n timings.contractScan = timing.durationMs;\r\n })\r\n );\r\n }\r\n\r\n await Promise.all(scanPromises);\r\n\r\n // Compute hash with timing\r\n const hashTiming = await this.performanceTracker.time('truthpack.hash', async () => {\r\n result.hash = this.computeHash(result);\r\n });\r\n timings.hashComputation = hashTiming.durationMs;\r\n \r\n timings.total = Date.now() - generateStart;\r\n this.lastTimings = timings;\r\n this.cachedResult = result;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Load existing truthpack from disk (for incremental updates)\r\n */\r\n async loadExisting(): Promise<TruthpackResult | null> {\r\n try {\r\n return await this.load();\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Generate and save to disk\r\n */\r\n async generateAndSave(): Promise<string> {\r\n // Try incremental update if enabled and existing truthpack exists\r\n if (this.config.incremental && this.incrementalScanner) {\r\n const existing = await this.loadExisting();\r\n if (existing) {\r\n // Check if we can do incremental update\r\n // For now, always do full scan, but cache individual file results\r\n // Future: implement true incremental merge\r\n }\r\n }\r\n \r\n const result = await this.generate();\r\n const outputDir = this.getOutputDir();\r\n\r\n // Ensure output directory exists\r\n await fs.mkdir(outputDir, { recursive: true });\r\n\r\n // Save individual truthpack files\r\n const savePromises: Promise<void>[] = [];\r\n\r\n // Routes\r\n if (this.config.scanners.routes) {\r\n savePromises.push(\r\n fs.writeFile(\r\n path.join(outputDir, 'routes.json'),\r\n JSON.stringify({\r\n version: VERSION,\r\n generatedAt: result.generatedAt.toISOString(),\r\n routes: result.routes,\r\n summary: {\r\n totalRoutes: result.routes.length,\r\n byMethod: this.countByMethod(result.routes),\r\n protectedRoutes: result.routes.filter(r => r.auth?.required).length,\r\n publicRoutes: result.routes.filter(r => !r.auth?.required).length,\r\n },\r\n }, null, 2)\r\n )\r\n );\r\n }\r\n\r\n // Environment variables\r\n if (this.config.scanners.env) {\r\n savePromises.push(\r\n fs.writeFile(\r\n path.join(outputDir, 'env.json'),\r\n JSON.stringify({\r\n version: VERSION,\r\n generatedAt: result.generatedAt.toISOString(),\r\n variables: result.env,\r\n summary: {\r\n totalVariables: result.env.length,\r\n required: result.env.filter(e => e.required).length,\r\n optional: result.env.filter(e => !e.required).length,\r\n sensitive: result.env.filter(e => e.sensitive).length,\r\n },\r\n }, null, 2)\r\n )\r\n );\r\n }\r\n\r\n // Auth configuration\r\n if (this.config.scanners.auth) {\r\n savePromises.push(\r\n fs.writeFile(\r\n path.join(outputDir, 'auth.json'),\r\n JSON.stringify({\r\n version: VERSION,\r\n generatedAt: result.generatedAt.toISOString(),\r\n ...result.auth,\r\n summary: {\r\n totalRoles: result.auth.roles?.length ?? 0,\r\n protectedEndpoints: result.auth.protectedResources?.length ?? 0,\r\n publicEndpoints: result.auth.publicPaths?.length ?? 0,\r\n providers: result.auth.providers?.length ?? 0,\r\n },\r\n }, null, 2)\r\n )\r\n );\r\n }\r\n\r\n // Contracts\r\n if (this.config.scanners.contracts) {\r\n savePromises.push(\r\n fs.writeFile(\r\n path.join(outputDir, 'contracts.json'),\r\n JSON.stringify({\r\n version: VERSION,\r\n generatedAt: result.generatedAt.toISOString(),\r\n contracts: result.contracts,\r\n summary: {\r\n totalContracts: result.contracts.length,\r\n byMethod: this.countContractsByMethod(result.contracts),\r\n },\r\n }, null, 2)\r\n )\r\n );\r\n }\r\n\r\n // Save meta file\r\n const meta: TruthpackMeta = {\r\n version: VERSION,\r\n generatedAt: result.generatedAt.toISOString(),\r\n hash: result.hash,\r\n scannerVersions: {\r\n routes: '1.0.0',\r\n env: '1.0.0',\r\n auth: '1.0.0',\r\n contracts: '1.0.0',\r\n },\r\n summary: {\r\n routes: result.routes.length,\r\n envVars: result.env.length,\r\n authRules: result.auth.protectedResources?.length ?? 0,\r\n contracts: result.contracts.length,\r\n },\r\n };\r\n\r\n savePromises.push(\r\n fs.writeFile(\r\n path.join(outputDir, 'meta.json'),\r\n JSON.stringify(meta, null, 2)\r\n )\r\n );\r\n\r\n await Promise.all(savePromises);\r\n\r\n return outputDir;\r\n }\r\n\r\n /**\r\n * Load existing truthpack from disk\r\n */\r\n async load(): Promise<TruthpackResult | null> {\r\n const outputDir = this.getOutputDir();\r\n\r\n try {\r\n const [routesData, envData, authData, contractsData, metaData] = await Promise.all([\r\n fs.readFile(path.join(outputDir, 'routes.json'), 'utf-8').catch(() => '{\"routes\":[]}'),\r\n fs.readFile(path.join(outputDir, 'env.json'), 'utf-8').catch(() => '{\"variables\":[]}'),\r\n fs.readFile(path.join(outputDir, 'auth.json'), 'utf-8').catch(() => '{}'),\r\n fs.readFile(path.join(outputDir, 'contracts.json'), 'utf-8').catch(() => '{\"contracts\":[]}'),\r\n fs.readFile(path.join(outputDir, 'meta.json'), 'utf-8').catch(() => '{}'),\r\n ]);\r\n\r\n const routes = JSON.parse(routesData);\r\n const env = JSON.parse(envData);\r\n const auth = JSON.parse(authData);\r\n const contracts = JSON.parse(contractsData);\r\n const meta = JSON.parse(metaData);\r\n\r\n return {\r\n version: meta.version || VERSION,\r\n routes: routes.routes || [],\r\n env: env.variables || [],\r\n auth,\r\n contracts: contracts.contracts || [],\r\n generatedAt: new Date(meta.generatedAt || Date.now()),\r\n hash: meta.hash || '',\r\n };\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Start watch mode for incremental updates\r\n */\r\n async watch(onChange: (result: TruthpackResult) => void): Promise<() => void> {\r\n this.watchAbortController = new AbortController();\r\n const { signal } = this.watchAbortController;\r\n\r\n // Patterns to watch\r\n const watchPatterns = [\r\n '**/*.ts', '**/*.js', '**/*.tsx', '**/*.jsx',\r\n '**/.env', '**/.env.*',\r\n '**/openapi.yaml', '**/openapi.json',\r\n ];\r\n\r\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\r\n let isGenerating = false;\r\n\r\n const triggerRegenerate = async () => {\r\n if (isGenerating || signal.aborted) return;\r\n\r\n isGenerating = true;\r\n try {\r\n const result = await this.generate();\r\n \r\n // Check if hash changed (actual content change)\r\n if (this.cachedResult && this.cachedResult.hash !== result.hash) {\r\n await this.generateAndSave();\r\n onChange(result);\r\n } else if (!this.cachedResult) {\r\n await this.generateAndSave();\r\n onChange(result);\r\n }\r\n } catch (error) {\r\n // Log error but don't crash watch mode\r\n console.error('Truthpack generation error:', error);\r\n } finally {\r\n isGenerating = false;\r\n }\r\n };\r\n\r\n const debouncedTrigger = () => {\r\n if (debounceTimer) clearTimeout(debounceTimer);\r\n debounceTimer = setTimeout(triggerRegenerate, this.config.watchDebounceMs);\r\n };\r\n\r\n // Initial generation\r\n await triggerRegenerate();\r\n\r\n // Set up file watching using fs.watch (native Node.js)\r\n const watchers: fs.FileHandle[] = [];\r\n \r\n // Watch the project root recursively\r\n const setupWatch = async () => {\r\n try {\r\n const watcher = fs.watch(this.config.projectRoot, { \r\n recursive: true,\r\n signal,\r\n });\r\n\r\n for await (const event of watcher) {\r\n if (signal.aborted) break;\r\n \r\n // Filter by relevant file types\r\n const filename = event.filename || '';\r\n const isRelevant = \r\n filename.endsWith('.ts') ||\r\n filename.endsWith('.js') ||\r\n filename.endsWith('.tsx') ||\r\n filename.endsWith('.jsx') ||\r\n filename.includes('.env') ||\r\n filename.includes('openapi') ||\r\n filename.includes('swagger');\r\n\r\n if (isRelevant && !filename.includes('node_modules') && !filename.includes('.vibecheck')) {\r\n debouncedTrigger();\r\n }\r\n }\r\n } catch (error) {\r\n if (!signal.aborted) {\r\n console.error('Watch error:', error);\r\n }\r\n }\r\n };\r\n\r\n // Start watching (don't await - runs in background)\r\n setupWatch();\r\n\r\n // Return stop function\r\n return () => {\r\n this.watchAbortController?.abort();\r\n if (debounceTimer) clearTimeout(debounceTimer);\r\n };\r\n }\r\n\r\n /**\r\n * Stop watching\r\n */\r\n stopWatch(): void {\r\n this.watchAbortController?.abort();\r\n this.watchAbortController = null;\r\n }\r\n\r\n /**\r\n * Validate existing truthpack against current codebase\r\n */\r\n async validate(existingTruthpack?: TruthpackResult): Promise<ValidationResult> {\r\n const truthpack = existingTruthpack || await this.load();\r\n \r\n if (!truthpack) {\r\n return {\r\n valid: false,\r\n stale: true,\r\n drifts: [],\r\n missing: [{\r\n type: 'route',\r\n identifier: '*',\r\n message: 'No truthpack found. Run `vibecheck truth` to generate.',\r\n }],\r\n extra: [],\r\n };\r\n }\r\n\r\n // Generate fresh data to compare\r\n const current = await this.generate();\r\n \r\n const drifts: DriftItem[] = [];\r\n const missing: DriftItem[] = [];\r\n const extra: DriftItem[] = [];\r\n\r\n // Compare routes\r\n const currentRouteKeys = new Set(current.routes.map(r => `${r.method}:${r.path}`));\r\n const truthpackRouteKeys = new Set(truthpack.routes.map(r => `${r.method}:${r.path}`));\r\n\r\n for (const route of current.routes) {\r\n const key = `${route.method}:${route.path}`;\r\n if (!truthpackRouteKeys.has(key)) {\r\n missing.push({\r\n type: 'route',\r\n identifier: key,\r\n actual: route,\r\n message: `Route ${key} exists in codebase but not in truthpack`,\r\n });\r\n }\r\n }\r\n\r\n for (const route of truthpack.routes) {\r\n const key = `${route.method}:${route.path}`;\r\n if (!currentRouteKeys.has(key)) {\r\n extra.push({\r\n type: 'route',\r\n identifier: key,\r\n expected: route,\r\n message: `Route ${key} in truthpack but not found in codebase`,\r\n });\r\n }\r\n }\r\n\r\n // Compare env vars\r\n const currentEnvKeys = new Set(current.env.map(e => e.name));\r\n const truthpackEnvKeys = new Set(truthpack.env.map(e => e.name));\r\n\r\n for (const envVar of current.env) {\r\n if (!truthpackEnvKeys.has(envVar.name)) {\r\n missing.push({\r\n type: 'env',\r\n identifier: envVar.name,\r\n actual: envVar,\r\n message: `Env var ${envVar.name} used in codebase but not in truthpack`,\r\n });\r\n }\r\n }\r\n\r\n for (const envVar of truthpack.env) {\r\n if (!currentEnvKeys.has(envVar.name)) {\r\n extra.push({\r\n type: 'env',\r\n identifier: envVar.name,\r\n expected: envVar,\r\n message: `Env var ${envVar.name} in truthpack but not used in codebase`,\r\n });\r\n }\r\n }\r\n\r\n // Check if truthpack is stale (hash mismatch)\r\n const isStale = truthpack.hash !== current.hash;\r\n\r\n return {\r\n valid: drifts.length === 0 && missing.length === 0 && extra.length === 0,\r\n stale: isStale,\r\n drifts,\r\n missing,\r\n extra,\r\n };\r\n }\r\n\r\n /**\r\n * Compute SHA-256 hash of truthpack content\r\n */\r\n private computeHash(result: Omit<TruthpackResult, 'hash' | 'generatedAt'>): string {\r\n const content = JSON.stringify({\r\n routes: result.routes,\r\n env: result.env,\r\n auth: result.auth,\r\n contracts: result.contracts,\r\n }, null, 0); // No formatting for consistent hash\r\n\r\n return crypto.createHash('sha256').update(content).digest('hex').slice(0, 16);\r\n }\r\n\r\n /**\r\n * Count routes by HTTP method\r\n */\r\n private countByMethod(routes: RouteDefinition[]): Record<string, number> {\r\n const counts: Record<string, number> = {};\r\n for (const route of routes) {\r\n counts[route.method] = (counts[route.method] || 0) + 1;\r\n }\r\n return counts;\r\n }\r\n\r\n /**\r\n * Count contracts by HTTP method\r\n */\r\n private countContractsByMethod(contracts: ApiContract[]): Record<string, number> {\r\n const counts: Record<string, number> = {};\r\n for (const contract of contracts) {\r\n if (contract.method) {\r\n counts[contract.method] = (counts[contract.method] || 0) + 1;\r\n }\r\n }\r\n return counts;\r\n }\r\n\r\n /**\r\n * Get cached result (if available)\r\n */\r\n getCachedResult(): TruthpackResult | null {\r\n return this.cachedResult;\r\n }\r\n\r\n /**\r\n * Clear cache\r\n */\r\n clearCache(): void {\r\n this.cachedResult = null;\r\n }\r\n}\r\n","/**\r\n * Truthpack Validators\r\n *\r\n * Validates truthpack data against schemas and performs\r\n * cross-reference checks for consistency.\r\n *\r\n * World-class implementation with comprehensive validation.\r\n */\r\n\r\nimport { z } from 'zod';\r\n\r\nexport interface ValidationResult {\r\n valid: boolean;\r\n errors: ValidationError[];\r\n warnings: ValidationWarning[];\r\n score: number; // 0-100 quality score\r\n}\r\n\r\nexport interface ValidationError {\r\n path: string;\r\n message: string;\r\n code: string;\r\n severity: 'error' | 'critical';\r\n}\r\n\r\nexport interface ValidationWarning {\r\n path: string;\r\n message: string;\r\n code: string;\r\n suggestion?: string;\r\n}\r\n\r\n// ============================================================================\r\n// Zod Schemas\r\n// ============================================================================\r\n\r\nconst RouteSchema = z.object({\r\n method: z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS', '*']),\r\n path: z.string().min(1).startsWith('/'),\r\n handler: z.string().min(1),\r\n middleware: z.array(z.string()).optional(),\r\n auth: z.object({\r\n required: z.boolean(),\r\n roles: z.array(z.string()).optional(),\r\n }).optional(),\r\n rateLimit: z.object({\r\n requests: z.number().positive(),\r\n window: z.string(),\r\n }).optional(),\r\n description: z.string().optional(),\r\n deprecated: z.boolean().optional(),\r\n});\r\n\r\nconst RoutesSchema = z.object({\r\n version: z.string(),\r\n generatedAt: z.string().optional(),\r\n routes: z.array(RouteSchema),\r\n});\r\n\r\nconst EnvVarSchema = z.object({\r\n name: z.string().regex(/^[A-Z][A-Z0-9_]*$/, 'Must be SCREAMING_SNAKE_CASE'),\r\n type: z.enum(['string', 'number', 'boolean', 'url', 'secret', 'json']),\r\n required: z.boolean(),\r\n default: z.string().optional(),\r\n description: z.string().optional(),\r\n example: z.string().optional(),\r\n sensitive: z.boolean().optional(),\r\n environments: z.array(z.enum(['development', 'staging', 'production', 'test'])).optional(),\r\n});\r\n\r\nconst EnvSchema = z.object({\r\n version: z.string(),\r\n generatedAt: z.string().optional(),\r\n variables: z.array(EnvVarSchema),\r\n});\r\n\r\nconst AuthRuleSchema = z.object({\r\n path: z.string().min(1),\r\n pattern: z.enum(['exact', 'prefix', 'regex']).optional().default('exact'),\r\n requiresAuth: z.boolean(),\r\n roles: z.array(z.string()).optional(),\r\n permissions: z.array(z.string()).optional(),\r\n rateLimit: z.object({\r\n authenticated: z.number().positive().optional(),\r\n anonymous: z.number().positive().optional(),\r\n window: z.string(),\r\n }).optional(),\r\n});\r\n\r\nconst AuthSchema = z.object({\r\n version: z.string(),\r\n generatedAt: z.string().optional(),\r\n provider: z.string().optional(),\r\n rules: z.array(AuthRuleSchema),\r\n roles: z.record(z.object({\r\n inherits: z.array(z.string()).optional(),\r\n permissions: z.array(z.string()).optional(),\r\n description: z.string().optional(),\r\n })).optional(),\r\n});\r\n\r\nconst EndpointSchema = z.object({\r\n method: z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE']),\r\n path: z.string().min(1).startsWith('/'),\r\n requestType: z.string().optional(),\r\n responseType: z.string(),\r\n errorTypes: z.array(z.string()).optional(),\r\n description: z.string().optional(),\r\n});\r\n\r\nconst TypeFieldSchema = z.object({\r\n name: z.string(),\r\n type: z.string(),\r\n required: z.boolean().optional(),\r\n description: z.string().optional(),\r\n});\r\n\r\nconst TypeSchema = z.object({\r\n name: z.string().regex(/^[A-Z][a-zA-Z0-9]*$/, 'Must be PascalCase'),\r\n kind: z.enum(['interface', 'type', 'enum']).optional(),\r\n fields: z.array(TypeFieldSchema).optional(),\r\n schema: z.record(z.unknown()).optional(),\r\n description: z.string().optional(),\r\n});\r\n\r\nconst ContractsSchema = z.object({\r\n version: z.string(),\r\n generatedAt: z.string().optional(),\r\n endpoints: z.array(EndpointSchema),\r\n types: z.array(TypeSchema),\r\n});\r\n\r\n// ============================================================================\r\n// Validator Class\r\n// ============================================================================\r\n\r\nexport class TruthpackValidators {\r\n /**\r\n * Validate routes truthpack\r\n */\r\n static validateRoutes(data: unknown): ValidationResult {\r\n const errors: ValidationError[] = [];\r\n const warnings: ValidationWarning[] = [];\r\n\r\n // Schema validation\r\n const parseResult = RoutesSchema.safeParse(data);\r\n\r\n if (!parseResult.success) {\r\n for (const issue of parseResult.error.issues) {\r\n errors.push({\r\n path: issue.path.join('.'),\r\n message: issue.message,\r\n code: 'SCHEMA_INVALID',\r\n severity: 'error',\r\n });\r\n }\r\n return { valid: false, errors, warnings, score: 0 };\r\n }\r\n\r\n const routes = parseResult.data;\r\n\r\n // Semantic validation\r\n const routeMap = new Map<string, typeof routes.routes[0]>();\r\n\r\n for (const route of routes.routes) {\r\n const key = `${route.method}:${route.path}`;\r\n\r\n // Check for duplicate routes\r\n if (routeMap.has(key)) {\r\n errors.push({\r\n path: `routes[${key}]`,\r\n message: `Duplicate route: ${route.method} ${route.path}`,\r\n code: 'ROUTE_DUPLICATE',\r\n severity: 'error',\r\n });\r\n } else {\r\n routeMap.set(key, route);\r\n }\r\n\r\n // Check for conflicting patterns\r\n for (const [existingKey, existingRoute] of routeMap) {\r\n if (existingKey !== key && this.routesConflict(route, existingRoute)) {\r\n warnings.push({\r\n path: `routes[${key}]`,\r\n message: `Route \"${route.path}\" may conflict with \"${existingRoute.path}\"`,\r\n code: 'ROUTE_CONFLICT',\r\n suggestion: 'Ensure route ordering is intentional',\r\n });\r\n }\r\n }\r\n\r\n // Check for deprecated routes without replacement\r\n if (route.deprecated && !route.description?.includes('replaced by')) {\r\n warnings.push({\r\n path: `routes[${key}].deprecated`,\r\n message: `Deprecated route \"${route.path}\" has no replacement specified`,\r\n code: 'ROUTE_DEPRECATED_NO_REPLACEMENT',\r\n suggestion: 'Add replacement route to description',\r\n });\r\n }\r\n\r\n // Check for auth on sensitive paths\r\n const sensitivePatterns = ['/admin', '/api/admin', '/internal', '/user', '/account'];\r\n if (sensitivePatterns.some((p) => route.path.includes(p)) && !route.auth?.required) {\r\n warnings.push({\r\n path: `routes[${key}].auth`,\r\n message: `Sensitive route \"${route.path}\" may need authentication`,\r\n code: 'ROUTE_SENSITIVE_NO_AUTH',\r\n suggestion: 'Add auth requirement for sensitive endpoints',\r\n });\r\n }\r\n }\r\n\r\n const score = this.calculateScore(errors.length, warnings.length, routes.routes.length);\r\n\r\n return { valid: errors.length === 0, errors, warnings, score };\r\n }\r\n\r\n /**\r\n * Validate environment variables truthpack\r\n */\r\n static validateEnv(data: unknown): ValidationResult {\r\n const errors: ValidationError[] = [];\r\n const warnings: ValidationWarning[] = [];\r\n\r\n // Schema validation\r\n const parseResult = EnvSchema.safeParse(data);\r\n\r\n if (!parseResult.success) {\r\n for (const issue of parseResult.error.issues) {\r\n errors.push({\r\n path: issue.path.join('.'),\r\n message: issue.message,\r\n code: 'SCHEMA_INVALID',\r\n severity: 'error',\r\n });\r\n }\r\n return { valid: false, errors, warnings, score: 0 };\r\n }\r\n\r\n const env = parseResult.data;\r\n const varNames = new Set<string>();\r\n\r\n for (const variable of env.variables) {\r\n // Check for duplicate names\r\n if (varNames.has(variable.name)) {\r\n errors.push({\r\n path: `variables[${variable.name}]`,\r\n message: `Duplicate environment variable: ${variable.name}`,\r\n code: 'ENV_DUPLICATE',\r\n severity: 'error',\r\n });\r\n } else {\r\n varNames.add(variable.name);\r\n }\r\n\r\n // Check for required variables without defaults\r\n if (variable.required && !variable.default && !variable.sensitive) {\r\n warnings.push({\r\n path: `variables[${variable.name}]`,\r\n message: `Required variable \"${variable.name}\" has no default`,\r\n code: 'ENV_REQUIRED_NO_DEFAULT',\r\n suggestion: 'Add a development default or document required value',\r\n });\r\n }\r\n\r\n // Check for sensitive variables with defaults (security risk)\r\n if (variable.sensitive && variable.default) {\r\n errors.push({\r\n path: `variables[${variable.name}].default`,\r\n message: `Sensitive variable \"${variable.name}\" should not have a default value`,\r\n code: 'ENV_SENSITIVE_DEFAULT',\r\n severity: 'critical',\r\n });\r\n }\r\n\r\n // Check for missing descriptions\r\n if (!variable.description) {\r\n warnings.push({\r\n path: `variables[${variable.name}].description`,\r\n message: `Variable \"${variable.name}\" has no description`,\r\n code: 'ENV_NO_DESCRIPTION',\r\n suggestion: 'Add a description for documentation',\r\n });\r\n }\r\n\r\n // Check for url type without example\r\n if (variable.type === 'url' && !variable.example) {\r\n warnings.push({\r\n path: `variables[${variable.name}].example`,\r\n message: `URL variable \"${variable.name}\" should have an example`,\r\n code: 'ENV_URL_NO_EXAMPLE',\r\n suggestion: 'Add an example URL for validation',\r\n });\r\n }\r\n\r\n // Check naming conventions for secrets\r\n const secretPatterns = ['SECRET', 'KEY', 'TOKEN', 'PASSWORD', 'PRIVATE'];\r\n const looksLikeSecret = secretPatterns.some((p) => variable.name.includes(p));\r\n if (looksLikeSecret && !variable.sensitive && variable.type !== 'secret') {\r\n warnings.push({\r\n path: `variables[${variable.name}].sensitive`,\r\n message: `Variable \"${variable.name}\" looks sensitive but is not marked as such`,\r\n code: 'ENV_SENSITIVE_NOT_MARKED',\r\n suggestion: 'Set sensitive: true and type: \"secret\"',\r\n });\r\n }\r\n }\r\n\r\n const score = this.calculateScore(errors.length, warnings.length, env.variables.length);\r\n\r\n return { valid: errors.length === 0, errors, warnings, score };\r\n }\r\n\r\n /**\r\n * Validate auth configuration truthpack\r\n */\r\n static validateAuth(data: unknown): ValidationResult {\r\n const errors: ValidationError[] = [];\r\n const warnings: ValidationWarning[] = [];\r\n\r\n // Schema validation\r\n const parseResult = AuthSchema.safeParse(data);\r\n\r\n if (!parseResult.success) {\r\n for (const issue of parseResult.error.issues) {\r\n errors.push({\r\n path: issue.path.join('.'),\r\n message: issue.message,\r\n code: 'SCHEMA_INVALID',\r\n severity: 'error',\r\n });\r\n }\r\n return { valid: false, errors, warnings, score: 0 };\r\n }\r\n\r\n const auth = parseResult.data;\r\n const definedRoles = new Set(Object.keys(auth.roles ?? {}));\r\n\r\n for (const rule of auth.rules) {\r\n // Check for roles that aren't defined\r\n for (const role of rule.roles ?? []) {\r\n if (auth.roles && !definedRoles.has(role)) {\r\n errors.push({\r\n path: `rules[${rule.path}].roles`,\r\n message: `Role \"${role}\" is not defined in roles section`,\r\n code: 'AUTH_ROLE_UNDEFINED',\r\n severity: 'error',\r\n });\r\n }\r\n }\r\n\r\n // Check for overly permissive paths\r\n if (rule.path === '/' || rule.path === '/*' || rule.path === '/**') {\r\n if (!rule.requiresAuth) {\r\n warnings.push({\r\n path: `rules[${rule.path}]`,\r\n message: 'Wildcard path is public - ensure this is intentional',\r\n code: 'AUTH_WILDCARD_PUBLIC',\r\n suggestion: 'Consider requiring auth for sensitive subpaths',\r\n });\r\n }\r\n }\r\n\r\n // Check for auth without roles (any authenticated user)\r\n if (rule.requiresAuth && (!rule.roles || rule.roles.length === 0) && (!rule.permissions || rule.permissions.length === 0)) {\r\n warnings.push({\r\n path: `rules[${rule.path}]`,\r\n message: `Auth required but no specific roles/permissions - any authenticated user can access`,\r\n code: 'AUTH_NO_ROLES',\r\n suggestion: 'Add specific role requirements if needed',\r\n });\r\n }\r\n }\r\n\r\n // Check for circular role inheritance\r\n if (auth.roles) {\r\n for (const [roleName, roleConfig] of Object.entries(auth.roles)) {\r\n const visited = new Set<string>();\r\n const queue = [...(roleConfig.inherits ?? [])];\r\n\r\n while (queue.length > 0) {\r\n const inherited = queue.shift()!;\r\n if (inherited === roleName) {\r\n errors.push({\r\n path: `roles[${roleName}].inherits`,\r\n message: `Circular inheritance detected for role \"${roleName}\"`,\r\n code: 'AUTH_CIRCULAR_INHERITANCE',\r\n severity: 'critical',\r\n });\r\n break;\r\n }\r\n if (!visited.has(inherited)) {\r\n visited.add(inherited);\r\n const inheritedRole = auth.roles[inherited];\r\n if (inheritedRole?.inherits) {\r\n queue.push(...inheritedRole.inherits);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n const score = this.calculateScore(errors.length, warnings.length, auth.rules.length);\r\n\r\n return { valid: errors.length === 0, errors, warnings, score };\r\n }\r\n\r\n /**\r\n * Validate API contracts truthpack\r\n */\r\n static validateContracts(data: unknown): ValidationResult {\r\n const errors: ValidationError[] = [];\r\n const warnings: ValidationWarning[] = [];\r\n\r\n // Schema validation\r\n const parseResult = ContractsSchema.safeParse(data);\r\n\r\n if (!parseResult.success) {\r\n for (const issue of parseResult.error.issues) {\r\n errors.push({\r\n path: issue.path.join('.'),\r\n message: issue.message,\r\n code: 'SCHEMA_INVALID',\r\n severity: 'error',\r\n });\r\n }\r\n return { valid: false, errors, warnings, score: 0 };\r\n }\r\n\r\n const contracts = parseResult.data;\r\n const definedTypes = new Set(contracts.types.map((t) => t.name));\r\n const usedTypes = new Set<string>();\r\n\r\n // Validate endpoints\r\n for (const endpoint of contracts.endpoints) {\r\n const key = `${endpoint.method} ${endpoint.path}`;\r\n\r\n // Track used types\r\n if (endpoint.requestType) {\r\n usedTypes.add(endpoint.requestType);\r\n if (!definedTypes.has(endpoint.requestType) && !this.isBuiltinType(endpoint.requestType)) {\r\n errors.push({\r\n path: `endpoints[${key}].requestType`,\r\n message: `Request type \"${endpoint.requestType}\" is not defined`,\r\n code: 'CONTRACT_TYPE_UNDEFINED',\r\n severity: 'error',\r\n });\r\n }\r\n }\r\n\r\n usedTypes.add(endpoint.responseType);\r\n if (!definedTypes.has(endpoint.responseType) && !this.isBuiltinType(endpoint.responseType)) {\r\n errors.push({\r\n path: `endpoints[${key}].responseType`,\r\n message: `Response type \"${endpoint.responseType}\" is not defined`,\r\n code: 'CONTRACT_TYPE_UNDEFINED',\r\n severity: 'error',\r\n });\r\n }\r\n\r\n // Check error types\r\n for (const errorType of endpoint.errorTypes ?? []) {\r\n usedTypes.add(errorType);\r\n if (!definedTypes.has(errorType) && !this.isBuiltinType(errorType)) {\r\n warnings.push({\r\n path: `endpoints[${key}].errorTypes`,\r\n message: `Error type \"${errorType}\" is not defined`,\r\n code: 'CONTRACT_ERROR_TYPE_UNDEFINED',\r\n suggestion: 'Define the error type or use a standard error type',\r\n });\r\n }\r\n }\r\n\r\n // Check for missing description\r\n if (!endpoint.description) {\r\n warnings.push({\r\n path: `endpoints[${key}].description`,\r\n message: `Endpoint ${key} has no description`,\r\n code: 'CONTRACT_NO_DESCRIPTION',\r\n suggestion: 'Add a description for API documentation',\r\n });\r\n }\r\n }\r\n\r\n // Check for unused types\r\n for (const type of contracts.types) {\r\n if (!usedTypes.has(type.name)) {\r\n warnings.push({\r\n path: `types[${type.name}]`,\r\n message: `Type \"${type.name}\" is defined but not used in any endpoint`,\r\n code: 'CONTRACT_TYPE_UNUSED',\r\n suggestion: 'Remove unused types or add endpoints that use them',\r\n });\r\n }\r\n\r\n // Check type has fields or schema\r\n if (!type.fields && !type.schema) {\r\n errors.push({\r\n path: `types[${type.name}]`,\r\n message: `Type \"${type.name}\" has no fields or schema`,\r\n code: 'CONTRACT_TYPE_EMPTY',\r\n severity: 'error',\r\n });\r\n }\r\n }\r\n\r\n const score = this.calculateScore(errors.length, warnings.length, contracts.endpoints.length + contracts.types.length);\r\n\r\n return { valid: errors.length === 0, errors, warnings, score };\r\n }\r\n\r\n /**\r\n * Cross-validate all truthpacks for consistency\r\n */\r\n static crossValidate(truthpack: {\r\n routes?: unknown;\r\n env?: unknown;\r\n auth?: unknown;\r\n contracts?: unknown;\r\n }): ValidationResult {\r\n const errors: ValidationError[] = [];\r\n const warnings: ValidationWarning[] = [];\r\n\r\n // Parse each truthpack\r\n const routes = RoutesSchema.safeParse(truthpack.routes);\r\n const auth = AuthSchema.safeParse(truthpack.auth);\r\n const contracts = ContractsSchema.safeParse(truthpack.contracts);\r\n\r\n if (!routes.success || !auth.success) {\r\n // Can't cross-validate if base validation fails\r\n return {\r\n valid: false,\r\n errors: [{\r\n path: '',\r\n message: 'Cannot cross-validate - base validation failed',\r\n code: 'CROSS_VALIDATION_SKIPPED',\r\n severity: 'error',\r\n }],\r\n warnings: [],\r\n score: 0,\r\n };\r\n }\r\n\r\n // Build route map\r\n const routeMap = new Map<string, typeof routes.data.routes[0]>();\r\n for (const route of routes.data.routes) {\r\n routeMap.set(route.path, route);\r\n }\r\n\r\n // Check auth rules reference valid routes\r\n for (const rule of auth.data.rules) {\r\n if (rule.pattern === 'exact' && !routeMap.has(rule.path)) {\r\n const similar = this.findSimilarPath(rule.path, [...routeMap.keys()]);\r\n if (similar) {\r\n warnings.push({\r\n path: `auth.rules[${rule.path}]`,\r\n message: `Auth rule for \"${rule.path}\" doesn't match any route`,\r\n code: 'CROSS_AUTH_NO_ROUTE',\r\n suggestion: `Did you mean \"${similar}\"?`,\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Check routes with auth have corresponding auth rules\r\n for (const route of routes.data.routes) {\r\n if (route.auth?.required) {\r\n const hasAuthRule = auth.data.rules.some((r) =>\r\n r.path === route.path ||\r\n (r.pattern === 'prefix' && route.path.startsWith(r.path)) ||\r\n (r.pattern === 'regex' && new RegExp(r.path).test(route.path))\r\n );\r\n\r\n if (!hasAuthRule) {\r\n warnings.push({\r\n path: `routes[${route.path}].auth`,\r\n message: `Route \"${route.path}\" has auth config but no matching auth rule`,\r\n code: 'CROSS_ROUTE_NO_AUTH_RULE',\r\n suggestion: 'Add a corresponding auth rule for centralized management',\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Check contracts reference valid routes\r\n if (contracts.success) {\r\n for (const endpoint of contracts.data.endpoints) {\r\n const routeKey = `${endpoint.method}:${endpoint.path}`;\r\n const matchingRoute = routes.data.routes.find(\r\n (r) => r.method === endpoint.method && r.path === endpoint.path\r\n );\r\n\r\n if (!matchingRoute) {\r\n errors.push({\r\n path: `contracts.endpoints[${endpoint.method} ${endpoint.path}]`,\r\n message: `Contract endpoint \"${endpoint.method} ${endpoint.path}\" has no matching route`,\r\n code: 'CROSS_CONTRACT_NO_ROUTE',\r\n severity: 'error',\r\n });\r\n }\r\n }\r\n }\r\n\r\n const itemCount = routes.data.routes.length + auth.data.rules.length + (contracts.data?.endpoints.length ?? 0);\r\n const score = this.calculateScore(errors.length, warnings.length, itemCount);\r\n\r\n return { valid: errors.length === 0, errors, warnings, score };\r\n }\r\n\r\n // ============================================================================\r\n // Private Helpers\r\n // ============================================================================\r\n\r\n private static routesConflict(a: { path: string; method: string }, b: { path: string; method: string }): boolean {\r\n if (a.method !== b.method && a.method !== '*' && b.method !== '*') {\r\n return false;\r\n }\r\n\r\n // Check if paths could match the same URL\r\n const aSegments = a.path.split('/');\r\n const bSegments = b.path.split('/');\r\n\r\n if (aSegments.length !== bSegments.length) {\r\n return false;\r\n }\r\n\r\n for (let i = 0; i < aSegments.length; i++) {\r\n const aIsParam = aSegments[i].startsWith(':') || aSegments[i].startsWith('[');\r\n const bIsParam = bSegments[i].startsWith(':') || bSegments[i].startsWith('[');\r\n\r\n if (!aIsParam && !bIsParam && aSegments[i] !== bSegments[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private static isBuiltinType(type: string): boolean {\r\n const builtins = new Set([\r\n 'string', 'number', 'boolean', 'null', 'undefined', 'void', 'any', 'unknown', 'never',\r\n 'object', 'Object', 'Array', 'Date', 'Error', 'Promise', 'Record', 'Partial', 'Required',\r\n 'string[]', 'number[]', 'boolean[]',\r\n ]);\r\n\r\n return builtins.has(type) || type.endsWith('[]') || type.startsWith('Record<') || type.startsWith('Partial<');\r\n }\r\n\r\n private static findSimilarPath(path: string, paths: string[]): string | null {\r\n for (const p of paths) {\r\n // Simple similarity check\r\n if (this.levenshteinDistance(path, p) <= 3) {\r\n return p;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private static levenshteinDistance(a: string, b: string): number {\r\n if (a.length === 0) return b.length;\r\n if (b.length === 0) return a.length;\r\n\r\n const matrix: number[][] = [];\r\n\r\n for (let i = 0; i <= b.length; i++) {\r\n matrix[i] = [i];\r\n }\r\n\r\n for (let j = 0; j <= a.length; j++) {\r\n matrix[0][j] = j;\r\n }\r\n\r\n for (let i = 1; i <= b.length; i++) {\r\n for (let j = 1; j <= a.length; j++) {\r\n if (b.charAt(i - 1) === a.charAt(j - 1)) {\r\n matrix[i][j] = matrix[i - 1][j - 1];\r\n } else {\r\n matrix[i][j] = Math.min(\r\n matrix[i - 1][j - 1] + 1,\r\n matrix[i][j - 1] + 1,\r\n matrix[i - 1][j] + 1\r\n );\r\n }\r\n }\r\n }\r\n\r\n return matrix[b.length][a.length];\r\n }\r\n\r\n private static calculateScore(errorCount: number, warningCount: number, itemCount: number): number {\r\n if (itemCount === 0) return 100;\r\n\r\n const errorPenalty = errorCount * 10;\r\n const warningPenalty = warningCount * 2;\r\n\r\n return Math.max(0, Math.min(100, 100 - errorPenalty - warningPenalty));\r\n }\r\n}\r\n","/**\r\n * Routes Schema\r\n * \r\n * Defines the structure for route truthpack data.\r\n */\r\n\r\nimport { z } from 'zod';\r\n\r\nexport const HttpMethodSchema = z.enum([\r\n 'GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS', 'HEAD'\r\n]);\r\n\r\nexport const RouteParameterSchema = z.object({\r\n name: z.string(),\r\n type: z.enum(['string', 'number', 'boolean', 'uuid']),\r\n required: z.boolean(),\r\n description: z.string().optional(),\r\n});\r\n\r\nexport const RouteDefinitionSchema = z.object({\r\n path: z.string(),\r\n method: HttpMethodSchema,\r\n handler: z.string(),\r\n file: z.string(),\r\n line: z.number(),\r\n parameters: z.array(RouteParameterSchema).optional(),\r\n middleware: z.array(z.string()).optional(),\r\n auth: z.object({\r\n required: z.boolean(),\r\n roles: z.array(z.string()).optional(),\r\n }).optional(),\r\n description: z.string().optional(),\r\n});\r\n\r\nexport const RoutesSchema = z.object({\r\n version: z.string(),\r\n generatedAt: z.string(),\r\n routes: z.array(RouteDefinitionSchema),\r\n summary: z.object({\r\n totalRoutes: z.number(),\r\n byMethod: z.record(z.number()),\r\n protectedRoutes: z.number(),\r\n publicRoutes: z.number(),\r\n }),\r\n});\r\n\r\nexport type RouteDefinition = z.infer<typeof RouteDefinitionSchema>;\r\nexport type Routes = z.infer<typeof RoutesSchema>;\r\n","/**\r\n * Environment Variables Schema\r\n * \r\n * Defines the structure for environment variable truthpack data.\r\n */\r\n\r\nimport { z } from 'zod';\r\n\r\nexport const EnvVariableSchema = z.object({\r\n name: z.string(),\r\n type: z.enum(['string', 'number', 'boolean', 'url', 'secret']),\r\n required: z.boolean(),\r\n defaultValue: z.string().optional(),\r\n description: z.string().optional(),\r\n usedIn: z.array(z.object({\r\n file: z.string(),\r\n line: z.number(),\r\n })).optional(),\r\n sensitive: z.boolean().default(false),\r\n validationPattern: z.string().optional(),\r\n});\r\n\r\nexport const EnvSchema = z.object({\r\n version: z.string(),\r\n generatedAt: z.string(),\r\n variables: z.array(EnvVariableSchema),\r\n environments: z.array(z.object({\r\n name: z.string(),\r\n file: z.string().optional(),\r\n variables: z.array(z.string()),\r\n })),\r\n summary: z.object({\r\n totalVariables: z.number(),\r\n required: z.number(),\r\n optional: z.number(),\r\n sensitive: z.number(),\r\n }),\r\n});\r\n\r\nexport type EnvVariable = z.infer<typeof EnvVariableSchema>;\r\nexport type Env = z.infer<typeof EnvSchema>;\r\n","/**\r\n * Authentication Schema\r\n * \r\n * Defines the structure for auth configuration truthpack data.\r\n */\r\n\r\nimport { z } from 'zod';\r\n\r\nexport const RoleSchema = z.object({\r\n name: z.string(),\r\n permissions: z.array(z.string()),\r\n inherits: z.array(z.string()).optional(),\r\n description: z.string().optional(),\r\n});\r\n\r\nexport const AuthProviderSchema = z.object({\r\n type: z.enum(['jwt', 'session', 'oauth', 'api-key', 'custom']),\r\n config: z.record(z.unknown()),\r\n});\r\n\r\nexport const ProtectedResourceSchema = z.object({\r\n path: z.string(),\r\n method: z.string().optional(),\r\n requiredRoles: z.array(z.string()),\r\n requiredPermissions: z.array(z.string()).optional(),\r\n customCheck: z.string().optional(),\r\n});\r\n\r\nexport const AuthConfigSchema = z.object({\r\n version: z.string(),\r\n generatedAt: z.string(),\r\n providers: z.array(AuthProviderSchema),\r\n roles: z.array(RoleSchema),\r\n protectedResources: z.array(ProtectedResourceSchema),\r\n publicPaths: z.array(z.string()),\r\n summary: z.object({\r\n totalRoles: z.number(),\r\n totalPermissions: z.number(),\r\n protectedEndpoints: z.number(),\r\n publicEndpoints: z.number(),\r\n }),\r\n});\r\n\r\nexport type AuthConfig = z.infer<typeof AuthConfigSchema>;\r\nexport type Role = z.infer<typeof RoleSchema>;\r\nexport type ProtectedResource = z.infer<typeof ProtectedResourceSchema>;\r\n\r\n// Alias for backward compatibility\r\nexport const AuthSchema = AuthConfigSchema;\r\n","/**\r\n * API Contracts Schema\r\n * \r\n * Defines the structure for API contract truthpack data.\r\n */\r\n\r\nimport { z } from 'zod';\r\n\r\nexport const SchemaPropertySchema: z.ZodType<unknown> = z.lazy(() =>\r\n z.object({\r\n type: z.enum(['string', 'number', 'boolean', 'array', 'object', 'null']),\r\n required: z.boolean().optional(),\r\n description: z.string().optional(),\r\n enum: z.array(z.unknown()).optional(),\r\n items: SchemaPropertySchema.optional(),\r\n properties: z.record(SchemaPropertySchema).optional(),\r\n })\r\n);\r\n\r\nexport const RequestSchemaSchema = z.object({\r\n headers: z.record(SchemaPropertySchema).optional(),\r\n params: z.record(SchemaPropertySchema).optional(),\r\n query: z.record(SchemaPropertySchema).optional(),\r\n body: SchemaPropertySchema.optional(),\r\n});\r\n\r\nexport const ResponseSchemaSchema = z.object({\r\n statusCode: z.number(),\r\n description: z.string().optional(),\r\n headers: z.record(SchemaPropertySchema).optional(),\r\n body: SchemaPropertySchema.optional(),\r\n});\r\n\r\nexport const ApiContractSchema = z.object({\r\n path: z.string(),\r\n method: z.string(),\r\n operationId: z.string().optional(),\r\n summary: z.string().optional(),\r\n description: z.string().optional(),\r\n tags: z.array(z.string()).optional(),\r\n request: RequestSchemaSchema,\r\n responses: z.array(ResponseSchemaSchema),\r\n examples: z.array(z.object({\r\n name: z.string(),\r\n request: z.unknown(),\r\n response: z.unknown(),\r\n })).optional(),\r\n});\r\n\r\nexport const ContractsSchema = z.object({\r\n version: z.string(),\r\n generatedAt: z.string(),\r\n contracts: z.array(ApiContractSchema),\r\n summary: z.object({\r\n totalEndpoints: z.number(),\r\n byTag: z.record(z.number()),\r\n }),\r\n});\r\n\r\nexport type ApiContract = z.infer<typeof ApiContractSchema>;\r\nexport type Contracts = z.infer<typeof ContractsSchema>;\r\n","/**\r\n * UI Graph Schema\r\n * \r\n * Defines the structure for UI component graph truthpack data.\r\n */\r\n\r\nimport { z } from 'zod';\r\n\r\nexport const PropDefinitionSchema = z.object({\r\n name: z.string(),\r\n type: z.string(),\r\n required: z.boolean(),\r\n defaultValue: z.unknown().optional(),\r\n description: z.string().optional(),\r\n});\r\n\r\nexport const ComponentDependencySchema = z.object({\r\n name: z.string(),\r\n type: z.enum(['import', 'render', 'context', 'hook']),\r\n path: z.string().optional(),\r\n});\r\n\r\nexport const UiComponentSchema = z.object({\r\n name: z.string(),\r\n file: z.string(),\r\n line: z.number(),\r\n type: z.enum(['function', 'class', 'forwardRef', 'memo']),\r\n props: z.array(PropDefinitionSchema),\r\n dependencies: z.array(ComponentDependencySchema),\r\n children: z.array(z.string()).optional(),\r\n hooks: z.array(z.string()).optional(),\r\n contexts: z.array(z.string()).optional(),\r\n description: z.string().optional(),\r\n});\r\n\r\nexport const UiGraphSchema = z.object({\r\n version: z.string(),\r\n generatedAt: z.string(),\r\n components: z.array(UiComponentSchema),\r\n pages: z.array(z.object({\r\n path: z.string(),\r\n component: z.string(),\r\n layout: z.string().optional(),\r\n })).optional(),\r\n layouts: z.array(z.object({\r\n name: z.string(),\r\n file: z.string(),\r\n slots: z.array(z.string()),\r\n })).optional(),\r\n summary: z.object({\r\n totalComponents: z.number(),\r\n totalPages: z.number(),\r\n maxDepth: z.number(),\r\n }),\r\n});\r\n\r\nexport type UiComponent = z.infer<typeof UiComponentSchema>;\r\nexport type UiGraph = z.infer<typeof UiGraphSchema>;\r\n","export { AuthScanner, AuthSchema, ContractScanner, ContractsSchema, EnvScanner, EnvSchema, IncrementalScanner, RouteScanner, RoutesSchema, TruthpackGenerator, TruthpackValidators, UiGraphSchema } from '../chunk-765XIQ6I.js';\nimport '../chunk-HGDXDNC3.js';\nimport '../chunk-UPGC4PUW.js';\nimport '../chunk-K7LSLKXS.js';\nimport '../chunk-DGUM43GV.js';\n//# sourceMappingURL=index.js.map\n//# sourceMappingURL=index.js.map","/**\r\n * Truthpack Tools\r\n * \r\n * MCP tools for managing and querying truthpack data.\r\n * Features enhanced multi-format output (JSON + pretty text + HTML).\r\n */\r\n\r\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport { z } from 'zod';\r\nimport * as fs from 'fs/promises';\r\nimport * as path from 'path';\r\nimport {\r\n RouteScanner,\r\n EnvScanner,\r\n AuthScanner,\r\n ContractScanner,\r\n} from '@vibecheck/core/truthpack';\r\n\r\nimport { loadConfig } from '@repo/shared-config';\r\nimport {\r\n formatTruthpackGenerate,\r\n formatTruthpackQuery,\r\n formatRoutes,\r\n formatSuccess,\r\n formatError,\r\n formatInfo,\r\n buildResponse,\r\n fmt,\r\n} from '../ui/index.js';\r\n\r\n// Get project root from centralized config or default to cwd\r\nconst getProjectRoot = (): string => {\r\n const config = loadConfig();\r\n return config.VIBECHECK_PROJECT_ROOT || process.cwd();\r\n};\r\n\r\n// Get truthpack directory path\r\nconst getTruthpackPath = (): string => {\r\n return path.join(getProjectRoot(), '.vibecheck', 'truthpack');\r\n};\r\n\r\n// Ensure truthpack directory exists\r\nconst ensureTruthpackDir = async (): Promise<void> => {\r\n const truthpackPath = getTruthpackPath();\r\n await fs.mkdir(truthpackPath, { recursive: true });\r\n};\r\n\r\n// Load truthpack file\r\nconst loadTruthpack = async <T>(name: string): Promise<T | null> => {\r\n try {\r\n const filePath = path.join(getTruthpackPath(), `${name}.json`);\r\n const content = await fs.readFile(filePath, 'utf-8');\r\n return JSON.parse(content) as T;\r\n } catch {\r\n return null;\r\n }\r\n};\r\n\r\n// Save truthpack file\r\nconst saveTruthpack = async (name: string, data: unknown): Promise<void> => {\r\n await ensureTruthpackDir();\r\n const filePath = path.join(getTruthpackPath(), `${name}.json`);\r\n await fs.writeFile(filePath, JSON.stringify(data, null, 2), 'utf-8');\r\n};\r\n\r\nexport function registerTruthpackTools(server: McpServer): void {\r\n // Generate truthpack\r\n server.tool(\r\n 'truthpack_generate',\r\n 'Generate or refresh the truthpack by scanning the codebase',\r\n {\r\n scanners: z.array(z.enum(['routes', 'env', 'auth', 'contracts', 'ui-graph']))\r\n .optional()\r\n .describe('Which scanners to run (default: all)'),\r\n force: z.boolean()\r\n .optional()\r\n .describe('Force regeneration even if truthpack is fresh'),\r\n },\r\n async ({ scanners, force }) => {\r\n const projectRoot = getProjectRoot();\r\n const scannersToRun = scanners ?? ['routes', 'env', 'auth', 'contracts'];\r\n const results: Record<string, { count?: number; note?: string }> = {};\r\n const errors: string[] = [];\r\n\r\n try {\r\n for (const scannerName of scannersToRun) {\r\n try {\r\n switch (scannerName) {\r\n case 'routes': {\r\n const scanner = new RouteScanner(projectRoot);\r\n const routes = await scanner.scan();\r\n const routesData = {\r\n version: '1.0.0',\r\n generatedAt: new Date().toISOString(),\r\n routes,\r\n summary: {\r\n totalRoutes: routes.length,\r\n byMethod: routes.reduce((acc, r) => {\r\n acc[r.method] = (acc[r.method] || 0) + 1;\r\n return acc;\r\n }, {} as Record<string, number>),\r\n protectedRoutes: routes.filter(r => r.auth?.required).length,\r\n publicRoutes: routes.filter(r => !r.auth?.required).length,\r\n },\r\n };\r\n await saveTruthpack('routes', routesData);\r\n results.routes = { count: routes.length };\r\n break;\r\n }\r\n case 'env': {\r\n const scanner = new EnvScanner(projectRoot);\r\n const variables = await scanner.scan();\r\n const envData = {\r\n version: '1.0.0',\r\n generatedAt: new Date().toISOString(),\r\n variables,\r\n environments: [{ name: 'default', variables: variables.map(v => v.name) }],\r\n summary: {\r\n totalVariables: variables.length,\r\n required: variables.filter(v => v.required).length,\r\n optional: variables.filter(v => !v.required).length,\r\n sensitive: variables.filter(v => v.sensitive).length,\r\n },\r\n };\r\n await saveTruthpack('env', envData);\r\n results.env = { count: variables.length };\r\n break;\r\n }\r\n case 'auth': {\r\n const scanner = new AuthScanner(projectRoot);\r\n const authConfig = await scanner.scan();\r\n const authData = {\r\n version: '1.0.0',\r\n generatedAt: new Date().toISOString(),\r\n providers: authConfig.providers ?? [],\r\n roles: authConfig.roles ?? [],\r\n protectedResources: authConfig.protectedResources ?? [],\r\n publicPaths: authConfig.publicPaths ?? [],\r\n summary: {\r\n totalRoles: authConfig.roles?.length ?? 0,\r\n totalPermissions: authConfig.roles?.reduce((acc, r) => acc + r.permissions.length, 0) ?? 0,\r\n protectedEndpoints: authConfig.protectedResources?.length ?? 0,\r\n publicEndpoints: authConfig.publicPaths?.length ?? 0,\r\n },\r\n };\r\n await saveTruthpack('auth', authData);\r\n results.auth = { count: authConfig.roles?.length ?? 0, note: `${authConfig.protectedResources?.length ?? 0} protected` };\r\n break;\r\n }\r\n case 'contracts': {\r\n const scanner = new ContractScanner(projectRoot);\r\n const contracts = await scanner.scan();\r\n const contractsData = {\r\n version: '1.0.0',\r\n generatedAt: new Date().toISOString(),\r\n contracts,\r\n summary: {\r\n totalEndpoints: contracts.length,\r\n byTag: contracts.reduce((acc, c) => {\r\n for (const tag of c.tags ?? ['untagged']) {\r\n acc[tag] = (acc[tag] || 0) + 1;\r\n }\r\n return acc;\r\n }, {} as Record<string, number>),\r\n },\r\n };\r\n await saveTruthpack('contracts', contractsData);\r\n results.contracts = { count: contracts.length };\r\n break;\r\n }\r\n case 'ui-graph': {\r\n // UI graph scanner not implemented yet\r\n results['ui-graph'] = { count: 0, note: 'Scanner not implemented' };\r\n break;\r\n }\r\n }\r\n } catch (err) {\r\n errors.push(`${scannerName}: ${err instanceof Error ? err.message : 'Unknown error'}`);\r\n }\r\n }\r\n\r\n const response = formatTruthpackGenerate({\r\n success: errors.length === 0,\r\n generated: scannersToRun,\r\n results,\r\n errors: errors.length > 0 ? errors : undefined,\r\n timestamp: new Date().toISOString(),\r\n });\r\n\r\n return buildResponse(response);\r\n } catch (err) {\r\n const response = formatError(err instanceof Error ? err : 'Unknown error', {\r\n operation: 'truthpack_generate',\r\n });\r\n return buildResponse(response);\r\n }\r\n }\r\n );\r\n\r\n // Query truthpack\r\n server.tool(\r\n 'truthpack_query',\r\n 'Query the truthpack for specific information',\r\n {\r\n category: z.enum(['routes', 'env', 'auth', 'contracts', 'ui-graph'])\r\n .describe('Which truthpack category to query'),\r\n filter: z.string()\r\n .optional()\r\n .describe('Filter pattern (e.g., \"/api/users*\" for routes)'),\r\n },\r\n async ({ category, filter }) => {\r\n try {\r\n const data = await loadTruthpack<Record<string, unknown>>(category);\r\n \r\n if (!data) {\r\n const response = formatTruthpackQuery({\r\n category,\r\n filter,\r\n error: 'Truthpack not found. Run truthpack_generate first.',\r\n results: [],\r\n count: 0,\r\n });\r\n return buildResponse(response);\r\n }\r\n\r\n let results: unknown[] = [];\r\n\r\n // Get the main array from the data\r\n switch (category) {\r\n case 'routes':\r\n results = (data.routes as unknown[]) ?? [];\r\n break;\r\n case 'env':\r\n results = (data.variables as unknown[]) ?? [];\r\n break;\r\n case 'auth':\r\n results = (data.protectedResources as unknown[]) ?? [];\r\n break;\r\n case 'contracts':\r\n results = (data.contracts as unknown[]) ?? [];\r\n break;\r\n }\r\n\r\n // Apply filter if provided\r\n if (filter && results.length > 0) {\r\n const filterRegex = new RegExp(filter.replace(/\\*/g, '.*'), 'i');\r\n results = results.filter((item: unknown) => {\r\n const record = item as Record<string, unknown>;\r\n // Filter on path or name depending on category\r\n const value = (record.path ?? record.name ?? '') as string;\r\n return filterRegex.test(value);\r\n });\r\n }\r\n\r\n const response = formatTruthpackQuery({\r\n category,\r\n filter,\r\n results,\r\n count: results.length,\r\n });\r\n\r\n return buildResponse(response);\r\n } catch (err) {\r\n const response = formatTruthpackQuery({\r\n category,\r\n filter,\r\n error: err instanceof Error ? err.message : 'Unknown error',\r\n results: [],\r\n count: 0,\r\n });\r\n return buildResponse(response);\r\n }\r\n }\r\n );\r\n\r\n // Validate truthpack\r\n server.tool(\r\n 'truthpack_validate',\r\n 'Validate truthpack against current codebase',\r\n {\r\n category: z.enum(['routes', 'env', 'auth', 'contracts', 'ui-graph', 'all'])\r\n .optional()\r\n .describe('Which category to validate (default: all)'),\r\n },\r\n async ({ category }) => {\r\n const projectRoot = getProjectRoot();\r\n const categoriesToValidate = category === 'all' || !category \r\n ? ['routes', 'env', 'auth', 'contracts'] \r\n : [category];\r\n \r\n const issues: { category: string; type: string; message: string }[] = [];\r\n\r\n for (const cat of categoriesToValidate) {\r\n const existing = await loadTruthpack<{ generatedAt?: string }>(cat);\r\n \r\n if (!existing) {\r\n issues.push({\r\n category: cat,\r\n type: 'missing',\r\n message: `Truthpack for ${cat} not found`,\r\n });\r\n continue;\r\n }\r\n\r\n // Check if truthpack is stale (older than 24 hours)\r\n if (existing.generatedAt) {\r\n const generatedAt = new Date(existing.generatedAt);\r\n const age = Date.now() - generatedAt.getTime();\r\n if (age > 24 * 60 * 60 * 1000) {\r\n issues.push({\r\n category: cat,\r\n type: 'stale',\r\n message: `Truthpack for ${cat} is older than 24 hours`,\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Build pretty text output\r\n const textParts: string[] = [];\r\n const isValid = issues.length === 0;\r\n \r\n textParts.push(fmt.headerBox(\r\n isValid ? fmt.ICONS.success : fmt.ICONS.warning,\r\n 'TRUTHPACK VALIDATION',\r\n isValid ? 'All checks passed' : `${issues.length} issues found`,\r\n 45\r\n ));\r\n\r\n textParts.push('');\r\n textParts.push(fmt.keyValue([\r\n ['Category', category ?? 'all'],\r\n ['Validated', categoriesToValidate.join(', ')],\r\n ['Status', isValid ? '✓ Valid' : '✗ Issues found'],\r\n ]));\r\n\r\n if (issues.length > 0) {\r\n textParts.push('');\r\n textParts.push(fmt.section('Issues', '', fmt.ICONS.warning));\r\n for (const issue of issues) {\r\n const icon = issue.type === 'missing' ? '❌' : '⚠️';\r\n textParts.push(` ${icon} [${issue.category}] ${issue.message}`);\r\n }\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify({\r\n valid: isValid,\r\n category: category ?? 'all',\r\n issues,\r\n }, null, 2),\r\n },\r\n {\r\n type: 'text',\r\n text: `\\n---\\n${textParts.join('\\n')}\\n---`,\r\n },\r\n ],\r\n };\r\n }\r\n );\r\n\r\n // Get routes\r\n server.tool(\r\n 'truthpack_routes',\r\n 'Get API routes from truthpack',\r\n {\r\n method: z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE'])\r\n .optional()\r\n .describe('Filter by HTTP method'),\r\n path: z.string()\r\n .optional()\r\n .describe('Filter by path pattern'),\r\n },\r\n async ({ method, path: pathFilter }) => {\r\n try {\r\n const data = await loadTruthpack<{ routes: Array<{ method: string; path: string; file?: string; auth?: { required: boolean } }> }>('routes');\r\n \r\n if (!data?.routes) {\r\n const response = formatRoutes({\r\n routes: [],\r\n filters: { method, path: pathFilter },\r\n count: 0,\r\n error: 'Routes truthpack not found. Run truthpack_generate first.',\r\n });\r\n return buildResponse(response);\r\n }\r\n\r\n let routes = data.routes;\r\n\r\n // Apply method filter\r\n if (method) {\r\n routes = routes.filter(r => r.method === method);\r\n }\r\n\r\n // Apply path filter\r\n if (pathFilter) {\r\n const filterRegex = new RegExp(pathFilter.replace(/\\*/g, '.*'), 'i');\r\n routes = routes.filter(r => filterRegex.test(r.path));\r\n }\r\n\r\n const response = formatRoutes({\r\n routes,\r\n filters: { method, path: pathFilter },\r\n count: routes.length,\r\n });\r\n\r\n return buildResponse(response);\r\n } catch (err) {\r\n const response = formatRoutes({\r\n routes: [],\r\n filters: { method, path: pathFilter },\r\n count: 0,\r\n error: err instanceof Error ? err.message : 'Unknown error',\r\n });\r\n return buildResponse(response);\r\n }\r\n }\r\n );\r\n\r\n // Get environment variables\r\n server.tool(\r\n 'truthpack_env',\r\n 'Get environment variables from truthpack',\r\n {\r\n required: z.boolean()\r\n .optional()\r\n .describe('Filter to required variables only'),\r\n sensitive: z.boolean()\r\n .optional()\r\n .describe('Include sensitive variables'),\r\n },\r\n async ({ required, sensitive }) => {\r\n try {\r\n const data = await loadTruthpack<{ variables: Array<{ name: string; required: boolean; sensitive: boolean }> }>('env');\r\n \r\n if (!data?.variables) {\r\n // Build pretty error output\r\n const textParts: string[] = [];\r\n textParts.push(fmt.headerBox(fmt.ICONS.key, 'ENV VARIABLES', '0 variables', 45));\r\n textParts.push('');\r\n textParts.push(` ${fmt.ICONS.error} Env truthpack not found.`);\r\n textParts.push(` Run truthpack_generate first.`);\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify({\r\n variables: [],\r\n filters: { required, sensitive },\r\n error: 'Env truthpack not found. Run truthpack_generate first.',\r\n }, null, 2),\r\n },\r\n {\r\n type: 'text',\r\n text: `\\n---\\n${textParts.join('\\n')}\\n---`,\r\n },\r\n ],\r\n };\r\n }\r\n\r\n let variables = data.variables;\r\n\r\n // Apply required filter\r\n if (required !== undefined) {\r\n variables = variables.filter(v => v.required === required);\r\n }\r\n\r\n // Apply sensitive filter (default: exclude sensitive unless explicitly requested)\r\n if (sensitive === false || sensitive === undefined) {\r\n variables = variables.filter(v => !v.sensitive);\r\n }\r\n\r\n // Build pretty output\r\n const textParts: string[] = [];\r\n textParts.push(fmt.headerBox(fmt.ICONS.key, 'ENV VARIABLES', `${variables.length} variables`, 50));\r\n \r\n if (required !== undefined || sensitive !== undefined) {\r\n textParts.push('');\r\n textParts.push(` Filters: ${required !== undefined ? `required=${required}` : ''} ${sensitive !== undefined ? `sensitive=${sensitive}` : ''}`);\r\n }\r\n\r\n textParts.push('');\r\n\r\n if (variables.length === 0) {\r\n textParts.push(' No variables found');\r\n } else {\r\n // Group by required/optional\r\n const requiredVars = variables.filter(v => v.required);\r\n const optionalVars = variables.filter(v => !v.required);\r\n\r\n if (requiredVars.length > 0) {\r\n textParts.push(`${fmt.ICONS.error} Required (${requiredVars.length})`);\r\n for (const v of requiredVars.slice(0, 10)) {\r\n textParts.push(` ${fmt.BOX.treeEnd} ${v.name}${v.sensitive ? ' 🔒' : ''}`);\r\n }\r\n if (requiredVars.length > 10) {\r\n textParts.push(` ... and ${requiredVars.length - 10} more`);\r\n }\r\n }\r\n\r\n if (optionalVars.length > 0) {\r\n textParts.push('');\r\n textParts.push(`ℹ️ Optional (${optionalVars.length})`);\r\n for (const v of optionalVars.slice(0, 10)) {\r\n textParts.push(` ${fmt.BOX.treeEnd} ${v.name}${v.sensitive ? ' 🔒' : ''}`);\r\n }\r\n if (optionalVars.length > 10) {\r\n textParts.push(` ... and ${optionalVars.length - 10} more`);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify({\r\n variables,\r\n filters: { required, sensitive },\r\n count: variables.length,\r\n }, null, 2),\r\n },\r\n {\r\n type: 'text',\r\n text: `\\n---\\n${textParts.join('\\n')}\\n---`,\r\n },\r\n ],\r\n };\r\n } catch (err) {\r\n const response = formatError(err instanceof Error ? err : 'Unknown error', {\r\n operation: 'truthpack_env',\r\n });\r\n return buildResponse(response);\r\n }\r\n }\r\n );\r\n}\r\n","/**\r\n * MCP UI Styles\r\n *\r\n * Self-contained CSS for MCP tool responses.\r\n * Designed to work in any MCP client with dark/light theme support.\r\n */\r\n\r\nexport const mcpStyles = `\r\n<style>\r\n .vc-mcp {\r\n --vc-bg: #171717;\r\n --vc-bg-subtle: #1f1f1f;\r\n --vc-fg: #fafafa;\r\n --vc-fg-muted: #a1a1aa;\r\n --vc-fg-dim: #71717a;\r\n --vc-border: rgba(255, 255, 255, 0.1);\r\n --vc-brand: #00d4aa;\r\n --vc-success: #22c55e;\r\n --vc-warning: #f59e0b;\r\n --vc-error: #ef4444;\r\n --vc-info: #3b82f6;\r\n \r\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;\r\n font-size: 13px;\r\n line-height: 1.5;\r\n color: var(--vc-fg);\r\n background: var(--vc-bg);\r\n border: 1px solid var(--vc-border);\r\n border-radius: 8px;\r\n overflow: hidden;\r\n max-width: 600px;\r\n }\r\n \r\n @media (prefers-color-scheme: light) {\r\n .vc-mcp {\r\n --vc-bg: #ffffff;\r\n --vc-bg-subtle: #f4f4f5;\r\n --vc-fg: #09090b;\r\n --vc-fg-muted: #52525b;\r\n --vc-fg-dim: #a1a1aa;\r\n --vc-border: rgba(0, 0, 0, 0.1);\r\n }\r\n }\r\n \r\n .vc-mcp-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 12px 16px;\r\n background: var(--vc-bg-subtle);\r\n border-bottom: 1px solid var(--vc-border);\r\n }\r\n \r\n .vc-mcp-title {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n font-weight: 600;\r\n font-size: 14px;\r\n }\r\n \r\n .vc-mcp-icon {\r\n font-size: 16px;\r\n }\r\n \r\n .vc-mcp-version {\r\n font-size: 11px;\r\n color: var(--vc-fg-dim);\r\n font-family: monospace;\r\n }\r\n \r\n .vc-mcp-content {\r\n padding: 16px;\r\n }\r\n \r\n .vc-mcp-footer {\r\n padding: 12px 16px;\r\n background: var(--vc-bg-subtle);\r\n border-top: 1px solid var(--vc-border);\r\n font-size: 11px;\r\n color: var(--vc-fg-dim);\r\n display: flex;\r\n justify-content: space-between;\r\n }\r\n \r\n .vc-mcp-tabs {\r\n display: flex;\r\n border-bottom: 1px solid var(--vc-border);\r\n padding: 0 8px;\r\n }\r\n \r\n .vc-mcp-tab {\r\n padding: 8px 12px;\r\n font-size: 12px;\r\n color: var(--vc-fg-muted);\r\n border-bottom: 2px solid transparent;\r\n cursor: pointer;\r\n }\r\n \r\n .vc-mcp-tab.active {\r\n color: var(--vc-brand);\r\n border-bottom-color: var(--vc-brand);\r\n }\r\n \r\n .vc-mcp-table {\r\n width: 100%;\r\n border-collapse: collapse;\r\n font-size: 12px;\r\n }\r\n \r\n .vc-mcp-table th {\r\n text-align: left;\r\n padding: 8px;\r\n font-weight: 500;\r\n color: var(--vc-fg-dim);\r\n font-size: 10px;\r\n text-transform: uppercase;\r\n letter-spacing: 0.05em;\r\n border-bottom: 1px solid var(--vc-border);\r\n }\r\n \r\n .vc-mcp-table td {\r\n padding: 8px;\r\n border-bottom: 1px solid var(--vc-border);\r\n }\r\n \r\n .vc-mcp-table tr:last-child td {\r\n border-bottom: none;\r\n }\r\n \r\n .vc-mcp-badge {\r\n display: inline-block;\r\n padding: 2px 6px;\r\n border-radius: 4px;\r\n font-size: 10px;\r\n font-weight: 600;\r\n font-family: monospace;\r\n }\r\n \r\n .vc-mcp-badge.get { background: rgba(34, 197, 94, 0.15); color: #22c55e; }\r\n .vc-mcp-badge.post { background: rgba(59, 130, 246, 0.15); color: #3b82f6; }\r\n .vc-mcp-badge.put { background: rgba(245, 158, 11, 0.15); color: #f59e0b; }\r\n .vc-mcp-badge.delete { background: rgba(239, 68, 68, 0.15); color: #ef4444; }\r\n .vc-mcp-badge.patch { background: rgba(168, 85, 247, 0.15); color: #a855f7; }\r\n \r\n .vc-mcp-mono {\r\n font-family: monospace;\r\n font-size: 12px;\r\n }\r\n \r\n .vc-mcp-muted {\r\n color: var(--vc-fg-dim);\r\n }\r\n \r\n /* Verdict Styles */\r\n .vc-mcp-verdict {\r\n border-left: 4px solid;\r\n }\r\n \r\n .vc-mcp-verdict.blocked {\r\n border-left-color: var(--vc-error);\r\n background: linear-gradient(90deg, rgba(239, 68, 68, 0.1) 0%, var(--vc-bg) 50%);\r\n }\r\n \r\n .vc-mcp-verdict.warning {\r\n border-left-color: var(--vc-warning);\r\n background: linear-gradient(90deg, rgba(245, 158, 11, 0.1) 0%, var(--vc-bg) 50%);\r\n }\r\n \r\n .vc-mcp-verdict.allowed {\r\n border-left-color: var(--vc-success);\r\n }\r\n \r\n .vc-mcp-verdict-header {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n padding: 16px;\r\n }\r\n \r\n .vc-mcp-verdict-icon {\r\n font-size: 32px;\r\n }\r\n \r\n .vc-mcp-verdict-status {\r\n font-size: 18px;\r\n font-weight: 700;\r\n text-transform: uppercase;\r\n letter-spacing: 0.05em;\r\n }\r\n \r\n .vc-mcp-verdict-status.blocked { color: var(--vc-error); }\r\n .vc-mcp-verdict-status.warning { color: var(--vc-warning); }\r\n .vc-mcp-verdict-status.allowed { color: var(--vc-success); }\r\n \r\n .vc-mcp-verdict-file {\r\n font-family: monospace;\r\n font-size: 13px;\r\n color: var(--vc-fg-muted);\r\n }\r\n \r\n .vc-mcp-violation {\r\n background: var(--vc-bg-subtle);\r\n border-radius: 6px;\r\n padding: 12px;\r\n margin-bottom: 8px;\r\n }\r\n \r\n .vc-mcp-violation:last-child {\r\n margin-bottom: 0;\r\n }\r\n \r\n .vc-mcp-violation-rule {\r\n display: inline-block;\r\n background: rgba(239, 68, 68, 0.15);\r\n color: var(--vc-error);\r\n font-size: 10px;\r\n font-weight: 600;\r\n padding: 2px 8px;\r\n border-radius: 999px;\r\n margin-bottom: 8px;\r\n }\r\n \r\n .vc-mcp-violation-desc {\r\n font-size: 13px;\r\n color: var(--vc-fg-muted);\r\n margin-bottom: 8px;\r\n }\r\n \r\n .vc-mcp-violation-fix {\r\n font-family: monospace;\r\n font-size: 11px;\r\n background: var(--vc-bg);\r\n padding: 8px;\r\n border-radius: 4px;\r\n color: var(--vc-brand);\r\n overflow-x: auto;\r\n }\r\n \r\n .vc-mcp-steps {\r\n list-style: none;\r\n padding: 0;\r\n margin: 0;\r\n counter-reset: step;\r\n }\r\n \r\n .vc-mcp-step {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n padding: 8px 0;\r\n border-bottom: 1px solid var(--vc-border);\r\n font-size: 13px;\r\n color: var(--vc-fg-muted);\r\n }\r\n \r\n .vc-mcp-step:last-child {\r\n border-bottom: none;\r\n }\r\n \r\n .vc-mcp-step::before {\r\n counter-increment: step;\r\n content: counter(step);\r\n width: 20px;\r\n height: 20px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background: var(--vc-bg-subtle);\r\n border-radius: 50%;\r\n font-size: 11px;\r\n font-weight: 500;\r\n flex-shrink: 0;\r\n }\r\n \r\n .vc-mcp-step.automated::before {\r\n background: var(--vc-brand);\r\n color: white;\r\n }\r\n \r\n .vc-mcp-step.automated {\r\n color: var(--vc-fg);\r\n }\r\n \r\n /* Stats Grid */\r\n .vc-mcp-stats {\r\n display: grid;\r\n grid-template-columns: repeat(3, 1fr);\r\n gap: 8px;\r\n }\r\n \r\n .vc-mcp-stat {\r\n background: var(--vc-bg-subtle);\r\n border-radius: 6px;\r\n padding: 12px;\r\n text-align: center;\r\n }\r\n \r\n .vc-mcp-stat-value {\r\n font-size: 20px;\r\n font-weight: 700;\r\n font-variant-numeric: tabular-nums;\r\n }\r\n \r\n .vc-mcp-stat-label {\r\n font-size: 10px;\r\n color: var(--vc-fg-dim);\r\n margin-top: 4px;\r\n }\r\n \r\n /* Context Layer */\r\n .vc-mcp-layer {\r\n background: var(--vc-bg-subtle);\r\n border-radius: 6px;\r\n padding: 12px;\r\n margin-bottom: 8px;\r\n }\r\n \r\n .vc-mcp-layer:last-child {\r\n margin-bottom: 0;\r\n }\r\n \r\n .vc-mcp-layer-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n margin-bottom: 8px;\r\n }\r\n \r\n .vc-mcp-layer-name {\r\n font-weight: 500;\r\n font-size: 13px;\r\n }\r\n \r\n .vc-mcp-layer-meta {\r\n font-size: 11px;\r\n color: var(--vc-fg-dim);\r\n }\r\n \r\n .vc-mcp-layer-items {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 4px;\r\n }\r\n \r\n .vc-mcp-layer-item {\r\n background: var(--vc-bg);\r\n padding: 2px 8px;\r\n border-radius: 4px;\r\n font-size: 11px;\r\n font-family: monospace;\r\n color: var(--vc-fg-muted);\r\n }\r\n</style>`;\r\n\r\n/**\r\n * Get inline styles as a string (without style tags)\r\n */\r\nexport function getMcpInlineStyles(): string {\r\n return mcpStyles.replace(/<\\/?style>/g, '');\r\n}\r\n","/**\r\n * MCP Response Builder\r\n *\r\n * Generates styled HTML responses for MCP tools.\r\n * Includes comprehensive HTML sanitization and XSS prevention.\r\n *\r\n * @module response-builder\r\n * @security All user content is sanitized to prevent XSS attacks\r\n */\r\n\r\nimport { mcpStyles } from './styles.js';\r\n\r\n// ============================================\r\n// TYPES\r\n// ============================================\r\n\r\nexport interface TruthpackSection {\r\n name: string;\r\n count: number;\r\n items: Array<{\r\n method?: string;\r\n path?: string;\r\n name?: string;\r\n type?: string;\r\n file?: string;\r\n }>;\r\n}\r\n\r\nexport interface Truthpack {\r\n routes: TruthpackSection;\r\n envVars: TruthpackSection;\r\n auth: TruthpackSection;\r\n contracts: TruthpackSection;\r\n types: TruthpackSection;\r\n version: string;\r\n generatedAt: string;\r\n}\r\n\r\nexport interface FirewallViolation {\r\n rule: string;\r\n description: string;\r\n file?: string;\r\n line?: number;\r\n fix?: string;\r\n autoFixable: boolean;\r\n}\r\n\r\nexport interface FirewallVerdict {\r\n status: 'blocked' | 'warning' | 'allowed';\r\n file: string;\r\n violations: FirewallViolation[];\r\n unblockPlan: Array<{\r\n description: string;\r\n automated: boolean;\r\n command?: string;\r\n }>;\r\n}\r\n\r\nexport interface ContextLayer {\r\n name: string;\r\n type: string;\r\n items: string[];\r\n tokens: number;\r\n}\r\n\r\nexport interface ContextResult {\r\n file: string;\r\n layers: ContextLayer[];\r\n totalTokens: number;\r\n freshness: number;\r\n}\r\n\r\n// ============================================\r\n// SECURITY UTILITIES\r\n// ============================================\r\n\r\n/**\r\n * HTML entities for escaping\r\n */\r\nconst HTML_ENTITIES: Readonly<Record<string, string>> = Object.freeze({\r\n '&': '&amp;',\r\n '<': '&lt;',\r\n '>': '&gt;',\r\n '\"': '&quot;',\r\n \"'\": '&#39;',\r\n '/': '&#x2F;',\r\n '`': '&#x60;',\r\n '=': '&#x3D;',\r\n});\r\n\r\n/**\r\n * Escape HTML to prevent XSS attacks\r\n * @param unsafe - Potentially unsafe string\r\n * @returns Escaped safe string\r\n */\r\nfunction escapeHtml(unsafe: unknown): string {\r\n if (unsafe === null || unsafe === undefined) {\r\n return '';\r\n }\r\n\r\n const str = String(unsafe);\r\n return str.replace(/[&<>\"'`=/]/g, (char) => HTML_ENTITIES[char] ?? char);\r\n}\r\n\r\n/**\r\n * Sanitize and truncate a string\r\n * @param str - String to sanitize\r\n * @param maxLength - Maximum length\r\n * @returns Sanitized and truncated string\r\n */\r\nfunction sanitizeString(str: unknown, maxLength = 500): string {\r\n if (str === null || str === undefined) {\r\n return '';\r\n }\r\n\r\n let sanitized = String(str);\r\n\r\n // Remove null bytes and control characters\r\n sanitized = sanitized.replace(/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]/g, '');\r\n\r\n // Truncate if too long\r\n if (sanitized.length > maxLength) {\r\n sanitized = sanitized.substring(0, maxLength - 3) + '...';\r\n }\r\n\r\n return sanitized;\r\n}\r\n\r\n/**\r\n * Validate and sanitize a URL\r\n * @param url - URL to validate\r\n * @returns Sanitized URL or empty string if unsafe\r\n */\r\nfunction sanitizeUrl(url: unknown): string {\r\n if (typeof url !== 'string') {\r\n return '';\r\n }\r\n\r\n const trimmed = url.trim().toLowerCase();\r\n\r\n // Block dangerous protocols\r\n const dangerousProtocols = ['javascript:', 'data:', 'vbscript:', 'file:'];\r\n for (const protocol of dangerousProtocols) {\r\n if (trimmed.startsWith(protocol)) {\r\n return '';\r\n }\r\n }\r\n\r\n return escapeHtml(url);\r\n}\r\n\r\n/**\r\n * Validate a number and return a safe value\r\n * @param num - Number to validate\r\n * @param defaultValue - Default if invalid\r\n * @param min - Minimum value\r\n * @param max - Maximum value\r\n * @returns Safe number\r\n */\r\nfunction safeNumber(\r\n num: unknown,\r\n defaultValue = 0,\r\n min = 0,\r\n max = Number.MAX_SAFE_INTEGER\r\n): number {\r\n if (typeof num !== 'number' || !Number.isFinite(num)) {\r\n return defaultValue;\r\n }\r\n return Math.min(max, Math.max(min, Math.floor(num)));\r\n}\r\n\r\n/**\r\n * Validate an HTTP method\r\n * @param method - Method to validate\r\n * @returns Validated method or 'GET'\r\n */\r\nfunction validateMethod(method: unknown): string {\r\n const validMethods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'];\r\n const upper = String(method ?? 'GET').toUpperCase();\r\n return validMethods.includes(upper) ? upper : 'GET';\r\n}\r\n\r\n/**\r\n * Validate a status type\r\n * @param status - Status to validate\r\n * @returns Validated status\r\n */\r\nfunction validateStatus(status: unknown): 'blocked' | 'warning' | 'allowed' {\r\n const validStatuses = ['blocked', 'warning', 'allowed'];\r\n const lower = String(status ?? 'allowed').toLowerCase();\r\n return validStatuses.includes(lower) ? (lower as 'blocked' | 'warning' | 'allowed') : 'allowed';\r\n}\r\n\r\n/**\r\n * Validate a date string\r\n * @param dateStr - Date string to validate\r\n * @returns Valid date string or current date\r\n */\r\nfunction validateDate(dateStr: unknown): string {\r\n if (typeof dateStr !== 'string') {\r\n return new Date().toISOString();\r\n }\r\n\r\n try {\r\n const date = new Date(dateStr);\r\n if (Number.isNaN(date.getTime())) {\r\n return new Date().toISOString();\r\n }\r\n return date.toLocaleString();\r\n } catch {\r\n return new Date().toISOString();\r\n }\r\n}\r\n\r\n// ============================================\r\n// BUILDERS\r\n// ============================================\r\n\r\n/**\r\n * Build HTML for truthpack viewer\r\n * @param truthpack - Truthpack data\r\n * @returns Safe HTML string\r\n */\r\nexport function buildTruthpackViewerHtml(truthpack: Truthpack): string {\r\n // Validate inputs\r\n const version = escapeHtml(sanitizeString(truthpack?.version ?? '1.0.0', 20));\r\n const generatedAt = validateDate(truthpack?.generatedAt);\r\n\r\n // Build sections with validation\r\n const sections = [\r\n { key: 'routes', label: 'Routes', icon: '🔗' },\r\n { key: 'envVars', label: 'Env Vars', icon: '🔑' },\r\n { key: 'auth', label: 'Auth', icon: '🛡️' },\r\n { key: 'contracts', label: 'Contracts', icon: '📝' },\r\n { key: 'types', label: 'Types', icon: '📋' },\r\n ];\r\n\r\n const tabsHtml = sections\r\n .map((s, i) => {\r\n const section = truthpack?.[s.key as keyof Truthpack] as TruthpackSection | undefined;\r\n const count = safeNumber(section?.count, 0, 0, 99999);\r\n const active = i === 0 ? ' active' : '';\r\n return `<div class=\"vc-mcp-tab${active}\">${s.icon} ${escapeHtml(s.label)} (${count})</div>`;\r\n })\r\n .join('');\r\n\r\n // Build routes table (primary view) with validation\r\n const routes = Array.isArray(truthpack?.routes?.items) ? truthpack.routes.items : [];\r\n const validRoutes = routes.slice(0, 15).filter((r) => r && typeof r === 'object');\r\n\r\n const routesHtml =\r\n validRoutes.length > 0\r\n ? `<table class=\"vc-mcp-table\">\r\n <thead>\r\n <tr>\r\n <th>Method</th>\r\n <th>Path</th>\r\n <th>Handler</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n ${validRoutes\r\n .map((r) => {\r\n const method = validateMethod(r.method);\r\n const path = escapeHtml(sanitizeString(r.path, 100));\r\n const file = escapeHtml(sanitizeString(r.file, 100));\r\n return `\r\n <tr>\r\n <td><span class=\"vc-mcp-badge ${method.toLowerCase()}\">${method}</span></td>\r\n <td class=\"vc-mcp-mono\">${path}</td>\r\n <td class=\"vc-mcp-mono vc-mcp-muted\">${file}</td>\r\n </tr>\r\n `;\r\n })\r\n .join('')}\r\n </tbody>\r\n </table>\r\n ${routes.length > 15 ? `<div class=\"vc-mcp-muted\" style=\"padding: 8px; font-size: 11px;\">... and ${safeNumber(routes.length - 15)} more</div>` : ''}`\r\n : '<div style=\"padding: 16px; text-align: center; color: var(--vc-fg-dim);\">No routes found</div>';\r\n\r\n const routeCount = safeNumber(truthpack?.routes?.count, 0);\r\n const envVarCount = safeNumber(truthpack?.envVars?.count, 0);\r\n const typeCount = safeNumber(truthpack?.types?.count, 0);\r\n\r\n return `\r\n${mcpStyles}\r\n<div class=\"vc-mcp\">\r\n <div class=\"vc-mcp-header\">\r\n <div class=\"vc-mcp-title\">\r\n <span class=\"vc-mcp-icon\">📋</span>\r\n <span>Truthpack Viewer</span>\r\n </div>\r\n <span class=\"vc-mcp-version\">v${version}</span>\r\n </div>\r\n \r\n <div class=\"vc-mcp-tabs\">\r\n ${tabsHtml}\r\n </div>\r\n \r\n <div class=\"vc-mcp-content\">\r\n ${routesHtml}\r\n </div>\r\n \r\n <div class=\"vc-mcp-footer\">\r\n <span>Generated: ${generatedAt}</span>\r\n <span>${routeCount} routes • ${envVarCount} env vars • ${typeCount} types</span>\r\n </div>\r\n</div>`;\r\n}\r\n\r\n/**\r\n * Build HTML for firewall verdict\r\n * @param verdict - Firewall verdict data\r\n * @returns Safe HTML string\r\n */\r\nexport function buildFirewallResultHtml(verdict: FirewallVerdict): string {\r\n // Validate status\r\n const status = validateStatus(verdict?.status);\r\n const file = escapeHtml(sanitizeString(verdict?.file ?? 'unknown', 200));\r\n\r\n const statusIcons: Record<string, string> = {\r\n blocked: '🛑',\r\n warning: '⚠️',\r\n allowed: '✅',\r\n };\r\n\r\n // Validate and sanitize violations\r\n const violations = Array.isArray(verdict?.violations) ? verdict.violations : [];\r\n const validViolations = violations\r\n .slice(0, 20) // Limit to 20 violations\r\n .filter((v) => v && typeof v === 'object');\r\n\r\n const violationsHtml =\r\n validViolations.length > 0\r\n ? validViolations\r\n .map((v) => {\r\n const rule = escapeHtml(sanitizeString(v.rule, 50));\r\n const description = escapeHtml(sanitizeString(v.description, 200));\r\n const fix = v.fix ? escapeHtml(sanitizeString(v.fix, 200)) : '';\r\n\r\n return `\r\n <div class=\"vc-mcp-violation\">\r\n <div class=\"vc-mcp-violation-rule\">${rule}</div>\r\n <div class=\"vc-mcp-violation-desc\">${description}</div>\r\n ${fix ? `<div class=\"vc-mcp-violation-fix\">${fix}</div>` : ''}\r\n </div>\r\n `;\r\n })\r\n .join('')\r\n : '<div style=\"padding: 16px; text-align: center; color: var(--vc-success);\">✓ No violations</div>';\r\n\r\n // Validate and sanitize unblock plan\r\n const unblockPlan = Array.isArray(verdict?.unblockPlan) ? verdict.unblockPlan : [];\r\n const validSteps = unblockPlan\r\n .slice(0, 10) // Limit to 10 steps\r\n .filter((s) => s && typeof s === 'object');\r\n\r\n const stepsHtml =\r\n status !== 'allowed' && validSteps.length > 0\r\n ? `\r\n <div style=\"padding: 16px; border-top: 1px solid var(--vc-border);\">\r\n <div style=\"font-weight: 600; margin-bottom: 12px;\">🔓 Unblock Plan</div>\r\n <ol class=\"vc-mcp-steps\">\r\n ${validSteps\r\n .map((step) => {\r\n const description = escapeHtml(sanitizeString(step.description, 200));\r\n const automated = Boolean(step.automated);\r\n return `<li class=\"vc-mcp-step${automated ? ' automated' : ''}\">${description}</li>`;\r\n })\r\n .join('')}\r\n </ol>\r\n </div>\r\n `\r\n : '';\r\n\r\n return `\r\n${mcpStyles}\r\n<div class=\"vc-mcp vc-mcp-verdict ${status}\">\r\n <div class=\"vc-mcp-verdict-header\">\r\n <div class=\"vc-mcp-verdict-icon\">${statusIcons[status]}</div>\r\n <div>\r\n <div class=\"vc-mcp-verdict-status ${status}\">${status.toUpperCase()}</div>\r\n <div class=\"vc-mcp-verdict-file\">${file}</div>\r\n </div>\r\n </div>\r\n \r\n <div class=\"vc-mcp-content\">\r\n <div style=\"font-weight: 500; margin-bottom: 12px;\">Violations (${safeNumber(validViolations.length)})</div>\r\n ${violationsHtml}\r\n </div>\r\n \r\n ${stepsHtml}\r\n</div>`;\r\n}\r\n\r\n/**\r\n * Build HTML for context preview\r\n * @param context - Context data\r\n * @returns Safe HTML string\r\n */\r\nexport function buildContextPreviewHtml(context: ContextResult): string {\r\n // Validate inputs\r\n const file = escapeHtml(sanitizeString(context?.file ?? 'unknown', 100));\r\n const totalTokens = safeNumber(context?.totalTokens, 0, 0, 1_000_000);\r\n const freshness = safeNumber(context?.freshness, 0, 0, 100);\r\n\r\n // Validate layers\r\n const layers = Array.isArray(context?.layers) ? context.layers : [];\r\n const validLayers = layers\r\n .slice(0, 10) // Limit to 10 layers\r\n .filter((l) => l && typeof l === 'object');\r\n\r\n const layerIcons: Record<string, string> = {\r\n truthpack: '📋',\r\n file: '📄',\r\n convention: '✨',\r\n type: '📝',\r\n import: '📦',\r\n };\r\n\r\n const layersHtml = validLayers\r\n .map((layer) => {\r\n const name = escapeHtml(sanitizeString(layer.name, 50));\r\n const type = sanitizeString(layer.type, 20);\r\n const tokens = safeNumber(layer.tokens, 0, 0, 100_000);\r\n const items = Array.isArray(layer.items) ? layer.items : [];\r\n const validItems = items.slice(0, 8).map((item) => escapeHtml(sanitizeString(item, 50)));\r\n const icon = layerIcons[type] ?? '📁';\r\n\r\n return `\r\n <div class=\"vc-mcp-layer\">\r\n <div class=\"vc-mcp-layer-header\">\r\n <div class=\"vc-mcp-layer-name\">${icon} ${name}</div>\r\n <div class=\"vc-mcp-layer-meta\">${validItems.length} items • ${tokens.toLocaleString()} tokens</div>\r\n </div>\r\n ${\r\n validItems.length > 0\r\n ? `\r\n <div class=\"vc-mcp-layer-items\">\r\n ${validItems.map((item) => `<span class=\"vc-mcp-layer-item\">${item}</span>`).join('')}\r\n ${items.length > 8 ? `<span class=\"vc-mcp-layer-item\">+${safeNumber(items.length - 8)} more</span>` : ''}\r\n </div>\r\n `\r\n : ''\r\n }\r\n </div>\r\n `;\r\n })\r\n .join('');\r\n\r\n const freshnessColor =\r\n freshness >= 80 ? 'var(--vc-success)' : freshness >= 50 ? 'var(--vc-warning)' : 'var(--vc-error)';\r\n\r\n return `\r\n${mcpStyles}\r\n<div class=\"vc-mcp\">\r\n <div class=\"vc-mcp-header\">\r\n <div class=\"vc-mcp-title\">\r\n <span class=\"vc-mcp-icon\">📄</span>\r\n <span>Context for ${file}</span>\r\n </div>\r\n <span style=\"color: ${freshnessColor}; font-size: 12px;\">${freshness}% fresh</span>\r\n </div>\r\n \r\n <div class=\"vc-mcp-content\">\r\n ${layersHtml || '<div style=\"padding: 16px; text-align: center; color: var(--vc-fg-dim);\">No context layers</div>'}\r\n </div>\r\n \r\n <div class=\"vc-mcp-footer\">\r\n <span>${validLayers.length} layers</span>\r\n <span>${totalTokens.toLocaleString()} total tokens</span>\r\n </div>\r\n</div>`;\r\n}\r\n\r\n/**\r\n * Build HTML for stats summary\r\n * @param stats - Statistics data\r\n * @returns Safe HTML string\r\n */\r\nexport function buildStatsHtml(stats: {\r\n totalChecks: number;\r\n blocked: number;\r\n allowed: number;\r\n warnings?: number;\r\n}): string {\r\n // Validate all numbers\r\n const totalChecks = safeNumber(stats?.totalChecks, 0, 0, 1_000_000_000);\r\n const blocked = safeNumber(stats?.blocked, 0, 0, 1_000_000_000);\r\n const allowed = safeNumber(stats?.allowed, 0, 0, 1_000_000_000);\r\n\r\n return `\r\n${mcpStyles}\r\n<div class=\"vc-mcp\">\r\n <div class=\"vc-mcp-header\">\r\n <div class=\"vc-mcp-title\">\r\n <span class=\"vc-mcp-icon\">📊</span>\r\n <span>Firewall Statistics</span>\r\n </div>\r\n </div>\r\n \r\n <div class=\"vc-mcp-content\">\r\n <div class=\"vc-mcp-stats\">\r\n <div class=\"vc-mcp-stat\">\r\n <div class=\"vc-mcp-stat-value\">${totalChecks.toLocaleString()}</div>\r\n <div class=\"vc-mcp-stat-label\">Total Checks</div>\r\n </div>\r\n <div class=\"vc-mcp-stat\">\r\n <div class=\"vc-mcp-stat-value\" style=\"color: var(--vc-error);\">${blocked.toLocaleString()}</div>\r\n <div class=\"vc-mcp-stat-label\">Blocked</div>\r\n </div>\r\n <div class=\"vc-mcp-stat\">\r\n <div class=\"vc-mcp-stat-value\" style=\"color: var(--vc-success);\">${allowed.toLocaleString()}</div>\r\n <div class=\"vc-mcp-stat-label\">Allowed</div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>`;\r\n}\r\n\r\n/**\r\n * Build a simple message HTML\r\n * @param message - Message text\r\n * @param type - Message type\r\n * @returns Safe HTML string\r\n */\r\nexport function buildMessageHtml(\r\n message: string,\r\n type: 'info' | 'success' | 'warning' | 'error' = 'info'\r\n): string {\r\n const icons: Record<string, string> = {\r\n info: 'ℹ️',\r\n success: '✅',\r\n warning: '⚠️',\r\n error: '❌',\r\n };\r\n\r\n const sanitizedMessage = escapeHtml(sanitizeString(message, 500));\r\n const icon = icons[type] ?? icons.info;\r\n\r\n return `\r\n${mcpStyles}\r\n<div class=\"vc-mcp\">\r\n <div class=\"vc-mcp-content\" style=\"text-align: center; padding: 24px;\">\r\n <div style=\"font-size: 32px; margin-bottom: 12px;\">${icon}</div>\r\n <div>${sanitizedMessage}</div>\r\n </div>\r\n</div>`;\r\n}\r\n\r\n/**\r\n * Build an error HTML response\r\n * @param error - Error message or Error object\r\n * @returns Safe HTML string\r\n */\r\nexport function buildErrorHtml(error: unknown): string {\r\n let message: string;\r\n\r\n if (error instanceof Error) {\r\n message = error.message;\r\n } else if (typeof error === 'string') {\r\n message = error;\r\n } else {\r\n message = 'An unknown error occurred';\r\n }\r\n\r\n return buildMessageHtml(message, 'error');\r\n}\r\n","/**\r\n * Text Formatters for MCP Tool Responses\r\n *\r\n * Creates visually appealing ASCII/Unicode formatted output\r\n * that works in any MCP client (Cursor, Claude Desktop, etc.)\r\n *\r\n * @module text-formatters\r\n */\r\n\r\n// ============================================\r\n// BOX DRAWING CHARACTERS\r\n// ============================================\r\n\r\nexport const BOX = {\r\n // Rounded corners (modern look)\r\n topLeft: '╭',\r\n topRight: '╮',\r\n bottomLeft: '╰',\r\n bottomRight: '╯',\r\n horizontal: '─',\r\n vertical: '│',\r\n leftT: '├',\r\n rightT: '┤',\r\n topT: '┬',\r\n bottomT: '┴',\r\n cross: '┼',\r\n\r\n // Double line (for emphasis)\r\n dblHorizontal: '═',\r\n dblVertical: '║',\r\n dblTopLeft: '╔',\r\n dblTopRight: '╗',\r\n dblBottomLeft: '╚',\r\n dblBottomRight: '╝',\r\n\r\n // Tree characters\r\n treeBranch: '├─',\r\n treeEnd: '└─',\r\n treeVertical: '│ ',\r\n} as const;\r\n\r\n// ============================================\r\n// STATUS ICONS\r\n// ============================================\r\n\r\nexport const ICONS = {\r\n // Status\r\n success: '✅',\r\n error: '❌',\r\n warning: '⚠️',\r\n info: 'ℹ️',\r\n pending: '⏳',\r\n blocked: '🛑',\r\n allowed: '✓',\r\n \r\n // Actions\r\n check: '✓',\r\n cross: '✗',\r\n arrow: '→',\r\n arrowRight: '▸',\r\n bullet: '•',\r\n \r\n // Categories\r\n fire: '🔥',\r\n shield: '🛡️',\r\n lock: '🔒',\r\n unlock: '🔓',\r\n key: '🔑',\r\n file: '📄',\r\n folder: '📁',\r\n package: '📦',\r\n route: '🔗',\r\n database: '🗄️',\r\n clock: '⏱️',\r\n chart: '📊',\r\n truthpack: '📋',\r\n gear: '⚙️',\r\n sparkle: '✨',\r\n \r\n // HTTP Methods\r\n get: '🟢',\r\n post: '🔵',\r\n put: '🟡',\r\n patch: '🟣',\r\n delete: '🔴',\r\n} as const;\r\n\r\n// ============================================\r\n// FORMATTING UTILITIES\r\n// ============================================\r\n\r\n/**\r\n * Create a horizontal line\r\n */\r\nexport function line(width: number, char = BOX.horizontal): string {\r\n return char.repeat(width);\r\n}\r\n\r\n/**\r\n * Center text within a given width\r\n */\r\nexport function center(text: string, width: number): string {\r\n const padding = Math.max(0, width - text.length);\r\n const leftPad = Math.floor(padding / 2);\r\n const rightPad = padding - leftPad;\r\n return ' '.repeat(leftPad) + text + ' '.repeat(rightPad);\r\n}\r\n\r\n/**\r\n * Pad text to the right\r\n */\r\nexport function padRight(text: string, width: number): string {\r\n return text + ' '.repeat(Math.max(0, width - text.length));\r\n}\r\n\r\n/**\r\n * Pad text to the left\r\n */\r\nexport function padLeft(text: string, width: number): string {\r\n return ' '.repeat(Math.max(0, width - text.length)) + text;\r\n}\r\n\r\n/**\r\n * Truncate text with ellipsis\r\n */\r\nexport function truncate(text: string, maxLength: number): string {\r\n if (text.length <= maxLength) return text;\r\n return text.slice(0, maxLength - 1) + '…';\r\n}\r\n\r\n// ============================================\r\n// BOX BUILDERS\r\n// ============================================\r\n\r\n/**\r\n * Create a simple box around content\r\n */\r\nexport function box(title: string, content: string[], width = 45): string {\r\n const innerWidth = width - 2;\r\n const lines: string[] = [];\r\n\r\n // Top border with title\r\n const titleText = ` ${title} `;\r\n const titlePadding = innerWidth - titleText.length;\r\n const leftPad = Math.floor(titlePadding / 2);\r\n const rightPad = titlePadding - leftPad;\r\n\r\n lines.push(\r\n BOX.topLeft +\r\n line(leftPad) +\r\n titleText +\r\n line(rightPad) +\r\n BOX.topRight\r\n );\r\n\r\n // Content\r\n for (const row of content) {\r\n lines.push(BOX.vertical + ' ' + padRight(row, innerWidth - 1) + BOX.vertical);\r\n }\r\n\r\n // Bottom border\r\n lines.push(BOX.bottomLeft + line(innerWidth) + BOX.bottomRight);\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\n/**\r\n * Create a header box (highlighted)\r\n */\r\nexport function headerBox(\r\n icon: string,\r\n title: string,\r\n subtitle?: string,\r\n width = 45\r\n): string {\r\n const innerWidth = width - 2;\r\n const lines: string[] = [];\r\n\r\n lines.push(BOX.topLeft + line(innerWidth) + BOX.topRight);\r\n lines.push(BOX.vertical + ' ' + padRight(`${icon} ${title}`, innerWidth - 1) + BOX.vertical);\r\n \r\n if (subtitle) {\r\n lines.push(BOX.vertical + ' ' + padRight(subtitle, innerWidth - 1) + BOX.vertical);\r\n }\r\n \r\n lines.push(BOX.bottomLeft + line(innerWidth) + BOX.bottomRight);\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\n/**\r\n * Create a status line\r\n */\r\nexport function statusLine(label: string, value: string, icon?: string): string {\r\n const prefix = icon ? `${icon} ` : '';\r\n return `${prefix}${label}: ${value}`;\r\n}\r\n\r\n// ============================================\r\n// TABLE BUILDER\r\n// ============================================\r\n\r\ninterface TableColumn {\r\n header: string;\r\n key: string;\r\n width?: number;\r\n align?: 'left' | 'right' | 'center';\r\n}\r\n\r\n/**\r\n * Create a formatted table\r\n */\r\nexport function table(\r\n columns: TableColumn[],\r\n data: Array<Record<string, unknown>>,\r\n maxRows = 10\r\n): string {\r\n // Calculate column widths\r\n const colWidths = columns.map((col) => {\r\n const headerLen = col.header.length;\r\n const maxDataLen = data.slice(0, maxRows).reduce((max, row) => {\r\n const val = String(row[col.key] ?? '');\r\n return Math.max(max, val.length);\r\n }, 0);\r\n return col.width ?? Math.min(30, Math.max(headerLen, maxDataLen) + 2);\r\n });\r\n\r\n const totalWidth = colWidths.reduce((sum, w) => sum + w, 0) + columns.length + 1;\r\n const lines: string[] = [];\r\n\r\n // Header separator\r\n lines.push(BOX.topLeft + colWidths.map((w) => line(w)).join(BOX.topT) + BOX.topRight);\r\n\r\n // Header row\r\n const headerRow = columns\r\n .map((col, i) => center(col.header, colWidths[i] ?? 10))\r\n .join(BOX.vertical);\r\n lines.push(BOX.vertical + headerRow + BOX.vertical);\r\n\r\n // Header/body separator\r\n lines.push(BOX.leftT + colWidths.map((w) => line(w)).join(BOX.cross) + BOX.rightT);\r\n\r\n // Data rows\r\n const displayData = data.slice(0, maxRows);\r\n for (const row of displayData) {\r\n const dataRow = columns\r\n .map((col, i) => {\r\n const width = colWidths[i] ?? 10;\r\n const val = truncate(String(row[col.key] ?? ''), width - 2);\r\n if (col.align === 'right') return padLeft(val, width);\r\n if (col.align === 'center') return center(val, width);\r\n return ' ' + padRight(val, width - 1);\r\n })\r\n .join(BOX.vertical);\r\n lines.push(BOX.vertical + dataRow + BOX.vertical);\r\n }\r\n\r\n // Bottom border\r\n lines.push(BOX.bottomLeft + colWidths.map((w) => line(w)).join(BOX.bottomT) + BOX.bottomRight);\r\n\r\n // Show truncation notice\r\n if (data.length > maxRows) {\r\n lines.push(` ... and ${data.length - maxRows} more rows`);\r\n }\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\n// ============================================\r\n// TREE BUILDER\r\n// ============================================\r\n\r\ninterface TreeNode {\r\n label: string;\r\n icon?: string;\r\n children?: TreeNode[];\r\n}\r\n\r\n/**\r\n * Create a tree view\r\n */\r\nexport function tree(nodes: TreeNode[], prefix = ''): string {\r\n const lines: string[] = [];\r\n\r\n nodes.forEach((node, index) => {\r\n const isLast = index === nodes.length - 1;\r\n const connector = isLast ? BOX.treeEnd : BOX.treeBranch;\r\n const icon = node.icon ? `${node.icon} ` : '';\r\n \r\n lines.push(`${prefix}${connector} ${icon}${node.label}`);\r\n\r\n if (node.children && node.children.length > 0) {\r\n const childPrefix = prefix + (isLast ? ' ' : BOX.treeVertical + ' ');\r\n lines.push(tree(node.children, childPrefix));\r\n }\r\n });\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\n// ============================================\r\n// PROGRESS & STATS\r\n// ============================================\r\n\r\n/**\r\n * Create a progress bar\r\n */\r\nexport function progressBar(\r\n value: number,\r\n max: number,\r\n width = 20,\r\n filled = '█',\r\n empty = '░'\r\n): string {\r\n const percentage = Math.min(1, Math.max(0, value / max));\r\n const filledCount = Math.round(percentage * width);\r\n const emptyCount = width - filledCount;\r\n const percentText = `${Math.round(percentage * 100)}%`;\r\n \r\n return `[${filled.repeat(filledCount)}${empty.repeat(emptyCount)}] ${percentText}`;\r\n}\r\n\r\n/**\r\n * Create stats grid\r\n */\r\nexport function statsGrid(\r\n stats: Array<{ label: string; value: string | number; icon?: string }>\r\n): string {\r\n return stats\r\n .map((s) => {\r\n const icon = s.icon ? `${s.icon} ` : '';\r\n return `${icon}${s.value} ${s.label}`;\r\n })\r\n .join(' │ ');\r\n}\r\n\r\n// ============================================\r\n// VERDICT FORMATTERS\r\n// ============================================\r\n\r\ntype VerdictStatus = 'allowed' | 'blocked' | 'warning';\r\n\r\n/**\r\n * Format a firewall verdict\r\n */\r\nexport function formatVerdict(\r\n status: VerdictStatus,\r\n file: string,\r\n details?: string[]\r\n): string {\r\n const statusConfig: Record<VerdictStatus, { icon: string; label: string; border: string }> = {\r\n allowed: { icon: ICONS.success, label: 'ALLOWED', border: '─' },\r\n blocked: { icon: ICONS.blocked, label: 'BLOCKED', border: '━' },\r\n warning: { icon: ICONS.warning, label: 'WARNING', border: '╌' },\r\n };\r\n\r\n const config = statusConfig[status];\r\n const lines: string[] = [];\r\n const width = 45;\r\n\r\n // Header\r\n lines.push(config.border.repeat(width));\r\n lines.push(`${config.icon} ${config.label}`);\r\n lines.push(` File: ${truncate(file, width - 10)}`);\r\n lines.push(config.border.repeat(width));\r\n\r\n // Details\r\n if (details && details.length > 0) {\r\n lines.push('');\r\n for (const detail of details) {\r\n lines.push(` ${ICONS.arrowRight} ${detail}`);\r\n }\r\n }\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\n// ============================================\r\n// SECTION FORMATTERS\r\n// ============================================\r\n\r\n/**\r\n * Format a section with header\r\n */\r\nexport function section(title: string, content: string, icon?: string): string {\r\n const header = icon ? `${icon} ${title}` : title;\r\n return `\\n${header}\\n${'─'.repeat(header.length)}\\n${content}`;\r\n}\r\n\r\n/**\r\n * Format key-value pairs\r\n */\r\nexport function keyValue(pairs: Array<[string, string | number | boolean]>): string {\r\n const maxKeyLen = Math.max(...pairs.map(([k]) => k.length));\r\n return pairs\r\n .map(([key, value]) => ` ${padRight(key + ':', maxKeyLen + 1)} ${value}`)\r\n .join('\\n');\r\n}\r\n\r\n/**\r\n * Format a list with bullets\r\n */\r\nexport function bulletList(items: string[], bullet: string = ICONS.bullet): string {\r\n return items.map((item) => ` ${bullet} ${item}`).join('\\n');\r\n}\r\n\r\n/**\r\n * Format a numbered list\r\n */\r\nexport function numberedList(items: string[]): string {\r\n return items.map((item, i) => ` ${i + 1}. ${item}`).join('\\n');\r\n}\r\n\r\n// ============================================\r\n// HTTP METHOD BADGE\r\n// ============================================\r\n\r\n/**\r\n * Format HTTP method with icon\r\n */\r\nexport function httpMethod(method: string): string {\r\n const icons: Record<string, string> = {\r\n GET: ICONS.get,\r\n POST: ICONS.post,\r\n PUT: ICONS.put,\r\n PATCH: ICONS.patch,\r\n DELETE: ICONS.delete,\r\n };\r\n return `${icons[method.toUpperCase()] ?? '⚪'} ${method.toUpperCase()}`;\r\n}\r\n\r\n// ============================================\r\n// TIMESTAMP FORMATTER\r\n// ============================================\r\n\r\n/**\r\n * Format timestamp\r\n */\r\nexport function timestamp(date?: Date | string): string {\r\n const d = date ? new Date(date) : new Date();\r\n return `${ICONS.clock} ${d.toLocaleString()}`;\r\n}\r\n\r\n/**\r\n * Format duration in ms\r\n */\r\nexport function duration(ms: number): string {\r\n if (ms < 1000) return `${ms}ms`;\r\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\r\n return `${(ms / 60000).toFixed(1)}m`;\r\n}\r\n","/**\r\n * Unified Response Builder for MCP Tools\r\n *\r\n * Generates responses with multiple format options:\r\n * - JSON: Structured data for programmatic use\r\n * - Text: Pretty formatted output for display\r\n * - HTML: Rich styled output for supporting clients\r\n *\r\n * @module unified-response\r\n */\r\n\r\nimport * as fmt from './text-formatters.js';\r\nimport { mcpStyles } from './styles.js';\r\nimport {\r\n buildTruthpackViewerHtml,\r\n buildFirewallResultHtml,\r\n buildContextPreviewHtml,\r\n buildStatsHtml,\r\n buildMessageHtml,\r\n type Truthpack,\r\n type FirewallVerdict,\r\n type ContextResult,\r\n} from './response-builder.js';\r\n\r\n// ============================================\r\n// TYPES\r\n// ============================================\r\n\r\nexport interface UnifiedResponse {\r\n /** Structured JSON data */\r\n data: Record<string, unknown>;\r\n /** Pretty text format for display */\r\n text: string;\r\n /** HTML format for rich clients (optional) */\r\n html?: string;\r\n}\r\n\r\nexport type ResponseFormat = 'json' | 'text' | 'html' | 'all';\r\n\r\n// ============================================\r\n// FIREWALL RESPONSES\r\n// ============================================\r\n\r\nexport interface FirewallEvaluateData {\r\n allowed: boolean;\r\n action: string;\r\n target: string;\r\n claims?: Array<{\r\n type: string;\r\n value: string;\r\n verified: boolean;\r\n }>;\r\n violations?: Array<{\r\n policy: string;\r\n message: string;\r\n }>;\r\n unblockPlan?: Array<{\r\n description: string;\r\n automated: boolean;\r\n }>;\r\n duration?: number;\r\n}\r\n\r\n/**\r\n * Format firewall evaluation response\r\n */\r\nexport function formatFirewallEvaluate(data: FirewallEvaluateData): UnifiedResponse {\r\n const status = data.allowed ? 'allowed' : 'blocked';\r\n\r\n // Build text output\r\n const textParts: string[] = [];\r\n\r\n // Header\r\n textParts.push(\r\n fmt.headerBox(\r\n data.allowed ? fmt.ICONS.success : fmt.ICONS.blocked,\r\n 'FIREWALL EVALUATION',\r\n `Status: ${status.toUpperCase()}`,\r\n 50\r\n )\r\n );\r\n\r\n textParts.push('');\r\n\r\n // File info\r\n textParts.push(fmt.keyValue([\r\n ['Action', data.action],\r\n ['Target', data.target],\r\n ['Result', data.allowed ? '✓ Allowed' : '✗ Blocked'],\r\n ]));\r\n\r\n // Claims verified\r\n if (data.claims && data.claims.length > 0) {\r\n textParts.push('');\r\n textParts.push(fmt.section('Claims Verified', '', fmt.ICONS.check));\r\n \r\n const claimTree = data.claims.map((c) => ({\r\n label: `${c.value}`,\r\n icon: c.verified ? '✓' : '✗',\r\n }));\r\n textParts.push(fmt.tree(claimTree));\r\n }\r\n\r\n // Violations\r\n if (data.violations && data.violations.length > 0) {\r\n textParts.push('');\r\n textParts.push(fmt.section('Violations', '', fmt.ICONS.error));\r\n \r\n for (const v of data.violations) {\r\n textParts.push(` ${fmt.ICONS.arrowRight} [${v.policy}] ${v.message}`);\r\n }\r\n }\r\n\r\n // Unblock plan\r\n if (data.unblockPlan && data.unblockPlan.length > 0 && !data.allowed) {\r\n textParts.push('');\r\n textParts.push(fmt.section('Unblock Plan', '', fmt.ICONS.unlock));\r\n \r\n const steps = data.unblockPlan.map(\r\n (s, i) => `${s.automated ? '⚡' : '👤'} ${s.description}`\r\n );\r\n textParts.push(fmt.numberedList(steps));\r\n }\r\n\r\n // Duration\r\n if (data.duration) {\r\n textParts.push('');\r\n textParts.push(`${fmt.ICONS.clock} Checked in ${fmt.duration(data.duration)}`);\r\n }\r\n\r\n // Build HTML (using existing builder)\r\n const htmlVerdict: FirewallVerdict = {\r\n status: data.allowed ? 'allowed' : data.violations?.length ? 'blocked' : 'warning',\r\n file: data.target,\r\n violations: (data.violations ?? []).map((v) => ({\r\n rule: v.policy,\r\n description: v.message,\r\n autoFixable: false,\r\n })),\r\n unblockPlan: (data.unblockPlan ?? []).map((s) => ({\r\n description: s.description,\r\n automated: s.automated,\r\n })),\r\n };\r\n\r\n return {\r\n data: data as unknown as Record<string, unknown>,\r\n text: textParts.join('\\n'),\r\n html: buildFirewallResultHtml(htmlVerdict),\r\n };\r\n}\r\n\r\n/**\r\n * Format firewall status response\r\n */\r\nexport function formatFirewallStatus(data: {\r\n enabled: boolean;\r\n mode: string;\r\n modeDescription: string;\r\n statistics: {\r\n totalChecks: number;\r\n blocked: number;\r\n allowed: number;\r\n blockRate: string;\r\n };\r\n}): UnifiedResponse {\r\n const modeIcons: Record<string, string> = {\r\n observe: '👁️',\r\n enforce: fmt.ICONS.shield,\r\n lockdown: fmt.ICONS.lock,\r\n };\r\n\r\n const textParts: string[] = [];\r\n\r\n // Header\r\n textParts.push(\r\n fmt.headerBox(fmt.ICONS.shield, 'FIREWALL STATUS', data.mode.toUpperCase(), 50)\r\n );\r\n\r\n textParts.push('');\r\n\r\n // Status\r\n textParts.push(fmt.keyValue([\r\n ['Status', data.enabled ? '✓ Active' : '✗ Disabled'],\r\n ['Mode', `${modeIcons[data.mode] ?? ''} ${data.mode}`],\r\n ['Description', data.modeDescription],\r\n ]));\r\n\r\n textParts.push('');\r\n\r\n // Stats grid\r\n textParts.push(fmt.section('Statistics', '', fmt.ICONS.chart));\r\n textParts.push('');\r\n textParts.push(\r\n fmt.statsGrid([\r\n { label: 'Total Checks', value: data.statistics.totalChecks, icon: '📊' },\r\n { label: 'Blocked', value: data.statistics.blocked, icon: '🛑' },\r\n { label: 'Allowed', value: data.statistics.allowed, icon: '✅' },\r\n ])\r\n );\r\n textParts.push('');\r\n textParts.push(` Block Rate: ${data.statistics.blockRate}`);\r\n\r\n // Build HTML\r\n const html = buildStatsHtml({\r\n totalChecks: data.statistics.totalChecks,\r\n blocked: data.statistics.blocked,\r\n allowed: data.statistics.allowed,\r\n });\r\n\r\n return {\r\n data: data as unknown as Record<string, unknown>,\r\n text: textParts.join('\\n'),\r\n html,\r\n };\r\n}\r\n\r\n/**\r\n * Format quick check response\r\n */\r\nexport function formatQuickCheck(data: {\r\n safe: boolean;\r\n concerns: string[];\r\n}): UnifiedResponse {\r\n const textParts: string[] = [];\r\n\r\n // Header\r\n const icon = data.safe ? fmt.ICONS.success : fmt.ICONS.warning;\r\n const status = data.safe ? 'SAFE' : 'CONCERNS FOUND';\r\n\r\n textParts.push(fmt.headerBox(icon, 'QUICK CHECK', status, 40));\r\n\r\n if (data.concerns.length > 0) {\r\n textParts.push('');\r\n textParts.push(fmt.section('Concerns', '', fmt.ICONS.warning));\r\n textParts.push(fmt.bulletList(data.concerns, '⚠️'));\r\n } else {\r\n textParts.push('');\r\n textParts.push(' ✓ No issues detected');\r\n }\r\n\r\n return {\r\n data: data as unknown as Record<string, unknown>,\r\n text: textParts.join('\\n'),\r\n html: buildMessageHtml(\r\n data.safe ? 'No issues detected' : `Found ${data.concerns.length} concerns`,\r\n data.safe ? 'success' : 'warning'\r\n ),\r\n };\r\n}\r\n\r\n// ============================================\r\n// TRUTHPACK RESPONSES\r\n// ============================================\r\n\r\nexport interface TruthpackGenerateData {\r\n success: boolean;\r\n generated: string[];\r\n results: Record<string, { count?: number; note?: string }>;\r\n errors?: string[];\r\n timestamp: string;\r\n}\r\n\r\n/**\r\n * Format truthpack generate response\r\n */\r\nexport function formatTruthpackGenerate(data: TruthpackGenerateData): UnifiedResponse {\r\n const textParts: string[] = [];\r\n\r\n // Header\r\n const icon = data.success ? fmt.ICONS.success : fmt.ICONS.warning;\r\n textParts.push(\r\n fmt.headerBox(fmt.ICONS.truthpack, 'TRUTHPACK GENERATED', data.success ? 'Success' : 'With Errors', 50)\r\n );\r\n\r\n textParts.push('');\r\n\r\n // Results table\r\n const tableData = Object.entries(data.results).map(([scanner, result]) => ({\r\n scanner: scanner.charAt(0).toUpperCase() + scanner.slice(1),\r\n count: result.count ?? 0,\r\n note: result.note ?? '-',\r\n }));\r\n\r\n textParts.push(\r\n fmt.table(\r\n [\r\n { header: 'Scanner', key: 'scanner', width: 15 },\r\n { header: 'Count', key: 'count', width: 10, align: 'right' as const },\r\n { header: 'Note', key: 'note', width: 20 },\r\n ],\r\n tableData\r\n )\r\n );\r\n\r\n // Errors\r\n if (data.errors && data.errors.length > 0) {\r\n textParts.push('');\r\n textParts.push(fmt.section('Errors', '', fmt.ICONS.error));\r\n textParts.push(fmt.bulletList(data.errors, '❌'));\r\n }\r\n\r\n textParts.push('');\r\n textParts.push(fmt.timestamp(data.timestamp));\r\n\r\n return {\r\n data: data as unknown as Record<string, unknown>,\r\n text: textParts.join('\\n'),\r\n };\r\n}\r\n\r\n/**\r\n * Format truthpack query response\r\n */\r\nexport function formatTruthpackQuery(data: {\r\n category: string;\r\n filter?: string;\r\n results: unknown[];\r\n count: number;\r\n error?: string;\r\n}): UnifiedResponse {\r\n const textParts: string[] = [];\r\n\r\n // Header\r\n const categoryIcons: Record<string, string> = {\r\n routes: fmt.ICONS.route,\r\n env: fmt.ICONS.key,\r\n auth: fmt.ICONS.shield,\r\n contracts: '📝',\r\n types: '📋',\r\n };\r\n\r\n textParts.push(\r\n fmt.headerBox(\r\n categoryIcons[data.category] ?? fmt.ICONS.truthpack,\r\n `TRUTHPACK: ${data.category.toUpperCase()}`,\r\n `${data.count} items`,\r\n 50\r\n )\r\n );\r\n\r\n if (data.filter) {\r\n textParts.push(` Filter: ${data.filter}`);\r\n }\r\n\r\n textParts.push('');\r\n\r\n if (data.error) {\r\n textParts.push(` ${fmt.ICONS.error} ${data.error}`);\r\n } else if (data.count === 0) {\r\n textParts.push(' No items found');\r\n } else {\r\n // Format results based on category\r\n if (data.category === 'routes') {\r\n const routes = data.results as Array<{ method: string; path: string; file?: string }>;\r\n textParts.push(\r\n fmt.table(\r\n [\r\n { header: 'Method', key: 'method', width: 8 },\r\n { header: 'Path', key: 'path', width: 25 },\r\n { header: 'Handler', key: 'file', width: 20 },\r\n ],\r\n routes.slice(0, 15).map((r) => ({\r\n method: r.method,\r\n path: r.path,\r\n file: r.file ?? '-',\r\n }))\r\n )\r\n );\r\n } else if (data.category === 'env') {\r\n const vars = data.results as Array<{ name: string; required?: boolean; sensitive?: boolean }>;\r\n textParts.push(\r\n fmt.table(\r\n [\r\n { header: 'Variable', key: 'name', width: 25 },\r\n { header: 'Required', key: 'required', width: 10 },\r\n { header: 'Sensitive', key: 'sensitive', width: 10 },\r\n ],\r\n vars.slice(0, 15).map((v) => ({\r\n name: v.name,\r\n required: v.required ? '✓' : '-',\r\n sensitive: v.sensitive ? '🔒' : '-',\r\n }))\r\n )\r\n );\r\n } else {\r\n // Generic list\r\n const items = data.results.slice(0, 10);\r\n textParts.push(\r\n fmt.tree(\r\n items.map((item) => ({\r\n label: typeof item === 'object' && item !== null\r\n ? JSON.stringify(item).slice(0, 50)\r\n : String(item),\r\n }))\r\n )\r\n );\r\n }\r\n\r\n if (data.count > 15) {\r\n textParts.push(`\\n ... and ${data.count - 15} more`);\r\n }\r\n }\r\n\r\n return {\r\n data: data as unknown as Record<string, unknown>,\r\n text: textParts.join('\\n'),\r\n };\r\n}\r\n\r\n/**\r\n * Format routes response\r\n */\r\nexport function formatRoutes(data: {\r\n routes: Array<{ method: string; path: string; file?: string; auth?: { required: boolean } }>;\r\n filters: { method?: string; path?: string };\r\n count: number;\r\n error?: string;\r\n}): UnifiedResponse {\r\n const textParts: string[] = [];\r\n\r\n textParts.push(\r\n fmt.headerBox(fmt.ICONS.route, 'API ROUTES', `${data.count} routes`, 55)\r\n );\r\n\r\n if (data.filters.method || data.filters.path) {\r\n textParts.push('');\r\n textParts.push(` Filters: ${data.filters.method ? `Method=${data.filters.method}` : ''} ${data.filters.path ? `Path=${data.filters.path}` : ''}`);\r\n }\r\n\r\n textParts.push('');\r\n\r\n if (data.error) {\r\n textParts.push(` ${fmt.ICONS.error} ${data.error}`);\r\n } else if (data.routes.length === 0) {\r\n textParts.push(' No routes found');\r\n } else {\r\n // Group by method\r\n const byMethod: Record<string, typeof data.routes> = {};\r\n for (const route of data.routes) {\r\n if (!byMethod[route.method]) byMethod[route.method] = [];\r\n byMethod[route.method]?.push(route);\r\n }\r\n\r\n for (const [method, routes] of Object.entries(byMethod)) {\r\n textParts.push(`\\n${fmt.httpMethod(method)} (${routes.length})`);\r\n for (const route of routes.slice(0, 5)) {\r\n const auth = route.auth?.required ? ' 🔒' : '';\r\n textParts.push(` ${fmt.BOX.treeEnd} ${route.path}${auth}`);\r\n }\r\n if (routes.length > 5) {\r\n textParts.push(` ... and ${routes.length - 5} more`);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n data: data as unknown as Record<string, unknown>,\r\n text: textParts.join('\\n'),\r\n };\r\n}\r\n\r\n// ============================================\r\n// GENERIC RESPONSES\r\n// ============================================\r\n\r\n/**\r\n * Format a success message\r\n */\r\nexport function formatSuccess(message: string, details?: Record<string, unknown>): UnifiedResponse {\r\n const textParts: string[] = [];\r\n\r\n textParts.push(`${fmt.ICONS.success} ${message}`);\r\n\r\n if (details) {\r\n textParts.push('');\r\n const pairs = Object.entries(details).map(([k, v]) => [k, String(v)] as [string, string]);\r\n textParts.push(fmt.keyValue(pairs));\r\n }\r\n\r\n return {\r\n data: { success: true, message, ...details },\r\n text: textParts.join('\\n'),\r\n html: buildMessageHtml(message, 'success'),\r\n };\r\n}\r\n\r\n/**\r\n * Format an error message\r\n */\r\nexport function formatError(error: string | Error, context?: Record<string, unknown>): UnifiedResponse {\r\n const message = error instanceof Error ? error.message : error;\r\n const textParts: string[] = [];\r\n\r\n textParts.push(fmt.headerBox(fmt.ICONS.error, 'ERROR', '', 40));\r\n textParts.push('');\r\n textParts.push(` ${message}`);\r\n\r\n if (context) {\r\n textParts.push('');\r\n textParts.push(fmt.section('Context', '', fmt.ICONS.info));\r\n const pairs = Object.entries(context).map(([k, v]) => [k, String(v)] as [string, string]);\r\n textParts.push(fmt.keyValue(pairs));\r\n }\r\n\r\n return {\r\n data: { success: false, error: message, ...context },\r\n text: textParts.join('\\n'),\r\n html: buildMessageHtml(message, 'error'),\r\n };\r\n}\r\n\r\n/**\r\n * Format info message\r\n */\r\nexport function formatInfo(title: string, content: Record<string, unknown>): UnifiedResponse {\r\n const textParts: string[] = [];\r\n\r\n textParts.push(fmt.headerBox(fmt.ICONS.info, title, '', 45));\r\n textParts.push('');\r\n\r\n const pairs = Object.entries(content).map(([k, v]) => [k, String(v)] as [string, string]);\r\n textParts.push(fmt.keyValue(pairs));\r\n\r\n return {\r\n data: content,\r\n text: textParts.join('\\n'),\r\n html: buildMessageHtml(title, 'info'),\r\n };\r\n}\r\n\r\n// ============================================\r\n// RESPONSE WRAPPER\r\n// ============================================\r\n\r\n/**\r\n * Build MCP tool response with multiple formats\r\n */\r\nexport function buildResponse(\r\n response: UnifiedResponse,\r\n format: ResponseFormat = 'all'\r\n): { content: Array<{ type: string; text: string }> } {\r\n const content: Array<{ type: string; text: string }> = [];\r\n\r\n if (format === 'json' || format === 'all') {\r\n // Always include JSON for programmatic use\r\n content.push({\r\n type: 'text',\r\n text: JSON.stringify(response.data, null, 2),\r\n });\r\n }\r\n\r\n if (format === 'text' || format === 'all') {\r\n // Add formatted text\r\n content.push({\r\n type: 'text',\r\n text: `\\n---\\n${response.text}\\n---`,\r\n });\r\n }\r\n\r\n if ((format === 'html' || format === 'all') && response.html) {\r\n // Add HTML for rich clients\r\n content.push({\r\n type: 'text',\r\n text: `<!-- HTML_RENDER -->\\n${response.html}`,\r\n });\r\n }\r\n\r\n return { content };\r\n}\r\n\r\n/**\r\n * Build simple text response (for backwards compatibility)\r\n */\r\nexport function buildTextResponse(text: string): { content: Array<{ type: string; text: string }> } {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text,\r\n }],\r\n };\r\n}\r\n","/**\r\n * Context Tools\r\n * \r\n * MCP tools for gathering and managing context.\r\n */\r\n\r\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport { z } from 'zod';\r\nimport * as fs from 'fs/promises';\r\nimport * as path from 'path';\r\nimport { glob } from 'glob';\r\n\r\nimport { loadConfig } from '@repo/shared-config';\r\n\r\n// Get project root from centralized config or default to cwd\r\nconst getProjectRoot = (): string => {\r\n const config = loadConfig();\r\n return config.VIBECHECK_PROJECT_ROOT || process.cwd();\r\n};\r\n\r\n// Get truthpack directory path\r\nconst getTruthpackPath = (): string => {\r\n return path.join(getProjectRoot(), '.vibecheck', 'truthpack');\r\n};\r\n\r\n// Get knowledge directory path\r\nconst getKnowledgePath = (): string => {\r\n return path.join(getProjectRoot(), '.vibecheck', 'knowledge');\r\n};\r\n\r\n// Load a JSON file safely\r\nconst loadJson = async <T>(filePath: string): Promise<T | null> => {\r\n try {\r\n const content = await fs.readFile(filePath, 'utf-8');\r\n return JSON.parse(content) as T;\r\n } catch {\r\n return null;\r\n }\r\n};\r\n\r\n// Extract imports from file content\r\nconst extractImportsFromContent = (content: string): string[] => {\r\n const imports: string[] = [];\r\n const importRegex = /import\\s+(?:{[^}]+}|\\*\\s+as\\s+\\w+|\\w+)\\s+from\\s+['\"]([^'\"]+)['\"]/g;\r\n let match;\r\n while ((match = importRegex.exec(content)) !== null) {\r\n imports.push(match[1]);\r\n }\r\n return imports;\r\n};\r\n\r\nexport function registerContextTools(server: McpServer): void {\r\n // Gather context for a task\r\n server.tool(\r\n 'context_gather',\r\n 'Gather relevant context for a code generation task',\r\n {\r\n task: z.string().describe('Description of the task'),\r\n targetFile: z.string().optional().describe('Target file path'),\r\n maxTokens: z.number().optional().describe('Maximum context tokens'),\r\n },\r\n async ({ task, targetFile, maxTokens }) => {\r\n try {\r\n const projectRoot = getProjectRoot();\r\n const truthpackPath = getTruthpackPath();\r\n const knowledgePath = getKnowledgePath();\r\n\r\n // Load relevant truthpack data based on task keywords\r\n const taskLower = task.toLowerCase();\r\n const truthpack: Record<string, unknown> = {};\r\n\r\n // Load routes if task mentions API, endpoint, route\r\n if (taskLower.match(/api|endpoint|route|fetch|request/)) {\r\n const routes = await loadJson(path.join(truthpackPath, 'routes.json'));\r\n if (routes) truthpack.routes = routes;\r\n }\r\n\r\n // Load env if task mentions env, config, environment\r\n if (taskLower.match(/env|config|environment|variable/)) {\r\n const env = await loadJson(path.join(truthpackPath, 'env.json'));\r\n if (env) truthpack.env = env;\r\n }\r\n\r\n // Load auth if task mentions auth, login, permission, role\r\n if (taskLower.match(/auth|login|permission|role|protect|session/)) {\r\n const auth = await loadJson(path.join(truthpackPath, 'auth.json'));\r\n if (auth) truthpack.auth = auth;\r\n }\r\n\r\n // Load contracts if task mentions schema, type, contract, api\r\n if (taskLower.match(/schema|type|contract|api|interface/)) {\r\n const contracts = await loadJson(path.join(truthpackPath, 'contracts.json'));\r\n if (contracts) truthpack.contracts = contracts;\r\n }\r\n\r\n // Load conventions\r\n const conventions = await loadJson<{ conventions: unknown[] }>(\r\n path.join(knowledgePath, 'conventions.json')\r\n );\r\n\r\n // Load patterns\r\n const patterns = await loadJson<{ patterns: unknown[] }>(\r\n path.join(knowledgePath, 'patterns.json')\r\n );\r\n\r\n // Find related files if targetFile is specified\r\n const relatedFiles: string[] = [];\r\n if (targetFile) {\r\n // Get files in the same directory\r\n const targetDir = path.dirname(targetFile);\r\n try {\r\n const files = await glob('*.{ts,tsx,js,jsx}', {\r\n cwd: path.join(projectRoot, targetDir),\r\n ignore: ['node_modules/**'],\r\n });\r\n relatedFiles.push(...files.map(f => path.join(targetDir, f)));\r\n } catch {\r\n // Directory might not exist\r\n }\r\n }\r\n\r\n // Estimate tokens (rough: ~4 chars per token)\r\n const contextStr = JSON.stringify({ truthpack, conventions: conventions?.conventions, patterns: patterns?.patterns });\r\n const estimatedTokens = Math.ceil(contextStr.length / 4);\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n task,\r\n targetFile,\r\n context: {\r\n truthpack,\r\n relatedFiles: relatedFiles.slice(0, 10),\r\n conventions: conventions?.conventions ?? [],\r\n patterns: patterns?.patterns ?? [],\r\n },\r\n totalTokens: estimatedTokens,\r\n maxTokens: maxTokens ?? 'unlimited',\r\n }, null, 2),\r\n }],\r\n };\r\n } catch (err) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n task,\r\n targetFile,\r\n context: { truthpack: {}, relatedFiles: [], conventions: [] },\r\n error: err instanceof Error ? err.message : 'Unknown error',\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n }\r\n );\r\n\r\n // Get context for a file\r\n server.tool(\r\n 'context_for_file',\r\n 'Get relevant context for editing a specific file',\r\n {\r\n filePath: z.string().describe('Path to the file'),\r\n includeImports: z.boolean().optional().describe('Include imported files'),\r\n includeImporters: z.boolean().optional().describe('Include files that import this one'),\r\n },\r\n async ({ filePath, includeImports, includeImporters }) => {\r\n try {\r\n const projectRoot = getProjectRoot();\r\n const fullPath = path.isAbsolute(filePath) \r\n ? filePath \r\n : path.join(projectRoot, filePath);\r\n\r\n // Read the file\r\n const fileContent = await fs.readFile(fullPath, 'utf-8');\r\n \r\n // Extract imports\r\n const imports = extractImportsFromContent(fileContent);\r\n\r\n // Find files that import this one (if requested)\r\n const importers: string[] = [];\r\n if (includeImporters) {\r\n const allFiles = await glob('**/*.{ts,tsx,js,jsx}', {\r\n cwd: projectRoot,\r\n ignore: ['node_modules/**', 'dist/**', 'build/**'],\r\n });\r\n\r\n const fileName = path.basename(filePath, path.extname(filePath));\r\n const relativePath = path.relative(projectRoot, fullPath).replace(/\\\\/g, '/');\r\n\r\n for (const file of allFiles.slice(0, 100)) { // Limit search\r\n try {\r\n const content = await fs.readFile(path.join(projectRoot, file), 'utf-8');\r\n if (content.includes(fileName) || content.includes(relativePath)) {\r\n const fileImports = extractImportsFromContent(content);\r\n if (fileImports.some(imp => \r\n imp.includes(fileName) || imp.endsWith(relativePath.replace(/\\.[tj]sx?$/, ''))\r\n )) {\r\n importers.push(file);\r\n }\r\n }\r\n } catch {\r\n // Skip files that can't be read\r\n }\r\n }\r\n }\r\n\r\n // Extract type references\r\n const typePattern = /(?:interface|type|class|enum)\\s+(\\w+)/g;\r\n const types: string[] = [];\r\n let match;\r\n while ((match = typePattern.exec(fileContent)) !== null) {\r\n types.push(match[1]);\r\n }\r\n\r\n // Load conventions\r\n const conventions = await loadJson<{ conventions: unknown[] }>(\r\n path.join(getKnowledgePath(), 'conventions.json')\r\n );\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n filePath,\r\n imports: includeImports !== false ? imports : [],\r\n importers: importers.slice(0, 20),\r\n relatedTypes: types,\r\n conventions: conventions?.conventions ?? [],\r\n fileInfo: {\r\n lines: fileContent.split('\\n').length,\r\n size: fileContent.length,\r\n },\r\n }, null, 2),\r\n }],\r\n };\r\n } catch (err) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n filePath,\r\n imports: [],\r\n importers: [],\r\n relatedTypes: [],\r\n conventions: [],\r\n error: err instanceof Error ? err.message : 'Unknown error',\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n }\r\n );\r\n\r\n // Get project structure\r\n server.tool(\r\n 'context_structure',\r\n 'Get project structure overview',\r\n {\r\n depth: z.number().optional().describe('Directory depth (default: 3)'),\r\n includeFiles: z.boolean().optional().describe('Include file names'),\r\n },\r\n async ({ depth, includeFiles }) => {\r\n try {\r\n const projectRoot = getProjectRoot();\r\n const maxDepth = depth ?? 3;\r\n\r\n interface DirEntry {\r\n name: string;\r\n type: 'directory' | 'file';\r\n children?: DirEntry[];\r\n }\r\n\r\n const buildTree = async (dirPath: string, currentDepth: number): Promise<DirEntry[]> => {\r\n if (currentDepth > maxDepth) return [];\r\n\r\n const entries: DirEntry[] = [];\r\n const items = await fs.readdir(dirPath, { withFileTypes: true });\r\n\r\n for (const item of items) {\r\n // Skip hidden files and common ignore patterns\r\n if (item.name.startsWith('.') || \r\n ['node_modules', 'dist', 'build', '.next', 'coverage'].includes(item.name)) {\r\n continue;\r\n }\r\n\r\n if (item.isDirectory()) {\r\n const children = await buildTree(\r\n path.join(dirPath, item.name),\r\n currentDepth + 1\r\n );\r\n entries.push({\r\n name: item.name,\r\n type: 'directory',\r\n children: children.length > 0 ? children : undefined,\r\n });\r\n } else if (includeFiles) {\r\n entries.push({\r\n name: item.name,\r\n type: 'file',\r\n });\r\n }\r\n }\r\n\r\n return entries.sort((a, b) => {\r\n // Directories first\r\n if (a.type !== b.type) return a.type === 'directory' ? -1 : 1;\r\n return a.name.localeCompare(b.name);\r\n });\r\n };\r\n\r\n const structure = await buildTree(projectRoot, 1);\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n structure,\r\n depth: maxDepth,\r\n includeFiles: includeFiles ?? false,\r\n }, null, 2),\r\n }],\r\n };\r\n } catch (err) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n structure: {},\r\n depth: depth ?? 3,\r\n error: err instanceof Error ? err.message : 'Unknown error',\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n }\r\n );\r\n\r\n // Get conventions\r\n server.tool(\r\n 'context_conventions',\r\n 'Get project coding conventions',\r\n {\r\n category: z.string().optional().describe('Convention category (e.g., naming, imports)'),\r\n },\r\n async ({ category }) => {\r\n try {\r\n const conventionsPath = path.join(getKnowledgePath(), 'conventions.json');\r\n const data = await loadJson<{ conventions: Array<{ category: string; rules: unknown[] }> }>(conventionsPath);\r\n\r\n let conventions = data?.conventions ?? [];\r\n\r\n // Filter by category if specified\r\n if (category && conventions.length > 0) {\r\n conventions = conventions.filter(c => \r\n c.category?.toLowerCase().includes(category.toLowerCase())\r\n );\r\n }\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n conventions,\r\n category: category ?? 'all',\r\n count: conventions.length,\r\n }, null, 2),\r\n }],\r\n };\r\n } catch (err) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n conventions: [],\r\n category,\r\n error: err instanceof Error ? err.message : 'Unknown error',\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n }\r\n );\r\n\r\n // Update embeddings (placeholder - would require embedding model)\r\n server.tool(\r\n 'context_update_embeddings',\r\n 'Update context embeddings for semantic search',\r\n {\r\n files: z.array(z.string()).optional().describe('Specific files to update'),\r\n force: z.boolean().optional().describe('Force update all embeddings'),\r\n },\r\n async ({ files, force }) => {\r\n // This would require an embedding model integration\r\n // For now, return a placeholder response\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n updated: 0,\r\n force: force ?? false,\r\n files: files ?? [],\r\n note: 'Embedding updates require an embedding model integration. Consider using external embedding services.',\r\n suggestion: 'Run truthpack_generate to update the indexed code context instead.',\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n );\r\n}\r\n","/**\r\n * Deterministic ID Generation\r\n * \r\n * Generates stable, content-based IDs for findings and evidence receipts.\r\n * Same content always produces same ID, enabling deterministic outputs.\r\n */\r\n\r\nimport * as crypto from 'crypto';\r\n\r\n/**\r\n * Generate a stable finding ID from content\r\n */\r\nexport function generateFindingId(\r\n ruleId: string,\r\n filePath: string,\r\n line: number,\r\n column: number,\r\n matchedContent: string\r\n): string {\r\n const content = `${ruleId}:${filePath}:${line}:${column}:${matchedContent}`;\r\n const hash = crypto.createHash('sha256').update(content).digest('hex');\r\n return `finding-${hash.substring(0, 16)}`;\r\n}\r\n\r\n/**\r\n * Generate a stable evidence receipt ID\r\n */\r\nexport function generateReceiptId(\r\n findingId: string,\r\n evidenceHash: string,\r\n timestamp: string\r\n): string {\r\n const content = `${findingId}:${evidenceHash}:${timestamp}`;\r\n const hash = crypto.createHash('sha256').update(content).digest('hex');\r\n return `receipt-${hash.substring(0, 16)}`;\r\n}\r\n\r\n/**\r\n * Generate a stable audit ID\r\n */\r\nexport function generateAuditId(\r\n agentId: string,\r\n action: string,\r\n target: string,\r\n contentHash: string\r\n): string {\r\n const content = `${agentId}:${action}:${target}:${contentHash}`;\r\n const hash = crypto.createHash('sha256').update(content).digest('hex');\r\n return `audit-${hash.substring(0, 16)}`;\r\n}\r\n\r\n/**\r\n * Generate a stable transaction ID\r\n */\r\nexport function generateTransactionId(\r\n patches: Array<{ filePath: string; contentHash: string }>\r\n): string {\r\n const content = patches\r\n .map(p => `${p.filePath}:${p.contentHash}`)\r\n .sort()\r\n .join('|');\r\n const hash = crypto.createHash('sha256').update(content).digest('hex');\r\n return `tx-${hash.substring(0, 16)}`;\r\n}\r\n\r\n/**\r\n * Hash content for stable comparison\r\n */\r\nexport function hashContent(content: string): string {\r\n return crypto.createHash('sha256').update(content).digest('hex');\r\n}\r\n","/**\r\n * Input Validation Utilities\r\n * \r\n * Provides type-safe validation with detailed error messages.\r\n */\r\n\r\nimport { ValidationError } from './errors.js';\r\n\r\nexport type ValidationResult<T> = \r\n | { valid: true; value: T }\r\n | { valid: false; errors: string[] };\r\n\r\nexport interface Validator<T> {\r\n (value: unknown): ValidationResult<T>;\r\n}\r\n\r\n/**\r\n * Create a string validator\r\n */\r\nexport function string(options: {\r\n minLength?: number;\r\n maxLength?: number;\r\n pattern?: RegExp;\r\n allowEmpty?: boolean;\r\n} = {}): Validator<string> {\r\n return (value: unknown): ValidationResult<string> => {\r\n const errors: string[] = [];\r\n\r\n if (typeof value !== 'string') {\r\n return { valid: false, errors: ['Expected a string'] };\r\n }\r\n\r\n if (!options.allowEmpty && value.length === 0) {\r\n errors.push('String cannot be empty');\r\n }\r\n\r\n if (options.minLength !== undefined && value.length < options.minLength) {\r\n errors.push(`String must be at least ${options.minLength} characters`);\r\n }\r\n\r\n if (options.maxLength !== undefined && value.length > options.maxLength) {\r\n errors.push(`String must be at most ${options.maxLength} characters`);\r\n }\r\n\r\n if (options.pattern && !options.pattern.test(value)) {\r\n errors.push(`String does not match required pattern`);\r\n }\r\n\r\n return errors.length === 0 ? { valid: true, value } : { valid: false, errors };\r\n };\r\n}\r\n\r\n/**\r\n * Create a number validator\r\n */\r\nexport function number(options: {\r\n min?: number;\r\n max?: number;\r\n integer?: boolean;\r\n positive?: boolean;\r\n} = {}): Validator<number> {\r\n return (value: unknown): ValidationResult<number> => {\r\n const errors: string[] = [];\r\n\r\n if (typeof value !== 'number' || isNaN(value)) {\r\n return { valid: false, errors: ['Expected a number'] };\r\n }\r\n\r\n if (options.integer && !Number.isInteger(value)) {\r\n errors.push('Number must be an integer');\r\n }\r\n\r\n if (options.positive && value <= 0) {\r\n errors.push('Number must be positive');\r\n }\r\n\r\n if (options.min !== undefined && value < options.min) {\r\n errors.push(`Number must be at least ${options.min}`);\r\n }\r\n\r\n if (options.max !== undefined && value > options.max) {\r\n errors.push(`Number must be at most ${options.max}`);\r\n }\r\n\r\n return errors.length === 0 ? { valid: true, value } : { valid: false, errors };\r\n };\r\n}\r\n\r\n/**\r\n * Create an enum validator\r\n */\r\nexport function oneOf<T extends string | number>(allowed: readonly T[]): Validator<T> {\r\n return (value: unknown): ValidationResult<T> => {\r\n if (allowed.includes(value as T)) {\r\n return { valid: true, value: value as T };\r\n }\r\n return {\r\n valid: false,\r\n errors: [`Value must be one of: ${allowed.join(', ')}`],\r\n };\r\n };\r\n}\r\n\r\n/**\r\n * Create an array validator\r\n */\r\nexport function array<T>(\r\n itemValidator: Validator<T>,\r\n options: { minLength?: number; maxLength?: number } = {}\r\n): Validator<T[]> {\r\n return (value: unknown): ValidationResult<T[]> => {\r\n const errors: string[] = [];\r\n\r\n if (!Array.isArray(value)) {\r\n return { valid: false, errors: ['Expected an array'] };\r\n }\r\n\r\n if (options.minLength !== undefined && value.length < options.minLength) {\r\n errors.push(`Array must have at least ${options.minLength} items`);\r\n }\r\n\r\n if (options.maxLength !== undefined && value.length > options.maxLength) {\r\n errors.push(`Array must have at most ${options.maxLength} items`);\r\n }\r\n\r\n const validatedItems: T[] = [];\r\n for (let i = 0; i < value.length; i++) {\r\n const result = itemValidator(value[i]);\r\n if (result.valid) {\r\n validatedItems.push(result.value);\r\n } else {\r\n errors.push(...result.errors.map(e => `[${i}]: ${e}`));\r\n }\r\n }\r\n\r\n return errors.length === 0 \r\n ? { valid: true, value: validatedItems } \r\n : { valid: false, errors };\r\n };\r\n}\r\n\r\n/**\r\n * Create an object validator\r\n */\r\nexport function object<T extends Record<string, unknown>>(\r\n schema: { [K in keyof T]: Validator<T[K]> },\r\n options: { allowExtra?: boolean } = {}\r\n): Validator<T> {\r\n return (value: unknown): ValidationResult<T> => {\r\n const errors: string[] = [];\r\n\r\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\r\n return { valid: false, errors: ['Expected an object'] };\r\n }\r\n\r\n const obj = value as Record<string, unknown>;\r\n const result: Partial<T> = {};\r\n\r\n // Validate known fields\r\n for (const key of Object.keys(schema) as Array<keyof T>) {\r\n const validator = schema[key];\r\n const fieldValue = obj[key as string];\r\n const fieldResult = validator(fieldValue);\r\n\r\n if (fieldResult.valid) {\r\n result[key] = fieldResult.value;\r\n } else {\r\n errors.push(...fieldResult.errors.map(e => `${String(key)}: ${e}`));\r\n }\r\n }\r\n\r\n // Check for extra fields\r\n if (!options.allowExtra) {\r\n const extraKeys = Object.keys(obj).filter(k => !(k in schema));\r\n if (extraKeys.length > 0) {\r\n errors.push(`Unexpected fields: ${extraKeys.join(', ')}`);\r\n }\r\n }\r\n\r\n return errors.length === 0 \r\n ? { valid: true, value: result as T } \r\n : { valid: false, errors };\r\n };\r\n}\r\n\r\n/**\r\n * Create an optional validator\r\n */\r\nexport function optional<T>(validator: Validator<T>): Validator<T | undefined> {\r\n return (value: unknown): ValidationResult<T | undefined> => {\r\n if (value === undefined || value === null) {\r\n return { valid: true, value: undefined };\r\n }\r\n return validator(value);\r\n };\r\n}\r\n\r\n/**\r\n * Create a nullable validator\r\n */\r\nexport function nullable<T>(validator: Validator<T>): Validator<T | null> {\r\n return (value: unknown): ValidationResult<T | null> => {\r\n if (value === null) {\r\n return { valid: true, value: null };\r\n }\r\n return validator(value);\r\n };\r\n}\r\n\r\n/**\r\n * Validate and throw if invalid\r\n */\r\nexport function validateOrThrow<T>(\r\n value: unknown,\r\n validator: Validator<T>,\r\n context: { component: string; operation: string; field?: string }\r\n): T {\r\n const result = validator(value);\r\n \r\n if (result.valid) {\r\n return result.value;\r\n }\r\n\r\n throw new ValidationError(\r\n result.errors.join('; '),\r\n {\r\n component: context.component,\r\n operation: context.operation,\r\n field: context.field,\r\n value,\r\n constraints: result.errors,\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Validate a path string\r\n */\r\nexport const pathValidator = string({\r\n minLength: 1,\r\n maxLength: 500,\r\n pattern: /^[a-zA-Z0-9_\\-./\\\\@[\\]]+$/,\r\n});\r\n\r\n/**\r\n * Validate a safe filename\r\n */\r\nexport const filenameValidator = string({\r\n minLength: 1,\r\n maxLength: 255,\r\n pattern: /^[a-zA-Z0-9_\\-. ]+$/,\r\n});\r\n\r\n/**\r\n * Sanitize a string for safe use\r\n */\r\nexport function sanitize(input: string): string {\r\n return input\r\n .replace(/[<>:\"\\/\\\\|?*\\x00-\\x1F]/g, '') // Remove unsafe chars\r\n .trim()\r\n .slice(0, 1000); // Limit length\r\n}\r\n\r\n/**\r\n * Check if a value is a plain object\r\n */\r\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\r\n return typeof value === 'object' && value !== null && !Array.isArray(value);\r\n}\r\n\r\n/**\r\n * Deep freeze an object\r\n */\r\nexport function deepFreeze<T extends object>(obj: T): Readonly<T> {\r\n Object.freeze(obj);\r\n for (const key of Object.keys(obj)) {\r\n const value = (obj as Record<string, unknown>)[key];\r\n if (typeof value === 'object' && value !== null && !Object.isFrozen(value)) {\r\n deepFreeze(value as object);\r\n }\r\n }\r\n return obj;\r\n}\r\n","/**\r\n * Retry and Circuit Breaker Utilities\r\n * \r\n * Provides resilient execution patterns for unreliable operations.\r\n */\r\n\r\nimport { TimeoutError, VibeCheckError } from './errors.js';\r\n\r\nexport interface RetryConfig {\r\n maxAttempts: number;\r\n initialDelayMs: number;\r\n maxDelayMs: number;\r\n backoffMultiplier: number;\r\n retryOn?: (error: Error) => boolean;\r\n onRetry?: (attempt: number, error: Error, delayMs: number) => void;\r\n}\r\n\r\nconst DEFAULT_RETRY_CONFIG: RetryConfig = {\r\n maxAttempts: 3,\r\n initialDelayMs: 100,\r\n maxDelayMs: 5000,\r\n backoffMultiplier: 2,\r\n};\r\n\r\n/**\r\n * Execute a function with retry logic\r\n */\r\nexport async function withRetry<T>(\r\n fn: () => Promise<T>,\r\n config: Partial<RetryConfig> = {}\r\n): Promise<T> {\r\n const cfg = { ...DEFAULT_RETRY_CONFIG, ...config };\r\n let lastError: Error | null = null;\r\n let delay = cfg.initialDelayMs;\r\n\r\n for (let attempt = 1; attempt <= cfg.maxAttempts; attempt++) {\r\n try {\r\n return await fn();\r\n } catch (error) {\r\n lastError = error as Error;\r\n\r\n // Check if we should retry this error\r\n const shouldRetry = cfg.retryOn \r\n ? cfg.retryOn(lastError) \r\n : isRetryable(lastError);\r\n\r\n if (!shouldRetry || attempt === cfg.maxAttempts) {\r\n break;\r\n }\r\n\r\n // Notify retry callback\r\n cfg.onRetry?.(attempt, lastError, delay);\r\n\r\n // Wait before retry\r\n await sleep(delay);\r\n\r\n // Exponential backoff with jitter\r\n delay = Math.min(\r\n delay * cfg.backoffMultiplier + Math.random() * 100,\r\n cfg.maxDelayMs\r\n );\r\n }\r\n }\r\n\r\n throw lastError;\r\n}\r\n\r\n/**\r\n * Check if an error is retryable\r\n */\r\nfunction isRetryable(error: Error): boolean {\r\n // Check if it's a VibeCheckError with retryable flag\r\n if (error instanceof VibeCheckError) {\r\n return error.retryable;\r\n }\r\n\r\n // Common retryable error patterns\r\n const retryablePatterns = [\r\n /ECONNRESET/i,\r\n /ETIMEDOUT/i,\r\n /ECONNREFUSED/i,\r\n /ENOTFOUND/i,\r\n /network/i,\r\n /timeout/i,\r\n /rate limit/i,\r\n /429/,\r\n /503/,\r\n /502/,\r\n ];\r\n\r\n const message = error.message || '';\r\n return retryablePatterns.some(p => p.test(message));\r\n}\r\n\r\n/**\r\n * Execute with timeout\r\n */\r\nexport async function withTimeout<T>(\r\n fn: () => Promise<T>,\r\n timeoutMs: number,\r\n context: { component: string; operation: string }\r\n): Promise<T> {\r\n const start = Date.now();\r\n\r\n return Promise.race([\r\n fn(),\r\n new Promise<never>((_, reject) => {\r\n setTimeout(() => {\r\n reject(new TimeoutError(\r\n `Operation timed out after ${timeoutMs}ms`,\r\n {\r\n component: context.component,\r\n operation: context.operation,\r\n timeoutMs,\r\n elapsed: Date.now() - start,\r\n }\r\n ));\r\n }, timeoutMs);\r\n }),\r\n ]);\r\n}\r\n\r\n/**\r\n * Circuit breaker state\r\n */\r\ntype CircuitState = 'closed' | 'open' | 'half-open';\r\n\r\nexport interface CircuitBreakerConfig {\r\n failureThreshold: number;\r\n successThreshold: number;\r\n openDurationMs: number;\r\n onStateChange?: (from: CircuitState, to: CircuitState) => void;\r\n}\r\n\r\nconst DEFAULT_CIRCUIT_CONFIG: CircuitBreakerConfig = {\r\n failureThreshold: 5,\r\n successThreshold: 2,\r\n openDurationMs: 30000,\r\n};\r\n\r\n/**\r\n * Circuit breaker for protecting against cascading failures\r\n */\r\nexport class CircuitBreaker {\r\n private config: CircuitBreakerConfig;\r\n private state: CircuitState = 'closed';\r\n private failureCount = 0;\r\n private successCount = 0;\r\n private lastFailureTime = 0;\r\n private name: string;\r\n\r\n constructor(name: string, config: Partial<CircuitBreakerConfig> = {}) {\r\n this.name = name;\r\n this.config = { ...DEFAULT_CIRCUIT_CONFIG, ...config };\r\n }\r\n\r\n /**\r\n * Execute a function through the circuit breaker\r\n */\r\n async execute<T>(fn: () => Promise<T>): Promise<T> {\r\n // Check if circuit should transition from open to half-open\r\n if (this.state === 'open') {\r\n const timeSinceFailure = Date.now() - this.lastFailureTime;\r\n if (timeSinceFailure >= this.config.openDurationMs) {\r\n this.transition('half-open');\r\n } else {\r\n throw new VibeCheckError(\r\n `Circuit breaker \"${this.name}\" is open`,\r\n {\r\n code: 'RATE_LIMITED',\r\n component: 'CircuitBreaker',\r\n operation: 'execute',\r\n details: { state: this.state, name: this.name },\r\n recoveryHint: `Wait ${Math.ceil((this.config.openDurationMs - timeSinceFailure) / 1000)}s before retrying`,\r\n retryable: true,\r\n }\r\n );\r\n }\r\n }\r\n\r\n try {\r\n const result = await fn();\r\n this.onSuccess();\r\n return result;\r\n } catch (error) {\r\n this.onFailure();\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Get current state\r\n */\r\n getState(): CircuitState {\r\n return this.state;\r\n }\r\n\r\n /**\r\n * Get statistics\r\n */\r\n getStats(): {\r\n state: CircuitState;\r\n failureCount: number;\r\n successCount: number;\r\n lastFailureTime: number;\r\n } {\r\n return {\r\n state: this.state,\r\n failureCount: this.failureCount,\r\n successCount: this.successCount,\r\n lastFailureTime: this.lastFailureTime,\r\n };\r\n }\r\n\r\n /**\r\n * Reset the circuit breaker\r\n */\r\n reset(): void {\r\n this.failureCount = 0;\r\n this.successCount = 0;\r\n this.transition('closed');\r\n }\r\n\r\n private onSuccess(): void {\r\n this.failureCount = 0;\r\n\r\n if (this.state === 'half-open') {\r\n this.successCount++;\r\n if (this.successCount >= this.config.successThreshold) {\r\n this.transition('closed');\r\n }\r\n }\r\n }\r\n\r\n private onFailure(): void {\r\n this.lastFailureTime = Date.now();\r\n this.successCount = 0;\r\n this.failureCount++;\r\n\r\n if (this.state === 'half-open') {\r\n this.transition('open');\r\n } else if (this.failureCount >= this.config.failureThreshold) {\r\n this.transition('open');\r\n }\r\n }\r\n\r\n private transition(to: CircuitState): void {\r\n if (this.state === to) return;\r\n\r\n const from = this.state;\r\n this.state = to;\r\n \r\n if (to === 'closed') {\r\n this.failureCount = 0;\r\n this.successCount = 0;\r\n }\r\n\r\n this.config.onStateChange?.(from, to);\r\n }\r\n}\r\n\r\n/**\r\n * Simple sleep function\r\n */\r\nexport function sleep(ms: number): Promise<void> {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n}\r\n\r\n/**\r\n * Debounce a function\r\n */\r\nexport function debounce<T extends (...args: unknown[]) => unknown>(\r\n fn: T,\r\n delayMs: number\r\n): (...args: Parameters<T>) => void {\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n\r\n return (...args: Parameters<T>) => {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n }\r\n timeoutId = setTimeout(() => {\r\n fn(...args);\r\n timeoutId = null;\r\n }, delayMs);\r\n };\r\n}\r\n\r\n/**\r\n * Throttle a function\r\n */\r\nexport function throttle<T extends (...args: unknown[]) => unknown>(\r\n fn: T,\r\n limitMs: number\r\n): (...args: Parameters<T>) => void {\r\n let lastRun = 0;\r\n let scheduled: ReturnType<typeof setTimeout> | null = null;\r\n\r\n return (...args: Parameters<T>) => {\r\n const now = Date.now();\r\n const timeSinceLastRun = now - lastRun;\r\n\r\n if (timeSinceLastRun >= limitMs) {\r\n lastRun = now;\r\n fn(...args);\r\n } else if (!scheduled) {\r\n scheduled = setTimeout(() => {\r\n lastRun = Date.now();\r\n fn(...args);\r\n scheduled = null;\r\n }, limitMs - timeSinceLastRun);\r\n }\r\n };\r\n}\r\n\r\n// Global circuit breakers\r\nconst circuitBreakers = new Map<string, CircuitBreaker>();\r\n\r\n/**\r\n * Get or create a named circuit breaker\r\n */\r\nexport function getCircuitBreaker(\r\n name: string,\r\n config?: Partial<CircuitBreakerConfig>\r\n): CircuitBreaker {\r\n let breaker = circuitBreakers.get(name);\r\n if (!breaker) {\r\n breaker = new CircuitBreaker(name, config);\r\n circuitBreakers.set(name, breaker);\r\n }\r\n return breaker;\r\n}\r\n","/**\r\n * Intent Validator\r\n * \r\n * Validates that AI agent intentions align with user goals\r\n * and project constraints before allowing execution.\r\n */\r\n\r\nexport interface Intent {\r\n type: 'create' | 'modify' | 'delete' | 'refactor' | 'fix' | 'test';\r\n target: string;\r\n scope: 'file' | 'function' | 'class' | 'module' | 'project';\r\n description: string;\r\n valid: boolean;\r\n confidence: number;\r\n}\r\n\r\nexport interface IntentValidation {\r\n valid: boolean;\r\n intent: Intent;\r\n warnings: string[];\r\n suggestions: string[];\r\n}\r\n\r\nexport interface ValidationRule {\r\n name: string;\r\n check: (intent: Intent) => boolean;\r\n message: string;\r\n}\r\n\r\nexport class IntentValidator {\r\n private rules: ValidationRule[] = [];\r\n\r\n constructor() {\r\n this.initializeDefaultRules();\r\n }\r\n\r\n /**\r\n * Validate an intent from a request\r\n */\r\n async validate(request: {\r\n action: string;\r\n target: string;\r\n content: string;\r\n context: Record<string, unknown>;\r\n }): Promise<IntentValidation> {\r\n const intent = this.extractIntent(request);\r\n const warnings: string[] = [];\r\n const suggestions: string[] = [];\r\n\r\n // Apply all validation rules\r\n for (const rule of this.rules) {\r\n if (!rule.check(intent)) {\r\n warnings.push(rule.message);\r\n }\r\n }\r\n\r\n // Check for scope creep\r\n if (this.detectScopeCreep(intent, request.context)) {\r\n warnings.push('Intent scope exceeds expected boundaries');\r\n suggestions.push('Consider breaking this into smaller changes');\r\n }\r\n\r\n return {\r\n valid: warnings.length === 0,\r\n intent: { ...intent, valid: warnings.length === 0 },\r\n warnings,\r\n suggestions,\r\n };\r\n }\r\n\r\n /**\r\n * Add a custom validation rule\r\n */\r\n addRule(rule: ValidationRule): void {\r\n this.rules.push(rule);\r\n }\r\n\r\n private extractIntent(request: {\r\n action: string;\r\n target: string;\r\n content: string;\r\n }): Intent {\r\n // TODO: Implement intent extraction using NLP or heuristics\r\n return {\r\n type: this.mapActionToType(request.action),\r\n target: request.target,\r\n scope: this.inferScope(request.target),\r\n description: '',\r\n valid: true,\r\n confidence: 0.5,\r\n };\r\n }\r\n\r\n private mapActionToType(action: string): Intent['type'] {\r\n const mapping: Record<string, Intent['type']> = {\r\n write: 'create',\r\n modify: 'modify',\r\n delete: 'delete',\r\n execute: 'modify',\r\n };\r\n return mapping[action] ?? 'modify';\r\n }\r\n\r\n private inferScope(target: string): Intent['scope'] {\r\n if (target.includes('package.json') || target.includes('tsconfig')) {\r\n return 'project';\r\n }\r\n if (target.endsWith('.ts') || target.endsWith('.js')) {\r\n return 'file';\r\n }\r\n return 'module';\r\n }\r\n\r\n private detectScopeCreep(intent: Intent, context: Record<string, unknown>): boolean {\r\n // TODO: Implement scope creep detection\r\n return false;\r\n }\r\n\r\n private initializeDefaultRules(): void {\r\n this.rules = [\r\n {\r\n name: 'non-empty-target',\r\n check: (intent) => intent.target.length > 0,\r\n message: 'Intent must have a valid target',\r\n },\r\n {\r\n name: 'valid-scope',\r\n check: (intent) => ['file', 'function', 'class', 'module', 'project'].includes(intent.scope),\r\n message: 'Intent must have a valid scope',\r\n },\r\n {\r\n name: 'reasonable-confidence',\r\n check: (intent) => intent.confidence >= 0.3,\r\n message: 'Intent confidence is too low',\r\n },\r\n ];\r\n }\r\n}\r\n","/**\r\n * Claim Extractor\r\n * \r\n * Extracts verifiable claims from AI-generated content\r\n * that need to be validated against ground truth.\r\n */\r\n\r\nexport type ClaimType =\r\n | 'import'\r\n | 'function_call'\r\n | 'type_reference'\r\n | 'api_endpoint'\r\n | 'env_variable'\r\n | 'file_reference'\r\n | 'package_dependency';\r\n\r\nimport { generateFindingId } from '../utils/deterministic-ids.js';\r\n\r\nexport interface Claim {\r\n id: string; // Stable claim ID\r\n type: ClaimType;\r\n value: string;\r\n location: {\r\n line: number;\r\n column: number;\r\n length: number;\r\n };\r\n confidence: number;\r\n context: string;\r\n}\r\n\r\nexport interface ExtractionResult {\r\n claims: Claim[];\r\n unverifiable: string[];\r\n statistics: {\r\n totalClaims: number;\r\n byType: Record<ClaimType, number>;\r\n avgConfidence: number;\r\n };\r\n}\r\n\r\nexport class ClaimExtractor {\r\n /**\r\n * Extract all claims from content\r\n */\r\n async extract(content: string): Promise<Claim[]> {\r\n const claims: Claim[] = [];\r\n\r\n claims.push(...this.extractImports(content));\r\n claims.push(...this.extractFunctionCalls(content));\r\n claims.push(...this.extractTypeReferences(content));\r\n claims.push(...this.extractApiEndpoints(content));\r\n claims.push(...this.extractEnvVariables(content));\r\n claims.push(...this.extractFileReferences(content));\r\n claims.push(...this.extractPackageDependencies(content));\r\n\r\n return claims;\r\n }\r\n\r\n /**\r\n * Extract with full statistics\r\n */\r\n async extractWithStats(content: string): Promise<ExtractionResult> {\r\n const claims = await this.extract(content);\r\n \r\n const byType: Record<ClaimType, number> = {\r\n import: 0,\r\n function_call: 0,\r\n type_reference: 0,\r\n api_endpoint: 0,\r\n env_variable: 0,\r\n file_reference: 0,\r\n package_dependency: 0,\r\n };\r\n\r\n let totalConfidence = 0;\r\n for (const claim of claims) {\r\n byType[claim.type]++;\r\n totalConfidence += claim.confidence;\r\n }\r\n\r\n return {\r\n claims,\r\n unverifiable: [],\r\n statistics: {\r\n totalClaims: claims.length,\r\n byType,\r\n avgConfidence: claims.length > 0 ? totalConfidence / claims.length : 0,\r\n },\r\n };\r\n }\r\n\r\n private extractImports(content: string): Claim[] {\r\n const claims: Claim[] = [];\r\n const importRegex = /import\\s+(?:{[^}]+}|\\*\\s+as\\s+\\w+|\\w+)\\s+from\\s+['\"]([^'\"]+)['\"]/g;\r\n \r\n let match;\r\n while ((match = importRegex.exec(content)) !== null) {\r\n claims.push(this.createClaim('import', match[1], match.index, content));\r\n }\r\n\r\n return claims;\r\n }\r\n\r\n private extractFunctionCalls(content: string): Claim[] {\r\n const claims: Claim[] = [];\r\n // TODO: Implement function call extraction using AST\r\n return claims;\r\n }\r\n\r\n private extractTypeReferences(content: string): Claim[] {\r\n const claims: Claim[] = [];\r\n const typeRegex = /:\\s*(\\w+)(?:<[^>]+>)?/g;\r\n \r\n let match;\r\n while ((match = typeRegex.exec(content)) !== null) {\r\n const typeName = match[1];\r\n if (!this.isBuiltinType(typeName)) {\r\n claims.push(this.createClaim('type_reference', typeName, match.index, content));\r\n }\r\n }\r\n\r\n return claims;\r\n }\r\n\r\n private extractApiEndpoints(content: string): Claim[] {\r\n const claims: Claim[] = [];\r\n const endpointRegex = /['\"`](\\/api\\/[^'\"`]+)['\"`]/g;\r\n \r\n let match;\r\n while ((match = endpointRegex.exec(content)) !== null) {\r\n claims.push(this.createClaim('api_endpoint', match[1], match.index, content));\r\n }\r\n\r\n return claims;\r\n }\r\n\r\n private extractEnvVariables(content: string): Claim[] {\r\n const claims: Claim[] = [];\r\n const envRegex = /process\\.env\\.(\\w+)|import\\.meta\\.env\\.(\\w+)/g;\r\n \r\n let match;\r\n while ((match = envRegex.exec(content)) !== null) {\r\n const varName = match[1] || match[2];\r\n claims.push(this.createClaim('env_variable', varName, match.index, content));\r\n }\r\n\r\n return claims;\r\n }\r\n\r\n private extractFileReferences(content: string): Claim[] {\r\n const claims: Claim[] = [];\r\n const fileRegex = /['\"`](\\.\\.?\\/[^'\"`]+\\.[a-z]+)['\"`]/gi;\r\n \r\n let match;\r\n while ((match = fileRegex.exec(content)) !== null) {\r\n claims.push(this.createClaim('file_reference', match[1], match.index, content));\r\n }\r\n\r\n return claims;\r\n }\r\n\r\n private extractPackageDependencies(content: string): Claim[] {\r\n const claims: Claim[] = [];\r\n const importRegex = /from\\s+['\"]([^./][^'\"]+)['\"]/g;\r\n \r\n let match;\r\n while ((match = importRegex.exec(content)) !== null) {\r\n claims.push(this.createClaim('package_dependency', match[1], match.index, content));\r\n }\r\n\r\n return claims;\r\n }\r\n\r\n private createClaim(type: ClaimType, value: string, index: number, content: string): Claim {\r\n const lines = content.slice(0, index).split('\\n');\r\n const line = lines.length;\r\n const column = (lines[lines.length - 1]?.length ?? 0) + 1;\r\n const filePath = 'unknown'; // Will be set by caller if available\r\n\r\n return {\r\n id: generateFindingId(`claim-${type}`, filePath, line, column, value),\r\n type,\r\n value,\r\n location: { line, column, length: value.length },\r\n confidence: 0.8,\r\n context: content.slice(Math.max(0, index - 50), index + value.length + 50),\r\n };\r\n }\r\n\r\n private isBuiltinType(type: string): boolean {\r\n const builtins = [\r\n 'string', 'number', 'boolean', 'void', 'null', 'undefined',\r\n 'any', 'unknown', 'never', 'object', 'Array', 'Promise',\r\n 'Record', 'Partial', 'Required', 'Pick', 'Omit',\r\n ];\r\n return builtins.includes(type);\r\n }\r\n}\r\n","/**\r\n * Evidence Resolver\r\n * \r\n * Resolves evidence for claims by querying multiple sources\r\n * (truthpack, filesystem, package.json, AST).\r\n * \r\n * Features:\r\n * - Parallel evidence resolution\r\n * - Intelligent caching with TTL\r\n * - Multiple fallback sources\r\n * - Performance tracking\r\n */\r\n\r\nimport * as fs from 'fs/promises';\r\nimport * as path from 'path';\r\nimport { glob } from 'glob';\r\nimport type { Claim, ClaimType } from './claim-extractor.js';\r\nimport { getLogger, type Logger } from '../utils/logger.js';\r\nimport { Cache } from '../utils/cache.js';\r\nimport { PerformanceTracker } from '../utils/performance.js';\r\nimport { withTimeout, withRetry } from '../utils/retry.js';\r\nimport { parallelLimit } from '../utils/performance.js';\r\nimport { wrapError, ResourceNotFoundError } from '../utils/errors.js';\r\n\r\nexport type EvidenceSource = 'truthpack' | 'filesystem' | 'package_json' | 'ast' | 'git';\r\n\r\nexport interface Evidence {\r\n claimId: string;\r\n found: boolean;\r\n source: EvidenceSource;\r\n location?: {\r\n file: string;\r\n line?: number;\r\n };\r\n confidence: number;\r\n details: Record<string, unknown>;\r\n resolvedAt?: number;\r\n cacheHit?: boolean;\r\n}\r\n\r\nexport interface ResolverConfig {\r\n sources: EvidenceSource[];\r\n truthpackPath: string;\r\n projectRoot: string;\r\n timeout: number;\r\n enableCaching: boolean;\r\n cacheTtlMs: number;\r\n parallelLimit: number;\r\n maxFileSize: number;\r\n}\r\n\r\nconst DEFAULT_CONFIG: ResolverConfig = {\r\n sources: ['truthpack', 'filesystem', 'package_json', 'ast'],\r\n truthpackPath: '.vibecheck/truthpack',\r\n projectRoot: process.cwd(),\r\n timeout: 5000,\r\n enableCaching: true,\r\n cacheTtlMs: 5 * 60 * 1000, // 5 minutes\r\n parallelLimit: 10,\r\n maxFileSize: 1024 * 1024, // 1MB\r\n};\r\n\r\n// Cache for loaded truthpack data\r\ninterface TruthpackCache {\r\n routes?: { routes: Array<{ path: string; method: string; file: string; line: number }> };\r\n env?: { variables: Array<{ name: string; usedIn?: Array<{ file: string; line: number }> }> };\r\n contracts?: { contracts: Array<{ path: string; method: string }> };\r\n auth?: { protectedResources: Array<{ path: string; method?: string; requiredRoles: string[] }> };\r\n loadedAt?: number;\r\n}\r\n\r\n// Node.js built-in modules\r\nconst BUILTIN_MODULES = new Set([\r\n 'fs', 'path', 'os', 'crypto', 'http', 'https', 'url', 'util',\r\n 'stream', 'buffer', 'events', 'child_process', 'cluster',\r\n 'dns', 'net', 'readline', 'tls', 'zlib', 'assert', 'async_hooks',\r\n 'fs/promises', 'path/posix', 'path/win32', 'querystring',\r\n 'timers', 'timers/promises', 'perf_hooks', 'worker_threads',\r\n 'v8', 'vm', 'inspector', 'trace_events', 'string_decoder',\r\n]);\r\n\r\nexport class EvidenceResolver {\r\n private config: ResolverConfig;\r\n private truthpackCache: TruthpackCache = {};\r\n private packageJsonCache: Record<string, unknown> | null = null;\r\n private evidenceCache: Cache<Evidence>;\r\n private fileExistsCache: Cache<boolean>;\r\n private logger: Logger;\r\n private performanceTracker: PerformanceTracker;\r\n\r\n constructor(config: Partial<ResolverConfig> = {}) {\r\n this.config = { ...DEFAULT_CONFIG, ...config };\r\n this.logger = getLogger('evidence-resolver');\r\n this.performanceTracker = new PerformanceTracker();\r\n \r\n this.evidenceCache = new Cache<Evidence>({\r\n maxSize: 1000,\r\n defaultTtlMs: this.config.cacheTtlMs,\r\n });\r\n \r\n this.fileExistsCache = new Cache<boolean>({\r\n maxSize: 500,\r\n defaultTtlMs: 30000, // 30 seconds for file existence\r\n });\r\n }\r\n\r\n /**\r\n * Resolve evidence for a single claim\r\n */\r\n async resolve(claim: Claim): Promise<Evidence> {\r\n const cacheKey = this.getCacheKey(claim);\r\n \r\n // Check cache first\r\n if (this.config.enableCaching) {\r\n const cached = this.evidenceCache.get(cacheKey);\r\n if (cached) {\r\n this.logger.debug('Evidence cache hit', { claimId: claim.id, type: claim.type });\r\n return { ...cached, cacheHit: true };\r\n }\r\n }\r\n\r\n const resolvers = this.getResolversForType(claim.type);\r\n const startTime = performance.now();\r\n\r\n for (const resolver of resolvers) {\r\n try {\r\n const evidence = await withTimeout(\r\n () => resolver(claim),\r\n this.config.timeout,\r\n { component: 'EvidenceResolver', operation: 'resolve' }\r\n );\r\n \r\n if (evidence.found) {\r\n evidence.resolvedAt = Date.now();\r\n \r\n // Cache successful resolution\r\n if (this.config.enableCaching) {\r\n this.evidenceCache.set(cacheKey, evidence);\r\n }\r\n \r\n this.logger.debug('Evidence found', {\r\n claimId: claim.id,\r\n source: evidence.source,\r\n durationMs: Math.round(performance.now() - startTime),\r\n });\r\n \r\n return evidence;\r\n }\r\n } catch (error) {\r\n this.logger.debug('Resolver failed, trying next', {\r\n claimId: claim.id,\r\n resolver: resolver.name,\r\n error: error instanceof Error ? error.message : 'Unknown',\r\n });\r\n // Continue to next resolver if one fails\r\n }\r\n }\r\n\r\n const notFoundEvidence = this.createNotFoundEvidence(claim);\r\n notFoundEvidence.resolvedAt = Date.now();\r\n \r\n this.logger.debug('Evidence not found', {\r\n claimId: claim.id,\r\n type: claim.type,\r\n value: claim.value.slice(0, 50),\r\n });\r\n \r\n return notFoundEvidence;\r\n }\r\n\r\n /**\r\n * Resolve evidence for multiple claims in parallel\r\n */\r\n async resolveAll(claims: Claim[]): Promise<Evidence[]> {\r\n if (claims.length === 0) return [];\r\n\r\n const startTime = performance.now();\r\n \r\n this.logger.debug('Resolving evidence for claims', { count: claims.length });\r\n\r\n // Resolve in parallel with concurrency limit\r\n const results = await parallelLimit(\r\n claims,\r\n this.config.parallelLimit,\r\n async (claim) => {\r\n try {\r\n return await this.resolve(claim);\r\n } catch (error) {\r\n this.logger.warn('Failed to resolve claim', {\r\n claimId: claim.id,\r\n error: error instanceof Error ? error.message : 'Unknown',\r\n });\r\n return this.createNotFoundEvidence(claim);\r\n }\r\n }\r\n );\r\n\r\n const durationMs = performance.now() - startTime;\r\n const foundCount = results.filter(e => e.found).length;\r\n \r\n this.logger.info('Evidence resolution complete', {\r\n total: claims.length,\r\n found: foundCount,\r\n notFound: claims.length - foundCount,\r\n durationMs: Math.round(durationMs),\r\n });\r\n\r\n this.performanceTracker.record('resolveAll', durationMs);\r\n \r\n return results;\r\n }\r\n\r\n /**\r\n * Clear all caches\r\n */\r\n clearCache(): void {\r\n this.truthpackCache = {};\r\n this.packageJsonCache = null;\r\n this.evidenceCache.clear();\r\n this.fileExistsCache.clear();\r\n this.logger.debug('Caches cleared');\r\n }\r\n\r\n /**\r\n * Get cache statistics\r\n */\r\n getCacheStats(): {\r\n evidence: { size: number; hitRate: number };\r\n fileExists: { size: number; hitRate: number };\r\n } {\r\n const evidenceStats = this.evidenceCache.getStats();\r\n const fileStats = this.fileExistsCache.getStats();\r\n \r\n return {\r\n evidence: { size: evidenceStats.size, hitRate: evidenceStats.hitRate },\r\n fileExists: { size: fileStats.size, hitRate: fileStats.hitRate },\r\n };\r\n }\r\n\r\n /**\r\n * Get performance metrics\r\n */\r\n getPerformanceMetrics(): Record<string, unknown> {\r\n return this.performanceTracker.export();\r\n }\r\n\r\n private getCacheKey(claim: Claim): string {\r\n return `${claim.type}:${claim.value}`;\r\n }\r\n\r\n private getResolversForType(type: ClaimType): Array<(claim: Claim) => Promise<Evidence>> {\r\n const resolverMap: Record<ClaimType, Array<(claim: Claim) => Promise<Evidence>>> = {\r\n import: [\r\n this.resolveFromPackageJson.bind(this),\r\n this.resolveFromFilesystem.bind(this),\r\n ],\r\n function_call: [\r\n this.resolveFromTruthpack.bind(this),\r\n this.resolveFromAst.bind(this),\r\n ],\r\n type_reference: [\r\n this.resolveFromTruthpack.bind(this),\r\n this.resolveFromAst.bind(this),\r\n ],\r\n api_endpoint: [\r\n this.resolveFromTruthpack.bind(this),\r\n ],\r\n env_variable: [\r\n this.resolveFromTruthpack.bind(this),\r\n this.resolveFromFilesystem.bind(this),\r\n ],\r\n file_reference: [\r\n this.resolveFromFilesystem.bind(this),\r\n ],\r\n package_dependency: [\r\n this.resolveFromPackageJson.bind(this),\r\n ],\r\n };\r\n\r\n return resolverMap[type] ?? [];\r\n }\r\n\r\n /**\r\n * Load a truthpack file with caching and retry\r\n */\r\n private async loadTruthpack<T>(name: string): Promise<T | null> {\r\n const filePath = path.join(this.config.projectRoot, this.config.truthpackPath, `${name}.json`);\r\n \r\n try {\r\n return await withRetry(\r\n async () => {\r\n const content = await fs.readFile(filePath, 'utf-8');\r\n return JSON.parse(content) as T;\r\n },\r\n { maxAttempts: 2, initialDelayMs: 50 }\r\n );\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Resolve claim from truthpack data\r\n */\r\n private async resolveFromTruthpack(claim: Claim): Promise<Evidence> {\r\n // Check if truthpack is stale (reload after 5 minutes)\r\n const now = Date.now();\r\n if (this.truthpackCache.loadedAt && now - this.truthpackCache.loadedAt > 5 * 60 * 1000) {\r\n this.truthpackCache = {};\r\n }\r\n\r\n switch (claim.type) {\r\n case 'api_endpoint':\r\n return this.resolveApiEndpointFromTruthpack(claim);\r\n case 'env_variable':\r\n return this.resolveEnvFromTruthpack(claim);\r\n case 'function_call':\r\n case 'type_reference':\r\n return this.resolveDefinitionFromTruthpack(claim);\r\n default:\r\n return this.createNotFoundEvidence(claim);\r\n }\r\n }\r\n\r\n /**\r\n * Resolve API endpoint from routes truthpack\r\n */\r\n private async resolveApiEndpointFromTruthpack(claim: Claim): Promise<Evidence> {\r\n if (!this.truthpackCache.routes) {\r\n this.truthpackCache.routes = await this.loadTruthpack<TruthpackCache['routes']>('routes') ?? undefined;\r\n this.truthpackCache.loadedAt = Date.now();\r\n }\r\n\r\n const routes = this.truthpackCache.routes;\r\n if (!routes?.routes || routes.routes.length === 0) {\r\n return this.createNotFoundEvidence(claim);\r\n }\r\n\r\n const claimedPath = claim.value;\r\n\r\n // Check for exact match or parameterized match\r\n for (const route of routes.routes) {\r\n if (this.pathsMatch(claimedPath, route.path)) {\r\n return {\r\n claimId: claim.id,\r\n found: true,\r\n source: 'truthpack',\r\n location: {\r\n file: route.file,\r\n line: route.line,\r\n },\r\n confidence: 1.0,\r\n details: {\r\n matchedRoute: route.path,\r\n method: route.method,\r\n exactMatch: claimedPath === route.path,\r\n },\r\n };\r\n }\r\n }\r\n\r\n return this.createNotFoundEvidence(claim);\r\n }\r\n\r\n /**\r\n * Check if two paths match (handling route parameters)\r\n */\r\n private pathsMatch(claimed: string, defined: string): boolean {\r\n // Exact match\r\n if (claimed === defined) return true;\r\n\r\n // Normalize paths\r\n const claimedParts = claimed.split('/').filter(Boolean);\r\n const definedParts = defined.split('/').filter(Boolean);\r\n\r\n if (claimedParts.length !== definedParts.length) return false;\r\n\r\n for (let i = 0; i < claimedParts.length; i++) {\r\n const c = claimedParts[i];\r\n const d = definedParts[i];\r\n\r\n // If defined part is a parameter (e.g., :id, [id], {id}), it matches any value\r\n if (d.startsWith(':') || d.startsWith('[') || d.startsWith('{')) continue;\r\n \r\n // Check for wildcard segments\r\n if (d === '*' || d === '**') continue;\r\n \r\n if (c !== d) return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Resolve environment variable from truthpack\r\n */\r\n private async resolveEnvFromTruthpack(claim: Claim): Promise<Evidence> {\r\n if (!this.truthpackCache.env) {\r\n this.truthpackCache.env = await this.loadTruthpack<TruthpackCache['env']>('env') ?? undefined;\r\n }\r\n\r\n const env = this.truthpackCache.env;\r\n if (!env?.variables) {\r\n return this.createNotFoundEvidence(claim);\r\n }\r\n\r\n // Normalize variable name (remove process.env. prefix if present)\r\n const varName = claim.value.replace(/^process\\.env\\./, '');\r\n \r\n const variable = env.variables.find(v => v.name === varName);\r\n if (variable) {\r\n const location = variable.usedIn?.[0];\r\n return {\r\n claimId: claim.id,\r\n found: true,\r\n source: 'truthpack',\r\n location: location ? { file: location.file, line: location.line } : undefined,\r\n confidence: 1.0,\r\n details: {\r\n variableName: variable.name,\r\n usageCount: variable.usedIn?.length ?? 0,\r\n },\r\n };\r\n }\r\n\r\n return this.createNotFoundEvidence(claim);\r\n }\r\n\r\n /**\r\n * Resolve function/type definition from truthpack contracts\r\n */\r\n private async resolveDefinitionFromTruthpack(claim: Claim): Promise<Evidence> {\r\n if (!this.truthpackCache.contracts) {\r\n this.truthpackCache.contracts = await this.loadTruthpack<TruthpackCache['contracts']>('contracts') ?? undefined;\r\n }\r\n\r\n // For now, return not found - would need more sophisticated analysis\r\n return this.createNotFoundEvidence(claim);\r\n }\r\n\r\n /**\r\n * Resolve claim from filesystem\r\n */\r\n private async resolveFromFilesystem(claim: Claim): Promise<Evidence> {\r\n switch (claim.type) {\r\n case 'file_reference':\r\n return this.resolveFileReference(claim);\r\n case 'import':\r\n return this.resolveImportFromFilesystem(claim);\r\n case 'env_variable':\r\n return this.resolveEnvFromFilesystem(claim);\r\n default:\r\n return this.createNotFoundEvidence(claim);\r\n }\r\n }\r\n\r\n /**\r\n * Check if a file exists with caching\r\n */\r\n private async fileExists(filePath: string): Promise<boolean> {\r\n // Check cache\r\n const cached = this.fileExistsCache.get(filePath);\r\n if (cached !== undefined) return cached;\r\n\r\n try {\r\n await fs.access(filePath);\r\n this.fileExistsCache.set(filePath, true);\r\n return true;\r\n } catch {\r\n this.fileExistsCache.set(filePath, false);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Resolve file reference by checking existence\r\n */\r\n private async resolveFileReference(claim: Claim): Promise<Evidence> {\r\n const filePath = path.resolve(this.config.projectRoot, claim.value);\r\n\r\n if (await this.fileExists(filePath)) {\r\n return {\r\n claimId: claim.id,\r\n found: true,\r\n source: 'filesystem',\r\n location: { file: claim.value },\r\n confidence: 1.0,\r\n details: { resolvedPath: filePath },\r\n };\r\n }\r\n\r\n // Try with common extensions if no extension provided\r\n if (!path.extname(claim.value)) {\r\n const extensions = ['.ts', '.tsx', '.js', '.jsx', '.json', '.mjs', '.cjs'];\r\n for (const ext of extensions) {\r\n const fullPath = filePath + ext;\r\n if (await this.fileExists(fullPath)) {\r\n return {\r\n claimId: claim.id,\r\n found: true,\r\n source: 'filesystem',\r\n location: { file: claim.value + ext },\r\n confidence: 0.9,\r\n details: { resolvedPath: fullPath, addedExtension: ext },\r\n };\r\n }\r\n }\r\n\r\n // Also try index files\r\n const indexExtensions = ['/index.ts', '/index.tsx', '/index.js', '/index.jsx'];\r\n for (const ext of indexExtensions) {\r\n const fullPath = filePath + ext;\r\n if (await this.fileExists(fullPath)) {\r\n return {\r\n claimId: claim.id,\r\n found: true,\r\n source: 'filesystem',\r\n location: { file: claim.value + ext },\r\n confidence: 0.85,\r\n details: { resolvedPath: fullPath, addedIndex: ext },\r\n };\r\n }\r\n }\r\n }\r\n\r\n return this.createNotFoundEvidence(claim);\r\n }\r\n\r\n /**\r\n * Resolve import from filesystem (for relative imports)\r\n */\r\n private async resolveImportFromFilesystem(claim: Claim): Promise<Evidence> {\r\n const importPath = claim.value;\r\n\r\n // Only handle relative imports\r\n if (!importPath.startsWith('.') && !importPath.startsWith('/')) {\r\n return this.createNotFoundEvidence(claim);\r\n }\r\n\r\n const basePath = path.resolve(this.config.projectRoot, importPath);\r\n const extensions = ['', '.ts', '.tsx', '.js', '.jsx', '.mjs', '/index.ts', '/index.tsx', '/index.js', '/index.jsx'];\r\n\r\n for (const ext of extensions) {\r\n const fullPath = basePath + ext;\r\n if (await this.fileExists(fullPath)) {\r\n return {\r\n claimId: claim.id,\r\n found: true,\r\n source: 'filesystem',\r\n location: { file: importPath + ext },\r\n confidence: 1.0,\r\n details: { resolvedPath: fullPath },\r\n };\r\n }\r\n }\r\n\r\n return this.createNotFoundEvidence(claim);\r\n }\r\n\r\n /**\r\n * Resolve environment variable from .env files\r\n */\r\n private async resolveEnvFromFilesystem(claim: Claim): Promise<Evidence> {\r\n const envFiles = ['.env', '.env.local', '.env.development', '.env.production', '.env.example', '.env.test'];\r\n const varName = claim.value.replace(/^process\\.env\\./, '');\r\n\r\n for (const envFile of envFiles) {\r\n const filePath = path.join(this.config.projectRoot, envFile);\r\n \r\n try {\r\n const content = await fs.readFile(filePath, 'utf-8');\r\n const lines = content.split('\\n');\r\n\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i].trim();\r\n \r\n // Skip comments\r\n if (line.startsWith('#')) continue;\r\n \r\n // Match variable definition\r\n const match = line.match(new RegExp(`^${varName}\\\\s*=`));\r\n if (match) {\r\n return {\r\n claimId: claim.id,\r\n found: true,\r\n source: 'filesystem',\r\n location: { file: envFile, line: i + 1 },\r\n confidence: 1.0,\r\n details: { foundIn: envFile, isExample: envFile.includes('example') },\r\n };\r\n }\r\n }\r\n } catch {\r\n continue;\r\n }\r\n }\r\n\r\n return this.createNotFoundEvidence(claim);\r\n }\r\n\r\n /**\r\n * Resolve claim from package.json\r\n */\r\n private async resolveFromPackageJson(claim: Claim): Promise<Evidence> {\r\n if (!this.packageJsonCache) {\r\n try {\r\n const content = await fs.readFile(\r\n path.join(this.config.projectRoot, 'package.json'),\r\n 'utf-8'\r\n );\r\n this.packageJsonCache = JSON.parse(content);\r\n } catch {\r\n return this.createNotFoundEvidence(claim);\r\n }\r\n }\r\n\r\n const pkg = this.packageJsonCache as {\r\n dependencies?: Record<string, string>;\r\n devDependencies?: Record<string, string>;\r\n peerDependencies?: Record<string, string>;\r\n };\r\n\r\n // Extract package name (handle scoped packages and subpaths)\r\n let packageName = claim.value;\r\n\r\n // Handle node: protocol\r\n if (packageName.startsWith('node:')) {\r\n packageName = packageName.slice(5);\r\n }\r\n\r\n // Handle subpath imports like 'lodash/get' -> 'lodash'\r\n if (!packageName.startsWith('@')) {\r\n packageName = packageName.split('/')[0];\r\n } else {\r\n // Scoped package: @scope/package/subpath -> @scope/package\r\n const parts = packageName.split('/');\r\n packageName = parts.slice(0, 2).join('/');\r\n }\r\n\r\n // Check if it's a Node.js built-in module\r\n if (BUILTIN_MODULES.has(packageName)) {\r\n return {\r\n claimId: claim.id,\r\n found: true,\r\n source: 'package_json',\r\n confidence: 1.0,\r\n details: {\r\n packageName,\r\n isBuiltin: true,\r\n originalImport: claim.value,\r\n },\r\n };\r\n }\r\n\r\n // Check in dependencies\r\n const allDeps = {\r\n ...pkg.dependencies,\r\n ...pkg.devDependencies,\r\n ...pkg.peerDependencies,\r\n };\r\n\r\n if (packageName in allDeps) {\r\n const version = allDeps[packageName];\r\n const depType = pkg.dependencies?.[packageName]\r\n ? 'dependencies'\r\n : pkg.devDependencies?.[packageName]\r\n ? 'devDependencies'\r\n : 'peerDependencies';\r\n\r\n return {\r\n claimId: claim.id,\r\n found: true,\r\n source: 'package_json',\r\n location: { file: 'package.json' },\r\n confidence: 1.0,\r\n details: {\r\n packageName,\r\n version,\r\n dependencyType: depType,\r\n originalImport: claim.value,\r\n },\r\n };\r\n }\r\n\r\n return this.createNotFoundEvidence(claim);\r\n }\r\n\r\n /**\r\n * Resolve claim using AST analysis\r\n */\r\n private async resolveFromAst(claim: Claim): Promise<Evidence> {\r\n const searchPatterns = this.getSearchPatternsForClaim(claim);\r\n if (searchPatterns.length === 0) {\r\n return this.createNotFoundEvidence(claim);\r\n }\r\n\r\n try {\r\n // Find TypeScript/JavaScript files\r\n const files = await glob('**/*.{ts,tsx,js,jsx}', {\r\n cwd: this.config.projectRoot,\r\n ignore: ['node_modules/**', 'dist/**', 'build/**', '.next/**', 'coverage/**'],\r\n absolute: true,\r\n });\r\n\r\n // Limit files to search for performance\r\n const filesToSearch = files.slice(0, 500);\r\n\r\n for (const filePath of filesToSearch) {\r\n try {\r\n // Check file size before reading\r\n const stat = await fs.stat(filePath);\r\n if (stat.size > this.config.maxFileSize) continue;\r\n\r\n const content = await fs.readFile(filePath, 'utf-8');\r\n const lines = content.split('\\n');\r\n\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i];\r\n for (const pattern of searchPatterns) {\r\n if (pattern.test(line)) {\r\n return {\r\n claimId: claim.id,\r\n found: true,\r\n source: 'ast',\r\n location: {\r\n file: path.relative(this.config.projectRoot, filePath),\r\n line: i + 1,\r\n },\r\n confidence: 0.9,\r\n details: {\r\n matchedLine: line.trim().slice(0, 100),\r\n searchedValue: claim.value,\r\n },\r\n };\r\n }\r\n }\r\n }\r\n } catch {\r\n continue;\r\n }\r\n }\r\n } catch (error) {\r\n this.logger.debug('AST search failed', { error: error instanceof Error ? error.message : 'Unknown' });\r\n }\r\n\r\n return this.createNotFoundEvidence(claim);\r\n }\r\n\r\n /**\r\n * Get regex patterns to search for a claim\r\n */\r\n private getSearchPatternsForClaim(claim: Claim): RegExp[] {\r\n const value = claim.value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // Escape regex\r\n\r\n switch (claim.type) {\r\n case 'function_call':\r\n return [\r\n new RegExp(`function\\\\s+${value}\\\\s*\\\\(`),\r\n new RegExp(`const\\\\s+${value}\\\\s*=\\\\s*(?:async\\\\s+)?(?:function|\\\\()`),\r\n new RegExp(`(?:export\\\\s+)?(?:async\\\\s+)?function\\\\s+${value}`),\r\n new RegExp(`${value}\\\\s*:\\\\s*(?:async\\\\s+)?\\\\([^)]*\\\\)\\\\s*=>`),\r\n new RegExp(`(?:export\\\\s+)?const\\\\s+${value}\\\\s*=\\\\s*\\\\(`),\r\n ];\r\n case 'type_reference':\r\n return [\r\n new RegExp(`(?:interface|type|class|enum)\\\\s+${value}\\\\b`),\r\n new RegExp(`export\\\\s+(?:interface|type|class|enum)\\\\s+${value}\\\\b`),\r\n ];\r\n default:\r\n return [];\r\n }\r\n }\r\n\r\n private createNotFoundEvidence(claim: Claim): Evidence {\r\n return {\r\n claimId: claim.id,\r\n found: false,\r\n source: 'truthpack',\r\n confidence: 0,\r\n details: {\r\n searchedValue: claim.value,\r\n searchedType: claim.type,\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * Dispose resources\r\n */\r\n dispose(): void {\r\n this.evidenceCache.dispose();\r\n this.fileExistsCache.dispose();\r\n }\r\n}\r\n","/**\r\n * Policy Engine\r\n * \r\n * Evaluates firewall policies against claims and evidence\r\n * to make allow/deny decisions.\r\n * \r\n * Includes comprehensive input validation and safe defaults.\r\n */\r\n\r\nimport type { Intent } from './intent-validator.js';\r\nimport type { Claim } from './claim-extractor.js';\r\nimport type { Evidence } from './evidence-resolver.js';\r\nimport type { FirewallConfig } from './agent-firewall.js';\r\n\r\n/**\r\n * Safety limits for policy evaluation\r\n */\r\nconst POLICY_LIMITS = {\r\n MAX_POLICIES: 50,\r\n MAX_CLAIMS_TO_EVALUATE: 100,\r\n MAX_EVIDENCE_TO_CHECK: 200,\r\n MAX_VIOLATIONS: 50,\r\n MAX_MESSAGE_LENGTH: 500,\r\n EVALUATION_TIMEOUT_MS: 5000,\r\n} as const;\r\n\r\n/**\r\n * Valid severity levels\r\n */\r\nconst VALID_SEVERITIES = ['error', 'warning', 'info'] as const;\r\ntype PolicySeverity = typeof VALID_SEVERITIES[number];\r\n\r\nexport interface Policy {\r\n name: string;\r\n description: string;\r\n severity: PolicySeverity;\r\n evaluate: (context: PolicyContext) => PolicyViolation | null;\r\n}\r\n\r\nexport interface PolicyContext {\r\n intent: { valid: boolean; intent: Intent };\r\n claims: Claim[];\r\n evidence: Evidence[];\r\n config: FirewallConfig;\r\n}\r\n\r\nexport interface PolicyViolation {\r\n policy: string;\r\n severity: PolicySeverity;\r\n message: string;\r\n claim?: Claim;\r\n suggestion?: string;\r\n}\r\n\r\nexport interface PolicyDecision {\r\n allowed: boolean;\r\n reason: string;\r\n violations: PolicyViolation[];\r\n confidence: number;\r\n evaluationTimeMs?: number;\r\n}\r\n\r\n/**\r\n * Validate that a value is a valid severity\r\n */\r\nfunction isValidSeverity(value: unknown): value is PolicySeverity {\r\n return typeof value === 'string' && VALID_SEVERITIES.includes(value as PolicySeverity);\r\n}\r\n\r\n/**\r\n * Sanitize a message string\r\n */\r\nfunction sanitizeMessage(message: string): string {\r\n if (typeof message !== 'string') return '';\r\n return message.slice(0, POLICY_LIMITS.MAX_MESSAGE_LENGTH).replace(/[<>]/g, '');\r\n}\r\n\r\nexport class PolicyEngine {\r\n private policies: Policy[] = [];\r\n\r\n constructor() {\r\n this.initializeDefaultPolicies();\r\n }\r\n\r\n /**\r\n * Evaluate all policies against the context with safety checks\r\n */\r\n async evaluate(context: PolicyContext): Promise<PolicyDecision> {\r\n const startTime = Date.now();\r\n const violations: PolicyViolation[] = [];\r\n\r\n // Validate context\r\n if (!context || typeof context !== 'object') {\r\n return {\r\n allowed: false,\r\n reason: 'Invalid policy context',\r\n violations: [{\r\n policy: 'validation',\r\n severity: 'error',\r\n message: 'Invalid policy context provided',\r\n }],\r\n confidence: 0,\r\n evaluationTimeMs: Date.now() - startTime,\r\n };\r\n }\r\n\r\n // Limit claims and evidence to prevent DoS\r\n const limitedClaims = (context.claims ?? []).slice(0, POLICY_LIMITS.MAX_CLAIMS_TO_EVALUATE);\r\n const limitedEvidence = (context.evidence ?? []).slice(0, POLICY_LIMITS.MAX_EVIDENCE_TO_CHECK);\r\n \r\n const safeContext: PolicyContext = {\r\n ...context,\r\n claims: limitedClaims,\r\n evidence: limitedEvidence,\r\n };\r\n\r\n // Evaluate policies with error handling\r\n for (const policy of this.policies) {\r\n // Check timeout\r\n if (Date.now() - startTime > POLICY_LIMITS.EVALUATION_TIMEOUT_MS) {\r\n violations.push({\r\n policy: 'timeout',\r\n severity: 'warning',\r\n message: 'Policy evaluation timed out',\r\n });\r\n break;\r\n }\r\n\r\n try {\r\n const violation = policy.evaluate(safeContext);\r\n if (violation) {\r\n // Validate and sanitize violation\r\n violations.push({\r\n policy: sanitizeMessage(violation.policy || policy.name),\r\n severity: isValidSeverity(violation.severity) ? violation.severity : 'warning',\r\n message: sanitizeMessage(violation.message),\r\n claim: violation.claim,\r\n suggestion: violation.suggestion ? sanitizeMessage(violation.suggestion) : undefined,\r\n });\r\n\r\n // Limit violations\r\n if (violations.length >= POLICY_LIMITS.MAX_VIOLATIONS) {\r\n violations.push({\r\n policy: 'limit',\r\n severity: 'warning',\r\n message: `Maximum violations (${POLICY_LIMITS.MAX_VIOLATIONS}) reached`,\r\n });\r\n break;\r\n }\r\n }\r\n } catch (error) {\r\n // Log but don't fail on individual policy errors\r\n violations.push({\r\n policy: policy.name,\r\n severity: 'warning',\r\n message: `Policy evaluation error: ${error instanceof Error ? error.message : 'unknown'}`,\r\n });\r\n }\r\n }\r\n\r\n const errors = violations.filter((v) => v.severity === 'error');\r\n const strictMode = context.config?.strictMode ?? false;\r\n const allowed = strictMode ? errors.length === 0 : true;\r\n\r\n const evaluationTimeMs = Date.now() - startTime;\r\n\r\n return {\r\n allowed,\r\n reason: errors.length > 0 \r\n ? sanitizeMessage(`Blocked: ${errors.map((e) => e.message).join('; ')}`)\r\n : 'Allowed',\r\n violations,\r\n confidence: this.calculateConfidence(safeContext, violations),\r\n evaluationTimeMs,\r\n };\r\n }\r\n\r\n /**\r\n * Add a custom policy with validation\r\n */\r\n addPolicy(policy: Policy): void {\r\n // Validate policy\r\n if (!policy || typeof policy !== 'object') {\r\n throw new Error('Invalid policy object');\r\n }\r\n if (!policy.name || typeof policy.name !== 'string') {\r\n throw new Error('Policy must have a name');\r\n }\r\n if (!isValidSeverity(policy.severity)) {\r\n throw new Error(`Invalid severity: ${policy.severity}`);\r\n }\r\n if (typeof policy.evaluate !== 'function') {\r\n throw new Error('Policy must have an evaluate function');\r\n }\r\n\r\n // Check limit\r\n if (this.policies.length >= POLICY_LIMITS.MAX_POLICIES) {\r\n throw new Error(`Maximum policies (${POLICY_LIMITS.MAX_POLICIES}) reached`);\r\n }\r\n\r\n // Check for duplicate\r\n if (this.policies.some((p) => p.name === policy.name)) {\r\n throw new Error(`Policy with name \"${policy.name}\" already exists`);\r\n }\r\n\r\n this.policies.push(policy);\r\n }\r\n\r\n /**\r\n * Remove a policy by name\r\n */\r\n removePolicy(name: string): boolean {\r\n if (!name || typeof name !== 'string') {\r\n return false;\r\n }\r\n const initialLength = this.policies.length;\r\n this.policies = this.policies.filter((p) => p.name !== name);\r\n return this.policies.length < initialLength;\r\n }\r\n\r\n /**\r\n * Get all registered policies (readonly)\r\n */\r\n getPolicies(): readonly Policy[] {\r\n return [...this.policies];\r\n }\r\n\r\n private initializeDefaultPolicies(): void {\r\n this.policies = [\r\n // Ghost Route - Block API calls to undefined routes\r\n {\r\n name: 'ghost-route',\r\n description: 'Block references to non-existent API endpoints',\r\n severity: 'error',\r\n evaluate: (ctx) => {\r\n const ghostRoutes = ctx.claims\r\n .filter((c) => c.type === 'api_endpoint')\r\n .filter((c) => !ctx.evidence.find((e) => e.claimId === c.id && e.found));\r\n\r\n if (ghostRoutes.length > 0) {\r\n return {\r\n policy: 'ghost-route',\r\n severity: 'error',\r\n message: `GHOST ROUTE: ${ghostRoutes.map((c) => c.value).join(', ')}`,\r\n claim: ghostRoutes[0],\r\n suggestion: `Register route: vibecheck register route \"${ghostRoutes[0].value}\"`,\r\n };\r\n }\r\n return null;\r\n },\r\n },\r\n // Ghost Env - Block usage of undeclared env vars\r\n {\r\n name: 'ghost-env',\r\n description: 'Block usage of undeclared environment variables',\r\n severity: 'error',\r\n evaluate: (ctx) => {\r\n const ghostEnvVars = ctx.claims\r\n .filter((c) => c.type === 'env_variable')\r\n .filter((c) => !ctx.evidence.find((e) => e.claimId === c.id && e.found));\r\n\r\n if (ghostEnvVars.length > 0) {\r\n return {\r\n policy: 'ghost-env',\r\n severity: 'error',\r\n message: `GHOST ENV: ${ghostEnvVars.map((c) => c.value).join(', ')}`,\r\n claim: ghostEnvVars[0],\r\n suggestion: `Register env var: vibecheck register env \"${ghostEnvVars[0].value}\"`,\r\n };\r\n }\r\n return null;\r\n },\r\n },\r\n // Ghost Type - Warn on undefined type references\r\n {\r\n name: 'ghost-type',\r\n description: 'Warn when referencing undefined types',\r\n severity: 'warning',\r\n evaluate: (ctx) => {\r\n const ghostTypes = ctx.claims\r\n .filter((c) => c.type === 'type_reference')\r\n .filter((c) => !ctx.evidence.find((e) => e.claimId === c.id && e.found));\r\n\r\n if (ghostTypes.length > 0) {\r\n return {\r\n policy: 'ghost-type',\r\n severity: 'warning',\r\n message: `GHOST TYPE: ${ghostTypes.map((c) => c.value).join(', ')}`,\r\n claim: ghostTypes[0],\r\n suggestion: `Define type in contracts or ensure import exists`,\r\n };\r\n }\r\n return null;\r\n },\r\n },\r\n // Ghost Import - Block imports that cannot be verified\r\n {\r\n name: 'ghost-import',\r\n description: 'Block imports that cannot be verified',\r\n severity: 'error',\r\n evaluate: (ctx) => {\r\n const ghostImports = ctx.claims\r\n .filter((c) => c.type === 'import' || c.type === 'package_dependency')\r\n .filter((c) => !ctx.evidence.find((e) => e.claimId === c.id && e.found));\r\n\r\n if (ghostImports.length > 0) {\r\n return {\r\n policy: 'ghost-import',\r\n severity: 'error',\r\n message: `GHOST IMPORT: ${ghostImports.map((c) => c.value).join(', ')}`,\r\n claim: ghostImports[0],\r\n suggestion: 'Verify packages exist in package.json or are valid local imports',\r\n };\r\n }\r\n return null;\r\n },\r\n },\r\n // Ghost File - Block references to non-existent files\r\n {\r\n name: 'ghost-file',\r\n description: 'Block references to non-existent files',\r\n severity: 'error',\r\n evaluate: (ctx) => {\r\n const ghostFiles = ctx.claims\r\n .filter((c) => c.type === 'file_reference')\r\n .filter((c) => !ctx.evidence.find((e) => e.claimId === c.id && e.found));\r\n\r\n if (ghostFiles.length > 0) {\r\n return {\r\n policy: 'ghost-file',\r\n severity: 'error',\r\n message: `GHOST FILE: ${ghostFiles.map((c) => c.value).join(', ')}`,\r\n claim: ghostFiles[0],\r\n suggestion: 'Ensure file exists or create it before referencing',\r\n };\r\n }\r\n return null;\r\n },\r\n },\r\n // Low Confidence - Warn about claims with low confidence\r\n {\r\n name: 'low-confidence',\r\n description: 'Warn about claims with low confidence',\r\n severity: 'warning',\r\n evaluate: (ctx) => {\r\n const lowConfidence = ctx.claims.filter((c) => c.confidence < 0.5);\r\n if (lowConfidence.length > ctx.claims.length * 0.3 && ctx.claims.length > 3) {\r\n return {\r\n policy: 'low-confidence',\r\n severity: 'warning',\r\n message: `${lowConfidence.length} of ${ctx.claims.length} claims have low confidence`,\r\n suggestion: 'Consider adding more context to improve verification',\r\n };\r\n }\r\n return null;\r\n },\r\n },\r\n // Excessive Claims - Warn when too many claims in one change\r\n {\r\n name: 'excessive-claims',\r\n description: 'Warn when change has too many unverified claims',\r\n severity: 'warning',\r\n evaluate: (ctx) => {\r\n const unverifiedCount = ctx.claims.filter(\r\n (c) => !ctx.evidence.find((e) => e.claimId === c.id && e.found)\r\n ).length;\r\n\r\n if (unverifiedCount > 10) {\r\n return {\r\n policy: 'excessive-claims',\r\n severity: 'warning',\r\n message: `${unverifiedCount} unverified claims - consider breaking into smaller changes`,\r\n suggestion: 'Large changes with many unverified claims are risky',\r\n };\r\n }\r\n return null;\r\n },\r\n },\r\n ];\r\n }\r\n\r\n private calculateConfidence(context: PolicyContext, violations: PolicyViolation[]): number {\r\n const evidenceConfidence = context.evidence.length > 0\r\n ? context.evidence.reduce((sum, e) => sum + e.confidence, 0) / context.evidence.length\r\n : 0;\r\n\r\n const violationPenalty = violations.reduce((sum, v) => {\r\n if (v.severity === 'error') return sum + 0.3;\r\n if (v.severity === 'warning') return sum + 0.1;\r\n return sum;\r\n }, 0);\r\n\r\n return Math.max(0, Math.min(1, evidenceConfidence - violationPenalty));\r\n }\r\n}\r\n","/**\r\n * Unblock Planner\r\n * \r\n * Generates actionable plans to resolve firewall blocks\r\n * by providing specific steps to fix violations.\r\n */\r\n\r\nimport type { PolicyDecision, PolicyViolation } from './policy-engine.js';\r\n\r\nexport interface UnblockStep {\r\n order: number;\r\n action: 'add' | 'modify' | 'verify' | 'run';\r\n target: string;\r\n description: string;\r\n command?: string;\r\n autoFixable: boolean;\r\n}\r\n\r\nexport interface UnblockPlan {\r\n violations: PolicyViolation[];\r\n steps: UnblockStep[];\r\n estimatedEffort: 'trivial' | 'minor' | 'moderate' | 'significant';\r\n canAutoFix: boolean;\r\n}\r\n\r\nexport class UnblockPlanner {\r\n /**\r\n * Generate an unblock plan for a blocked decision\r\n */\r\n async plan(decision: PolicyDecision): Promise<UnblockPlan> {\r\n const steps: UnblockStep[] = [];\r\n let order = 1;\r\n\r\n for (const violation of decision.violations) {\r\n const violationSteps = this.planForViolation(violation, order);\r\n steps.push(...violationSteps);\r\n order += violationSteps.length;\r\n }\r\n\r\n return {\r\n violations: decision.violations,\r\n steps,\r\n estimatedEffort: this.estimateEffort(steps),\r\n canAutoFix: steps.every((s) => s.autoFixable),\r\n };\r\n }\r\n\r\n /**\r\n * Execute auto-fixable steps\r\n */\r\n async autoFix(plan: UnblockPlan): Promise<{\r\n success: boolean;\r\n fixedSteps: number[];\r\n failedSteps: number[];\r\n }> {\r\n const fixedSteps: number[] = [];\r\n const failedSteps: number[] = [];\r\n\r\n for (const step of plan.steps) {\r\n if (step.autoFixable) {\r\n const success = await this.executeStep(step);\r\n if (success) {\r\n fixedSteps.push(step.order);\r\n } else {\r\n failedSteps.push(step.order);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n success: failedSteps.length === 0,\r\n fixedSteps,\r\n failedSteps,\r\n };\r\n }\r\n\r\n private planForViolation(violation: PolicyViolation, startOrder: number): UnblockStep[] {\r\n const steps: UnblockStep[] = [];\r\n const claimValue = violation.claim?.value ?? 'unknown';\r\n\r\n switch (violation.policy) {\r\n case 'ghost-route':\r\n steps.push({\r\n order: startOrder,\r\n action: 'verify',\r\n target: claimValue,\r\n description: `Check if route \"${claimValue}\" should exist`,\r\n autoFixable: false,\r\n });\r\n steps.push({\r\n order: startOrder + 1,\r\n action: 'add',\r\n target: 'route handler',\r\n description: `Create route handler for \"${claimValue}\" if needed`,\r\n autoFixable: false,\r\n });\r\n steps.push({\r\n order: startOrder + 2,\r\n action: 'run',\r\n target: 'truthpack',\r\n description: 'Regenerate routes truthpack after creating route',\r\n command: 'vibecheck truth --scope routes',\r\n autoFixable: true,\r\n });\r\n break;\r\n\r\n case 'ghost-env':\r\n steps.push({\r\n order: startOrder,\r\n action: 'add',\r\n target: '.env.example',\r\n description: `Add \"${claimValue}\" to .env.example with description`,\r\n autoFixable: false,\r\n });\r\n steps.push({\r\n order: startOrder + 1,\r\n action: 'add',\r\n target: '.env',\r\n description: `Set value for \"${claimValue}\" in .env`,\r\n autoFixable: false,\r\n });\r\n steps.push({\r\n order: startOrder + 2,\r\n action: 'run',\r\n target: 'truthpack',\r\n description: 'Register env var in truthpack',\r\n command: `vibecheck register env \"${claimValue}\"`,\r\n autoFixable: true,\r\n });\r\n break;\r\n\r\n case 'ghost-type':\r\n steps.push({\r\n order: startOrder,\r\n action: 'verify',\r\n target: claimValue,\r\n description: `Check if type \"${claimValue}\" is imported correctly`,\r\n autoFixable: false,\r\n });\r\n steps.push({\r\n order: startOrder + 1,\r\n action: 'add',\r\n target: 'types file',\r\n description: `Define type \"${claimValue}\" if it doesn't exist`,\r\n autoFixable: false,\r\n });\r\n break;\r\n\r\n case 'ghost-import':\r\n // Check if it's likely a package or local import\r\n const isPackage = !claimValue.startsWith('.') && !claimValue.startsWith('/');\r\n if (isPackage) {\r\n steps.push({\r\n order: startOrder,\r\n action: 'run',\r\n target: 'package.json',\r\n description: `Install missing package: ${claimValue}`,\r\n command: `pnpm add ${claimValue}`,\r\n autoFixable: true,\r\n });\r\n } else {\r\n steps.push({\r\n order: startOrder,\r\n action: 'verify',\r\n target: claimValue,\r\n description: `Check path: \"${claimValue}\" - file may not exist`,\r\n autoFixable: false,\r\n });\r\n steps.push({\r\n order: startOrder + 1,\r\n action: 'add',\r\n target: claimValue,\r\n description: `Create file at \"${claimValue}\" if needed`,\r\n autoFixable: false,\r\n });\r\n }\r\n break;\r\n\r\n case 'ghost-file':\r\n steps.push({\r\n order: startOrder,\r\n action: 'verify',\r\n target: claimValue,\r\n description: `Verify file path is correct: \"${claimValue}\"`,\r\n autoFixable: false,\r\n });\r\n steps.push({\r\n order: startOrder + 1,\r\n action: 'add',\r\n target: claimValue,\r\n description: `Create file \"${claimValue}\" if it should exist`,\r\n autoFixable: false,\r\n });\r\n break;\r\n\r\n case 'low-confidence':\r\n case 'excessive-claims':\r\n steps.push({\r\n order: startOrder,\r\n action: 'verify',\r\n target: 'change scope',\r\n description: 'Review change - consider breaking into smaller, verified pieces',\r\n autoFixable: false,\r\n });\r\n steps.push({\r\n order: startOrder + 1,\r\n action: 'run',\r\n target: 'truthpack',\r\n description: 'Refresh truthpack to ensure it\\'s current',\r\n command: 'vibecheck truth',\r\n autoFixable: true,\r\n });\r\n break;\r\n\r\n default:\r\n steps.push({\r\n order: startOrder,\r\n action: 'verify',\r\n target: violation.policy,\r\n description: violation.suggestion ?? 'Review and fix the violation manually',\r\n autoFixable: false,\r\n });\r\n }\r\n\r\n return steps;\r\n }\r\n\r\n private async executeStep(step: UnblockStep): Promise<boolean> {\r\n if (!step.command) return false;\r\n\r\n try {\r\n // Security: Parse and validate command\r\n // Commands should be in format: \"command arg1 arg2\"\r\n const parts = step.command.trim().split(/\\s+/);\r\n if (parts.length === 0) {\r\n return false;\r\n }\r\n\r\n const command = parts[0];\r\n const args = parts.slice(1);\r\n\r\n // Allowlist: Only allow safe commands\r\n const ALLOWED_COMMANDS = ['npm', 'pnpm', 'npx', 'vibecheck'] as const;\r\n if (!ALLOWED_COMMANDS.includes(command as typeof ALLOWED_COMMANDS[number])) {\r\n // Command not allowed - log and skip\r\n return false;\r\n }\r\n\r\n // Validate arguments (no shell metacharacters)\r\n const DANGEROUS_CHARS = /[;&|`$(){}[\\]<>'\"\\\\]/;\r\n for (const arg of args) {\r\n if (DANGEROUS_CHARS.test(arg) || arg.includes('..')) {\r\n // Dangerous argument detected - skip execution\r\n return false;\r\n }\r\n }\r\n\r\n // Use execFile instead of exec to avoid shell interpretation\r\n const { execFile } = await import('child_process');\r\n const { promisify } = await import('util');\r\n const execFileAsync = promisify(execFile);\r\n\r\n await execFileAsync(command, args, {\r\n timeout: 30000, // 30 second timeout\r\n maxBuffer: 1024 * 1024, // 1MB buffer\r\n });\r\n\r\n // Output is available in stdout/stderr if needed for debugging\r\n // but we don't log to console in production code\r\n\r\n return true;\r\n } catch {\r\n // Step execution failed - caller should handle retry/fallback\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Format the unblock plan as human-readable text\r\n */\r\n formatPlan(plan: UnblockPlan): string {\r\n const lines: string[] = [\r\n '## Unblock Plan',\r\n '',\r\n `**Estimated Effort:** ${plan.estimatedEffort}`,\r\n `**Can Auto-Fix:** ${plan.canAutoFix ? 'Yes' : 'Partial/No'}`,\r\n '',\r\n '### Steps to Resolve:',\r\n '',\r\n ];\r\n\r\n for (const step of plan.steps) {\r\n const autoTag = step.autoFixable ? ' [AUTO]' : '';\r\n lines.push(`${step.order}. **${step.action.toUpperCase()}**${autoTag}: ${step.description}`);\r\n if (step.command) {\r\n lines.push(` \\`\\`\\`bash`);\r\n lines.push(` ${step.command}`);\r\n lines.push(` \\`\\`\\``);\r\n }\r\n lines.push('');\r\n }\r\n\r\n return lines.join('\\n');\r\n }\r\n\r\n private estimateEffort(steps: UnblockStep[]): UnblockPlan['estimatedEffort'] {\r\n const manualSteps = steps.filter((s) => !s.autoFixable).length;\r\n \r\n if (manualSteps === 0) return 'trivial';\r\n if (manualSteps <= 2) return 'minor';\r\n if (manualSteps <= 5) return 'moderate';\r\n return 'significant';\r\n }\r\n}\r\n","/**\r\n * Agent Firewall\r\n * \r\n * Central orchestrator for intercepting and validating AI agent actions.\r\n * Prevents hallucinated code from being written to the filesystem.\r\n * \r\n * Features:\r\n * - Three modes: observe, enforce, lockdown\r\n * - Claim extraction and evidence resolution\r\n * - Policy engine with configurable rules\r\n * - Comprehensive audit logging\r\n * - Performance tracking and caching\r\n */\r\n\r\nimport * as fs from 'fs/promises';\r\nimport * as path from 'path';\r\nimport { IntentValidator, type Intent } from './intent-validator.js';\r\nimport { ClaimExtractor, type Claim } from './claim-extractor.js';\r\nimport { EvidenceResolver, type Evidence } from './evidence-resolver.js';\r\nimport { PolicyEngine, type PolicyDecision } from './policy-engine.js';\r\nimport { UnblockPlanner, type UnblockPlan } from './unblock-planner.js';\r\nimport {\r\n VibeCheckError,\r\n FirewallBlockedError,\r\n ValidationError,\r\n ConfigError,\r\n wrapError,\r\n} from '../utils/errors.js';\r\nimport { getLogger, type Logger } from '../utils/logger.js';\r\nimport { Cache } from '../utils/cache.js';\r\nimport { PerformanceTracker } from '../utils/performance.js';\r\nimport { withTimeout, withRetry } from '../utils/retry.js';\r\nimport { validateOrThrow, string, number, oneOf } from '../utils/validation.js';\r\n\r\n/**\r\n * Firewall mode determines how violations are handled:\r\n * - observe: Log violations but allow all actions (monitoring mode)\r\n * - enforce: Block actions with violations (default behavior)\r\n * - lockdown: Block all write operations regardless of violations\r\n */\r\nexport type FirewallMode = 'observe' | 'enforce' | 'lockdown';\r\n\r\nexport interface FirewallConfig {\r\n mode: FirewallMode;\r\n strictMode: boolean;\r\n allowPartialMatches: boolean;\r\n maxClaimsPerRequest: number;\r\n evidenceTimeout: number;\r\n auditLogPath: string;\r\n projectRoot: string;\r\n truthpackPath: string;\r\n enableAuditLog: boolean;\r\n enablePerformanceTracking: boolean;\r\n enableCaching: boolean;\r\n cacheTtlMs: number;\r\n}\r\n\r\nexport interface FirewallResult {\r\n allowed: boolean;\r\n decision: PolicyDecision;\r\n claims: Claim[];\r\n evidence: Evidence[];\r\n violations: Array<{ policy: string; message: string; severity: string }>;\r\n unblockPlan?: UnblockPlan;\r\n auditId: string;\r\n durationMs?: number;\r\n}\r\n\r\nexport interface FirewallRequest {\r\n agentId?: string;\r\n action: 'write' | 'modify' | 'delete' | 'execute';\r\n target: string;\r\n content: string;\r\n context?: Record<string, unknown>;\r\n}\r\n\r\nexport interface QuickCheckResult {\r\n safe: boolean;\r\n concerns: string[];\r\n claimsChecked: number;\r\n durationMs: number;\r\n}\r\n\r\nexport interface AuditEntry {\r\n id: string;\r\n timestamp: string;\r\n agentId: string;\r\n action: string;\r\n target: string;\r\n allowed: boolean;\r\n reason: string;\r\n claimCount: number;\r\n violationCount: number;\r\n violations: string[];\r\n duration: number;\r\n mode: FirewallMode;\r\n}\r\n\r\nconst DEFAULT_CONFIG: FirewallConfig = {\r\n mode: 'enforce',\r\n strictMode: true,\r\n allowPartialMatches: false,\r\n maxClaimsPerRequest: 50,\r\n evidenceTimeout: 5000,\r\n auditLogPath: '.vibecheck/audit/firewall.log',\r\n projectRoot: process.cwd(),\r\n truthpackPath: '.vibecheck/truthpack',\r\n enableAuditLog: true,\r\n enablePerformanceTracking: true,\r\n enableCaching: true,\r\n cacheTtlMs: 60000, // 1 minute\r\n};\r\n\r\n// Validation schemas\r\nconst modeValidator = oneOf(['observe', 'enforce', 'lockdown'] as const);\r\nconst actionValidator = oneOf(['write', 'modify', 'delete', 'execute'] as const);\r\n\r\nexport class AgentFirewall {\r\n private config: FirewallConfig;\r\n private intentValidator: IntentValidator;\r\n private claimExtractor: ClaimExtractor;\r\n private evidenceResolver: EvidenceResolver;\r\n private policyEngine: PolicyEngine;\r\n private unblockPlanner: UnblockPlanner;\r\n private auditBuffer: AuditEntry[] = [];\r\n private flushInterval: ReturnType<typeof setInterval> | null = null;\r\n private logger: Logger;\r\n private performanceTracker: PerformanceTracker;\r\n private quickCheckCache: Cache<QuickCheckResult>;\r\n private disposed = false;\r\n\r\n constructor(config: Partial<FirewallConfig> = {}) {\r\n this.config = this.validateConfig({ ...DEFAULT_CONFIG, ...config });\r\n this.logger = getLogger('firewall');\r\n this.performanceTracker = new PerformanceTracker();\r\n this.quickCheckCache = new Cache<QuickCheckResult>({\r\n maxSize: 500,\r\n defaultTtlMs: this.config.cacheTtlMs,\r\n });\r\n\r\n this.intentValidator = new IntentValidator();\r\n this.claimExtractor = new ClaimExtractor();\r\n this.evidenceResolver = new EvidenceResolver({\r\n projectRoot: this.config.projectRoot,\r\n truthpackPath: this.config.truthpackPath,\r\n });\r\n this.policyEngine = new PolicyEngine();\r\n this.unblockPlanner = new UnblockPlanner();\r\n\r\n // Start periodic flush of audit log\r\n if (this.config.enableAuditLog) {\r\n this.flushInterval = setInterval(() => this.flushAuditBuffer(), 5000);\r\n // Don't prevent process exit\r\n if (this.flushInterval.unref) {\r\n this.flushInterval.unref();\r\n }\r\n }\r\n\r\n this.logger.info('Agent firewall initialized', {\r\n mode: this.config.mode,\r\n strictMode: this.config.strictMode,\r\n });\r\n }\r\n\r\n /**\r\n * Validate configuration\r\n */\r\n private validateConfig(config: FirewallConfig): FirewallConfig {\r\n try {\r\n validateOrThrow(config.mode, modeValidator, {\r\n component: 'AgentFirewall',\r\n operation: 'validateConfig',\r\n field: 'mode',\r\n });\r\n\r\n validateOrThrow(config.maxClaimsPerRequest, number({ min: 1, max: 1000, integer: true }), {\r\n component: 'AgentFirewall',\r\n operation: 'validateConfig',\r\n field: 'maxClaimsPerRequest',\r\n });\r\n\r\n validateOrThrow(config.evidenceTimeout, number({ min: 100, max: 60000 }), {\r\n component: 'AgentFirewall',\r\n operation: 'validateConfig',\r\n field: 'evidenceTimeout',\r\n });\r\n\r\n if (!config.projectRoot || typeof config.projectRoot !== 'string') {\r\n throw new ConfigError('projectRoot must be a non-empty string', {\r\n component: 'AgentFirewall',\r\n configKey: 'projectRoot',\r\n });\r\n }\r\n\r\n return config;\r\n } catch (error) {\r\n if (error instanceof VibeCheckError) throw error;\r\n throw new ConfigError(\r\n `Invalid firewall configuration: ${error instanceof Error ? error.message : 'Unknown error'}`,\r\n { component: 'AgentFirewall' }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Get the current firewall mode\r\n */\r\n getMode(): FirewallMode {\r\n return this.config.mode;\r\n }\r\n\r\n /**\r\n * Set the firewall mode\r\n */\r\n setMode(mode: FirewallMode): void {\r\n this.assertNotDisposed();\r\n validateOrThrow(mode, modeValidator, {\r\n component: 'AgentFirewall',\r\n operation: 'setMode',\r\n field: 'mode',\r\n });\r\n\r\n const previousMode = this.config.mode;\r\n this.config.mode = mode;\r\n \r\n this.logger.info('Firewall mode changed', { previousMode, newMode: mode });\r\n \r\n // Clear cache when mode changes (results may be different)\r\n this.quickCheckCache.clear();\r\n }\r\n\r\n /**\r\n * Evaluate a request against the firewall\r\n */\r\n async evaluate(request: FirewallRequest): Promise<FirewallResult> {\r\n this.assertNotDisposed();\r\n const startTime = performance.now();\r\n const auditId = this.generateAuditId();\r\n\r\n // Validate request\r\n this.validateRequest(request);\r\n\r\n this.logger.debug('Evaluating request', {\r\n auditId,\r\n action: request.action,\r\n target: request.target,\r\n mode: this.config.mode,\r\n });\r\n\r\n try {\r\n // LOCKDOWN MODE: Block all write operations immediately\r\n if (this.config.mode === 'lockdown') {\r\n if (['write', 'modify', 'delete', 'execute'].includes(request.action)) {\r\n const result = this.createBlockedResult(\r\n auditId,\r\n 'Lockdown mode: All write operations are blocked',\r\n []\r\n );\r\n result.durationMs = performance.now() - startTime;\r\n await this.audit(auditId, request, result.decision, startTime);\r\n return result;\r\n }\r\n }\r\n\r\n // Step 1: Validate intent with timeout\r\n const intent = await this.withTracking('validateIntent', async () => {\r\n return withTimeout(\r\n () => this.intentValidator.validate(request),\r\n this.config.evidenceTimeout,\r\n { component: 'AgentFirewall', operation: 'validateIntent' }\r\n );\r\n });\r\n\r\n if (!intent.valid && this.config.mode === 'enforce') {\r\n const result = this.createBlockedResult(auditId, `Invalid intent: ${intent.reason ?? 'Unknown'}`, []);\r\n result.durationMs = performance.now() - startTime;\r\n await this.audit(auditId, request, result.decision, startTime);\r\n return result;\r\n }\r\n\r\n // Step 2: Extract claims from content\r\n const claims = await this.withTracking('extractClaims', async () => {\r\n return this.claimExtractor.extract(request.content);\r\n });\r\n\r\n if (claims.length > this.config.maxClaimsPerRequest && this.config.mode === 'enforce') {\r\n const result = this.createBlockedResult(\r\n auditId,\r\n `Too many claims (${claims.length} > ${this.config.maxClaimsPerRequest}). Break into smaller changes.`,\r\n claims\r\n );\r\n result.durationMs = performance.now() - startTime;\r\n await this.audit(auditId, request, result.decision, startTime);\r\n return result;\r\n }\r\n\r\n // Step 3: Resolve evidence for each claim with timeout\r\n const evidence = await this.withTracking('resolveEvidence', async () => {\r\n return withTimeout(\r\n () => this.evidenceResolver.resolveAll(claims),\r\n this.config.evidenceTimeout,\r\n { component: 'AgentFirewall', operation: 'resolveEvidence' }\r\n );\r\n });\r\n\r\n // Step 4: Apply policy engine\r\n const decision = await this.withTracking('evaluatePolicy', async () => {\r\n return this.policyEngine.evaluate({\r\n intent,\r\n claims,\r\n evidence,\r\n config: this.config,\r\n });\r\n });\r\n\r\n // Step 5: If blocked, generate unblock plan\r\n let unblockPlan: UnblockPlan | undefined;\r\n if (!decision.allowed) {\r\n unblockPlan = await this.withTracking('planUnblock', async () => {\r\n return this.unblockPlanner.plan(decision);\r\n });\r\n }\r\n\r\n // Audit log\r\n await this.audit(auditId, request, decision, startTime, claims.length);\r\n\r\n // Format violations for the result\r\n const violations = decision.violations.map(v => ({\r\n policy: v.policy,\r\n message: v.message,\r\n severity: v.severity,\r\n }));\r\n\r\n // OBSERVE MODE: Log violations but allow the action\r\n const allowed = this.config.mode === 'observe' ? true : decision.allowed;\r\n const durationMs = performance.now() - startTime;\r\n\r\n // Log result\r\n this.logger.info(allowed ? 'Request allowed' : 'Request blocked', {\r\n auditId,\r\n allowed,\r\n violationCount: violations.length,\r\n claimCount: claims.length,\r\n durationMs: Math.round(durationMs),\r\n });\r\n\r\n return {\r\n allowed,\r\n decision: {\r\n ...decision,\r\n allowed,\r\n reason: this.config.mode === 'observe' && !decision.allowed\r\n ? `[OBSERVE MODE] Would have blocked: ${decision.reason}`\r\n : decision.reason,\r\n },\r\n claims,\r\n evidence,\r\n violations,\r\n unblockPlan,\r\n auditId,\r\n durationMs,\r\n };\r\n } catch (error) {\r\n const durationMs = performance.now() - startTime;\r\n this.logger.error('Evaluation failed', error as Error, {\r\n auditId,\r\n action: request.action,\r\n target: request.target,\r\n durationMs: Math.round(durationMs),\r\n });\r\n\r\n // In enforce mode, block on errors for safety\r\n if (this.config.mode === 'enforce') {\r\n const result = this.createBlockedResult(\r\n auditId,\r\n `Evaluation error: ${error instanceof Error ? error.message : 'Unknown error'}`,\r\n []\r\n );\r\n result.durationMs = durationMs;\r\n return result;\r\n }\r\n\r\n // In observe mode, allow but log the error\r\n throw wrapError(error, { component: 'AgentFirewall', operation: 'evaluate' });\r\n }\r\n }\r\n\r\n /**\r\n * Quick check without full evidence resolution\r\n * Returns detailed result with concerns if any issues are detected\r\n */\r\n async quickCheck(content: string): Promise<QuickCheckResult> {\r\n this.assertNotDisposed();\r\n const startTime = performance.now();\r\n\r\n // Check cache if enabled\r\n if (this.config.enableCaching) {\r\n const cacheKey = this.hashContent(content);\r\n const cached = this.quickCheckCache.get(cacheKey);\r\n if (cached) {\r\n this.logger.debug('Quick check cache hit');\r\n return { ...cached, durationMs: performance.now() - startTime };\r\n }\r\n }\r\n\r\n const claims = await this.withTracking('quickCheckExtract', async () => {\r\n return this.claimExtractor.extract(content);\r\n });\r\n\r\n const concerns: string[] = [];\r\n\r\n // Check for suspicious patterns with detailed messages\r\n const suspiciousPatterns = [\r\n { pattern: /\\beval\\s*\\(/, message: 'Contains eval() which can execute arbitrary code' },\r\n { pattern: /\\bnew\\s+Function\\s*\\(/, message: 'Contains Function constructor which can execute arbitrary code' },\r\n { pattern: /rm\\s+-rf\\s+[\\/~]/, message: 'Contains dangerous rm -rf command targeting root or home' },\r\n { pattern: /DROP\\s+TABLE/i, message: 'Contains SQL DROP TABLE statement' },\r\n { pattern: /DELETE\\s+FROM\\s+\\w+\\s*;?\\s*$/im, message: 'Contains DELETE without WHERE clause' },\r\n { pattern: /exec\\s*\\([^)]*\\$/, message: 'Contains shell exec with variable injection risk' },\r\n { pattern: /process\\.env\\.\\w+\\s*=/, message: 'Modifies process.env which affects global state' },\r\n { pattern: /require\\s*\\(\\s*[^'\"]/, message: 'Dynamic require with non-literal path' },\r\n { pattern: /fs\\.(?:unlink|rmdir|rm)Sync\\s*\\(/, message: 'Synchronous file deletion detected' },\r\n { pattern: /child_process/, message: 'Uses child_process which can execute system commands' },\r\n ];\r\n\r\n for (const { pattern, message } of suspiciousPatterns) {\r\n if (pattern.test(content)) {\r\n concerns.push(message);\r\n }\r\n }\r\n\r\n // Check for low confidence claims\r\n const lowConfidenceClaims = claims.filter(c => c.confidence < 0.5);\r\n if (lowConfidenceClaims.length > 0) {\r\n concerns.push(`${lowConfidenceClaims.length} claim(s) with low confidence (may be hallucinated)`);\r\n }\r\n\r\n // Check for excessive claims\r\n if (claims.length > this.config.maxClaimsPerRequest) {\r\n concerns.push(`Too many claims (${claims.length}) - consider breaking into smaller changes`);\r\n }\r\n\r\n // In strict mode, flag medium confidence claims\r\n if (this.config.strictMode) {\r\n const mediumConfidenceClaims = claims.filter(c => c.confidence >= 0.5 && c.confidence < 0.8);\r\n if (mediumConfidenceClaims.length > 3) {\r\n concerns.push(`${mediumConfidenceClaims.length} claims with medium confidence - verification recommended`);\r\n }\r\n }\r\n\r\n // Check for potentially hallucinated imports (deep paths)\r\n const deepImportPattern = /from\\s+['\"](@[^/]+\\/[^/]+\\/[^/]+\\/[^/]+\\/[^'\"]+|[^@][^/]+\\/[^/]+\\/[^/]+\\/[^/]+\\/[^'\"]+)['\"]/g;\r\n let importMatch;\r\n while ((importMatch = deepImportPattern.exec(content)) !== null) {\r\n concerns.push(`Suspiciously deep import path: \"${importMatch[1].slice(0, 50)}...\"`);\r\n }\r\n\r\n const durationMs = performance.now() - startTime;\r\n const result: QuickCheckResult = {\r\n safe: concerns.length === 0,\r\n concerns,\r\n claimsChecked: claims.length,\r\n durationMs,\r\n };\r\n\r\n // Cache result\r\n if (this.config.enableCaching) {\r\n const cacheKey = this.hashContent(content);\r\n this.quickCheckCache.set(cacheKey, result);\r\n }\r\n\r\n this.logger.debug('Quick check completed', {\r\n safe: result.safe,\r\n concernCount: concerns.length,\r\n claimsChecked: claims.length,\r\n durationMs: Math.round(durationMs),\r\n });\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Get performance metrics\r\n */\r\n getPerformanceMetrics(): Record<string, unknown> {\r\n return this.performanceTracker.export();\r\n }\r\n\r\n /**\r\n * Clear caches\r\n */\r\n clearCaches(): void {\r\n this.quickCheckCache.clear();\r\n this.evidenceResolver.clearCache();\r\n this.logger.info('Caches cleared');\r\n }\r\n\r\n /**\r\n * Validate a request before processing\r\n */\r\n private validateRequest(request: FirewallRequest): void {\r\n if (!request) {\r\n throw new ValidationError('Request is required', {\r\n component: 'AgentFirewall',\r\n operation: 'validateRequest',\r\n });\r\n }\r\n\r\n validateOrThrow(request.action, actionValidator, {\r\n component: 'AgentFirewall',\r\n operation: 'validateRequest',\r\n field: 'action',\r\n });\r\n\r\n validateOrThrow(request.target, string({ minLength: 1, maxLength: 1000 }), {\r\n component: 'AgentFirewall',\r\n operation: 'validateRequest',\r\n field: 'target',\r\n });\r\n\r\n if (typeof request.content !== 'string') {\r\n throw new ValidationError('Content must be a string', {\r\n component: 'AgentFirewall',\r\n operation: 'validateRequest',\r\n field: 'content',\r\n });\r\n }\r\n\r\n // Limit content size for safety\r\n if (request.content.length > 1_000_000) {\r\n throw new ValidationError('Content exceeds maximum size of 1MB', {\r\n component: 'AgentFirewall',\r\n operation: 'validateRequest',\r\n field: 'content',\r\n });\r\n }\r\n }\r\n\r\n private createBlockedResult(\r\n auditId: string,\r\n reason: string,\r\n claims: Claim[]\r\n ): FirewallResult {\r\n return {\r\n allowed: false,\r\n decision: {\r\n allowed: false,\r\n reason,\r\n violations: [],\r\n confidence: 1,\r\n },\r\n claims,\r\n evidence: [],\r\n violations: [],\r\n auditId,\r\n };\r\n }\r\n\r\n private generateAuditId(): string {\r\n const timestamp = Date.now().toString(36);\r\n const random = Math.random().toString(36).slice(2, 8);\r\n return `fw-${timestamp}-${random}`;\r\n }\r\n\r\n /**\r\n * Simple hash for cache keys\r\n */\r\n private hashContent(content: string): string {\r\n let hash = 0;\r\n for (let i = 0; i < Math.min(content.length, 10000); i++) {\r\n const char = content.charCodeAt(i);\r\n hash = ((hash << 5) - hash) + char;\r\n hash = hash & hash; // Convert to 32bit integer\r\n }\r\n return `qc-${hash.toString(36)}-${content.length}`;\r\n }\r\n\r\n /**\r\n * Track performance of an operation\r\n */\r\n private async withTracking<T>(\r\n name: string,\r\n fn: () => Promise<T>\r\n ): Promise<T> {\r\n if (!this.config.enablePerformanceTracking) {\r\n return fn();\r\n }\r\n\r\n const { result } = await this.performanceTracker.time(name, fn);\r\n return result;\r\n }\r\n\r\n /**\r\n * Log an audit entry\r\n */\r\n private async audit(\r\n auditId: string,\r\n request: FirewallRequest,\r\n decision: PolicyDecision,\r\n startTime: number,\r\n claimCount = 0\r\n ): Promise<void> {\r\n if (!this.config.enableAuditLog) return;\r\n\r\n const entry: AuditEntry = {\r\n id: auditId,\r\n timestamp: new Date().toISOString(),\r\n agentId: request.agentId ?? 'unknown',\r\n action: request.action,\r\n target: request.target,\r\n allowed: decision.allowed,\r\n reason: decision.reason,\r\n claimCount,\r\n violationCount: decision.violations.length,\r\n violations: decision.violations.map(v => v.policy),\r\n duration: Math.round(performance.now() - startTime),\r\n mode: this.config.mode,\r\n };\r\n\r\n this.auditBuffer.push(entry);\r\n\r\n // Immediate flush if buffer is getting large\r\n if (this.auditBuffer.length >= 100) {\r\n await this.flushAuditBuffer();\r\n }\r\n }\r\n\r\n /**\r\n * Flush audit buffer to disk with retry\r\n */\r\n private async flushAuditBuffer(): Promise<void> {\r\n if (this.auditBuffer.length === 0) return;\r\n\r\n const entries = this.auditBuffer.splice(0, this.auditBuffer.length);\r\n\r\n try {\r\n await withRetry(\r\n async () => {\r\n const logPath = path.isAbsolute(this.config.auditLogPath)\r\n ? this.config.auditLogPath\r\n : path.join(this.config.projectRoot, this.config.auditLogPath);\r\n\r\n // Ensure directory exists\r\n await fs.mkdir(path.dirname(logPath), { recursive: true });\r\n\r\n // Append entries as JSONL (one JSON object per line)\r\n const lines = entries.map(e => JSON.stringify(e)).join('\\n') + '\\n';\r\n await fs.appendFile(logPath, lines, 'utf-8');\r\n },\r\n {\r\n maxAttempts: 3,\r\n initialDelayMs: 100,\r\n onRetry: (attempt, error) => {\r\n this.logger.warn(`Audit log write retry ${attempt}`, { error: error.message });\r\n },\r\n }\r\n );\r\n } catch (error) {\r\n this.logger.error('Failed to write audit log after retries', error as Error);\r\n // Re-add entries to buffer for next attempt\r\n this.auditBuffer.unshift(...entries);\r\n }\r\n }\r\n\r\n /**\r\n * Get recent audit entries\r\n */\r\n async getAuditHistory(limit = 100): Promise<AuditEntry[]> {\r\n this.assertNotDisposed();\r\n \r\n try {\r\n const logPath = path.isAbsolute(this.config.auditLogPath)\r\n ? this.config.auditLogPath\r\n : path.join(this.config.projectRoot, this.config.auditLogPath);\r\n\r\n const content = await fs.readFile(logPath, 'utf-8');\r\n const lines = content.trim().split('\\n').filter(Boolean);\r\n\r\n // Parse and return last N entries\r\n const entries = lines\r\n .slice(-limit)\r\n .map(line => {\r\n try {\r\n return JSON.parse(line) as AuditEntry;\r\n } catch {\r\n return null;\r\n }\r\n })\r\n .filter((e): e is AuditEntry => e !== null);\r\n\r\n return entries;\r\n } catch {\r\n return [];\r\n }\r\n }\r\n\r\n /**\r\n * Get audit statistics\r\n */\r\n async getAuditStats(since?: Date): Promise<{\r\n total: number;\r\n allowed: number;\r\n blocked: number;\r\n byViolation: Record<string, number>;\r\n byMode: Record<string, number>;\r\n avgDuration: number;\r\n }> {\r\n const entries = await this.getAuditHistory(1000);\r\n const filtered = since\r\n ? entries.filter(e => new Date(e.timestamp) >= since)\r\n : entries;\r\n\r\n const byViolation: Record<string, number> = {};\r\n const byMode: Record<string, number> = {};\r\n let totalDuration = 0;\r\n\r\n for (const entry of filtered) {\r\n totalDuration += entry.duration;\r\n \r\n byMode[entry.mode] = (byMode[entry.mode] || 0) + 1;\r\n \r\n for (const violation of entry.violations) {\r\n byViolation[violation] = (byViolation[violation] || 0) + 1;\r\n }\r\n }\r\n\r\n return {\r\n total: filtered.length,\r\n allowed: filtered.filter(e => e.allowed).length,\r\n blocked: filtered.filter(e => !e.allowed).length,\r\n byViolation,\r\n byMode,\r\n avgDuration: filtered.length > 0 ? totalDuration / filtered.length : 0,\r\n };\r\n }\r\n\r\n /**\r\n * Clear audit log\r\n */\r\n async clearAuditLog(): Promise<void> {\r\n const logPath = path.isAbsolute(this.config.auditLogPath)\r\n ? this.config.auditLogPath\r\n : path.join(this.config.projectRoot, this.config.auditLogPath);\r\n\r\n try {\r\n await fs.writeFile(logPath, '', 'utf-8');\r\n this.logger.info('Audit log cleared');\r\n } catch {\r\n // File may not exist\r\n }\r\n }\r\n\r\n /**\r\n * Assert firewall is not disposed\r\n */\r\n private assertNotDisposed(): void {\r\n if (this.disposed) {\r\n throw new VibeCheckError('Firewall has been disposed', {\r\n code: 'INTERNAL_ERROR',\r\n component: 'AgentFirewall',\r\n operation: 'assertNotDisposed',\r\n recoveryHint: 'Create a new AgentFirewall instance',\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Clean up resources\r\n */\r\n dispose(): void {\r\n if (this.disposed) return;\r\n \r\n this.disposed = true;\r\n \r\n if (this.flushInterval) {\r\n clearInterval(this.flushInterval);\r\n this.flushInterval = null;\r\n }\r\n \r\n // Final flush\r\n this.flushAuditBuffer().catch(() => {});\r\n \r\n // Clean up cache\r\n this.quickCheckCache.dispose();\r\n \r\n this.logger.info('Agent firewall disposed');\r\n }\r\n}\r\n","/**\r\n * Intent Store\r\n * \r\n * Manages declared intents for the agent firewall.\r\n * Intents define the allowed scope and operations for AI actions.\r\n */\r\n\r\nexport interface DeclaredIntent {\r\n id: string;\r\n description: string;\r\n allowedPaths: string[];\r\n allowedOperations: ('read' | 'write' | 'modify' | 'delete' | 'execute')[];\r\n scope: 'file' | 'directory' | 'module' | 'project';\r\n targetFiles?: string[];\r\n excludedPaths?: string[];\r\n metadata?: Record<string, unknown>;\r\n declaredAt: Date;\r\n expiresAt?: Date;\r\n}\r\n\r\nexport interface IntentDeclaration {\r\n description: string;\r\n allowedPaths?: string[];\r\n allowedOperations?: ('read' | 'write' | 'modify' | 'delete' | 'execute')[];\r\n scope?: 'file' | 'directory' | 'module' | 'project';\r\n targetFiles?: string[];\r\n excludedPaths?: string[];\r\n expiresInMs?: number;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nexport interface IntentCheckResult {\r\n allowed: boolean;\r\n intent: DeclaredIntent | null;\r\n reason: string;\r\n violations: string[];\r\n}\r\n\r\nexport class IntentStore {\r\n private currentIntent: DeclaredIntent | null = null;\r\n private intentHistory: DeclaredIntent[] = [];\r\n private maxHistorySize = 100;\r\n\r\n /**\r\n * Declare a new intent\r\n */\r\n declare(declaration: IntentDeclaration): DeclaredIntent {\r\n const intent: DeclaredIntent = {\r\n id: this.generateId(),\r\n description: declaration.description,\r\n allowedPaths: declaration.allowedPaths ?? ['**/*'],\r\n allowedOperations: declaration.allowedOperations ?? ['read', 'write', 'modify'],\r\n scope: declaration.scope ?? 'file',\r\n targetFiles: declaration.targetFiles,\r\n excludedPaths: declaration.excludedPaths ?? ['node_modules/**', '.git/**'],\r\n metadata: declaration.metadata,\r\n declaredAt: new Date(),\r\n expiresAt: declaration.expiresInMs \r\n ? new Date(Date.now() + declaration.expiresInMs)\r\n : undefined,\r\n };\r\n\r\n // Archive current intent if exists\r\n if (this.currentIntent) {\r\n this.intentHistory.push(this.currentIntent);\r\n if (this.intentHistory.length > this.maxHistorySize) {\r\n this.intentHistory.shift();\r\n }\r\n }\r\n\r\n this.currentIntent = intent;\r\n return intent;\r\n }\r\n\r\n /**\r\n * Get the current active intent\r\n */\r\n getCurrent(): DeclaredIntent | null {\r\n // Check if intent has expired\r\n if (this.currentIntent?.expiresAt && new Date() > this.currentIntent.expiresAt) {\r\n this.intentHistory.push(this.currentIntent);\r\n this.currentIntent = null;\r\n }\r\n return this.currentIntent;\r\n }\r\n\r\n /**\r\n * Clear the current intent\r\n */\r\n clear(): DeclaredIntent | null {\r\n const cleared = this.currentIntent;\r\n if (cleared) {\r\n this.intentHistory.push(cleared);\r\n }\r\n this.currentIntent = null;\r\n return cleared;\r\n }\r\n\r\n /**\r\n * Get intent history\r\n */\r\n getHistory(limit?: number): DeclaredIntent[] {\r\n const history = [...this.intentHistory];\r\n if (limit) {\r\n return history.slice(-limit);\r\n }\r\n return history;\r\n }\r\n\r\n /**\r\n * Check if an action is allowed under the current intent\r\n */\r\n checkAction(\r\n action: 'read' | 'write' | 'modify' | 'delete' | 'execute',\r\n targetPath: string\r\n ): IntentCheckResult {\r\n const intent = this.getCurrent();\r\n\r\n // If no intent declared, use permissive default\r\n if (!intent) {\r\n return {\r\n allowed: true,\r\n intent: null,\r\n reason: 'No intent declared - all actions allowed',\r\n violations: [],\r\n };\r\n }\r\n\r\n const violations: string[] = [];\r\n\r\n // Check operation is allowed\r\n if (!intent.allowedOperations.includes(action)) {\r\n violations.push(`Operation \"${action}\" not in allowed operations: ${intent.allowedOperations.join(', ')}`);\r\n }\r\n\r\n // Check path is allowed\r\n if (!this.isPathAllowed(targetPath, intent)) {\r\n violations.push(`Path \"${targetPath}\" not in allowed paths`);\r\n }\r\n\r\n // Check path is not excluded\r\n if (this.isPathExcluded(targetPath, intent)) {\r\n violations.push(`Path \"${targetPath}\" is explicitly excluded`);\r\n }\r\n\r\n // Check if target file is in the specified target files (if any)\r\n if (intent.targetFiles && intent.targetFiles.length > 0) {\r\n if (!this.isInTargetFiles(targetPath, intent.targetFiles)) {\r\n violations.push(`Path \"${targetPath}\" not in declared target files`);\r\n }\r\n }\r\n\r\n return {\r\n allowed: violations.length === 0,\r\n intent,\r\n reason: violations.length === 0 \r\n ? 'Action matches declared intent'\r\n : `Intent violation: ${violations.join('; ')}`,\r\n violations,\r\n };\r\n }\r\n\r\n /**\r\n * Extend the current intent with additional permissions\r\n */\r\n extend(extension: Partial<IntentDeclaration>): DeclaredIntent | null {\r\n if (!this.currentIntent) return null;\r\n\r\n // Merge extensions with current intent\r\n if (extension.allowedPaths) {\r\n this.currentIntent.allowedPaths = [\r\n ...new Set([...this.currentIntent.allowedPaths, ...extension.allowedPaths])\r\n ];\r\n }\r\n\r\n if (extension.allowedOperations) {\r\n this.currentIntent.allowedOperations = [\r\n ...new Set([...this.currentIntent.allowedOperations, ...extension.allowedOperations])\r\n ] as DeclaredIntent['allowedOperations'];\r\n }\r\n\r\n if (extension.targetFiles) {\r\n this.currentIntent.targetFiles = [\r\n ...new Set([...(this.currentIntent.targetFiles ?? []), ...extension.targetFiles])\r\n ];\r\n }\r\n\r\n if (extension.expiresInMs) {\r\n this.currentIntent.expiresAt = new Date(Date.now() + extension.expiresInMs);\r\n }\r\n\r\n return this.currentIntent;\r\n }\r\n\r\n /**\r\n * Restrict the current intent\r\n */\r\n restrict(restriction: Partial<IntentDeclaration>): DeclaredIntent | null {\r\n if (!this.currentIntent) return null;\r\n\r\n if (restriction.allowedPaths) {\r\n this.currentIntent.allowedPaths = restriction.allowedPaths;\r\n }\r\n\r\n if (restriction.allowedOperations) {\r\n this.currentIntent.allowedOperations = restriction.allowedOperations;\r\n }\r\n\r\n if (restriction.excludedPaths) {\r\n this.currentIntent.excludedPaths = [\r\n ...new Set([...(this.currentIntent.excludedPaths ?? []), ...restriction.excludedPaths])\r\n ];\r\n }\r\n\r\n return this.currentIntent;\r\n }\r\n\r\n private isPathAllowed(path: string, intent: DeclaredIntent): boolean {\r\n return intent.allowedPaths.some(pattern => this.matchPath(path, pattern));\r\n }\r\n\r\n private isPathExcluded(path: string, intent: DeclaredIntent): boolean {\r\n if (!intent.excludedPaths) return false;\r\n return intent.excludedPaths.some(pattern => this.matchPath(path, pattern));\r\n }\r\n\r\n private isInTargetFiles(path: string, targetFiles: string[]): boolean {\r\n return targetFiles.some(target => \r\n path === target || \r\n path.endsWith(target) ||\r\n this.matchPath(path, target)\r\n );\r\n }\r\n\r\n private matchPath(path: string, pattern: string): boolean {\r\n // Normalize paths\r\n const normalizedPath = path.replace(/\\\\/g, '/');\r\n const normalizedPattern = pattern.replace(/\\\\/g, '/');\r\n\r\n // Exact match\r\n if (normalizedPath === normalizedPattern) return true;\r\n\r\n // Wildcard matching\r\n if (normalizedPattern.includes('*')) {\r\n const regexPattern = normalizedPattern\r\n .replace(/\\*\\*/g, '<<<GLOBSTAR>>>')\r\n .replace(/\\*/g, '[^/]*')\r\n .replace(/<<<GLOBSTAR>>>/g, '.*');\r\n \r\n const regex = new RegExp(`^${regexPattern}$`);\r\n return regex.test(normalizedPath);\r\n }\r\n\r\n // Directory matching\r\n if (normalizedPattern.endsWith('/')) {\r\n return normalizedPath.startsWith(normalizedPattern);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private generateId(): string {\r\n return `intent-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\r\n }\r\n}\r\n\r\n// Singleton instance for global state\r\nlet globalIntentStore: IntentStore | null = null;\r\n\r\nexport function getIntentStore(): IntentStore {\r\n if (!globalIntentStore) {\r\n globalIntentStore = new IntentStore();\r\n }\r\n return globalIntentStore;\r\n}\r\n\r\nexport function resetIntentStore(): void {\r\n globalIntentStore = null;\r\n}\r\n","export { AgentFirewall, AuthDriftRule, BaseRule, ClaimExtractor, ContractDriftRule, EvidenceResolver, GhostEnvRule, GhostRouteRule, IntentStore, IntentValidator, PolicyEngine, ScopeExplosionRule, UnblockPlanner, UnsafeSideEffectRule, getDefaultRules, getIntentStore, resetIntentStore } from '../chunk-UBOXWUJG.js';\nimport '../chunk-Q52KPNKK.js';\nimport '../chunk-HGDXDNC3.js';\nimport '../chunk-J4YGF3OV.js';\nimport '../chunk-UPGC4PUW.js';\nimport '../chunk-K7LSLKXS.js';\nimport '../chunk-DGUM43GV.js';\n//# sourceMappingURL=index.js.map\n//# sourceMappingURL=index.js.map","/**\r\n * Firewall Tools\r\n * \r\n * MCP tools for the agent firewall.\r\n * Features enhanced multi-format output (JSON + pretty text + HTML).\r\n */\r\n\r\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport { z } from 'zod';\r\nimport * as path from 'path';\r\nimport {\r\n AgentFirewall,\r\n ClaimExtractor,\r\n EvidenceResolver,\r\n UnblockPlanner,\r\n type Claim,\r\n type ClaimType,\r\n} from '@vibecheck/core/firewall';\r\n\r\nimport { loadConfig } from '@repo/shared-config';\r\nimport {\r\n formatFirewallEvaluate,\r\n formatFirewallStatus,\r\n formatQuickCheck,\r\n formatSuccess,\r\n formatError,\r\n formatInfo,\r\n buildResponse,\r\n fmt,\r\n} from '../ui/index.js';\r\n\r\n// Get project root from centralized config or default to cwd\r\nconst getProjectRoot = (): string => {\r\n const config = loadConfig();\r\n return config.VIBECHECK_PROJECT_ROOT || process.cwd();\r\n};\r\n\r\n// Singleton instances for reuse\r\nlet firewallInstance: AgentFirewall | null = null;\r\nlet claimExtractorInstance: ClaimExtractor | null = null;\r\nlet evidenceResolverInstance: EvidenceResolver | null = null;\r\nlet unblockPlannerInstance: UnblockPlanner | null = null;\r\n\r\n// Statistics tracking\r\nconst statistics = {\r\n totalChecks: 0,\r\n blocked: 0,\r\n allowed: 0,\r\n};\r\n\r\nconst getFirewall = (): AgentFirewall => {\r\n if (!firewallInstance) {\r\n firewallInstance = new AgentFirewall({\r\n projectRoot: getProjectRoot(),\r\n truthpackPath: '.vibecheck/truthpack',\r\n strictMode: true,\r\n });\r\n }\r\n return firewallInstance;\r\n};\r\n\r\nconst getClaimExtractor = (): ClaimExtractor => {\r\n if (!claimExtractorInstance) {\r\n claimExtractorInstance = new ClaimExtractor();\r\n }\r\n return claimExtractorInstance;\r\n};\r\n\r\nconst getEvidenceResolver = (): EvidenceResolver => {\r\n if (!evidenceResolverInstance) {\r\n evidenceResolverInstance = new EvidenceResolver({\r\n projectRoot: getProjectRoot(),\r\n truthpackPath: '.vibecheck/truthpack',\r\n });\r\n }\r\n return evidenceResolverInstance;\r\n};\r\n\r\nconst getUnblockPlanner = (): UnblockPlanner => {\r\n if (!unblockPlannerInstance) {\r\n unblockPlannerInstance = new UnblockPlanner();\r\n }\r\n return unblockPlannerInstance;\r\n};\r\n\r\nexport function registerFirewallTools(server: McpServer): void {\r\n // Evaluate code through firewall\r\n server.tool(\r\n 'firewall_evaluate',\r\n 'Evaluate code through the agent firewall',\r\n {\r\n action: z.enum(['write', 'modify', 'delete']).describe('Action type'),\r\n target: z.string().describe('Target file path'),\r\n content: z.string().describe('Code content to evaluate'),\r\n },\r\n async ({ action, target, content }) => {\r\n const startTime = Date.now();\r\n try {\r\n const firewall = getFirewall();\r\n statistics.totalChecks++;\r\n\r\n const result = await firewall.evaluate({\r\n action,\r\n target,\r\n content,\r\n });\r\n\r\n if (result.allowed) {\r\n statistics.allowed++;\r\n } else {\r\n statistics.blocked++;\r\n }\r\n\r\n const duration = Date.now() - startTime;\r\n\r\n // Use enhanced formatting\r\n const response = formatFirewallEvaluate({\r\n allowed: result.allowed,\r\n action,\r\n target,\r\n claims: result.claims?.map((c: Claim) => ({\r\n type: c.type,\r\n value: c.value,\r\n verified: true, // If we got here, claims were verified\r\n })),\r\n violations: result.violations?.map((v: { policy: string; message: string }) => ({\r\n policy: v.policy,\r\n message: v.message,\r\n })),\r\n unblockPlan: result.unblockPlan?.map((s: { description: string; automated: boolean }) => ({\r\n description: s.description,\r\n automated: s.automated,\r\n })),\r\n duration,\r\n });\r\n\r\n return buildResponse(response);\r\n } catch (err) {\r\n const response = formatError(err instanceof Error ? err : 'Unknown error', {\r\n action,\r\n target,\r\n });\r\n return buildResponse(response);\r\n }\r\n }\r\n );\r\n\r\n // Quick check\r\n server.tool(\r\n 'firewall_quick_check',\r\n 'Quick hallucination check without full evidence resolution',\r\n {\r\n content: z.string().describe('Code content to check'),\r\n },\r\n async ({ content }) => {\r\n try {\r\n const firewall = getFirewall();\r\n const result = await firewall.quickCheck(content);\r\n\r\n const response = formatQuickCheck({\r\n safe: result.safe,\r\n concerns: result.concerns,\r\n });\r\n\r\n return buildResponse(response);\r\n } catch (err) {\r\n const response = formatQuickCheck({\r\n safe: false,\r\n concerns: [err instanceof Error ? err.message : 'Unknown error'],\r\n });\r\n return buildResponse(response);\r\n }\r\n }\r\n );\r\n\r\n // Extract claims\r\n server.tool(\r\n 'firewall_extract_claims',\r\n 'Extract verifiable claims from code',\r\n {\r\n content: z.string().describe('Code content to analyze'),\r\n },\r\n async ({ content }) => {\r\n try {\r\n const extractor = getClaimExtractor();\r\n const result = await extractor.extractWithStats(content);\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n claims: result.claims.map(c => ({\r\n id: c.id,\r\n type: c.type,\r\n value: c.value,\r\n location: c.location,\r\n confidence: c.confidence,\r\n })),\r\n statistics: result.statistics,\r\n }, null, 2),\r\n }],\r\n };\r\n } catch (err) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n claims: [],\r\n statistics: { totalClaims: 0, byType: {} },\r\n error: err instanceof Error ? err.message : 'Unknown error',\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n }\r\n );\r\n\r\n // Resolve evidence\r\n server.tool(\r\n 'firewall_resolve_evidence',\r\n 'Resolve evidence for claims',\r\n {\r\n claims: z.array(z.object({\r\n type: z.string(),\r\n value: z.string(),\r\n })).describe('Claims to resolve'),\r\n },\r\n async ({ claims }) => {\r\n try {\r\n const resolver = getEvidenceResolver();\r\n \r\n // Convert input claims to proper Claim objects\r\n const fullClaims: Claim[] = claims.map((c, i) => ({\r\n id: `claim-${i}`,\r\n type: c.type as ClaimType,\r\n value: c.value,\r\n location: { line: 0, column: 0, length: c.value.length },\r\n confidence: 0.8,\r\n context: c.value,\r\n }));\r\n\r\n const evidence = await resolver.resolveAll(fullClaims);\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n evidence: evidence.map((e, i) => ({\r\n claim: claims[i],\r\n found: e.found,\r\n source: e.source,\r\n location: e.location,\r\n confidence: e.confidence,\r\n details: e.details,\r\n })),\r\n }, null, 2),\r\n }],\r\n };\r\n } catch (err) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n evidence: claims.map(c => ({\r\n claim: c,\r\n found: false,\r\n source: null,\r\n error: err instanceof Error ? err.message : 'Unknown error',\r\n })),\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n }\r\n );\r\n\r\n // Get unblock plan\r\n server.tool(\r\n 'firewall_unblock_plan',\r\n 'Get a plan to unblock a firewall rejection',\r\n {\r\n violations: z.array(z.object({\r\n policy: z.string(),\r\n message: z.string(),\r\n })).describe('Violations to resolve'),\r\n },\r\n async ({ violations }) => {\r\n try {\r\n const planner = getUnblockPlanner();\r\n \r\n const plans = violations.map(v => planner.plan({\r\n policy: v.policy,\r\n message: v.message,\r\n severity: 'error',\r\n claim: undefined,\r\n }));\r\n\r\n // Combine all plans\r\n const combinedSteps = plans.flatMap(p => p.steps);\r\n const canAutoFix = plans.some(p => p.canAutoFix);\r\n const efforts = plans.map(p => p.estimatedEffort);\r\n const effortOrder = ['trivial', 'minor', 'moderate', 'major', 'significant'];\r\n const maxEffort = efforts.reduce((max, e) => \r\n effortOrder.indexOf(e) > effortOrder.indexOf(max) ? e : max\r\n , 'trivial');\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n steps: combinedSteps,\r\n estimatedEffort: maxEffort,\r\n canAutoFix,\r\n }, null, 2),\r\n }],\r\n };\r\n } catch (err) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n steps: [],\r\n estimatedEffort: 'unknown',\r\n canAutoFix: false,\r\n error: err instanceof Error ? err.message : 'Unknown error',\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n }\r\n );\r\n\r\n // Get firewall status\r\n server.tool(\r\n 'firewall_status',\r\n 'Get current firewall status and statistics',\r\n {},\r\n async () => {\r\n const firewall = getFirewall();\r\n const mode = firewall.getMode();\r\n\r\n const modeDescriptions: Record<string, string> = {\r\n observe: 'Logging violations but allowing all actions',\r\n enforce: 'Blocking actions with violations',\r\n lockdown: 'Blocking all write operations',\r\n };\r\n\r\n const response = formatFirewallStatus({\r\n enabled: true,\r\n mode,\r\n modeDescription: modeDescriptions[mode] ?? 'Unknown mode',\r\n statistics: {\r\n totalChecks: statistics.totalChecks,\r\n blocked: statistics.blocked,\r\n allowed: statistics.allowed,\r\n blockRate: statistics.totalChecks > 0 \r\n ? (statistics.blocked / statistics.totalChecks * 100).toFixed(1) + '%'\r\n : '0%',\r\n },\r\n });\r\n\r\n return buildResponse(response);\r\n }\r\n );\r\n\r\n // Get firewall mode\r\n server.tool(\r\n 'firewall_get_mode',\r\n 'Get the current firewall mode',\r\n {},\r\n async () => {\r\n const firewall = getFirewall();\r\n const mode = firewall.getMode();\r\n\r\n const descriptions: Record<string, string> = {\r\n observe: 'Logging violations but allowing all actions (monitoring only)',\r\n enforce: 'Blocking actions that have policy violations',\r\n lockdown: 'Blocking ALL write operations (emergency mode)',\r\n };\r\n\r\n const modeIcons: Record<string, string> = {\r\n observe: '👁️',\r\n enforce: '🛡️',\r\n lockdown: '🔒',\r\n };\r\n\r\n const response = formatInfo('FIREWALL MODE', {\r\n mode: `${modeIcons[mode] ?? ''} ${mode}`,\r\n description: descriptions[mode] ?? 'Unknown',\r\n availableModes: 'observe, enforce, lockdown',\r\n });\r\n\r\n return buildResponse(response);\r\n }\r\n );\r\n\r\n // Set firewall mode\r\n server.tool(\r\n 'firewall_set_mode',\r\n 'Set the firewall mode (observe/enforce/lockdown)',\r\n {\r\n mode: z.enum(['observe', 'enforce', 'lockdown'])\r\n .describe('observe: log only, enforce: block violations, lockdown: block all writes'),\r\n },\r\n async ({ mode }) => {\r\n const firewall = getFirewall();\r\n const previousMode = firewall.getMode();\r\n \r\n firewall.setMode(mode);\r\n\r\n const modeIcons: Record<string, string> = {\r\n observe: '👁️',\r\n enforce: '🛡️',\r\n lockdown: '🔒',\r\n };\r\n\r\n const descriptions: Record<string, string> = {\r\n observe: 'Now logging violations but allowing all actions',\r\n enforce: 'Now blocking actions with policy violations',\r\n lockdown: 'Now blocking ALL write operations',\r\n };\r\n\r\n // Build pretty text\r\n const textParts: string[] = [];\r\n textParts.push(fmt.headerBox(modeIcons[mode] ?? '⚙️', 'MODE CHANGED', mode.toUpperCase(), 45));\r\n textParts.push('');\r\n textParts.push(fmt.keyValue([\r\n ['Previous', previousMode],\r\n ['Current', mode],\r\n ['Status', descriptions[mode] ?? 'Unknown'],\r\n ]));\r\n\r\n if (mode === 'lockdown') {\r\n textParts.push('');\r\n textParts.push(`⚠️ WARNING: All write operations are now blocked.`);\r\n textParts.push(` Use firewall_set_mode with \"enforce\" to resume.`);\r\n } else if (mode === 'observe') {\r\n textParts.push('');\r\n textParts.push(`ℹ️ Violations are logged but not enforced.`);\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify({\r\n success: true,\r\n previousMode,\r\n currentMode: mode,\r\n message: descriptions[mode],\r\n }, null, 2),\r\n },\r\n {\r\n type: 'text',\r\n text: `\\n---\\n${textParts.join('\\n')}\\n---`,\r\n },\r\n ],\r\n };\r\n }\r\n );\r\n\r\n // Enter lockdown mode (convenience tool)\r\n server.tool(\r\n 'firewall_lockdown',\r\n 'Enter lockdown mode - blocks ALL write operations',\r\n {\r\n reason: z.string().optional().describe('Reason for entering lockdown'),\r\n },\r\n async ({ reason }) => {\r\n const firewall = getFirewall();\r\n const previousMode = firewall.getMode();\r\n \r\n firewall.setMode('lockdown');\r\n\r\n // Build pretty text\r\n const textParts: string[] = [];\r\n textParts.push('');\r\n textParts.push('╔═══════════════════════════════════════════════╗');\r\n textParts.push('║ 🔒 LOCKDOWN MODE ACTIVATED 🔒 ║');\r\n textParts.push('╚═══════════════════════════════════════════════╝');\r\n textParts.push('');\r\n textParts.push(` ${fmt.ICONS.blocked} All write operations are now BLOCKED`);\r\n textParts.push('');\r\n textParts.push(fmt.keyValue([\r\n ['Previous Mode', previousMode],\r\n ['Current Mode', 'lockdown'],\r\n ['Reason', reason ?? 'Manual lockdown'],\r\n ]));\r\n textParts.push('');\r\n textParts.push(' 💡 To exit: Use firewall_set_mode with mode=\"enforce\"');\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify({\r\n success: true,\r\n previousMode,\r\n currentMode: 'lockdown',\r\n reason: reason ?? 'Manual lockdown',\r\n message: 'LOCKDOWN ACTIVE: All write operations are now blocked.',\r\n howToExit: 'Use firewall_set_mode with mode=\"enforce\" to exit lockdown',\r\n }, null, 2),\r\n },\r\n {\r\n type: 'text',\r\n text: textParts.join('\\n'),\r\n },\r\n ],\r\n };\r\n }\r\n );\r\n}\r\n","/**\r\n * Validation Tools\r\n * \r\n * MCP tools for code validation and hallucination detection.\r\n */\r\n\r\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport { z } from 'zod';\r\nimport {\r\n ClaimExtractor,\r\n EvidenceResolver,\r\n type Claim,\r\n type ClaimType,\r\n} from '@vibecheck/core/firewall';\r\n\r\nimport { loadConfig } from '@repo/shared-config';\r\n\r\n// Get project root from centralized config or default to cwd\r\nconst getProjectRoot = (): string => {\r\n const config = loadConfig();\r\n return config.VIBECHECK_PROJECT_ROOT || process.cwd();\r\n};\r\n\r\n// Singleton instances\r\nlet claimExtractorInstance: ClaimExtractor | null = null;\r\nlet evidenceResolverInstance: EvidenceResolver | null = null;\r\n\r\nconst getClaimExtractor = (): ClaimExtractor => {\r\n if (!claimExtractorInstance) {\r\n claimExtractorInstance = new ClaimExtractor();\r\n }\r\n return claimExtractorInstance;\r\n};\r\n\r\nconst getEvidenceResolver = (): EvidenceResolver => {\r\n if (!evidenceResolverInstance) {\r\n evidenceResolverInstance = new EvidenceResolver({\r\n projectRoot: getProjectRoot(),\r\n truthpackPath: '.vibecheck/truthpack',\r\n });\r\n }\r\n return evidenceResolverInstance;\r\n};\r\n\r\nexport function registerValidationTools(server: McpServer): void {\r\n // Detect hallucinations\r\n server.tool(\r\n 'validation_detect_hallucinations',\r\n 'Detect potential hallucinations in code',\r\n {\r\n content: z.string().describe('Code content to analyze'),\r\n filePath: z.string().describe('File path for context'),\r\n },\r\n async ({ content, filePath }) => {\r\n try {\r\n const extractor = getClaimExtractor();\r\n const resolver = getEvidenceResolver();\r\n\r\n // Extract claims\r\n const result = await extractor.extractWithStats(content);\r\n const claims = result.claims;\r\n\r\n // Resolve evidence\r\n const evidence = await resolver.resolveAll(claims);\r\n\r\n // Find unverified claims (potential hallucinations)\r\n const candidates = claims\r\n .map((claim, index) => ({\r\n claim,\r\n evidence: evidence[index],\r\n }))\r\n .filter(({ evidence: e }) => !e.found)\r\n .map(({ claim, evidence: e }) => ({\r\n type: claim.type,\r\n value: claim.value,\r\n location: claim.location,\r\n confidence: claim.confidence,\r\n reason: `No evidence found via ${e.source}`,\r\n }));\r\n\r\n // Calculate hallucination score (0-1, higher = more hallucinations)\r\n const score = claims.length > 0 \r\n ? candidates.length / claims.length \r\n : 0;\r\n\r\n // Group by type\r\n const byType: Record<string, number> = {};\r\n for (const c of candidates) {\r\n byType[c.type] = (byType[c.type] || 0) + 1;\r\n }\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n candidates,\r\n score: Math.round(score * 100) / 100,\r\n summary: {\r\n total: candidates.length,\r\n byType,\r\n highConfidence: candidates.filter(c => c.confidence > 0.7).length,\r\n },\r\n filePath,\r\n }, null, 2),\r\n }],\r\n };\r\n } catch (err) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n candidates: [],\r\n score: 0,\r\n error: err instanceof Error ? err.message : 'Unknown error',\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n }\r\n );\r\n\r\n // Multi-source verification\r\n server.tool(\r\n 'validation_verify',\r\n 'Verify a claim against multiple sources',\r\n {\r\n claim: z.string().describe('Claim to verify'),\r\n type: z.string().describe('Claim type (import, type, api, etc.)'),\r\n },\r\n async ({ claim, type }) => {\r\n try {\r\n const resolver = getEvidenceResolver();\r\n\r\n // Create a claim object\r\n const claimObj: Claim = {\r\n id: `manual-${Date.now()}`,\r\n type: type as ClaimType,\r\n value: claim,\r\n location: { line: 0, column: 0, length: claim.length },\r\n confidence: 0.8,\r\n context: claim,\r\n };\r\n\r\n const evidence = await resolver.resolve(claimObj);\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n claim,\r\n type,\r\n verified: evidence.found,\r\n sources: [evidence.source],\r\n location: evidence.location,\r\n confidence: evidence.confidence,\r\n details: evidence.details,\r\n }, null, 2),\r\n }],\r\n };\r\n } catch (err) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n claim,\r\n type,\r\n verified: false,\r\n error: err instanceof Error ? err.message : 'Unknown error',\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n }\r\n );\r\n\r\n // Validate code\r\n server.tool(\r\n 'validation_code',\r\n 'Validate code for correctness and style',\r\n {\r\n content: z.string().describe('Code content to validate'),\r\n filePath: z.string().describe('File path'),\r\n checkTypes: z.boolean().optional().describe('Run type checking'),\r\n checkStyle: z.boolean().optional().describe('Run style checking'),\r\n },\r\n async ({ content, filePath, checkTypes, checkStyle }) => {\r\n try {\r\n const extractor = getClaimExtractor();\r\n const resolver = getEvidenceResolver();\r\n\r\n const errors: Array<{ line: number; message: string; severity: string }> = [];\r\n const warnings: Array<{ line: number; message: string }> = [];\r\n\r\n // Extract and verify claims\r\n const claims = await extractor.extract(content);\r\n const evidence = await resolver.resolveAll(claims);\r\n\r\n // Check for unverified imports\r\n for (let i = 0; i < claims.length; i++) {\r\n const claim = claims[i];\r\n const ev = evidence[i];\r\n\r\n if (!ev.found) {\r\n if (claim.type === 'import' || claim.type === 'package_dependency') {\r\n errors.push({\r\n line: claim.location.line,\r\n message: `Unverified import: ${claim.value}`,\r\n severity: 'error',\r\n });\r\n } else if (claim.type === 'type_reference') {\r\n warnings.push({\r\n line: claim.location.line,\r\n message: `Unverified type: ${claim.value}`,\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Basic style checks\r\n if (checkStyle) {\r\n const lines = content.split('\\n');\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i];\r\n // Check for console.log in non-test files\r\n if (line.includes('console.log') && !filePath.includes('test')) {\r\n warnings.push({\r\n line: i + 1,\r\n message: 'console.log found in production code',\r\n });\r\n }\r\n // Check for very long lines\r\n if (line.length > 120) {\r\n warnings.push({\r\n line: i + 1,\r\n message: `Line exceeds 120 characters (${line.length})`,\r\n });\r\n }\r\n }\r\n }\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n valid: errors.length === 0,\r\n errors,\r\n warnings,\r\n metrics: {\r\n lines: content.split('\\n').length,\r\n claims: claims.length,\r\n verified: evidence.filter(e => e.found).length,\r\n },\r\n }, null, 2),\r\n }],\r\n };\r\n } catch (err) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n valid: false,\r\n errors: [{ line: 0, message: err instanceof Error ? err.message : 'Unknown error', severity: 'error' }],\r\n warnings: [],\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n }\r\n );\r\n\r\n // Detect drift\r\n server.tool(\r\n 'validation_detect_drift',\r\n 'Detect drift between truthpack and codebase',\r\n {\r\n category: z.enum(['routes', 'env', 'auth', 'types', 'all'])\r\n .optional()\r\n .describe('Category to check for drift'),\r\n },\r\n async ({ category }) => {\r\n // This requires comparing current scan vs stored truthpack\r\n // For now, return a placeholder that suggests running truthpack_generate\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n hasDrift: false,\r\n items: [],\r\n summary: {\r\n added: 0,\r\n removed: 0,\r\n modified: 0,\r\n },\r\n recommendations: [\r\n 'Run truthpack_generate to refresh truthpack',\r\n 'Then run this check again to detect drift',\r\n ],\r\n note: 'Full drift detection requires comparing fresh scan against stored truthpack',\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n );\r\n\r\n // Verify imports\r\n server.tool(\r\n 'validation_verify_imports',\r\n 'Verify all imports in code are valid',\r\n {\r\n content: z.string().describe('Code content'),\r\n filePath: z.string().describe('File path for resolution'),\r\n },\r\n async ({ content, filePath }) => {\r\n try {\r\n const extractor = getClaimExtractor();\r\n const resolver = getEvidenceResolver();\r\n\r\n // Extract only import-related claims\r\n const allClaims = await extractor.extract(content);\r\n const importClaims = allClaims.filter(c => \r\n c.type === 'import' || c.type === 'package_dependency'\r\n );\r\n\r\n const evidence = await resolver.resolveAll(importClaims);\r\n\r\n const imports = importClaims.map((claim, i) => ({\r\n value: claim.value,\r\n line: claim.location.line,\r\n valid: evidence[i].found,\r\n source: evidence[i].source,\r\n details: evidence[i].details,\r\n }));\r\n\r\n const invalid = imports.filter(i => !i.valid);\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n imports,\r\n allValid: invalid.length === 0,\r\n invalid: invalid.map(i => ({\r\n value: i.value,\r\n line: i.line,\r\n suggestion: i.value.startsWith('.') \r\n ? 'Check file path exists' \r\n : 'Check package is in package.json',\r\n })),\r\n summary: {\r\n total: imports.length,\r\n valid: imports.length - invalid.length,\r\n invalid: invalid.length,\r\n },\r\n }, null, 2),\r\n }],\r\n };\r\n } catch (err) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n imports: [],\r\n allValid: false,\r\n invalid: [],\r\n error: err instanceof Error ? err.message : 'Unknown error',\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n }\r\n );\r\n}\r\n","/**\r\n * Registration Tools\r\n * \r\n * MCP tools for registering new patterns, conventions, and knowledge.\r\n */\r\n\r\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport { z } from 'zod';\r\nimport * as fs from 'fs/promises';\r\nimport * as path from 'path';\r\n\r\nimport { loadConfig } from '@repo/shared-config';\r\n\r\n// Get project root from centralized config or default to cwd\r\nconst getProjectRoot = (): string => {\r\n const config = loadConfig();\r\n return config.VIBECHECK_PROJECT_ROOT || process.cwd();\r\n};\r\n\r\n// Get truthpack directory path\r\nconst getTruthpackPath = (): string => {\r\n return path.join(getProjectRoot(), '.vibecheck', 'truthpack');\r\n};\r\n\r\n// Get knowledge directory path\r\nconst getKnowledgePath = (): string => {\r\n return path.join(getProjectRoot(), '.vibecheck', 'knowledge');\r\n};\r\n\r\n// Ensure directory exists\r\nconst ensureDir = async (dirPath: string): Promise<void> => {\r\n await fs.mkdir(dirPath, { recursive: true });\r\n};\r\n\r\n// Load JSON file safely\r\nconst loadJson = async <T>(filePath: string): Promise<T | null> => {\r\n try {\r\n const content = await fs.readFile(filePath, 'utf-8');\r\n return JSON.parse(content) as T;\r\n } catch {\r\n return null;\r\n }\r\n};\r\n\r\n// Save JSON file\r\nconst saveJson = async (filePath: string, data: unknown): Promise<void> => {\r\n await ensureDir(path.dirname(filePath));\r\n await fs.writeFile(filePath, JSON.stringify(data, null, 2), 'utf-8');\r\n};\r\n\r\nexport function registerRegistrationTools(server: McpServer): void {\r\n // Register a new pattern\r\n server.tool(\r\n 'register_pattern',\r\n 'Register a new code pattern for the AI to follow',\r\n {\r\n name: z.string().describe('Pattern name'),\r\n category: z.string().describe('Pattern category'),\r\n description: z.string().describe('Pattern description'),\r\n example: z.string().describe('Example code'),\r\n antiPatterns: z.array(z.string()).optional().describe('Anti-patterns to avoid'),\r\n },\r\n async ({ name, category, description, example, antiPatterns }) => {\r\n try {\r\n const patternsPath = path.join(getKnowledgePath(), 'patterns.json');\r\n const existing = await loadJson<{ patterns: Array<Record<string, unknown>> }>(patternsPath) || { patterns: [] };\r\n\r\n const newPattern = {\r\n id: `pattern-${Date.now()}`,\r\n name,\r\n category,\r\n description,\r\n example,\r\n antiPatterns: antiPatterns || [],\r\n createdAt: new Date().toISOString(),\r\n };\r\n\r\n // Check for duplicate\r\n const existingIndex = existing.patterns.findIndex((p: Record<string, unknown>) => p.name === name);\r\n if (existingIndex >= 0) {\r\n existing.patterns[existingIndex] = newPattern;\r\n } else {\r\n existing.patterns.push(newPattern);\r\n }\r\n\r\n await saveJson(patternsPath, existing);\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n registered: true,\r\n pattern: newPattern,\r\n message: `Pattern \"${name}\" registered successfully`,\r\n }, null, 2),\r\n }],\r\n };\r\n } catch (err) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n registered: false,\r\n error: err instanceof Error ? err.message : 'Unknown error',\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n }\r\n );\r\n\r\n // Register a convention\r\n server.tool(\r\n 'register_convention',\r\n 'Register a coding convention',\r\n {\r\n category: z.string().describe('Convention category (naming, imports, etc.)'),\r\n rule: z.string().describe('The convention rule'),\r\n example: z.string().optional().describe('Example demonstrating the convention'),\r\n },\r\n async ({ category, rule, example }) => {\r\n try {\r\n const conventionsPath = path.join(getKnowledgePath(), 'conventions.json');\r\n const existing = await loadJson<{ conventions: Array<Record<string, unknown>> }>(conventionsPath) || { conventions: [] };\r\n\r\n const newConvention = {\r\n id: `convention-${Date.now()}`,\r\n category,\r\n rule,\r\n example,\r\n createdAt: new Date().toISOString(),\r\n };\r\n\r\n existing.conventions.push(newConvention);\r\n await saveJson(conventionsPath, existing);\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n registered: true,\r\n convention: newConvention,\r\n message: `Convention in \"${category}\" registered successfully`,\r\n }, null, 2),\r\n }],\r\n };\r\n } catch (err) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n registered: false,\r\n error: err instanceof Error ? err.message : 'Unknown error',\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n }\r\n );\r\n\r\n // Register an API endpoint\r\n server.tool(\r\n 'register_endpoint',\r\n 'Register an API endpoint in the truthpack. Use this BEFORE creating a new route to prevent ghost-route errors.',\r\n {\r\n path: z.string().describe('API path (e.g., \"/api/users/:id\")'),\r\n method: z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE']).describe('HTTP method'),\r\n handler: z.string().describe('Handler function name'),\r\n file: z.string().describe('File containing the handler'),\r\n description: z.string().optional().describe('Endpoint description'),\r\n },\r\n async ({ path: routePath, method, handler, file, description }) => {\r\n try {\r\n const routesPath = path.join(getTruthpackPath(), 'routes.json');\r\n const existing = await loadJson<{ \r\n version: string;\r\n generatedAt: string;\r\n routes: Array<{ method: string; path: string; handler: string; file: string; description?: string; line?: number }>;\r\n summary: Record<string, unknown>;\r\n }>(routesPath) || {\r\n version: '1.0.0',\r\n generatedAt: new Date().toISOString(),\r\n routes: [],\r\n summary: {},\r\n };\r\n\r\n // Check for duplicate\r\n const existingRoute = existing.routes.find(r => r.method === method && r.path === routePath);\r\n if (existingRoute) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n registered: false,\r\n message: `Route ${method} ${routePath} already exists`,\r\n existingRoute,\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n\r\n const newRoute = {\r\n method,\r\n path: routePath,\r\n handler,\r\n file,\r\n description,\r\n line: 1,\r\n registeredAt: new Date().toISOString(),\r\n };\r\n\r\n existing.routes.push(newRoute);\r\n existing.generatedAt = new Date().toISOString();\r\n\r\n // Update summary\r\n existing.summary = {\r\n totalRoutes: existing.routes.length,\r\n byMethod: existing.routes.reduce((acc, r) => {\r\n acc[r.method] = (acc[r.method] || 0) + 1;\r\n return acc;\r\n }, {} as Record<string, number>),\r\n };\r\n\r\n await saveJson(routesPath, existing);\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n registered: true,\r\n route: newRoute,\r\n message: `Route ${method} ${routePath} registered successfully. You can now use this endpoint without ghost-route errors.`,\r\n }, null, 2),\r\n }],\r\n };\r\n } catch (err) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n registered: false,\r\n error: err instanceof Error ? err.message : 'Unknown error',\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n }\r\n );\r\n\r\n // Register an environment variable\r\n server.tool(\r\n 'register_env_var',\r\n 'Register an environment variable in the truthpack. Use this BEFORE using a new env var to prevent ghost-env errors.',\r\n {\r\n name: z.string().describe('Variable name (e.g., \"STRIPE_SECRET_KEY\")'),\r\n type: z.enum(['string', 'number', 'boolean', 'url', 'secret']).describe('Variable type'),\r\n required: z.boolean().describe('Is required'),\r\n description: z.string().optional().describe('Variable description'),\r\n defaultValue: z.string().optional().describe('Default value'),\r\n },\r\n async ({ name, type, required, description, defaultValue }) => {\r\n try {\r\n const envPath = path.join(getTruthpackPath(), 'env.json');\r\n const existing = await loadJson<{\r\n version: string;\r\n generatedAt: string;\r\n variables: Array<{ name: string; type: string; required: boolean; description?: string; defaultValue?: string; sensitive: boolean }>;\r\n summary: Record<string, unknown>;\r\n }>(envPath) || {\r\n version: '1.0.0',\r\n generatedAt: new Date().toISOString(),\r\n variables: [],\r\n environments: [],\r\n summary: {},\r\n };\r\n\r\n // Check for duplicate\r\n const existingVar = existing.variables.find(v => v.name === name);\r\n if (existingVar) {\r\n // Update existing\r\n Object.assign(existingVar, { type, required, description, defaultValue });\r\n await saveJson(envPath, existing);\r\n \r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n registered: true,\r\n updated: true,\r\n variable: existingVar,\r\n message: `Environment variable \"${name}\" updated`,\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n\r\n // Determine if sensitive based on name or type\r\n const sensitivePatterns = ['secret', 'password', 'token', 'key', 'api_key', 'apikey', 'private', 'credential'];\r\n const isSensitive = type === 'secret' || sensitivePatterns.some(p => name.toLowerCase().includes(p));\r\n\r\n const newVar = {\r\n name,\r\n type,\r\n required,\r\n description,\r\n defaultValue,\r\n sensitive: isSensitive,\r\n registeredAt: new Date().toISOString(),\r\n };\r\n\r\n existing.variables.push(newVar);\r\n existing.generatedAt = new Date().toISOString();\r\n\r\n // Update summary\r\n existing.summary = {\r\n totalVariables: existing.variables.length,\r\n required: existing.variables.filter(v => v.required).length,\r\n optional: existing.variables.filter(v => !v.required).length,\r\n sensitive: existing.variables.filter(v => v.sensitive).length,\r\n };\r\n\r\n await saveJson(envPath, existing);\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n registered: true,\r\n variable: newVar,\r\n message: `Environment variable \"${name}\" registered. You can now use process.env.${name} without ghost-env errors.`,\r\n reminder: required ? `Remember to add ${name} to your .env file!` : undefined,\r\n }, null, 2),\r\n }],\r\n };\r\n } catch (err) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n registered: false,\r\n error: err instanceof Error ? err.message : 'Unknown error',\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n }\r\n );\r\n\r\n // Register a type\r\n server.tool(\r\n 'register_type',\r\n 'Register a TypeScript type in the truthpack contracts',\r\n {\r\n name: z.string().describe('Type name'),\r\n definition: z.string().describe('Type definition'),\r\n file: z.string().describe('File containing the type'),\r\n description: z.string().optional().describe('Type description'),\r\n },\r\n async ({ name, definition, file, description }) => {\r\n try {\r\n const contractsPath = path.join(getTruthpackPath(), 'contracts.json');\r\n const existing = await loadJson<{\r\n version: string;\r\n generatedAt: string;\r\n contracts: Array<Record<string, unknown>>;\r\n types: Array<{ name: string; definition: string; file: string; description?: string }>;\r\n }>(contractsPath) || {\r\n version: '1.0.0',\r\n generatedAt: new Date().toISOString(),\r\n contracts: [],\r\n types: [],\r\n };\r\n\r\n // Initialize types array if not present\r\n if (!existing.types) {\r\n existing.types = [];\r\n }\r\n\r\n // Check for duplicate\r\n const existingType = existing.types.find(t => t.name === name);\r\n if (existingType) {\r\n Object.assign(existingType, { definition, file, description });\r\n await saveJson(contractsPath, existing);\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n registered: true,\r\n updated: true,\r\n type: existingType,\r\n message: `Type \"${name}\" updated`,\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n\r\n const newType = {\r\n name,\r\n definition,\r\n file,\r\n description,\r\n registeredAt: new Date().toISOString(),\r\n };\r\n\r\n existing.types.push(newType);\r\n existing.generatedAt = new Date().toISOString();\r\n\r\n await saveJson(contractsPath, existing);\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n registered: true,\r\n type: newType,\r\n message: `Type \"${name}\" registered successfully`,\r\n }, null, 2),\r\n }],\r\n };\r\n } catch (err) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n registered: false,\r\n error: err instanceof Error ? err.message : 'Unknown error',\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n }\r\n );\r\n}\r\n","/**\r\n * Intent Tools\r\n * \r\n * MCP tools for intent declaration and management.\r\n * Allows AI agents to declare their intended scope of operations.\r\n * Features enhanced multi-format output (JSON + pretty text + HTML).\r\n */\r\n\r\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport { z } from 'zod';\r\nimport { \r\n getIntentStore,\r\n type IntentDeclaration,\r\n} from '@vibecheck/core/firewall';\r\nimport { fmt } from '../ui/index.js';\r\n\r\nexport function registerIntentTools(server: McpServer): void {\r\n const store = getIntentStore();\r\n\r\n // Declare intent\r\n server.tool(\r\n 'intent_declare',\r\n 'Declare the intended scope and operations for upcoming actions',\r\n {\r\n description: z.string().describe('Description of what you intend to do'),\r\n allowedPaths: z.array(z.string()).optional()\r\n .describe('File path patterns allowed (e.g., \"src/components/**/*\")'),\r\n allowedOperations: z.array(z.enum(['read', 'write', 'modify', 'delete', 'execute'])).optional()\r\n .describe('Operations allowed (default: read, write, modify)'),\r\n scope: z.enum(['file', 'directory', 'module', 'project']).optional()\r\n .describe('Scope of changes (default: file)'),\r\n targetFiles: z.array(z.string()).optional()\r\n .describe('Specific files to modify'),\r\n excludedPaths: z.array(z.string()).optional()\r\n .describe('Paths to exclude from allowed operations'),\r\n expiresInMinutes: z.number().optional()\r\n .describe('Intent expiration time in minutes (default: no expiration)'),\r\n },\r\n async ({ \r\n description, \r\n allowedPaths, \r\n allowedOperations, \r\n scope, \r\n targetFiles,\r\n excludedPaths,\r\n expiresInMinutes \r\n }) => {\r\n try {\r\n const declaration: IntentDeclaration = {\r\n description,\r\n allowedPaths,\r\n allowedOperations,\r\n scope,\r\n targetFiles,\r\n excludedPaths,\r\n expiresInMs: expiresInMinutes ? expiresInMinutes * 60 * 1000 : undefined,\r\n };\r\n\r\n const intent = store.declare(declaration);\r\n\r\n // Build pretty text output\r\n const textParts: string[] = [];\r\n textParts.push(fmt.headerBox('🎯', 'INTENT DECLARED', intent.scope ?? 'file', 50));\r\n textParts.push('');\r\n textParts.push(` ${fmt.ICONS.success} ${intent.description}`);\r\n textParts.push('');\r\n \r\n textParts.push(fmt.keyValue([\r\n ['ID', intent.id.slice(0, 8) + '...'],\r\n ['Scope', intent.scope ?? 'file'],\r\n ['Declared', intent.declaredAt.toLocaleString()],\r\n ]));\r\n\r\n if (intent.allowedPaths && intent.allowedPaths.length > 0) {\r\n textParts.push('');\r\n textParts.push(fmt.section('Allowed Paths', '', '📁'));\r\n textParts.push(fmt.bulletList(intent.allowedPaths.slice(0, 5)));\r\n }\r\n\r\n if (intent.allowedOperations && intent.allowedOperations.length > 0) {\r\n textParts.push('');\r\n textParts.push(` Operations: ${intent.allowedOperations.join(', ')}`);\r\n }\r\n\r\n if (intent.expiresAt) {\r\n textParts.push('');\r\n textParts.push(` ⏰ Expires: ${intent.expiresAt.toLocaleString()}`);\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify({\r\n success: true,\r\n intent: {\r\n id: intent.id,\r\n description: intent.description,\r\n allowedPaths: intent.allowedPaths,\r\n allowedOperations: intent.allowedOperations,\r\n scope: intent.scope,\r\n targetFiles: intent.targetFiles,\r\n excludedPaths: intent.excludedPaths,\r\n declaredAt: intent.declaredAt.toISOString(),\r\n expiresAt: intent.expiresAt?.toISOString(),\r\n },\r\n message: 'Intent declared successfully. Operations outside this scope will be flagged.',\r\n }, null, 2),\r\n },\r\n {\r\n type: 'text',\r\n text: `\\n---\\n${textParts.join('\\n')}\\n---`,\r\n },\r\n ],\r\n };\r\n } catch (err) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n success: false,\r\n error: err instanceof Error ? err.message : 'Unknown error',\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n }\r\n );\r\n\r\n // Get current intent\r\n server.tool(\r\n 'intent_get',\r\n 'Get the currently active intent declaration',\r\n {},\r\n async () => {\r\n const intent = store.getCurrent();\r\n\r\n if (!intent) {\r\n const textParts: string[] = [];\r\n textParts.push(fmt.headerBox('🎯', 'CURRENT INTENT', 'None', 45));\r\n textParts.push('');\r\n textParts.push(` ${fmt.ICONS.info} No active intent`);\r\n textParts.push(' All operations are currently allowed.');\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify({\r\n active: false,\r\n message: 'No active intent. All operations are currently allowed.',\r\n }, null, 2),\r\n },\r\n {\r\n type: 'text',\r\n text: `\\n---\\n${textParts.join('\\n')}\\n---`,\r\n },\r\n ],\r\n };\r\n }\r\n\r\n const now = new Date();\r\n const isExpired = intent.expiresAt && now > intent.expiresAt;\r\n const timeRemaining = intent.expiresAt \r\n ? Math.max(0, Math.floor((intent.expiresAt.getTime() - now.getTime()) / 1000))\r\n : null;\r\n\r\n // Build pretty text output\r\n const textParts: string[] = [];\r\n const statusIcon = isExpired ? '⏰' : '✅';\r\n const statusText = isExpired ? 'Expired' : 'Active';\r\n \r\n textParts.push(fmt.headerBox('🎯', 'CURRENT INTENT', statusText, 50));\r\n textParts.push('');\r\n textParts.push(` ${statusIcon} ${intent.description}`);\r\n textParts.push('');\r\n \r\n textParts.push(fmt.keyValue([\r\n ['Status', isExpired ? '✗ Expired' : '✓ Active'],\r\n ['Scope', intent.scope ?? 'file'],\r\n ['Operations', (intent.allowedOperations ?? []).join(', ') || 'All'],\r\n ]));\r\n\r\n if (intent.allowedPaths && intent.allowedPaths.length > 0) {\r\n textParts.push('');\r\n textParts.push(fmt.section('Allowed Paths', '', '📁'));\r\n textParts.push(fmt.tree(intent.allowedPaths.slice(0, 5).map(p => ({ label: p }))));\r\n }\r\n\r\n if (timeRemaining !== null && !isExpired) {\r\n textParts.push('');\r\n const mins = Math.floor(timeRemaining / 60);\r\n const secs = timeRemaining % 60;\r\n textParts.push(` ⏱️ Time remaining: ${mins}m ${secs}s`);\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify({\r\n active: !isExpired,\r\n intent: {\r\n id: intent.id,\r\n description: intent.description,\r\n allowedPaths: intent.allowedPaths,\r\n allowedOperations: intent.allowedOperations,\r\n scope: intent.scope,\r\n targetFiles: intent.targetFiles,\r\n excludedPaths: intent.excludedPaths,\r\n declaredAt: intent.declaredAt.toISOString(),\r\n expiresAt: intent.expiresAt?.toISOString(),\r\n timeRemaining,\r\n },\r\n }, null, 2),\r\n },\r\n {\r\n type: 'text',\r\n text: `\\n---\\n${textParts.join('\\n')}\\n---`,\r\n },\r\n ],\r\n };\r\n }\r\n );\r\n\r\n // Clear intent\r\n server.tool(\r\n 'intent_clear',\r\n 'Clear the current intent declaration (allows all operations)',\r\n {},\r\n async () => {\r\n const cleared = store.clear();\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n success: true,\r\n cleared: cleared ? {\r\n id: cleared.id,\r\n description: cleared.description,\r\n } : null,\r\n message: cleared \r\n ? 'Intent cleared. All operations are now allowed.'\r\n : 'No active intent to clear.',\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n );\r\n\r\n // Check if an action is allowed\r\n server.tool(\r\n 'intent_check',\r\n 'Check if a specific action is allowed under current intent',\r\n {\r\n action: z.enum(['read', 'write', 'modify', 'delete', 'execute'])\r\n .describe('Action to check'),\r\n targetPath: z.string()\r\n .describe('Target file path'),\r\n },\r\n async ({ action, targetPath }) => {\r\n const result = store.checkAction(action, targetPath);\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n allowed: result.allowed,\r\n reason: result.reason,\r\n violations: result.violations,\r\n intent: result.intent ? {\r\n id: result.intent.id,\r\n description: result.intent.description,\r\n } : null,\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n );\r\n\r\n // Extend current intent\r\n server.tool(\r\n 'intent_extend',\r\n 'Extend the current intent with additional permissions',\r\n {\r\n allowedPaths: z.array(z.string()).optional()\r\n .describe('Additional allowed paths'),\r\n allowedOperations: z.array(z.enum(['read', 'write', 'modify', 'delete', 'execute'])).optional()\r\n .describe('Additional allowed operations'),\r\n targetFiles: z.array(z.string()).optional()\r\n .describe('Additional target files'),\r\n extendExpirationMinutes: z.number().optional()\r\n .describe('Extend expiration by this many minutes'),\r\n },\r\n async ({ allowedPaths, allowedOperations, targetFiles, extendExpirationMinutes }) => {\r\n const extended = store.extend({\r\n allowedPaths,\r\n allowedOperations,\r\n targetFiles,\r\n expiresInMs: extendExpirationMinutes ? extendExpirationMinutes * 60 * 1000 : undefined,\r\n });\r\n\r\n if (!extended) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n success: false,\r\n error: 'No active intent to extend. Declare an intent first.',\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n success: true,\r\n intent: {\r\n id: extended.id,\r\n allowedPaths: extended.allowedPaths,\r\n allowedOperations: extended.allowedOperations,\r\n targetFiles: extended.targetFiles,\r\n expiresAt: extended.expiresAt?.toISOString(),\r\n },\r\n message: 'Intent extended successfully.',\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n );\r\n\r\n // Restrict current intent\r\n server.tool(\r\n 'intent_restrict',\r\n 'Restrict the current intent with narrower permissions',\r\n {\r\n allowedPaths: z.array(z.string()).optional()\r\n .describe('New restricted allowed paths'),\r\n allowedOperations: z.array(z.enum(['read', 'write', 'modify', 'delete', 'execute'])).optional()\r\n .describe('New restricted allowed operations'),\r\n excludedPaths: z.array(z.string()).optional()\r\n .describe('Additional paths to exclude'),\r\n },\r\n async ({ allowedPaths, allowedOperations, excludedPaths }) => {\r\n const restricted = store.restrict({\r\n allowedPaths,\r\n allowedOperations,\r\n excludedPaths,\r\n });\r\n\r\n if (!restricted) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n success: false,\r\n error: 'No active intent to restrict. Declare an intent first.',\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n success: true,\r\n intent: {\r\n id: restricted.id,\r\n allowedPaths: restricted.allowedPaths,\r\n allowedOperations: restricted.allowedOperations,\r\n excludedPaths: restricted.excludedPaths,\r\n },\r\n message: 'Intent restricted successfully.',\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n );\r\n\r\n // Get intent history\r\n server.tool(\r\n 'intent_history',\r\n 'Get history of declared intents',\r\n {\r\n limit: z.number().optional().describe('Maximum number of entries (default: 20)'),\r\n },\r\n async ({ limit }) => {\r\n const history = store.getHistory(limit ?? 20);\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n count: history.length,\r\n history: history.map(intent => ({\r\n id: intent.id,\r\n description: intent.description,\r\n scope: intent.scope,\r\n declaredAt: intent.declaredAt.toISOString(),\r\n expiresAt: intent.expiresAt?.toISOString(),\r\n })),\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n );\r\n}\r\n","/**\r\n * Prompt Tools\r\n * \r\n * MCP tools for enhanced prompt building, verification, and task planning.\r\n */\r\n\r\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport { z } from 'zod';\r\nimport * as fs from 'fs/promises';\r\nimport * as path from 'path';\r\n\r\nimport { loadConfig } from '@repo/shared-config';\r\n\r\n// Get project root from centralized config or default to cwd\r\nconst getProjectRoot = (): string => {\r\n const config = loadConfig();\r\n return config.VIBECHECK_PROJECT_ROOT || process.cwd();\r\n};\r\n\r\n// Simple truthpack loader\r\nconst loadTruthpack = async (section: string): Promise<unknown | null> => {\r\n const filePath = path.join(getProjectRoot(), '.vibecheck', 'truthpack', `${section}.json`);\r\n try {\r\n const content = await fs.readFile(filePath, 'utf-8');\r\n return JSON.parse(content);\r\n } catch {\r\n return null;\r\n }\r\n};\r\n\r\nexport function registerPromptTools(server: McpServer): void {\r\n // Plan a task\r\n server.tool(\r\n 'prompt_plan_task',\r\n 'Break down a complex task into smaller, verifiable sub-tasks',\r\n {\r\n task: z.string().describe('The task to plan'),\r\n includeTests: z.boolean().optional().describe('Include test tasks (default: true)'),\r\n includeDocumentation: z.boolean().optional().describe('Include documentation tasks (default: false)'),\r\n },\r\n async ({ task, includeTests, includeDocumentation }) => {\r\n try {\r\n const { TaskPlanner } = await import('@vibecheck/core/prompt');\r\n \r\n const planner = new TaskPlanner({\r\n includeTests: includeTests ?? true,\r\n includeDocumentation: includeDocumentation ?? false,\r\n });\r\n\r\n const plan = planner.plan(task);\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n originalTask: plan.originalTask,\r\n totalComplexity: plan.totalComplexity,\r\n taskCount: plan.tasks.length,\r\n tasks: plan.tasks.map(t => ({\r\n id: t.id,\r\n description: t.description,\r\n type: t.type,\r\n complexity: t.estimatedComplexity,\r\n dependencies: t.dependencies,\r\n verificationPoints: t.verificationPoints.length,\r\n })),\r\n executionOrder: plan.executionOrder,\r\n warnings: plan.warnings,\r\n requiredContext: plan.requiredContext,\r\n }, null, 2),\r\n }],\r\n };\r\n } catch (err) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n error: err instanceof Error ? err.message : 'Unknown error',\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n }\r\n );\r\n\r\n // Get task details with prompt\r\n server.tool(\r\n 'prompt_get_task',\r\n 'Get detailed prompt for a specific planned task',\r\n {\r\n task: z.string().describe('The original task description'),\r\n taskIndex: z.number().describe('Index of the sub-task to get (0-based)'),\r\n includeContext: z.boolean().optional().describe('Include truthpack context (default: true)'),\r\n },\r\n async ({ task, taskIndex, includeContext }) => {\r\n try {\r\n const { TaskPlanner } = await import('@vibecheck/core/prompt');\r\n \r\n const planner = new TaskPlanner();\r\n const plan = planner.plan(task);\r\n\r\n if (taskIndex < 0 || taskIndex >= plan.tasks.length) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n error: `Task index ${taskIndex} out of range (0-${plan.tasks.length - 1})`,\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n\r\n const selectedTask = plan.tasks[taskIndex];\r\n \r\n // Load context if requested\r\n let context: Record<string, unknown> = {};\r\n if (includeContext !== false) {\r\n for (const section of plan.requiredContext) {\r\n const data = await loadTruthpack(section);\r\n if (data) {\r\n context[section] = data;\r\n }\r\n }\r\n }\r\n\r\n const prompt = planner.generateTaskPrompt(selectedTask, context);\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n taskId: selectedTask.id,\r\n description: selectedTask.description,\r\n type: selectedTask.type,\r\n complexity: selectedTask.estimatedComplexity,\r\n verificationPoints: selectedTask.verificationPoints,\r\n prompt,\r\n }, null, 2),\r\n }],\r\n };\r\n } catch (err) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n error: err instanceof Error ? err.message : 'Unknown error',\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n }\r\n );\r\n\r\n // Verify a prompt\r\n server.tool(\r\n 'prompt_verify',\r\n 'Verify a prompt for potential issues before sending to AI',\r\n {\r\n prompt: z.string().describe('The prompt to verify'),\r\n strictMode: z.boolean().optional().describe('Enable strict validation (default: true)'),\r\n },\r\n async ({ prompt, strictMode }) => {\r\n try {\r\n const { PromptVerifier } = await import('@vibecheck/core/prompt');\r\n \r\n const verifier = new PromptVerifier({\r\n strictMode: strictMode ?? true,\r\n });\r\n\r\n const result = verifier.verify(prompt);\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n valid: result.valid,\r\n score: result.score,\r\n estimatedRisk: result.estimatedRisk,\r\n issueCount: result.issues.length,\r\n issues: result.issues.map(i => ({\r\n type: i.type,\r\n category: i.category,\r\n message: i.message,\r\n suggestion: i.suggestion,\r\n })),\r\n requiredContext: result.requiredContext,\r\n enhancedPrompt: result.enhancedPrompt,\r\n }, null, 2),\r\n }],\r\n };\r\n } catch (err) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n error: err instanceof Error ? err.message : 'Unknown error',\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n }\r\n );\r\n\r\n // Quick check prompt\r\n server.tool(\r\n 'prompt_quick_check',\r\n 'Quick check if a prompt has blocking issues',\r\n {\r\n prompt: z.string().describe('The prompt to check'),\r\n },\r\n async ({ prompt }) => {\r\n try {\r\n const { PromptVerifier } = await import('@vibecheck/core/prompt');\r\n \r\n const verifier = new PromptVerifier();\r\n const result = verifier.quickCheck(prompt);\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n blocked: result.blocked,\r\n reason: result.reason,\r\n safe: !result.blocked,\r\n }, null, 2),\r\n }],\r\n };\r\n } catch (err) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n blocked: false,\r\n error: err instanceof Error ? err.message : 'Unknown error',\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n }\r\n );\r\n\r\n // Build enhanced prompt\r\n server.tool(\r\n 'prompt_build',\r\n 'Build an enhanced prompt with truthpack context injection',\r\n {\r\n task: z.string().describe('The task description'),\r\n includeRoutes: z.boolean().optional().describe('Include API routes context'),\r\n includeEnv: z.boolean().optional().describe('Include environment variables context'),\r\n includeAuth: z.boolean().optional().describe('Include authentication context'),\r\n includeContracts: z.boolean().optional().describe('Include API contracts context'),\r\n },\r\n async ({ task, includeRoutes, includeEnv, includeAuth, includeContracts }) => {\r\n try {\r\n const sections: string[] = [];\r\n const contextInjected: string[] = [];\r\n\r\n // Build prompt header\r\n sections.push('## Task');\r\n sections.push('');\r\n sections.push(task);\r\n sections.push('');\r\n sections.push('## Verified Context');\r\n sections.push('');\r\n sections.push('The following information is verified ground truth from the codebase.');\r\n sections.push('Use ONLY these facts. Do NOT invent APIs, types, or endpoints not listed here.');\r\n sections.push('');\r\n\r\n // Include routes\r\n if (includeRoutes) {\r\n const routes = await loadTruthpack('routes') as { routes?: Array<{ method: string; path: string }>; summary?: { totalRoutes: number } } | null;\r\n if (routes?.routes) {\r\n sections.push('### API Routes');\r\n sections.push('');\r\n const routeList = routes.routes.slice(0, 15).map(r => `- ${r.method} ${r.path}`);\r\n sections.push(routeList.join('\\n'));\r\n if (routes.routes.length > 15) {\r\n sections.push(`- ... and ${routes.routes.length - 15} more`);\r\n }\r\n sections.push('');\r\n contextInjected.push('routes');\r\n }\r\n }\r\n\r\n // Include env\r\n if (includeEnv) {\r\n const env = await loadTruthpack('env') as { variables?: Array<{ name: string; required: boolean }> } | null;\r\n if (env?.variables) {\r\n sections.push('### Environment Variables');\r\n sections.push('');\r\n const envList = env.variables.slice(0, 10).map(v => `- ${v.name}${v.required ? ' (required)' : ''}`);\r\n sections.push(envList.join('\\n'));\r\n sections.push('');\r\n contextInjected.push('env');\r\n }\r\n }\r\n\r\n // Include auth\r\n if (includeAuth) {\r\n const auth = await loadTruthpack('auth') as { roles?: Array<{ name: string }>; publicPaths?: string[] } | null;\r\n if (auth) {\r\n sections.push('### Authentication');\r\n sections.push('');\r\n if (auth.roles) {\r\n sections.push(`**Roles:** ${auth.roles.map(r => r.name).join(', ')}`);\r\n }\r\n if (auth.publicPaths) {\r\n sections.push(`**Public paths:** ${auth.publicPaths.slice(0, 5).join(', ')}`);\r\n }\r\n sections.push('');\r\n contextInjected.push('auth');\r\n }\r\n }\r\n\r\n // Include contracts\r\n if (includeContracts) {\r\n const contracts = await loadTruthpack('contracts') as { contracts?: Array<{ path: string; method?: string }> } | null;\r\n if (contracts?.contracts) {\r\n sections.push('### API Contracts');\r\n sections.push('');\r\n const contractList = contracts.contracts.slice(0, 10).map(c => `- ${c.method || 'ANY'} ${c.path}`);\r\n sections.push(contractList.join('\\n'));\r\n sections.push('');\r\n contextInjected.push('contracts');\r\n }\r\n }\r\n\r\n // Verification requirements\r\n sections.push('## Verification Requirements');\r\n sections.push('');\r\n sections.push('Before generating code, ensure:');\r\n sections.push('1. All imports exist in package.json or as local files');\r\n sections.push('2. All API endpoints match routes listed above');\r\n sections.push('3. All environment variables are declared');\r\n sections.push('4. Types match truthpack schemas');\r\n\r\n const prompt = sections.join('\\n');\r\n const tokenEstimate = Math.ceil(prompt.length / 4);\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n prompt,\r\n contextInjected,\r\n tokenEstimate,\r\n warnings: tokenEstimate > 4000 ? ['Prompt exceeds recommended token limit'] : [],\r\n }, null, 2),\r\n }],\r\n };\r\n } catch (err) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n error: err instanceof Error ? err.message : 'Unknown error',\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n }\r\n );\r\n\r\n // Get prompt templates\r\n server.tool(\r\n 'prompt_templates',\r\n 'Get available prompt templates',\r\n {},\r\n async () => {\r\n const templates = [\r\n {\r\n id: 'create-component',\r\n name: 'Create Component',\r\n description: 'Create a new React/Vue component',\r\n variables: ['framework', 'componentName', 'requirements'],\r\n requiredContext: ['routes', 'contracts'],\r\n },\r\n {\r\n id: 'add-api-endpoint',\r\n name: 'Add API Endpoint',\r\n description: 'Add a new API endpoint',\r\n variables: ['method', 'path', 'requirements'],\r\n requiredContext: ['routes', 'auth', 'contracts'],\r\n },\r\n {\r\n id: 'fix-bug',\r\n name: 'Fix Bug',\r\n description: 'Fix a bug in existing code',\r\n variables: ['issue', 'files', 'expectedBehavior', 'currentBehavior'],\r\n requiredContext: [],\r\n },\r\n {\r\n id: 'refactor',\r\n name: 'Refactor Code',\r\n description: 'Refactor existing code',\r\n variables: ['goal', 'currentImplementation', 'files'],\r\n requiredContext: ['conventions'],\r\n },\r\n ];\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n templates,\r\n count: templates.length,\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n );\r\n}\r\n","/**\r\n * Forge Tools\r\n *\r\n * MCP tools for the Self-Aware Forge Engine.\r\n * Provides AI context generation, phase detection, and auto-updating.\r\n * Features enhanced multi-format output (JSON + pretty text + HTML).\r\n */\r\n\r\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport { z } from 'zod';\r\nimport * as fs from 'fs/promises';\r\nimport * as path from 'path';\r\nimport { loadConfig } from '@repo/shared-config';\r\nimport { fmt } from '../ui/index.js';\r\n\r\n// Get project root from centralized config or default to cwd\r\nconst getProjectRoot = (): string => {\r\n const config = loadConfig();\r\n return config.VIBECHECK_PROJECT_ROOT || process.cwd();\r\n};\r\n\r\n// Get forge paths\r\nconst getForgeContextPath = (): string => {\r\n return path.join(getProjectRoot(), '.vibecheck', 'forge-context.json');\r\n};\r\n\r\nconst getForgeManifestPath = (): string => {\r\n return path.join(getProjectRoot(), '.vibecheck', 'forge-manifest.json');\r\n};\r\n\r\nexport function registerForgeTools(server: McpServer): void {\r\n // ============================================================================\r\n // forge_generate - Generate or update AI context rules\r\n // ============================================================================\r\n\r\n server.tool(\r\n 'forge_generate',\r\n 'Generate or update AI context rules using the Forge engine. Creates optimized rules for Cursor, Windsurf, and other AI assistants.',\r\n {\r\n tier: z\r\n .enum(['minimal', 'standard', 'extended', 'comprehensive'])\r\n .optional()\r\n .describe('Rule tier: minimal (5), standard (10), extended (20), comprehensive (50)'),\r\n maxRules: z.number().optional().describe('Override max rules for tier'),\r\n incremental: z\r\n .boolean()\r\n .optional()\r\n .describe('Enable incremental mode - only regenerate changed rules (default: true)'),\r\n generateContract: z\r\n .boolean()\r\n .optional()\r\n .describe('Generate AI Contract defining allowed/forbidden actions (default: true)'),\r\n platforms: z\r\n .array(z.enum(['cursor', 'windsurf']))\r\n .optional()\r\n .describe('Target platforms (default: cursor, windsurf)'),\r\n },\r\n async ({ tier, maxRules, incremental, generateContract, platforms }) => {\r\n const projectRoot = getProjectRoot();\r\n\r\n try {\r\n // Dynamic import to avoid bundling issues\r\n const { forge } = await import('@vibecheck/core/forge');\r\n\r\n const output = await forge(projectRoot, {\r\n tier: tier ?? 'standard',\r\n maxRules: maxRules,\r\n incremental: incremental ?? true,\r\n generateContract: generateContract ?? true,\r\n platforms: platforms ?? ['cursor', 'windsurf'],\r\n verbose: false,\r\n });\r\n\r\n // Build pretty text output\r\n const textParts: string[] = [];\r\n textParts.push(fmt.headerBox(fmt.ICONS.sparkle, 'FORGE GENERATION', 'Complete', 50));\r\n textParts.push('');\r\n textParts.push(fmt.keyValue([\r\n ['Rules Generated', String(output.stats.rulesGenerated)],\r\n ['Files Written', String(output.stats.filesWritten)],\r\n ['Time', fmt.duration(output.stats.timeMs)],\r\n ['Mode', output.stats.incremental ? 'Incremental' : 'Full'],\r\n ]));\r\n\r\n if (output.stats.rulesSkipped > 0 || output.stats.rulesPruned > 0) {\r\n textParts.push('');\r\n textParts.push(` ⏭️ ${output.stats.rulesSkipped} skipped, ${output.stats.rulesPruned} pruned`);\r\n }\r\n\r\n textParts.push('');\r\n textParts.push(fmt.section('Generated Rules', '', '📋'));\r\n \r\n const rulesByCategory: Record<string, Array<{ name: string; impact: number }>> = {};\r\n for (const r of output.manifest.rules) {\r\n if (!rulesByCategory[r.category]) rulesByCategory[r.category] = [];\r\n rulesByCategory[r.category].push({ name: r.name, impact: r.impact });\r\n }\r\n\r\n for (const [category, rules] of Object.entries(rulesByCategory)) {\r\n textParts.push(`\\n ${category} (${rules.length})`);\r\n for (const rule of rules.slice(0, 3)) {\r\n const impactBar = '█'.repeat(Math.ceil(rule.impact / 20));\r\n textParts.push(` ${fmt.BOX.treeEnd} ${rule.name} ${impactBar}`);\r\n }\r\n if (rules.length > 3) {\r\n textParts.push(` ... and ${rules.length - 3} more`);\r\n }\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify(\r\n {\r\n success: true,\r\n stats: {\r\n rulesGenerated: output.stats.rulesGenerated,\r\n filesWritten: output.stats.filesWritten,\r\n timeMs: output.stats.timeMs,\r\n incremental: output.stats.incremental,\r\n rulesSkipped: output.stats.rulesSkipped,\r\n rulesPruned: output.stats.rulesPruned,\r\n },\r\n files: output.files,\r\n contractGenerated: !!output.contract,\r\n rules: output.manifest.rules.map((r) => ({\r\n id: r.id,\r\n category: r.category,\r\n name: r.name,\r\n impact: r.impact,\r\n })),\r\n },\r\n null,\r\n 2\r\n ),\r\n },\r\n {\r\n type: 'text',\r\n text: `\\n---\\n${textParts.join('\\n')}\\n---`,\r\n },\r\n ],\r\n };\r\n } catch (error) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify(\r\n {\r\n success: false,\r\n error: error instanceof Error ? error.message : String(error),\r\n },\r\n null,\r\n 2\r\n ),\r\n },\r\n ],\r\n isError: true,\r\n };\r\n }\r\n }\r\n );\r\n\r\n // ============================================================================\r\n // forge_status - Get current Forge status\r\n // ============================================================================\r\n\r\n server.tool(\r\n 'forge_status',\r\n 'Get current Forge status including phase, rule count, and last update time.',\r\n {},\r\n async () => {\r\n const projectRoot = getProjectRoot();\r\n\r\n try {\r\n const contextPath = getForgeContextPath();\r\n const manifestPath = getForgeManifestPath();\r\n\r\n let context = null;\r\n let manifest = null;\r\n\r\n try {\r\n const contextContent = await fs.readFile(contextPath, 'utf-8');\r\n context = JSON.parse(contextContent);\r\n } catch {\r\n // No context file\r\n }\r\n\r\n try {\r\n const manifestContent = await fs.readFile(manifestPath, 'utf-8');\r\n manifest = JSON.parse(manifestContent);\r\n } catch {\r\n // No manifest file\r\n }\r\n\r\n const status = {\r\n initialized: !!manifest,\r\n phase: context?.currentPhase ?? 'unknown',\r\n ruleCount: manifest?.rules?.length ?? 0,\r\n lastUpdate: manifest?.generatedAt ?? null,\r\n consecutiveSamePhase: context?.consecutiveSamePhase ?? 0,\r\n changeVelocity: context?.changeVelocity ?? 0,\r\n phaseHistory: context?.phaseHistory?.slice(-5) ?? [],\r\n analysisHistory: context?.analysisHistory?.slice(-5) ?? [],\r\n manifest: manifest\r\n ? {\r\n version: manifest.version,\r\n tier: manifest.config?.tier,\r\n platforms: manifest.config?.platforms,\r\n filesWritten: manifest.stats?.filesWritten,\r\n }\r\n : null,\r\n };\r\n\r\n // Build pretty text output\r\n const phaseIcons: Record<string, string> = {\r\n prototyping: '🧪',\r\n active_development: '🔨',\r\n refactoring: '🔄',\r\n maintenance: '🔧',\r\n unknown: '❓',\r\n };\r\n\r\n const textParts: string[] = [];\r\n textParts.push(fmt.headerBox(fmt.ICONS.gear, 'FORGE STATUS', status.phase, 50));\r\n textParts.push('');\r\n \r\n const icon = phaseIcons[status.phase] ?? '📊';\r\n textParts.push(fmt.keyValue([\r\n ['Initialized', status.initialized ? '✓ Yes' : '✗ No'],\r\n ['Phase', `${icon} ${status.phase}`],\r\n ['Rules', String(status.ruleCount)],\r\n ['Last Update', status.lastUpdate ? new Date(status.lastUpdate).toLocaleString() : 'Never'],\r\n ]));\r\n\r\n if (status.manifest) {\r\n textParts.push('');\r\n textParts.push(fmt.section('Manifest', '', '📋'));\r\n textParts.push(fmt.keyValue([\r\n ['Version', status.manifest.version ?? 'N/A'],\r\n ['Tier', status.manifest.tier ?? 'N/A'],\r\n ['Platforms', (status.manifest.platforms ?? []).join(', ')],\r\n ]));\r\n }\r\n\r\n if (status.phaseHistory.length > 0) {\r\n textParts.push('');\r\n textParts.push(fmt.section('Phase History', '', '📈'));\r\n textParts.push(` ${status.phaseHistory.join(' → ')}`);\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify(status, null, 2),\r\n },\r\n {\r\n type: 'text',\r\n text: `\\n---\\n${textParts.join('\\n')}\\n---`,\r\n },\r\n ],\r\n };\r\n } catch (error) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify(\r\n {\r\n success: false,\r\n error: error instanceof Error ? error.message : String(error),\r\n },\r\n null,\r\n 2\r\n ),\r\n },\r\n ],\r\n isError: true,\r\n };\r\n }\r\n }\r\n );\r\n\r\n // ============================================================================\r\n // forge_phase - Get detailed phase analysis\r\n // ============================================================================\r\n\r\n server.tool(\r\n 'forge_phase',\r\n 'Analyze and detect the current project phase using 8 weighted signals.',\r\n {\r\n analyzeGitHistory: z\r\n .boolean()\r\n .optional()\r\n .describe('Include git history in analysis (default: true)'),\r\n },\r\n async ({ analyzeGitHistory }) => {\r\n const projectRoot = getProjectRoot();\r\n\r\n try {\r\n const { detectPhase } = await import('@vibecheck/core/forge');\r\n\r\n const result = await detectPhase({\r\n projectPath: projectRoot,\r\n analyzeGitHistory: analyzeGitHistory ?? true,\r\n transitionThreshold: 3,\r\n minConfidence: 0.7,\r\n });\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify(\r\n {\r\n phase: result.phase,\r\n confidence: Math.round(result.confidence * 100) / 100,\r\n phaseChanged: result.phaseChanged,\r\n previousPhase: result.previousPhase,\r\n signals: result.signals.map((s) => ({\r\n name: s.name,\r\n score: Math.round(s.score),\r\n weight: `${Math.round(s.weight * 100)}%`,\r\n explanation: s.explanation,\r\n })),\r\n phaseScores: Object.fromEntries(\r\n Object.entries(result.phaseScores).map(([k, v]) => [k, Math.round(v)])\r\n ),\r\n detectedAt: result.detectedAt,\r\n },\r\n null,\r\n 2\r\n ),\r\n },\r\n ],\r\n };\r\n } catch (error) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify(\r\n {\r\n success: false,\r\n error: error instanceof Error ? error.message : String(error),\r\n },\r\n null,\r\n 2\r\n ),\r\n },\r\n ],\r\n isError: true,\r\n };\r\n }\r\n }\r\n );\r\n\r\n // ============================================================================\r\n // forge_analyze - Run project analysis\r\n // ============================================================================\r\n\r\n server.tool(\r\n 'forge_analyze',\r\n 'Run comprehensive project analysis to understand codebase structure, patterns, and conventions.',\r\n {\r\n includeComplexity: z\r\n .boolean()\r\n .optional()\r\n .describe('Include complexity analysis (slower)'),\r\n includePatterns: z\r\n .boolean()\r\n .optional()\r\n .describe('Include pattern learning (slower)'),\r\n includeCoverage: z\r\n .boolean()\r\n .optional()\r\n .describe('Include test coverage analysis if available'),\r\n },\r\n async ({ includeComplexity, includePatterns, includeCoverage }) => {\r\n const projectRoot = getProjectRoot();\r\n\r\n try {\r\n const { analyzeProject, DEFAULT_FORGE_CONFIG } = await import(\r\n '@vibecheck/core/forge'\r\n );\r\n\r\n const analysis = await analyzeProject(projectRoot, DEFAULT_FORGE_CONFIG);\r\n\r\n const result: Record<string, unknown> = {\r\n name: analysis.name,\r\n framework: analysis.framework,\r\n language: analysis.language,\r\n architecture: analysis.architecture,\r\n stats: analysis.stats,\r\n components: {\r\n count: analysis.components.length,\r\n samples: analysis.components.slice(0, 10).map((c) => c.name),\r\n },\r\n apiRoutes: {\r\n count: analysis.apiRoutes.length,\r\n samples: analysis.apiRoutes.slice(0, 10).map((r) => `${r.method} ${r.path}`),\r\n },\r\n models: {\r\n count: analysis.models.length,\r\n names: analysis.models.map((m) => m.name),\r\n },\r\n types: {\r\n interfaces: analysis.types.interfaces.length,\r\n types: analysis.types.types.length,\r\n enums: analysis.types.enums.length,\r\n },\r\n patterns: {\r\n stateManagement: analysis.patterns.stateManagement || 'none',\r\n testing: analysis.patterns.testing,\r\n styling: analysis.patterns.styling,\r\n validation: analysis.patterns.validation || 'none',\r\n authentication: analysis.patterns.authentication || 'none',\r\n hooks: analysis.patterns.hooks.length,\r\n },\r\n monorepo: analysis.monorepo.isMonorepo\r\n ? {\r\n type: analysis.monorepo.type,\r\n workspaces: analysis.monorepo.workspaces.length,\r\n }\r\n : null,\r\n envVars: {\r\n total: analysis.envVars.variables.length,\r\n sensitive: analysis.envVars.sensitive.length,\r\n missing: analysis.envVars.missing.length,\r\n },\r\n };\r\n\r\n // Optional: complexity analysis\r\n if (includeComplexity) {\r\n try {\r\n const { calculateProjectComplexity } = await import(\r\n '@vibecheck/core/forge'\r\n );\r\n const complexity = await calculateProjectComplexity(projectRoot);\r\n result.complexity = {\r\n healthScore: complexity.healthScore,\r\n averageComplexity: complexity.averageComplexity,\r\n hotspots: complexity.hotspots.slice(0, 5),\r\n tiers: {\r\n low: complexity.complexityTiers.low.length,\r\n medium: complexity.complexityTiers.medium.length,\r\n high: complexity.complexityTiers.high.length,\r\n critical: complexity.complexityTiers.critical.length,\r\n },\r\n };\r\n } catch {\r\n result.complexity = { error: 'Failed to analyze complexity' };\r\n }\r\n }\r\n\r\n // Optional: pattern learning\r\n if (includePatterns) {\r\n try {\r\n const { learnPatterns } = await import('@vibecheck/core/forge');\r\n const patterns = await learnPatterns(projectRoot);\r\n result.learnedPatterns = {\r\n namingConventions: patterns.namingConventions,\r\n fileOrganization: patterns.fileOrganization,\r\n errorHandlingStyle: patterns.errorHandlingStyle,\r\n commonSignatures: patterns.commonSignatures.slice(0, 5),\r\n patternCount: patterns.patterns.length,\r\n };\r\n } catch {\r\n result.learnedPatterns = { error: 'Failed to learn patterns' };\r\n }\r\n }\r\n\r\n // Optional: coverage analysis\r\n if (includeCoverage) {\r\n try {\r\n const { analyzeCoverage } = await import('@vibecheck/core/forge');\r\n const coverage = await analyzeCoverage(projectRoot);\r\n result.coverage = coverage.available\r\n ? {\r\n source: coverage.source,\r\n overall: coverage.overall,\r\n untestedFiles: coverage.untestedFiles.length,\r\n lowCoverageFiles: coverage.lowCoverageFiles.length,\r\n }\r\n : { available: false };\r\n } catch {\r\n result.coverage = { error: 'Failed to analyze coverage' };\r\n }\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify(result, null, 2),\r\n },\r\n ],\r\n };\r\n } catch (error) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify(\r\n {\r\n success: false,\r\n error: error instanceof Error ? error.message : String(error),\r\n },\r\n null,\r\n 2\r\n ),\r\n },\r\n ],\r\n isError: true,\r\n };\r\n }\r\n }\r\n );\r\n\r\n // ============================================================================\r\n // forge_rules - List generated rules\r\n // ============================================================================\r\n\r\n server.tool(\r\n 'forge_rules',\r\n 'List all generated AI context rules with their categories and impact scores.',\r\n {\r\n category: z\r\n .string()\r\n .optional()\r\n .describe('Filter by category (e.g., \"architecture\", \"components\", \"testing\")'),\r\n },\r\n async ({ category }) => {\r\n try {\r\n const manifestPath = getForgeManifestPath();\r\n const manifestContent = await fs.readFile(manifestPath, 'utf-8');\r\n const manifest = JSON.parse(manifestContent);\r\n\r\n let rules = manifest.rules ?? [];\r\n\r\n if (category) {\r\n rules = rules.filter(\r\n (r: { category: string }) =>\r\n r.category.toLowerCase() === category.toLowerCase()\r\n );\r\n }\r\n\r\n // Sort by impact\r\n rules.sort((a: { impact: number }, b: { impact: number }) => b.impact - a.impact);\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify(\r\n {\r\n totalRules: manifest.rules?.length ?? 0,\r\n filteredRules: rules.length,\r\n category: category ?? 'all',\r\n rules: rules.map(\r\n (r: {\r\n id: string;\r\n category: string;\r\n name: string;\r\n impact: number;\r\n outputFile: string;\r\n }) => ({\r\n id: r.id,\r\n category: r.category,\r\n name: r.name,\r\n impact: r.impact,\r\n file: r.outputFile,\r\n })\r\n ),\r\n },\r\n null,\r\n 2\r\n ),\r\n },\r\n ],\r\n };\r\n } catch (error) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify(\r\n {\r\n success: false,\r\n error:\r\n 'No rules found. Run forge_generate first to create rules.',\r\n details: error instanceof Error ? error.message : String(error),\r\n },\r\n null,\r\n 2\r\n ),\r\n },\r\n ],\r\n isError: true,\r\n };\r\n }\r\n }\r\n );\r\n\r\n // ============================================================================\r\n // forge_contract - Get AI Contract\r\n // ============================================================================\r\n\r\n server.tool(\r\n 'forge_contract',\r\n 'Get the AI Contract defining allowed and forbidden actions for this project.',\r\n {},\r\n async () => {\r\n try {\r\n const contractPath = path.join(\r\n getProjectRoot(),\r\n '.vibecheck',\r\n 'ai-contract.json'\r\n );\r\n const contractContent = await fs.readFile(contractPath, 'utf-8');\r\n const contract = JSON.parse(contractContent);\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify(\r\n {\r\n version: contract.version,\r\n projectId: contract.projectId,\r\n generatedAt: contract.generatedAt,\r\n summary: {\r\n allowedActions: contract.allowed?.length ?? 0,\r\n forbiddenActions: contract.forbidden?.length ?? 0,\r\n confirmationRequired: contract.requiresConfirmation?.length ?? 0,\r\n },\r\n allowed: contract.allowed,\r\n forbidden: contract.forbidden,\r\n requiresConfirmation: contract.requiresConfirmation,\r\n fileBoundaries: contract.fileBoundaries,\r\n codeStandards: contract.codeStandards,\r\n safetyRules: {\r\n critical: contract.safetyRules?.critical?.length ?? 0,\r\n high: contract.safetyRules?.high?.length ?? 0,\r\n standard: contract.safetyRules?.standard?.length ?? 0,\r\n },\r\n },\r\n null,\r\n 2\r\n ),\r\n },\r\n ],\r\n };\r\n } catch (error) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify(\r\n {\r\n success: false,\r\n error:\r\n 'No AI Contract found. Run forge_generate with generateContract: true.',\r\n details: error instanceof Error ? error.message : String(error),\r\n },\r\n null,\r\n 2\r\n ),\r\n },\r\n ],\r\n isError: true,\r\n };\r\n }\r\n }\r\n );\r\n\r\n // ============================================================================\r\n // forge_reset - Reset Forge state\r\n // ============================================================================\r\n\r\n server.tool(\r\n 'forge_reset',\r\n 'Reset Forge state and clear generated files. Use with caution.',\r\n {\r\n clearRules: z\r\n .boolean()\r\n .optional()\r\n .describe('Delete generated rule files (default: false)'),\r\n clearContext: z\r\n .boolean()\r\n .optional()\r\n .describe('Clear context memory (default: false)'),\r\n clearManifest: z\r\n .boolean()\r\n .optional()\r\n .describe('Delete manifest file (default: false)'),\r\n },\r\n async ({ clearRules, clearContext, clearManifest }) => {\r\n const projectRoot = getProjectRoot();\r\n const deleted: string[] = [];\r\n const errors: string[] = [];\r\n\r\n try {\r\n // Clear context memory\r\n if (clearContext) {\r\n try {\r\n await fs.unlink(getForgeContextPath());\r\n deleted.push('forge-context.json');\r\n } catch {\r\n // File may not exist\r\n }\r\n }\r\n\r\n // Clear manifest\r\n if (clearManifest) {\r\n try {\r\n await fs.unlink(getForgeManifestPath());\r\n deleted.push('forge-manifest.json');\r\n } catch {\r\n // File may not exist\r\n }\r\n }\r\n\r\n // Clear rules\r\n if (clearRules) {\r\n const rulePaths = [\r\n path.join(projectRoot, '.cursorrules'),\r\n path.join(projectRoot, '.cursor', 'rules'),\r\n path.join(projectRoot, '.cursor', 'agents'),\r\n path.join(projectRoot, '.cursor', 'skills'),\r\n path.join(projectRoot, '.cursor', 'hooks'),\r\n path.join(projectRoot, '.windsurf', 'rules'),\r\n path.join(projectRoot, '.vibecheck', 'ai-contract.json'),\r\n path.join(projectRoot, '.vibecheck', 'AI_CONTRACT.md'),\r\n ];\r\n\r\n for (const rulePath of rulePaths) {\r\n try {\r\n const stat = await fs.stat(rulePath);\r\n if (stat.isDirectory()) {\r\n await fs.rm(rulePath, { recursive: true });\r\n } else {\r\n await fs.unlink(rulePath);\r\n }\r\n deleted.push(path.relative(projectRoot, rulePath));\r\n } catch {\r\n // Path may not exist\r\n }\r\n }\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify(\r\n {\r\n success: true,\r\n deleted,\r\n errors: errors.length > 0 ? errors : undefined,\r\n },\r\n null,\r\n 2\r\n ),\r\n },\r\n ],\r\n };\r\n } catch (error) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify(\r\n {\r\n success: false,\r\n error: error instanceof Error ? error.message : String(error),\r\n deleted,\r\n },\r\n null,\r\n 2\r\n ),\r\n },\r\n ],\r\n isError: true,\r\n };\r\n }\r\n }\r\n );\r\n\r\n // ============================================================================\r\n // forge_memory_record - Record a conversation or event in memory\r\n // ============================================================================\r\n\r\n server.tool(\r\n 'forge_memory_record',\r\n 'Record a conversation, decision, or learning in the enhanced memory system. Call this to help Forge learn from interactions.',\r\n {\r\n type: z\r\n .enum(['conversation', 'decision', 'insight', 'code_change', 'lesson'])\r\n .describe('Type of memory to record'),\r\n summary: z.string().describe('Summary of what happened'),\r\n details: z.record(z.unknown()).optional().describe('Additional details'),\r\n tags: z.array(z.string()).optional().describe('Tags for categorization'),\r\n outcome: z\r\n .enum(['success', 'partial', 'failed', 'abandoned'])\r\n .optional()\r\n .describe('Outcome of the interaction'),\r\n filesModified: z.array(z.string()).optional().describe('Files that were modified'),\r\n lessons: z.array(z.string()).optional().describe('Lessons learned'),\r\n },\r\n async ({ type, summary, details, tags, outcome, filesModified, lessons }) => {\r\n const projectRoot = getProjectRoot();\r\n\r\n try {\r\n const { loadEnhancedMemory } = await import('@vibecheck/core/forge');\r\n const memory = loadEnhancedMemory(projectRoot);\r\n\r\n switch (type) {\r\n case 'conversation':\r\n memory.recordConversation({\r\n source: 'cursor',\r\n summary,\r\n decisions: (details?.decisions as Array<{\r\n question: string;\r\n decision: string;\r\n rationale: string;\r\n alternatives: string[];\r\n confidence: number;\r\n }>) ?? [],\r\n patternsDiscussed: (details?.patterns as string[]) ?? [],\r\n filesModified: filesModified ?? [],\r\n lessons: lessons ?? [],\r\n outcome: outcome ?? 'success',\r\n tags: tags ?? [],\r\n });\r\n break;\r\n\r\n case 'decision':\r\n // Record as timeline event\r\n memory.addTimelineEvent({\r\n type: 'milestone',\r\n title: `Decision: ${summary.substring(0, 50)}`,\r\n description: summary,\r\n metadata: details ?? {},\r\n impact: 'medium',\r\n relatedFiles: filesModified,\r\n });\r\n break;\r\n\r\n case 'insight':\r\n memory.addInsight({\r\n category: (details?.category as 'architecture' | 'pattern' | 'anti-pattern' | 'convention' | 'dependency' | 'performance' | 'security') ?? 'pattern',\r\n insight: summary,\r\n evidence: (details?.evidence as string[]) ?? [],\r\n confidence: (details?.confidence as number) ?? 0.7,\r\n occurrences: 1,\r\n applicableFiles: filesModified ?? [],\r\n validated: false,\r\n });\r\n break;\r\n\r\n case 'code_change':\r\n memory.recordCodeChange({\r\n type: (details?.changeType as 'create' | 'modify' | 'delete' | 'rename' | 'refactor') ?? 'modify',\r\n filePath: filesModified?.[0] ?? 'unknown',\r\n changeDescription: summary,\r\n linesAdded: (details?.linesAdded as number) ?? 0,\r\n linesRemoved: (details?.linesRemoved as number) ?? 0,\r\n complexityDelta: (details?.complexityDelta as number) ?? 0,\r\n breaking: (details?.breaking as boolean) ?? false,\r\n relatedTo: details?.relatedTo as string,\r\n });\r\n break;\r\n\r\n case 'lesson':\r\n // Add lesson as insight\r\n memory.addInsight({\r\n category: 'convention',\r\n insight: summary,\r\n evidence: lessons ?? [],\r\n confidence: 0.8,\r\n occurrences: 1,\r\n applicableFiles: filesModified ?? [],\r\n validated: true,\r\n });\r\n break;\r\n }\r\n\r\n memory.save();\r\n memory.dispose();\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify({\r\n success: true,\r\n recorded: type,\r\n summary: summary.substring(0, 100),\r\n }, null, 2),\r\n },\r\n ],\r\n };\r\n } catch (error) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify({\r\n success: false,\r\n error: error instanceof Error ? error.message : String(error),\r\n }, null, 2),\r\n },\r\n ],\r\n isError: true,\r\n };\r\n }\r\n }\r\n );\r\n\r\n // ============================================================================\r\n // forge_memory_query - Search the enhanced memory\r\n // ============================================================================\r\n\r\n server.tool(\r\n 'forge_memory_query',\r\n 'Search the enhanced memory for relevant information, past conversations, insights, and lessons learned.',\r\n {\r\n query: z.string().describe('Search query'),\r\n types: z\r\n .array(z.enum(['conversation', 'insight', 'timeline', 'knowledge']))\r\n .optional()\r\n .describe('Types of memory to search'),\r\n limit: z.number().optional().describe('Maximum results (default: 10)'),\r\n },\r\n async ({ query, types, limit }) => {\r\n const projectRoot = getProjectRoot();\r\n\r\n try {\r\n const { loadEnhancedMemory } = await import('@vibecheck/core/forge');\r\n const memory = loadEnhancedMemory(projectRoot);\r\n\r\n const results = memory.semanticSearch(query, limit ?? 10);\r\n\r\n // Filter by types if specified\r\n const filtered = types\r\n ? results.filter((r) => types.includes(r.type))\r\n : results;\r\n\r\n memory.dispose();\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify({\r\n query,\r\n resultCount: filtered.length,\r\n results: filtered.map((r) => ({\r\n type: r.type,\r\n relevance: r.relevance,\r\n item: r.item,\r\n })),\r\n }, null, 2),\r\n },\r\n ],\r\n };\r\n } catch (error) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify({\r\n success: false,\r\n error: error instanceof Error ? error.message : String(error),\r\n }, null, 2),\r\n },\r\n ],\r\n isError: true,\r\n };\r\n }\r\n }\r\n );\r\n\r\n // ============================================================================\r\n // forge_memory_stats - Get memory statistics\r\n // ============================================================================\r\n\r\n server.tool(\r\n 'forge_memory_stats',\r\n 'Get statistics about the enhanced memory system.',\r\n {},\r\n async () => {\r\n const projectRoot = getProjectRoot();\r\n\r\n try {\r\n const { loadEnhancedMemory } = await import('@vibecheck/core/forge');\r\n const memory = loadEnhancedMemory(projectRoot);\r\n\r\n const stats = memory.getStats();\r\n const prefs = memory.getPreferences();\r\n const topRules = memory.getTopPerformingRules(5);\r\n const lessons = memory.getAllLessons().slice(0, 10);\r\n\r\n memory.dispose();\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify({\r\n stats,\r\n preferences: {\r\n naming: prefs.naming,\r\n architecture: prefs.architecture.folderStructure,\r\n testing: prefs.testing.framework,\r\n confidence: prefs.confidence,\r\n },\r\n topPerformingRules: topRules.map((r) => ({\r\n id: r.ruleId,\r\n score: r.score,\r\n applications: r.applicationCount,\r\n })),\r\n recentLessons: lessons,\r\n }, null, 2),\r\n },\r\n ],\r\n };\r\n } catch (error) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify({\r\n success: false,\r\n error: error instanceof Error ? error.message : String(error),\r\n }, null, 2),\r\n },\r\n ],\r\n isError: true,\r\n };\r\n }\r\n }\r\n );\r\n\r\n // ============================================================================\r\n // forge_memory_timeline - Get project timeline\r\n // ============================================================================\r\n\r\n server.tool(\r\n 'forge_memory_timeline',\r\n 'Get the project timeline showing major events and milestones.',\r\n {\r\n limit: z.number().optional().describe('Number of events (default: 20)'),\r\n type: z\r\n .string()\r\n .optional()\r\n .describe('Filter by event type'),\r\n },\r\n async ({ limit, type }) => {\r\n const projectRoot = getProjectRoot();\r\n\r\n try {\r\n const { loadEnhancedMemory } = await import('@vibecheck/core/forge');\r\n const memory = loadEnhancedMemory(projectRoot);\r\n\r\n let events = memory.getRecentEvents(limit ?? 20);\r\n\r\n if (type) {\r\n events = events.filter((e) => e.type === type);\r\n }\r\n\r\n memory.dispose();\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify({\r\n eventCount: events.length,\r\n events: events.map((e) => ({\r\n timestamp: e.timestamp,\r\n type: e.type,\r\n title: e.title,\r\n impact: e.impact,\r\n relatedFiles: e.relatedFiles?.slice(0, 3),\r\n })),\r\n }, null, 2),\r\n },\r\n ],\r\n };\r\n } catch (error) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify({\r\n success: false,\r\n error: error instanceof Error ? error.message : String(error),\r\n }, null, 2),\r\n },\r\n ],\r\n isError: true,\r\n };\r\n }\r\n }\r\n );\r\n\r\n // ============================================================================\r\n // forge_rule_feedback - Provide feedback on a rule\r\n // ============================================================================\r\n\r\n server.tool(\r\n 'forge_rule_feedback',\r\n 'Provide feedback on a generated rule to help Forge learn and improve.',\r\n {\r\n ruleId: z.string().describe('ID of the rule'),\r\n helpful: z.boolean().describe('Was the rule helpful?'),\r\n rating: z.number().min(1).max(5).optional().describe('Rating 1-5'),\r\n modification: z.string().optional().describe('What modification was made'),\r\n context: z.string().optional().describe('In what context was this used'),\r\n },\r\n async ({ ruleId, helpful, rating, modification, context }) => {\r\n const projectRoot = getProjectRoot();\r\n\r\n try {\r\n const { loadEnhancedMemory } = await import('@vibecheck/core/forge');\r\n const memory = loadEnhancedMemory(projectRoot);\r\n\r\n memory.recordRuleApplication(ruleId, helpful, context);\r\n\r\n if (rating) {\r\n memory.recordRuleRating(ruleId, rating);\r\n }\r\n\r\n if (modification) {\r\n memory.recordRuleModification(ruleId, modification);\r\n }\r\n\r\n const effectiveness = memory.getRuleEffectiveness(ruleId);\r\n memory.save();\r\n memory.dispose();\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify({\r\n success: true,\r\n ruleId,\r\n newScore: effectiveness?.score ?? 0,\r\n totalApplications: effectiveness?.applicationCount ?? 0,\r\n message: 'Thank you! This feedback helps Forge learn and improve.',\r\n }, null, 2),\r\n },\r\n ],\r\n };\r\n } catch (error) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify({\r\n success: false,\r\n error: error instanceof Error ? error.message : String(error),\r\n }, null, 2),\r\n },\r\n ],\r\n isError: true,\r\n };\r\n }\r\n }\r\n );\r\n}\r\n","/**\r\n * VibeCheck Agent Runtime v1 - Core Types\r\n * \r\n * LangGraph Reality Mode + AutoFix + Ship Gate Enforcement\r\n */\r\n\r\nimport { z } from 'zod';\r\nimport type { ProofReceipt } from '../reality/types.js';\r\n\r\n// ============================================================================\r\n// Receipt Schema (Machine-Readable Evidence)\r\n// ============================================================================\r\n\r\nexport const ReceiptKindSchema = z.enum([\r\n 'test',\r\n 'runtime',\r\n 'network',\r\n 'ui',\r\n 'security',\r\n 'policy',\r\n 'chaos',\r\n]);\r\n\r\nexport type ReceiptKind = z.infer<typeof ReceiptKindSchema>;\r\n\r\nexport const ReceiptSignalSchema = z.object({\r\n /** Signal identifier */\r\n id: z.string(),\r\n /** Boolean or numeric value for policy evaluation */\r\n value: z.union([z.boolean(), z.number()]),\r\n /** Human-readable description */\r\n description: z.string().optional(),\r\n});\r\n\r\nexport type ReceiptSignal = z.infer<typeof ReceiptSignalSchema>;\r\n\r\nexport const ReceiptSchema = z.object({\r\n /** Unique receipt ID */\r\n receiptId: z.string(),\r\n /** Type of evidence */\r\n kind: ReceiptKindSchema,\r\n /** Summary of what was verified */\r\n summary: z.string(),\r\n /** Paths/hashes to actual evidence files */\r\n evidenceRefs: z.array(z.object({\r\n path: z.string(),\r\n hash: z.string().optional(),\r\n type: z.enum(['screenshot', 'trace', 'har', 'log', 'diff', 'video']),\r\n })),\r\n /** Machine-readable signals for policy engine */\r\n signals: z.array(ReceiptSignalSchema),\r\n /** Timestamp */\r\n timestamp: z.string(),\r\n /** Run ID this receipt belongs to */\r\n runId: z.string(),\r\n});\r\n\r\nexport type Receipt = z.infer<typeof ReceiptSchema>;\r\n\r\n// ============================================================================\r\n// Ship Gate Verdict\r\n// ============================================================================\r\n\r\nexport const ShipVerdictSchema = z.enum(['SHIP', 'WARN', 'BLOCK']);\r\nexport type ShipVerdict = z.infer<typeof ShipVerdictSchema>;\r\n\r\nexport const BlockingReasonSchema = z.object({\r\n /** Rule that caused the block */\r\n ruleId: z.string(),\r\n /** Human-readable message */\r\n message: z.string(),\r\n /** Receipt IDs that provide evidence */\r\n receiptIds: z.array(z.string()),\r\n /** Severity level */\r\n severity: z.enum(['critical', 'high', 'medium']),\r\n});\r\n\r\nexport type BlockingReason = z.infer<typeof BlockingReasonSchema>;\r\n\r\nexport const ShipGateResultSchema = z.object({\r\n /** Final verdict */\r\n verdict: ShipVerdictSchema,\r\n /** Reasons for blocking (if verdict is BLOCK) */\r\n blockingReasons: z.array(BlockingReasonSchema),\r\n /** Warnings (if verdict is WARN or SHIP) */\r\n warnings: z.array(z.object({\r\n ruleId: z.string(),\r\n message: z.string(),\r\n receiptIds: z.array(z.string()),\r\n })),\r\n /** Recommended actions */\r\n recommendedActions: z.array(z.object({\r\n action: z.string(),\r\n missionId: z.string().optional(),\r\n priority: z.enum(['high', 'medium', 'low']),\r\n })),\r\n /** Total receipts evaluated */\r\n receiptsEvaluated: z.number(),\r\n /** Timestamp */\r\n timestamp: z.string(),\r\n});\r\n\r\nexport type ShipGateResult = z.infer<typeof ShipGateResultSchema>;\r\n\r\n// ============================================================================\r\n// Proof Plan Schema\r\n// ============================================================================\r\n\r\nexport const ProofStepSchema = z.object({\r\n /** Step type */\r\n type: z.enum(['navigate', 'click', 'fill', 'wait', 'assert', 'screenshot', 'network']),\r\n /** Target selector or URL */\r\n target: z.string().optional(),\r\n /** Value for fill/assert */\r\n value: z.string().optional(),\r\n /** Timeout in ms */\r\n timeout: z.number().optional(),\r\n /** Description */\r\n description: z.string(),\r\n});\r\n\r\nexport type ProofStep = z.infer<typeof ProofStepSchema>;\r\n\r\nexport const ProofAssertionSchema = z.object({\r\n /** Assertion type */\r\n type: z.enum(['dom', 'network', 'console', 'status', 'auth', 'text', 'element']),\r\n /** What to check */\r\n target: z.string(),\r\n /** Expected value/condition */\r\n expected: z.string(),\r\n /** Comparison operator */\r\n operator: z.enum(['equals', 'contains', 'matches', 'exists', 'notExists', 'greaterThan', 'lessThan']).default('equals'),\r\n /** Description */\r\n description: z.string(),\r\n});\r\n\r\nexport type ProofAssertion = z.infer<typeof ProofAssertionSchema>;\r\n\r\nexport const ProofScenarioSchema = z.object({\r\n /** Scenario name */\r\n name: z.string(),\r\n /** Preconditions required */\r\n preconditions: z.object({\r\n authState: z.enum(['anonymous', 'authenticated', 'admin']).optional(),\r\n seededData: z.array(z.string()).optional(),\r\n envVars: z.array(z.string()).optional(),\r\n }),\r\n /** Steps to execute */\r\n steps: z.array(ProofStepSchema),\r\n /** Assertions to verify */\r\n assertions: z.array(ProofAssertionSchema),\r\n /** Required artifacts */\r\n artifactsRequired: z.array(z.enum(['trace', 'screenshot', 'har', 'video'])),\r\n});\r\n\r\nexport type ProofScenario = z.infer<typeof ProofScenarioSchema>;\r\n\r\nexport const ProofPlanSchema = z.object({\r\n /** Plan ID */\r\n planId: z.string(),\r\n /** Scenarios to execute */\r\n scenarios: z.array(ProofScenarioSchema).max(10), // Cap at 10 scenarios\r\n /** Generated from diff */\r\n sourceCommit: z.string().optional(),\r\n /** Routes impacted */\r\n routesImpacted: z.array(z.string()),\r\n /** Timestamp */\r\n createdAt: z.string(),\r\n});\r\n\r\nexport type ProofPlan = z.infer<typeof ProofPlanSchema>;\r\n\r\n// ============================================================================\r\n// Chaos Plan Schema\r\n// ============================================================================\r\n\r\nexport const ChaosTypeSchema = z.enum([\r\n 'network_latency',\r\n 'network_drop',\r\n 'network_error',\r\n 'data_partial_json',\r\n 'data_null_fields',\r\n 'auth_expired_token',\r\n 'auth_missing_refresh',\r\n 'browser_slow_cpu',\r\n 'browser_storage_disabled',\r\n]);\r\n\r\nexport type ChaosType = z.infer<typeof ChaosTypeSchema>;\r\n\r\nexport const ChaosTestSchema = z.object({\r\n /** Chaos type */\r\n type: ChaosTypeSchema,\r\n /** Test name */\r\n name: z.string(),\r\n /** Configuration */\r\n config: z.object({\r\n /** For network latency: p50/p95 bounds in ms */\r\n latencyMs: z.object({ p50: z.number(), p95: z.number() }).optional(),\r\n /** For network drop: percentage 0-10 */\r\n dropPercent: z.number().min(0).max(10).optional(),\r\n /** For network error: status code */\r\n errorStatus: z.number().optional(),\r\n /** Target endpoints (glob patterns) */\r\n targetEndpoints: z.array(z.string()).optional(),\r\n /** Fields to nullify */\r\n nullFields: z.array(z.string()).optional(),\r\n }),\r\n /** Maximum duration in seconds */\r\n maxDurationSec: z.number().max(60),\r\n /** Fail fast on first error */\r\n failFast: z.boolean().default(true),\r\n});\r\n\r\nexport type ChaosTest = z.infer<typeof ChaosTestSchema>;\r\n\r\nexport const ChaosPlanSchema = z.object({\r\n /** Plan ID */\r\n planId: z.string(),\r\n /** Tests to run */\r\n tests: z.array(ChaosTestSchema).max(5), // Cap at 5 chaos tests\r\n /** Global max duration */\r\n maxTotalDurationSec: z.number().max(180), // 3 minutes max\r\n /** Created timestamp */\r\n createdAt: z.string(),\r\n});\r\n\r\nexport type ChaosPlan = z.infer<typeof ChaosPlanSchema>;\r\n\r\n// ============================================================================\r\n// Mission Schema (AutoFix)\r\n// ============================================================================\r\n\r\nexport const MissionStatusSchema = z.enum([\r\n 'pending',\r\n 'in_progress',\r\n 'patch_proposed',\r\n 'verification_pending',\r\n 'completed',\r\n 'failed',\r\n 'cancelled',\r\n]);\r\n\r\nexport type MissionStatus = z.infer<typeof MissionStatusSchema>;\r\n\r\nexport const RiskTierSchema = z.enum(['LOW', 'MEDIUM', 'HIGH']);\r\nexport type RiskTier = z.infer<typeof RiskTierSchema>;\r\n\r\nexport const MissionSchema = z.object({\r\n /** Unique mission ID */\r\n missionId: z.string(),\r\n /** Human-readable title */\r\n title: z.string(),\r\n /** Root cause hypothesis */\r\n rootCauseHypothesis: z.string(),\r\n /** Files in scope for this mission */\r\n filesInScope: z.array(z.string()).max(10), // Cap files per mission\r\n /** Acceptance criteria */\r\n acceptanceCriteria: z.array(z.string()),\r\n /** Verification requirements */\r\n verificationPlan: z.object({\r\n runTypecheck: z.boolean(),\r\n runUnitTests: z.boolean(),\r\n runProofScenarios: z.array(z.string()), // Scenario IDs\r\n }),\r\n /** Computed risk tier */\r\n riskTier: RiskTierSchema,\r\n /** Current status */\r\n status: MissionStatusSchema,\r\n /** Source findings that created this mission */\r\n sourceFindingIds: z.array(z.string()),\r\n /** Attempt count */\r\n attempts: z.number().default(0),\r\n /** Max attempts allowed */\r\n maxAttempts: z.number().default(3),\r\n});\r\n\r\nexport type Mission = z.infer<typeof MissionSchema>;\r\n\r\n// ============================================================================\r\n// Patch Schema\r\n// ============================================================================\r\n\r\nexport const PatchProposalSchema = z.object({\r\n /** Unique patch ID */\r\n patchId: z.string(),\r\n /** Mission this patch addresses */\r\n missionId: z.string(),\r\n /** Unified diff */\r\n diff: z.string(),\r\n /** Files modified */\r\n filesModified: z.array(z.string()),\r\n /** Lines changed */\r\n linesChanged: z.number(),\r\n /** Explanation of changes */\r\n explanation: z.string(),\r\n /** Expected behavior changes */\r\n expectedBehaviorChanges: z.array(z.string()),\r\n /** Rollback plan */\r\n rollbackPlan: z.string(),\r\n /** How verification proves correctness */\r\n verificationRationale: z.string(),\r\n /** Risk score 0-100 */\r\n riskScore: z.number().min(0).max(100),\r\n /** Risk tier derived from score */\r\n riskTier: RiskTierSchema,\r\n /** Timestamp */\r\n createdAt: z.string(),\r\n});\r\n\r\nexport type PatchProposal = z.infer<typeof PatchProposalSchema>;\r\n\r\n// ============================================================================\r\n// Graph State Schemas\r\n// ============================================================================\r\n\r\n/**\r\n * Reality Mode Graph State\r\n */\r\nexport const RealityModeStateSchema = z.object({\r\n /** Repo snapshot info */\r\n repoSnapshot: z.object({\r\n commitHash: z.string(),\r\n truthpackVersion: z.string(),\r\n }),\r\n /** Scope of verification */\r\n scope: z.object({\r\n routes: z.array(z.string()),\r\n features: z.array(z.string()),\r\n }),\r\n /** Generated proof plan */\r\n proofPlan: ProofPlanSchema.nullable(),\r\n /** Optional chaos plan */\r\n chaosPlan: ChaosPlanSchema.nullable(),\r\n /** Collected artifacts */\r\n artifacts: z.array(z.object({\r\n type: z.enum(['trace', 'screenshot', 'har', 'video', 'log']),\r\n path: z.string(),\r\n hash: z.string(),\r\n })),\r\n /** Runtime findings */\r\n findings: z.array(z.object({\r\n id: z.string(),\r\n severity: z.enum(['critical', 'high', 'medium', 'low', 'info']),\r\n message: z.string(),\r\n route: z.string().optional(),\r\n evidence: z.record(z.unknown()).optional(),\r\n })),\r\n /** Generated receipts */\r\n receipts: z.array(ReceiptSchema),\r\n /** Inputs for policy evaluation */\r\n verdictInputs: z.record(z.union([z.boolean(), z.number()])),\r\n /** Current node in graph */\r\n currentNode: z.string(),\r\n /** Error state */\r\n error: z.string().nullable(),\r\n});\r\n\r\nexport type RealityModeState = z.infer<typeof RealityModeStateSchema>;\r\n\r\n/**\r\n * AutoFix Graph State\r\n */\r\nexport const AutoFixStateSchema = z.object({\r\n /** Input findings */\r\n findings: z.array(z.object({\r\n id: z.string(),\r\n type: z.string(),\r\n severity: z.enum(['critical', 'high', 'medium', 'low']),\r\n message: z.string(),\r\n filePath: z.string().optional(),\r\n line: z.number().optional(),\r\n })),\r\n /** Grouped missions */\r\n missions: z.array(MissionSchema),\r\n /** Currently active mission */\r\n currentMission: z.string().nullable(),\r\n /** Patch candidates */\r\n patchCandidates: z.array(PatchProposalSchema),\r\n /** Verification plan for current patch */\r\n verificationPlan: z.object({\r\n tests: z.array(z.string()),\r\n proofScenarios: z.array(z.string()),\r\n }).nullable(),\r\n /** Verification results */\r\n verificationResults: z.object({\r\n receipts: z.array(ReceiptSchema),\r\n passed: z.boolean(),\r\n failureReason: z.string().optional(),\r\n }).nullable(),\r\n /** Current risk score */\r\n riskScore: z.number(),\r\n /** Checkpoint ID for rollback */\r\n checkpointId: z.string().nullable(),\r\n /** Current node */\r\n currentNode: z.string(),\r\n /** Error state */\r\n error: z.string().nullable(),\r\n /** Requires human approval */\r\n awaitingApproval: z.boolean(),\r\n});\r\n\r\nexport type AutoFixState = z.infer<typeof AutoFixStateSchema>;\r\n\r\n/**\r\n * Ship Gate Graph State\r\n */\r\nexport const ShipGateStateSchema = z.object({\r\n /** Truthpack snapshot */\r\n truthpackSnapshot: z.object({\r\n version: z.string(),\r\n hash: z.string(),\r\n }),\r\n /** Diff summary */\r\n diffSummary: z.object({\r\n filesChanged: z.number(),\r\n linesAdded: z.number(),\r\n linesRemoved: z.number(),\r\n affectedRoutes: z.array(z.string()),\r\n }),\r\n /** Static scan findings */\r\n staticFindings: z.array(z.object({\r\n id: z.string(),\r\n severity: z.string(),\r\n message: z.string(),\r\n })),\r\n /** Reality mode receipts */\r\n runtimeReceipts: z.array(ReceiptSchema),\r\n /** Test receipts */\r\n testReceipts: z.array(ReceiptSchema),\r\n /** Collected policy signals */\r\n policySignals: z.record(z.union([z.boolean(), z.number()])),\r\n /** Final result */\r\n result: ShipGateResultSchema.nullable(),\r\n /** Current node */\r\n currentNode: z.string(),\r\n /** Error state */\r\n error: z.string().nullable(),\r\n});\r\n\r\nexport type ShipGateState = z.infer<typeof ShipGateStateSchema>;\r\n\r\n// ============================================================================\r\n// Tool Call Result Types\r\n// ============================================================================\r\n\r\nexport interface ToolCallResult<T = unknown> {\r\n success: boolean;\r\n data?: T;\r\n error?: string;\r\n /** Tool-specific metadata */\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nexport interface WriteToolResult extends ToolCallResult {\r\n /** Whether the write requires approval */\r\n requiresApproval: boolean;\r\n /** Risk assessment */\r\n riskAssessment?: {\r\n tier: RiskTier;\r\n reasons: string[];\r\n };\r\n /** Checkpoint created before write */\r\n checkpointId?: string;\r\n}\r\n\r\n// ============================================================================\r\n// Configuration Types\r\n// ============================================================================\r\n\r\nexport interface AgentRuntimeConfig {\r\n /** Project root path */\r\n projectRoot: string;\r\n /** Truthpack path relative to project root */\r\n truthpackPath: string;\r\n /** Evidence storage path */\r\n evidencePath: string;\r\n /** Policy configuration */\r\n policy: PolicyConfig;\r\n /** Budget limits */\r\n budgets: BudgetConfig;\r\n /** Feature flags */\r\n features: FeatureFlags;\r\n}\r\n\r\nexport interface PolicyConfig {\r\n /** Strictness level */\r\n strictness: 'relaxed' | 'standard' | 'paranoid';\r\n /** Allow lockfile edits */\r\n allowLockfileEdits: boolean;\r\n /** Max lines per patch */\r\n maxPatchLines: number;\r\n /** Max runtime minutes per run type */\r\n maxRuntimeMinutes: Record<string, number>;\r\n /** Enable chaos testing */\r\n chaosEnabled: boolean;\r\n /** Required receipts per repo type */\r\n requiredReceipts: string[];\r\n /** Custom BLOCK rules */\r\n customBlockRules: string[];\r\n}\r\n\r\nexport interface BudgetConfig {\r\n /** Token budget per run type */\r\n tokenBudgets: Record<string, number>;\r\n /** BYO key mode */\r\n byoKeyEnabled: boolean;\r\n /** Offline mode (local models) */\r\n offlineMode: boolean;\r\n}\r\n\r\nexport interface FeatureFlags {\r\n /** Enable AI-assisted proof planning */\r\n aiProofPlanning: boolean;\r\n /** Enable AI-assisted patch generation */\r\n aiPatchGeneration: boolean;\r\n /** Enable chaos testing */\r\n chaosEnabled: boolean;\r\n /** Enable auto-approval for low-risk patches */\r\n autoApprovalLowRisk: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Safety Limits (Non-Configurable)\r\n// ============================================================================\r\n\r\nexport const SAFETY_LIMITS = {\r\n /** Max scenarios per proof plan */\r\n MAX_SCENARIOS: 10,\r\n /** Max assertions per scenario */\r\n MAX_ASSERTIONS_PER_SCENARIO: 15,\r\n /** Max chaos tests per plan */\r\n MAX_CHAOS_TESTS: 5,\r\n /** Max runtime per local run (minutes) */\r\n MAX_RUNTIME_LOCAL_MINUTES: 10,\r\n /** Max runtime per CI run (minutes) */\r\n MAX_RUNTIME_CI_MINUTES: 15,\r\n /** Max mission attempts */\r\n MAX_MISSION_ATTEMPTS: 3,\r\n /** Max patch size (lines) */\r\n MAX_PATCH_LINES: 500,\r\n /** Max files per mission */\r\n MAX_FILES_PER_MISSION: 10,\r\n /** Flake retry count */\r\n FLAKE_RETRY_COUNT: 1,\r\n} as const;\r\n\r\n// ============================================================================\r\n// Exports\r\n// ============================================================================\r\n\r\nexport {\r\n type ProofReceipt,\r\n};\r\n","/**\r\n * Agent Runtime MCP Tools\r\n * \r\n * BYO-Agent mode: External agents can use these tools to leverage VibeCheck\r\n * as the truth layer. They can plan however they want, but VibeCheck returns\r\n * receipts and deterministic verdicts.\r\n * \r\n * TODO: These tools require the full LangGraph integration in @vibecheck/core\r\n * which is not yet implemented. The types are defined but the runtime functions\r\n * need to be built.\r\n */\r\n\r\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport {\r\n type Receipt,\r\n type ShipGateResult,\r\n SAFETY_LIMITS,\r\n} from '@vibecheck/core/agent-runtime';\r\n\r\n/**\r\n * Register agent runtime tools with the MCP server.\r\n * \r\n * Currently a no-op while the full runtime is being implemented.\r\n * The following tools will be available once complete:\r\n * - vibecheck_reality_plan - Generate proof plans\r\n * - vibecheck_reality_run - Execute runtime verification\r\n * - vibecheck_chaos_run - Execute chaos testing\r\n * - vibecheck_receipts_list - List evidence receipts\r\n * - vibecheck_receipts_get - Get receipt details\r\n * - vibecheck_ship_evaluate - Evaluate ship readiness\r\n * - vibecheck_fix_run - Run AutoFix\r\n * - vibecheck_scan_run - Run static analysis\r\n * - vibecheck_diff_summary - Get diff summary\r\n */\r\nexport function registerAgentRuntimeTools(_server: McpServer): void {\r\n // Agent runtime tools are currently disabled pending full implementation.\r\n // The LangGraph integration and evidence store need to be completed first.\r\n // \r\n // See packages/core/src/agent-runtime/types.ts for the full API spec.\r\n //\r\n // For now, use the existing tools:\r\n // - vibecheck_truthpack_* for truth layer\r\n // - vibecheck_firewall_* for code firewall\r\n // - vibecheck_validate_* for validation\r\n // - vibecheck_context_* for context gathering\r\n \r\n // Log that agent runtime tools are not yet available\r\n console.error('[VibeCheck MCP] Agent runtime tools not yet available - using core tools only');\r\n}\r\n\r\n// Re-export types for external use\r\nexport type { Receipt, ShipGateResult };\r\nexport { SAFETY_LIMITS };\r\n","/**\r\n * Intent Middleware\r\n * \r\n * Intercepts tool calls to validate intent before execution.\r\n */\r\n\r\nexport interface IntentContext {\r\n tool: string;\r\n parameters: Record<string, unknown>;\r\n timestamp: Date;\r\n}\r\n\r\nexport interface IntentValidationResult {\r\n valid: boolean;\r\n intent: {\r\n type: string;\r\n scope: string;\r\n risk: 'low' | 'medium' | 'high';\r\n };\r\n warnings: string[];\r\n modifications?: Record<string, unknown>;\r\n}\r\n\r\nexport class IntentMiddleware {\r\n private history: IntentContext[] = [];\r\n\r\n /**\r\n * Validate intent before tool execution\r\n */\r\n validate(tool: string, parameters: Record<string, unknown>): IntentValidationResult {\r\n const context: IntentContext = {\r\n tool,\r\n parameters,\r\n timestamp: new Date(),\r\n };\r\n \r\n this.history.push(context);\r\n\r\n // Analyze intent\r\n const intent = this.analyzeIntent(tool, parameters);\r\n\r\n // Check for suspicious patterns\r\n const warnings = this.checkPatterns(context);\r\n\r\n // Determine if modifications are needed\r\n const modifications = this.suggestModifications(context);\r\n\r\n return {\r\n valid: warnings.filter(w => w.startsWith('BLOCK:')).length === 0,\r\n intent,\r\n warnings,\r\n modifications: Object.keys(modifications).length > 0 ? modifications : undefined,\r\n };\r\n }\r\n\r\n /**\r\n * Get intent history for analysis\r\n */\r\n getHistory(): IntentContext[] {\r\n return [...this.history];\r\n }\r\n\r\n private analyzeIntent(\r\n tool: string,\r\n parameters: Record<string, unknown>\r\n ): { type: string; scope: string; risk: 'low' | 'medium' | 'high' } {\r\n // Determine intent type\r\n let type = 'unknown';\r\n if (tool.startsWith('truthpack_')) {\r\n type = 'truthpack_operation';\r\n } else if (tool.startsWith('firewall_')) {\r\n type = 'firewall_operation';\r\n } else if (tool.startsWith('validation_')) {\r\n type = 'validation_operation';\r\n } else if (tool.startsWith('context_')) {\r\n type = 'context_operation';\r\n } else if (tool.startsWith('register_')) {\r\n type = 'registration_operation';\r\n }\r\n\r\n // Determine scope\r\n let scope = 'local';\r\n if (parameters.filePath || parameters.targetFile) {\r\n scope = 'file';\r\n } else if (parameters.category === 'all') {\r\n scope = 'project';\r\n }\r\n\r\n // Assess risk\r\n let risk: 'low' | 'medium' | 'high' = 'low';\r\n if (tool.includes('delete') || tool.includes('modify')) {\r\n risk = 'medium';\r\n }\r\n if (scope === 'project' && (tool.includes('delete') || tool.includes('modify'))) {\r\n risk = 'high';\r\n }\r\n\r\n return { type, scope, risk };\r\n }\r\n\r\n private checkPatterns(context: IntentContext): string[] {\r\n const warnings: string[] = [];\r\n\r\n // Check for rapid repeated calls\r\n const recentSimilar = this.history\r\n .slice(-10)\r\n .filter(h => h.tool === context.tool);\r\n \r\n if (recentSimilar.length > 5) {\r\n warnings.push('High frequency of similar operations detected');\r\n }\r\n\r\n // Check for suspicious parameter values\r\n const paramStr = JSON.stringify(context.parameters);\r\n if (paramStr.length > 10000) {\r\n warnings.push('Unusually large parameters');\r\n }\r\n\r\n // Check for dangerous patterns in content parameters\r\n if (context.parameters.content && typeof context.parameters.content === 'string') {\r\n const content = context.parameters.content as string;\r\n if (content.includes('eval(') || content.includes('Function(')) {\r\n warnings.push('BLOCK: Content contains dangerous code patterns');\r\n }\r\n }\r\n\r\n return warnings;\r\n }\r\n\r\n private suggestModifications(context: IntentContext): Record<string, unknown> {\r\n const modifications: Record<string, unknown> = {};\r\n\r\n // Add default parameters if missing\r\n if (context.tool === 'firewall_evaluate' && !context.parameters.strict) {\r\n modifications.strict = true;\r\n }\r\n\r\n return modifications;\r\n }\r\n}\r\n","/**\r\n * Tracing Middleware\r\n * \r\n * Traces all operations for debugging and audit purposes.\r\n */\r\n\r\nexport interface TraceEntry {\r\n id: string;\r\n timestamp: Date;\r\n tool: string;\r\n parameters: Record<string, unknown>;\r\n result: 'success' | 'error' | 'blocked';\r\n duration: number;\r\n error?: string;\r\n metadata: Record<string, unknown>;\r\n}\r\n\r\nexport interface TraceSpan {\r\n id: string;\r\n parentId?: string;\r\n name: string;\r\n startTime: Date;\r\n endTime?: Date;\r\n status: 'running' | 'completed' | 'error';\r\n entries: TraceEntry[];\r\n}\r\n\r\nexport class TracingMiddleware {\r\n private traces: TraceEntry[] = [];\r\n private spans: Map<string, TraceSpan> = new Map();\r\n private currentSpanId?: string;\r\n\r\n /**\r\n * Start a new trace span\r\n */\r\n startSpan(name: string, parentId?: string): string {\r\n const id = this.generateId();\r\n const span: TraceSpan = {\r\n id,\r\n parentId,\r\n name,\r\n startTime: new Date(),\r\n status: 'running',\r\n entries: [],\r\n };\r\n this.spans.set(id, span);\r\n this.currentSpanId = id;\r\n return id;\r\n }\r\n\r\n /**\r\n * End a trace span\r\n */\r\n endSpan(spanId: string, status: 'completed' | 'error' = 'completed'): void {\r\n const span = this.spans.get(spanId);\r\n if (span) {\r\n span.endTime = new Date();\r\n span.status = status;\r\n }\r\n }\r\n\r\n /**\r\n * Trace a tool call\r\n */\r\n async trace<T>(\r\n tool: string,\r\n parameters: Record<string, unknown>,\r\n fn: () => Promise<T>\r\n ): Promise<T> {\r\n const entry: TraceEntry = {\r\n id: this.generateId(),\r\n timestamp: new Date(),\r\n tool,\r\n parameters: this.sanitizeParameters(parameters),\r\n result: 'success',\r\n duration: 0,\r\n metadata: {},\r\n };\r\n\r\n const startTime = Date.now();\r\n\r\n try {\r\n const result = await fn();\r\n entry.duration = Date.now() - startTime;\r\n entry.result = 'success';\r\n this.addEntry(entry);\r\n return result;\r\n } catch (error) {\r\n entry.duration = Date.now() - startTime;\r\n entry.result = 'error';\r\n entry.error = error instanceof Error ? error.message : 'Unknown error';\r\n this.addEntry(entry);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Record a blocked operation\r\n */\r\n recordBlocked(tool: string, parameters: Record<string, unknown>, reason: string): void {\r\n const entry: TraceEntry = {\r\n id: this.generateId(),\r\n timestamp: new Date(),\r\n tool,\r\n parameters: this.sanitizeParameters(parameters),\r\n result: 'blocked',\r\n duration: 0,\r\n metadata: { blockReason: reason },\r\n };\r\n this.addEntry(entry);\r\n }\r\n\r\n /**\r\n * Get all traces\r\n */\r\n getTraces(): TraceEntry[] {\r\n return [...this.traces];\r\n }\r\n\r\n /**\r\n * Get traces for a specific time range\r\n */\r\n getTracesByTimeRange(start: Date, end: Date): TraceEntry[] {\r\n return this.traces.filter(\r\n t => t.timestamp >= start && t.timestamp <= end\r\n );\r\n }\r\n\r\n /**\r\n * Get traces by tool\r\n */\r\n getTracesByTool(tool: string): TraceEntry[] {\r\n return this.traces.filter(t => t.tool === tool);\r\n }\r\n\r\n /**\r\n * Get span with all entries\r\n */\r\n getSpan(spanId: string): TraceSpan | undefined {\r\n return this.spans.get(spanId);\r\n }\r\n\r\n /**\r\n * Export traces for debugging\r\n */\r\n exportTraces(): string {\r\n return JSON.stringify({\r\n traces: this.traces,\r\n spans: Array.from(this.spans.values()),\r\n }, null, 2);\r\n }\r\n\r\n /**\r\n * Clear all traces\r\n */\r\n clear(): void {\r\n this.traces = [];\r\n this.spans.clear();\r\n this.currentSpanId = undefined;\r\n }\r\n\r\n private addEntry(entry: TraceEntry): void {\r\n this.traces.push(entry);\r\n\r\n // Add to current span if active\r\n if (this.currentSpanId) {\r\n const span = this.spans.get(this.currentSpanId);\r\n if (span) {\r\n span.entries.push(entry);\r\n }\r\n }\r\n\r\n // Keep trace history bounded\r\n if (this.traces.length > 10000) {\r\n this.traces = this.traces.slice(-5000);\r\n }\r\n }\r\n\r\n private sanitizeParameters(params: Record<string, unknown>): Record<string, unknown> {\r\n const sanitized: Record<string, unknown> = {};\r\n \r\n for (const [key, value] of Object.entries(params)) {\r\n // Truncate large string values\r\n if (typeof value === 'string' && value.length > 1000) {\r\n sanitized[key] = value.slice(0, 1000) + '...[truncated]';\r\n } else if (key.toLowerCase().includes('password') || \r\n key.toLowerCase().includes('secret') ||\r\n key.toLowerCase().includes('token')) {\r\n sanitized[key] = '[REDACTED]';\r\n } else {\r\n sanitized[key] = value;\r\n }\r\n }\r\n\r\n return sanitized;\r\n }\r\n\r\n private generateId(): string {\r\n return `trace-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\r\n }\r\n}\r\n","/**\r\n * Pre-Generation Hook\r\n * \r\n * Runs before code generation to prepare context and validate intent.\r\n */\r\n\r\nimport { loadConfig } from '@repo/shared-config';\r\n\r\nexport interface PreGenerationContext {\r\n task: string;\r\n targetFile?: string;\r\n existingCode?: string;\r\n}\r\n\r\nexport interface PreGenerationResult {\r\n proceed: boolean;\r\n enhancedContext: Record<string, unknown>;\r\n warnings: string[];\r\n injectedPrompt?: string;\r\n}\r\n\r\nexport class PreGenerationHook {\r\n /**\r\n * Execute pre-generation checks and enhancements\r\n */\r\n async execute(context: PreGenerationContext): Promise<PreGenerationResult> {\r\n const warnings: string[] = [];\r\n const enhancedContext: Record<string, unknown> = {};\r\n\r\n // Load relevant truthpack data\r\n const truthpack = await this.loadRelevantTruthpack(context);\r\n enhancedContext.truthpack = truthpack;\r\n\r\n // Analyze task for potential issues\r\n const taskAnalysis = this.analyzeTask(context.task);\r\n if (taskAnalysis.concerns.length > 0) {\r\n warnings.push(...taskAnalysis.concerns);\r\n }\r\n\r\n // Load conventions\r\n const conventions = await this.loadConventions(context);\r\n enhancedContext.conventions = conventions;\r\n\r\n // Generate enhanced prompt\r\n const injectedPrompt = this.generateInjectedPrompt(context, truthpack, conventions);\r\n\r\n return {\r\n proceed: warnings.filter(w => w.startsWith('BLOCK:')).length === 0,\r\n enhancedContext,\r\n warnings,\r\n injectedPrompt,\r\n };\r\n }\r\n\r\n private async loadRelevantTruthpack(context: PreGenerationContext): Promise<Record<string, unknown>> {\r\n const truthpack: Record<string, unknown> = {};\r\n const config = loadConfig();\r\n const projectRoot = config.VIBECHECK_PROJECT_ROOT || process.cwd();\r\n const truthpackPath = `${projectRoot}/.vibecheck/truthpack`;\r\n const { readFile } = await import('fs/promises');\r\n\r\n // Determine what to load based on task keywords\r\n const task = context.task.toLowerCase();\r\n const needsRoutes = task.includes('api') || task.includes('route') || task.includes('endpoint') || task.includes('fetch');\r\n const needsEnv = task.includes('env') || task.includes('config') || task.includes('secret') || task.includes('variable');\r\n const needsAuth = task.includes('auth') || task.includes('login') || task.includes('permission') || task.includes('role');\r\n const needsContracts = task.includes('type') || task.includes('schema') || task.includes('interface') || task.includes('contract');\r\n\r\n try {\r\n // Always load routes summary (most common hallucination)\r\n if (needsRoutes || !needsEnv && !needsAuth && !needsContracts) {\r\n const routesData = await readFile(`${truthpackPath}/routes.json`, 'utf-8').catch(() => '{}');\r\n const routes = JSON.parse(routesData);\r\n if (routes.routes?.length > 0) {\r\n truthpack.routes = routes.routes.slice(0, 20).map((r: { method: string; path: string }) => `${r.method} ${r.path}`);\r\n truthpack.routeCount = routes.routes.length;\r\n }\r\n }\r\n\r\n // Load env vars if relevant\r\n if (needsEnv) {\r\n const envData = await readFile(`${truthpackPath}/env.json`, 'utf-8').catch(() => '{}');\r\n const env = JSON.parse(envData);\r\n if (env.variables?.length > 0) {\r\n truthpack.envVars = env.variables.slice(0, 15).map((v: { name: string; required: boolean }) => \r\n `${v.name}${v.required ? ' (required)' : ''}`\r\n );\r\n }\r\n }\r\n\r\n // Load auth if relevant\r\n if (needsAuth) {\r\n const authData = await readFile(`${truthpackPath}/auth.json`, 'utf-8').catch(() => '{}');\r\n const auth = JSON.parse(authData);\r\n if (auth.roles?.length > 0) {\r\n truthpack.roles = auth.roles.map((r: { name: string }) => r.name);\r\n }\r\n if (auth.protectedResources?.length > 0) {\r\n truthpack.protectedPaths = auth.protectedResources.slice(0, 10).map((r: { path: string }) => r.path);\r\n }\r\n }\r\n\r\n // Load contracts if relevant\r\n if (needsContracts) {\r\n const contractsData = await readFile(`${truthpackPath}/contracts.json`, 'utf-8').catch(() => '{}');\r\n const contracts = JSON.parse(contractsData);\r\n if (contracts.contracts?.length > 0) {\r\n truthpack.contracts = contracts.contracts.slice(0, 10).map((c: { path: string; method?: string }) => \r\n `${c.method || 'ANY'} ${c.path}`\r\n );\r\n }\r\n }\r\n } catch {\r\n // Truthpack may not exist\r\n }\r\n\r\n return truthpack;\r\n }\r\n\r\n private analyzeTask(task: string): { concerns: string[] } {\r\n const concerns: string[] = [];\r\n\r\n // Check for vague tasks\r\n if (task.length < 20) {\r\n concerns.push('Task description is very short - consider providing more detail');\r\n }\r\n\r\n // Check for potentially dangerous operations\r\n if (task.toLowerCase().includes('delete all') || task.toLowerCase().includes('drop')) {\r\n concerns.push('BLOCK: Task contains potentially dangerous operations');\r\n }\r\n\r\n // Check for ambiguous references\r\n if (task.includes('the function') || task.includes('that file')) {\r\n concerns.push('Task contains ambiguous references - specify exact names');\r\n }\r\n\r\n return { concerns };\r\n }\r\n\r\n private async loadConventions(context: PreGenerationContext): Promise<string[]> {\r\n const conventions: string[] = [];\r\n const config = loadConfig();\r\n const projectRoot = config.VIBECHECK_PROJECT_ROOT || process.cwd();\r\n const { readFile } = await import('fs/promises');\r\n\r\n try {\r\n const conventionsData = await readFile(`${projectRoot}/.vibecheck/knowledge/conventions.json`, 'utf-8');\r\n const data = JSON.parse(conventionsData);\r\n \r\n if (data.conventions?.length > 0) {\r\n for (const conv of data.conventions.slice(0, 10)) {\r\n conventions.push(`- [${conv.category}] ${conv.rule}`);\r\n }\r\n }\r\n } catch {\r\n // Conventions file may not exist - provide defaults\r\n conventions.push('- [naming] Use camelCase for variables and functions');\r\n conventions.push('- [naming] Use PascalCase for types and interfaces');\r\n conventions.push('- [imports] Use named exports, avoid default exports');\r\n conventions.push('- [types] Avoid `any` type, use `unknown` if unsure');\r\n }\r\n\r\n return conventions;\r\n }\r\n\r\n private generateInjectedPrompt(\r\n context: PreGenerationContext,\r\n truthpack: Record<string, unknown>,\r\n conventions: string[]\r\n ): string {\r\n const sections: string[] = [];\r\n\r\n sections.push(`## VibeCheck Context Injection\r\n\r\nThe following information is verified ground truth. Use ONLY these facts.\r\nDo NOT invent APIs, types, or endpoints not listed here.`);\r\n\r\n if (Object.keys(truthpack).length > 0) {\r\n sections.push(`### Verified Truthpack\r\n${JSON.stringify(truthpack, null, 2)}`);\r\n }\r\n\r\n if (conventions.length > 0) {\r\n sections.push(`### Project Conventions\r\n${conventions.join('\\n')}`);\r\n }\r\n\r\n sections.push(`### Verification Requirements\r\nBefore generating code:\r\n1. Verify all imports exist in package.json or as local files\r\n2. Verify all API endpoints exist in the truthpack\r\n3. Verify all types match truthpack schemas\r\n4. Follow all listed conventions`);\r\n\r\n return sections.join('\\n\\n');\r\n }\r\n}\r\n","/**\r\n * Post-Generation Hook\r\n * \r\n * Runs after code generation to validate output and detect hallucinations.\r\n */\r\n\r\nexport interface PostGenerationContext {\r\n generatedCode: string;\r\n targetFile: string;\r\n originalTask: string;\r\n}\r\n\r\nexport interface PostGenerationResult {\r\n approved: boolean;\r\n code: string;\r\n issues: ValidationIssue[];\r\n hallucinationScore: number;\r\n suggestions: string[];\r\n}\r\n\r\nexport interface ValidationIssue {\r\n type: 'error' | 'warning' | 'info';\r\n category: 'hallucination' | 'convention' | 'security' | 'style';\r\n message: string;\r\n line?: number;\r\n suggestion?: string;\r\n}\r\n\r\nexport class PostGenerationHook {\r\n /**\r\n * Execute post-generation validation\r\n */\r\n async execute(context: PostGenerationContext): Promise<PostGenerationResult> {\r\n const issues: ValidationIssue[] = [];\r\n const suggestions: string[] = [];\r\n\r\n // Check for hallucinations\r\n const hallucinationCheck = await this.checkHallucinations(context.generatedCode);\r\n issues.push(...hallucinationCheck.issues);\r\n\r\n // Validate imports\r\n const importCheck = await this.validateImports(context.generatedCode);\r\n issues.push(...importCheck.issues);\r\n\r\n // Check conventions\r\n const conventionCheck = await this.checkConventions(context.generatedCode);\r\n issues.push(...conventionCheck.issues);\r\n\r\n // Security scan\r\n const securityCheck = await this.securityScan(context.generatedCode);\r\n issues.push(...securityCheck.issues);\r\n\r\n // Calculate hallucination score\r\n const hallucinationScore = this.calculateHallucinationScore(issues);\r\n\r\n // Generate suggestions\r\n for (const issue of issues) {\r\n if (issue.suggestion) {\r\n suggestions.push(issue.suggestion);\r\n }\r\n }\r\n\r\n const errors = issues.filter(i => i.type === 'error');\r\n const approved = errors.length === 0 && hallucinationScore < 0.3;\r\n\r\n return {\r\n approved,\r\n code: context.generatedCode,\r\n issues,\r\n hallucinationScore,\r\n suggestions,\r\n };\r\n }\r\n\r\n private async checkHallucinations(code: string): Promise<{ issues: ValidationIssue[] }> {\r\n const issues: ValidationIssue[] = [];\r\n\r\n // Check for suspicious import patterns\r\n const suspiciousImports = code.match(/import .* from ['\"]@[^\\/]+\\/[^\\/]+\\/[^\\/]+\\/[^'\"]+['\"]/g);\r\n if (suspiciousImports) {\r\n for (const imp of suspiciousImports) {\r\n issues.push({\r\n type: 'warning',\r\n category: 'hallucination',\r\n message: `Suspicious deep import: ${imp}`,\r\n suggestion: 'Verify this package path exists',\r\n });\r\n }\r\n }\r\n\r\n // Check for invented-looking API calls\r\n const apiCalls = code.match(/fetch\\(['\"]\\/api\\/[^'\"]+['\"]\\)/g);\r\n if (apiCalls) {\r\n for (const call of apiCalls) {\r\n issues.push({\r\n type: 'warning',\r\n category: 'hallucination',\r\n message: `Unverified API call: ${call}`,\r\n suggestion: 'Check truthpack/routes.json for valid endpoints',\r\n });\r\n }\r\n }\r\n\r\n return { issues };\r\n }\r\n\r\n private async validateImports(code: string): Promise<{ issues: ValidationIssue[] }> {\r\n const issues: ValidationIssue[] = [];\r\n const { loadConfig } = await import('@repo/shared-config');\r\n const config = loadConfig();\r\n const projectRoot = config.VIBECHECK_PROJECT_ROOT || process.cwd();\r\n const { readFile } = await import('fs/promises');\r\n\r\n // Load package.json to check dependencies\r\n let deps: Record<string, string> = {};\r\n try {\r\n const pkgContent = await readFile(`${projectRoot}/package.json`, 'utf-8');\r\n const pkg = JSON.parse(pkgContent);\r\n deps = {\r\n ...(pkg.dependencies || {}),\r\n ...(pkg.devDependencies || {}),\r\n };\r\n } catch {\r\n // Package.json may not exist\r\n }\r\n\r\n // Node.js builtins\r\n const nodeBuiltins = new Set([\r\n 'fs', 'path', 'os', 'crypto', 'http', 'https', 'url', 'util',\r\n 'stream', 'events', 'buffer', 'child_process', 'cluster', 'net',\r\n 'dns', 'tls', 'zlib', 'readline', 'assert', 'fs/promises',\r\n ]);\r\n\r\n // Find imports\r\n const importPattern = /import\\s+(?:{[^}]*}|\\*\\s+as\\s+\\w+|\\w+)\\s+from\\s+['\"]([^'\"]+)['\"]/g;\r\n \r\n let match;\r\n while ((match = importPattern.exec(code)) !== null) {\r\n const importPath = match[1];\r\n \r\n // Skip relative imports\r\n if (importPath.startsWith('.') || importPath.startsWith('/')) {\r\n continue;\r\n }\r\n\r\n // Skip node: protocol\r\n if (importPath.startsWith('node:')) {\r\n continue;\r\n }\r\n\r\n // Get package name\r\n const packageName = importPath.startsWith('@')\r\n ? importPath.split('/').slice(0, 2).join('/')\r\n : importPath.split('/')[0];\r\n\r\n // Check if it's a builtin or installed package\r\n const isBuiltin = nodeBuiltins.has(packageName);\r\n const isInstalled = packageName in deps;\r\n\r\n if (!isBuiltin && !isInstalled) {\r\n // Find line number\r\n const beforeMatch = code.slice(0, match.index);\r\n const lineNumber = beforeMatch.split('\\n').length;\r\n\r\n issues.push({\r\n type: 'error',\r\n category: 'hallucination',\r\n message: `Import \"${packageName}\" not found in package.json`,\r\n line: lineNumber,\r\n suggestion: `Run: pnpm add ${packageName}`,\r\n });\r\n }\r\n }\r\n\r\n return { issues };\r\n }\r\n\r\n private async checkConventions(code: string): Promise<{ issues: ValidationIssue[] }> {\r\n const issues: ValidationIssue[] = [];\r\n\r\n // Check for default exports\r\n if (code.includes('export default')) {\r\n issues.push({\r\n type: 'warning',\r\n category: 'convention',\r\n message: 'Uses default export instead of named export',\r\n suggestion: 'Use named exports for better traceability',\r\n });\r\n }\r\n\r\n // Check for any type\r\n if (/:\\s*any\\b/.test(code)) {\r\n issues.push({\r\n type: 'warning',\r\n category: 'convention',\r\n message: 'Uses any type',\r\n suggestion: 'Use specific types or unknown instead of any',\r\n });\r\n }\r\n\r\n // Check for console.log\r\n if (code.includes('console.log')) {\r\n issues.push({\r\n type: 'info',\r\n category: 'convention',\r\n message: 'Contains console.log statement',\r\n suggestion: 'Remove or replace with proper logging',\r\n });\r\n }\r\n\r\n return { issues };\r\n }\r\n\r\n private async securityScan(code: string): Promise<{ issues: ValidationIssue[] }> {\r\n const issues: ValidationIssue[] = [];\r\n\r\n // Check for eval\r\n if (code.includes('eval(')) {\r\n issues.push({\r\n type: 'error',\r\n category: 'security',\r\n message: 'Uses eval() which can execute arbitrary code',\r\n suggestion: 'Remove eval and use safer alternatives',\r\n });\r\n }\r\n\r\n // Check for innerHTML\r\n if (code.includes('.innerHTML')) {\r\n issues.push({\r\n type: 'warning',\r\n category: 'security',\r\n message: 'Uses innerHTML which can lead to XSS',\r\n suggestion: 'Use textContent or sanitize input',\r\n });\r\n }\r\n\r\n // Check for hardcoded credentials\r\n if (/(?:password|secret|key)\\s*[:=]\\s*['\"][^'\"]+['\"]/i.test(code)) {\r\n issues.push({\r\n type: 'error',\r\n category: 'security',\r\n message: 'Potential hardcoded credentials detected',\r\n suggestion: 'Use environment variables for sensitive values',\r\n });\r\n }\r\n\r\n return { issues };\r\n }\r\n\r\n private calculateHallucinationScore(issues: ValidationIssue[]): number {\r\n const hallucinationIssues = issues.filter(i => i.category === 'hallucination');\r\n const errors = hallucinationIssues.filter(i => i.type === 'error').length;\r\n const warnings = hallucinationIssues.filter(i => i.type === 'warning').length;\r\n \r\n return Math.min(1, (errors * 0.3) + (warnings * 0.1));\r\n }\r\n}\r\n","/**\r\n * File Write Hook\r\n * \r\n * Intercepts file write operations to validate before committing changes.\r\n */\r\n\r\nexport interface FileWriteContext {\r\n filePath: string;\r\n content: string;\r\n action: 'create' | 'modify' | 'delete';\r\n previousContent?: string;\r\n}\r\n\r\nexport interface FileWriteResult {\r\n allowed: boolean;\r\n content: string;\r\n changes: Change[];\r\n auditEntry: AuditEntry;\r\n}\r\n\r\nexport interface Change {\r\n type: 'added' | 'removed' | 'modified';\r\n description: string;\r\n verified: boolean;\r\n}\r\n\r\nexport interface AuditEntry {\r\n timestamp: Date;\r\n filePath: string;\r\n action: string;\r\n result: 'allowed' | 'blocked' | 'modified';\r\n hash: string;\r\n changes: Change[];\r\n}\r\n\r\nexport class FileWriteHook {\r\n private auditLog: AuditEntry[] = [];\r\n\r\n /**\r\n * Execute file write validation\r\n */\r\n async execute(context: FileWriteContext): Promise<FileWriteResult> {\r\n const changes = this.analyzeChanges(context);\r\n \r\n // Validate all changes\r\n const validationResult = await this.validateChanges(context, changes);\r\n \r\n // Generate audit entry\r\n const auditEntry = this.createAuditEntry(context, changes, validationResult.allowed);\r\n this.auditLog.push(auditEntry);\r\n\r\n // Save audit to disk\r\n await this.saveAudit(auditEntry);\r\n\r\n return {\r\n allowed: validationResult.allowed,\r\n content: validationResult.allowed ? context.content : (context.previousContent ?? ''),\r\n changes,\r\n auditEntry,\r\n };\r\n }\r\n\r\n /**\r\n * Get audit log\r\n */\r\n getAuditLog(): AuditEntry[] {\r\n return [...this.auditLog];\r\n }\r\n\r\n private analyzeChanges(context: FileWriteContext): Change[] {\r\n const changes: Change[] = [];\r\n\r\n if (context.action === 'create') {\r\n changes.push({\r\n type: 'added',\r\n description: `New file: ${context.filePath}`,\r\n verified: false,\r\n });\r\n } else if (context.action === 'delete') {\r\n changes.push({\r\n type: 'removed',\r\n description: `Deleted file: ${context.filePath}`,\r\n verified: false,\r\n });\r\n } else if (context.previousContent) {\r\n // Analyze diff\r\n const addedLines = this.countAddedLines(context.previousContent, context.content);\r\n const removedLines = this.countRemovedLines(context.previousContent, context.content);\r\n\r\n if (addedLines > 0) {\r\n changes.push({\r\n type: 'added',\r\n description: `Added ${addedLines} lines`,\r\n verified: false,\r\n });\r\n }\r\n if (removedLines > 0) {\r\n changes.push({\r\n type: 'removed',\r\n description: `Removed ${removedLines} lines`,\r\n verified: false,\r\n });\r\n }\r\n }\r\n\r\n return changes;\r\n }\r\n\r\n private async validateChanges(\r\n context: FileWriteContext,\r\n changes: Change[]\r\n ): Promise<{ allowed: boolean; issues: string[] }> {\r\n const issues: string[] = [];\r\n\r\n // Check for suspicious patterns in new content\r\n if (context.content.includes('rm -rf')) {\r\n issues.push('Contains potentially dangerous shell command');\r\n }\r\n\r\n // Check for credential patterns\r\n if (/(?:password|secret|api_key)\\s*=\\s*['\"][^'\"]+['\"]/i.test(context.content)) {\r\n issues.push('Contains potential hardcoded credentials');\r\n }\r\n\r\n // TODO: Additional validation\r\n // - Check imports against package.json\r\n // - Verify types against truthpack\r\n // - Check for convention violations\r\n\r\n return {\r\n allowed: issues.length === 0,\r\n issues,\r\n };\r\n }\r\n\r\n private createAuditEntry(\r\n context: FileWriteContext,\r\n changes: Change[],\r\n allowed: boolean\r\n ): AuditEntry {\r\n return {\r\n timestamp: new Date(),\r\n filePath: context.filePath,\r\n action: context.action,\r\n result: allowed ? 'allowed' : 'blocked',\r\n hash: this.hashContent(context.content),\r\n changes,\r\n };\r\n }\r\n\r\n private async saveAudit(entry: AuditEntry): Promise<void> {\r\n // TODO: Save to .vibecheck/audit/changes/[timestamp]-[hash].json\r\n }\r\n\r\n private countAddedLines(previous: string, current: string): number {\r\n const prevLines = previous.split('\\n').length;\r\n const currLines = current.split('\\n').length;\r\n return Math.max(0, currLines - prevLines);\r\n }\r\n\r\n private countRemovedLines(previous: string, current: string): number {\r\n const prevLines = previous.split('\\n').length;\r\n const currLines = current.split('\\n').length;\r\n return Math.max(0, prevLines - currLines);\r\n }\r\n\r\n private hashContent(content: string): string {\r\n let hash = 0;\r\n for (let i = 0; i < content.length; i++) {\r\n const char = content.charCodeAt(i);\r\n hash = ((hash << 5) - hash) + char;\r\n hash = hash & hash;\r\n }\r\n return Math.abs(hash).toString(36);\r\n }\r\n}\r\n","/**\r\n * VibeCheck MCP Server Implementation\r\n */\r\n\r\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport { z } from 'zod';\r\nimport { \r\n createTransport, \r\n getTransportConfigFromEnv, \r\n type TransportConfig,\r\n type TransportType \r\n} from './transport/index.js';\r\n\r\nimport { registerTruthpackTools } from './tools/truthpack-tools.js';\r\nimport { registerContextTools } from './tools/context-tools.js';\r\nimport { registerFirewallTools } from './tools/firewall-tools.js';\r\nimport { registerValidationTools } from './tools/validation-tools.js';\r\nimport { registerRegistrationTools } from './tools/registration-tools.js';\r\nimport { registerIntentTools } from './tools/intent-tools.js';\r\nimport { registerPromptTools } from './tools/prompt-tools.js';\r\nimport { registerForgeTools } from './tools/forge-tools.js';\r\nimport { registerAgentRuntimeTools } from './tools/agent-runtime-tools.js';\r\nimport { IntentMiddleware } from './middleware/intent-middleware.js';\r\nimport { TracingMiddleware } from './middleware/tracing-middleware.js';\r\nimport { PreGenerationHook } from './hooks/pre-generation-hook.js';\r\nimport { PostGenerationHook } from './hooks/post-generation-hook.js';\r\nimport { FileWriteHook } from './hooks/file-write-hook.js';\r\n\r\nexport class VibeCheckServer {\r\n private server: McpServer;\r\n private intentMiddleware: IntentMiddleware;\r\n private tracingMiddleware: TracingMiddleware;\r\n private preGenerationHook: PreGenerationHook;\r\n private postGenerationHook: PostGenerationHook;\r\n private fileWriteHook: FileWriteHook;\r\n\r\n constructor() {\r\n this.server = new McpServer({\r\n name: 'vibecheck',\r\n version: '1.0.0',\r\n });\r\n\r\n // Initialize middleware\r\n this.intentMiddleware = new IntentMiddleware();\r\n this.tracingMiddleware = new TracingMiddleware();\r\n\r\n // Initialize hooks\r\n this.preGenerationHook = new PreGenerationHook();\r\n this.postGenerationHook = new PostGenerationHook();\r\n this.fileWriteHook = new FileWriteHook();\r\n\r\n this.registerTools();\r\n this.registerHookTools();\r\n this.registerMiddlewareTools();\r\n }\r\n\r\n /**\r\n * Start the MCP server with the specified transport\r\n */\r\n async start(config?: TransportConfig): Promise<void> {\r\n const transportConfig = config ?? getTransportConfigFromEnv();\r\n const transport = createTransport(transportConfig);\r\n \r\n // Note: connect() automatically calls start() on the transport\r\n // Do NOT call start() manually to avoid \"already started\" errors\r\n await this.server.connect(transport);\r\n console.error(`VibeCheck MCP Server started with ${transportConfig.type} transport`);\r\n }\r\n\r\n /**\r\n * Start with stdio transport (default for CLI)\r\n */\r\n async startStdio(): Promise<void> {\r\n return this.start({ type: 'stdio' });\r\n }\r\n\r\n /**\r\n * Start with HTTP transport (for cloud mode)\r\n */\r\n async startHTTP(port = 3001, host = 'localhost'): Promise<void> {\r\n return this.start({ type: 'http', port, host, path: '/mcp' });\r\n }\r\n\r\n /**\r\n * Start with WebSocket transport (for real-time cloud mode)\r\n */\r\n async startWebSocket(port = 3002, host = 'localhost'): Promise<void> {\r\n return this.start({ type: 'websocket', port, host, path: '/mcp' });\r\n }\r\n\r\n private registerTools(): void {\r\n // Register all tool categories\r\n registerTruthpackTools(this.server);\r\n registerContextTools(this.server);\r\n registerFirewallTools(this.server);\r\n registerValidationTools(this.server);\r\n registerRegistrationTools(this.server);\r\n registerIntentTools(this.server);\r\n registerPromptTools(this.server);\r\n registerForgeTools(this.server);\r\n \r\n // Agent Runtime tools (BYO-agent mode)\r\n registerAgentRuntimeTools(this.server);\r\n }\r\n\r\n /**\r\n * Register hook tools that wrap lifecycle hooks\r\n */\r\n private registerHookTools(): void {\r\n // Pre-generation hook tool\r\n this.server.tool(\r\n 'hook_pre_generation',\r\n 'Run pre-generation checks and get enhanced context before code generation',\r\n {\r\n task: z.string().describe('Description of the code generation task'),\r\n targetFile: z.string().optional().describe('Target file path for the generated code'),\r\n existingCode: z.string().optional().describe('Existing code in the target file'),\r\n },\r\n async ({ task, targetFile, existingCode }) => {\r\n // Trace the operation\r\n return this.tracingMiddleware.trace('hook_pre_generation', { task, targetFile }, async () => {\r\n // Validate intent\r\n const intentResult = this.intentMiddleware.validate('hook_pre_generation', { task, targetFile });\r\n \r\n if (!intentResult.valid) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n proceed: false,\r\n warnings: intentResult.warnings,\r\n reason: 'Intent validation failed',\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n\r\n const result = await this.preGenerationHook.execute({\r\n task,\r\n targetFile,\r\n existingCode,\r\n });\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n proceed: result.proceed,\r\n warnings: result.warnings,\r\n enhancedContext: result.enhancedContext,\r\n injectedPrompt: result.injectedPrompt,\r\n }, null, 2),\r\n }],\r\n };\r\n });\r\n }\r\n );\r\n\r\n // Post-generation hook tool\r\n this.server.tool(\r\n 'hook_post_generation',\r\n 'Validate generated code for hallucinations and issues',\r\n {\r\n generatedCode: z.string().describe('The generated code to validate'),\r\n targetFile: z.string().describe('Target file path'),\r\n originalTask: z.string().describe('Original task description'),\r\n },\r\n async ({ generatedCode, targetFile, originalTask }) => {\r\n return this.tracingMiddleware.trace('hook_post_generation', { targetFile, originalTask }, async () => {\r\n const result = await this.postGenerationHook.execute({\r\n generatedCode,\r\n targetFile,\r\n originalTask,\r\n });\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n approved: result.approved,\r\n hallucinationScore: result.hallucinationScore,\r\n issues: result.issues,\r\n suggestions: result.suggestions,\r\n }, null, 2),\r\n }],\r\n };\r\n });\r\n }\r\n );\r\n\r\n // File write hook tool\r\n this.server.tool(\r\n 'hook_file_write',\r\n 'Validate file write operation before committing',\r\n {\r\n filePath: z.string().describe('Path to the file'),\r\n content: z.string().describe('Content to write'),\r\n action: z.enum(['create', 'modify', 'delete']).describe('Type of file operation'),\r\n previousContent: z.string().optional().describe('Previous content of the file (for modify)'),\r\n },\r\n async ({ filePath, content, action, previousContent }) => {\r\n return this.tracingMiddleware.trace('hook_file_write', { filePath, action }, async () => {\r\n // Validate intent first\r\n const intentResult = this.intentMiddleware.validate('hook_file_write', { filePath, action, content });\r\n \r\n if (!intentResult.valid) {\r\n this.tracingMiddleware.recordBlocked('hook_file_write', { filePath, action }, intentResult.warnings.join('; '));\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n allowed: false,\r\n reason: 'Intent validation failed',\r\n warnings: intentResult.warnings,\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n\r\n const result = await this.fileWriteHook.execute({\r\n filePath,\r\n content,\r\n action,\r\n previousContent,\r\n });\r\n\r\n if (!result.allowed) {\r\n this.tracingMiddleware.recordBlocked('hook_file_write', { filePath, action }, 'File write validation failed');\r\n }\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n allowed: result.allowed,\r\n changes: result.changes,\r\n auditEntry: {\r\n timestamp: result.auditEntry.timestamp.toISOString(),\r\n filePath: result.auditEntry.filePath,\r\n action: result.auditEntry.action,\r\n result: result.auditEntry.result,\r\n },\r\n }, null, 2),\r\n }],\r\n };\r\n });\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Register middleware tools for tracing and intent management\r\n */\r\n private registerMiddlewareTools(): void {\r\n // Get tracing data\r\n this.server.tool(\r\n 'middleware_traces',\r\n 'Get recent operation traces for debugging',\r\n {\r\n limit: z.number().optional().describe('Maximum number of traces to return (default: 50)'),\r\n tool: z.string().optional().describe('Filter by tool name'),\r\n },\r\n async ({ limit, tool }) => {\r\n let traces = this.tracingMiddleware.getTraces();\r\n \r\n if (tool) {\r\n traces = this.tracingMiddleware.getTracesByTool(tool);\r\n }\r\n\r\n traces = traces.slice(-(limit ?? 50));\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n traces: traces.map(t => ({\r\n id: t.id,\r\n timestamp: t.timestamp.toISOString(),\r\n tool: t.tool,\r\n result: t.result,\r\n duration: t.duration,\r\n error: t.error,\r\n })),\r\n count: traces.length,\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n );\r\n\r\n // Get intent history\r\n this.server.tool(\r\n 'middleware_intent_history',\r\n 'Get intent validation history',\r\n {\r\n limit: z.number().optional().describe('Maximum number of entries (default: 50)'),\r\n },\r\n async ({ limit }) => {\r\n const history = this.intentMiddleware.getHistory().slice(-(limit ?? 50));\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n history: history.map(h => ({\r\n tool: h.tool,\r\n timestamp: h.timestamp.toISOString(),\r\n parameters: Object.keys(h.parameters),\r\n })),\r\n count: history.length,\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n );\r\n\r\n // Export all traces\r\n this.server.tool(\r\n 'middleware_export_traces',\r\n 'Export all traces for analysis',\r\n {},\r\n async () => {\r\n const exported = this.tracingMiddleware.exportTraces();\r\n \r\n return {\r\n content: [{\r\n type: 'text',\r\n text: exported,\r\n }],\r\n };\r\n }\r\n );\r\n\r\n // Clear traces\r\n this.server.tool(\r\n 'middleware_clear_traces',\r\n 'Clear all stored traces',\r\n {},\r\n async () => {\r\n this.tracingMiddleware.clear();\r\n \r\n return {\r\n content: [{\r\n type: 'text',\r\n text: JSON.stringify({\r\n success: true,\r\n message: 'All traces cleared',\r\n }, null, 2),\r\n }],\r\n };\r\n }\r\n );\r\n }\r\n}\r\n","#!/usr/bin/env node\r\n/**\r\n * VibeCheck MCP Server\r\n * \r\n * Model Context Protocol server for hallucination prevention.\r\n * Provides tools for truthpack management, context gathering,\r\n * firewall validation, and code verification.\r\n * \r\n * Usage:\r\n * vibecheck-mcp # Start with stdio (default)\r\n * vibecheck-mcp --http # Start with HTTP transport\r\n * vibecheck-mcp --websocket # Start with WebSocket transport\r\n * vibecheck-mcp --port 3001 # Specify port (for HTTP/WS)\r\n * vibecheck-mcp --host 0.0.0.0 # Specify host (for HTTP/WS)\r\n * \r\n * Environment variables:\r\n * VIBECHECK_MODE=local|cloud|hybrid\r\n * VIBECHECK_TRANSPORT=stdio|http|websocket\r\n * VIBECHECK_PORT=3001\r\n * VIBECHECK_HOST=localhost\r\n */\r\n\r\nimport { VibeCheckServer } from './server.js';\r\nimport type { TransportConfig, TransportType } from './transport/index.js';\r\nimport { loadConfig } from '@repo/shared-config';\r\n\r\nfunction parseArgs(): TransportConfig {\r\n const config = loadConfig();\r\n const args = process.argv.slice(2);\r\n \r\n let type: TransportType = 'stdio';\r\n let port: number | undefined;\r\n let host: string | undefined;\r\n \r\n for (let i = 0; i < args.length; i++) {\r\n const arg = args[i];\r\n \r\n switch (arg) {\r\n case '--http':\r\n type = 'http';\r\n break;\r\n case '--websocket':\r\n case '--ws':\r\n type = 'websocket';\r\n break;\r\n case '--stdio':\r\n type = 'stdio';\r\n break;\r\n case '--port':\r\n port = parseInt(args[++i] ?? '3001', 10);\r\n break;\r\n case '--host':\r\n host = args[++i];\r\n break;\r\n case '--help':\r\n case '-h':\r\n printHelp();\r\n process.exit(0);\r\n }\r\n }\r\n \r\n // Use centralized config as fallback\r\n if (config.VIBECHECK_TRANSPORT) {\r\n type = config.VIBECHECK_TRANSPORT as TransportType;\r\n }\r\n if (config.VIBECHECK_PORT && !port) {\r\n port = config.VIBECHECK_PORT;\r\n }\r\n if (config.VIBECHECK_HOST && !host) {\r\n host = config.VIBECHECK_HOST;\r\n }\r\n \r\n return { type, port, host };\r\n}\r\n\r\nfunction printHelp(): void {\r\n console.log(`\r\nVibeCheck MCP Server - Hallucination prevention for AI development\r\n\r\nUsage:\r\n vibecheck-mcp [options]\r\n\r\nOptions:\r\n --stdio Use stdio transport (default)\r\n --http Use HTTP transport\r\n --websocket, --ws Use WebSocket transport\r\n --port <port> Port for HTTP/WebSocket (default: 3001)\r\n --host <host> Host for HTTP/WebSocket (default: localhost)\r\n -h, --help Show this help message\r\n\r\nEnvironment Variables:\r\n VIBECHECK_MODE Set mode: local, cloud, or hybrid\r\n VIBECHECK_TRANSPORT Set transport: stdio, http, or websocket\r\n VIBECHECK_PORT Port for HTTP/WebSocket transport\r\n VIBECHECK_HOST Host for HTTP/WebSocket transport\r\n\r\nExamples:\r\n vibecheck-mcp # Start with stdio (for CLI)\r\n vibecheck-mcp --http --port 3001 # Start HTTP server on port 3001\r\n vibecheck-mcp --websocket # Start WebSocket server\r\n`);\r\n}\r\n\r\nasync function main(): Promise<void> {\r\n const config = parseArgs();\r\n const server = new VibeCheckServer();\r\n await server.start(config);\r\n}\r\n\r\nmain().catch((error) => {\r\n console.error('Failed to start VibeCheck MCP Server:', error);\r\n process.exit(1);\r\n});\r\n"]}