codex-multi-auth 2.0.1 → 2.1.0

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 (143) hide show
  1. package/README.md +22 -8
  2. package/config/README.md +4 -4
  3. package/config/codex-legacy.json +571 -571
  4. package/config/codex-modern.json +258 -258
  5. package/config/minimal-codex.json +1 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +91 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/lib/account-policy.d.ts +22 -0
  10. package/dist/lib/account-policy.d.ts.map +1 -0
  11. package/dist/lib/account-policy.js +159 -0
  12. package/dist/lib/account-policy.js.map +1 -0
  13. package/dist/lib/accounts.d.ts.map +1 -1
  14. package/dist/lib/accounts.js +2 -1
  15. package/dist/lib/accounts.js.map +1 -1
  16. package/dist/lib/auth/device-auth.d.ts +46 -0
  17. package/dist/lib/auth/device-auth.d.ts.map +1 -0
  18. package/dist/lib/auth/device-auth.js +325 -0
  19. package/dist/lib/auth/device-auth.js.map +1 -0
  20. package/dist/lib/auth/index.d.ts +2 -0
  21. package/dist/lib/auth/index.d.ts.map +1 -1
  22. package/dist/lib/auth/index.js +1 -0
  23. package/dist/lib/auth/index.js.map +1 -1
  24. package/dist/lib/budget-guard.d.ts +39 -0
  25. package/dist/lib/budget-guard.d.ts.map +1 -0
  26. package/dist/lib/budget-guard.js +201 -0
  27. package/dist/lib/budget-guard.js.map +1 -0
  28. package/dist/lib/codex-manager/commands/account.d.ts +13 -0
  29. package/dist/lib/codex-manager/commands/account.d.ts.map +1 -0
  30. package/dist/lib/codex-manager/commands/account.js +156 -0
  31. package/dist/lib/codex-manager/commands/account.js.map +1 -0
  32. package/dist/lib/codex-manager/commands/bridge.d.ts +6 -0
  33. package/dist/lib/codex-manager/commands/bridge.d.ts.map +1 -0
  34. package/dist/lib/codex-manager/commands/bridge.js +100 -0
  35. package/dist/lib/codex-manager/commands/bridge.js.map +1 -0
  36. package/dist/lib/codex-manager/commands/budget.d.ts +12 -0
  37. package/dist/lib/codex-manager/commands/budget.d.ts.map +1 -0
  38. package/dist/lib/codex-manager/commands/budget.js +123 -0
  39. package/dist/lib/codex-manager/commands/budget.js.map +1 -0
  40. package/dist/lib/codex-manager/commands/integrations.d.ts +6 -0
  41. package/dist/lib/codex-manager/commands/integrations.d.ts.map +1 -0
  42. package/dist/lib/codex-manager/commands/integrations.js +78 -0
  43. package/dist/lib/codex-manager/commands/integrations.js.map +1 -0
  44. package/dist/lib/codex-manager/commands/models.d.ts +14 -0
  45. package/dist/lib/codex-manager/commands/models.d.ts.map +1 -0
  46. package/dist/lib/codex-manager/commands/models.js +74 -0
  47. package/dist/lib/codex-manager/commands/models.js.map +1 -0
  48. package/dist/lib/codex-manager/commands/monitor.d.ts +22 -0
  49. package/dist/lib/codex-manager/commands/monitor.d.ts.map +1 -0
  50. package/dist/lib/codex-manager/commands/monitor.js +94 -0
  51. package/dist/lib/codex-manager/commands/monitor.js.map +1 -0
  52. package/dist/lib/codex-manager/commands/rotation.d.ts +1 -0
  53. package/dist/lib/codex-manager/commands/rotation.d.ts.map +1 -1
  54. package/dist/lib/codex-manager/commands/rotation.js +293 -10
  55. package/dist/lib/codex-manager/commands/rotation.js.map +1 -1
  56. package/dist/lib/codex-manager/commands/usage.d.ts +13 -0
  57. package/dist/lib/codex-manager/commands/usage.d.ts.map +1 -0
  58. package/dist/lib/codex-manager/commands/usage.js +347 -0
  59. package/dist/lib/codex-manager/commands/usage.js.map +1 -0
  60. package/dist/lib/codex-manager/help.d.ts +1 -0
  61. package/dist/lib/codex-manager/help.d.ts.map +1 -1
  62. package/dist/lib/codex-manager/help.js +26 -1
  63. package/dist/lib/codex-manager/help.js.map +1 -1
  64. package/dist/lib/codex-manager.d.ts.map +1 -1
  65. package/dist/lib/codex-manager.js +64 -7
  66. package/dist/lib/codex-manager.js.map +1 -1
  67. package/dist/lib/config.d.ts.map +1 -1
  68. package/dist/lib/config.js +2 -22
  69. package/dist/lib/config.js.map +1 -1
  70. package/dist/lib/constants.d.ts +1 -0
  71. package/dist/lib/constants.d.ts.map +1 -1
  72. package/dist/lib/constants.js +1 -0
  73. package/dist/lib/constants.js.map +1 -1
  74. package/dist/lib/env-parsing.d.ts +21 -0
  75. package/dist/lib/env-parsing.d.ts.map +1 -0
  76. package/dist/lib/env-parsing.js +34 -0
  77. package/dist/lib/env-parsing.js.map +1 -0
  78. package/dist/lib/index.d.ts +9 -0
  79. package/dist/lib/index.d.ts.map +1 -1
  80. package/dist/lib/index.js +9 -0
  81. package/dist/lib/index.js.map +1 -1
  82. package/dist/lib/integration-generators.d.ts +14 -0
  83. package/dist/lib/integration-generators.d.ts.map +1 -0
  84. package/dist/lib/integration-generators.js +93 -0
  85. package/dist/lib/integration-generators.js.map +1 -0
  86. package/dist/lib/local-bridge.d.ts +17 -0
  87. package/dist/lib/local-bridge.d.ts.map +1 -0
  88. package/dist/lib/local-bridge.js +249 -0
  89. package/dist/lib/local-bridge.js.map +1 -0
  90. package/dist/lib/local-client-tokens.d.ts +37 -0
  91. package/dist/lib/local-client-tokens.d.ts.map +1 -0
  92. package/dist/lib/local-client-tokens.js +200 -0
  93. package/dist/lib/local-client-tokens.js.map +1 -0
  94. package/dist/lib/model-capability-matrix.d.ts +38 -0
  95. package/dist/lib/model-capability-matrix.d.ts.map +1 -0
  96. package/dist/lib/model-capability-matrix.js +89 -0
  97. package/dist/lib/model-capability-matrix.js.map +1 -0
  98. package/dist/lib/policy/runtime-policy.d.ts +59 -0
  99. package/dist/lib/policy/runtime-policy.d.ts.map +1 -0
  100. package/dist/lib/policy/runtime-policy.js +156 -0
  101. package/dist/lib/policy/runtime-policy.js.map +1 -0
  102. package/dist/lib/proactive-refresh.js +4 -4
  103. package/dist/lib/proactive-refresh.js.map +1 -1
  104. package/dist/lib/refresh-lease.d.ts.map +1 -1
  105. package/dist/lib/refresh-lease.js +1 -10
  106. package/dist/lib/refresh-lease.js.map +1 -1
  107. package/dist/lib/routing-profiles.d.ts +36 -0
  108. package/dist/lib/routing-profiles.d.ts.map +1 -0
  109. package/dist/lib/routing-profiles.js +203 -0
  110. package/dist/lib/routing-profiles.js.map +1 -0
  111. package/dist/lib/runtime-rotation-proxy.d.ts.map +1 -1
  112. package/dist/lib/runtime-rotation-proxy.js +96 -6
  113. package/dist/lib/runtime-rotation-proxy.js.map +1 -1
  114. package/dist/lib/schemas.d.ts +3 -0
  115. package/dist/lib/schemas.d.ts.map +1 -1
  116. package/dist/lib/schemas.js +1 -0
  117. package/dist/lib/schemas.js.map +1 -1
  118. package/dist/lib/usage/index.d.ts +5 -0
  119. package/dist/lib/usage/index.d.ts.map +1 -0
  120. package/dist/lib/usage/index.js +5 -0
  121. package/dist/lib/usage/index.js.map +1 -0
  122. package/dist/lib/usage/ledger.d.ts +12 -0
  123. package/dist/lib/usage/ledger.d.ts.map +1 -0
  124. package/dist/lib/usage/ledger.js +493 -0
  125. package/dist/lib/usage/ledger.js.map +1 -0
  126. package/dist/lib/usage/pricing.d.ts +11 -0
  127. package/dist/lib/usage/pricing.d.ts.map +1 -0
  128. package/dist/lib/usage/pricing.js +67 -0
  129. package/dist/lib/usage/pricing.js.map +1 -0
  130. package/dist/lib/usage/redaction.d.ts +10 -0
  131. package/dist/lib/usage/redaction.d.ts.map +1 -0
  132. package/dist/lib/usage/redaction.js +129 -0
  133. package/dist/lib/usage/redaction.js.map +1 -0
  134. package/dist/lib/usage/types.d.ts +89 -0
  135. package/dist/lib/usage/types.d.ts.map +1 -0
  136. package/dist/lib/usage/types.js +2 -0
  137. package/dist/lib/usage/types.js.map +1 -0
  138. package/package.json +1 -1
  139. package/scripts/bench-format/codex-host.mjs +142 -142
  140. package/scripts/bench-format/models.mjs +23 -23
  141. package/scripts/benchmark-edit-formats.mjs +9 -9
  142. package/scripts/codex-app-router.js +121 -121
  143. package/scripts/codex.js +165 -165
