codex-multi-auth 2.0.1 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,325 @@
1
+ import { CLIENT_ID, exchangeAuthorizationCode, sanitizeOAuthResponseBodyForLog, } from "./auth.js";
2
+ export const DEVICE_AUTH_BASE_URL = "https://auth.openai.com";
3
+ export const DEVICE_AUTH_API_BASE_URL = `${DEVICE_AUTH_BASE_URL}/api/accounts`;
4
+ export const DEVICE_AUTH_VERIFICATION_URL = `${DEVICE_AUTH_BASE_URL}/codex/device`;
5
+ export const DEVICE_AUTH_REDIRECT_URI = `${DEVICE_AUTH_BASE_URL}/deviceauth/callback`;
6
+ export const DEVICE_AUTH_TIMEOUT_MS = 15 * 60 * 1000;
7
+ export const DEVICE_AUTH_DEFAULT_INTERVAL_MS = 5_000;
8
+ const DEVICE_AUTH_ABORTED_MESSAGE = "aborted";
9
+ const DEVICE_AUTH_TRANSIENT_PENDING_STATUSES = new Set([
10
+ 408,
11
+ 429,
12
+ 502,
13
+ 503,
14
+ 504,
15
+ ]);
16
+ function getFetch(options) {
17
+ return options.fetchImpl ?? fetch;
18
+ }
19
+ function getNow(options) {
20
+ return options.now ?? Date.now;
21
+ }
22
+ function unrefTimer(timer) {
23
+ timer.unref?.();
24
+ }
25
+ function getSleep(options) {
26
+ return (options.sleep ??
27
+ ((ms) => new Promise((resolve) => {
28
+ const timeout = setTimeout(resolve, ms);
29
+ unrefTimer(timeout);
30
+ })));
31
+ }
32
+ function getRandom(options) {
33
+ return options.random ?? Math.random;
34
+ }
35
+ function failedResult(reason, message, statusCode) {
36
+ return {
37
+ type: "failed",
38
+ reason,
39
+ statusCode,
40
+ message,
41
+ };
42
+ }
43
+ function createAbortError() {
44
+ const error = new Error(DEVICE_AUTH_ABORTED_MESSAGE);
45
+ error.name = "AbortError";
46
+ return error;
47
+ }
48
+ function isAbortError(error) {
49
+ return error instanceof Error && error.name === "AbortError";
50
+ }
51
+ function abortedResult() {
52
+ return failedResult("network_error", DEVICE_AUTH_ABORTED_MESSAGE);
53
+ }
54
+ function sleepWithAbort(ms, options) {
55
+ const signal = options.signal;
56
+ if (!signal) {
57
+ return getSleep(options)(ms);
58
+ }
59
+ if (signal.aborted) {
60
+ return Promise.reject(createAbortError());
61
+ }
62
+ const customSleep = options.sleep;
63
+ if (customSleep) {
64
+ let removeAbortListener = () => { };
65
+ const abortPromise = new Promise((_resolve, reject) => {
66
+ const onAbort = () => reject(createAbortError());
67
+ signal.addEventListener("abort", onAbort, { once: true });
68
+ removeAbortListener = () => signal.removeEventListener("abort", onAbort);
69
+ });
70
+ return Promise.race([customSleep(ms), abortPromise]).finally(removeAbortListener);
71
+ }
72
+ return new Promise((resolve, reject) => {
73
+ const onAbort = () => {
74
+ clearTimeout(timeout);
75
+ cleanup();
76
+ reject(createAbortError());
77
+ };
78
+ const cleanup = () => signal.removeEventListener("abort", onAbort);
79
+ const timeout = setTimeout(() => {
80
+ cleanup();
81
+ resolve();
82
+ }, ms);
83
+ unrefTimer(timeout);
84
+ signal.addEventListener("abort", onAbort, { once: true });
85
+ });
86
+ }
87
+ function formatWaitBudget(timeoutMs) {
88
+ const totalSeconds = Math.max(1, Math.ceil(timeoutMs / 1000));
89
+ if (totalSeconds < 60) {
90
+ return `${totalSeconds} second${totalSeconds === 1 ? "" : "s"}`;
91
+ }
92
+ const totalMinutes = Math.ceil(totalSeconds / 60);
93
+ return `${totalMinutes} minute${totalMinutes === 1 ? "" : "s"}`;
94
+ }
95
+ function isPendingStatus(status) {
96
+ return (status === 403 ||
97
+ status === 404 ||
98
+ DEVICE_AUTH_TRANSIENT_PENDING_STATUSES.has(status));
99
+ }
100
+ function parseRetryAfterMs(value, nowMs) {
101
+ if (!value)
102
+ return null;
103
+ const trimmed = value.trim();
104
+ if (!trimmed)
105
+ return null;
106
+ const seconds = Number(trimmed);
107
+ if (Number.isFinite(seconds) && seconds >= 0) {
108
+ return Math.ceil(seconds * 1000);
109
+ }
110
+ const dateMs = Date.parse(trimmed);
111
+ if (Number.isFinite(dateMs)) {
112
+ return Math.max(0, dateMs - nowMs);
113
+ }
114
+ return null;
115
+ }
116
+ function applyLightJitter(delayMs, options) {
117
+ const jitterRatio = 1 + (getRandom(options)() - 0.5) * 0.2;
118
+ return Math.max(1_000, Math.round(delayMs * jitterRatio));
119
+ }
120
+ function resolvePollDelayMs(response, deviceCode, nowMs, options) {
121
+ const retryAfterMs = parseRetryAfterMs(response.headers.get("retry-after"), nowMs);
122
+ if (retryAfterMs !== null) {
123
+ return Math.max(1_000, retryAfterMs);
124
+ }
125
+ if (response.status === 403 || response.status === 404) {
126
+ return deviceCode.intervalMs;
127
+ }
128
+ return applyLightJitter(deviceCode.intervalMs, options);
129
+ }
130
+ function asRecord(value) {
131
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
132
+ return null;
133
+ }
134
+ return value;
135
+ }
136
+ async function readJsonRecord(response) {
137
+ const text = await response.text().catch(() => "");
138
+ if (!text.trim()) {
139
+ return null;
140
+ }
141
+ try {
142
+ return asRecord(JSON.parse(text));
143
+ }
144
+ catch {
145
+ return null;
146
+ }
147
+ }
148
+ function parseIntervalMs(value) {
149
+ if (typeof value === "number" && Number.isFinite(value) && value > 0) {
150
+ return Math.trunc(value * 1000);
151
+ }
152
+ if (typeof value === "string") {
153
+ const parsed = Number.parseFloat(value.trim());
154
+ if (Number.isFinite(parsed) && parsed > 0) {
155
+ return Math.trunc(parsed * 1000);
156
+ }
157
+ }
158
+ return DEVICE_AUTH_DEFAULT_INTERVAL_MS;
159
+ }
160
+ function parseExpirationMs(value, nowMs) {
161
+ if (typeof value === "number" && Number.isFinite(value) && value > 0) {
162
+ return nowMs + Math.trunc(value * 1000);
163
+ }
164
+ if (typeof value === "string") {
165
+ const trimmed = value.trim();
166
+ if (/^\d+(?:\.\d+)?$/.test(trimmed)) {
167
+ const seconds = Number.parseFloat(trimmed);
168
+ return nowMs + Math.trunc(seconds * 1000);
169
+ }
170
+ const dateMs = Date.parse(trimmed);
171
+ if (Number.isFinite(dateMs)) {
172
+ return dateMs;
173
+ }
174
+ }
175
+ return null;
176
+ }
177
+ function parseNonEmptyString(value) {
178
+ if (typeof value !== "string") {
179
+ return null;
180
+ }
181
+ const trimmed = value.trim();
182
+ return trimmed.length > 0 ? trimmed : null;
183
+ }
184
+ function parseDeviceCodePayload(payload, nowMs) {
185
+ const deviceAuthId = parseNonEmptyString(payload.device_auth_id);
186
+ const userCode = parseNonEmptyString(payload.user_code) ??
187
+ parseNonEmptyString(payload.usercode);
188
+ if (!deviceAuthId || !userCode) {
189
+ return null;
190
+ }
191
+ const expiresAtMs = parseExpirationMs(payload.expires_at, nowMs) ??
192
+ parseExpirationMs(payload.expires_in, nowMs);
193
+ return {
194
+ verificationUrl: DEVICE_AUTH_VERIFICATION_URL,
195
+ userCode,
196
+ deviceAuthId,
197
+ intervalMs: parseIntervalMs(payload.interval),
198
+ ...(expiresAtMs === null ? {} : { expiresAtMs }),
199
+ };
200
+ }
201
+ function parseCompletionPayload(payload) {
202
+ const authorizationCode = parseNonEmptyString(payload.authorization_code);
203
+ const codeVerifier = parseNonEmptyString(payload.code_verifier);
204
+ if (!authorizationCode || !codeVerifier) {
205
+ return null;
206
+ }
207
+ // OpenAI Codex's device-code endpoint intentionally returns the PKCE
208
+ // verifier with the issued authorization code. This mirrors the upstream
209
+ // Codex CLI flow. The verifier is never persisted to account storage; keep
210
+ // this poll response out of logs and only hand it directly to the token
211
+ // exchange.
212
+ return { authorizationCode, codeVerifier };
213
+ }
214
+ async function readFailureText(response) {
215
+ const text = await response.text().catch(() => "");
216
+ return sanitizeOAuthResponseBodyForLog(text);
217
+ }
218
+ export async function requestDeviceAuthorization(options = {}) {
219
+ if (options.signal?.aborted) {
220
+ return abortedResult();
221
+ }
222
+ try {
223
+ const response = await getFetch(options)(`${DEVICE_AUTH_API_BASE_URL}/deviceauth/usercode`, {
224
+ method: "POST",
225
+ headers: { "Content-Type": "application/json" },
226
+ signal: options.signal,
227
+ body: JSON.stringify({ client_id: CLIENT_ID }),
228
+ });
229
+ if (!response.ok) {
230
+ if (response.status === 404) {
231
+ return failedResult("http_error", "Device auth login is not enabled for this Codex server. Use browser login or --manual.", response.status);
232
+ }
233
+ const safeText = await readFailureText(response);
234
+ return failedResult("http_error", safeText || `Device code request failed with status ${response.status}`, response.status);
235
+ }
236
+ const payload = await readJsonRecord(response);
237
+ const deviceCode = payload
238
+ ? parseDeviceCodePayload(payload, getNow(options)())
239
+ : null;
240
+ if (!deviceCode) {
241
+ return failedResult("invalid_response", "Device code request response failed schema validation");
242
+ }
243
+ return { type: "success", deviceCode };
244
+ }
245
+ catch (error) {
246
+ if (isAbortError(error) || options.signal?.aborted) {
247
+ return abortedResult();
248
+ }
249
+ return failedResult("network_error", error instanceof Error ? error.message : String(error));
250
+ }
251
+ }
252
+ export function printDeviceAuthorizationPrompt(deviceCode, log = console.log, timeoutMs = DEVICE_AUTH_TIMEOUT_MS, nowMs = Date.now()) {
253
+ const effectiveTimeoutMs = deviceCode.expiresAtMs === undefined
254
+ ? timeoutMs
255
+ : Math.min(timeoutMs, Math.max(0, deviceCode.expiresAtMs - nowMs));
256
+ log("Device auth login");
257
+ log(`Open: ${deviceCode.verificationUrl}`);
258
+ log(`Code: ${deviceCode.userCode}`);
259
+ log(`This code expires in ${formatWaitBudget(effectiveTimeoutMs)}. Never share it.`);
260
+ }
261
+ export async function pollDeviceAuthorization(deviceCode, options = {}) {
262
+ const now = getNow(options);
263
+ const startMs = now();
264
+ const timeoutMs = options.timeoutMs ?? DEVICE_AUTH_TIMEOUT_MS;
265
+ const deadline = Math.min(startMs + timeoutMs, deviceCode.expiresAtMs ?? Number.POSITIVE_INFINITY);
266
+ const effectiveTimeoutMs = Math.max(0, deadline - startMs);
267
+ try {
268
+ while (true) {
269
+ if (options.signal?.aborted) {
270
+ return abortedResult();
271
+ }
272
+ const response = await getFetch(options)(`${DEVICE_AUTH_API_BASE_URL}/deviceauth/token`, {
273
+ method: "POST",
274
+ headers: { "Content-Type": "application/json" },
275
+ signal: options.signal,
276
+ body: JSON.stringify({
277
+ device_auth_id: deviceCode.deviceAuthId,
278
+ user_code: deviceCode.userCode,
279
+ }),
280
+ });
281
+ if (response.ok) {
282
+ const payload = await readJsonRecord(response);
283
+ const completion = payload ? parseCompletionPayload(payload) : null;
284
+ if (!completion) {
285
+ return failedResult("invalid_response", "Device auth token response failed schema validation");
286
+ }
287
+ return { type: "success", completion };
288
+ }
289
+ if (isPendingStatus(response.status)) {
290
+ const nowMs = now();
291
+ const remainingMs = deadline - nowMs;
292
+ if (remainingMs <= 0) {
293
+ return failedResult("timeout", `Device auth timed out after ${formatWaitBudget(effectiveTimeoutMs)}`);
294
+ }
295
+ const delayMs = resolvePollDelayMs(response, deviceCode, nowMs, options);
296
+ await sleepWithAbort(Math.min(delayMs, remainingMs), options);
297
+ continue;
298
+ }
299
+ const safeText = await readFailureText(response);
300
+ return failedResult("http_error", safeText || `Device auth failed with status ${response.status}`, response.status);
301
+ }
302
+ }
303
+ catch (error) {
304
+ if (isAbortError(error) || options.signal?.aborted) {
305
+ return abortedResult();
306
+ }
307
+ return failedResult("network_error", error instanceof Error ? error.message : String(error));
308
+ }
309
+ }
310
+ export async function runDeviceAuthFlow(options = {}) {
311
+ const deviceCodeResult = await requestDeviceAuthorization(options);
312
+ if (deviceCodeResult.type !== "success") {
313
+ return deviceCodeResult;
314
+ }
315
+ if (options.signal?.aborted) {
316
+ return abortedResult();
317
+ }
318
+ printDeviceAuthorizationPrompt(deviceCodeResult.deviceCode, options.log ?? console.log, options.timeoutMs ?? DEVICE_AUTH_TIMEOUT_MS, getNow(options)());
319
+ const completionResult = await pollDeviceAuthorization(deviceCodeResult.deviceCode, options);
320
+ if (completionResult.type !== "success") {
321
+ return completionResult;
322
+ }
323
+ return exchangeAuthorizationCode(completionResult.completion.authorizationCode, completionResult.completion.codeVerifier, DEVICE_AUTH_REDIRECT_URI);
324
+ }
325
+ //# sourceMappingURL=device-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-auth.js","sourceRoot":"","sources":["../../../lib/auth/device-auth.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,4 @@
1
1
  export * from "./auth.js";
