eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
63 lines (62 loc) • 2.95 kB
TypeScript
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<SetupState, DeployProjectInput, DeployProjectPayload>;