@longrun-ai/codex-auth 0.1.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.
Files changed (78) hide show
  1. package/LICENSE +157 -0
  2. package/README.md +148 -0
  3. package/dist/auth/manager.d.ts +32 -0
  4. package/dist/auth/manager.d.ts.map +1 -0
  5. package/dist/auth/manager.js +206 -0
  6. package/dist/auth/manager.js.map +1 -0
  7. package/dist/auth/schema.d.ts +41 -0
  8. package/dist/auth/schema.d.ts.map +1 -0
  9. package/dist/auth/schema.js +9 -0
  10. package/dist/auth/schema.js.map +1 -0
  11. package/dist/auth/storage.d.ts +13 -0
  12. package/dist/auth/storage.d.ts.map +1 -0
  13. package/dist/auth/storage.js +92 -0
  14. package/dist/auth/storage.js.map +1 -0
  15. package/dist/bin/auth-doctor.d.ts +3 -0
  16. package/dist/bin/auth-doctor.d.ts.map +1 -0
  17. package/dist/bin/auth-doctor.js +507 -0
  18. package/dist/bin/auth-doctor.js.map +1 -0
  19. package/dist/index.d.ts +12 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +12 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/llm/chatgpt.d.ts +355 -0
  24. package/dist/llm/chatgpt.d.ts.map +1 -0
  25. package/dist/llm/chatgpt.js +351 -0
  26. package/dist/llm/chatgpt.js.map +1 -0
  27. package/dist/oauth/browserLogin.d.ts +25 -0
  28. package/dist/oauth/browserLogin.d.ts.map +1 -0
  29. package/dist/oauth/browserLogin.js +231 -0
  30. package/dist/oauth/browserLogin.js.map +1 -0
  31. package/dist/oauth/deviceCode.d.ts +21 -0
  32. package/dist/oauth/deviceCode.d.ts.map +1 -0
  33. package/dist/oauth/deviceCode.js +103 -0
  34. package/dist/oauth/deviceCode.js.map +1 -0
  35. package/dist/oauth/pkce.d.ts +7 -0
  36. package/dist/oauth/pkce.d.ts.map +1 -0
  37. package/dist/oauth/pkce.js +14 -0
  38. package/dist/oauth/pkce.js.map +1 -0
  39. package/dist/oauth/refresh.d.ts +14 -0
  40. package/dist/oauth/refresh.d.ts.map +1 -0
  41. package/dist/oauth/refresh.js +122 -0
  42. package/dist/oauth/refresh.js.map +1 -0
  43. package/dist/oauth/tokenExchange.d.ts +7 -0
  44. package/dist/oauth/tokenExchange.d.ts.map +1 -0
  45. package/dist/oauth/tokenExchange.js +50 -0
  46. package/dist/oauth/tokenExchange.js.map +1 -0
  47. package/dist/oauth/tokenParsing.d.ts +4 -0
  48. package/dist/oauth/tokenParsing.d.ts.map +1 -0
  49. package/dist/oauth/tokenParsing.js +22 -0
  50. package/dist/oauth/tokenParsing.js.map +1 -0
  51. package/dist/prompts.d.ts +4 -0
  52. package/dist/prompts.d.ts.map +1 -0
  53. package/dist/prompts.js +85 -0
  54. package/dist/prompts.js.map +1 -0
  55. package/dist/utils/base64.d.ts +3 -0
  56. package/dist/utils/base64.d.ts.map +1 -0
  57. package/dist/utils/base64.js +16 -0
  58. package/dist/utils/base64.js.map +1 -0
  59. package/dist/utils/jwt.d.ts +6 -0
  60. package/dist/utils/jwt.d.ts.map +1 -0
  61. package/dist/utils/jwt.js +40 -0
  62. package/dist/utils/jwt.js.map +1 -0
  63. package/dist/utils/openBrowser.d.ts +2 -0
  64. package/dist/utils/openBrowser.d.ts.map +1 -0
  65. package/dist/utils/openBrowser.js +30 -0
  66. package/dist/utils/openBrowser.js.map +1 -0
  67. package/dist/utils/time.d.ts +2 -0
  68. package/dist/utils/time.d.ts.map +1 -0
  69. package/dist/utils/time.js +4 -0
  70. package/dist/utils/time.js.map +1 -0
  71. package/package.json +48 -0
  72. package/prompts/gpt-5.1-codex-max_prompt.md +117 -0
  73. package/prompts/gpt-5.2-codex_prompt.md +117 -0
  74. package/prompts/gpt_5_1_prompt.md +368 -0
  75. package/prompts/gpt_5_2_prompt.md +335 -0
  76. package/prompts/gpt_5_codex_prompt.md +105 -0
  77. package/prompts/prompt.md +310 -0
  78. package/prompts/prompt_with_apply_patch_instructions.md +386 -0
