import { type ChannelSetupLog } from "#setup/cli/index.js"; import { detectPackageManager } from "#setup/package-manager.js"; import { runPackageManagerInstall } from "#setup/primitives/pm/run.js"; import { runVercel } from "#setup/primitives/run-vercel.js"; import { detectDeployment, type ProjectResolution } from "../project-resolution.js"; import { type SetupState } from "../state.js"; import type { SetupBox } from "../step.js"; /** Injected for tests; defaults to the real subprocess primitives. */ export interface DeployProjectDeps { runVercel: typeof runVercel; detectPackageManager: typeof detectPackageManager; runPackageManagerInstall: typeof runPackageManagerInstall; detectDeployment: typeof detectDeployment; } export interface DeployProjectOptions { /** Deploy progress and command output stream through this log (rail styling preserved). */ prompter: { log: ChannelSetupLog; }; /** Skip the post-channel Vercel deployment entirely (`--no-deploy`). */ skip?: boolean; /** * Run even without a planned or detected project, linking interactively from * inside `perform` (the `eve channels add` composition; onboarding always has * a plan or skips deploy with the channels). */ ensureLinkedProject?: "interactive-vercel-link"; /** * Headless mode: gates interactive `vercel` commands inside `perform`. The box * asks no questions, so the dispatch decision the gather faces used to encode * comes from the composition site (the same place that picks the asker base), * not from a prompt. */ headless?: boolean; deps?: DeployProjectDeps; } /** * What `perform` consumes. The headless flag gates interactive `vercel` * commands inside `perform`; it is fixed at composition time (the box prompts * for nothing) and passed straight through {@link DeployProjectOptions.headless}. */ export interface DeployProjectInput { headless: boolean; } /** The deploy facts `apply` records: the (re)deployed project and the cleared flags. */ export interface DeployProjectPayload { project: ProjectResolution; deploymentPending: boolean; deploymentDependenciesInstalled: boolean; } /** * THE DEPLOY BOX. Owns the post-channel `vercel deploy --prod` once channel * setup has marked deployment work pending: dependency install (once per * state), the production deploy, the env pull, and the deployment probe. * * The project was linked up front by the link box, so `perform` reuses * `state.project` and never triggers a second interactive `vercel link` (the * #1020 deadlock). When no resolution exists (no link box ran, e.g. the * `eve channels add` composition), it falls back to the interactive bare * `vercel link`, or throws {@link HumanActionRequiredError} headlessly. */ export declare function deployProject(options: DeployProjectOptions): SetupBox;