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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Timothy
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,80 @@
1
+ # Codex Auth
2
+
3
+ Automated OpenAI/Codex account creation using Gmail aliases. Creates new accounts on demand with zero manual intervention.
4
+
5
+ ## How It Works
6
+
7
+ 1. Uses Gmail aliases (`you+codex1@gmail.com`, `you+codex2@gmail.com`, etc.) — all codes land in your real inbox
8
+ 2. Reads verification codes from Gmail via IMAP
9
+ 3. Automates the OpenAI OAuth flow with Playwright (headless browser)
10
+ 4. Captures and stores OAuth tokens for use with Codex/OpenCode
11
+
12
+ ## Quick Start
13
+
14
+ ```bash
15
+ # Install
16
+ pip install codex-auth
17
+
18
+ # Install Playwright browser
19
+ playwright install chromium
20
+
21
+ # Setup (interactive)
22
+ codex-auth setup
23
+
24
+ # Create a new account
25
+ codex-auth create
26
+
27
+ # View all accounts
28
+ codex-auth status
29
+
30
+ # Rotate to next account
31
+ codex-auth rotate
32
+ ```
33
+
34
+ ## Setup
35
+
36
+ ### 1. Create a Gmail App Password
37
+
38
+ 1. Go to https://myaccount.google.com/apppasswords
39
+ 2. Sign in → Search "App Passwords" → Create one
40
+ 3. Name it something like "codex-auth"
41
+ 4. Copy the 16-character password
42
+
43
+ ### 2. Run Setup
44
+
45
+ ```bash
46
+ codex-auth setup
47
+ ```
48
+
49
+ Enter your Gmail address and App Password when prompted.
50
+
51
+ ### 3. Create Accounts
52
+
53
+ ```bash
54
+ codex-auth create
55
+ ```
56
+
57
+ Each run creates a new account with the next alias (`+codex1`, `+codex2`, etc.).
58
+
59
+ ## Commands
60
+
61
+ | Command | Description |
62
+ |---------|-------------|
63
+ | `codex-auth setup` | Interactive setup wizard |
64
+ | `codex-auth create` | Create a new Codex account |
65
+ | `codex-auth create --alias you+custom@gmail.com` | Create with specific alias |
66
+ | `codex-auth status` | Show all accounts with status |
67
+ | `codex-auth rotate` | Rotate to next account |
68
+ | `codex-auth clean` | Remove expired/invalid accounts |
69
+ | `codex-auth config` | View current config |
70
+ | `codex-auth config --set headless false` | Show browser during signup |
71
+
72
+ ## Requirements
73
+
74
+ - Python 3.10+
75
+ - Gmail account with App Password enabled
76
+ - Playwright (Chromium browser)
77
+
78
+ ## License
79
+
80
+ MIT
@@ -0,0 +1,23 @@
1
+ export interface AutomationConfig {
2
+ gmailAddr: string;
3
+ gmailAppPassword: string;
4
+ storePath?: string;
5
+ headless?: boolean;
6
+ }
7
+ export declare class CodexAuthAutomation {
8
+ private gmail;
9
+ private store;
10
+ private headless;
11
+ private aliasCounter;
12
+ constructor(config: AutomationConfig);
13
+ private nextAlias;
14
+ createAccount(alias?: string): Promise<{
15
+ email: string;
16
+ index: number;
17
+ tokens: Record<string, unknown>;
18
+ } | null>;
19
+ status(): void;
20
+ rotate(): void;
21
+ clean(): void;
22
+ }
23
+ //# sourceMappingURL=automation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automation.d.ts","sourceRoot":"","sources":["../src/automation.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,YAAY,CAAK;gBAEb,MAAM,EAAE,gBAAgB;IAMpC,OAAO,CAAC,SAAS;IAMX,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;IA0CtH,MAAM,IAAI,IAAI;IAkCd,MAAM,IAAI,IAAI;IAmBd,KAAK,IAAI,IAAI;CAId"}
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CodexAuthAutomation = void 0;
4
+ const gmail_reader_js_1 = require("./gmail-reader.js");
5
+ const oauth_flow_js_1 = require("./oauth-flow.js");
6
+ const token_store_js_1 = require("./token-store.js");
7
+ class CodexAuthAutomation {
8
+ gmail;
9
+ store;
10
+ headless;
11
+ aliasCounter = 0;
12
+ constructor(config) {
13
+ this.gmail = new gmail_reader_js_1.GmailReader({ email: config.gmailAddr, appPassword: config.gmailAppPassword });
14
+ this.store = new token_store_js_1.TokenStore(config.storePath);
15
+ this.headless = config.headless ?? true;
16
+ }
17
+ nextAlias() {
18
+ this.aliasCounter += 1;
19
+ const [base, domain] = this.gmail.email.split('@');
20
+ return `${base}+codex${this.aliasCounter}@${domain}`;
21
+ }
22
+ async createAccount(alias) {
23
+ const targetAlias = alias || this.nextAlias();
24
+ console.log(`[Create] Using alias: ${targetAlias}`);
25
+ console.log('[Create] Waiting for OpenAI verification email (up to 90s)...');
26
+ let otpCode;
27
+ try {
28
+ otpCode = await this.gmail.searchForCode(targetAlias, 90000, 3000);
29
+ }
30
+ catch (err) {
31
+ console.log(`[Create] Gmail error: ${err instanceof Error ? err.message : String(err)}`);
32
+ return null;
33
+ }
34
+ if (!otpCode) {
35
+ console.log('[Create] No verification code found in Gmail');
36
+ return null;
37
+ }
38
+ console.log(`[Create] Got OTP code: ${otpCode}`);
39
+ console.log('[Create] Starting browser OAuth flow...');
40
+ let tokens;
41
+ try {
42
+ tokens = await (0, oauth_flow_js_1.fullBrowserFlow)(targetAlias, otpCode, this.headless);
43
+ }
44
+ catch (err) {
45
+ console.log(`[Create] OAuth flow failed: ${err instanceof Error ? err.message : String(err)}`);
46
+ return null;
47
+ }
48
+ let idx;
49
+ try {
50
+ idx = this.store.addAccount(tokens, targetAlias);
51
+ console.log(`[Create] Account saved at index ${idx}: ${targetAlias}`);
52
+ }
53
+ catch (err) {
54
+ console.log(`[Create] Store error: ${err instanceof Error ? err.message : String(err)}`);
55
+ return null;
56
+ }
57
+ return { email: targetAlias, index: idx, tokens };
58
+ }
59
+ status() {
60
+ const accounts = this.store.listAccounts();
61
+ if (!accounts.length) {
62
+ console.log('No accounts in store.');
63
+ return;
64
+ }
65
+ console.log('\n' + '='.repeat(60));
66
+ console.log(` Accounts (${accounts.length} total)`);
67
+ console.log('='.repeat(60));
68
+ const nowMs = Date.now();
69
+ const activeIdx = this.store.getActiveAccount()?.index ?? 0;
70
+ for (const acc of accounts) {
71
+ const marker = acc.index === activeIdx ? '>>>' : ' ';
72
+ let status = 'OK';
73
+ if (acc.authInvalid)
74
+ status = 'AUTH INVALID';
75
+ else if (!acc.enabled)
76
+ status = 'DISABLED';
77
+ else if (acc.expiresAt < nowMs)
78
+ status = 'EXPIRED';
79
+ let expiryStr = '';
80
+ if (acc.expiresAt) {
81
+ const expDt = new Date(acc.expiresAt);
82
+ expiryStr = ` (exp: ${expDt.toISOString().replace('T', ' ').slice(0, 16)} UTC)`;
83
+ }
84
+ console.log(` ${marker} [${acc.index}] ${acc.email}`);
85
+ console.log(` Status: ${status}${expiryStr} | Usage: ${acc.usageCount}`);
86
+ }
87
+ console.log('='.repeat(60) + '\n');
88
+ }
89
+ rotate() {
90
+ const accounts = this.store.listAccounts();
91
+ if (!accounts.length) {
92
+ console.log('No accounts to rotate to.');
93
+ return;
94
+ }
95
+ const current = this.store.getActiveAccount()?.index ?? 0;
96
+ const nextIdx = (current + 1) % accounts.length;
97
+ this.store.setActive(nextIdx);
98
+ const acc = this.store.getAccount(nextIdx);
99
+ if (acc) {
100
+ console.log(`Rotated to account #${nextIdx}: ${acc.email}`);
101
+ }
102
+ else {
103
+ console.log(`Rotated to account #${nextIdx}`);
104
+ }
105
+ }
106
+ clean() {
107
+ const removed = this.store.cleanInvalid();
108
+ console.log(`Removed ${removed} invalid/expired accounts.`);
109
+ }
110
+ }
111
+ exports.CodexAuthAutomation = CodexAuthAutomation;
112
+ //# sourceMappingURL=automation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automation.js","sourceRoot":"","sources":["../src/automation.ts"],"names":[],"mappings":";;;AAAA,uDAAkE;AAClE,mDAAkE;AAClE,qDAA+D;AAS/D,MAAa,mBAAmB;IACtB,KAAK,CAAc;IACnB,KAAK,CAAa;IAClB,QAAQ,CAAU;IAClB,YAAY,GAAG,CAAC,CAAC;IAEzB,YAAY,MAAwB;QAClC,IAAI,CAAC,KAAK,GAAG,IAAI,6BAAW,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAChG,IAAI,CAAC,KAAK,GAAG,IAAI,2BAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC;IAC1C,CAAC;IAEO,SAAS;QACf,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC;QACvB,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnD,OAAO,GAAG,IAAI,SAAS,IAAI,CAAC,YAAY,IAAI,MAAM,EAAE,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAc;QAChC,MAAM,WAAW,GAAG,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QAE9C,OAAO,CAAC,GAAG,CAAC,yBAAyB,WAAW,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;QAE7E,IAAI,OAAsB,CAAC;QAC3B,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QACrE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,yBAAyB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACzF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;YAC5D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QAEvD,IAAI,MAA+B,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAA,+BAAe,EAAC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,+BAA+B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC/F,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,mCAAmC,GAAG,KAAK,WAAW,EAAE,CAAC,CAAC;QACxE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,yBAAyB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACzF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IACpD,CAAC;IAED,MAAM;QACJ,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QAC3C,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,eAAe,QAAQ,CAAC,MAAM,SAAS,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAE5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,EAAE,KAAK,IAAI,CAAC,CAAC;QAE5D,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;YACvD,IAAI,MAAM,GAAG,IAAI,CAAC;YAClB,IAAI,GAAG,CAAC,WAAW;gBAAE,MAAM,GAAG,cAAc,CAAC;iBACxC,IAAI,CAAC,GAAG,CAAC,OAAO;gBAAE,MAAM,GAAG,UAAU,CAAC;iBACtC,IAAI,GAAG,CAAC,SAAS,GAAG,KAAK;gBAAE,MAAM,GAAG,SAAS,CAAC;YAEnD,IAAI,SAAS,GAAG,EAAE,CAAC;YACnB,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBAClB,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACtC,SAAS,GAAG,UAAU,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC;YAClF,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,KAAK,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,GAAG,SAAS,aAAa,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QACjF,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,MAAM;QACJ,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QAC3C,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;YACzC,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,EAAE,KAAK,IAAI,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;QAEhD,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,CAAC,GAAG,CAAC,uBAAuB,OAAO,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,KAAK;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,4BAA4B,CAAC,CAAC;IAC9D,CAAC;CACF;AArHD,kDAqHC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,157 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const commander_1 = require("commander");
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const os_1 = __importDefault(require("os"));
11
+ const automation_js_1 = require("./automation.js");
12
+ const CONFIG_FILE = path_1.default.join(os_1.default.homedir(), '.config', 'codex-auth', 'config.json');
13
+ function loadConfig() {
14
+ if (fs_1.default.existsSync(CONFIG_FILE)) {
15
+ return JSON.parse(fs_1.default.readFileSync(CONFIG_FILE, 'utf-8'));
16
+ }
17
+ return { gmail: '', gmail_app_password: '', headless: true };
18
+ }
19
+ function saveConfig(config) {
20
+ fs_1.default.mkdirSync(path_1.default.dirname(CONFIG_FILE), { recursive: true });
21
+ fs_1.default.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
22
+ }
23
+ async function cmdCreate(config, alias) {
24
+ if (!config.gmail || !config.gmail_app_password) {
25
+ console.error('Error: Gmail credentials not configured.');
26
+ console.error('Run: codex-auth config --set gmail your@email.com');
27
+ console.error('Run: codex-auth config --set gmail_app_password YOUR_APP_PASSWORD');
28
+ process.exit(1);
29
+ }
30
+ const app = new automation_js_1.CodexAuthAutomation({
31
+ gmailAddr: config.gmail,
32
+ gmailAppPassword: config.gmail_app_password,
33
+ headless: config.headless,
34
+ });
35
+ const result = await app.createAccount(alias);
36
+ if (result) {
37
+ console.log(`\nSuccess! Account created: ${result.email}`);
38
+ }
39
+ else {
40
+ console.error('\nFailed to create account.');
41
+ process.exit(1);
42
+ }
43
+ }
44
+ function cmdStatus(config) {
45
+ const app = new automation_js_1.CodexAuthAutomation({
46
+ gmailAddr: config.gmail,
47
+ gmailAppPassword: config.gmail_app_password,
48
+ });
49
+ app.status();
50
+ }
51
+ function cmdRotate(config) {
52
+ const app = new automation_js_1.CodexAuthAutomation({
53
+ gmailAddr: config.gmail,
54
+ gmailAppPassword: config.gmail_app_password,
55
+ });
56
+ app.rotate();
57
+ }
58
+ function cmdClean(config) {
59
+ const app = new automation_js_1.CodexAuthAutomation({
60
+ gmailAddr: config.gmail,
61
+ gmailAppPassword: config.gmail_app_password,
62
+ });
63
+ app.clean();
64
+ }
65
+ function cmdSetup(config) {
66
+ const readline = require('readline').createInterface({
67
+ input: process.stdin,
68
+ output: process.stdout,
69
+ });
70
+ const question = (prompt) => new Promise((resolve) => readline.question(prompt, resolve));
71
+ (async () => {
72
+ console.log('codex-auth setup');
73
+ console.log('='.repeat(40));
74
+ const gmail = await question('Gmail address: ');
75
+ const appPw = await question('Gmail App Password: ');
76
+ const headlessInput = await question('Headless mode? (Y/n): ');
77
+ const headless = headlessInput.trim().toLowerCase() !== 'n';
78
+ config.gmail = gmail.trim();
79
+ config.gmail_app_password = appPw.trim();
80
+ config.headless = headless;
81
+ saveConfig(config);
82
+ console.log(`\nConfig saved to ${CONFIG_FILE}`);
83
+ console.log("Run 'codex-auth create' to create your first account.");
84
+ readline.close();
85
+ })();
86
+ }
87
+ function cmdConfig(config, key, value) {
88
+ if (key && value !== undefined) {
89
+ let parsed = value;
90
+ if (key === 'headless') {
91
+ parsed = ['true', '1', 'yes'].includes(value.toLowerCase());
92
+ }
93
+ config[key] = parsed;
94
+ saveConfig(config);
95
+ console.log(`Set ${key} = ${parsed}`);
96
+ }
97
+ else {
98
+ console.log(JSON.stringify(config, null, 2));
99
+ }
100
+ }
101
+ const program = new commander_1.Command();
102
+ program
103
+ .name('codex-auth')
104
+ .description('Automated OpenAI/Codex account creation with Gmail aliases')
105
+ .version('0.1.0');
106
+ program
107
+ .command('create')
108
+ .description('Create a new Codex account')
109
+ .option('--alias <alias>', 'Specific alias (e.g. you+custom@gmail.com)')
110
+ .action((opts) => {
111
+ const config = loadConfig();
112
+ cmdCreate(config, opts.alias);
113
+ });
114
+ program
115
+ .command('status')
116
+ .description('Show all accounts')
117
+ .action(() => {
118
+ const config = loadConfig();
119
+ cmdStatus(config);
120
+ });
121
+ program
122
+ .command('rotate')
123
+ .description('Rotate to next account')
124
+ .action(() => {
125
+ const config = loadConfig();
126
+ cmdRotate(config);
127
+ });
128
+ program
129
+ .command('clean')
130
+ .description('Remove invalid/expired accounts')
131
+ .action(() => {
132
+ const config = loadConfig();
133
+ cmdClean(config);
134
+ });
135
+ program
136
+ .command('setup')
137
+ .description('Interactive setup wizard')
138
+ .action(() => {
139
+ const config = loadConfig();
140
+ cmdSetup(config);
141
+ });
142
+ program
143
+ .command('config')
144
+ .description('View or set config')
145
+ .option('--set <key> <value>', 'Set config value')
146
+ .action((opts) => {
147
+ const config = loadConfig();
148
+ if (opts.set) {
149
+ const [key, value] = opts.set.split(' ');
150
+ cmdConfig(config, key, value);
151
+ }
152
+ else {
153
+ cmdConfig(config);
154
+ }
155
+ });
156
+ program.parse();
157
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import Imap from 'imap';
2
+ export declare class GmailReaderError extends Error {
3
+ constructor(message: string);
4
+ }
5
+ export interface GmailConfig {
6
+ email: string;
7
+ appPassword: string;
8
+ }
9
+ export declare class GmailReader {
10
+ readonly email: string;
11
+ private appPassword;
12
+ private conn;
13
+ private static CODE_PATTERNS;
14
+ constructor(config: GmailConfig);
15
+ connect(): Promise<Imap>;
16
+ private ensureConnected;
17
+ searchForCode(alias: string, timeout?: number, pollInterval?: number): Promise<string | null>;
18
+ getLatestCode(): Promise<{
19
+ code: string;
20
+ recipient: string;
21
+ } | null>;
22
+ close(): void;
23
+ private searchImap;
24
+ private fetchMessageBody;
25
+ private extractCode;
26
+ private sleep;
27
+ }
28
+ //# sourceMappingURL=gmail-reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gmail-reader.d.ts","sourceRoot":"","sources":["../src/gmail-reader.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAIxB,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,WAAW;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,IAAI,CAAqB;IAEjC,OAAO,CAAC,MAAM,CAAC,aAAa,CAO1B;gBAEU,MAAM,EAAE,WAAW;IAK/B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAwBV,eAAe;IAOvB,aAAa,CACjB,KAAK,EAAE,MAAM,EACb,OAAO,SAAQ,EACf,YAAY,SAAO,GAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA4BnB,aAAa,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAqC1E,KAAK,IAAI,IAAI;IAOb,OAAO,CAAC,UAAU;IAoBlB,OAAO,CAAC,gBAAgB;IAoBxB,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,KAAK;CAGd"}
@@ -0,0 +1,182 @@
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.GmailReader = exports.GmailReaderError = void 0;
7
+ const imap_1 = __importDefault(require("imap"));
8
+ const mailparser_1 = require("mailparser");
9
+ const stream_1 = require("stream");
10
+ class GmailReaderError extends Error {
11
+ constructor(message) {
12
+ super(message);
13
+ this.name = 'GmailReaderError';
14
+ }
15
+ }
16
+ exports.GmailReaderError = GmailReaderError;
17
+ class GmailReader {
18
+ email;
19
+ appPassword;
20
+ conn = null;
21
+ static CODE_PATTERNS = [
22
+ /verification code[:\s]+(\d{6})/i,
23
+ /your code is[:\s]*(\d{6})/i,
24
+ /enter this code[:\s]+(\d{6})/i,
25
+ /your verification code is (\d{6})/i,
26
+ /code[:\s]+(\d{6})/i,
27
+ /\b(\d{6})\b/,
28
+ ];
29
+ constructor(config) {
30
+ this.email = config.email;
31
+ this.appPassword = config.appPassword;
32
+ }
33
+ connect() {
34
+ return new Promise((resolve, reject) => {
35
+ const conn = new imap_1.default({
36
+ user: this.email,
37
+ password: this.appPassword.replace(/\s/g, ''),
38
+ host: 'imap.gmail.com',
39
+ port: 993,
40
+ tls: true,
41
+ tlsOptions: { rejectUnauthorized: true },
42
+ });
43
+ conn.once('ready', () => {
44
+ this.conn = conn;
45
+ resolve(conn);
46
+ });
47
+ conn.once('error', (err) => {
48
+ reject(new GmailReaderError(`IMAP login failed: ${err.message}`));
49
+ });
50
+ conn.connect();
51
+ });
52
+ }
53
+ async ensureConnected() {
54
+ if (!this.conn) {
55
+ return this.connect();
56
+ }
57
+ return this.conn;
58
+ }
59
+ async searchForCode(alias, timeout = 60000, pollInterval = 3000) {
60
+ const conn = await this.ensureConnected();
61
+ const deadline = Date.now() + timeout;
62
+ const seenUids = new Set();
63
+ while (Date.now() < deadline) {
64
+ try {
65
+ const messages = await this.searchImap(conn, seenUids);
66
+ for (const msg of messages) {
67
+ if (seenUids.has(msg.uid))
68
+ continue;
69
+ seenUids.add(msg.uid);
70
+ const body = await this.fetchMessageBody(conn, msg.uid);
71
+ const code = this.extractCode(body);
72
+ if (code)
73
+ return code;
74
+ }
75
+ }
76
+ catch {
77
+ // transient error, keep polling
78
+ }
79
+ const remaining = deadline - Date.now();
80
+ if (remaining <= 0)
81
+ break;
82
+ await this.sleep(Math.min(pollInterval, remaining));
83
+ }
84
+ return null;
85
+ }
86
+ async getLatestCode() {
87
+ const conn = await this.ensureConnected();
88
+ return new Promise((resolve, reject) => {
89
+ conn.openBox('INBOX', true, (err) => {
90
+ if (err)
91
+ return reject(new GmailReaderError(`Failed to open inbox: ${err.message}`));
92
+ conn.search(['OR', ['FROM', 'auth.openai.com'], ['FROM', 'openai.com']], (err, results) => {
93
+ if (err || !results || results.length === 0)
94
+ return resolve(null);
95
+ const uids = results.slice(-10);
96
+ const fetch = conn.fetch(uids, { bodies: '' });
97
+ fetch.on('message', (msg) => {
98
+ msg.on('body', (stream) => {
99
+ (0, mailparser_1.simpleParser)(stream_1.Readable.from(stream))
100
+ .then((parsed) => {
101
+ const body = parsed.text || parsed.html || '';
102
+ const code = this.extractCode(String(body));
103
+ if (code) {
104
+ const toText = parsed.to
105
+ ? (Array.isArray(parsed.to) ? parsed.to[0]?.text : parsed.to.text)
106
+ : '';
107
+ resolve({ code, recipient: String(toText || '') });
108
+ }
109
+ })
110
+ .catch(() => { });
111
+ });
112
+ });
113
+ fetch.once('error', reject);
114
+ fetch.once('end', () => resolve(null));
115
+ });
116
+ });
117
+ });
118
+ }
119
+ close() {
120
+ if (this.conn) {
121
+ try {
122
+ this.conn.end();
123
+ }
124
+ catch { }
125
+ this.conn = null;
126
+ }
127
+ }
128
+ searchImap(conn, seenUids) {
129
+ return new Promise((resolve, reject) => {
130
+ conn.openBox('INBOX', true, (err) => {
131
+ if (err)
132
+ return reject(new GmailReaderError(`Failed to open inbox: ${err.message}`));
133
+ conn.search(['OR', ['FROM', 'auth.openai.com'], ['FROM', 'openai.com']], (err, results) => {
134
+ if (err)
135
+ return reject(new GmailReaderError(`Search failed: ${err.message}`));
136
+ if (!results || results.length === 0)
137
+ return resolve([]);
138
+ resolve(results.map((uid) => ({ uid: String(uid) })).filter((m) => !seenUids.has(m.uid)));
139
+ });
140
+ });
141
+ });
142
+ }
143
+ fetchMessageBody(conn, uid) {
144
+ return new Promise((resolve, reject) => {
145
+ const fetch = conn.fetch(uid, { bodies: '' });
146
+ fetch.on('message', (msg) => {
147
+ msg.on('body', (stream) => {
148
+ (0, mailparser_1.simpleParser)(stream_1.Readable.from(stream))
149
+ .then((parsed) => {
150
+ resolve(String(parsed.text || parsed.html || ''));
151
+ })
152
+ .catch(reject);
153
+ });
154
+ msg.once('error', reject);
155
+ });
156
+ fetch.once('error', reject);
157
+ fetch.once('end', () => resolve(''));
158
+ });
159
+ }
160
+ extractCode(content) {
161
+ if (!content)
162
+ return null;
163
+ for (const pattern of GmailReader.CODE_PATTERNS) {
164
+ const match = pattern.exec(content);
165
+ if (match && !match[1].startsWith('20')) {
166
+ return match[1];
167
+ }
168
+ }
169
+ const allCodes = content.match(/\b(\d{6})\b/g);
170
+ if (allCodes) {
171
+ const valid = allCodes.filter((c) => !c.startsWith('20'));
172
+ if (valid.length > 0)
173
+ return valid[valid.length - 1];
174
+ }
175
+ return null;
176
+ }
177
+ sleep(ms) {
178
+ return new Promise((resolve) => setTimeout(resolve, ms));
179
+ }
180
+ }
181
+ exports.GmailReader = GmailReader;
182
+ //# sourceMappingURL=gmail-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gmail-reader.js","sourceRoot":"","sources":["../src/gmail-reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { GmailReader, GmailReaderError } from './gmail-reader.js';
2
+ export { OAuthFlowError, fullBrowserFlow, browserSignup } from './oauth-flow.js';
3
+ export { TokenStore, TokenStoreError } from './token-store.js';
4
+ export { CodexAuthAutomation } from './automation.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC"}