opencode-openai-multi-auth 5.0.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 (89) hide show
  1. package/LICENSE +37 -0
  2. package/README.md +145 -0
  3. package/assets/opencode-logo-ornate-dark.svg +18 -0
  4. package/assets/readme-hero.svg +31 -0
  5. package/config/README.md +103 -0
  6. package/config/minimal-opencode.json +12 -0
  7. package/config/opencode-legacy.json +571 -0
  8. package/config/opencode-modern.json +239 -0
  9. package/dist/index.d.ts +4 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +321 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/lib/accounts/index.d.ts +4 -0
  14. package/dist/lib/accounts/index.d.ts.map +1 -0
  15. package/dist/lib/accounts/index.js +3 -0
  16. package/dist/lib/accounts/index.js.map +1 -0
  17. package/dist/lib/accounts/manager.d.ts +23 -0
  18. package/dist/lib/accounts/manager.d.ts.map +1 -0
  19. package/dist/lib/accounts/manager.js +270 -0
  20. package/dist/lib/accounts/manager.js.map +1 -0
  21. package/dist/lib/accounts/types.d.ts +35 -0
  22. package/dist/lib/accounts/types.d.ts.map +1 -0
  23. package/dist/lib/accounts/types.js +10 -0
  24. package/dist/lib/accounts/types.js.map +1 -0
  25. package/dist/lib/auth/auth.d.ts +43 -0
  26. package/dist/lib/auth/auth.d.ts.map +1 -0
  27. package/dist/lib/auth/auth.js +163 -0
  28. package/dist/lib/auth/auth.js.map +1 -0
  29. package/dist/lib/auth/browser.d.ts +17 -0
  30. package/dist/lib/auth/browser.d.ts.map +1 -0
  31. package/dist/lib/auth/browser.js +76 -0
  32. package/dist/lib/auth/browser.js.map +1 -0
  33. package/dist/lib/auth/server.d.ts +10 -0
  34. package/dist/lib/auth/server.d.ts.map +1 -0
  35. package/dist/lib/auth/server.js +78 -0
  36. package/dist/lib/auth/server.js.map +1 -0
  37. package/dist/lib/config.d.ts +17 -0
  38. package/dist/lib/config.d.ts.map +1 -0
  39. package/dist/lib/config.js +51 -0
  40. package/dist/lib/config.js.map +1 -0
  41. package/dist/lib/constants.d.ts +67 -0
  42. package/dist/lib/constants.d.ts.map +1 -0
  43. package/dist/lib/constants.js +67 -0
  44. package/dist/lib/constants.js.map +1 -0
  45. package/dist/lib/logger.d.ts +21 -0
  46. package/dist/lib/logger.d.ts.map +1 -0
  47. package/dist/lib/logger.js +77 -0
  48. package/dist/lib/logger.js.map +1 -0
  49. package/dist/lib/oauth-success.html +712 -0
  50. package/dist/lib/prompts/codex-opencode-bridge.d.ts +19 -0
  51. package/dist/lib/prompts/codex-opencode-bridge.d.ts.map +1 -0
  52. package/dist/lib/prompts/codex-opencode-bridge.js +152 -0
  53. package/dist/lib/prompts/codex-opencode-bridge.js.map +1 -0
  54. package/dist/lib/prompts/codex.d.ts +27 -0
  55. package/dist/lib/prompts/codex.d.ts.map +1 -0
  56. package/dist/lib/prompts/codex.js +241 -0
  57. package/dist/lib/prompts/codex.js.map +1 -0
  58. package/dist/lib/prompts/opencode-codex.d.ts +21 -0
  59. package/dist/lib/prompts/opencode-codex.d.ts.map +1 -0
  60. package/dist/lib/prompts/opencode-codex.js +91 -0
  61. package/dist/lib/prompts/opencode-codex.js.map +1 -0
  62. package/dist/lib/request/fetch-helpers.d.ts +73 -0
  63. package/dist/lib/request/fetch-helpers.d.ts.map +1 -0
  64. package/dist/lib/request/fetch-helpers.js +221 -0
  65. package/dist/lib/request/fetch-helpers.js.map +1 -0
  66. package/dist/lib/request/helpers/input-utils.d.ts +6 -0
  67. package/dist/lib/request/helpers/input-utils.d.ts.map +1 -0
  68. package/dist/lib/request/helpers/input-utils.js +174 -0
  69. package/dist/lib/request/helpers/input-utils.js.map +1 -0
  70. package/dist/lib/request/helpers/model-map.d.ts +28 -0
  71. package/dist/lib/request/helpers/model-map.d.ts.map +1 -0
  72. package/dist/lib/request/helpers/model-map.js +109 -0
  73. package/dist/lib/request/helpers/model-map.js.map +1 -0
  74. package/dist/lib/request/request-transformer.d.ts +93 -0
  75. package/dist/lib/request/request-transformer.d.ts.map +1 -0
  76. package/dist/lib/request/request-transformer.js +403 -0
  77. package/dist/lib/request/request-transformer.js.map +1 -0
  78. package/dist/lib/request/response-handler.d.ts +14 -0
  79. package/dist/lib/request/response-handler.d.ts.map +1 -0
  80. package/dist/lib/request/response-handler.js +88 -0
  81. package/dist/lib/request/response-handler.js.map +1 -0
  82. package/dist/lib/types.d.ts +167 -0
  83. package/dist/lib/types.d.ts.map +1 -0
  84. package/dist/lib/types.js +2 -0
  85. package/dist/lib/types.js.map +1 -0
  86. package/package.json +73 -0
  87. package/scripts/install-opencode-codex-auth.js +430 -0
  88. package/scripts/test-all-models.sh +259 -0
  89. package/scripts/validate-model-map.sh +97 -0
