import type { ExecutorKind } from "./executors.js"; import type { TerminalSubmissionAcceptanceEvidence } from "./terminal-submission-facts.js"; export type VirginBindingRecoveryState = "not_applicable" | "already_bound" | "pending" | "recovered"; export interface TerminalAcceptanceTurnFacts { turnStatus: string; messageId?: string; submissionStatus?: string; requestText: string; enterDispatchedAtMs?: number; codexAnchorVersion?: number; } export interface TerminalAcceptanceBindingRecovery { turn: Turn; state: VirginBindingRecoveryState; } export type TerminalAcceptanceResolution = { outcome: "agent_accepted"; evidence: TerminalSubmissionAcceptanceEvidence; } | { outcome: "not_accepted"; reason: string; }; export interface TerminalAcceptanceApplicationPorts { clock: { nowMs(): number; }; binding: { recover(turn: Turn): Promise>; }; acceptance: { detect(executor: ExecutorKind, turn: Turn): Promise; }; terminal: { proveExactDraftStillPresent(turn: Turn, requestText: string): Promise; }; repository: { commit(input: { turn: Turn; expected: TerminalAcceptanceTurnFacts; resolution: TerminalAcceptanceResolution; }): Promise; }; } export type TerminalAcceptanceApplicationResult = { outcome: "accepted"; turn: Turn; } | { outcome: "pending"; } | { outcome: "not_accepted"; turn: Turn; }; /** * Owns the monotonic acceptance polling order while concrete terminal and * repository resources remain outside the service boundary. */ export declare class TerminalAcceptanceApplicationService { #private; constructor(ports: TerminalAcceptanceApplicationPorts); reconcile(input: { executor: ExecutorKind; turn: Turn; project(turn: Turn): TerminalAcceptanceTurnFacts; }): Promise>; }