/**
 * Odds Refresh Worker (Layer A)
 *
 * Long-lived PM2 process that refreshes odds every 90 seconds.
 * Lightweight — no Grok calls, just SGO API → DB updates.
 *
 * 1. Query rm_events for today's non-ended events
 * 2. Fetch SGO API events for needed leagues
 * 3. Match SGO events to rm_events using makeEventId()
 * 4. Update current odds + capture opening lines (once per event)
 * 5. Update rm_forecast_cache odds_data where forecasts exist
 *
 * Usage: npx tsx src/workers/odds-refresh.ts
 */
import 'dotenv/config';
import { type TeamPropMarketCandidate } from '../services/team-prop-market-candidates';
export declare function oddsPayloadChanged(previousOdds: any, nextOdds: any): boolean;
export declare function shouldRefreshPregameOdds(status: 'scheduled' | 'started' | 'ended'): boolean;
export declare function shouldRetryLateOpeningTeamProps(params: {
    league: string;
    propCount: number;
    startsAt?: string | Date | null;
    generatedAt?: string | Date | null;
    now?: Date;
}): boolean;
export declare function sourceBackedTeamPropsNeedRefresh(params: {
    league?: string | null;
    props: any[];
    candidates: TeamPropMarketCandidate[];
}): boolean;
export declare function openingPayloadNeedsBackfill(row: {
    opening_moneyline?: {
        home: number | null;
        away: number | null;
    } | null;
    opening_spread?: {
        home: {
            line: number;
            odds: number | null;
        } | null;
        away: {
            line: number;
            odds: number | null;
        } | null;
    } | null;
    opening_total?: {
        over: {
            line: number;
            odds: number | null;
        } | null;
        under: {
            line: number;
            odds: number | null;
        } | null;
    } | null;
}): boolean;
export declare function mergeOpeningOdds(existing: {
    moneyline?: {
        home: number | null;
        away: number | null;
    } | null;
    spread?: {
        home: {
            line: number;
            odds: number | null;
        } | null;
        away: {
            line: number;
            odds: number | null;
        } | null;
    } | null;
    total?: {
        over: {
            line: number;
            odds: number | null;
        } | null;
        under: {
            line: number;
            odds: number | null;
        } | null;
    } | null;
}, incoming: {
    moneyline: {
        home: number | null;
        away: number | null;
    };
    spread: {
        home: {
            line: number;
            odds: number | null;
        } | null;
        away: {
            line: number;
            odds: number | null;
        } | null;
    };
    total: {
        over: {
            line: number;
            odds: number | null;
        } | null;
        under: {
            line: number;
            odds: number | null;
        } | null;
    };
}): {
    moneyline: {
        home: number | null;
        away: number | null;
    };
    spread: {
        home: {
            line: number;
            odds: number | null;
        } | null;
        away: {
            line: number;
            odds: number | null;
        } | null;
    };
    total: {
        over: {
            line: number;
            odds: number | null;
        } | null;
        under: {
            line: number;
            odds: number | null;
        } | null;
    };
};
export declare function deriveStoredLifecycleStatus(params: {
    currentStatus?: string | null;
    startsAt?: string | Date | null;
    now?: Date;
}): 'scheduled' | 'started' | 'ended' | null;
export declare function hasMlbSnapshotContextChange(storedSnapshot: any, liveSnapshot: any, teamSide: 'home' | 'away'): boolean;
//# sourceMappingURL=odds-refresh.d.ts.map