import type { ProjectType } from "../core/config.js";
/**
 * Overwrite decision options
 */
export type OverwriteDecision = "yes" | "no" | "diff";
/**
 * Interface for user prompts
 */
export interface IPrompter {
    /**
     * Whether this run has no operator decision available to it — neither a live
     * prompt to answer nor a `--yes` given in advance.
     *
     * The apply needs to tell those apart, and the prompter is the only thing
     * that knows. A `--yes` run is *attended*: the operator decided before
     * starting. A run with no TTY and no flag is not — there is nobody to ask,
     * and answering on their behalf is what #3026 was.
     */
    readonly unattended: boolean;
    /**
     * Prompt for file overwrite decision
     * @param relativePath Path to the conflicting file
     * @returns User's decision
     */
    promptOverwrite(relativePath: string): Promise<OverwriteDecision>;
    /**
     * Confirm detected project types with user
     * @param detected Array of detected project types
     * @returns Confirmed/modified project types
     */
    confirmProjectTypes(detected: readonly ProjectType[]): Promise<readonly ProjectType[]>;
    /**
     * Gate risky runs on explicit user consent, even in --yes mode.
     * @param status Git status output showing uncommitted changes
     * @returns True if user wants to proceed despite dirty state
     */
    confirmDirtyGit(status: string): Promise<boolean>;
}
/**
 * Interactive prompter using {@link https://github.com/enquirer/enquirer inquirer}/prompts
 */
export declare class InteractivePrompter implements IPrompter {
    /** A human is at the keyboard and answers every question. */
    readonly unattended = false;
    promptOverwrite(relativePath: string): Promise<OverwriteDecision>;
    confirmProjectTypes(detected: readonly ProjectType[]): Promise<readonly ProjectType[]>;
    confirmDirtyGit(status: string): Promise<boolean>;
}
/**
 * Auto-accepting prompter for `--yes`
 *
 * Reached only when the operator passed the flag. That flag *is* the decision —
 * "replace what differs, do not ask me" — so this prompter is attended even
 * though nothing is interactive about it. What it must never cover is a run
 * where no such flag was given; see {@link UnattendedPrompter}.
 *
 * Note: confirmDirtyGit always prompts interactively even in auto-accept mode,
 * as running Lisa on a dirty working directory requires explicit user consent.
 */
export declare class AutoAcceptPrompter implements IPrompter {
    /** The operator decided in advance by passing `--yes`. */
    readonly unattended = false;
    promptOverwrite(_relativePath: string): Promise<OverwriteDecision>;
    confirmProjectTypes(detected: readonly ProjectType[]): Promise<readonly ProjectType[]>;
    confirmDirtyGit(status: string): Promise<boolean>;
}
/**
 * Prompter for a run with no operator on either end — no TTY to ask, and no
 * `--yes` given in advance.
 *
 * This is the common case, not the exotic one: every agent-driven, scripted,
 * and CI `lisa apply` lands here. It used to be answered by
 * {@link AutoAcceptPrompter}, which says "yes" to every overwrite. So a bare
 * `lisa apply` replaced host-customised `knip.json`, `eslint.config.ts`, and
 * `tsconfig.json` and reported the result under "Overwritten: N files
 * (approved or Lisa-owned)" — nobody approved them, and Lisa owns none of
 * them. The absence of a terminal was being read as consent from an operator
 * who was never there (#3026).
 *
 * It answers "no" so that nothing is silently replaced even if a caller builds
 * a strategy context by hand. The apply's own routing does the rest: an
 * unattended run takes the same branch the postinstall does, which reports the
 * file as out of date and still honours `--refresh-templates`, the flag that
 * means "take upstream's version of these".
 */
export declare class UnattendedPrompter implements IPrompter {
    /** There is nobody to ask and no answer was given in advance. */
    readonly unattended = true;
    promptOverwrite(_relativePath: string): Promise<OverwriteDecision>;
    confirmProjectTypes(detected: readonly ProjectType[]): Promise<readonly ProjectType[]>;
    confirmDirtyGit(status: string): Promise<boolean>;
}
/**
 * Check if running in interactive mode (TTY available)
 * @returns True if running in TTY mode
 */
export declare function isInteractive(): boolean;
/**
 * Create appropriate prompter based on mode and TTY
 *
 * The three cases are three different sources of authority, and collapsing any
 * two of them loses the distinction that matters. `--yes` is consent given in
 * advance. A TTY is consent obtainable on demand. Neither one is a run with no
 * operator at all, which gets a prompter that declines rather than one that
 * invents an approval (#3026).
 * @param yesMode Non-interactive mode flag
 * @returns Prompter instance
 */
export declare function createPrompter(yesMode: boolean): IPrompter;
//# sourceMappingURL=prompts.d.ts.map