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.
Files changed (35) hide show
  1. package/README.md +8 -6
  2. package/dist/index.js +1 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/lib/request/fetch-helpers.d.ts.map +1 -1
  5. package/dist/lib/request/fetch-helpers.js +13 -5
  6. package/dist/lib/request/fetch-helpers.js.map +1 -1
  7. package/dist/lib/runtime/config-toml.d.ts +2 -0
  8. package/dist/lib/runtime/config-toml.d.ts.map +1 -1
  9. package/dist/lib/runtime/config-toml.js +57 -4
  10. package/dist/lib/runtime/config-toml.js.map +1 -1
  11. package/dist/lib/runtime-rotation-proxy.d.ts.map +1 -1
  12. package/dist/lib/runtime-rotation-proxy.js +242 -16
  13. package/dist/lib/runtime-rotation-proxy.js.map +1 -1
  14. package/dist/lib/update-notice.d.ts +12 -0
  15. package/dist/lib/update-notice.d.ts.map +1 -0
  16. package/dist/lib/update-notice.js +315 -0
  17. package/dist/lib/update-notice.js.map +1 -0
  18. package/dist/lib/usage/ledger.d.ts.map +1 -1
  19. package/dist/lib/usage/ledger.js +1 -0
  20. package/dist/lib/usage/ledger.js.map +1 -1
  21. package/dist/lib/usage/redaction.d.ts.map +1 -1
  22. package/dist/lib/usage/redaction.js +1 -0
  23. package/dist/lib/usage/redaction.js.map +1 -1
  24. package/dist/lib/usage/types.d.ts +1 -1
  25. package/dist/lib/usage/types.d.ts.map +1 -1
  26. package/package.json +4 -4
  27. package/scripts/codex-app-launcher.js +1 -1
  28. package/scripts/codex-multi-auth.js +5 -1
  29. package/scripts/codex-routing.js +8 -0
  30. package/scripts/codex.js +309 -59
  31. package/scripts/test-model-matrix.js +97 -13
  32. package/dist/lib/auto-update-checker.d.ts +0 -32
  33. package/dist/lib/auto-update-checker.d.ts.map +0 -1
  34. package/dist/lib/auto-update-checker.js +0 -725
  35. 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 hasCompletedSuccessfully(output, token) {
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
- output.includes(token) ||
177
- output.includes('"type":"turn.completed"') ||
178
- output.includes('"type":"response.completed"')
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 getSmokeSkipReason(exitCode, output) {
183
- if (exitCode === 124) {
184
- return "timed-out";
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(caseInfo, exitCode, output, token, smoke) {
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 = !ok && smoke ? getSmokeSkipReason(exitCode, output) : null;
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, smoke);
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
- runQuiet("taskkill", ["/F", "/T", "/PID", String(pid)]);
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
- caseInfo.smoke === true,
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
- caseInfo.smoke === true,
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"}