codex-multi-auth 2.17.2 → 2.18.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 (405) hide show
  1. package/.codex-plugin/plugin.json +1 -1
  2. package/README.md +86 -425
  3. package/config/README.md +1 -1
  4. package/config/codex-legacy.json +12 -212
  5. package/config/codex-modern.json +4 -80
  6. package/config/minimal-codex.json +1 -1
  7. package/dist/index.d.ts +0 -1
  8. package/dist/lib/account-policy.d.ts +18 -2
  9. package/dist/lib/account-policy.js +97 -40
  10. package/dist/lib/accounts/rate-limits.d.ts +0 -1
  11. package/dist/lib/accounts.d.ts +0 -1
  12. package/dist/lib/accounts.js +4 -5
  13. package/dist/lib/api-route-store.d.ts +0 -1
  14. package/dist/lib/audit.d.ts +0 -1
  15. package/dist/lib/audit.js +43 -12
  16. package/dist/lib/auth/account-access.d.ts +0 -1
  17. package/dist/lib/auth/account-access.js +5 -1
  18. package/dist/lib/auth/auth.d.ts +4 -3
  19. package/dist/lib/auth/auth.js +220 -28
  20. package/dist/lib/auth/browser.d.ts +0 -1
  21. package/dist/lib/auth/callback-guidance.d.ts +0 -1
  22. package/dist/lib/auth/device-auth.d.ts +0 -1
  23. package/dist/lib/auth/index.d.ts +0 -1
  24. package/dist/lib/auth/org-override.d.ts +0 -1
  25. package/dist/lib/auth/server.d.ts +1 -2
  26. package/dist/lib/auth/server.js +100 -53
  27. package/dist/lib/auth/token-utils.d.ts +0 -1
  28. package/dist/lib/auth-rate-limit.d.ts +0 -1
  29. package/dist/lib/budget-guard.d.ts +16 -2
  30. package/dist/lib/budget-guard.js +123 -43
  31. package/dist/lib/capability-policy.d.ts +0 -1
  32. package/dist/lib/circuit-breaker.d.ts +20 -1
  33. package/dist/lib/circuit-breaker.js +24 -5
  34. package/dist/lib/cli.d.ts +0 -1
  35. package/dist/lib/codex-cli/index.d.ts +0 -1
  36. package/dist/lib/codex-cli/observability.d.ts +0 -1
  37. package/dist/lib/codex-cli/state.d.ts +0 -1
  38. package/dist/lib/codex-cli/sync.d.ts +0 -1
  39. package/dist/lib/codex-cli/writer.d.ts +0 -1
  40. package/dist/lib/codex-manager/account-credentials.d.ts +0 -1
  41. package/dist/lib/codex-manager/account-manager-commands.d.ts +0 -1
  42. package/dist/lib/codex-manager/account-pool-write.d.ts +0 -1
  43. package/dist/lib/codex-manager/active-account-sync.d.ts +6 -0
  44. package/dist/lib/codex-manager/active-account-sync.js +336 -0
  45. package/dist/lib/codex-manager/api-login-menu.d.ts +0 -1
  46. package/dist/lib/codex-manager/backend-category-entry.d.ts +0 -1
  47. package/dist/lib/codex-manager/backend-category-helpers.d.ts +0 -1
  48. package/dist/lib/codex-manager/backend-category-prompt.d.ts +0 -1
  49. package/dist/lib/codex-manager/backend-settings-controller.d.ts +0 -1
  50. package/dist/lib/codex-manager/backend-settings-entry.d.ts +0 -1
  51. package/dist/lib/codex-manager/backend-settings-helpers.d.ts +0 -1
  52. package/dist/lib/codex-manager/backend-settings-prompt.d.ts +0 -1
  53. package/dist/lib/codex-manager/backend-settings-schema.d.ts +0 -1
  54. package/dist/lib/codex-manager/behavior-settings-panel.d.ts +0 -1
  55. package/dist/lib/codex-manager/commands/account.d.ts +8 -3
  56. package/dist/lib/codex-manager/commands/account.js +46 -34
  57. package/dist/lib/codex-manager/commands/best.d.ts +0 -1
  58. package/dist/lib/codex-manager/commands/bridge.d.ts +0 -1
  59. package/dist/lib/codex-manager/commands/budget.d.ts +8 -3
  60. package/dist/lib/codex-manager/commands/budget.js +6 -4
  61. package/dist/lib/codex-manager/commands/check.d.ts +0 -1
  62. package/dist/lib/codex-manager/commands/config-explain.d.ts +0 -1
  63. package/dist/lib/codex-manager/commands/debug-bundle.d.ts +0 -1
  64. package/dist/lib/codex-manager/commands/forecast.d.ts +0 -1
  65. package/dist/lib/codex-manager/commands/history.d.ts +0 -1
  66. package/dist/lib/codex-manager/commands/init-config.d.ts +0 -1
  67. package/dist/lib/codex-manager/commands/integrations.d.ts +0 -1
  68. package/dist/lib/codex-manager/commands/limits.d.ts +0 -1
  69. package/dist/lib/codex-manager/commands/models.d.ts +0 -1
  70. package/dist/lib/codex-manager/commands/monitor.d.ts +0 -1
  71. package/dist/lib/codex-manager/commands/report.d.ts +0 -1
  72. package/dist/lib/codex-manager/commands/resets.d.ts +0 -1
  73. package/dist/lib/codex-manager/commands/resets.js +9 -1
  74. package/dist/lib/codex-manager/commands/rotation.d.ts +0 -1
  75. package/dist/lib/codex-manager/commands/status.d.ts +0 -1
  76. package/dist/lib/codex-manager/commands/switch.d.ts +0 -1
  77. package/dist/lib/codex-manager/commands/uninstall.d.ts +0 -1
  78. package/dist/lib/codex-manager/commands/unpin.d.ts +0 -1
  79. package/dist/lib/codex-manager/commands/usage.d.ts +0 -1
  80. package/dist/lib/codex-manager/commands/verify.d.ts +0 -1
  81. package/dist/lib/codex-manager/commands/why-selected.d.ts +0 -1
  82. package/dist/lib/codex-manager/commands/workspace.d.ts +0 -1
  83. package/dist/lib/codex-manager/dashboard-display-panel.d.ts +0 -1
  84. package/dist/lib/codex-manager/dashboard-formatters.d.ts +0 -1
  85. package/dist/lib/codex-manager/dashboard-settings-controller.d.ts +0 -1
  86. package/dist/lib/codex-manager/dashboard-settings-data.d.ts +0 -1
  87. package/dist/lib/codex-manager/dashboard-settings-entry.d.ts +0 -1
  88. package/dist/lib/codex-manager/experimental-settings-entry.d.ts +0 -1
  89. package/dist/lib/codex-manager/experimental-settings-prompt.d.ts +0 -1
  90. package/dist/lib/codex-manager/experimental-settings-schema.d.ts +0 -1
  91. package/dist/lib/codex-manager/experimental-sync-target-entry.d.ts +0 -1
  92. package/dist/lib/codex-manager/experimental-sync-target.d.ts +0 -1
  93. package/dist/lib/codex-manager/forecast-report-shared.d.ts +0 -1
  94. package/dist/lib/codex-manager/formatters/account-formatters.d.ts +0 -1
  95. package/dist/lib/codex-manager/formatters/index.d.ts +0 -1
  96. package/dist/lib/codex-manager/formatters/model-formatters.d.ts +0 -1
  97. package/dist/lib/codex-manager/formatters/quota-formatters.d.ts +0 -1
  98. package/dist/lib/codex-manager/formatters/text-style.d.ts +0 -1
  99. package/dist/lib/codex-manager/health-check.d.ts +0 -1
  100. package/dist/lib/codex-manager/help.d.ts +0 -1
  101. package/dist/lib/codex-manager/login-action-panel.d.ts +0 -1
  102. package/dist/lib/codex-manager/login-flow.d.ts +0 -1
  103. package/dist/lib/codex-manager/login-menu-actions.d.ts +0 -1
  104. package/dist/lib/codex-manager/login-menu-data.d.ts +0 -1
  105. package/dist/lib/codex-manager/login-oauth.d.ts +0 -1
  106. package/dist/lib/codex-manager/login-workspace-choice.d.ts +0 -1
  107. package/dist/lib/codex-manager/manual-callback.d.ts +0 -1
  108. package/dist/lib/codex-manager/persist-selected-account.d.ts +0 -1
  109. package/dist/lib/codex-manager/quota-cache-helpers.d.ts +0 -1
  110. package/dist/lib/codex-manager/rate-limit-markers.d.ts +0 -1
  111. package/dist/lib/codex-manager/repair-commands.d.ts +0 -1
  112. package/dist/lib/codex-manager/settings-hub/backend.d.ts +0 -1
  113. package/dist/lib/codex-manager/settings-hub/dashboard.d.ts +0 -1
  114. package/dist/lib/codex-manager/settings-hub/experimental.d.ts +0 -1
  115. package/dist/lib/codex-manager/settings-hub/index.d.ts +0 -1
  116. package/dist/lib/codex-manager/settings-hub/shared.d.ts +0 -1
  117. package/dist/lib/codex-manager/settings-hub-entry.d.ts +0 -1
  118. package/dist/lib/codex-manager/settings-hub-menu.d.ts +0 -1
  119. package/dist/lib/codex-manager/settings-hub-prompt.d.ts +0 -1
  120. package/dist/lib/codex-manager/settings-hub.d.ts +0 -1
  121. package/dist/lib/codex-manager/settings-panels.d.ts +0 -1
  122. package/dist/lib/codex-manager/settings-persist-utils.d.ts +0 -1
  123. package/dist/lib/codex-manager/settings-preview.d.ts +0 -1
  124. package/dist/lib/codex-manager/settings-write-queue.d.ts +0 -1
  125. package/dist/lib/codex-manager/statusline-settings-panel.d.ts +0 -1
  126. package/dist/lib/codex-manager/theme-settings-panel.d.ts +0 -1
  127. package/dist/lib/codex-manager/unified-settings-controller.d.ts +0 -1
  128. package/dist/lib/codex-manager/unified-settings-entry.d.ts +0 -1
  129. package/dist/lib/codex-manager.d.ts +1 -2
  130. package/dist/lib/codex-manager.js +5 -95
  131. package/dist/lib/concurrency.d.ts +0 -1
  132. package/dist/lib/config-schema.d.ts +0 -1
  133. package/dist/lib/config.d.ts +0 -1
  134. package/dist/lib/config.js +46 -241
  135. package/dist/lib/constants.d.ts +0 -1
  136. package/dist/lib/context-budget/model-context-windows.d.ts +1 -2
  137. package/dist/lib/context-budget/model-context-windows.js +10 -13
  138. package/dist/lib/context-budget-guard.d.ts +0 -1
  139. package/dist/lib/context-budget-response.d.ts +0 -1
  140. package/dist/lib/context-overflow.d.ts +0 -1
  141. package/dist/lib/dashboard-settings.d.ts +0 -1
  142. package/dist/lib/entitlement-cache.d.ts +0 -1
  143. package/dist/lib/env-parsing.d.ts +13 -1
  144. package/dist/lib/env-parsing.js +21 -0
  145. package/dist/lib/errors.d.ts +0 -1
  146. package/dist/lib/forecast.d.ts +0 -1
  147. package/dist/lib/fs-retry.d.ts +0 -1
  148. package/dist/lib/health.d.ts +0 -1
  149. package/dist/lib/index.d.ts +0 -1
  150. package/dist/lib/integration-generators.d.ts +0 -1
  151. package/dist/lib/live-account-sync.d.ts +0 -1
  152. package/dist/lib/local-bridge.d.ts +0 -1
  153. package/dist/lib/local-bridge.js +4 -1
  154. package/dist/lib/local-client-tokens.d.ts +0 -1
  155. package/dist/lib/local-client-tokens.js +125 -30
  156. package/dist/lib/logger.d.ts +0 -1
  157. package/dist/lib/logger.js +11 -1
  158. package/dist/lib/model-capability-matrix.d.ts +0 -1
  159. package/dist/lib/model-route-policy.d.ts +1 -2
  160. package/dist/lib/named-backup-export.d.ts +0 -1
  161. package/dist/lib/oc-chatgpt-import-adapter.d.ts +0 -1
  162. package/dist/lib/oc-chatgpt-orchestrator.d.ts +0 -1
  163. package/dist/lib/oc-chatgpt-target-detection.d.ts +3 -3
  164. package/dist/lib/oc-chatgpt-target-detection.js +40 -13
  165. package/dist/lib/parallel-probe.d.ts +0 -1
  166. package/dist/lib/policy/runtime-policy-cache.d.ts +80 -0
  167. package/dist/lib/policy/runtime-policy-cache.js +310 -0
  168. package/dist/lib/policy/runtime-policy.d.ts +1 -2
  169. package/dist/lib/policy/runtime-policy.js +46 -19
  170. package/dist/lib/preemptive-quota-scheduler.d.ts +0 -1
  171. package/dist/lib/proactive-refresh.d.ts +0 -1
  172. package/dist/lib/prompts/codex-host-bridge.d.ts +0 -1
  173. package/dist/lib/prompts/codex.d.ts +0 -1
  174. package/dist/lib/prompts/fetch-utils.d.ts +0 -1
  175. package/dist/lib/prompts/host-codex-prompt.d.ts +0 -1
  176. package/dist/lib/quota-cache.d.ts +0 -1
  177. package/dist/lib/quota-cache.js +60 -36
  178. package/dist/lib/quota-probe.d.ts +0 -1
  179. package/dist/lib/quota-probe.js +5 -2
  180. package/dist/lib/quota-readiness.d.ts +0 -1
  181. package/dist/lib/recovery/constants.d.ts +0 -1
  182. package/dist/lib/recovery/storage.d.ts +0 -1
  183. package/dist/lib/recovery/types.d.ts +0 -1
  184. package/dist/lib/recovery.d.ts +0 -1
  185. package/dist/lib/redaction.d.ts +0 -1
  186. package/dist/lib/refresh-guardian.d.ts +0 -1
  187. package/dist/lib/refresh-lease.d.ts +0 -1
  188. package/dist/lib/refresh-queue.d.ts +0 -1
  189. package/dist/lib/request/client-cancellation.d.ts +0 -1
  190. package/dist/lib/request/error-classification.d.ts +0 -1
  191. package/dist/lib/request/error-classification.js +41 -52
  192. package/dist/lib/request/failover-config.d.ts +0 -1
  193. package/dist/lib/request/failure-policy.d.ts +0 -1
  194. package/dist/lib/request/fetch-helpers.d.ts +0 -1
  195. package/dist/lib/request/fetch-helpers.js +1 -1
  196. package/dist/lib/request/headers.d.ts +0 -1
  197. package/dist/lib/request/helpers/input-utils.d.ts +0 -1
  198. package/dist/lib/request/helpers/input-utils.js +88 -34
  199. package/dist/lib/request/helpers/model-map.d.ts +2 -3
  200. package/dist/lib/request/helpers/model-map.js +120 -78
  201. package/dist/lib/request/helpers/tool-utils.d.ts +0 -1
  202. package/dist/lib/request/helpers/tool-utils.js +421 -4
  203. package/dist/lib/request/index.d.ts +0 -1
  204. package/dist/lib/request/rate-limit-backoff.d.ts +0 -1
  205. package/dist/lib/request/rate-limit-decision.d.ts +0 -1
  206. package/dist/lib/request/request-attempt-budget.d.ts +0 -1
  207. package/dist/lib/request/request-init.d.ts +0 -1
  208. package/dist/lib/request/request-resilience.d.ts +0 -1
  209. package/dist/lib/request/request-transformer.d.ts +1 -2
  210. package/dist/lib/request/request-transformer.js +51 -26
  211. package/dist/lib/request/response-compaction.d.ts +0 -1
  212. package/dist/lib/request/response-handler.d.ts +0 -1
  213. package/dist/lib/request/response-metadata.d.ts +0 -1
  214. package/dist/lib/request/response-outcome.d.ts +0 -1
  215. package/dist/lib/request/stream-failover-runtime.d.ts +0 -1
  216. package/dist/lib/request/stream-failover.d.ts +0 -1
  217. package/dist/lib/request/stream-failover.js +28 -4
  218. package/dist/lib/request/token-refresh.d.ts +0 -1
  219. package/dist/lib/request/url-rewriting.d.ts +0 -1
  220. package/dist/lib/request/wait-utils.d.ts +0 -1
  221. package/dist/lib/rotation.d.ts +0 -1
  222. package/dist/lib/routing-mutex.d.ts +0 -1
  223. package/dist/lib/routing-profiles.d.ts +16 -2
  224. package/dist/lib/routing-profiles.js +119 -44
  225. package/dist/lib/runtime/account-check-helpers.d.ts +0 -1
  226. package/dist/lib/runtime/account-check-types.d.ts +0 -1
  227. package/dist/lib/runtime/account-check.d.ts +0 -1
  228. package/dist/lib/runtime/account-manager-cache-entry.d.ts +0 -1
  229. package/dist/lib/runtime/account-manager-cache.d.ts +0 -1
  230. package/dist/lib/runtime/account-model-catalog.d.ts +1 -2
  231. package/dist/lib/runtime/account-pool.d.ts +0 -1
  232. package/dist/lib/runtime/account-reset-credits.d.ts +0 -1
  233. package/dist/lib/runtime/account-reset-credits.js +8 -2
  234. package/dist/lib/runtime/account-scope.d.ts +0 -1
  235. package/dist/lib/runtime/account-select-event.d.ts +0 -1
  236. package/dist/lib/runtime/account-selection.d.ts +0 -1
  237. package/dist/lib/runtime/account-state.d.ts +0 -1
  238. package/dist/lib/runtime/account-status.d.ts +0 -1
  239. package/dist/lib/runtime/account-storage-scope-entry.d.ts +0 -1
  240. package/dist/lib/runtime/api-model-capabilities.d.ts +0 -1
  241. package/dist/lib/runtime/api-model-runtime.d.ts +0 -1
  242. package/dist/lib/runtime/app-bind.d.ts +0 -1
  243. package/dist/lib/runtime/app-helper-selection.d.ts +0 -1
  244. package/dist/lib/runtime/auth-facade.d.ts +0 -1
  245. package/dist/lib/runtime/automatic-account-checks.d.ts +0 -1
  246. package/dist/lib/runtime/automatic-subscription-checks.d.ts +0 -1
  247. package/dist/lib/runtime/browser-oauth-flow.d.ts +0 -1
  248. package/dist/lib/runtime/capability-boost.d.ts +0 -1
  249. package/dist/lib/runtime/catalog-capabilities.d.ts +0 -1
  250. package/dist/lib/runtime/config-toml.d.ts +0 -1
  251. package/dist/lib/runtime/context-budget-settings.d.ts +0 -1
  252. package/dist/lib/runtime/event-handler.d.ts +0 -1
  253. package/dist/lib/runtime/first-run.d.ts +0 -1
  254. package/dist/lib/runtime/flagged-verify-types.d.ts +0 -1
  255. package/dist/lib/runtime/hydrate-emails.d.ts +0 -1
  256. package/dist/lib/runtime/inference-activity.d.ts +0 -1
  257. package/dist/lib/runtime/live-sync-entry.d.ts +0 -1
  258. package/dist/lib/runtime/live-sync.d.ts +0 -1
  259. package/dist/lib/runtime/loader-setup.d.ts +0 -1
  260. package/dist/lib/runtime/login-menu-accounts.d.ts +0 -1
  261. package/dist/lib/runtime/manual-oauth-flow.d.ts +0 -1
  262. package/dist/lib/runtime/model-discovery-status.d.ts +0 -1
  263. package/dist/lib/runtime/native-account-storage.d.ts +0 -1
  264. package/dist/lib/runtime/native-account-sync.d.ts +0 -1
  265. package/dist/lib/runtime/native-binding-lock.d.ts +0 -1
  266. package/dist/lib/runtime/native-client-auth.d.ts +0 -1
  267. package/dist/lib/runtime/native-provider-config.d.ts +0 -1
  268. package/dist/lib/runtime/native-rate-limits.d.ts +2 -1
  269. package/dist/lib/runtime/native-rate-limits.js +23 -6
  270. package/dist/lib/runtime/preemptive-quota.d.ts +0 -1
  271. package/dist/lib/runtime/quota-headers.d.ts +0 -1
  272. package/dist/lib/runtime/quota-probe.d.ts +0 -1
  273. package/dist/lib/runtime/quota-settings.d.ts +0 -1
  274. package/dist/lib/runtime/refresh-guardian-entry.d.ts +0 -1
  275. package/dist/lib/runtime/refresh-guardian.d.ts +0 -1
  276. package/dist/lib/runtime/request-init.d.ts +0 -1
  277. package/dist/lib/runtime/reset-credit-routing.d.ts +0 -1
  278. package/dist/lib/runtime/reset-credits.d.ts +0 -1
  279. package/dist/lib/runtime/response-output-history.d.ts +0 -1
  280. package/dist/lib/runtime/responses-websocket.d.ts +0 -1
  281. package/dist/lib/runtime/resume-picker.d.ts +0 -1
  282. package/dist/lib/runtime/rotation-account-selection.d.ts +0 -1
  283. package/dist/lib/runtime/rotation-proxy-state.d.ts +0 -1
  284. package/dist/lib/runtime/rotation-server-types.d.ts +0 -1
  285. package/dist/lib/runtime/rotation-storage-meta.d.ts +0 -1
  286. package/dist/lib/runtime/rotation-token-refresh.d.ts +0 -1
  287. package/dist/lib/runtime/runtime-capability-failures.d.ts +0 -1
  288. package/dist/lib/runtime/runtime-current-account.d.ts +0 -1
  289. package/dist/lib/runtime/runtime-observability.d.ts +0 -1
  290. package/dist/lib/runtime/runtime-services.d.ts +0 -1
  291. package/dist/lib/runtime/session-affinity-entry.d.ts +0 -1
  292. package/dist/lib/runtime/session-recovery.d.ts +0 -1
  293. package/dist/lib/runtime/status-marker.d.ts +0 -1
  294. package/dist/lib/runtime/storage-scope.d.ts +0 -1
  295. package/dist/lib/runtime/subscription-first-use.d.ts +0 -1
  296. package/dist/lib/runtime/subscription-quota-event.d.ts +0 -1
  297. package/dist/lib/runtime/subscription-quota-order.d.ts +0 -1
  298. package/dist/lib/runtime/toast.d.ts +0 -1
  299. package/dist/lib/runtime/ui-runtime-entry.d.ts +0 -1
  300. package/dist/lib/runtime/ui-runtime.d.ts +0 -1
  301. package/dist/lib/runtime/verify-flagged.d.ts +0 -1
  302. package/dist/lib/runtime/workspace-model-scopes.d.ts +0 -1
  303. package/dist/lib/runtime-constants.d.ts +0 -1
  304. package/dist/lib/runtime-paths.d.ts +0 -1
  305. package/dist/lib/runtime-rotation-proxy.d.ts +1 -1
  306. package/dist/lib/runtime-rotation-proxy.js +133 -0
  307. package/dist/lib/schemas.d.ts +35 -13
  308. package/dist/lib/schemas.js +19 -2
  309. package/dist/lib/session-affinity.d.ts +0 -1
  310. package/dist/lib/shutdown.d.ts +0 -1
  311. package/dist/lib/storage/account-clear-entry.d.ts +0 -1
  312. package/dist/lib/storage/account-clear.d.ts +0 -1
  313. package/dist/lib/storage/account-match-utils.d.ts +0 -1
  314. package/dist/lib/storage/account-persistence.d.ts +0 -1
  315. package/dist/lib/storage/account-port.d.ts +0 -1
  316. package/dist/lib/storage/account-save-entry.d.ts +0 -1
  317. package/dist/lib/storage/account-save.d.ts +9 -2
  318. package/dist/lib/storage/account-save.js +4 -1
  319. package/dist/lib/storage/account-snapshot.d.ts +0 -1
  320. package/dist/lib/storage/backup-metadata-builder.d.ts +0 -1
  321. package/dist/lib/storage/backup-metadata.d.ts +0 -1
  322. package/dist/lib/storage/backup-paths.d.ts +0 -1
  323. package/dist/lib/storage/backup-restore.d.ts +0 -1
  324. package/dist/lib/storage/cache-artifacts.d.ts +0 -1
  325. package/dist/lib/storage/credential-sidecars.d.ts +0 -1
  326. package/dist/lib/storage/error-hints.d.ts +0 -1
  327. package/dist/lib/storage/file-lock.d.ts +0 -1
  328. package/dist/lib/storage/file-lock.js +33 -1
  329. package/dist/lib/storage/file-paths.d.ts +0 -1
  330. package/dist/lib/storage/fixture-guards.d.ts +0 -1
  331. package/dist/lib/storage/flagged-entry.d.ts +0 -1
  332. package/dist/lib/storage/flagged-load-entry.d.ts +0 -1
  333. package/dist/lib/storage/flagged-save-entry.d.ts +0 -1
  334. package/dist/lib/storage/flagged-storage-file.d.ts +0 -1
  335. package/dist/lib/storage/flagged-storage-io.d.ts +0 -1
  336. package/dist/lib/storage/flagged-storage.d.ts +0 -1
  337. package/dist/lib/storage/gitignore.d.ts +0 -1
  338. package/dist/lib/storage/hash.d.ts +0 -1
  339. package/dist/lib/storage/health.d.ts +0 -1
  340. package/dist/lib/storage/identity.d.ts +0 -1
  341. package/dist/lib/storage/import-export.d.ts +0 -1
  342. package/dist/lib/storage/json-store-lock.d.ts +105 -0
  343. package/dist/lib/storage/json-store-lock.js +259 -0
  344. package/dist/lib/storage/metadata-section.d.ts +0 -1
  345. package/dist/lib/storage/migrations.d.ts +0 -1
  346. package/dist/lib/storage/migrations.js +31 -18
  347. package/dist/lib/storage/named-backup-entry.d.ts +0 -1
  348. package/dist/lib/storage/named-backups-entry.d.ts +0 -1
  349. package/dist/lib/storage/named-backups.d.ts +0 -1
  350. package/dist/lib/storage/path-state.d.ts +0 -1
  351. package/dist/lib/storage/paths.d.ts +0 -1
  352. package/dist/lib/storage/pending-auth.d.ts +9 -3
  353. package/dist/lib/storage/pending-auth.js +30 -8
  354. package/dist/lib/storage/project-migration.d.ts +0 -1
  355. package/dist/lib/storage/public-types.d.ts +0 -1
  356. package/dist/lib/storage/record-identity.d.ts +0 -1
  357. package/dist/lib/storage/record-utils.d.ts +0 -1
  358. package/dist/lib/storage/restore-assessment.d.ts +0 -1
  359. package/dist/lib/storage/restore-backup-entry.d.ts +0 -1
  360. package/dist/lib/storage/restore-metadata.d.ts +0 -1
  361. package/dist/lib/storage/save-retry.d.ts +0 -1
  362. package/dist/lib/storage/snapshot-inspectors.d.ts +0 -1
  363. package/dist/lib/storage/snapshot-merge.d.ts +0 -1
  364. package/dist/lib/storage/storage-parser.d.ts +2 -1
  365. package/dist/lib/storage/storage-parser.js +10 -2
  366. package/dist/lib/storage/transactions.d.ts +0 -1
  367. package/dist/lib/storage.d.ts +15 -2
  368. package/dist/lib/storage.js +612 -25
  369. package/dist/lib/synthetic-response.d.ts +0 -1
  370. package/dist/lib/table-formatter.d.ts +0 -1
  371. package/dist/lib/temp-path.d.ts +0 -1
  372. package/dist/lib/tools/hashline-tools.d.ts +0 -1
  373. package/dist/lib/types.d.ts +0 -1
  374. package/dist/lib/ui/ansi.d.ts +0 -1
  375. package/dist/lib/ui/auth-menu-builder.d.ts +0 -1
  376. package/dist/lib/ui/auth-menu.d.ts +0 -1
  377. package/dist/lib/ui/check-progress.d.ts +0 -1
  378. package/dist/lib/ui/confirm.d.ts +0 -1
  379. package/dist/lib/ui/display-width.d.ts +0 -1
  380. package/dist/lib/ui/format.d.ts +0 -1
  381. package/dist/lib/ui/index.d.ts +0 -1
  382. package/dist/lib/ui/runtime.d.ts +0 -1
  383. package/dist/lib/ui/select.d.ts +0 -1
  384. package/dist/lib/ui/theme.d.ts +0 -1
  385. package/dist/lib/ui/ui-copy.d.ts +1 -2
  386. package/dist/lib/ui/ui-copy.js +1 -1
  387. package/dist/lib/unified-settings.d.ts +13 -11
  388. package/dist/lib/unified-settings.js +22 -14
  389. package/dist/lib/update-notice.d.ts +0 -1
  390. package/dist/lib/usage/index.d.ts +0 -1
  391. package/dist/lib/usage/ledger.d.ts +0 -1
  392. package/dist/lib/usage/pricing.d.ts +1 -2
  393. package/dist/lib/usage/pricing.js +41 -16
  394. package/dist/lib/usage/redaction.d.ts +0 -1
  395. package/dist/lib/usage/stream-usage-deferral.d.ts +0 -1
  396. package/dist/lib/usage/types.d.ts +0 -1
  397. package/dist/lib/usage/usage-extraction.d.ts +0 -1
  398. package/dist/lib/utils.d.ts +21 -1
  399. package/dist/lib/utils.js +31 -0
  400. package/dist/lib/wsl.d.ts +0 -1
  401. package/package.json +11 -5
  402. package/scripts/codex-bin-resolver.js +20 -1
  403. package/scripts/codex-multi-auth.js +7 -1
  404. package/scripts/codex.js +385 -89
  405. package/skills/codex-auth-setup/SKILL.md +73 -0
