import { type DeployProjectDeps } from "../boxes/deploy-project.js"; import { type LinkProjectDeps } from "../boxes/link-project.js"; import { type ResolveProvisioningDeps } from "../boxes/resolve-provisioning.js"; import { detectDeployment } from "../project-resolution.js"; import type { Prompter } from "../prompter.js"; /** Injected for tests; defaults to the real detection and box effects. */ export interface DeployFlowDeps { detectDeployment: typeof detectDeployment; resolveProvisioning?: ResolveProvisioningDeps; linkProject?: LinkProjectDeps; deployProject?: DeployProjectDeps; } export type DeployFlowResult = { kind: "deployed"; productionUrl?: string; } | { kind: "cancelled"; } /** Unlinked directory in a non-interactive run: refused before any effect. */ | { kind: "needs-link"; }; /** * THE DEPLOY FLOW, shared by `eve deploy` and the dev TUI's `/deploy`. Link * state is the safety-critical input for a deploy, so it is re-detected at * decision time, never trusted from an earlier render. An already-linked * project goes straight to the deploy box; an unlinked one walks the same * team/project pickers as onboarding (resolve-provisioning with the deploy * gate pre-answered — invoking deploy IS the deploy decision), then links * non-interactively so the deploy box never hits its bare-`vercel link` * fallback. A non-interactive run with no link refuses with `needs-link` * before any side effect. */ export declare function runDeployFlow(input: { appRoot: string; prompter: Prompter; signal?: AbortSignal; /** False when no TTY: an unlinked directory refuses instead of prompting. */ interactive: boolean; deps?: Partial; }): Promise;