import { type RunTokenHeartbeatReport, type RunTokenInstallResult, type RunTokenRefreshTrigger } from "@trigger.dev/core/v3/workers";
export type RunTokenUpdate = {
    runId: string;
    attemptNumber: number;
    token: string;
};
export type RunTokenInstaller = (update: RunTokenUpdate) => Promise<RunTokenInstallResult>;
/**
 * Tracks the run token installed in one attempt's task process. It reports the installed expiry on
 * heartbeats so the server can decide when a replacement is due, and installs replacements with an
 * acknowledgement from the task process. Failed installs keep the old expiry, so the next
 * heartbeat asks again.
 */
export declare class RunTokenRefresher {
    private readonly opts;
    private expiresAt?;
    private installing;
    private pendingReport?;
    constructor(opts: {
        runId: string;
        attemptNumber: number;
        /** TRIGGER_RUN_TOKEN from the attempt's start response, if one was issued. */
        initialToken: string | undefined;
        install: RunTokenInstaller;
        now?: () => number;
    });
    /** Undefined when this attempt has no run token, or while a replacement is being installed. */
    report(trigger: RunTokenRefreshTrigger): RunTokenHeartbeatReport | undefined;
    get isDue(): boolean;
    /** Call after the heartbeat that carried `sent` succeeded, with any replacement it returned. */
    handleHeartbeatResponse(sent: RunTokenHeartbeatReport | undefined, replacement: string | undefined): Promise<RunTokenInstallResult | undefined>;
    private nowSeconds;
}
