import { SynthesizedStack } from "./synth-stack";
import { TerraformPlan, Terraform, DeployingResource } from "./models/terraform";
export declare type ProjectEvent = {
    type: "START";
    targetAction?: "synth" | "diff" | "deploy" | "destroy" | "output";
    targetStack?: string;
} | {
    type: "APPROVAL_ABORTED";
} | {
    type: "APPROVAL_GIVEN";
};
declare type ProgressEvent = {
    type: "STACK_SELECTED";
    stackName: string;
} | {
    type: "LOG";
    stackName: string;
    stateName: string;
    message: string;
    isError: boolean;
} | {
    type: "RESOURCE_UPDATE";
    stackName: string;
    stateName: string;
    stdout: string;
    updatedResources: DeployingResource[];
};
export interface ProjectContext {
    targetAction?: "synth" | "diff" | "deploy" | "destroy" | "output";
    targetStack?: string;
    message?: string;
    synthesizedStacks?: SynthesizedStack[];
    terraform?: Terraform;
    targetStackPlan?: TerraformPlan;
    autoApprove?: boolean;
    synthCommand: string;
    outDir: string;
    workingDirectory: string;
    outputs?: Record<string, any>;
    outputsByConstructId?: Record<string, any>;
    onProgress: (event: ProgressEvent) => void;
}
declare const services: {
    synthProject: (context: ProjectContext) => Promise<SynthesizedStack[]>;
    initializeTerraform: (context: ProjectContext) => Promise<Terraform>;
    diff: (context: ProjectContext) => Promise<TerraformPlan>;
    deploy: (context: ProjectContext) => Promise<void>;
    destroy: (context: ProjectContext) => Promise<void>;
    gatherOutputs: (context: ProjectContext) => Promise<{
        outputs: {
            [key: string]: import("./models/terraform").TerraformOutput;
        };
        outputsByConstructId: import("./output").NestedTerraformOutputs;
    }>;
};
declare const guards: {
    targetActionIs: (context: ProjectContext, _event: any, state: {
        cond: {
            value: string;
        };
    }) => boolean;
    autoApprove: (context: ProjectContext) => boolean;
    planNeedsNoApply: (_context: ProjectContext, event: {
        data: TerraformPlan;
    }) => boolean;
};
declare const projectExecutionMachine: import("xstate").StateMachine<ProjectContext, any, ProjectEvent, {
    value: any;
    context: ProjectContext;
}, import("xstate").ActionObject<ProjectContext, ProjectEvent>>;
export { projectExecutionMachine, guards, services };
