import type { ReviewIssue } from "./review-report.js";
export declare const ROOT_SYNC_FIX_CODES: {
    readonly clipRefs: "root_clip_refs_synced";
    readonly duration: "root_duration_synced";
    readonly narrationAudio: "root_narration_audio_synced";
    readonly musicAudio: "root_music_audio_synced";
};
export interface RootSyncBeatInput {
    id: string;
    duration?: number;
    narrationPath?: string;
    musicPath?: string;
    sceneDurationSec?: number;
}
export interface RootSyncPlan {
    rootPath: string;
    rootRel: string;
    exists: boolean;
    changed: boolean;
    fixCodes: string[];
    issues: ReviewIssue[];
    nextHtml?: string;
    totalDurationSec?: number;
}
export declare function createRootSyncPlan(opts: {
    projectDir: string;
    beats: RootSyncBeatInput[];
    rootRel?: string;
}): Promise<RootSyncPlan>;
export declare function createProjectRootSyncPlan(opts: {
    projectDir: string;
    rootRel?: string;
}): Promise<RootSyncPlan>;
export declare function syncRootComposition(opts: {
    projectDir: string;
    beats: RootSyncBeatInput[];
    rootRel?: string;
}): Promise<RootSyncPlan>;
export declare function loadProjectRootSyncBeats(projectDir: string): Promise<RootSyncBeatInput[]>;
/**
 * Canonical FINAL beat duration: the storyboard duration acts as a minimum
 * that gets stretched to cover the generated narration audio (+0.5s pad).
 * This is the duration the root timeline allocates per beat — and therefore
 * the duration scenes must be composed at (data-duration + timeline anchors),
 * or they go dark for the stretched tail.
 */
export declare function resolveSyncedBeatDuration(opts: {
    projectDir: string;
    beatDuration?: number;
    narrationPath?: string;
    sceneDurationSec?: number;
}): Promise<number>;
/**
 * Final narration-synced duration per beat for a project on disk. Reads
 * STORYBOARD.md + build-report.json + narration asset fallbacks via
 * {@link loadProjectRootSyncBeats}.
 */
export declare function resolveProjectBeatDurations(projectDir: string): Promise<Map<string, number>>;
