better-opencode-openai-codex-auth 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.
Files changed (81) hide show
  1. package/LICENSE +37 -0
  2. package/README.md +99 -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 +42 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +334 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/lib/account-pool.d.ts +17 -0
  14. package/dist/lib/account-pool.d.ts.map +1 -0
  15. package/dist/lib/account-pool.js +243 -0
  16. package/dist/lib/account-pool.js.map +1 -0
  17. package/dist/lib/auth/auth.d.ts +43 -0
  18. package/dist/lib/auth/auth.d.ts.map +1 -0
  19. package/dist/lib/auth/auth.js +162 -0
  20. package/dist/lib/auth/auth.js.map +1 -0
  21. package/dist/lib/auth/browser.d.ts +17 -0
  22. package/dist/lib/auth/browser.d.ts.map +1 -0
  23. package/dist/lib/auth/browser.js +76 -0
  24. package/dist/lib/auth/browser.js.map +1 -0
  25. package/dist/lib/auth/server.d.ts +10 -0
  26. package/dist/lib/auth/server.d.ts.map +1 -0
  27. package/dist/lib/auth/server.js +78 -0
  28. package/dist/lib/auth/server.js.map +1 -0
  29. package/dist/lib/config.d.ts +17 -0
  30. package/dist/lib/config.d.ts.map +1 -0
  31. package/dist/lib/config.js +53 -0
  32. package/dist/lib/config.js.map +1 -0
  33. package/dist/lib/constants.d.ts +67 -0
  34. package/dist/lib/constants.d.ts.map +1 -0
  35. package/dist/lib/constants.js +67 -0
  36. package/dist/lib/constants.js.map +1 -0
  37. package/dist/lib/logger.d.ts +21 -0
  38. package/dist/lib/logger.d.ts.map +1 -0
  39. package/dist/lib/logger.js +77 -0
  40. package/dist/lib/logger.js.map +1 -0
  41. package/dist/lib/oauth-success.html +712 -0
  42. package/dist/lib/prompts/codex-opencode-bridge.d.ts +19 -0
  43. package/dist/lib/prompts/codex-opencode-bridge.d.ts.map +1 -0
  44. package/dist/lib/prompts/codex-opencode-bridge.js +152 -0
  45. package/dist/lib/prompts/codex-opencode-bridge.js.map +1 -0
  46. package/dist/lib/prompts/codex.d.ts +27 -0
  47. package/dist/lib/prompts/codex.d.ts.map +1 -0
  48. package/dist/lib/prompts/codex.js +252 -0
  49. package/dist/lib/prompts/codex.js.map +1 -0
  50. package/dist/lib/prompts/opencode-codex.d.ts +21 -0
  51. package/dist/lib/prompts/opencode-codex.d.ts.map +1 -0
  52. package/dist/lib/prompts/opencode-codex.js +91 -0
  53. package/dist/lib/prompts/opencode-codex.js.map +1 -0
  54. package/dist/lib/request/fetch-helpers.d.ts +73 -0
  55. package/dist/lib/request/fetch-helpers.d.ts.map +1 -0
  56. package/dist/lib/request/fetch-helpers.js +221 -0
  57. package/dist/lib/request/fetch-helpers.js.map +1 -0
  58. package/dist/lib/request/helpers/input-utils.d.ts +6 -0
  59. package/dist/lib/request/helpers/input-utils.d.ts.map +1 -0
  60. package/dist/lib/request/helpers/input-utils.js +174 -0
  61. package/dist/lib/request/helpers/input-utils.js.map +1 -0
  62. package/dist/lib/request/helpers/model-map.d.ts +28 -0
  63. package/dist/lib/request/helpers/model-map.d.ts.map +1 -0
  64. package/dist/lib/request/helpers/model-map.js +126 -0
  65. package/dist/lib/request/helpers/model-map.js.map +1 -0
  66. package/dist/lib/request/request-transformer.d.ts +93 -0
  67. package/dist/lib/request/request-transformer.d.ts.map +1 -0
  68. package/dist/lib/request/request-transformer.js +418 -0
  69. package/dist/lib/request/request-transformer.js.map +1 -0
  70. package/dist/lib/request/response-handler.d.ts +14 -0
  71. package/dist/lib/request/response-handler.d.ts.map +1 -0
  72. package/dist/lib/request/response-handler.js +150 -0
  73. package/dist/lib/request/response-handler.js.map +1 -0
  74. package/dist/lib/types.d.ts +183 -0
  75. package/dist/lib/types.d.ts.map +1 -0
  76. package/dist/lib/types.js +2 -0
  77. package/dist/lib/types.js.map +1 -0
  78. package/package.json +74 -0
  79. package/scripts/install-opencode-codex-auth.js +433 -0
  80. package/scripts/test-all-models.sh +259 -0
  81. package/scripts/validate-model-map.sh +97 -0
