opencode-openai-codex-multi-auth 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/LICENSE +37 -0
  2. package/README.md +89 -0
  3. package/assets/openai-codex-auth-config.schema.json +63 -0
  4. package/assets/opencode-logo-ornate-dark.svg +18 -0
  5. package/assets/readme-hero.svg +31 -0
  6. package/config/README.md +103 -0
  7. package/config/minimal-opencode.json +12 -0
  8. package/config/opencode-legacy.json +571 -0
  9. package/config/opencode-modern.json +239 -0
  10. package/dist/index.d.ts +42 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +564 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/lib/accounts.d.ts +58 -0
  15. package/dist/lib/accounts.d.ts.map +1 -0
  16. package/dist/lib/accounts.js +405 -0
  17. package/dist/lib/accounts.js.map +1 -0
  18. package/dist/lib/auth/auth.d.ts +43 -0
  19. package/dist/lib/auth/auth.d.ts.map +1 -0
  20. package/dist/lib/auth/auth.js +163 -0
  21. package/dist/lib/auth/auth.js.map +1 -0
  22. package/dist/lib/auth/browser.d.ts +17 -0
  23. package/dist/lib/auth/browser.d.ts.map +1 -0
  24. package/dist/lib/auth/browser.js +76 -0
  25. package/dist/lib/auth/browser.js.map +1 -0
  26. package/dist/lib/auth/server.d.ts +10 -0
  27. package/dist/lib/auth/server.d.ts.map +1 -0
  28. package/dist/lib/auth/server.js +78 -0
  29. package/dist/lib/auth/server.js.map +1 -0
  30. package/dist/lib/cli.d.ts +8 -0
  31. package/dist/lib/cli.d.ts.map +1 -0
  32. package/dist/lib/cli.js +36 -0
  33. package/dist/lib/cli.js.map +1 -0
  34. package/dist/lib/config.d.ts +25 -0
  35. package/dist/lib/config.d.ts.map +1 -0
  36. package/dist/lib/config.js +112 -0
  37. package/dist/lib/config.js.map +1 -0
  38. package/dist/lib/constants.d.ts +67 -0
  39. package/dist/lib/constants.d.ts.map +1 -0
  40. package/dist/lib/constants.js +67 -0
  41. package/dist/lib/constants.js.map +1 -0
  42. package/dist/lib/logger.d.ts +21 -0
  43. package/dist/lib/logger.d.ts.map +1 -0
  44. package/dist/lib/logger.js +77 -0
  45. package/dist/lib/logger.js.map +1 -0
  46. package/dist/lib/oauth-success.html +712 -0
  47. package/dist/lib/prompts/codex-opencode-bridge.d.ts +19 -0
  48. package/dist/lib/prompts/codex-opencode-bridge.d.ts.map +1 -0
  49. package/dist/lib/prompts/codex-opencode-bridge.js +152 -0
  50. package/dist/lib/prompts/codex-opencode-bridge.js.map +1 -0
  51. package/dist/lib/prompts/codex.d.ts +28 -0
  52. package/dist/lib/prompts/codex.d.ts.map +1 -0
  53. package/dist/lib/prompts/codex.js +248 -0
  54. package/dist/lib/prompts/codex.js.map +1 -0
  55. package/dist/lib/prompts/opencode-codex.d.ts +21 -0
  56. package/dist/lib/prompts/opencode-codex.d.ts.map +1 -0
  57. package/dist/lib/prompts/opencode-codex.js +91 -0
  58. package/dist/lib/prompts/opencode-codex.js.map +1 -0
  59. package/dist/lib/request/fetch-helpers.d.ts +73 -0
  60. package/dist/lib/request/fetch-helpers.d.ts.map +1 -0
  61. package/dist/lib/request/fetch-helpers.js +221 -0
  62. package/dist/lib/request/fetch-helpers.js.map +1 -0
  63. package/dist/lib/request/helpers/input-utils.d.ts +6 -0
  64. package/dist/lib/request/helpers/input-utils.d.ts.map +1 -0
  65. package/dist/lib/request/helpers/input-utils.js +174 -0
  66. package/dist/lib/request/helpers/input-utils.js.map +1 -0
  67. package/dist/lib/request/helpers/model-map.d.ts +28 -0
  68. package/dist/lib/request/helpers/model-map.d.ts.map +1 -0
  69. package/dist/lib/request/helpers/model-map.js +109 -0
  70. package/dist/lib/request/helpers/model-map.js.map +1 -0
  71. package/dist/lib/request/request-transformer.d.ts +93 -0
  72. package/dist/lib/request/request-transformer.d.ts.map +1 -0
  73. package/dist/lib/request/request-transformer.js +403 -0
  74. package/dist/lib/request/request-transformer.js.map +1 -0
  75. package/dist/lib/request/response-handler.d.ts +14 -0
  76. package/dist/lib/request/response-handler.d.ts.map +1 -0
  77. package/dist/lib/request/response-handler.js +88 -0
  78. package/dist/lib/request/response-handler.js.map +1 -0
  79. package/dist/lib/storage.d.ts +5 -0
  80. package/dist/lib/storage.d.ts.map +1 -0
  81. package/dist/lib/storage.js +46 -0
  82. package/dist/lib/storage.js.map +1 -0
  83. package/dist/lib/types.d.ts +236 -0
  84. package/dist/lib/types.d.ts.map +1 -0
  85. package/dist/lib/types.js +2 -0
  86. package/dist/lib/types.js.map +1 -0
  87. package/package.json +77 -0
  88. package/scripts/install-opencode-codex-auth.js +450 -0
  89. package/scripts/test-all-models.sh +259 -0
  90. package/scripts/validate-model-map.sh +97 -0
