codex-auth-automation 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.
package/dist/index.js ADDED
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CodexAuthAutomation = exports.TokenStoreError = exports.TokenStore = exports.browserSignup = exports.fullBrowserFlow = exports.OAuthFlowError = exports.GmailReaderError = exports.GmailReader = void 0;
4
+ var gmail_reader_js_1 = require("./gmail-reader.js");
5
+ Object.defineProperty(exports, "GmailReader", { enumerable: true, get: function () { return gmail_reader_js_1.GmailReader; } });
6
+ Object.defineProperty(exports, "GmailReaderError", { enumerable: true, get: function () { return gmail_reader_js_1.GmailReaderError; } });
7
+ var oauth_flow_js_1 = require("./oauth-flow.js");
8
+ Object.defineProperty(exports, "OAuthFlowError", { enumerable: true, get: function () { return oauth_flow_js_1.OAuthFlowError; } });
9
+ Object.defineProperty(exports, "fullBrowserFlow", { enumerable: true, get: function () { return oauth_flow_js_1.fullBrowserFlow; } });
10
+ Object.defineProperty(exports, "browserSignup", { enumerable: true, get: function () { return oauth_flow_js_1.browserSignup; } });
11
+ var token_store_js_1 = require("./token-store.js");
12
+ Object.defineProperty(exports, "TokenStore", { enumerable: true, get: function () { return token_store_js_1.TokenStore; } });
13
+ Object.defineProperty(exports, "TokenStoreError", { enumerable: true, get: function () { return token_store_js_1.TokenStoreError; } });
14
+ var automation_js_1 = require("./automation.js");
15
+ Object.defineProperty(exports, "CodexAuthAutomation", { enumerable: true, get: function () { return automation_js_1.CodexAuthAutomation; } });
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,qDAAkE;AAAzD,8GAAA,WAAW,OAAA;AAAE,mHAAA,gBAAgB,OAAA;AACtC,iDAAiF;AAAxE,+GAAA,cAAc,OAAA;AAAE,gHAAA,eAAe,OAAA;AAAE,8GAAA,aAAa,OAAA;AACvD,mDAA+D;AAAtD,4GAAA,UAAU,OAAA;AAAE,iHAAA,eAAe,OAAA;AACpC,iDAAsD;AAA7C,oHAAA,mBAAmB,OAAA"}
@@ -0,0 +1,10 @@
1
+ export declare class OAuthFlowError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ export interface BrowserSignupResult {
5
+ tokens: Record<string, any>;
6
+ email: string;
7
+ }
8
+ export declare function browserSignup(email: string, otpCode: string, headless?: boolean): Promise<Record<string, any>>;
9
+ export declare function fullBrowserFlow(email: string, otpCode: string, headless?: boolean): Promise<Record<string, any>>;
10
+ //# sourceMappingURL=oauth-flow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-flow.d.ts","sourceRoot":"","sources":["../src/oauth-flow.ts"],"names":[],"mappings":"AAOA,qBAAa,cAAe,SAAQ,KAAK;gBAC3B,OAAO,EAAE,MAAM;CAI5B;AAoHD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,QAAQ,UAAO,GACd,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAwG9B;AAED,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,QAAQ,UAAO,GACd,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAK9B"}
@@ -0,0 +1,225 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.OAuthFlowError = void 0;
7
+ exports.browserSignup = browserSignup;
8
+ exports.fullBrowserFlow = fullBrowserFlow;
9
+ const playwright_1 = require("playwright");
10
+ const http_1 = __importDefault(require("http"));
11
+ const crypto_1 = __importDefault(require("crypto"));
12
+ const url_1 = __importDefault(require("url"));
13
+ const path_1 = __importDefault(require("path"));
14
+ const fs_1 = __importDefault(require("fs"));
15
+ class OAuthFlowError extends Error {
16
+ constructor(message) {
17
+ super(message);
18
+ this.name = 'OAuthFlowError';
19
+ }
20
+ }
21
+ exports.OAuthFlowError = OAuthFlowError;
22
+ const AUTHORIZE_URL = 'https://auth.openai.com/oauth/authorize';
23
+ const TOKEN_URL = 'https://auth.openai.com/oauth/token';
24
+ const CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann';
25
+ const SCOPES = ['openid', 'profile', 'email', 'offline_access', 'api.connectors.read', 'api.connectors.invoke'];
26
+ const REDIRECT_PORT = 1455;
27
+ const DEBUG_DIR = path_1.default.join(process.cwd(), 'debug');
28
+ function generatePkce() {
29
+ const raw = crypto_1.default.randomBytes(32);
30
+ const codeVerifier = raw.toString('base64url');
31
+ const digest = crypto_1.default.createHash('sha256').update(codeVerifier).digest();
32
+ const codeChallenge = digest.toString('base64url');
33
+ return { codeVerifier, codeChallenge };
34
+ }
35
+ function generateState() {
36
+ return crypto_1.default.randomBytes(32).toString('base64url');
37
+ }
38
+ function buildAuthUrl(codeChallenge, state) {
39
+ const params = new URLSearchParams({
40
+ client_id: CLIENT_ID,
41
+ redirect_uri: `http://localhost:${REDIRECT_PORT}/auth/callback`,
42
+ response_type: 'code',
43
+ scope: SCOPES.join(' '),
44
+ code_challenge: codeChallenge,
45
+ code_challenge_method: 'S256',
46
+ id_token_add_organizations: 'true',
47
+ codex_cli_simplified_flow: 'true',
48
+ state,
49
+ originator: 'opencode',
50
+ });
51
+ return `${AUTHORIZE_URL}?${params.toString()}`;
52
+ }
53
+ function startCallbackServer() {
54
+ return new Promise((resolve, reject) => {
55
+ const server = http_1.default.createServer((req, res) => {
56
+ const parsed = url_1.default.parse(req.url || '', true);
57
+ const code = parsed.query.code;
58
+ if (code) {
59
+ res.writeHead(200, { 'Content-Type': 'text/html' });
60
+ res.end('<h1>Login successful!</h1><p>Close this window.</p>');
61
+ server.close(() => resolve({ code, server }));
62
+ }
63
+ else {
64
+ res.writeHead(400);
65
+ res.end('No code found.');
66
+ }
67
+ });
68
+ server.listen(REDIRECT_PORT);
69
+ server.on('error', reject);
70
+ });
71
+ }
72
+ async function exchangeCode(code, codeVerifier) {
73
+ const data = new URLSearchParams({
74
+ grant_type: 'authorization_code',
75
+ code,
76
+ redirect_uri: `http://localhost:${REDIRECT_PORT}/auth/callback`,
77
+ client_id: CLIENT_ID,
78
+ code_verifier: codeVerifier,
79
+ });
80
+ const resp = await fetch(TOKEN_URL, {
81
+ method: 'POST',
82
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
83
+ body: data.toString(),
84
+ });
85
+ if (!resp.ok) {
86
+ const text = await resp.text();
87
+ throw new OAuthFlowError(`Token exchange failed (HTTP ${resp.status}): ${text.slice(0, 300)}`);
88
+ }
89
+ return resp.json();
90
+ }
91
+ async function findElement(page, selectors, timeout = 10000) {
92
+ for (const sel of selectors) {
93
+ try {
94
+ const el = await page.waitForSelector(sel, { timeout });
95
+ if (el)
96
+ return el;
97
+ }
98
+ catch { /* empty */ }
99
+ }
100
+ throw new OAuthFlowError(`Element not found. Tried: ${selectors.join(', ')}. URL: ${page.url()}`);
101
+ }
102
+ async function handleConsent(page) {
103
+ try {
104
+ const btn = await page.$('button:has-text("Continue"), button:has-text("Allow"), button:has-text("Authorize"), button:has-text("Accept")');
105
+ if (btn) {
106
+ const text = await btn.innerText();
107
+ console.log(` Clicking: '${text.trim()}'`);
108
+ await btn.click();
109
+ await page.waitForTimeout(2000);
110
+ }
111
+ }
112
+ catch {
113
+ // No consent page
114
+ }
115
+ }
116
+ async function saveScreenshot(page, name) {
117
+ try {
118
+ fs_1.default.mkdirSync(DEBUG_DIR, { recursive: true });
119
+ const filePath = path_1.default.join(DEBUG_DIR, `${name}_${Date.now()}.png`);
120
+ await page.screenshot({ path: filePath });
121
+ console.log(` Screenshot: ${filePath}`);
122
+ }
123
+ catch {
124
+ // Screenshot failed, non-critical
125
+ }
126
+ }
127
+ async function browserSignup(email, otpCode, headless = true) {
128
+ const { codeVerifier, codeChallenge } = generatePkce();
129
+ const state = generateState();
130
+ const authUrl = buildAuthUrl(codeChallenge, state);
131
+ const callbackPromise = startCallbackServer();
132
+ let browser = null;
133
+ let context = null;
134
+ let page = null;
135
+ try {
136
+ browser = await playwright_1.chromium.launch({
137
+ headless,
138
+ args: ['--disable-blink-features=AutomationControlled', '--no-sandbox'],
139
+ });
140
+ context = await browser.newContext({
141
+ userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
142
+ viewport: { width: 1280, height: 800 },
143
+ });
144
+ page = await context.newPage();
145
+ console.log(' [1/6] Navigating to OpenAI auth...');
146
+ await page.goto(authUrl, { waitUntil: 'domcontentloaded', timeout: 30000 });
147
+ await page.waitForTimeout(3000);
148
+ console.log(` [2/6] Entering email: ${email}...`);
149
+ const emailInput = await findElement(page, [
150
+ 'input[name="email"]',
151
+ 'input[name="username"]',
152
+ 'input[type="email"]',
153
+ 'input[placeholder*="email" i]',
154
+ ]);
155
+ await emailInput.fill(email);
156
+ await page.waitForTimeout(500);
157
+ const contBtn = await findElement(page, [
158
+ 'button[type="submit"]',
159
+ 'button:has-text("Continue")',
160
+ 'button:has-text("Next")',
161
+ ]);
162
+ await contBtn.click();
163
+ await page.waitForTimeout(3000);
164
+ console.log(' [3/6] Using one-time code login...');
165
+ const otpLink = await page.$('button:has-text("one-time code"), a:has-text("one-time code"), button:has-text("Log in with a one-time code"), a:has-text("Log in with a one-time code")');
166
+ if (otpLink) {
167
+ await otpLink.click();
168
+ await page.waitForTimeout(3000);
169
+ const otpEmailInput = await page.$('input[name="email"], input[type="email"]');
170
+ if (otpEmailInput) {
171
+ await otpEmailInput.fill(email);
172
+ await page.waitForTimeout(300);
173
+ const otpSubmit = await page.$('button[type="submit"], button:has-text("Continue")');
174
+ if (otpSubmit) {
175
+ await otpSubmit.click();
176
+ await page.waitForTimeout(2000);
177
+ }
178
+ }
179
+ console.log(` [4/6] Entering OTP code: ${otpCode}...`);
180
+ const codeField = await findElement(page, [
181
+ 'input[name="code"]',
182
+ 'input[type="text"]',
183
+ 'input[inputmode="numeric"]',
184
+ 'input[placeholder*="ode" i]',
185
+ ], 10000);
186
+ await codeField.fill(otpCode);
187
+ await page.waitForTimeout(500);
188
+ const verifyBtn = await findElement(page, [
189
+ 'button[type="submit"]',
190
+ 'button:has-text("Continue")',
191
+ 'button:has-text("Verify")',
192
+ ]);
193
+ await verifyBtn.click();
194
+ await page.waitForTimeout(5000);
195
+ }
196
+ else {
197
+ console.log(' [3/6] No OTP link found, checking page state...');
198
+ }
199
+ console.log(' [5/6] Handling consent page...');
200
+ await page.waitForTimeout(2000);
201
+ await handleConsent(page);
202
+ console.log(' [6/6] Waiting for OAuth callback...');
203
+ const { code } = await callbackPromise;
204
+ console.log(` Got OAuth code: ${code.slice(0, 20)}...`);
205
+ console.log(' Exchanging code for tokens...');
206
+ const tokens = await exchangeCode(code, codeVerifier);
207
+ return tokens;
208
+ }
209
+ catch (err) {
210
+ if (page) {
211
+ await saveScreenshot(page, 'browser_signup_error');
212
+ }
213
+ if (browser) {
214
+ await browser.close();
215
+ }
216
+ throw new OAuthFlowError(`Browser signup failed: ${err instanceof Error ? err.message : String(err)}`);
217
+ }
218
+ }
219
+ async function fullBrowserFlow(email, otpCode, headless = true) {
220
+ console.log('[Browser Flow] Starting OAuth flow...');
221
+ const tokens = await browserSignup(email, otpCode, headless);
222
+ console.log(`[Browser Flow] Tokens received for ${email}`);
223
+ return tokens;
224
+ }
225
+ //# sourceMappingURL=oauth-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-flow.js","sourceRoot":"","sources":["../src/oauth-flow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ export declare class TokenStoreError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ export interface Account {
5
+ accessToken: string;
6
+ refreshToken: string;
7
+ idToken: string;
8
+ accountId?: string;
9
+ expiresAt: number;
10
+ email: string;
11
+ lastRefresh: string;
12
+ lastSeenAt: number;
13
+ addedAt: number;
14
+ source: string;
15
+ authInvalid: boolean;
16
+ usageCount: number;
17
+ enabled: boolean;
18
+ quota: unknown;
19
+ rateLimitHistory?: unknown[];
20
+ }
21
+ export interface StoreData {
22
+ version: number;
23
+ accounts: Account[];
24
+ activeIndex: number;
25
+ rotationIndex: number;
26
+ lastRotation: number;
27
+ }
28
+ export declare class TokenStore {
29
+ private storePath;
30
+ private store;
31
+ constructor(storePath?: string);
32
+ get path(): string;
33
+ private load;
34
+ save(): void;
35
+ addAccount(tokens: Record<string, unknown>, email: string): number;
36
+ getAccount(index: number): Account | null;
37
+ getActiveAccount(): {
38
+ index: number;
39
+ account: Account;
40
+ } | null;
41
+ setActive(index: number): void;
42
+ removeAccount(index: number): void;
43
+ listAccounts(): Array<{
44
+ index: number;
45
+ email: string;
46
+ enabled: boolean;
47
+ authInvalid: boolean;
48
+ expiresAt: number;
49
+ usageCount: number;
50
+ quota: unknown;
51
+ }>;
52
+ cleanInvalid(): number;
53
+ updateAccount(index: number, updates: Partial<Account>): void;
54
+ }
55
+ //# sourceMappingURL=token-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-store.d.ts","sourceRoot":"","sources":["../src/token-store.ts"],"names":[],"mappings":"AAIA,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,OAAO;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAuCD,qBAAa,UAAU;IACrB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAY;gBAEb,SAAS,CAAC,EAAE,MAAM;IAW9B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,OAAO,CAAC,IAAI;IAiBZ,IAAI,IAAI,IAAI;IAWZ,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAoDlE,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAIzC,gBAAgB,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAa9D,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAO9B,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAUlC,YAAY,IAAI,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IAYtJ,YAAY,IAAI,MAAM;IAkBtB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;CAM9D"}
@@ -0,0 +1,209 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TokenStore = exports.TokenStoreError = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ class TokenStoreError extends Error {
10
+ constructor(message) {
11
+ super(message);
12
+ this.name = 'TokenStoreError';
13
+ }
14
+ }
15
+ exports.TokenStoreError = TokenStoreError;
16
+ function defaultStore() {
17
+ return {
18
+ version: 2,
19
+ accounts: [],
20
+ activeIndex: 0,
21
+ rotationIndex: 0,
22
+ lastRotation: Date.now(),
23
+ };
24
+ }
25
+ function decodeJwt(token) {
26
+ if (!token)
27
+ return null;
28
+ try {
29
+ const parts = token.split('.');
30
+ if (parts.length !== 3)
31
+ return null;
32
+ const payload = parts[1].replace(/-/g, '+').replace(/_/g, '/');
33
+ const padded = payload.padEnd(payload.length + ((4 - (payload.length % 4)) % 4), '=');
34
+ return JSON.parse(Buffer.from(padded, 'base64').toString('utf-8'));
35
+ }
36
+ catch {
37
+ return null;
38
+ }
39
+ }
40
+ function getExpiryFromClaims(claims) {
41
+ if (!claims)
42
+ return null;
43
+ const exp = claims.exp;
44
+ if (typeof exp === 'number')
45
+ return Math.floor(exp * 1000);
46
+ return null;
47
+ }
48
+ function getAccountId(claims) {
49
+ if (!claims)
50
+ return null;
51
+ const auth = claims['https://api.openai.com/auth'];
52
+ if (auth && typeof auth.chatgpt_account_id === 'string')
53
+ return auth.chatgpt_account_id;
54
+ return null;
55
+ }
56
+ class TokenStore {
57
+ storePath;
58
+ store;
59
+ constructor(storePath) {
60
+ this.storePath = storePath || path_1.default.join(process.env.HOME || process.env.USERPROFILE || '', '.config', 'opencode', 'codex-automation-accounts.json');
61
+ fs_1.default.mkdirSync(path_1.default.dirname(this.storePath), { recursive: true });
62
+ this.store = this.load();
63
+ }
64
+ get path() {
65
+ return this.storePath;
66
+ }
67
+ load() {
68
+ if (!fs_1.default.existsSync(this.storePath))
69
+ return defaultStore();
70
+ try {
71
+ const data = JSON.parse(fs_1.default.readFileSync(this.storePath, 'utf-8'));
72
+ if (typeof data !== 'object' || !Array.isArray(data.accounts))
73
+ return defaultStore();
74
+ return {
75
+ version: data.version || 2,
76
+ accounts: data.accounts,
77
+ activeIndex: data.activeIndex ?? 0,
78
+ rotationIndex: data.rotationIndex ?? 0,
79
+ lastRotation: data.lastRotation ?? Date.now(),
80
+ };
81
+ }
82
+ catch {
83
+ return defaultStore();
84
+ }
85
+ }
86
+ save() {
87
+ fs_1.default.mkdirSync(path_1.default.dirname(this.storePath), { recursive: true });
88
+ if (fs_1.default.existsSync(this.storePath)) {
89
+ fs_1.default.copyFileSync(this.storePath, this.storePath + '.bak');
90
+ }
91
+ const tmpPath = `${this.storePath}.tmp-${process.pid}-${Date.now()}`;
92
+ fs_1.default.writeFileSync(tmpPath, JSON.stringify(this.store, null, 2));
93
+ fs_1.default.renameSync(tmpPath, this.storePath);
94
+ fs_1.default.chmodSync(this.storePath, 0o600);
95
+ }
96
+ addAccount(tokens, email) {
97
+ const nowMs = Date.now();
98
+ const nowIso = new Date().toISOString();
99
+ const accessClaims = decodeJwt(String(tokens.access_token || ''));
100
+ const idClaims = decodeJwt(String(tokens.id_token || ''));
101
+ const expiresIn = typeof tokens.expires_in === 'number' ? tokens.expires_in : 3600;
102
+ const expiresAt = getExpiryFromClaims(accessClaims)
103
+ || getExpiryFromClaims(idClaims)
104
+ || nowMs + expiresIn * 1000;
105
+ const accountId = getAccountId(accessClaims) || getAccountId(idClaims);
106
+ const newAccount = {
107
+ accessToken: String(tokens.access_token || ''),
108
+ refreshToken: String(tokens.refresh_token || ''),
109
+ idToken: String(tokens.id_token || ''),
110
+ accountId: accountId || undefined,
111
+ expiresAt,
112
+ email,
113
+ lastRefresh: nowIso,
114
+ lastSeenAt: nowMs,
115
+ addedAt: nowMs,
116
+ source: 'opencode',
117
+ authInvalid: false,
118
+ usageCount: 0,
119
+ enabled: true,
120
+ quota: null,
121
+ };
122
+ const existingIdx = this.store.accounts.findIndex((a) => a.email === email);
123
+ if (existingIdx >= 0) {
124
+ const old = this.store.accounts[existingIdx];
125
+ this.store.accounts[existingIdx] = {
126
+ ...old,
127
+ ...newAccount,
128
+ usageCount: old.usageCount,
129
+ addedAt: old.addedAt,
130
+ rateLimitHistory: old.rateLimitHistory,
131
+ };
132
+ this.save();
133
+ return existingIdx;
134
+ }
135
+ this.store.accounts.push(newAccount);
136
+ const idx = this.store.accounts.length - 1;
137
+ if (this.store.activeIndex < 0)
138
+ this.store.activeIndex = idx;
139
+ this.save();
140
+ return idx;
141
+ }
142
+ getAccount(index) {
143
+ return this.store.accounts[index] || null;
144
+ }
145
+ getActiveAccount() {
146
+ const idx = this.store.activeIndex;
147
+ const accounts = this.store.accounts;
148
+ if (!accounts.length)
149
+ return null;
150
+ for (let offset = 0; offset < accounts.length; offset++) {
151
+ const i = (idx + offset) % accounts.length;
152
+ const acc = accounts[i];
153
+ if (acc.enabled && !acc.authInvalid)
154
+ return { index: i, account: acc };
155
+ }
156
+ return null;
157
+ }
158
+ setActive(index) {
159
+ if (index >= 0 && index < this.store.accounts.length) {
160
+ this.store.activeIndex = index;
161
+ this.save();
162
+ }
163
+ }
164
+ removeAccount(index) {
165
+ if (index >= 0 && index < this.store.accounts.length) {
166
+ this.store.accounts.splice(index, 1);
167
+ if (this.store.activeIndex >= this.store.accounts.length) {
168
+ this.store.activeIndex = Math.max(0, this.store.accounts.length - 1);
169
+ }
170
+ if (this.store.accounts.length > 0)
171
+ this.save();
172
+ }
173
+ }
174
+ listAccounts() {
175
+ return this.store.accounts.map((acc, i) => ({
176
+ index: i,
177
+ email: acc.email,
178
+ enabled: acc.enabled,
179
+ authInvalid: acc.authInvalid,
180
+ expiresAt: acc.expiresAt,
181
+ usageCount: acc.usageCount,
182
+ quota: acc.quota,
183
+ }));
184
+ }
185
+ cleanInvalid() {
186
+ const nowMs = Date.now();
187
+ const originalCount = this.store.accounts.length;
188
+ this.store.accounts = this.store.accounts.filter((acc) => !acc.authInvalid && acc.expiresAt > nowMs);
189
+ const removed = originalCount - this.store.accounts.length;
190
+ if (removed > 0) {
191
+ if (this.store.accounts.length > 0) {
192
+ this.store.activeIndex = Math.min(this.store.activeIndex, this.store.accounts.length - 1);
193
+ }
194
+ else {
195
+ this.store.activeIndex = 0;
196
+ }
197
+ this.save();
198
+ }
199
+ return removed;
200
+ }
201
+ updateAccount(index, updates) {
202
+ if (index >= 0 && index < this.store.accounts.length) {
203
+ Object.assign(this.store.accounts[index], updates);
204
+ this.save();
205
+ }
206
+ }
207
+ }
208
+ exports.TokenStore = TokenStore;
209
+ //# sourceMappingURL=token-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-store.js","sourceRoot":"","sources":["../src/token-store.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "codex-auth-automation",
3
+ "version": "0.1.0",
4
+ "description": "Automated OpenAI/Codex account creation with Gmail aliases",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "codex-auth": "./dist/cli.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "prepublishOnly": "npm run build"
12
+ },
13
+ "keywords": [
14
+ "openai",
15
+ "codex",
16
+ "auth",
17
+ "automation",
18
+ "gmail"
19
+ ],
20
+ "license": "MIT",
21
+ "dependencies": {
22
+ "commander": "^12.0.0",
23
+ "imap": "^0.8.19",
24
+ "mailparser": "^3.7.0",
25
+ "playwright": "^1.40.0"
26
+ },
27
+ "devDependencies": {
28
+ "@types/imap": "^0.8.42",
29
+ "@types/mailparser": "^3.4.5",
30
+ "@types/node": "^20.0.0",
31
+ "typescript": "^5.3.0"
32
+ },
33
+ "engines": {
34
+ "node": ">=18.0.0"
35
+ }
36
+ }