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 +21 -0
- package/README.md +80 -0
- package/dist/automation.d.ts +23 -0
- package/dist/automation.d.ts.map +1 -0
- package/dist/automation.js +112 -0
- package/dist/automation.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +157 -0
- package/dist/cli.js.map +1 -0
- package/dist/gmail-reader.d.ts +28 -0
- package/dist/gmail-reader.d.ts.map +1 -0
- package/dist/gmail-reader.js +182 -0
- package/dist/gmail-reader.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/oauth-flow.d.ts +10 -0
- package/dist/oauth-flow.d.ts.map +1 -0
- package/dist/oauth-flow.js +225 -0
- package/dist/oauth-flow.js.map +1 -0
- package/dist/token-store.d.ts +55 -0
- package/dist/token-store.d.ts.map +1 -0
- package/dist/token-store.js +209 -0
- package/dist/token-store.js.map +1 -0
- package/package.json +36 -0
- package/src/automation.ts +129 -0
- package/src/cli.ts +181 -0
- package/src/gmail-reader.ts +205 -0
- package/src/index.ts +4 -0
- package/src/oauth-flow.ts +253 -0
- package/src/token-store.ts +244 -0
- package/tsconfig.json +19 -0
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":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -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
|
package/dist/cli.js.map
ADDED
|
@@ -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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|