{"version":3,"sources":["../src/global-monitor.ts"],"sourcesContent":["/**\n * Global monitoring functionality for coolhand-node\n *\n * This module provides universal HTTP monitoring that automatically detects\n * and logs AI API calls across any Node.js application.\n */\n\nimport { CoolhandCallData, CoolhandRequestOptions, CoolhandMatchedPattern } from './types.js';\nimport { PatternMatchingService } from './services/PatternMatchingService.js';\nimport { LoggingService } from './services/LoggingService.js';\nimport { parseBody } from './utils/parse-body.js';\nimport { decompressBuffer, MAX_DECOMPRESSED_BYTES } from './utils/decompress.js';\nimport { CappedBuffer } from './utils/capped-buffer.js';\nimport { isNonInferenceURL } from './non-inference-filter.js';\nimport { createResponseTee } from './utils/tee-response.js';\nimport { normalizeRequestArgs } from './utils/normalize-request-args.js';\nimport type { PassThrough } from 'stream';\n\ntype HttpClientRequest = any; // Will be properly typed when http is loaded\ntype HttpIncomingMessage = any; // Will be properly typed when http is loaded\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// Node.js modules - conditionally imported\nlet https: any = null;\nlet http: any = null;\n// Precisely typed (unlike https/http above) since `import type` is free at runtime and\n// createResponseTee's PassThrough-specific echo semantics benefit from the real type here.\nlet PassThroughCtor: (new () => PassThrough) | null = null;\n\n// Available in CJS builds (and tsup's CJS shim); null in native ESM and Edge runtimes.\n// Using try/catch avoids a static top-level import of 'module' that would throw at\n// evaluation time in edge runtimes before isEdgeRuntime() can guard against it.\nlet _createRequire: ((id: string) => any) | null = null;\ntry { _createRequire = (require as any)('module').createRequire; } catch { /* not available in native ESM or Edge */ }\n\n// createRequire accepts a file URL string or an absolute path. The fallback is an\n// absolute path, not a hand-built 'file://' + process.cwd(): that produces\n// 'file://C:\\Users\\...' on Windows (drive letter in the URL host slot), and building\n// a valid URL would need url.pathToFileURL — a Node import this file must not take.\n// eval() keeps import.meta.url out of the CJS build, where it is a compile error.\nconst createRequireBase = (): string => {\n  try { return eval('import.meta.url') as string; } catch { /* CJS — no import.meta */ }\n  return process.cwd() + '/';\n};\n\n// Synchronous module loader — used by initGlobalMonitoringCore so patching happens\n// immediately when auto-monitor is imported in CJS builds.\nconst loadNodeModulesSync = (): boolean => {\n  if (isEdgeRuntime()) {\n    console.warn('⚠️  Edge runtime detected - HTTP/HTTPS patching will be limited to fetch() only');\n    return false;\n  }\n  if (!_createRequire) { return false; } // native ESM — fall through to async path\n  try {\n    const req = _createRequire(createRequireBase());\n    https = req('https');\n    http = req('http');\n    PassThroughCtor = req('stream').PassThrough;\n    return true;\n  } catch {\n    return false;\n  }\n};\n\n// Lazy load Node.js modules only when not in Edge runtime\nconst loadNodeModules = async () => {\n  if (isEdgeRuntime()) {\n    console.warn('⚠️  Edge runtime detected - HTTP/HTTPS patching will be limited to fetch() only');\n    return false;\n  }\n\n  try {\n    let httpsModule = await import('https') as any;\n    let httpModule = await import('http') as any;\n\n    // ESM namespace objects have non-configurable properties which cannot be patched\n    // via Object.defineProperty. Detect this and fall back to createRequire, which\n    // returns the mutable CJS module object where properties are configurable.\n    const desc = Object.getOwnPropertyDescriptor(httpsModule, 'request');\n    if (desc && desc.configurable === false) {\n      log('ESM namespace detected (non-configurable properties), using createRequire fallback');\n      const { createRequire: cr } = await import('module') as any;\n      const cjsRequire = cr(createRequireBase());\n      httpsModule = cjsRequire('https');\n      httpModule = cjsRequire('http');\n    }\n\n    https = httpsModule;\n    http = httpModule;\n    PassThroughCtor = ((await import('stream')) as any).PassThrough;\n\n    return true;\n  } catch {\n    console.warn('⚠️  Node.js HTTP modules not available - falling back to fetch() only');\n    return false;\n  }\n};\n\n// State is stored on globalThis so both the CJS and ESM builds of this module\n// share the same values in a mixed-format Node.js process. A string key (not a\n// Symbol) is required because Symbols are per-realm and would be independent\n// across module formats.\nconst COOLHAND_STATE_KEY = '__coolhand_node_v1__';\n\ninterface CoolhandGlobalState {\n  globalPatternService: PatternMatchingService | null;\n  globalLoggingService: LoggingService | null;\n  isGloballyPatched: boolean;\n  callCounter: number;\n  interceptedCalls: number;\n  silent: boolean;\n  globalActiveRequests: Map<string, { timestamp: number; requestIds: Set<string> }>;\n}\n\nfunction getState(): CoolhandGlobalState {\n  const g = globalThis as any;\n  if (!g[COOLHAND_STATE_KEY]) {\n    g[COOLHAND_STATE_KEY] = {\n      globalPatternService: null,\n      globalLoggingService: null,\n      isGloballyPatched: false,\n      callCounter: 0,\n      interceptedCalls: 0,\n      silent: true,\n      globalActiveRequests: new Map(),\n    } satisfies CoolhandGlobalState;\n  }\n  return g[COOLHAND_STATE_KEY] as CoolhandGlobalState;\n}\n\n/** Reset all singleton state — for use in tests only. */\nexport function _resetGlobalState(): void {\n  delete (globalThis as any)[COOLHAND_STATE_KEY];\n}\n\nconst DEDUP_WINDOW_MS = 1000;\n\ninterface GlobalMonitorConfig {\n  apiKey: string;\n  silent?: boolean;\n  patternsFile?: string;\n  debug?: boolean;\n  dryRun?: boolean;\n  baseUrl?: string;\n  /** @deprecated Use `baseUrl` instead. Removed in v0.4.0; this shim will be removed in a future release. */\n  environment?: 'local' | 'production';\n}\n\n/**\n * Synchronous core initialization — sets up services and applies patches immediately.\n * In CJS builds (and TypeScript projects compiled to CJS) this patches https.request\n * at module evaluation time, so static imports of libraries like @langchain/openai\n * are intercepted correctly. In native ESM builds _createRequire is unavailable, so\n * only fetch is patched here; call loadAndPatchNodeModulesIfNeeded() to finish.\n */\nexport function initGlobalMonitoringCore(config: GlobalMonitorConfig): void {\n  const state = getState();\n  if (state.isGloballyPatched) { return; }\n\n  state.silent = config.silent !== false;\n  let resolvedBaseUrl = config.baseUrl;\n\n  // TODO: remove after v1.x.x — backward-compat shim for deprecated `environment` option\n  if (config.environment !== undefined) {\n    console.warn(\n      '[coolhand-node] DEPRECATION WARNING: The `environment` option was removed in v0.4.0. ' +\n      \"Use `baseUrl: 'http://localhost:3000'` instead of `environment: 'local'`. \" +\n      'Remove `environment: \\'production\\'` — the default endpoint is unchanged.'\n    );\n    if (config.environment === 'local' && resolvedBaseUrl === undefined) {\n      resolvedBaseUrl = 'http://localhost:3000';\n    }\n  }\n\n  if (config.debug && !config.dryRun) {\n    console.warn(\n      '[coolhand-node] DEPRECATION WARNING: `debug: true` no longer suppresses API calls. ' +\n      'Use `dryRun: true` to prevent data submission. ' +\n      '`debug` now only enables verbose logging.'\n    );\n  }\n\n  state.globalPatternService = new PatternMatchingService({ customPatternsFile: config.patternsFile, silent: state.silent });\n  state.globalLoggingService = new LoggingService({\n    apiKey: config.apiKey,\n    silent: state.silent,\n    debug: config.debug,\n    dryRun: config.dryRun,\n    baseUrl: resolvedBaseUrl\n  });\n\n  const hasNodeModules = loadNodeModulesSync();\n  if (hasNodeModules) {\n    patchHTTPS();\n    patchHTTP();\n  }\n  patchFetch();\n  state.isGloballyPatched = true;\n}\n\n/**\n * Async completion step for native ESM builds where loadNodeModulesSync() cannot\n * obtain createRequire. Loads http/https via dynamic import and applies patches.\n * No-op if modules were already loaded by the synchronous path (CJS builds).\n */\nexport async function loadAndPatchNodeModulesIfNeeded(): Promise<void> {\n  if (https !== null) { return; } // already loaded synchronously\n  if (isEdgeRuntime()) { return; }\n  const hasNodeModules = await loadNodeModules();\n  if (hasNodeModules) {\n    patchHTTPS();\n    patchHTTP();\n  }\n}\n\n/**\n * Initialize global monitoring - patches HTTP modules to monitor ALL outbound requests\n * This should be called once at the start of your application\n */\nexport async function initializeGlobalMonitoring(config: GlobalMonitorConfig): Promise<void> {\n  const state = getState();\n\n  if (state.isGloballyPatched) {\n    log('🔄 Global monitoring already initialized, skipping...');\n    return;\n  }\n\n  initGlobalMonitoringCore(config);\n  await loadAndPatchNodeModulesIfNeeded();\n\n  if (!state.silent) {\n    console.log('🌐 Global Coolhand monitoring initialized');\n    if (config.dryRun) {\n      console.log('🚫 Dry run mode: ON — API calls will be skipped');\n    }\n    if (config.debug) {\n      console.log('🔬 Debug mode: ON — verbose logging enabled');\n    }\n    console.log(`🎯 API Endpoint: ${state.globalLoggingService!.getApiEndpoint()}`);\n    console.log(`📋 Loaded ${await state.globalPatternService!.getPatternsCount()} AI API patterns`);\n    console.log(`🔍 Monitoring mode: ${https !== null ? 'Full (HTTP/HTTPS/Fetch)' : 'Fetch only (Edge runtime)'}`);\n  }\n}\n\n/**\n * Get global monitoring statistics\n */\nexport function getGlobalStats() {\n  const state = getState();\n  return {\n    totalRequests: state.callCounter,\n    interceptedCalls: state.interceptedCalls,\n    apiEndpoint: state.globalLoggingService?.getApiEndpoint() || 'Not initialized',\n    isInitialized: state.isGloballyPatched\n  };\n}\n\n/**\n * Check if global monitoring is active\n */\nexport function isGlobalMonitoringActive(): boolean {\n  return getState().isGloballyPatched;\n}\n\nfunction generateRequestId(options: CoolhandRequestOptions | string | URL, method: string): string {\n  const url = buildURL(options, method.includes('https') ? 'https' : 'http');\n  return `${method.toUpperCase()}:${url}`;\n}\n\nfunction isRequestActive(requestId: string): boolean {\n  const state = getState();\n  const active = state.globalActiveRequests.get(requestId);\n  if (!active) {return false;}\n\n  const now = Date.now();\n  if (now - active.timestamp > DEDUP_WINDOW_MS) {\n    state.globalActiveRequests.delete(requestId);\n    return false;\n  }\n\n  return true;\n}\n\nfunction registerActiveRequest(requestId: string): string {\n  const state = getState();\n  const uniqueId = `${requestId}-${Date.now()}-${Math.random()}`;\n  const now = Date.now();\n\n  const existing = state.globalActiveRequests.get(requestId);\n  if (existing) {\n    existing.requestIds.add(uniqueId);\n  } else {\n    state.globalActiveRequests.set(requestId, {\n      timestamp: now,\n      requestIds: new Set([uniqueId])\n    });\n  }\n\n  return uniqueId;\n}\n\nfunction unregisterActiveRequest(requestId: string, uniqueId: string): void {\n  const state = getState();\n  const active = state.globalActiveRequests.get(requestId);\n  if (active) {\n    active.requestIds.delete(uniqueId);\n    if (active.requestIds.size === 0) {\n      state.globalActiveRequests.delete(requestId);\n    }\n  }\n}\n\nfunction isIdempotentMethod(method: string): boolean {\n  const normalized = method.toUpperCase();\n  return normalized === 'GET' || normalized === 'HEAD';\n}\n\nfunction isRequestLike(value: unknown): value is Request {\n  if (!value || typeof value !== 'object') { return false; }\n  const request = value as Partial<Request>;\n  return typeof request.url === 'string' && typeof request.method === 'string';\n}\n\nfunction headersToRecord(headers: any): Record<string, any> {\n  if (!headers) { return {}; }\n\n  if (typeof Headers !== 'undefined' && headers instanceof Headers) {\n    return Object.fromEntries(headers.entries());\n  }\n\n  if (typeof headers.entries === 'function') {\n    return Object.fromEntries(headers.entries());\n  }\n\n  if (Array.isArray(headers)) {\n    return Object.fromEntries(headers);\n  }\n\n  return { ...headers };\n}\n\nfunction getFetchURL(url: string | URL | Request): string {\n  if (typeof url === 'string') { return url; }\n  if (isRequestLike(url)) { return url.url; }\n  return url.toString();\n}\n\nfunction getFetchMethod(url: string | URL | Request, options: RequestInit): string {\n  return options.method || (isRequestLike(url) ? url.method : 'GET');\n}\n\nfunction getFetchHeaders(url: string | URL | Request, options: RequestInit): Record<string, any> {\n  // init.headers replaces request headers entirely per the fetch spec —\n  // merging would log headers the caller intentionally dropped.\n  if (options.headers !== undefined) {\n    return headersToRecord(options.headers);\n  }\n  return isRequestLike(url) ? headersToRecord(url.headers) : {};\n}\n\nasync function getFetchRequestBody(url: string | URL | Request, options: RequestInit): Promise<string | null> {\n  if (options.body !== undefined) {\n    return options.body !== null ? options.body.toString() : null;\n  }\n\n  if (isRequestLike(url) && typeof url.clone === 'function') {\n    try {\n      return await url.clone().text();\n    } catch {\n      return null;\n    }\n  }\n\n  return null;\n}\n\nfunction patchHTTPS(): void {\n  const originalRequest = https.request;\n  const originalGet = https.get;\n\n  try {\n    const requestDescriptor = Object.getOwnPropertyDescriptor(https, 'request');\n    if (!requestDescriptor || requestDescriptor.configurable !== false) {\n      Object.defineProperty(https, 'request', {\n        value: function(\n          urlOrOptions: CoolhandRequestOptions | string | URL,\n          optionsOrCallback?: CoolhandRequestOptions | ((res: HttpIncomingMessage) => void),\n          extraCallback?: (res: HttpIncomingMessage) => void\n        ) {\n          const { options, callback } = normalizeRequestArgs(urlOrOptions, optionsOrCallback, extraCallback);\n          debugRequest('HTTPS REQUEST', options);\n\n          const { globalPatternService } = getState();\n          if (!globalPatternService) {\n            return originalRequest.call(this, options as any, callback as any);\n          }\n\n          const matchedPattern = globalPatternService.matchesAPIPatternSync(options);\n\n          if (matchedPattern) {\n            const method = typeof options === 'object' && 'method' in options ? options.method || 'GET' : 'GET';\n            const requestId = generateRequestId(options, `https-${method}`);\n\n            if (isIdempotentMethod(method) && isRequestActive(requestId)) {\n              log(`🔄 Skipping duplicate HTTPS request: ${method} ${sanitizeForLog(buildURL(options, 'https'))}`);\n              return originalRequest.call(this, options as any, callback as any);\n            }\n\n            if (isNonInferenceURL(buildURL(options, 'https'), method)) {\n              return originalRequest.call(this, options as any, callback as any);\n            }\n\n            log(`🎯 INTERCEPTING ${matchedPattern.pattern.name} HTTPS call`);\n            return interceptRequest(originalRequest, options, callback, 'https', matchedPattern);\n          }\n\n          return originalRequest.call(this, options as any, callback as any);\n        },\n        writable: true,\n        configurable: true\n      });\n    } else {\n      console.warn('⚠️  Could not patch https.request: property is non-configurable');\n    }\n  } catch {\n    log('Warning: Could not patch https.request');\n  }\n\n  try {\n    const getDescriptor = Object.getOwnPropertyDescriptor(https, 'get');\n    if (!getDescriptor || getDescriptor.configurable !== false) {\n      Object.defineProperty(https, 'get', {\n        value: function(\n          urlOrOptions: CoolhandRequestOptions | string | URL,\n          optionsOrCallback?: CoolhandRequestOptions | ((res: HttpIncomingMessage) => void),\n          extraCallback?: (res: HttpIncomingMessage) => void\n        ) {\n          const { options, callback } = normalizeRequestArgs(urlOrOptions, optionsOrCallback, extraCallback);\n          debugRequest('HTTPS GET', options);\n\n          const { globalPatternService } = getState();\n          if (!globalPatternService) {\n            return originalGet.call(this, options as any, callback as any);\n          }\n\n          const matchedPattern = globalPatternService.matchesAPIPatternSync(options);\n\n          if (matchedPattern) {\n            const requestId = generateRequestId(options, 'https-GET');\n\n            if (isRequestActive(requestId)) {\n              log(`🔄 Skipping duplicate HTTPS GET: ${sanitizeForLog(buildURL(options, 'https'))}`);\n              return originalGet.call(this, options as any, callback as any);\n            }\n\n            if (isNonInferenceURL(buildURL(options, 'https'), 'GET')) {\n              return originalGet.call(this, options as any, callback as any);\n            }\n\n            log(`🎯 INTERCEPTING ${matchedPattern.pattern.name} HTTPS GET`);\n            return interceptRequest(originalRequest, options, callback, 'https', matchedPattern);\n          }\n\n          return originalGet.call(this, options as any, callback as any);\n        },\n        writable: true,\n        configurable: true\n      });\n    } else {\n      console.warn('⚠️  Could not patch https.get: property is non-configurable');\n    }\n  } catch {\n    log('Warning: Could not patch https.get');\n  }\n}\n\nfunction patchHTTP(): void {\n  const originalRequest = http.request;\n  const originalGet = http.get;\n\n  try {\n    const requestDescriptor = Object.getOwnPropertyDescriptor(http, 'request');\n    if (!requestDescriptor || requestDescriptor.configurable !== false) {\n      Object.defineProperty(http, 'request', {\n        value: function(\n          urlOrOptions: CoolhandRequestOptions | string | URL,\n          optionsOrCallback?: CoolhandRequestOptions | ((res: HttpIncomingMessage) => void),\n          extraCallback?: (res: HttpIncomingMessage) => void\n        ) {\n          const { options, callback } = normalizeRequestArgs(urlOrOptions, optionsOrCallback, extraCallback);\n          debugRequest('HTTP REQUEST', options);\n\n          const { globalPatternService } = getState();\n          if (!globalPatternService) {\n            return originalRequest.call(this, options as any, callback as any);\n          }\n\n          const matchedPattern = globalPatternService.matchesAPIPatternSync(options);\n\n          if (matchedPattern) {\n            const method = typeof options === 'object' && 'method' in options ? options.method || 'GET' : 'GET';\n            const requestId = generateRequestId(options, `http-${method}`);\n\n            if (isIdempotentMethod(method) && isRequestActive(requestId)) {\n              log(`🔄 Skipping duplicate HTTP request: ${method} ${sanitizeForLog(buildURL(options, 'http'))}`);\n              return originalRequest.call(this, options as any, callback as any);\n            }\n\n            if (isNonInferenceURL(buildURL(options, 'http'), method)) {\n              return originalRequest.call(this, options as any, callback as any);\n            }\n\n            log(`🎯 INTERCEPTING ${matchedPattern.pattern.name} HTTP call`);\n            return interceptRequest(originalRequest, options, callback, 'http', matchedPattern);\n          }\n\n          return originalRequest.call(this, options as any, callback as any);\n        },\n        writable: true,\n        configurable: true\n      });\n    } else {\n      console.warn('⚠️  Could not patch http.request: property is non-configurable');\n    }\n  } catch {\n    log('Warning: Could not patch http.request');\n  }\n\n  try {\n    const getDescriptor = Object.getOwnPropertyDescriptor(http, 'get');\n    if (!getDescriptor || getDescriptor.configurable !== false) {\n      Object.defineProperty(http, 'get', {\n        value: function(\n          urlOrOptions: CoolhandRequestOptions | string | URL,\n          optionsOrCallback?: CoolhandRequestOptions | ((res: HttpIncomingMessage) => void),\n          extraCallback?: (res: HttpIncomingMessage) => void\n        ) {\n          const { options, callback } = normalizeRequestArgs(urlOrOptions, optionsOrCallback, extraCallback);\n          debugRequest('HTTP GET', options);\n\n          const { globalPatternService } = getState();\n          if (!globalPatternService) {\n            return originalGet.call(this, options as any, callback as any);\n          }\n\n          const matchedPattern = globalPatternService.matchesAPIPatternSync(options);\n\n          if (matchedPattern) {\n            const requestId = generateRequestId(options, 'http-GET');\n\n            if (isRequestActive(requestId)) {\n              log(`🔄 Skipping duplicate HTTP GET: ${sanitizeForLog(buildURL(options, 'http'))}`);\n              return originalGet.call(this, options as any, callback as any);\n            }\n\n            if (isNonInferenceURL(buildURL(options, 'http'), 'GET')) {\n              return originalGet.call(this, options as any, callback as any);\n            }\n\n            log(`🎯 INTERCEPTING ${matchedPattern.pattern.name} HTTP GET`);\n            return interceptRequest(originalRequest, options, callback, 'http', matchedPattern);\n          }\n\n          return originalGet.call(this, options as any, callback as any);\n        },\n        writable: true,\n        configurable: true\n      });\n    } else {\n      console.warn('⚠️  Could not patch http.get: property is non-configurable');\n    }\n  } catch {\n    log('Warning: Could not patch http.get');\n  }\n}\n\nfunction patchFetch(): void {\n  if (typeof globalThis.fetch === 'function') {\n    const originalFetch = globalThis.fetch;\n\n    globalThis.fetch = async function(url: string | URL | Request, options: RequestInit = {}) {\n      const urlStr = getFetchURL(url);\n      debugRequest('FETCH', { url: urlStr, ...options });\n\n      const { globalPatternService } = getState();\n      if (!globalPatternService) {\n        return originalFetch.call(this, url, options);\n      }\n\n      const matchedPattern = globalPatternService.matchesAPIPatternFromURL(urlStr);\n\n      if (matchedPattern) {\n        const method = getFetchMethod(url, options);\n        const requestId = generateRequestId({ url: urlStr }, `fetch-${method}`);\n\n        if (isIdempotentMethod(method) && isRequestActive(requestId)) {\n          log(`🔄 Skipping duplicate FETCH: ${method} ${sanitizeForLog(urlStr)}`);\n          return originalFetch.call(this, url, options);\n        }\n\n        if (isNonInferenceURL(urlStr, method)) {\n          return originalFetch.call(this, url, options);\n        }\n\n        log(`🎯 INTERCEPTING ${matchedPattern.pattern.name} FETCH call`);\n        return interceptFetch(originalFetch, url, options, matchedPattern);\n      }\n\n      return originalFetch.call(this, url, options);\n    };\n  }\n}\n\n\nfunction interceptRequest(\n  originalRequest: any,\n  options: CoolhandRequestOptions | string | URL,\n  callback?: (res: HttpIncomingMessage) => void,\n  protocol: 'https' | 'http' = 'https',\n  matchedPattern?: CoolhandMatchedPattern\n): HttpClientRequest {\n  const state = getState();\n  state.interceptedCalls++;\n\n  const method = typeof options === 'object' && 'method' in options ? options.method || 'GET' : 'GET';\n  const url = buildURL(options, protocol);\n  const requestId = generateRequestId(options, `${protocol}-${method}`);\n  const uniqueId = registerActiveRequest(requestId);\n\n  const callData: CoolhandCallData = {\n    id: state.interceptedCalls,\n    timestamp: new Date().toISOString(),\n    method: method,\n    url: state.globalPatternService?.sanitizeURL(url) ?? url,\n    headers: state.globalPatternService?.sanitizeHeaders(\n      typeof options === 'object' && 'headers' in options ? options.headers || {} : {},\n      matchedPattern?.pattern\n    ) || {},\n    request_body: null,\n    response_body: null,\n    response_headers: null,\n    status_code: null,\n    protocol: protocol\n  };\n\n  log(`📞 Starting API call #${callData.id} to ${callData.url}`);\n\n  let requestBody = '';\n\n  const req = originalRequest(options as any, (res: HttpIncomingMessage) => {\n    log(`📥 Response received for call #${callData.id}, status: ${res.statusCode}`);\n\n    const responseBuffer = new CappedBuffer(MAX_DECOMPRESSED_BYTES, () => {\n      log(`⚠️ Response body for call #${callData.id} exceeded ${MAX_DECOMPRESSED_BYTES} bytes; truncating capture`);\n    });\n\n    // See createResponseTee: hands the host an independent stream so the interceptor's own\n    // capture below can't starve a host callback that consumes `res` asynchronously. Only\n    // created when there's a callback to hand it to — an unread tee must never be constructed,\n    // since createResponseTee's backpressure guard only activates once *something* reads it.\n    // Falls back to the raw `res` only if `stream` somehow failed to load, matching prior\n    // (buggy) behavior rather than dropping the response.\n    const hostStream = (callback && PassThroughCtor) ? createResponseTee(res, PassThroughCtor) : null;\n\n    res.on('data', (chunk: any) => {\n      responseBuffer.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n    });\n\n    res.on('end', async () => {\n      try {\n        const rawBuffer = responseBuffer.concat();\n        const contentEncoding = res.headers?.['content-encoding'];\n        const responseBody = await decompressBuffer(rawBuffer, contentEncoding, log);\n        callData.response_body = parseBody(responseBody);\n      } catch (err: any) {\n        log(`⚠️ Response body capture failed for call #${callData.id}: ${err?.message}`);\n        callData.response_body = null;\n      }\n      const s = getState();\n      callData.response_headers = s.globalPatternService?.sanitizeHeaders(res.headers, matchedPattern?.pattern) || {};\n      callData.status_code = res.statusCode || null;\n\n      // Log to API\n      if (s.globalLoggingService) {\n        s.globalLoggingService.logRequestToAPI(callData, matchedPattern, 'global-monitoring');\n      }\n\n      // Cleanup\n      unregisterActiveRequest(requestId, uniqueId);\n    });\n\n    if (callback) { callback(hostStream || res); }\n  });\n\n  // Intercept request body\n  const originalWrite = req.write.bind(req);\n  const originalEnd = req.end.bind(req);\n\n  req.write = function(chunk: any, encoding?: any, callback?: any) {\n    if (chunk) {\n      requestBody += chunk.toString();\n    }\n    return originalWrite(chunk, encoding, callback);\n  };\n\n  req.end = ((chunk?: any, encoding?: any, callback?: any) => {\n    if (chunk) {\n      requestBody += chunk.toString();\n    }\n    callData.request_body = parseBody(requestBody);\n    log(`📤 Request complete for call #${callData.id}`);\n    return originalEnd(chunk, encoding, callback);\n  });\n\n  req.on('error', (err: Error) => {\n    log(`❌ Request error for call #${callData.id}:`, err.message);\n    unregisterActiveRequest(requestId, uniqueId);\n  });\n\n  return req;\n}\n\nasync function interceptFetch(\n  originalFetch: typeof fetch,\n  url: string | URL | Request,\n  options: RequestInit,\n  matchedPattern?: CoolhandMatchedPattern\n): Promise<Response> {\n  const state = getState();\n  state.interceptedCalls++;\n\n  const method = getFetchMethod(url, options);\n  const urlStr = getFetchURL(url);\n  const requestId = generateRequestId({ url: urlStr }, `fetch-${method}`);\n  const uniqueId = registerActiveRequest(requestId);\n\n  const callData: CoolhandCallData = {\n    id: state.interceptedCalls,\n    timestamp: new Date().toISOString(),\n    method: method,\n    url: state.globalPatternService?.sanitizeURL(urlStr) ?? urlStr,\n    headers: state.globalPatternService?.sanitizeHeaders(\n      getFetchHeaders(url, options),\n      matchedPattern?.pattern\n    ) || {},\n    request_body: null,\n    response_body: null,\n    response_headers: null,\n    status_code: null,\n    protocol: 'fetch'\n  };\n\n  log(`📞 Starting FETCH call #${callData.id} to ${callData.url}`);\n\n  try {\n    // Body capture and the outbound request run concurrently. Using Promise.all\n    // keeps the fetch rejection inside this try/catch from the moment it is\n    // created, closing the unhandledRejection window that would exist if\n    // fetchPromise were started outside the guarded block.\n    const [requestBody, response] = await Promise.all([\n      getFetchRequestBody(url, options),\n      originalFetch.call(globalThis, url, options)\n    ]);\n\n    callData.request_body = parseBody(requestBody);\n    callData.status_code = response.status;\n    callData.response_headers = state.globalPatternService?.sanitizeHeaders(\n      Object.fromEntries(response.headers.entries()),\n      matchedPattern?.pattern\n    ) || {};\n\n    // Clone response to read body without consuming it. Drain and log in the\n    // background so a slow/streaming body doesn't delay the caller's fetch() —\n    // same reasoning as the res.on('data')/'end' handling on the http/https side.\n    const responseClone = response.clone();\n    responseClone\n      .text()\n      .then((responseText) => {\n        callData.response_body = parseBody(responseText);\n      })\n      .catch((err) => {\n        log(`⚠️ Response body capture failed for call #${callData.id}:`, (err as Error)?.message);\n        callData.response_body = null;\n      })\n      .finally(() => {\n        const s = getState();\n        if (s.globalLoggingService) {\n          s.globalLoggingService.logRequestToAPI(callData, matchedPattern, 'global-monitoring');\n        }\n        unregisterActiveRequest(requestId, uniqueId);\n      });\n\n    return response;\n  } catch (error) {\n    log(`❌ Fetch error for call #${callData.id}:`, (error as Error).message);\n    unregisterActiveRequest(requestId, uniqueId);\n    throw error;\n  }\n}\n\nfunction buildURL(options: CoolhandRequestOptions | string | URL | any, protocol: string): string {\n  if (typeof options === 'string') {\n    return options;\n  }\n\n  if (options instanceof URL) {\n    return options.toString();\n  }\n\n  if (options.href) { return options.href; }\n  if (options.url) { return options.url; }\n\n  const hostname = options.hostname || options.host || 'unknown';\n  const path = options.path || '/';\n  const port = options.port ? `:${options.port}` : '';\n\n  return `${protocol}://${hostname}${port}${path}`;\n}\n\nfunction sanitizeForLog(url: string): string {\n  return getState().globalPatternService?.sanitizeURL(url) ?? url;\n}\n\nfunction extractHostname(value: string): string {\n  try {\n    return new URL(value).hostname;\n  } catch {\n    return 'unknown';\n  }\n}\n\nfunction debugRequest(type: string, options: CoolhandRequestOptions | string | URL | any): void {\n  const hostname = typeof options === 'string' ? extractHostname(options) :\n                  options instanceof URL ? options.hostname :\n                  options.hostname || options.host || (typeof options.url === 'string' ? extractHostname(options.url) : undefined) || 'unknown';\n  log(`🌐 ${type} to: ${hostname}`);\n\n  // Count all requests\n  getState().callCounter++;\n}\n\nfunction log(...args: any[]): void {\n  if (!getState().silent) {\n    console.log(...args);\n  }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,oCAAuC;AACvC,4BAA+B;AAC/B,wBAA0B;AAC1B,wBAAyD;AACzD,2BAA6B;AAC7B,kCAAkC;AAClC,0BAAkC;AAClC,oCAAqC;AAOrC,MAAM,gBAAgB,MAAM;AAC1B,SAAQ,OAAQ,WAAmB,gBAAgB,eAC5C,QAAQ,IAAI,iBAAiB,UAC5B,OAAQ,WAAmB,WAAW;AAChD;AAGA,IAAI,QAAa;AACjB,IAAI,OAAY;AAGhB,IAAI,kBAAkD;AAKtD,IAAI,iBAA+C;AACnD,IAAI;AAAE,mBAAkB,QAAgB,QAAQ,EAAE;AAAe,QAAQ;AAA4C;AAOrH,MAAM,oBAAoB,MAAc;AACtC,MAAI;AAAE,WAAO,KAAK,iBAAiB;AAAA,EAAa,QAAQ;AAAA,EAA6B;AACrF,SAAO,QAAQ,IAAI,IAAI;AACzB;AAIA,MAAM,sBAAsB,MAAe;AACzC,MAAI,cAAc,GAAG;AACnB,YAAQ,KAAK,2FAAiF;AAC9F,WAAO;AAAA,EACT;AACA,MAAI,CAAC,gBAAgB;AAAE,WAAO;AAAA,EAAO;AACrC,MAAI;AACF,UAAM,MAAM,eAAe,kBAAkB,CAAC;AAC9C,YAAQ,IAAI,OAAO;AACnB,WAAO,IAAI,MAAM;AACjB,sBAAkB,IAAI,QAAQ,EAAE;AAChC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,MAAM,kBAAkB,YAAY;AAClC,MAAI,cAAc,GAAG;AACnB,YAAQ,KAAK,2FAAiF;AAC9F,WAAO;AAAA,EACT;AAEA,MAAI;AACF,QAAI,cAAc,MAAM,OAAO,OAAO;AACtC,QAAI,aAAa,MAAM,OAAO,MAAM;AAKpC,UAAM,OAAO,OAAO,yBAAyB,aAAa,SAAS;AACnE,QAAI,QAAQ,KAAK,iBAAiB,OAAO;AACvC,UAAI,oFAAoF;AACxF,YAAM,EAAE,eAAe,GAAG,IAAI,MAAM,OAAO,QAAQ;AACnD,YAAM,aAAa,GAAG,kBAAkB,CAAC;AACzC,oBAAc,WAAW,OAAO;AAChC,mBAAa,WAAW,MAAM;AAAA,IAChC;AAEA,YAAQ;AACR,WAAO;AACP,uBAAoB,MAAM,OAAO,QAAQ,GAAW;AAEpD,WAAO;AAAA,EACT,QAAQ;AACN,YAAQ,KAAK,iFAAuE;AACpF,WAAO;AAAA,EACT;AACF;AAMA,MAAM,qBAAqB;AAY3B,SAAS,WAAgC;AACvC,QAAM,IAAI;AACV,MAAI,CAAC,EAAE,kBAAkB,GAAG;AAC1B,MAAE,kBAAkB,IAAI;AAAA,MACtB,sBAAsB;AAAA,MACtB,sBAAsB;AAAA,MACtB,mBAAmB;AAAA,MACnB,aAAa;AAAA,MACb,kBAAkB;AAAA,MAClB,QAAQ;AAAA,MACR,sBAAsB,oBAAI,IAAI;AAAA,IAChC;AAAA,EACF;AACA,SAAO,EAAE,kBAAkB;AAC7B;AAGO,SAAS,oBAA0B;AACxC,SAAQ,WAAmB,kBAAkB;AAC/C;AAEA,MAAM,kBAAkB;AAoBjB,SAAS,yBAAyB,QAAmC;AAC1E,QAAM,QAAQ,SAAS;AACvB,MAAI,MAAM,mBAAmB;AAAE;AAAA,EAAQ;AAEvC,QAAM,SAAS,OAAO,WAAW;AACjC,MAAI,kBAAkB,OAAO;AAG7B,MAAI,OAAO,gBAAgB,QAAW;AACpC,YAAQ;AAAA,MACN;AAAA,IAGF;AACA,QAAI,OAAO,gBAAgB,WAAW,oBAAoB,QAAW;AACnE,wBAAkB;AAAA,IACpB;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,CAAC,OAAO,QAAQ;AAClC,YAAQ;AAAA,MACN;AAAA,IAGF;AAAA,EACF;AAEA,QAAM,uBAAuB,IAAI,qDAAuB,EAAE,oBAAoB,OAAO,cAAc,QAAQ,MAAM,OAAO,CAAC;AACzH,QAAM,uBAAuB,IAAI,qCAAe;AAAA,IAC9C,QAAQ,OAAO;AAAA,IACf,QAAQ,MAAM;AAAA,IACd,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO;AAAA,IACf,SAAS;AAAA,EACX,CAAC;AAED,QAAM,iBAAiB,oBAAoB;AAC3C,MAAI,gBAAgB;AAClB,eAAW;AACX,cAAU;AAAA,EACZ;AACA,aAAW;AACX,QAAM,oBAAoB;AAC5B;AAOA,eAAsB,kCAAiD;AACrE,MAAI,UAAU,MAAM;AAAE;AAAA,EAAQ;AAC9B,MAAI,cAAc,GAAG;AAAE;AAAA,EAAQ;AAC/B,QAAM,iBAAiB,MAAM,gBAAgB;AAC7C,MAAI,gBAAgB;AAClB,eAAW;AACX,cAAU;AAAA,EACZ;AACF;AAMA,eAAsB,2BAA2B,QAA4C;AAC3F,QAAM,QAAQ,SAAS;AAEvB,MAAI,MAAM,mBAAmB;AAC3B,QAAI,8DAAuD;AAC3D;AAAA,EACF;AAEA,2BAAyB,MAAM;AAC/B,QAAM,gCAAgC;AAEtC,MAAI,CAAC,MAAM,QAAQ;AACjB,YAAQ,IAAI,kDAA2C;AACvD,QAAI,OAAO,QAAQ;AACjB,cAAQ,IAAI,6DAAiD;AAAA,IAC/D;AACA,QAAI,OAAO,OAAO;AAChB,cAAQ,IAAI,yDAA6C;AAAA,IAC3D;AACA,YAAQ,IAAI,2BAAoB,MAAM,qBAAsB,eAAe,CAAC,EAAE;AAC9E,YAAQ,IAAI,oBAAa,MAAM,MAAM,qBAAsB,iBAAiB,CAAC,kBAAkB;AAC/F,YAAQ,IAAI,8BAAuB,UAAU,OAAO,4BAA4B,2BAA2B,EAAE;AAAA,EAC/G;AACF;AAKO,SAAS,iBAAiB;AAC/B,QAAM,QAAQ,SAAS;AACvB,SAAO;AAAA,IACL,eAAe,MAAM;AAAA,IACrB,kBAAkB,MAAM;AAAA,IACxB,aAAa,MAAM,sBAAsB,eAAe,KAAK;AAAA,IAC7D,eAAe,MAAM;AAAA,EACvB;AACF;AAKO,SAAS,2BAAoC;AAClD,SAAO,SAAS,EAAE;AACpB;AAEA,SAAS,kBAAkB,SAAgD,QAAwB;AACjG,QAAM,MAAM,SAAS,SAAS,OAAO,SAAS,OAAO,IAAI,UAAU,MAAM;AACzE,SAAO,GAAG,OAAO,YAAY,CAAC,IAAI,GAAG;AACvC;AAEA,SAAS,gBAAgB,WAA4B;AACnD,QAAM,QAAQ,SAAS;AACvB,QAAM,SAAS,MAAM,qBAAqB,IAAI,SAAS;AACvD,MAAI,CAAC,QAAQ;AAAC,WAAO;AAAA,EAAM;AAE3B,QAAM,MAAM,KAAK,IAAI;AACrB,MAAI,MAAM,OAAO,YAAY,iBAAiB;AAC5C,UAAM,qBAAqB,OAAO,SAAS;AAC3C,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,WAA2B;AACxD,QAAM,QAAQ,SAAS;AACvB,QAAM,WAAW,GAAG,SAAS,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC;AAC5D,QAAM,MAAM,KAAK,IAAI;AAErB,QAAM,WAAW,MAAM,qBAAqB,IAAI,SAAS;AACzD,MAAI,UAAU;AACZ,aAAS,WAAW,IAAI,QAAQ;AAAA,EAClC,OAAO;AACL,UAAM,qBAAqB,IAAI,WAAW;AAAA,MACxC,WAAW;AAAA,MACX,YAAY,oBAAI,IAAI,CAAC,QAAQ,CAAC;AAAA,IAChC,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,wBAAwB,WAAmB,UAAwB;AAC1E,QAAM,QAAQ,SAAS;AACvB,QAAM,SAAS,MAAM,qBAAqB,IAAI,SAAS;AACvD,MAAI,QAAQ;AACV,WAAO,WAAW,OAAO,QAAQ;AACjC,QAAI,OAAO,WAAW,SAAS,GAAG;AAChC,YAAM,qBAAqB,OAAO,SAAS;AAAA,IAC7C;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,QAAyB;AACnD,QAAM,aAAa,OAAO,YAAY;AACtC,SAAO,eAAe,SAAS,eAAe;AAChD;AAEA,SAAS,cAAc,OAAkC;AACvD,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AAAE,WAAO;AAAA,EAAO;AACzD,QAAM,UAAU;AAChB,SAAO,OAAO,QAAQ,QAAQ,YAAY,OAAO,QAAQ,WAAW;AACtE;AAEA,SAAS,gBAAgB,SAAmC;AAC1D,MAAI,CAAC,SAAS;AAAE,WAAO,CAAC;AAAA,EAAG;AAE3B,MAAI,OAAO,YAAY,eAAe,mBAAmB,SAAS;AAChE,WAAO,OAAO,YAAY,QAAQ,QAAQ,CAAC;AAAA,EAC7C;AAEA,MAAI,OAAO,QAAQ,YAAY,YAAY;AACzC,WAAO,OAAO,YAAY,QAAQ,QAAQ,CAAC;AAAA,EAC7C;AAEA,MAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,WAAO,OAAO,YAAY,OAAO;AAAA,EACnC;AAEA,SAAO,EAAE,GAAG,QAAQ;AACtB;AAEA,SAAS,YAAY,KAAqC;AACxD,MAAI,OAAO,QAAQ,UAAU;AAAE,WAAO;AAAA,EAAK;AAC3C,MAAI,cAAc,GAAG,GAAG;AAAE,WAAO,IAAI;AAAA,EAAK;AAC1C,SAAO,IAAI,SAAS;AACtB;AAEA,SAAS,eAAe,KAA6B,SAA8B;AACjF,SAAO,QAAQ,WAAW,cAAc,GAAG,IAAI,IAAI,SAAS;AAC9D;AAEA,SAAS,gBAAgB,KAA6B,SAA2C;AAG/F,MAAI,QAAQ,YAAY,QAAW;AACjC,WAAO,gBAAgB,QAAQ,OAAO;AAAA,EACxC;AACA,SAAO,cAAc,GAAG,IAAI,gBAAgB,IAAI,OAAO,IAAI,CAAC;AAC9D;AAEA,eAAe,oBAAoB,KAA6B,SAA8C;AAC5G,MAAI,QAAQ,SAAS,QAAW;AAC9B,WAAO,QAAQ,SAAS,OAAO,QAAQ,KAAK,SAAS,IAAI;AAAA,EAC3D;AAEA,MAAI,cAAc,GAAG,KAAK,OAAO,IAAI,UAAU,YAAY;AACzD,QAAI;AACF,aAAO,MAAM,IAAI,MAAM,EAAE,KAAK;AAAA,IAChC,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,aAAmB;AAC1B,QAAM,kBAAkB,MAAM;AAC9B,QAAM,cAAc,MAAM;AAE1B,MAAI;AACF,UAAM,oBAAoB,OAAO,yBAAyB,OAAO,SAAS;AAC1E,QAAI,CAAC,qBAAqB,kBAAkB,iBAAiB,OAAO;AAClE,aAAO,eAAe,OAAO,WAAW;AAAA,QACtC,OAAO,SACL,cACA,mBACA,eACA;AACA,gBAAM,EAAE,SAAS,SAAS,QAAI,oDAAqB,cAAc,mBAAmB,aAAa;AACjG,uBAAa,iBAAiB,OAAO;AAErC,gBAAM,EAAE,qBAAqB,IAAI,SAAS;AAC1C,cAAI,CAAC,sBAAsB;AACzB,mBAAO,gBAAgB,KAAK,MAAM,SAAgB,QAAe;AAAA,UACnE;AAEA,gBAAM,iBAAiB,qBAAqB,sBAAsB,OAAO;AAEzE,cAAI,gBAAgB;AAClB,kBAAM,SAAS,OAAO,YAAY,YAAY,YAAY,UAAU,QAAQ,UAAU,QAAQ;AAC9F,kBAAM,YAAY,kBAAkB,SAAS,SAAS,MAAM,EAAE;AAE9D,gBAAI,mBAAmB,MAAM,KAAK,gBAAgB,SAAS,GAAG;AAC5D,kBAAI,+CAAwC,MAAM,IAAI,eAAe,SAAS,SAAS,OAAO,CAAC,CAAC,EAAE;AAClG,qBAAO,gBAAgB,KAAK,MAAM,SAAgB,QAAe;AAAA,YACnE;AAEA,oBAAI,+CAAkB,SAAS,SAAS,OAAO,GAAG,MAAM,GAAG;AACzD,qBAAO,gBAAgB,KAAK,MAAM,SAAgB,QAAe;AAAA,YACnE;AAEA,gBAAI,0BAAmB,eAAe,QAAQ,IAAI,aAAa;AAC/D,mBAAO,iBAAiB,iBAAiB,SAAS,UAAU,SAAS,cAAc;AAAA,UACrF;AAEA,iBAAO,gBAAgB,KAAK,MAAM,SAAgB,QAAe;AAAA,QACnE;AAAA,QACA,UAAU;AAAA,QACV,cAAc;AAAA,MAChB,CAAC;AAAA,IACH,OAAO;AACL,cAAQ,KAAK,2EAAiE;AAAA,IAChF;AAAA,EACF,QAAQ;AACN,QAAI,wCAAwC;AAAA,EAC9C;AAEA,MAAI;AACF,UAAM,gBAAgB,OAAO,yBAAyB,OAAO,KAAK;AAClE,QAAI,CAAC,iBAAiB,cAAc,iBAAiB,OAAO;AAC1D,aAAO,eAAe,OAAO,OAAO;AAAA,QAClC,OAAO,SACL,cACA,mBACA,eACA;AACA,gBAAM,EAAE,SAAS,SAAS,QAAI,oDAAqB,cAAc,mBAAmB,aAAa;AACjG,uBAAa,aAAa,OAAO;AAEjC,gBAAM,EAAE,qBAAqB,IAAI,SAAS;AAC1C,cAAI,CAAC,sBAAsB;AACzB,mBAAO,YAAY,KAAK,MAAM,SAAgB,QAAe;AAAA,UAC/D;AAEA,gBAAM,iBAAiB,qBAAqB,sBAAsB,OAAO;AAEzE,cAAI,gBAAgB;AAClB,kBAAM,YAAY,kBAAkB,SAAS,WAAW;AAExD,gBAAI,gBAAgB,SAAS,GAAG;AAC9B,kBAAI,2CAAoC,eAAe,SAAS,SAAS,OAAO,CAAC,CAAC,EAAE;AACpF,qBAAO,YAAY,KAAK,MAAM,SAAgB,QAAe;AAAA,YAC/D;AAEA,oBAAI,+CAAkB,SAAS,SAAS,OAAO,GAAG,KAAK,GAAG;AACxD,qBAAO,YAAY,KAAK,MAAM,SAAgB,QAAe;AAAA,YAC/D;AAEA,gBAAI,0BAAmB,eAAe,QAAQ,IAAI,YAAY;AAC9D,mBAAO,iBAAiB,iBAAiB,SAAS,UAAU,SAAS,cAAc;AAAA,UACrF;AAEA,iBAAO,YAAY,KAAK,MAAM,SAAgB,QAAe;AAAA,QAC/D;AAAA,QACA,UAAU;AAAA,QACV,cAAc;AAAA,MAChB,CAAC;AAAA,IACH,OAAO;AACL,cAAQ,KAAK,uEAA6D;AAAA,IAC5E;AAAA,EACF,QAAQ;AACN,QAAI,oCAAoC;AAAA,EAC1C;AACF;AAEA,SAAS,YAAkB;AACzB,QAAM,kBAAkB,KAAK;AAC7B,QAAM,cAAc,KAAK;AAEzB,MAAI;AACF,UAAM,oBAAoB,OAAO,yBAAyB,MAAM,SAAS;AACzE,QAAI,CAAC,qBAAqB,kBAAkB,iBAAiB,OAAO;AAClE,aAAO,eAAe,MAAM,WAAW;AAAA,QACrC,OAAO,SACL,cACA,mBACA,eACA;AACA,gBAAM,EAAE,SAAS,SAAS,QAAI,oDAAqB,cAAc,mBAAmB,aAAa;AACjG,uBAAa,gBAAgB,OAAO;AAEpC,gBAAM,EAAE,qBAAqB,IAAI,SAAS;AAC1C,cAAI,CAAC,sBAAsB;AACzB,mBAAO,gBAAgB,KAAK,MAAM,SAAgB,QAAe;AAAA,UACnE;AAEA,gBAAM,iBAAiB,qBAAqB,sBAAsB,OAAO;AAEzE,cAAI,gBAAgB;AAClB,kBAAM,SAAS,OAAO,YAAY,YAAY,YAAY,UAAU,QAAQ,UAAU,QAAQ;AAC9F,kBAAM,YAAY,kBAAkB,SAAS,QAAQ,MAAM,EAAE;AAE7D,gBAAI,mBAAmB,MAAM,KAAK,gBAAgB,SAAS,GAAG;AAC5D,kBAAI,8CAAuC,MAAM,IAAI,eAAe,SAAS,SAAS,MAAM,CAAC,CAAC,EAAE;AAChG,qBAAO,gBAAgB,KAAK,MAAM,SAAgB,QAAe;AAAA,YACnE;AAEA,oBAAI,+CAAkB,SAAS,SAAS,MAAM,GAAG,MAAM,GAAG;AACxD,qBAAO,gBAAgB,KAAK,MAAM,SAAgB,QAAe;AAAA,YACnE;AAEA,gBAAI,0BAAmB,eAAe,QAAQ,IAAI,YAAY;AAC9D,mBAAO,iBAAiB,iBAAiB,SAAS,UAAU,QAAQ,cAAc;AAAA,UACpF;AAEA,iBAAO,gBAAgB,KAAK,MAAM,SAAgB,QAAe;AAAA,QACnE;AAAA,QACA,UAAU;AAAA,QACV,cAAc;AAAA,MAChB,CAAC;AAAA,IACH,OAAO;AACL,cAAQ,KAAK,0EAAgE;AAAA,IAC/E;AAAA,EACF,QAAQ;AACN,QAAI,uCAAuC;AAAA,EAC7C;AAEA,MAAI;AACF,UAAM,gBAAgB,OAAO,yBAAyB,MAAM,KAAK;AACjE,QAAI,CAAC,iBAAiB,cAAc,iBAAiB,OAAO;AAC1D,aAAO,eAAe,MAAM,OAAO;AAAA,QACjC,OAAO,SACL,cACA,mBACA,eACA;AACA,gBAAM,EAAE,SAAS,SAAS,QAAI,oDAAqB,cAAc,mBAAmB,aAAa;AACjG,uBAAa,YAAY,OAAO;AAEhC,gBAAM,EAAE,qBAAqB,IAAI,SAAS;AAC1C,cAAI,CAAC,sBAAsB;AACzB,mBAAO,YAAY,KAAK,MAAM,SAAgB,QAAe;AAAA,UAC/D;AAEA,gBAAM,iBAAiB,qBAAqB,sBAAsB,OAAO;AAEzE,cAAI,gBAAgB;AAClB,kBAAM,YAAY,kBAAkB,SAAS,UAAU;AAEvD,gBAAI,gBAAgB,SAAS,GAAG;AAC9B,kBAAI,0CAAmC,eAAe,SAAS,SAAS,MAAM,CAAC,CAAC,EAAE;AAClF,qBAAO,YAAY,KAAK,MAAM,SAAgB,QAAe;AAAA,YAC/D;AAEA,oBAAI,+CAAkB,SAAS,SAAS,MAAM,GAAG,KAAK,GAAG;AACvD,qBAAO,YAAY,KAAK,MAAM,SAAgB,QAAe;AAAA,YAC/D;AAEA,gBAAI,0BAAmB,eAAe,QAAQ,IAAI,WAAW;AAC7D,mBAAO,iBAAiB,iBAAiB,SAAS,UAAU,QAAQ,cAAc;AAAA,UACpF;AAEA,iBAAO,YAAY,KAAK,MAAM,SAAgB,QAAe;AAAA,QAC/D;AAAA,QACA,UAAU;AAAA,QACV,cAAc;AAAA,MAChB,CAAC;AAAA,IACH,OAAO;AACL,cAAQ,KAAK,sEAA4D;AAAA,IAC3E;AAAA,EACF,QAAQ;AACN,QAAI,mCAAmC;AAAA,EACzC;AACF;AAEA,SAAS,aAAmB;AAC1B,MAAI,OAAO,WAAW,UAAU,YAAY;AAC1C,UAAM,gBAAgB,WAAW;AAEjC,eAAW,QAAQ,eAAe,KAA6B,UAAuB,CAAC,GAAG;AACxF,YAAM,SAAS,YAAY,GAAG;AAC9B,mBAAa,SAAS,EAAE,KAAK,QAAQ,GAAG,QAAQ,CAAC;AAEjD,YAAM,EAAE,qBAAqB,IAAI,SAAS;AAC1C,UAAI,CAAC,sBAAsB;AACzB,eAAO,cAAc,KAAK,MAAM,KAAK,OAAO;AAAA,MAC9C;AAEA,YAAM,iBAAiB,qBAAqB,yBAAyB,MAAM;AAE3E,UAAI,gBAAgB;AAClB,cAAM,SAAS,eAAe,KAAK,OAAO;AAC1C,cAAM,YAAY,kBAAkB,EAAE,KAAK,OAAO,GAAG,SAAS,MAAM,EAAE;AAEtE,YAAI,mBAAmB,MAAM,KAAK,gBAAgB,SAAS,GAAG;AAC5D,cAAI,uCAAgC,MAAM,IAAI,eAAe,MAAM,CAAC,EAAE;AACtE,iBAAO,cAAc,KAAK,MAAM,KAAK,OAAO;AAAA,QAC9C;AAEA,gBAAI,+CAAkB,QAAQ,MAAM,GAAG;AACrC,iBAAO,cAAc,KAAK,MAAM,KAAK,OAAO;AAAA,QAC9C;AAEA,YAAI,0BAAmB,eAAe,QAAQ,IAAI,aAAa;AAC/D,eAAO,eAAe,eAAe,KAAK,SAAS,cAAc;AAAA,MACnE;AAEA,aAAO,cAAc,KAAK,MAAM,KAAK,OAAO;AAAA,IAC9C;AAAA,EACF;AACF;AAGA,SAAS,iBACP,iBACA,SACA,UACA,WAA6B,SAC7B,gBACmB;AACnB,QAAM,QAAQ,SAAS;AACvB,QAAM;AAEN,QAAM,SAAS,OAAO,YAAY,YAAY,YAAY,UAAU,QAAQ,UAAU,QAAQ;AAC9F,QAAM,MAAM,SAAS,SAAS,QAAQ;AACtC,QAAM,YAAY,kBAAkB,SAAS,GAAG,QAAQ,IAAI,MAAM,EAAE;AACpE,QAAM,WAAW,sBAAsB,SAAS;AAEhD,QAAM,WAA6B;AAAA,IACjC,IAAI,MAAM;AAAA,IACV,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC;AAAA,IACA,KAAK,MAAM,sBAAsB,YAAY,GAAG,KAAK;AAAA,IACrD,SAAS,MAAM,sBAAsB;AAAA,MACnC,OAAO,YAAY,YAAY,aAAa,UAAU,QAAQ,WAAW,CAAC,IAAI,CAAC;AAAA,MAC/E,gBAAgB;AAAA,IAClB,KAAK,CAAC;AAAA,IACN,cAAc;AAAA,IACd,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,aAAa;AAAA,IACb;AAAA,EACF;AAEA,MAAI,gCAAyB,SAAS,EAAE,OAAO,SAAS,GAAG,EAAE;AAE7D,MAAI,cAAc;AAElB,QAAM,MAAM,gBAAgB,SAAgB,CAAC,QAA6B;AACxE,QAAI,yCAAkC,SAAS,EAAE,aAAa,IAAI,UAAU,EAAE;AAE9E,UAAM,iBAAiB,IAAI,kCAAa,0CAAwB,MAAM;AACpE,UAAI,wCAA8B,SAAS,EAAE,aAAa,wCAAsB,4BAA4B;AAAA,IAC9G,CAAC;AAQD,UAAM,aAAc,YAAY,sBAAmB,uCAAkB,KAAK,eAAe,IAAI;AAE7F,QAAI,GAAG,QAAQ,CAAC,UAAe;AAC7B,qBAAe,KAAK,OAAO,SAAS,KAAK,IAAI,QAAQ,OAAO,KAAK,KAAK,CAAC;AAAA,IACzE,CAAC;AAED,QAAI,GAAG,OAAO,YAAY;AACxB,UAAI;AACF,cAAM,YAAY,eAAe,OAAO;AACxC,cAAM,kBAAkB,IAAI,UAAU,kBAAkB;AACxD,cAAM,eAAe,UAAM,oCAAiB,WAAW,iBAAiB,GAAG;AAC3E,iBAAS,oBAAgB,6BAAU,YAAY;AAAA,MACjD,SAAS,KAAU;AACjB,YAAI,uDAA6C,SAAS,EAAE,KAAK,KAAK,OAAO,EAAE;AAC/E,iBAAS,gBAAgB;AAAA,MAC3B;AACA,YAAM,IAAI,SAAS;AACnB,eAAS,mBAAmB,EAAE,sBAAsB,gBAAgB,IAAI,SAAS,gBAAgB,OAAO,KAAK,CAAC;AAC9G,eAAS,cAAc,IAAI,cAAc;AAGzC,UAAI,EAAE,sBAAsB;AAC1B,UAAE,qBAAqB,gBAAgB,UAAU,gBAAgB,mBAAmB;AAAA,MACtF;AAGA,8BAAwB,WAAW,QAAQ;AAAA,IAC7C,CAAC;AAED,QAAI,UAAU;AAAE,eAAS,cAAc,GAAG;AAAA,IAAG;AAAA,EAC/C,CAAC;AAGD,QAAM,gBAAgB,IAAI,MAAM,KAAK,GAAG;AACxC,QAAM,cAAc,IAAI,IAAI,KAAK,GAAG;AAEpC,MAAI,QAAQ,SAAS,OAAY,UAAgBA,WAAgB;AAC/D,QAAI,OAAO;AACT,qBAAe,MAAM,SAAS;AAAA,IAChC;AACA,WAAO,cAAc,OAAO,UAAUA,SAAQ;AAAA,EAChD;AAEA,MAAI,OAAO,CAAC,OAAa,UAAgBA,cAAmB;AAC1D,QAAI,OAAO;AACT,qBAAe,MAAM,SAAS;AAAA,IAChC;AACA,aAAS,mBAAe,6BAAU,WAAW;AAC7C,QAAI,wCAAiC,SAAS,EAAE,EAAE;AAClD,WAAO,YAAY,OAAO,UAAUA,SAAQ;AAAA,EAC9C;AAEA,MAAI,GAAG,SAAS,CAAC,QAAe;AAC9B,QAAI,kCAA6B,SAAS,EAAE,KAAK,IAAI,OAAO;AAC5D,4BAAwB,WAAW,QAAQ;AAAA,EAC7C,CAAC;AAED,SAAO;AACT;AAEA,eAAe,eACb,eACA,KACA,SACA,gBACmB;AACnB,QAAM,QAAQ,SAAS;AACvB,QAAM;AAEN,QAAM,SAAS,eAAe,KAAK,OAAO;AAC1C,QAAM,SAAS,YAAY,GAAG;AAC9B,QAAM,YAAY,kBAAkB,EAAE,KAAK,OAAO,GAAG,SAAS,MAAM,EAAE;AACtE,QAAM,WAAW,sBAAsB,SAAS;AAEhD,QAAM,WAA6B;AAAA,IACjC,IAAI,MAAM;AAAA,IACV,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC;AAAA,IACA,KAAK,MAAM,sBAAsB,YAAY,MAAM,KAAK;AAAA,IACxD,SAAS,MAAM,sBAAsB;AAAA,MACnC,gBAAgB,KAAK,OAAO;AAAA,MAC5B,gBAAgB;AAAA,IAClB,KAAK,CAAC;AAAA,IACN,cAAc;AAAA,IACd,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAEA,MAAI,kCAA2B,SAAS,EAAE,OAAO,SAAS,GAAG,EAAE;AAE/D,MAAI;AAKF,UAAM,CAAC,aAAa,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,MAChD,oBAAoB,KAAK,OAAO;AAAA,MAChC,cAAc,KAAK,YAAY,KAAK,OAAO;AAAA,IAC7C,CAAC;AAED,aAAS,mBAAe,6BAAU,WAAW;AAC7C,aAAS,cAAc,SAAS;AAChC,aAAS,mBAAmB,MAAM,sBAAsB;AAAA,MACtD,OAAO,YAAY,SAAS,QAAQ,QAAQ,CAAC;AAAA,MAC7C,gBAAgB;AAAA,IAClB,KAAK,CAAC;AAKN,UAAM,gBAAgB,SAAS,MAAM;AACrC,kBACG,KAAK,EACL,KAAK,CAAC,iBAAiB;AACtB,eAAS,oBAAgB,6BAAU,YAAY;AAAA,IACjD,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,UAAI,uDAA6C,SAAS,EAAE,KAAM,KAAe,OAAO;AACxF,eAAS,gBAAgB;AAAA,IAC3B,CAAC,EACA,QAAQ,MAAM;AACb,YAAM,IAAI,SAAS;AACnB,UAAI,EAAE,sBAAsB;AAC1B,UAAE,qBAAqB,gBAAgB,UAAU,gBAAgB,mBAAmB;AAAA,MACtF;AACA,8BAAwB,WAAW,QAAQ;AAAA,IAC7C,CAAC;AAEH,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI,gCAA2B,SAAS,EAAE,KAAM,MAAgB,OAAO;AACvE,4BAAwB,WAAW,QAAQ;AAC3C,UAAM;AAAA,EACR;AACF;AAEA,SAAS,SAAS,SAAsD,UAA0B;AAChG,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO;AAAA,EACT;AAEA,MAAI,mBAAmB,KAAK;AAC1B,WAAO,QAAQ,SAAS;AAAA,EAC1B;AAEA,MAAI,QAAQ,MAAM;AAAE,WAAO,QAAQ;AAAA,EAAM;AACzC,MAAI,QAAQ,KAAK;AAAE,WAAO,QAAQ;AAAA,EAAK;AAEvC,QAAM,WAAW,QAAQ,YAAY,QAAQ,QAAQ;AACrD,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,OAAO,QAAQ,OAAO,IAAI,QAAQ,IAAI,KAAK;AAEjD,SAAO,GAAG,QAAQ,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI;AAChD;AAEA,SAAS,eAAe,KAAqB;AAC3C,SAAO,SAAS,EAAE,sBAAsB,YAAY,GAAG,KAAK;AAC9D;AAEA,SAAS,gBAAgB,OAAuB;AAC9C,MAAI;AACF,WAAO,IAAI,IAAI,KAAK,EAAE;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,aAAa,MAAc,SAA4D;AAC9F,QAAM,WAAW,OAAO,YAAY,WAAW,gBAAgB,OAAO,IACtD,mBAAmB,MAAM,QAAQ,WACjC,QAAQ,YAAY,QAAQ,SAAS,OAAO,QAAQ,QAAQ,WAAW,gBAAgB,QAAQ,GAAG,IAAI,WAAc;AACpI,MAAI,aAAM,IAAI,QAAQ,QAAQ,EAAE;AAGhC,WAAS,EAAE;AACb;AAEA,SAAS,OAAO,MAAmB;AACjC,MAAI,CAAC,SAAS,EAAE,QAAQ;AACtB,YAAQ,IAAI,GAAG,IAAI;AAAA,EACrB;AACF;","names":["callback"]}