type ActiveLogin = {
    sessionKey: string;
    id: string;
    qrcode: string;
    qrcodeUrl: string;
    startedAt: number;
    botToken?: string;
    status?: "wait" | "scaned" | "confirmed" | "expired" | "scaned_but_redirect";
    error?: string;
    /** The current effective polling base URL; may be updated on IDC redirect. */
    currentApiBaseUrl?: string;
};
/** Default `bot_type` for ilink get_bot_qrcode / get_qrcode_status (this channel build). */
export declare const DEFAULT_ILINK_BOT_TYPE = "3";
export type WeixinQrStartResult = {
    qrcodeUrl?: string;
    message: string;
    sessionKey: string;
};
export type WeixinQrWaitResult = {
    connected: boolean;
    botToken?: string;
    accountId?: string;
    baseUrl?: string;
    /** The user ID of the person who scanned the QR code; add to allowFrom. */
    userId?: string;
    message: string;
};
export declare function startWeixinLoginWithQr(opts: {
    verbose?: boolean;
    timeoutMs?: number;
    force?: boolean;
    accountId?: string;
    botType?: string;
    routeTag?: string;
}): Promise<WeixinQrStartResult>;
export declare function getWeixinActiveLoginSnapshot(sessionKey: string): {
    qrcodeUrl: string;
    status?: ActiveLogin["status"];
} | null;
export declare function waitForWeixinLogin(opts: {
    timeoutMs?: number;
    verbose?: boolean;
    /** When true, do not write to stdout (browser / gateway QR flow). */
    silent?: boolean;
    sessionKey: string;
    botType?: string;
    routeTag?: string;
}): Promise<WeixinQrWaitResult>;
export {};
