export type ScheduleKind = "once" | "interval" | "cron";
export interface ParsedSchedule {
    kind: ScheduleKind;
    schedule: string;
    scheduleDisplay: string;
    repeat: boolean;
    nextRunAt: string;
    intervalMs?: number;
    cronExpression?: string;
}
/**
 * Validate that a timezone string is a valid IANA timezone identifier.
 * Returns the normalized timezone or throws.
 */
export declare function validateTimezone(tz: string): string;
export declare function nextCronRun(expression: string, after?: Date, timezone?: string): Date;
export declare function parseSchedule(input: string, options?: {
    now?: Date;
    forceRepeat?: boolean;
    timezone?: string;
}): ParsedSchedule;
export declare function computeNextRun(job: {
    kind: ScheduleKind;
    repeat: boolean;
    intervalMs?: number;
    cronExpression?: string;
    schedule: string;
    timezone?: string;
}, after?: Date): string | undefined;
/**
 * Compute the grace window for a job in seconds.
 *
 * Rules (mirrored from hermes scheduler.py):
 *  - one-shot jobs: ONESHOT_GRACE_SECONDS (120s)
 *  - interval jobs: half the interval, clamped to [120s, 7200s]
 *  - cron jobs: estimated from approximate average interval, clamped to [120s, 7200s]
 */
export declare function computeGraceWindowSeconds(job: {
    kind: ScheduleKind;
    repeat: boolean;
    intervalMs?: number;
    cronExpression?: string;
    timezone?: string;
}): number;
//# sourceMappingURL=schedule.d.ts.map