codex-multi-auth 2.3.0-beta.0 → 2.3.0-beta.2

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 (470) hide show
  1. package/.codex-plugin/plugin.json +1 -1
  2. package/README.md +4 -3
  3. package/config/schema/config.schema.json +268 -21
  4. package/dist/index.js +0 -1
  5. package/dist/lib/account-policy.js +0 -1
  6. package/dist/lib/accounts/rate-limits.js +0 -1
  7. package/dist/lib/accounts.d.ts +3 -8
  8. package/dist/lib/accounts.d.ts.map +1 -1
  9. package/dist/lib/accounts.js +2 -3
  10. package/dist/lib/audit.js +0 -1
  11. package/dist/lib/auth/auth.js +0 -1
  12. package/dist/lib/auth/browser.js +0 -1
  13. package/dist/lib/auth/device-auth.js +0 -1
  14. package/dist/lib/auth/index.js +0 -1
  15. package/dist/lib/auth/org-override.js +0 -1
  16. package/dist/lib/auth/server.js +0 -1
  17. package/dist/lib/auth/token-utils.js +0 -1
  18. package/dist/lib/auth-rate-limit.js +0 -1
  19. package/dist/lib/budget-guard.js +0 -1
  20. package/dist/lib/capability-policy.js +0 -1
  21. package/dist/lib/circuit-breaker.js +0 -1
  22. package/dist/lib/cli.js +1 -2
  23. package/dist/lib/codex-cli/index.js +0 -1
  24. package/dist/lib/codex-cli/observability.js +0 -1
  25. package/dist/lib/codex-cli/state.js +0 -1
  26. package/dist/lib/codex-cli/sync.d.ts +2 -2
  27. package/dist/lib/codex-cli/sync.d.ts.map +1 -1
  28. package/dist/lib/codex-cli/sync.js +1 -2
  29. package/dist/lib/codex-cli/writer.js +0 -1
  30. package/dist/lib/codex-manager/account-credentials.d.ts +13 -0
  31. package/dist/lib/codex-manager/account-credentials.d.ts.map +1 -0
  32. package/dist/lib/codex-manager/account-credentials.js +55 -0
  33. package/dist/lib/codex-manager/account-manager-commands.js +0 -1
  34. package/dist/lib/codex-manager/account-pool-write.d.ts +95 -0
  35. package/dist/lib/codex-manager/account-pool-write.d.ts.map +1 -0
  36. package/dist/lib/codex-manager/account-pool-write.js +165 -0
  37. package/dist/lib/codex-manager/account-pool-write.js.map +1 -0
  38. package/dist/lib/codex-manager/backend-category-entry.js +0 -1
  39. package/dist/lib/codex-manager/backend-category-helpers.js +0 -1
  40. package/dist/lib/codex-manager/backend-category-prompt.js +0 -1
  41. package/dist/lib/codex-manager/backend-settings-controller.js +0 -1
  42. package/dist/lib/codex-manager/backend-settings-entry.js +0 -1
  43. package/dist/lib/codex-manager/backend-settings-helpers.js +0 -1
  44. package/dist/lib/codex-manager/backend-settings-prompt.js +0 -1
  45. package/dist/lib/codex-manager/backend-settings-schema.js +0 -1
  46. package/dist/lib/codex-manager/behavior-settings-panel.d.ts +1 -1
  47. package/dist/lib/codex-manager/behavior-settings-panel.d.ts.map +1 -1
  48. package/dist/lib/codex-manager/behavior-settings-panel.js +0 -1
  49. package/dist/lib/codex-manager/commands/account.js +0 -1
  50. package/dist/lib/codex-manager/commands/best.d.ts +8 -0
  51. package/dist/lib/codex-manager/commands/best.d.ts.map +1 -1
  52. package/dist/lib/codex-manager/commands/best.js +64 -1
  53. package/dist/lib/codex-manager/commands/bridge.js +0 -1
  54. package/dist/lib/codex-manager/commands/budget.js +0 -1
  55. package/dist/lib/codex-manager/commands/check.js +0 -1
  56. package/dist/lib/codex-manager/commands/config-explain.js +0 -1
  57. package/dist/lib/codex-manager/commands/debug-bundle.js +0 -1
  58. package/dist/lib/codex-manager/commands/forecast.js +0 -1
  59. package/dist/lib/codex-manager/commands/init-config.js +0 -1
  60. package/dist/lib/codex-manager/commands/integrations.js +0 -1
  61. package/dist/lib/codex-manager/commands/models.js +0 -1
  62. package/dist/lib/codex-manager/commands/monitor.js +0 -1
  63. package/dist/lib/codex-manager/commands/report.js +0 -1
  64. package/dist/lib/codex-manager/commands/rotation.d.ts.map +1 -1
  65. package/dist/lib/codex-manager/commands/rotation.js +1 -4
  66. package/dist/lib/codex-manager/commands/status.js +0 -1
  67. package/dist/lib/codex-manager/commands/switch.js +0 -1
  68. package/dist/lib/codex-manager/commands/uninstall.d.ts.map +1 -1
  69. package/dist/lib/codex-manager/commands/uninstall.js +2 -33
  70. package/dist/lib/codex-manager/commands/unpin.js +0 -1
  71. package/dist/lib/codex-manager/commands/usage.js +0 -1
  72. package/dist/lib/codex-manager/commands/verify.js +0 -1
  73. package/dist/lib/codex-manager/commands/why-selected.js +0 -1
  74. package/dist/lib/codex-manager/commands/workspace.js +0 -1
  75. package/dist/lib/codex-manager/dashboard-display-panel.d.ts +1 -1
  76. package/dist/lib/codex-manager/dashboard-display-panel.d.ts.map +1 -1
  77. package/dist/lib/codex-manager/dashboard-display-panel.js +0 -1
  78. package/dist/lib/codex-manager/dashboard-formatters.js +0 -1
  79. package/dist/lib/codex-manager/dashboard-settings-controller.js +0 -1
  80. package/dist/lib/codex-manager/dashboard-settings-data.js +0 -1
  81. package/dist/lib/codex-manager/dashboard-settings-entry.js +0 -1
  82. package/dist/lib/codex-manager/experimental-settings-entry.js +0 -1
  83. package/dist/lib/codex-manager/experimental-settings-prompt.js +0 -1
  84. package/dist/lib/codex-manager/experimental-settings-schema.js +1 -2
  85. package/dist/lib/codex-manager/experimental-sync-target-entry.js +0 -1
  86. package/dist/lib/codex-manager/experimental-sync-target.js +0 -1
  87. package/dist/lib/codex-manager/forecast-report-commands.js +0 -1
  88. package/dist/lib/codex-manager/forecast-report-shared.d.ts +2 -2
  89. package/dist/lib/codex-manager/forecast-report-shared.d.ts.map +1 -1
  90. package/dist/lib/codex-manager/forecast-report-shared.js +5 -21
  91. package/dist/lib/codex-manager/formatters/account-formatters.d.ts +11 -0
  92. package/dist/lib/codex-manager/formatters/account-formatters.d.ts.map +1 -0
  93. package/dist/lib/codex-manager/formatters/account-formatters.js +79 -0
  94. package/dist/lib/codex-manager/formatters/index.d.ts +5 -0
  95. package/dist/lib/codex-manager/formatters/index.d.ts.map +1 -0
  96. package/dist/lib/codex-manager/formatters/index.js +4 -0
  97. package/dist/lib/codex-manager/formatters/model-formatters.d.ts +12 -0
  98. package/dist/lib/codex-manager/formatters/model-formatters.d.ts.map +1 -0
  99. package/dist/lib/codex-manager/formatters/model-formatters.js +23 -0
  100. package/dist/lib/codex-manager/formatters/quota-formatters.d.ts +11 -0
  101. package/dist/lib/codex-manager/formatters/quota-formatters.d.ts.map +1 -0
  102. package/dist/lib/codex-manager/formatters/quota-formatters.js +104 -0
  103. package/dist/lib/codex-manager/formatters/text-style.d.ts +14 -0
  104. package/dist/lib/codex-manager/formatters/text-style.d.ts.map +1 -0
  105. package/dist/lib/codex-manager/formatters/text-style.js +111 -0
  106. package/dist/lib/codex-manager/health-check.d.ts +14 -0
  107. package/dist/lib/codex-manager/health-check.d.ts.map +1 -0
  108. package/dist/lib/codex-manager/health-check.js +278 -0
  109. package/dist/lib/codex-manager/help.js +0 -1
  110. package/dist/lib/codex-manager/login-action-panel.d.ts +4 -0
  111. package/dist/lib/codex-manager/login-action-panel.d.ts.map +1 -0
  112. package/dist/lib/codex-manager/login-action-panel.js +238 -0
  113. package/dist/lib/codex-manager/login-flow.d.ts +17 -0
  114. package/dist/lib/codex-manager/login-flow.d.ts.map +1 -0
  115. package/dist/lib/codex-manager/login-flow.js +387 -0
  116. package/dist/lib/codex-manager/login-menu-actions.d.ts +20 -0
  117. package/dist/lib/codex-manager/login-menu-actions.d.ts.map +1 -0
  118. package/dist/lib/codex-manager/login-menu-actions.js +303 -0
  119. package/dist/lib/codex-manager/login-menu-data.d.ts +19 -0
  120. package/dist/lib/codex-manager/login-menu-data.d.ts.map +1 -0
  121. package/dist/lib/codex-manager/login-menu-data.js +378 -0
  122. package/dist/lib/codex-manager/login-oauth.d.ts +55 -0
  123. package/dist/lib/codex-manager/login-oauth.d.ts.map +1 -0
  124. package/dist/lib/codex-manager/login-oauth.js +345 -0
  125. package/dist/lib/codex-manager/manual-callback.d.ts +33 -0
  126. package/dist/lib/codex-manager/manual-callback.d.ts.map +1 -0
  127. package/dist/lib/codex-manager/manual-callback.js +30 -0
  128. package/dist/lib/codex-manager/manual-callback.js.map +1 -0
  129. package/dist/lib/codex-manager/persist-selected-account.d.ts +24 -0
  130. package/dist/lib/codex-manager/persist-selected-account.d.ts.map +1 -0
  131. package/dist/lib/codex-manager/persist-selected-account.js +107 -0
  132. package/dist/lib/codex-manager/quota-cache-helpers.d.ts +18 -0
  133. package/dist/lib/codex-manager/quota-cache-helpers.d.ts.map +1 -0
  134. package/dist/lib/codex-manager/quota-cache-helpers.js +112 -0
  135. package/dist/lib/codex-manager/rate-limit-markers.js +0 -1
  136. package/dist/lib/codex-manager/repair-commands.js +0 -1
  137. package/dist/lib/codex-manager/settings-hub/backend.js +1 -2
  138. package/dist/lib/codex-manager/settings-hub/dashboard.js +1 -2
  139. package/dist/lib/codex-manager/settings-hub/experimental.js +1 -2
  140. package/dist/lib/codex-manager/settings-hub/index.js +1 -2
  141. package/dist/lib/codex-manager/settings-hub/shared.js +0 -1
  142. package/dist/lib/codex-manager/settings-hub-entry.js +0 -1
  143. package/dist/lib/codex-manager/settings-hub-menu.js +0 -1
  144. package/dist/lib/codex-manager/settings-hub-prompt.js +0 -1
  145. package/dist/lib/codex-manager/settings-hub.js +0 -1
  146. package/dist/lib/codex-manager/settings-panels.js +0 -1
  147. package/dist/lib/codex-manager/settings-persist-utils.js +0 -1
  148. package/dist/lib/codex-manager/settings-preview.js +0 -1
  149. package/dist/lib/codex-manager/settings-write-queue.js +0 -1
  150. package/dist/lib/codex-manager/statusline-order.js +0 -1
  151. package/dist/lib/codex-manager/statusline-settings-panel.d.ts +1 -1
  152. package/dist/lib/codex-manager/statusline-settings-panel.d.ts.map +1 -1
  153. package/dist/lib/codex-manager/statusline-settings-panel.js +0 -1
  154. package/dist/lib/codex-manager/theme-settings-panel.d.ts +1 -1
  155. package/dist/lib/codex-manager/theme-settings-panel.d.ts.map +1 -1
  156. package/dist/lib/codex-manager/theme-settings-panel.js +0 -1
  157. package/dist/lib/codex-manager/unified-settings-controller.js +0 -1
  158. package/dist/lib/codex-manager/unified-settings-entry.js +0 -1
  159. package/dist/lib/codex-manager.d.ts +2 -4
  160. package/dist/lib/codex-manager.d.ts.map +1 -1
  161. package/dist/lib/codex-manager.js +219 -2578
  162. package/dist/lib/codex-manager.js.map +1 -1
  163. package/dist/lib/config-schema.d.ts +32 -0
  164. package/dist/lib/config-schema.d.ts.map +1 -0
  165. package/dist/lib/config-schema.js +96 -0
  166. package/dist/lib/config.d.ts.map +1 -1
  167. package/dist/lib/config.js +60 -104
  168. package/dist/lib/constants.js +0 -1
  169. package/dist/lib/context-overflow.js +0 -1
  170. package/dist/lib/dashboard-settings.js +0 -1
  171. package/dist/lib/entitlement-cache.js +0 -1
  172. package/dist/lib/env-parsing.js +0 -1
  173. package/dist/lib/errors.js +0 -1
  174. package/dist/lib/forecast.js +0 -1
  175. package/dist/lib/fs-retry.d.ts +46 -0
  176. package/dist/lib/fs-retry.d.ts.map +1 -1
  177. package/dist/lib/fs-retry.js +74 -6
  178. package/dist/lib/health.js +0 -1
  179. package/dist/lib/index.js +0 -1
  180. package/dist/lib/integration-generators.js +0 -1
  181. package/dist/lib/live-account-sync.js +0 -1
  182. package/dist/lib/local-bridge.js +0 -1
  183. package/dist/lib/local-client-tokens.js +0 -1
  184. package/dist/lib/logger.js +0 -1
  185. package/dist/lib/model-capability-matrix.js +0 -1
  186. package/dist/lib/named-backup-export.js +0 -1
  187. package/dist/lib/oc-chatgpt-import-adapter.js +0 -1
  188. package/dist/lib/oc-chatgpt-orchestrator.js +0 -1
  189. package/dist/lib/oc-chatgpt-target-detection.js +0 -1
  190. package/dist/lib/parallel-probe.js +0 -1
  191. package/dist/lib/policy/runtime-policy.js +0 -1
  192. package/dist/lib/preemptive-quota-scheduler.js +0 -1
  193. package/dist/lib/proactive-refresh.js +0 -1
  194. package/dist/lib/prompts/codex-host-bridge.js +0 -1
  195. package/dist/lib/prompts/codex.d.ts +3 -11
  196. package/dist/lib/prompts/codex.d.ts.map +1 -1
  197. package/dist/lib/prompts/codex.js +4 -12
  198. package/dist/lib/prompts/fetch-utils.js +0 -1
  199. package/dist/lib/prompts/host-codex-prompt.js +0 -1
  200. package/dist/lib/quota-cache.d.ts.map +1 -1
  201. package/dist/lib/quota-cache.js +15 -43
  202. package/dist/lib/quota-probe.js +0 -1
  203. package/dist/lib/quota-readiness.js +0 -1
  204. package/dist/lib/recovery/constants.js +0 -1
  205. package/dist/lib/recovery/index.js +0 -1
  206. package/dist/lib/recovery/storage.d.ts.map +1 -1
  207. package/dist/lib/recovery/storage.js +30 -51
  208. package/dist/lib/recovery/storage.js.map +1 -1
  209. package/dist/lib/recovery/types.js +0 -1
  210. package/dist/lib/recovery.js +0 -1
  211. package/dist/lib/refresh-guardian.js +0 -1
  212. package/dist/lib/refresh-lease.d.ts.map +1 -1
  213. package/dist/lib/refresh-lease.js +1 -4
  214. package/dist/lib/refresh-queue.js +0 -1
  215. package/dist/lib/request/error-classification.d.ts +75 -0
  216. package/dist/lib/request/error-classification.d.ts.map +1 -0
  217. package/dist/lib/request/error-classification.js +295 -0
  218. package/dist/lib/request/failover-config.js +0 -1
  219. package/dist/lib/request/failure-policy.js +0 -1
  220. package/dist/lib/request/fetch-helpers.d.ts +10 -114
  221. package/dist/lib/request/fetch-helpers.d.ts.map +1 -1
  222. package/dist/lib/request/fetch-helpers.js +7 -589
  223. package/dist/lib/request/headers.d.ts +33 -0
  224. package/dist/lib/request/headers.d.ts.map +1 -0
  225. package/dist/lib/request/headers.js +64 -0
  226. package/dist/lib/request/helpers/input-utils.js +0 -1
  227. package/dist/lib/request/helpers/model-map.d.ts +10 -0
  228. package/dist/lib/request/helpers/model-map.d.ts.map +1 -1
  229. package/dist/lib/request/helpers/model-map.js +11 -1
  230. package/dist/lib/request/helpers/tool-utils.js +0 -1
  231. package/dist/lib/request/index.js +0 -1
  232. package/dist/lib/request/rate-limit-backoff.js +0 -1
  233. package/dist/lib/request/rate-limit-decision.d.ts +28 -0
  234. package/dist/lib/request/rate-limit-decision.d.ts.map +1 -0
  235. package/dist/lib/request/rate-limit-decision.js +191 -0
  236. package/dist/lib/request/request-attempt-budget.js +0 -1
  237. package/dist/lib/request/request-init.js +0 -1
  238. package/dist/lib/request/request-resilience.js +0 -1
  239. package/dist/lib/request/request-transformer.js +0 -1
  240. package/dist/lib/request/response-compaction.js +0 -1
  241. package/dist/lib/request/response-handler.js +0 -1
  242. package/dist/lib/request/response-metadata.js +0 -1
  243. package/dist/lib/request/stream-failover-runtime.d.ts +8 -0
  244. package/dist/lib/request/stream-failover-runtime.d.ts.map +1 -0
  245. package/dist/lib/request/stream-failover-runtime.js +149 -0
  246. package/dist/lib/request/stream-failover.js +0 -1
  247. package/dist/lib/request/token-refresh.d.ts +30 -0
  248. package/dist/lib/request/token-refresh.d.ts.map +1 -0
  249. package/dist/lib/request/token-refresh.js +116 -0
  250. package/dist/lib/request/url-rewriting.d.ts +24 -0
  251. package/dist/lib/request/url-rewriting.d.ts.map +1 -0
  252. package/dist/lib/request/url-rewriting.js +153 -0
  253. package/dist/lib/request/wait-utils.js +0 -1
  254. package/dist/lib/rotation.d.ts +1 -1
  255. package/dist/lib/rotation.d.ts.map +1 -1
  256. package/dist/lib/rotation.js +0 -1
  257. package/dist/lib/routing-mutex.js +0 -1
  258. package/dist/lib/routing-profiles.js +0 -1
  259. package/dist/lib/runtime/account-check-helpers.js +0 -1
  260. package/dist/lib/runtime/account-check-types.js +0 -1
  261. package/dist/lib/runtime/account-check.js +0 -1
  262. package/dist/lib/runtime/account-health-check.js +0 -1
  263. package/dist/lib/runtime/account-manager-cache-entry.js +0 -1
  264. package/dist/lib/runtime/account-manager-cache.js +0 -1
  265. package/dist/lib/runtime/account-pool.js +0 -1
  266. package/dist/lib/runtime/account-scope.js +0 -1
  267. package/dist/lib/runtime/account-select-event.js +0 -1
  268. package/dist/lib/runtime/account-selection.js +0 -1
  269. package/dist/lib/runtime/account-state.js +0 -1
  270. package/dist/lib/runtime/account-status.js +0 -1
  271. package/dist/lib/runtime/account-storage-scope-entry.js +0 -1
  272. package/dist/lib/runtime/app-bind.js +0 -1
  273. package/dist/lib/runtime/auth-facade.js +0 -1
  274. package/dist/lib/runtime/browser-oauth-flow.js +0 -1
  275. package/dist/lib/runtime/capability-boost.js +0 -1
  276. package/dist/lib/runtime/config-toml.js +0 -1
  277. package/dist/lib/runtime/event-handler.js +0 -1
  278. package/dist/lib/runtime/first-run.d.ts +80 -0
  279. package/dist/lib/runtime/first-run.d.ts.map +1 -0
  280. package/dist/lib/runtime/first-run.js +327 -0
  281. package/dist/lib/runtime/flagged-verify-types.js +0 -1
  282. package/dist/lib/runtime/hydrate-emails.js +0 -1
  283. package/dist/lib/runtime/live-sync-entry.js +0 -1
  284. package/dist/lib/runtime/live-sync.js +0 -1
  285. package/dist/lib/runtime/loader-setup.js +0 -1
  286. package/dist/lib/runtime/login-menu-accounts.js +0 -1
  287. package/dist/lib/runtime/manual-oauth-flow.js +0 -1
  288. package/dist/lib/runtime/oauth-browser-flow.js +0 -1
  289. package/dist/lib/runtime/preemptive-quota.js +0 -1
  290. package/dist/lib/runtime/quota-headers.js +0 -1
  291. package/dist/lib/runtime/quota-probe.js +0 -1
  292. package/dist/lib/runtime/quota-settings.js +0 -1
  293. package/dist/lib/runtime/refresh-guardian-entry.js +0 -1
  294. package/dist/lib/runtime/refresh-guardian.js +0 -1
  295. package/dist/lib/runtime/request-init.js +0 -1
  296. package/dist/lib/runtime/rotation-account-selection.d.ts +38 -0
  297. package/dist/lib/runtime/rotation-account-selection.d.ts.map +1 -0
  298. package/dist/lib/runtime/rotation-account-selection.js +172 -0
  299. package/dist/lib/runtime/rotation-proxy-state.d.ts +54 -0
  300. package/dist/lib/runtime/rotation-proxy-state.d.ts.map +1 -0
  301. package/dist/lib/runtime/rotation-proxy-state.js +56 -0
  302. package/dist/lib/runtime/rotation-server-types.d.ts +57 -0
  303. package/dist/lib/runtime/rotation-server-types.d.ts.map +1 -0
  304. package/dist/lib/runtime/rotation-server-types.js +1 -0
  305. package/dist/lib/runtime/rotation-storage-meta.d.ts +40 -0
  306. package/dist/lib/runtime/rotation-storage-meta.d.ts.map +1 -0
  307. package/dist/lib/runtime/rotation-storage-meta.js +143 -0
  308. package/dist/lib/runtime/rotation-token-refresh.d.ts +25 -0
  309. package/dist/lib/runtime/rotation-token-refresh.d.ts.map +1 -0
  310. package/dist/lib/runtime/rotation-token-refresh.js +99 -0
  311. package/dist/lib/runtime/runtime-current-account.d.ts.map +1 -1
  312. package/dist/lib/runtime/runtime-current-account.js +1 -4
  313. package/dist/lib/runtime/runtime-observability.js +0 -1
  314. package/dist/lib/runtime/runtime-services.js +0 -1
  315. package/dist/lib/runtime/session-affinity-entry.js +0 -1
  316. package/dist/lib/runtime/session-affinity.js +0 -1
  317. package/dist/lib/runtime/session-recovery.js +0 -1
  318. package/dist/lib/runtime/status-marker.js +0 -1
  319. package/dist/lib/runtime/storage-scope.js +0 -1
  320. package/dist/lib/runtime/toast.js +0 -1
  321. package/dist/lib/runtime/ui-runtime-entry.js +0 -1
  322. package/dist/lib/runtime/ui-runtime.js +0 -1
  323. package/dist/lib/runtime/verify-flagged.js +0 -1
  324. package/dist/lib/runtime-constants.js +0 -1
  325. package/dist/lib/runtime-paths.js +0 -1
  326. package/dist/lib/runtime-rotation-proxy.d.ts +7 -124
  327. package/dist/lib/runtime-rotation-proxy.d.ts.map +1 -1
  328. package/dist/lib/runtime-rotation-proxy.js +614 -1353
  329. package/dist/lib/schemas.d.ts +3 -3
  330. package/dist/lib/schemas.js +1 -2
  331. package/dist/lib/session-affinity.js +0 -1
  332. package/dist/lib/shutdown.js +0 -1
  333. package/dist/lib/storage/account-clear-entry.js +0 -1
  334. package/dist/lib/storage/account-clear.js +0 -1
  335. package/dist/lib/storage/account-match-utils.js +0 -1
  336. package/dist/lib/storage/account-persistence.d.ts +1 -1
  337. package/dist/lib/storage/account-persistence.d.ts.map +1 -1
  338. package/dist/lib/storage/account-persistence.js +0 -1
  339. package/dist/lib/storage/account-port.d.ts +1 -1
  340. package/dist/lib/storage/account-port.d.ts.map +1 -1
  341. package/dist/lib/storage/account-port.js +0 -1
  342. package/dist/lib/storage/account-save-entry.d.ts +1 -1
  343. package/dist/lib/storage/account-save-entry.d.ts.map +1 -1
  344. package/dist/lib/storage/account-save-entry.js +0 -1
  345. package/dist/lib/storage/account-save.d.ts +1 -1
  346. package/dist/lib/storage/account-save.d.ts.map +1 -1
  347. package/dist/lib/storage/account-save.js +0 -1
  348. package/dist/lib/storage/account-snapshot.js +0 -1
  349. package/dist/lib/storage/backup-metadata-builder.d.ts +1 -1
  350. package/dist/lib/storage/backup-metadata-builder.d.ts.map +1 -1
  351. package/dist/lib/storage/backup-metadata-builder.js +0 -1
  352. package/dist/lib/storage/backup-metadata.d.ts +13 -0
  353. package/dist/lib/storage/backup-metadata.d.ts.map +1 -1
  354. package/dist/lib/storage/backup-metadata.js +0 -1
  355. package/dist/lib/storage/backup-paths.js +0 -1
  356. package/dist/lib/storage/backup-restore.d.ts +1 -1
  357. package/dist/lib/storage/backup-restore.d.ts.map +1 -1
  358. package/dist/lib/storage/backup-restore.js +0 -1
  359. package/dist/lib/storage/cache-artifacts.js +0 -1
  360. package/dist/lib/storage/error-hints.js +0 -1
  361. package/dist/lib/storage/file-paths.js +0 -1
  362. package/dist/lib/storage/fixture-guards.d.ts +1 -1
  363. package/dist/lib/storage/fixture-guards.d.ts.map +1 -1
  364. package/dist/lib/storage/fixture-guards.js +0 -1
  365. package/dist/lib/storage/flagged-entry.js +0 -1
  366. package/dist/lib/storage/flagged-load-entry.d.ts +1 -1
  367. package/dist/lib/storage/flagged-load-entry.d.ts.map +1 -1
  368. package/dist/lib/storage/flagged-load-entry.js +0 -1
  369. package/dist/lib/storage/flagged-save-entry.d.ts +1 -1
  370. package/dist/lib/storage/flagged-save-entry.d.ts.map +1 -1
  371. package/dist/lib/storage/flagged-save-entry.js +0 -1
  372. package/dist/lib/storage/flagged-storage-file.d.ts +1 -1
  373. package/dist/lib/storage/flagged-storage-file.d.ts.map +1 -1
  374. package/dist/lib/storage/flagged-storage-file.js +0 -1
  375. package/dist/lib/storage/flagged-storage-io.d.ts +1 -1
  376. package/dist/lib/storage/flagged-storage-io.d.ts.map +1 -1
  377. package/dist/lib/storage/flagged-storage-io.js +0 -1
  378. package/dist/lib/storage/flagged-storage.d.ts +1 -1
  379. package/dist/lib/storage/flagged-storage.d.ts.map +1 -1
  380. package/dist/lib/storage/flagged-storage.js +15 -2
  381. package/dist/lib/storage/flagged-storage.js.map +1 -1
  382. package/dist/lib/storage/gitignore.js +0 -1
  383. package/dist/lib/storage/hash.js +0 -1
  384. package/dist/lib/storage/health.js +0 -1
  385. package/dist/lib/storage/identity.js +0 -1
  386. package/dist/lib/storage/import-export.d.ts +1 -1
  387. package/dist/lib/storage/import-export.d.ts.map +1 -1
  388. package/dist/lib/storage/import-export.js +0 -1
  389. package/dist/lib/storage/metadata-section.js +0 -1
  390. package/dist/lib/storage/migrations.d.ts +5 -48
  391. package/dist/lib/storage/migrations.d.ts.map +1 -1
  392. package/dist/lib/storage/migrations.js +5 -2
  393. package/dist/lib/storage/named-backup-entry.js +0 -1
  394. package/dist/lib/storage/named-backups-entry.d.ts +1 -1
  395. package/dist/lib/storage/named-backups-entry.d.ts.map +1 -1
  396. package/dist/lib/storage/named-backups-entry.js +0 -1
  397. package/dist/lib/storage/named-backups.js +0 -1
  398. package/dist/lib/storage/path-state.js +0 -1
  399. package/dist/lib/storage/paths.js +0 -1
  400. package/dist/lib/storage/project-migration.d.ts +1 -1
  401. package/dist/lib/storage/project-migration.d.ts.map +1 -1
  402. package/dist/lib/storage/project-migration.js +0 -1
  403. package/dist/lib/storage/public-types.d.ts +70 -0
  404. package/dist/lib/storage/public-types.d.ts.map +1 -0
  405. package/dist/lib/storage/public-types.js +6 -0
  406. package/dist/lib/storage/record-utils.js +0 -1
  407. package/dist/lib/storage/restore-assessment.d.ts +1 -1
  408. package/dist/lib/storage/restore-assessment.d.ts.map +1 -1
  409. package/dist/lib/storage/restore-assessment.js +0 -1
  410. package/dist/lib/storage/restore-backup-entry.d.ts +1 -1
  411. package/dist/lib/storage/restore-backup-entry.d.ts.map +1 -1
  412. package/dist/lib/storage/restore-backup-entry.js +0 -1
  413. package/dist/lib/storage/restore-metadata.d.ts +1 -1
  414. package/dist/lib/storage/restore-metadata.d.ts.map +1 -1
  415. package/dist/lib/storage/restore-metadata.js +0 -1
  416. package/dist/lib/storage/restore.d.ts +1 -1
  417. package/dist/lib/storage/restore.d.ts.map +1 -1
  418. package/dist/lib/storage/restore.js +0 -1
  419. package/dist/lib/storage/save-retry.d.ts +10 -0
  420. package/dist/lib/storage/save-retry.d.ts.map +1 -0
  421. package/dist/lib/storage/save-retry.js +26 -0
  422. package/dist/lib/storage/snapshot-inspectors.d.ts +1 -1
  423. package/dist/lib/storage/snapshot-inspectors.d.ts.map +1 -1
  424. package/dist/lib/storage/snapshot-inspectors.js +0 -1
  425. package/dist/lib/storage/storage-parser.d.ts +1 -1
  426. package/dist/lib/storage/storage-parser.d.ts.map +1 -1
  427. package/dist/lib/storage/storage-parser.js +0 -1
  428. package/dist/lib/storage/transactions.d.ts +1 -1
  429. package/dist/lib/storage/transactions.d.ts.map +1 -1
  430. package/dist/lib/storage/transactions.js +0 -1
  431. package/dist/lib/storage.d.ts +3 -24
  432. package/dist/lib/storage.d.ts.map +1 -1
  433. package/dist/lib/storage.js +17 -32
  434. package/dist/lib/table-formatter.js +0 -1
  435. package/dist/lib/tools/hashline-tools.js +0 -1
  436. package/dist/lib/types.js +0 -1
  437. package/dist/lib/ui/ansi.js +0 -1
  438. package/dist/lib/ui/auth-menu-builder.d.ts +89 -0
  439. package/dist/lib/ui/auth-menu-builder.d.ts.map +1 -0
  440. package/dist/lib/ui/auth-menu-builder.js +350 -0
  441. package/dist/lib/ui/auth-menu.d.ts +2 -76
  442. package/dist/lib/ui/auth-menu.d.ts.map +1 -1
  443. package/dist/lib/ui/auth-menu.js +3 -349
  444. package/dist/lib/ui/confirm.js +0 -1
  445. package/dist/lib/ui/copy.d.ts +2 -0
  446. package/dist/lib/ui/copy.d.ts.map +1 -1
  447. package/dist/lib/ui/copy.js +2 -0
  448. package/dist/lib/ui/copy.js.map +1 -1
  449. package/dist/lib/ui/display-width.js +0 -1
  450. package/dist/lib/ui/format.js +0 -1
  451. package/dist/lib/ui/index.d.ts +10 -0
  452. package/dist/lib/ui/index.d.ts.map +1 -0
  453. package/dist/lib/ui/index.js +9 -0
  454. package/dist/lib/ui/runtime.js +0 -1
  455. package/dist/lib/ui/select.js +0 -1
  456. package/dist/lib/ui/theme.js +0 -1
  457. package/dist/lib/ui/ui-copy.d.ts +159 -0
  458. package/dist/lib/ui/ui-copy.d.ts.map +1 -0
  459. package/dist/lib/ui/ui-copy.js +163 -0
  460. package/dist/lib/unified-settings.js +0 -1
  461. package/dist/lib/update-notice.js +0 -1
  462. package/dist/lib/usage/index.js +0 -1
  463. package/dist/lib/usage/ledger.js +0 -1
  464. package/dist/lib/usage/pricing.js +0 -1
  465. package/dist/lib/usage/redaction.js +0 -1
  466. package/dist/lib/usage/types.js +0 -1
  467. package/dist/lib/utils.js +0 -1
  468. package/package.json +8 -8
  469. package/scripts/postinstall.js +34 -265
  470. package/scripts/preuninstall.js +2 -2
