import type { ControlPlaneStore, JsonValue } from '../control-plane';
import type { ReleaseApproval, ReleaseArtifact, ReleaseCompare, ReleaseDeployableKind, ReleaseHealthGate, ReleaseHookCompatibility, ReleaseRecord, ReleaseStatus, ReleaseStrategy, ReleaseTransition } from './types';
export declare class ReleaseStore {
    readonly controlPlane: ControlPlaneStore;
    private readonly now;
    private readonly id;
    constructor(controlPlane: ControlPlaneStore, options?: {
        now?: () => Date;
        id?: () => string;
    });
    registerArtifact(input: {
        organizationId: string;
        digest: string;
        kind: ReleaseDeployableKind;
        uri: string;
        size: number;
        mediaType?: string;
        provenance?: JsonValue;
        attestation?: JsonValue;
    }): ReleaseArtifact;
    getArtifact(id: string): ReleaseArtifact | undefined;
    create(input: {
        organizationId: string;
        projectId: string;
        environmentId: string;
        resourceId: string;
        artifactId: string;
        kind: ReleaseDeployableKind;
        sourceSha?: string;
        config: JsonValue;
        manifest: JsonValue;
        provenance?: JsonValue;
        strategy: ReleaseStrategy;
        healthGate?: ReleaseHealthGate;
        hooks?: ReleaseHookCompatibility;
        drainSeconds?: number;
        graceSeconds?: number;
        automaticRollback?: boolean;
        promotedFromReleaseId?: string;
        actorId?: string;
        trigger?: string;
        approvalRequired?: boolean;
        replicas?: number;
    }): ReleaseRecord;
    get(id: string): ReleaseRecord | undefined;
    list(input?: {
        projectId?: string;
        environmentId?: string;
        resourceId?: string;
        status?: ReleaseStatus;
    }): ReleaseRecord[];
    active(resourceId: string): ReleaseRecord | undefined;
    transitions(releaseId: string): ReleaseTransition[];
    private recordTransition;
    progress(id: string, input: {
        message: string;
        trafficPercent?: number;
        health?: JsonValue;
        operationId?: string;
    }): ReleaseTransition;
    transition(id: string, toStatus: ReleaseStatus, input: {
        message: string;
        trafficPercent?: number;
        health?: JsonValue;
        operationId?: string;
    }): ReleaseRecord;
    approve(id: string, input: {
        actorId: string;
        decision: 'approved' | 'rejected';
        comment?: string;
    }): ReleaseRecord;
    approvals(id: string): ReleaseApproval[];
    promote(sourceId: string, input: {
        targetEnvironmentId: string;
        targetResourceId: string;
        config: JsonValue;
        strategy?: ReleaseStrategy;
        healthGate?: ReleaseHealthGate;
        actorId?: string;
        approvalRequired?: boolean;
    }): ReleaseRecord;
    compare(leftId: string, rightId: string): ReleaseCompare;
    pin(id: string, pinned: boolean, reason?: string): ReleaseRecord;
    retentionCandidates(input: {
        before: Date;
        keepPerResource?: number;
    }): ReleaseRecord[];
}
