{"version":3,"sources":["../../src/cache/MemoryCache.ts","../../src/cache/LRUCache.ts","../../src/cache/RequestDeduplicator.ts","../../src/utils/logger.ts","../../src/cache/CacheManager.ts"],"names":["EventEmitter"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Memory-based cache implementation\n * Provides simple in-memory caching with TTL support\n */\n\nexport interface CacheEntry<T> {\n  value: T;\n  expiresAt: number;\n  size: number;\n}\n\nexport interface MemoryCacheOptions {\n  maxSize?: number; // Maximum number of entries\n  defaultTTL?: number; // Default TTL in milliseconds\n}\n\nexport class MemoryCache<T = any> {\n  private cache: Map<string, CacheEntry<T>>;\n  private maxSize: number;\n  private defaultTTL: number;\n\n  constructor(options: MemoryCacheOptions = {}) {\n    this.cache = new Map();\n    this.maxSize = options.maxSize || 1000;\n    this.defaultTTL = options.defaultTTL || 600000; // 10 minutes\n  }\n\n  /**\n   * Set a value in the cache\n   */\n  set(key: string, value: T, ttl?: number): void {\n    // Evict if at capacity\n    if (this.cache.size >= this.maxSize && !this.cache.has(key)) {\n      this.evictOldest();\n    }\n\n    const expiresAt = Date.now() + (ttl || this.defaultTTL);\n    const size = this.estimateSize(value);\n\n    this.cache.set(key, {\n      value,\n      expiresAt,\n      size,\n    });\n  }\n\n  /**\n   * Get a value from the cache\n   */\n  get(key: string): T | null {\n    const entry = this.cache.get(key);\n\n    if (!entry) {\n      return null;\n    }\n\n    // Check if expired\n    if (Date.now() > entry.expiresAt) {\n      this.cache.delete(key);\n      return null;\n    }\n\n    return entry.value;\n  }\n\n  /**\n   * Check if key exists and is not expired\n   */\n  has(key: string): boolean {\n    const entry = this.cache.get(key);\n\n    if (!entry) {\n      return false;\n    }\n\n    if (Date.now() > entry.expiresAt) {\n      this.cache.delete(key);\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * Delete a key from the cache\n   */\n  delete(key: string): boolean {\n    return this.cache.delete(key);\n  }\n\n  /**\n   * Clear all entries\n   */\n  clear(): void {\n    this.cache.clear();\n  }\n\n  /**\n   * Get cache size\n   */\n  size(): number {\n    return this.cache.size;\n  }\n\n  /**\n   * Get all keys\n   */\n  keys(): string[] {\n    return Array.from(this.cache.keys());\n  }\n\n  /**\n   * Remove expired entries\n   */\n  cleanup(): number {\n    const now = Date.now();\n    let removed = 0;\n\n    for (const [key, entry] of this.cache.entries()) {\n      if (now > entry.expiresAt) {\n        this.cache.delete(key);\n        removed++;\n      }\n    }\n\n    return removed;\n  }\n\n  /**\n   * Get cache statistics\n   */\n  getStats(): {\n    size: number;\n    maxSize: number;\n    totalSize: number;\n    oldestEntry: number | null;\n    newestEntry: number | null;\n  } {\n    let totalSize = 0;\n    let oldestEntry: number | null = null;\n    let newestEntry: number | null = null;\n\n    for (const entry of this.cache.values()) {\n      totalSize += entry.size;\n\n      if (oldestEntry === null || entry.expiresAt < oldestEntry) {\n        oldestEntry = entry.expiresAt;\n      }\n\n      if (newestEntry === null || entry.expiresAt > newestEntry) {\n        newestEntry = entry.expiresAt;\n      }\n    }\n\n    return {\n      size: this.cache.size,\n      maxSize: this.maxSize,\n      totalSize,\n      oldestEntry,\n      newestEntry,\n    };\n  }\n\n  /**\n   * Evict the oldest entry\n   */\n  private evictOldest(): void {\n    let oldestKey: string | null = null;\n    let oldestTime = Infinity;\n\n    for (const [key, entry] of this.cache.entries()) {\n      if (entry.expiresAt < oldestTime) {\n        oldestTime = entry.expiresAt;\n        oldestKey = key;\n      }\n    }\n\n    if (oldestKey) {\n      this.cache.delete(oldestKey);\n    }\n  }\n\n  /**\n   * Estimate size of value in bytes\n   */\n  private estimateSize(value: T): number {\n    try {\n      return JSON.stringify(value).length;\n    } catch {\n      return 1; // Fallback for non-serializable values\n    }\n  }\n}\n","/**\n * LRU (Least Recently Used) Cache Implementation\n * Evicts least recently used entries when capacity is reached\n */\n\nexport interface LRUCacheOptions {\n  maxSize?: number; // Maximum number of entries\n  maxMemory?: number; // Maximum memory in bytes\n  defaultTTL?: number; // Default TTL in milliseconds\n}\n\ninterface LRUNode<T> {\n  key: string;\n  value: T;\n  expiresAt: number;\n  size: number;\n  prev: LRUNode<T> | null;\n  next: LRUNode<T> | null;\n}\n\nexport class LRUCache<T = any> {\n  private cache: Map<string, LRUNode<T>>;\n  private head: LRUNode<T> | null;\n  private tail: LRUNode<T> | null;\n  private maxSize: number;\n  private maxMemory: number;\n  private currentMemory: number;\n  private defaultTTL: number;\n\n  constructor(options: LRUCacheOptions = {}) {\n    this.cache = new Map();\n    this.head = null;\n    this.tail = null;\n    this.maxSize = options.maxSize || 1000;\n    this.maxMemory = options.maxMemory || 50 * 1024 * 1024; // 50MB default\n    this.currentMemory = 0;\n    this.defaultTTL = options.defaultTTL || 600000; // 10 minutes\n  }\n\n  /**\n   * Set a value in the cache\n   */\n  set(key: string, value: T, ttl?: number): void {\n    const size = this.estimateSize(value);\n    const expiresAt = Date.now() + (ttl || this.defaultTTL);\n\n    // If key exists, remove old node\n    if (this.cache.has(key)) {\n      this.remove(key);\n    }\n\n    // Evict until we have space\n    while (\n      (this.cache.size >= this.maxSize || this.currentMemory + size > this.maxMemory) &&\n      this.tail\n    ) {\n      this.removeTail();\n    }\n\n    // Create new node\n    const node: LRUNode<T> = {\n      key,\n      value,\n      expiresAt,\n      size,\n      prev: null,\n      next: null,\n    };\n\n    this.cache.set(key, node);\n    this.addToHead(node);\n    this.currentMemory += size;\n  }\n\n  /**\n   * Get a value from the cache\n   */\n  get(key: string): T | null {\n    const node = this.cache.get(key);\n\n    if (!node) {\n      return null;\n    }\n\n    // Check if expired\n    if (Date.now() > node.expiresAt) {\n      this.remove(key);\n      return null;\n    }\n\n    // Move to head (most recently used)\n    this.moveToHead(node);\n\n    return node.value;\n  }\n\n  /**\n   * Check if key exists and is not expired\n   */\n  has(key: string): boolean {\n    const node = this.cache.get(key);\n\n    if (!node) {\n      return false;\n    }\n\n    if (Date.now() > node.expiresAt) {\n      this.remove(key);\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * Delete a key from the cache\n   */\n  delete(key: string): boolean {\n    return this.remove(key);\n  }\n\n  /**\n   * Clear all entries\n   */\n  clear(): void {\n    this.cache.clear();\n    this.head = null;\n    this.tail = null;\n    this.currentMemory = 0;\n  }\n\n  /**\n   * Get cache size\n   */\n  size(): number {\n    return this.cache.size;\n  }\n\n  /**\n   * Get all keys (from most to least recently used)\n   */\n  keys(): string[] {\n    const keys: string[] = [];\n    let current = this.head;\n\n    while (current) {\n      keys.push(current.key);\n      current = current.next;\n    }\n\n    return keys;\n  }\n\n  /**\n   * Remove expired entries\n   */\n  cleanup(): number {\n    const now = Date.now();\n    let removed = 0;\n    const keysToRemove: string[] = [];\n\n    for (const [key, node] of this.cache.entries()) {\n      if (now > node.expiresAt) {\n        keysToRemove.push(key);\n      }\n    }\n\n    for (const key of keysToRemove) {\n      this.remove(key);\n      removed++;\n    }\n\n    return removed;\n  }\n\n  /**\n   * Get cache statistics\n   */\n  getStats(): {\n    size: number;\n    maxSize: number;\n    memoryUsed: number;\n    maxMemory: number;\n    hitRate?: number;\n  } {\n    return {\n      size: this.cache.size,\n      maxSize: this.maxSize,\n      memoryUsed: this.currentMemory,\n      maxMemory: this.maxMemory,\n    };\n  }\n\n  /**\n   * Add node to head of list\n   */\n  private addToHead(node: LRUNode<T>): void {\n    node.next = this.head;\n    node.prev = null;\n\n    if (this.head) {\n      this.head.prev = node;\n    }\n\n    this.head = node;\n\n    if (!this.tail) {\n      this.tail = node;\n    }\n  }\n\n  /**\n   * Remove node from list\n   */\n  private removeNode(node: LRUNode<T>): void {\n    if (node.prev) {\n      node.prev.next = node.next;\n    } else {\n      this.head = node.next;\n    }\n\n    if (node.next) {\n      node.next.prev = node.prev;\n    } else {\n      this.tail = node.prev;\n    }\n  }\n\n  /**\n   * Move node to head of list\n   */\n  private moveToHead(node: LRUNode<T>): void {\n    this.removeNode(node);\n    this.addToHead(node);\n  }\n\n  /**\n   * Remove tail (least recently used)\n   */\n  private removeTail(): void {\n    if (!this.tail) {\n      return;\n    }\n\n    const key = this.tail.key;\n    this.remove(key);\n  }\n\n  /**\n   * Remove a key from cache\n   */\n  private remove(key: string): boolean {\n    const node = this.cache.get(key);\n\n    if (!node) {\n      return false;\n    }\n\n    this.removeNode(node);\n    this.cache.delete(key);\n    this.currentMemory -= node.size;\n\n    return true;\n  }\n\n  /**\n   * Estimate size of value in bytes\n   */\n  private estimateSize(value: T): number {\n    try {\n      return JSON.stringify(value).length;\n    } catch {\n      return 1;\n    }\n  }\n}\n","/**\n * Request Deduplicator\n * Prevents duplicate concurrent requests for the same data\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport crypto from 'crypto';\n\nexport interface DeduplicationOptions {\n  enabled?: boolean;\n  ttl?: number; // How long to deduplicate (ms)\n  maxPendingRequests?: number;\n}\n\ninterface PendingRequest<T> {\n  promise: Promise<T>;\n  timestamp: number;\n  resolvers: Array<(value: T) => void>;\n  rejectors: Array<(error: Error) => void>;\n}\n\nexport class RequestDeduplicator extends EventEmitter {\n  private pendingRequests: Map<string, PendingRequest<any>>;\n  private enabled: boolean;\n  private ttl: number;\n  private maxPendingRequests: number;\n  private stats: {\n    totalRequests: number;\n    deduplicatedRequests: number;\n    activeDeduplications: number;\n  };\n\n  constructor(options: DeduplicationOptions = {}) {\n    super();\n    this.pendingRequests = new Map();\n    this.enabled = options.enabled !== false;\n    this.ttl = options.ttl || 5000; // 5 seconds default\n    this.maxPendingRequests = options.maxPendingRequests || 1000;\n    this.stats = {\n      totalRequests: 0,\n      deduplicatedRequests: 0,\n      activeDeduplications: 0,\n    };\n  }\n\n  /**\n   * Execute a request with deduplication\n   */\n  async execute<T>(\n    key: string | object,\n    executor: () => Promise<T>,\n    options?: { ttl?: number },\n  ): Promise<T> {\n    this.stats.totalRequests++;\n\n    if (!this.enabled) {\n      return executor();\n    }\n\n    const cacheKey = this.generateKey(key);\n    const pending = this.pendingRequests.get(cacheKey);\n\n    // If there's a pending request, wait for it\n    if (pending) {\n      this.stats.deduplicatedRequests++;\n      this.emit('deduplicated', { key: cacheKey });\n\n      // Return a promise that resolves when the original request completes\n      return new Promise<T>((resolve, reject) => {\n        pending.resolvers.push(resolve);\n        pending.rejectors.push(reject);\n      });\n    }\n\n    // Check capacity\n    if (this.pendingRequests.size >= this.maxPendingRequests) {\n      this.cleanup();\n    }\n\n    // Execute the request\n    const resolvers: Array<(value: T) => void> = [];\n    const rejectors: Array<(error: Error) => void> = [];\n\n    const promise = executor()\n      .then((result) => {\n        // Resolve all waiting promises\n        resolvers.forEach((resolve) => resolve(result));\n        this.pendingRequests.delete(cacheKey);\n        this.stats.activeDeduplications = this.pendingRequests.size;\n        return result;\n      })\n      .catch((error) => {\n        // Reject all waiting promises\n        rejectors.forEach((reject) => reject(error));\n        this.pendingRequests.delete(cacheKey);\n        this.stats.activeDeduplications = this.pendingRequests.size;\n        throw error;\n      });\n\n    // Store pending request\n    this.pendingRequests.set(cacheKey, {\n      promise,\n      timestamp: Date.now(),\n      resolvers,\n      rejectors,\n    });\n\n    this.stats.activeDeduplications = this.pendingRequests.size;\n\n    // Auto-cleanup after TTL\n    const ttl = options?.ttl || this.ttl;\n    setTimeout(() => {\n      this.pendingRequests.delete(cacheKey);\n      this.stats.activeDeduplications = this.pendingRequests.size;\n    }, ttl);\n\n    return promise;\n  }\n\n  /**\n   * Generate cache key from input\n   */\n  private generateKey(input: string | object): string {\n    if (typeof input === 'string') {\n      return input;\n    }\n\n    // Generate hash from object\n    const json = JSON.stringify(input, Object.keys(input).sort());\n    return crypto.createHash('sha256').update(json).digest('hex').substring(0, 16);\n  }\n\n  /**\n   * Clean up expired pending requests\n   */\n  private cleanup(): void {\n    const now = Date.now();\n    const keysToDelete: string[] = [];\n\n    for (const [key, pending] of this.pendingRequests.entries()) {\n      if (now - pending.timestamp > this.ttl) {\n        keysToDelete.push(key);\n      }\n    }\n\n    for (const key of keysToDelete) {\n      this.pendingRequests.delete(key);\n    }\n\n    this.stats.activeDeduplications = this.pendingRequests.size;\n  }\n\n  /**\n   * Clear all pending requests\n   */\n  clear(): void {\n    this.pendingRequests.clear();\n    this.stats.activeDeduplications = 0;\n  }\n\n  /**\n   * Get deduplication statistics\n   */\n  getStats(): {\n    totalRequests: number;\n    deduplicatedRequests: number;\n    activeDeduplications: number;\n    deduplicationRate: number;\n  } {\n    return {\n      ...this.stats,\n      deduplicationRate:\n        this.stats.totalRequests > 0\n          ? this.stats.deduplicatedRequests / this.stats.totalRequests\n          : 0,\n    };\n  }\n\n  /**\n   * Enable/disable deduplication\n   */\n  setEnabled(enabled: boolean): void {\n    this.enabled = enabled;\n    if (!enabled) {\n      this.clear();\n    }\n  }\n\n  /**\n   * Check if deduplication is enabled\n   */\n  isEnabled(): boolean {\n    return this.enabled;\n  }\n}\n","type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\ninterface LoggerOptions {\n  enabled: boolean;\n  level: LogLevel;\n  prefix?: string;\n}\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n  debug: 0,\n  info: 1,\n  warn: 2,\n  error: 3,\n};\n\nexport class Logger {\n  private options: LoggerOptions;\n\n  constructor(options: Partial<LoggerOptions> = {}) {\n    this.options = {\n      enabled: options.enabled ?? true,\n      level: options.level ?? 'info',\n      prefix: options.prefix ?? '[OpenRouter]',\n    };\n  }\n\n  private shouldLog(level: LogLevel): boolean {\n    if (!this.options.enabled) return false;\n    return LOG_LEVELS[level] >= LOG_LEVELS[this.options.level];\n  }\n\n  private formatMessage(level: LogLevel, message: string, meta?: Record<string, unknown>): string {\n    const timestamp = new Date().toISOString();\n    const prefix = this.options.prefix;\n    let formatted = `${timestamp} ${prefix} [${level.toUpperCase()}] ${message}`;\n\n    if (meta && Object.keys(meta).length > 0) {\n      formatted += `\\n${JSON.stringify(meta, null, 2)}`;\n    }\n\n    return formatted;\n  }\n\n  debug(message: string, meta?: Record<string, unknown>): void {\n    if (this.shouldLog('debug')) {\n      // eslint-disable-next-line no-console\n      console.debug(this.formatMessage('debug', message, meta));\n    }\n  }\n\n  info(message: string, meta?: Record<string, unknown>): void {\n    if (this.shouldLog('info')) {\n      // eslint-disable-next-line no-console\n      console.info(this.formatMessage('info', message, meta));\n    }\n  }\n\n  warn(message: string, meta?: Record<string, unknown>): void {\n    if (this.shouldLog('warn')) {\n      console.warn(this.formatMessage('warn', message, meta));\n    }\n  }\n\n  error(message: string, error?: Error | Record<string, unknown>): void {\n    if (this.shouldLog('error')) {\n      const meta = error instanceof Error ? { message: error.message, stack: error.stack } : error;\n      console.error(this.formatMessage('error', message, meta));\n    }\n  }\n\n  setLevel(level: LogLevel): void {\n    this.options.level = level;\n  }\n\n  setEnabled(enabled: boolean): void {\n    this.options.enabled = enabled;\n  }\n}\n\nexport const createLogger = (options?: Partial<LoggerOptions>): Logger => {\n  return new Logger(options);\n};\n","/**\n * Cache Manager\n * Orchestrates caching with multiple strategies\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport { MemoryCache } from './MemoryCache';\nimport { LRUCache } from './LRUCache';\nimport { RequestDeduplicator } from './RequestDeduplicator';\nimport { Logger } from '../utils/logger';\n\nexport type CacheStrategy = 'memory' | 'lru' | 'none';\n\nexport interface CacheManagerOptions {\n  strategy?: CacheStrategy;\n  maxSize?: number;\n  maxMemory?: number;\n  defaultTTL?: number;\n  deduplication?: boolean;\n  logger?: Logger;\n}\n\nexport interface CacheStats {\n  strategy: CacheStrategy;\n  size: number;\n  hits: number;\n  misses: number;\n  hitRate: number;\n  deduplicationStats?: {\n    totalRequests: number;\n    deduplicatedRequests: number;\n    deduplicationRate: number;\n  };\n}\n\nexport class CacheManager extends EventEmitter {\n  private cache: MemoryCache | LRUCache | null;\n  private deduplicator: RequestDeduplicator;\n  private strategy: CacheStrategy;\n  private logger: Logger;\n  private stats: {\n    hits: number;\n    misses: number;\n  };\n\n  constructor(options: CacheManagerOptions = {}) {\n    super();\n    this.strategy = options.strategy || 'lru';\n    this.logger = options.logger || new Logger({ enabled: false });\n    this.stats = {\n      hits: 0,\n      misses: 0,\n    };\n\n    // Initialize cache based on strategy\n    switch (this.strategy) {\n      case 'memory':\n        this.cache = new MemoryCache({\n          maxSize: options.maxSize,\n          defaultTTL: options.defaultTTL,\n        });\n        break;\n      case 'lru':\n        this.cache = new LRUCache({\n          maxSize: options.maxSize,\n          maxMemory: options.maxMemory,\n          defaultTTL: options.defaultTTL,\n        });\n        break;\n      case 'none':\n        this.cache = null;\n        break;\n      default:\n        throw new Error(`Unknown cache strategy: ${this.strategy}`);\n    }\n\n    // Initialize deduplicator\n    this.deduplicator = new RequestDeduplicator({\n      enabled: options.deduplication !== false,\n    });\n\n    // Set up cleanup interval\n    if (this.cache) {\n      setInterval(() => {\n        this.cleanup();\n      }, 60000); // Clean up every minute\n    }\n  }\n\n  /**\n   * Get a value from cache\n   */\n  async get<T>(key: string): Promise<T | null> {\n    await Promise.resolve(); // Keep async for consistent interface\n    if (!this.cache) {\n      this.stats.misses++;\n      return null;\n    }\n\n    const value = this.cache.get(key);\n\n    if (value !== null) {\n      this.stats.hits++;\n      this.logger.debug('Cache hit', { key });\n      this.emit('hit', { key });\n      return value as T;\n    }\n\n    this.stats.misses++;\n    this.logger.debug('Cache miss', { key });\n    this.emit('miss', { key });\n    return null;\n  }\n\n  /**\n   * Set a value in cache\n   */\n  async set<T>(key: string, value: T, ttl?: number): Promise<void> {\n    await Promise.resolve(); // Keep async for consistent interface\n    if (!this.cache) {\n      return;\n    }\n\n    this.cache.set(key, value, ttl);\n    this.logger.debug('Cache set', { key, ttl });\n    this.emit('set', { key, ttl });\n  }\n\n  /**\n   * Get or compute a value with caching and deduplication\n   */\n  async getOrCompute<T>(\n    key: string,\n    computer: () => Promise<T>,\n    options?: { ttl?: number; skipCache?: boolean },\n  ): Promise<T> {\n    // Check cache first (unless skipped)\n    if (!options?.skipCache) {\n      const cached = await this.get<T>(key);\n      if (cached !== null) {\n        return cached;\n      }\n    }\n\n    // Use deduplicator to prevent concurrent requests\n    const value = await this.deduplicator.execute(key, computer, options);\n\n    // Store in cache\n    if (!options?.skipCache) {\n      await this.set(key, value, options?.ttl);\n    }\n\n    return value;\n  }\n\n  /**\n   * Delete a key from cache\n   */\n  async delete(key: string): Promise<boolean> {\n    await Promise.resolve(); // Keep async for consistent interface\n    if (!this.cache) {\n      return false;\n    }\n\n    const result = this.cache.delete(key);\n    if (result) {\n      this.logger.debug('Cache delete', { key });\n      this.emit('delete', { key });\n    }\n    return result;\n  }\n\n  /**\n   * Check if key exists in cache\n   */\n  async has(key: string): Promise<boolean> {\n    await Promise.resolve(); // Keep async for consistent interface\n    if (!this.cache) {\n      return false;\n    }\n\n    return this.cache.has(key);\n  }\n\n  /**\n   * Clear all cache entries\n   */\n  async clear(): Promise<void> {\n    await Promise.resolve(); // Keep async for consistent interface\n    if (!this.cache) {\n      return;\n    }\n\n    this.cache.clear();\n    this.deduplicator.clear();\n    this.stats.hits = 0;\n    this.stats.misses = 0;\n    this.logger.info('Cache cleared');\n    this.emit('clear');\n  }\n\n  /**\n   * Get cache size\n   */\n  size(): number {\n    if (!this.cache) {\n      return 0;\n    }\n\n    return this.cache.size();\n  }\n\n  /**\n   * Get all keys\n   */\n  keys(): string[] {\n    if (!this.cache) {\n      return [];\n    }\n\n    return this.cache.keys();\n  }\n\n  /**\n   * Clean up expired entries\n   */\n  cleanup(): number {\n    if (!this.cache) {\n      return 0;\n    }\n\n    const removed = this.cache.cleanup();\n    if (removed > 0) {\n      this.logger.debug('Cache cleanup', { removed });\n      this.emit('cleanup', { removed });\n    }\n    return removed;\n  }\n\n  /**\n   * Get cache statistics\n   */\n  getStats(): CacheStats {\n    const totalRequests = this.stats.hits + this.stats.misses;\n    const hitRate = totalRequests > 0 ? this.stats.hits / totalRequests : 0;\n\n    const stats: CacheStats = {\n      strategy: this.strategy,\n      size: this.size(),\n      hits: this.stats.hits,\n      misses: this.stats.misses,\n      hitRate,\n    };\n\n    // Add deduplication stats\n    const dedupStats = this.deduplicator.getStats();\n    if (dedupStats.totalRequests > 0) {\n      stats.deduplicationStats = {\n        totalRequests: dedupStats.totalRequests,\n        deduplicatedRequests: dedupStats.deduplicatedRequests,\n        deduplicationRate: dedupStats.deduplicationRate,\n      };\n    }\n\n    return stats;\n  }\n\n  /**\n   * Generate cache key from request parameters\n   */\n  static generateKey(params: Record<string, any>): string {\n    const sorted = Object.keys(params)\n      .sort()\n      .reduce(\n        (acc, key) => {\n          acc[key] = params[key];\n          return acc;\n        },\n        {} as Record<string, any>,\n      );\n\n    return JSON.stringify(sorted);\n  }\n\n  /**\n   * Enable/disable deduplication\n   */\n  setDeduplicationEnabled(enabled: boolean): void {\n    this.deduplicator.setEnabled(enabled);\n  }\n\n  /**\n   * Check if deduplication is enabled\n   */\n  isDeduplicationEnabled(): boolean {\n    return this.deduplicator.isEnabled();\n  }\n}\n"]}