@@ -0,0 +1,58 @@
1
+ import type { Auth } from "@opencode-ai/sdk";
2
+ import type { AccountSelectionStrategy, AccountStorageV3, CooldownReason, OAuthAuthDetails, RateLimitStateV3 } from "./types.js";
3
+ import { type ModelFamily } from "./prompts/codex.js";
4
+ export type BaseQuotaKey = ModelFamily;
5
+ export type QuotaKey = BaseQuotaKey | `${BaseQuotaKey}:${string}`;
6
+ export declare function extractAccountId(accessToken?: string): string | undefined;
7
+ export declare function extractAccountEmail(accessToken?: string): string | undefined;
8
+ export declare function sanitizeEmail(email: string | undefined): string | undefined;
9
+ export declare function formatAccountLabel(account: {
10
+ email?: string;
11
+ accountId?: string;
12
+ } | undefined, index: number): string;
13
+ export declare function formatWaitTime(ms: number): string;
14
+ export interface ManagedAccount {
15
+ index: number;
16
+ accountId?: string;
17
+ email?: string;
18
+ refreshToken: string;
19
+ access?: string;
20
+ expires?: number;
21
+ addedAt: number;
22
+ lastUsed: number;
23
+ lastSwitchReason?: "rate-limit" | "initial" | "rotation";
24
+ rateLimitResetTimes: RateLimitStateV3;
25
+ coolingDownUntil?: number;
26
+ cooldownReason?: CooldownReason;
27
+ }
28
+ export declare class AccountManager {
29
+ private accounts;
30
+ private cursor;
31
+ private currentAccountIndexByFamily;
32
+ private sessionOffsetApplied;
33
+ private lastToastAccountIndex;
34
+ private lastToastTime;
35
+ static loadFromDisk(authFallback?: OAuthAuthDetails): Promise<AccountManager>;
36
+ constructor(authFallback?: OAuthAuthDetails, stored?: AccountStorageV3 | null);
37
+ getAccountCount(): number;
38
+ getAccountsSnapshot(): ManagedAccount[];
39
+ getActiveIndexForFamily(family: ModelFamily): number;
40
+ setActiveIndex(index: number): ManagedAccount | null;
41
+ getCurrentAccountForFamily(family: ModelFamily): ManagedAccount | null;
42
+ private applyPidOffsetOnce;
43
+ getCurrentOrNextForFamily(family: ModelFamily, model: string | null | undefined, strategy?: AccountSelectionStrategy, pidOffsetEnabled?: boolean): ManagedAccount | null;
44
+ getNextForFamily(family: ModelFamily, model?: string | null): ManagedAccount | null;
45
+ markSwitched(account: ManagedAccount, reason: "rate-limit" | "initial" | "rotation", family: ModelFamily): void;
46
+ markRateLimited(account: ManagedAccount, retryAfterMs: number, family: ModelFamily, model?: string | null): void;
47
+ markAccountCoolingDown(account: ManagedAccount, cooldownMs: number, reason: CooldownReason): void;
48
+ isAccountCoolingDown(account: ManagedAccount): boolean;
49
+ shouldShowAccountToast(accountIndex: number, debounceMs?: number): boolean;
50
+ markToastShown(accountIndex: number): void;
51
+ updateFromAuth(account: ManagedAccount, auth: OAuthAuthDetails): void;
52
+ toAuthDetails(account: ManagedAccount): OAuthAuthDetails;
53
+ hydrateMissingEmails(): Promise<void>;
54
+ getMinWaitTimeForFamily(family: ModelFamily, model?: string | null): number;
55
+ saveToDisk(): Promise<void>;
56
+ }
57
+ export declare function isOAuthAuth(auth: Auth): auth is OAuthAuthDetails;
58
+ //# sourceMappingURL=accounts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../lib/accounts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,405 @@
1
+ import { decodeJWT, refreshAccessToken } 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
+ function nowMs() {
6
+ return Date.now();
7
+ }
8
+ function clampNonNegativeInt(value, fallback) {
9
+ if (typeof value !== "number" || !Number.isFinite(value))
10
+ return fallback;
11
+ return value < 0 ? 0 : Math.floor(value);
12
+ }
13
+ function getQuotaKey(family, model) {
14
+ if (model)
15
+ return `${family}:${model}`;
16
+ return family;
17
+ }
18
+ export function extractAccountId(accessToken) {
19
+ if (!accessToken)
20
+ return undefined;
21
+ const decoded = decodeJWT(accessToken);
22
+ const nested = decoded?.[JWT_CLAIM_PATH];
23
+ const accountId = nested?.chatgpt_account_id;
24
+ return typeof accountId === "string" && accountId.trim() ? accountId : undefined;
25
+ }
26
+ export function extractAccountEmail(accessToken) {
27
+ if (!accessToken)
28
+ return undefined;
29
+ const decoded = decodeJWT(accessToken);
30
+ const nested = decoded?.[JWT_CLAIM_PATH];
31
+ const candidate = nested?.email ??
32
+ nested?.chatgpt_user_email ??
33
+ decoded?.email ??
34
+ decoded?.preferred_username;
35
+ if (typeof candidate === "string" && candidate.includes("@") && candidate.trim()) {
36
+ return candidate;
37
+ }
38
+ return undefined;
39
+ }
40
+ export function sanitizeEmail(email) {
41
+ if (!email)
42
+ return undefined;
43
+ const trimmed = email.trim();
44
+ if (!trimmed || !trimmed.includes("@"))
45
+ return undefined;
46
+ return trimmed.toLowerCase();
47
+ }
48
+ export function formatAccountLabel(account, index) {
49
+ const email = account?.email?.trim();
50
+ const accountId = account?.accountId?.trim();
51
+ const idSuffix = accountId
52
+ ? accountId.length > 6
53
+ ? accountId.slice(-6)
54
+ : accountId
55
+ : null;
56
+ if (email && idSuffix)
57
+ return `Account ${index + 1} (${email}, id:${idSuffix})`;
58
+ if (email)
59
+ return `Account ${index + 1} (${email})`;
60
+ if (idSuffix)
61
+ return `Account ${index + 1} (${idSuffix})`;
62
+ return `Account ${index + 1}`;
63
+ }
64
+ export function formatWaitTime(ms) {
65
+ const totalSeconds = Math.max(0, Math.floor(ms / 1000));
66
+ const minutes = Math.floor(totalSeconds / 60);
67
+ const seconds = totalSeconds % 60;
68
+ if (minutes > 0)
69
+ return `${minutes}m ${seconds}s`;
70
+ return `${seconds}s`;
71
+ }
72
+ function clearExpiredRateLimits(account) {
73
+ const now = nowMs();
74
+ for (const key of Object.keys(account.rateLimitResetTimes)) {
75
+ const reset = account.rateLimitResetTimes[key];
76
+ if (reset !== undefined && now >= reset)
77
+ delete account.rateLimitResetTimes[key];
78
+ }
79
+ }
80
+ function isRateLimitedForQuotaKey(account, key) {
81
+ const reset = account.rateLimitResetTimes[key];
82
+ return reset !== undefined && nowMs() < reset;
83
+ }
84
+ function isRateLimitedForFamily(account, family, model) {
85
+ clearExpiredRateLimits(account);
86
+ if (model) {
87
+ const modelKey = getQuotaKey(family, model);
88
+ if (isRateLimitedForQuotaKey(account, modelKey))
89
+ return true;
90
+ }
91
+ const baseKey = getQuotaKey(family);
92
+ return isRateLimitedForQuotaKey(account, baseKey);
93
+ }
94
+ export class AccountManager {
95
+ accounts = [];
96
+ cursor = 0;
97
+ currentAccountIndexByFamily = {
98
+ "gpt-5.2-codex": -1,
99
+ "codex-max": -1,
100
+ codex: -1,
101
+ "gpt-5.2": -1,
102
+ "gpt-5.1": -1,
103
+ };
104
+ sessionOffsetApplied = {
105
+ "gpt-5.2-codex": false,
106
+ "codex-max": false,
107
+ codex: false,
108
+ "gpt-5.2": false,
109
+ "gpt-5.1": false,
110
+ };
111
+ lastToastAccountIndex = -1;
112
+ lastToastTime = 0;
113
+ static async loadFromDisk(authFallback) {
114
+ const stored = await loadAccounts();
115
+ return new AccountManager(authFallback, stored);
116
+ }
117
+ constructor(authFallback, stored) {
118
+ const fallbackAccountId = extractAccountId(authFallback?.access);
119
+ const fallbackEmail = sanitizeEmail(extractAccountEmail(authFallback?.access));
120
+ if (stored && stored.accounts.length > 0) {
121
+ const baseNow = nowMs();
122
+ this.accounts = stored.accounts
123
+ .map((record, index) => {
124
+ if (!record?.refreshToken)
125
+ return null;
126
+ const matchesFallback = !!authFallback &&
127
+ ((fallbackAccountId && record.accountId === fallbackAccountId) ||
128
+ record.refreshToken === authFallback.refresh);
129
+ return {
130
+ index,
131
+ accountId: matchesFallback ? fallbackAccountId ?? record.accountId : record.accountId,
132
+ email: matchesFallback ? fallbackEmail ?? record.email : sanitizeEmail(record.email),
133
+ refreshToken: matchesFallback && authFallback ? authFallback.refresh : record.refreshToken,
134
+ access: matchesFallback && authFallback ? authFallback.access : undefined,
135
+ expires: matchesFallback && authFallback ? authFallback.expires : undefined,
136
+ addedAt: clampNonNegativeInt(record.addedAt, baseNow),
137
+ lastUsed: clampNonNegativeInt(record.lastUsed, 0),
138
+ lastSwitchReason: record.lastSwitchReason,
139
+ rateLimitResetTimes: record.rateLimitResetTimes ?? {},
140
+ coolingDownUntil: record.coolingDownUntil,
141
+ cooldownReason: record.cooldownReason,
142
+ };
143
+ })
144
+ .filter((a) => a !== null);
145
+ const hasMatchingFallback = !!authFallback &&
146
+ this.accounts.some((a) => a.refreshToken === authFallback.refresh ||
147
+ (fallbackAccountId && a.accountId === fallbackAccountId));
148
+ if (authFallback && !hasMatchingFallback) {
149
+ const now = nowMs();
150
+ this.accounts.push({
151
+ index: this.accounts.length,
152
+ accountId: fallbackAccountId,
153
+ email: fallbackEmail,
154
+ refreshToken: authFallback.refresh,
155
+ access: authFallback.access,
156
+ expires: authFallback.expires,
157
+ addedAt: now,
158
+ lastUsed: now,
159
+ lastSwitchReason: "initial",
160
+ rateLimitResetTimes: {},
161
+ });
162
+ }
163
+ if (this.accounts.length > 0) {
164
+ const defaultIndex = clampNonNegativeInt(stored.activeIndex, 0) % this.accounts.length;
165
+ this.cursor = defaultIndex;
166
+ for (const family of MODEL_FAMILIES) {
167
+ const raw = stored.activeIndexByFamily?.[family];
168
+ this.currentAccountIndexByFamily[family] =
169
+ clampNonNegativeInt(raw, defaultIndex) % this.accounts.length;
170
+ }
171
+ }
172
+ return;
173
+ }
174
+ if (authFallback) {
175
+ const now = nowMs();
176
+ this.accounts = [
177
+ {
178
+ index: 0,
179
+ accountId: fallbackAccountId,
180
+ email: fallbackEmail,
181
+ refreshToken: authFallback.refresh,
182
+ access: authFallback.access,
183
+ expires: authFallback.expires,
184
+ addedAt: now,
185
+ lastUsed: 0,
186
+ lastSwitchReason: "initial",
187
+ rateLimitResetTimes: {},
188
+ },
189
+ ];
190
+ this.cursor = 0;
191
+ for (const family of MODEL_FAMILIES) {
192
+ this.currentAccountIndexByFamily[family] = 0;
193
+ }
194
+ }
195
+ }
196
+ getAccountCount() {
197
+ return this.accounts.length;
198
+ }
199
+ getAccountsSnapshot() {
200
+ return this.accounts.map((a) => ({ ...a, rateLimitResetTimes: { ...a.rateLimitResetTimes } }));
201
+ }
202
+ getActiveIndexForFamily(family) {
203
+ const idx = this.currentAccountIndexByFamily[family];
204
+ if (idx < 0 || idx >= this.accounts.length)
205
+ return this.accounts.length > 0 ? 0 : -1;
206
+ return idx;
207
+ }
208
+ setActiveIndex(index) {
209
+ if (!Number.isFinite(index))
210
+ return null;
211
+ if (index < 0 || index >= this.accounts.length)
212
+ return null;
213
+ const account = this.accounts[index];
214
+ if (!account)
215
+ return null;
216
+ for (const family of MODEL_FAMILIES) {
217
+ this.currentAccountIndexByFamily[family] = index;
218
+ this.sessionOffsetApplied[family] = true;
219
+ }
220
+ this.cursor = index;
221
+ account.lastUsed = nowMs();
222
+ account.lastSwitchReason = "rotation";
223
+ return account;
224
+ }
225
+ getCurrentAccountForFamily(family) {
226
+ const idx = this.currentAccountIndexByFamily[family];
227
+ if (idx < 0 || idx >= this.accounts.length)
228
+ return null;
229
+ return this.accounts[idx] ?? null;
230
+ }
231
+ applyPidOffsetOnce(family) {
232
+ if (this.sessionOffsetApplied[family])
233
+ return;
234
+ if (this.accounts.length <= 1) {
235
+ this.sessionOffsetApplied[family] = true;
236
+ return;
237
+ }
238
+ const offset = process.pid % this.accounts.length;
239
+ const baseIndexRaw = this.currentAccountIndexByFamily[family];
240
+ const baseIndex = baseIndexRaw >= 0 ? baseIndexRaw : 0;
241
+ this.currentAccountIndexByFamily[family] = (baseIndex + offset) % this.accounts.length;
242
+ this.cursor = (this.cursor + offset) % this.accounts.length;
243
+ this.sessionOffsetApplied[family] = true;
244
+ }
245
+ getCurrentOrNextForFamily(family, model, strategy = "sticky", pidOffsetEnabled = false) {
246
+ if (pidOffsetEnabled)
247
+ this.applyPidOffsetOnce(family);
248
+ if (strategy === "round-robin") {
249
+ const next = this.getNextForFamily(family, model);
250
+ if (next)
251
+ this.currentAccountIndexByFamily[family] = next.index;
252
+ return next;
253
+ }
254
+ const current = this.getCurrentAccountForFamily(family);
255
+ if (current) {
256
+ clearExpiredRateLimits(current);
257
+ if (!isRateLimitedForFamily(current, family, model) && !this.isAccountCoolingDown(current)) {
258
+ current.lastUsed = nowMs();
259
+ return current;
260
+ }
261
+ }
262
+ const next = this.getNextForFamily(family, model);
263
+ if (next)
264
+ this.currentAccountIndexByFamily[family] = next.index;
265
+ return next;
266
+ }
267
+ getNextForFamily(family, model) {
268
+ const available = this.accounts.filter((a) => {
269
+ clearExpiredRateLimits(a);
270
+ return !isRateLimitedForFamily(a, family, model) && !this.isAccountCoolingDown(a);
271
+ });
272
+ if (available.length === 0)
273
+ return null;
274
+ const account = available[this.cursor % available.length];
275
+ if (!account)
276
+ return null;
277
+ this.cursor += 1;
278
+ account.lastUsed = nowMs();
279
+ return account;
280
+ }
281
+ markSwitched(account, reason, family) {
282
+ account.lastSwitchReason = reason;
283
+ this.currentAccountIndexByFamily[family] = account.index;
284
+ }
285
+ markRateLimited(account, retryAfterMs, family, model) {
286
+ const retryMs = Math.max(0, Math.floor(retryAfterMs));
287
+ const resetAt = nowMs() + retryMs;
288
+ account.rateLimitResetTimes[getQuotaKey(family)] = resetAt;
289
+ if (model)
290
+ account.rateLimitResetTimes[getQuotaKey(family, model)] = resetAt;
291
+ }
292
+ markAccountCoolingDown(account, cooldownMs, reason) {
293
+ const ms = Math.max(0, Math.floor(cooldownMs));
294
+ account.coolingDownUntil = nowMs() + ms;
295
+ account.cooldownReason = reason;
296
+ }
297
+ isAccountCoolingDown(account) {
298
+ if (account.coolingDownUntil === undefined)
299
+ return false;
300
+ if (nowMs() >= account.coolingDownUntil) {
301
+ delete account.coolingDownUntil;
302
+ delete account.cooldownReason;
303
+ return false;
304
+ }
305
+ return true;
306
+ }
307
+ shouldShowAccountToast(accountIndex, debounceMs = 30_000) {
308
+ const now = nowMs();
309
+ if (accountIndex === this.lastToastAccountIndex && now - this.lastToastTime < debounceMs) {
310
+ return false;
311
+ }
312
+ return true;
313
+ }
314
+ markToastShown(accountIndex) {
315
+ this.lastToastAccountIndex = accountIndex;
316
+ this.lastToastTime = nowMs();
317
+ }
318
+ updateFromAuth(account, auth) {
319
+ account.refreshToken = auth.refresh;
320
+ account.access = auth.access;
321
+ account.expires = auth.expires;
322
+ account.accountId = extractAccountId(auth.access) ?? account.accountId;
323
+ account.email = sanitizeEmail(extractAccountEmail(auth.access)) ?? account.email;
324
+ }
325
+ toAuthDetails(account) {
326
+ return {
327
+ type: "oauth",
328
+ access: account.access ?? "",
329
+ refresh: account.refreshToken,
330
+ expires: account.expires ?? 0,
331
+ };
332
+ }
333
+ async hydrateMissingEmails() {
334
+ // Best-effort: refresh tokens to decode emails/accountId.
335
+ for (const account of this.accounts) {
336
+ if (account.email && account.accountId)
337
+ continue;
338
+ try {
339
+ const refreshed = await refreshAccessToken(account.refreshToken);
340
+ if (refreshed.type !== "success")
341
+ continue;
342
+ account.accountId = extractAccountId(refreshed.access) ?? account.accountId;
343
+ account.email = sanitizeEmail(extractAccountEmail(refreshed.access)) ?? account.email;
344
+ account.refreshToken = refreshed.refresh;
345
+ }
346
+ catch {
347
+ // ignore
348
+ }
349
+ }
350
+ }
351
+ getMinWaitTimeForFamily(family, model) {
352
+ const now = nowMs();
353
+ const available = this.accounts.filter((a) => {
354
+ clearExpiredRateLimits(a);
355
+ return !isRateLimitedForFamily(a, family, model) && !this.isAccountCoolingDown(a);
356
+ });
357
+ if (available.length > 0)
358
+ return 0;
359
+ const waitTimes = [];
360
+ const baseKey = getQuotaKey(family);
361
+ const modelKey = model ? getQuotaKey(family, model) : null;
362
+ for (const account of this.accounts) {
363
+ const baseReset = account.rateLimitResetTimes[baseKey];
364
+ if (typeof baseReset === "number")
365
+ waitTimes.push(Math.max(0, baseReset - now));
366
+ if (modelKey) {
367
+ const modelReset = account.rateLimitResetTimes[modelKey];
368
+ if (typeof modelReset === "number")
369
+ waitTimes.push(Math.max(0, modelReset - now));
370
+ }
371
+ if (typeof account.coolingDownUntil === "number") {
372
+ waitTimes.push(Math.max(0, account.coolingDownUntil - now));
373
+ }
374
+ }
375
+ return waitTimes.length > 0 ? Math.min(...waitTimes) : 0;
376
+ }
377
+ async saveToDisk() {
378
+ const activeIndexByFamily = {};
379
+ for (const family of MODEL_FAMILIES) {
380
+ activeIndexByFamily[family] = clampNonNegativeInt(this.currentAccountIndexByFamily[family], 0);
381
+ }
382
+ const activeIndex = clampNonNegativeInt(activeIndexByFamily.codex, 0);
383
+ const storage = {
384
+ version: 3,
385
+ accounts: this.accounts.map((a) => ({
386
+ refreshToken: a.refreshToken,
387
+ accountId: a.accountId,
388
+ email: a.email,
389
+ addedAt: a.addedAt,
390
+ lastUsed: a.lastUsed,
391
+ lastSwitchReason: a.lastSwitchReason,
392
+ rateLimitResetTimes: Object.keys(a.rateLimitResetTimes).length > 0 ? a.rateLimitResetTimes : undefined,
393
+ coolingDownUntil: a.coolingDownUntil,
394
+ cooldownReason: a.cooldownReason,
395
+ })),
396
+ activeIndex,
397
+ activeIndexByFamily,
398
+ };
399
+ await saveAccounts(storage);
400
+ }
401
+ }
402
+ export function isOAuthAuth(auth) {
403
+ return auth.type === "oauth";
404
+ }
405
+ //# 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,43 @@
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
+ /**
39
+ * Create OAuth authorization flow
40
+ * @returns Authorization flow details
41
+ */
42
+ export declare function createAuthorizationFlow(): Promise<AuthorizationFlow>;
43
+ //# 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,CAwBtE;AAED;;;;;;GAMG;AACH,wBAAsB,yBAAyB,CAC9C,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,MAAqB,GAChC,OAAO,CAAC,WAAW,CAAC,CAoCtB;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAU1D;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAkDnF;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAiB1E"}