zelari-code 1.37.0 → 1.38.0

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.
@@ -1,10 +1,13 @@
1
1
  /**
2
2
  * chatgptOAuth — ChatGPT subscription login (Codex public OAuth client).
3
3
  *
4
- * Magic-link / device flow (preferred, matches Grok UX):
5
- * POST /api/accounts/deviceauth/usercode user_code + verification_uri
6
- * poll /api/accounts/deviceauth/token authorization_code
7
- * POST /oauth/token (authorization_code) access + refresh
4
+ * Device flow (preferred, matches official Codex CLI — NOT RFC 8628):
5
+ * POST JSON /api/accounts/deviceauth/usercode { client_id }
6
+ * device_auth_id + user_code + interval
7
+ * User opens https://auth.openai.com/codex/device and enters user_code
8
+ * poll JSON /api/accounts/deviceauth/token { device_auth_id, user_code }
9
+ * → authorization_code + server-issued PKCE (code_verifier)
10
+ * POST form /oauth/token (authorization_code) → access + refresh
8
11
  *
9
12
  * Optional browser PKCE (localhost:1455) via CHATGPT_OAUTH_FLOW=browser.
10
13
  */
@@ -16,6 +19,8 @@ export const CHATGPT_TOKEN_URL = 'https://auth.openai.com/oauth/token';
16
19
  export const CHATGPT_DEVICE_CODE_URL = 'https://auth.openai.com/api/accounts/deviceauth/usercode';
17
20
  export const CHATGPT_DEVICE_TOKEN_URL = 'https://auth.openai.com/api/accounts/deviceauth/token';
18
21
  export const CHATGPT_DEVICE_REDIRECT_URI = 'https://auth.openai.com/deviceauth/callback';
22
+ /** Codex constructs this; the usercode response does not include verification_uri. */
23
+ export const CHATGPT_DEVICE_VERIFY_URL = 'https://auth.openai.com/codex/device';
19
24
  export const CHATGPT_SCOPE = 'openid profile email offline_access';
20
25
  export const CHATGPT_AUTH_CLAIMS = 'https://api.openai.com/auth';
21
26
  export class ChatgptOAuthError extends Error {
@@ -72,6 +77,35 @@ function parseTokenPayload(obj, fallbackRefresh) {
72
77
  }
73
78
  return result;
74
79
  }