@@ -0,0 +1,239 @@
1
+ {
2
+ "$schema": "https://opencode.ai/config.json",
3
+ "plugin": [
4
+ "better-opencode-openai-codex-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,42 @@
1
+ /**
2
+ * OpenAI ChatGPT (Codex) OAuth Authentication Plugin for opencode
3
+ *
4
+ * COMPLIANCE NOTICE:
5
+ * This plugin uses OpenAI's official OAuth authentication flow (the same method
6
+ * used by OpenAI's official Codex CLI at https://github.com/openai/codex).
7
+ *
8
+ * INTENDED USE: Personal development and coding assistance with your own
9
+ * ChatGPT Plus/Pro subscription.
10
+ *
11
+ * NOT INTENDED FOR: Commercial resale, multi-user services, high-volume
12
+ * automated extraction, or any use that violates OpenAI's Terms of Service.
13
+ *
14
+ * Users are responsible for ensuring their usage complies with:
15
+ * - OpenAI Terms of Use: https://openai.com/policies/terms-of-use/
16
+ * - OpenAI Usage Policies: https://openai.com/policies/usage-policies/
17
+ *
18
+ * For production applications, use the OpenAI Platform API: https://platform.openai.com/
19
+ *
20
+ * @license MIT with Usage Disclaimer (see LICENSE file)
21
+ * @author ShivamB25 (fork maintainer); originally by numman-ali
22
+ * @repository https://github.com/ShivamB25/better-opencode-openai-codex-auth
23
+ */
24
+ import type { Plugin } from "@opencode-ai/plugin";
25
+ /**
26
+ * OpenAI Codex OAuth authentication plugin for opencode
27
+ *
28
+ * This plugin enables opencode to use OpenAI's Codex backend via ChatGPT Plus/Pro
29
+ * OAuth authentication, allowing users to leverage their ChatGPT subscription
30
+ * instead of OpenAI Platform API credits.
31
+ *
32
+ * @example
33
+ * ```json
34
+ * {
35
+ * "plugin": ["better-opencode-openai-codex-auth"],
36
+ * "model": "openai/gpt-5-codex"
37
+ * }
38
+ * ```
39
+ */
40
+ export declare const OpenAIAuthPlugin: Plugin;
41
+ export default OpenAIAuthPlugin;
42
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,qBAAqB,CAAC;AAmC/D;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,gBAAgB,EAAE,MA2V9B,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,334 @@
1
+ /**
2
+ * OpenAI ChatGPT (Codex) OAuth Authentication Plugin for opencode
3
+ *
4
+ * COMPLIANCE NOTICE:
5
+ * This plugin uses OpenAI's official OAuth authentication flow (the same method
6
+ * used by OpenAI's official Codex CLI at https://github.com/openai/codex).
7
+ *
8
+ * INTENDED USE: Personal development and coding assistance with your own
9
+ * ChatGPT Plus/Pro subscription.
10
+ *
11
+ * NOT INTENDED FOR: Commercial resale, multi-user services, high-volume
12
+ * automated extraction, or any use that violates OpenAI's Terms of Service.
13
+ *
14
+ * Users are responsible for ensuring their usage complies with:
15
+ * - OpenAI Terms of Use: https://openai.com/policies/terms-of-use/
16
+ * - OpenAI Usage Policies: https://openai.com/policies/usage-policies/
17
+ *
18
+ * For production applications, use the OpenAI Platform API: https://platform.openai.com/
19
+ *
20
+ * @license MIT with Usage Disclaimer (see LICENSE file)
21
+ * @author ShivamB25 (fork maintainer); originally by numman-ali
22
+ * @repository https://github.com/ShivamB25/better-opencode-openai-codex-auth
23
+ */
24
+ import { createAuthorizationFlow, decodeJWT, exchangeAuthorizationCode, parseAuthorizationInput, refreshAccessToken, REDIRECT_URI, } from "./lib/auth/auth.js";
25
+ import { openBrowserUrl } from "./lib/auth/browser.js";
26
+ import { startLocalOAuthServer } from "./lib/auth/server.js";
27
+ import { getCodexMode, loadPluginConfig } from "./lib/config.js";
28
+ import { AUTH_LABELS, CODEX_BASE_URL, DUMMY_API_KEY, ERROR_MESSAGES, JWT_CLAIM_PATH, LOG_STAGES, PLUGIN_NAME, PROVIDER_ID, } from "./lib/constants.js";
29
+ import { logRequest, logDebug, logWarn } from "./lib/logger.js";
30
+ import { createCodexHeaders, extractRequestUrl, handleErrorResponse, handleSuccessResponse, rewriteUrlForCodex, transformRequestForCodex, } from "./lib/request/fetch-helpers.js";
31
+ import { AccountPool } from "./lib/account-pool.js";
32
+ /**
33
+ * OpenAI Codex OAuth authentication plugin for opencode
34
+ *
35
+ * This plugin enables opencode to use OpenAI's Codex backend via ChatGPT Plus/Pro
36
+ * OAuth authentication, allowing users to leverage their ChatGPT subscription
37
+ * instead of OpenAI Platform API credits.
38
+ *
39
+ * @example
40
+ * ```json
41
+ * {
42
+ * "plugin": ["better-opencode-openai-codex-auth"],
43
+ * "model": "openai/gpt-5-codex"
44
+ * }
45
+ * ```
46
+ */
47
+ export const OpenAIAuthPlugin = async ({ client }) => {
48
+ const buildManualOAuthFlow = (pkce, url) => ({
49
+ url,
50
+ method: "code",
51
+ instructions: AUTH_LABELS.INSTRUCTIONS_MANUAL,
52
+ callback: async (input) => {
53
+ const parsed = parseAuthorizationInput(input);
54
+ if (!parsed.code) {
55
+ return { type: "failed" };
56
+ }
57
+ const tokens = await exchangeAuthorizationCode(parsed.code, pkce.verifier, REDIRECT_URI);
58
+ return tokens?.type === "success" ? tokens : { type: "failed" };
59
+ },
60
+ });
61
+ return {
62
+ auth: {
63
+ provider: PROVIDER_ID,
64
+ /**
65
+ * Loader function that configures OAuth authentication and request handling
66
+ *
67
+ * This function:
68
+ * 1. Validates OAuth authentication
69
+ * 2. Extracts ChatGPT account ID from access token
70
+ * 3. Loads user configuration from opencode.json
71
+ * 4. Fetches Codex system instructions from GitHub (cached)
72
+ * 5. Returns SDK configuration with custom fetch implementation
73
+ *
74
+ * @param getAuth - Function to retrieve current auth state
75
+ * @param provider - Provider configuration from opencode.json
76
+ * @returns SDK configuration object or empty object for non-OAuth auth
77
+ */
78
+ async loader(getAuth, provider) {
79
+ const auth = await getAuth();
80
+ // Only handle OAuth auth type, skip API key auth
81
+ if (auth.type !== "oauth") {
82
+ return {};
83
+ }
84
+ // Extract ChatGPT account ID from JWT access token
85
+ const decoded = decodeJWT(auth.access);
86
+ const accountId = decoded?.[JWT_CLAIM_PATH]?.chatgpt_account_id;
87
+ if (!accountId) {
88
+ logDebug(`[${PLUGIN_NAME}] ${ERROR_MESSAGES.NO_ACCOUNT_ID} (skipping plugin)`);
89
+ return {};
90
+ }
91
+ // Extract user configuration (global + per-model options)
92
+ const providerConfig = provider;
93
+ const userConfig = {
94
+ global: providerConfig?.options || {},
95
+ models: providerConfig?.models || {},
96
+ };
97
+ // Load plugin configuration and determine CODEX_MODE
98
+ // Priority: CODEX_MODE env var > config file > default (true)
99
+ const pluginConfig = loadPluginConfig();
100
+ const codexMode = getCodexMode(pluginConfig);
101
+ const accountSelectionStrategy = pluginConfig.accountSelectionStrategy === "sticky" ? "sticky" : "round-robin";
102
+ const rateLimitCooldownMs = pluginConfig.rateLimitCooldownMs;
103
+ const accountPool = AccountPool.load();
104
+ const savePool = () => {
105
+ try {
106
+ accountPool.save();
107
+ }
108
+ catch (error) {
109
+ logWarn("Failed to persist account pool", error);
110
+ }
111
+ };
112
+ accountPool.upsert({
113
+ accountId,
114
+ access: auth.access,
115
+ refresh: auth.refresh,
116
+ expires: auth.expires,
117
+ email: typeof decoded?.email === "string"
118
+ ? decoded.email
119
+ : undefined,
120
+ });
121
+ savePool();
122
+ // Return SDK configuration
123
+ return {
124
+ apiKey: DUMMY_API_KEY,
125
+ baseURL: CODEX_BASE_URL,
126
+ /**
127
+ * Custom fetch implementation for Codex API
128
+ *
129
+ * Handles:
130
+ * - Per-account token refresh when expired (inside retry loop)
131
+ * - URL rewriting for Codex backend
132
+ * - Request body transformation
133
+ * - OAuth header injection per selected account
134
+ * - Automatic 429 rotation across account pool
135
+ * - SSE to JSON conversion for non-tool requests
136
+ * - Error handling and logging
137
+ *
138
+ * @param input - Request URL or Request object
139
+ * @param init - Request options
140
+ * @returns Response from Codex API
141
+ */
142
+ async fetch(input, init) {
143
+ const latestAuth = await getAuth();
144
+ let latestAccountIdFromAuth;
145
+ if (latestAuth.type === "oauth") {
146
+ const latestDecoded = decodeJWT(latestAuth.access);
147
+ const latestAccountId = latestDecoded?.[JWT_CLAIM_PATH]?.chatgpt_account_id;
148
+ latestAccountIdFromAuth = latestAccountId;
149
+ if (latestAccountId) {
150
+ accountPool.upsert({
151
+ accountId: latestAccountId,
152
+ access: latestAuth.access,
153
+ refresh: latestAuth.refresh,
154
+ expires: latestAuth.expires,
155
+ email: typeof latestDecoded?.email === "string"
156
+ ? latestDecoded.email
157
+ : undefined,
158
+ });
159
+ }
160
+ }
161
+ // Step 1: Extract and rewrite URL for Codex backend
162
+ const originalUrl = extractRequestUrl(input);
163
+ const url = rewriteUrlForCodex(originalUrl);
164
+ // Step 2: Transform request body with model-specific Codex instructions
165
+ // Instructions are fetched per model family (codex-max, codex, gpt-5.1)
166
+ // Capture original stream value before transformation
167
+ // generateText() sends no stream field, streamText() sends stream=true
168
+ let originalBody = {};
169
+ if (typeof init?.body === "string") {
170
+ try {
171
+ originalBody = JSON.parse(init.body);
172
+ }
173
+ catch {
174
+ originalBody = {};
175
+ }
176
+ }
177
+ const isStreaming = originalBody.stream === true;
178
+ const transformation = await transformRequestForCodex(init, url, userConfig, codexMode);
179
+ const requestInit = transformation?.updatedInit ?? init;
180
+ const attempts = Math.max(accountPool.count(), 1);
181
+ let lastRateLimitResponse = null;
182
+ for (let i = 0; i < attempts; i++) {
183
+ const selected = accountPool.next(accountSelectionStrategy);
184
+ if (!selected) {
185
+ break;
186
+ }
187
+ if (selected.expires < Date.now()) {
188
+ const selectedRefreshBefore = selected.refresh;
189
+ const refreshed = await refreshAccessToken(selected.refresh);
190
+ if (refreshed.type === "failed") {
191
+ // Auth failure (revoked/invalid token) is NOT a rate limit.
192
+ // Calling markRateLimited here would retry the same dead
193
+ // token after cooldown, looping forever. Skip this account
194
+ // for the current request without penalizing it.
195
+ logWarn("Token refresh failed for account, skipping", selected.accountId);
196
+ savePool();
197
+ continue;
198
+ }
199
+ accountPool.replaceAuth(selected.accountId, refreshed.access, refreshed.refresh, refreshed.expires);
200
+ if (latestAuth.type === "oauth" &&
201
+ (latestAuth.refresh === selectedRefreshBefore ||
202
+ latestAccountIdFromAuth === selected.accountId)) {
203
+ try {
204
+ await client.auth.set({
205
+ path: { id: "openai" },
206
+ body: {
207
+ type: "oauth",
208
+ access: refreshed.access,
209
+ refresh: refreshed.refresh,
210
+ expires: refreshed.expires,
211
+ },
212
+ });
213
+ }
214
+ catch (error) {
215
+ logWarn("Failed to persist refreshed auth", error);
216
+ }
217
+ }
218
+ }
219
+ const headers = createCodexHeaders(requestInit, selected.accountId, selected.access, {
220
+ model: transformation?.body.model,
221
+ promptCacheKey: transformation?.body
222
+ ?.prompt_cache_key,
223
+ });
224
+ const response = await fetch(url, {
225
+ ...requestInit,
226
+ headers,
227
+ });
228
+ logRequest(LOG_STAGES.RESPONSE, {
229
+ status: response.status,
230
+ ok: response.ok,
231
+ statusText: response.statusText,
232
+ headers: Object.fromEntries(response.headers.entries()),
233
+ accountId: selected.accountId,
234
+ attempt: i + 1,
235
+ totalAttempts: attempts,
236
+ });
237
+ if (!response.ok) {
238
+ const mapped = await handleErrorResponse(response);
239
+ if (mapped.status === 429) {
240
+ accountPool.markRateLimited(selected.accountId, mapped.headers, rateLimitCooldownMs);
241
+ savePool();
242
+ lastRateLimitResponse = mapped;
243
+ continue;
244
+ }
245
+ savePool();
246
+ return mapped;
247
+ }
248
+ savePool();
249
+ return await handleSuccessResponse(response, isStreaming);
250
+ }
251
+ savePool();
252
+ if (lastRateLimitResponse) {
253
+ return lastRateLimitResponse;
254
+ }
255
+ const retryAfterMs = accountPool.getMinRetryAfterMs();
256
+ const retryAfterSeconds = retryAfterMs ? Math.max(1, Math.ceil(retryAfterMs / 1000)) : null;
257
+ return new Response(JSON.stringify({
258
+ error: {
259
+ code: "usage_limit_reached",
260
+ message: "All ChatGPT accounts are temporarily rate-limited",
261
+ },
262
+ }), {
263
+ status: 429,
264
+ headers: {
265
+ "content-type": "application/json",
266
+ ...(retryAfterSeconds
267
+ ? { "retry-after": String(retryAfterSeconds) }
268
+ : {}),
269
+ },
270
+ });
271
+ },
272
+ };
273
+ },
274
+ methods: [
275
+ {
276
+ label: AUTH_LABELS.OAUTH,
277
+ type: "oauth",
278
+ /**
279
+ * OAuth authorization flow
280
+ *
281
+ * Steps:
282
+ * 1. Generate PKCE challenge and state for security
283
+ * 2. Start local OAuth callback server on port 1455
284
+ * 3. Open browser to OpenAI authorization page
285
+ * 4. Wait for user to complete login
286
+ * 5. Exchange authorization code for tokens
287
+ *
288
+ * @returns Authorization flow configuration
289
+ */
290
+ authorize: async () => {
291
+ const { pkce, state, url } = await createAuthorizationFlow();
292
+ const serverInfo = await startLocalOAuthServer({ state });
293
+ // Attempt to open browser automatically
294
+ openBrowserUrl(url);
295
+ if (!serverInfo.ready) {
296
+ serverInfo.close();
297
+ return buildManualOAuthFlow(pkce, url);
298
+ }
299
+ return {
300
+ url,
301
+ method: "auto",
302
+ instructions: AUTH_LABELS.INSTRUCTIONS,
303
+ callback: async () => {
304
+ const result = await serverInfo.waitForCode(state);
305
+ serverInfo.close();
306
+ if (!result) {
307
+ return { type: "failed" };
308
+ }
309
+ const tokens = await exchangeAuthorizationCode(result.code, pkce.verifier, REDIRECT_URI);
310
+ return tokens?.type === "success"
311
+ ? tokens
312
+ : { type: "failed" };
313
+ },
314
+ };
315
+ },
316
+ },
317
+ {
318
+ label: AUTH_LABELS.OAUTH_MANUAL,
319
+ type: "oauth",
320
+ authorize: async () => {
321
+ const { pkce, url } = await createAuthorizationFlow();
322
+ return buildManualOAuthFlow(pkce, url);
323
+ },
324
+ },
325
+ {
326
+ label: AUTH_LABELS.API_KEY,
327
+ type: "api",
328
+ },
329
+ ],
330
+ },
331
+ };
332
+ };
333
+ export default OpenAIAuthPlugin;
334
+ //# 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,17 @@
1
+ import type { AccountPoolEntry } from "./types.js";
2
+ export declare class AccountPool {
3
+ private accounts;
4
+ private activeIndex;
5
+ static load(): AccountPool;
6
+ save(): void;
7
+ upsert(entry: AccountPoolEntry): void;
8
+ count(): number;
9
+ getAvailableCount(): number;
10
+ getMinRetryAfterMs(): number | null;
11
+ markRateLimited(accountId: string, headers: Headers, cooldownMs?: number): void;
12
+ next(strategy: "sticky" | "round-robin"): AccountPoolEntry | null;
13
+ replaceAuth(accountId: string, access: string, refresh: string, expires: number): void;
14
+ private isLimited;
15
+ private clearExpiredLimits;
16
+ }
17
+ //# sourceMappingURL=account-pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-pool.d.ts","sourceRoot":"","sources":["../../lib/account-pool.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAsB,MAAM,YAAY,CAAC;AA8FvE,qBAAa,WAAW;IACvB,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,WAAW,CAAK;IAExB,MAAM,CAAC,IAAI,IAAI,WAAW;IAgB1B,IAAI,IAAI,IAAI;IAuBZ,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI;IA8BrC,KAAK,IAAI,MAAM;IAIf,iBAAiB,IAAI,MAAM;IAK3B,kBAAkB,IAAI,MAAM,GAAG,IAAI;IAanC,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAQ/E,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,aAAa,GAAG,gBAAgB,GAAG,IAAI;IAuBjE,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAQtF,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,kBAAkB;CAQ1B"}