import type { TraceSummary, Severity } from '../../shared/types/index.js'; export type ChangeDirection = 'regression' | 'improvement' | 'unchanged'; export interface MetricComparison { name: string; baseValue: number; headValue: number; absoluteChange: number; percentageChange: number; direction: ChangeDirection; severity: Severity; unit: string; } export interface LayoutThrashComparison { selector: string; baseReflowCostMs: number; headReflowCostMs: number; direction: ChangeDirection; percentageChange: number; } export interface GPUStallComparison { element: string; baseStallMs: number; headStallMs: number; direction: ChangeDirection; percentageChange: number; } export interface LongTaskComparison { function: string; file: string; baseCpuMs: number; headCpuMs: number; direction: ChangeDirection; percentageChange: number; } export interface HotspotComparisons { layoutThrashing: LayoutThrashComparison[]; gpuStalls: GPUStallComparison[]; longTasks: LongTaskComparison[]; } export interface ComparisonResult { id: string; baseSummary: TraceSummary; headSummary: TraceSummary; frameMetrics: MetricComparison[]; phaseBreakdown: MetricComparison[]; hotspots: HotspotComparisons; regressions: MetricComparison[]; improvements: MetricComparison[]; changeImpactScore: number; maxRegressionSeverity: Severity | null; timestamp: string; } export interface CompareOptions { significanceThreshold?: number; severityThresholds?: SeverityThresholds; } export interface SeverityThresholds { info: number; warning: number; high: number; critical: number; } export interface ICompareService { compare(baseSummary: TraceSummary, headSummary: TraceSummary, options?: CompareOptions): ComparisonResult; calculateChangeImpactScore(regressions: MetricComparison[], improvements: MetricComparison[]): number; determineSeverity(percentageChange: number, thresholds?: SeverityThresholds): Severity; }