import type { EventKind } from "@a4anthony/proctorkit-types"; export type EventEvidenceSource = "screen-share"; export type EventEvidenceSyncQuality = "exact"; export interface CapturedEventEvidence { blob: Blob; capturedAt: number; width: number; height: number; source: EventEvidenceSource; syncQuality: EventEvidenceSyncQuality; } export interface EvidenceEvent { id: string; kind: EventKind; timestamp: number; } export interface EventEvidenceCaptureDeps { captureScreen: () => Promise; uploadAvailable: (input: { eventId: string; eventTimestamp: number; evidence: CapturedEventEvidence; }) => Promise; uploadUnavailable: (input: { eventId: string; eventTimestamp: number; source: "screen-share"; reason: string; }) => Promise; onFailure?: (failure: EventEvidenceFailure) => void; } export type EventEvidenceFailureCode = "evidence-image-upload-failed" | "evidence-failure-record-upload-failed"; export interface EventEvidenceFailure { eventId: string; eventTimestamp: number; code: EventEvidenceFailureCode; stage: "image-upload" | "failure-record-upload"; source: EventEvidenceSource; error: unknown; details?: Record; } export declare const EVENT_EVIDENCE_KINDS: Set<"session.started" | "session.heartbeat" | "session.end_requested" | "session.ended" | "session.resumed" | "session.abandoned" | "session.checkpoint" | "session.integrity-hold" | "session.integrity-cleared" | "sdk.initialized" | "sdk.delivery.ready" | "sdk.ready" | "sdk.error" | "sdk.upload.failed" | "sdk.media.failed" | "sdk.permission.denied" | "sdk.worker.failed" | "sdk.storage.fallback" | "sdk.recording.buffer-degraded" | "sdk.recording.buffer-evicted" | "sdk.stop.drain-timeout" | "focus.lost" | "focus.gained" | "tab.hidden" | "tab.visible" | "page.viewed" | "fullscreen.entered" | "fullscreen.exited" | "clipboard.copy" | "clipboard.paste" | "clipboard.cut" | "contextmenu.opened" | "keyboard.blocked" | "screenshot.attempted" | "screen-share.started" | "screen-share.stopped" | "screen-share.declined" | "screen-share.wrong-surface" | "screen-share.recording.started" | "screen-share.recording.stopped" | "screen-share.recording.unavailable" | "screen-share.chunk-uploaded" | "screen-share.chunk-dropped" | "assessment-replay.started" | "assessment-replay.chunk-uploaded" | "assessment-replay.chunk-dropped" | "assessment-replay.unavailable" | "assessment-replay.stopped" | "webcam.started" | "webcam.stopped" | "webcam.declined" | "webcam.unavailable" | "webcam.photo.captured" | "webcam.photo.dropped" | "webcam.recording.started" | "webcam.recording.stopped" | "webcam.recording.chunk-uploaded" | "webcam.recording.chunk-dropped" | "video-clip.started" | "video-clip.stopped" | "video-clip.uploaded" | "video-clip.dropped" | "audio-clip.started" | "audio-clip.stopped" | "audio-clip.uploaded" | "audio-clip.dropped" | "audio-playback.started" | "audio-playback.paused" | "audio-playback.stopped" | "audio-playback.ended" | "audio-playback.error" | "audio-playback.sink-applied" | "audio-playback.sink-unsupported" | "audio-playback.sink-failed" | "audio-playback.sink-disconnected" | "video-playback.started" | "video-playback.paused" | "video-playback.stopped" | "video-playback.ended" | "video-playback.error" | "video-playback.sink-applied" | "video-playback.sink-unsupported" | "video-playback.sink-failed" | "video-playback.sink-disconnected" | "pointer.left-window" | "pointer.returned" | "idle.started" | "idle.ended" | "session.fingerprint" | "session.policy" | "face.detector-ready" | "face.detector-failed" | "face.detector-degraded" | "face.lost" | "face.returned" | "face.multiple" | "face.multiple-cleared" | "face.gaze-off-screen" | "face.gaze-restored" | "face.identity-mismatch" | "screen.window-switched" | "screen.scene-stable" | "screen.recording-paused" | "webcam.phone-detected" | "webcam.phone-cleared" | "webcam.book-detected" | "webcam.book-cleared" | "webcam.second-device-detected" | "webcam.second-device-cleared" | "webcam.second-screen-detected" | "webcam.second-screen-cleared" | "face.lost-at-snapshot" | "face.multiple-at-snapshot" | "face.gaze-off-screen-at-snapshot" | "face.identity-mismatch-at-snapshot" | "webcam.phone-detected-at-snapshot" | "webcam.book-detected-at-snapshot" | "webcam.second-device-detected-at-snapshot" | "webcam.second-screen-detected-at-snapshot" | "media.frame.captured" | "media.audio.chunk" | "network.online" | "network.offline" | "preflight.started" | "preflight.row-checking" | "preflight.row-passed" | "preflight.row-failed" | "preflight.row-retried" | "preflight.attestation" | "preflight.device-picked" | "preflight.devices-enumerated" | "preflight.devices-changed" | "preflight.microphone-verification" | "preflight.face-detected" | "preflight.camera-photo" | "preflight.completed" | "text.started" | "text.paste" | "text.copy" | "text.cut" | "text.keystroke-summary" | "text.checkpoint" | "text.focus-lost" | "text.focus-regained" | "text.synthetic-input" | "text.saved" | "text.save-failed" | "text.submitted">; export declare class EventEvidenceCapture { private readonly deps; private readonly pending; private readonly captured; constructor(deps: EventEvidenceCaptureDeps); capture(event: EvidenceEvent): void; drain(): Promise; private captureInternal; private recordUnavailable; private reportFailure; } //# sourceMappingURL=event-evidence-capture.d.ts.map