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,378 @@
1
+ import { extractAccountId, sanitizeEmail } from "../accounts.js";
2
+ import { loadCodexCliState } from "../codex-cli/state.js";
3
+ import { setCodexCliActiveSelection } from "../codex-cli/writer.js";
4
+ import { DEFAULT_DASHBOARD_DISPLAY_SETTINGS, } from "../dashboard-settings.js";
5
+ import { loadQuotaCache, saveQuotaCache, } from "../quota-cache.js";
6
+ import { fetchCodexQuotaSnapshot, } from "../quota-probe.js";
7
+ import { buildQuotaEmailFallbackState, hasSafeQuotaEmailFallback, hasUniqueQuotaAccountId, isQuotaCacheEntryExhausted, normalizeQuotaAccountId, quotaLeftPercentFromUsed, } from "../quota-readiness.js";
8
+ import { resolveActiveIndex } from "../runtime/account-status.js";
9
+ import { getAppBindStatus } from "../runtime/app-bind.js";
10
+ import { isDisplayCurrentAccount, readAppRuntimeHelperAccountSignal, resolveAccountCurrentMarkers, resolveRuntimeCurrentAccount, } from "../runtime/runtime-current-account.js";
11
+ import { loadPersistedRuntimeObservabilitySnapshot } from "../runtime/runtime-observability.js";
12
+ import { hasUsableAccessToken } from "./account-credentials.js";
13
+ import { formatAccountQuotaSummary, formatRateLimitEntry, } from "./formatters/index.js";
14
+ import { cloneQuotaCacheData, DEFAULT_LIVE_PROBE_MODEL, getPersistedQuotaViewForAccount, updateQuotaCacheForAccount, } from "./quota-cache-helpers.js";
15
+ import { resolveMenuLayoutMode } from "./settings-hub.js";
16
+ /**
17
+ * Data layer for the login dashboard menu: quota auto-refresh targeting, the
18
+ * account-row view model (`ExistingAccountInfo`), runtime current-account
19
+ * resolution, and Codex CLI selection drift sync. Moved verbatim out of the
20
+ * `login` handler body in lib/codex-manager.ts (audit roadmap §4.1.1 phase 3).
21
+ * The interactive login control loop itself still lives in codex-manager.ts.
22
+ */
23
+ export const DEFAULT_MENU_QUOTA_REFRESH_TTL_MS = 5 * 60_000;
24
+ const MENU_QUOTA_REFRESH_MODEL = DEFAULT_LIVE_PROBE_MODEL;
25
+ function resolveMenuQuotaProbeInput(account, cache, maxAgeMs, now, accounts, emailFallbackState = buildQuotaEmailFallbackState(accounts)) {
26
+ if (account.enabled === false)
27
+ return null;
28
+ if (!hasUsableAccessToken(account, now))
29
+ return null;
30
+ const existing = getPersistedQuotaViewForAccount(cache, account, accounts, now, emailFallbackState);
31
+ if (existing &&
32
+ typeof existing.updatedAt === "number" &&
33
+ Number.isFinite(existing.updatedAt) &&
34
+ now - existing.updatedAt < maxAgeMs) {
35
+ return null;
36
+ }
37
+ // Menu auto-refresh is cache-backed, so only probe when the result can be
38
+ // written behind a safe lookup key for later reuse.
39
+ const canStore = (normalizeQuotaAccountId(account.accountId) !== null &&
40
+ hasUniqueQuotaAccountId(accounts, account)) ||
41
+ hasSafeQuotaEmailFallback(emailFallbackState, account);
42
+ if (!canStore)
43
+ return null;
44
+ const accessToken = account.accessToken;
45
+ const accountId = accessToken
46
+ ? (account.accountId ?? extractAccountId(accessToken))
47
+ : account.accountId;
48
+ if (!accountId || !accessToken)
49
+ return null;
50
+ return { accountId, accessToken };
51
+ }
52
+ function collectMenuQuotaRefreshTargets(storage, cache, maxAgeMs, now = Date.now(), emailFallbackState = buildQuotaEmailFallbackState(storage.accounts)) {
53
+ const targets = [];
54
+ for (const account of storage.accounts) {
55
+ const probeInput = resolveMenuQuotaProbeInput(account, cache, maxAgeMs, now, storage.accounts, emailFallbackState);
56
+ if (!probeInput)
57
+ continue;
58
+ targets.push({
59
+ account,
60
+ accountId: probeInput.accountId,
61
+ accessToken: probeInput.accessToken,
62
+ });
63
+ }
64
+ return targets;
65
+ }
66
+ export function countMenuQuotaRefreshTargets(storage, cache, maxAgeMs, now = Date.now()) {
67
+ const emailFallbackState = buildQuotaEmailFallbackState(storage.accounts);
68
+ let count = 0;
69
+ for (const account of storage.accounts) {
70
+ if (resolveMenuQuotaProbeInput(account, cache, maxAgeMs, now, storage.accounts, emailFallbackState)) {
71
+ count += 1;
72
+ }
73
+ }
74
+ return count;
75
+ }
76
+ export async function refreshQuotaCacheForMenu(storage, cache, maxAgeMs, onProgress) {
77
+ if (storage.accounts.length === 0) {
78
+ return cache;
79
+ }
80
+ const emailFallbackState = buildQuotaEmailFallbackState(storage.accounts);
81
+ const nextCache = cloneQuotaCacheData(cache);
82
+ const now = Date.now();
83
+ const targets = collectMenuQuotaRefreshTargets(storage, nextCache, maxAgeMs, now, emailFallbackState);
84
+ const total = targets.length;
85
+ let processed = 0;
86
+ onProgress?.(processed, total);
87
+ let changed = false;
88
+ const appliedSnapshots = [];
89
+ for (const target of targets) {
90
+ processed += 1;
91
+ onProgress?.(processed, total);
92
+ try {
93
+ const snapshot = await fetchCodexQuotaSnapshot({
94
+ accountId: target.accountId,
95
+ accessToken: target.accessToken,
96
+ model: MENU_QUOTA_REFRESH_MODEL,
97
+ });
98
+ const applied = updateQuotaCacheForAccount(nextCache, target.account, snapshot, storage.accounts, emailFallbackState);
99
+ if (applied)
100
+ appliedSnapshots.push({ account: target.account, snapshot });
101
+ changed = applied || changed;
102
+ }
103
+ catch {
104
+ // Keep existing cached values if probing fails.
105
+ }
106
+ }
107
+ if (changed) {
108
+ // The probes above ran against a snapshot clone of the cache the menu
109
+ // loaded; another writer (a deep check, a second session) may have saved
110
+ // entries meanwhile, and writing the stale clone back whole-file would
111
+ // silently discard them (last write wins). Re-apply this run's results
112
+ // onto the freshest persisted cache instead.
113
+ //
114
+ // loadQuotaCache() is documented to never throw — on any read failure it
115
+ // returns empty maps. We also guard the empty-maps case explicitly: if the
116
+ // persisted cache came back empty (read failure / empty file), fall back to
117
+ // nextCache so non-probed entries are not wiped. The try/catch handles any
118
+ // mocked or future implementation that does throw.
119
+ let cacheToSave = nextCache;
120
+ try {
121
+ const persisted = await loadQuotaCache();
122
+ const persistedHasData = Object.keys(persisted.byAccountId).length > 0 ||
123
+ Object.keys(persisted.byEmail).length > 0;
124
+ if (persistedHasData) {
125
+ for (const { account, snapshot } of appliedSnapshots) {
126
+ updateQuotaCacheForAccount(persisted, account, snapshot, storage.accounts, emailFallbackState);
127
+ }
128
+ cacheToSave = persisted;
129
+ }
130
+ // else: persisted came back empty; keep cacheToSave = nextCache.
131
+ }
132
+ catch {
133
+ // loadQuotaCache threw (unexpected); fall back to the snapshot clone
134
+ // so non-probed entries survive.
135
+ }
136
+ try {
137
+ await saveQuotaCache(cacheToSave);
138
+ }
139
+ catch (error) {
140
+ // Quota cache is a derived artifact; a transient Windows EBUSY/EPERM
141
+ // here must not fail the menu refresh, but it should not vanish into
142
+ // the caller's background .catch either (same pattern as the health
143
+ // check's save).
144
+ console.warn(`Quota cache save failed: ${error instanceof Error ? error.message : String(error)}`);
145
+ }
146
+ return cacheToSave;
147
+ }
148
+ return nextCache;
149
+ }
150
+ function mapAccountStatus(account, isCurrentAccount, now, persistedQuotaEntry) {
151
+ if (account.enabled === false)
152
+ return "disabled";
153
+ if (typeof account.coolingDownUntil === "number" &&
154
+ account.coolingDownUntil > now) {
155
+ return "cooldown";
156
+ }
157
+ if (persistedQuotaEntry && isQuotaCacheEntryExhausted(persistedQuotaEntry, now)) {
158
+ return "quota-exhausted";
159
+ }
160
+ if (persistedQuotaEntry?.status === 429)
161
+ return "rate-limited";
162
+ const rateLimit = formatRateLimitEntry(account, now, "codex");
163
+ if (rateLimit)
164
+ return "rate-limited";
165
+ if (isCurrentAccount)
166
+ return "active";
167
+ return "ok";
168
+ }
169
+ function parseLeftPercentFromQuotaSummary(summary, windowLabel) {
170
+ if (!summary)
171
+ return -1;
172
+ const match = summary.match(new RegExp(`(?:^|\\|)\\s*${windowLabel}\\s+(\\d{1,3})%`, "i"));
173
+ const value = Number.parseInt(match?.[1] ?? "", 10);
174
+ if (!Number.isFinite(value))
175
+ return -1;
176
+ return Math.max(0, Math.min(100, value));
177
+ }
178
+ function readQuotaLeftPercent(account, windowLabel) {
179
+ const direct = windowLabel === "5h"
180
+ ? account.quota5hLeftPercent
181
+ : account.quota7dLeftPercent;
182
+ if (typeof direct === "number" && Number.isFinite(direct)) {
183
+ return Math.max(0, Math.min(100, Math.round(direct)));
184
+ }
185
+ return parseLeftPercentFromQuotaSummary(account.quotaSummary, windowLabel);
186
+ }
187
+ function readQuotaFloorPercent(account) {
188
+ return Math.min(readQuotaLeftPercent(account, "5h"), readQuotaLeftPercent(account, "7d"));
189
+ }
190
+ function accountStatusSortBucket(status) {
191
+ switch (status) {
192
+ case "active":
193
+ case "ok":
194
+ return 0;
195
+ case "unknown":
196
+ return 1;
197
+ case "quota-exhausted":
198
+ case "cooldown":
199
+ case "rate-limited":
200
+ return 2;
201
+ case "disabled":
202
+ case "error":
203
+ case "flagged":
204
+ return 3;
205
+ default:
206
+ return 1;
207
+ }
208
+ }
209
+ function accountReadinessSortBucket(account) {
210
+ const statusBucket = accountStatusSortBucket(account.status);
211
+ if (statusBucket >= 2)
212
+ return statusBucket;
213
+ return account.quotaRateLimited || account.quotaExhausted ? 2 : statusBucket;
214
+ }
215
+ function compareReadyFirstAccounts(left, right) {
216
+ const bucketDelta = accountReadinessSortBucket(left) - accountReadinessSortBucket(right);
217
+ if (bucketDelta !== 0)
218
+ return bucketDelta;
219
+ const leftFloor = readQuotaFloorPercent(left);
220
+ const rightFloor = readQuotaFloorPercent(right);
221
+ if (leftFloor !== rightFloor)
222
+ return rightFloor - leftFloor;
223
+ const left5h = readQuotaLeftPercent(left, "5h");
224
+ const right5h = readQuotaLeftPercent(right, "5h");
225
+ if (left5h !== right5h)
226
+ return right5h - left5h;
227
+ const left7d = readQuotaLeftPercent(left, "7d");
228
+ const right7d = readQuotaLeftPercent(right, "7d");
229
+ if (left7d !== right7d)
230
+ return right7d - left7d;
231
+ const leftLastUsed = left.lastUsed ?? 0;
232
+ const rightLastUsed = right.lastUsed ?? 0;
233
+ if (leftLastUsed !== rightLastUsed)
234
+ return rightLastUsed - leftLastUsed;
235
+ const leftSource = left.sourceIndex ?? left.index;
236
+ const rightSource = right.sourceIndex ?? right.index;
237
+ return leftSource - rightSource;
238
+ }
239
+ function applyAccountMenuOrdering(accounts, displaySettings) {
240
+ const sortEnabled = displaySettings.menuSortEnabled ??
241
+ DEFAULT_DASHBOARD_DISPLAY_SETTINGS.menuSortEnabled ??
242
+ true;
243
+ const sortMode = displaySettings.menuSortMode ??
244
+ DEFAULT_DASHBOARD_DISPLAY_SETTINGS.menuSortMode ??
245
+ "ready-first";
246
+ if (!sortEnabled || sortMode !== "ready-first") {
247
+ return [...accounts];
248
+ }
249
+ const sorted = [...accounts].sort(compareReadyFirstAccounts);
250
+ const pinCurrent = displaySettings.menuSortPinCurrent ??
251
+ DEFAULT_DASHBOARD_DISPLAY_SETTINGS.menuSortPinCurrent ??
252
+ false;
253
+ if (pinCurrent) {
254
+ const currentIndex = sorted.findIndex((account) => account.isCurrentAccount);
255
+ if (currentIndex > 0) {
256
+ const current = sorted.splice(currentIndex, 1)[0];
257
+ const first = sorted[0];
258
+ if (current && first && compareReadyFirstAccounts(current, first) <= 0) {
259
+ sorted.unshift(current);
260
+ }
261
+ else if (current) {
262
+ sorted.splice(currentIndex, 0, current);
263
+ }
264
+ }
265
+ }
266
+ return sorted;
267
+ }
268
+ export function toExistingAccountInfo(storage, quotaCache, displaySettings, runtimeCurrent = null) {
269
+ const now = Date.now();
270
+ const activeIndex = resolveActiveIndex(storage, "codex");
271
+ const layoutMode = resolveMenuLayoutMode(displaySettings);
272
+ const emailFallbackState = buildQuotaEmailFallbackState(storage.accounts);
273
+ const baseAccounts = storage.accounts.map((account, index) => {
274
+ const entry = getPersistedQuotaViewForAccount(quotaCache, account, storage.accounts, now, emailFallbackState);
275
+ const currentMarkers = resolveAccountCurrentMarkers(index, activeIndex, runtimeCurrent);
276
+ const isCurrentAccount = isDisplayCurrentAccount(index, activeIndex, runtimeCurrent);
277
+ const quotaExhausted = entry ? isQuotaCacheEntryExhausted(entry, now) : false;
278
+ return {
279
+ index,
280
+ sourceIndex: index,
281
+ accountId: account.accountId,
282
+ accountLabel: account.accountLabel,
283
+ email: account.email,
284
+ addedAt: account.addedAt,
285
+ lastUsed: account.lastUsed,
286
+ status: mapAccountStatus(account, isCurrentAccount, now, entry),
287
+ quotaSummary: (displaySettings.menuShowQuotaSummary ?? true) && entry
288
+ ? formatAccountQuotaSummary(entry, now)
289
+ : undefined,
290
+ quota5hLeftPercent: quotaLeftPercentFromUsed(entry?.primary.usedPercent),
291
+ quota5hResetAtMs: entry?.primary.resetAtMs,
292
+ quota7dLeftPercent: quotaLeftPercentFromUsed(entry?.secondary.usedPercent),
293
+ quota7dResetAtMs: entry?.secondary.resetAtMs,
294
+ quotaRateLimited: entry?.status === 429,
295
+ quotaExhausted,
296
+ isCurrentAccount,
297
+ isDefaultAccount: index === activeIndex,
298
+ isRuntimeCurrentAccount: runtimeCurrent?.index === index,
299
+ currentMarkers,
300
+ enabled: account.enabled !== false,
301
+ showStatusBadge: displaySettings.menuShowStatusBadge ?? true,
302
+ showCurrentBadge: displaySettings.menuShowCurrentBadge ?? true,
303
+ showLastUsed: displaySettings.menuShowLastUsed ?? true,
304
+ showQuotaCooldown: displaySettings.menuShowQuotaCooldown ?? true,
305
+ showHintsForUnselectedRows: layoutMode === "expanded-rows",
306
+ highlightCurrentRow: displaySettings.menuHighlightCurrentRow ?? true,
307
+ focusStyle: displaySettings.menuFocusStyle ?? "row-invert",
308
+ statuslineFields: displaySettings.menuStatuslineFields ?? [
309
+ "last-used",
310
+ "limits",
311
+ "status",
312
+ ],
313
+ };
314
+ });
315
+ const orderedAccounts = applyAccountMenuOrdering(baseAccounts, displaySettings);
316
+ const quickSwitchUsesVisibleRows = displaySettings.menuSortQuickSwitchVisibleRow ?? true;
317
+ return orderedAccounts.map((account, displayIndex) => ({
318
+ ...account,
319
+ index: displayIndex,
320
+ quickSwitchNumber: quickSwitchUsesVisibleRows
321
+ ? displayIndex + 1
322
+ : (account.sourceIndex ?? displayIndex) + 1,
323
+ }));
324
+ }
325
+ export async function loadRuntimeCurrentSelectionForStorage(storage, now = Date.now()) {
326
+ const [runtimeSnapshot, appBindStatus] = await Promise.all([
327
+ loadPersistedRuntimeObservabilitySnapshot().catch(() => null),
328
+ getAppBindStatus()
329
+ .then((status) => (status.running ? status.router : null))
330
+ .catch(() => null),
331
+ ]);
332
+ return resolveRuntimeCurrentAccount(storage, {
333
+ runtimeSnapshot,
334
+ appBindStatus,
335
+ appHelperStatus: readAppRuntimeHelperAccountSignal(),
336
+ }, { now });
337
+ }
338
+ function activeAccountMatchesCodexCliState(account, state) {
339
+ if (!state)
340
+ return true;
341
+ const accountId = account.accountId?.trim();
342
+ const activeAccountId = state.activeAccountId?.trim();
343
+ if (accountId && activeAccountId) {
344
+ return accountId === activeAccountId;
345
+ }
346
+ const email = sanitizeEmail(account.email);
347
+ const activeEmail = sanitizeEmail(state.activeEmail);
348
+ if (email && activeEmail) {
349
+ return email === activeEmail;
350
+ }
351
+ return false;
352
+ }
353
+ export async function syncCodexCliActiveSelectionIfDrifted(storage) {
354
+ const activeIndex = resolveActiveIndex(storage, "codex");
355
+ if (activeIndex < 0 || activeIndex >= storage.accounts.length) {
356
+ return false;
357
+ }
358
+ const account = storage.accounts[activeIndex];
359
+ if (!account) {
360
+ return false;
361
+ }
362
+ try {
363
+ const cliState = await loadCodexCliState({ forceRefresh: true });
364
+ if (!cliState || activeAccountMatchesCodexCliState(account, cliState)) {
365
+ return false;
366
+ }
367
+ return setCodexCliActiveSelection({
368
+ accountId: account.accountId,
369
+ email: account.email,
370
+ accessToken: account.accessToken,
371
+ refreshToken: account.refreshToken,
372
+ expiresAt: account.expiresAt,
373
+ });
374
+ }
375
+ catch {
376
+ return false;
377
+ }
378
+ }
@@ -0,0 +1,55 @@
1
+ import { type Workspace } from "../accounts.js";
2
+ import type { AccountIdSource, TokenResult } from "../types.js";
3
+ import { type AccountPoolWriteOutcome } from "./account-pool-write.js";
4
+ /**
5
+ * OAuth/device sign-in plumbing for the login dashboard: authorization-flow
6
+ * execution, manual callback entry, account-id selection for fresh tokens, and
7
+ * account-pool persistence of sign-in results. Moved verbatim out of
8
+ * lib/codex-manager.ts (audit roadmap §4.1.1 phase 4).
9
+ */
10
+ /** @internal */
11
+ export type TokenSuccess = Extract<TokenResult, {
12
+ type: "success";
13
+ }>;
14
+ /** @internal */
15
+ export type TokenSuccessWithAccount = TokenSuccess & {
16
+ accountIdOverride?: string;
17
+ accountIdSource?: AccountIdSource;
18
+ accountLabel?: string;
19
+ workspaces?: Workspace[];
20
+ };
21
+ /** @internal */
22
+ export declare function isOAuthCancellation(result: Exclude<TokenResult, {
23
+ type: "success";
24
+ }>): boolean;
25
+ /** @internal */
26
+ export declare function isAbortError(error: unknown): boolean;
27
+ /**
28
+ * Resolve the account-id selection for freshly-minted tokens.
29
+ *
30
+ * The org-override precedence (explicit `login --org` wins over the ambient
31
+ * CODEX_AUTH_ACCOUNT_ID env, for this call only) lives in the internal
32
+ * lib/auth/org-override.ts module so it can be unit-tested without exporting this
33
+ * CLI-internal function. Threading the org as a parameter avoids mutating
34
+ * process.env for the duration of a login, which raced on concurrent re-entry.
35
+ *
36
+ * @internal
37
+ */
38
+ export declare function resolveAccountSelection(tokens: TokenSuccess, orgOverride?: string): TokenSuccessWithAccount;
39
+ /** @internal */
40
+ export type OAuthSignInMode = "browser" | "manual" | "device" | "restore-backup" | "cancel";
41
+ /** @internal */
42
+ export type SignInFlowOptions = {
43
+ timeoutMs?: number;
44
+ };
45
+ /** @internal */
46
+ export declare function runOAuthFlow(forceNewLogin: boolean, signInMode: Extract<OAuthSignInMode, "browser" | "manual">): Promise<TokenResult>;
47
+ /** @internal */
48
+ export declare function runSignInFlow(forceNewLogin: boolean, signInMode: Extract<OAuthSignInMode, "browser" | "manual" | "device">, options?: SignInFlowOptions): Promise<TokenResult>;
49
+ /** @internal */
50
+ export type PersistAccountPoolOutcome = AccountPoolWriteOutcome;
51
+ /** @internal */
52
+ export declare function persistAccountPool(results: TokenSuccessWithAccount[], replaceAll: boolean): Promise<PersistAccountPoolOutcome | null>;
53
+ /** @internal */
54
+ export declare function syncSelectionToCodex(tokens: TokenSuccessWithAccount): Promise<void>;
55
+ //# sourceMappingURL=login-oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login-oauth.d.ts","sourceRoot":"","sources":["../../../lib/codex-manager/login-oauth.ts"],"names":[],"mappings":"AAEA,OAAO,EAON,KAAK,SAAS,EACd,MAAM,gBAAgB,CAAC;AAqBxB,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEhE,OAAO,EACN,KAAK,uBAAuB,EAG5B,MAAM,yBAAyB,CAAC;AAOjC;;;;;GAKG;AAEH,gBAAgB;AAChB,MAAM,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,CAAC;AACrE,gBAAgB;AAChB,MAAM,MAAM,uBAAuB,GAAG,YAAY,GAAG;IACpD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;CACzB,CAAC;AAIF,gBAAgB;AAChB,wBAAgB,mBAAmB,CAClC,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,GAC/C,OAAO,CAGT;AAED,gBAAgB;AAChB,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAIpD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CACtC,MAAM,EAAE,YAAY,EACpB,WAAW,CAAC,EAAE,MAAM,GAClB,uBAAuB,CA+DzB;AA0FD,gBAAgB;AAChB,MAAM,MAAM,eAAe,GACxB,SAAS,GACT,QAAQ,GACR,QAAQ,GACR,gBAAgB,GAChB,QAAQ,CAAC;AACZ,gBAAgB;AAChB,MAAM,MAAM,iBAAiB,GAAG;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,gBAAgB;AAChB,wBAAsB,YAAY,CACjC,aAAa,EAAE,OAAO,EACtB,UAAU,EAAE,OAAO,CAAC,eAAe,EAAE,SAAS,GAAG,QAAQ,CAAC,GACxD,OAAO,CAAC,WAAW,CAAC,CAwHtB;AAED,gBAAgB;AAChB,wBAAsB,aAAa,CAClC,aAAa,EAAE,OAAO,EACtB,UAAU,EAAE,OAAO,CAAC,eAAe,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC,EACrE,OAAO,GAAE,iBAAsB,GAC7B,OAAO,CAAC,WAAW,CAAC,CAetB;AAED,gBAAgB;AAChB,MAAM,MAAM,yBAAyB,GAAG,uBAAuB,CAAC;AAEhE,gBAAgB;AAChB,wBAAsB,kBAAkB,CACvC,OAAO,EAAE,uBAAuB,EAAE,EAClC,UAAU,EAAE,OAAO,GACjB,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAuD3C;AAED,gBAAgB;AAChB,wBAAsB,oBAAoB,CACzC,MAAM,EAAE,uBAAuB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAkBf"}