opencode-openai-multi-auth 5.0.1 → 5.0.3
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 +8 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +190 -8
- package/dist/index.js.map +1 -1
- package/dist/lib/accounts/manager.d.ts +18 -0
- package/dist/lib/accounts/manager.d.ts.map +1 -1
- package/dist/lib/accounts/manager.js +149 -16
- package/dist/lib/accounts/manager.js.map +1 -1
- package/dist/lib/accounts/types.d.ts +1 -0
- package/dist/lib/accounts/types.d.ts.map +1 -1
- package/dist/lib/accounts/types.js.map +1 -1
- package/dist/lib/auth/auth.d.ts.map +1 -1
- package/dist/lib/auth/auth.js +8 -0
- package/dist/lib/auth/auth.js.map +1 -1
- package/dist/lib/codex-status.d.ts +41 -0
- package/dist/lib/codex-status.d.ts.map +1 -0
- package/dist/lib/codex-status.js +349 -0
- package/dist/lib/codex-status.js.map +1 -0
- package/dist/lib/constants.d.ts +8 -0
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +13 -0
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/models.d.ts +42 -0
- package/dist/lib/models.d.ts.map +1 -0
- package/dist/lib/models.js +85 -0
- package/dist/lib/models.js.map +1 -0
- package/dist/lib/prompts/codex-opencode-bridge.d.ts +1 -1
- package/dist/lib/prompts/codex-opencode-bridge.d.ts.map +1 -1
- package/dist/lib/prompts/codex-opencode-bridge.js +22 -5
- package/dist/lib/prompts/codex-opencode-bridge.js.map +1 -1
- package/dist/lib/prompts/codex.d.ts.map +1 -1
- package/dist/lib/prompts/codex.js +10 -0
- package/dist/lib/prompts/codex.js.map +1 -1
- 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 +32 -3
- package/dist/lib/request/fetch-helpers.js.map +1 -1
- package/dist/lib/request/helpers/model-map.d.ts.map +1 -1
- package/dist/lib/request/helpers/model-map.js +43 -11
- package/dist/lib/request/helpers/model-map.js.map +1 -1
- package/dist/lib/request/request-transformer.d.ts.map +1 -1
- package/dist/lib/request/request-transformer.js +32 -7
- package/dist/lib/request/request-transformer.js.map +1 -1
- package/dist/lib/types.d.ts +1 -0
- package/dist/lib/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
import { promises as fs, existsSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
5
|
+
const STALENESS_TTL_MS = 15 * 60 * 1000;
|
|
6
|
+
const SNAPSHOT_RETENTION_MS = 7 * 24 * 60 * 60 * 1000;
|
|
7
|
+
const SNAPSHOTS_FILE = "codex-snapshots.json";
|
|
8
|
+
const WHAM_USAGE_URL = "https://chatgpt.com/backend-api/wham/usage";
|
|
9
|
+
const CODEX_USAGE_URL = "https://api.openai.com/api/codex/usage";
|
|
10
|
+
function getCacheDir() {
|
|
11
|
+
const override = process.env.OPENCODE_OPENAI_CACHE_DIR;
|
|
12
|
+
if (override)
|
|
13
|
+
return override;
|
|
14
|
+
return join(homedir(), ".config", "opencode", "cache");
|
|
15
|
+
}
|
|
16
|
+
function getCachePath(file) {
|
|
17
|
+
return join(getCacheDir(), file);
|
|
18
|
+
}
|
|
19
|
+
export class CodexStatusManager {
|
|
20
|
+
snapshots = new Map();
|
|
21
|
+
initPromise = null;
|
|
22
|
+
async ensureInitialized() {
|
|
23
|
+
if (this.initPromise)
|
|
24
|
+
return this.initPromise;
|
|
25
|
+
this.initPromise = this.loadFromDisk();
|
|
26
|
+
return this.initPromise;
|
|
27
|
+
}
|
|
28
|
+
getSnapshotKey(account) {
|
|
29
|
+
const plan = account.planType || account.plan || "";
|
|
30
|
+
if (account.accountId && account.email && plan) {
|
|
31
|
+
return `${account.accountId}|${account.email.toLowerCase()}|${plan}`;
|
|
32
|
+
}
|
|
33
|
+
if (account.parts?.refreshToken) {
|
|
34
|
+
return createHash("sha256")
|
|
35
|
+
.update(account.parts.refreshToken)
|
|
36
|
+
.digest("hex");
|
|
37
|
+
}
|
|
38
|
+
if (account.email) {
|
|
39
|
+
return `email:${account.email.toLowerCase()}`;
|
|
40
|
+
}
|
|
41
|
+
if (account.accountId) {
|
|
42
|
+
return `account:${account.accountId}`;
|
|
43
|
+
}
|
|
44
|
+
const index = account.index;
|
|
45
|
+
if (typeof index === "number") {
|
|
46
|
+
return `index:${index}`;
|
|
47
|
+
}
|
|
48
|
+
return "unknown";
|
|
49
|
+
}
|
|
50
|
+
async updateFromHeaders(account, headers) {
|
|
51
|
+
await this.ensureInitialized();
|
|
52
|
+
const getHeader = (name) => {
|
|
53
|
+
const val = headers[name] || headers[name.toLowerCase()];
|
|
54
|
+
return Array.isArray(val) ? val[0] : val;
|
|
55
|
+
};
|
|
56
|
+
const parseNum = (val) => {
|
|
57
|
+
if (val === undefined || val === "")
|
|
58
|
+
return null;
|
|
59
|
+
const n = Number(val);
|
|
60
|
+
return Number.isNaN(n) ? null : n;
|
|
61
|
+
};
|
|
62
|
+
const parseBool = (val) => {
|
|
63
|
+
if (val === undefined || val === "")
|
|
64
|
+
return null;
|
|
65
|
+
return val === "true" || val === "1";
|
|
66
|
+
};
|
|
67
|
+
const primaryUsed = parseNum(getHeader("x-codex-primary-used-percent"));
|
|
68
|
+
const primaryWindow = parseNum(getHeader("x-codex-primary-window-minutes"));
|
|
69
|
+
let primaryReset = parseNum(getHeader("x-codex-primary-reset-at"));
|
|
70
|
+
if (primaryReset !== null && primaryReset < 2000000000) {
|
|
71
|
+
primaryReset *= 1000;
|
|
72
|
+
}
|
|
73
|
+
const secondaryUsed = parseNum(getHeader("x-codex-secondary-used-percent"));
|
|
74
|
+
const secondaryWindow = parseNum(getHeader("x-codex-secondary-window-minutes"));
|
|
75
|
+
let secondaryReset = parseNum(getHeader("x-codex-secondary-reset-at"));
|
|
76
|
+
if (secondaryReset !== null && secondaryReset < 2000000000) {
|
|
77
|
+
secondaryReset *= 1000;
|
|
78
|
+
}
|
|
79
|
+
const hasCredits = parseBool(getHeader("x-codex-credits-has-credits"));
|
|
80
|
+
const unlimited = parseBool(getHeader("x-codex-credits-unlimited"));
|
|
81
|
+
const balance = getHeader("x-codex-credits-balance");
|
|
82
|
+
const key = this.getSnapshotKey(account);
|
|
83
|
+
const existing = this.snapshots.get(key);
|
|
84
|
+
const snapshot = {
|
|
85
|
+
accountId: account.accountId || "",
|
|
86
|
+
email: account.email || "",
|
|
87
|
+
plan: account.planType || "",
|
|
88
|
+
updatedAt: Date.now(),
|
|
89
|
+
primary: primaryUsed !== null || primaryWindow !== null || primaryReset !== null
|
|
90
|
+
? {
|
|
91
|
+
usedPercent: Math.max(0, Math.min(100, primaryUsed ?? (existing?.primary?.usedPercent || 0))),
|
|
92
|
+
windowMinutes: Math.max(0, primaryWindow ?? (existing?.primary?.windowMinutes || 0)),
|
|
93
|
+
resetAt: primaryReset ?? (existing?.primary?.resetAt || 0),
|
|
94
|
+
}
|
|
95
|
+
: existing?.primary || null,
|
|
96
|
+
secondary: secondaryUsed !== null || secondaryWindow !== null || secondaryReset !== null
|
|
97
|
+
? {
|
|
98
|
+
usedPercent: Math.max(0, Math.min(100, secondaryUsed ?? (existing?.secondary?.usedPercent || 0))),
|
|
99
|
+
windowMinutes: Math.max(0, secondaryWindow ?? (existing?.secondary?.windowMinutes || 0)),
|
|
100
|
+
resetAt: secondaryReset ?? (existing?.secondary?.resetAt || 0),
|
|
101
|
+
}
|
|
102
|
+
: existing?.secondary || null,
|
|
103
|
+
credits: hasCredits !== null || unlimited !== null || balance !== undefined
|
|
104
|
+
? {
|
|
105
|
+
hasCredits: hasCredits ?? (existing?.credits?.hasCredits || false),
|
|
106
|
+
unlimited: unlimited ?? (existing?.credits?.unlimited || false),
|
|
107
|
+
balance: balance ?? (existing?.credits?.balance || "0"),
|
|
108
|
+
}
|
|
109
|
+
: existing?.credits || null,
|
|
110
|
+
};
|
|
111
|
+
this.snapshots.set(key, snapshot);
|
|
112
|
+
await this.saveToDisk();
|
|
113
|
+
}
|
|
114
|
+
async getSnapshot(account) {
|
|
115
|
+
await this.ensureInitialized();
|
|
116
|
+
const key = this.getSnapshotKey(account);
|
|
117
|
+
const snapshot = this.snapshots.get(key);
|
|
118
|
+
if (!snapshot)
|
|
119
|
+
return null;
|
|
120
|
+
return {
|
|
121
|
+
...snapshot,
|
|
122
|
+
isStale: Date.now() - snapshot.updatedAt > STALENESS_TTL_MS,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
async getAllSnapshots() {
|
|
126
|
+
await this.ensureInitialized();
|
|
127
|
+
return Array.from(this.snapshots.entries()).map(([key, snapshot]) => ({
|
|
128
|
+
...snapshot,
|
|
129
|
+
key,
|
|
130
|
+
}));
|
|
131
|
+
}
|
|
132
|
+
async renderStatus(account) {
|
|
133
|
+
const snapshot = await this.getSnapshot(account);
|
|
134
|
+
const lines = [];
|
|
135
|
+
const staleLabel = snapshot?.isStale ? " (stale)" : "";
|
|
136
|
+
const formatWindow = (mins) => {
|
|
137
|
+
if (mins <= 0)
|
|
138
|
+
return null;
|
|
139
|
+
if (mins % (24 * 60) === 0)
|
|
140
|
+
return `${mins / (24 * 60)}d`;
|
|
141
|
+
if (mins % 60 === 0)
|
|
142
|
+
return `${mins / 60}h`;
|
|
143
|
+
return `${mins}m`;
|
|
144
|
+
};
|
|
145
|
+
const renderBar = (label, data) => {
|
|
146
|
+
const width = 20;
|
|
147
|
+
const usedPercent = data?.usedPercent ?? 100;
|
|
148
|
+
const leftPercent = Math.max(0, 100 - usedPercent);
|
|
149
|
+
const filled = Math.round((leftPercent / 100) * width);
|
|
150
|
+
const bar = "#".repeat(filled) + "-".repeat(width - filled);
|
|
151
|
+
let resetStr = "";
|
|
152
|
+
if (data && data.resetAt > 0) {
|
|
153
|
+
const resetDate = new Date(data.resetAt);
|
|
154
|
+
const now = Date.now();
|
|
155
|
+
const isMoreThan24h = data.resetAt - now > 24 * 60 * 60 * 1000;
|
|
156
|
+
const timeStr = `${String(resetDate.getHours()).padStart(2, "0")}:${String(resetDate.getMinutes()).padStart(2, "0")}`;
|
|
157
|
+
if (isMoreThan24h) {
|
|
158
|
+
const monthNames = [
|
|
159
|
+
"Jan",
|
|
160
|
+
"Feb",
|
|
161
|
+
"Mar",
|
|
162
|
+
"Apr",
|
|
163
|
+
"May",
|
|
164
|
+
"Jun",
|
|
165
|
+
"Jul",
|
|
166
|
+
"Aug",
|
|
167
|
+
"Sep",
|
|
168
|
+
"Oct",
|
|
169
|
+
"Nov",
|
|
170
|
+
"Dec",
|
|
171
|
+
];
|
|
172
|
+
const dateStr = `${resetDate.getDate()} ${monthNames[resetDate.getMonth()]}`;
|
|
173
|
+
resetStr = ` (resets ${timeStr} on ${dateStr})`;
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
resetStr = ` (resets ${timeStr})`;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
else if (!data) {
|
|
180
|
+
return ` ${(label + ":").padEnd(16)} [${"-".repeat(width)}] unknown`;
|
|
181
|
+
}
|
|
182
|
+
const statusStr = `${leftPercent.toFixed(0)}% left`.padEnd(9);
|
|
183
|
+
return ` ${(label + ":").padEnd(16)} [${bar}] ${statusStr}${resetStr}${staleLabel}`;
|
|
184
|
+
};
|
|
185
|
+
if (!snapshot) {
|
|
186
|
+
lines.push(renderBar("5h limit", null));
|
|
187
|
+
lines.push(renderBar("Weekly limit", null));
|
|
188
|
+
return lines;
|
|
189
|
+
}
|
|
190
|
+
const primaryLabel = formatWindow(snapshot.primary?.windowMinutes || 0);
|
|
191
|
+
const primaryHeader = primaryLabel === "5h" ? "5h limit" : `${primaryLabel || "5h"} limit`;
|
|
192
|
+
lines.push(renderBar(primaryHeader, snapshot.primary));
|
|
193
|
+
const secondaryLabel = formatWindow(snapshot.secondary?.windowMinutes || 0);
|
|
194
|
+
const secondaryHeader = secondaryLabel === "7d" || secondaryLabel === "weekly"
|
|
195
|
+
? "Weekly limit"
|
|
196
|
+
: `${secondaryLabel || "Weekly"} limit`;
|
|
197
|
+
lines.push(renderBar(secondaryHeader, snapshot.secondary));
|
|
198
|
+
if (snapshot.credits) {
|
|
199
|
+
const { unlimited, balance } = snapshot.credits;
|
|
200
|
+
const creditStr = unlimited ? "unlimited" : `${balance} credits`;
|
|
201
|
+
lines.push(` Credits ${creditStr}${staleLabel}`);
|
|
202
|
+
}
|
|
203
|
+
return lines;
|
|
204
|
+
}
|
|
205
|
+
async updateFromSnapshot(account, snapshot) {
|
|
206
|
+
if (!snapshot)
|
|
207
|
+
return;
|
|
208
|
+
await this.ensureInitialized();
|
|
209
|
+
const key = this.getSnapshotKey(account);
|
|
210
|
+
const existing = this.snapshots.get(key);
|
|
211
|
+
const toMs = (s) => {
|
|
212
|
+
if (s === null || s === undefined)
|
|
213
|
+
return null;
|
|
214
|
+
return s < 2000000000 ? s * 1000 : s;
|
|
215
|
+
};
|
|
216
|
+
const updated = {
|
|
217
|
+
accountId: account.accountId || "",
|
|
218
|
+
email: account.email || "",
|
|
219
|
+
plan: account.planType || "",
|
|
220
|
+
updatedAt: Date.now(),
|
|
221
|
+
primary: snapshot.primary
|
|
222
|
+
? {
|
|
223
|
+
usedPercent: snapshot.primary.used_percent,
|
|
224
|
+
windowMinutes: snapshot.primary.window_minutes || (existing?.primary?.windowMinutes || 0),
|
|
225
|
+
resetAt: toMs(snapshot.primary.resets_at) || (existing?.primary?.resetAt || 0),
|
|
226
|
+
}
|
|
227
|
+
: existing?.primary || null,
|
|
228
|
+
secondary: snapshot.secondary
|
|
229
|
+
? {
|
|
230
|
+
usedPercent: snapshot.secondary.used_percent,
|
|
231
|
+
windowMinutes: snapshot.secondary.window_minutes || (existing?.secondary?.windowMinutes || 0),
|
|
232
|
+
resetAt: toMs(snapshot.secondary.resets_at) || (existing?.secondary?.resetAt || 0),
|
|
233
|
+
}
|
|
234
|
+
: existing?.secondary || null,
|
|
235
|
+
credits: snapshot.credits
|
|
236
|
+
? {
|
|
237
|
+
hasCredits: snapshot.credits.has_credits,
|
|
238
|
+
unlimited: snapshot.credits.unlimited,
|
|
239
|
+
balance: snapshot.credits.balance || (existing?.credits?.balance || "0"),
|
|
240
|
+
}
|
|
241
|
+
: existing?.credits || null,
|
|
242
|
+
};
|
|
243
|
+
this.snapshots.set(key, updated);
|
|
244
|
+
await this.saveToDisk();
|
|
245
|
+
}
|
|
246
|
+
async fetchFromBackend(account, accessToken) {
|
|
247
|
+
const isChatGPT = accessToken.split(".").length === 3;
|
|
248
|
+
const url = isChatGPT ? WHAM_USAGE_URL : CODEX_USAGE_URL;
|
|
249
|
+
try {
|
|
250
|
+
const res = await fetch(url, {
|
|
251
|
+
headers: {
|
|
252
|
+
Authorization: `Bearer ${accessToken}`,
|
|
253
|
+
"OpenAI-Account-Id": account.accountId || "",
|
|
254
|
+
Accept: "application/json",
|
|
255
|
+
"User-Agent": "codex_cli_rs",
|
|
256
|
+
Origin: "https://chatgpt.com",
|
|
257
|
+
},
|
|
258
|
+
});
|
|
259
|
+
if (res.ok) {
|
|
260
|
+
const json = (await res.json());
|
|
261
|
+
const data = {};
|
|
262
|
+
if (json.rate_limit) {
|
|
263
|
+
if (json.rate_limit.primary_window) {
|
|
264
|
+
data.primary = {
|
|
265
|
+
used_percent: json.rate_limit.primary_window.used_percent,
|
|
266
|
+
window_minutes: json.rate_limit.primary_window.limit_window_seconds / 60,
|
|
267
|
+
resets_at: json.rate_limit.primary_window.reset_at,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
if (json.rate_limit.secondary_window) {
|
|
271
|
+
data.secondary = {
|
|
272
|
+
used_percent: json.rate_limit.secondary_window.used_percent,
|
|
273
|
+
window_minutes: json.rate_limit.secondary_window.limit_window_seconds / 60,
|
|
274
|
+
resets_at: json.rate_limit.secondary_window.reset_at,
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
if (json.credits) {
|
|
279
|
+
data.credits = {
|
|
280
|
+
has_credits: json.credits.has_credits,
|
|
281
|
+
unlimited: json.credits.unlimited,
|
|
282
|
+
balance: json.credits.balance,
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
await this.updateFromSnapshot(account, data);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
// Best-effort only
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
async loadFromDisk() {
|
|
293
|
+
const path = getCachePath(SNAPSHOTS_FILE);
|
|
294
|
+
if (!existsSync(path))
|
|
295
|
+
return;
|
|
296
|
+
try {
|
|
297
|
+
const data = JSON.parse(await fs.readFile(path, "utf-8"));
|
|
298
|
+
if (Array.isArray(data)) {
|
|
299
|
+
this.snapshots = new Map(data);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
catch {
|
|
303
|
+
// ignore
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
async saveToDisk() {
|
|
307
|
+
const path = getCachePath(SNAPSHOTS_FILE);
|
|
308
|
+
const dir = dirname(path);
|
|
309
|
+
try {
|
|
310
|
+
if (!existsSync(dir)) {
|
|
311
|
+
await fs.mkdir(dir, { recursive: true });
|
|
312
|
+
}
|
|
313
|
+
let diskData = null;
|
|
314
|
+
if (existsSync(path)) {
|
|
315
|
+
try {
|
|
316
|
+
diskData = JSON.parse(await fs.readFile(path, "utf-8"));
|
|
317
|
+
}
|
|
318
|
+
catch {
|
|
319
|
+
diskData = null;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
if (Array.isArray(diskData)) {
|
|
323
|
+
const diskMap = new Map(diskData);
|
|
324
|
+
const now = Date.now();
|
|
325
|
+
for (const [key, memoryValue] of this.snapshots) {
|
|
326
|
+
const diskValue = diskMap.get(key);
|
|
327
|
+
if (!diskValue || memoryValue.updatedAt > diskValue.updatedAt) {
|
|
328
|
+
diskMap.set(key, memoryValue);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
for (const [key, value] of diskMap) {
|
|
332
|
+
if (now - value.updatedAt > SNAPSHOT_RETENTION_MS) {
|
|
333
|
+
diskMap.delete(key);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
this.snapshots = diskMap;
|
|
337
|
+
}
|
|
338
|
+
const data = JSON.stringify(Array.from(this.snapshots.entries()), null, 2);
|
|
339
|
+
const tmpPath = `${path}.${randomBytes(6).toString("hex")}.tmp`;
|
|
340
|
+
await fs.writeFile(tmpPath, data, { encoding: "utf-8", mode: 0o600 });
|
|
341
|
+
await fs.rename(tmpPath, path);
|
|
342
|
+
}
|
|
343
|
+
catch {
|
|
344
|
+
// ignore
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
export const codexStatus = new CodexStatusManager();
|
|
349
|
+
//# sourceMappingURL=codex-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-status.js","sourceRoot":"","sources":["../../lib/codex-status.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/constants.d.ts
CHANGED
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
*/
|
|
5
5
|
/** Plugin identifier for logging and error messages */
|
|
6
6
|
export declare const PLUGIN_NAME = "openai-codex-plugin";
|
|
7
|
+
/** Plugin version - used for client_version query parameter */
|
|
8
|
+
export declare const PLUGIN_VERSION = "0.98.0";
|
|
7
9
|
/** Base URL for ChatGPT backend API */
|
|
8
10
|
export declare const CODEX_BASE_URL = "https://chatgpt.com/backend-api";
|
|
9
11
|
/** Dummy API key used for OpenAI SDK (actual auth via OAuth) */
|
|
@@ -24,17 +26,23 @@ export declare const OPENAI_HEADERS: {
|
|
|
24
26
|
readonly ORIGINATOR: "originator";
|
|
25
27
|
readonly SESSION_ID: "session_id";
|
|
26
28
|
readonly CONVERSATION_ID: "conversation_id";
|
|
29
|
+
readonly VERSION: "version";
|
|
27
30
|
};
|
|
28
31
|
/** OpenAI-specific header values */
|
|
29
32
|
export declare const OPENAI_HEADER_VALUES: {
|
|
30
33
|
readonly BETA_RESPONSES: "responses=experimental";
|
|
31
34
|
readonly ORIGINATOR_CODEX: "codex_cli_rs";
|
|
32
35
|
};
|
|
36
|
+
/** Codex CLI originator value */
|
|
37
|
+
export declare const CODEX_ORIGINATOR = "codex_cli_rs";
|
|
33
38
|
/** URL path segments */
|
|
34
39
|
export declare const URL_PATHS: {
|
|
35
40
|
readonly RESPONSES: "/responses";
|
|
36
41
|
readonly CODEX_RESPONSES: "/codex/responses";
|
|
42
|
+
readonly CODEX_MODELS: "/codex/models";
|
|
37
43
|
};
|
|
44
|
+
/** Model fallback map - when a model isn't available, fall back to this */
|
|
45
|
+
export declare const MODEL_FALLBACKS: Record<string, string>;
|
|
38
46
|
/** JWT claim path for ChatGPT account ID */
|
|
39
47
|
export declare const JWT_CLAIM_PATH: "https://api.openai.com/auth";
|
|
40
48
|
/** Error messages */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../lib/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,uDAAuD;AACvD,eAAO,MAAM,WAAW,wBAAwB,CAAC;AAEjD,uCAAuC;AACvC,eAAO,MAAM,cAAc,oCAAoC,CAAC;AAEhE,gEAAgE;AAChE,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAE7C,6CAA6C;AAC7C,eAAO,MAAM,WAAW,WAAW,CAAC;AAEpC,wBAAwB;AACxB,eAAO,MAAM,WAAW;;;;;CAKd,CAAC;AAEX,8BAA8B;AAC9B,eAAO,MAAM,cAAc
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../lib/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,uDAAuD;AACvD,eAAO,MAAM,WAAW,wBAAwB,CAAC;AAEjD,+DAA+D;AAC/D,eAAO,MAAM,cAAc,WAAW,CAAC;AAEvC,uCAAuC;AACvC,eAAO,MAAM,cAAc,oCAAoC,CAAC;AAEhE,gEAAgE;AAChE,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAE7C,6CAA6C;AAC7C,eAAO,MAAM,WAAW,WAAW,CAAC;AAEpC,wBAAwB;AACxB,eAAO,MAAM,WAAW;;;;;CAKd,CAAC;AAEX,8BAA8B;AAC9B,eAAO,MAAM,cAAc;;;;;;;CAOjB,CAAC;AAEX,oCAAoC;AACpC,eAAO,MAAM,oBAAoB;;;CAGvB,CAAC;AAEX,iCAAiC;AACjC,eAAO,MAAM,gBAAgB,iBAAiB,CAAC;AAE/C,wBAAwB;AACxB,eAAO,MAAM,SAAS;;;;CAIZ,CAAC;AAEX,2EAA2E;AAC3E,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKzC,CAAC;AAEX,4CAA4C;AAC5C,eAAO,MAAM,cAAc,EAAG,6BAAsC,CAAC;AAErE,qBAAqB;AACrB,eAAO,MAAM,cAAc;;;;CAIjB,CAAC;AAEX,qCAAqC;AACrC,eAAO,MAAM,UAAU;;;;;CAKb,CAAC;AAEX,gDAAgD;AAChD,eAAO,MAAM,gBAAgB;;;;CAInB,CAAC;AAEX,iCAAiC;AACjC,eAAO,MAAM,WAAW;;;;;;CAQd,CAAC"}
|
package/dist/lib/constants.js
CHANGED
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
*/
|
|
5
5
|
/** Plugin identifier for logging and error messages */
|
|
6
6
|
export const PLUGIN_NAME = "openai-codex-plugin";
|
|
7
|
+
/** Plugin version - used for client_version query parameter */
|
|
8
|
+
export const PLUGIN_VERSION = "0.98.0";
|
|
7
9
|
/** Base URL for ChatGPT backend API */
|
|
8
10
|
export const CODEX_BASE_URL = "https://chatgpt.com/backend-api";
|
|
9
11
|
/** Dummy API key used for OpenAI SDK (actual auth via OAuth) */
|
|
@@ -24,16 +26,27 @@ export const OPENAI_HEADERS = {
|
|
|
24
26
|
ORIGINATOR: "originator",
|
|
25
27
|
SESSION_ID: "session_id",
|
|
26
28
|
CONVERSATION_ID: "conversation_id",
|
|
29
|
+
VERSION: "version",
|
|
27
30
|
};
|
|
28
31
|
/** OpenAI-specific header values */
|
|
29
32
|
export const OPENAI_HEADER_VALUES = {
|
|
30
33
|
BETA_RESPONSES: "responses=experimental",
|
|
31
34
|
ORIGINATOR_CODEX: "codex_cli_rs",
|
|
32
35
|
};
|
|
36
|
+
/** Codex CLI originator value */
|
|
37
|
+
export const CODEX_ORIGINATOR = "codex_cli_rs";
|
|
33
38
|
/** URL path segments */
|
|
34
39
|
export const URL_PATHS = {
|
|
35
40
|
RESPONSES: "/responses",
|
|
36
41
|
CODEX_RESPONSES: "/codex/responses",
|
|
42
|
+
CODEX_MODELS: "/codex/models",
|
|
43
|
+
};
|
|
44
|
+
/** Model fallback map - when a model isn't available, fall back to this */
|
|
45
|
+
export const MODEL_FALLBACKS = {
|
|
46
|
+
"gpt-5.3-codex": "gpt-5.2-codex",
|
|
47
|
+
"gpt-5.3-codex-max": "gpt-5.1-codex-max",
|
|
48
|
+
"gpt-5.3-codex-mini": "gpt-5.1-codex-mini",
|
|
49
|
+
"gpt-5.3": "gpt-5.2",
|
|
37
50
|
};
|
|
38
51
|
/** JWT claim path for ChatGPT account ID */
|
|
39
52
|
export const JWT_CLAIM_PATH = "https://api.openai.com/auth";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../lib/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,uDAAuD;AACvD,MAAM,CAAC,MAAM,WAAW,GAAG,qBAAqB,CAAC;AAEjD,uCAAuC;AACvC,MAAM,CAAC,MAAM,cAAc,GAAG,iCAAiC,CAAC;AAEhE,gEAAgE;AAChE,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAE7C,6CAA6C;AAC7C,MAAM,CAAC,MAAM,WAAW,GAAG,QAAQ,CAAC;AAEpC,wBAAwB;AACxB,MAAM,CAAC,MAAM,WAAW,GAAG;IAC1B,EAAE,EAAE,GAAG;IACP,YAAY,EAAE,GAAG;IACjB,SAAS,EAAE,GAAG;IACd,iBAAiB,EAAE,GAAG;CACb,CAAC;AAEX,8BAA8B;AAC9B,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B,IAAI,EAAE,aAAa;IACnB,UAAU,EAAE,oBAAoB;IAChC,UAAU,EAAE,YAAY;IACxB,UAAU,EAAE,YAAY;IACxB,eAAe,EAAE,iBAAiB;
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../lib/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,uDAAuD;AACvD,MAAM,CAAC,MAAM,WAAW,GAAG,qBAAqB,CAAC;AAEjD,+DAA+D;AAC/D,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,CAAC;AAEvC,uCAAuC;AACvC,MAAM,CAAC,MAAM,cAAc,GAAG,iCAAiC,CAAC;AAEhE,gEAAgE;AAChE,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAE7C,6CAA6C;AAC7C,MAAM,CAAC,MAAM,WAAW,GAAG,QAAQ,CAAC;AAEpC,wBAAwB;AACxB,MAAM,CAAC,MAAM,WAAW,GAAG;IAC1B,EAAE,EAAE,GAAG;IACP,YAAY,EAAE,GAAG;IACjB,SAAS,EAAE,GAAG;IACd,iBAAiB,EAAE,GAAG;CACb,CAAC;AAEX,8BAA8B;AAC9B,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B,IAAI,EAAE,aAAa;IACnB,UAAU,EAAE,oBAAoB;IAChC,UAAU,EAAE,YAAY;IACxB,UAAU,EAAE,YAAY;IACxB,eAAe,EAAE,iBAAiB;IAClC,OAAO,EAAE,SAAS;CACT,CAAC;AAEX,oCAAoC;AACpC,MAAM,CAAC,MAAM,oBAAoB,GAAG;IACnC,cAAc,EAAE,wBAAwB;IACxC,gBAAgB,EAAE,cAAc;CACvB,CAAC;AAEX,iCAAiC;AACjC,MAAM,CAAC,MAAM,gBAAgB,GAAG,cAAc,CAAC;AAE/C,wBAAwB;AACxB,MAAM,CAAC,MAAM,SAAS,GAAG;IACxB,SAAS,EAAE,YAAY;IACvB,eAAe,EAAE,kBAAkB;IACnC,YAAY,EAAE,eAAe;CACpB,CAAC;AAEX,2EAA2E;AAC3E,MAAM,CAAC,MAAM,eAAe,GAA2B;IACtD,eAAe,EAAE,eAAe;IAChC,mBAAmB,EAAE,mBAAmB;IACxC,oBAAoB,EAAE,oBAAoB;IAC1C,SAAS,EAAE,SAAS;CACX,CAAC;AAEX,4CAA4C;AAC5C,MAAM,CAAC,MAAM,cAAc,GAAG,6BAAsC,CAAC;AAErE,qBAAqB;AACrB,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B,aAAa,EAAE,wCAAwC;IACvD,oBAAoB,EAAE,kDAAkD;IACxE,mBAAmB,EAAE,uBAAuB;CACnC,CAAC;AAEX,qCAAqC;AACrC,MAAM,CAAC,MAAM,UAAU,GAAG;IACzB,gBAAgB,EAAE,kBAAkB;IACpC,eAAe,EAAE,iBAAiB;IAClC,QAAQ,EAAE,UAAU;IACpB,cAAc,EAAE,gBAAgB;CACvB,CAAC;AAEX,gDAAgD;AAChD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC/B,MAAM,EAAE,MAAM;IACd,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,UAAU;CACR,CAAC;AAEX,iCAAiC;AACjC,MAAM,CAAC,MAAM,WAAW,GAAG;IAC1B,KAAK,EAAE,uCAAuC;IAC9C,YAAY,EAAE,qCAAqC;IACnD,OAAO,EAAE,wBAAwB;IACjC,YAAY,EACX,iFAAiF;IAClF,mBAAmB,EAClB,iEAAiE;CACzD,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex Models API
|
|
3
|
+
* Fetches available models from the ChatGPT backend
|
|
4
|
+
* This call may be necessary to "unlock" access to certain models like gpt-5.3-codex
|
|
5
|
+
*/
|
|
6
|
+
/** Model info returned from the /models endpoint */
|
|
7
|
+
export interface ModelInfo {
|
|
8
|
+
slug: string;
|
|
9
|
+
display_name: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
default_reasoning_level?: string;
|
|
12
|
+
supported_reasoning_levels?: string[];
|
|
13
|
+
visibility?: string;
|
|
14
|
+
supported_in_api?: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Fetch available models from the Codex backend
|
|
18
|
+
* This call may help "register" the client and enable access to newer models
|
|
19
|
+
*
|
|
20
|
+
* @param accessToken - OAuth access token
|
|
21
|
+
* @param accountId - ChatGPT account ID
|
|
22
|
+
* @returns List of available models
|
|
23
|
+
*/
|
|
24
|
+
export declare function fetchAvailableModels(accessToken: string, accountId: string): Promise<ModelInfo[]>;
|
|
25
|
+
/**
|
|
26
|
+
* Check if a specific model is available for an account
|
|
27
|
+
*
|
|
28
|
+
* @param modelSlug - Model slug to check (e.g., "gpt-5.3-codex")
|
|
29
|
+
* @param accessToken - OAuth access token
|
|
30
|
+
* @param accountId - ChatGPT account ID
|
|
31
|
+
* @returns True if model is available
|
|
32
|
+
*/
|
|
33
|
+
export declare function isModelAvailable(modelSlug: string, accessToken: string, accountId: string): Promise<boolean>;
|
|
34
|
+
/**
|
|
35
|
+
* Pre-fetch models to potentially "unlock" access to newer models
|
|
36
|
+
* Call this before making requests to ensure the backend knows about our client
|
|
37
|
+
*
|
|
38
|
+
* @param accessToken - OAuth access token
|
|
39
|
+
* @param accountId - ChatGPT account ID
|
|
40
|
+
*/
|
|
41
|
+
export declare function prefetchModels(accessToken: string, accountId: string): Promise<void>;
|
|
42
|
+
//# sourceMappingURL=models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../lib/models.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,oDAAoD;AACpD,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,0BAA0B,CAAC,EAAE,MAAM,EAAE,CAAC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC3B;AAsBD;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACzC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,SAAS,EAAE,CAAC,CAuCtB;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACrC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC,CAGlB;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CACnC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAEf"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex Models API
|
|
3
|
+
* Fetches available models from the ChatGPT backend
|
|
4
|
+
* This call may be necessary to "unlock" access to certain models like gpt-5.3-codex
|
|
5
|
+
*/
|
|
6
|
+
import { CODEX_BASE_URL, URL_PATHS, PLUGIN_VERSION, CODEX_ORIGINATOR } from "./constants.js";
|
|
7
|
+
import { release as osRelease } from "node:os";
|
|
8
|
+
/** Cache for available models per account */
|
|
9
|
+
const modelsCache = new Map();
|
|
10
|
+
const CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes
|
|
11
|
+
/**
|
|
12
|
+
* Generates User-Agent for models requests
|
|
13
|
+
*/
|
|
14
|
+
function getCodexUserAgent() {
|
|
15
|
+
const platform = process.platform;
|
|
16
|
+
const arch = process.arch;
|
|
17
|
+
const osType = platform === "darwin" ? "Mac OS" : platform === "win32" ? "Windows" : "Linux";
|
|
18
|
+
const osVersion = osRelease();
|
|
19
|
+
return `${CODEX_ORIGINATOR}/${PLUGIN_VERSION} (${osType} ${osVersion}; ${arch}) opencode-plugin`;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Fetch available models from the Codex backend
|
|
23
|
+
* This call may help "register" the client and enable access to newer models
|
|
24
|
+
*
|
|
25
|
+
* @param accessToken - OAuth access token
|
|
26
|
+
* @param accountId - ChatGPT account ID
|
|
27
|
+
* @returns List of available models
|
|
28
|
+
*/
|
|
29
|
+
export async function fetchAvailableModels(accessToken, accountId) {
|
|
30
|
+
const cacheKey = accountId;
|
|
31
|
+
const cached = modelsCache.get(cacheKey);
|
|
32
|
+
// Return cached if still valid
|
|
33
|
+
if (cached && Date.now() - cached.fetchedAt < CACHE_TTL_MS) {
|
|
34
|
+
return cached.models;
|
|
35
|
+
}
|
|
36
|
+
const url = `${CODEX_BASE_URL}${URL_PATHS.CODEX_MODELS}?client_version=${PLUGIN_VERSION}`;
|
|
37
|
+
try {
|
|
38
|
+
const response = await fetch(url, {
|
|
39
|
+
method: "GET",
|
|
40
|
+
headers: {
|
|
41
|
+
Authorization: `Bearer ${accessToken}`,
|
|
42
|
+
"chatgpt-account-id": accountId,
|
|
43
|
+
"User-Agent": getCodexUserAgent(),
|
|
44
|
+
originator: CODEX_ORIGINATOR,
|
|
45
|
+
Accept: "application/json",
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
if (!response.ok) {
|
|
49
|
+
console.error(`[openai-codex-plugin] Failed to fetch models: ${response.status}`);
|
|
50
|
+
return cached?.models || [];
|
|
51
|
+
}
|
|
52
|
+
const data = (await response.json());
|
|
53
|
+
const models = data.models || [];
|
|
54
|
+
// Cache the result
|
|
55
|
+
modelsCache.set(cacheKey, { models, fetchedAt: Date.now() });
|
|
56
|
+
return models;
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
console.error("[openai-codex-plugin] Error fetching models:", error);
|
|
60
|
+
return cached?.models || [];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Check if a specific model is available for an account
|
|
65
|
+
*
|
|
66
|
+
* @param modelSlug - Model slug to check (e.g., "gpt-5.3-codex")
|
|
67
|
+
* @param accessToken - OAuth access token
|
|
68
|
+
* @param accountId - ChatGPT account ID
|
|
69
|
+
* @returns True if model is available
|
|
70
|
+
*/
|
|
71
|
+
export async function isModelAvailable(modelSlug, accessToken, accountId) {
|
|
72
|
+
const models = await fetchAvailableModels(accessToken, accountId);
|
|
73
|
+
return models.some((m) => m.slug === modelSlug);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Pre-fetch models to potentially "unlock" access to newer models
|
|
77
|
+
* Call this before making requests to ensure the backend knows about our client
|
|
78
|
+
*
|
|
79
|
+
* @param accessToken - OAuth access token
|
|
80
|
+
* @param accountId - ChatGPT account ID
|
|
81
|
+
*/
|
|
82
|
+
export async function prefetchModels(accessToken, accountId) {
|
|
83
|
+
await fetchAvailableModels(accessToken, accountId);
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../lib/models.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*
|
|
8
8
|
* Token Count: ~450 tokens (~90% reduction vs full OpenCode prompt)
|
|
9
9
|
*/
|
|
10
|
-
export declare const CODEX_OPENCODE_BRIDGE = "# Codex Running in OpenCode\n\nYou are running Codex through OpenCode, an open-source terminal coding assistant. OpenCode provides different tools but follows Codex operating principles.\n\n## CRITICAL: Tool Replacements\n\n<critical_rule priority=\"0\">\n\u274C APPLY_PATCH DOES NOT EXIST \u2192 \u2705 USE \"edit\" INSTEAD\n- NEVER use: apply_patch, applyPatch\n- ALWAYS use: edit tool for ALL file modifications\n- Before modifying files: Verify you're using \"edit\", NOT \"apply_patch\"\n</critical_rule>\n\n<critical_rule priority=\"0\">\n\u274C UPDATE_PLAN DOES NOT EXIST \u2192 \u2705 USE \"todowrite\" INSTEAD\n- NEVER use: update_plan, updatePlan, read_plan, readPlan\n- ALWAYS use: todowrite for task/plan updates, todoread to read plans\n- Before plan operations: Verify you're using \"todowrite\", NOT \"update_plan\"\n</critical_rule>\n\n## Available OpenCode Tools\n\n**File Operations:**\n- `write` - Create new files\n - Overwriting existing files requires a prior Read in this session; default to ASCII unless the file already uses Unicode.\n- `edit` - Modify existing files (REPLACES apply_patch)\n - Requires a prior Read in this session; preserve exact indentation; ensure `oldString` uniquely matches or use `replaceAll`; edit fails if ambiguous or missing.\n- `read` - Read file contents\n\n**Search/Discovery:**\n- `grep` - Search file contents (tool, not bash grep); use `include` to filter patterns; set `path` only when not searching workspace root; for cross-file match counts use bash with `rg`.\n- `glob` - Find files by pattern; defaults to workspace cwd unless `path` is set.\n- `list` - List directories (requires absolute paths)\n\n**Execution:**\n- `bash` - Run shell commands\n - No workdir parameter; do not include it in tool calls.\n - Always include a short description for the command.\n - Do not use cd; use absolute paths in commands.\n - Quote paths containing spaces with double quotes.\n - Chain multiple commands with ';' or '&&'; avoid newlines.\n - Use Grep/Glob tools for searches; only use bash with `rg` when you need counts or advanced features.\n - Do not use `ls`/`cat` in bash; use `list`/`read` tools instead.\n - For deletions (rm), verify by listing parent dir with `list`.\n\n**Network:**\n- `webfetch` - Fetch web content\n - Use fully-formed URLs (http/https; http auto-upgrades to https).\n - Always set `format` to one of: text | markdown | html; prefer markdown unless otherwise required.\n - Read-only; short cache window.\n\n**Task Management:**\n- `todowrite` - Manage tasks/plans (REPLACES update_plan)\n- `todoread` - Read current plan\n\n## Substitution Rules\n\nBase instruction says: You MUST use instead:\napply_patch \u2192 edit\nupdate_plan \u2192 todowrite\nread_plan \u2192 todoread\n\n**Path Usage:** Use per-tool conventions to avoid conflicts:\n- Tool calls: `read`, `edit`, `write`, `list` require absolute paths.\n- Searches: `grep`/`glob` default to the workspace cwd; prefer relative include patterns; set `path` only when a different root is needed.\n- Presentation: In assistant messages, show workspace-relative paths; use absolute paths only inside tool calls.\n- Tool schema overrides general path preferences\u2014do not convert required absolute paths to relative.\n\n## Verification Checklist\n\nBefore file/plan modifications:\n1. Am I using \"edit\" NOT \"apply_patch\"?\n2. Am I using \"todowrite\" NOT \"update_plan\"?\n3. Is this tool in the approved list above?\n4. Am I following each tool's path requirements?\n\nIf ANY answer is NO \u2192 STOP and correct before proceeding.\n\n## OpenCode Working Style\n\n**Communication:**\n- Send brief preambles (8-12 words) before tool calls, building on prior context\n- Provide progress updates during longer tasks\n\n**Execution:**\n- Keep working autonomously until query is fully resolved before yielding\n- Don't return to user with partial solutions\n\n**Code Approach:**\n- New projects: Be ambitious and creative\n- Existing codebases: Surgical precision - modify only what's requested unless explicitly instructed to do otherwise\n\n**Testing:**\n- If tests exist: Start specific to your changes, then broader validation\n\n## Advanced Tools\n\n**Task Tool (Sub-Agents):**\n- Use the
|
|
10
|
+
export declare const CODEX_OPENCODE_BRIDGE = "# Codex Running in OpenCode\n\nYou are running Codex through OpenCode, an open-source terminal coding assistant. OpenCode provides different tools but follows Codex operating principles.\n\n## CRITICAL: Tool Replacements\n\n<critical_rule priority=\"0\">\n\u274C APPLY_PATCH DOES NOT EXIST \u2192 \u2705 USE \"edit\" INSTEAD\n- NEVER use: apply_patch, applyPatch\n- ALWAYS use: edit tool for ALL file modifications\n- Before modifying files: Verify you're using \"edit\", NOT \"apply_patch\"\n</critical_rule>\n\n<critical_rule priority=\"0\">\n\u274C UPDATE_PLAN DOES NOT EXIST \u2192 \u2705 USE \"todowrite\" INSTEAD\n- NEVER use: update_plan, updatePlan, read_plan, readPlan\n- ALWAYS use: todowrite for task/plan updates, todoread to read plans\n- Before plan operations: Verify you're using \"todowrite\", NOT \"update_plan\"\n</critical_rule>\n\n## Available OpenCode Tools\n\n**File Operations:**\n- `write` - Create new files\n - Overwriting existing files requires a prior Read in this session; default to ASCII unless the file already uses Unicode.\n- `edit` - Modify existing files (REPLACES apply_patch)\n - Requires a prior Read in this session; preserve exact indentation; ensure `oldString` uniquely matches or use `replaceAll`; edit fails if ambiguous or missing.\n- `read` - Read file contents\n\n**Search/Discovery:**\n- `grep` - Search file contents (tool, not bash grep); use `include` to filter patterns; set `path` only when not searching workspace root; for cross-file match counts use bash with `rg`.\n- `glob` - Find files by pattern; defaults to workspace cwd unless `path` is set.\n- `list` - List directories (requires absolute paths)\n\n**Execution:**\n- `bash` - Run shell commands\n - No workdir parameter; do not include it in tool calls.\n - Always include a short description for the command.\n - Do not use cd; use absolute paths in commands.\n - Quote paths containing spaces with double quotes.\n - Chain multiple commands with ';' or '&&'; avoid newlines.\n - Use Grep/Glob tools for searches; only use bash with `rg` when you need counts or advanced features.\n - Do not use `ls`/`cat` in bash; use `list`/`read` tools instead.\n - For deletions (rm), verify by listing parent dir with `list`.\n\n**Network:**\n- `webfetch` - Fetch web content\n - Use fully-formed URLs (http/https; http auto-upgrades to https).\n - Always set `format` to one of: text | markdown | html; prefer markdown unless otherwise required.\n - Read-only; short cache window.\n\n**Task Management:**\n- `todowrite` - Manage tasks/plans (REPLACES update_plan)\n- `todoread` - Read current plan\n\n## Substitution Rules\n\nBase instruction says: You MUST use instead:\napply_patch \u2192 edit\nupdate_plan \u2192 todowrite\nread_plan \u2192 todoread\n\n**Path Usage:** Use per-tool conventions to avoid conflicts:\n- Tool calls: `read`, `edit`, `write`, `list` require absolute paths.\n- Searches: `grep`/`glob` default to the workspace cwd; prefer relative include patterns; set `path` only when a different root is needed.\n- Presentation: In assistant messages, show workspace-relative paths; use absolute paths only inside tool calls.\n- Tool schema overrides general path preferences\u2014do not convert required absolute paths to relative.\n\n## Verification Checklist\n\nBefore file/plan modifications:\n1. Am I using \"edit\" NOT \"apply_patch\"?\n2. Am I using \"todowrite\" NOT \"update_plan\"?\n3. Is this tool in the approved list above?\n4. Am I following each tool's path requirements?\n\nIf ANY answer is NO \u2192 STOP and correct before proceeding.\n\n## OpenCode Working Style\n\n**Communication:**\n- Send brief preambles (8-12 words) before tool calls, building on prior context\n- Provide progress updates during longer tasks\n\n**Execution:**\n- Keep working autonomously until query is fully resolved before yielding\n- Don't return to user with partial solutions\n\n**Code Approach:**\n- New projects: Be ambitious and creative\n- Existing codebases: Surgical precision - modify only what's requested unless explicitly instructed to do otherwise\n\n**Testing:**\n- If tests exist: Start specific to your changes, then broader validation\n\n## Advanced Tools\n\n**Task Tool (Sub-Agents):**\n- Use the `task` tool to launch sub-agents for complex analysis or specialized workflows\n- Check the task tool description for current agent types and their capabilities\n- The agent list is dynamically generated - refer to tool schema for available agents\n\n**Parallelization:**\n- To run independent tool calls concurrently, emit multiple function_call blocks in the same assistant turn\n- OpenCode automatically parallelizes them - there is NO wrapper tool for this\n- Reserve sequential (single) calls for ordered or data-dependent steps\n\n## Tool Call Protocol (CRITICAL)\n\nYou MUST invoke tools using the platform's native function-calling mechanism only.\n\n**FORBIDDEN PATTERNS - Never output these as text:**\n- `assistant to=...` or `to=functions.*`\n- `multi_tool_use.parallel` (does not exist)\n- `functions.<toolname>` syntax (use bare tool names)\n- JSON with `tool_uses`, `recipient_name`, or `parameters` keys\n- Any XML-like tool wrappers\n\n**CORRECT BEHAVIOR:**\n- Call tools directly via the function_call mechanism\n- For parallel calls: emit multiple function_call blocks in one turn\n- If a tool doesn't exist, use the closest available alternative\n- Only tools in your current runtime tools list are callable\n\n**MCP Tools:**\n- Model Context Protocol servers provide additional capabilities\n- MCP tools are prefixed: `mcp__<server-name>__<tool-name>`\n- Check your available tools for MCP integrations\n- Use when the tool's functionality matches your task needs\n\n## What Remains from Codex\n \nSandbox policies, approval mechanisms, final answer formatting, git commit protocols, and file reference formats all follow Codex instructions. In approval policy \"never\", never request escalations.\n\n## Approvals & Safety\n- Assume workspace-write filesystem, network enabled, approval on-failure unless explicitly stated otherwise.\n- When a command fails due to sandboxing or permissions, retry with escalated permissions if allowed by policy, including a one-line justification.\n- Treat destructive commands (e.g., `rm`, `git reset --hard`) as requiring explicit user request or approval.\n- When uncertain, prefer non-destructive verification first (e.g., confirm file existence with `list`, then delete with `bash`).";
|
|
11
11
|
export interface CodexOpenCodeBridgeMeta {
|
|
12
12
|
estimatedTokens: number;
|
|
13
13
|
reductionVsCurrent: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-opencode-bridge.d.ts","sourceRoot":"","sources":["../../../lib/prompts/codex-opencode-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,eAAO,MAAM,qBAAqB,
|
|
1
|
+
{"version":3,"file":"codex-opencode-bridge.d.ts","sourceRoot":"","sources":["../../../lib/prompts/codex-opencode-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,eAAO,MAAM,qBAAqB,y5MA0ImG,CAAC;AAEtI,MAAM,WAAW,uBAAuB;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,eAAO,MAAM,0BAA0B,EAAE,uBAmBxC,CAAC"}
|