import { detectProjectResolution, type ProjectResolution } from "../project-resolution.js";
import type { Prompter } from "../prompter.js";
import { type SetupState } from "../state.js";
import type { SetupBox } from "../step.js";
import { linkProject, resolveProjectByNameOrId, unresolvedProject } from "../vercel-project.js";
/** Injected for tests; defaults to the real Vercel project helpers. */
export interface LinkProjectDeps {
    linkProject: typeof linkProject;
    detectProjectResolution: typeof detectProjectResolution;
    resolveProjectByNameOrId: typeof resolveProjectByNameOrId;
    unresolvedProject: typeof unresolvedProject;
}
export interface LinkProjectOptions {
    /** Streams link progress and command output. The box never prompts through it. */
    prompter: Prompter;
    deps?: LinkProjectDeps;
}
/**
 * THE PROJECT BOX. Executes the resolved Vercel project plan after scaffolding,
 * once the project directory exists (so `vercel link` can write `.vercel/`).
 * The gather prompts for nothing: every decision was made up front by the
 * resolve-provisioning box, so `perform` owns all the work.
 *
 * The plan is authoritative. The box always re-links to the planned project so
 * a stale or mismatched `.vercel` link can never silently win over the choice
 * made up front. `vercel link --project X --yes` is an idempotent rewrite, so
 * re-runs stay safe. The resolution read back from `.vercel/project.json` lands
 * in `state.project`, which every later box reads.
 *
 * Named `linkVercelProject` because the setup island also exports the
 * `linkProject` executor helper this box drives.
 */
export declare function linkVercelProject(options: LinkProjectOptions): SetupBox<SetupState, null, ProjectResolution>;
