import type { ProposalAction, RegenerationContext, SpecChangeProposal } from './types';
export type ExecutionStatus = 'success' | 'skipped' | 'failed';
export interface ActionExecutionResult {
    index: number;
    action: ProposalAction;
    status: ExecutionStatus;
    startedAt: Date;
    finishedAt: Date;
    reason?: string;
    error?: Error;
    output?: unknown;
}
export interface ProposalExecutionResult {
    proposalId: string;
    contextId: string;
    startedAt: Date;
    finishedAt: Date;
    status: 'success' | 'partial' | 'failed';
    actions: ActionExecutionResult[];
}
export type UpdateBlueprintAction = Extract<ProposalAction, {
    kind: 'update_blueprint';
}>;
export type UpdateTenantConfigAction = Extract<ProposalAction, {
    kind: 'update_tenant_config';
}>;
export type RunTestsAction = Extract<ProposalAction, {
    kind: 'run_tests';
}>;
export type RunMigrationsAction = Extract<ProposalAction, {
    kind: 'run_migrations';
}>;
export type TriggerRegenerationAction = Extract<ProposalAction, {
    kind: 'trigger_regeneration';
}>;
export interface BlueprintUpdater {
    applyBlueprintUpdate(context: RegenerationContext, proposal: SpecChangeProposal, action: UpdateBlueprintAction): Promise<unknown>;
}
export interface TenantConfigUpdater {
    applyTenantConfigUpdate(context: RegenerationContext, proposal: SpecChangeProposal, action: UpdateTenantConfigAction): Promise<unknown>;
}
export interface TestExecutor {
    runTests(context: RegenerationContext, proposal: SpecChangeProposal, action: RunTestsAction): Promise<unknown>;
}
export interface MigrationExecutor {
    runMigrations(context: RegenerationContext, proposal: SpecChangeProposal, action: RunMigrationsAction): Promise<unknown>;
}
export interface RegenerationTrigger {
    triggerRegeneration(context: RegenerationContext, proposal: SpecChangeProposal, action: TriggerRegenerationAction): Promise<unknown>;
}
export interface ProposalExecutorOptions {
    dryRun?: boolean;
}
export interface ProposalExecutorDeps {
    blueprintUpdater?: BlueprintUpdater;
    tenantConfigUpdater?: TenantConfigUpdater;
    testExecutor?: TestExecutor;
    migrationExecutor?: MigrationExecutor;
    regenerationTrigger?: RegenerationTrigger;
}
export declare class ProposalExecutor {
    private readonly deps;
    constructor(deps?: ProposalExecutorDeps);
    execute(context: RegenerationContext, proposal: SpecChangeProposal, options?: ProposalExecutorOptions): Promise<ProposalExecutionResult>;
    private executeAction;
}
