import type { AttemptId, ChangeSetId, ConnectionId, CredentialReferenceId, MutationContext, OperationId, ProviderId, ReviewId, ReviewFindingId } from "@awp/contracts";
import type { Attempt, AttemptToolCall, ChangeSet, FactoryRun, Review, ReviewFinding, Task, VerificationEvidence, VerificationEvidenceReference } from "@awp/domain";
import type { AgentProvider, ForgeProvider, RequiredChecksProvider, TrustedMerger, TrustedPublisher, WorkspaceProvider } from "./ports/providers.js";
import type { UnitOfWork } from "./ports/repositories.js";
import type { Clock, IdGenerator } from "./ports/runtime.js";
import { type DurableWorkflowStepRunner } from "./durable-step.js";
export interface ExecutionSelection {
    readonly accountId: string;
    readonly model?: string;
}
export interface ExecutionDispatchRequest {
    readonly factoryRun: FactoryRun;
    readonly task: Task;
    readonly context: MutationContext;
    readonly selection?: ExecutionSelection;
}
export interface DurableWorkflowStepContext {
    readonly operationId: OperationId;
    readonly workflowSteps: DurableWorkflowStepRunner;
    readonly iteration?: number;
}
export interface ExecutionDispatcher {
    dispatch(request: ExecutionDispatchRequest): Promise<void>;
    dispatchDurably?(request: ExecutionDispatchRequest, durable: DurableWorkflowStepContext): Promise<void>;
}
export interface AutoMergeContinuation {
    schedule(changeSetId: ChangeSetId, context: MutationContext): Promise<void>;
}
export interface AutoMergeReconciliationResult {
    readonly state: "waiting" | "merged" | "terminal";
    readonly changeSetId: ChangeSetId;
    readonly reason?: string;
}
export interface AutoMergeReconciler {
    reconcileAutoMerge(changeSetId: ChangeSetId, context: MutationContext): Promise<AutoMergeReconciliationResult>;
    reconcileAutoMergeDurably?(changeSetId: ChangeSetId, context: MutationContext, durable: DurableWorkflowStepContext): Promise<AutoMergeReconciliationResult>;
}
export interface ExecutionVerificationEvidenceInput {
    readonly name: string;
    readonly state: "passed" | "failed" | "stale" | "missing";
    readonly source: string;
    readonly observedAt: string;
    readonly required?: boolean;
    readonly details?: Readonly<Record<string, unknown>>;
}
export interface ExecutionCompletionInput {
    readonly attemptId: AttemptId;
    readonly token: string;
    readonly diff: string;
    readonly baseRevision: string;
    readonly candidateTreeDigest: string;
    readonly workspaceCheckpointDigest: string;
    readonly workspaceCheckpointedAt: string;
    readonly changedPaths: readonly string[];
    readonly changes: readonly {
        readonly path: string;
        readonly kind: "add" | "modify" | "delete";
    }[];
    readonly toolCalls: readonly AttemptToolCall[];
    readonly evidence: readonly ExecutionVerificationEvidenceInput[];
}
export interface RecordVerificationEvidenceInput extends ExecutionVerificationEvidenceInput {
    readonly changeSetId: ChangeSetId;
    readonly reference?: VerificationEvidenceReference;
}
export interface RecordReviewFindingInput {
    readonly changeSetId: ChangeSetId;
    readonly severity: "blocking" | "warning" | "recommendation" | "info";
    readonly summary: string;
    readonly source?: string;
}
export interface ExecutionFailureInput {
    readonly attemptId: AttemptId;
    readonly token: string;
    readonly reason: string;
    readonly workspaceCheckpointDigest: string;
    readonly workspaceCheckpointedAt: string;
}
export interface ExecutionReviewCompletionInput {
    readonly attemptId: AttemptId;
    readonly reviewId: ReviewId;
    readonly token: string;
    readonly candidateDigest: string;
    readonly workspaceCheckpointDigest: string;
    readonly workspaceCheckpointedAt: string;
    readonly disposition: "approved" | "changes-requested" | "blocked";
    readonly toolCalls: readonly AttemptToolCall[];
    readonly findings: readonly {
        readonly severity: "blocking" | "warning" | "recommendation" | "info";
        readonly summary: string;
    }[];
}
export interface TrustedRepositoryBoundary {
    readonly forge: ForgeProvider;
    readonly publisher: TrustedPublisher;
    readonly merger: TrustedMerger;
    readonly repositoryKey: (repositoryUrl: string) => string;
    readonly connectionId: ConnectionId;
    readonly credentialReferenceId: CredentialReferenceId;
}
export interface RequiredChecksBoundary {
    readonly provider: RequiredChecksProvider;
    readonly connectionId: ConnectionId;
    readonly credentialReferenceId: CredentialReferenceId;
}
export declare class MergeRefusedError extends Error {
    constructor(message: string);
}
export declare function executionCallbackToken(secret: string, attemptId: string): string;
export interface WorkspaceDispatchConfiguration {
    readonly profileKey: string;
    readonly callbackBaseUrl: string;
    readonly callbackSecret: string;
    readonly agentProviderId: ProviderId;
    readonly accountId?: string;
    readonly model?: string;
    readonly connectionId: ConnectionId;
    readonly credentialReferenceId: CredentialReferenceId;
    readonly forceFirstAttemptFailure?: boolean;
    readonly agentProvider?: AgentProvider;
    readonly agentConnectionId?: ConnectionId;
    readonly agentCredentialReferenceId?: CredentialReferenceId;
}
export declare class WorkspaceExecutionDispatcher implements ExecutionDispatcher {
    private readonly uow;
    private readonly workspaceProvider;
    private readonly ids;
    private readonly clock;
    private readonly configuration;
    private readonly trustedRepository?;
    private readonly requiredChecks?;
    private readonly autoMergeContinuation?;
    private readonly nextTaskDispatcher?;
    constructor(uow: UnitOfWork, workspaceProvider: WorkspaceProvider, ids: IdGenerator, clock: Clock, configuration: WorkspaceDispatchConfiguration, trustedRepository?: TrustedRepositoryBoundary | undefined, requiredChecks?: RequiredChecksBoundary | undefined, autoMergeContinuation?: AutoMergeContinuation | undefined, nextTaskDispatcher?: ExecutionDispatcher | undefined);
    dispatch(request: ExecutionDispatchRequest): Promise<void>;
    dispatchDurably(request: ExecutionDispatchRequest, durable: DurableWorkflowStepContext): Promise<void>;
    private dispatchWithSteps;
    reconcilePendingReviews(projectId: FactoryRun["projectId"], context: MutationContext): Promise<number>;
    failAttempt(input: ExecutionFailureInput, context: MutationContext): Promise<Attempt>;
    complete(input: ExecutionCompletionInput, context: MutationContext): Promise<ChangeSet>;
    refreshRequiredChecks(changeSetId: ChangeSetId, context: MutationContext, durable?: DurableWorkflowStepContext): Promise<readonly VerificationEvidence[]>;
    recordVerificationEvidence(input: RecordVerificationEvidenceInput, context: MutationContext): Promise<VerificationEvidence>;
    recordReviewFinding(input: RecordReviewFindingInput, context: MutationContext): Promise<ReviewFinding>;
    resolveReviewFinding(findingId: ReviewFindingId, context: MutationContext): Promise<ReviewFinding>;
    completeReview(input: ExecutionReviewCompletionInput, context: MutationContext): Promise<Review>;
    approveReview(reviewId: ReviewId, context: MutationContext): Promise<Review>;
    reconcileAutoMerge(changeSetId: ChangeSetId, context: MutationContext): Promise<AutoMergeReconciliationResult>;
    reconcileAutoMergeDurably(changeSetId: ChangeSetId, context: MutationContext, durable: DurableWorkflowStepContext): Promise<AutoMergeReconciliationResult>;
    private reconcileAutoMergeWithSteps;
    requestMerge(changeSetId: ChangeSetId, context: MutationContext): Promise<ChangeSet>;
    private executeMerge;
    private reconcileMergedFactoryRunDispatches;
    private reconcileFactoryRunDispatches;
    private scheduleRepositoryCorrection;
    private workflowDomainStep;
    private workflowExternalStep;
    private hasApprovedIndependentReview;
    private workspaceProviderContext;
    private attestWorkspaceCheckpoint;
    private cleanupTerminalChangeSetWorkspaces;
    private controlPlaneContinuationContext;
    private trustedProviderContext;
    private publishForReview;
    private finalizePublication;
    private ensureIndependentReview;
    private startAgentAttempt;
    private recordChangeSetMutation;
    private completionToken;
    private record;
}
//# sourceMappingURL=execution.d.ts.map