oc-chatgpt-multi-auth 4.9.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 +37 -0
- package/README.md +507 -0
- package/assets/opencode-logo-ornate-dark.svg +18 -0
- package/assets/readme-hero.svg +31 -0
- package/config/README.md +110 -0
- package/config/minimal-opencode.json +13 -0
- package/config/opencode-legacy.json +572 -0
- package/config/opencode-modern.json +240 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +971 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/accounts.d.ts +120 -0
- package/dist/lib/accounts.d.ts.map +1 -0
- package/dist/lib/accounts.js +579 -0
- package/dist/lib/accounts.js.map +1 -0
- package/dist/lib/auth/auth.d.ts +51 -0
- package/dist/lib/auth/auth.d.ts.map +1 -0
- package/dist/lib/auth/auth.js +180 -0
- package/dist/lib/auth/auth.js.map +1 -0
- package/dist/lib/auth/browser.d.ts +17 -0
- package/dist/lib/auth/browser.d.ts.map +1 -0
- package/dist/lib/auth/browser.js +83 -0
- package/dist/lib/auth/browser.js.map +1 -0
- package/dist/lib/auth/server.d.ts +10 -0
- package/dist/lib/auth/server.d.ts.map +1 -0
- package/dist/lib/auth/server.js +85 -0
- package/dist/lib/auth/server.js.map +1 -0
- package/dist/lib/auto-update-checker.d.ts +10 -0
- package/dist/lib/auto-update-checker.d.ts.map +1 -0
- package/dist/lib/auto-update-checker.js +129 -0
- package/dist/lib/auto-update-checker.js.map +1 -0
- package/dist/lib/cli.d.ts +9 -0
- package/dist/lib/cli.d.ts.map +1 -0
- package/dist/lib/cli.js +50 -0
- package/dist/lib/cli.js.map +1 -0
- package/dist/lib/config.d.ts +17 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +102 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/constants.d.ts +74 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +74 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/context-overflow.d.ts +27 -0
- package/dist/lib/context-overflow.d.ts.map +1 -0
- package/dist/lib/context-overflow.js +124 -0
- package/dist/lib/context-overflow.js.map +1 -0
- package/dist/lib/index.d.ts +13 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +13 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/logger.d.ts +22 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +175 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/oauth-success.html +712 -0
- package/dist/lib/prompts/codex-opencode-bridge.d.ts +19 -0
- package/dist/lib/prompts/codex-opencode-bridge.d.ts.map +1 -0
- package/dist/lib/prompts/codex-opencode-bridge.js +152 -0
- package/dist/lib/prompts/codex-opencode-bridge.js.map +1 -0
- package/dist/lib/prompts/codex.d.ts +32 -0
- package/dist/lib/prompts/codex.d.ts.map +1 -0
- package/dist/lib/prompts/codex.js +262 -0
- package/dist/lib/prompts/codex.js.map +1 -0
- package/dist/lib/prompts/opencode-codex.d.ts +21 -0
- package/dist/lib/prompts/opencode-codex.d.ts.map +1 -0
- package/dist/lib/prompts/opencode-codex.js +91 -0
- package/dist/lib/prompts/opencode-codex.js.map +1 -0
- package/dist/lib/recovery/constants.d.ts +12 -0
- package/dist/lib/recovery/constants.d.ts.map +1 -0
- package/dist/lib/recovery/constants.js +25 -0
- package/dist/lib/recovery/constants.js.map +1 -0
- package/dist/lib/recovery/index.d.ts +12 -0
- package/dist/lib/recovery/index.d.ts.map +1 -0
- package/dist/lib/recovery/index.js +12 -0
- package/dist/lib/recovery/index.js.map +1 -0
- package/dist/lib/recovery/storage.d.ts +24 -0
- package/dist/lib/recovery/storage.d.ts.map +1 -0
- package/dist/lib/recovery/storage.js +354 -0
- package/dist/lib/recovery/storage.js.map +1 -0
- package/dist/lib/recovery/types.d.ts +116 -0
- package/dist/lib/recovery/types.d.ts.map +1 -0
- package/dist/lib/recovery/types.js +7 -0
- package/dist/lib/recovery/types.js.map +1 -0
- package/dist/lib/recovery.d.ts +31 -0
- package/dist/lib/recovery.d.ts.map +1 -0
- package/dist/lib/recovery.js +308 -0
- package/dist/lib/recovery.js.map +1 -0
- package/dist/lib/refresh-queue.d.ts +100 -0
- package/dist/lib/refresh-queue.d.ts.map +1 -0
- package/dist/lib/refresh-queue.js +196 -0
- package/dist/lib/refresh-queue.js.map +1 -0
- package/dist/lib/request/fetch-helpers.d.ts +81 -0
- package/dist/lib/request/fetch-helpers.d.ts.map +1 -0
- package/dist/lib/request/fetch-helpers.js +325 -0
- package/dist/lib/request/fetch-helpers.js.map +1 -0
- package/dist/lib/request/helpers/input-utils.d.ts +7 -0
- package/dist/lib/request/helpers/input-utils.d.ts.map +1 -0
- package/dist/lib/request/helpers/input-utils.js +213 -0
- package/dist/lib/request/helpers/input-utils.js.map +1 -0
- package/dist/lib/request/helpers/model-map.d.ts +28 -0
- package/dist/lib/request/helpers/model-map.d.ts.map +1 -0
- package/dist/lib/request/helpers/model-map.js +109 -0
- package/dist/lib/request/helpers/model-map.js.map +1 -0
- package/dist/lib/request/rate-limit-backoff.d.ts +17 -0
- package/dist/lib/request/rate-limit-backoff.d.ts.map +1 -0
- package/dist/lib/request/rate-limit-backoff.js +74 -0
- package/dist/lib/request/rate-limit-backoff.js.map +1 -0
- package/dist/lib/request/request-transformer.d.ts +93 -0
- package/dist/lib/request/request-transformer.d.ts.map +1 -0
- package/dist/lib/request/request-transformer.js +405 -0
- package/dist/lib/request/request-transformer.js.map +1 -0
- package/dist/lib/request/response-handler.d.ts +14 -0
- package/dist/lib/request/response-handler.d.ts.map +1 -0
- package/dist/lib/request/response-handler.js +90 -0
- package/dist/lib/request/response-handler.js.map +1 -0
- package/dist/lib/rotation.d.ts +121 -0
- package/dist/lib/rotation.d.ts.map +1 -0
- package/dist/lib/rotation.js +248 -0
- package/dist/lib/rotation.js.map +1 -0
- package/dist/lib/storage.d.ts +91 -0
- package/dist/lib/storage.d.ts.map +1 -0
- package/dist/lib/storage.js +323 -0
- package/dist/lib/storage.js.map +1 -0
- package/dist/lib/types.d.ts +185 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +2 -0
- package/dist/lib/types.js.map +1 -0
- package/package.json +86 -0
- package/scripts/copy-oauth-success.js +37 -0
- package/scripts/install-opencode-codex-auth.js +193 -0
- package/scripts/test-all-models.sh +260 -0
- package/scripts/validate-model-map.sh +97 -0
|
@@ -0,0 +1,579 @@
|
|
|
1
|
+
import { decodeJWT } from "./auth/auth.js";
|
|
2
|
+
import { JWT_CLAIM_PATH } from "./constants.js";
|
|
3
|
+
import { loadAccounts, saveAccounts, } from "./storage.js";
|
|
4
|
+
import { MODEL_FAMILIES } from "./prompts/codex.js";
|
|
5
|
+
import { getHealthTracker, getTokenTracker, selectHybridAccount, } from "./rotation.js";
|
|
6
|
+
function nowMs() {
|
|
7
|
+
return Date.now();
|
|
8
|
+
}
|
|
9
|
+
function clampNonNegativeInt(value, fallback) {
|
|
10
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
11
|
+
return fallback;
|
|
12
|
+
}
|
|
13
|
+
return value < 0 ? 0 : Math.floor(value);
|
|
14
|
+
}
|
|
15
|
+
function getQuotaKey(family, model) {
|
|
16
|
+
if (model) {
|
|
17
|
+
return `${family}:${model}`;
|
|
18
|
+
}
|
|
19
|
+
return family;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Extracts the ChatGPT account ID from a JWT access token.
|
|
23
|
+
* @param accessToken - JWT access token from OAuth flow
|
|
24
|
+
* @returns Account ID string or undefined if not found
|
|
25
|
+
*/
|
|
26
|
+
export function extractAccountId(accessToken) {
|
|
27
|
+
if (!accessToken)
|
|
28
|
+
return undefined;
|
|
29
|
+
const decoded = decodeJWT(accessToken);
|
|
30
|
+
const accountId = decoded?.[JWT_CLAIM_PATH]?.chatgpt_account_id;
|
|
31
|
+
return typeof accountId === "string" && accountId.trim() ? accountId : undefined;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Extracts the email address from OAuth tokens.
|
|
35
|
+
* Checks id_token first (where OpenAI puts email), then falls back to access_token.
|
|
36
|
+
*/
|
|
37
|
+
export function extractAccountEmail(accessToken, idToken) {
|
|
38
|
+
// Try id_token first - OpenAI puts email here
|
|
39
|
+
if (idToken) {
|
|
40
|
+
const idDecoded = decodeJWT(idToken);
|
|
41
|
+
const idEmail = idDecoded?.email;
|
|
42
|
+
if (typeof idEmail === "string" && idEmail.includes("@") && idEmail.trim()) {
|
|
43
|
+
return idEmail;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Fall back to access_token
|
|
47
|
+
if (!accessToken)
|
|
48
|
+
return undefined;
|
|
49
|
+
const decoded = decodeJWT(accessToken);
|
|
50
|
+
const nested = decoded?.[JWT_CLAIM_PATH];
|
|
51
|
+
const candidate = nested?.email ??
|
|
52
|
+
nested?.chatgpt_user_email ??
|
|
53
|
+
decoded?.email ??
|
|
54
|
+
decoded?.preferred_username;
|
|
55
|
+
if (typeof candidate === "string" && candidate.includes("@") && candidate.trim()) {
|
|
56
|
+
return candidate;
|
|
57
|
+
}
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Sanitizes an email address by trimming whitespace and lowercasing.
|
|
62
|
+
* @param email - Email string to sanitize
|
|
63
|
+
* @returns Sanitized email or undefined if invalid
|
|
64
|
+
*/
|
|
65
|
+
export function sanitizeEmail(email) {
|
|
66
|
+
if (!email)
|
|
67
|
+
return undefined;
|
|
68
|
+
const trimmed = email.trim();
|
|
69
|
+
if (!trimmed || !trimmed.includes("@"))
|
|
70
|
+
return undefined;
|
|
71
|
+
return trimmed.toLowerCase();
|
|
72
|
+
}
|
|
73
|
+
function clearExpiredRateLimits(account) {
|
|
74
|
+
const now = nowMs();
|
|
75
|
+
const keys = Object.keys(account.rateLimitResetTimes);
|
|
76
|
+
for (const key of keys) {
|
|
77
|
+
const resetTime = account.rateLimitResetTimes[key];
|
|
78
|
+
if (resetTime !== undefined && now >= resetTime) {
|
|
79
|
+
delete account.rateLimitResetTimes[key];
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function isRateLimitedForQuotaKey(account, key) {
|
|
84
|
+
const resetTime = account.rateLimitResetTimes[key];
|
|
85
|
+
return resetTime !== undefined && nowMs() < resetTime;
|
|
86
|
+
}
|
|
87
|
+
function isRateLimitedForFamily(account, family, model) {
|
|
88
|
+
clearExpiredRateLimits(account);
|
|
89
|
+
if (model) {
|
|
90
|
+
const modelKey = getQuotaKey(family, model);
|
|
91
|
+
if (isRateLimitedForQuotaKey(account, modelKey)) {
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const baseKey = getQuotaKey(family);
|
|
96
|
+
return isRateLimitedForQuotaKey(account, baseKey);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Manages multiple OAuth accounts with automatic rotation on rate limits.
|
|
100
|
+
* Tracks per-family active indices, rate limit reset times, and cooldowns.
|
|
101
|
+
*/
|
|
102
|
+
export class AccountManager {
|
|
103
|
+
accounts = [];
|
|
104
|
+
// Per-family cursors for true round-robin rotation
|
|
105
|
+
cursorByFamily = {
|
|
106
|
+
"gpt-5.2-codex": 0,
|
|
107
|
+
"codex-max": 0,
|
|
108
|
+
codex: 0,
|
|
109
|
+
"gpt-5.2": 0,
|
|
110
|
+
"gpt-5.1": 0,
|
|
111
|
+
};
|
|
112
|
+
currentAccountIndexByFamily = {
|
|
113
|
+
"gpt-5.2-codex": -1,
|
|
114
|
+
"codex-max": -1,
|
|
115
|
+
codex: -1,
|
|
116
|
+
"gpt-5.2": -1,
|
|
117
|
+
"gpt-5.1": -1,
|
|
118
|
+
};
|
|
119
|
+
lastToastAccountIndex = -1;
|
|
120
|
+
lastToastTime = 0;
|
|
121
|
+
saveDebounceTimer = null;
|
|
122
|
+
pendingSave = null;
|
|
123
|
+
/**
|
|
124
|
+
* Loads account manager from disk storage with optional auth fallback.
|
|
125
|
+
* @param authFallback - Current OAuth auth to use if storage is empty
|
|
126
|
+
* @returns New AccountManager instance
|
|
127
|
+
*/
|
|
128
|
+
static async loadFromDisk(authFallback) {
|
|
129
|
+
const stored = await loadAccounts();
|
|
130
|
+
return new AccountManager(authFallback, stored);
|
|
131
|
+
}
|
|
132
|
+
hasRefreshToken(refreshToken) {
|
|
133
|
+
return this.accounts.some((account) => account.refreshToken === refreshToken);
|
|
134
|
+
}
|
|
135
|
+
constructor(authFallback, stored) {
|
|
136
|
+
const fallbackAccountId = extractAccountId(authFallback?.access);
|
|
137
|
+
const fallbackAccountEmail = extractAccountEmail(authFallback?.access);
|
|
138
|
+
if (stored && stored.accounts.length > 0) {
|
|
139
|
+
const baseNow = nowMs();
|
|
140
|
+
this.accounts = stored.accounts
|
|
141
|
+
.map((account, index) => {
|
|
142
|
+
if (!account.refreshToken || typeof account.refreshToken !== "string") {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
const matchesFallback = !!authFallback &&
|
|
146
|
+
((fallbackAccountId && account.accountId === fallbackAccountId) ||
|
|
147
|
+
account.refreshToken === authFallback.refresh);
|
|
148
|
+
const refreshToken = matchesFallback && authFallback ? authFallback.refresh : account.refreshToken;
|
|
149
|
+
return {
|
|
150
|
+
index,
|
|
151
|
+
accountId: matchesFallback ? fallbackAccountId ?? account.accountId : account.accountId,
|
|
152
|
+
email: matchesFallback
|
|
153
|
+
? sanitizeEmail(fallbackAccountEmail) ?? sanitizeEmail(account.email)
|
|
154
|
+
: sanitizeEmail(account.email),
|
|
155
|
+
refreshToken,
|
|
156
|
+
access: matchesFallback && authFallback ? authFallback.access : undefined,
|
|
157
|
+
expires: matchesFallback && authFallback ? authFallback.expires : undefined,
|
|
158
|
+
addedAt: clampNonNegativeInt(account.addedAt, baseNow),
|
|
159
|
+
lastUsed: clampNonNegativeInt(account.lastUsed, 0),
|
|
160
|
+
lastSwitchReason: account.lastSwitchReason,
|
|
161
|
+
rateLimitResetTimes: account.rateLimitResetTimes ?? {},
|
|
162
|
+
coolingDownUntil: account.coolingDownUntil,
|
|
163
|
+
cooldownReason: account.cooldownReason,
|
|
164
|
+
};
|
|
165
|
+
})
|
|
166
|
+
.filter((account) => account !== null);
|
|
167
|
+
const hasMatchingFallback = !!authFallback &&
|
|
168
|
+
this.accounts.some((account) => account.refreshToken === authFallback.refresh ||
|
|
169
|
+
(fallbackAccountId && account.accountId === fallbackAccountId));
|
|
170
|
+
if (authFallback && !hasMatchingFallback) {
|
|
171
|
+
const now = nowMs();
|
|
172
|
+
this.accounts.push({
|
|
173
|
+
index: this.accounts.length,
|
|
174
|
+
accountId: fallbackAccountId,
|
|
175
|
+
email: sanitizeEmail(fallbackAccountEmail),
|
|
176
|
+
refreshToken: authFallback.refresh,
|
|
177
|
+
access: authFallback.access,
|
|
178
|
+
expires: authFallback.expires,
|
|
179
|
+
addedAt: now,
|
|
180
|
+
lastUsed: now,
|
|
181
|
+
lastSwitchReason: "initial",
|
|
182
|
+
rateLimitResetTimes: {},
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
if (this.accounts.length > 0) {
|
|
186
|
+
const defaultIndex = clampNonNegativeInt(stored.activeIndex, 0) % this.accounts.length;
|
|
187
|
+
for (const family of MODEL_FAMILIES) {
|
|
188
|
+
const rawIndex = stored.activeIndexByFamily?.[family];
|
|
189
|
+
const nextIndex = clampNonNegativeInt(rawIndex, defaultIndex) % this.accounts.length;
|
|
190
|
+
this.currentAccountIndexByFamily[family] = nextIndex;
|
|
191
|
+
this.cursorByFamily[family] = nextIndex;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
if (authFallback) {
|
|
197
|
+
const now = nowMs();
|
|
198
|
+
this.accounts = [
|
|
199
|
+
{
|
|
200
|
+
index: 0,
|
|
201
|
+
accountId: fallbackAccountId,
|
|
202
|
+
email: sanitizeEmail(fallbackAccountEmail),
|
|
203
|
+
refreshToken: authFallback.refresh,
|
|
204
|
+
access: authFallback.access,
|
|
205
|
+
expires: authFallback.expires,
|
|
206
|
+
addedAt: now,
|
|
207
|
+
lastUsed: 0,
|
|
208
|
+
lastSwitchReason: "initial",
|
|
209
|
+
rateLimitResetTimes: {},
|
|
210
|
+
},
|
|
211
|
+
];
|
|
212
|
+
for (const family of MODEL_FAMILIES) {
|
|
213
|
+
this.currentAccountIndexByFamily[family] = 0;
|
|
214
|
+
this.cursorByFamily[family] = 0;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
getAccountCount() {
|
|
219
|
+
return this.accounts.length;
|
|
220
|
+
}
|
|
221
|
+
getActiveIndex() {
|
|
222
|
+
return this.getActiveIndexForFamily("codex");
|
|
223
|
+
}
|
|
224
|
+
getActiveIndexForFamily(family) {
|
|
225
|
+
const index = this.currentAccountIndexByFamily[family];
|
|
226
|
+
if (index < 0 || index >= this.accounts.length) {
|
|
227
|
+
return this.accounts.length > 0 ? 0 : -1;
|
|
228
|
+
}
|
|
229
|
+
return index;
|
|
230
|
+
}
|
|
231
|
+
getAccountsSnapshot() {
|
|
232
|
+
return this.accounts.map((account) => ({
|
|
233
|
+
...account,
|
|
234
|
+
rateLimitResetTimes: { ...account.rateLimitResetTimes },
|
|
235
|
+
}));
|
|
236
|
+
}
|
|
237
|
+
setActiveIndex(index) {
|
|
238
|
+
if (!Number.isFinite(index))
|
|
239
|
+
return null;
|
|
240
|
+
if (index < 0 || index >= this.accounts.length)
|
|
241
|
+
return null;
|
|
242
|
+
const account = this.accounts[index];
|
|
243
|
+
if (!account)
|
|
244
|
+
return null;
|
|
245
|
+
for (const family of MODEL_FAMILIES) {
|
|
246
|
+
this.currentAccountIndexByFamily[family] = index;
|
|
247
|
+
this.cursorByFamily[family] = index;
|
|
248
|
+
}
|
|
249
|
+
account.lastUsed = nowMs();
|
|
250
|
+
account.lastSwitchReason = "rotation";
|
|
251
|
+
return account;
|
|
252
|
+
}
|
|
253
|
+
getCurrentAccount() {
|
|
254
|
+
return this.getCurrentAccountForFamily("codex");
|
|
255
|
+
}
|
|
256
|
+
getCurrentAccountForFamily(family) {
|
|
257
|
+
const index = this.currentAccountIndexByFamily[family];
|
|
258
|
+
if (index < 0 || index >= this.accounts.length) {
|
|
259
|
+
return null;
|
|
260
|
+
}
|
|
261
|
+
return this.accounts[index] ?? null;
|
|
262
|
+
}
|
|
263
|
+
getCurrentOrNext() {
|
|
264
|
+
return this.getCurrentOrNextForFamily("codex");
|
|
265
|
+
}
|
|
266
|
+
getCurrentOrNextForFamily(family, model) {
|
|
267
|
+
const count = this.accounts.length;
|
|
268
|
+
if (count === 0)
|
|
269
|
+
return null;
|
|
270
|
+
// True round-robin: always advance cursor and pick next available account
|
|
271
|
+
const cursor = this.cursorByFamily[family];
|
|
272
|
+
for (let i = 0; i < count; i++) {
|
|
273
|
+
const idx = (cursor + i) % count;
|
|
274
|
+
const account = this.accounts[idx];
|
|
275
|
+
if (!account)
|
|
276
|
+
continue;
|
|
277
|
+
clearExpiredRateLimits(account);
|
|
278
|
+
if (isRateLimitedForFamily(account, family, model) || this.isAccountCoolingDown(account)) {
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
// Found available account - advance cursor for next request
|
|
282
|
+
this.cursorByFamily[family] = (idx + 1) % count;
|
|
283
|
+
this.currentAccountIndexByFamily[family] = idx;
|
|
284
|
+
account.lastUsed = nowMs();
|
|
285
|
+
return account;
|
|
286
|
+
}
|
|
287
|
+
// All accounts blocked
|
|
288
|
+
return null;
|
|
289
|
+
}
|
|
290
|
+
getNextForFamily(family, model) {
|
|
291
|
+
const count = this.accounts.length;
|
|
292
|
+
if (count === 0)
|
|
293
|
+
return null;
|
|
294
|
+
const cursor = this.cursorByFamily[family];
|
|
295
|
+
for (let i = 0; i < count; i++) {
|
|
296
|
+
const idx = (cursor + i) % count;
|
|
297
|
+
const account = this.accounts[idx];
|
|
298
|
+
if (!account)
|
|
299
|
+
continue;
|
|
300
|
+
clearExpiredRateLimits(account);
|
|
301
|
+
if (isRateLimitedForFamily(account, family, model) || this.isAccountCoolingDown(account)) {
|
|
302
|
+
continue;
|
|
303
|
+
}
|
|
304
|
+
this.cursorByFamily[family] = (idx + 1) % count;
|
|
305
|
+
account.lastUsed = nowMs();
|
|
306
|
+
return account;
|
|
307
|
+
}
|
|
308
|
+
return null;
|
|
309
|
+
}
|
|
310
|
+
getCurrentOrNextForFamilyHybrid(family, model) {
|
|
311
|
+
const count = this.accounts.length;
|
|
312
|
+
if (count === 0)
|
|
313
|
+
return null;
|
|
314
|
+
const quotaKey = model ? `${family}:${model}` : family;
|
|
315
|
+
const healthTracker = getHealthTracker();
|
|
316
|
+
const tokenTracker = getTokenTracker();
|
|
317
|
+
const accountsWithMetrics = this.accounts
|
|
318
|
+
.map((account) => {
|
|
319
|
+
if (!account)
|
|
320
|
+
return null;
|
|
321
|
+
clearExpiredRateLimits(account);
|
|
322
|
+
const isAvailable = !isRateLimitedForFamily(account, family, model) && !this.isAccountCoolingDown(account);
|
|
323
|
+
return {
|
|
324
|
+
index: account.index,
|
|
325
|
+
isAvailable,
|
|
326
|
+
lastUsed: account.lastUsed,
|
|
327
|
+
};
|
|
328
|
+
})
|
|
329
|
+
.filter((a) => a !== null);
|
|
330
|
+
const selected = selectHybridAccount(accountsWithMetrics, healthTracker, tokenTracker, quotaKey);
|
|
331
|
+
if (!selected)
|
|
332
|
+
return null;
|
|
333
|
+
const account = this.accounts[selected.index];
|
|
334
|
+
if (!account)
|
|
335
|
+
return null;
|
|
336
|
+
this.currentAccountIndexByFamily[family] = account.index;
|
|
337
|
+
this.cursorByFamily[family] = (account.index + 1) % count;
|
|
338
|
+
account.lastUsed = nowMs();
|
|
339
|
+
return account;
|
|
340
|
+
}
|
|
341
|
+
recordSuccess(account, family, model) {
|
|
342
|
+
const quotaKey = model ? `${family}:${model}` : family;
|
|
343
|
+
const healthTracker = getHealthTracker();
|
|
344
|
+
healthTracker.recordSuccess(account.index, quotaKey);
|
|
345
|
+
}
|
|
346
|
+
recordRateLimit(account, family, model) {
|
|
347
|
+
const quotaKey = model ? `${family}:${model}` : family;
|
|
348
|
+
const healthTracker = getHealthTracker();
|
|
349
|
+
const tokenTracker = getTokenTracker();
|
|
350
|
+
healthTracker.recordRateLimit(account.index, quotaKey);
|
|
351
|
+
tokenTracker.drain(account.index, quotaKey);
|
|
352
|
+
}
|
|
353
|
+
recordFailure(account, family, model) {
|
|
354
|
+
const quotaKey = model ? `${family}:${model}` : family;
|
|
355
|
+
const healthTracker = getHealthTracker();
|
|
356
|
+
healthTracker.recordFailure(account.index, quotaKey);
|
|
357
|
+
}
|
|
358
|
+
markSwitched(account, reason, family) {
|
|
359
|
+
account.lastSwitchReason = reason;
|
|
360
|
+
this.currentAccountIndexByFamily[family] = account.index;
|
|
361
|
+
}
|
|
362
|
+
markRateLimited(account, retryAfterMs, family, model) {
|
|
363
|
+
this.markRateLimitedWithReason(account, retryAfterMs, family, "unknown", model);
|
|
364
|
+
}
|
|
365
|
+
markRateLimitedWithReason(account, retryAfterMs, family, reason, model) {
|
|
366
|
+
const retryMs = Math.max(0, Math.floor(retryAfterMs));
|
|
367
|
+
const resetAt = nowMs() + retryMs;
|
|
368
|
+
const baseKey = getQuotaKey(family);
|
|
369
|
+
account.rateLimitResetTimes[baseKey] = resetAt;
|
|
370
|
+
if (model) {
|
|
371
|
+
const modelKey = getQuotaKey(family, model);
|
|
372
|
+
account.rateLimitResetTimes[modelKey] = resetAt;
|
|
373
|
+
}
|
|
374
|
+
account.lastRateLimitReason = reason;
|
|
375
|
+
}
|
|
376
|
+
markAccountCoolingDown(account, cooldownMs, reason) {
|
|
377
|
+
const ms = Math.max(0, Math.floor(cooldownMs));
|
|
378
|
+
account.coolingDownUntil = nowMs() + ms;
|
|
379
|
+
account.cooldownReason = reason;
|
|
380
|
+
}
|
|
381
|
+
isAccountCoolingDown(account) {
|
|
382
|
+
if (account.coolingDownUntil === undefined)
|
|
383
|
+
return false;
|
|
384
|
+
if (nowMs() >= account.coolingDownUntil) {
|
|
385
|
+
this.clearAccountCooldown(account);
|
|
386
|
+
return false;
|
|
387
|
+
}
|
|
388
|
+
return true;
|
|
389
|
+
}
|
|
390
|
+
clearAccountCooldown(account) {
|
|
391
|
+
delete account.coolingDownUntil;
|
|
392
|
+
delete account.cooldownReason;
|
|
393
|
+
}
|
|
394
|
+
shouldShowAccountToast(accountIndex, debounceMs = 30000) {
|
|
395
|
+
const now = nowMs();
|
|
396
|
+
if (accountIndex === this.lastToastAccountIndex && now - this.lastToastTime < debounceMs) {
|
|
397
|
+
return false;
|
|
398
|
+
}
|
|
399
|
+
return true;
|
|
400
|
+
}
|
|
401
|
+
markToastShown(accountIndex) {
|
|
402
|
+
this.lastToastAccountIndex = accountIndex;
|
|
403
|
+
this.lastToastTime = nowMs();
|
|
404
|
+
}
|
|
405
|
+
updateFromAuth(account, auth) {
|
|
406
|
+
account.refreshToken = auth.refresh;
|
|
407
|
+
account.access = auth.access;
|
|
408
|
+
account.expires = auth.expires;
|
|
409
|
+
account.accountId = extractAccountId(auth.access) ?? account.accountId;
|
|
410
|
+
account.email = sanitizeEmail(extractAccountEmail(auth.access)) ?? account.email;
|
|
411
|
+
}
|
|
412
|
+
toAuthDetails(account) {
|
|
413
|
+
return {
|
|
414
|
+
type: "oauth",
|
|
415
|
+
access: account.access ?? "",
|
|
416
|
+
refresh: account.refreshToken,
|
|
417
|
+
expires: account.expires ?? 0,
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
getMinWaitTime() {
|
|
421
|
+
return this.getMinWaitTimeForFamily("codex");
|
|
422
|
+
}
|
|
423
|
+
getMinWaitTimeForFamily(family, model) {
|
|
424
|
+
const now = nowMs();
|
|
425
|
+
const available = this.accounts.filter((account) => {
|
|
426
|
+
clearExpiredRateLimits(account);
|
|
427
|
+
return !isRateLimitedForFamily(account, family, model) && !this.isAccountCoolingDown(account);
|
|
428
|
+
});
|
|
429
|
+
if (available.length > 0)
|
|
430
|
+
return 0;
|
|
431
|
+
const waitTimes = [];
|
|
432
|
+
const baseKey = getQuotaKey(family);
|
|
433
|
+
const modelKey = model ? getQuotaKey(family, model) : null;
|
|
434
|
+
for (const account of this.accounts) {
|
|
435
|
+
const baseResetAt = account.rateLimitResetTimes[baseKey];
|
|
436
|
+
if (typeof baseResetAt === "number") {
|
|
437
|
+
waitTimes.push(Math.max(0, baseResetAt - now));
|
|
438
|
+
}
|
|
439
|
+
if (modelKey) {
|
|
440
|
+
const modelResetAt = account.rateLimitResetTimes[modelKey];
|
|
441
|
+
if (typeof modelResetAt === "number") {
|
|
442
|
+
waitTimes.push(Math.max(0, modelResetAt - now));
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
if (typeof account.coolingDownUntil === "number") {
|
|
446
|
+
waitTimes.push(Math.max(0, account.coolingDownUntil - now));
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
return waitTimes.length > 0 ? Math.min(...waitTimes) : 0;
|
|
450
|
+
}
|
|
451
|
+
removeAccount(account) {
|
|
452
|
+
const idx = this.accounts.indexOf(account);
|
|
453
|
+
if (idx < 0) {
|
|
454
|
+
return false;
|
|
455
|
+
}
|
|
456
|
+
this.accounts.splice(idx, 1);
|
|
457
|
+
this.accounts.forEach((acc, index) => {
|
|
458
|
+
acc.index = index;
|
|
459
|
+
});
|
|
460
|
+
if (this.accounts.length === 0) {
|
|
461
|
+
for (const family of MODEL_FAMILIES) {
|
|
462
|
+
this.cursorByFamily[family] = 0;
|
|
463
|
+
this.currentAccountIndexByFamily[family] = -1;
|
|
464
|
+
}
|
|
465
|
+
return true;
|
|
466
|
+
}
|
|
467
|
+
const cursor = this.cursorByFamily["codex"];
|
|
468
|
+
if (cursor > idx) {
|
|
469
|
+
for (const family of MODEL_FAMILIES) {
|
|
470
|
+
this.cursorByFamily[family] = Math.max(0, this.cursorByFamily[family] - 1);
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
for (const family of MODEL_FAMILIES) {
|
|
474
|
+
this.cursorByFamily[family] = this.cursorByFamily[family] % this.accounts.length;
|
|
475
|
+
}
|
|
476
|
+
for (const family of MODEL_FAMILIES) {
|
|
477
|
+
if (this.currentAccountIndexByFamily[family] > idx) {
|
|
478
|
+
this.currentAccountIndexByFamily[family] -= 1;
|
|
479
|
+
}
|
|
480
|
+
if (this.currentAccountIndexByFamily[family] >= this.accounts.length) {
|
|
481
|
+
this.currentAccountIndexByFamily[family] = -1;
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
return true;
|
|
485
|
+
}
|
|
486
|
+
async saveToDisk() {
|
|
487
|
+
const activeIndexByFamily = {};
|
|
488
|
+
for (const family of MODEL_FAMILIES) {
|
|
489
|
+
const raw = this.currentAccountIndexByFamily[family];
|
|
490
|
+
activeIndexByFamily[family] = clampNonNegativeInt(raw, 0);
|
|
491
|
+
}
|
|
492
|
+
const activeIndex = clampNonNegativeInt(activeIndexByFamily.codex, 0);
|
|
493
|
+
const storage = {
|
|
494
|
+
version: 3,
|
|
495
|
+
accounts: this.accounts.map((account) => ({
|
|
496
|
+
accountId: account.accountId,
|
|
497
|
+
email: account.email,
|
|
498
|
+
refreshToken: account.refreshToken,
|
|
499
|
+
addedAt: account.addedAt,
|
|
500
|
+
lastUsed: account.lastUsed,
|
|
501
|
+
lastSwitchReason: account.lastSwitchReason,
|
|
502
|
+
rateLimitResetTimes: Object.keys(account.rateLimitResetTimes).length > 0 ? account.rateLimitResetTimes : undefined,
|
|
503
|
+
coolingDownUntil: account.coolingDownUntil,
|
|
504
|
+
cooldownReason: account.cooldownReason,
|
|
505
|
+
})),
|
|
506
|
+
activeIndex,
|
|
507
|
+
activeIndexByFamily,
|
|
508
|
+
};
|
|
509
|
+
await saveAccounts(storage);
|
|
510
|
+
}
|
|
511
|
+
saveToDiskDebounced(delayMs = 500) {
|
|
512
|
+
if (this.saveDebounceTimer) {
|
|
513
|
+
clearTimeout(this.saveDebounceTimer);
|
|
514
|
+
}
|
|
515
|
+
this.saveDebounceTimer = setTimeout(() => {
|
|
516
|
+
this.saveDebounceTimer = null;
|
|
517
|
+
this.pendingSave = this.saveToDisk().finally(() => {
|
|
518
|
+
this.pendingSave = null;
|
|
519
|
+
});
|
|
520
|
+
}, delayMs);
|
|
521
|
+
}
|
|
522
|
+
async flushPendingSave() {
|
|
523
|
+
if (this.saveDebounceTimer) {
|
|
524
|
+
clearTimeout(this.saveDebounceTimer);
|
|
525
|
+
this.saveDebounceTimer = null;
|
|
526
|
+
await this.saveToDisk();
|
|
527
|
+
}
|
|
528
|
+
if (this.pendingSave) {
|
|
529
|
+
await this.pendingSave;
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
/**
|
|
534
|
+
* Formats a human-readable label for an account (e.g., "Account 1 (user@email.com)").
|
|
535
|
+
* @param account - Account with optional email and accountId
|
|
536
|
+
* @param index - Zero-based account index
|
|
537
|
+
* @returns Formatted label string
|
|
538
|
+
*/
|
|
539
|
+
export function formatAccountLabel(account, index) {
|
|
540
|
+
const email = account?.email?.trim();
|
|
541
|
+
const accountId = account?.accountId?.trim();
|
|
542
|
+
const idSuffix = accountId ? (accountId.length > 6 ? accountId.slice(-6) : accountId) : null;
|
|
543
|
+
if (email && idSuffix)
|
|
544
|
+
return `Account ${index + 1} (${email}, id:${idSuffix})`;
|
|
545
|
+
if (email)
|
|
546
|
+
return `Account ${index + 1} (${email})`;
|
|
547
|
+
if (idSuffix)
|
|
548
|
+
return `Account ${index + 1} (${idSuffix})`;
|
|
549
|
+
return `Account ${index + 1}`;
|
|
550
|
+
}
|
|
551
|
+
/**
|
|
552
|
+
* Formats milliseconds as a human-readable wait time (e.g., "2m 30s").
|
|
553
|
+
* @param ms - Duration in milliseconds
|
|
554
|
+
* @returns Formatted string like "2m 30s" or "45s"
|
|
555
|
+
*/
|
|
556
|
+
export function formatWaitTime(ms) {
|
|
557
|
+
const totalSeconds = Math.max(0, Math.floor(ms / 1000));
|
|
558
|
+
const minutes = Math.floor(totalSeconds / 60);
|
|
559
|
+
const seconds = totalSeconds % 60;
|
|
560
|
+
if (minutes > 0)
|
|
561
|
+
return `${minutes}m ${seconds}s`;
|
|
562
|
+
return `${seconds}s`;
|
|
563
|
+
}
|
|
564
|
+
/**
|
|
565
|
+
* Formats cooldown status for an account if currently cooling down.
|
|
566
|
+
* @param account - Account with optional cooldown state
|
|
567
|
+
* @param now - Current timestamp (defaults to Date.now())
|
|
568
|
+
* @returns Formatted cooldown string or null if not cooling down
|
|
569
|
+
*/
|
|
570
|
+
export function formatCooldown(account, now = nowMs()) {
|
|
571
|
+
if (typeof account.coolingDownUntil !== "number")
|
|
572
|
+
return null;
|
|
573
|
+
const remaining = account.coolingDownUntil - now;
|
|
574
|
+
if (remaining <= 0)
|
|
575
|
+
return null;
|
|
576
|
+
const reason = account.cooldownReason ? ` (${account.cooldownReason})` : "";
|
|
577
|
+
return `${formatWaitTime(remaining)}${reason}`;
|
|
578
|
+
}
|
|
579
|
+
//# sourceMappingURL=accounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../lib/accounts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { AuthorizationFlow, TokenResult, ParsedAuthInput, JWTPayload } from "../types.js";
|
|
2
|
+
export declare const CLIENT_ID = "app_EMoamEEZ73f0CkXaXp7hrann";
|
|
3
|
+
export declare const AUTHORIZE_URL = "https://auth.openai.com/oauth/authorize";
|
|
4
|
+
export declare const TOKEN_URL = "https://auth.openai.com/oauth/token";
|
|
5
|
+
export declare const REDIRECT_URI = "http://localhost:1455/auth/callback";
|
|
6
|
+
export declare const SCOPE = "openid profile email offline_access";
|
|
7
|
+
/**
|
|
8
|
+
* Generate a random state value for OAuth flow
|
|
9
|
+
* @returns Random hex string
|
|
10
|
+
*/
|
|
11
|
+
export declare function createState(): string;
|
|
12
|
+
/**
|
|
13
|
+
* Parse authorization code and state from user input
|
|
14
|
+
* @param input - User input (URL, code#state, or just code)
|
|
15
|
+
* @returns Parsed authorization data
|
|
16
|
+
*/
|
|
17
|
+
export declare function parseAuthorizationInput(input: string): ParsedAuthInput;
|
|
18
|
+
/**
|
|
19
|
+
* Exchange authorization code for access and refresh tokens
|
|
20
|
+
* @param code - Authorization code from OAuth flow
|
|
21
|
+
* @param verifier - PKCE verifier
|
|
22
|
+
* @param redirectUri - OAuth redirect URI
|
|
23
|
+
* @returns Token result
|
|
24
|
+
*/
|
|
25
|
+
export declare function exchangeAuthorizationCode(code: string, verifier: string, redirectUri?: string): Promise<TokenResult>;
|
|
26
|
+
/**
|
|
27
|
+
* Decode a JWT token to extract payload
|
|
28
|
+
* @param token - JWT token to decode
|
|
29
|
+
* @returns Decoded payload or null if invalid
|
|
30
|
+
*/
|
|
31
|
+
export declare function decodeJWT(token: string): JWTPayload | null;
|
|
32
|
+
/**
|
|
33
|
+
* Refresh access token using refresh token
|
|
34
|
+
* @param refreshToken - Refresh token
|
|
35
|
+
* @returns Token result
|
|
36
|
+
*/
|
|
37
|
+
export declare function refreshAccessToken(refreshToken: string): Promise<TokenResult>;
|
|
38
|
+
export interface AuthorizationFlowOptions {
|
|
39
|
+
/**
|
|
40
|
+
* Force a fresh login screen instead of using cached browser session.
|
|
41
|
+
* Use when adding multiple accounts to ensure different credentials.
|
|
42
|
+
*/
|
|
43
|
+
forceNewLogin?: boolean;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Create OAuth authorization flow
|
|
47
|
+
* @param options - Optional configuration for the flow
|
|
48
|
+
* @returns Authorization flow details
|
|
49
|
+
*/
|
|
50
|
+
export declare function createAuthorizationFlow(options?: AuthorizationFlowOptions): Promise<AuthorizationFlow>;
|
|
51
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../lib/auth/auth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAY,iBAAiB,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzG,eAAO,MAAM,SAAS,iCAAiC,CAAC;AACxD,eAAO,MAAM,aAAa,4CAA4C,CAAC;AACvE,eAAO,MAAM,SAAS,wCAAwC,CAAC;AAC/D,eAAO,MAAM,YAAY,wCAAwC,CAAC;AAClE,eAAO,MAAM,KAAK,wCAAwC,CAAC;AAE3D;;;GAGG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CA0BtE;AAED;;;;;;GAMG;AACH,wBAAsB,yBAAyB,CAC9C,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,MAAqB,GAChC,OAAO,CAAC,WAAW,CAAC,CAuCtB;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAe1D;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAuDnF;AAED,MAAM,WAAW,wBAAwB;IACxC;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,CAAC,EAAE,wBAAwB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAuB5G"}
|