import type { HeadbandFrameV1 } from "@elata-biosciences/eeg-web"; export type PpgSource = "ppgRaw" | "optics"; export type PpgSourcePreference = PpgSource | "auto"; export type PpgChannelPreference = string | number | "auto"; export type PpgReasonCode = "no_signal" | "insufficient_window" | "low_signal_quality" | "estimators_disagree" | "insufficient_ibi"; export interface PpgProcessorOptions { windowSec?: number; source?: PpgSourcePreference; channel?: PpgChannelPreference; } export interface PpgMetrics { bpm: number | null; rmssdMs: number | null; sdnnMs: number | null; meanNnMs: number | null; confidence: number; signalQuality: number; source: PpgSource | null; channel: string | null; sampleRateHz: number | null; windowSampleCount: number; windowDurationMs: number; lastSampleTimestampMs: number | null; emittedAtMs: number | null; spectralBpm: number | null; acfBpm: number | null; peaksBpm: number | null; respirationBpm: number | null; snrDb: number | null; waveformConfidence: number | null; ibiCount: number; reasonCodes: PpgReasonCode[]; } export interface PpgChannelCandidate { source: PpgSource; channel: string; score: number; confidence: number; signalQuality: number; bpm: number | null; rmssdMs: number | null; sdnnMs: number | null; meanNnMs: number | null; windowSampleCount: number; windowDurationMs: number; sampleRateHz: number; lastSampleTimestampMs: number | null; reasonCodes: PpgReasonCode[]; } export interface PpgDebugSnapshot { framesSeen: number; sourcesSeen: PpgSource[]; channelsSeen: string[]; selectedSource: PpgSource | null; selectedChannel: string | null; lastFrameAtMs: number | null; lastSampleTimestampMs: number | null; issues: PpgReasonCode[]; candidates: PpgChannelCandidate[]; } export interface PpgTraceSnapshot { source: PpgSource | null; channel: string | null; points: Array<{ timestampMs: number; value: number; }>; peaks: Array<{ timestampMs: number; value: number; }>; sampleRateHz: number | null; } export declare class PpgProcessor { private readonly options; private readonly streams; private metrics; private selectedTrace; private lastCandidates; private framesSeen; private lastFrameAtMs; constructor(options?: PpgProcessorOptions); pushFrame(frame: HeadbandFrameV1): void; reset(): void; getMetrics(): PpgMetrics; getDebugSnapshot(): PpgDebugSnapshot; getTraceSnapshot(maxPoints?: number): PpgTraceSnapshot; private ingestBlock; private recomputeMetrics; private resolveTimestamps; private getOrCreateStream; private sourceMatches; private channelMatches; } //# sourceMappingURL=ppgProcessor.d.ts.map