better-opencode-openai-codex-auth 0.1.2 → 0.1.4
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 +5 -17
- package/config/README.md +14 -93
- package/config/minimal-opencode.json +1 -1
- package/config/opencode-modern.json +26 -107
- package/dist/index.d.ts +0 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +195 -94
- package/dist/index.js.map +1 -1
- package/dist/lib/account-pool.d.ts +29 -3
- package/dist/lib/account-pool.d.ts.map +1 -1
- package/dist/lib/account-pool.js +210 -47
- package/dist/lib/account-pool.js.map +1 -1
- package/dist/lib/auth/auth.d.ts +55 -4
- package/dist/lib/auth/auth.d.ts.map +1 -1
- package/dist/lib/auth/auth.js +130 -6
- package/dist/lib/auth/auth.js.map +1 -1
- package/dist/lib/auth/ui/account-menu.d.ts +50 -0
- package/dist/lib/auth/ui/account-menu.d.ts.map +1 -0
- package/dist/lib/auth/ui/account-menu.js +258 -0
- package/dist/lib/auth/ui/account-menu.js.map +1 -0
- package/dist/lib/auth/ui/ansi.d.ts +23 -0
- package/dist/lib/auth/ui/ansi.d.ts.map +1 -0
- package/dist/lib/auth/ui/ansi.js +37 -0
- package/dist/lib/auth/ui/ansi.js.map +1 -0
- package/dist/lib/auth/ui/confirm.d.ts +2 -0
- package/dist/lib/auth/ui/confirm.d.ts.map +1 -0
- package/dist/lib/auth/ui/confirm.js +8 -0
- package/dist/lib/auth/ui/confirm.js.map +1 -0
- package/dist/lib/auth/ui/select.d.ts +21 -0
- package/dist/lib/auth/ui/select.d.ts.map +1 -0
- package/dist/lib/auth/ui/select.js +208 -0
- package/dist/lib/auth/ui/select.js.map +1 -0
- package/dist/lib/constants.d.ts +51 -3
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +55 -3
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/refresh-queue.d.ts +56 -0
- package/dist/lib/refresh-queue.d.ts.map +1 -0
- package/dist/lib/refresh-queue.js +148 -0
- package/dist/lib/refresh-queue.js.map +1 -0
- package/dist/lib/request/fetch-helpers.d.ts +2 -1
- package/dist/lib/request/fetch-helpers.d.ts.map +1 -1
- package/dist/lib/request/fetch-helpers.js +23 -3
- package/dist/lib/request/fetch-helpers.js.map +1 -1
- package/dist/lib/types.d.ts +18 -2
- package/dist/lib/types.d.ts.map +1 -1
- package/package.json +1 -2
- package/scripts/install-opencode-codex-auth.js +10 -29
- package/config/opencode-legacy.json +0 -571
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proactive Token Refresh Queue (#8)
|
|
3
|
+
*
|
|
4
|
+
* Runs as a background timer and refreshes OAuth tokens that are approaching
|
|
5
|
+
* expiry. This ensures user requests are never blocked by an in-flight token
|
|
6
|
+
* refresh — the pool always has fresh credentials ready.
|
|
7
|
+
*
|
|
8
|
+
* Adapted from the LLM-API-Key-Proxy pattern used in
|
|
9
|
+
* NoeFabris/opencode-antigravity-auth, stripped of Google-specific logic.
|
|
10
|
+
*
|
|
11
|
+
* Key properties:
|
|
12
|
+
* - Non-blocking: runs independently of the request path
|
|
13
|
+
* - Serialized: only one refresh pass runs at a time (no concurrent storms)
|
|
14
|
+
* - Per-account: skips expired or already-up-to-date tokens
|
|
15
|
+
* - Configurable: buffer window and check interval are tunable
|
|
16
|
+
*/
|
|
17
|
+
import { refreshAccessTokenShared } from "./auth/auth.js";
|
|
18
|
+
import { logDebug, logWarn } from "./logger.js";
|
|
19
|
+
export const DEFAULT_PROACTIVE_REFRESH_CONFIG = {
|
|
20
|
+
enabled: true,
|
|
21
|
+
bufferSeconds: 1800, // 30 minutes before expiry
|
|
22
|
+
checkIntervalSeconds: 300, // check every 5 minutes
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Proactive Token Refresh Queue.
|
|
26
|
+
*
|
|
27
|
+
* Usage:
|
|
28
|
+
* const queue = new ProactiveRefreshQueue(accountPool);
|
|
29
|
+
* queue.start();
|
|
30
|
+
* // ... plugin runs ...
|
|
31
|
+
* queue.stop(); // optional, on process exit
|
|
32
|
+
*/
|
|
33
|
+
export class ProactiveRefreshQueue {
|
|
34
|
+
config;
|
|
35
|
+
pool;
|
|
36
|
+
isRunning = false;
|
|
37
|
+
isRefreshing = false;
|
|
38
|
+
intervalHandle = null;
|
|
39
|
+
constructor(pool, config) {
|
|
40
|
+
this.pool = pool;
|
|
41
|
+
this.config = { ...DEFAULT_PROACTIVE_REFRESH_CONFIG, ...config };
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Start the background refresh loop.
|
|
45
|
+
* An initial check runs 5 s after start (letting things settle).
|
|
46
|
+
*/
|
|
47
|
+
start() {
|
|
48
|
+
if (this.isRunning || !this.config.enabled)
|
|
49
|
+
return;
|
|
50
|
+
this.isRunning = true;
|
|
51
|
+
// Initial check after a short settling delay
|
|
52
|
+
setTimeout(() => {
|
|
53
|
+
if (this.isRunning) {
|
|
54
|
+
this.runRefreshCheck().catch((err) => {
|
|
55
|
+
logWarn("ProactiveRefreshQueue: initial check failed", err);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}, 5_000);
|
|
59
|
+
// Periodic checks
|
|
60
|
+
const intervalMs = this.config.checkIntervalSeconds * 1000;
|
|
61
|
+
this.intervalHandle = setInterval(() => {
|
|
62
|
+
this.runRefreshCheck().catch((err) => {
|
|
63
|
+
logWarn("ProactiveRefreshQueue: periodic check failed", err);
|
|
64
|
+
});
|
|
65
|
+
}, intervalMs);
|
|
66
|
+
logDebug("ProactiveRefreshQueue started", {
|
|
67
|
+
checkIntervalSeconds: this.config.checkIntervalSeconds,
|
|
68
|
+
bufferSeconds: this.config.bufferSeconds,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
stop() {
|
|
72
|
+
if (!this.isRunning)
|
|
73
|
+
return;
|
|
74
|
+
this.isRunning = false;
|
|
75
|
+
if (this.intervalHandle) {
|
|
76
|
+
clearInterval(this.intervalHandle);
|
|
77
|
+
this.intervalHandle = null;
|
|
78
|
+
}
|
|
79
|
+
logDebug("ProactiveRefreshQueue stopped");
|
|
80
|
+
}
|
|
81
|
+
/** Whether the queue is currently running */
|
|
82
|
+
get running() {
|
|
83
|
+
return this.isRunning;
|
|
84
|
+
}
|
|
85
|
+
// ---------------------------------------------------------------------------
|
|
86
|
+
needsRefresh(account) {
|
|
87
|
+
if (!account.expires)
|
|
88
|
+
return false;
|
|
89
|
+
const bufferMs = this.config.bufferSeconds * 1000;
|
|
90
|
+
return account.expires <= Date.now() + bufferMs;
|
|
91
|
+
}
|
|
92
|
+
isAlreadyExpired(account) {
|
|
93
|
+
if (!account.expires)
|
|
94
|
+
return false;
|
|
95
|
+
return account.expires <= Date.now();
|
|
96
|
+
}
|
|
97
|
+
async runRefreshCheck() {
|
|
98
|
+
if (this.isRefreshing)
|
|
99
|
+
return; // previous pass still running
|
|
100
|
+
this.isRefreshing = true;
|
|
101
|
+
try {
|
|
102
|
+
const accounts = this.pool.getAccounts().filter((a) => {
|
|
103
|
+
// Skip accounts that are already expired — let the main fetch loop handle those
|
|
104
|
+
if (this.isAlreadyExpired(a))
|
|
105
|
+
return false;
|
|
106
|
+
return this.needsRefresh(a);
|
|
107
|
+
});
|
|
108
|
+
if (accounts.length === 0)
|
|
109
|
+
return;
|
|
110
|
+
logDebug(`ProactiveRefreshQueue: refreshing ${accounts.length} account(s)`);
|
|
111
|
+
// Refresh serially — prevents concurrent refresh storms
|
|
112
|
+
for (const account of accounts) {
|
|
113
|
+
if (!this.isRunning)
|
|
114
|
+
break; // stopped mid-pass
|
|
115
|
+
try {
|
|
116
|
+
const result = await refreshAccessTokenShared(account.accountId, account.refresh);
|
|
117
|
+
if (result.type === "success") {
|
|
118
|
+
this.pool.replaceAuth(account.accountId, result.access, result.refresh, result.expires);
|
|
119
|
+
try {
|
|
120
|
+
this.pool.save();
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// Non-fatal — token is already updated in memory
|
|
124
|
+
}
|
|
125
|
+
logDebug("ProactiveRefreshQueue: refreshed account", {
|
|
126
|
+
accountId: account.accountId,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
logWarn("ProactiveRefreshQueue: refresh failed for account", {
|
|
131
|
+
accountId: account.accountId,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
logWarn("ProactiveRefreshQueue: unexpected error refreshing account", {
|
|
137
|
+
accountId: account.accountId,
|
|
138
|
+
error: err instanceof Error ? err.message : String(err),
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
finally {
|
|
144
|
+
this.isRefreshing = false;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=refresh-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refresh-queue.js","sourceRoot":"","sources":["../../lib/refresh-queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,7 +25,8 @@ export declare function refreshAndUpdateToken(currentAuth: Auth, client: Opencod
|
|
|
25
25
|
*/
|
|
26
26
|
export declare function extractRequestUrl(input: Request | string | URL): string;
|
|
27
27
|
/**
|
|
28
|
-
* Rewrites OpenAI API URLs to Codex backend URLs
|
|
28
|
+
* Rewrites OpenAI API URLs to Codex backend URLs.
|
|
29
|
+
* Handles both the Responses API path and the Chat Completions compat path (#7).
|
|
29
30
|
* @param url - Original URL
|
|
30
31
|
* @returns Rewritten URL for Codex backend
|
|
31
32
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-helpers.d.ts","sourceRoot":"","sources":["../../../lib/request/fetch-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAMvD,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAY3D;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAEtD;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAC1C,WAAW,EAAE,IAAI,EACjB,MAAM,EAAE,cAAc,GACpB,OAAO,CAAC,IAAI,CAAC,CA2Bf;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,GAAG,GAAG,MAAM,CAIvE;AAED
|
|
1
|
+
{"version":3,"file":"fetch-helpers.d.ts","sourceRoot":"","sources":["../../../lib/request/fetch-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAMvD,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAY3D;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAEtD;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAC1C,WAAW,EAAE,IAAI,EACjB,MAAM,EAAE,cAAc,GACpB,OAAO,CAAC,IAAI,CAAC,CA2Bf;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,GAAG,GAAG,MAAM,CAIvE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAiBtD;AAED;;;;;;;;;GASG;AACH,wBAAsB,wBAAwB,CAC7C,IAAI,EAAE,WAAW,GAAG,SAAS,EAC7B,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,UAAU,EACtB,SAAS,UAAO,GACd,OAAO,CAAC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,WAAW,EAAE,WAAW,CAAA;CAAE,GAAG,SAAS,CAAC,CA0DtE;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAC9B,IAAI,EAAE,WAAW,GAAG,SAAS,EAC7B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GACnD,OAAO,CAqBT;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACrC,QAAQ,EAAE,QAAQ,GACnB,OAAO,CAAC,QAAQ,CAAC,CAUnB;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACvC,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,OAAO,GACrB,OAAO,CAAC,QAAQ,CAAC,CAcnB"}
|
|
@@ -59,12 +59,29 @@ export function extractRequestUrl(input) {
|
|
|
59
59
|
return input.url;
|
|
60
60
|
}
|
|
61
61
|
/**
|
|
62
|
-
* Rewrites OpenAI API URLs to Codex backend URLs
|
|
62
|
+
* Rewrites OpenAI API URLs to Codex backend URLs.
|
|
63
|
+
* Handles both the Responses API path and the Chat Completions compat path (#7).
|
|
63
64
|
* @param url - Original URL
|
|
64
65
|
* @returns Rewritten URL for Codex backend
|
|
65
66
|
*/
|
|
66
67
|
export function rewriteUrlForCodex(url) {
|
|
67
|
-
|
|
68
|
+
// /v1/responses or /responses → /codex/responses
|
|
69
|
+
if (url.includes(URL_PATHS.RESPONSES)) {
|
|
70
|
+
return url.replace(URL_PATHS.RESPONSES, URL_PATHS.CODEX_RESPONSES);
|
|
71
|
+
}
|
|
72
|
+
// /chat/completions (Chat Completions compat layer) → codex endpoint
|
|
73
|
+
if (url.includes(URL_PATHS.CHAT_COMPLETIONS)) {
|
|
74
|
+
try {
|
|
75
|
+
const parsed = new URL(url);
|
|
76
|
+
parsed.pathname = URL_PATHS.CODEX_RESPONSES;
|
|
77
|
+
return parsed.toString();
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Fallback for relative paths
|
|
81
|
+
return url.replace(URL_PATHS.CHAT_COMPLETIONS, URL_PATHS.CODEX_RESPONSES);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return url;
|
|
68
85
|
}
|
|
69
86
|
/**
|
|
70
87
|
* Transforms request body and logs the transformation
|
|
@@ -141,12 +158,15 @@ export function createCodexHeaders(init, accountId, accessToken, opts) {
|
|
|
141
158
|
headers.set(OPENAI_HEADERS.ORIGINATOR, OPENAI_HEADER_VALUES.ORIGINATOR_CODEX);
|
|
142
159
|
const cacheKey = opts?.promptCacheKey;
|
|
143
160
|
if (cacheKey) {
|
|
161
|
+
// Use prompt_cache_key for both conversation and session tracking
|
|
144
162
|
headers.set(OPENAI_HEADERS.CONVERSATION_ID, cacheKey);
|
|
145
163
|
headers.set(OPENAI_HEADERS.SESSION_ID, cacheKey);
|
|
146
164
|
}
|
|
147
165
|
else {
|
|
166
|
+
// No explicit cache key — remove conversation_id but preserve session_id
|
|
167
|
+
// if it was already injected by the chat.headers hook (#4: platform session ID)
|
|
148
168
|
headers.delete(OPENAI_HEADERS.CONVERSATION_ID);
|
|
149
|
-
|
|
169
|
+
// session_id is left as-is (may have been set to input.sessionID by chat.headers hook)
|
|
150
170
|
}
|
|
151
171
|
headers.set("accept", "text/event-stream");
|
|
152
172
|
return headers;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-helpers.js","sourceRoot":"","sources":["../../../lib/request/fetch-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE5E,OAAO,EACN,WAAW,EACX,WAAW,EACX,cAAc,EACd,oBAAoB,EACpB,SAAS,EACT,cAAc,EACd,UAAU,EACV,mBAAmB,GACnB,MAAM,iBAAiB,CAAC;AAEzB;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAU;IAC5C,OAAO,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAC3E,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAC1C,WAAiB,EACjB,MAAsB;IAEtB,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7E,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAAC,YAAY,CAAC,CAAC;IAE7D,IAAI,aAAa,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;IACtD,CAAC;IAED,4BAA4B;IAC5B,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QACrB,IAAI,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE;QACtB,IAAI,EAAE;YACL,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,aAAa,CAAC,MAAM;YAC5B,OAAO,EAAE,aAAa,CAAC,OAAO;YAC9B,OAAO,EAAE,aAAa,CAAC,OAAO;SAC9B;KACD,CAAC,CAAC;IAEH,mDAAmD;IACnD,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAClC,WAAW,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;QAC1C,WAAW,CAAC,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC;QAC5C,WAAW,CAAC,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC;IAC7C,CAAC;IAED,OAAO,WAAW,CAAC;AACpB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAA6B;IAC9D,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,KAAK,YAAY,GAAG;QAAE,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAClD,OAAO,KAAK,CAAC,GAAG,CAAC;AAClB,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"fetch-helpers.js","sourceRoot":"","sources":["../../../lib/request/fetch-helpers.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/types.d.ts
CHANGED
|
@@ -19,9 +19,15 @@ export interface AccountPoolEntry {
|
|
|
19
19
|
email?: string;
|
|
20
20
|
lastUsed?: number;
|
|
21
21
|
rateLimitedUntil?: number;
|
|
22
|
+
/** Timestamp until which this account is cooling down after consecutive auth failures */
|
|
23
|
+
coolingDownUntil?: number;
|
|
24
|
+
/** Number of consecutive auth/token-refresh failures (resets after FAILURE_RESET_MS) */
|
|
25
|
+
consecutiveFailures?: number;
|
|
26
|
+
/** Timestamp of the most recent failure, used for TTL-based counter reset */
|
|
27
|
+
lastFailureAt?: number;
|
|
22
28
|
}
|
|
23
29
|
export interface AccountPoolStorage {
|
|
24
|
-
version:
|
|
30
|
+
version: 2;
|
|
25
31
|
activeIndex: number;
|
|
26
32
|
accounts: AccountPoolEntry[];
|
|
27
33
|
}
|
|
@@ -90,6 +96,8 @@ export interface TokenSuccess {
|
|
|
90
96
|
access: string;
|
|
91
97
|
refresh: string;
|
|
92
98
|
expires: number;
|
|
99
|
+
/** id_token JWT returned by OpenAI — contains chatgpt_account_id as a dedicated claim */
|
|
100
|
+
id_token?: string;
|
|
93
101
|
}
|
|
94
102
|
/**
|
|
95
103
|
* Token exchange failure result
|
|
@@ -109,12 +117,20 @@ export interface ParsedAuthInput {
|
|
|
109
117
|
state?: string;
|
|
110
118
|
}
|
|
111
119
|
/**
|
|
112
|
-
* JWT payload with ChatGPT account info
|
|
120
|
+
* JWT payload with ChatGPT account info.
|
|
121
|
+
* The account ID may be present at the root OR nested under the openai auth claim.
|
|
113
122
|
*/
|
|
114
123
|
export interface JWTPayload {
|
|
124
|
+
/** Direct account ID claim (first-party opencode uses this as primary lookup) */
|
|
125
|
+
chatgpt_account_id?: string;
|
|
126
|
+
/** Nested claim used by some token variants */
|
|
115
127
|
"https://api.openai.com/auth"?: {
|
|
116
128
|
chatgpt_account_id?: string;
|
|
117
129
|
};
|
|
130
|
+
/** Org-based fallback when chatgpt_account_id is absent */
|
|
131
|
+
organizations?: Array<{
|
|
132
|
+
id: string;
|
|
133
|
+
}>;
|
|
118
134
|
[key: string]: unknown;
|
|
119
135
|
}
|
|
120
136
|
/**
|
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;IACpB,wBAAwB,CAAC,EAAE,QAAQ,GAAG,aAAa,CAAC;IACpD,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,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": "better-opencode-openai-codex-auth",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
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",
|
|
@@ -64,7 +64,6 @@
|
|
|
64
64
|
},
|
|
65
65
|
"dependencies": {
|
|
66
66
|
"@openauthjs/openauth": "^0.4.3",
|
|
67
|
-
"hono": "^4.12.7",
|
|
68
67
|
"jsonc-parser": "^3.3.1",
|
|
69
68
|
"zod": "^4.3.6"
|
|
70
69
|
},
|
|
@@ -8,18 +8,16 @@ import { homedir } from "node:os";
|
|
|
8
8
|
import { parse, modify, applyEdits, printParseErrorCode } from "jsonc-parser";
|
|
9
9
|
|
|
10
10
|
const PLUGIN_NAME = "better-opencode-openai-codex-auth";
|
|
11
|
+
const PLUGIN_REF = `${PLUGIN_NAME}@latest`;
|
|
11
12
|
const args = new Set(process.argv.slice(2));
|
|
12
13
|
|
|
13
14
|
if (args.has("--help") || args.has("-h")) {
|
|
14
|
-
console.log(`Usage: ${PLUGIN_NAME} [--
|
|
15
|
+
console.log(`Usage: ${PLUGIN_NAME} [--uninstall] [--all] [--dry-run] [--no-cache-clear]\n\n` +
|
|
15
16
|
"Default behavior:\n" +
|
|
16
|
-
" - Installs/updates global config at ~/.config/opencode/opencode.jsonc
|
|
17
|
-
" - Uses modern config (variants) by default\n" +
|
|
17
|
+
" - Installs/updates global config at ~/.config/opencode/opencode.jsonc\n" +
|
|
18
18
|
" - Ensures plugin is unpinned (latest)\n" +
|
|
19
19
|
" - Clears OpenCode plugin cache\n\n" +
|
|
20
20
|
"Options:\n" +
|
|
21
|
-
" --modern Force modern config (default)\n" +
|
|
22
|
-
" --legacy Use legacy config (older OpenCode versions)\n" +
|
|
23
21
|
" --uninstall Remove plugin + OpenAI config entries from global config\n" +
|
|
24
22
|
" --all With --uninstall, also remove tokens, logs, and cached instructions\n" +
|
|
25
23
|
" --dry-run Show actions without writing\n" +
|
|
@@ -28,8 +26,6 @@ if (args.has("--help") || args.has("-h")) {
|
|
|
28
26
|
process.exit(0);
|
|
29
27
|
}
|
|
30
28
|
|
|
31
|
-
const useLegacy = args.has("--legacy");
|
|
32
|
-
const useModern = args.has("--modern") || !useLegacy;
|
|
33
29
|
const uninstallRequested = args.has("--uninstall") || args.has("--all");
|
|
34
30
|
const uninstallAll = args.has("--all");
|
|
35
31
|
const dryRun = args.has("--dry-run");
|
|
@@ -37,11 +33,7 @@ const skipCacheClear = args.has("--no-cache-clear");
|
|
|
37
33
|
|
|
38
34
|
const scriptDir = dirname(fileURLToPath(import.meta.url));
|
|
39
35
|
const repoRoot = resolve(scriptDir, "..");
|
|
40
|
-
const templatePath = join(
|
|
41
|
-
repoRoot,
|
|
42
|
-
"config",
|
|
43
|
-
useLegacy ? "opencode-legacy.json" : "opencode-modern.json"
|
|
44
|
-
);
|
|
36
|
+
const templatePath = join(repoRoot, "config", "opencode-modern.json");
|
|
45
37
|
|
|
46
38
|
const configDir = join(homedir(), ".config", "opencode");
|
|
47
39
|
const configPathJson = join(configDir, "opencode.json");
|
|
@@ -70,7 +62,7 @@ function normalizePluginList(list) {
|
|
|
70
62
|
if (typeof entry !== "string") return true;
|
|
71
63
|
return entry !== PLUGIN_NAME && !entry.startsWith(`${PLUGIN_NAME}@`);
|
|
72
64
|
});
|
|
73
|
-
return [...filtered,
|
|
65
|
+
return [...filtered, PLUGIN_REF];
|
|
74
66
|
}
|
|
75
67
|
|
|
76
68
|
function removePluginEntries(list) {
|
|
@@ -117,19 +109,10 @@ function mergeOpenAIConfig(existingOpenAI, templateOpenAI) {
|
|
|
117
109
|
}
|
|
118
110
|
|
|
119
111
|
async function getKnownModelIds() {
|
|
120
|
-
const legacyTemplate = await readJson(
|
|
121
|
-
join(repoRoot, "config", "opencode-legacy.json"),
|
|
122
|
-
);
|
|
123
112
|
const modernTemplate = await readJson(
|
|
124
113
|
join(repoRoot, "config", "opencode-modern.json"),
|
|
125
114
|
);
|
|
126
|
-
|
|
127
|
-
legacyTemplate?.provider?.openai?.models || {},
|
|
128
|
-
);
|
|
129
|
-
const modernModels = Object.keys(
|
|
130
|
-
modernTemplate?.provider?.openai?.models || {},
|
|
131
|
-
);
|
|
132
|
-
return new Set([...legacyModels, ...modernModels]);
|
|
115
|
+
return new Set(Object.keys(modernTemplate?.provider?.openai?.models || {}));
|
|
133
116
|
}
|
|
134
117
|
|
|
135
118
|
function formatJson(obj) {
|
|
@@ -372,7 +355,7 @@ async function main() {
|
|
|
372
355
|
}
|
|
373
356
|
|
|
374
357
|
const template = await readJson(templatePath);
|
|
375
|
-
template.plugin = [
|
|
358
|
+
template.plugin = [PLUGIN_REF];
|
|
376
359
|
|
|
377
360
|
let nextConfig = template;
|
|
378
361
|
let nextContent = null;
|
|
@@ -407,7 +390,7 @@ async function main() {
|
|
|
407
390
|
}
|
|
408
391
|
|
|
409
392
|
if (dryRun) {
|
|
410
|
-
log(`[dry-run] Would write ${configPath}
|
|
393
|
+
log(`[dry-run] Would write ${configPath}`);
|
|
411
394
|
} else {
|
|
412
395
|
await mkdir(configDir, { recursive: true });
|
|
413
396
|
if (nextContent && configExists) {
|
|
@@ -415,16 +398,14 @@ async function main() {
|
|
|
415
398
|
} else {
|
|
416
399
|
await writeFile(configPath, formatJson(nextConfig), "utf-8");
|
|
417
400
|
}
|
|
418
|
-
log(`Wrote ${configPath}
|
|
401
|
+
log(`Wrote ${configPath}`);
|
|
419
402
|
}
|
|
420
403
|
|
|
421
404
|
await clearCache();
|
|
422
405
|
|
|
423
406
|
log("\nDone. Restart OpenCode to (re)install the plugin.");
|
|
424
407
|
log("Example: opencode");
|
|
425
|
-
|
|
426
|
-
log("Note: Legacy config requires OpenCode v1.0.209 or older.");
|
|
427
|
-
}
|
|
408
|
+
|
|
428
409
|
}
|
|
429
410
|
|
|
430
411
|
main().catch((error) => {
|