{"version":3,"file":"performance-budgets.mjs","sources":["../../../src/lib/performance/performance-budgets.ts"],"sourcesContent":["/**\n * @file Performance Budget System\n * @description Comprehensive performance budget management with:\n * - Configurable budgets per metric\n * - Budget violation alerts and callbacks\n * - Automatic performance degradation strategies\n * - Budget trending and history tracking\n * - Statistical analysis of budget adherence\n *\n * This system provides fine-grained control over performance budgets,\n * enabling proactive performance management and automatic adaptation\n * when budgets are exceeded.\n *\n * @example\n * ```typescript\n * import { PerformanceBudgetManager } from '@/lib/performance';\n *\n * const budgetManager = new PerformanceBudgetManager({\n *   budgets: {\n *     'LCP': { warning: 2000, critical: 2500, unit: 'ms' },\n *     'bundle.initial': { warning: 150000, critical: 200000, unit: 'bytes' },\n *   },\n *   onViolation: (violation) => {\n *     analytics.track('performance_budget_violation', violation);\n *   },\n * });\n *\n * // Record metrics\n * budgetManager.record('LCP', 2100); // Triggers warning\n * budgetManager.record('bundle.initial', 250000); // Triggers critical\n * ```\n */\n\nimport {\n  VITAL_THRESHOLDS,\n  BUNDLE_BUDGET,\n  RUNTIME_BUDGET,\n  formatBytes,\n  formatDuration,\n} from '../../config/performance.config';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Budget threshold configuration\n */\nexport interface BudgetThreshold {\n  /** Warning threshold value */\n  readonly warning: number;\n  /** Critical threshold value */\n  readonly critical: number;\n  /** Unit of measurement */\n  readonly unit: 'ms' | 'bytes' | 'score' | 'count' | 'percent' | 'fps';\n  /** Human-readable description */\n  readonly description?: string;\n  /** Enable automatic degradation when exceeded */\n  readonly enableDegradation?: boolean;\n  /** Degradation strategy */\n  readonly degradationStrategy?: DegradationStrategy;\n}\n\n/**\n * Degradation strategy for when budgets are exceeded\n */\nexport type DegradationStrategy =\n  | 'reduce-animations'\n  | 'reduce-images'\n  | 'reduce-features'\n  | 'reduce-polling'\n  | 'defer-non-critical'\n  | 'custom';\n\n/**\n * Budget violation severity\n */\nexport type ViolationSeverity = 'warning' | 'critical';\n\n/**\n * Budget violation record\n */\nexport interface BudgetViolationRecord {\n  readonly id: string;\n  readonly budgetName: string;\n  readonly value: number;\n  readonly threshold: number;\n  readonly severity: ViolationSeverity;\n  readonly overage: number;\n  readonly overagePercent: number;\n  readonly timestamp: number;\n  readonly url: string;\n  readonly userAgent: string;\n  readonly sessionId: string;\n}\n\n/**\n * Budget metric entry\n */\nexport interface BudgetMetricEntry {\n  readonly budgetName: string;\n  readonly value: number;\n  readonly timestamp: number;\n  readonly status: 'ok' | 'warning' | 'critical';\n  readonly percentOfBudget: number;\n}\n\n/**\n * Budget trend data\n */\nexport interface BudgetTrend {\n  readonly budgetName: string;\n  readonly entries: BudgetMetricEntry[];\n  readonly average: number;\n  readonly min: number;\n  readonly max: number;\n  readonly p50: number;\n  readonly p75: number;\n  readonly p90: number;\n  readonly p99: number;\n  readonly trend: 'improving' | 'stable' | 'degrading';\n  readonly violationRate: number;\n  readonly lastUpdated: number;\n}\n\n/**\n * Budget status summary\n */\nexport interface BudgetStatusSummary {\n  readonly budgetName: string;\n  readonly threshold: BudgetThreshold;\n  readonly currentValue: number | null;\n  readonly status: 'ok' | 'warning' | 'critical' | 'unknown';\n  readonly trend: BudgetTrend | null;\n  readonly recentViolations: BudgetViolationRecord[];\n}\n\n/**\n * Degradation state\n */\nexport interface DegradationState {\n  readonly isActive: boolean;\n  readonly level: 'none' | 'light' | 'moderate' | 'aggressive';\n  readonly activeStrategies: DegradationStrategy[];\n  readonly reason: string | null;\n  readonly activatedAt: number | null;\n}\n\n/**\n * Budget manager configuration\n */\nexport interface BudgetManagerConfig {\n  /** Custom budget definitions */\n  readonly budgets?: Record<string, BudgetThreshold>;\n  /** Violation callback */\n  readonly onViolation?: (violation: BudgetViolationRecord) => void;\n  /** Recovery callback (when metric returns to ok) */\n  readonly onRecovery?: (budgetName: string) => void;\n  /** Degradation state change callback */\n  readonly onDegradationChange?: (state: DegradationState) => void;\n  /** History retention period (ms) */\n  readonly historyRetention?: number;\n  /** Maximum history entries per budget */\n  readonly maxHistoryEntries?: number;\n  /** Enable automatic degradation */\n  readonly enableAutoDegradation?: boolean;\n  /** Consecutive violations before degradation */\n  readonly degradationThreshold?: number;\n  /** Session ID for tracking */\n  readonly sessionId?: string;\n  /** Enable debug logging */\n  readonly debug?: boolean;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Default budget definitions combining Core Web Vitals and resource budgets\n */\nexport const DEFAULT_BUDGETS: Record<string, BudgetThreshold> = {\n  // Core Web Vitals\n  LCP: {\n    warning: VITAL_THRESHOLDS.LCP?.good ?? 2500,\n    critical: VITAL_THRESHOLDS.LCP?.needsImprovement ?? 4000,\n    unit: 'ms',\n    description: 'Largest Contentful Paint',\n    enableDegradation: true,\n    degradationStrategy: 'reduce-images',\n  },\n  INP: {\n    warning: VITAL_THRESHOLDS.INP?.good ?? 200,\n    critical: VITAL_THRESHOLDS.INP?.needsImprovement ?? 500,\n    unit: 'ms',\n    description: 'Interaction to Next Paint',\n    enableDegradation: true,\n    degradationStrategy: 'reduce-animations',\n  },\n  CLS: {\n    warning: VITAL_THRESHOLDS.CLS?.good ?? 0.1,\n    critical: VITAL_THRESHOLDS.CLS?.needsImprovement ?? 0.25,\n    unit: 'score',\n    description: 'Cumulative Layout Shift',\n  },\n  FCP: {\n    warning: VITAL_THRESHOLDS.FCP?.good ?? 1800,\n    critical: VITAL_THRESHOLDS.FCP?.needsImprovement ?? 3000,\n    unit: 'ms',\n    description: 'First Contentful Paint',\n  },\n  TTFB: {\n    warning: VITAL_THRESHOLDS.TTFB?.good ?? 800,\n    critical: VITAL_THRESHOLDS.TTFB?.needsImprovement ?? 1800,\n    unit: 'ms',\n    description: 'Time to First Byte',\n  },\n\n  // Bundle budgets\n  'bundle.initial': {\n    warning: BUNDLE_BUDGET.initial * BUNDLE_BUDGET.warningThreshold,\n    critical: BUNDLE_BUDGET.initial,\n    unit: 'bytes',\n    description: 'Initial bundle size',\n    enableDegradation: true,\n    degradationStrategy: 'defer-non-critical',\n  },\n  'bundle.async': {\n    warning: BUNDLE_BUDGET.asyncChunk * BUNDLE_BUDGET.warningThreshold,\n    critical: BUNDLE_BUDGET.asyncChunk,\n    unit: 'bytes',\n    description: 'Async chunk size',\n  },\n  'bundle.vendor': {\n    warning: BUNDLE_BUDGET.vendor * BUNDLE_BUDGET.warningThreshold,\n    critical: BUNDLE_BUDGET.vendor,\n    unit: 'bytes',\n    description: 'Vendor bundle size',\n  },\n  'bundle.total': {\n    warning: BUNDLE_BUDGET.total * BUNDLE_BUDGET.warningThreshold,\n    critical: BUNDLE_BUDGET.total,\n    unit: 'bytes',\n    description: 'Total bundle size',\n  },\n\n  // Runtime budgets\n  'runtime.jsPerFrame': {\n    warning: RUNTIME_BUDGET.jsExecutionPerFrame * 0.8,\n    critical: RUNTIME_BUDGET.jsExecutionPerFrame,\n    unit: 'ms',\n    description: 'JS execution per frame',\n    enableDegradation: true,\n    degradationStrategy: 'reduce-animations',\n  },\n  'runtime.fps': {\n    warning: 50,\n    critical: 30,\n    unit: 'fps',\n    description: 'Frames per second',\n    enableDegradation: true,\n    degradationStrategy: 'reduce-animations',\n  },\n\n  // Memory budgets\n  'memory.heapUsage': {\n    warning: 70,\n    critical: 90,\n    unit: 'percent',\n    description: 'JS heap usage percentage',\n    enableDegradation: true,\n    degradationStrategy: 'reduce-features',\n  },\n\n  // Long task budgets\n  'longTask.count': {\n    warning: 5,\n    critical: 10,\n    unit: 'count',\n    description: 'Long tasks per page load',\n  },\n  'longTask.totalBlockingTime': {\n    warning: 200,\n    critical: 600,\n    unit: 'ms',\n    description: 'Total blocking time',\n  },\n} as const;\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: Required<BudgetManagerConfig> = {\n  budgets: DEFAULT_BUDGETS,\n  onViolation: () => {},\n  onRecovery: () => {},\n  onDegradationChange: () => {},\n  historyRetention: 24 * 60 * 60 * 1000, // 24 hours\n  maxHistoryEntries: 1000,\n  enableAutoDegradation: true,\n  degradationThreshold: 3,\n  sessionId: generateSessionId(),\n  debug: false,\n};\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Generate unique ID\n */\nfunction generateId(): string {\n  return `budget_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Generate session ID\n */\nfunction generateSessionId(): string {\n  return `session_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Calculate percentile from sorted array\n */\nfunction percentile(sortedArr: number[], p: number): number {\n  if (sortedArr.length === 0) return 0;\n  const index = Math.ceil((p / 100) * sortedArr.length) - 1;\n  const safeIndex = Math.max(0, Math.min(index, sortedArr.length - 1));\n  const value = sortedArr[safeIndex];\n  return value ?? 0;\n}\n\n/**\n * Format value based on unit\n */\nexport function formatBudgetValue(value: number, unit: BudgetThreshold['unit']): string {\n  switch (unit) {\n    case 'ms':\n      return formatDuration(value);\n    case 'bytes':\n      return formatBytes(value);\n    case 'score':\n      return value.toFixed(3);\n    case 'count':\n      return Math.round(value).toString();\n    case 'percent':\n      return `${value.toFixed(1)}%`;\n    case 'fps':\n      return `${Math.round(value)} fps`;\n    default:\n      return value.toString();\n  }\n}\n\n// ============================================================================\n// Performance Budget Manager\n// ============================================================================\n\n/**\n * Comprehensive performance budget management system\n */\nexport class PerformanceBudgetManager {\n  private readonly config: Required<BudgetManagerConfig>;\n  private readonly budgets: Map<string, BudgetThreshold>;\n  private readonly history: Map<string, BudgetMetricEntry[]>;\n  private readonly violations: BudgetViolationRecord[];\n  private readonly currentValues: Map<string, number>;\n  private readonly consecutiveViolations: Map<string, number>;\n  private degradationState: DegradationState;\n\n  constructor(config: BudgetManagerConfig = {}) {\n    this.config = { ...DEFAULT_CONFIG, ...config };\n    this.budgets = new Map(Object.entries({ ...DEFAULT_BUDGETS, ...config.budgets }));\n    this.history = new Map();\n    this.violations = [];\n    this.currentValues = new Map();\n    this.consecutiveViolations = new Map();\n    this.degradationState = {\n      isActive: false,\n      level: 'none',\n      activeStrategies: [],\n      reason: null,\n      activatedAt: null,\n    };\n\n    // Initialize history maps\n    this.budgets.forEach((_, name) => {\n      this.history.set(name, []);\n      this.consecutiveViolations.set(name, 0);\n    });\n  }\n\n  // ==========================================================================\n  // Budget Management\n  // ==========================================================================\n\n  /**\n   * Register a custom budget\n   */\n  public registerBudget(name: string, threshold: BudgetThreshold): void {\n    this.budgets.set(name, threshold);\n    this.history.set(name, []);\n    this.consecutiveViolations.set(name, 0);\n    this.log(`Registered budget: ${name}`);\n  }\n\n  /**\n   * Update an existing budget threshold\n   */\n  public updateBudget(name: string, updates: Partial<BudgetThreshold>): void {\n    const existing = this.budgets.get(name);\n    if (existing === undefined) {\n      throw new Error(`Budget \"${name}\" not found`);\n    }\n\n    this.budgets.set(name, { ...existing, ...updates });\n    this.log(`Updated budget: ${name}`);\n  }\n\n  /**\n   * Remove a budget\n   */\n  public removeBudget(name: string): void {\n    this.budgets.delete(name);\n    this.history.delete(name);\n    this.consecutiveViolations.delete(name);\n    this.currentValues.delete(name);\n    this.log(`Removed budget: ${name}`);\n  }\n\n  /**\n   * Get budget threshold\n   */\n  public getBudget(name: string): BudgetThreshold | undefined {\n    return this.budgets.get(name);\n  }\n\n  /**\n   * Get all budgets\n   */\n  public getAllBudgets(): Map<string, BudgetThreshold> {\n    return new Map(this.budgets);\n  }\n\n  // ==========================================================================\n  // Metric Recording\n  // ==========================================================================\n\n  /**\n   * Record a metric value\n   */\n  public record(budgetName: string, value: number): BudgetMetricEntry {\n    const threshold = this.budgets.get(budgetName);\n    if (threshold === undefined) {\n      throw new Error(`Budget \"${budgetName}\" not found`);\n    }\n\n    const status = this.evaluateStatus(value, threshold);\n    const percentOfBudget = this.calculatePercentOfBudget(value, threshold);\n\n    const entry: BudgetMetricEntry = {\n      budgetName,\n      value,\n      timestamp: Date.now(),\n      status,\n      percentOfBudget,\n    };\n\n    // Update current value\n    const previousValue = this.currentValues.get(budgetName);\n    const previousStatus = previousValue !== undefined\n      ? this.evaluateStatus(previousValue, threshold)\n      : 'ok';\n    this.currentValues.set(budgetName, value);\n\n    // Add to history\n    const historyEntries = this.history.get(budgetName) ?? [];\n    historyEntries.push(entry);\n    this.trimHistory(budgetName);\n\n    // Handle status changes\n    if (status !== 'ok') {\n      this.handleViolation(budgetName, value, threshold, status);\n    } else if (previousStatus !== 'ok') {\n      // Recovered from violation\n      this.handleRecovery(budgetName);\n    }\n\n    this.log(`Recorded ${budgetName}: ${formatBudgetValue(value, threshold.unit)} (${status})`);\n    return entry;\n  }\n\n  /**\n   * Batch record multiple metrics\n   */\n  public recordBatch(metrics: Record<string, number>): BudgetMetricEntry[] {\n    return Object.entries(metrics).map(([name, value]) => this.record(name, value));\n  }\n\n  /**\n   * Deactivate degradation\n   */\n  public deactivateDegradation(): void {\n    const newState: DegradationState = {\n      isActive: false,\n      level: 'none',\n      activeStrategies: [],\n      reason: null,\n      activatedAt: null,\n    };\n\n    this.degradationState = newState;\n    this.config.onDegradationChange(newState);\n    this.log('Degradation deactivated');\n  }\n\n  /**\n   * Get current degradation state\n   */\n  public getDegradationState(): DegradationState {\n    return { ...this.degradationState };\n  }\n\n  // ==========================================================================\n  // Violation Handling\n  // ==========================================================================\n\n  /**\n   * Check if a specific strategy is active\n   */\n  public isStrategyActive(strategy: DegradationStrategy): boolean {\n    return this.degradationState.activeStrategies.includes(strategy);\n  }\n\n  /**\n   * Get trend data for a budget\n   */\n  public getTrend(budgetName: string): BudgetTrend | null {\n    const entries = this.history.get(budgetName);\n    if (entries === undefined || entries.length === 0) return null;\n\n    const values = entries.map((e) => e.value).sort((a, b) => a - b);\n    const average = values.reduce((a, b) => a + b, 0) / values.length;\n\n    // Calculate trend direction\n    const trend = this.calculateTrendDirection(entries);\n\n    // Calculate violation rate\n    const violations = entries.filter((e) => e.status !== 'ok').length;\n    const violationRate = (violations / entries.length) * 100;\n\n    const [minValue] = values;\n    const maxValue = values[values.length - 1];\n\n    return {\n      budgetName,\n      entries: [...entries],\n      average,\n      min: minValue ?? 0,\n      max: maxValue ?? 0,\n      p50: percentile(values, 50),\n      p75: percentile(values, 75),\n      p90: percentile(values, 90),\n      p99: percentile(values, 99),\n      trend,\n      violationRate,\n      lastUpdated: Date.now(),\n    };\n  }\n\n  // ==========================================================================\n  // Degradation Management\n  // ==========================================================================\n\n  /**\n   * Get all trends\n   */\n  public getAllTrends(): Map<string, BudgetTrend | null> {\n    const trends = new Map<string, BudgetTrend | null>();\n    this.budgets.forEach((_, name) => {\n      trends.set(name, this.getTrend(name));\n    });\n    return trends;\n  }\n\n  /**\n   * Get status summary for a budget\n   */\n  public getStatus(budgetName: string): BudgetStatusSummary | null {\n    const threshold = this.budgets.get(budgetName);\n    if (threshold === undefined) return null;\n\n    const currentValue = this.currentValues.get(budgetName) ?? null;\n    const status = currentValue !== null\n      ? this.evaluateStatus(currentValue, threshold)\n      : 'unknown';\n\n    const recentViolations = this.violations\n      .filter((v) => v.budgetName === budgetName)\n      .slice(-10);\n\n    return {\n      budgetName,\n      threshold,\n      currentValue,\n      status,\n      trend: this.getTrend(budgetName),\n      recentViolations,\n    };\n  }\n\n  /**\n   * Get all status summaries\n   */\n  public getAllStatuses(): BudgetStatusSummary[] {\n    const statuses: BudgetStatusSummary[] = [];\n    this.budgets.forEach((_, name) => {\n      const status = this.getStatus(name);\n      if (status) statuses.push(status);\n    });\n    return statuses;\n  }\n\n  /**\n   * Get all violations\n   */\n  public getViolations(): BudgetViolationRecord[] {\n    return [...this.violations];\n  }\n\n  /**\n   * Get violations for a specific budget\n   */\n  public getViolationsFor(budgetName: string): BudgetViolationRecord[] {\n    return this.violations.filter((v) => v.budgetName === budgetName);\n  }\n\n  /**\n   * Get overall health score (0-100)\n   */\n  public getHealthScore(): number {\n    let totalScore = 0;\n    let count = 0;\n\n    this.budgets.forEach((threshold, name) => {\n      const value = this.currentValues.get(name);\n      if (value !== undefined) {\n        const percent = this.calculatePercentOfBudget(value, threshold);\n        // Convert to health score (lower percent = higher score)\n        const score = Math.max(0, Math.min(100, 100 - (percent - 100)));\n        totalScore += score;\n        count++;\n      }\n    });\n\n    return count > 0 ? Math.round(totalScore / count) : 100;\n  }\n\n  // ==========================================================================\n  // Trending & Analysis\n  // ==========================================================================\n\n  /**\n   * Generate report\n   */\n  public generateReport(): string {\n    const statuses = this.getAllStatuses();\n    const healthScore = this.getHealthScore();\n    const degradation = this.getDegradationState();\n\n    const lines = [\n      '='.repeat(60),\n      'PERFORMANCE BUDGET REPORT',\n      '='.repeat(60),\n      '',\n      `Generated: ${new Date().toISOString()}`,\n      `Health Score: ${healthScore}/100`,\n      `Degradation: ${degradation.isActive ? `Active (${degradation.level})` : 'Inactive'}`,\n      '',\n      '--- Budget Status ---',\n      '',\n    ];\n\n    statuses.forEach((status) => {\n      const value = status.currentValue !== null\n        ? formatBudgetValue(status.currentValue, status.threshold.unit)\n        : 'N/A';\n      let indicator: string;\n      if (status.status === 'ok') {\n        indicator = '[OK]';\n      } else if (status.status === 'warning') {\n        indicator = '[WARN]';\n      } else {\n        indicator = '[CRIT]';\n      }\n      lines.push(`${indicator} ${status.budgetName}: ${value}`);\n    });\n\n    if (this.violations.length > 0) {\n      lines.push('');\n      lines.push('--- Recent Violations ---');\n      lines.push('');\n      this.violations.slice(-10).forEach((v) => {\n        const threshold = this.budgets.get(v.budgetName);\n        const unit = threshold?.unit ?? 'ms';\n        lines.push(\n          `  - ${v.budgetName}: ${formatBudgetValue(v.value, unit)} ` +\n          `(${v.severity}, +${v.overagePercent.toFixed(1)}%)`\n        );\n      });\n    }\n\n    lines.push('');\n    lines.push('='.repeat(60));\n\n    return lines.join('\\n');\n  }\n\n  /**\n   * Clear all history\n   */\n  public clearHistory(): void {\n    this.history.forEach((_, key) => {\n      this.history.set(key, []);\n    });\n    this.violations.length = 0;\n    this.log('History cleared');\n  }\n\n  /**\n   * Evaluate metric status against threshold\n   */\n  private evaluateStatus(\n    value: number,\n    threshold: BudgetThreshold\n  ): 'ok' | 'warning' | 'critical' {\n    // For FPS, lower is worse (inverse threshold)\n    if (threshold.unit === 'fps') {\n      if (value < threshold.critical) return 'critical';\n      if (value < threshold.warning) return 'warning';\n      return 'ok';\n    }\n\n    // For other metrics, higher is worse\n    if (value >= threshold.critical) return 'critical';\n    if (value >= threshold.warning) return 'warning';\n    return 'ok';\n  }\n\n  // ==========================================================================\n  // Status & Reporting\n  // ==========================================================================\n\n  /**\n   * Calculate percentage of budget used\n   */\n  private calculatePercentOfBudget(value: number, threshold: BudgetThreshold): number {\n    // Use warning threshold as 100% baseline\n    if (threshold.unit === 'fps') {\n      return (threshold.warning / value) * 100;\n    }\n    return (value / threshold.warning) * 100;\n  }\n\n  /**\n   * Handle a budget violation\n   */\n  private handleViolation(\n    budgetName: string,\n    value: number,\n    threshold: BudgetThreshold,\n    severity: ViolationSeverity\n  ): void {\n    // Increment consecutive violations\n    const consecutive = (this.consecutiveViolations.get(budgetName) ?? 0) + 1;\n    this.consecutiveViolations.set(budgetName, consecutive);\n\n    // Create violation record\n    const thresholdValue = severity === 'critical' ? threshold.critical : threshold.warning;\n    let overage: number;\n    let overagePercent: number;\n\n    if (threshold.unit === 'fps') {\n      overage = thresholdValue - value;\n      overagePercent = (overage / thresholdValue) * 100;\n    } else {\n      overage = value - thresholdValue;\n      overagePercent = (overage / thresholdValue) * 100;\n    }\n\n    const violation: BudgetViolationRecord = {\n      id: generateId(),\n      budgetName,\n      value,\n      threshold: thresholdValue,\n      severity,\n      overage,\n      overagePercent,\n      timestamp: Date.now(),\n      url: typeof window !== 'undefined' ? window.location.href : '',\n      userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : '',\n      sessionId: this.config.sessionId,\n    };\n\n    this.violations.push(violation);\n    this.trimViolations();\n\n    // Notify via callback\n    this.config.onViolation(violation);\n\n    // Check for automatic degradation\n    if (\n      this.config.enableAutoDegradation && threshold.enableDegradation === true &&\n      consecutive >= this.config.degradationThreshold\n    ) {\n      this.activateDegradation(budgetName, threshold);\n    }\n  }\n\n  /**\n   * Handle recovery from violation\n   */\n  private handleRecovery(budgetName: string): void {\n    this.consecutiveViolations.set(budgetName, 0);\n    this.config.onRecovery(budgetName);\n\n    // Check if we can deactivate degradation\n    this.checkDegradationRecovery();\n  }\n\n  /**\n   * Activate degradation for a budget\n   */\n  private activateDegradation(budgetName: string, threshold: BudgetThreshold): void {\n    const strategy = threshold.degradationStrategy ?? 'reduce-features';\n\n    // Update degradation state\n    const newState: DegradationState = {\n      isActive: true,\n      level: this.calculateDegradationLevel(),\n      activeStrategies: [...new Set([...this.degradationState.activeStrategies, strategy])],\n      reason: `Budget \"${budgetName}\" exceeded threshold ${this.config.degradationThreshold} times`,\n      activatedAt: this.degradationState.activatedAt ?? Date.now(),\n    };\n\n    this.degradationState = newState;\n    this.config.onDegradationChange(newState);\n    this.log(`Degradation activated: ${strategy} for ${budgetName}`);\n  }\n\n  /**\n   * Check if degradation can be deactivated\n   */\n  private checkDegradationRecovery(): void {\n    if (!this.degradationState.isActive) return;\n\n    // Check if all budgets are now ok\n    let allOk = true;\n    this.budgets.forEach((threshold, name) => {\n      const value = this.currentValues.get(name);\n      if (value !== undefined) {\n        const status = this.evaluateStatus(value, threshold);\n        if (status !== 'ok' && threshold.enableDegradation === true) {\n          allOk = false;\n        }\n      }\n    });\n\n    if (allOk) {\n      this.deactivateDegradation();\n    }\n  }\n\n  /**\n   * Calculate degradation level based on active strategies\n   */\n  private calculateDegradationLevel(): 'none' | 'light' | 'moderate' | 'aggressive' {\n    const count = this.degradationState.activeStrategies.length;\n    if (count === 0) return 'none';\n    if (count <= 1) return 'light';\n    if (count <= 2) return 'moderate';\n    return 'aggressive';\n  }\n\n  // ==========================================================================\n  // Utilities\n  // ==========================================================================\n\n  /**\n   * Calculate trend direction\n   */\n  private calculateTrendDirection(\n    entries: BudgetMetricEntry[]\n  ): 'improving' | 'stable' | 'degrading' {\n    if (entries.length < 2) return 'stable';\n\n    // Compare recent entries to older entries\n    const midpoint = Math.floor(entries.length / 2);\n    const oldAvg = entries\n      .slice(0, midpoint)\n      .reduce((sum, e) => sum + e.value, 0) / midpoint;\n    const newAvg = entries\n      .slice(midpoint)\n      .reduce((sum, e) => sum + e.value, 0) / (entries.length - midpoint);\n\n    const changePercent = ((newAvg - oldAvg) / oldAvg) * 100;\n\n    if (changePercent < -5) return 'improving';\n    if (changePercent > 5) return 'degrading';\n    return 'stable';\n  }\n\n  /**\n   * Trim history to max entries\n   */\n  private trimHistory(budgetName: string): void {\n    const entries = this.history.get(budgetName);\n    if (entries === undefined) return;\n\n    // Remove entries older than retention period\n    const cutoff = Date.now() - this.config.historyRetention;\n    const filtered = entries.filter((e) => e.timestamp >= cutoff);\n\n    // Trim to max entries\n    if (filtered.length > this.config.maxHistoryEntries) {\n      filtered.splice(0, filtered.length - this.config.maxHistoryEntries);\n    }\n\n    this.history.set(budgetName, filtered);\n  }\n\n  /**\n   * Trim violations to reasonable size\n   */\n  private trimViolations(): void {\n    if (this.violations.length > 1000) {\n      this.violations.splice(0, this.violations.length - 1000);\n    }\n  }\n\n  /**\n   * Debug logging\n   */\n  private log(message: string, ...args: unknown[]): void {\n    if (this.config.debug) {\n      console.info(`[BudgetManager] ${message}`, ...args);\n    }\n  }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet budgetManagerInstance: PerformanceBudgetManager | null = null;\n\n/**\n * Get or create the global PerformanceBudgetManager instance\n */\nexport function getBudgetManager(config?: BudgetManagerConfig): PerformanceBudgetManager {\n  budgetManagerInstance ??= new PerformanceBudgetManager(config);\n  return budgetManagerInstance;\n}\n\n/**\n * Reset the global instance (for testing)\n */\nexport function resetBudgetManager(): void {\n  budgetManagerInstance = null;\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\n// createBudgetMonitor is available as a named export from the module\n"],"names":["DEFAULT_BUDGETS","VITAL_THRESHOLDS","BUNDLE_BUDGET","RUNTIME_BUDGET","DEFAULT_CONFIG","generateSessionId","generateId","percentile","sortedArr","p","index","safeIndex","formatBudgetValue","value","unit","formatDuration","formatBytes","PerformanceBudgetManager","config","_","name","threshold","updates","existing","budgetName","status","percentOfBudget","entry","previousValue","previousStatus","metrics","newState","strategy","entries","values","e","a","b","average","trend","violationRate","minValue","maxValue","trends","currentValue","recentViolations","v","statuses","totalScore","count","percent","score","healthScore","degradation","lines","indicator","key","severity","consecutive","thresholdValue","overage","overagePercent","violation","allOk","midpoint","oldAvg","sum","changePercent","cutoff","filtered","message","args","budgetManagerInstance","getBudgetManager","resetBudgetManager"],"mappings":"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"}