package/scripts/codex.js CHANGED
@@ -440,76 +440,76 @@ const NORMALIZED_UNSUPPORTED_MODEL_PATTERN =
440
440
  /model ['"]([^'"]+)['"] is not currently available for this chatgpt account when using codex oauth/i;
441
441
  const MODEL_ACCESS_DENIED_PATTERN =
442
442
  /the model [`'"]([^`'"]+)[`'"] does not exist or you do not have access to it/i;
443
- const DIRECT_UNSUPPORTED_MODEL_PATTERN =
444
- /['"]([^'"]+)['"]\s+model is not supported when using codex with a chatgpt account/i;
445
- const CURRENT_CODEX_MODEL = "gpt-5.3-codex";
446
- const LEGACY_CODEX_MODEL = "gpt-5-codex";
447
- const WRAPPER_UNSUPPORTED_MODEL_FALLBACK_CHAIN = {
448
- "gpt-5": ["gpt-5.5"],
449
- "gpt-5-pro": ["gpt-5.5-pro"],
450
- "gpt-5-chat-latest": ["gpt-5.5"],
451
- "gpt-5.5": ["gpt-5.4"],
452
- "gpt-5.5-pro": ["gpt-5.4"],
453
- "gpt-5.5-2026-04-23": ["gpt-5.4"],
454
- "gpt-5.5-pro-2026-04-23": ["gpt-5.4"],
455
- "gpt-5.5-20260423": ["gpt-5.4"],
456
- "gpt-5.5-pro-20260423": ["gpt-5.4"],
457
- "gpt-5.3-codex-spark": [CURRENT_CODEX_MODEL],
458
- "codex-max": [CURRENT_CODEX_MODEL],
459
- "gpt-5.1-codex-max": [CURRENT_CODEX_MODEL],
460
- "codex-mini-latest": [CURRENT_CODEX_MODEL],
461
- "gpt-5-codex-mini": [CURRENT_CODEX_MODEL],
462
- "gpt-5.1-codex-mini": [CURRENT_CODEX_MODEL],
463
- [LEGACY_CODEX_MODEL]: [CURRENT_CODEX_MODEL],
464
- "gpt-5.2-codex": [CURRENT_CODEX_MODEL],
465
- "gpt-5.1-codex": [CURRENT_CODEX_MODEL],
466
- };
467
-
468
- function canonicalizeRequestedModelName(model) {
469
- if (typeof model !== "string") return "";
470
- const normalizedModel = normalizeRequestedModel(model);
471
- if (normalizedModel) {
472
- return normalizedModel;
443
+ const DIRECT_UNSUPPORTED_MODEL_PATTERN =
444
+ /['"]([^'"]+)['"]\s+model is not supported when using codex with a chatgpt account/i;
445
+ const CURRENT_CODEX_MODEL = "gpt-5.3-codex";
446
+ const LEGACY_CODEX_MODEL = "gpt-5-codex";
447
+ const WRAPPER_UNSUPPORTED_MODEL_FALLBACK_CHAIN = {
448
+ "gpt-5": ["gpt-5.5"],
449
+ "gpt-5-pro": ["gpt-5.5-pro"],
450
+ "gpt-5-chat-latest": ["gpt-5.5"],
451
+ "gpt-5.5": ["gpt-5.4"],
452
+ "gpt-5.5-pro": ["gpt-5.4"],
453
+ "gpt-5.5-2026-04-23": ["gpt-5.4"],
454
+ "gpt-5.5-pro-2026-04-23": ["gpt-5.4"],
455
+ "gpt-5.5-20260423": ["gpt-5.4"],
456
+ "gpt-5.5-pro-20260423": ["gpt-5.4"],
457
+ "gpt-5.3-codex-spark": [CURRENT_CODEX_MODEL],
458
+ "codex-max": [CURRENT_CODEX_MODEL],
459
+ "gpt-5.1-codex-max": [CURRENT_CODEX_MODEL],
460
+ "codex-mini-latest": [CURRENT_CODEX_MODEL],
461
+ "gpt-5-codex-mini": [CURRENT_CODEX_MODEL],
462
+ "gpt-5.1-codex-mini": [CURRENT_CODEX_MODEL],
463
+ [LEGACY_CODEX_MODEL]: [CURRENT_CODEX_MODEL],
464
+ "gpt-5.2-codex": [CURRENT_CODEX_MODEL],
465
+ "gpt-5.1-codex": [CURRENT_CODEX_MODEL],
466
+ };
467
+
468
+ function canonicalizeRequestedModelName(model) {
469
+ if (typeof model !== "string") return "";
470
+ const normalizedModel = normalizeRequestedModel(model);
471
+ if (normalizedModel) {
472
+ return normalizedModel;
473
473
  }
474
474
 
475
475
  const stripped = stripProviderPrefix(model).trim().toLowerCase();
476
476
  if (!stripped) {
477
477
  return "";
478
478
  }
479
-
480
- return stripped.replace(/-(none|minimal|low|medium|high|xhigh)$/i, "");
481
- }
482
-
483
- function canonicalizeUnsupportedModelKey(model) {
484
- if (typeof model !== "string") return "";
485
- const stripped = stripProviderPrefix(model).trim().toLowerCase();
486
- if (!stripped) {
487
- return "";
488
- }
489
- return stripped.replace(/-(none|minimal|low|medium|high|xhigh)$/i, "");
490
- }
491
-
492
- function extractUnsupportedModelFromOutput(output) {
493
- if (typeof output !== "string" || output.length === 0) {
494
- return undefined;
495
- }
496
-
497
- const directMatch = output.match(DIRECT_UNSUPPORTED_MODEL_PATTERN);
498
- if (directMatch?.[1]) {
499
- return canonicalizeUnsupportedModelKey(directMatch[1]);
500
- }
501
-
502
- const normalizedMatch = output.match(NORMALIZED_UNSUPPORTED_MODEL_PATTERN);
503
- if (normalizedMatch?.[1]) {
504
- return canonicalizeUnsupportedModelKey(normalizedMatch[1]);
505
- }
506
- const accessDeniedMatch = output.match(MODEL_ACCESS_DENIED_PATTERN);
507
- if (accessDeniedMatch?.[1]) {
508
- return canonicalizeUnsupportedModelKey(accessDeniedMatch[1]);
509
- }
510
-
511
- return undefined;
512
- }
479
+
480
+ return stripped.replace(/-(none|minimal|low|medium|high|xhigh)$/i, "");
481
+ }
482
+
483
+ function canonicalizeUnsupportedModelKey(model) {
484
+ if (typeof model !== "string") return "";
485
+ const stripped = stripProviderPrefix(model).trim().toLowerCase();
486
+ if (!stripped) {
487
+ return "";
488
+ }
489
+ return stripped.replace(/-(none|minimal|low|medium|high|xhigh)$/i, "");
490
+ }
491
+
492
+ function extractUnsupportedModelFromOutput(output) {
493
+ if (typeof output !== "string" || output.length === 0) {
494
+ return undefined;
495
+ }
496
+
497
+ const directMatch = output.match(DIRECT_UNSUPPORTED_MODEL_PATTERN);
498
+ if (directMatch?.[1]) {
499
+ return canonicalizeUnsupportedModelKey(directMatch[1]);
500
+ }
501
+
502
+ const normalizedMatch = output.match(NORMALIZED_UNSUPPORTED_MODEL_PATTERN);
503
+ if (normalizedMatch?.[1]) {
504
+ return canonicalizeUnsupportedModelKey(normalizedMatch[1]);
505
+ }
506
+ const accessDeniedMatch = output.match(MODEL_ACCESS_DENIED_PATTERN);
507
+ if (accessDeniedMatch?.[1]) {
508
+ return canonicalizeUnsupportedModelKey(accessDeniedMatch[1]);
509
+ }
510
+
511
+ return undefined;
512
+ }
513
513
 
514
514
  function resolveUnsupportedModelRetryTarget(
515
515
  requestedModel,
@@ -526,14 +526,14 @@ function resolveUnsupportedModelRetryTarget(
526
526
  return undefined;
527
527
  }
528
528
 
529
- const attempted = new Set(
530
- attemptedModels
531
- .map((model) => canonicalizeUnsupportedModelKey(model))
532
- .filter(Boolean),
533
- );
534
- const normalizedRequestedModel = canonicalizeUnsupportedModelKey(requestedModel);
535
- const blockedModel =
536
- extractUnsupportedModelFromOutput(output) ?? normalizedRequestedModel;
529
+ const attempted = new Set(
530
+ attemptedModels
531
+ .map((model) => canonicalizeUnsupportedModelKey(model))
532
+ .filter(Boolean),
533
+ );
534
+ const normalizedRequestedModel = canonicalizeUnsupportedModelKey(requestedModel);
535
+ const blockedModel =
536
+ extractUnsupportedModelFromOutput(output) ?? normalizedRequestedModel;
537
537
  const fallbackChain =
538
538
  WRAPPER_UNSUPPORTED_MODEL_FALLBACK_CHAIN[blockedModel] ??
539
539
  (normalizedRequestedModel
@@ -557,11 +557,11 @@ function replaceRequestedModel(args, nextModel) {
557
557
 
558
558
  const nextArgs = [...args];
559
559
  for (let i = 0; i < nextArgs.length; i += 1) {
560
- const arg = nextArgs[i];
561
- if ((arg === "--model" || arg === "-m") && typeof nextArgs[i + 1] === "string") {
562
- nextArgs[i + 1] = nextModel;
563
- return nextArgs;
564
- }
560
+ const arg = nextArgs[i];
561
+ if ((arg === "--model" || arg === "-m") && typeof nextArgs[i + 1] === "string") {
562
+ nextArgs[i + 1] = nextModel;
563
+ return nextArgs;
564
+ }
565
565
  if (typeof arg === "string" && arg.startsWith("--model=")) {
566
566
  nextArgs[i] = `--model=${nextModel}`;
567
567
  return nextArgs;
@@ -1001,15 +1001,15 @@ function hasCliAuthCredentialsStoreOverride(args) {
1001
1001
  // `lib/request/helpers/model-map.ts` `MODEL_PROFILES`
1002
1002
  // and its GPT-5 normalization helpers.
1003
1003
  // This wrapper runs before the TypeScript build, so it cannot import that source.
1004
- const SUPPORTED_REASONING_EFFORTS_BY_MODEL = {
1005
- [CURRENT_CODEX_MODEL]: ["low", "medium", "high", "xhigh"],
1006
- "gpt-5.5": ["none", "low", "medium", "high", "xhigh"],
1007
- "gpt-5.5-pro": ["medium", "high", "xhigh"],
1008
- "gpt-5.4": ["none", "low", "medium", "high", "xhigh"],
1009
- "gpt-5.4-pro": ["medium", "high", "xhigh"],
1010
- "gpt-5.4-mini": ["medium"],
1011
- "gpt-5.4-nano": ["medium"],
1012
- "gpt-5.2-pro": ["medium", "high", "xhigh"],
1004
+ const SUPPORTED_REASONING_EFFORTS_BY_MODEL = {
1005
+ [CURRENT_CODEX_MODEL]: ["low", "medium", "high", "xhigh"],
1006
+ "gpt-5.5": ["none", "low", "medium", "high", "xhigh"],
1007
+ "gpt-5.5-pro": ["medium", "high", "xhigh"],
1008
+ "gpt-5.4": ["none", "low", "medium", "high", "xhigh"],
1009
+ "gpt-5.4-pro": ["medium", "high", "xhigh"],
1010
+ "gpt-5.4-mini": ["medium"],
1011
+ "gpt-5.4-nano": ["medium"],
1012
+ "gpt-5.2-pro": ["medium", "high", "xhigh"],
1013
1013
  "gpt-5.2": ["none", "low", "medium", "high", "xhigh"],
1014
1014
  "gpt-5.1": ["none", "low", "medium", "high"],
1015
1015
  "gpt-5-mini": ["medium"],
@@ -1027,13 +1027,13 @@ const REASONING_FALLBACKS = {
1027
1027
 
1028
1028
  const KNOWN_REASONING_EFFORTS = new Set(Object.keys(REASONING_FALLBACKS));
1029
1029
  const REQUESTED_MODEL_ALIASES = new Map();
1030
- const DEFAULT_GENERAL_GPT5_MODEL = "gpt-5.5";
1031
- const GPT_5_5_CANONICAL_MODEL = "gpt-5.5";
1032
- const GPT_5_5_PRO_CANONICAL_MODEL = "gpt-5.5-pro";
1033
- const GPT_5_5_RELEASE_MODEL = "gpt-5.5-2026-04-23";
1034
- const GPT_5_5_PRO_RELEASE_MODEL = "gpt-5.5-pro-2026-04-23";
1035
- const GPT_5_5_RELEASE_COMPAT_MODEL = "gpt-5.5-20260423";
1036
- const GPT_5_5_PRO_RELEASE_COMPAT_MODEL = "gpt-5.5-pro-20260423";
1030
+ const DEFAULT_GENERAL_GPT5_MODEL = "gpt-5.5";
1031
+ const GPT_5_5_CANONICAL_MODEL = "gpt-5.5";
1032
+ const GPT_5_5_PRO_CANONICAL_MODEL = "gpt-5.5-pro";
1033
+ const GPT_5_5_RELEASE_MODEL = "gpt-5.5-2026-04-23";
1034
+ const GPT_5_5_PRO_RELEASE_MODEL = "gpt-5.5-pro-2026-04-23";
1035
+ const GPT_5_5_RELEASE_COMPAT_MODEL = "gpt-5.5-20260423";
1036
+ const GPT_5_5_PRO_RELEASE_COMPAT_MODEL = "gpt-5.5-pro-20260423";
1037
1037
  const GENERAL_GPT5_VERSION_CATALOG = {
1038
1038
  1: {
1039
1039
  base: "gpt-5.1",
@@ -1042,12 +1042,12 @@ const GENERAL_GPT5_VERSION_CATALOG = {
1042
1042
  base: "gpt-5.2",
1043
1043
  pro: "gpt-5.2-pro",
1044
1044
  },
1045
- 4: {
1046
- base: DEFAULT_GENERAL_GPT5_MODEL,
1047
- pro: "gpt-5.4-pro",
1048
- mini: "gpt-5.4-mini",
1049
- nano: "gpt-5.4-nano",
1050
- },
1045
+ 4: {
1046
+ base: DEFAULT_GENERAL_GPT5_MODEL,
1047
+ pro: "gpt-5.4-pro",
1048
+ mini: "gpt-5.4-mini",
1049
+ nano: "gpt-5.4-nano",
1050
+ },
1051
1051
  5: {
1052
1052
  base: GPT_5_5_CANONICAL_MODEL,
1053
1053
  pro: GPT_5_5_PRO_CANONICAL_MODEL,
@@ -1055,13 +1055,13 @@ const GENERAL_GPT5_VERSION_CATALOG = {
1055
1055
  nano: "gpt-5-nano",
1056
1056
  },
1057
1057
  };
1058
- const GENERAL_GPT5_STABLE_VARIANTS = GENERAL_GPT5_VERSION_CATALOG[5];
1059
- const GENERAL_GPT5_GENERIC_VARIANTS = {
1060
- base: DEFAULT_GENERAL_GPT5_MODEL,
1061
- pro: GPT_5_5_PRO_CANONICAL_MODEL,
1062
- mini: "gpt-5-mini",
1063
- nano: "gpt-5-nano",
1064
- };
1058
+ const GENERAL_GPT5_STABLE_VARIANTS = GENERAL_GPT5_VERSION_CATALOG[5];
1059
+ const GENERAL_GPT5_GENERIC_VARIANTS = {
1060
+ base: DEFAULT_GENERAL_GPT5_MODEL,
1061
+ pro: GPT_5_5_PRO_CANONICAL_MODEL,
1062
+ mini: "gpt-5-mini",
1063
+ nano: "gpt-5-nano",
1064
+ };
1065
1065
 
1066
1066
  function addRequestedModelAlias(alias, normalizedModel) {
1067
1067
  REQUESTED_MODEL_ALIASES.set(alias, normalizedModel);
@@ -1174,50 +1174,50 @@ function seedRequestedModelAliases() {
1174
1174
  GPT_5_5_CANONICAL_MODEL,
1175
1175
  GPT_5_5_CANONICAL_MODEL,
1176
1176
  );
1177
- addRequestedModelReasoningAliases(
1178
- GPT_5_5_RELEASE_MODEL,
1179
- GPT_5_5_CANONICAL_MODEL,
1180
- );
1181
- addRequestedModelReasoningAliases(
1182
- GPT_5_5_RELEASE_COMPAT_MODEL,
1183
- GPT_5_5_CANONICAL_MODEL,
1184
- );
1185
1177
  addRequestedModelReasoningAliases(
1178
+ GPT_5_5_RELEASE_MODEL,
1179
+ GPT_5_5_CANONICAL_MODEL,
1180
+ );
1181
+ addRequestedModelReasoningAliases(
1182
+ GPT_5_5_RELEASE_COMPAT_MODEL,
1183
+ GPT_5_5_CANONICAL_MODEL,
1184
+ );
1185
+ addRequestedModelReasoningAliases(
1186
+ GPT_5_5_PRO_CANONICAL_MODEL,
1186
1187
  GPT_5_5_PRO_CANONICAL_MODEL,
1188
+ );
1189
+ addRequestedModelReasoningAliases(
1190
+ GPT_5_5_PRO_RELEASE_MODEL,
1187
1191
  GPT_5_5_PRO_CANONICAL_MODEL,
1188
1192
  );
1189
- addRequestedModelReasoningAliases(
1190
- GPT_5_5_PRO_RELEASE_MODEL,
1191
- GPT_5_5_PRO_CANONICAL_MODEL,
1192
- );
1193
- addRequestedModelReasoningAliases(
1194
- GPT_5_5_PRO_RELEASE_COMPAT_MODEL,
1195
- GPT_5_5_PRO_CANONICAL_MODEL,
1196
- );
1197
- addRequestedModelReasoningAliases("gpt-5.4", "gpt-5.4");
1198
- addRequestedModelReasoningAliases("gpt-5.4-pro", "gpt-5.4-pro");
1199
- addRequestedModelReasoningAliases("gpt-5.4-mini", "gpt-5.4-mini");
1200
- addRequestedModelReasoningAliases("gpt-5.4-nano", "gpt-5.4-nano");
1193
+ addRequestedModelReasoningAliases(
1194
+ GPT_5_5_PRO_RELEASE_COMPAT_MODEL,
1195
+ GPT_5_5_PRO_CANONICAL_MODEL,
1196
+ );
1197
+ addRequestedModelReasoningAliases("gpt-5.4", "gpt-5.4");
1198
+ addRequestedModelReasoningAliases("gpt-5.4-pro", "gpt-5.4-pro");
1199
+ addRequestedModelReasoningAliases("gpt-5.4-mini", "gpt-5.4-mini");
1200
+ addRequestedModelReasoningAliases("gpt-5.4-nano", "gpt-5.4-nano");
1201
1201
  addRequestedModelReasoningAliases("gpt-5.2-pro", "gpt-5.2-pro");
1202
- addRequestedModelReasoningAliases("gpt-5-pro", GPT_5_5_PRO_CANONICAL_MODEL);
1202
+ addRequestedModelReasoningAliases("gpt-5-pro", GPT_5_5_PRO_CANONICAL_MODEL);
1203
1203
  addRequestedModelReasoningAliases("gpt-5.2", "gpt-5.2");
1204
1204
  addRequestedModelReasoningAliases("gpt-5.1", "gpt-5.1");
1205
- addRequestedModelReasoningAliases("gpt-5", DEFAULT_GENERAL_GPT5_MODEL);
1205
+ addRequestedModelReasoningAliases("gpt-5", DEFAULT_GENERAL_GPT5_MODEL);
1206
1206
  addRequestedModelReasoningAliases("gpt-5-mini", "gpt-5-mini");
1207
1207
  addRequestedModelReasoningAliases("gpt-5-nano", "gpt-5-nano");
1208
1208
  addRequestedModelReasoningAliases("gpt-5.1-chat-latest", "gpt-5.1");
1209
- addRequestedModelReasoningAliases("gpt-5-chat-latest", DEFAULT_GENERAL_GPT5_MODEL);
1210
- addRequestedModelReasoningAliases(CURRENT_CODEX_MODEL, CURRENT_CODEX_MODEL);
1211
- addRequestedModelReasoningAliases("gpt-5.3-codex-spark", CURRENT_CODEX_MODEL);
1212
- addRequestedModelReasoningAliases(LEGACY_CODEX_MODEL, CURRENT_CODEX_MODEL);
1213
- addRequestedModelReasoningAliases("gpt-5.2-codex", CURRENT_CODEX_MODEL);
1214
- addRequestedModelReasoningAliases("gpt-5.1-codex", CURRENT_CODEX_MODEL);
1215
- addRequestedModelAlias("gpt_5_codex", CURRENT_CODEX_MODEL);
1216
- addRequestedModelReasoningAliases("codex-max", CURRENT_CODEX_MODEL);
1217
- addRequestedModelReasoningAliases("gpt-5.1-codex-max", CURRENT_CODEX_MODEL);
1218
- addRequestedModelAlias("codex-mini-latest", CURRENT_CODEX_MODEL);
1219
- addRequestedModelReasoningAliases("gpt-5-codex-mini", CURRENT_CODEX_MODEL);
1220
- addRequestedModelReasoningAliases("gpt-5.1-codex-mini", CURRENT_CODEX_MODEL);
1209
+ addRequestedModelReasoningAliases("gpt-5-chat-latest", DEFAULT_GENERAL_GPT5_MODEL);
1210
+ addRequestedModelReasoningAliases(CURRENT_CODEX_MODEL, CURRENT_CODEX_MODEL);
1211
+ addRequestedModelReasoningAliases("gpt-5.3-codex-spark", CURRENT_CODEX_MODEL);
1212
+ addRequestedModelReasoningAliases(LEGACY_CODEX_MODEL, CURRENT_CODEX_MODEL);
1213
+ addRequestedModelReasoningAliases("gpt-5.2-codex", CURRENT_CODEX_MODEL);
1214
+ addRequestedModelReasoningAliases("gpt-5.1-codex", CURRENT_CODEX_MODEL);
1215
+ addRequestedModelAlias("gpt_5_codex", CURRENT_CODEX_MODEL);
1216
+ addRequestedModelReasoningAliases("codex-max", CURRENT_CODEX_MODEL);
1217
+ addRequestedModelReasoningAliases("gpt-5.1-codex-max", CURRENT_CODEX_MODEL);
1218
+ addRequestedModelAlias("codex-mini-latest", CURRENT_CODEX_MODEL);
1219
+ addRequestedModelReasoningAliases("gpt-5-codex-mini", CURRENT_CODEX_MODEL);
1220
+ addRequestedModelReasoningAliases("gpt-5.1-codex-mini", CURRENT_CODEX_MODEL);
1221
1221
  }
1222
1222
 
1223
1223
  seedRequestedModelAliases();
@@ -1264,24 +1264,24 @@ function resolveStableGeneralGpt5Variant(variant) {
1264
1264
 
1265
1265
  function resolveCodexRequestedModel(normalized) {
1266
1266
  if (
1267
- normalized.includes("gpt-5.1-codex-max") ||
1268
- normalized.includes("gpt 5.1 codex max") ||
1269
- normalized.includes("codex-max")
1270
- ) {
1271
- return CURRENT_CODEX_MODEL;
1272
- }
1267
+ normalized.includes("gpt-5.1-codex-max") ||
1268
+ normalized.includes("gpt 5.1 codex max") ||
1269
+ normalized.includes("codex-max")
1270
+ ) {
1271
+ return CURRENT_CODEX_MODEL;
1272
+ }
1273
1273
  if (
1274
1274
  normalized.includes("gpt-5.1-codex-mini") ||
1275
1275
  normalized.includes("gpt 5.1 codex mini") ||
1276
1276
  normalized.includes("gpt-5-codex-mini") ||
1277
- normalized.includes("gpt 5 codex mini") ||
1278
- normalized.includes("codex-mini-latest")
1279
- ) {
1280
- return CURRENT_CODEX_MODEL;
1281
- }
1282
- if (
1283
- normalized.includes("gpt-5.3-codex-spark") ||
1284
- normalized.includes("gpt 5.3 codex spark") ||
1277
+ normalized.includes("gpt 5 codex mini") ||
1278
+ normalized.includes("codex-mini-latest")
1279
+ ) {
1280
+ return CURRENT_CODEX_MODEL;
1281
+ }
1282
+ if (
1283
+ normalized.includes("gpt-5.3-codex-spark") ||
1284
+ normalized.includes("gpt 5.3 codex spark") ||
1285
1285
  normalized.includes("gpt-5.3-codex") ||
1286
1286
  normalized.includes("gpt 5.3 codex") ||
1287
1287
  normalized.includes("gpt-5.2-codex") ||
@@ -1289,11 +1289,11 @@ function resolveCodexRequestedModel(normalized) {
1289
1289
  normalized.includes("gpt-5.1-codex") ||
1290
1290
  normalized.includes("gpt 5.1 codex") ||
1291
1291
  normalized.includes("gpt-5-codex") ||
1292
- normalized.includes("gpt 5 codex") ||
1293
- normalized === "codex"
1294
- ) {
1295
- return CURRENT_CODEX_MODEL;
1296
- }
1292
+ normalized.includes("gpt 5 codex") ||
1293
+ normalized === "codex"
1294
+ ) {
1295
+ return CURRENT_CODEX_MODEL;
1296
+ }
1297
1297
 
1298
1298
  return "";
1299
1299
  }
@@ -1379,12 +1379,12 @@ function coerceReasoningEffortForModel(model, effort) {
1379
1379
  }
1380
1380
 
1381
1381
  function extractRequestedModel(args) {
1382
- for (let i = 0; i < args.length; i += 1) {
1383
- const arg = args[i];
1384
- if (arg === "--model" || arg === "-m") {
1385
- const next = args[i + 1];
1386
- if (typeof next === "string" && next.trim().length > 0) {
1387
- return next.trim();
1382
+ for (let i = 0; i < args.length; i += 1) {
1383
+ const arg = args[i];
1384
+ if (arg === "--model" || arg === "-m") {
1385
+ const next = args[i + 1];
1386
+ if (typeof next === "string" && next.trim().length > 0) {
1387
+ return next.trim();
1388
1388
  }
1389
1389
  continue;
1390
1390
  }