{"version":3,"sources":["../src/monitoring/analytics.ts","../src/monitoring/performance-monitor.ts","../src/core/cache-manager.ts","../src/types/index.ts","../src/core/config-manager.ts","../src/core/error-handler.ts","../src/core/rate-limiter.ts","../src/core/retry-manager.ts","../src/core/token-manager.ts","../src/core/ai-engine.ts"],"names":["Analytics","event","fullEvent","providerStats","prevTotal","modelStats","provider","providerEvents","e","errors","total","existingError","a","b","interval","limit","intervalMs","now","trends","i","endTime","startTime","periodEvents","eventTime","successEvents","sum","count","operation","byOperation","acc","stats","model","providers","speedRanked","reliabilityRanked","costRanked","speedRank","p","reliabilityRank","costRank","recommendations","providerComparison","cacheHits","totalRequests","PerformanceMonitor","operationId","metadata","success","error","metrics","report","filters","cutoff","relevantReports","r","latencies","successCount","totalCount","l","operations","errorCounts","errorsByProvider","commonErrors","errorsByType","threshold","defaultThreshold","slowThreshold","values","percentile","index","issues","CacheManager","options","maxSizeBytes","LRUCache","entry","method","params","keyData","hash","crypto","key","value","hitRate","entries","beforeSize","enabled","ttl","fn","cached","result","prompt","text","data","RateLimitConfigSchema","z","CacheConfigSchema","RetryConfigSchema","AIConfigSchema","ConfigManager","config","targetProvider","encryptedKey","updates","newConfig","apiKey","apiKeys","safeConfig","ErrorHandler","context","enhancedError","VError","category","message","code","boomError","Boom","timeWindow","relevantErrors","resolved","errorId","RateLimiter","existingLimiter","limiterConfig","limiter","Bottleneck","id","limiterId","priority","tokens","bucket","counts","reservoir","limiterStats","mergedConfig","stopPromises","requestsPerMinute","minTime","refillRate","TokenBucket","_id","amount","tokensToAdd","RetryManager","mergedOptions","pRetry","attemptNumber","wrappedError","AbortError","backOff","shouldRetry","attempt","args","delay","jitter","errorType","suggestedDelay","TokenManager","encode","encoder","encoding_for_model","get_encoding","maxTokens","responseTokens","promptTokens","modelLimit","valid","availableTokens","preserveEnd","low","high","bestFit","mid","substring","chunkSize","overlap","chunks","sentences","currentChunk","currentTokens","sentence","sentenceTokens","overlapTokens","overlapText","type","pricing","messages","totalTokens","AIEngine","mainProvider","fallbackProviders","allProviders","providerType","providerConfig","OpenAIProvider","AnthropicProvider","GoogleProvider","MockProvider","rateLimitConfig","mainType","fallbacks","fallbackType","fallbackProvider","execute","perfReport","cacheKey","estimatedTokens","usage","cost","labels","audio"],"mappings":"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","file":"chunk-ZACX7RDK.cjs","sourcesContent":["import { AIUsageStats, ProviderStats } from \"../types\";\n\ninterface AnalyticsEvent {\n  timestamp: Date;\n  type: \"request\" | \"success\" | \"error\" | \"cache_hit\" | \"rate_limit\";\n  provider: string;\n  operation: string;\n  model?: string;\n  tokens?: {\n    prompt: number;\n    completion: number;\n    total: number;\n  };\n  cost?: number;\n  latency?: number;\n  error?: string;\n  metadata?: Record<string, any>;\n}\n\ninterface UsageTrend {\n  timestamp: string;\n  requests: number;\n  tokens: number;\n  cost: number;\n  errors: number;\n}\n\nexport class Analytics {\n  private events: AnalyticsEvent[] = [];\n  private maxEvents = 100000;\n  private stats: AIUsageStats = {\n    tokensUsed: 0,\n    requestsCount: 0,\n    costEstimate: 0,\n    lastReset: new Date(),\n    byProvider: {},\n    byModel: {},\n    byCapability: {},\n    errors: [],\n  };\n\n  /**\n   * Track an analytics event\n   */\n  trackEvent(event: Omit<AnalyticsEvent, \"timestamp\">): void {\n    const fullEvent: AnalyticsEvent = {\n      ...event,\n      timestamp: new Date(),\n    };\n\n    this.events.push(fullEvent);\n\n    // Update statistics\n    this.updateStats(fullEvent);\n\n    // Maintain event size\n    if (this.events.length > this.maxEvents) {\n      this.events = this.events.slice(-this.maxEvents / 2);\n    }\n  }\n\n  /**\n   * Update statistics based on event\n   */\n  private updateStats(event: AnalyticsEvent): void {\n    if (!this.stats.byProvider) {\n      console.warn(\"No provider stats initialized.\");\n      return;\n    }\n\n    // Update global stats\n    if (event.type === \"success\") {\n      this.stats.requestsCount++;\n\n      if (event.tokens) {\n        this.stats.tokensUsed += event.tokens.total;\n      }\n\n      if (event.cost) {\n        this.stats.costEstimate += event.cost;\n      }\n    }\n\n    // Update provider stats\n    if (!this.stats.byProvider[event.provider]) {\n      this.stats.byProvider[event.provider] = {\n        requests: 0,\n        tokens: 0,\n        cost: 0,\n        averageLatency: 0,\n        errorRate: 0,\n      };\n    }\n\n    const providerStats = this.stats.byProvider[event.provider];\n\n    if (!providerStats) {\n      console.warn(`Unknown provider ${event.provider}.`);\n      return;\n    }\n\n    if (event.type === \"success\" || event.type === \"error\") {\n      providerStats.requests++;\n    }\n\n    if (event.type === \"success\") {\n      if (event.tokens) {\n        providerStats.tokens += event.tokens.total;\n      }\n      if (event.cost) {\n        providerStats.cost += event.cost;\n      }\n      if (event.latency) {\n        // Update average latency\n        const prevTotal =\n          providerStats.averageLatency * (providerStats.requests - 1);\n        providerStats.averageLatency =\n          (prevTotal + event.latency) / providerStats.requests;\n      }\n    }\n\n    if (event.type === \"error\") {\n      providerStats.errorRate = this.calculateErrorRate(event.provider);\n    }\n\n    if (!this.stats.byModel) {\n      console.warn(\"No model stats initialized.\");\n      return;\n    }\n\n    // Update model stats\n    if (event.model) {\n      if (!this.stats.byModel[event.model]) {\n        this.stats.byModel[event.model] = {\n          requests: 0,\n          tokens: 0,\n          inputTokens: 0,\n          outputTokens: 0,\n          cost: 0,\n        };\n      }\n\n      const modelStats = this.stats.byModel[event.model];\n\n      if (!modelStats) {\n        console.warn(`Unknown model ${event.model}.`);\n        return;\n      }\n      if (event.type === \"success\") {\n        modelStats.requests++;\n\n        if (event.tokens) {\n          modelStats.tokens += event.tokens.total;\n          modelStats.inputTokens += event.tokens.prompt;\n          modelStats.outputTokens += event.tokens.completion;\n        }\n\n        if (event.cost) {\n          modelStats.cost += event.cost;\n        }\n      }\n    }\n\n    // Update capability stats\n    if (!this.stats.byCapability) {\n      console.warn(\"No capability stats initialized.\");\n      return;\n    }\n\n    if (!this.stats.byCapability[event.operation]) {\n      this.stats.byCapability[event.operation] = 0;\n    }\n\n    if (event.type === \"success\") {\n      (this.stats.byCapability[event.operation] as number)++;\n    }\n\n    // Update error stats\n    if (event.type === \"error\" && event.error) {\n      this.updateErrorStats(event);\n    }\n  }\n\n  /**\n   * Calculate error rate for a provider\n   */\n  private calculateErrorRate(provider: string): number {\n    const providerEvents = this.events.filter((e) => e.provider === provider);\n    const errors = providerEvents.filter((e) => e.type === \"error\").length;\n    const total = providerEvents.filter(\n      (e) => e.type === \"success\" || e.type === \"error\"\n    ).length;\n\n    return total > 0 ? errors / total : 0;\n  }\n\n  /**\n   * Update error statistics\n   */\n  private updateErrorStats(event: AnalyticsEvent): void {\n    if (!event.error) return;\n\n    const existingError = this.stats.errors?.find(\n      (e) => e.error === event.error && e.provider === event.provider\n    );\n\n    if (existingError) {\n      existingError.count++;\n    } else {\n      this.stats.errors?.push({\n        timestamp: event.timestamp,\n        provider: event.provider,\n        error: event.error,\n        count: 1,\n      });\n    }\n\n    // Keep only recent errors\n    if (this.stats.errors && this.stats.errors.length > 100) {\n      this.stats.errors = this.stats.errors\n        .sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime())\n        .slice(0, 50);\n    }\n  }\n\n  /**\n   * Get current usage statistics\n   */\n  getStats(): AIUsageStats {\n    return {\n      ...this.stats,\n      byProvider: { ...this.stats.byProvider },\n      byModel: { ...this.stats.byModel },\n      byCapability: { ...this.stats.byCapability },\n      errors: [...(this.stats.errors || [])],\n    };\n  }\n\n  /**\n   * Get usage trends over time\n   */\n  getTrends(\n    interval: \"hour\" | \"day\" | \"week\" | \"month\" = \"day\",\n    limit: number = 30\n  ): UsageTrend[] {\n    const intervalMs = {\n      hour: 3600000,\n      day: 86400000,\n      week: 604800000,\n      month: 2592000000,\n    }[interval];\n\n    const now = Date.now();\n    const trends: UsageTrend[] = [];\n\n    for (let i = 0; i < limit; i++) {\n      const endTime = now - i * intervalMs;\n      const startTime = endTime - intervalMs;\n\n      const periodEvents = this.events.filter((e) => {\n        const eventTime = e.timestamp.getTime();\n        return eventTime >= startTime && eventTime < endTime;\n      });\n\n      const successEvents = periodEvents.filter((e) => e.type === \"success\");\n\n      trends.unshift({\n        timestamp: new Date(endTime).toISOString(),\n        requests: successEvents.length,\n        tokens: successEvents.reduce(\n          (sum, e) => sum + (e.tokens?.total || 0),\n          0\n        ),\n        cost: successEvents.reduce((sum, e) => sum + (e.cost || 0), 0),\n        errors: periodEvents.filter((e) => e.type === \"error\").length,\n      });\n    }\n\n    return trends;\n  }\n\n  /**\n   * Get top operations by usage\n   */\n  getTopOperations(limit: number = 10): Array<{\n    operation: string;\n    count: number;\n    percentage: number;\n  }> {\n    if (!this.stats.byCapability) return []; // Return empty array if no capabilities are tracked\n\n    const total = Object.values(this.stats.byCapability).reduce(\n      (sum, count) => sum + count,\n      0\n    );\n\n    return Object.entries(this.stats.byCapability)\n      .map(([operation, count]) => ({\n        operation,\n        count,\n        percentage: total > 0 ? (count / total) * 100 : 0,\n      }))\n      .sort((a, b) => b.count - a.count)\n      .slice(0, limit);\n  }\n\n  /**\n   * Get cost breakdown\n   */\n  getCostBreakdown(): {\n    total: number;\n    byProvider: Record<string, number>;\n    byModel: Record<string, number>;\n    byOperation: Record<string, number>;\n  } {\n    if (!this.stats.byProvider || !this.stats.byModel) return {} as any; // Return empty object if no providers are tracked\n\n    const byOperation: Record<string, number> = {};\n\n    // Calculate cost by operation\n    this.events\n      .filter((e) => e.type === \"success\" && e.cost)\n      .forEach((e) => {\n        byOperation[e.operation] =\n          (byOperation[e.operation] || 0) + (e.cost || 0);\n      });\n\n    return {\n      total: this.stats.costEstimate,\n      byProvider: Object.entries(this.stats.byProvider).reduce(\n        (acc, [provider, stats]) => {\n          acc[provider] = stats.cost;\n          return acc;\n        },\n        {} as Record<string, number>\n      ),\n      byModel: Object.entries(this.stats.byModel).reduce(\n        (acc, [model, stats]) => {\n          acc[model] = stats.cost;\n          return acc;\n        },\n        {} as Record<string, number>\n      ),\n      byOperation,\n    };\n  }\n\n  /**\n   * Get provider comparison\n   */\n  getProviderComparison(): Array<{\n    provider: string;\n    stats: ProviderStats;\n    rank: {\n      speed: number;\n      reliability: number;\n      cost: number;\n      overall: number;\n    };\n  }> {\n    if (!this.stats.byProvider) return []; // Return empty array if no providers are tracked\n\n    const providers = Object.entries(this.stats.byProvider).map(\n      ([provider, stats]) => ({\n        provider,\n        stats,\n      })\n    );\n\n    // Rank by different metrics\n    const speedRanked = [...providers].sort(\n      (a, b) => a.stats.averageLatency - b.stats.averageLatency\n    );\n    const reliabilityRanked = [...providers].sort(\n      (a, b) => a.stats.errorRate - b.stats.errorRate\n    );\n    const costRanked = [...providers].sort(\n      (a, b) => a.stats.cost / a.stats.tokens - b.stats.cost / b.stats.tokens\n    );\n\n    return providers.map(({ provider, stats }) => {\n      const speedRank =\n        speedRanked.findIndex((p) => p.provider === provider) + 1;\n      const reliabilityRank =\n        reliabilityRanked.findIndex((p) => p.provider === provider) + 1;\n      const costRank = costRanked.findIndex((p) => p.provider === provider) + 1;\n\n      return {\n        provider,\n        stats,\n        rank: {\n          speed: speedRank,\n          reliability: reliabilityRank,\n          cost: costRank,\n          overall: Math.round((speedRank + reliabilityRank + costRank) / 3),\n        },\n      };\n    });\n  }\n\n  /**\n   * Get recommendations based on usage\n   */\n  getRecommendations(): string[] {\n    const recommendations: string[] = [];\n    const stats = this.getStats();\n    const providerComparison = this.getProviderComparison();\n\n    // Cost optimization\n    if (stats.costEstimate > 100) {\n      recommendations.push(\n        \"Consider using cheaper models for simple tasks to reduce costs\"\n      );\n    }\n\n    // Provider recommendations\n    providerComparison.forEach(({ provider, stats }) => {\n      if (stats.errorRate > 0.05) {\n        recommendations.push(\n          `${provider} has high error rate (${(stats.errorRate * 100).toFixed(1)}%). Consider using fallback providers.`\n        );\n      }\n\n      if (stats.averageLatency > 5000) {\n        recommendations.push(\n          `${provider} has high latency. Enable caching for frequently used prompts.`\n        );\n      }\n    });\n\n    // Cache recommendations\n    const cacheHits = this.events.filter((e) => e.type === \"cache_hit\").length;\n    const totalRequests = stats.requestsCount;\n    const cacheHitRate = totalRequests > 0 ? cacheHits / totalRequests : 0;\n\n    if (cacheHitRate < 0.2 && totalRequests > 100) {\n      recommendations.push(\n        \"Low cache hit rate. Consider increasing cache TTL or size.\"\n      );\n    }\n\n    // Rate limit recommendations\n    const rateLimitEvents = this.events.filter(\n      (e) => e.type === \"rate_limit\"\n    ).length;\n    if (rateLimitEvents > 10) {\n      recommendations.push(\n        \"Frequent rate limiting detected. Implement request queuing or upgrade API limits.\"\n      );\n    }\n\n    return recommendations;\n  }\n\n  /**\n   * Reset statistics\n   */\n  reset(): void {\n    this.stats = {\n      tokensUsed: 0,\n      requestsCount: 0,\n      costEstimate: 0,\n      lastReset: new Date(),\n      byProvider: {},\n      byModel: {},\n      byCapability: {},\n      errors: [],\n    };\n    this.events = [];\n  }\n\n  /**\n   * Export analytics data\n   */\n  exportData(): {\n    stats: AIUsageStats;\n    trends: UsageTrend[];\n    // topOperations: ReturnType<AnalyticsManager[\"getTopOperations\"]>;\n    topOperations: ReturnType<any>;\n    // costBreakdown: ReturnType<AnalyticsManager[\"getCostBreakdown\"]>;\n    costBreakdown: ReturnType<any>;\n    // providerComparison: ReturnType<AnalyticsManager[\"getProviderComparison\"]>;\n    providerComparison: ReturnType<any>;\n    recommendations: string[];\n  } {\n    return {\n      stats: this.getStats(),\n      trends: this.getTrends(),\n      topOperations: this.getTopOperations(),\n      costBreakdown: this.getCostBreakdown(),\n      providerComparison: this.getProviderComparison(),\n      recommendations: this.getRecommendations(),\n    };\n  }\n}\n","interface PerformanceMetrics {\n  operationId: string;\n  operation: string;\n  provider: string;\n  startTime: number;\n  endTime?: number;\n  duration?: number;\n  success: boolean;\n  error?: string;\n  metadata?: Record<string, any>;\n}\n\ninterface PerformanceReport {\n  operationId: string;\n  operation: string;\n  provider: string;\n  duration: number;\n  success: boolean;\n  error?: string;\n  timestamp: string;\n}\n\ninterface PerformanceStats {\n  averageLatency: number;\n  minLatency: number;\n  maxLatency: number;\n  successRate: number;\n  errorRate: number;\n  throughput: number;\n  percentiles: {\n    p50: number;\n    p90: number;\n    p95: number;\n    p99: number;\n  };\n}\n\nexport class PerformanceMonitor {\n  private metrics = new Map<string, PerformanceMetrics>();\n  private history: PerformanceReport[] = [];\n  private maxHistorySize = 10000;\n  private windowSize = 300000; // 5 minutes\n\n  /**\n   * Start monitoring an operation\n   */\n  startOperation(\n    operationId: string,\n    operation: string,\n    provider: string,\n    metadata?: Record<string, any>\n  ): void {\n    this.metrics.set(operationId, {\n      operationId,\n      operation,\n      provider,\n      startTime: performance.now(),\n      success: false,\n      metadata,\n    });\n  }\n\n  /**\n   * End monitoring an operation\n   */\n  endOperation(\n    operationId: string,\n    success: boolean = true,\n    error?: string\n  ): PerformanceReport | null {\n    const metrics = this.metrics.get(operationId);\n    if (!metrics) return null;\n\n    metrics.endTime = performance.now();\n    metrics.duration = metrics.endTime - metrics.startTime;\n    metrics.success = success;\n    metrics.error = error;\n\n    const report: PerformanceReport = {\n      operationId: metrics.operationId,\n      operation: metrics.operation,\n      provider: metrics.provider,\n      duration: metrics.duration,\n      success: metrics.success,\n      error: metrics.error,\n      timestamp: new Date().toISOString(),\n    };\n\n    this.history.push(report);\n    this.metrics.delete(operationId);\n\n    // Maintain history size\n    if (this.history.length > this.maxHistorySize) {\n      this.history = this.history.slice(-this.maxHistorySize / 2);\n    }\n\n    return report;\n  }\n\n  /**\n   * Get performance statistics\n   */\n  getStats(filters?: {\n    provider?: string;\n    operation?: string;\n    timeWindow?: number;\n  }): PerformanceStats {\n    const cutoff = Date.now() - (filters?.timeWindow || this.windowSize);\n\n    let relevantReports = this.history.filter(\n      (report) => new Date(report.timestamp).getTime() > cutoff\n    );\n\n    if (filters?.provider) {\n      relevantReports = relevantReports.filter(\n        (r) => r.provider === filters.provider\n      );\n    }\n\n    if (filters?.operation) {\n      relevantReports = relevantReports.filter(\n        (r) => r.operation === filters.operation\n      );\n    }\n\n    if (relevantReports.length === 0) {\n      return {\n        averageLatency: 0,\n        minLatency: 0,\n        maxLatency: 0,\n        successRate: 0,\n        errorRate: 0,\n        throughput: 0,\n        percentiles: { p50: 0, p90: 0, p95: 0, p99: 0 },\n      };\n    }\n\n    // Calculate metrics\n    const latencies = relevantReports\n      .map((r) => r.duration)\n      .sort((a, b) => a - b);\n    const successCount = relevantReports.filter((r) => r.success).length;\n    const totalCount = relevantReports.length;\n\n    return {\n      averageLatency:\n        latencies.reduce((sum, l) => sum + l, 0) / latencies.length,\n      minLatency: latencies[0] ?? 0,\n      maxLatency: latencies[latencies.length - 1] ?? 0,\n      successRate: successCount / totalCount,\n      errorRate: (totalCount - successCount) / totalCount,\n      throughput:\n        totalCount / ((filters?.timeWindow || this.windowSize) / 1000), // per second\n      percentiles: {\n        p50: this.getPercentile(latencies, 50),\n        p90: this.getPercentile(latencies, 90),\n        p95: this.getPercentile(latencies, 95),\n        p99: this.getPercentile(latencies, 99),\n      },\n    };\n  }\n\n  /**\n   * Get performance by provider\n   */\n  getStatsByProvider(): Record<string, PerformanceStats> {\n    const providers = new Set(this.history.map((r) => r.provider));\n    const stats: Record<string, PerformanceStats> = {};\n\n    for (const provider of providers) {\n      stats[provider] = this.getStats({ provider });\n    }\n\n    return stats;\n  }\n\n  /**\n   * Get performance by operation\n   */\n  getStatsByOperation(): Record<string, PerformanceStats> {\n    const operations = new Set(this.history.map((r) => r.operation));\n    const stats: Record<string, PerformanceStats> = {};\n\n    for (const operation of operations) {\n      stats[operation] = this.getStats({ operation });\n    }\n\n    return stats;\n  }\n\n  /**\n   * Get performance trends\n   */\n  getTrends(\n    interval: \"minute\" | \"hour\" | \"day\" = \"hour\",\n    limit: number = 24\n  ): Array<{\n    timestamp: string;\n    stats: PerformanceStats;\n  }> {\n    const intervalMs = {\n      minute: 60000,\n      hour: 3600000,\n      day: 86400000,\n    }[interval];\n\n    const now = Date.now();\n    const trends: Array<{ timestamp: string; stats: PerformanceStats }> = [];\n\n    for (let i = 0; i < limit; i++) {\n      const endTime = now - i * intervalMs;\n      const startTime = endTime - intervalMs;\n\n      const stats = this.getStats({ timeWindow: now - startTime });\n\n      trends.unshift({\n        timestamp: new Date(endTime).toISOString(),\n        stats,\n      });\n    }\n\n    return trends;\n  }\n\n  /**\n   * Get error analysis\n   */\n  getErrorAnalysis(): {\n    totalErrors: number;\n    errorsByType: Record<string, number>;\n    errorsByProvider: Record<string, number>;\n    commonErrors: Array<{ error: string; count: number }>;\n  } {\n    const errors = this.history.filter((r) => !r.success && r.error);\n    const errorCounts = new Map<string, number>();\n    const errorsByProvider: Record<string, number> = {};\n\n    for (const report of errors) {\n      if (report.error) {\n        errorCounts.set(report.error, (errorCounts.get(report.error) || 0) + 1);\n        errorsByProvider[report.provider] =\n          (errorsByProvider[report.provider] || 0) + 1;\n      }\n    }\n\n    // Get common errors\n    const commonErrors = Array.from(errorCounts.entries())\n      .map(([error, count]) => ({ error, count }))\n      .sort((a, b) => b.count - a.count)\n      .slice(0, 10);\n\n    // Categorize errors\n    const errorsByType: Record<string, number> = {\n      timeout: 0,\n      rateLimit: 0,\n      authentication: 0,\n      network: 0,\n      other: 0,\n    };\n\n    for (const [error, count] of errorCounts) {\n      if (error.includes(\"timeout\"))\n        errorsByType.timeout = (errorsByType.timeout ?? 0) + count;\n      else if (error.includes(\"rate limit\"))\n        errorsByType.rateLimit = (errorsByType.rateLimit ?? 0) + count;\n      else if (error.includes(\"auth\") || error.includes(\"401\"))\n        errorsByType.authentication =\n          (errorsByType.authentication ?? 0) + count;\n      else if (error.includes(\"network\"))\n        errorsByType.network = (errorsByType.network ?? 0) + count;\n      else errorsByType.other = (errorsByType.other ?? 0) + count;\n    }\n\n    return {\n      totalErrors: errors.length,\n      errorsByType,\n      errorsByProvider,\n      commonErrors,\n    };\n  }\n\n  /**\n   * Get slow operations\n   */\n  getSlowOperations(threshold?: number): PerformanceReport[] {\n    const defaultThreshold = this.getStats().percentiles.p95;\n    const slowThreshold = threshold || defaultThreshold || 5000;\n\n    return this.history\n      .filter((r) => r.duration > slowThreshold)\n      .sort((a, b) => b.duration - a.duration)\n      .slice(0, 100);\n  }\n\n  /**\n   * Calculate percentile\n   */\n  private getPercentile(values: number[], percentile: number): number {\n    const index = Math.ceil((percentile / 100) * values.length) - 1;\n    return values[Math.max(0, index)] ?? 0;\n  }\n\n  /**\n   * Clear history\n   */\n  clearHistory(): void {\n    this.history = [];\n    this.metrics.clear();\n  }\n\n  /**\n   * Export performance data\n   */\n  exportData(): {\n    history: PerformanceReport[];\n    stats: PerformanceStats;\n    statsByProvider: Record<string, PerformanceStats>;\n    statsByOperation: Record<string, PerformanceStats>;\n    errorAnalysis: ReturnType<PerformanceMonitor[\"getErrorAnalysis\"]>;\n  } {\n    return {\n      history: this.history,\n      stats: this.getStats(),\n      statsByProvider: this.getStatsByProvider(),\n      statsByOperation: this.getStatsByOperation(),\n      errorAnalysis: this.getErrorAnalysis(),\n    };\n  }\n\n  /**\n   * Get active operations\n   */\n  getActiveOperations(): PerformanceMetrics[] {\n    return Array.from(this.metrics.values());\n  }\n\n  /**\n   * Check health status\n   */\n  getHealthStatus(): {\n    status: \"healthy\" | \"degraded\" | \"unhealthy\";\n    issues: string[];\n  } {\n    const stats = this.getStats();\n    const issues: string[] = [];\n\n    // Check success rate\n    if (stats.successRate < 0.95) {\n      issues.push(`Low success rate: ${(stats.successRate * 100).toFixed(1)}%`);\n    }\n\n    // Check latency\n    if (stats.percentiles.p95 > 5000) {\n      issues.push(`High P95 latency: ${stats.percentiles.p95.toFixed(0)}ms`);\n    }\n\n    // Check throughput\n    if (stats.throughput < 0.1) {\n      issues.push(`Low throughput: ${stats.throughput.toFixed(2)} req/s`);\n    }\n\n    const status =\n      issues.length === 0\n        ? \"healthy\"\n        : issues.length === 1\n          ? \"degraded\"\n          : \"unhealthy\";\n\n    return { status, issues };\n  }\n}\n","import { LRUCache } from 'lru-cache'\nimport crypto from 'crypto'\nimport { CacheConfig, GenerateOptions } from '../types'\n\ninterface CacheEntry<T = any> {\n  key: string\n  value: T\n  timestamp: number\n  hits: number\n  metadata?: Record<string, any>\n}\n\ninterface CacheOptions extends CacheConfig {\n  namespace?: string\n}\n\nexport class CacheManager {\n  private cache: LRUCache<string, CacheEntry>\n  private enabled: boolean\n  private namespace: string\n  private stats = {\n    hits: 0,\n    misses: 0,\n    evictions: 0\n  }\n\n  constructor(options: CacheOptions) {\n    this.enabled = options.enabled ?? true\n    this.namespace = options.namespace || 'ai-toolkit'\n    \n    // Convert MB to bytes for max size\n    const maxSizeBytes = (options.maxSize || 100) * 1024 * 1024\n    \n    this.cache = new LRUCache<string, CacheEntry>({\n      max: 1000, // Max number of items\n      maxSize: maxSizeBytes,\n      sizeCalculation: (entry) => {\n        // Estimate size of cached entry\n        return JSON.stringify(entry).length\n      },\n      ttl: options.ttl || 600000, // 10 minutes default\n      updateAgeOnGet: true,\n      updateAgeOnHas: false,\n      dispose: () => {\n        this.stats.evictions++\n      }\n    })\n    \n    // Setup periodic cleanup\n    this.setupCleanup()\n  }\n\n  /**\n   * Generate cache key from request parameters\n   */\n  generateKey(\n    method: string,\n    params: any[],\n    options?: Record<string, any>\n  ): string {\n    const keyData = {\n      namespace: this.namespace,\n      method,\n      params: params.map(p => {\n        if (typeof p === 'object') {\n          return JSON.stringify(p, Object.keys(p).sort())\n        }\n        return String(p)\n      }),\n      options: options ? JSON.stringify(options, Object.keys(options).sort()) : null\n    }\n    \n    const hash = crypto\n      .createHash('sha256')\n      .update(JSON.stringify(keyData))\n      .digest('hex')\n    \n    return `${this.namespace}:${method}:${hash}`\n  }\n\n  /**\n   * Get value from cache\n   */\n  async get<T = any>(key: string): Promise<T | null> {\n    if (!this.enabled) return null\n    \n    const entry = this.cache.get(key)\n    \n    if (entry) {\n      this.stats.hits++\n      entry.hits++\n      return entry.value as T\n    }\n    \n    this.stats.misses++\n    return null\n  }\n\n  /**\n   * Set value in cache\n   */\n  async set<T = any>(\n    key: string,\n    value: T,\n    metadata?: Record<string, any>\n  ): Promise<void> {\n    if (!this.enabled) return\n    \n    const entry: CacheEntry<T> = {\n      key,\n      value,\n      timestamp: Date.now(),\n      hits: 0,\n      metadata\n    }\n    \n    this.cache.set(key, entry)\n  }\n\n  /**\n   * Delete from cache\n   */\n  async delete(key: string): Promise<boolean> {\n    return this.cache.delete(key)\n  }\n\n  /**\n   * Clear all cache entries\n   */\n  async clear(): Promise<void> {\n    this.cache.clear()\n    this.stats = {\n      hits: 0,\n      misses: 0,\n      evictions: 0\n    }\n  }\n\n  /**\n   * Check if key exists in cache\n   */\n  has(key: string): boolean {\n    return this.cache.has(key)\n  }\n\n  /**\n   * Get cache statistics\n   */\n  getStats() {\n    const hitRate = this.stats.hits + this.stats.misses > 0\n      ? this.stats.hits / (this.stats.hits + this.stats.misses)\n      : 0\n    \n    return {\n      ...this.stats,\n      hitRate: Math.round(hitRate * 100) / 100,\n      size: this.cache.size,\n      calculatedSize: this.cache.calculatedSize,\n      maxSize: this.cache.maxSize,\n      itemCount: this.cache.size,\n      enabled: this.enabled\n    }\n  }\n\n  /**\n   * Get all cache keys\n   */\n  keys(): string[] {\n    return Array.from(this.cache.keys())\n  }\n\n  /**\n   * Get cache entries with metadata\n   */\n  entries(): Array<{ key: string; metadata?: Record<string, any>; age: number }> {\n    const entries: Array<{ key: string; metadata?: Record<string, any>; age: number }> = []\n    \n    for (const [key, entry] of this.cache.entries()) {\n      entries.push({\n        key,\n        metadata: entry.metadata,\n        age: Date.now() - entry.timestamp\n      })\n    }\n    \n    return entries\n  }\n\n  /**\n   * Prune old entries\n   */\n  prune(): number {\n    const beforeSize = this.cache.size\n    this.cache.purgeStale()\n    return beforeSize - this.cache.size\n  }\n\n  /**\n   * Enable or disable cache\n   */\n  setEnabled(enabled: boolean): void {\n    this.enabled = enabled\n    if (!enabled) {\n      this.clear()\n    }\n  }\n\n  /**\n   * Update TTL for all entries\n   */\n  updateTTL(ttl: number): void {\n    // LRUCache doesn't support updating TTL on existing entries\n    // We need to recreate the cache with new TTL\n    const entries = Array.from(this.cache.entries())\n    \n    this.cache = new LRUCache<string, CacheEntry>({\n      max: this.cache.max,\n      maxSize: this.cache.maxSize,\n      ttl,\n      updateAgeOnGet: true,\n      updateAgeOnHas: false,\n      sizeCalculation: (entry) => JSON.stringify(entry).length,\n      dispose: () => {\n        this.stats.evictions++\n      }\n    })\n    \n    // Restore entries\n    for (const [key, entry] of entries) {\n      this.cache.set(key, entry)\n    }\n  }\n\n  /**\n   * Get memory usage info\n   */\n  getMemoryUsage() {\n    return {\n      used: this.cache.calculatedSize,\n      max: this.cache.maxSize,\n      percentage: Math.round((this.cache.calculatedSize / this.cache.maxSize) * 100)\n    }\n  }\n\n  /**\n   * Setup periodic cleanup\n   */\n  private setupCleanup(): void {\n    // Run cleanup every 5 minutes\n    setInterval(() => {\n      this.prune()\n    }, 5 * 60 * 1000)\n  }\n\n  /**\n   * Cache wrapper for async functions\n   */\n  async wrap<T>(\n    key: string,\n    fn: () => Promise<T>,\n    options?: { ttl?: number; metadata?: Record<string, any> }\n  ): Promise<T> {\n    // Try to get from cache\n    const cached = await this.get<T>(key)\n    if (cached !== null) {\n      return cached\n    }\n    \n    // Execute function\n    const result = await fn()\n    \n    // Store in cache\n    await this.set(key, result, options?.metadata)\n    \n    return result\n  }\n\n  /**\n   * Create a cache key for text generation\n   */\n  createTextGenerationKey(\n    prompt: string,\n    options?: GenerateOptions,\n    provider?: string,\n    model?: string\n  ): string {\n    return this.generateKey('generateText', [prompt], {\n      ...options,\n      provider,\n      model\n    })\n  }\n\n  /**\n   * Create a cache key for embeddings\n   */\n  createEmbeddingKey(\n    text: string,\n    provider?: string,\n    model?: string\n  ): string {\n    return this.generateKey('generateEmbedding', [text], {\n      provider,\n      model\n    })\n  }\n\n  /**\n   * Export cache contents\n   */\n  export(): Record<string, any> {\n    const data: Record<string, any> = {}\n    \n    for (const [key, entry] of this.cache.entries()) {\n      data[key] = {\n        value: entry.value,\n        timestamp: entry.timestamp,\n        hits: entry.hits,\n        metadata: entry.metadata\n      }\n    }\n    \n    return data\n  }\n\n  /**\n   * Import cache contents\n   */\n  import(data: Record<string, any>): void {\n    this.clear()\n    \n    for (const [key, entry] of Object.entries(data)) {\n      if (entry && typeof entry === 'object' && 'value' in entry) {\n        this.cache.set(key, entry as CacheEntry)\n      }\n    }\n  }\n}","import { z } from 'zod'\n\n// Base provider types\nexport type AIProviderType =\n  | 'openai'\n  | 'anthropic'\n  | 'google'\n  | 'cohere'\n  | 'huggingface'\n  | 'replicate'\n  | 'stability'\n  | 'elevenlabs'\n  | 'whisper'\n  | 'custom'\n  | 'local'\n  | 'mock'\n\n// Configuration schemas\nexport const RateLimitConfigSchema = z.object({\n  requestsPerMinute: z.number().optional(),\n  tokensPerMinute: z.number().optional(),\n  requestsPerHour: z.number().optional(),\n  tokensPerHour: z.number().optional(),\n  concurrent: z.number().default(5),\n  strategy: z.enum(['fixed-window', 'sliding-window', 'token-bucket']).default('sliding-window')\n})\n\nexport const CacheConfigSchema = z.object({\n  enabled: z.boolean().default(true),\n  ttl: z.number().default(600000), // 10 minutes\n  maxSize: z.number().default(100), // MB\n  strategy: z.enum(['lru', 'fifo', 'lfu']).default('lru')\n})\n\nexport const RetryConfigSchema = z.object({\n  maxAttempts: z.number().default(3),\n  baseDelay: z.number().default(1000),\n  maxDelay: z.number().default(30000),\n  backoff: z.enum(['exponential', 'linear', 'fixed']).default('exponential')\n})\n\nexport const AIConfigSchema = z.object({\n  provider: z.custom<AIProviderType>(),\n  apiKey: z.string().optional(),\n  apiKeys: z.record(z.string()).optional(),\n  model: z.string().optional(),\n  models: z.record(z.string()).optional(),\n  baseUrl: z.string().optional(),\n  headers: z.record(z.string()).optional(),\n  maxRetries: z.number().optional(),\n  timeout: z.number().optional(),\n  cache: CacheConfigSchema.optional(),\n  rateLimit: RateLimitConfigSchema.optional(),\n  retry: RetryConfigSchema.optional(),\n  fallbackProviders: z.array(z.custom<AIProviderType>()).optional()\n})\n\n// Infer types from schemas\nexport type RateLimitConfig = z.infer<typeof RateLimitConfigSchema>\nexport type CacheConfig = z.infer<typeof CacheConfigSchema>\nexport type RetryConfig = z.infer<typeof RetryConfigSchema>\nexport type AIConfig = z.infer<typeof AIConfigSchema>\n\n// Request/Response types\nexport interface GenerateOptions {\n  maxTokens?: number\n  temperature?: number\n  topP?: number\n  topK?: number\n  frequencyPenalty?: number\n  presencePenalty?: number\n  stopSequences?: string[]\n  systemPrompt?: string\n  stream?: boolean\n  format?: 'text' | 'json' | 'markdown'\n  seed?: number\n  logitBias?: Record<string, number>\n  functions?: FunctionDefinition[]\n  responseFormat?: ResponseFormat\n}\n\nexport interface FunctionDefinition {\n  name: string\n  description: string\n  parameters: Record<string, any>\n}\n\nexport interface ResponseFormat {\n  type: 'text' | 'json_object'\n  schema?: Record<string, any>\n}\n\nexport interface TokenUsage {\n  promptTokens: number\n  completionTokens: number\n  totalTokens: number\n}\n\nexport interface AIResponse {\n  content: string\n  usage: TokenUsage\n  model: string\n  provider: string\n  cached: boolean\n  latency: number\n  metadata?: Record<string, any>\n}\n\n// Classification and analysis\nexport interface Classification {\n  label: string\n  confidence: number\n  scores: Record<string, number>\n}\n\nexport interface SentimentAnalysis {\n  sentiment: 'positive' | 'negative' | 'neutral' | 'mixed'\n  score: number\n  aspects?: AspectSentiment[]\n}\n\nexport interface AspectSentiment {\n  aspect: string\n  sentiment: string\n  score: number\n}\n\nexport interface SummarizeOptions {\n  maxLength?: number\n  minLength?: number\n  style?: 'bullet' | 'paragraph' | 'tldr' | 'key-points' | 'executive'\n  language?: string\n  extractive?: boolean\n}\n\n// Image types\nexport interface ImageGenerationOptions {\n  size?: '256x256' | '512x512' | '1024x1024' | '1792x1024' | '1024x1792'\n  style?: 'realistic' | 'artistic' | 'cartoon' | 'photographic'\n  quality?: 'standard' | 'hd'\n  n?: number\n  negativePrompt?: string\n  seed?: number\n  steps?: number\n  guidanceScale?: number\n}\n\nexport interface ImageResult {\n  url?: string\n  base64?: string\n  revisedPrompt?: string\n  metadata?: Record<string, any>\n}\n\nexport interface ImageAnalysisOptions {\n  features?: ('objects' | 'faces' | 'text' | 'colors' | 'tags' | 'description')[]\n  language?: string\n}\n\nexport interface ImageAnalysis {\n  description?: string\n  objects?: DetectedObject[]\n  faces?: DetectedFace[]\n  text?: ExtractedText[]\n  colors?: ColorInfo[]\n  tags?: string[]\n}\n\nexport interface DetectedObject {\n  label: string\n  confidence: number\n  boundingBox?: BoundingBox\n}\n\nexport interface DetectedFace {\n  age?: number\n  gender?: string\n  emotion?: string\n  boundingBox?: BoundingBox\n}\n\nexport interface ExtractedText {\n  text: string\n  confidence: number\n  boundingBox?: BoundingBox\n}\n\nexport interface ColorInfo {\n  hex: string\n  name: string\n  percentage: number\n}\n\nexport interface BoundingBox {\n  x: number\n  y: number\n  width: number\n  height: number\n}\n\n// Audio types\nexport interface TranscriptionOptions {\n  language?: string\n  translateTo?: string\n  format?: 'text' | 'srt' | 'vtt' | 'json'\n  timestamps?: boolean\n  speakerDiarization?: boolean\n}\n\nexport interface TranscriptionResult {\n  text: string\n  language?: string\n  duration?: number\n  words?: WordTimestamp[]\n  speakers?: SpeakerSegment[]\n}\n\nexport interface WordTimestamp {\n  word: string\n  start: number\n  end: number\n  confidence?: number\n}\n\nexport interface SpeakerSegment {\n  speaker: string\n  start: number\n  end: number\n  text: string\n}\n\nexport interface SpeechOptions {\n  voice?: string\n  speed?: number\n  pitch?: number\n  volume?: number\n  format?: 'mp3' | 'wav' | 'ogg'\n  language?: string\n  emotion?: string\n}\n\n// Code generation\nexport interface CodeGenerationOptions {\n  language?: string\n  framework?: string\n  style?: 'concise' | 'verbose' | 'documented'\n  includeTests?: boolean\n  includeComments?: boolean\n}\n\nexport interface CodeResult {\n  code: string\n  language: string\n  explanation?: string\n  tests?: string\n  dependencies?: string[]\n}\n\n// Chat types\nexport interface ChatMessage {\n  id: string\n  role: 'user' | 'assistant' | 'system' | 'function'\n  content: string\n  timestamp: Date\n  name?: string\n  functionCall?: FunctionCall\n  metadata?: Record<string, any>\n}\n\nexport interface FunctionCall {\n  name: string\n  arguments: string\n}\n\nexport interface ChatOptions {\n  systemPrompt?: string\n  model?: string\n  temperature?: number\n  maxTokens?: number\n  memorySize?: number\n  persistChat?: boolean\n}\n\n// Usage and analytics\nexport interface AIUsageStats {\n  tokensUsed: number\n  requestsCount: number\n  costEstimate: number\n  lastReset: Date\n  byProvider?: Record<string, ProviderStats>\n  byModel?: Record<string, ModelStats>\n  byCapability?: Record<string, number>\n  errors?: ErrorStats[]\n}\n\nexport interface ProviderStats {\n  requests: number\n  tokens: number\n  cost: number\n  averageLatency: number\n  errorRate: number\n}\n\nexport interface ModelStats {\n  requests: number\n  tokens: number\n  inputTokens: number\n  outputTokens: number\n  cost: number\n}\n\nexport interface ErrorStats {\n  timestamp: Date\n  provider: string\n  error: string\n  count: number\n}\n\n// Provider interface\nexport interface AIProvider {\n  name: string\n  \n  // Text capabilities\n  generateText?(prompt: string, options?: GenerateOptions): Promise<string>\n  generateStream?(prompt: string, options?: GenerateOptions): AsyncGenerator<string>\n  generateEmbedding?(text: string): Promise<number[]>\n  classifyText?(text: string, labels: string[]): Promise<Classification>\n  summarize?(text: string, options?: SummarizeOptions): Promise<string>\n  analyzeSentiment?(text: string): Promise<SentimentAnalysis>\n  \n  // Image capabilities\n  generateImage?(prompt: string, options?: ImageGenerationOptions): Promise<ImageResult>\n  analyzeImage?(image: string | Blob, options?: ImageAnalysisOptions): Promise<ImageAnalysis>\n  \n  // Audio capabilities\n  transcribeAudio?(audio: Blob, options?: TranscriptionOptions): Promise<TranscriptionResult>\n  generateSpeech?(text: string, options?: SpeechOptions): Promise<Blob>\n  \n  // Code capabilities\n  generateCode?(prompt: string, options?: CodeGenerationOptions): Promise<CodeResult>\n  explainCode?(code: string, language?: string): Promise<string>\n}","import { AIConfig, AIConfigSchema, AIProviderType } from '../types'\n\nexport class ConfigManager {\n  private config: AIConfig\n  private encryptedKeys = new Map<string, string>()\n\n  constructor(config: Partial<AIConfig>) {\n    // Validate and parse config\n    this.config = AIConfigSchema.parse(config)\n    \n    // Handle API keys\n    if (this.config.apiKey) {\n      this.encryptedKeys.set(this.config.provider, this.encryptApiKey(this.config.apiKey))\n    }\n    \n    if (this.config.apiKeys) {\n      Object.entries(this.config.apiKeys).forEach(([provider, key]) => {\n        this.encryptedKeys.set(provider, this.encryptApiKey(key))\n      })\n    }\n  }\n\n  getConfig(): AIConfig {\n    return { ...this.config }\n  }\n\n  getProviderConfig(provider?: AIProviderType) {\n    const targetProvider = provider || this.config.provider\n    \n    return {\n      provider: targetProvider,\n      apiKey: this.getApiKey(targetProvider),\n      model: this.getModel(targetProvider),\n      baseUrl: this.config.baseUrl,\n      headers: this.config.headers\n    }\n  }\n\n  getApiKey(provider?: AIProviderType): string | undefined {\n    const targetProvider = provider || this.config.provider\n    const encryptedKey = this.encryptedKeys.get(targetProvider)\n    \n    if (encryptedKey) {\n      return this.decryptApiKey(encryptedKey)\n    }\n    \n    return undefined\n  }\n\n  getModel(provider?: AIProviderType): string | undefined {\n    const targetProvider = provider || this.config.provider\n    \n    if (this.config.models && this.config.models[targetProvider]) {\n      return this.config.models[targetProvider]\n    }\n    \n    return this.config.model\n  }\n\n  getCacheConfig() {\n    return this.config.cache || {\n      enabled: true,\n      ttl: 600000,\n      maxSize: 100,\n      strategy: 'lru' as const\n    }\n  }\n\n  getRateLimitConfig() {\n    return this.config.rateLimit || {\n      requestsPerMinute: 60,\n      strategy: 'sliding-window' as const,\n      concurrent: 5\n    }\n  }\n\n  getRetryConfig() {\n    return this.config.retry || {\n      maxAttempts: 3,\n      baseDelay: 1000,\n      maxDelay: 30000,\n      backoff: 'exponential' as const\n    }\n  }\n\n  getFallbackProviders(): AIProviderType[] {\n    return this.config.fallbackProviders || []\n  }\n\n  updateConfig(updates: Partial<AIConfig>) {\n    const newConfig = { ...this.config, ...updates }\n    this.config = AIConfigSchema.parse(newConfig)\n    \n    // Update encrypted keys if needed\n    if (updates.apiKey) {\n      this.encryptedKeys.set(this.config.provider, this.encryptApiKey(updates.apiKey))\n    }\n    \n    if (updates.apiKeys) {\n      Object.entries(updates.apiKeys).forEach(([provider, key]) => {\n        this.encryptedKeys.set(provider, this.encryptApiKey(key))\n      })\n    }\n  }\n\n  // Simple encryption for API keys (in production, use proper encryption)\n  private encryptApiKey(key: string): string {\n    // This is a simple obfuscation - in production, use proper encryption\n    return Buffer.from(key).toString('base64')\n  }\n\n  private decryptApiKey(encryptedKey: string): string {\n    return Buffer.from(encryptedKey, 'base64').toString('utf-8')\n  }\n\n  // Validate provider configuration\n  validateProvider(provider: AIProviderType): { valid: boolean; errors: string[] } {\n    const errors: string[] = []\n    \n    const apiKey = this.getApiKey(provider)\n    if (!apiKey && provider !== 'local' && provider !== 'mock') {\n      errors.push(`API key required for provider: ${provider}`)\n    }\n    \n    const model = this.getModel(provider)\n    if (!model) {\n      errors.push(`Model not specified for provider: ${provider}`)\n    }\n    \n    return {\n      valid: errors.length === 0,\n      errors\n    }\n  }\n\n  // Export configuration (without sensitive data)\n  exportConfig(): Record<string, any> {\n    const { apiKey, apiKeys, ...safeConfig } = this.config\n    \n    return {\n      ...safeConfig,\n      hasApiKey: !!apiKey || !!apiKeys,\n      configuredProviders: Array.from(this.encryptedKeys.keys())\n    }\n  }\n}","import Boom from \"@hapi/boom\";\nimport VError from \"verror\";\n\nexport interface ErrorContext {\n  provider: string;\n  operation: string;\n  model?: string;\n  attempt?: number;\n  metadata?: Record<string, any>;\n}\n\nexport interface EnhancedError extends Error {\n  code?: string;\n  status?: number;\n  category?: string;\n  userMessage?: string;\n  isRetryable?: boolean;\n  context?: ErrorContext;\n  recommendations?: string[];\n  timestamp?: string;\n}\n\nexport class ErrorHandler {\n  private errorHistory: Array<{\n    timestamp: Date;\n    error: EnhancedError;\n    context: ErrorContext;\n    resolved: boolean;\n  }> = [];\n\n  private maxHistorySize = 1000;\n\n  /**\n   * Handle and enhance error\n   */\n  handleError(error: any, context: ErrorContext): EnhancedError {\n    const enhancedError = this.enhanceError(error, context);\n\n    // Add to history\n    this.addToHistory(enhancedError, context);\n\n    return enhancedError;\n  }\n\n  /**\n   * Enhance error with additional information\n   */\n  private enhanceError(error: any, context: ErrorContext): EnhancedError {\n    // Create enhanced error using VError\n    const enhancedError = new VError(\n      {\n        name: this.getErrorName(error),\n        cause: error,\n        info: {\n          ...context,\n          originalError: {\n            message: error.message,\n            code: error.code,\n            status: error.status,\n          },\n        },\n      },\n      this.getErrorMessage(error, context)\n    ) as EnhancedError;\n\n    // Add additional properties\n    enhancedError.code = error.code || this.inferErrorCode(error);\n    enhancedError.status = error.status || this.inferStatusCode(error);\n    enhancedError.category = this.categorizeError(error);\n    enhancedError.userMessage = this.getUserFriendlyMessage(enhancedError);\n    enhancedError.isRetryable = this.isRetryable(enhancedError);\n    enhancedError.context = context;\n    enhancedError.recommendations = this.getRecommendations(enhancedError);\n    enhancedError.timestamp = new Date().toISOString();\n\n    return enhancedError;\n  }\n\n  /**\n   * Get error name based on category\n   */\n  private getErrorName(error: any): string {\n    const category = this.categorizeError(error);\n\n    const errorNames: Record<string, string> = {\n      authentication: \"AuthenticationError\",\n      \"rate-limit\": \"RateLimitError\",\n      \"invalid-request\": \"ValidationError\",\n      \"server-error\": \"ServerError\",\n      network: \"NetworkError\",\n      timeout: \"TimeoutError\",\n      billing: \"BillingError\",\n      \"not-found\": \"NotFoundError\",\n      permission: \"PermissionError\",\n    };\n\n    return errorNames[category] || \"AIProviderError\";\n  }\n\n  /**\n   * Get formatted error message\n   */\n  private getErrorMessage(error: any, context: ErrorContext): string {\n    return `${context.operation} failed on ${context.provider}${\n      context.model ? ` (model: ${context.model})` : \"\"\n    }: ${error.message}`;\n  }\n\n  /**\n   * Categorize error\n   */\n  private categorizeError(error: any): string {\n    const message = error.message?.toLowerCase() || \"\";\n    const code = error.code || error.status;\n\n    if (\n      code === 401 ||\n      message.includes(\"unauthorized\") ||\n      message.includes(\"api key\")\n    ) {\n      return \"authentication\";\n    }\n\n    if (\n      code === 429 ||\n      message.includes(\"rate limit\") ||\n      message.includes(\"quota exceeded\")\n    ) {\n      return \"rate-limit\";\n    }\n\n    if (\n      code === 402 ||\n      message.includes(\"billing\") ||\n      message.includes(\"payment\")\n    ) {\n      return \"billing\";\n    }\n\n    if (\n      code === 400 ||\n      message.includes(\"invalid\") ||\n      message.includes(\"validation\")\n    ) {\n      return \"invalid-request\";\n    }\n\n    if (\n      code === 403 ||\n      message.includes(\"forbidden\") ||\n      message.includes(\"permission\")\n    ) {\n      return \"permission\";\n    }\n\n    if (code === 404 || message.includes(\"not found\")) {\n      return \"not-found\";\n    }\n\n    if (code >= 500 || message.includes(\"internal server\")) {\n      return \"server-error\";\n    }\n\n    if (\n      message.includes(\"network\") ||\n      message.includes(\"econnrefused\") ||\n      message.includes(\"enotfound\")\n    ) {\n      return \"network\";\n    }\n\n    if (message.includes(\"timeout\") || code === \"ETIMEDOUT\") {\n      return \"timeout\";\n    }\n\n    return \"unknown\";\n  }\n\n  /**\n   * Infer error code\n   */\n  private inferErrorCode(error: any): string {\n    if (error.code) return error.code;\n\n    const category = this.categorizeError(error);\n    const codes: Record<string, string> = {\n      authentication: \"AUTH_ERROR\",\n      \"rate-limit\": \"RATE_LIMIT_ERROR\",\n      \"invalid-request\": \"VALIDATION_ERROR\",\n      \"server-error\": \"SERVER_ERROR\",\n      network: \"NETWORK_ERROR\",\n      timeout: \"TIMEOUT_ERROR\",\n      billing: \"BILLING_ERROR\",\n      \"not-found\": \"NOT_FOUND\",\n      permission: \"PERMISSION_DENIED\",\n    };\n\n    return codes[category] || \"UNKNOWN_ERROR\";\n  }\n\n  /**\n   * Infer HTTP status code\n   */\n  private inferStatusCode(error: any): number {\n    if (error.status) return error.status;\n\n    const category = this.categorizeError(error);\n    const statuses: Record<string, number> = {\n      authentication: 401,\n      \"rate-limit\": 429,\n      \"invalid-request\": 400,\n      \"server-error\": 500,\n      network: 503,\n      timeout: 504,\n      billing: 402,\n      \"not-found\": 404,\n      permission: 403,\n    };\n\n    return statuses[category] || 500;\n  }\n\n  /**\n   * Get user-friendly error message\n   */\n  private getUserFriendlyMessage(error: EnhancedError): string {\n    const messages: Record<string, string> = {\n      authentication:\n        \"Authentication failed. Please check your API key and ensure it has the necessary permissions.\",\n      \"rate-limit\":\n        \"Rate limit exceeded. Please wait a moment before trying again.\",\n      billing:\n        \"There is an issue with your billing or quota. Please check your account status.\",\n      \"invalid-request\":\n        \"The request contains invalid parameters. Please check your input and try again.\",\n      \"server-error\":\n        \"The AI service is temporarily unavailable. Please try again later.\",\n      network:\n        \"Network connection issue. Please check your internet connection and try again.\",\n      timeout:\n        \"The request timed out. Please try again with a shorter prompt or wait a moment.\",\n      \"not-found\":\n        \"The requested resource was not found. Please verify the endpoint or model name.\",\n      permission: \"You do not have permission to perform this action.\",\n      unknown:\n        \"An unexpected error occurred. Please try again or contact support if the issue persists.\",\n    };\n\n    return messages[error.category || \"unknown\"] as any;\n  }\n\n  /**\n   * Determine if error is retryable\n   */\n  private isRetryable(error: EnhancedError): boolean {\n    const retryableCategories = [\n      \"rate-limit\",\n      \"server-error\",\n      \"network\",\n      \"timeout\",\n    ];\n    return retryableCategories.includes(error.category || \"\");\n  }\n\n  /**\n   * Get recommendations for resolving the error\n   */\n  private getRecommendations(error: EnhancedError): string[] {\n    const recommendations: string[] = [];\n\n    switch (error.category) {\n      case \"authentication\":\n        recommendations.push(\"Verify your API key is correct\");\n        recommendations.push(\n          \"Check if the API key has been revoked or expired\"\n        );\n        recommendations.push(\n          \"Ensure the API key has the necessary permissions\"\n        );\n        break;\n\n      case \"rate-limit\":\n        recommendations.push(\"Implement request queuing or throttling\");\n        recommendations.push(\n          \"Consider upgrading your API plan for higher limits\"\n        );\n        recommendations.push(\"Spread requests over time to avoid bursts\");\n        break;\n\n      case \"billing\":\n        recommendations.push(\"Check your account balance and payment method\");\n        recommendations.push(\"Review your usage and adjust limits if needed\");\n        recommendations.push(\"Contact support if billing issues persist\");\n        break;\n\n      case \"invalid-request\":\n        recommendations.push(\n          \"Review the API documentation for correct parameters\"\n        );\n        recommendations.push(\"Validate input data before sending requests\");\n        recommendations.push(\n          \"Check for any recent API changes or deprecations\"\n        );\n        break;\n\n      case \"network\":\n        recommendations.push(\"Check your internet connection\");\n        recommendations.push(\"Verify firewall or proxy settings\");\n        recommendations.push(\"Try using a different network\");\n        break;\n\n      case \"timeout\":\n        recommendations.push(\"Reduce the size of your request\");\n        recommendations.push(\"Increase timeout settings if possible\");\n        recommendations.push(\"Break large requests into smaller chunks\");\n        break;\n    }\n\n    // Add context-specific recommendations\n    if (error.context?.attempt && error.context.attempt > 2) {\n      recommendations.push(\"Consider using a fallback provider\");\n      recommendations.push(\"Implement circuit breaker pattern\");\n    }\n\n    return recommendations;\n  }\n\n  /**\n   * Add error to history\n   */\n  private addToHistory(error: EnhancedError, context: ErrorContext): void {\n    this.errorHistory.push({\n      timestamp: new Date(),\n      error,\n      context,\n      resolved: false,\n    });\n\n    // Limit history size\n    if (this.errorHistory.length > this.maxHistorySize) {\n      this.errorHistory = this.errorHistory.slice(-this.maxHistorySize / 2);\n    }\n  }\n\n  /**\n   * Create HTTP-friendly error using Boom\n   */\n  createHttpError(error: EnhancedError): Boom.Boom {\n    const boomError = Boom.boomify(error, {\n      statusCode: error.status || 500,\n      message: error.userMessage,\n    });\n\n    // Add custom data\n    boomError.output.payload.code = error.code;\n    boomError.output.payload.category = error.category;\n    boomError.output.payload.isRetryable = error.isRetryable;\n    boomError.output.payload.recommendations = error.recommendations;\n\n    return boomError;\n  }\n\n  /**\n   * Get error statistics\n   */\n  getErrorStats(timeWindow?: number): {\n    total: number;\n    byCategory: Record<string, number>;\n    byProvider: Record<string, number>;\n    resolutionRate: number;\n    recentErrors: Array<{\n      timestamp: string;\n      category: string;\n      provider: string;\n      message: string;\n    }>;\n  } {\n    const cutoff = timeWindow ? Date.now() - timeWindow : 0;\n    const relevantErrors = this.errorHistory.filter(\n      (entry) => entry.timestamp.getTime() > cutoff\n    );\n\n    const stats = {\n      total: relevantErrors.length,\n      byCategory: {} as Record<string, number>,\n      byProvider: {} as Record<string, number>,\n      resolutionRate: 0,\n      recentErrors: [] as any[],\n    };\n\n    relevantErrors.forEach((entry) => {\n      // Count by category\n      const category = entry.error.category || \"unknown\";\n      stats.byCategory[category] = (stats.byCategory[category] || 0) + 1;\n\n      // Count by provider\n      const provider = entry.context.provider;\n      stats.byProvider[provider] = (stats.byProvider[provider] || 0) + 1;\n\n      // Add to recent errors\n      if (stats.recentErrors.length < 10) {\n        stats.recentErrors.push({\n          timestamp: entry.timestamp.toISOString(),\n          category,\n          provider,\n          message: entry.error.message,\n        });\n      }\n    });\n\n    // Calculate resolution rate\n    const resolved = relevantErrors.filter((e) => e.resolved).length;\n    stats.resolutionRate =\n      relevantErrors.length > 0 ? resolved / relevantErrors.length : 0;\n\n    return stats;\n  }\n\n  /**\n   * Mark error as resolved\n   */\n  markResolved(errorId: string): void {\n    const entry = this.errorHistory.find(\n      (e) => e.timestamp.toISOString() === errorId\n    );\n    if (entry) {\n      entry.resolved = true;\n    }\n  }\n\n  /**\n   * Clear error history\n   */\n  clearHistory(): void {\n    this.errorHistory = [];\n  }\n\n  /**\n   * Export error history\n   */\n  exportHistory(): Array<{\n    timestamp: string;\n    error: any;\n    context: ErrorContext;\n    resolved: boolean;\n  }> {\n    return this.errorHistory.map((entry) => ({\n      timestamp: entry.timestamp.toISOString(),\n      error: {\n        message: entry.error.message,\n        code: entry.error.code,\n        category: entry.error.category,\n        userMessage: entry.error.userMessage,\n        isRetryable: entry.error.isRetryable,\n        recommendations: entry.error.recommendations,\n      },\n      context: entry.context,\n      resolved: entry.resolved,\n    }));\n  }\n}\n","import Bottleneck from \"bottleneck\";\nimport { RateLimitConfig } from \"../types\";\n\ninterface RateLimiterOptions extends RateLimitConfig {\n  id: string;\n}\n\ninterface LimiterStats {\n  running: number;\n  queued: number;\n  done: number;\n  failed: number;\n  reservoir?: number | null;\n}\n\nexport class RateLimiter {\n  private limiters = new Map<string, Bottleneck>();\n  private tokenBuckets = new Map<string, TokenBucket>();\n\n  /**\n   * Create or get a rate limiter for a specific provider/key\n   */\n  createLimiter(options: RateLimiterOptions): Bottleneck {\n    const existingLimiter = this.limiters.get(options.id);\n    if (existingLimiter) {\n      return existingLimiter;\n    }\n\n    // Configure based on strategy\n    let limiterConfig: Bottleneck.ConstructorOptions;\n\n    switch (options.strategy) {\n      case \"token-bucket\":\n        limiterConfig = this.createTokenBucketConfig(options);\n        break;\n\n      case \"fixed-window\":\n        limiterConfig = this.createFixedWindowConfig(options);\n        break;\n\n      case \"sliding-window\":\n      default:\n        limiterConfig = this.createSlidingWindowConfig(options);\n        break;\n    }\n\n    const limiter = new Bottleneck(limiterConfig);\n\n    // Add event handlers\n    limiter.on(\"error\", (error) => {\n      console.error(`Rate limiter error for ${options.id}:`, error);\n    });\n\n    limiter.on(\"failed\", async (error) => {\n      console.warn(`Job failed in rate limiter ${options.id}:`, error);\n      // Retry logic can be added here\n    });\n\n    this.limiters.set(options.id, limiter);\n\n    // Create token bucket if needed\n    if (options.tokensPerMinute || options.tokensPerHour) {\n      this.createTokenBucket(options);\n    }\n\n    return limiter;\n  }\n\n  /**\n   * Get limiter by ID\n   */\n  getLimiter(id: string): Bottleneck | undefined {\n    return this.limiters.get(id);\n  }\n\n  /**\n   * Schedule a job with rate limiting\n   */\n  async schedule<T>(\n    limiterId: string,\n    fn: () => Promise<T>,\n    priority?: number\n  ): Promise<T> {\n    const limiter = this.limiters.get(limiterId);\n    if (!limiter) {\n      throw new Error(`No rate limiter found with ID: ${limiterId}`);\n    }\n\n    const options: Bottleneck.JobOptions = {};\n    if (priority !== undefined) {\n      (options as any).priority = priority;\n    }\n\n    return limiter.schedule(options, fn);\n  }\n\n  /**\n   * Check and consume tokens\n   */\n  async consumeTokens(limiterId: string, tokens: number): Promise<boolean> {\n    const bucket = this.tokenBuckets.get(limiterId);\n    if (!bucket) {\n      return true; // No token limit configured\n    }\n\n    return bucket.consume(tokens);\n  }\n\n  /**\n   * Get statistics for a limiter\n   */\n  async getStats(limiterId: string): Promise<LimiterStats | null> {\n    const limiter = this.limiters.get(limiterId);\n    if (!limiter) {\n      return null;\n    }\n\n    const counts = await limiter.counts();\n    const reservoir = await limiter.currentReservoir();\n\n    return {\n      running: counts.RUNNING,\n      queued: counts.QUEUED,\n      done: counts.DONE || 0,\n      failed: (counts as any).FAILED || 0,\n      reservoir,\n    };\n  }\n\n  /**\n   * Get all limiter statistics\n   */\n  async getAllStats(): Promise<Record<string, LimiterStats>> {\n    const stats: Record<string, LimiterStats> = {};\n\n    for (const [id] of this.limiters) {\n      const limiterStats = await this.getStats(id);\n      if (limiterStats) {\n        stats[id] = limiterStats;\n      }\n    }\n\n    return stats;\n  }\n\n  /**\n   * Update limiter configuration\n   */\n  async updateLimiter(\n    id: string,\n    newConfig: Partial<RateLimiterOptions>\n  ): Promise<void> {\n    const limiter = this.limiters.get(id);\n    if (!limiter) {\n      throw new Error(`No rate limiter found with ID: ${id}`);\n    }\n\n    // Bottleneck doesn't support updating configuration directly\n    // We need to create a new limiter\n    const currentConfig = await this.getLimiterConfig(id);\n    const mergedConfig = { ...currentConfig, ...newConfig, id };\n\n    // Stop the old limiter\n    await limiter.stop();\n    this.limiters.delete(id);\n\n    // Create new limiter with updated config\n    this.createLimiter(mergedConfig as RateLimiterOptions);\n  }\n\n  /**\n   * Clear queued jobs for a limiter\n   */\n  async clearQueue(limiterId: string): Promise<void> {\n    const limiter = this.limiters.get(limiterId);\n    if (limiter) {\n      await limiter.stop({ dropWaitingJobs: true });\n    }\n  }\n\n  /**\n   * Stop a limiter\n   */\n  async stopLimiter(limiterId: string): Promise<void> {\n    const limiter = this.limiters.get(limiterId);\n    if (limiter) {\n      await limiter.stop();\n      this.limiters.delete(limiterId);\n    }\n\n    const bucket = this.tokenBuckets.get(limiterId);\n    if (bucket) {\n      bucket.stop();\n      this.tokenBuckets.delete(limiterId);\n    }\n  }\n\n  /**\n   * Stop all limiters\n   */\n  async stopAll(): Promise<void> {\n    const stopPromises: Promise<void>[] = [];\n\n    for (const [id] of this.limiters) {\n      stopPromises.push(this.stopLimiter(id));\n    }\n\n    await Promise.all(stopPromises);\n  }\n\n  /**\n   * Create sliding window configuration\n   */\n  private createSlidingWindowConfig(\n    options: RateLimiterOptions\n  ): Bottleneck.ConstructorOptions {\n    const requestsPerMinute = options.requestsPerMinute || 60;\n    const minTime = Math.ceil(60000 / requestsPerMinute); // ms between requests\n\n    return {\n      maxConcurrent: options.concurrent || 5,\n      minTime,\n      highWater: Math.max(100, requestsPerMinute * 2), // Queue size\n      strategy: Bottleneck.strategy.LEAK, // Process queue steadily\n      rejectOnDrop: false,\n    };\n  }\n\n  /**\n   * Create fixed window configuration\n   */\n  private createFixedWindowConfig(\n    options: RateLimiterOptions\n  ): Bottleneck.ConstructorOptions {\n    const requestsPerMinute = options.requestsPerMinute || 60;\n\n    return {\n      maxConcurrent: options.concurrent || 5,\n      reservoir: requestsPerMinute,\n      reservoirRefreshInterval: 60000, // 1 minute\n      reservoirRefreshAmount: requestsPerMinute,\n      highWater: Math.max(100, requestsPerMinute * 2),\n      strategy: Bottleneck.strategy.LEAK,\n    };\n  }\n\n  /**\n   * Create token bucket configuration\n   */\n  private createTokenBucketConfig(\n    options: RateLimiterOptions\n  ): Bottleneck.ConstructorOptions {\n    const requestsPerMinute = options.requestsPerMinute || 60;\n    const refillRate = Math.ceil(requestsPerMinute / 60); // tokens per second\n\n    return {\n      maxConcurrent: options.concurrent || 5,\n      reservoir: requestsPerMinute,\n      reservoirRefreshInterval: 1000, // Refill every second\n      reservoirRefreshAmount: refillRate,\n      highWater: Math.max(100, requestsPerMinute * 2),\n      strategy: Bottleneck.strategy.LEAK,\n    };\n  }\n\n  /**\n   * Create token bucket for token-based rate limiting\n   */\n  private createTokenBucket(options: RateLimiterOptions): void {\n    const bucket = new TokenBucket(options);\n    this.tokenBuckets.set(options.id, bucket);\n  }\n\n  /**\n   * Get limiter configuration (mock implementation)\n   */\n  private async getLimiterConfig(\n    _id: string\n  ): Promise<Partial<RateLimiterOptions>> {\n    // In a real implementation, you might store configs separately\n    return {\n      requestsPerMinute: 60,\n      strategy: \"sliding-window\",\n      concurrent: 5,\n    };\n  }\n}\n\n/**\n * Token bucket implementation for token-based rate limiting\n */\nclass TokenBucket {\n  private tokens: number;\n  private maxTokens: number;\n  private refillRate: number;\n  private lastRefill: number;\n  private interval?: NodeJS.Timeout;\n\n  constructor(options: RateLimiterOptions) {\n    this.maxTokens = options.tokensPerMinute || 100000;\n    this.tokens = this.maxTokens;\n    this.refillRate = this.maxTokens / 60000; // tokens per ms\n    this.lastRefill = Date.now();\n\n    // Start refill timer\n    this.startRefillTimer();\n  }\n\n  /**\n   * Try to consume tokens\n   */\n  consume(amount: number): boolean {\n    this.refill();\n\n    if (this.tokens >= amount) {\n      this.tokens -= amount;\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Get available tokens\n   */\n  getAvailable(): number {\n    this.refill();\n    return Math.floor(this.tokens);\n  }\n\n  /**\n   * Refill tokens based on elapsed time\n   */\n  private refill(): void {\n    const now = Date.now();\n    const elapsed = now - this.lastRefill;\n    const tokensToAdd = elapsed * this.refillRate;\n\n    this.tokens = Math.min(this.maxTokens, this.tokens + tokensToAdd);\n    this.lastRefill = now;\n  }\n\n  /**\n   * Start automatic refill timer\n   */\n  private startRefillTimer(): void {\n    this.interval = setInterval(() => {\n      this.refill();\n    }, 1000); // Refill every second\n  }\n\n  /**\n   * Stop the token bucket\n   */\n  stop(): void {\n    if (this.interval) {\n      clearInterval(this.interval);\n    }\n  }\n}\n","import pRetry, { AbortError } from 'p-retry'\nimport { backOff } from 'exponential-backoff'\nimport VError from 'verror'\nimport { RetryConfig } from '../types'\n\ninterface RetryContext {\n  provider: string\n  operation: string\n  model?: string\n  metadata?: Record<string, any>\n}\n\ninterface RetryOptions extends RetryConfig {\n  onRetry?: (error: Error, attempt: number) => void\n  shouldRetry?: (error: any) => boolean\n}\n\nexport class RetryManager {\n  private config: RetryConfig\n\n  constructor(config: RetryConfig) {\n    this.config = config\n  }\n\n  /**\n   * Execute operation with retry logic\n   */\n  async execute<T>(\n    operation: () => Promise<T>,\n    context: RetryContext,\n    options?: Partial<RetryOptions>\n  ): Promise<T> {\n    const mergedOptions = { ...this.config, ...options }\n    \n    return pRetry(\n      async (attemptNumber) => {\n        try {\n          return await operation()\n        } catch (error) {\n          // Wrap error with context\n          const wrappedError = this.wrapError(error, context, attemptNumber)\n          \n          // Check if we should retry\n          if (!this.shouldRetry(error, mergedOptions)) {\n            throw new AbortError(wrappedError)\n          }\n          \n          // Call retry callback if provided\n          if (mergedOptions.onRetry) {\n            mergedOptions.onRetry(wrappedError, attemptNumber)\n          }\n          \n          throw wrappedError\n        }\n      },\n      {\n        retries: mergedOptions.maxAttempts - 1,\n        factor: mergedOptions.backoff === 'exponential' ? 2 : 1,\n        minTimeout: mergedOptions.baseDelay,\n        maxTimeout: mergedOptions.maxDelay,\n        randomize: true,\n        onFailedAttempt: (error) => {\n          // Log failed attempts\n          console.warn(\n            `Retry attempt ${error.attemptNumber} failed for ${context.operation}:`,\n            error.message\n          )\n        }\n      }\n    )\n  }\n\n  /**\n   * Execute with custom exponential backoff\n   */\n  async executeWithBackoff<T>(\n    operation: () => Promise<T>,\n    context: RetryContext,\n    options?: Partial<RetryOptions>\n  ): Promise<T> {\n    const mergedOptions = { ...this.config, ...options }\n    \n    try {\n      return await backOff(operation, {\n        numOfAttempts: mergedOptions.maxAttempts,\n        startingDelay: mergedOptions.baseDelay,\n        maxDelay: mergedOptions.maxDelay,\n        jitter: 'full',\n        timeMultiple: 2,\n        retry: (error, attemptNumber) => {\n          const shouldRetry = this.shouldRetry(error, mergedOptions)\n          \n          if (shouldRetry && mergedOptions.onRetry) {\n            mergedOptions.onRetry(error, attemptNumber)\n          }\n          \n          return shouldRetry\n        }\n      })\n    } catch (error) {\n      throw this.wrapError(error, context, mergedOptions.maxAttempts)\n    }\n  }\n\n  /**\n   * Wrap error with context information\n   */\n  private wrapError(error: any, context: RetryContext, attempt: number): Error {\n    return new VError(\n      {\n        name: 'AIProviderError',\n        cause: error,\n        info: {\n          ...context,\n          attempt,\n          timestamp: new Date().toISOString(),\n          errorCode: error.code || error.status,\n          errorType: this.categorizeError(error)\n        }\n      },\n      `Failed to execute ${context.operation} on ${context.provider} (attempt ${attempt})`\n    )\n  }\n\n  /**\n   * Determine if error should trigger retry\n   */\n  private shouldRetry(error: any, options: RetryOptions): boolean {\n    // Use custom retry logic if provided\n    if (options.shouldRetry) {\n      return options.shouldRetry(error)\n    }\n    \n    // Check error categorization\n    const errorType = this.categorizeError(error)\n    \n    switch (errorType) {\n      case 'authentication':\n      case 'invalid_request':\n      case 'not_found':\n      case 'permission_denied':\n        // Don't retry these errors\n        return false\n      \n      case 'rate_limit':\n        // Always retry rate limits with backoff\n        return true\n      \n      case 'server_error':\n      case 'network':\n      case 'timeout':\n        // Retry these errors\n        return true\n      \n      default:\n        // Default to retry for unknown errors\n        return true\n    }\n  }\n\n  /**\n   * Categorize error type\n   */\n  private categorizeError(error: any): string {\n    const message = error.message?.toLowerCase() || ''\n    const code = error.code || error.status\n    \n    // Authentication errors\n    if (\n      code === 401 ||\n      message.includes('unauthorized') ||\n      message.includes('api key') ||\n      message.includes('authentication')\n    ) {\n      return 'authentication'\n    }\n    \n    // Rate limiting\n    if (code === 429 || message.includes('rate limit')) {\n      return 'rate_limit'\n    }\n    \n    // Invalid request\n    if (\n      code === 400 ||\n      message.includes('invalid') ||\n      message.includes('validation')\n    ) {\n      return 'invalid_request'\n    }\n    \n    // Not found\n    if (code === 404 || message.includes('not found')) {\n      return 'not_found'\n    }\n    \n    // Permission denied\n    if (code === 403 || message.includes('forbidden')) {\n      return 'permission_denied'\n    }\n    \n    // Server errors\n    if (code >= 500 || message.includes('internal server')) {\n      return 'server_error'\n    }\n    \n    // Network errors\n    if (\n      message.includes('network') ||\n      message.includes('econnrefused') ||\n      message.includes('enotfound') ||\n      message.includes('econnreset')\n    ) {\n      return 'network'\n    }\n    \n    // Timeout\n    if (\n      message.includes('timeout') ||\n      message.includes('etimedout') ||\n      code === 'ETIMEDOUT'\n    ) {\n      return 'timeout'\n    }\n    \n    return 'unknown'\n  }\n\n  /**\n   * Create a retry wrapper for a function\n   */\n  wrap<T extends (...args: any[]) => Promise<any>>(\n    fn: T,\n    context: RetryContext,\n    options?: Partial<RetryOptions>\n  ): T {\n    return (async (...args: Parameters<T>) => {\n      return this.execute(() => fn(...args), context, options)\n    }) as T\n  }\n\n  /**\n   * Update configuration\n   */\n  updateConfig(config: Partial<RetryConfig>): void {\n    this.config = { ...this.config, ...config }\n  }\n\n  /**\n   * Get current configuration\n   */\n  getConfig(): RetryConfig {\n    return { ...this.config }\n  }\n\n  /**\n   * Calculate delay for next retry\n   */\n  calculateDelay(attempt: number, options?: Partial<RetryOptions>): number {\n    const mergedOptions = { ...this.config, ...options }\n    \n    let delay: number\n    \n    switch (mergedOptions.backoff) {\n      case 'exponential':\n        delay = Math.min(\n          mergedOptions.baseDelay * Math.pow(2, attempt - 1),\n          mergedOptions.maxDelay\n        )\n        break\n      \n      case 'linear':\n        delay = Math.min(\n          mergedOptions.baseDelay * attempt,\n          mergedOptions.maxDelay\n        )\n        break\n      \n      case 'fixed':\n      default:\n        delay = mergedOptions.baseDelay\n        break\n    }\n    \n    // Add jitter to prevent thundering herd\n    const jitter = delay * 0.2 * Math.random()\n    return Math.floor(delay + jitter)\n  }\n\n  /**\n   * Get retry statistics\n   */\n  getRetryStats(error: any): {\n    shouldRetry: boolean\n    errorType: string\n    suggestedDelay: number\n    maxAttempts: number\n  } {\n    const errorType = this.categorizeError(error)\n    const shouldRetry = this.shouldRetry(error, this.config)\n    \n    // Suggest longer delays for rate limits\n    let suggestedDelay = this.config.baseDelay\n    if (errorType === 'rate_limit') {\n      suggestedDelay = this.config.baseDelay * 2\n    }\n    \n    return {\n      shouldRetry,\n      errorType,\n      suggestedDelay,\n      maxAttempts: this.config.maxAttempts\n    }\n  }\n}","import { encode } from \"gpt-tokenizer\";\nimport { encoding_for_model, get_encoding } from \"tiktoken\";\n\ninterface TokenInfo {\n  count: number;\n  truncated: boolean;\n  originalLength?: number;\n}\n\ninterface ModelTokenLimits {\n  [model: string]: number;\n}\n\nexport class TokenManager {\n  // // private encoders = new Map<string, any>()\n\n  private tokenLimits: ModelTokenLimits = {\n    // OpenAI models\n    \"gpt-4\": 8192,\n    \"gpt-4-32k\": 32768,\n    \"gpt-4-turbo\": 128000,\n    \"gpt-4-turbo-preview\": 128000,\n    \"gpt-3.5-turbo\": 4096,\n    \"gpt-3.5-turbo-16k\": 16384,\n\n    // Anthropic models\n    \"claude-3-opus\": 200000,\n    \"claude-3-sonnet\": 200000,\n    \"claude-3-haiku\": 200000,\n    \"claude-2.1\": 200000,\n    \"claude-2\": 100000,\n\n    // Google models\n    \"gemini-pro\": 30720,\n    \"gemini-pro-vision\": 30720,\n    \"palm-2\": 8192,\n\n    // Default\n    default: 4096,\n  };\n\n  private modelPricing = {\n    // OpenAI pricing per 1K tokens\n    \"gpt-4\": { input: 0.03, output: 0.06 },\n    \"gpt-4-turbo\": { input: 0.01, output: 0.03 },\n    \"gpt-3.5-turbo\": { input: 0.0005, output: 0.0015 },\n\n    // Anthropic pricing per 1K tokens\n    \"claude-3-opus\": { input: 0.015, output: 0.075 },\n    \"claude-3-sonnet\": { input: 0.003, output: 0.015 },\n    \"claude-3-haiku\": { input: 0.00025, output: 0.00125 },\n\n    // Google pricing per 1K tokens\n    \"gemini-pro\": { input: 0.0005, output: 0.0015 },\n\n    // Default free\n    default: { input: 0, output: 0 },\n  };\n\n  /**\n   * Count tokens in text for a specific model\n   */\n  async countTokens(text: string, model: string): Promise<number> {\n    try {\n      // Use tiktoken for OpenAI models\n      if (\n        model.includes(\"gpt\") ||\n        model.includes(\"davinci\") ||\n        model.includes(\"turbo\")\n      ) {\n        return this.countTokensWithTiktoken(text, model);\n      }\n\n      // Use gpt-tokenizer as fallback for other models\n      return encode(text).length;\n    } catch (error) {\n      // Fallback to character-based estimation\n      return this.estimateTokens(text);\n    }\n  }\n\n  /**\n   * Count tokens using tiktoken\n   */\n  private countTokensWithTiktoken(text: string, model: string): number {\n    try {\n      // Try to get encoding for specific model\n      const encoder = encoding_for_model(model as any);\n      const tokens = encoder.encode(text);\n      const count = tokens.length;\n      encoder.free(); // Free memory\n      return count;\n    } catch {\n      // Fallback to cl100k_base encoding\n      const encoder = get_encoding(\"cl100k_base\");\n      const tokens = encoder.encode(text);\n      const count = tokens.length;\n      encoder.free();\n      return count;\n    }\n  }\n\n  /**\n   * Estimate tokens based on character count\n   */\n  private estimateTokens(text: string): number {\n    // Rough estimation: 1 token ≈ 4 characters for English\n    // Adjust for other languages if needed\n    return Math.ceil(text.length / 4);\n  }\n\n  /**\n   * Get token information for text\n   */\n  async getTokenInfo(\n    text: string,\n    model: string,\n    maxTokens?: number\n  ): Promise<TokenInfo> {\n    const count = await this.countTokens(text, model);\n    const limit =\n      maxTokens ?? this.tokenLimits[model] ?? this.tokenLimits.default ?? 4096;\n\n    return {\n      count,\n      truncated: count > limit,\n      originalLength: text.length,\n    };\n  }\n\n  /**\n   * Validate if text fits within token limits\n   */\n  async validateTokenLimits(\n    text: string,\n    model: string,\n    maxTokens?: number,\n    responseTokens: number = 1000\n  ): Promise<{ valid: boolean; availableTokens: number }> {\n    const promptTokens = await this.countTokens(text, model);\n    const modelLimit =\n      this.tokenLimits[model] ?? this.tokenLimits.default ?? 4096;\n    const limit = maxTokens ?? modelLimit;\n\n    const totalRequired = promptTokens + responseTokens;\n    const valid = totalRequired <= limit;\n    const availableTokens = Math.max(0, limit - promptTokens);\n\n    return { valid, availableTokens };\n  }\n\n  /**\n   * Truncate text to fit within token limit\n   */\n  async truncateToTokenLimit(\n    text: string,\n    model: string,\n    maxTokens: number,\n    preserveEnd: boolean = false\n  ): Promise<string> {\n    const currentTokens = await this.countTokens(text, model);\n\n    if (currentTokens <= maxTokens) {\n      return text;\n    }\n\n    // Binary search for the right length\n    let low = 0;\n    let high = text.length;\n    let bestFit = \"\";\n\n    while (low <= high) {\n      const mid = Math.floor((low + high) / 2);\n      const substring = preserveEnd\n        ? text.slice(text.length - mid)\n        : text.slice(0, mid);\n\n      const tokens = await this.countTokens(substring, model);\n\n      if (tokens <= maxTokens) {\n        bestFit = substring;\n        low = mid + 1;\n      } else {\n        high = mid - 1;\n      }\n    }\n\n    // Add ellipsis if truncated\n    if (preserveEnd) {\n      return \"...\" + bestFit;\n    } else {\n      return bestFit + \"...\";\n    }\n  }\n\n  /**\n   * Split text into chunks that fit within token limits\n   */\n  async splitIntoChunks(\n    text: string,\n    model: string,\n    chunkSize: number,\n    overlap: number = 0\n  ): Promise<string[]> {\n    const chunks: string[] = [];\n    const sentences = this.splitIntoSentences(text);\n\n    let currentChunk = \"\";\n    let currentTokens = 0;\n\n    for (const sentence of sentences) {\n      const sentenceTokens = await this.countTokens(sentence, model);\n\n      if (currentTokens + sentenceTokens > chunkSize && currentChunk) {\n        chunks.push(currentChunk.trim());\n\n        // Handle overlap\n        if (overlap > 0) {\n          const overlapText = await this.getOverlapText(\n            currentChunk,\n            model,\n            overlap\n          );\n          currentChunk = overlapText + \" \" + sentence;\n          currentTokens = await this.countTokens(currentChunk, model);\n        } else {\n          currentChunk = sentence;\n          currentTokens = sentenceTokens;\n        }\n      } else {\n        currentChunk += (currentChunk ? \" \" : \"\") + sentence;\n        currentTokens += sentenceTokens;\n      }\n    }\n\n    if (currentChunk) {\n      chunks.push(currentChunk.trim());\n    }\n\n    return chunks;\n  }\n\n  /**\n   * Split text into sentences\n   */\n  private splitIntoSentences(text: string): string[] {\n    // Simple sentence splitting - can be improved with better NLP\n    return text.match(/[^.!?]+[.!?]+/g) || [text];\n  }\n\n  /**\n   * Get overlap text for chunking\n   */\n  private async getOverlapText(\n    text: string,\n    model: string,\n    overlapTokens: number\n  ): Promise<string> {\n    const sentences = this.splitIntoSentences(text).reverse();\n    let overlapText = \"\";\n    let currentTokens = 0;\n\n    for (const sentence of sentences) {\n      const sentenceTokens = await this.countTokens(sentence, model);\n      if (currentTokens + sentenceTokens <= overlapTokens) {\n        overlapText = sentence + \" \" + overlapText;\n        currentTokens += sentenceTokens;\n      } else {\n        break;\n      }\n    }\n\n    return overlapText.trim();\n  }\n\n  /**\n   * Estimate cost for tokens\n   */\n  estimateCost(\n    tokens: number,\n    model: string,\n    type: \"input\" | \"output\" = \"input\"\n  ): number {\n    const pricing =\n      this.modelPricing[model as keyof typeof this.modelPricing] ??\n      this.modelPricing.default;\n    return (tokens / 1000) * pricing[type];\n  }\n\n  /**\n   * Get model token limit\n   */\n  getModelTokenLimit(model: string): number {\n    return this.tokenLimits[model] ?? this.tokenLimits.default ?? 4096;\n  }\n\n  /**\n   * Get all model limits\n   */\n  getAllModelLimits(): ModelTokenLimits {\n    return { ...this.tokenLimits };\n  }\n\n  /**\n   * Estimate tokens for a conversation\n   */\n  async estimateConversationTokens(\n    messages: Array<{ role: string; content: string }>,\n    model: string\n  ): Promise<number> {\n    let totalTokens = 0;\n\n    for (const message of messages) {\n      // Add tokens for role and content\n      totalTokens += await this.countTokens(\n        `${message.role}: ${message.content}`,\n        model\n      );\n      // Add separator tokens (approximate)\n      totalTokens += 4;\n    }\n\n    return totalTokens;\n  }\n}\n","import { Analytics } from \"../monitoring/analytics\";\nimport { PerformanceMonitor } from \"../monitoring/performance-monitor\";\nimport { AnthropicProvider } from \"../providers/anthropic-provider\";\nimport { BaseProvider } from \"../providers/base-provider\";\nimport { GoogleProvider } from \"../providers/google-provider\";\nimport { MockProvider } from \"../providers/mock-provider\";\nimport { OpenAIProvider } from \"../providers/openai-provider\";\nimport {\n  AIConfig,\n  AIProviderType,\n  Classification,\n  CodeGenerationOptions,\n  CodeResult,\n  GenerateOptions,\n  ImageGenerationOptions,\n  ImageResult,\n  SpeechOptions,\n  SummarizeOptions,\n  TokenUsage,\n  TranscriptionOptions,\n  TranscriptionResult,\n} from \"../types\";\nimport { CacheManager } from \"./cache-manager\";\nimport { ConfigManager } from \"./config-manager\";\nimport { ErrorHandler } from \"./error-handler\";\nimport { RateLimiter } from \"./rate-limiter\";\nimport { RetryManager } from \"./retry-manager\";\nimport { TokenManager } from \"./token-manager\";\n\nexport interface AIEngineOptions extends Partial<AIConfig> {\n  debug?: boolean;\n}\n\nexport class AIEngine {\n  private config: ConfigManager;\n  private providers = new Map<AIProviderType, BaseProvider>();\n  private cache: CacheManager;\n  private rateLimiter: RateLimiter;\n  private retryManager: RetryManager;\n  private tokenManager: TokenManager;\n  private errorHandler: ErrorHandler;\n  private performanceMonitor: PerformanceMonitor;\n  private analytics: Analytics;\n  private debug: boolean;\n\n  constructor(options: AIEngineOptions) {\n    this.debug = options.debug || false;\n\n    // Initialize core components\n    this.config = new ConfigManager(options);\n    this.cache = new CacheManager({\n      ...this.config.getCacheConfig(),\n      namespace: \"ai-engine\",\n    });\n    this.rateLimiter = new RateLimiter();\n    this.retryManager = new RetryManager(this.config.getRetryConfig());\n    this.tokenManager = new TokenManager();\n    this.errorHandler = new ErrorHandler();\n    this.performanceMonitor = new PerformanceMonitor();\n    this.analytics = new Analytics();\n\n    // Initialize providers\n    this.initializeProviders();\n\n    // Setup rate limiters\n    this.setupRateLimiters();\n\n    this.log(\"AI Engine initialized\", { config: this.config.exportConfig() });\n  }\n\n  /**\n   * Initialize providers based on configuration\n   */\n  private initializeProviders(): void {\n    const mainProvider = this.config.getConfig().provider;\n    const fallbackProviders = this.config.getFallbackProviders();\n    const allProviders = [mainProvider, ...fallbackProviders];\n\n    for (const providerType of allProviders) {\n      try {\n        const provider = this.createProvider(providerType);\n        if (provider) {\n          this.providers.set(providerType, provider);\n          this.log(`Provider initialized: ${providerType}`);\n        }\n      } catch (error) {\n        this.log(`Failed to initialize provider: ${providerType}`, error);\n      }\n    }\n  }\n\n  /**\n   * Create a provider instance\n   */\n  private createProvider(type: AIProviderType): BaseProvider | null {\n    const providerConfig = this.config.getProviderConfig(type);\n\n    if (!providerConfig.apiKey && type !== \"mock\" && type !== \"local\") {\n      this.log(`No API key for provider: ${type}`);\n      return null;\n    }\n\n    const config = {\n      name: type,\n      apiKey: providerConfig.apiKey,\n      model: providerConfig.model,\n      baseUrl: providerConfig.baseUrl,\n      headers: providerConfig.headers,\n      timeout: this.config.getConfig().timeout,\n      maxRetries: this.config.getConfig().maxRetries,\n    };\n\n    switch (type) {\n      case \"openai\":\n        return new OpenAIProvider(config);\n      case \"anthropic\":\n        return new AnthropicProvider(config);\n      case \"google\":\n        return new GoogleProvider(config);\n      case \"mock\":\n        return new MockProvider(config);\n      default:\n        return null;\n    }\n  }\n\n  /**\n   * Setup rate limiters for each provider\n   */\n  private setupRateLimiters(): void {\n    const rateLimitConfig = this.config.getRateLimitConfig();\n\n    for (const [providerType] of this.providers) {\n      this.rateLimiter.createLimiter({\n        id: providerType,\n        ...rateLimitConfig,\n      });\n    }\n  }\n\n  /**\n   * Get provider with fallback support\n   */\n  private async getProvider(): Promise<{\n    provider: BaseProvider;\n    type: AIProviderType;\n  }> {\n    const mainType = this.config.getConfig().provider;\n    const mainProvider = this.providers.get(mainType);\n\n    if (mainProvider) {\n      return { provider: mainProvider, type: mainType };\n    }\n\n    // Try fallback providers\n    const fallbacks = this.config.getFallbackProviders();\n    for (const fallbackType of fallbacks) {\n      const fallbackProvider = this.providers.get(fallbackType);\n      if (fallbackProvider) {\n        this.log(`Using fallback provider: ${fallbackType}`);\n        return { provider: fallbackProvider, type: fallbackType };\n      }\n    }\n\n    throw new Error(\"No available providers\");\n  }\n\n  /**\n   * Execute operation with full pipeline\n   */\n  private async executeOperation<T>(\n    operation: string,\n    execute: (provider: BaseProvider) => Promise<T>,\n    options?: {\n      cacheKey?: string;\n      estimatedTokens?: number;\n      skipCache?: boolean;\n    }\n  ): Promise<T> {\n    const operationId = `${operation}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n\n    // Check cache\n    if (!options?.skipCache && options?.cacheKey) {\n      const cached = await this.cache.get<T>(options.cacheKey);\n      if (cached !== null) {\n        this.analytics.trackEvent({\n          type: \"cache_hit\",\n          provider: \"cache\",\n          operation,\n        });\n        return cached;\n      }\n    }\n\n    // Get provider\n    const { provider, type: providerType } = await this.getProvider();\n\n    // Start performance monitoring\n    this.performanceMonitor.startOperation(\n      operationId,\n      operation,\n      providerType\n    );\n\n    try {\n      // Check token limits if needed\n      if (options?.estimatedTokens) {\n        const consumed = await this.rateLimiter.consumeTokens(\n          providerType,\n          options.estimatedTokens\n        );\n        if (!consumed) {\n          throw new Error(\"Token limit exceeded\");\n        }\n      }\n\n      // Execute with rate limiting and retry\n      const result = await this.rateLimiter.schedule(providerType, () =>\n        this.retryManager.execute(() => execute(provider), {\n          provider: providerType,\n          operation,\n        })\n      );\n\n      // End performance monitoring\n      const perfReport = this.performanceMonitor.endOperation(\n        operationId,\n        true\n      );\n\n      // Track analytics\n      this.analytics.trackEvent({\n        type: \"success\",\n        provider: providerType,\n        operation,\n        model: this.config.getModel(providerType),\n        latency: perfReport?.duration,\n      });\n\n      // Cache result if applicable\n      if (!options?.skipCache && options?.cacheKey) {\n        await this.cache.set(options.cacheKey, result);\n      }\n\n      return result;\n    } catch (error) {\n      // Handle error\n      const enhancedError = this.errorHandler.handleError(error, {\n        provider: providerType,\n        operation,\n      });\n\n      // End performance monitoring\n      this.performanceMonitor.endOperation(\n        operationId,\n        false,\n        enhancedError.message\n      );\n\n      // Track error\n      this.analytics.trackEvent({\n        type: \"error\",\n        provider: providerType,\n        operation,\n        error: enhancedError.message,\n      });\n\n      throw enhancedError;\n    }\n  }\n\n  /**\n   * Generate text completion\n   */\n  async generateText(\n    prompt: string,\n    options?: GenerateOptions\n  ): Promise<string> {\n    const cacheKey = this.cache.createTextGenerationKey(\n      prompt,\n      options,\n      this.config.getConfig().provider,\n      this.config.getModel()\n    );\n\n    const estimatedTokens = await this.tokenManager.countTokens(\n      prompt,\n      this.config.getModel() || \"gpt-3.5-turbo\"\n    );\n\n    const result = await this.executeOperation(\n      \"generateText\",\n      (provider) => provider.generateText(prompt, options),\n      {\n        cacheKey,\n        estimatedTokens,\n        skipCache: options?.stream,\n      }\n    );\n\n    // Track token usage\n    const responseTokens = await this.tokenManager.countTokens(\n      result,\n      this.config.getModel() || \"gpt-3.5-turbo\"\n    );\n\n    const usage: TokenUsage = {\n      promptTokens: estimatedTokens,\n      completionTokens: responseTokens,\n      totalTokens: estimatedTokens + responseTokens,\n    };\n\n    const cost =\n      this.tokenManager.estimateCost(\n        usage.promptTokens,\n        this.config.getModel() || \"gpt-3.5-turbo\",\n        \"input\"\n      ) +\n      this.tokenManager.estimateCost(\n        usage.completionTokens,\n        this.config.getModel() || \"gpt-3.5-turbo\",\n        \"output\"\n      );\n\n    this.analytics.trackEvent({\n      type: \"success\",\n      provider: this.config.getConfig().provider,\n      operation: \"generateText\",\n      model: this.config.getModel(),\n      tokens: {\n        prompt: usage.promptTokens,\n        completion: usage.completionTokens,\n        total: usage.totalTokens,\n      },\n      cost,\n    });\n\n    return result;\n  }\n\n  /**\n   * Generate streaming text completion\n   */\n  async *generateStream(\n    prompt: string,\n    options?: GenerateOptions\n  ): AsyncGenerator<string> {\n    const { provider, type: providerType } = await this.getProvider();\n\n    if (!provider.generateStream) {\n      throw new Error(`Provider ${providerType} does not support streaming`);\n    }\n\n    const operationId = `generateStream-${Date.now()}`;\n    this.performanceMonitor.startOperation(\n      operationId,\n      \"generateStream\",\n      providerType\n    );\n\n    try {\n      yield* provider.generateStream(prompt, options);\n\n      this.performanceMonitor.endOperation(operationId, true);\n\n      this.analytics.trackEvent({\n        type: \"success\",\n        provider: providerType,\n        operation: \"generateStream\",\n        model: this.config.getModel(providerType),\n      });\n    } catch (error: any) {\n      this.performanceMonitor.endOperation(operationId, false, error.message);\n\n      this.analytics.trackEvent({\n        type: \"error\",\n        provider: providerType,\n        operation: \"generateStream\",\n        error: error.message,\n      });\n\n      throw error;\n    }\n  }\n\n  /**\n   * Generate embeddings\n   */\n  async generateEmbedding(text: string): Promise<number[]> {\n    const cacheKey = this.cache.createEmbeddingKey(\n      text,\n      this.config.getConfig().provider,\n      this.config.getModel()\n    );\n\n    return this.executeOperation(\n      \"generateEmbedding\",\n      (provider) => provider.generateEmbedding(text),\n      { cacheKey }\n    );\n  }\n\n  /**\n   * Classify text\n   */\n  async classifyText(text: string, labels: string[]): Promise<Classification> {\n    const cacheKey = this.cache.generateKey(\"classifyText\", [text, labels]);\n\n    return this.executeOperation(\n      \"classifyText\",\n      (provider) => provider.classifyText(text, labels),\n      { cacheKey }\n    );\n  }\n\n  /**\n   * Summarize text\n   */\n  async summarize(text: string, options?: SummarizeOptions): Promise<string> {\n    const cacheKey = this.cache.generateKey(\"summarize\", [text, options]);\n\n    return this.executeOperation(\n      \"summarize\",\n      (provider) => provider.summarize(text, options),\n      { cacheKey }\n    );\n  }\n\n  /**\n   * Generate image\n   */\n  async generateImage(\n    prompt: string,\n    options?: ImageGenerationOptions\n  ): Promise<ImageResult> {\n    return this.executeOperation(\"generateImage\", (provider) =>\n      provider.generateImage(prompt, options)\n    );\n  }\n\n  /**\n   * Transcribe audio\n   */\n  async transcribeAudio(\n    audio: Blob,\n    options?: TranscriptionOptions\n  ): Promise<TranscriptionResult> {\n    return this.executeOperation(\"transcribeAudio\", (provider) =>\n      provider.transcribeAudio(audio, options)\n    );\n  }\n\n  /**\n   * Generate speech\n   */\n  async generateSpeech(text: string, options?: SpeechOptions): Promise<Blob> {\n    return this.executeOperation(\"generateSpeech\", (provider) =>\n      provider.generateSpeech(text, options)\n    );\n  }\n\n  /**\n   * Generate code\n   */\n  async generateCode(\n    prompt: string,\n    options?: CodeGenerationOptions\n  ): Promise<CodeResult> {\n    return this.executeOperation(\"generateCode\", (provider) =>\n      provider.generateCode(prompt, options)\n    );\n  }\n\n  /**\n   * Update configuration\n   */\n  async updateConfig(config: Partial<AIConfig>): Promise<void> {\n    this.config.updateConfig(config);\n\n    // Reinitialize components if needed\n    this.initializeProviders();\n    this.setupRateLimiters();\n\n    this.log(\"Configuration updated\", { config: this.config.exportConfig() });\n  }\n\n  /**\n   * Get current statistics\n   */\n  getStats() {\n    return {\n      usage: this.analytics.getStats(),\n      performance: this.performanceMonitor.getStats(),\n      cache: this.cache.getStats(),\n      rateLimiter: this.rateLimiter.getAllStats(),\n      errors: this.errorHandler.getErrorStats(),\n      health: this.performanceMonitor.getHealthStatus(),\n    } as any;\n  }\n\n  /**\n   * Clear all caches and reset statistics\n   */\n  async reset(): Promise<void> {\n    await this.cache.clear();\n    this.analytics.reset();\n    this.performanceMonitor.clearHistory();\n    this.errorHandler.clearHistory();\n\n    this.log(\"AI Engine reset\");\n  }\n\n  /**\n   * Log debug information\n   */\n  private log(message: string, data?: any): void {\n    if (this.debug) {\n      console.log(`[AI Engine] ${message}`, data || \"\");\n    }\n  }\n\n  /**\n   * Export configuration\n   */\n  exportConfig() {\n    return this.config.exportConfig();\n  }\n\n  /**\n   * Get available providers\n   */\n  getAvailableProviders(): AIProviderType[] {\n    return Array.from(this.providers.keys());\n  }\n}\n"]}