@@ -0,0 +1,54 @@
1
+ import { AccountManager } from "../accounts.js";
2
+ import type { RuntimeRotationProxyStatus } from "./rotation-server-types.js";
3
+ import type { SessionAffinityStore } from "../session-affinity.js";
4
+ /**
5
+ * Per-instance configuration resolved once in `startRuntimeRotationProxy`,
6
+ * captured as explicit fields instead of closure variables so the request
7
+ * handler and the stale-reload recovery can be plain functions.
8
+ *
9
+ * @internal
10
+ */
11
+ export interface RotationProxyStateInit {
12
+ activeAccountManager: AccountManager;
13
+ routingMutexMode: "enabled" | "legacy";
14
+ schedulingStrategy: "hybrid" | "sequential";
15
+ fetchImpl: typeof fetch;
16
+ upstreamBaseUrl: string;
17
+ clientApiKey: string;
18
+ now: () => number;
19
+ tokenRefreshSkewMs: number;
20
+ networkErrorCooldownMs: number;
21
+ serverErrorCooldownMs: number;
22
+ tokenInvalidationCooldownMs: number;
23
+ minRotationIntervalMs: number;
24
+ pidOffsetEnabled: boolean;
25
+ fetchTimeoutMs: number;
26
+ streamStallTimeoutMs: number;
27
+ maxRuntimeAccountAttempts: number;
28
+ maxRequestBodyBytes: number;
29
+ quotaRemainingPercentThreshold: number;
30
+ sessionAffinityStore: SessionAffinityStore | null;
31
+ lastObservedAffinityGeneration: number;
32
+ }
33
+ /**
34
+ * Mutable rotation-loop state shared by every request of one proxy instance.
35
+ * `activeAccountManager` and `lastObservedAffinityGeneration` are reassigned
36
+ * at runtime (stale-state recovery and affinity-generation tracking), so the
37
+ * whole container is passed by reference and never copied.
38
+ *
39
+ * @internal
40
+ */
41
+ export interface RotationProxyState extends RotationProxyStateInit {
42
+ readonly knownAccountManagers: Set<AccountManager>;
43
+ readonly status: RuntimeRotationProxyStatus;
44
+ readonly threadGoalFallbacks: Map<string, string | null>;
45
+ lastGlobalAccountIndex: number | null;
46
+ lastGlobalSwitchAt: number;
47
+ staleRuntimeReloadPromise: Promise<AccountManager | null> | null;
48
+ lastStaleRuntimeReloadAt: number;
49
+ }
50
+ /** @internal */
51
+ export declare function createRotationProxyState(init: RotationProxyStateInit): RotationProxyState;
52
+ /** @internal */
53
+ export declare function recoverStaleRuntimeState(state: RotationProxyState): Promise<AccountManager | null>;
54
+ //# sourceMappingURL=rotation-proxy-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rotation-proxy-state.d.ts","sourceRoot":"","sources":["../../../lib/runtime/rotation-proxy-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAKhD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEnE;;;;;;GAMG;AACH,MAAM,WAAW,sBAAsB;IACtC,oBAAoB,EAAE,cAAc,CAAC;IACrC,gBAAgB,EAAE,SAAS,GAAG,QAAQ,CAAC;IACvC,kBAAkB,EAAE,QAAQ,GAAG,YAAY,CAAC;IAC5C,SAAS,EAAE,OAAO,KAAK,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,2BAA2B,EAAE,MAAM,CAAC;IACpC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,yBAAyB,EAAE,MAAM,CAAC;IAClC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,8BAA8B,EAAE,MAAM,CAAC;IACvC,oBAAoB,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAClD,8BAA8B,EAAE,MAAM,CAAC;CACvC;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAmB,SAAQ,sBAAsB;IACjE,QAAQ,CAAC,oBAAoB,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IACnD,QAAQ,CAAC,MAAM,EAAE,0BAA0B,CAAC;IAC5C,QAAQ,CAAC,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IACzD,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,yBAAyB,EAAE,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACjE,wBAAwB,EAAE,MAAM,CAAC;CACjC;AAID,gBAAgB;AAChB,wBAAgB,wBAAwB,CACvC,IAAI,EAAE,sBAAsB,GAC1B,kBAAkB,CAuBpB;AAED,gBAAgB;AAChB,wBAAsB,wBAAwB,CAC7C,KAAK,EAAE,kBAAkB,GACvB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CA0BhC"}
@@ -0,0 +1,56 @@
1
+ import { AccountManager } from "../accounts.js";
2
+ import { recordRuntimeReload, recordRuntimeReset, } from "./runtime-observability.js";
3
+ const STALE_RUNTIME_RELOAD_DEDUPE_MS = 1_000;
4
+ /** @internal */
5
+ export function createRotationProxyState(init) {
6
+ return {
7
+ ...init,
8
+ knownAccountManagers: new Set([init.activeAccountManager]),
9
+ status: {
10
+ startedAt: init.now(),
11
+ totalRequests: 0,
12
+ upstreamRequests: 0,
13
+ retries: 0,
14
+ rotations: 0,
15
+ streamsStarted: 0,
16
+ lastError: null,
17
+ lastAccountIndex: null,
18
+ lastAccountLabel: null,
19
+ lastAccountId: null,
20
+ lastAccountUpdatedAt: null,
21
+ },
22
+ threadGoalFallbacks: new Map(),
23
+ lastGlobalAccountIndex: null,
24
+ lastGlobalSwitchAt: 0,
25
+ staleRuntimeReloadPromise: null,
26
+ lastStaleRuntimeReloadAt: 0,
27
+ };
28
+ }
29
+ /** @internal */
30
+ export async function recoverStaleRuntimeState(state) {
31
+ if (Date.now() - state.lastStaleRuntimeReloadAt <= STALE_RUNTIME_RELOAD_DEDUPE_MS) {
32
+ return state.activeAccountManager;
33
+ }
34
+ if (state.staleRuntimeReloadPromise) {
35
+ return state.staleRuntimeReloadPromise;
36
+ }
37
+ state.staleRuntimeReloadPromise = (async () => {
38
+ AccountManager.resetVolatileRuntimeState();
39
+ recordRuntimeReset("pool-exhausted-no-account");
40
+ const reloaded = await AccountManager.loadFromDisk();
41
+ reloaded.setRoutingMutexMode(state.routingMutexMode);
42
+ state.activeAccountManager = reloaded;
43
+ state.knownAccountManagers.add(reloaded);
44
+ state.lastStaleRuntimeReloadAt = Date.now();
45
+ recordRuntimeReload("pool-exhausted-no-account");
46
+ return reloaded;
47
+ })()
48
+ .catch((error) => {
49
+ state.status.lastError = error instanceof Error ? error.message : String(error);
50
+ return null;
51
+ })
52
+ .finally(() => {
53
+ state.staleRuntimeReloadPromise = null;
54
+ });
55
+ return state.staleRuntimeReloadPromise;
56
+ }
@@ -0,0 +1,57 @@
1
+ import type { AccountManager } from "../accounts.js";
2
+ import type { ModelFamily } from "../prompts/codex.js";
3
+ export interface RuntimeRotationProxyServer {
4
+ host: string;
5
+ port: number;
6
+ baseUrl: string;
7
+ close: () => Promise<void>;
8
+ getStatus: () => RuntimeRotationProxyStatus;
9
+ }
10
+ export interface RuntimeRotationProxyStatus {
11
+ startedAt: number;
12
+ totalRequests: number;
13
+ upstreamRequests: number;
14
+ retries: number;
15
+ rotations: number;
16
+ streamsStarted: number;
17
+ lastError: string | null;
18
+ lastAccountIndex: number | null;
19
+ lastAccountLabel: string | null;
20
+ lastAccountId: string | null;
21
+ lastAccountUpdatedAt: number | null;
22
+ }
23
+ export interface RuntimeRotationProxyOptions {
24
+ host?: string;
25
+ port?: number;
26
+ upstreamBaseUrl?: string;
27
+ clientApiKey: string;
28
+ accountManager?: AccountManager;
29
+ fetchImpl?: typeof fetch;
30
+ now?: () => number;
31
+ quotaRemainingPercentThreshold?: number;
32
+ maxRequestBodyBytes?: number;
33
+ fetchTimeoutMs?: number;
34
+ streamStallTimeoutMs?: number;
35
+ }
36
+ export interface RequestContext {
37
+ body: Buffer;
38
+ headers: Headers;
39
+ method: "GET" | "POST";
40
+ upstreamPath: string;
41
+ model: string | null;
42
+ family: ModelFamily;
43
+ stream: boolean;
44
+ sessionKey: string | null;
45
+ }
46
+ export type ExhaustionReason = "rate-limit" | "server-error" | "network-error" | "auth-failure" | "budget" | "deactivated" | "no-account";
47
+ export type RuntimeProxyHttpError = Error & {
48
+ statusCode: number;
49
+ code: string;
50
+ };
51
+ export interface RuntimeRotationAccountIdentity {
52
+ index: number;
53
+ label: string;
54
+ accountId: string | null;
55
+ updatedAt: number;
56
+ }
57
+ //# sourceMappingURL=rotation-server-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rotation-server-types.d.ts","sourceRoot":"","sources":["../../../lib/runtime/rotation-server-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,WAAW,0BAA0B;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,SAAS,EAAE,MAAM,0BAA0B,CAAC;CAC5C;AAED,MAAM,WAAW,0BAA0B;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,2BAA2B;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,8BAA8B,CAAC,EAAE,MAAM,CAAC;IACxC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,MAAM,gBAAgB,GACzB,YAAY,GACZ,cAAc,GACd,eAAe,GACf,cAAc,GACd,QAAQ,GACR,aAAa,GACb,YAAY,CAAC;AAChB,MAAM,MAAM,qBAAqB,GAAG,KAAK,GAAG;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,WAAW,8BAA8B;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CAClB"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,40 @@
1
+ import type { SessionAffinityStore } from "../session-affinity.js";
2
+ export interface StorageMeta {
3
+ pinnedAccountIndex: number | null;
4
+ affinityGeneration: number;
5
+ }
6
+ /**
7
+ * Cheap, hot-path-safe single read with mtime-cache short-circuit. When the
8
+ * file's `mtimeMs` and `size` match the cached snapshot for this path we
9
+ * return the cached value WITHOUT reading or hashing the file. Only when
10
+ * mtime/size differ (or were never cached) do we `readFileSync` + sha1 and,
11
+ * if the content hash still matches, skip the `JSON.parse`. Transient
12
+ * failures (EBUSY/EPERM/EACCES/EAGAIN, partial-write SyntaxError) fall through
13
+ * to the last cached value for this path; defaults are only returned when the
14
+ * file has never been successfully read.
15
+ *
16
+ * Replaces an earlier retry loop with a sub-15ms busy-wait that blocked the
17
+ * event loop on every transient failure. The proxy is on the request hot
18
+ * path; serving a slightly stale (but consistent) value is strictly better
19
+ * than blocking. See #474.
20
+ */
21
+ export declare function readStorageMetaFromDisk(storagePath?: string): StorageMeta;
22
+ /**
23
+ * Backwards-compatible helper retained for tests. Prefer `readStorageMetaFromDisk`
24
+ * for new callers that also need `affinityGeneration`.
25
+ */
26
+ export declare function readPinnedAccountIndexFromDisk(storagePath?: string): number | null;
27
+ /**
28
+ * Test-only: reset the storage-meta content-hash cache between scenarios so
29
+ * each test starts from a clean read-from-disk state.
30
+ */
31
+ export declare function resetPinCacheForTesting(): void;
32
+ /**
33
+ * If the on-disk `affinityGeneration` is greater than `lastObservedGeneration`,
34
+ * drop every entry in `sessionAffinityStore` and return the new generation so
35
+ * the caller can update its tracker. Otherwise returns `lastObservedGeneration`
36
+ * unchanged. Extracted so the request-flow logic can be unit-tested without
37
+ * spinning up the full proxy. See issue #474.
38
+ */
39
+ export declare function maybeInvalidateAffinityFromDisk(sessionAffinityStore: SessionAffinityStore | null, lastObservedGeneration: number, storagePath?: string): number;
40
+ //# sourceMappingURL=rotation-storage-meta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rotation-storage-meta.d.ts","sourceRoot":"","sources":["../../../lib/runtime/rotation-storage-meta.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAqCnE,MAAM,WAAW,WAAW;IAC3B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,kBAAkB,EAAE,MAAM,CAAC;CAC3B;AA8BD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,uBAAuB,CACtC,WAAW,GAAE,MAAyB,GACpC,WAAW,CA6Eb;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC7C,WAAW,GAAE,MAAyB,GACpC,MAAM,GAAG,IAAI,CAEf;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC9C,oBAAoB,EAAE,oBAAoB,GAAG,IAAI,EACjD,sBAAsB,EAAE,MAAM,EAC9B,WAAW,GAAE,MAAyB,GACpC,MAAM,CAOR"}
@@ -0,0 +1,143 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync, readFileSync, statSync } from "node:fs";
3
+ import { getStoragePath } from "../storage.js";
4
+ // Keyed by absolute storage path so multiple proxy instances and concurrent
5
+ // vitest workers (each pointing at their own temp storage file) cannot
6
+ // corrupt each other's snapshots. See issue #474.
7
+ const STORAGE_META_CACHE = new Map();
8
+ // The mtime+size short-circuit (L3) may only be trusted once the cached
9
+ // mtime is far enough in the past that no *subsequent* write could share the
10
+ // same coarse mtime tick. Filesystems report mtime at wildly different
11
+ // granularities (ext4 ns, FAT 2s, some network/Windows volumes ~1s, and CI
12
+ // containers occasionally coarser), and our writers use atomic rename, so two
13
+ // rapid CLI bumps can land on an identical mtimeMs. Within this settle window
14
+ // we therefore ignore mtime equality and fall back to the read + sha1 path
15
+ // (the real source of truth). Outside it, the file has been quiescent long
16
+ // enough that mtime equality provably means "unchanged", so we skip the read.
17
+ // 2s comfortably exceeds the coarsest mtime granularity we expect in practice.
18
+ const MTIME_SHORTCIRCUIT_SETTLE_MS = 2_000;
19
+ function hashStorageBytes(bytes) {
20
+ return createHash("sha1").update(bytes).digest("hex");
21
+ }
22
+ function metaFromSnapshot(snapshot) {
23
+ return {
24
+ pinnedAccountIndex: snapshot.pinnedAccountIndex,
25
+ affinityGeneration: snapshot.affinityGeneration,
26
+ };
27
+ }
28
+ /**
29
+ * Cheap, hot-path-safe single read with mtime-cache short-circuit. When the
30
+ * file's `mtimeMs` and `size` match the cached snapshot for this path we
31
+ * return the cached value WITHOUT reading or hashing the file. Only when
32
+ * mtime/size differ (or were never cached) do we `readFileSync` + sha1 and,
33
+ * if the content hash still matches, skip the `JSON.parse`. Transient
34
+ * failures (EBUSY/EPERM/EACCES/EAGAIN, partial-write SyntaxError) fall through
35
+ * to the last cached value for this path; defaults are only returned when the
36
+ * file has never been successfully read.
37
+ *
38
+ * Replaces an earlier retry loop with a sub-15ms busy-wait that blocked the
39
+ * event loop on every transient failure. The proxy is on the request hot
40
+ * path; serving a slightly stale (but consistent) value is strictly better
41
+ * than blocking. See #474.
42
+ */
43
+ export function readStorageMetaFromDisk(storagePath = getStoragePath()) {
44
+ if (!existsSync(storagePath)) {
45
+ STORAGE_META_CACHE.delete(storagePath);
46
+ return { pinnedAccountIndex: null, affinityGeneration: 0 };
47
+ }
48
+ try {
49
+ // mtime+size short-circuit (L3): when neither has changed since the last
50
+ // successful read AND the cached mtime has settled (see
51
+ // MTIME_SHORTCIRCUIT_SETTLE_MS) we return the cached snapshot without
52
+ // reading or hashing the file. During the settle window we deliberately
53
+ // fall through to the read + sha1 path below, which stays the source of
54
+ // truth and protects against the coarse-mtime collision described on
55
+ // StorageMetaSnapshot. So this is a pure fast path for the common
56
+ // "file quiescent, proxy polling every request" case.
57
+ const stats = statSync(storagePath);
58
+ const cachedByStat = STORAGE_META_CACHE.get(storagePath);
59
+ if (cachedByStat &&
60
+ cachedByStat.mtimeMs === stats.mtimeMs &&
61
+ cachedByStat.size === stats.size &&
62
+ Date.now() - stats.mtimeMs > MTIME_SHORTCIRCUIT_SETTLE_MS) {
63
+ return metaFromSnapshot(cachedByStat);
64
+ }
65
+ const bytes = readFileSync(storagePath);
66
+ const contentHash = hashStorageBytes(bytes);
67
+ const cached = STORAGE_META_CACHE.get(storagePath);
68
+ if (cached && cached.contentHash === contentHash) {
69
+ // Content is byte-identical despite the mtime/size change (e.g. an
70
+ // atomic-rename rewrite of the same bytes). Refresh the stat fields so
71
+ // the next request takes the fast path, but skip the JSON.parse.
72
+ const refreshed = {
73
+ ...cached,
74
+ mtimeMs: stats.mtimeMs,
75
+ size: stats.size,
76
+ };
77
+ STORAGE_META_CACHE.set(storagePath, refreshed);
78
+ return metaFromSnapshot(refreshed);
79
+ }
80
+ const parsed = JSON.parse(bytes.toString("utf8"));
81
+ const pinnedAccountIndex = typeof parsed.pinnedAccountIndex === "number" &&
82
+ Number.isFinite(parsed.pinnedAccountIndex)
83
+ ? Math.trunc(parsed.pinnedAccountIndex)
84
+ : null;
85
+ const affinityGeneration = typeof parsed.affinityGeneration === "number" &&
86
+ Number.isFinite(parsed.affinityGeneration) &&
87
+ Number.isInteger(parsed.affinityGeneration) &&
88
+ parsed.affinityGeneration >= 0
89
+ ? parsed.affinityGeneration
90
+ : 0;
91
+ const snapshot = {
92
+ mtimeMs: stats.mtimeMs,
93
+ size: stats.size,
94
+ contentHash,
95
+ pinnedAccountIndex,
96
+ affinityGeneration,
97
+ };
98
+ STORAGE_META_CACHE.set(storagePath, snapshot);
99
+ return { pinnedAccountIndex, affinityGeneration };
100
+ }
101
+ catch (error) {
102
+ // On any failure, prefer the last good snapshot for this path so we
103
+ // don't blow away affinity unnecessarily. Defensive: even non-transient
104
+ // errors fall back to the cache when one exists — better stale than
105
+ // wrong. Defaults are only returned when this file has never been read
106
+ // successfully (cache miss).
107
+ void error;
108
+ const cached = STORAGE_META_CACHE.get(storagePath);
109
+ if (cached) {
110
+ return metaFromSnapshot(cached);
111
+ }
112
+ return { pinnedAccountIndex: null, affinityGeneration: 0 };
113
+ }
114
+ }
115
+ /**
116
+ * Backwards-compatible helper retained for tests. Prefer `readStorageMetaFromDisk`
117
+ * for new callers that also need `affinityGeneration`.
118
+ */
119
+ export function readPinnedAccountIndexFromDisk(storagePath = getStoragePath()) {
120
+ return readStorageMetaFromDisk(storagePath).pinnedAccountIndex;
121
+ }
122
+ /**
123
+ * Test-only: reset the storage-meta content-hash cache between scenarios so
124
+ * each test starts from a clean read-from-disk state.
125
+ */
126
+ export function resetPinCacheForTesting() {
127
+ STORAGE_META_CACHE.clear();
128
+ }
129
+ /**
130
+ * If the on-disk `affinityGeneration` is greater than `lastObservedGeneration`,
131
+ * drop every entry in `sessionAffinityStore` and return the new generation so
132
+ * the caller can update its tracker. Otherwise returns `lastObservedGeneration`
133
+ * unchanged. Extracted so the request-flow logic can be unit-tested without
134
+ * spinning up the full proxy. See issue #474.
135
+ */
136
+ export function maybeInvalidateAffinityFromDisk(sessionAffinityStore, lastObservedGeneration, storagePath = getStoragePath()) {
137
+ const meta = readStorageMetaFromDisk(storagePath);
138
+ if (meta.affinityGeneration > lastObservedGeneration) {
139
+ sessionAffinityStore?.clearAll();
140
+ return meta.affinityGeneration;
141
+ }
142
+ return lastObservedGeneration;
143
+ }
@@ -0,0 +1,25 @@
1
+ import type { AccountManager, ManagedAccount } from "../accounts.js";
2
+ import type { ModelFamily } from "../prompts/codex.js";
3
+ /** @internal */
4
+ export declare const DEFAULT_AUTH_FAILURE_COOLDOWN_MS = 30000;
5
+ /** @internal */
6
+ export declare function applyMonotonicAuthCooldown(accountManager: AccountManager, account: ManagedAccount, cooldownMs: number): void;
7
+ /** @internal */
8
+ export declare function ensureFreshAccessToken(params: {
9
+ accountManager: AccountManager;
10
+ account: ManagedAccount;
11
+ family: ModelFamily;
12
+ model: string | null;
13
+ now: number;
14
+ tokenRefreshSkewMs: number;
15
+ tokenInvalidationCooldownMs: number;
16
+ }): Promise<{
17
+ ok: true;
18
+ accessToken: string;
19
+ account: ManagedAccount;
20
+ } | {
21
+ ok: false;
22
+ retryable: boolean;
23
+ invalidated?: boolean;
24
+ }>;
25
+ //# sourceMappingURL=rotation-token-refresh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rotation-token-refresh.d.ts","sourceRoot":"","sources":["../../../lib/runtime/rotation-token-refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAQvD,gBAAgB;AAChB,eAAO,MAAM,gCAAgC,QAAS,CAAC;AAMvD,gBAAgB;AAChB,wBAAgB,0BAA0B,CACzC,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,MAAM,GAChB,IAAI,CAUN;AA6CD,gBAAgB;AAChB,wBAAsB,sBAAsB,CAAC,MAAM,EAAE;IACpD,cAAc,EAAE,cAAc,CAAC;IAC/B,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,kBAAkB,EAAE,MAAM,CAAC;IAC3B,2BAA2B,EAAE,MAAM,CAAC;CACpC,GAAG,OAAO,CACR;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,GAC1D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,CAC1D,CAgEA"}
@@ -0,0 +1,99 @@
1
+ import { queuedRefresh } from "../refresh-queue.js";
2
+ import { isTokenInvalidationError, isTokenRefreshRetryable, } from "../request/rate-limit-decision.js";
3
+ /** @internal */
4
+ export const DEFAULT_AUTH_FAILURE_COOLDOWN_MS = 30_000;
5
+ // Monotonic auth-failure cooldown: only extend, never shorten. Two concurrent
6
+ // requests on the same account can race so that an invalidation path sets a
7
+ // long cooldown (5 min) and a subsequent generic 401 truncates it (30 s).
8
+ // Reading the live coolingDownUntil before writing prevents that race.
9
+ /** @internal */
10
+ export function applyMonotonicAuthCooldown(accountManager, account, cooldownMs) {
11
+ const existing = accountManager.getAccountByIndex(account.index)?.coolingDownUntil ?? 0;
12
+ // Intentionally Date.now(), not the proxy's injected now(): coolingDownUntil is
13
+ // written by markAccountCoolingDown via nowMs() (== Date.now()), so both sides of
14
+ // this comparison must live in the same real-wall-clock domain. Switching to the
15
+ // injected now() would mis-compare an injected-clock value against a real-clock
16
+ // deadline and silently defeat the monotonic guard.
17
+ if (Date.now() + cooldownMs > existing) {
18
+ accountManager.markAccountCoolingDown(account, cooldownMs, "auth-failure");
19
+ }
20
+ }
21
+ function hasUsableAccessToken(account, now, skewMs) {
22
+ return (typeof account.access === "string" &&
23
+ account.access.trim().length > 0 &&
24
+ typeof account.expires === "number" &&
25
+ account.expires > now + Math.max(0, skewMs));
26
+ }
27
+ const runtimeRefreshCommitQueues = new WeakMap();
28
+ async function commitRefreshedAuthOnce(accountManager, account, auth) {
29
+ const key = [
30
+ account.index,
31
+ account.accountId ?? "",
32
+ account.email ?? "",
33
+ account.refreshToken,
34
+ ].join("\0");
35
+ let queue = runtimeRefreshCommitQueues.get(accountManager);
36
+ if (!queue) {
37
+ queue = new Map();
38
+ runtimeRefreshCommitQueues.set(accountManager, queue);
39
+ }
40
+ const existing = queue.get(key);
41
+ if (existing)
42
+ return existing;
43
+ const pending = accountManager
44
+ .commitRefreshedAuth(account, auth)
45
+ .finally(() => queue?.delete(key));
46
+ queue.set(key, pending);
47
+ return pending;
48
+ }
49
+ /** @internal */
50
+ export async function ensureFreshAccessToken(params) {
51
+ const { accountManager, account, family, model, now, tokenRefreshSkewMs, tokenInvalidationCooldownMs } = params;
52
+ if (hasUsableAccessToken(account, now, tokenRefreshSkewMs)) {
53
+ return { ok: true, accessToken: account.access ?? "", account };
54
+ }
55
+ const refreshResult = await queuedRefresh(account.refreshToken);
56
+ if (refreshResult.type === "failed") {
57
+ accountManager.recordFailure(account, family, model);
58
+ accountManager.incrementAuthFailures(account);
59
+ // If the refresh endpoint itself returns an explicit invalidation message
60
+ // (e.g. Microsoft/Outlook SSO revokes the refresh token server-side), apply
61
+ // the long cooldown and signal to the caller to stop rotating rather than
62
+ // presenting other accounts' tokens from the same IP.
63
+ const invalidated = isTokenInvalidationError(refreshResult.message ?? "");
64
+ applyMonotonicAuthCooldown(accountManager, account, invalidated ? tokenInvalidationCooldownMs : DEFAULT_AUTH_FAILURE_COOLDOWN_MS);
65
+ accountManager.saveToDiskDebounced();
66
+ return { ok: false, retryable: isTokenRefreshRetryable(refreshResult), invalidated };
67
+ }
68
+ const auth = {
69
+ type: "oauth",
70
+ access: refreshResult.access,
71
+ refresh: refreshResult.refresh,
72
+ expires: refreshResult.expires,
73
+ };
74
+ try {
75
+ const updatedAccount = await commitRefreshedAuthOnce(accountManager, account, auth);
76
+ // If commit succeeded, use the stored access token from the committed
77
+ // account — this also handles the dedup case where two concurrent callers
78
+ // share one commit and both end up with the same committed token.
79
+ // If commit returned null (account missing from storage after persist),
80
+ // fall back to the original account object but always use refreshResult.access:
81
+ // the original account may carry an expired token, and using that would
82
+ // cause a downstream 401 and incorrectly trigger invalidation-cooldown logic.
83
+ const resolvedAccount = updatedAccount ?? account;
84
+ const accessToken = updatedAccount !== null
85
+ ? (updatedAccount.access ?? refreshResult.access)
86
+ : refreshResult.access;
87
+ return {
88
+ ok: true,
89
+ accessToken,
90
+ account: resolvedAccount,
91
+ };
92
+ }
93
+ catch {
94
+ accountManager.recordFailure(account, family, model);
95
+ accountManager.markAccountCoolingDown(account, DEFAULT_AUTH_FAILURE_COOLDOWN_MS, "auth-failure");
96
+ accountManager.saveToDiskDebounced();
97
+ return { ok: false, retryable: true };
98
+ }
99
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-current-account.d.ts","sourceRoot":"","sources":["../../../lib/runtime/runtime-current-account.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime-current-account.d.ts","sourceRoot":"","sources":["../../../lib/runtime/runtime-current-account.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ import { join } from "node:path";
3
3
  import process from "node:process";
4
4
  import { APP_RUNTIME_HELPER_STATUS_FILE } from "../runtime-constants.js";
5
5
  import { getCodexMultiAuthDir } from "../runtime-paths.js";
6
+ import { isRecord } from "../utils.js";
6
7
  export const RUNTIME_CURRENT_ACCOUNT_MAX_AGE_MS = 24 * 60 * 60 * 1000;
7
8
  const APP_RUNTIME_HELPER_KIND = "codex-app-runtime-rotation-helper";
8
9
  const MAX_STATUS_FILE_BYTES = 1024 * 1024; // 1 MB sanity cap
@@ -35,9 +36,6 @@ function normalizeTimestamp(signal) {
35
36
  ].filter((timestamp) => timestamp !== null);
36
37
  return timestamps.length > 0 ? Math.max(...timestamps) : null;
37
38
  }
