import { RenderProfile, LoadProfile, FpsSample } from '../types.js'; export interface SessionSnapshot { /** componentId -> { renderCount, totalRenderTime } at snapshot moment */ renderProfiles: Array<{ componentId: number; file: string; name: string; renderCount: number; totalRenderTime: number; }>; loadProfilesCount: number; fpsCount: number; takenAt: number; } export interface SessionRecord { id: string; label: string; startedAt: number; endedAt?: number; persist: boolean; startSnapshot: SessionSnapshot; endSnapshot?: SessionSnapshot; /** load profiles that arrived strictly between startedAt..endedAt */ loadProfiles: LoadProfile[]; /** fps samples that arrived strictly between startedAt..endedAt */ fpsSamples: FpsSample[]; } export interface SessionDelta { durationMs: number; components: Array<{ componentId: number; file: string; name: string; renderCountDelta: number; totalRenderTimeDelta: number; avgRenderTimeDelta: number; }>; loadProfiles: { count: number; avgDuration: number; p95Duration: number; }; fps: { samples: number; avg: number; min: number; drops: number; }; } export interface SessionDiff { a: { id: string; label: string; }; b: { id: string; label: string; }; render: { totalRenderTimeDeltaA: number; totalRenderTimeDeltaB: number; diff: number; verdict: 'improved' | 'regressed' | 'unchanged'; }; load: { avgA: number; avgB: number; diff: number; verdict: 'improved' | 'regressed' | 'unchanged'; }; fps: { avgA: number; avgB: number; diff: number; verdict: 'improved' | 'regressed' | 'unchanged'; }; } export interface MetricGetters { getRenderProfiles: () => RenderProfile[]; getLoadProfiles: () => LoadProfile[]; getFpsSamples: () => FpsSample[]; } export interface SessionStoreOptions { persistDir: string; getters: MetricGetters; } export declare class SessionStore { private sessions; private active; private readonly persistDir; private readonly getters; constructor(opts: SessionStoreOptions); start(label: string, persist: boolean): SessionRecord; /** Called by the plugin whenever a new load profile arrives. */ recordLoadProfile(p: LoadProfile): void; /** Called by the plugin whenever a new fps sample arrives. */ recordFpsSample(s: FpsSample): void; end(keep: 'memory' | 'disk' | 'discard'): SessionRecord; get(id: string): SessionRecord | undefined; list(): Array<{ id: string; label: string; startedAt: number; endedAt?: number; persisted: boolean; active: boolean; }>; delete(id: string): boolean; delta(id: string): SessionDelta; compare(idA: string, idB: string): SessionDiff; private pathFor; private persistToDisk; private loadFromDisk; }