@@ -7,6 +7,8 @@ export interface NativeUsageAuth {
7
7
  codexCliMirror?: CodexCliMirror;
8
8
  }
9
9
  type Method = 'account/rateLimits/read' | 'account/rateLimitResetCredit/consume';
10
+ /** @internal Native usage needs the desktop backend when it is installed. */
11
+ export declare function resolveNativeUsageCommand(platform?: NodeJS.Platform): string[];
10
12
  /** One bounded native RPC session in an isolated home. No refresh token, API key,
11
13
  * global configuration, or desktop auth changes are available to this process. */
12
14
  export declare function nativeRateLimitsRpc(auth: NativeUsageAuth, method: Method, params: Record<string, unknown>, options?: {
@@ -15,4 +17,3 @@ export declare function nativeRateLimitsRpc(auth: NativeUsageAuth, method: Metho
15
17
  timeoutMs?: number;
16
18
  }): Promise<unknown>;
17
19
  export {};
18
- //# sourceMappingURL=native-rate-limits.d.ts.map
@@ -1,5 +1,5 @@
1
1
  import { spawn } from 'node:child_process';
2
- import { existsSync, promises as fs } from 'node:fs';
2
+ import { accessSync, constants, existsSync, promises as fs, statSync } from 'node:fs';
3
3
  import { createRequire } from 'node:module';
4
4
  import { isAbsolute, join } from 'node:path';
5
5
  import { codexCliAccountIdFor } from '../auth/token-utils.js';
@@ -18,7 +18,8 @@ async function sweepStaleHomes(root) {
18
18
  catch { /* Another process owns or already removed it. */ }
19
19
  }));