38
- function isRecord(value) {
39
- return typeof value === "object" && value !== null;
40
- }
41
39
  function readOptionalNumber(record, key) {
42
40
  const value = record[key];
43
41
  return typeof value === "number" && Number.isFinite(value) ? value : null;
@@ -258,4 +256,3 @@ export function resolveAccountCurrentMarkers(index, storedCurrentIndex, runtimeC
258
256
  export function isDisplayCurrentAccount(index, storedCurrentIndex, runtimeCurrent) {
259
257
  return runtimeCurrent ? index === runtimeCurrent.index : index === storedCurrentIndex;
260
258
  }
261
- //# sourceMappingURL=runtime-current-account.js.map
@@ -267,4 +267,3 @@ export function resetRuntimeObservabilitySnapshotForTests() {
267
267
  snapshotState = createDefaultSnapshot();
268
268
  pendingWrite = null;
269
269
  }
270
- //# sourceMappingURL=runtime-observability.js.map
@@ -96,4 +96,3 @@ export function ensureSessionAffinityState(params) {
96
96
  sessionAffinityConfigKey: configKey,
97
97
  };
98
98
  }
99
- //# sourceMappingURL=runtime-services.js.map
@@ -8,4 +8,3 @@ export function ensureSessionAffinityEntry(params) {
8
8
  createStore: params.createStore,
9
9
  });