@@ -0,0 +1,103 @@
1
+ import { CLIENT_ID, DEFAULT_ISSUER } from '../auth/schema.js';
2
+ import { persistTokens, resolveCodexHome } from '../auth/storage.js';
3
+ import { sleep } from '../utils/time.js';
4
+ import { ensureWorkspaceAllowed } from './browserLogin.js';
5
+ import { exchangeCodeForTokens, obtainApiKey } from './tokenExchange.js';
6
+ export async function requestDeviceCode(options = {}) {
7
+ const issuer = (options.issuer ?? DEFAULT_ISSUER).replace(/\/$/, '');
8
+ const clientId = options.clientId ?? CLIENT_ID;
9
+ const apiBase = `${issuer}/api/accounts`;
10
+ const response = await fetch(`${apiBase}/deviceauth/usercode`, {
11
+ method: 'POST',
12
+ headers: { 'Content-Type': 'application/json' },
13
+ body: JSON.stringify({ client_id: clientId }),
14
+ });
15
+ if (!response.ok) {
16
+ if (response.status === 404) {
17
+ throw new Error('device code login is not enabled for this Codex server. Use the browser login or verify the server URL.');
18
+ }
19
+ throw new Error(`device code request failed with status ${response.status}`);
20
+ }
21
+ const json = (await response.json());
22
+ const intervalValue = parseInterval(json.interval);
23
+ const userCode = json.user_code ?? json.usercode;
24
+ if (!userCode || !json.device_auth_id) {
25
+ throw new Error('device code response missing required fields');
26
+ }
27
+ return {
28
+ verificationUrl: `${issuer}/codex/device`,
29
+ userCode,
30
+ deviceAuthId: json.device_auth_id,
31
+ interval: intervalValue,
32
+ };
33
+ }
34
+ export async function completeDeviceCodeLogin(options, deviceCode) {
35
+ const codexHome = resolveCodexHome(options.codexHome);
36
+ const issuer = (options.issuer ?? DEFAULT_ISSUER).replace(/\/$/, '');
37
+ const clientId = options.clientId ?? CLIENT_ID;
38
+ const storeMode = options.storeMode ?? 'file';
39
+ const apiBase = `${issuer}/api/accounts`;
40
+ const codeResp = await pollForToken(apiBase, deviceCode.deviceAuthId, deviceCode.userCode, deviceCode.interval);
41
+ const redirectUri = `${issuer}/deviceauth/callback`;
42
+ const tokens = await exchangeCodeForTokens(issuer, clientId, redirectUri, codeResp.codeVerifier, codeResp.authorizationCode);
43
+ ensureWorkspaceAllowed(options.forcedChatgptWorkspaceId, tokens.idToken);
44
+ let apiKey;
45
+ try {
46
+ apiKey = await obtainApiKey(issuer, clientId, tokens.idToken);
47
+ }
48
+ catch {
49
+ apiKey = undefined;
50
+ }
51
+ persistTokens(codexHome, apiKey, tokens.idToken, tokens.accessToken, tokens.refreshToken, storeMode);
52
+ }
53
+ export async function runDeviceCodeLogin(options = {}) {
54
+ const deviceCode = await requestDeviceCode(options);
55
+ options.onDeviceCode?.(deviceCode);
56
+ await completeDeviceCodeLogin(options, deviceCode);
57
+ return deviceCode;
58
+ }
59
+ async function pollForToken(apiBase, deviceAuthId, userCode, interval) {
60
+ const maxWaitMs = 15 * 60 * 1000;
61
+ const start = Date.now();
62
+ while (true) {
63
+ const response = await fetch(`${apiBase}/deviceauth/token`, {
64
+ method: 'POST',
65
+ headers: { 'Content-Type': 'application/json' },
66
+ body: JSON.stringify({
67
+ device_auth_id: deviceAuthId,
68
+ user_code: userCode,
69
+ }),
70
+ });
71
+ if (response.ok) {
72
+ const json = (await response.json());
73
+ return {
74
+ authorizationCode: json.authorization_code,
75
+ codeVerifier: json.code_verifier,
76
+ codeChallenge: json.code_challenge,
77
+ };
78
+ }
79
+ if (response.status === 403 || response.status === 404) {
80
+ if (Date.now() - start >= maxWaitMs) {
81
+ throw new Error('device auth timed out after 15 minutes');
82
+ }
83
+ const remaining = maxWaitMs - (Date.now() - start);
84
+ const sleepFor = Math.min(interval * 1000, remaining);
85
+ await sleep(sleepFor);
86
+ continue;
87
+ }
88
+ throw new Error(`device auth failed with status ${response.status}`);
89
+ }
90
+ }
91
+ function parseInterval(value) {
92
+ if (typeof value === 'number' && Number.isFinite(value)) {
93
+ return value;
94
+ }
95
+ if (typeof value === 'string') {
96
+ const parsed = Number.parseInt(value.trim(), 10);
97
+ if (!Number.isNaN(parsed)) {
98
+ return parsed;
99
+ }
100
+ }
101
+ return 5;
102
+ }
103
+ //# sourceMappingURL=deviceCode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deviceCode.js","sourceRoot":"","sources":["../../src/oauth/deviceCode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface PkceCodes {
2
+ codeVerifier: string;
3
+ codeChallenge: string;
4
+ }
5
+ export declare function generatePkce(): PkceCodes;
6
+ export declare function generateState(): string;
7
+ //# sourceMappingURL=pkce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkce.d.ts","sourceRoot":"","sources":["../../src/oauth/pkce.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,YAAY,IAAI,SAAS,CAOxC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
@@ -0,0 +1,14 @@
1
+ import crypto from 'node:crypto';
2
+ import { base64UrlEncode } from '../utils/base64.js';
3
+ export function generatePkce() {
4
+ const verifier = base64UrlEncode(crypto.randomBytes(32));
5
+ const challenge = base64UrlEncode(crypto.createHash('sha256').update(verifier).digest());
6
+ return {
7
+ codeVerifier: verifier,
8
+ codeChallenge: challenge,
9
+ };
10
+ }
11
+ export function generateState() {
12
+ return base64UrlEncode(crypto.randomBytes(32));
13
+ }
14
+ //# sourceMappingURL=pkce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkce.js","sourceRoot":"","sources":["../../src/oauth/pkce.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAOrD,MAAM,UAAU,YAAY;IAC1B,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACzF,OAAO;QACL,YAAY,EAAE,QAAQ;QACtB,aAAa,EAAE,SAAS;KACzB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,14 @@
1
+ export type RefreshTokenFailedReason = 'expired' | 'exhausted' | 'revoked' | 'other';
2
+ export interface RefreshResponse {
3
+ id_token?: string;
4
+ access_token?: string;
5
+ refresh_token?: string;
6
+ }
7
+ export declare class RefreshTokenError extends Error {
8
+ readonly kind: 'permanent' | 'transient';
9
+ readonly reason?: RefreshTokenFailedReason;
10
+ constructor(kind: 'permanent' | 'transient', message: string, reason?: RefreshTokenFailedReason);
11
+ }
12
+ export declare function tryRefreshToken(refreshToken: string): Promise<RefreshResponse>;
13
+ export declare function refreshTokenEndpoint(): string;
14
+ //# sourceMappingURL=refresh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../../src/oauth/refresh.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,wBAAwB,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC;AAYrF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,wBAAwB,CAAC;gBAE/B,IAAI,EAAE,WAAW,GAAG,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,wBAAwB;CAKhG;AAED,wBAAsB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAgCpF;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C"}
@@ -0,0 +1,122 @@
1
+ import { CLIENT_ID, CODEX_REFRESH_TOKEN_URL_OVERRIDE_ENV_VAR } from '../auth/schema.js';
2
+ const REFRESH_TOKEN_EXPIRED_MESSAGE = 'Your access token could not be refreshed because your refresh token has expired. Please log out and sign in again.';
3
+ const REFRESH_TOKEN_REUSED_MESSAGE = 'Your access token could not be refreshed because your refresh token was already used. Please log out and sign in again.';
4
+ const REFRESH_TOKEN_INVALIDATED_MESSAGE = 'Your access token could not be refreshed because your refresh token was revoked. Please log out and sign in again.';
5
+ const REFRESH_TOKEN_UNKNOWN_MESSAGE = 'Your access token could not be refreshed. Please log out and sign in again.';
6
+ const DEFAULT_REFRESH_TOKEN_URL = 'https://auth.openai.com/oauth/token';
7
+ export class RefreshTokenError extends Error {
8
+ kind;
9
+ reason;
10
+ constructor(kind, message, reason) {
11
+ super(message);
12
+ this.kind = kind;
13
+ this.reason = reason;
14
+ }
15
+ }
16
+ export async function tryRefreshToken(refreshToken) {
17
+ const endpoint = refreshTokenEndpoint();
18
+ const body = JSON.stringify({
19
+ client_id: CLIENT_ID,
20
+ grant_type: 'refresh_token',
21
+ refresh_token: refreshToken,
22
+ scope: 'openid profile email',
23
+ });
24
+ const response = await fetch(endpoint, {
25
+ method: 'POST',
26
+ headers: {
27
+ 'Content-Type': 'application/json',
28
+ },
29
+ body,
30
+ });
31
+ if (response.ok) {
32
+ return (await response.json());
33
+ }
34
+ const text = await response.text();
35
+ if (response.status === 401) {
36
+ const failed = classifyRefreshTokenFailure(text);
37
+ throw new RefreshTokenError('permanent', failed.message, failed.reason);
38
+ }
39
+ const message = tryParseErrorMessage(text);
40
+ throw new RefreshTokenError('transient', `Failed to refresh token: ${response.status}: ${message}`);
41
+ }
42
+ export function refreshTokenEndpoint() {
43
+ return process.env[CODEX_REFRESH_TOKEN_URL_OVERRIDE_ENV_VAR] || DEFAULT_REFRESH_TOKEN_URL;
44
+ }
45
+ function classifyRefreshTokenFailure(body) {
46
+ const code = extractRefreshTokenErrorCode(body)?.toLowerCase();
47
+ let reason = 'other';
48
+ if (code === 'refresh_token_expired') {
49
+ reason = 'expired';
50
+ }
51
+ else if (code === 'refresh_token_reused') {
52
+ reason = 'exhausted';
53
+ }
54
+ else if (code === 'refresh_token_invalidated') {
55
+ reason = 'revoked';
56
+ }
57
+ let message = REFRESH_TOKEN_UNKNOWN_MESSAGE;
58
+ if (reason === 'expired') {
59
+ message = REFRESH_TOKEN_EXPIRED_MESSAGE;
60
+ }
61
+ else if (reason === 'exhausted') {
62
+ message = REFRESH_TOKEN_REUSED_MESSAGE;
63
+ }
64
+ else if (reason === 'revoked') {
65
+ message = REFRESH_TOKEN_INVALIDATED_MESSAGE;
66
+ }
67
+ return { reason, message };
68
+ }
69
+ function extractRefreshTokenErrorCode(body) {
70
+ if (!body.trim()) {
71
+ return undefined;
72
+ }
73
+ let parsed;
74
+ try {
75
+ parsed = JSON.parse(body);
76
+ }
77
+ catch {
78
+ return undefined;
79
+ }
80
+ if (!parsed || typeof parsed !== 'object') {
81
+ return undefined;
82
+ }
83
+ const record = parsed;
84
+ const errorValue = record.error;
85
+ if (errorValue && typeof errorValue === 'object' && !Array.isArray(errorValue)) {
86
+ const code = errorValue.code;
87
+ if (typeof code === 'string') {
88
+ return code;
89
+ }
90
+ }
91
+ if (typeof errorValue === 'string') {
92
+ return errorValue;
93
+ }
94
+ const code = record.code;
95
+ if (typeof code === 'string') {
96
+ return code;
97
+ }
98
+ return undefined;
99
+ }
100
+ function tryParseErrorMessage(body) {
101
+ if (!body.trim()) {
102
+ return '';
103
+ }
104
+ try {
105
+ const parsed = JSON.parse(body);
106
+ const error = parsed.error;
107
+ if (typeof error === 'string') {
108
+ return error;
109
+ }
110
+ if (error && typeof error === 'object') {
111
+ const message = error.message;
112
+ if (typeof message === 'string') {
113
+ return message;
114
+ }
115
+ }
116
+ }
117
+ catch {
118
+ return body;
119
+ }
120
+ return body;
121
+ }
122
+ //# sourceMappingURL=refresh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh.js","sourceRoot":"","sources":["../../src/oauth/refresh.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare function exchangeCodeForTokens(issuer: string, clientId: string, redirectUri: string, codeVerifier: string, code: string): Promise<{
2
+ idToken: string;
3
+ accessToken: string;
4
+ refreshToken: string;
5
+ }>;
6
+ export declare function obtainApiKey(issuer: string, clientId: string, idToken: string): Promise<string>;
7
+ //# sourceMappingURL=tokenExchange.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenExchange.d.ts","sourceRoot":"","sources":["../../src/oauth/tokenExchange.ts"],"names":[],"mappings":"AAAA,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAgCzE;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CA0BjB"}
@@ -0,0 +1,50 @@
1
+ export async function exchangeCodeForTokens(issuer, clientId, redirectUri, codeVerifier, code) {
2
+ const body = new URLSearchParams({
3
+ grant_type: 'authorization_code',
4
+ code,
5
+ redirect_uri: redirectUri,
6
+ client_id: clientId,
7
+ code_verifier: codeVerifier,
8
+ });
9
+ const response = await fetch(`${issuer}/oauth/token`, {
10
+ method: 'POST',
11
+ headers: {
12
+ 'Content-Type': 'application/x-www-form-urlencoded',
13
+ },
14
+ body: body.toString(),
15
+ });
16
+ if (!response.ok) {
17
+ throw new Error(`token endpoint returned status ${response.status}`);
18
+ }
19
+ const json = (await response.json());
20
+ return {
21
+ idToken: json.id_token,
22
+ accessToken: json.access_token,
23
+ refreshToken: json.refresh_token,
24
+ };
25
+ }
26
+ export async function obtainApiKey(issuer, clientId, idToken) {
27
+ const body = new URLSearchParams({
28
+ grant_type: 'urn:ietf:params:oauth:grant-type:token-exchange',
29
+ client_id: clientId,
30
+ requested_token: 'openai-api-key',
31
+ subject_token: idToken,
32
+ subject_token_type: 'urn:ietf:params:oauth:token-type:id_token',
33
+ });
34
+ const response = await fetch(`${issuer}/oauth/token`, {
35
+ method: 'POST',
36
+ headers: {
37
+ 'Content-Type': 'application/x-www-form-urlencoded',
38
+ },
39
+ body: body.toString(),
40
+ });
41
+ if (!response.ok) {
42
+ throw new Error(`api key exchange failed with status ${response.status}`);
43
+ }
44
+ const json = (await response.json());
45
+ if (!json.access_token) {
46
+ throw new Error('api key exchange response missing access_token');
47
+ }
48
+ return json.access_token;
49
+ }
50
+ //# sourceMappingURL=tokenExchange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenExchange.js","sourceRoot":"","sources":["../../src/oauth/tokenExchange.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAc,EACd,QAAgB,EAChB,WAAmB,EACnB,YAAoB,EACpB,IAAY;IAEZ,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC;QAC/B,UAAU,EAAE,oBAAoB;QAChC,IAAI;QACJ,YAAY,EAAE,WAAW;QACzB,SAAS,EAAE,QAAQ;QACnB,aAAa,EAAE,YAAY;KAC5B,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,cAAc,EAAE;QACpD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,mCAAmC;SACpD;QACD,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE;KACtB,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,kCAAkC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAIlC,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,QAAQ;QACtB,WAAW,EAAE,IAAI,CAAC,YAAY;QAC9B,YAAY,EAAE,IAAI,CAAC,aAAa;KACjC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAc,EACd,QAAgB,EAChB,OAAe;IAEf,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC;QAC/B,UAAU,EAAE,iDAAiD;QAC7D,SAAS,EAAE,QAAQ;QACnB,eAAe,EAAE,gBAAgB;QACjC,aAAa,EAAE,OAAO;QACtB,kBAAkB,EAAE,2CAA2C;KAChE,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,cAAc,EAAE;QACpD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,mCAAmC;SACpD;QACD,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE;KACtB,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,uCAAuC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA8B,CAAC;IAClE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,IAAI,CAAC,YAAY,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { IdTokenInfo } from '../auth/schema.js';
2
+ export declare function parseIdToken(idToken: string): IdTokenInfo;
3
+ export declare function extractAccountId(idToken: string): string | undefined;
4
+ //# sourceMappingURL=tokenParsing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenParsing.d.ts","sourceRoot":"","sources":["../../src/oauth/tokenParsing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAmBzD;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEpE"}
@@ -0,0 +1,22 @@
1
+ import { getStringClaim, parseJwtPayload } from '../utils/jwt.js';
2
+ export function parseIdToken(idToken) {
3
+ const payload = parseJwtPayload(idToken);
4
+ const auth = payload['https://api.openai.com/auth'] &&
5
+ typeof payload['https://api.openai.com/auth'] === 'object' &&
6
+ !Array.isArray(payload['https://api.openai.com/auth'])
7
+ ? payload['https://api.openai.com/auth']
8
+ : {};
9
+ const email = getStringClaim(payload.email);
10
+ const chatgptPlan = getStringClaim(auth.chatgpt_plan_type);
11
+ const chatgptAccountId = getStringClaim(auth.chatgpt_account_id);
12
+ return {
13
+ email,
14
+ chatgpt_plan_type: chatgptPlan,
15
+ chatgpt_account_id: chatgptAccountId,
16
+ raw_jwt: idToken,
17
+ };
18
+ }
19
+ export function extractAccountId(idToken) {
20
+ return parseIdToken(idToken).chatgpt_account_id;
21
+ }
22
+ //# sourceMappingURL=tokenParsing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenParsing.js","sourceRoot":"","sources":["../../src/oauth/tokenParsing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElE,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,IAAI,GACR,OAAO,CAAC,6BAA6B,CAAC;QACtC,OAAO,OAAO,CAAC,6BAA6B,CAAC,KAAK,QAAQ;QAC1D,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;QACpD,CAAC,CAAE,OAAO,CAAC,6BAA6B,CAA6B;QACrE,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC3D,MAAM,gBAAgB,GAAG,cAAc,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAEjE,OAAO;QACL,KAAK;QACL,iBAAiB,EAAE,WAAW;QAC9B,kBAAkB,EAAE,gBAAgB;QACpC,OAAO,EAAE,OAAO;KACjB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC,kBAAkB,CAAC;AAClD,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function resolveCodexPromptFilename(model: string): string;
2
+ export declare function loadCodexPrompt(model: string): Promise<string | null>;
3
+ export declare function loadCodexPromptSync(model: string): string | null;
4
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAKA,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAyBhE;AAqBD,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsB3E;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAsBhE"}
@@ -0,0 +1,85 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { readFile } from 'node:fs/promises';
3
+ const promptCache = new Map();
4
+ export function resolveCodexPromptFilename(model) {
5
+ if (model.startsWith('gpt-5.2-codex') || model.startsWith('bengalfox')) {
6
+ return 'gpt-5.2-codex_prompt.md';
7
+ }
8
+ if (model.startsWith('gpt-5.1-codex-max')) {
9
+ return 'gpt-5.1-codex-max_prompt.md';
10
+ }
11
+ if ((model.startsWith('gpt-5-codex') ||
12
+ model.startsWith('gpt-5.1-codex') ||
13
+ model.startsWith('codex-')) &&
14
+ !model.includes('-mini')) {
15
+ return 'gpt_5_codex_prompt.md';
16
+ }
17
+ if (model.startsWith('codex-mini-latest')) {
18
+ return 'prompt_with_apply_patch_instructions.md';
19
+ }
20
+ if (model.startsWith('gpt-5.2')) {
21
+ return 'gpt_5_2_prompt.md';
22
+ }
23
+ if (model.startsWith('gpt-5.1')) {
24
+ return 'gpt_5_1_prompt.md';
25
+ }
26
+ return 'prompt.md';
27
+ }
28
+ function resolvePromptUrl(filename) {
29
+ return new URL(`../prompts/${filename}`, import.meta.url);
30
+ }
31
+ async function readPromptFile(url) {
32
+ try {
33
+ return await readFile(url, 'utf8');
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ }
39
+ function readPromptFileSync(url) {
40
+ if (!existsSync(url)) {
41
+ return null;
42
+ }
43
+ return readFileSync(url, 'utf8');
44
+ }
45
+ export async function loadCodexPrompt(model) {
46
+ const cached = promptCache.get(model);
47
+ if (cached) {
48
+ return cached;
49
+ }
50
+ const filename = resolveCodexPromptFilename(model);
51
+ const candidate = resolvePromptUrl(filename);
52
+ const prompt = await readPromptFile(candidate);
53
+ if (prompt) {
54
+ promptCache.set(model, prompt);
55
+ return prompt;
56
+ }
57
+ const fallback = resolvePromptUrl('prompt.md');
58
+ const fallbackPrompt = await readPromptFile(fallback);
59
+ if (fallbackPrompt) {
60
+ promptCache.set(model, fallbackPrompt);
61
+ return fallbackPrompt;
62
+ }
63
+ return null;
64
+ }
65
+ export function loadCodexPromptSync(model) {
66
+ const cached = promptCache.get(model);
67
+ if (cached) {
68
+ return cached;
69
+ }
70
+ const filename = resolveCodexPromptFilename(model);
71
+ const candidate = resolvePromptUrl(filename);
72
+ const prompt = readPromptFileSync(candidate);
73
+ if (prompt) {
74
+ promptCache.set(model, prompt);
75
+ return prompt;
76
+ }
77
+ const fallback = resolvePromptUrl('prompt.md');
78
+ const fallbackPrompt = readPromptFileSync(fallback);
79
+ if (fallbackPrompt) {
80
+ promptCache.set(model, fallbackPrompt);
81
+ return fallbackPrompt;
82
+ }
83
+ return null;
84
+ }
85
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function base64UrlEncode(input: Uint8Array): string;
2
+ export declare function base64UrlDecode(input: string): Buffer;
3
+ //# sourceMappingURL=base64.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base64.d.ts","sourceRoot":"","sources":["../../src/utils/base64.ts"],"names":[],"mappings":"AAAA,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAMzD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOrD"}
@@ -0,0 +1,16 @@
1
+ export function base64UrlEncode(input) {
2
+ return Buffer.from(input)
3
+ .toString('base64')
4
+ .replace(/\+/g, '-')
5
+ .replace(/\//g, '_')
6
+ .replace(/=+$/g, '');
7
+ }
8
+ export function base64UrlDecode(input) {
9
+ let normalized = input.replace(/-/g, '+').replace(/_/g, '/');
10
+ const padLength = normalized.length % 4;
11
+ if (padLength !== 0) {
12
+ normalized += '='.repeat(4 - padLength);
13
+ }
14
+ return Buffer.from(normalized, 'base64');
15
+ }
16
+ //# sourceMappingURL=base64.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base64.js","sourceRoot":"","sources":["../../src/utils/base64.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,eAAe,CAAC,KAAiB;IAC/C,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;SACtB,QAAQ,CAAC,QAAQ,CAAC;SAClB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,IAAI,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IACxC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,UAAU,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,6 @@
1
+ export type JwtClaims = Record<string, unknown>;
2
+ export declare function parseJwtPayload(token: string): JwtClaims;
3
+ export declare function jwtAuthClaims(token: string): Record<string, unknown>;
4
+ export declare function getStringClaim(value: unknown): string | undefined;
5
+ export declare function getBooleanClaim(value: unknown): boolean | undefined;
6
+ //# sourceMappingURL=jwt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../../src/utils/jwt.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEhD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAaxD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAWpE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAKjE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAKnE"}
@@ -0,0 +1,40 @@
1
+ import { base64UrlDecode } from './base64.js';
2
+ export function parseJwtPayload(token) {
3
+ const parts = token.split('.');
4
+ if (parts.length < 3 || parts.some((part) => part.length === 0)) {
5
+ throw new Error('invalid JWT format');
6
+ }
7
+ const payload = base64UrlDecode(parts[1]);
8
+ const text = payload.toString('utf8');
9
+ const json = JSON.parse(text);
10
+ if (json && typeof json === 'object') {
11
+ return json;
12
+ }
13
+ throw new Error('invalid JWT payload');
14
+ }
15
+ export function jwtAuthClaims(token) {
16
+ try {
17
+ const payload = parseJwtPayload(token);
18
+ const auth = payload['https://api.openai.com/auth'];
19
+ if (auth && typeof auth === 'object' && !Array.isArray(auth)) {
20
+ return auth;
21
+ }
22
+ return {};
23
+ }
24
+ catch {
25
+ return {};
26
+ }
27
+ }
28
+ export function getStringClaim(value) {
29
+ if (typeof value === 'string' && value.length > 0) {
30
+ return value;
31
+ }
32
+ return undefined;
33
+ }
34
+ export function getBooleanClaim(value) {
35
+ if (typeof value === 'boolean') {
36
+ return value;
37
+ }
38
+ return undefined;
39
+ }
40
+ //# sourceMappingURL=jwt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.js","sourceRoot":"","sources":["../../src/utils/jwt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAI9C,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAc,CAAC;IAC3C,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAC;QACpD,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7D,OAAO,IAA+B,CAAC;QACzC,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function openBrowser(url: string): boolean;
2
+ //# sourceMappingURL=openBrowser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openBrowser.d.ts","sourceRoot":"","sources":["../../src/utils/openBrowser.ts"],"names":[],"mappings":"AAEA,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CA0BhD"}
@@ -0,0 +1,30 @@
1
+ import { spawn } from 'node:child_process';
2
+ export function openBrowser(url) {
3
+ const platform = process.platform;
4
+ let command;
5
+ let args = [];
6
+ if (platform === 'darwin') {
7
+ command = 'open';
8
+ args = [url];
9
+ }
10
+ else if (platform === 'win32') {
11
+ command = 'cmd';
12
+ args = ['/c', 'start', '', url];
13
+ }
14
+ else {
15
+ command = 'xdg-open';
16
+ args = [url];
17
+ }
18
+ try {
19
+ const child = spawn(command, args, {
20
+ stdio: 'ignore',
21
+ detached: true,
22
+ });
23
+ child.unref();
24
+ return true;
25
+ }
26
+ catch {
27
+ return false;
28
+ }
29
+ }
30
+ //# sourceMappingURL=openBrowser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openBrowser.js","sourceRoot":"","sources":["../../src/utils/openBrowser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,IAAI,OAAe,CAAC;IACpB,IAAI,IAAI,GAAa,EAAE,CAAC;IAExB,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,GAAG,MAAM,CAAC;QACjB,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,OAAO,GAAG,KAAK,CAAC;QAChB,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,UAAU,CAAC;QACrB,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;YACjC,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QACH,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function sleep(ms: number): Promise<void>;
2
+ //# sourceMappingURL=time.d.ts.map