2
+ export { runDeviceAuthFlow } from "./device-auth.js";
3
+ export type { DeviceAuthFlowOptions } from "./device-auth.js";
2
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,YAAY,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -1,2 +1,3 @@
1
1
  export * from "./auth.js";
2
+ export { runDeviceAuthFlow } from "./device-auth.js";
2
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  export declare function printUsage(): void;
2
2
  export type AuthLoginOptions = {
3
3
  manual: boolean;
4
+ deviceAuth: boolean;
4
5
  };
5
6
  export type ParsedAuthLoginArgs = {
6
7
  ok: true;
@@ -1 +1 @@
1
- {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../../lib/codex-manager/help.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,IAAI,IAAI,CAsCjC;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC9B,MAAM,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,gBAAgB,CAAA;CAAE,GACvC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,mBAAmB,CAqBtE;AAED,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,MAAM,cAAc,GACvB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,GACrC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnD,wBAAgB,cAAc,IAAI,IAAI,CAgBrC;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,cAAc,CAyD5D"}
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../../lib/codex-manager/help.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,IAAI,IAAI,CAsCjC;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,gBAAgB,CAAA;CAAE,GACvC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,mBAAmB,CAwCtE;AAED,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,MAAM,cAAc,GACvB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,GACrC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnD,wBAAgB,cAAc,IAAI,IAAI,CAgBrC;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,cAAc,CAyD5D"}
@@ -3,7 +3,7 @@ export function printUsage() {
3
3
  "Codex Multi-Auth CLI",
4
4
  "",
5
5
  "Start here:",
6
- " codex auth login [--manual|--no-browser]",
6
+ " codex auth login [--device-auth|--manual|--no-browser]",
7
7
  " codex auth status",
8
8
  " codex auth check",
9
9
  "",
@@ -38,10 +38,19 @@ export function printUsage() {
38
38
  export function parseAuthLoginArgs(args) {
39
39
  const options = {
40
40
  manual: false,
41
+ deviceAuth: false,
41
42
  };
43
+ const manualFlags = [];
42
44
  for (const arg of args) {
43
45
  if (arg === "--manual" || arg === "--no-browser") {
44
46
  options.manual = true;
47
+ if (!manualFlags.includes(arg)) {
48
+ manualFlags.push(arg);
49
+ }
50
+ continue;
51
+ }
52
+ if (arg === "--device-auth") {
53
+ options.deviceAuth = true;
45
54
  continue;
46
55
  }
47
56
  if (arg === "--help" || arg === "-h") {
@@ -53,6 +62,14 @@ export function parseAuthLoginArgs(args) {
53
62
  message: `Unknown login option: ${arg}`,
54
63
  };
55
64
  }
65
+ if (options.deviceAuth && options.manual) {
66
+ const conflict = manualFlags.length > 0 ? manualFlags.join(" or ") : "--manual";
67
+ return {
68
+ ok: false,
69
+ reason: "error",
70
+ message: `Cannot combine --device-auth with ${conflict}`,
71
+ };
72
+ }
56
73
  return { ok: true, options };
57
74
  }
58
75
  export function printBestUsage() {
@@ -1 +1 @@
1
- {"version":3,"file":"help.js","sourceRoot":"","sources":["../../../lib/codex-manager/help.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../../lib/codex-manager/help.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"codex-manager.d.ts","sourceRoot":"","sources":["../../lib/codex-manager.ts"],"names":[],"mappings":"AA65CA,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQ3D;AAwuDD,wBAAsB,4BAA4B,IAAI,OAAO,CAAC,OAAO,CAAC,CAuGrE;AAuCD,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAwL7E"}
1
+ {"version":3,"file":"codex-manager.d.ts","sourceRoot":"","sources":["../../lib/codex-manager.ts"],"names":[],"mappings":"AAs6CA,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQ3D;AA+vDD,wBAAsB,4BAA4B,IAAI,OAAO,CAAC,OAAO,CAAC,CAuGrE;AAuCD,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAwL7E"}
@@ -2,6 +2,7 @@ import { stdin as input, stdout as output } from "node:process";
2
2
  import { createInterface } from "node:readline/promises";
3
3
  import { extractAccountEmail, extractAccountId, formatAccountLabel, formatWaitTime, getAccountIdCandidates, resolveRequestAccountId, sanitizeEmail, selectBestAccountCandidate, shouldUpdateAccountIdFromToken, } from "./accounts.js";
4
4
  import { createAuthorizationFlow, exchangeAuthorizationCode, parseAuthorizationInput, redactOAuthUrlForLog, REDIRECT_URI, } from "./auth/auth.js";
5
+ import { runDeviceAuthFlow } from "./auth/device-auth.js";
5
6
  import { copyTextToClipboard, isBrowserLaunchSuppressed, openBrowserUrl, } from "./auth/browser.js";
6
7
  import { startLocalOAuthServer } from "./auth/server.js";
7
8
  import { promptAddAnotherAccount, promptLoginMode, } from "./cli.js";
@@ -1435,6 +1436,18 @@ async function runOAuthFlow(forceNewLogin, signInMode) {
1435
1436
  }
1436
1437
  return exchangeAuthorizationCode(code, pkce.verifier, REDIRECT_URI);
1437
1438
  }
1439
+ async function runSignInFlow(forceNewLogin, signInMode, options = {}) {
1440
+ if (signInMode === "device") {
1441
+ // OpenAI owns the device-code account picker; there is no force-new-login
1442
+ // equivalent to pass through for this mode.
1443
+ // TODO: Thread a manager-level AbortSignal when login cancellation exists.
1444
+ return runDeviceAuthFlow({
1445
+ log: console.log,
1446
+ timeoutMs: options.timeoutMs,
1447
+ });
1448
+ }
1449
+ return runOAuthFlow(forceNewLogin, signInMode);
1450
+ }
1438
1451
  async function persistAccountPool(results, replaceAll) {
1439
1452
  if (results.length === 0)
1440
1453
  return;
@@ -2173,9 +2186,11 @@ async function runAuthLogin(args) {
2173
2186
  while (true) {
2174
2187
  const latestNamedBackup = namedBackups[0] ?? null;
2175
2188
  const preferManualMode = loginOptions.manual || isBrowserLaunchSuppressed();
2176
- const signInMode = preferManualMode
2177
- ? "manual"
2178
- : await promptOAuthSignInMode(latestNamedBackup, onboardingBackupDiscoveryWarning);
2189
+ const signInMode = loginOptions.deviceAuth
2190
+ ? "device"
2191
+ : preferManualMode
2192
+ ? "manual"
2193
+ : await promptOAuthSignInMode(latestNamedBackup, onboardingBackupDiscoveryWarning);
2179
2194
  if (signInMode === "cancel") {
2180
2195
  if (existingCount > 0) {
2181
2196
  console.log(stylePromptText(UI_COPY.oauth.cancelledBackToMenu, "muted"));
@@ -2243,10 +2258,12 @@ async function runAuthLogin(args) {
2243
2258
  }
2244
2259
  continue loginFlow;
2245
2260
  }
2246
- if (signInMode !== "browser" && signInMode !== "manual") {
2261
+ if (signInMode !== "browser" &&
2262
+ signInMode !== "manual" &&
2263
+ signInMode !== "device") {
2247
2264
  continue;
2248
2265
  }
2249
- const tokenResult = await runOAuthFlow(forceNewLogin, signInMode);
2266
+ const tokenResult = await runSignInFlow(forceNewLogin, signInMode);
2250
2267
  if (tokenResult.type !== "success") {
2251
2268
  if (isOAuthCancellation(tokenResult)) {
2252
2269
  if (existingCount > 0) {