10
10
  }
11
- //# sourceMappingURL=session-affinity-entry.js.map
@@ -14,4 +14,3 @@ export function ensureRuntimeSessionAffinity(deps) {
14
14
  configKey,
15
15
  };
16
16
  }
17
- //# sourceMappingURL=session-affinity.js.map
@@ -4,4 +4,3 @@ export function createRuntimeSessionRecoveryHook(deps) {
4
4
  ? createSessionRecoveryHook({ client: deps.client, directory: deps.directory }, { sessionRecovery: true, autoResume: deps.autoResume })
5
5
  : null;
6
6
  }
7
- //# sourceMappingURL=session-recovery.js.map
@@ -12,4 +12,3 @@ export function getRuntimeStatusMarker(ui, status) {
12
12
  return "!";
13
13
  return ui.theme.glyphs.cross;
14
14
  }
15
- //# sourceMappingURL=status-marker.js.map
@@ -27,4 +27,3 @@ export function applyAccountStorageScopeFromConfig(pluginConfig, deps) {
27
27
  }
28
28
  deps.setStoragePath(perProjectAccounts ? deps.cwd() : null);
29
29
  }
30
- //# sourceMappingURL=storage-scope.js.map
@@ -13,4 +13,3 @@ export async function showRuntimeToast(client, message, variant = "success", opt
13
13
  // Ignore when TUI is not available.
14
14
  }
