opencode-openai-codex-multi-auth 4.4.1 → 4.4.6
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/README.md +2 -1
- package/THIRD_PARTY_NOTICES.md +36 -0
- package/assets/openai-codex-auth-config.schema.json +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +213 -95
- package/dist/index.js.map +1 -1
- package/dist/lib/accounts.d.ts.map +1 -1
- package/dist/lib/accounts.js +28 -0
- package/dist/lib/accounts.js.map +1 -1
- package/dist/lib/cli.d.ts +1 -0
- package/dist/lib/cli.d.ts.map +1 -1
- package/dist/lib/cli.js +42 -26
- package/dist/lib/cli.js.map +1 -1
- package/dist/lib/config.d.ts +2 -2
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +35 -5
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/oauth-success.html +1 -1
- package/dist/lib/rotation.d.ts +65 -0
- package/dist/lib/rotation.d.ts.map +1 -0
- package/dist/lib/rotation.js +147 -0
- package/dist/lib/rotation.js.map +1 -0
- package/dist/lib/storage.d.ts.map +1 -1
- package/dist/lib/storage.js +246 -24
- package/dist/lib/storage.js.map +1 -1
- package/dist/lib/terminal.d.ts +9 -0
- package/dist/lib/terminal.d.ts.map +1 -0
- package/dist/lib/terminal.js +56 -0
- package/dist/lib/terminal.js.map +1 -0
- package/dist/lib/types.d.ts +2 -2
- package/dist/lib/types.d.ts.map +1 -1
- package/package.json +3 -2
- package/scripts/install-opencode-codex-auth.js +10 -5
package/dist/lib/storage.js
CHANGED
|
@@ -2,37 +2,240 @@ import { existsSync } from "node:fs";
|
|
|
2
2
|
import { promises as fs } from "node:fs";
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
4
|
import { dirname, join } from "node:path";
|
|
5
|
-
const STORAGE_DIR = join(homedir(), ".opencode");
|
|
6
5
|
const STORAGE_FILE = "openai-codex-accounts.json";
|
|
6
|
+
const AUTH_DEBUG_ENABLED = process.env.OPENCODE_OPENAI_AUTH_DEBUG === "1";
|
|
7
|
+
function debug(...args) {
|
|
8
|
+
if (!AUTH_DEBUG_ENABLED)
|
|
9
|
+
return;
|
|
10
|
+
console.debug(...args);
|
|
11
|
+
}
|
|
12
|
+
function getOpencodeConfigDir() {
|
|
13
|
+
const xdgConfigHome = process.env.XDG_CONFIG_HOME;
|
|
14
|
+
if (xdgConfigHome && xdgConfigHome.trim()) {
|
|
15
|
+
return join(xdgConfigHome, "opencode");
|
|
16
|
+
}
|
|
17
|
+
return join(homedir(), ".config", "opencode");
|
|
18
|
+
}
|
|
19
|
+
function getLegacyOpencodeDir() {
|
|
20
|
+
return join(homedir(), ".opencode");
|
|
21
|
+
}
|
|
7
22
|
export function getStoragePath() {
|
|
8
|
-
return join(
|
|
23
|
+
return join(getOpencodeConfigDir(), STORAGE_FILE);
|
|
24
|
+
}
|
|
25
|
+
function getLegacyStoragePath() {
|
|
26
|
+
return join(getLegacyOpencodeDir(), STORAGE_FILE);
|
|
27
|
+
}
|
|
28
|
+
function normalizeStorage(parsed) {
|
|
29
|
+
if (!parsed || typeof parsed !== "object")
|
|
30
|
+
return null;
|
|
31
|
+
const storage = parsed;
|
|
32
|
+
if (storage.version !== 3)
|
|
33
|
+
return null;
|
|
34
|
+
if (!Array.isArray(storage.accounts))
|
|
35
|
+
return null;
|
|
36
|
+
const activeIndex = typeof storage.activeIndex === "number" && Number.isFinite(storage.activeIndex)
|
|
37
|
+
? Math.max(0, Math.floor(storage.activeIndex))
|
|
38
|
+
: 0;
|
|
39
|
+
const clampedActiveIndex = storage.accounts.length > 0
|
|
40
|
+
? Math.min(activeIndex, storage.accounts.length - 1)
|
|
41
|
+
: 0;
|
|
42
|
+
return {
|
|
43
|
+
version: 3,
|
|
44
|
+
accounts: storage.accounts,
|
|
45
|
+
activeIndex: clampedActiveIndex,
|
|
46
|
+
activeIndexByFamily: storage.activeIndexByFamily ?? {},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function areRateLimitStatesEqual(left, right) {
|
|
50
|
+
const leftKeys = Object.keys(left);
|
|
51
|
+
const rightKeys = Object.keys(right);
|
|
52
|
+
if (leftKeys.length !== rightKeys.length)
|
|
53
|
+
return false;
|
|
54
|
+
for (const key of leftKeys) {
|
|
55
|
+
if (left[key] !== right[key])
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
function findAccountMatchIndex(accounts, candidate) {
|
|
61
|
+
if (candidate.accountId) {
|
|
62
|
+
const matchIndex = accounts.findIndex((account) => account.accountId === candidate.accountId);
|
|
63
|
+
if (matchIndex >= 0)
|
|
64
|
+
return matchIndex;
|
|
65
|
+
}
|
|
66
|
+
if (candidate.email) {
|
|
67
|
+
const matchIndex = accounts.findIndex((account) => account.email === candidate.email);
|
|
68
|
+
if (matchIndex >= 0)
|
|
69
|
+
return matchIndex;
|
|
70
|
+
}
|
|
71
|
+
if (candidate.refreshToken) {
|
|
72
|
+
return accounts.findIndex((account) => account.refreshToken === candidate.refreshToken);
|
|
73
|
+
}
|
|
74
|
+
return -1;
|
|
75
|
+
}
|
|
76
|
+
function mergeAccounts(existing, incoming) {
|
|
77
|
+
const merged = existing.map((account) => ({ ...account }));
|
|
78
|
+
let changed = false;
|
|
79
|
+
for (const candidate of incoming) {
|
|
80
|
+
const matchIndex = findAccountMatchIndex(merged, candidate);
|
|
81
|
+
if (matchIndex < 0) {
|
|
82
|
+
merged.push({ ...candidate });
|
|
83
|
+
changed = true;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const current = merged[matchIndex];
|
|
87
|
+
const updated = { ...current };
|
|
88
|
+
let didUpdate = false;
|
|
89
|
+
if (!updated.refreshToken && candidate.refreshToken) {
|
|
90
|
+
updated.refreshToken = candidate.refreshToken;
|
|
91
|
+
didUpdate = true;
|
|
92
|
+
}
|
|
93
|
+
if (!updated.accountId && candidate.accountId) {
|
|
94
|
+
updated.accountId = candidate.accountId;
|
|
95
|
+
didUpdate = true;
|
|
96
|
+
}
|
|
97
|
+
if (!updated.email && candidate.email) {
|
|
98
|
+
updated.email = candidate.email;
|
|
99
|
+
didUpdate = true;
|
|
100
|
+
}
|
|
101
|
+
const candidateAddedAt = typeof candidate.addedAt === "number" && Number.isFinite(candidate.addedAt)
|
|
102
|
+
? candidate.addedAt
|
|
103
|
+
: undefined;
|
|
104
|
+
const currentAddedAt = typeof updated.addedAt === "number" && Number.isFinite(updated.addedAt)
|
|
105
|
+
? updated.addedAt
|
|
106
|
+
: undefined;
|
|
107
|
+
if (typeof candidateAddedAt === "number" &&
|
|
108
|
+
(typeof currentAddedAt !== "number" || candidateAddedAt < currentAddedAt)) {
|
|
109
|
+
updated.addedAt = candidateAddedAt;
|
|
110
|
+
didUpdate = true;
|
|
111
|
+
}
|
|
112
|
+
const candidateLastUsed = typeof candidate.lastUsed === "number" && Number.isFinite(candidate.lastUsed)
|
|
113
|
+
? candidate.lastUsed
|
|
114
|
+
: undefined;
|
|
115
|
+
const currentLastUsed = typeof updated.lastUsed === "number" && Number.isFinite(updated.lastUsed)
|
|
116
|
+
? updated.lastUsed
|
|
117
|
+
: undefined;
|
|
118
|
+
if (typeof candidateLastUsed === "number" &&
|
|
119
|
+
(typeof currentLastUsed !== "number" || candidateLastUsed > currentLastUsed)) {
|
|
120
|
+
updated.lastUsed = candidateLastUsed;
|
|
121
|
+
didUpdate = true;
|
|
122
|
+
}
|
|
123
|
+
if (candidate.lastSwitchReason && !updated.lastSwitchReason) {
|
|
124
|
+
updated.lastSwitchReason = candidate.lastSwitchReason;
|
|
125
|
+
didUpdate = true;
|
|
126
|
+
}
|
|
127
|
+
if (candidate.rateLimitResetTimes) {
|
|
128
|
+
const mergedRateLimits = {
|
|
129
|
+
...candidate.rateLimitResetTimes,
|
|
130
|
+
...updated.rateLimitResetTimes,
|
|
131
|
+
};
|
|
132
|
+
const currentRateLimits = updated.rateLimitResetTimes ?? {};
|
|
133
|
+
if (!areRateLimitStatesEqual(currentRateLimits, mergedRateLimits)) {
|
|
134
|
+
updated.rateLimitResetTimes = mergedRateLimits;
|
|
135
|
+
didUpdate = true;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (typeof candidate.coolingDownUntil === "number") {
|
|
139
|
+
const currentCooldown = typeof updated.coolingDownUntil === "number" &&
|
|
140
|
+
Number.isFinite(updated.coolingDownUntil)
|
|
141
|
+
? updated.coolingDownUntil
|
|
142
|
+
: undefined;
|
|
143
|
+
if (typeof currentCooldown !== "number" ||
|
|
144
|
+
candidate.coolingDownUntil > currentCooldown) {
|
|
145
|
+
updated.coolingDownUntil = candidate.coolingDownUntil;
|
|
146
|
+
didUpdate = true;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (candidate.cooldownReason && !updated.cooldownReason) {
|
|
150
|
+
updated.cooldownReason = candidate.cooldownReason;
|
|
151
|
+
didUpdate = true;
|
|
152
|
+
}
|
|
153
|
+
if (didUpdate) {
|
|
154
|
+
merged[matchIndex] = updated;
|
|
155
|
+
changed = true;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return { accounts: merged, changed };
|
|
159
|
+
}
|
|
160
|
+
async function migrateLegacyAccountsFileIfNeeded() {
|
|
161
|
+
const newPath = getStoragePath();
|
|
162
|
+
const legacyPath = getLegacyStoragePath();
|
|
163
|
+
const newExists = existsSync(newPath);
|
|
164
|
+
const legacyExists = existsSync(legacyPath);
|
|
165
|
+
if (!legacyExists)
|
|
166
|
+
return;
|
|
167
|
+
if (!newExists) {
|
|
168
|
+
await fs.mkdir(dirname(newPath), { recursive: true });
|
|
169
|
+
try {
|
|
170
|
+
await fs.rename(legacyPath, newPath);
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
try {
|
|
174
|
+
await fs.copyFile(legacyPath, newPath);
|
|
175
|
+
await fs.unlink(legacyPath);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
// Best-effort; ignore.
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
try {
|
|
184
|
+
const [newRaw, legacyRaw] = await Promise.all([
|
|
185
|
+
fs.readFile(newPath, "utf-8"),
|
|
186
|
+
fs.readFile(legacyPath, "utf-8"),
|
|
187
|
+
]);
|
|
188
|
+
const newStorage = normalizeStorage(JSON.parse(newRaw));
|
|
189
|
+
const legacyStorage = normalizeStorage(JSON.parse(legacyRaw));
|
|
190
|
+
if (!legacyStorage || legacyStorage.accounts.length === 0)
|
|
191
|
+
return;
|
|
192
|
+
if (!newStorage) {
|
|
193
|
+
debug("[StorageMigration] New storage invalid, adopting legacy accounts");
|
|
194
|
+
await fs.writeFile(newPath, JSON.stringify(legacyStorage, null, 2), "utf-8");
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
const { accounts: mergedAccounts, changed } = mergeAccounts(newStorage.accounts, legacyStorage.accounts);
|
|
198
|
+
if (!changed)
|
|
199
|
+
return;
|
|
200
|
+
const baseActiveIndex = newStorage.accounts.length > 0 ? newStorage.activeIndex : legacyStorage.activeIndex;
|
|
201
|
+
const activeIndex = mergedAccounts.length > 0
|
|
202
|
+
? Math.min(Math.max(0, baseActiveIndex), mergedAccounts.length - 1)
|
|
203
|
+
: 0;
|
|
204
|
+
const activeIndexByFamily = {
|
|
205
|
+
...legacyStorage.activeIndexByFamily,
|
|
206
|
+
...newStorage.activeIndexByFamily,
|
|
207
|
+
};
|
|
208
|
+
const mergedStorage = {
|
|
209
|
+
version: 3,
|
|
210
|
+
accounts: mergedAccounts,
|
|
211
|
+
activeIndex,
|
|
212
|
+
activeIndexByFamily,
|
|
213
|
+
};
|
|
214
|
+
debug(`[StorageMigration] Merged legacy accounts (new: ${newStorage.accounts.length}, legacy: ${legacyStorage.accounts.length}, merged: ${mergedAccounts.length})`);
|
|
215
|
+
await fs.writeFile(newPath, JSON.stringify(mergedStorage, null, 2), "utf-8");
|
|
216
|
+
try {
|
|
217
|
+
await fs.unlink(legacyPath);
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
// Best-effort; ignore.
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
// Best-effort; ignore.
|
|
225
|
+
}
|
|
9
226
|
}
|
|
10
227
|
export async function loadAccounts() {
|
|
228
|
+
await migrateLegacyAccountsFileIfNeeded();
|
|
11
229
|
const filePath = getStoragePath();
|
|
230
|
+
debug(`[LoadAccounts] Loading from: ${filePath}`);
|
|
12
231
|
try {
|
|
13
|
-
if (!existsSync(filePath))
|
|
232
|
+
if (!existsSync(filePath)) {
|
|
233
|
+
debug(`[LoadAccounts] File does not exist: ${filePath}`);
|
|
14
234
|
return null;
|
|
235
|
+
}
|
|
15
236
|
const raw = await fs.readFile(filePath, "utf-8");
|
|
16
237
|
const parsed = JSON.parse(raw);
|
|
17
|
-
|
|
18
|
-
return null;
|
|
19
|
-
const storage = parsed;
|
|
20
|
-
if (storage.version !== 3)
|
|
21
|
-
return null;
|
|
22
|
-
if (!Array.isArray(storage.accounts))
|
|
23
|
-
return null;
|
|
24
|
-
const activeIndex = typeof storage.activeIndex === "number" && Number.isFinite(storage.activeIndex)
|
|
25
|
-
? Math.max(0, Math.floor(storage.activeIndex))
|
|
26
|
-
: 0;
|
|
27
|
-
const clampedActiveIndex = storage.accounts.length > 0
|
|
28
|
-
? Math.min(activeIndex, storage.accounts.length - 1)
|
|
29
|
-
: 0;
|
|
30
|
-
return {
|
|
31
|
-
version: 3,
|
|
32
|
-
accounts: storage.accounts,
|
|
33
|
-
activeIndex: clampedActiveIndex,
|
|
34
|
-
activeIndexByFamily: storage.activeIndexByFamily ?? {},
|
|
35
|
-
};
|
|
238
|
+
return normalizeStorage(parsed);
|
|
36
239
|
}
|
|
37
240
|
catch {
|
|
38
241
|
return null;
|
|
@@ -40,7 +243,26 @@ export async function loadAccounts() {
|
|
|
40
243
|
}
|
|
41
244
|
export async function saveAccounts(storage) {
|
|
42
245
|
const filePath = getStoragePath();
|
|
43
|
-
|
|
44
|
-
|
|
246
|
+
debug(`[SaveAccounts] Saving to ${filePath} with ${storage.accounts.length} accounts`);
|
|
247
|
+
try {
|
|
248
|
+
await fs.mkdir(dirname(filePath), { recursive: true });
|
|
249
|
+
const jsonContent = JSON.stringify(storage, null, 2);
|
|
250
|
+
debug(`[SaveAccounts] Writing ${jsonContent.length} bytes`);
|
|
251
|
+
await fs.writeFile(filePath, jsonContent, "utf-8");
|
|
252
|
+
if (AUTH_DEBUG_ENABLED) {
|
|
253
|
+
const verifyContent = await fs.readFile(filePath, "utf-8");
|
|
254
|
+
const verifyStorage = normalizeStorage(JSON.parse(verifyContent));
|
|
255
|
+
if (verifyStorage) {
|
|
256
|
+
debug(`[SaveAccounts] Verification successful - ${verifyStorage.accounts.length} accounts in file`);
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
debug("[SaveAccounts] Verification failed - invalid storage format");
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
catch (error) {
|
|
264
|
+
console.error("[SaveAccounts] Error saving accounts:", error);
|
|
265
|
+
throw error;
|
|
266
|
+
}
|
|
45
267
|
}
|
|
46
268
|
//# sourceMappingURL=storage.js.map
|
package/dist/lib/storage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../lib/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../lib/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run an interactive prompt without breaking OpenCode's TUI.
|
|
3
|
+
*
|
|
4
|
+
* OpenCode enables raw mode and mouse tracking for its UI. Node's readline can
|
|
5
|
+
* toggle raw mode on close, which can leave mouse tracking enabled but raw mode
|
|
6
|
+
* disabled — causing mouse movements to appear as garbage input (e.g. "M2^J").
|
|
7
|
+
*/
|
|
8
|
+
export declare function withTerminalModeRestored<T>(fn: () => Promise<T>): Promise<T>;
|
|
9
|
+
//# sourceMappingURL=terminal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../lib/terminal.ts"],"names":[],"mappings":"AAoBA;;;;;;GAMG;AACH,wBAAsB,wBAAwB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CA8BlF"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { stdin as input, stdout as output } from "node:process";
|
|
2
|
+
const AUTH_DEBUG_ENABLED = process.env.OPENCODE_OPENAI_AUTH_DEBUG === "1";
|
|
3
|
+
function debug(...args) {
|
|
4
|
+
if (!AUTH_DEBUG_ENABLED)
|
|
5
|
+
return;
|
|
6
|
+
console.debug(...args);
|
|
7
|
+
}
|
|
8
|
+
function disableMouseTracking() {
|
|
9
|
+
if (!output.isTTY)
|
|
10
|
+
return;
|
|
11
|
+
// Disable common xterm mouse tracking modes.
|
|
12
|
+
output.write("\x1b[?1000l\x1b[?1002l\x1b[?1003l\x1b[?1006l");
|
|
13
|
+
}
|
|
14
|
+
function enableMouseTracking() {
|
|
15
|
+
if (!output.isTTY)
|
|
16
|
+
return;
|
|
17
|
+
output.write("\x1b[?1000h\x1b[?1002h\x1b[?1003h\x1b[?1006h");
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Run an interactive prompt without breaking OpenCode's TUI.
|
|
21
|
+
*
|
|
22
|
+
* OpenCode enables raw mode and mouse tracking for its UI. Node's readline can
|
|
23
|
+
* toggle raw mode on close, which can leave mouse tracking enabled but raw mode
|
|
24
|
+
* disabled — causing mouse movements to appear as garbage input (e.g. "M2^J").
|
|
25
|
+
*/
|
|
26
|
+
export async function withTerminalModeRestored(fn) {
|
|
27
|
+
if (!input.isTTY) {
|
|
28
|
+
debug("[TerminalGuard] No TTY detected, skipping terminal guard");
|
|
29
|
+
return await fn();
|
|
30
|
+
}
|
|
31
|
+
const wasRaw = input.isRaw;
|
|
32
|
+
debug(`[TerminalGuard] Starting guard - wasRaw: ${wasRaw}, isTTY: ${input.isTTY}`);
|
|
33
|
+
try {
|
|
34
|
+
debug("[TerminalGuard] Disabling mouse tracking");
|
|
35
|
+
disableMouseTracking();
|
|
36
|
+
// Ensure we can accept normal line input during prompts.
|
|
37
|
+
if (typeof input.setRawMode === "function") {
|
|
38
|
+
debug("[TerminalGuard] Setting raw mode to false");
|
|
39
|
+
input.setRawMode(false);
|
|
40
|
+
}
|
|
41
|
+
return await fn();
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
debug(`[TerminalGuard] Restoring terminal state - wasRaw: ${wasRaw}`);
|
|
45
|
+
if (typeof wasRaw === "boolean" && typeof input.setRawMode === "function") {
|
|
46
|
+
input.setRawMode(wasRaw);
|
|
47
|
+
}
|
|
48
|
+
// If OpenCode was previously in raw mode, re-enable mouse tracking so the UI
|
|
49
|
+
// doesn't get stuck in a non-mouse state.
|
|
50
|
+
if (wasRaw) {
|
|
51
|
+
debug("[TerminalGuard] Re-enabling mouse tracking");
|
|
52
|
+
enableMouseTracking();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=terminal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../lib/terminal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAEhE,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAAK,GAAG,CAAC;AAE1E,SAAS,KAAK,CAAC,GAAG,IAAe;IAChC,IAAI,CAAC,kBAAkB;QAAE,OAAO;IAChC,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,oBAAoB;IAC5B,IAAI,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO;IAC1B,6CAA6C;IAC7C,MAAM,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,mBAAmB;IAC3B,IAAI,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO;IAC1B,MAAM,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAI,EAAoB;IACrE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAClB,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAClE,OAAO,MAAM,EAAE,EAAE,CAAC;IACnB,CAAC;IAED,MAAM,MAAM,GAAI,KAAwC,CAAC,KAAK,CAAC;IAC/D,KAAK,CAAC,4CAA4C,MAAM,YAAY,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IAEnF,IAAI,CAAC;QACJ,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAClD,oBAAoB,EAAE,CAAC;QACvB,yDAAyD;QACzD,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;YAC5C,KAAK,CAAC,2CAA2C,CAAC,CAAC;YACnD,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,MAAM,EAAE,EAAE,CAAC;IACnB,CAAC;YAAS,CAAC;QACV,KAAK,CAAC,sDAAsD,MAAM,EAAE,CAAC,CAAC;QACtE,IAAI,OAAO,MAAM,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;YAC3E,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;QACD,6EAA6E;QAC7E,0CAA0C;QAC1C,IAAI,MAAM,EAAE,CAAC;YACZ,KAAK,CAAC,4CAA4C,CAAC,CAAC;YACpD,mBAAmB,EAAE,CAAC;QACvB,CAAC;IACF,CAAC;AACF,CAAC"}
|
package/dist/lib/types.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Auth, Provider, Model } from "@opencode-ai/sdk";
|
|
2
2
|
/**
|
|
3
|
-
* Plugin configuration from ~/.opencode/openai-codex-auth-config.json
|
|
3
|
+
* Plugin configuration from ~/.config/opencode/openai-codex-auth-config.json
|
|
4
4
|
*/
|
|
5
5
|
export interface PluginConfig {
|
|
6
6
|
/**
|
|
@@ -55,7 +55,7 @@ export interface PluginConfig {
|
|
|
55
55
|
*/
|
|
56
56
|
retryAllAccountsMaxRetries?: number;
|
|
57
57
|
}
|
|
58
|
-
export type AccountSelectionStrategy = "sticky" | "round-robin";
|
|
58
|
+
export type AccountSelectionStrategy = "sticky" | "round-robin" | "hybrid";
|
|
59
59
|
export type OAuthAuthDetails = Extract<Auth, {
|
|
60
60
|
type: "oauth";
|
|
61
61
|
}>;
|
package/dist/lib/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../lib/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;;OAKG;IACH,wBAAwB,CAAC,EAAE,wBAAwB,CAAC;IAEpD;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;;OAGG;IACH,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAElC;;;OAGG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAC;IAEtC;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAEnC;;;OAGG;IACH,0BAA0B,CAAC,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,MAAM,wBAAwB,GAAG,QAAQ,GAAG,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../lib/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "opencode-openai-codex-multi-auth",
|
|
3
|
-
"version": "4.4.
|
|
3
|
+
"version": "4.4.6",
|
|
4
4
|
"description": "OpenAI ChatGPT (Codex backend) OAuth auth plugin for opencode - use your ChatGPT Plus/Pro subscription instead of API credits",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -49,7 +49,8 @@
|
|
|
49
49
|
"config/",
|
|
50
50
|
"scripts/",
|
|
51
51
|
"README.md",
|
|
52
|
-
"LICENSE"
|
|
52
|
+
"LICENSE",
|
|
53
|
+
"THIRD_PARTY_NOTICES.md"
|
|
53
54
|
],
|
|
54
55
|
"engines": {
|
|
55
56
|
"node": ">=20.0.0"
|
|
@@ -61,11 +61,10 @@ const cacheNodeModulesLegacyGitHub = join(cacheDir, "node_modules", LEGACY_GITHU
|
|
|
61
61
|
const cacheBunLock = join(cacheDir, "bun.lock");
|
|
62
62
|
const cachePackageJson = join(cacheDir, "package.json");
|
|
63
63
|
const opencodeAuthPath = join(homedir(), ".opencode", "auth", "openai.json");
|
|
64
|
-
const pluginConfigPath = join(
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
);
|
|
64
|
+
const pluginConfigPath = join(configDir, "openai-codex-auth-config.json");
|
|
65
|
+
const legacyPluginConfigPath = join(homedir(), ".opencode", "openai-codex-auth-config.json");
|
|
66
|
+
const legacyAccountsPath = join(homedir(), ".opencode", "openai-codex-accounts.json");
|
|
67
|
+
const accountsPath = join(configDir, "openai-codex-accounts.json");
|
|
69
68
|
const pluginLogDir = join(homedir(), ".opencode", "logs", "codex-plugin");
|
|
70
69
|
const opencodeCacheDir = join(homedir(), ".opencode", "cache");
|
|
71
70
|
|
|
@@ -272,10 +271,16 @@ async function clearPluginArtifacts() {
|
|
|
272
271
|
if (dryRun) {
|
|
273
272
|
log(`[dry-run] Would remove ${opencodeAuthPath}`);
|
|
274
273
|
log(`[dry-run] Would remove ${pluginConfigPath}`);
|
|
274
|
+
log(`[dry-run] Would remove ${legacyPluginConfigPath}`);
|
|
275
|
+
log(`[dry-run] Would remove ${accountsPath}`);
|
|
276
|
+
log(`[dry-run] Would remove ${legacyAccountsPath}`);
|
|
275
277
|
log(`[dry-run] Would remove ${pluginLogDir}`);
|
|
276
278
|
} else {
|
|
277
279
|
await rm(opencodeAuthPath, { force: true });
|
|
278
280
|
await rm(pluginConfigPath, { force: true });
|
|
281
|
+
await rm(legacyPluginConfigPath, { force: true });
|
|
282
|
+
await rm(accountsPath, { force: true });
|
|
283
|
+
await rm(legacyAccountsPath, { force: true });
|
|
279
284
|
await rm(pluginLogDir, { recursive: true, force: true });
|
|
280
285
|
}
|
|
281
286
|
|