codex-multi-auth 2.3.0-beta.1 → 2.3.0-beta.3

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 (535) hide show
  1. package/.codex-plugin/plugin.json +2 -1
  2. package/README.md +4 -4
  3. package/config/schema/config.schema.json +268 -21
  4. package/dist/index.js +0 -1
  5. package/dist/lib/account-policy.d.ts.map +1 -1
  6. package/dist/lib/account-policy.js +2 -2
  7. package/dist/lib/accounts/rate-limits.js +0 -1
  8. package/dist/lib/accounts.d.ts +3 -8
  9. package/dist/lib/accounts.d.ts.map +1 -1
  10. package/dist/lib/accounts.js +2 -3
  11. package/dist/lib/audit.d.ts +0 -9
  12. package/dist/lib/audit.d.ts.map +1 -1
  13. package/dist/lib/audit.js +0 -1
  14. package/dist/lib/auth/auth.js +0 -1
  15. package/dist/lib/auth/browser.js +0 -1
  16. package/dist/lib/auth/device-auth.d.ts +1 -6
  17. package/dist/lib/auth/device-auth.d.ts.map +1 -1
  18. package/dist/lib/auth/device-auth.js +5 -6
  19. package/dist/lib/auth/index.js +0 -1
  20. package/dist/lib/auth/org-override.js +0 -1
  21. package/dist/lib/auth/server.js +0 -1
  22. package/dist/lib/auth/token-utils.js +0 -1
  23. package/dist/lib/auth-rate-limit.js +0 -1
  24. package/dist/lib/budget-guard.d.ts.map +1 -1
  25. package/dist/lib/budget-guard.js +2 -2
  26. package/dist/lib/capability-policy.js +0 -1
  27. package/dist/lib/circuit-breaker.js +0 -1
  28. package/dist/lib/cli.js +1 -2
  29. package/dist/lib/codex-cli/index.js +0 -1
  30. package/dist/lib/codex-cli/observability.js +0 -1
  31. package/dist/lib/codex-cli/state.js +0 -1
  32. package/dist/lib/codex-cli/sync.d.ts +2 -2
  33. package/dist/lib/codex-cli/sync.d.ts.map +1 -1
  34. package/dist/lib/codex-cli/sync.js +1 -2
  35. package/dist/lib/codex-cli/writer.d.ts.map +1 -1
  36. package/dist/lib/codex-cli/writer.js +2 -2
  37. package/dist/lib/codex-manager/account-credentials.d.ts +13 -0
  38. package/dist/lib/codex-manager/account-credentials.d.ts.map +1 -0
  39. package/dist/lib/codex-manager/account-credentials.js +55 -0
  40. package/dist/lib/codex-manager/account-manager-commands.js +0 -1
  41. package/dist/lib/codex-manager/account-pool-write.d.ts +1 -1
  42. package/dist/lib/codex-manager/account-pool-write.d.ts.map +1 -1
  43. package/dist/lib/codex-manager/account-pool-write.js +0 -1
  44. package/dist/lib/codex-manager/backend-category-entry.js +0 -1
  45. package/dist/lib/codex-manager/backend-category-helpers.js +0 -1
  46. package/dist/lib/codex-manager/backend-category-prompt.js +0 -1
  47. package/dist/lib/codex-manager/backend-settings-controller.js +0 -1
  48. package/dist/lib/codex-manager/backend-settings-entry.js +0 -1
  49. package/dist/lib/codex-manager/backend-settings-helpers.d.ts +0 -1
  50. package/dist/lib/codex-manager/backend-settings-helpers.d.ts.map +1 -1
  51. package/dist/lib/codex-manager/backend-settings-helpers.js +1 -2
  52. package/dist/lib/codex-manager/backend-settings-prompt.js +0 -1
  53. package/dist/lib/codex-manager/backend-settings-schema.js +0 -1
  54. package/dist/lib/codex-manager/behavior-settings-panel.d.ts +1 -20
  55. package/dist/lib/codex-manager/behavior-settings-panel.d.ts.map +1 -1
  56. package/dist/lib/codex-manager/behavior-settings-panel.js +0 -1
  57. package/dist/lib/codex-manager/commands/account.js +0 -1
  58. package/dist/lib/codex-manager/commands/best.d.ts +8 -0
  59. package/dist/lib/codex-manager/commands/best.d.ts.map +1 -1
  60. package/dist/lib/codex-manager/commands/best.js +64 -1
  61. package/dist/lib/codex-manager/commands/bridge.js +0 -1
  62. package/dist/lib/codex-manager/commands/budget.js +0 -1
  63. package/dist/lib/codex-manager/commands/check.js +0 -1
  64. package/dist/lib/codex-manager/commands/config-explain.js +0 -1
  65. package/dist/lib/codex-manager/commands/debug-bundle.js +0 -1
  66. package/dist/lib/codex-manager/commands/forecast.js +0 -1
  67. package/dist/lib/codex-manager/commands/init-config.js +0 -1
  68. package/dist/lib/codex-manager/commands/integrations.js +0 -1
  69. package/dist/lib/codex-manager/commands/models.js +0 -1
  70. package/dist/lib/codex-manager/commands/monitor.js +0 -1
  71. package/dist/lib/codex-manager/commands/report.d.ts.map +1 -1
  72. package/dist/lib/codex-manager/commands/report.js +2 -2
  73. package/dist/lib/codex-manager/commands/rotation.d.ts.map +1 -1
  74. package/dist/lib/codex-manager/commands/rotation.js +1 -4
  75. package/dist/lib/codex-manager/commands/status.js +0 -1
  76. package/dist/lib/codex-manager/commands/switch.js +0 -1
  77. package/dist/lib/codex-manager/commands/uninstall.d.ts +2 -2
  78. package/dist/lib/codex-manager/commands/uninstall.d.ts.map +1 -1
  79. package/dist/lib/codex-manager/commands/uninstall.js +3 -34
  80. package/dist/lib/codex-manager/commands/unpin.js +0 -1
  81. package/dist/lib/codex-manager/commands/usage.d.ts.map +1 -1
  82. package/dist/lib/codex-manager/commands/usage.js +2 -2
  83. package/dist/lib/codex-manager/commands/verify.d.ts +2 -2
  84. package/dist/lib/codex-manager/commands/verify.d.ts.map +1 -1
  85. package/dist/lib/codex-manager/commands/verify.js +0 -1
  86. package/dist/lib/codex-manager/commands/why-selected.d.ts +1 -22
  87. package/dist/lib/codex-manager/commands/why-selected.d.ts.map +1 -1
  88. package/dist/lib/codex-manager/commands/why-selected.js +0 -1
  89. package/dist/lib/codex-manager/commands/workspace.js +0 -1
  90. package/dist/lib/codex-manager/dashboard-display-panel.d.ts +1 -15
  91. package/dist/lib/codex-manager/dashboard-display-panel.d.ts.map +1 -1
  92. package/dist/lib/codex-manager/dashboard-display-panel.js +0 -1
  93. package/dist/lib/codex-manager/dashboard-formatters.js +0 -1
  94. package/dist/lib/codex-manager/dashboard-settings-controller.js +0 -1
  95. package/dist/lib/codex-manager/dashboard-settings-data.js +0 -1
  96. package/dist/lib/codex-manager/dashboard-settings-entry.js +0 -1
  97. package/dist/lib/codex-manager/experimental-settings-entry.js +0 -1
  98. package/dist/lib/codex-manager/experimental-settings-prompt.d.ts +2 -1
  99. package/dist/lib/codex-manager/experimental-settings-prompt.d.ts.map +1 -1
  100. package/dist/lib/codex-manager/experimental-settings-prompt.js +0 -1
  101. package/dist/lib/codex-manager/experimental-settings-schema.js +1 -2
  102. package/dist/lib/codex-manager/experimental-sync-target-entry.js +0 -1
  103. package/dist/lib/codex-manager/experimental-sync-target.js +0 -1
  104. package/dist/lib/codex-manager/forecast-report-commands.js +0 -1
  105. package/dist/lib/codex-manager/forecast-report-shared.d.ts +2 -2
  106. package/dist/lib/codex-manager/forecast-report-shared.d.ts.map +1 -1
  107. package/dist/lib/codex-manager/forecast-report-shared.js +5 -21
  108. package/dist/lib/codex-manager/formatters/account-formatters.d.ts +11 -0
  109. package/dist/lib/codex-manager/formatters/account-formatters.d.ts.map +1 -0
  110. package/dist/lib/codex-manager/formatters/account-formatters.js +79 -0
  111. package/dist/lib/codex-manager/formatters/index.d.ts +5 -0
  112. package/dist/lib/codex-manager/formatters/index.d.ts.map +1 -0
  113. package/dist/lib/codex-manager/formatters/index.js +4 -0
  114. package/dist/lib/codex-manager/formatters/model-formatters.d.ts +12 -0
  115. package/dist/lib/codex-manager/formatters/model-formatters.d.ts.map +1 -0
  116. package/dist/lib/codex-manager/formatters/model-formatters.js +23 -0
  117. package/dist/lib/codex-manager/formatters/quota-formatters.d.ts +9 -0
  118. package/dist/lib/codex-manager/formatters/quota-formatters.d.ts.map +1 -0
  119. package/dist/lib/codex-manager/formatters/quota-formatters.js +104 -0
  120. package/dist/lib/codex-manager/formatters/text-style.d.ts +14 -0
  121. package/dist/lib/codex-manager/formatters/text-style.d.ts.map +1 -0
  122. package/dist/lib/codex-manager/formatters/text-style.js +111 -0
  123. package/dist/lib/codex-manager/health-check.d.ts +14 -0
  124. package/dist/lib/codex-manager/health-check.d.ts.map +1 -0
  125. package/dist/lib/codex-manager/health-check.js +278 -0
  126. package/dist/lib/codex-manager/help.d.ts +2 -1
  127. package/dist/lib/codex-manager/help.d.ts.map +1 -1
  128. package/dist/lib/codex-manager/help.js +0 -1
  129. package/dist/lib/codex-manager/login-action-panel.d.ts +4 -0
  130. package/dist/lib/codex-manager/login-action-panel.d.ts.map +1 -0
  131. package/dist/lib/codex-manager/login-action-panel.js +238 -0
  132. package/dist/lib/codex-manager/login-flow.d.ts +17 -0
  133. package/dist/lib/codex-manager/login-flow.d.ts.map +1 -0
  134. package/dist/lib/codex-manager/login-flow.js +387 -0
  135. package/dist/lib/codex-manager/login-menu-actions.d.ts +20 -0
  136. package/dist/lib/codex-manager/login-menu-actions.d.ts.map +1 -0
  137. package/dist/lib/codex-manager/login-menu-actions.js +303 -0
  138. package/dist/lib/codex-manager/login-menu-data.d.ts +19 -0
  139. package/dist/lib/codex-manager/login-menu-data.d.ts.map +1 -0
  140. package/dist/lib/codex-manager/login-menu-data.js +378 -0
  141. package/dist/lib/codex-manager/login-oauth.d.ts +55 -0
  142. package/dist/lib/codex-manager/login-oauth.d.ts.map +1 -0
  143. package/dist/lib/codex-manager/login-oauth.js +345 -0
  144. package/dist/lib/codex-manager/manual-callback.js +0 -1
  145. package/dist/lib/codex-manager/persist-selected-account.d.ts +24 -0
  146. package/dist/lib/codex-manager/persist-selected-account.d.ts.map +1 -0
  147. package/dist/lib/codex-manager/persist-selected-account.js +107 -0
  148. package/dist/lib/codex-manager/quota-cache-helpers.d.ts +18 -0
  149. package/dist/lib/codex-manager/quota-cache-helpers.d.ts.map +1 -0
  150. package/dist/lib/codex-manager/quota-cache-helpers.js +112 -0
  151. package/dist/lib/codex-manager/rate-limit-markers.js +0 -1
  152. package/dist/lib/codex-manager/repair-commands.d.ts +0 -15
  153. package/dist/lib/codex-manager/repair-commands.d.ts.map +1 -1
  154. package/dist/lib/codex-manager/repair-commands.js +5 -6
  155. package/dist/lib/codex-manager/settings-hub/backend.d.ts +0 -5
  156. package/dist/lib/codex-manager/settings-hub/backend.d.ts.map +1 -1
  157. package/dist/lib/codex-manager/settings-hub/backend.js +2 -3
  158. package/dist/lib/codex-manager/settings-hub/dashboard.d.ts +1 -14
  159. package/dist/lib/codex-manager/settings-hub/dashboard.d.ts.map +1 -1
  160. package/dist/lib/codex-manager/settings-hub/dashboard.js +9 -10
  161. package/dist/lib/codex-manager/settings-hub/experimental.js +1 -2
  162. package/dist/lib/codex-manager/settings-hub/index.js +1 -2
  163. package/dist/lib/codex-manager/settings-hub/shared.js +0 -1
  164. package/dist/lib/codex-manager/settings-hub-entry.js +0 -1
  165. package/dist/lib/codex-manager/settings-hub-menu.js +0 -1
  166. package/dist/lib/codex-manager/settings-hub-prompt.js +0 -1
  167. package/dist/lib/codex-manager/settings-hub.js +0 -1
  168. package/dist/lib/codex-manager/settings-panels.js +0 -1
  169. package/dist/lib/codex-manager/settings-persist-utils.js +0 -1
  170. package/dist/lib/codex-manager/settings-preview.js +0 -1
  171. package/dist/lib/codex-manager/settings-write-queue.d.ts +0 -10
  172. package/dist/lib/codex-manager/settings-write-queue.d.ts.map +1 -1
  173. package/dist/lib/codex-manager/settings-write-queue.js +10 -11
  174. package/dist/lib/codex-manager/statusline-order.js +0 -1
  175. package/dist/lib/codex-manager/statusline-settings-panel.d.ts +3 -18
  176. package/dist/lib/codex-manager/statusline-settings-panel.d.ts.map +1 -1
  177. package/dist/lib/codex-manager/statusline-settings-panel.js +0 -1
  178. package/dist/lib/codex-manager/theme-settings-panel.d.ts +1 -14
  179. package/dist/lib/codex-manager/theme-settings-panel.d.ts.map +1 -1
  180. package/dist/lib/codex-manager/theme-settings-panel.js +0 -1
  181. package/dist/lib/codex-manager/unified-settings-controller.js +0 -1
  182. package/dist/lib/codex-manager/unified-settings-entry.js +0 -1
  183. package/dist/lib/codex-manager.d.ts +2 -4
  184. package/dist/lib/codex-manager.d.ts.map +1 -1
  185. package/dist/lib/codex-manager.js +219 -2570
  186. package/dist/lib/config-schema.d.ts +32 -0
  187. package/dist/lib/config-schema.d.ts.map +1 -0
  188. package/dist/lib/config-schema.js +96 -0
  189. package/dist/lib/config.d.ts +0 -13
  190. package/dist/lib/config.d.ts.map +1 -1
  191. package/dist/lib/config.js +82 -123
  192. package/dist/lib/constants.js +0 -1
  193. package/dist/lib/context-overflow.js +0 -1
  194. package/dist/lib/dashboard-settings.d.ts +3 -3
  195. package/dist/lib/dashboard-settings.d.ts.map +1 -1
  196. package/dist/lib/dashboard-settings.js +0 -2
  197. package/dist/lib/entitlement-cache.js +0 -1
  198. package/dist/lib/env-parsing.js +0 -1
  199. package/dist/lib/errors.d.ts +0 -1
  200. package/dist/lib/errors.d.ts.map +1 -1
  201. package/dist/lib/errors.js +0 -1
  202. package/dist/lib/forecast.d.ts +4 -3
  203. package/dist/lib/forecast.d.ts.map +1 -1
  204. package/dist/lib/forecast.js +0 -1
  205. package/dist/lib/fs-retry.d.ts +46 -3
  206. package/dist/lib/fs-retry.d.ts.map +1 -1
  207. package/dist/lib/fs-retry.js +77 -9
  208. package/dist/lib/health.js +0 -1
  209. package/dist/lib/index.d.ts +1 -0
  210. package/dist/lib/index.d.ts.map +1 -1
  211. package/dist/lib/index.js +1 -1
  212. package/dist/lib/integration-generators.js +0 -1
  213. package/dist/lib/live-account-sync.js +0 -1
  214. package/dist/lib/local-bridge.js +0 -1
  215. package/dist/lib/local-client-tokens.d.ts.map +1 -1
  216. package/dist/lib/local-client-tokens.js +2 -2
  217. package/dist/lib/logger.js +0 -1
  218. package/dist/lib/model-capability-matrix.js +0 -1
  219. package/dist/lib/named-backup-export.js +0 -1
  220. package/dist/lib/oc-chatgpt-import-adapter.d.ts +1 -1
  221. package/dist/lib/oc-chatgpt-import-adapter.d.ts.map +1 -1
  222. package/dist/lib/oc-chatgpt-import-adapter.js +0 -1
  223. package/dist/lib/oc-chatgpt-orchestrator.d.ts.map +1 -1
  224. package/dist/lib/oc-chatgpt-orchestrator.js +2 -2
  225. package/dist/lib/oc-chatgpt-target-detection.d.ts +1 -1
  226. package/dist/lib/oc-chatgpt-target-detection.d.ts.map +1 -1
  227. package/dist/lib/oc-chatgpt-target-detection.js +0 -1
  228. package/dist/lib/parallel-probe.js +0 -1
  229. package/dist/lib/policy/runtime-policy.js +0 -1
  230. package/dist/lib/preemptive-quota-scheduler.js +0 -1
  231. package/dist/lib/proactive-refresh.js +0 -1
  232. package/dist/lib/prompts/codex-host-bridge.d.ts +0 -8
  233. package/dist/lib/prompts/codex-host-bridge.d.ts.map +1 -1
  234. package/dist/lib/prompts/codex-host-bridge.js +0 -21
  235. package/dist/lib/prompts/codex.d.ts +3 -11
  236. package/dist/lib/prompts/codex.d.ts.map +1 -1
  237. package/dist/lib/prompts/codex.js +6 -13
  238. package/dist/lib/prompts/fetch-utils.d.ts +0 -2
  239. package/dist/lib/prompts/fetch-utils.d.ts.map +1 -1
  240. package/dist/lib/prompts/fetch-utils.js +2 -3
  241. package/dist/lib/prompts/host-codex-prompt.d.ts.map +1 -1
  242. package/dist/lib/prompts/host-codex-prompt.js +2 -2
  243. package/dist/lib/quota-cache.d.ts.map +1 -1
  244. package/dist/lib/quota-cache.js +17 -44
  245. package/dist/lib/quota-probe.js +0 -1
  246. package/dist/lib/quota-readiness.js +0 -1
  247. package/dist/lib/recovery/constants.js +0 -1
  248. package/dist/lib/recovery/index.js +0 -1
  249. package/dist/lib/recovery/storage.d.ts.map +1 -1
  250. package/dist/lib/recovery/storage.js +35 -54
  251. package/dist/lib/recovery/storage.js.map +1 -1
  252. package/dist/lib/recovery/types.d.ts +4 -12
  253. package/dist/lib/recovery/types.d.ts.map +1 -1
  254. package/dist/lib/recovery/types.js +0 -1
  255. package/dist/lib/recovery.d.ts +2 -2
  256. package/dist/lib/recovery.d.ts.map +1 -1
  257. package/dist/lib/recovery.js +0 -1
  258. package/dist/lib/refresh-guardian.js +0 -1
  259. package/dist/lib/refresh-lease.d.ts.map +1 -1
  260. package/dist/lib/refresh-lease.js +1 -4
  261. package/dist/lib/refresh-queue.js +0 -1
  262. package/dist/lib/request/error-classification.d.ts +75 -0
  263. package/dist/lib/request/error-classification.d.ts.map +1 -0
  264. package/dist/lib/request/error-classification.js +295 -0
  265. package/dist/lib/request/failover-config.js +0 -1
  266. package/dist/lib/request/failure-policy.js +0 -1
  267. package/dist/lib/request/fetch-helpers.d.ts +10 -114
  268. package/dist/lib/request/fetch-helpers.d.ts.map +1 -1
  269. package/dist/lib/request/fetch-helpers.js +7 -589
  270. package/dist/lib/request/headers.d.ts +33 -0
  271. package/dist/lib/request/headers.d.ts.map +1 -0
  272. package/dist/lib/request/headers.js +64 -0
  273. package/dist/lib/request/helpers/input-utils.js +0 -1
  274. package/dist/lib/request/helpers/model-map.d.ts +10 -0
  275. package/dist/lib/request/helpers/model-map.d.ts.map +1 -1
  276. package/dist/lib/request/helpers/model-map.js +11 -1
  277. package/dist/lib/request/helpers/tool-utils.js +0 -1
  278. package/dist/lib/request/index.js +0 -1
  279. package/dist/lib/request/rate-limit-backoff.js +0 -1
  280. package/dist/lib/request/rate-limit-decision.d.ts +28 -0
  281. package/dist/lib/request/rate-limit-decision.d.ts.map +1 -0
  282. package/dist/lib/request/rate-limit-decision.js +191 -0
  283. package/dist/lib/request/request-attempt-budget.js +0 -1
  284. package/dist/lib/request/request-init.js +0 -1
  285. package/dist/lib/request/request-resilience.js +0 -1
  286. package/dist/lib/request/request-transformer.js +0 -1
  287. package/dist/lib/request/response-compaction.d.ts +2 -1
  288. package/dist/lib/request/response-compaction.d.ts.map +1 -1
  289. package/dist/lib/request/response-compaction.js +0 -1
  290. package/dist/lib/request/response-handler.js +0 -1
  291. package/dist/lib/request/response-metadata.js +0 -1
  292. package/dist/lib/request/stream-failover-runtime.d.ts +8 -0
  293. package/dist/lib/request/stream-failover-runtime.d.ts.map +1 -0
  294. package/dist/lib/request/stream-failover-runtime.js +171 -0
  295. package/dist/lib/request/stream-failover.js +0 -1
  296. package/dist/lib/request/token-refresh.d.ts +30 -0
  297. package/dist/lib/request/token-refresh.d.ts.map +1 -0
  298. package/dist/lib/request/token-refresh.js +116 -0
  299. package/dist/lib/request/url-rewriting.d.ts +24 -0
  300. package/dist/lib/request/url-rewriting.d.ts.map +1 -0
  301. package/dist/lib/request/url-rewriting.js +153 -0
  302. package/dist/lib/request/wait-utils.js +0 -1
  303. package/dist/lib/rotation.d.ts +2 -4
  304. package/dist/lib/rotation.d.ts.map +1 -1
  305. package/dist/lib/rotation.js +1 -3
  306. package/dist/lib/routing-mutex.js +0 -1
  307. package/dist/lib/routing-profiles.d.ts.map +1 -1
  308. package/dist/lib/routing-profiles.js +2 -2
  309. package/dist/lib/runtime/account-check-helpers.js +0 -1
  310. package/dist/lib/runtime/account-check-types.js +0 -1
  311. package/dist/lib/runtime/account-check.js +0 -1
  312. package/dist/lib/runtime/account-health-check.js +0 -1
  313. package/dist/lib/runtime/account-manager-cache-entry.js +0 -1
  314. package/dist/lib/runtime/account-manager-cache.js +0 -1
  315. package/dist/lib/runtime/account-pool.js +0 -1
  316. package/dist/lib/runtime/account-scope.js +0 -1
  317. package/dist/lib/runtime/account-select-event.js +0 -1
  318. package/dist/lib/runtime/account-selection.js +0 -1
  319. package/dist/lib/runtime/account-state.js +0 -1
  320. package/dist/lib/runtime/account-status.js +0 -1
  321. package/dist/lib/runtime/account-storage-scope-entry.js +0 -1
  322. package/dist/lib/runtime/app-bind.js +0 -1
  323. package/dist/lib/runtime/auth-facade.js +0 -1
  324. package/dist/lib/runtime/browser-oauth-flow.js +0 -1
  325. package/dist/lib/runtime/capability-boost.js +0 -1
  326. package/dist/lib/runtime/config-toml.d.ts +0 -6
  327. package/dist/lib/runtime/config-toml.d.ts.map +1 -1
  328. package/dist/lib/runtime/config-toml.js +6 -7
  329. package/dist/lib/runtime/event-handler.d.ts +0 -31
  330. package/dist/lib/runtime/event-handler.d.ts.map +1 -1
  331. package/dist/lib/runtime/event-handler.js +0 -23
  332. package/dist/lib/runtime/first-run.d.ts +78 -0
  333. package/dist/lib/runtime/first-run.d.ts.map +1 -0
  334. package/dist/lib/runtime/first-run.js +327 -0
  335. package/dist/lib/runtime/flagged-verify-types.js +0 -1
  336. package/dist/lib/runtime/hydrate-emails.js +0 -1
  337. package/dist/lib/runtime/live-sync-entry.js +0 -1
  338. package/dist/lib/runtime/live-sync.js +0 -1
  339. package/dist/lib/runtime/loader-setup.js +0 -1
  340. package/dist/lib/runtime/login-menu-accounts.js +0 -1
  341. package/dist/lib/runtime/manual-oauth-flow.js +0 -1
  342. package/dist/lib/runtime/oauth-browser-flow.js +0 -1
  343. package/dist/lib/runtime/preemptive-quota.js +0 -1
  344. package/dist/lib/runtime/quota-headers.d.ts +1 -6
  345. package/dist/lib/runtime/quota-headers.d.ts.map +1 -1
  346. package/dist/lib/runtime/quota-headers.js +5 -6
  347. package/dist/lib/runtime/quota-probe.js +0 -1
  348. package/dist/lib/runtime/quota-settings.js +0 -1
  349. package/dist/lib/runtime/refresh-guardian-entry.js +0 -1
  350. package/dist/lib/runtime/refresh-guardian.js +0 -1
  351. package/dist/lib/runtime/request-init.js +0 -1
  352. package/dist/lib/runtime/rotation-account-selection.d.ts +38 -0
  353. package/dist/lib/runtime/rotation-account-selection.d.ts.map +1 -0
  354. package/dist/lib/runtime/rotation-account-selection.js +172 -0
  355. package/dist/lib/runtime/rotation-proxy-state.d.ts +54 -0
  356. package/dist/lib/runtime/rotation-proxy-state.d.ts.map +1 -0
  357. package/dist/lib/runtime/rotation-proxy-state.js +56 -0
  358. package/dist/lib/runtime/rotation-server-types.d.ts +57 -0
  359. package/dist/lib/runtime/rotation-server-types.d.ts.map +1 -0
  360. package/dist/lib/runtime/rotation-server-types.js +1 -0
  361. package/dist/lib/runtime/rotation-storage-meta.d.ts +40 -0
  362. package/dist/lib/runtime/rotation-storage-meta.d.ts.map +1 -0
  363. package/dist/lib/runtime/rotation-storage-meta.js +143 -0
  364. package/dist/lib/runtime/rotation-token-refresh.d.ts +25 -0
  365. package/dist/lib/runtime/rotation-token-refresh.d.ts.map +1 -0
  366. package/dist/lib/runtime/rotation-token-refresh.js +99 -0
  367. package/dist/lib/runtime/runtime-current-account.d.ts +3 -3
  368. package/dist/lib/runtime/runtime-current-account.d.ts.map +1 -1
  369. package/dist/lib/runtime/runtime-current-account.js +2 -5
  370. package/dist/lib/runtime/runtime-observability.d.ts +2 -2
  371. package/dist/lib/runtime/runtime-observability.d.ts.map +1 -1
  372. package/dist/lib/runtime/runtime-observability.js +0 -5
  373. package/dist/lib/runtime/runtime-services.js +0 -1
  374. package/dist/lib/runtime/session-affinity-entry.js +0 -1
  375. package/dist/lib/runtime/session-affinity.js +0 -1
  376. package/dist/lib/runtime/session-recovery.js +0 -1
  377. package/dist/lib/runtime/status-marker.js +0 -1
  378. package/dist/lib/runtime/storage-scope.js +0 -1
  379. package/dist/lib/runtime/toast.js +0 -1
  380. package/dist/lib/runtime/ui-runtime-entry.js +0 -1
  381. package/dist/lib/runtime/ui-runtime.js +0 -1
  382. package/dist/lib/runtime/verify-flagged.js +0 -1
  383. package/dist/lib/runtime-constants.js +0 -1
  384. package/dist/lib/runtime-paths.js +0 -1
  385. package/dist/lib/runtime-rotation-proxy.d.ts +7 -124
  386. package/dist/lib/runtime-rotation-proxy.d.ts.map +1 -1
  387. package/dist/lib/runtime-rotation-proxy.js +618 -1356
  388. package/dist/lib/schemas.d.ts +5 -93
  389. package/dist/lib/schemas.d.ts.map +1 -1
  390. package/dist/lib/schemas.js +9 -10
  391. package/dist/lib/session-affinity.js +0 -1
  392. package/dist/lib/shutdown.js +0 -1
  393. package/dist/lib/storage/account-clear-entry.js +0 -1
  394. package/dist/lib/storage/account-clear.js +0 -1
  395. package/dist/lib/storage/account-match-utils.js +0 -1
  396. package/dist/lib/storage/account-persistence.d.ts +1 -1
  397. package/dist/lib/storage/account-persistence.d.ts.map +1 -1
  398. package/dist/lib/storage/account-persistence.js +0 -1
  399. package/dist/lib/storage/account-port.d.ts +1 -1
  400. package/dist/lib/storage/account-port.d.ts.map +1 -1
  401. package/dist/lib/storage/account-port.js +0 -1
  402. package/dist/lib/storage/account-save-entry.d.ts +1 -1
  403. package/dist/lib/storage/account-save-entry.d.ts.map +1 -1
  404. package/dist/lib/storage/account-save-entry.js +0 -1
  405. package/dist/lib/storage/account-save.d.ts +1 -1
  406. package/dist/lib/storage/account-save.d.ts.map +1 -1
  407. package/dist/lib/storage/account-save.js +0 -1
  408. package/dist/lib/storage/account-snapshot.js +0 -1
  409. package/dist/lib/storage/backup-metadata-builder.d.ts +1 -1
  410. package/dist/lib/storage/backup-metadata-builder.d.ts.map +1 -1
  411. package/dist/lib/storage/backup-metadata-builder.js +0 -1
  412. package/dist/lib/storage/backup-metadata.d.ts +13 -0
  413. package/dist/lib/storage/backup-metadata.d.ts.map +1 -1
  414. package/dist/lib/storage/backup-metadata.js +0 -1
  415. package/dist/lib/storage/backup-paths.js +0 -1
  416. package/dist/lib/storage/backup-restore.d.ts +1 -1
  417. package/dist/lib/storage/backup-restore.d.ts.map +1 -1
  418. package/dist/lib/storage/backup-restore.js +0 -1
  419. package/dist/lib/storage/cache-artifacts.js +0 -1
  420. package/dist/lib/storage/error-hints.js +0 -1
  421. package/dist/lib/storage/file-paths.d.ts +2 -2
  422. package/dist/lib/storage/file-paths.d.ts.map +1 -1
  423. package/dist/lib/storage/file-paths.js +2 -3
  424. package/dist/lib/storage/fixture-guards.d.ts +1 -1
  425. package/dist/lib/storage/fixture-guards.d.ts.map +1 -1
  426. package/dist/lib/storage/fixture-guards.js +0 -1
  427. package/dist/lib/storage/flagged-entry.js +0 -1
  428. package/dist/lib/storage/flagged-load-entry.d.ts +1 -1
  429. package/dist/lib/storage/flagged-load-entry.d.ts.map +1 -1
  430. package/dist/lib/storage/flagged-load-entry.js +0 -1
  431. package/dist/lib/storage/flagged-save-entry.d.ts +1 -1
  432. package/dist/lib/storage/flagged-save-entry.d.ts.map +1 -1
  433. package/dist/lib/storage/flagged-save-entry.js +0 -1
  434. package/dist/lib/storage/flagged-storage-file.d.ts +1 -1
  435. package/dist/lib/storage/flagged-storage-file.d.ts.map +1 -1
  436. package/dist/lib/storage/flagged-storage-file.js +0 -1
  437. package/dist/lib/storage/flagged-storage-io.d.ts +1 -1
  438. package/dist/lib/storage/flagged-storage-io.d.ts.map +1 -1
  439. package/dist/lib/storage/flagged-storage-io.js +2 -3
  440. package/dist/lib/storage/flagged-storage.d.ts +1 -1
  441. package/dist/lib/storage/flagged-storage.d.ts.map +1 -1
  442. package/dist/lib/storage/flagged-storage.js +15 -2
  443. package/dist/lib/storage/flagged-storage.js.map +1 -1
  444. package/dist/lib/storage/gitignore.js +0 -1
  445. package/dist/lib/storage/hash.js +0 -1
  446. package/dist/lib/storage/health.js +0 -1
  447. package/dist/lib/storage/identity.js +0 -1
  448. package/dist/lib/storage/import-export.d.ts +1 -1
  449. package/dist/lib/storage/import-export.d.ts.map +1 -1
  450. package/dist/lib/storage/import-export.js +2 -3
  451. package/dist/lib/storage/metadata-section.js +0 -1
  452. package/dist/lib/storage/migrations.d.ts +7 -49
  453. package/dist/lib/storage/migrations.d.ts.map +1 -1
  454. package/dist/lib/storage/migrations.js +5 -2
  455. package/dist/lib/storage/named-backup-entry.js +0 -1
  456. package/dist/lib/storage/named-backups-entry.d.ts +1 -1
  457. package/dist/lib/storage/named-backups-entry.d.ts.map +1 -1
  458. package/dist/lib/storage/named-backups-entry.js +0 -1
  459. package/dist/lib/storage/named-backups.js +0 -1
  460. package/dist/lib/storage/path-state.js +0 -1
  461. package/dist/lib/storage/paths.js +0 -1
  462. package/dist/lib/storage/project-migration.d.ts +1 -1
  463. package/dist/lib/storage/project-migration.d.ts.map +1 -1
  464. package/dist/lib/storage/project-migration.js +0 -1
  465. package/dist/lib/storage/public-types.d.ts +70 -0
  466. package/dist/lib/storage/public-types.d.ts.map +1 -0
  467. package/dist/lib/storage/public-types.js +6 -0
  468. package/dist/lib/storage/record-utils.js +0 -1
  469. package/dist/lib/storage/restore-assessment.d.ts +1 -1
  470. package/dist/lib/storage/restore-assessment.d.ts.map +1 -1
  471. package/dist/lib/storage/restore-assessment.js +0 -1
  472. package/dist/lib/storage/restore-backup-entry.d.ts +1 -1
  473. package/dist/lib/storage/restore-backup-entry.d.ts.map +1 -1
  474. package/dist/lib/storage/restore-backup-entry.js +0 -1
  475. package/dist/lib/storage/restore-metadata.d.ts +1 -1
  476. package/dist/lib/storage/restore-metadata.d.ts.map +1 -1
  477. package/dist/lib/storage/restore-metadata.js +0 -1
  478. package/dist/lib/storage/restore.d.ts +1 -1
  479. package/dist/lib/storage/restore.d.ts.map +1 -1
  480. package/dist/lib/storage/restore.js +0 -1
  481. package/dist/lib/storage/save-retry.d.ts +10 -0
  482. package/dist/lib/storage/save-retry.d.ts.map +1 -0
  483. package/dist/lib/storage/save-retry.js +26 -0
  484. package/dist/lib/storage/snapshot-inspectors.d.ts +1 -1
  485. package/dist/lib/storage/snapshot-inspectors.d.ts.map +1 -1
  486. package/dist/lib/storage/snapshot-inspectors.js +0 -1
  487. package/dist/lib/storage/storage-parser.d.ts +1 -1
  488. package/dist/lib/storage/storage-parser.d.ts.map +1 -1
  489. package/dist/lib/storage/storage-parser.js +0 -1
  490. package/dist/lib/storage/transactions.d.ts +1 -1
  491. package/dist/lib/storage/transactions.d.ts.map +1 -1
  492. package/dist/lib/storage/transactions.js +0 -1
  493. package/dist/lib/storage.d.ts +3 -24
  494. package/dist/lib/storage.d.ts.map +1 -1
  495. package/dist/lib/storage.js +47 -55
  496. package/dist/lib/table-formatter.js +0 -1
  497. package/dist/lib/temp-path.d.ts +26 -0
  498. package/dist/lib/temp-path.d.ts.map +1 -0
  499. package/dist/lib/temp-path.js +30 -0
  500. package/dist/lib/tools/hashline-tools.js +0 -1
  501. package/dist/lib/types.js +0 -1
  502. package/dist/lib/ui/ansi.js +0 -1
  503. package/dist/lib/ui/auth-menu-builder.d.ts +89 -0
  504. package/dist/lib/ui/auth-menu-builder.d.ts.map +1 -0
  505. package/dist/lib/ui/auth-menu-builder.js +350 -0
  506. package/dist/lib/ui/auth-menu.d.ts +2 -76
  507. package/dist/lib/ui/auth-menu.d.ts.map +1 -1
  508. package/dist/lib/ui/auth-menu.js +3 -349
  509. package/dist/lib/ui/confirm.js +0 -1
  510. package/dist/lib/ui/display-width.js +0 -1
  511. package/dist/lib/ui/format.js +0 -1
  512. package/dist/lib/ui/index.d.ts +10 -0
  513. package/dist/lib/ui/index.d.ts.map +1 -0
  514. package/dist/lib/ui/index.js +9 -0
  515. package/dist/lib/ui/runtime.js +0 -1
  516. package/dist/lib/ui/select.js +0 -1
  517. package/dist/lib/ui/theme.d.ts +3 -2
  518. package/dist/lib/ui/theme.d.ts.map +1 -1
  519. package/dist/lib/ui/theme.js +0 -1
  520. package/dist/lib/ui/ui-copy.d.ts +159 -0
  521. package/dist/lib/ui/ui-copy.d.ts.map +1 -0
  522. package/dist/lib/ui/ui-copy.js +163 -0
  523. package/dist/lib/unified-settings.d.ts.map +1 -1
  524. package/dist/lib/unified-settings.js +2 -2
  525. package/dist/lib/update-notice.d.ts.map +1 -1
  526. package/dist/lib/update-notice.js +2 -2
  527. package/dist/lib/usage/index.js +0 -1
  528. package/dist/lib/usage/ledger.js +0 -1
  529. package/dist/lib/usage/pricing.js +0 -1
  530. package/dist/lib/usage/redaction.js +0 -1
  531. package/dist/lib/usage/types.js +0 -1
  532. package/dist/lib/utils.js +0 -1
  533. package/package.json +8 -9
  534. package/scripts/postinstall.js +34 -265
  535. package/scripts/preuninstall.js +2 -2
