import { type CuratorConfig, type CuratorDeps } from './curator';
export interface CuratorSchedulerOptions extends CuratorDeps {
    projectDir: string;
    /** Effective curator config (already merged with defaults). */
    config: CuratorConfig;
    /** Hours between curator runs (default 168 = once a week). */
    intervalHours: number;
    /** Minutes of inactivity before the scheduler is allowed to run. */
    idleThresholdMinutes: number;
    /** Returns ms timestamp of the last user activity (e.g. last chat send). */
    getLastUserActivityMs(): number;
    /** When false, the scheduler is paused and no runs are scheduled. */
    isEnabled(): boolean;
    /** Returns ms timestamp of the last successful curator run, or 0 if never. */
    getLastRunMs(): number;
    /** Persists the last-run timestamp so the interval check survives restarts. */
    recordRunMs(timestamp: number): void;
    /**
     * Optional accelerator: when the pending-candidate queue grows beyond
     * `runWhenCandidatesAtLeast`, override the long-interval gate so the
     * curator runs the next time the system is idle. Closes the "promotion
     * loop is too slow" gap — without this, candidates can sit unreviewed
     * for up to a week even if the queue is full.
     */
    getPendingCandidateCount?(): Promise<number>;
    /** Threshold for the candidate-pressure accelerator. Default 25. */
    runWhenCandidatesAtLeast?: number;
}
export declare class CuratorScheduler {
    private opts;
    private heartbeat;
    private lastMaintenanceCheckMs;
    private running;
    constructor(opts: CuratorSchedulerOptions);
    start(now?: Date): void;
    stop(): void;
    /** Exposed for tests. Runs one tick of the heartbeat loop. */
    tick(now?: Date): Promise<{
        ranCurator: boolean;
        reason?: string;
    }>;
}
//# sourceMappingURL=scheduler.d.ts.map