80
+ function errorSnippet(body) {
81
+ const err = body.error;
82
+ if (typeof err === 'string' && err.trim())
83
+ return err.trim().slice(0, 160);
84
+ if (err && typeof err === 'object') {
85
+ const msg = err.message;
86
+ if (typeof msg === 'string' && msg.trim())
87
+ return msg.trim().slice(0, 160);
88
+ }
89
+ const msg = body.message;
90
+ if (typeof msg === 'string' && msg.trim())
91
+ return msg.trim().slice(0, 160);
92
+ return '';
93
+ }
94
+ function formatHttpError(prefix, status, body) {
95
+ const detail = errorSnippet(body);
96
+ return detail ? `${prefix} HTTP ${status}: ${detail}` : `${prefix} HTTP ${status}`;
97
+ }
98
+ async function readJsonBody(response) {
99
+ try {
100
+ const parsed = await response.json();
101
+ if (parsed && typeof parsed === 'object')
102
+ return parsed;
103
+ }
104
+ catch {
105
+ /* empty */
106
+ }
107
+ return {};
108
+ }
75
109
  async function postForm(url, data, fetchImpl) {
76
110
  let response;
77
111
  try {
@@ -87,16 +121,35 @@ async function postForm(url, data, fetchImpl) {
87
121
  catch (err) {
88
122
  throw new ChatgptOAuthError(`ChatGPT OAuth network error: ${err instanceof Error ? err.message : String(err)}`, 'network_error');
89
123
  }
90
- let body = {};
124
+ return { status: response.status, body: await readJsonBody(response) };
125
+ }
126
+ /** Codex device-auth endpoints expect JSON, not RFC 8628 form bodies. */
127
+ async function postJson(url, data, fetchImpl) {
128
+ let response;
91
129
  try {
92
- const parsed = await response.json();
93
- if (parsed && typeof parsed === 'object')
94
- body = parsed;
130
+ response = await fetchImpl(url, {
131
+ method: 'POST',
132
+ headers: {
133
+ 'Content-Type': 'application/json',
134
+ Accept: 'application/json',
135
+ },
136
+ body: JSON.stringify(data),
137
+ });
95
138
  }
96
- catch {
97
- /* empty */
139
+ catch (err) {
140
+ throw new ChatgptOAuthError(`ChatGPT OAuth network error: ${err instanceof Error ? err.message : String(err)}`, 'network_error');
98
141
  }
99
- return { status: response.status, body };
142
+ return { status: response.status, body: await readJsonBody(response) };
143
+ }
144
+ function parsePollInterval(raw, fallback = 5) {
145
+ if (typeof raw === 'number' && Number.isFinite(raw) && raw > 0)
146
+ return raw;
147
+ if (typeof raw === 'string') {
148
+ const n = Number.parseInt(raw, 10);
149
+ if (Number.isFinite(n) && n > 0)
150
+ return n;
151
+ }
152
+ return fallback;
100
153
  }
101
154
  export async function refreshChatgptToken(options) {
102
155
  if (!options.refreshToken.trim()) {
@@ -111,80 +164,90 @@ export async function refreshChatgptToken(options) {
111
164
  }, fetchImpl);
112
165
  if (status >= 400) {
113
166
  const code = status === 400 || status === 401 ? 'invalid_grant' : `http_${status}`;
114
- throw new ChatgptOAuthError(`ChatGPT token refresh HTTP ${status}: ${String(body.error ?? '').slice(0, 160)}`, code);
167
+ throw new ChatgptOAuthError(formatHttpError('ChatGPT token refresh', status, body), code);
115
168
  }
116
169
  return parseTokenPayload(body, options.refreshToken);
117
170
  }
118
- export async function runChatgptDeviceFlow(options) {
171
+ export async function startChatgptDeviceAuth(options = {}) {
119
172
  const clientId = options.clientId || process.env.CHATGPT_OAUTH_CLIENT_ID || DEFAULT_CHATGPT_CLIENT_ID;
120
173
  const fetchImpl = options.fetchImpl ?? fetch;
121
- const sleep = options.sleepImpl ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
122
- const { verifier, challenge } = generatePkcePair();
123
- const start = await postForm(CHATGPT_DEVICE_CODE_URL, {
124
- client_id: clientId,
125
- scope: CHATGPT_SCOPE,
126
- code_challenge: challenge,
127
- code_challenge_method: 'S256',
128
- }, fetchImpl);
174
+ // Official Codex: JSON { client_id } only. Extra RFC 8628 / PKCE fields HTTP 400.
175
+ const start = await postJson(CHATGPT_DEVICE_CODE_URL, { client_id: clientId }, fetchImpl);
129
176
  if (start.status >= 400) {
130
- throw new ChatgptOAuthError(`ChatGPT device-code HTTP ${start.status}`, `device_http_${start.status}`);
177
+ throw new ChatgptOAuthError(formatHttpError('ChatGPT device-code', start.status, start.body), `device_http_${start.status}`);
131
178
  }
132
- const deviceCode = start.body.device_code;
133
- const userCode = start.body.user_code;
179
+ const deviceAuthId = (typeof start.body.device_auth_id === 'string' && start.body.device_auth_id) ||
180
+ (typeof start.body.device_code === 'string' && start.body.device_code) ||
181
+ '';
182
+ const userCode = (typeof start.body.user_code === 'string' && start.body.user_code) ||
183
+ (typeof start.body.usercode === 'string' && start.body.usercode) ||
184
+ '';
134
185
  const verificationUri = (typeof start.body.verification_uri === 'string' && start.body.verification_uri) ||
135
- (typeof start.body.verification_uri_complete === 'string' &&
136
- start.body.verification_uri_complete);
137
- if (typeof deviceCode !== 'string' ||
138
- typeof userCode !== 'string' ||
139
- typeof verificationUri !== 'string') {
186
+ (typeof start.body.verification_url === 'string' && start.body.verification_url) ||
187
+ `${CHATGPT_DEVICE_VERIFY_URL}?user_code=${encodeURIComponent(userCode)}`;
188
+ if (!deviceAuthId || !userCode) {
140
189
  throw new ChatgptOAuthError('Device-code response missing fields', 'no_device_code');
141
190
  }
142
- const info = {
191
+ return {
192
+ deviceAuthId,
143
193
  userCode,
144
194
  verificationUri,
195
+ interval: parsePollInterval(start.body.interval, 5),
145
196
  ...(typeof start.body.verification_uri_complete === 'string'
146
197
  ? { verificationUriComplete: start.body.verification_uri_complete }
147
198
  : {}),
148
199
  };
149
- if (options.onUserCode)
150
- await options.onUserCode(info);
151
- try {
152
- await (options.openBrowserImpl ?? openBrowser)(info.verificationUriComplete ?? info.verificationUri);
153
- }
154
- catch {
155
- /* user can open the URL manually */
156
- }
200
+ }
201
+ export async function pollChatgptDeviceAuth(options) {
202
+ const clientId = options.clientId || process.env.CHATGPT_OAUTH_CLIENT_ID || DEFAULT_CHATGPT_CLIENT_ID;
203
+ const fetchImpl = options.fetchImpl ?? fetch;
204
+ const sleep = options.sleepImpl ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
157
205
  const timeoutMs = options.timeoutMs ?? 300_000;
158
206
  const deadline = Date.now() + timeoutMs;
159
- let interval = 5;
207
+ let interval = options.interval ?? 5;
160
208
  let authorizationCode;
209
+ let codeVerifier;
161
210
  while (Date.now() < deadline) {
162
- const poll = await postForm(CHATGPT_DEVICE_TOKEN_URL, { client_id: clientId, device_code: deviceCode }, fetchImpl);
211
+ const poll = await postJson(CHATGPT_DEVICE_TOKEN_URL, { device_auth_id: options.deviceAuthId, user_code: options.userCode }, fetchImpl);
163
212
  const authCode = poll.body.authorization_code;
164
213
  if (typeof authCode === 'string' && authCode.length > 0) {
165
214
  authorizationCode = authCode;
215
+ if (typeof poll.body.code_verifier === 'string' && poll.body.code_verifier) {
216
+ codeVerifier = poll.body.code_verifier;
217
+ }
166
218
  break;
167
219
  }
220
+ // Codex treats 403/404 as "not authorized yet".
221
+ if (poll.status === 403 || poll.status === 404) {
222
+ await sleep(interval * 1000);
223
+ continue;
224
+ }
168
225
  const err = typeof poll.body.error === 'string' ? poll.body.error : '';
169
226
  if (err === 'slow_down')
170
227
  interval += 5;
171
228
  else if (err && err !== 'authorization_pending') {
172
229
  throw new ChatgptOAuthError(`Device authorization failed: ${err}`, err);
173
230
  }
231
+ else if (poll.status >= 400) {
232
+ throw new ChatgptOAuthError(formatHttpError('ChatGPT device poll', poll.status, poll.body), `poll_http_${poll.status}`);
233
+ }
174
234
  await sleep(interval * 1000);
175
235
  }
176
236
  if (!authorizationCode) {
177
237
  throw new ChatgptOAuthError('Timed out waiting for ChatGPT device authorization', 'timeout');
178
238
  }
239
+ if (!codeVerifier) {
240
+ throw new ChatgptOAuthError('Device token response missing code_verifier (server-issued PKCE)', 'no_code_verifier');
241
+ }
179
242
  const token = await postForm(CHATGPT_TOKEN_URL, {
180
243
  grant_type: 'authorization_code',
181
244
  code: authorizationCode,
182
245
  redirect_uri: CHATGPT_DEVICE_REDIRECT_URI,
183
246
  client_id: clientId,
184
- code_verifier: verifier,
247
+ code_verifier: codeVerifier,
185
248
  }, fetchImpl);
186
249
  if (token.status >= 400) {
187
- throw new ChatgptOAuthError(`ChatGPT token exchange HTTP ${token.status}`, `token_http_${token.status}`);
250
+ throw new ChatgptOAuthError(formatHttpError('ChatGPT token exchange', token.status, token.body), `token_http_${token.status}`);
188
251
  }
189
252
  return parseTokenPayload(token.body);
190
253
  }
@@ -231,10 +294,46 @@ export async function runChatgptBrowserFlow(options) {
231
294
  code_verifier: verifier,
232
295
  }, fetchImpl);
233
296
  if (token.status >= 400) {
234
- throw new ChatgptOAuthError(`ChatGPT token exchange HTTP ${token.status}`, `token_http_${token.status}`);
297
+ throw new ChatgptOAuthError(formatHttpError('ChatGPT token exchange', token.status, token.body), `token_http_${token.status}`);
235
298
  }
236
299
  return parseTokenPayload(token.body);
237
300
  }
301
+ export async function runChatgptDeviceFlow(options = {}) {
302
+ const session = await startChatgptDeviceAuth({
303
+ clientId: options.clientId,
304
+ fetchImpl: options.fetchImpl,
305
+ });
306
+ const info = {
307
+ userCode: session.userCode,
308
+ verificationUri: session.verificationUri,
309
+ ...(session.verificationUriComplete
310
+ ? { verificationUriComplete: session.verificationUriComplete }
311
+ : {}),
312
+ };
313
+ if (options.onUserCode) {
314
+ await options.onUserCode(info);
315
+ }
316
+ else {
317
+ // Desktop / --login-oauth has no TUI callback: print the Codex device page + code.
318
+ // stderr: Desktop --login-oauth parses stdout as JSON.
319
+ process.stderr.write(`[chatgpt oauth] Open ${info.verificationUri} and enter:\n ${info.userCode}\n`);
320
+ }
321
+ try {
322
+ await (options.openBrowserImpl ?? openBrowser)(info.verificationUriComplete ?? info.verificationUri);
323
+ }
324
+ catch {
325
+ /* user can open the URL manually */
326
+ }
327
+ return pollChatgptDeviceAuth({
328
+ deviceAuthId: session.deviceAuthId,
329
+ userCode: session.userCode,
330
+ clientId: options.clientId,
331
+ interval: session.interval,
332
+ fetchImpl: options.fetchImpl,
333
+ sleepImpl: options.sleepImpl,
334
+ timeoutMs: options.timeoutMs,
335
+ });
336
+ }
238
337
  export async function runChatgptOAuthFlow(options = {}) {
239
338
  const flow = (process.env.CHATGPT_OAUTH_FLOW ?? 'device').toLowerCase();
240
339
  if (flow === 'browser') {
@@ -1 +1 @@
1
- {"version":3,"file":"chatgptOAuth.js","sourceRoot":"","sources":["../../src/cli/chatgptOAuth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chatgptOAuth.js","sourceRoot":"","sources":["../../src/cli/chatgptOAuth.ts"],"names":[],"mappings":"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"}
@@ -794,16 +794,19 @@ __export(chatgptOAuth_exports, {
794
794
  CHATGPT_DEVICE_CODE_URL: () => CHATGPT_DEVICE_CODE_URL,
795
795
  CHATGPT_DEVICE_REDIRECT_URI: () => CHATGPT_DEVICE_REDIRECT_URI,
796
796
  CHATGPT_DEVICE_TOKEN_URL: () => CHATGPT_DEVICE_TOKEN_URL,
797
+ CHATGPT_DEVICE_VERIFY_URL: () => CHATGPT_DEVICE_VERIFY_URL,
797
798
  CHATGPT_SCOPE: () => CHATGPT_SCOPE,
798
799
  CHATGPT_TOKEN_URL: () => CHATGPT_TOKEN_URL,
799
800
  ChatgptOAuthError: () => ChatgptOAuthError,
800
801
  DEFAULT_CHATGPT_CLIENT_ID: () => DEFAULT_CHATGPT_CLIENT_ID,
801
802
  decodeJwtClaims: () => decodeJwtClaims,
802
803
  extractChatgptAccountId: () => extractChatgptAccountId,
804
+ pollChatgptDeviceAuth: () => pollChatgptDeviceAuth,
803
805
  refreshChatgptToken: () => refreshChatgptToken,
804
806
  runChatgptBrowserFlow: () => runChatgptBrowserFlow,
805
807
  runChatgptDeviceFlow: () => runChatgptDeviceFlow,
806
- runChatgptOAuthFlow: () => runChatgptOAuthFlow
808
+ runChatgptOAuthFlow: () => runChatgptOAuthFlow,
809
+ startChatgptDeviceAuth: () => startChatgptDeviceAuth
807
810
  });
808
811
  function decodeJwtClaims(token) {
809
812
  const parts = token.split(".");
@@ -845,6 +848,29 @@ function parseTokenPayload(obj, fallbackRefresh) {
845
848
  }
846
849
  return result;
847
850
  }
851
+ function errorSnippet(body) {
852
+ const err = body.error;
853
+ if (typeof err === "string" && err.trim()) return err.trim().slice(0, 160);
854
+ if (err && typeof err === "object") {
855
+ const msg2 = err.message;
856
+ if (typeof msg2 === "string" && msg2.trim()) return msg2.trim().slice(0, 160);
857
+ }
858
+ const msg = body.message;
859
+ if (typeof msg === "string" && msg.trim()) return msg.trim().slice(0, 160);
860
+ return "";
861
+ }
862
+ function formatHttpError(prefix, status, body) {
863
+ const detail = errorSnippet(body);
864
+ return detail ? `${prefix} HTTP ${status}: ${detail}` : `${prefix} HTTP ${status}`;
865
+ }
866
+ async function readJsonBody(response) {
867
+ try {
868
+ const parsed = await response.json();
869
+ if (parsed && typeof parsed === "object") return parsed;
870
+ } catch {
871
+ }
872
+ return {};
873
+ }
848
874
  async function postForm(url2, data, fetchImpl) {
849
875
  let response;
850
876
  try {
@@ -862,13 +888,34 @@ async function postForm(url2, data, fetchImpl) {
862
888
  "network_error"
863
889
  );
864
890
  }
865
- let body = {};
891
+ return { status: response.status, body: await readJsonBody(response) };
892
+ }
893
+ async function postJson(url2, data, fetchImpl) {
894
+ let response;
866
895
  try {
867
- const parsed = await response.json();
868
- if (parsed && typeof parsed === "object") body = parsed;
869
- } catch {
896
+ response = await fetchImpl(url2, {
897
+ method: "POST",
898
+ headers: {
899
+ "Content-Type": "application/json",
900
+ Accept: "application/json"
901
+ },
902
+ body: JSON.stringify(data)
903
+ });
904
+ } catch (err) {
905
+ throw new ChatgptOAuthError(
906
+ `ChatGPT OAuth network error: ${err instanceof Error ? err.message : String(err)}`,
907
+ "network_error"
908
+ );
870
909
  }
871
- return { status: response.status, body };
910
+ return { status: response.status, body: await readJsonBody(response) };
911
+ }
912
+ function parsePollInterval(raw, fallback = 5) {
913
+ if (typeof raw === "number" && Number.isFinite(raw) && raw > 0) return raw;
914
+ if (typeof raw === "string") {
915
+ const n = Number.parseInt(raw, 10);
916
+ if (Number.isFinite(n) && n > 0) return n;
917
+ }
918
+ return fallback;
872
919
  }
873
920
  async function refreshChatgptToken(options) {
874
921
  if (!options.refreshToken.trim()) {
@@ -887,77 +934,82 @@ async function refreshChatgptToken(options) {
887
934
  );
888
935
  if (status >= 400) {
889
936
  const code = status === 400 || status === 401 ? "invalid_grant" : `http_${status}`;
890
- throw new ChatgptOAuthError(
891
- `ChatGPT token refresh HTTP ${status}: ${String(body.error ?? "").slice(0, 160)}`,
892
- code
893
- );
937
+ throw new ChatgptOAuthError(formatHttpError("ChatGPT token refresh", status, body), code);
894
938
  }
895
939
  return parseTokenPayload(body, options.refreshToken);
896
940
  }
897
- async function runChatgptDeviceFlow(options) {
941
+ async function startChatgptDeviceAuth(options = {}) {
898
942
  const clientId2 = options.clientId || process.env.CHATGPT_OAUTH_CLIENT_ID || DEFAULT_CHATGPT_CLIENT_ID;
899
943
  const fetchImpl = options.fetchImpl ?? fetch;
900
- const sleep = options.sleepImpl ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
901
- const { verifier, challenge } = generatePkcePair();
902
- const start = await postForm(
903
- CHATGPT_DEVICE_CODE_URL,
904
- {
905
- client_id: clientId2,
906
- scope: CHATGPT_SCOPE,
907
- code_challenge: challenge,
908
- code_challenge_method: "S256"
909
- },
910
- fetchImpl
911
- );
944
+ const start = await postJson(CHATGPT_DEVICE_CODE_URL, { client_id: clientId2 }, fetchImpl);
912
945
  if (start.status >= 400) {
913
946
  throw new ChatgptOAuthError(
914
- `ChatGPT device-code HTTP ${start.status}`,
947
+ formatHttpError("ChatGPT device-code", start.status, start.body),
915
948
  `device_http_${start.status}`
916
949
  );
917
950
  }
918
- const deviceCode = start.body.device_code;
919
- const userCode = start.body.user_code;
920
- const verificationUri = typeof start.body.verification_uri === "string" && start.body.verification_uri || typeof start.body.verification_uri_complete === "string" && start.body.verification_uri_complete;
921
- if (typeof deviceCode !== "string" || typeof userCode !== "string" || typeof verificationUri !== "string") {
951
+ const deviceAuthId = typeof start.body.device_auth_id === "string" && start.body.device_auth_id || typeof start.body.device_code === "string" && start.body.device_code || "";
952
+ const userCode = typeof start.body.user_code === "string" && start.body.user_code || typeof start.body.usercode === "string" && start.body.usercode || "";
953
+ const verificationUri = typeof start.body.verification_uri === "string" && start.body.verification_uri || typeof start.body.verification_url === "string" && start.body.verification_url || `${CHATGPT_DEVICE_VERIFY_URL}?user_code=${encodeURIComponent(userCode)}`;
954
+ if (!deviceAuthId || !userCode) {
922
955
  throw new ChatgptOAuthError("Device-code response missing fields", "no_device_code");
923
956
  }
924
- const info = {
957
+ return {
958
+ deviceAuthId,
925
959
  userCode,
926
960
  verificationUri,
961
+ interval: parsePollInterval(start.body.interval, 5),
927
962
  ...typeof start.body.verification_uri_complete === "string" ? { verificationUriComplete: start.body.verification_uri_complete } : {}
928
963
  };
929
- if (options.onUserCode) await options.onUserCode(info);
930
- try {
931
- await (options.openBrowserImpl ?? openBrowser)(
932
- info.verificationUriComplete ?? info.verificationUri
933
- );
934
- } catch {
935
- }
964
+ }
965
+ async function pollChatgptDeviceAuth(options) {
966
+ const clientId2 = options.clientId || process.env.CHATGPT_OAUTH_CLIENT_ID || DEFAULT_CHATGPT_CLIENT_ID;
967
+ const fetchImpl = options.fetchImpl ?? fetch;
968
+ const sleep = options.sleepImpl ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
936
969
  const timeoutMs = options.timeoutMs ?? 3e5;
937
970
  const deadline = Date.now() + timeoutMs;
938
- let interval = 5;
971
+ let interval = options.interval ?? 5;
939
972
  let authorizationCode;
973
+ let codeVerifier;
940
974
  while (Date.now() < deadline) {
941
- const poll = await postForm(
975
+ const poll = await postJson(
942
976
  CHATGPT_DEVICE_TOKEN_URL,
943
- { client_id: clientId2, device_code: deviceCode },
977
+ { device_auth_id: options.deviceAuthId, user_code: options.userCode },
944
978
  fetchImpl
945
979
  );
946
980
  const authCode = poll.body.authorization_code;
947
981
  if (typeof authCode === "string" && authCode.length > 0) {
948
982
  authorizationCode = authCode;
983
+ if (typeof poll.body.code_verifier === "string" && poll.body.code_verifier) {
984
+ codeVerifier = poll.body.code_verifier;
985
+ }
949
986
  break;
950
987
  }
988
+ if (poll.status === 403 || poll.status === 404) {
989
+ await sleep(interval * 1e3);
990
+ continue;
991
+ }
951
992
  const err = typeof poll.body.error === "string" ? poll.body.error : "";
952
993
  if (err === "slow_down") interval += 5;
953
994
  else if (err && err !== "authorization_pending") {
954
995
  throw new ChatgptOAuthError(`Device authorization failed: ${err}`, err);
996
+ } else if (poll.status >= 400) {
997
+ throw new ChatgptOAuthError(
998
+ formatHttpError("ChatGPT device poll", poll.status, poll.body),
999
+ `poll_http_${poll.status}`
1000
+ );
955
1001
  }
956
1002
  await sleep(interval * 1e3);
957
1003
  }
958
1004
  if (!authorizationCode) {
959
1005
  throw new ChatgptOAuthError("Timed out waiting for ChatGPT device authorization", "timeout");
960
1006
  }
1007
+ if (!codeVerifier) {
1008
+ throw new ChatgptOAuthError(
1009
+ "Device token response missing code_verifier (server-issued PKCE)",
1010
+ "no_code_verifier"
1011
+ );
1012
+ }
961
1013
  const token = await postForm(
962
1014
  CHATGPT_TOKEN_URL,
963
1015
  {
@@ -965,13 +1017,13 @@ async function runChatgptDeviceFlow(options) {
965
1017
  code: authorizationCode,
966
1018
  redirect_uri: CHATGPT_DEVICE_REDIRECT_URI,
967
1019
  client_id: clientId2,
968
- code_verifier: verifier
1020
+ code_verifier: codeVerifier
969
1021
  },
970
1022
  fetchImpl
971
1023
  );
972
1024
  if (token.status >= 400) {
973
1025
  throw new ChatgptOAuthError(
974
- `ChatGPT token exchange HTTP ${token.status}`,
1026
+ formatHttpError("ChatGPT token exchange", token.status, token.body),
975
1027
  `token_http_${token.status}`
976
1028
  );
977
1029
  }
@@ -1024,12 +1076,47 @@ async function runChatgptBrowserFlow(options) {
1024
1076
  );
1025
1077
  if (token.status >= 400) {
1026
1078
  throw new ChatgptOAuthError(
1027
- `ChatGPT token exchange HTTP ${token.status}`,
1079
+ formatHttpError("ChatGPT token exchange", token.status, token.body),
1028
1080
  `token_http_${token.status}`
1029
1081
  );
1030
1082
  }
1031
1083
  return parseTokenPayload(token.body);
1032
1084
  }
1085
+ async function runChatgptDeviceFlow(options = {}) {
1086
+ const session = await startChatgptDeviceAuth({
1087
+ clientId: options.clientId,
1088
+ fetchImpl: options.fetchImpl
1089
+ });
1090
+ const info = {
1091
+ userCode: session.userCode,
1092
+ verificationUri: session.verificationUri,
1093
+ ...session.verificationUriComplete ? { verificationUriComplete: session.verificationUriComplete } : {}
1094
+ };
1095
+ if (options.onUserCode) {
1096
+ await options.onUserCode(info);
1097
+ } else {
1098
+ process.stderr.write(
1099
+ `[chatgpt oauth] Open ${info.verificationUri} and enter:
1100
+ ${info.userCode}
1101
+ `
1102
+ );
1103
+ }
1104
+ try {
1105
+ await (options.openBrowserImpl ?? openBrowser)(
1106
+ info.verificationUriComplete ?? info.verificationUri
1107
+ );
1108
+ } catch {
1109
+ }
1110
+ return pollChatgptDeviceAuth({
1111
+ deviceAuthId: session.deviceAuthId,
1112
+ userCode: session.userCode,
1113
+ clientId: options.clientId,
1114
+ interval: session.interval,
1115
+ fetchImpl: options.fetchImpl,
1116
+ sleepImpl: options.sleepImpl,
1117
+ timeoutMs: options.timeoutMs
1118
+ });
1119
+ }
1033
1120
  async function runChatgptOAuthFlow(options = {}) {
1034
1121
  const flow = (process.env.CHATGPT_OAUTH_FLOW ?? "device").toLowerCase();
1035
1122
  if (flow === "browser") {
@@ -1037,7 +1124,7 @@ async function runChatgptOAuthFlow(options = {}) {
1037
1124
  }
1038
1125
  return runChatgptDeviceFlow(options);
1039
1126
  }
1040
- var DEFAULT_CHATGPT_CLIENT_ID, CHATGPT_AUTHORIZE_URL, CHATGPT_TOKEN_URL, CHATGPT_DEVICE_CODE_URL, CHATGPT_DEVICE_TOKEN_URL, CHATGPT_DEVICE_REDIRECT_URI, CHATGPT_SCOPE, CHATGPT_AUTH_CLAIMS, ChatgptOAuthError;
1127
+ var DEFAULT_CHATGPT_CLIENT_ID, CHATGPT_AUTHORIZE_URL, CHATGPT_TOKEN_URL, CHATGPT_DEVICE_CODE_URL, CHATGPT_DEVICE_TOKEN_URL, CHATGPT_DEVICE_REDIRECT_URI, CHATGPT_DEVICE_VERIFY_URL, CHATGPT_SCOPE, CHATGPT_AUTH_CLAIMS, ChatgptOAuthError;
1041
1128
  var init_chatgptOAuth = __esm({
1042
1129
  "src/cli/chatgptOAuth.ts"() {
1043
1130
  "use strict";
@@ -1049,6 +1136,7 @@ var init_chatgptOAuth = __esm({
1049
1136
  CHATGPT_DEVICE_CODE_URL = "https://auth.openai.com/api/accounts/deviceauth/usercode";
1050
1137
  CHATGPT_DEVICE_TOKEN_URL = "https://auth.openai.com/api/accounts/deviceauth/token";
1051
1138
  CHATGPT_DEVICE_REDIRECT_URI = "https://auth.openai.com/deviceauth/callback";
1139
+ CHATGPT_DEVICE_VERIFY_URL = "https://auth.openai.com/codex/device";
1052
1140
  CHATGPT_SCOPE = "openid profile email offline_access";
1053
1141
  CHATGPT_AUTH_CLAIMS = "https://api.openai.com/auth";
1054
1142
  ChatgptOAuthError = class extends Error {
@@ -1152,7 +1240,7 @@ async function startAnthropicOAuth(options = {}) {
1152
1240
  }
1153
1241
  return { authorizeUrl, state: state3 };
1154
1242
  }
1155
- async function postJson(url2, payload, fetchImpl) {
1243
+ async function postJson2(url2, payload, fetchImpl) {
1156
1244
  let response;
1157
1245
  try {
1158
1246
  response = await fetchImpl(url2, {
@@ -1212,7 +1300,7 @@ async function completeAnthropicOAuth(options) {
1212
1300
  redirect_uri: ANTHROPIC_REDIRECT_URI,
1213
1301
  state: parsed.state ?? pending.state
1214
1302
  };
1215
- const { status, body } = await postJson(ANTHROPIC_TOKEN_URL, payload, fetchImpl);
1303
+ const { status, body } = await postJson2(ANTHROPIC_TOKEN_URL, payload, fetchImpl);
1216
1304
  if (status >= 400) {
1217
1305
  const code = status === 400 || status === 401 ? "invalid_grant" : `http_${status}`;
1218
1306
  throw new AnthropicOAuthError(
@@ -1227,7 +1315,7 @@ async function refreshAnthropicToken(options) {
1227
1315
  throw new AnthropicOAuthError("Missing refreshToken", "no_refresh_token");
1228
1316
  }
1229
1317
  const fetchImpl = options.fetchImpl ?? fetch;
1230
- const { status, body } = await postJson(
1318
+ const { status, body } = await postJson2(
1231
1319
  ANTHROPIC_TOKEN_URL,
1232
1320
  {
1233
1321
  grant_type: "refresh_token",