@@ -0,0 +1,172 @@
1
+ /**
2
+ * `chooseAccount` is a SYNC selector that internally advances the rotation
3
+ * cursor (the session-affinity-preferred branch and the round-robin fallback
4
+ * both call `accountManager.markSwitched(...)`, and the hybrid selector advances
5
+ * its own cursor). It does NOT acquire the routing mutex itself.
6
+ *
7
+ * Concurrency (L4): when `routingMutex === "enabled"`, the proxy hot path runs
8
+ * this whole call AND the subsequent `markSwitchedLocked` commit inside a single
9
+ * `withRoutingMutex` acquisition, so concurrent requests serialize selection +
10
+ * cursor advance and cannot stampede the same account. `withRoutingMutex` is
11
+ * reentrant (AsyncLocalStorage), so the nested `markSwitchedLocked` — and the
12
+ * later one in `persistRuntimeActiveAccount` — run inline without re-acquiring
13
+ * the non-reentrant FIFO queue (no deadlock). In legacy mode the inline
14
+ * `markSwitched` calls below are used unchanged and no lock is taken, so default
15
+ * behavior and perf are identical. See the hot-path caller in
16
+ * `startRuntimeRotationProxy` and the regression in
17
+ * `test/runtime-rotation-proxy.test.ts`.
18
+ */
19
+ export function chooseAccount(params) {
20
+ const { accountManager, sessionAffinityStore, sessionKey, family, model, attemptedIndexes, now, policy, pinnedIndex, skipReasons, stickyBoostByAccount, pidOffsetEnabled, schedulingStrategy, } = params;
21
+ // Manual pin (from `codex-multi-auth switch <n>`) overrides every other
22
+ // selection signal. We do NOT call markSwitched here — the proxy must not
23
+ // clobber the pin set by the CLI. See issue #474.
24
+ if (typeof pinnedIndex === "number") {
25
+ if (attemptedIndexes.has(pinnedIndex)) {
26
+ skipReasons?.set(pinnedIndex, "already-attempted");
27
+ return null;
28
+ }
29
+ if (pinnedIndex < 0 || pinnedIndex >= accountManager.getAccountCount()) {
30
+ skipReasons?.set(pinnedIndex, "missing");
31
+ return null;
32
+ }
33
+ if (policy?.blockedAccountIndexes.has(pinnedIndex)) {
34
+ skipReasons?.set(pinnedIndex, "policy-blocked");
35
+ return null;
36
+ }
37
+ const pinned = accountManager.getAccountByIndex(pinnedIndex);
38
+ if (!pinned || pinned.enabled === false) {
39
+ skipReasons?.set(pinnedIndex, "disabled");
40
+ return null;
41
+ }
42
+ const reason = accountManager.getAccountRuntimeSkipReason(pinnedIndex, family, model);
43
+ if (reason) {
44
+ skipReasons?.set(pinnedIndex, reason);
45
+ return null;
46
+ }
47
+ return pinned;
48
+ }
49
+ // Sequential / drain-first mode (issue #509): the active account governs ALL
50
+ // new requests, so we deliberately SKIP the per-session affinity tier — there
51
+ // is no per-chat stickiness, every request follows the single active account.
52
+ // The manual pin above still wins (handled first). When the active account is
53
+ // exhausted the selector advances to the next available account and earlier
54
+ // accounts reclaim the slot once their quota recovers.
55
+ if (schedulingStrategy === "sequential") {
56
+ const selected = accountManager.getCurrentOrNextForFamilySequential(family, model, policy?.blockedAccountIndexes);
57
+ if (selected &&
58
+ !attemptedIndexes.has(selected.index) &&
59
+ !policy?.blockedAccountIndexes.has(selected.index)) {
60
+ const reason = accountManager.getAccountRuntimeSkipReason(selected.index, family, model);
61
+ if (!reason)
62
+ return selected;
63
+ skipReasons?.set(selected.index, reason);
64
+ }
65
+ // Active account was attempted/blocked/skipped this request (e.g. it just
66
+ // rate-limited mid-loop): fall through to the shared linear scan to find
67
+ // the next eligible account to TRY. Pass advanceActivePointer=false so a
68
+ // transient, non-exhausting failure on the active account does not
69
+ // permanently move the drain-first primary — only
70
+ // getCurrentOrNextForFamilySequential advances it, and only on true
71
+ // exhaustion.
72
+ return chooseLinearScanFallback({
73
+ accountManager,
74
+ family,
75
+ model,
76
+ attemptedIndexes,
77
+ policy,
78
+ skipReasons,
79
+ advanceActivePointer: false,
80
+ });
81
+ }
82
+ const preferredIndex = sessionAffinityStore?.getPreferredAccountIndex(sessionKey, now);
83
+ if (typeof preferredIndex === "number" &&
84
+ !attemptedIndexes.has(preferredIndex) &&
85
+ !policy?.blockedAccountIndexes.has(preferredIndex)) {
86
+ const preferred = accountManager.getAccountByIndex(preferredIndex);
87
+ if (preferred) {
88
+ const reason = accountManager.getAccountRuntimeSkipReason(preferred.index, family, model);
89
+ if (reason) {
90
+ skipReasons?.set(preferred.index, reason);
91
+ }
92
+ else {
93
+ // L4 (deferred): unlocked cursor mutation — see chooseAccount header.
94
+ accountManager.markSwitched(preferred, "rotation", family);
95
+ return preferred;
96
+ }
97
+ }
98
+ }
99
+ const selected = accountManager.getCurrentOrNextForFamilyHybrid(family, model, {
100
+ scoreBoostByAccount: {
101
+ ...(policy?.scoreBoostByAccount ?? {}),
102
+ ...(stickyBoostByAccount ?? {}),
103
+ },
104
+ // accounts-05: carry the PID-offset distribution into the default-on proxy
105
+ // path too (index.ts already does). Without it, parallel proxy processes can
106
+ // stampede the same account instead of spreading across the pool.
107
+ pidOffsetEnabled,
108
+ });
109
+ if (selected &&
110
+ !attemptedIndexes.has(selected.index) &&
111
+ !policy?.blockedAccountIndexes.has(selected.index)) {
112
+ const reason = accountManager.getAccountRuntimeSkipReason(selected.index, family, model);
113
+ if (!reason)
114
+ return selected;
115
+ skipReasons?.set(selected.index, reason);
116
+ }
117
+ return chooseLinearScanFallback({
118
+ accountManager,
119
+ family,
120
+ model,
121
+ attemptedIndexes,
122
+ policy,
123
+ skipReasons,
124
+ });
125
+ }
126
+ /**
127
+ * Shared linear-scan fallback used by both the hybrid and sequential selection
128
+ * paths in `chooseAccount`. Walks every account in pool order and returns the
129
+ * first one that is not already attempted, not policy-blocked, and has no
130
+ * runtime skip reason (rate-limited / cooling down / circuit-open), recording a
131
+ * skip reason for each rejected candidate. Returns null when no eligible
132
+ * account remains.
133
+ *
134
+ * `advanceActivePointer` (default `true`) controls whether the winner is
135
+ * committed as the new active/cursor position via `markSwitched`. The hybrid
136
+ * path wants this (round-robin advance). The sequential path passes `false`:
137
+ * its within-request fallback only needs an account to TRY this request, and
138
+ * must NOT move `currentAccountIndexByFamily` — otherwise a transient,
139
+ * non-exhausting failure on the active account (which leaves it `isUsable` but
140
+ * present in `attemptedIndexes`) would permanently switch the drain-first
141
+ * primary even though it was never exhausted (issue #509 regression caught in
142
+ * review). In sequential mode only `getCurrentOrNextForFamilySequential` is
143
+ * allowed to advance the active pointer, and only on true exhaustion.
144
+ */
145
+ function chooseLinearScanFallback(params) {
146
+ const { accountManager, family, model, attemptedIndexes, policy, skipReasons, advanceActivePointer = true, } = params;
147
+ for (const account of accountManager.getAccountsSnapshot()) {
148
+ if (attemptedIndexes.has(account.index)) {
149
+ skipReasons?.set(account.index, "already-attempted");
150
+ continue;
151
+ }
152
+ if (policy?.blockedAccountIndexes.has(account.index)) {
153
+ skipReasons?.set(account.index, "policy-blocked");
154
+ continue;
155
+ }
156
+ const reason = accountManager.getAccountRuntimeSkipReason(account.index, family, model);
157
+ if (!reason) {
158
+ const live = accountManager.getAccountByIndex(account.index);
159
+ if (!live)
160
+ continue;
161
+ // L4 (deferred): unlocked cursor mutation — see chooseAccount header.
162
+ // Skipped in sequential mode (advanceActivePointer=false) so a
163
+ // within-request retry never reassigns the drain-first primary.
164
+ if (advanceActivePointer) {
165
+ accountManager.markSwitched(live, "rotation", family);
166
+ }
167
+ return live;
168
+ }
169
+ skipReasons?.set(account.index, reason);
170
+ }
171
+ return null;
172
+ }
@@ -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"}