20
20
  }
21
- function nativeCommand() {
21
+ /** @internal Native usage needs the desktop backend when it is installed. */
22
+ export function resolveNativeUsageCommand(platform = process.platform) {
22
23
  const override = process.env.CODEX_MULTI_AUTH_USAGE_CODEX_BIN?.trim();
23
24
  if (override) {
24
25
  if (!isAbsolute(override) || !existsSync(override))
@@ -26,9 +27,25 @@ function nativeCommand() {
26
27
  return [override];
27
28
  }
28
29
  // Prefer the desktop backend whose protocol supplies the native usage UI.
29
- const bundled = '/Applications/ChatGPT.app/Contents/Resources/codex';
30
- if (process.platform === 'darwin' && existsSync(bundled))
31
- return [bundled];
30
+ const bundled = [
31
+ '/Applications/ChatGPT.app/Contents/Resources/codex-cli/bin/codex',
32
+ '/Applications/ChatGPT.app/Contents/Resources/codex',
33
+ ];
34
+ if (platform === 'darwin') {
35
+ const executable = bundled.find(path => {
36
+ try {
37
+ if (!statSync(path).isFile())
38
+ return false;
39
+ accessSync(path, constants.X_OK);
40
+ return true;
41
+ }
42
+ catch {
43
+ return false;
44
+ }
45
+ });
46
+ if (executable)
47
+ return [executable];
48
+ }
32
49
  try {
33
50
  return [process.execPath, createRequire(import.meta.url).resolve('@openai/codex/bin/codex.js')];
34
51
  }
@@ -41,7 +58,7 @@ function nativeCommand() {
41
58
  export async function nativeRateLimitsRpc(auth, method, params, options = {}) {
42
59
  if (!auth.accessToken || !auth.accountId || auth.expiresAt <= Date.now() + 30000)
43
60
  throw Error('Native usage requires a fresh account access token');
44
- const command = options.command ?? nativeCommand();
61
+ const command = options.command ?? resolveNativeUsageCommand();
45
62
  const executable = command[0];
46
63
  if (!executable)
47
64
  throw Error('Native usage backend unavailable');
@@ -10,4 +10,3 @@ export declare function applyRuntimePreemptiveQuotaSettings<TConfig>(pluginConfi
10
10
  getPreemptiveQuotaRemainingPercent7d: (config: TConfig) => number;
11
11
  getPreemptiveQuotaMaxDeferralMs: (config: TConfig) => number;
12
12
  }): void;
13
- //# sourceMappingURL=preemptive-quota.d.ts.map
@@ -4,4 +4,3 @@ export type ParsedCodexQuotaSnapshot = Omit<CodexQuotaSnapshot, "model">;
4
4
  export declare function parseResetAtMs(headers: Headers, prefix: string): number | undefined;
5
5
  export declare function parseCodexQuotaSnapshot(headers: Headers, status: number): ParsedCodexQuotaSnapshot | null;
6
6
  export declare function formatCodexQuotaLine(snapshot: Pick<CodexQuotaSnapshot, "status" | "planType" | "activeLimit" | "primary" | "secondary">): string;
7
- //# sourceMappingURL=quota-headers.d.ts.map
@@ -15,4 +15,3 @@ export declare function fetchRuntimeCodexQuotaSnapshot(params: {
15
15
  message?: string;
16
16
  };
17
17
  }): Promise<CodexQuotaSnapshot>;
18
- //# sourceMappingURL=quota-probe.d.ts.map
@@ -11,4 +11,3 @@ export declare function applyPreemptiveQuotaSettingsFromConfig(pluginConfig: Ret
11
11
  getPreemptiveQuotaMaxDeferralMs: (config: ReturnType<typeof import("../config.js").loadPluginConfig>) => number;
12
12
  }): void;
13
13
  export declare function resolveUiRuntimeFromConfig(loadPluginConfig: () => ReturnType<typeof import("../config.js").loadPluginConfig>, applyUiRuntimeFromConfig: (pluginConfig: ReturnType<typeof import("../config.js").loadPluginConfig>) => ReturnType<typeof import("../ui/runtime.js").getUiRuntimeOptions>): ReturnType<typeof import("../ui/runtime.js").getUiRuntimeOptions>;
14
- //# sourceMappingURL=quota-settings.d.ts.map
@@ -29,4 +29,3 @@ export declare function ensureRefreshGuardianEntry<TGuardian>(params: {
29
29
  refreshGuardian: TGuardian | null;
30
30
  refreshGuardianConfigKey: string | null;
31
31
  };
32
- //# sourceMappingURL=refresh-guardian-entry.d.ts.map
@@ -21,4 +21,3 @@ export declare function ensureRuntimeRefreshGuardian<TConfig, TGuardian extends
21
21
  configKey: string | null;
22
22
  cleanupRegistered: boolean;
23
23
  };
24
- //# sourceMappingURL=refresh-guardian.d.ts.map
@@ -2,4 +2,3 @@ export declare function normalizeRuntimeRequestInit(requestInput: Request | stri
2
2
  export declare function parseRuntimeRequestBody(body: unknown, deps: {
3
3
  logWarn: (message: string) => void;
4
4
  }): Promise<Record<string, unknown>>;
5
- //# sourceMappingURL=request-init.d.ts.map
@@ -38,4 +38,3 @@ export declare function applyConfirmedReset(options: {
38
38
  now: number;
39
39
  }): boolean;
40
40
  export {};
41
- //# sourceMappingURL=reset-credit-routing.d.ts.map
@@ -98,4 +98,3 @@ export declare class ResetCreditService {
98
98
  private automaticLocked;
99
99
  }
100
100
  export {};
101
- //# sourceMappingURL=reset-credits.d.ts.map
@@ -14,4 +14,3 @@ export declare class ResponseOutputHistory {
14
14
  /** A replay must carry each tool call before its corresponding result. */
15
15
  export declare function hasOrphanToolResult(input: unknown): boolean;
16
16
  export {};
17
- //# sourceMappingURL=response-output-history.d.ts.map
@@ -28,4 +28,3 @@ export declare class ResponsesWebSocketGateway {
28
28
  private serve;
29
29
  close(): void;
30
30
  }
31
- //# sourceMappingURL=responses-websocket.d.ts.map
@@ -38,4 +38,3 @@ export declare function pickResumeThread(options: ResumePickerOptions, deps?: {
38
38
  select: (items: MenuItem<Choice>[], options: import("../ui/select.js").SelectOptions<Choice>) => Promise<Choice | null>;
39
39
  }): Promise<string | null>;
40
40
  export {};
41
- //# sourceMappingURL=resume-picker.d.ts.map
@@ -64,4 +64,3 @@ export declare function chooseAccount(params: {
64
64
  */
65
65
  allowPinnedCooldown?: boolean;
66
66
  }): ManagedAccount | null;
67
- //# sourceMappingURL=rotation-account-selection.d.ts.map
@@ -101,4 +101,3 @@ export interface RotationProxyState extends RotationProxyStateInit {
101
101
  export declare function createRotationProxyState(init: RotationProxyStateInit): RotationProxyState;
102
102
  /** @internal */
103
103
  export declare function recoverStaleRuntimeState(state: RotationProxyState): Promise<AccountManager | null>;
104
- //# sourceMappingURL=rotation-proxy-state.d.ts.map
@@ -106,4 +106,3 @@ export interface RuntimeRotationAccountIdentity {
106
106
  accountId: string | null;
107
107
  updatedAt: number;
108
108
  }
109
- //# sourceMappingURL=rotation-server-types.d.ts.map
@@ -37,4 +37,3 @@ export declare function resetPinCacheForTesting(): void;
37
37
  * spinning up the full proxy. See issue #474.
38
38
  */
39
39
  export declare function maybeInvalidateAffinityFromDisk(sessionAffinityStore: SessionAffinityStore | null, lastObservedGeneration: number, storagePath?: string): number;
40
- //# sourceMappingURL=rotation-storage-meta.d.ts.map
@@ -22,4 +22,3 @@ export declare function ensureFreshAccessToken(params: {
22
22
  retryable: boolean;
23
23
  invalidated?: boolean;
24
24
  }>;
25
- //# sourceMappingURL=rotation-token-refresh.d.ts.map
@@ -11,4 +11,3 @@ export declare class RuntimeCapabilityFailures {
11
11
  record(credential: string, model: string, kind: CapabilityFailure, effort?: string, tier?: string): void;
12
12
  supports(credential: string, model: string, effort?: string, tier?: string): boolean;
13
13
  }
14
- //# sourceMappingURL=runtime-capability-failures.d.ts.map
@@ -50,4 +50,3 @@ export declare function resolveRuntimeCurrentAccount(storage: AccountStorageV3,
50
50
  export declare function resolveAccountCurrentMarkers(index: number, storedCurrentIndex: number, runtimeCurrent: RuntimeCurrentAccountSelection | null): AccountCurrentMarker[];
51
51
  export declare function isDisplayCurrentAccount(index: number, storedCurrentIndex: number, runtimeCurrent: RuntimeCurrentAccountSelection | null): boolean;
52
52
  export {};
53
- //# sourceMappingURL=runtime-current-account.d.ts.map
@@ -81,4 +81,3 @@ export declare function recordRuntimeReset(reason: string): void;
81
81
  export declare function recordRuntimeAccountRecovery(index: number): void;
82
82
  export declare function loadPersistedRuntimeObservabilitySnapshot(): Promise<RuntimeObservabilitySnapshot | null>;
83
83
  export {};
84
- //# sourceMappingURL=runtime-observability.d.ts.map
@@ -58,4 +58,3 @@ export declare function ensureSessionAffinityState<TStore extends SessionAffinit
58
58
  sessionAffinityConfigKey: string | null;
59
59
  };
60
60
  export {};
61
- //# sourceMappingURL=runtime-services.d.ts.map
@@ -27,4 +27,3 @@ export declare function ensureSessionAffinityEntry<TStore>(params: {
27
27
  sessionAffinityStore: TStore | null;
28
28
  sessionAffinityConfigKey: string | null;
29
29
  };
30
- //# sourceMappingURL=session-affinity-entry.d.ts.map
@@ -5,4 +5,3 @@ export declare function createRuntimeSessionRecoveryHook(deps: {
5
5
  directory: string;
6
6
  autoResume: boolean;
7
7
  }): import("../recovery.js").SessionRecoveryHook | null;
8
- //# sourceMappingURL=session-recovery.d.ts.map
@@ -1,3 +1,2 @@
1
1
  import type { UiRuntimeOptions } from "../ui/runtime.js";
2
2
  export declare function getRuntimeStatusMarker(ui: UiRuntimeOptions, status: "ok" | "warning" | "error"): string;
3
- //# sourceMappingURL=status-marker.d.ts.map
@@ -10,4 +10,3 @@ export declare function applyAccountStorageScopeFromConfig(pluginConfig: ReturnT
10
10
  setStoragePath: (path: string | null) => void;
11
11
  cwd: () => string;
12
12
  }): void;
13
- //# sourceMappingURL=storage-scope.d.ts.map
@@ -7,4 +7,3 @@ export declare class FirstUseProbeError extends Error {
7
7
  }
8
8
  /** Consume the already-open tiny response, never start a second request. */
9
9
  export declare function finishSubscriptionFirstUse(response: Response, timeoutMs: number): Promise<void>;
10
- //# sourceMappingURL=subscription-first-use.d.ts.map
@@ -3,4 +3,3 @@ import type { QuotaSchedulerSnapshot } from "../preemptive-quota-scheduler.js";
3
3
  export declare function readSubscriptionQuotaEvent(event: unknown, now: number): (QuotaSchedulerSnapshot & {
4
4
  planType?: string;
5
5
  }) | null;
6
- //# sourceMappingURL=subscription-quota-event.d.ts.map
@@ -14,4 +14,3 @@ export declare function subscriptionQuotaPreference(entry: QuotaCacheEntry | nul
14
14
  export declare function usesSubscriptionReserve(preference: SubscriptionQuotaPreference | undefined): boolean;
15
15
  /** Negative means a should be used first. Equal hints leave existing health/affinity scoring intact. */
16
16
  export declare function compareSubscriptionQuota(a: SubscriptionQuotaPreference, b: SubscriptionQuotaPreference): number;
17
- //# sourceMappingURL=subscription-quota-order.d.ts.map
@@ -13,4 +13,3 @@ export declare function showRuntimeToast(client: {
13
13
  title?: string;
14
14
  duration?: number;
15
15
  }): Promise<void>;
16
- //# sourceMappingURL=toast.d.ts.map
@@ -4,4 +4,3 @@ export declare function resolveUiRuntimeEntry(params: {
4
4
  resolveUiRuntimeFromConfig: (loadPluginConfig: () => ReturnType<typeof import("../config.js").loadPluginConfig>, applyUiRuntimeFromConfig: (pluginConfig: ReturnType<typeof import("../config.js").loadPluginConfig>) => UiRuntimeOptions) => UiRuntimeOptions;
5
5
  applyUiRuntimeFromConfig: (pluginConfig: ReturnType<typeof import("../config.js").loadPluginConfig>) => UiRuntimeOptions;
6
6
  }): UiRuntimeOptions;
7
- //# sourceMappingURL=ui-runtime-entry.d.ts.map
@@ -6,4 +6,3 @@ export declare function applyUiRuntimeFromConfig(pluginConfig: ReturnType<typeof
6
6
  glyphMode: ReturnType<typeof getCodexTuiGlyphMode>;
7
7
  }) => UiRuntimeOptions): UiRuntimeOptions;
8
8
  export declare function getStatusMarker(ui: UiRuntimeOptions, status: "ok" | "warning" | "error"): string;
9
- //# sourceMappingURL=ui-runtime.d.ts.map
@@ -45,4 +45,3 @@ export declare function verifyRuntimeFlaggedAccounts(deps: {
45
45
  now?: () => number;
46
46
  }): Promise<void>;
47
47
  export {};
48
- //# sourceMappingURL=verify-flagged.d.ts.map
@@ -12,4 +12,3 @@ export declare function workspaceModelScopes(account: ManagedAccount): {
12
12
  workspaceIndex: number;
13
13
  enabled: boolean;
14
14
  }[];
15
- //# sourceMappingURL=workspace-model-scopes.d.ts.map
@@ -35,4 +35,3 @@ export declare function listRuntimeHelperOwnerPaths(baseDir: string, entries: re
35
35
  /** Marker shared by config binding and desktop-auth sync protection. */
36
36
  export declare const NATIVE_PROVIDER_BEGIN = "# codex-multi-auth native provider begin";
37
37
  export declare function hasNativeProviderConfig(content: string): boolean;
38
- //# sourceMappingURL=runtime-constants.d.ts.map
@@ -55,4 +55,3 @@ export declare function getCodexLogDir(): string;
55
55
  * @returns The filesystem path for the legacy directory (e.g. `/home/alice/.codex`).
56
56
  */
57
57
  export declare function getLegacyCodexDir(): string;
58
- //# sourceMappingURL=runtime-paths.d.ts.map
@@ -7,6 +7,7 @@ export type { PinnedUnavailableErrorBody } from "./request/rate-limit-decision.j
7
7
  export { chooseAccount } from "./runtime/rotation-account-selection.js";
8
8
  export { maybeInvalidateAffinityFromDisk, readPinnedAccountIndexFromDisk, readStorageMetaFromDisk, resetPinCacheForTesting, } from "./runtime/rotation-storage-meta.js";
9
9
  export type { StorageMeta } from "./runtime/rotation-storage-meta.js";
10
+ export { resetRuntimePolicyCacheForTests } from "./policy/runtime-policy-cache.js";
10
11
  /** @internal Stable identity key for in-memory quota snapshots across reloads. */
11
12
  /**
12
13
  * Quota-scheduler key prefix identifying ONE account across every family and
@@ -47,4 +48,3 @@ export declare function resolveModelCapacityRetryMs(env?: NodeJS.ProcessEnv): nu
47
48
  */
48
49
  export declare function normalizeForcedAccountIndex(value: number | string | null | undefined): number | null;
49
50
  export declare function startRuntimeRotationProxy(options: RuntimeRotationProxyOptions): Promise<RuntimeRotationProxyServer>;
50
- //# sourceMappingURL=runtime-rotation-proxy.d.ts.map
@@ -54,6 +54,7 @@ import { isRecord, sleep } from "./utils.js";
54
54
  export { buildPinnedUnavailableErrorBody, buildTokenInvalidationBody, } from "./request/rate-limit-decision.js";
55
55
  export { chooseAccount } from "./runtime/rotation-account-selection.js";
56
56
  export { maybeInvalidateAffinityFromDisk, readPinnedAccountIndexFromDisk, readStorageMetaFromDisk, resetPinCacheForTesting, } from "./runtime/rotation-storage-meta.js";
57
+ export { resetRuntimePolicyCacheForTests } from "./policy/runtime-policy-cache.js";
57
58
  const DEFAULT_HOST = "127.0.0.1";
58
59
  function isLoopbackHost(host) {
59
60
  const normalized = host.trim().toLowerCase();
@@ -87,6 +88,102 @@ function toUrlHost(host) {
87
88
  const bare = stripIpv6Brackets(host);
88
89
  return bare.includes(":") ? `[${bare}]` : bare;
89
90
  }
91
+ /**
92
+ * True only for a NUMERIC loopback literal, as `new URL().hostname` reports it.
93
+ *
94
+ * Duplicates the wrapper's predicate (scripts/codex.js) at library level — a
95
+ * hostname like "localhost" is deliberately NOT enough: it is resolved by the
96
+ * OS at connect time, so an /etc/hosts or Windows hosts entry can point it at
97
+ * a routable address, and the upstream request carries the managed OAuth
98
+ * bearer token and the request body. WHATWG URL always reports an IPv6 host in
99
+ * its bracketed form, so `::1` is only ever seen here as `[::1]`.
100
+ */
101
+ function isNumericLoopbackUrlHostname(hostname) {
102
+ if (hostname === "[::1]") {
103
+ return true;
104
+ }
105
+ const ipv4 = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.exec(hostname);
106
+ if (!ipv4) {
107
+ return false;
108
+ }
109
+ const octets = ipv4.slice(1).map((part) => Number(part));
110
+ if (octets.some((octet) => !Number.isInteger(octet) || octet > 255)) {
111
+ return false;
112
+ }
113
+ // The whole 127.0.0.0/8 block is loopback, not just 127.0.0.1.
114
+ return octets[0] === 127;
115
+ }
116
+ /**
117
+ * Whether the raw URL text carries an explicit `:port` (mirrors the wrapper).
118
+ *
119
+ * `new URL()` erases a port that matches the scheme default, so
120
+ * `http://127.0.0.1:80/x` reports `parsed.port === ""` and a `!parsed.port`
121
+ * check would reject a perfectly valid, explicitly-ported loopback URL.
122
+ */
123
+ function urlHasExplicitPort(raw) {
124
+ const withoutScheme = raw.replace(/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//, "");
125
+ const authority = withoutScheme.split(/[/?#]/, 1)[0] ?? "";
126
+ // Strip userinfo first, or a password containing ':' reads as a port.
127
+ const hostAndPort = authority.slice(authority.lastIndexOf("@") + 1);
128
+ if (hostAndPort.startsWith("[")) {
129
+ const close = hostAndPort.indexOf("]");
130
+ return close !== -1 && /^:\d+$/.test(hostAndPort.slice(close + 1));
131
+ }
132
+ const colon = hostAndPort.indexOf(":");
133
+ return colon !== -1 && /^:\d+$/.test(hostAndPort.slice(colon));
134
+ }
135
+ /**
136
+ * Library-boundary enforcement for the upstream the proxy forwards managed
137
+ * OAuth Bearer tokens to (runtime-proxy trust boundary).
138
+ *
139
+ * `options.upstreamBaseUrl` is a library input: callers are not all the
140
+ * wrapper, so the env-var validation in scripts/codex.js does not protect this
141
+ * boundary. A non-https or non-loopback value would exfiltrate account tokens
142
+ * to whatever host it names. The policy mirrors the wrapper exactly: https is
143
+ * always allowed, while http is accepted only for the documented dev path — a
144
+ * NUMERIC loopback host (127.0.0.0/8 or [::1], never a name) with an explicit
145
+ * port — and no URL may carry credentials, a query, or a fragment.
146
+ */
147
+ function assertAllowedUpstreamBaseUrl(raw) {
148
+ let parsed;
149
+ try {
150
+ parsed = new URL(raw);
151
+ }
152
+ catch {
153
+ throw new CodexValidationError(`Runtime rotation proxy upstreamBaseUrl is not a valid absolute URL.`, { field: "upstreamBaseUrl", expected: "an https URL, or an http URL on a numeric loopback host with an explicit port" });
154
+ }
155
+ const isDevLoopback = parsed.protocol === "http:" &&
156
+ isNumericLoopbackUrlHostname(parsed.hostname.toLowerCase()) &&
157
+ Boolean(parsed.port || urlHasExplicitPort(raw));
158
+ if ((parsed.protocol !== "https:" && !isDevLoopback) ||
159
+ parsed.username ||
160
+ parsed.password ||
161
+ parsed.search ||
162
+ parsed.hash) {
163
+ throw new CodexValidationError(`Runtime rotation proxy refuses upstreamBaseUrl "${raw}". ` +
164
+ "It forwards managed OAuth tokens: use https, or http only on a " +
165
+ "numeric loopback host (127.0.0.0/8 or [::1]; a name such as " +
166
+ '"localhost" can resolve off-host) with an explicit port, and no ' +
167
+ "credentials, query, or fragment.", {
168
+ field: "upstreamBaseUrl",
169
+ expected: "an https URL, or an http URL on a numeric loopback host with an explicit port",
170
+ context: { upstreamBaseUrl: raw },
171
+ });
172
+ }
173
+ }
174
+ /**
175
+ * Whether a fetch rejection is undici refusing to follow a redirect.
176
+ *
177
+ * The upstream fetch runs `redirect: "error"` so a 3xx can never re-send the
178
+ * managed Bearer token to an arbitrary host. Instead of a Response, fetch
179
+ * rejects with `TypeError("fetch failed")` whose `cause` is the network error
180
+ * `unexpected redirect` (see undici's httpNetworkOrCacheFetch). Check the cause
181
+ * level and the bare message so a custom fetchImpl delivering the same network
182
+ * error unwrapped classifies identically.
183
+ */
184
+ function isRedirectRejection(error) {
185
+ return [error, error?.cause].some((candidate) => candidate instanceof Error && candidate.message === "unexpected redirect");
186
+ }
90
187
  // Structured logger for the default-on runtime proxy (errors-logging-01,
91
188
  // runtime-proxy-04). Previously the 1900-LOC proxy had zero logger integration;
92
189
  // failures surfaced only as a last-write-wins status.lastError string. Logs are
@@ -746,6 +843,13 @@ export async function startRuntimeRotationProxy(options) {
746
843
  const bindHost = toBindHost(host);
747
844
  const urlHost = toUrlHost(host);
748
845
  const port = options.port ?? 0;
846
+ // Library-boundary trust enforcement: the wrapper validates the env override,
847
+ // but options.upstreamBaseUrl reaches here from any caller — and Bearer
848
+ // tokens are forwarded to whatever host it names. https always passes; http
849
+ // is allowed only for the documented numeric-loopback dev path.
850
+ if (options.upstreamBaseUrl !== undefined) {
851
+ assertAllowedUpstreamBaseUrl(options.upstreamBaseUrl);
852
+ }
749
853
  const upstreamBaseUrl = options.upstreamBaseUrl ?? CODEX_BASE_URL;
750
854
  const clientApiKey = typeof options.clientApiKey === "string" &&
751
855
  options.clientApiKey.trim().length > 0
@@ -2030,6 +2134,11 @@ async function handleRequestInner(state, req, res, traceId) {
2030
2134
  method: context.method,
2031
2135
  headers: outboundHeaders,
2032
2136
  signal: fetchAbortController.signal,
2137
+ // Redirect pinning: never follow an upstream redirect — a 3xx from
2138
+ // a compromised or misconfigured endpoint would re-send the
2139
+ // managed Bearer token to an arbitrary host. Matches the model
2140
+ // catalog fetch above.
2141
+ redirect: "error",
2033
2142
  };
2034
2143
  if (context.method === "POST") {
2035
2144
  upstreamRequestInit.body = context.body;
@@ -2062,6 +2171,30 @@ async function handleRequestInner(state, req, res, traceId) {
2062
2171
  error: transportError,
2063
2172
  });
2064
2173
  refundConsumedPoolToken(refreshed.account);
2174
+ // A redirect rejection is upstream configuration, not a transport
2175
+ // outage or an account-health signal: the 3xx arrived (so the path
2176
+ // works and no generation started), the Bearer token never reached
2177
+ // the redirect target, and every managed account would hit the
2178
+ // same redirect — cooling + rotating here would drain the pool on
2179
+ // one endpoint fault. This also covers the WebSocket httpFetch
2180
+ // fallback: SocketSession preserves init, so a refused-upgrade
2181
+ // turn on API/ZDR credentials can reject this way. Fail the
2182
+ // request in place and leave account state untouched.
2183
+ if (isRedirectRejection(error)) {
2184
+ writeJson(res, 502, {
2185
+ error: {
2186
+ code: "upstream_redirect_rejected",
2187
+ message: "Upstream endpoint attempted a redirect; redirects are never followed.",
2188
+ },
2189
+ });
2190
+ await usageRecorder.record({
2191
+ outcome: "failure",
2192
+ statusCode: 502,
2193
+ errorCode: "upstream_redirect_rejected",
2194
+ account: refreshed.account,
2195
+ });
2196
+ return;
2197
+ }
2065
2198
  // A timeout may occur after generation; do not retry within this request.
2066
2199
  if (isImageRequest) {
2067
2200
  writeJson(res, 502, {
@@ -138,10 +138,10 @@ export declare const AccountMetadataV3Schema: z.ZodObject<{
138
138
  rateLimitResetTimes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodOptional<z.ZodNumber>>>;
139
139
  coolingDownUntil: z.ZodOptional<z.ZodNumber>;
140
140
  cooldownReason: z.ZodOptional<z.ZodEnum<{
141
+ "rate-limit": "rate-limit";
141
142
  "auth-failure": "auth-failure";
142
143
  "network-error": "network-error";
143
144
  "server-error": "server-error";
144
- "rate-limit": "rate-limit";
145
145
  }>>;
146
146
  authInvalidatedAt: z.ZodOptional<z.ZodNumber>;
147
147
  authInvalidationErrorCode: z.ZodOptional<z.ZodString>;
@@ -191,10 +191,10 @@ export declare const AccountStorageV3Schema: z.ZodObject<{
191
191
  rateLimitResetTimes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodOptional<z.ZodNumber>>>;
192
192
  coolingDownUntil: z.ZodOptional<z.ZodNumber>;
193
193
  cooldownReason: z.ZodOptional<z.ZodEnum<{
194
+ "rate-limit": "rate-limit";
194
195
  "auth-failure": "auth-failure";
195
196
  "network-error": "network-error";
196
197
  "server-error": "server-error";
197
- "rate-limit": "rate-limit";
198
198
  }>>;
199
199
  authInvalidatedAt: z.ZodOptional<z.ZodNumber>;
200
200
  authInvalidationErrorCode: z.ZodOptional<z.ZodString>;
@@ -225,6 +225,11 @@ export declare const AccountStorageV3Schema: z.ZodObject<{
225
225
  export type AccountStorageV3FromSchema = z.infer<typeof AccountStorageV3Schema>;
226
226
  /**
227
227
  * Legacy V1 storage format for migration support.
228
+ *
229
+ * The V3-era top-level fields are accepted too: a hybrid file (version:1 but
230
+ * written by newer code) must not lose `activeIndexByFamily` /
231
+ * `pinnedAccountIndex` / `affinityGeneration` at the schema boundary before
232
+ * normalizeAccountStorage can consume them.
228
233
  */
229
234
  export declare const AccountStorageV1Schema: z.ZodObject<{
230
235
  version: z.ZodLiteral<1>;
@@ -255,13 +260,22 @@ export declare const AccountStorageV1Schema: z.ZodObject<{
255
260
  rateLimitResetTime: z.ZodOptional<z.ZodNumber>;
256
261
  coolingDownUntil: z.ZodOptional<z.ZodNumber>;
257
262
  cooldownReason: z.ZodOptional<z.ZodEnum<{
263
+ "rate-limit": "rate-limit";
258
264
  "auth-failure": "auth-failure";
259
265
  "network-error": "network-error";
260
266
  "server-error": "server-error";
261
- "rate-limit": "rate-limit";
262
267
  }>>;
263
- }, z.core.$strip>>;
268
+ }, z.core.$loose>>;
264
269
  activeIndex: z.ZodNumber;
270
+ activeIndexByFamily: z.ZodOptional<z.ZodObject<{
271
+ "gpt-5-codex": z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
272
+ "codex-max": z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
273
+ codex: z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
274
+ "gpt-5.2": z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
275
+ "gpt-5.1": z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
276
+ }, z.core.$strip>>;
277
+ pinnedAccountIndex: z.ZodOptional<z.ZodNumber>;
278
+ affinityGeneration: z.ZodOptional<z.ZodNumber>;
265
279
  }, z.core.$strip>;
266
280
  /**
267
281
  * Union of V1 and V3 storage formats for migration detection.
@@ -295,13 +309,22 @@ export declare const AnyAccountStorageSchema: z.ZodDiscriminatedUnion<[z.ZodObje
295
309
  rateLimitResetTime: z.ZodOptional<z.ZodNumber>;
296
310
  coolingDownUntil: z.ZodOptional<z.ZodNumber>;
297
311
  cooldownReason: z.ZodOptional<z.ZodEnum<{
312
+ "rate-limit": "rate-limit";
298
313
  "auth-failure": "auth-failure";
299
314
  "network-error": "network-error";
300
315
  "server-error": "server-error";
301
- "rate-limit": "rate-limit";
302
316
  }>>;
303
- }, z.core.$strip>>;
317
+ }, z.core.$loose>>;
304
318
  activeIndex: z.ZodNumber;
319
+ activeIndexByFamily: z.ZodOptional<z.ZodObject<{
320
+ "gpt-5-codex": z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
321
+ "codex-max": z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
322
+ codex: z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
323
+ "gpt-5.2": z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
324
+ "gpt-5.1": z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
325
+ }, z.core.$strip>>;
326
+ pinnedAccountIndex: z.ZodOptional<z.ZodNumber>;
327
+ affinityGeneration: z.ZodOptional<z.ZodNumber>;
305
328
  }, z.core.$strip>, z.ZodObject<{
306
329
  version: z.ZodLiteral<3>;
307
330
  accounts: z.ZodArray<z.ZodObject<{
@@ -332,10 +355,10 @@ export declare const AnyAccountStorageSchema: z.ZodDiscriminatedUnion<[z.ZodObje
332
355
  rateLimitResetTimes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodOptional<z.ZodNumber>>>;
333
356
  coolingDownUntil: z.ZodOptional<z.ZodNumber>;
334
357
  cooldownReason: z.ZodOptional<z.ZodEnum<{
358
+ "rate-limit": "rate-limit";
335
359
  "auth-failure": "auth-failure";
336
360
  "network-error": "network-error";
337
361
  "server-error": "server-error";
338
- "rate-limit": "rate-limit";
339
362
  }>>;
340
363
  authInvalidatedAt: z.ZodOptional<z.ZodNumber>;
341
364
  authInvalidationErrorCode: z.ZodOptional<z.ZodString>;
@@ -397,10 +420,10 @@ export declare const FlaggedAccountMetadataV1Schema: z.ZodObject<{
397
420
  rateLimitResetTimes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodOptional<z.ZodNumber>>>;
398
421
  coolingDownUntil: z.ZodOptional<z.ZodNumber>;
399
422
  cooldownReason: z.ZodOptional<z.ZodEnum<{
423
+ "rate-limit": "rate-limit";
400
424
  "auth-failure": "auth-failure";
401
425
  "network-error": "network-error";
402
426
  "server-error": "server-error";
403
- "rate-limit": "rate-limit";
404
427
  }>>;
405
428
  authInvalidatedAt: z.ZodOptional<z.ZodNumber>;
406
429
  authInvalidationErrorCode: z.ZodOptional<z.ZodString>;
@@ -453,10 +476,10 @@ export declare const FlaggedAccountStorageV1Schema: z.ZodObject<{
453
476
  rateLimitResetTimes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodOptional<z.ZodNumber>>>;
454
477
  coolingDownUntil: z.ZodOptional<z.ZodNumber>;
455
478
  cooldownReason: z.ZodOptional<z.ZodEnum<{
479
+ "rate-limit": "rate-limit";
456
480
  "auth-failure": "auth-failure";
457
481
  "network-error": "network-error";
458
482
  "server-error": "server-error";
459
- "rate-limit": "rate-limit";
460
483
  }>>;
461
484
  authInvalidatedAt: z.ZodOptional<z.ZodNumber>;
462
485
  authInvalidationErrorCode: z.ZodOptional<z.ZodString>;
@@ -495,12 +518,12 @@ export type AccountsJournalEntryFromSchema = z.infer<typeof AccountsJournalEntry
495
518
  * Token failure reason codes.
496
519
  */
497
520
  declare const TokenFailureReasonSchema: z.ZodEnum<{
498
- unknown: "unknown";
499
521
  http_error: "http_error";
500
522
  invalid_response: "invalid_response";
501
523
  network_error: "network_error";
502
524
  missing_refresh: "missing_refresh";
503
525
  timeout: "timeout";
526
+ unknown: "unknown";
504
527
  }>;
505
528
  export type TokenFailureReasonFromSchema = z.infer<typeof TokenFailureReasonSchema>;
506
529
  /**
@@ -521,12 +544,12 @@ export type TokenSuccessFromSchema = z.infer<typeof TokenSuccessSchema>;
521
544
  export declare const TokenFailureSchema: z.ZodObject<{
522
545
  type: z.ZodLiteral<"failed">;
523
546
  reason: z.ZodOptional<z.ZodEnum<{
524
- unknown: "unknown";
525
547
  http_error: "http_error";
526
548
  invalid_response: "invalid_response";
527
549
  network_error: "network_error";
528
550
  missing_refresh: "missing_refresh";
529
551
  timeout: "timeout";
552
+ unknown: "unknown";
530
553
  }>>;
531
554
  statusCode: z.ZodOptional<z.ZodNumber>;
532
555
  message: z.ZodOptional<z.ZodString>;
@@ -545,12 +568,12 @@ export declare const TokenResultSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
545
568
  }, z.core.$strip>, z.ZodObject<{
546
569
  type: z.ZodLiteral<"failed">;
547
570
  reason: z.ZodOptional<z.ZodEnum<{
548
- unknown: "unknown";
549
571
  http_error: "http_error";
550
572
  invalid_response: "invalid_response";
551
573
  network_error: "network_error";
552
574
  missing_refresh: "missing_refresh";
553
575
  timeout: "timeout";
576
+ unknown: "unknown";
554
577
  }>>;
555
578
  statusCode: z.ZodOptional<z.ZodNumber>;
556
579
  message: z.ZodOptional<z.ZodString>;
@@ -624,4 +647,3 @@ export declare function safeParseJson<T>(raw: unknown, schema: z.ZodType<T>, con
624
647
  */
625
648
  export declare function getValidationErrors(schema: z.ZodType, data: unknown): string[];
626
649
  export {};
627
- //# sourceMappingURL=schemas.d.ts.map