@@ -0,0 +1,239 @@
1
+ {
2
+ "$schema": "https://opencode.ai/config.json",
3
+ "plugin": [
4
+ "opencode-openai-multi-auth"
5
+ ],
6
+ "provider": {
7
+ "openai": {
8
+ "options": {
9
+ "reasoningEffort": "medium",
10
+ "reasoningSummary": "auto",
11
+ "textVerbosity": "medium",
12
+ "include": [
13
+ "reasoning.encrypted_content"
14
+ ],
15
+ "store": false
16
+ },
17
+ "models": {
18
+ "gpt-5.2": {
19
+ "name": "GPT 5.2 (OAuth)",
20
+ "limit": {
21
+ "context": 272000,
22
+ "output": 128000
23
+ },
24
+ "modalities": {
25
+ "input": [
26
+ "text",
27
+ "image"
28
+ ],
29
+ "output": [
30
+ "text"
31
+ ]
32
+ },
33
+ "variants": {
34
+ "none": {
35
+ "reasoningEffort": "none",
36
+ "reasoningSummary": "auto",
37
+ "textVerbosity": "medium"
38
+ },
39
+ "low": {
40
+ "reasoningEffort": "low",
41
+ "reasoningSummary": "auto",
42
+ "textVerbosity": "medium"
43
+ },
44
+ "medium": {
45
+ "reasoningEffort": "medium",
46
+ "reasoningSummary": "auto",
47
+ "textVerbosity": "medium"
48
+ },
49
+ "high": {
50
+ "reasoningEffort": "high",
51
+ "reasoningSummary": "detailed",
52
+ "textVerbosity": "medium"
53
+ },
54
+ "xhigh": {
55
+ "reasoningEffort": "xhigh",
56
+ "reasoningSummary": "detailed",
57
+ "textVerbosity": "medium"
58
+ }
59
+ }
60
+ },
61
+ "gpt-5.2-codex": {
62
+ "name": "GPT 5.2 Codex (OAuth)",
63
+ "limit": {
64
+ "context": 272000,
65
+ "output": 128000
66
+ },
67
+ "modalities": {
68
+ "input": [
69
+ "text",
70
+ "image"
71
+ ],
72
+ "output": [
73
+ "text"
74
+ ]
75
+ },
76
+ "variants": {
77
+ "low": {
78
+ "reasoningEffort": "low",
79
+ "reasoningSummary": "auto",
80
+ "textVerbosity": "medium"
81
+ },
82
+ "medium": {
83
+ "reasoningEffort": "medium",
84
+ "reasoningSummary": "auto",
85
+ "textVerbosity": "medium"
86
+ },
87
+ "high": {
88
+ "reasoningEffort": "high",
89
+ "reasoningSummary": "detailed",
90
+ "textVerbosity": "medium"
91
+ },
92
+ "xhigh": {
93
+ "reasoningEffort": "xhigh",
94
+ "reasoningSummary": "detailed",
95
+ "textVerbosity": "medium"
96
+ }
97
+ }
98
+ },
99
+ "gpt-5.1-codex-max": {
100
+ "name": "GPT 5.1 Codex Max (OAuth)",
101
+ "limit": {
102
+ "context": 272000,
103
+ "output": 128000
104
+ },
105
+ "modalities": {
106
+ "input": [
107
+ "text",
108
+ "image"
109
+ ],
110
+ "output": [
111
+ "text"
112
+ ]
113
+ },
114
+ "variants": {
115
+ "low": {
116
+ "reasoningEffort": "low",
117
+ "reasoningSummary": "detailed",
118
+ "textVerbosity": "medium"
119
+ },
120
+ "medium": {
121
+ "reasoningEffort": "medium",
122
+ "reasoningSummary": "detailed",
123
+ "textVerbosity": "medium"
124
+ },
125
+ "high": {
126
+ "reasoningEffort": "high",
127
+ "reasoningSummary": "detailed",
128
+ "textVerbosity": "medium"
129
+ },
130
+ "xhigh": {
131
+ "reasoningEffort": "xhigh",
132
+ "reasoningSummary": "detailed",
133
+ "textVerbosity": "medium"
134
+ }
135
+ }
136
+ },
137
+ "gpt-5.1-codex": {
138
+ "name": "GPT 5.1 Codex (OAuth)",
139
+ "limit": {
140
+ "context": 272000,
141
+ "output": 128000
142
+ },
143
+ "modalities": {
144
+ "input": [
145
+ "text",
146
+ "image"
147
+ ],
148
+ "output": [
149
+ "text"
150
+ ]
151
+ },
152
+ "variants": {
153
+ "low": {
154
+ "reasoningEffort": "low",
155
+ "reasoningSummary": "auto",
156
+ "textVerbosity": "medium"
157
+ },
158
+ "medium": {
159
+ "reasoningEffort": "medium",
160
+ "reasoningSummary": "auto",
161
+ "textVerbosity": "medium"
162
+ },
163
+ "high": {
164
+ "reasoningEffort": "high",
165
+ "reasoningSummary": "detailed",
166
+ "textVerbosity": "medium"
167
+ }
168
+ }
169
+ },
170
+ "gpt-5.1-codex-mini": {
171
+ "name": "GPT 5.1 Codex Mini (OAuth)",
172
+ "limit": {
173
+ "context": 272000,
174
+ "output": 128000
175
+ },
176
+ "modalities": {
177
+ "input": [
178
+ "text",
179
+ "image"
180
+ ],
181
+ "output": [
182
+ "text"
183
+ ]
184
+ },
185
+ "variants": {
186
+ "medium": {
187
+ "reasoningEffort": "medium",
188
+ "reasoningSummary": "auto",
189
+ "textVerbosity": "medium"
190
+ },
191
+ "high": {
192
+ "reasoningEffort": "high",
193
+ "reasoningSummary": "detailed",
194
+ "textVerbosity": "medium"
195
+ }
196
+ }
197
+ },
198
+ "gpt-5.1": {
199
+ "name": "GPT 5.1 (OAuth)",
200
+ "limit": {
201
+ "context": 272000,
202
+ "output": 128000
203
+ },
204
+ "modalities": {
205
+ "input": [
206
+ "text",
207
+ "image"
208
+ ],
209
+ "output": [
210
+ "text"
211
+ ]
212
+ },
213
+ "variants": {
214
+ "none": {
215
+ "reasoningEffort": "none",
216
+ "reasoningSummary": "auto",
217
+ "textVerbosity": "medium"
218
+ },
219
+ "low": {
220
+ "reasoningEffort": "low",
221
+ "reasoningSummary": "auto",
222
+ "textVerbosity": "low"
223
+ },
224
+ "medium": {
225
+ "reasoningEffort": "medium",
226
+ "reasoningSummary": "auto",
227
+ "textVerbosity": "medium"
228
+ },
229
+ "high": {
230
+ "reasoningEffort": "high",
231
+ "reasoningSummary": "detailed",
232
+ "textVerbosity": "high"
233
+ }
234
+ }
235
+ }
236
+ }
237
+ }
238
+ }
239
+ }
@@ -0,0 +1,4 @@
1
+ import type { Plugin } from "@opencode-ai/plugin";
2
+ export declare const OpenAIAuthPlugin: Plugin;
3
+ export default OpenAIAuthPlugin;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,qBAAqB,CAAC;AAiD/D,eAAO,MAAM,gBAAgB,EAAE,MAua9B,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,321 @@
1
+ import { createAuthorizationFlow, decodeJWT, exchangeAuthorizationCode, parseAuthorizationInput, REDIRECT_URI, } from "./lib/auth/auth.js";
2
+ import { openBrowserUrl } from "./lib/auth/browser.js";
3
+ import { startLocalOAuthServer } from "./lib/auth/server.js";
4
+ import { getCodexMode, loadPluginConfig } from "./lib/config.js";
5
+ import { AUTH_LABELS, CODEX_BASE_URL, DUMMY_API_KEY, ERROR_MESSAGES, JWT_CLAIM_PATH, LOG_STAGES, PROVIDER_ID, HTTP_STATUS, } from "./lib/constants.js";
6
+ import { logRequest, logDebug } from "./lib/logger.js";
7
+ import { createCodexHeaders, extractRequestUrl, handleErrorResponse, handleSuccessResponse, rewriteUrlForCodex, transformRequestForCodex, } from "./lib/request/fetch-helpers.js";
8
+ import { AccountManager } from "./lib/accounts/index.js";
9
+ function extractModelFromBody(body) {
10
+ if (!body)
11
+ return undefined;
12
+ try {
13
+ const parsed = JSON.parse(body);
14
+ return parsed?.model;
15
+ }
16
+ catch {
17
+ return undefined;
18
+ }
19
+ }
20
+ let lastToastAccountIndex = null;
21
+ let lastToastTime = 0;
22
+ const TOAST_DEBOUNCE_MS = 5000;
23
+ export const OpenAIAuthPlugin = async ({ client }) => {
24
+ const quietMode = process.env.OPENCODE_OPENAI_QUIET === "1";
25
+ const debugMode = process.env.OPENCODE_OPENAI_DEBUG === "1";
26
+ const showRateLimitToast = async (account, retryAfterMs) => {
27
+ if (quietMode)
28
+ return;
29
+ const accountLabel = account.email || `Account ${account.index + 1}`;
30
+ const retryMinutes = Math.ceil(retryAfterMs / 60000);
31
+ const retryText = retryMinutes >= 60
32
+ ? `${Math.ceil(retryMinutes / 60)}h`
33
+ : `${retryMinutes}m`;
34
+ try {
35
+ await client.tui.showToast({
36
+ body: {
37
+ message: `${accountLabel} rate limited. Retry in ${retryText}.`,
38
+ variant: "warning",
39
+ },
40
+ });
41
+ }
42
+ catch { }
43
+ };
44
+ const showAccountSwitchToast = async (fromAccount, toAccount) => {
45
+ if (quietMode)
46
+ return;
47
+ const fromLabel = fromAccount.email || `Account ${fromAccount.index + 1}`;
48
+ const toLabel = toAccount.email || `Account ${toAccount.index + 1}`;
49
+ const toPlanLabel = toAccount.planType ? ` [${toAccount.planType}]` : "";
50
+ try {
51
+ await client.tui.showToast({
52
+ body: {
53
+ message: `Switching ${fromLabel} → ${toLabel}${toPlanLabel}`,
54
+ variant: "info",
55
+ },
56
+ });
57
+ }
58
+ catch { }
59
+ };
60
+ const showAccountToast = async (account, totalAccounts) => {
61
+ if (quietMode)
62
+ return;
63
+ if (totalAccounts <= 1)
64
+ return;
65
+ const now = Date.now();
66
+ if (lastToastAccountIndex === account.index &&
67
+ now - lastToastTime < TOAST_DEBOUNCE_MS) {
68
+ return;
69
+ }
70
+ lastToastAccountIndex = account.index;
71
+ lastToastTime = now;
72
+ const accountLabel = account.email || `Account ${account.index + 1}`;
73
+ const planLabel = account.planType ? ` [${account.planType}]` : "";
74
+ try {
75
+ await client.tui.showToast({
76
+ body: {
77
+ message: `Using ${accountLabel}${planLabel} (${account.index + 1}/${totalAccounts})`,
78
+ variant: "info",
79
+ },
80
+ });
81
+ }
82
+ catch { }
83
+ };
84
+ const accountManager = new AccountManager({
85
+ accountSelectionStrategy: process.env.OPENCODE_OPENAI_STRATEGY || "sticky",
86
+ debug: process.env.OPENCODE_OPENAI_DEBUG === "1",
87
+ quietMode: process.env.OPENCODE_OPENAI_QUIET === "1",
88
+ pidOffsetEnabled: process.env.OPENCODE_OPENAI_PID_OFFSET === "1",
89
+ });
90
+ await accountManager.loadFromDisk();
91
+ await accountManager.importFromOpenCodeAuth();
92
+ const buildManualOAuthFlow = (pkce, url) => ({
93
+ url,
94
+ method: "code",
95
+ instructions: AUTH_LABELS.INSTRUCTIONS_MANUAL,
96
+ callback: async (input) => {
97
+ const parsed = parseAuthorizationInput(input);
98
+ if (!parsed.code) {
99
+ return { type: "failed" };
100
+ }
101
+ const tokens = await exchangeAuthorizationCode(parsed.code, pkce.verifier, REDIRECT_URI);
102
+ if (tokens?.type === "success") {
103
+ const decoded = decodeJWT(tokens.access);
104
+ const profile = decoded?.["https://api.openai.com/profile"];
105
+ const email = profile?.email;
106
+ await accountManager.addAccount(email, tokens.refresh, tokens.access, tokens.expires);
107
+ }
108
+ return tokens?.type === "success" ? tokens : { type: "failed" };
109
+ },
110
+ });
111
+ const buildAutoOAuthFlow = (pkce, state, url, serverInfo) => ({
112
+ url,
113
+ method: "auto",
114
+ instructions: AUTH_LABELS.INSTRUCTIONS,
115
+ callback: async () => {
116
+ const result = await serverInfo.waitForCode(state);
117
+ serverInfo.close();
118
+ if (!result) {
119
+ return { type: "failed" };
120
+ }
121
+ const tokens = await exchangeAuthorizationCode(result.code, pkce.verifier, REDIRECT_URI);
122
+ if (tokens?.type === "success") {
123
+ const decoded = decodeJWT(tokens.access);
124
+ const profile = decoded?.["https://api.openai.com/profile"];
125
+ const email = profile?.email;
126
+ await accountManager.addAccount(email, tokens.refresh, tokens.access, tokens.expires);
127
+ }
128
+ return tokens?.type === "success" ? tokens : { type: "failed" };
129
+ },
130
+ });
131
+ return {
132
+ auth: {
133
+ provider: PROVIDER_ID,
134
+ async loader(getAuth, provider) {
135
+ const auth = await getAuth();
136
+ if (auth.type !== "oauth") {
137
+ return {};
138
+ }
139
+ if (accountManager.getAccountCount() === 0) {
140
+ const decoded = decodeJWT(auth.access);
141
+ const profile = decoded?.["https://api.openai.com/profile"];
142
+ const email = profile?.email;
143
+ await accountManager.addAccount(email, auth.refresh, auth.access, auth.expires);
144
+ }
145
+ const providerConfig = provider;
146
+ const userConfig = {
147
+ global: providerConfig?.options || {},
148
+ models: providerConfig?.models || {},
149
+ };
150
+ const pluginConfig = loadPluginConfig();
151
+ const codexMode = getCodexMode(pluginConfig);
152
+ const executeRequest = async (account, input, init, retryCount = 0) => {
153
+ const isTokenValid = await accountManager.ensureValidToken(account);
154
+ if (!isTokenValid) {
155
+ const nextAccount = await accountManager.getNextAvailableAccount();
156
+ if (nextAccount && nextAccount.index !== account.index) {
157
+ await showAccountSwitchToast(account, nextAccount);
158
+ return executeRequest(nextAccount, input, init, retryCount);
159
+ }
160
+ return new Response(JSON.stringify({ error: "All accounts failed token refresh" }), {
161
+ status: HTTP_STATUS.UNAUTHORIZED,
162
+ headers: { "Content-Type": "application/json" },
163
+ });
164
+ }
165
+ const originalUrl = extractRequestUrl(input);
166
+ const url = rewriteUrlForCodex(originalUrl);
167
+ const originalBody = init?.body
168
+ ? JSON.parse(init.body)
169
+ : {};
170
+ const isStreaming = originalBody.stream === true;
171
+ const model = originalBody.model;
172
+ const transformation = await transformRequestForCodex(init, url, userConfig, codexMode);
173
+ const requestInit = transformation?.updatedInit ?? init;
174
+ const accountId = account.accountId ||
175
+ (() => {
176
+ const decoded = decodeJWT(account.access || "");
177
+ return decoded?.[JWT_CLAIM_PATH]?.chatgpt_account_id;
178
+ })();
179
+ if (!accountId) {
180
+ logDebug(`[openai-multi-auth] No account ID for account ${account.index}`);
181
+ return new Response(JSON.stringify({ error: ERROR_MESSAGES.NO_ACCOUNT_ID }), {
182
+ status: HTTP_STATUS.UNAUTHORIZED,
183
+ headers: { "Content-Type": "application/json" },
184
+ });
185
+ }
186
+ const headers = createCodexHeaders(requestInit, accountId, account.access || "", {
187
+ model: transformation?.body.model,
188
+ promptCacheKey: transformation?.body?.prompt_cache_key,
189
+ });
190
+ const response = await fetch(url, {
191
+ ...requestInit,
192
+ headers,
193
+ });
194
+ logRequest(LOG_STAGES.RESPONSE, {
195
+ status: response.status,
196
+ ok: response.ok,
197
+ statusText: response.statusText,
198
+ accountIndex: account.index,
199
+ accountEmail: account.email,
200
+ });
201
+ if (response.status === HTTP_STATUS.TOO_MANY_REQUESTS) {
202
+ const retryAfterHeader = response.headers.get("Retry-After");
203
+ let retryAfterMs;
204
+ if (retryAfterHeader) {
205
+ retryAfterMs = parseInt(retryAfterHeader) * 1000;
206
+ }
207
+ else {
208
+ try {
209
+ const cloned = response.clone();
210
+ const errorBody = (await cloned.json());
211
+ const resetTime = errorBody?.error?.details?.resets_at || errorBody?.resets_at;
212
+ if (resetTime) {
213
+ retryAfterMs = new Date(resetTime).getTime() - Date.now();
214
+ }
215
+ else {
216
+ retryAfterMs = 60000;
217
+ }
218
+ }
219
+ catch {
220
+ retryAfterMs = 60000;
221
+ }
222
+ }
223
+ accountManager.markRateLimited(account, retryAfterMs, model);
224
+ await showRateLimitToast(account, retryAfterMs);
225
+ if (debugMode) {
226
+ const headersObj = {};
227
+ response.headers.forEach((value, key) => {
228
+ headersObj[key] = value;
229
+ });
230
+ try {
231
+ const cloned = response.clone();
232
+ const body = await cloned.json();
233
+ console.log(`[openai-multi-auth] Rate limit headers: ${JSON.stringify(headersObj)}, body: ${JSON.stringify(body)}, calculated: ${retryAfterMs}ms (${Math.ceil(Math.max(0, retryAfterMs) / 60000)}m)`);
234
+ }
235
+ catch { }
236
+ }
237
+ if (retryCount < accountManager.getAccountCount() - 1) {
238
+ const nextAccount = await accountManager.getNextAvailableAccount(model);
239
+ if (nextAccount && nextAccount.index !== account.index) {
240
+ await showAccountSwitchToast(account, nextAccount);
241
+ return executeRequest(nextAccount, input, init, retryCount + 1);
242
+ }
243
+ }
244
+ }
245
+ if (response.status === HTTP_STATUS.UNAUTHORIZED && retryCount < 1) {
246
+ accountManager.markRefreshFailed(account, "401 Unauthorized");
247
+ const nextAccount = await accountManager.getNextAvailableAccount(model);
248
+ if (nextAccount && nextAccount.index !== account.index) {
249
+ await showAccountSwitchToast(account, nextAccount);
250
+ return executeRequest(nextAccount, input, init, retryCount + 1);
251
+ }
252
+ }
253
+ if (!response.ok) {
254
+ return await handleErrorResponse(response);
255
+ }
256
+ return await handleSuccessResponse(response, isStreaming);
257
+ };
258
+ return {
259
+ apiKey: DUMMY_API_KEY,
260
+ baseURL: CODEX_BASE_URL,
261
+ async fetch(input, init) {
262
+ const model = extractModelFromBody(init?.body);
263
+ const account = await accountManager.getNextAvailableAccount(model);
264
+ if (!account) {
265
+ return new Response(JSON.stringify({ error: "No available OpenAI accounts" }), {
266
+ status: 503,
267
+ headers: { "Content-Type": "application/json" },
268
+ });
269
+ }
270
+ await showAccountToast(account, accountManager.getAccountCount());
271
+ return executeRequest(account, input, init);
272
+ },
273
+ };
274
+ },
275
+ methods: [
276
+ {
277
+ label: AUTH_LABELS.OAUTH,
278
+ type: "oauth",
279
+ authorize: async () => {
280
+ const { pkce, state, url } = await createAuthorizationFlow();
281
+ const serverInfo = await startLocalOAuthServer({ state });
282
+ openBrowserUrl(url);
283
+ if (!serverInfo.ready) {
284
+ serverInfo.close();
285
+ return buildManualOAuthFlow(pkce, url);
286
+ }
287
+ return buildAutoOAuthFlow(pkce, state, url, serverInfo);
288
+ },
289
+ },
290
+ {
291
+ label: "Add Another OpenAI Account",
292
+ type: "oauth",
293
+ authorize: async () => {
294
+ const { pkce, state, url } = await createAuthorizationFlow();
295
+ const serverInfo = await startLocalOAuthServer({ state });
296
+ openBrowserUrl(url);
297
+ if (!serverInfo.ready) {
298
+ serverInfo.close();
299
+ return buildManualOAuthFlow(pkce, url);
300
+ }
301
+ return buildAutoOAuthFlow(pkce, state, url, serverInfo);
302
+ },
303
+ },
304
+ {
305
+ label: AUTH_LABELS.OAUTH_MANUAL,
306
+ type: "oauth",
307
+ authorize: async () => {
308
+ const { pkce, url } = await createAuthorizationFlow();
309
+ return buildManualOAuthFlow(pkce, url);
310
+ },
311
+ },
312
+ {
313
+ label: AUTH_LABELS.API_KEY,
314
+ type: "api",
315
+ },
316
+ ],
317
+ },
318
+ };
319
+ };
320
+ export default OpenAIAuthPlugin;
321
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { AccountManager } from "./manager.js";
2
+ export type { ManagedAccount, AccountsStorage, MultiAccountConfig, } from "./types.js";
3
+ export { DEFAULT_MULTI_ACCOUNT_CONFIG } from "./types.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/accounts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,YAAY,EACV,cAAc,EACd,eAAe,EACf,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { AccountManager } from "./manager.js";
2
+ export { DEFAULT_MULTI_ACCOUNT_CONFIG } from "./types.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/accounts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAM9C,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { ManagedAccount, MultiAccountConfig } from "./types.js";
2
+ export declare class AccountManager {
3
+ private accounts;
4
+ private activeIndex;
5
+ private config;
6
+ constructor(config?: Partial<MultiAccountConfig>);
7
+ loadFromDisk(): Promise<void>;
8
+ saveToDisk(): Promise<void>;
9
+ importFromOpenCodeAuth(): Promise<void>;
10
+ addAccount(email: string | undefined, refreshToken: string, accessToken?: string, expires?: number): Promise<ManagedAccount>;
11
+ getAllAccounts(): ManagedAccount[];
12
+ getAccountCount(): number;
13
+ getNextAvailableAccount(model?: string): Promise<ManagedAccount | null>;
14
+ private isAccountAvailable;
15
+ private getLeastRateLimitedAccount;
16
+ markRateLimited(account: ManagedAccount, retryAfterMs: number, model?: string): void;
17
+ markRefreshFailed(account: ManagedAccount, error: string): void;
18
+ removeAccount(account: ManagedAccount): void;
19
+ updateAccountTokens(account: ManagedAccount, accessToken: string, refreshToken: string, expires: number): Promise<void>;
20
+ ensureValidToken(account: ManagedAccount): Promise<boolean>;
21
+ getActiveAccount(): ManagedAccount | null;
22
+ }
23
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../lib/accounts/manager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,cAAc,EAEd,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAkBpB,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,MAAM,CAAqB;gBAEvB,MAAM,GAAE,OAAO,CAAC,kBAAkB,CAAM;IAI9C,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB7B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAc3B,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBvC,UAAU,CACd,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,YAAY,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,CAAC;IA+E1B,cAAc,IAAI,cAAc,EAAE;IAIlC,eAAe,IAAI,MAAM;IAInB,uBAAuB,CAC3B,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAuBjC,OAAO,CAAC,kBAAkB;IAqB1B,OAAO,CAAC,0BAA0B;IAyBlC,eAAe,CACb,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,MAAM,EACpB,KAAK,CAAC,EAAE,MAAM,GACb,IAAI;IAiBP,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAU/D,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAoBtC,mBAAmB,CACvB,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IA2BV,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAmCjE,gBAAgB,IAAI,cAAc,GAAG,IAAI;CAI1C"}