15
15
  }
16
- //# sourceMappingURL=toast.js.map
@@ -1,4 +1,3 @@
1
1
  export function resolveUiRuntimeEntry(params) {
2
2
  return params.resolveUiRuntimeFromConfig(params.loadPluginConfig, params.applyUiRuntimeFromConfig);
3
3
  }
4
- //# sourceMappingURL=ui-runtime-entry.js.map
@@ -20,4 +20,3 @@ export function getStatusMarker(ui, status) {
20
20
  return "!";
21
21
  return ui.theme.glyphs.cross;
22
22
  }
23
- //# sourceMappingURL=ui-runtime.js.map
@@ -90,4 +90,3 @@ export async function verifyRuntimeFlaggedAccounts(deps) {
90
90
  deps.showLine(`Results: ${state.restored.length} restored, ${state.remaining.length} still flagged`);
91
91
  deps.showLine("");
92
92
  }
93
- //# sourceMappingURL=verify-flagged.js.map
@@ -1,3 +1,2 @@
1
1
  export const RUNTIME_ROTATION_PROXY_PROVIDER_ID = "codex-multi-auth-runtime-proxy";
2
2
  export const APP_RUNTIME_HELPER_STATUS_FILE = "runtime-rotation-app-helper.json";
3
- //# sourceMappingURL=runtime-constants.js.map
@@ -247,4 +247,3 @@ export function getCodexLogDir() {
247
247
  export function getLegacyCodexDir() {
248
248
  return join(getResolvedUserHomeDir(), ".codex");
249
249
  }
250
- //# sourceMappingURL=runtime-paths.js.map