import type { ContentMessageItemImage, ContentMessageItemResource, ContentMessageItemText, CursorPosition, RecordFrameToolInput, TimelineEventCategory, TimelineRecording } from "#ai-utils";
interface TimelineCollectorOptions {
    framesDir: string;
    debug?: boolean;
    enableCdnUpload?: boolean;
}
interface CollectedFrame {
    image: ContentMessageItemImage;
    title: string;
    category: TimelineEventCategory;
    eventId: number;
    explicit: boolean;
    timestamp: number;
    fileName: string;
    imageUrl?: string;
    uploadPromise?: Promise<void>;
    cursorX?: number;
    cursorY?: number;
    viewportWidth?: number;
    viewportHeight?: number;
}
interface ProgressSnapshot {
    eventCount: number;
    frameCount: number;
    lastLabel: string;
    lastFrameFileName?: string;
    lastThinking?: string;
}
export declare class TimelineCollector {
    #private;
    constructor(sessionId: string, options: TimelineCollectorOptions);
    /**
     * Reset all collected state so the collector can be reused for a new recording cycle
     * (e.g., on reused QA branches that handle multiple review messages).
     */
    reset(): void;
    onToolCall(name: string, id: string, input: string): void;
    onToolResult(result: {
        tool_use_id?: string;
        tool_name?: string;
        tool_input?: string;
        content: string | (ContentMessageItemText | ContentMessageItemImage | ContentMessageItemResource)[];
    }, cursorPosition?: CursorPosition | null): void;
    onRecordFrame(input: RecordFrameToolInput): void;
    onThinking(content: string): void;
    getLastCapturedImage(): ContentMessageItemImage | null;
    getExplicitFrames(): Array<{
        image: ContentMessageItemImage | null;
        title: string;
    }>;
    getExplicitImages(): ContentMessageItemImage[];
    getAllImages(): ContentMessageItemImage[];
    getLegacyMetadataFrames(): Array<{
        hasImage: boolean;
        title: string;
    }>;
    getExplicitFrameDurations(): string[];
    getProgressSnapshot(): ProgressSnapshot;
    getEventCount(): number;
    getFrameCount(): number;
    getLastLabel(): string;
    hasExplicitFrames(): boolean;
    hasAnyFrames(): boolean;
    getHighlightFrames(): CollectedFrame[];
    getHighlightImages(): ContentMessageItemImage[];
    getHighlightMetadataFrames(): Array<{
        hasImage: boolean;
        title: string;
    }>;
    getHighlightFrameDurations(): string[];
    /**
     * Removes all local frame files and metadata for this session.
     * Safe to call after timeline has been persisted to the backend (frames are on CDN).
     */
    cleanupSessionFiles(): Promise<void>;
    finalize(): Promise<TimelineRecording>;
}
export {};
