codex-multi-auth 2.1.3 → 2.1.5
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 -6
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/request/fetch-helpers.d.ts.map +1 -1
- package/dist/lib/request/fetch-helpers.js +13 -5
- package/dist/lib/request/fetch-helpers.js.map +1 -1
- package/dist/lib/runtime/config-toml.d.ts +2 -0
- package/dist/lib/runtime/config-toml.d.ts.map +1 -1
- package/dist/lib/runtime/config-toml.js +57 -4
- package/dist/lib/runtime/config-toml.js.map +1 -1
- package/dist/lib/runtime-rotation-proxy.d.ts.map +1 -1
- package/dist/lib/runtime-rotation-proxy.js +242 -16
- package/dist/lib/runtime-rotation-proxy.js.map +1 -1
- package/dist/lib/update-notice.d.ts +12 -0
- package/dist/lib/update-notice.d.ts.map +1 -0
- package/dist/lib/update-notice.js +315 -0
- package/dist/lib/update-notice.js.map +1 -0
- package/dist/lib/usage/ledger.d.ts.map +1 -1
- package/dist/lib/usage/ledger.js +1 -0
- package/dist/lib/usage/ledger.js.map +1 -1
- package/dist/lib/usage/redaction.d.ts.map +1 -1
- package/dist/lib/usage/redaction.js +1 -0
- package/dist/lib/usage/redaction.js.map +1 -1
- package/dist/lib/usage/types.d.ts +1 -1
- package/dist/lib/usage/types.d.ts.map +1 -1
- package/package.json +4 -4
- package/scripts/codex-app-launcher.js +1 -1
- package/scripts/codex-multi-auth.js +5 -1
- package/scripts/codex-routing.js +8 -0
- package/scripts/codex.js +309 -59
- package/scripts/test-model-matrix.js +97 -13
- package/dist/lib/auto-update-checker.d.ts +0 -32
- package/dist/lib/auto-update-checker.d.ts.map +0 -1
- package/dist/lib/auto-update-checker.js +0 -725
- package/dist/lib/auto-update-checker.js.map +0 -1
|
@@ -110,6 +110,7 @@ function printUsage() {
|
|
|
110
110
|
" --plugin=dist|package Load plugin from local dist URI or package name (default: dist)",
|
|
111
111
|
" --max-cases=N Hard cap number of cases per scenario",
|
|
112
112
|
" --report-json=PATH Write JSON report to PATH (relative to repo root)",
|
|
113
|
+
" --strict-capabilities Fail unsupported account/model capabilities instead of skipping them",
|
|
113
114
|
" --no-restore Keep generated local config files after run",
|
|
114
115
|
" -h, --help Show help",
|
|
115
116
|
].join("\n"),
|
|
@@ -148,6 +149,15 @@ function runQuiet(command, commandArgs) {
|
|
|
148
149
|
}
|
|
149
150
|
}
|
|
150
151
|
|
|
152
|
+
function runQuietWindowsTaskkill(pid) {
|
|
153
|
+
runQuiet("cmd.exe", [
|
|
154
|
+
"/d",
|
|
155
|
+
"/s",
|
|
156
|
+
"/c",
|
|
157
|
+
`taskkill /F /T /PID ${pid}`,
|
|
158
|
+
]);
|
|
159
|
+
}
|
|
160
|
+
|
|
151
161
|
export function registerSpawnedCodex(pid) {
|
|
152
162
|
if (!Number.isInteger(pid) || pid <= 0) return;
|
|
153
163
|
spawnedCodexPids.add(pid);
|
|
@@ -171,18 +181,67 @@ export function resolveMatrixTimeoutMs(smoke = false) {
|
|
|
171
181
|
return parsedTimeout;
|
|
172
182
|
}
|
|
173
183
|
|
|
174
|
-
function
|
|
184
|
+
function parseNdjsonEvents(output) {
|
|
185
|
+
const events = [];
|
|
186
|
+
for (const line of output.split(/\r?\n/)) {
|
|
187
|
+
const trimmed = line.trim();
|
|
188
|
+
if (!trimmed.startsWith("{")) {
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
try {
|
|
192
|
+
events.push(JSON.parse(trimmed));
|
|
193
|
+
} catch {
|
|
194
|
+
// Ignore wrapper noise and partial lines.
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return events;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
function findLastIndex(items, predicate) {
|
|
201
|
+
for (let index = items.length - 1; index >= 0; index -= 1) {
|
|
202
|
+
if (predicate(items[index], index)) {
|
|
203
|
+
return index;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return -1;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function hasTerminalFailure(events) {
|
|
210
|
+
const lastCompletedIndex = findLastIndex(
|
|
211
|
+
events,
|
|
212
|
+
(event) =>
|
|
213
|
+
event?.type === "turn.completed" || event?.type === "response.completed",
|
|
214
|
+
);
|
|
175
215
|
return (
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
216
|
+
findLastIndex(
|
|
217
|
+
events,
|
|
218
|
+
(event, index) =>
|
|
219
|
+
index > lastCompletedIndex &&
|
|
220
|
+
(event?.type === "error" ||
|
|
221
|
+
event?.type === "turn.failed" ||
|
|
222
|
+
event?.type === "response.failed" ||
|
|
223
|
+
event?.type === "response.error" ||
|
|
224
|
+
event?.type === "response.incomplete"),
|
|
225
|
+
) >= 0
|
|
179
226
|
);
|
|
180
227
|
}
|
|
181
228
|
|
|
182
|
-
function
|
|
183
|
-
|
|
184
|
-
|
|
229
|
+
function hasCompletedSuccessfully(output, token) {
|
|
230
|
+
const events = parseNdjsonEvents(output);
|
|
231
|
+
if (events.length > 0) {
|
|
232
|
+
if (hasTerminalFailure(events)) {
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
return events.some(
|
|
236
|
+
(event) =>
|
|
237
|
+
event?.type === "turn.completed" ||
|
|
238
|
+
event?.type === "response.completed",
|
|
239
|
+
);
|
|
185
240
|
}
|
|
241
|
+
return output.includes(token);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
function getCapabilitySkipReason(exitCode, output, smoke) {
|
|
186
245
|
if (/not supported when using codex with a chatgpt account/i.test(output)) {
|
|
187
246
|
return "unsupported-model";
|
|
188
247
|
}
|
|
@@ -192,14 +251,26 @@ function getSmokeSkipReason(exitCode, output) {
|
|
|
192
251
|
) {
|
|
193
252
|
return "unsupported-reasoning";
|
|
194
253
|
}
|
|
254
|
+
if (smoke && exitCode === 124) {
|
|
255
|
+
return "timed-out";
|
|
256
|
+
}
|
|
195
257
|
return null;
|
|
196
258
|
}
|
|
197
259
|
|
|
198
|
-
function finalizeModelCaseResult(
|
|
260
|
+
function finalizeModelCaseResult(
|
|
261
|
+
caseInfo,
|
|
262
|
+
exitCode,
|
|
263
|
+
output,
|
|
264
|
+
token,
|
|
265
|
+
{ smoke, strictCapabilities } = {},
|
|
266
|
+
) {
|
|
199
267
|
const hasToken = output.includes(token);
|
|
200
268
|
const completed = hasCompletedSuccessfully(output, token);
|
|
201
269
|
const ok = exitCode === 0 && completed;
|
|
202
|
-
const skipReason =
|
|
270
|
+
const skipReason =
|
|
271
|
+
!ok && strictCapabilities !== true
|
|
272
|
+
? getCapabilitySkipReason(exitCode, output, smoke === true)
|
|
273
|
+
: null;
|
|
203
274
|
|
|
204
275
|
return {
|
|
205
276
|
...caseInfo,
|
|
@@ -219,8 +290,12 @@ export function __finalizeModelCaseResultForTests(
|
|
|
219
290
|
output,
|
|
220
291
|
token,
|
|
221
292
|
smoke = false,
|
|
293
|
+
strictCapabilities = false,
|
|
222
294
|
) {
|
|
223
|
-
return finalizeModelCaseResult(caseInfo, exitCode, output, token,
|
|
295
|
+
return finalizeModelCaseResult(caseInfo, exitCode, output, token, {
|
|
296
|
+
smoke,
|
|
297
|
+
strictCapabilities,
|
|
298
|
+
});
|
|
224
299
|
}
|
|
225
300
|
|
|
226
301
|
function stopCodexServersInternal() {
|
|
@@ -228,7 +303,7 @@ function stopCodexServersInternal() {
|
|
|
228
303
|
spawnedCodexPids.clear();
|
|
229
304
|
for (const pid of tracked) {
|
|
230
305
|
if (process.platform === "win32") {
|
|
231
|
-
|
|
306
|
+
runQuietWindowsTaskkill(pid);
|
|
232
307
|
continue;
|
|
233
308
|
}
|
|
234
309
|
runQuiet("kill", ["-9", String(pid)]);
|
|
@@ -352,7 +427,10 @@ function executeModelCase(caseInfo, index) {
|
|
|
352
427
|
124,
|
|
353
428
|
`Timed out after ${timeoutMs}ms`,
|
|
354
429
|
token,
|
|
355
|
-
|
|
430
|
+
{
|
|
431
|
+
smoke: caseInfo.smoke === true,
|
|
432
|
+
strictCapabilities: caseInfo.strictCapabilities === true,
|
|
433
|
+
},
|
|
356
434
|
);
|
|
357
435
|
}
|
|
358
436
|
|
|
@@ -364,7 +442,10 @@ function executeModelCase(caseInfo, index) {
|
|
|
364
442
|
exitCode,
|
|
365
443
|
combinedOutput,
|
|
366
444
|
token,
|
|
367
|
-
|
|
445
|
+
{
|
|
446
|
+
smoke: caseInfo.smoke === true,
|
|
447
|
+
strictCapabilities: caseInfo.strictCapabilities === true,
|
|
448
|
+
},
|
|
368
449
|
);
|
|
369
450
|
}
|
|
370
451
|
|
|
@@ -442,6 +523,7 @@ async function runScenario(scenario, options) {
|
|
|
442
523
|
(caseInfo) => ({
|
|
443
524
|
...caseInfo,
|
|
444
525
|
smoke: options.smoke,
|
|
526
|
+
strictCapabilities: options.strictCapabilities,
|
|
445
527
|
}),
|
|
446
528
|
);
|
|
447
529
|
console.log(`\n=== ${scenario.toUpperCase()} (${cases.length} cases) ===`);
|
|
@@ -483,6 +565,7 @@ async function main() {
|
|
|
483
565
|
const scenarioValue =
|
|
484
566
|
parseArgValue(args, "--scenario") ?? (smoke ? "modern" : "all");
|
|
485
567
|
const pluginMode = parseArgValue(args, "--plugin") ?? "dist";
|
|
568
|
+
const strictCapabilities = args.includes("--strict-capabilities");
|
|
486
569
|
const noRestore = args.includes("--no-restore");
|
|
487
570
|
const maxCasesRaw = parseArgValue(args, "--max-cases");
|
|
488
571
|
const maxCases = maxCasesRaw ? Number.parseInt(maxCasesRaw, 10) : 0;
|
|
@@ -530,6 +613,7 @@ async function main() {
|
|
|
530
613
|
smoke,
|
|
531
614
|
maxCases,
|
|
532
615
|
pluginRef,
|
|
616
|
+
strictCapabilities,
|
|
533
617
|
});
|
|
534
618
|
allResults.push(
|
|
535
619
|
...scenarioResults.map((item) => ({ ...item, scenario })),
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
export interface UpdateCheckResult {
|
|
2
|
-
hasUpdate: boolean;
|
|
3
|
-
currentVersion: string;
|
|
4
|
-
latestVersion: string | null;
|
|
5
|
-
updateCommand: string;
|
|
6
|
-
}
|
|
7
|
-
export interface AutoUpdateResult extends UpdateCheckResult {
|
|
8
|
-
checked: boolean;
|
|
9
|
-
updated: boolean;
|
|
10
|
-
reason: "disabled" | "not-updateable-install" | "already-running" | "current" | "updated" | "update-failed";
|
|
11
|
-
exitCode: number | null;
|
|
12
|
-
error: string | null;
|
|
13
|
-
}
|
|
14
|
-
export interface AutoUpdateOptions {
|
|
15
|
-
env?: NodeJS.ProcessEnv;
|
|
16
|
-
forceCheck?: boolean;
|
|
17
|
-
forceInstall?: boolean;
|
|
18
|
-
npmCommand?: string;
|
|
19
|
-
packageRoot?: string;
|
|
20
|
-
platform?: NodeJS.Platform;
|
|
21
|
-
fetchTimeoutMs?: number;
|
|
22
|
-
timeoutMs?: number;
|
|
23
|
-
onUpdateStart?: (result: UpdateCheckResult) => void;
|
|
24
|
-
}
|
|
25
|
-
export declare function isAutoUpdateEnabled(env?: NodeJS.ProcessEnv): boolean;
|
|
26
|
-
export declare function resolvePackageRootFromModuleDir(moduleDir: string): string;
|
|
27
|
-
export declare function isUpdateablePackageInstall(packageRoot?: string): boolean;
|
|
28
|
-
export declare function checkForUpdates(force?: boolean, fetchTimeoutMs?: number): Promise<UpdateCheckResult>;
|
|
29
|
-
export declare function autoUpdateIfAvailable(options?: AutoUpdateOptions): Promise<AutoUpdateResult>;
|
|
30
|
-
export declare function checkAndNotify(showToast?: (message: string, variant: "info" | "warning") => Promise<void>): Promise<void>;
|
|
31
|
-
export declare function clearUpdateCache(): void;
|
|
32
|
-
//# sourceMappingURL=auto-update-checker.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auto-update-checker.d.ts","sourceRoot":"","sources":["../../lib/auto-update-checker.ts"],"names":[],"mappings":"AAiSA,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IAC1D,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EACH,UAAU,GACV,wBAAwB,GACxB,iBAAiB,GACjB,SAAS,GACT,SAAS,GACT,eAAe,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;CACpD;AAmBD,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAIjF;AAUD,wBAAgB,+BAA+B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAmBzE;AAOD,wBAAgB,0BAA0B,CACzC,WAAW,SAAmB,GAC5B,OAAO,CAGT;AA6TD,wBAAsB,eAAe,CACpC,KAAK,UAAQ,EACb,cAAc,SAA0B,GACtC,OAAO,CAAC,iBAAiB,CAAC,CA+B5B;AAED,wBAAsB,qBAAqB,CAC1C,OAAO,GAAE,iBAAsB,GAC7B,OAAO,CAAC,gBAAgB,CAAC,CAyF3B;AAED,wBAAsB,cAAc,CAClC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,GAC1E,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAUvC"}
|