import type { OneShotCodexCredentials } from "./enrollment-login.js"; import { CodexServiceError } from "./errors.js"; interface Flow { state: string; url: string; pkce: { verifier: string; }; } interface UploadResult { providerAccountId: string; } export interface EnrollmentBrowserOptions { run: (acquire: () => Promise) => Promise; onResult?: (result: T) => void; onError?: (error: unknown) => void; openBrowser?: (url: string) => Promise; /** Test injection; production only uses the registered ports 1455 and 1457. */ port?: number; createFlow?: () => Promise; exchange?: (code: string, verifier: string, redirectUri: string, signal: AbortSignal) => Promise; idleTimeoutMs?: number; } declare const loginErrors: { readonly authorization_rejected: "OpenAI 未完成授权,尚未上传凭据。请退出后重新登录。"; readonly callback_invalid: "登录回调未包含有效授权码,尚未上传凭据。请退出后重新登录。"; readonly token_exchange_timeout: "连接 OpenAI 换取登录凭据超时,尚未上传。请检查网络后重新登录。"; readonly token_exchange_network: "连接 OpenAI 换取登录凭据失败,尚未上传。请检查网络后重新登录。"; readonly token_exchange_rejected: "OpenAI 拒绝了授权码兑换,尚未上传。请退出后重新登录。"; readonly token_response_invalid: "OpenAI 返回的登录凭据不完整或格式无效,尚未上传。请重新登录。"; readonly account_identity_missing: "登录凭据缺少 ChatGPT 账号标识,尚未上传。请重新登录。"; }; /** Only fixed messages and HTTP status may leave the OAuth exchange boundary. */ export declare class CodexBrowserLoginError extends CodexServiceError { constructor(reason: keyof typeof loginErrors, status?: number); } export declare function exchangeCodexEnrollmentCode(code: string, verifier: string, redirectUri: string, signal: AbortSignal, request?: typeof fetch): Promise; /** A sequence of independent PKCE logins; only a confirmed upload unlocks another round. */ export declare function startCodexEnrollmentBrowser(options: EnrollmentBrowserOptions): Promise<{ url: string; done: Promise; close: () => Promise; open: () => Promise; }>; export {};