import type { PlatformFlow, StepView } from '../flow/contract'; import type { AppflowInput, AppflowProgress, AppflowStep } from './types'; import type { AppflowToken } from './auth'; import type { TailStep } from '../tail/flow.js'; import type { AppflowTailDepsOptions } from './tail.js'; export interface AppflowEffectResult { progress: AppflowProgress; next?: AppflowStep; transient?: Record; } export interface AppflowValidationResult { id: 'sa' | 'keystore' | 'app-password' | 'p12'; status: 'pass' | 'warn' | 'skipped'; message: string; } export interface AppflowGenerateResult { ok: boolean; creds?: Record; message?: string; } export interface AppflowEffectDeps { appId?: string; log?: (s: string) => void; loadToken?: () => AppflowToken | null; saveToken?: (t: AppflowToken) => void; openBrowser?: (url: string) => void; validateServiceAccountJson?: (json: string, packageName?: string) => Promise<{ ok: boolean; reason?: string; }>; tryUnlockPrivateKey?: (keystoreB64: string, storePass: string, alias: string) => Promise; validateAppleAppPassword?: (user: string, pw: string) => Promise<{ valid: boolean; message?: string; kind?: 'authenticated' | 'rejected' | 'unreachable'; }>; validateP12?: (p12B64: string, password: string) => Promise; generateIosP8Key?: () => Promise; generateAndroidServiceAccount?: (opts: { packageName?: string; }) => Promise; readP8File?: (path: string) => Promise; carried?: Record; tailOptions?: AppflowTailDepsOptions; } export declare function isAppflowTailStep(step: AppflowStep): step is TailStep; export declare function autoSelect(items: T[]): T | 'prompt' | null; export interface AppflowCert { tag?: string; name?: string; type?: string; credentials?: { ios?: unknown; android?: unknown; }; } export interface AppflowDistCred { id?: number | string; type?: string; name?: string; } export declare function decideAfterFetchSigning(progress: Pick): AppflowStep; export declare function platformsToBuild(progress: Pick): ('ios' | 'android')[]; export declare function runValidations(progress: AppflowProgress, deps?: AppflowEffectDeps): Promise; export declare function appflowViewForStep(step: AppflowStep, progress: AppflowProgress, ctx?: Record): StepView; /** * Decode the `email` claim from an Appflow token's id_token JWT WITHOUT verifying * the signature (jsonwebtoken.decode) — we only need the human-readable account * identity to surface which Appflow account is being migrated, not to trust it. * Returns undefined when there is no id_token or no string email claim. */ export declare function appflowAccountEmail(token: { id_token?: string; } | null | undefined): string | undefined; export declare function applyAppflowInput(step: AppflowStep, progress: AppflowProgress, input: AppflowInput): AppflowProgress; export declare function getAppflowResumeStep(progress: AppflowProgress | null): AppflowStep; /** * Resume the inline build phase after the user chose 'build'. The migration is * single-platform, so the build enters the shared tail at saving-credentials for * the migrated platform and finishes ('done') once that build run completes. */ export declare function getAppflowBuildResumeStep(progress: AppflowProgress): AppflowStep; export declare function nextTailStep(step: TailStep, value: string | undefined, progress: AppflowProgress): TailStep; /** * Record the migration's single inline tail run as complete (reached at * build-complete via any path — built, skipped, or failed). Returns the next * overall appflow step, which is always 'done' for a single-platform migration. */ export declare function markTailRunComplete(progress: AppflowProgress): { progress: AppflowProgress; next: AppflowStep; }; export declare function runAppflowEffect(step: AppflowStep, progress: AppflowProgress, deps: AppflowEffectDeps): Promise; export declare const appflowFlow: PlatformFlow;