{"version":3,"sources":["../../src/services/PatternMatchingService.ts"],"sourcesContent":["import { CoolhandAPIPattern, CoolhandMatchedPattern, CoolhandRequestOptions } from '../types';\n\n// Credential-bearing headers redacted unconditionally, regardless of which (if any)\n// pattern matched — closes the gap where an unmatched/misdetected request or a custom\n// patternsFile entry without a `headers` map would otherwise leak these unredacted.\nconst DEFAULT_REDACTED_HEADERS = [\n  'authorization',\n  'api-key',\n  'x-api-key',\n  'cookie',\n  'set-cookie',\n  'proxy-authorization',\n];\n\n// Runtime detection utility\nconst isEdgeRuntime = () => {\n  return (typeof (globalThis as any).EdgeRuntime !== 'undefined') ||\n         process.env.NEXT_RUNTIME === 'edge' ||\n         (typeof (globalThis as any).window !== 'undefined');\n};\n\n\n// Node.js modules - conditionally imported\nlet fs: any = null;\nlet path: any = null;\n\n// Lazy load Node.js modules only when not in Edge runtime\nconst loadNodeModules = async () => {\n  if (isEdgeRuntime()) {return false;}\n\n  try {\n    fs = await import('fs');\n    path = await import('path');\n    return true;\n  } catch {\n    return false;\n  }\n};\n\nexport interface PatternMatchingServiceOptions {\n  customPatternsFile?: string;\n  silent?: boolean;\n}\n\nexport class PatternMatchingService {\n  private apiPatterns: CoolhandAPIPattern[] = [];\n  private isInitialized: boolean = false;\n  private silent: boolean;\n\n  constructor(options?: string | PatternMatchingServiceOptions) {\n    if (typeof options === 'string') {\n      this.silent = false;\n      this.initializePatternsSync(options);\n    } else {\n      this.silent = options?.silent ?? false;\n      this.initializePatternsSync(options?.customPatternsFile);\n    }\n  }\n\n  private initializePatternsSync(customPatternsFile?: string): void {\n    if (this.isInitialized) {return;}\n\n    if (isEdgeRuntime()) {\n      // In Edge runtime, use default patterns or skip loading\n      this.loadDefaultPatternsForEdge();\n    } else {\n      // In Node.js runtime, try to load from filesystem synchronously\n      try {\n        // Check if require is available (CommonJS) or if we need to use dynamic import (ES modules)\n        if (typeof require !== 'undefined') {\n          const fs = require('fs');\n          const path = require('path');\n          this.loadAPIPatternsSync(customPatternsFile, fs, path);\n        } else {\n          // In ES modules, we can't use require synchronously, so fall back to default patterns\n          // The async initialization will handle proper loading later\n          if (!this.silent) { console.log('📋 ES module environment detected, using default patterns. File system patterns will be loaded asynchronously.'); }\n          this.loadDefaultPatternsForEdge();\n        }\n      } catch {\n        if (!this.silent) { console.warn('Could not load fs/path modules, falling back to default patterns'); }\n        this.loadDefaultPatternsForEdge();\n      }\n    }\n\n    this.isInitialized = true;\n  }\n\n  // Keep async version for explicit async initialization if needed\n  private async initializePatterns(customPatternsFile?: string): Promise<void> {\n    if (this.isInitialized) {return;}\n\n    if (isEdgeRuntime()) {\n      // In Edge runtime, use default patterns or skip loading\n      this.loadDefaultPatternsForEdge();\n    } else {\n      // In Node.js runtime, load from filesystem\n      await this.loadAPIPatterns(customPatternsFile);\n    }\n\n    this.isInitialized = true;\n  }\n\n  private loadDefaultPatternsForEdge(): void {\n    // Default patterns for common AI services that work without filesystem access\n    this.apiPatterns = [\n      {\n        name: 'OpenAI',\n        domains: ['api.openai.com'],\n        headers: {\n          'authorization': 'Bearer [REDACTED]'\n        }\n      },\n      {\n        name: 'Anthropic',\n        domains: ['api.anthropic.com'],\n        headers: {\n          'x-api-key': '[REDACTED]'\n        }\n      },\n      {\n        name: 'Google AI',\n        domains: ['generativelanguage.googleapis.com'],\n        headers: {\n          'authorization': 'Bearer [REDACTED]'\n        }\n      },\n      {\n        name: 'GitHub Models',\n        domains: ['models.github.ai', 'models.inference.ai.azure.com'],\n        headers: {\n          'authorization': 'Bearer [REDACTED]'\n        }\n      },\n      {\n        name: 'Vertex AI',\n        domains: ['aiplatform.googleapis.com'],\n        headers: {\n          'authorization': 'Bearer [REDACTED]',\n          'x-goog-api-key': '[REDACTED]'\n        }\n      },\n      {\n        name: 'OpenRouter',\n        domains: ['openrouter.ai'],\n        headers: {\n          'authorization': 'Bearer [REDACTED]',\n          'x-api-key': '[REDACTED]'\n        }\n      },\n      {\n        name: 'Cloudflare AI Gateway',\n        domains: ['gateway.ai.cloudflare.com'],\n        headers: {\n          'authorization': 'Bearer [REDACTED]',\n          'cf-aig-authorization': '[REDACTED]',\n          'x-api-key': '[REDACTED]',\n          'openai-api-key': '[REDACTED]',\n          'x-goog-api-key': '[REDACTED]'\n        }\n      }\n    ];\n    if (!this.silent) { console.log(`📋 Loaded ${this.apiPatterns.length} default API patterns for Edge runtime`); }\n  }\n\n  // Guards against valid JSON that isn't shaped as { patterns: [{ domains: string[], ... }] } —\n  // e.g. a typo'd or hand-edited COOLHAND_PATTERNS_FILE — so it triggers the same\n  // fallback-to-defaults path as invalid JSON, instead of crashing every request later.\n  private validatePatternsShape(patternsData: unknown, sourceFile: string): CoolhandAPIPattern[] {\n    const patterns = (patternsData as { patterns?: unknown } | null)?.patterns;\n    const isValid = Array.isArray(patterns) && patterns.every(\n      (pattern) => pattern && typeof pattern === 'object' && Array.isArray((pattern as CoolhandAPIPattern).domains)\n    );\n    if (!isValid) {\n      throw new Error(`Coolhand: patterns file \"${sourceFile}\" is not shaped correctly (expected { patterns: [{ domains: string[], ... }] })`);\n    }\n    return patterns as CoolhandAPIPattern[];\n  }\n\n  private async loadAPIPatterns(customPatternsFile?: string): Promise<void> {\n    // Load Node.js modules first\n    const hasNodeModules = await loadNodeModules();\n    if (!hasNodeModules) {\n      if (!this.silent) { console.warn('⚠️  Node.js modules not available, falling back to default patterns'); }\n      this.loadDefaultPatternsForEdge();\n      return;\n    }\n\n    try {\n      let patternsFile: string;\n\n      if (customPatternsFile) {\n        // Use custom patterns file if provided\n        patternsFile = path.resolve(customPatternsFile);\n      } else {\n        // Use default patterns file from the package's dist directory\n        // Try multiple strategies to find the patterns file reliably\n        const possiblePaths: string[] = [];\n\n        // Strategy 1: Use require.resolve\n        try {\n          const packagePath = require.resolve('coolhand-node/package.json');\n          let packageDir = path.dirname(packagePath);\n\n          // If we get a weird Next.js path, try to resolve it\n          if (!path.isAbsolute(packageDir) || packageDir.includes('(api)')) {\n            // Try following symlinks\n            try {\n              const realPath = fs.realpathSync(require.resolve('coolhand-node/package.json'));\n              packageDir = path.dirname(realPath);\n            } catch {\n              // Try resolving relative to cwd\n              packageDir = path.resolve(process.cwd(), packageDir);\n            }\n          }\n\n          possiblePaths.push(path.join(packageDir, 'dist', 'api-patterns.json'));\n        } catch {\n          // Ignore errors when finding package.json\n        }\n\n        // Strategy 2: __dirname method\n        possiblePaths.push(path.join(__dirname, '..', 'api-patterns.json'));\n\n        // Strategy 3: Common node_modules locations\n        possiblePaths.push(path.join(process.cwd(), 'node_modules', 'coolhand-node', 'dist', 'api-patterns.json'));\n\n        // Try each path until we find one that exists\n        let foundPath = '';\n        for (const candidatePath of possiblePaths) {\n          if (fs.existsSync(candidatePath)) {\n            foundPath = candidatePath;\n            if (!this.silent) { console.log(`🔧 DEBUG: Found patterns file at: ${foundPath}`); }\n            break;\n          }\n        }\n\n        // If we still haven't found it, use the first candidate as fallback\n        patternsFile = foundPath || possiblePaths[0] || path.join(__dirname, '..', 'api-patterns.json');\n        if (!foundPath) {\n          if (!this.silent) { console.log(`🔧 DEBUG: No valid path found, using fallback: ${patternsFile}`); }\n        }\n      }\n\n      if (fs.existsSync(patternsFile)) {\n        const fileContent = fs.readFileSync(patternsFile, 'utf-8');\n        const patternsData: unknown = JSON.parse(fileContent);\n        this.apiPatterns = this.validatePatternsShape(patternsData, patternsFile);\n        if (!this.silent) { console.log(`📋 Loaded ${this.apiPatterns.length} API patterns from ${customPatternsFile ? 'custom' : 'default'} patterns file`); }\n      } else {\n        if (customPatternsFile) {\n          if (!this.silent) { console.warn(`⚠️  Custom patterns file not found: ${patternsFile}. Falling back to default patterns.`); }\n          // Try to load default patterns file as fallback using the same method\n          let defaultPatternsFile: string;\n          try {\n            const packagePath = require.resolve('coolhand-node/package.json');\n            const packageDir = path.dirname(packagePath);\n            defaultPatternsFile = path.join(packageDir, 'dist', 'api-patterns.json');\n          } catch {\n            defaultPatternsFile = path.join(__dirname, '..', 'api-patterns.json');\n          }\n\n          if (fs.existsSync(defaultPatternsFile)) {\n            const fileContent = fs.readFileSync(defaultPatternsFile, 'utf-8');\n            const patternsData: unknown = JSON.parse(fileContent);\n            this.apiPatterns = this.validatePatternsShape(patternsData, defaultPatternsFile);\n            if (!this.silent) { console.log(`📋 Loaded ${this.apiPatterns.length} default API patterns as fallback`); }\n          } else {\n            throw new Error('Default patterns file not found');\n          }\n        } else {\n          throw new Error('Default patterns file not found');\n        }\n      }\n    } catch (error) {\n      if (!this.silent) { console.error(`❌ Error loading API patterns:`, (error as Error).message); }\n      if (!this.silent) { console.warn(`⚠️  Falling back to default patterns for Edge runtime compatibility`); }\n      this.loadDefaultPatternsForEdge();\n    }\n  }\n\n  private loadAPIPatternsSync(customPatternsFile: string | undefined, fs: any, _path: any): void {\n    try {\n      let patternsFile: string;\n\n      if (customPatternsFile) {\n        patternsFile = _path.resolve(customPatternsFile);\n      } else {\n        // __dirname is available in CJS but not in ESM. Use eval to access\n        // import.meta.url without causing ts-jest compile errors.\n        let baseDir: string;\n        if (typeof __dirname !== 'undefined') {\n          baseDir = __dirname;\n        } else {\n          try {\n            const metaUrl: string = eval('import.meta.url');\n            // Use fileURLToPath instead of new URL().pathname to handle\n            // Windows paths correctly (e.g. /C:/foo/bar.js → C:\\foo\\bar.js)\n            const { fileURLToPath } = require('url');\n            baseDir = _path.dirname(fileURLToPath(metaUrl));\n          } catch {\n            baseDir = process.cwd();\n          }\n        }\n        // Try the current directory first (tsup bundle: dist/index.cjs → baseDir = dist/).\n        // Fall back to the parent directory (tsc/Jest source: src/services/ → need ../ to reach src/).\n        const candidates: string[] = [\n          _path.join(baseDir, 'api-patterns.json'),\n          _path.join(baseDir, '..', 'api-patterns.json'),\n        ];\n        patternsFile = candidates.find((p: string) => fs.existsSync(p)) || candidates[0];\n      }\n\n      if (fs.existsSync(patternsFile)) {\n        const fileContent = fs.readFileSync(patternsFile, 'utf-8');\n        const patternsData: unknown = JSON.parse(fileContent);\n        this.apiPatterns = this.validatePatternsShape(patternsData, patternsFile);\n        if (!this.silent) { console.log(`📋 Loaded ${this.apiPatterns.length} API patterns from ${customPatternsFile ? 'custom' : 'default'} patterns file`); }\n      } else {\n        if (customPatternsFile) {\n          if (!this.silent) { console.warn(`⚠️  API patterns file not found: ${patternsFile}`); }\n        } else {\n          if (!this.silent) { console.warn(`⚠️  API patterns file not found: ${patternsFile}`); }\n        }\n      }\n\n    } catch (error) {\n      if (!this.silent) { console.error(`❌ Error loading API patterns:`, (error as Error).message); }\n      this.loadDefaultPatternsForEdge();\n    }\n  }\n\n  // Ensure patterns are loaded before any operations (now always sync)\n  private ensureInitialized(): void {\n    if (!this.isInitialized) {\n      this.initializePatternsSync();\n    }\n  }\n\n  private hostnameMatchesDomain(hostname: string, domain: string): boolean {\n    return hostname === domain || hostname.endsWith('.' + domain);\n  }\n\n  // Defense in depth: a bug in any matcher (e.g. malformed apiPatterns surviving\n  // load-time validation) must never break the host app's networking — this is the\n  // hot path called from every patched http/https/fetch entry point.\n  private safeMatch(fn: () => CoolhandMatchedPattern | null): CoolhandMatchedPattern | null {\n    try {\n      return fn();\n    } catch (error) {\n      if (!this.silent) { console.warn(`⚠️  Coolhand: pattern matching failed, request will not be monitored:`, (error as Error).message); }\n      return null;\n    }\n  }\n\n  public async matchesAPIPattern(options: CoolhandRequestOptions | string | URL): Promise<CoolhandMatchedPattern | null> {\n    return this.safeMatch(() => {\n      this.ensureInitialized();\n\n      if (typeof options === 'string') {\n        return this.matchesAPIPatternFromURL(options);\n      }\n\n      if (options instanceof URL) {\n        return this.matchesAPIPatternFromURL(options.toString());\n      }\n\n      // Construct URL from options\n      const hostname = options.hostname || options.host || '';\n\n      // Check domain matches\n      for (const pattern of this.apiPatterns) {\n        for (const domain of pattern.domains) {\n          if (this.hostnameMatchesDomain(hostname, domain)) {\n            return {\n              pattern,\n              matchType: 'domain',\n              matchValue: domain\n            };\n          }\n        }\n      }\n\n      return null;\n    });\n  }\n\n  // Synchronous version for backwards compatibility (uses cached patterns)\n  public matchesAPIPatternSync(options: CoolhandRequestOptions | string | URL): CoolhandMatchedPattern | null {\n    return this.safeMatch(() => {\n      if (typeof options === 'string') {\n        return this.matchesAPIPatternFromURL(options);\n      }\n\n      if (options instanceof URL) {\n        return this.matchesAPIPatternFromURL(options.toString());\n      }\n\n      // Construct URL from options\n      const hostname = options.hostname || options.host || '';\n\n      // Check domain matches\n      for (const pattern of this.apiPatterns) {\n        for (const domain of pattern.domains) {\n          if (this.hostnameMatchesDomain(hostname, domain)) {\n            return {\n              pattern,\n              matchType: 'domain',\n              matchValue: domain\n            };\n          }\n        }\n      }\n\n      return null;\n    });\n  }\n\n  public matchesAPIPatternFromURL(url: string): CoolhandMatchedPattern | null {\n    return this.safeMatch(() => {\n      try {\n        const urlObj = new URL(url);\n\n        // Check domain matches\n        for (const pattern of this.apiPatterns) {\n          for (const domain of pattern.domains) {\n            if (this.hostnameMatchesDomain(urlObj.hostname, domain)) {\n              return {\n                pattern,\n                matchType: 'domain',\n                matchValue: domain\n              };\n            }\n          }\n        }\n\n        // Check path matches (only for patterns that explicitly opt in to\n        // cross-domain path matching — see CoolhandAPIPattern.allowPathMatchAcrossDomains)\n        for (const pattern of this.apiPatterns) {\n          if (pattern.paths && pattern.allowPathMatchAcrossDomains) {\n            for (const pathPattern of pattern.paths) {\n              if (urlObj.pathname.includes(pathPattern)) {\n                return {\n                  pattern,\n                  matchType: 'path',\n                  matchValue: pathPattern\n                };\n              }\n            }\n          }\n        }\n      } catch {\n        // If URL parsing fails, fall back to simple string matching\n        for (const pattern of this.apiPatterns) {\n          for (const domain of pattern.domains) {\n            if (url.includes(domain)) {\n              return {\n                pattern,\n                matchType: 'domain',\n                matchValue: domain\n              };\n            }\n          }\n        }\n      }\n\n      return null;\n    });\n  }\n\n  public sanitizeHeaders(headers: any, pattern?: CoolhandAPIPattern): Record<string, any> {\n    const sanitized: Record<string, any> = Object.fromEntries(\n      Object.entries(headers ?? {}).map(([key, value]) => [key.toLowerCase(), value])\n    );\n\n    // Default sanitization rules — applied unconditionally, independent of pattern match\n    for (const headerName of DEFAULT_REDACTED_HEADERS) {\n      if (sanitized[headerName] !== undefined) {\n        sanitized[headerName] = '[REDACTED]';\n      }\n    }\n\n    // Pattern-specific sanitization\n    if (pattern?.headers) {\n      for (const [headerKey, redactionValue] of Object.entries(pattern.headers)) {\n        const lowerKey = headerKey.toLowerCase();\n        if (sanitized[lowerKey]) {\n          sanitized[lowerKey] = redactionValue;\n        }\n      }\n    }\n\n    // Normalize header arrays to strings\n    for (const key of Object.keys(sanitized)) {\n      const val = sanitized[key];\n      if (Array.isArray(val)) {\n        sanitized[key] = val.length === 1 ? val[0] : val.join(', ');\n      }\n    }\n\n    return sanitized;\n  }\n\n  public sanitizeURL(url: string): string {\n    try {\n      const urlObj = new URL(url);\n      if (!urlObj.search) {\n        return url;\n      }\n      // x-goog-api-key is normally sent as a header (already redacted via sanitizeHeaders/\n      // api-patterns.json) — included here too as defense-in-depth for callers that pass it\n      // as a query param instead. X-Amz-Signature/X-Amz-Credential are genuinely query params\n      // on AWS SigV4-presigned URLs.\n      const sensitiveParams = new Set([\n        'key', 'api_key', 'apikey', 'token', 'access_token', 'secret',\n        'password', 'signature', 'sig', 'x-goog-api-key',\n        'x-amz-signature', 'x-amz-credential'\n      ]);\n      let redacted = false;\n      for (const [name] of urlObj.searchParams.entries()) {\n        if (sensitiveParams.has(name.toLowerCase())) {\n          urlObj.searchParams.set(name, '[REDACTED]');\n          redacted = true;\n        }\n      }\n      return redacted ? urlObj.toString() : url;\n    } catch {\n      return url;\n    }\n  }\n\n  public async getLoadedPatterns(): Promise<CoolhandAPIPattern[]> {\n    this.ensureInitialized();\n    return [...this.apiPatterns];\n  }\n\n  public async getPatternsCount(): Promise<number> {\n    this.ensureInitialized();\n    return this.apiPatterns.length;\n  }\n\n  // Synchronous versions for backwards compatibility\n  public getLoadedPatternsSync(): CoolhandAPIPattern[] {\n    return [...this.apiPatterns];\n  }\n\n  public getPatternsCountSync(): number {\n    return this.apiPatterns.length;\n  }\n}"],"mappings":"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","names":["customPatternsFile","fs","path","patternsFile"]}