import type { FC } from 'react';
import type { BuildOnboardingRecoveryAdvice } from '../../recovery.js';
import type { AiResultKind } from '../components.js';
export declare const WelcomeStep: FC;
export interface PlatformSelectStepProps {
    appId: string;
    dense?: boolean;
    onChange: (value: string) => void | Promise<void>;
}
export declare const PlatformSelectStep: FC<PlatformSelectStepProps>;
export interface NoPlatformStepProps {
    iosDir: string;
    addIosCommand: string;
    syncIosCommand: string;
    dense?: boolean;
    onChange: (value: string) => void;
}
export declare const NoPlatformStep: FC<NoPlatformStepProps>;
export interface AddingPlatformStepProps {
    addIosCommand: string;
    doctorCommand: string;
    dense?: boolean;
}
export declare const AddingPlatformStep: FC<AddingPlatformStepProps>;
export interface AiAnalysisPromptStepProps {
    dense?: boolean;
    onChange: (value: string) => void | Promise<void>;
}
export declare const AiAnalysisPromptStep: FC<AiAnalysisPromptStepProps>;
export declare const AiAnalysisRunningStep: FC;
export interface AiAnalysisResultStepProps {
    analysisText: string | null;
    collapsed: boolean;
    result: {
        kind: AiResultKind;
        message: string;
    } | null;
    canRetry: boolean;
    retriesLeft: number;
    maxRetries: number;
    dense?: boolean;
    onChange: (value: string) => void | Promise<void>;
}
export declare const AiAnalysisResultStep: FC<AiAnalysisResultStepProps>;
export interface ErrorStepProps {
    error: string;
    recoveryAdvice: BuildOnboardingRecoveryAdvice | null;
    supportBundlePath: string | null;
    showRetry: boolean;
    dense?: boolean;
    /** When true, the full error + recovery advice was already shown in the
     *  scrollable viewer (it was taller than the viewport), so render only the
     *  error headline + the action prompt here — keeping Try again / Restart /
     *  Exit reachable no matter how long the advice was. */
    collapsed?: boolean;
    onChange: (value: string) => void | Promise<void>;
}
export declare function formatErrorViewerLines(error: string, recoveryAdvice: BuildOnboardingRecoveryAdvice | null, supportBundlePath: string | null): string[];
/**
 * Estimate the rendered row height of the COMFORTABLE ErrorStep body (marginTop
 * + error line + recovery advice + action prompt), independent of whether the
 * collapsed or full form actually renders. The parent uses this to decide
 * whether to route the error through the scroll viewer.
 *
 * Why a structural estimate and not `measureElement`: measuring the rendered
 * body would FEEDBACK-LOOP — a collapsed body measures short → "fits" → render
 * full → measures tall → collapse → measures short → … This estimate depends
 * only on the advice shape + width, so the decision is stable at any size.
 *
 * Calibrated against the VT harness: the body estimate lands within ~1 row of
 * the real render across every recovery-advice shape, and the surrounding frame
 * chrome (boxed header + completed-steps log + padding) is a fixed ~15 rows the
 * caller reserves on top.
 */
export declare function estimateErrorBodyRows(error: string, recoveryAdvice: BuildOnboardingRecoveryAdvice | null, supportBundlePath: string | null, cols: number, showRetry: boolean): number;
export declare const ErrorStep: FC<ErrorStepProps>;
export interface BuildCompleteStepProps {
    buildUrl: string;
    ciSecretUploadSummary: string | null;
    buildRequestCommand: string;
    /** Absolute path of a workflow file written by the GitHub Actions flow. */
    workflowWrittenPath?: string | null;
    /** Absolute path of credentials exported to a .env fallback. */
    envExportPath?: string | null;
    /** Surfaced when the .env export failed (non-fatal). */
    envExportError?: string | null;
    dense?: boolean;
}
export declare const BuildCompleteStep: FC<BuildCompleteStepProps>;
