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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (470) hide show
  1. package/.codex-plugin/plugin.json +1 -1
  2. package/README.md +4 -3
  3. package/config/schema/config.schema.json +268 -21
  4. package/dist/index.js +0 -1
  5. package/dist/lib/account-policy.js +0 -1
  6. package/dist/lib/accounts/rate-limits.js +0 -1
  7. package/dist/lib/accounts.d.ts +3 -8
  8. package/dist/lib/accounts.d.ts.map +1 -1
  9. package/dist/lib/accounts.js +2 -3
  10. package/dist/lib/audit.js +0 -1
  11. package/dist/lib/auth/auth.js +0 -1
  12. package/dist/lib/auth/browser.js +0 -1
  13. package/dist/lib/auth/device-auth.js +0 -1
  14. package/dist/lib/auth/index.js +0 -1
  15. package/dist/lib/auth/org-override.js +0 -1
  16. package/dist/lib/auth/server.js +0 -1
  17. package/dist/lib/auth/token-utils.js +0 -1
  18. package/dist/lib/auth-rate-limit.js +0 -1
  19. package/dist/lib/budget-guard.js +0 -1
  20. package/dist/lib/capability-policy.js +0 -1
  21. package/dist/lib/circuit-breaker.js +0 -1
  22. package/dist/lib/cli.js +1 -2
  23. package/dist/lib/codex-cli/index.js +0 -1
  24. package/dist/lib/codex-cli/observability.js +0 -1
  25. package/dist/lib/codex-cli/state.js +0 -1
  26. package/dist/lib/codex-cli/sync.d.ts +2 -2
  27. package/dist/lib/codex-cli/sync.d.ts.map +1 -1
  28. package/dist/lib/codex-cli/sync.js +1 -2
  29. package/dist/lib/codex-cli/writer.js +0 -1
  30. package/dist/lib/codex-manager/account-credentials.d.ts +13 -0
  31. package/dist/lib/codex-manager/account-credentials.d.ts.map +1 -0
  32. package/dist/lib/codex-manager/account-credentials.js +55 -0
  33. package/dist/lib/codex-manager/account-manager-commands.js +0 -1
  34. package/dist/lib/codex-manager/account-pool-write.d.ts +95 -0
  35. package/dist/lib/codex-manager/account-pool-write.d.ts.map +1 -0
  36. package/dist/lib/codex-manager/account-pool-write.js +165 -0
  37. package/dist/lib/codex-manager/account-pool-write.js.map +1 -0
  38. package/dist/lib/codex-manager/backend-category-entry.js +0 -1
  39. package/dist/lib/codex-manager/backend-category-helpers.js +0 -1
  40. package/dist/lib/codex-manager/backend-category-prompt.js +0 -1
  41. package/dist/lib/codex-manager/backend-settings-controller.js +0 -1
  42. package/dist/lib/codex-manager/backend-settings-entry.js +0 -1
  43. package/dist/lib/codex-manager/backend-settings-helpers.js +0 -1
  44. package/dist/lib/codex-manager/backend-settings-prompt.js +0 -1
  45. package/dist/lib/codex-manager/backend-settings-schema.js +0 -1
  46. package/dist/lib/codex-manager/behavior-settings-panel.d.ts +1 -1
  47. package/dist/lib/codex-manager/behavior-settings-panel.d.ts.map +1 -1
  48. package/dist/lib/codex-manager/behavior-settings-panel.js +0 -1
  49. package/dist/lib/codex-manager/commands/account.js +0 -1
  50. package/dist/lib/codex-manager/commands/best.d.ts +8 -0
  51. package/dist/lib/codex-manager/commands/best.d.ts.map +1 -1
  52. package/dist/lib/codex-manager/commands/best.js +64 -1
  53. package/dist/lib/codex-manager/commands/bridge.js +0 -1
  54. package/dist/lib/codex-manager/commands/budget.js +0 -1
  55. package/dist/lib/codex-manager/commands/check.js +0 -1
  56. package/dist/lib/codex-manager/commands/config-explain.js +0 -1
  57. package/dist/lib/codex-manager/commands/debug-bundle.js +0 -1
  58. package/dist/lib/codex-manager/commands/forecast.js +0 -1
  59. package/dist/lib/codex-manager/commands/init-config.js +0 -1
  60. package/dist/lib/codex-manager/commands/integrations.js +0 -1
  61. package/dist/lib/codex-manager/commands/models.js +0 -1
  62. package/dist/lib/codex-manager/commands/monitor.js +0 -1
  63. package/dist/lib/codex-manager/commands/report.js +0 -1
  64. package/dist/lib/codex-manager/commands/rotation.d.ts.map +1 -1
  65. package/dist/lib/codex-manager/commands/rotation.js +1 -4
  66. package/dist/lib/codex-manager/commands/status.js +0 -1
  67. package/dist/lib/codex-manager/commands/switch.js +0 -1
  68. package/dist/lib/codex-manager/commands/uninstall.d.ts.map +1 -1
  69. package/dist/lib/codex-manager/commands/uninstall.js +2 -33
  70. package/dist/lib/codex-manager/commands/unpin.js +0 -1
  71. package/dist/lib/codex-manager/commands/usage.js +0 -1
  72. package/dist/lib/codex-manager/commands/verify.js +0 -1
  73. package/dist/lib/codex-manager/commands/why-selected.js +0 -1
  74. package/dist/lib/codex-manager/commands/workspace.js +0 -1
  75. package/dist/lib/codex-manager/dashboard-display-panel.d.ts +1 -1
  76. package/dist/lib/codex-manager/dashboard-display-panel.d.ts.map +1 -1
  77. package/dist/lib/codex-manager/dashboard-display-panel.js +0 -1
  78. package/dist/lib/codex-manager/dashboard-formatters.js +0 -1
  79. package/dist/lib/codex-manager/dashboard-settings-controller.js +0 -1
  80. package/dist/lib/codex-manager/dashboard-settings-data.js +0 -1
  81. package/dist/lib/codex-manager/dashboard-settings-entry.js +0 -1
  82. package/dist/lib/codex-manager/experimental-settings-entry.js +0 -1
  83. package/dist/lib/codex-manager/experimental-settings-prompt.js +0 -1
  84. package/dist/lib/codex-manager/experimental-settings-schema.js +1 -2
  85. package/dist/lib/codex-manager/experimental-sync-target-entry.js +0 -1
  86. package/dist/lib/codex-manager/experimental-sync-target.js +0 -1
  87. package/dist/lib/codex-manager/forecast-report-commands.js +0 -1
  88. package/dist/lib/codex-manager/forecast-report-shared.d.ts +2 -2
  89. package/dist/lib/codex-manager/forecast-report-shared.d.ts.map +1 -1
  90. package/dist/lib/codex-manager/forecast-report-shared.js +5 -21
  91. package/dist/lib/codex-manager/formatters/account-formatters.d.ts +11 -0
  92. package/dist/lib/codex-manager/formatters/account-formatters.d.ts.map +1 -0
  93. package/dist/lib/codex-manager/formatters/account-formatters.js +79 -0
  94. package/dist/lib/codex-manager/formatters/index.d.ts +5 -0
  95. package/dist/lib/codex-manager/formatters/index.d.ts.map +1 -0
  96. package/dist/lib/codex-manager/formatters/index.js +4 -0
  97. package/dist/lib/codex-manager/formatters/model-formatters.d.ts +12 -0
  98. package/dist/lib/codex-manager/formatters/model-formatters.d.ts.map +1 -0
  99. package/dist/lib/codex-manager/formatters/model-formatters.js +23 -0
  100. package/dist/lib/codex-manager/formatters/quota-formatters.d.ts +11 -0
  101. package/dist/lib/codex-manager/formatters/quota-formatters.d.ts.map +1 -0
  102. package/dist/lib/codex-manager/formatters/quota-formatters.js +104 -0
  103. package/dist/lib/codex-manager/formatters/text-style.d.ts +14 -0
  104. package/dist/lib/codex-manager/formatters/text-style.d.ts.map +1 -0
  105. package/dist/lib/codex-manager/formatters/text-style.js +111 -0
  106. package/dist/lib/codex-manager/health-check.d.ts +14 -0
  107. package/dist/lib/codex-manager/health-check.d.ts.map +1 -0
  108. package/dist/lib/codex-manager/health-check.js +278 -0
  109. package/dist/lib/codex-manager/help.js +0 -1
  110. package/dist/lib/codex-manager/login-action-panel.d.ts +4 -0
  111. package/dist/lib/codex-manager/login-action-panel.d.ts.map +1 -0
  112. package/dist/lib/codex-manager/login-action-panel.js +238 -0
  113. package/dist/lib/codex-manager/login-flow.d.ts +17 -0
  114. package/dist/lib/codex-manager/login-flow.d.ts.map +1 -0
  115. package/dist/lib/codex-manager/login-flow.js +387 -0
  116. package/dist/lib/codex-manager/login-menu-actions.d.ts +20 -0
  117. package/dist/lib/codex-manager/login-menu-actions.d.ts.map +1 -0
  118. package/dist/lib/codex-manager/login-menu-actions.js +303 -0
  119. package/dist/lib/codex-manager/login-menu-data.d.ts +19 -0
  120. package/dist/lib/codex-manager/login-menu-data.d.ts.map +1 -0
  121. package/dist/lib/codex-manager/login-menu-data.js +378 -0
  122. package/dist/lib/codex-manager/login-oauth.d.ts +55 -0
  123. package/dist/lib/codex-manager/login-oauth.d.ts.map +1 -0
  124. package/dist/lib/codex-manager/login-oauth.js +345 -0
  125. package/dist/lib/codex-manager/manual-callback.d.ts +33 -0
  126. package/dist/lib/codex-manager/manual-callback.d.ts.map +1 -0
  127. package/dist/lib/codex-manager/manual-callback.js +30 -0
  128. package/dist/lib/codex-manager/manual-callback.js.map +1 -0
  129. package/dist/lib/codex-manager/persist-selected-account.d.ts +24 -0
  130. package/dist/lib/codex-manager/persist-selected-account.d.ts.map +1 -0
  131. package/dist/lib/codex-manager/persist-selected-account.js +107 -0
  132. package/dist/lib/codex-manager/quota-cache-helpers.d.ts +18 -0
  133. package/dist/lib/codex-manager/quota-cache-helpers.d.ts.map +1 -0
  134. package/dist/lib/codex-manager/quota-cache-helpers.js +112 -0
  135. package/dist/lib/codex-manager/rate-limit-markers.js +0 -1
  136. package/dist/lib/codex-manager/repair-commands.js +0 -1
  137. package/dist/lib/codex-manager/settings-hub/backend.js +1 -2
  138. package/dist/lib/codex-manager/settings-hub/dashboard.js +1 -2
  139. package/dist/lib/codex-manager/settings-hub/experimental.js +1 -2
  140. package/dist/lib/codex-manager/settings-hub/index.js +1 -2
  141. package/dist/lib/codex-manager/settings-hub/shared.js +0 -1
  142. package/dist/lib/codex-manager/settings-hub-entry.js +0 -1
  143. package/dist/lib/codex-manager/settings-hub-menu.js +0 -1
  144. package/dist/lib/codex-manager/settings-hub-prompt.js +0 -1
  145. package/dist/lib/codex-manager/settings-hub.js +0 -1
  146. package/dist/lib/codex-manager/settings-panels.js +0 -1
  147. package/dist/lib/codex-manager/settings-persist-utils.js +0 -1
  148. package/dist/lib/codex-manager/settings-preview.js +0 -1
  149. package/dist/lib/codex-manager/settings-write-queue.js +0 -1
  150. package/dist/lib/codex-manager/statusline-order.js +0 -1
  151. package/dist/lib/codex-manager/statusline-settings-panel.d.ts +1 -1
  152. package/dist/lib/codex-manager/statusline-settings-panel.d.ts.map +1 -1
  153. package/dist/lib/codex-manager/statusline-settings-panel.js +0 -1
  154. package/dist/lib/codex-manager/theme-settings-panel.d.ts +1 -1
  155. package/dist/lib/codex-manager/theme-settings-panel.d.ts.map +1 -1
  156. package/dist/lib/codex-manager/theme-settings-panel.js +0 -1
  157. package/dist/lib/codex-manager/unified-settings-controller.js +0 -1
  158. package/dist/lib/codex-manager/unified-settings-entry.js +0 -1
  159. package/dist/lib/codex-manager.d.ts +2 -4
  160. package/dist/lib/codex-manager.d.ts.map +1 -1
  161. package/dist/lib/codex-manager.js +219 -2578
  162. package/dist/lib/codex-manager.js.map +1 -1
  163. package/dist/lib/config-schema.d.ts +32 -0
  164. package/dist/lib/config-schema.d.ts.map +1 -0
  165. package/dist/lib/config-schema.js +96 -0
  166. package/dist/lib/config.d.ts.map +1 -1
  167. package/dist/lib/config.js +60 -104
  168. package/dist/lib/constants.js +0 -1
  169. package/dist/lib/context-overflow.js +0 -1
  170. package/dist/lib/dashboard-settings.js +0 -1
  171. package/dist/lib/entitlement-cache.js +0 -1
  172. package/dist/lib/env-parsing.js +0 -1
  173. package/dist/lib/errors.js +0 -1
  174. package/dist/lib/forecast.js +0 -1
  175. package/dist/lib/fs-retry.d.ts +46 -0
  176. package/dist/lib/fs-retry.d.ts.map +1 -1
  177. package/dist/lib/fs-retry.js +74 -6
  178. package/dist/lib/health.js +0 -1
  179. package/dist/lib/index.js +0 -1
  180. package/dist/lib/integration-generators.js +0 -1
  181. package/dist/lib/live-account-sync.js +0 -1
  182. package/dist/lib/local-bridge.js +0 -1
  183. package/dist/lib/local-client-tokens.js +0 -1
  184. package/dist/lib/logger.js +0 -1
  185. package/dist/lib/model-capability-matrix.js +0 -1
  186. package/dist/lib/named-backup-export.js +0 -1
  187. package/dist/lib/oc-chatgpt-import-adapter.js +0 -1
  188. package/dist/lib/oc-chatgpt-orchestrator.js +0 -1
  189. package/dist/lib/oc-chatgpt-target-detection.js +0 -1
  190. package/dist/lib/parallel-probe.js +0 -1
  191. package/dist/lib/policy/runtime-policy.js +0 -1
  192. package/dist/lib/preemptive-quota-scheduler.js +0 -1
  193. package/dist/lib/proactive-refresh.js +0 -1
  194. package/dist/lib/prompts/codex-host-bridge.js +0 -1
  195. package/dist/lib/prompts/codex.d.ts +3 -11
  196. package/dist/lib/prompts/codex.d.ts.map +1 -1
  197. package/dist/lib/prompts/codex.js +4 -12
  198. package/dist/lib/prompts/fetch-utils.js +0 -1
  199. package/dist/lib/prompts/host-codex-prompt.js +0 -1
  200. package/dist/lib/quota-cache.d.ts.map +1 -1
  201. package/dist/lib/quota-cache.js +15 -43
  202. package/dist/lib/quota-probe.js +0 -1
  203. package/dist/lib/quota-readiness.js +0 -1
  204. package/dist/lib/recovery/constants.js +0 -1
  205. package/dist/lib/recovery/index.js +0 -1
  206. package/dist/lib/recovery/storage.d.ts.map +1 -1
  207. package/dist/lib/recovery/storage.js +30 -51
  208. package/dist/lib/recovery/storage.js.map +1 -1
  209. package/dist/lib/recovery/types.js +0 -1
  210. package/dist/lib/recovery.js +0 -1
  211. package/dist/lib/refresh-guardian.js +0 -1
  212. package/dist/lib/refresh-lease.d.ts.map +1 -1
  213. package/dist/lib/refresh-lease.js +1 -4
  214. package/dist/lib/refresh-queue.js +0 -1
  215. package/dist/lib/request/error-classification.d.ts +75 -0
  216. package/dist/lib/request/error-classification.d.ts.map +1 -0
  217. package/dist/lib/request/error-classification.js +295 -0
  218. package/dist/lib/request/failover-config.js +0 -1
  219. package/dist/lib/request/failure-policy.js +0 -1
  220. package/dist/lib/request/fetch-helpers.d.ts +10 -114
  221. package/dist/lib/request/fetch-helpers.d.ts.map +1 -1
  222. package/dist/lib/request/fetch-helpers.js +7 -589
  223. package/dist/lib/request/headers.d.ts +33 -0
  224. package/dist/lib/request/headers.d.ts.map +1 -0
  225. package/dist/lib/request/headers.js +64 -0
  226. package/dist/lib/request/helpers/input-utils.js +0 -1
  227. package/dist/lib/request/helpers/model-map.d.ts +10 -0
  228. package/dist/lib/request/helpers/model-map.d.ts.map +1 -1
  229. package/dist/lib/request/helpers/model-map.js +11 -1
  230. package/dist/lib/request/helpers/tool-utils.js +0 -1
  231. package/dist/lib/request/index.js +0 -1
  232. package/dist/lib/request/rate-limit-backoff.js +0 -1
  233. package/dist/lib/request/rate-limit-decision.d.ts +28 -0
  234. package/dist/lib/request/rate-limit-decision.d.ts.map +1 -0
  235. package/dist/lib/request/rate-limit-decision.js +191 -0
  236. package/dist/lib/request/request-attempt-budget.js +0 -1
  237. package/dist/lib/request/request-init.js +0 -1
  238. package/dist/lib/request/request-resilience.js +0 -1
  239. package/dist/lib/request/request-transformer.js +0 -1
  240. package/dist/lib/request/response-compaction.js +0 -1
  241. package/dist/lib/request/response-handler.js +0 -1
  242. package/dist/lib/request/response-metadata.js +0 -1
  243. package/dist/lib/request/stream-failover-runtime.d.ts +8 -0
  244. package/dist/lib/request/stream-failover-runtime.d.ts.map +1 -0
  245. package/dist/lib/request/stream-failover-runtime.js +149 -0
  246. package/dist/lib/request/stream-failover.js +0 -1
  247. package/dist/lib/request/token-refresh.d.ts +30 -0
  248. package/dist/lib/request/token-refresh.d.ts.map +1 -0
  249. package/dist/lib/request/token-refresh.js +116 -0
  250. package/dist/lib/request/url-rewriting.d.ts +24 -0
  251. package/dist/lib/request/url-rewriting.d.ts.map +1 -0
  252. package/dist/lib/request/url-rewriting.js +153 -0
  253. package/dist/lib/request/wait-utils.js +0 -1
  254. package/dist/lib/rotation.d.ts +1 -1
  255. package/dist/lib/rotation.d.ts.map +1 -1
  256. package/dist/lib/rotation.js +0 -1
  257. package/dist/lib/routing-mutex.js +0 -1
  258. package/dist/lib/routing-profiles.js +0 -1
  259. package/dist/lib/runtime/account-check-helpers.js +0 -1
  260. package/dist/lib/runtime/account-check-types.js +0 -1
  261. package/dist/lib/runtime/account-check.js +0 -1
  262. package/dist/lib/runtime/account-health-check.js +0 -1
  263. package/dist/lib/runtime/account-manager-cache-entry.js +0 -1
  264. package/dist/lib/runtime/account-manager-cache.js +0 -1
  265. package/dist/lib/runtime/account-pool.js +0 -1
  266. package/dist/lib/runtime/account-scope.js +0 -1
  267. package/dist/lib/runtime/account-select-event.js +0 -1
  268. package/dist/lib/runtime/account-selection.js +0 -1
  269. package/dist/lib/runtime/account-state.js +0 -1
  270. package/dist/lib/runtime/account-status.js +0 -1
  271. package/dist/lib/runtime/account-storage-scope-entry.js +0 -1
  272. package/dist/lib/runtime/app-bind.js +0 -1
  273. package/dist/lib/runtime/auth-facade.js +0 -1
  274. package/dist/lib/runtime/browser-oauth-flow.js +0 -1
  275. package/dist/lib/runtime/capability-boost.js +0 -1
  276. package/dist/lib/runtime/config-toml.js +0 -1
  277. package/dist/lib/runtime/event-handler.js +0 -1
  278. package/dist/lib/runtime/first-run.d.ts +80 -0
  279. package/dist/lib/runtime/first-run.d.ts.map +1 -0
  280. package/dist/lib/runtime/first-run.js +327 -0
  281. package/dist/lib/runtime/flagged-verify-types.js +0 -1
  282. package/dist/lib/runtime/hydrate-emails.js +0 -1
  283. package/dist/lib/runtime/live-sync-entry.js +0 -1
  284. package/dist/lib/runtime/live-sync.js +0 -1
  285. package/dist/lib/runtime/loader-setup.js +0 -1
  286. package/dist/lib/runtime/login-menu-accounts.js +0 -1
  287. package/dist/lib/runtime/manual-oauth-flow.js +0 -1
  288. package/dist/lib/runtime/oauth-browser-flow.js +0 -1
  289. package/dist/lib/runtime/preemptive-quota.js +0 -1
  290. package/dist/lib/runtime/quota-headers.js +0 -1
  291. package/dist/lib/runtime/quota-probe.js +0 -1
  292. package/dist/lib/runtime/quota-settings.js +0 -1
  293. package/dist/lib/runtime/refresh-guardian-entry.js +0 -1
  294. package/dist/lib/runtime/refresh-guardian.js +0 -1
  295. package/dist/lib/runtime/request-init.js +0 -1
  296. package/dist/lib/runtime/rotation-account-selection.d.ts +38 -0
  297. package/dist/lib/runtime/rotation-account-selection.d.ts.map +1 -0
  298. package/dist/lib/runtime/rotation-account-selection.js +172 -0
  299. package/dist/lib/runtime/rotation-proxy-state.d.ts +54 -0
  300. package/dist/lib/runtime/rotation-proxy-state.d.ts.map +1 -0
  301. package/dist/lib/runtime/rotation-proxy-state.js +56 -0
  302. package/dist/lib/runtime/rotation-server-types.d.ts +57 -0
  303. package/dist/lib/runtime/rotation-server-types.d.ts.map +1 -0
  304. package/dist/lib/runtime/rotation-server-types.js +1 -0
  305. package/dist/lib/runtime/rotation-storage-meta.d.ts +40 -0
  306. package/dist/lib/runtime/rotation-storage-meta.d.ts.map +1 -0
  307. package/dist/lib/runtime/rotation-storage-meta.js +143 -0
  308. package/dist/lib/runtime/rotation-token-refresh.d.ts +25 -0
  309. package/dist/lib/runtime/rotation-token-refresh.d.ts.map +1 -0
  310. package/dist/lib/runtime/rotation-token-refresh.js +99 -0
  311. package/dist/lib/runtime/runtime-current-account.d.ts.map +1 -1
  312. package/dist/lib/runtime/runtime-current-account.js +1 -4
  313. package/dist/lib/runtime/runtime-observability.js +0 -1
  314. package/dist/lib/runtime/runtime-services.js +0 -1
  315. package/dist/lib/runtime/session-affinity-entry.js +0 -1
  316. package/dist/lib/runtime/session-affinity.js +0 -1
  317. package/dist/lib/runtime/session-recovery.js +0 -1
  318. package/dist/lib/runtime/status-marker.js +0 -1
  319. package/dist/lib/runtime/storage-scope.js +0 -1
  320. package/dist/lib/runtime/toast.js +0 -1
  321. package/dist/lib/runtime/ui-runtime-entry.js +0 -1
  322. package/dist/lib/runtime/ui-runtime.js +0 -1
  323. package/dist/lib/runtime/verify-flagged.js +0 -1
  324. package/dist/lib/runtime-constants.js +0 -1
  325. package/dist/lib/runtime-paths.js +0 -1
  326. package/dist/lib/runtime-rotation-proxy.d.ts +7 -124
  327. package/dist/lib/runtime-rotation-proxy.d.ts.map +1 -1
  328. package/dist/lib/runtime-rotation-proxy.js +614 -1353
  329. package/dist/lib/schemas.d.ts +3 -3
  330. package/dist/lib/schemas.js +1 -2
  331. package/dist/lib/session-affinity.js +0 -1
  332. package/dist/lib/shutdown.js +0 -1
  333. package/dist/lib/storage/account-clear-entry.js +0 -1
  334. package/dist/lib/storage/account-clear.js +0 -1
  335. package/dist/lib/storage/account-match-utils.js +0 -1
  336. package/dist/lib/storage/account-persistence.d.ts +1 -1
  337. package/dist/lib/storage/account-persistence.d.ts.map +1 -1
  338. package/dist/lib/storage/account-persistence.js +0 -1
  339. package/dist/lib/storage/account-port.d.ts +1 -1
  340. package/dist/lib/storage/account-port.d.ts.map +1 -1
  341. package/dist/lib/storage/account-port.js +0 -1
  342. package/dist/lib/storage/account-save-entry.d.ts +1 -1
  343. package/dist/lib/storage/account-save-entry.d.ts.map +1 -1
  344. package/dist/lib/storage/account-save-entry.js +0 -1
  345. package/dist/lib/storage/account-save.d.ts +1 -1
  346. package/dist/lib/storage/account-save.d.ts.map +1 -1
  347. package/dist/lib/storage/account-save.js +0 -1
  348. package/dist/lib/storage/account-snapshot.js +0 -1
  349. package/dist/lib/storage/backup-metadata-builder.d.ts +1 -1
  350. package/dist/lib/storage/backup-metadata-builder.d.ts.map +1 -1
  351. package/dist/lib/storage/backup-metadata-builder.js +0 -1
  352. package/dist/lib/storage/backup-metadata.d.ts +13 -0
  353. package/dist/lib/storage/backup-metadata.d.ts.map +1 -1
  354. package/dist/lib/storage/backup-metadata.js +0 -1
  355. package/dist/lib/storage/backup-paths.js +0 -1
  356. package/dist/lib/storage/backup-restore.d.ts +1 -1
  357. package/dist/lib/storage/backup-restore.d.ts.map +1 -1
  358. package/dist/lib/storage/backup-restore.js +0 -1
  359. package/dist/lib/storage/cache-artifacts.js +0 -1
  360. package/dist/lib/storage/error-hints.js +0 -1
  361. package/dist/lib/storage/file-paths.js +0 -1
  362. package/dist/lib/storage/fixture-guards.d.ts +1 -1
  363. package/dist/lib/storage/fixture-guards.d.ts.map +1 -1
  364. package/dist/lib/storage/fixture-guards.js +0 -1
  365. package/dist/lib/storage/flagged-entry.js +0 -1
  366. package/dist/lib/storage/flagged-load-entry.d.ts +1 -1
  367. package/dist/lib/storage/flagged-load-entry.d.ts.map +1 -1
  368. package/dist/lib/storage/flagged-load-entry.js +0 -1
  369. package/dist/lib/storage/flagged-save-entry.d.ts +1 -1
  370. package/dist/lib/storage/flagged-save-entry.d.ts.map +1 -1
  371. package/dist/lib/storage/flagged-save-entry.js +0 -1
  372. package/dist/lib/storage/flagged-storage-file.d.ts +1 -1
  373. package/dist/lib/storage/flagged-storage-file.d.ts.map +1 -1
  374. package/dist/lib/storage/flagged-storage-file.js +0 -1
  375. package/dist/lib/storage/flagged-storage-io.d.ts +1 -1
  376. package/dist/lib/storage/flagged-storage-io.d.ts.map +1 -1
  377. package/dist/lib/storage/flagged-storage-io.js +0 -1
  378. package/dist/lib/storage/flagged-storage.d.ts +1 -1
  379. package/dist/lib/storage/flagged-storage.d.ts.map +1 -1
  380. package/dist/lib/storage/flagged-storage.js +15 -2
  381. package/dist/lib/storage/flagged-storage.js.map +1 -1
  382. package/dist/lib/storage/gitignore.js +0 -1
  383. package/dist/lib/storage/hash.js +0 -1
  384. package/dist/lib/storage/health.js +0 -1
  385. package/dist/lib/storage/identity.js +0 -1
  386. package/dist/lib/storage/import-export.d.ts +1 -1
  387. package/dist/lib/storage/import-export.d.ts.map +1 -1
  388. package/dist/lib/storage/import-export.js +0 -1
  389. package/dist/lib/storage/metadata-section.js +0 -1
  390. package/dist/lib/storage/migrations.d.ts +5 -48
  391. package/dist/lib/storage/migrations.d.ts.map +1 -1
  392. package/dist/lib/storage/migrations.js +5 -2
  393. package/dist/lib/storage/named-backup-entry.js +0 -1
  394. package/dist/lib/storage/named-backups-entry.d.ts +1 -1
  395. package/dist/lib/storage/named-backups-entry.d.ts.map +1 -1
  396. package/dist/lib/storage/named-backups-entry.js +0 -1
  397. package/dist/lib/storage/named-backups.js +0 -1
  398. package/dist/lib/storage/path-state.js +0 -1
  399. package/dist/lib/storage/paths.js +0 -1
  400. package/dist/lib/storage/project-migration.d.ts +1 -1
  401. package/dist/lib/storage/project-migration.d.ts.map +1 -1
  402. package/dist/lib/storage/project-migration.js +0 -1
  403. package/dist/lib/storage/public-types.d.ts +70 -0
  404. package/dist/lib/storage/public-types.d.ts.map +1 -0
  405. package/dist/lib/storage/public-types.js +6 -0
  406. package/dist/lib/storage/record-utils.js +0 -1
  407. package/dist/lib/storage/restore-assessment.d.ts +1 -1
  408. package/dist/lib/storage/restore-assessment.d.ts.map +1 -1
  409. package/dist/lib/storage/restore-assessment.js +0 -1
  410. package/dist/lib/storage/restore-backup-entry.d.ts +1 -1
  411. package/dist/lib/storage/restore-backup-entry.d.ts.map +1 -1
  412. package/dist/lib/storage/restore-backup-entry.js +0 -1
  413. package/dist/lib/storage/restore-metadata.d.ts +1 -1
  414. package/dist/lib/storage/restore-metadata.d.ts.map +1 -1
  415. package/dist/lib/storage/restore-metadata.js +0 -1
  416. package/dist/lib/storage/restore.d.ts +1 -1
  417. package/dist/lib/storage/restore.d.ts.map +1 -1
  418. package/dist/lib/storage/restore.js +0 -1
  419. package/dist/lib/storage/save-retry.d.ts +10 -0
  420. package/dist/lib/storage/save-retry.d.ts.map +1 -0
  421. package/dist/lib/storage/save-retry.js +26 -0
  422. package/dist/lib/storage/snapshot-inspectors.d.ts +1 -1
  423. package/dist/lib/storage/snapshot-inspectors.d.ts.map +1 -1
  424. package/dist/lib/storage/snapshot-inspectors.js +0 -1
  425. package/dist/lib/storage/storage-parser.d.ts +1 -1
  426. package/dist/lib/storage/storage-parser.d.ts.map +1 -1
  427. package/dist/lib/storage/storage-parser.js +0 -1
  428. package/dist/lib/storage/transactions.d.ts +1 -1
  429. package/dist/lib/storage/transactions.d.ts.map +1 -1
  430. package/dist/lib/storage/transactions.js +0 -1
  431. package/dist/lib/storage.d.ts +3 -24
  432. package/dist/lib/storage.d.ts.map +1 -1
  433. package/dist/lib/storage.js +17 -32
  434. package/dist/lib/table-formatter.js +0 -1
  435. package/dist/lib/tools/hashline-tools.js +0 -1
  436. package/dist/lib/types.js +0 -1
  437. package/dist/lib/ui/ansi.js +0 -1
  438. package/dist/lib/ui/auth-menu-builder.d.ts +89 -0
  439. package/dist/lib/ui/auth-menu-builder.d.ts.map +1 -0
  440. package/dist/lib/ui/auth-menu-builder.js +350 -0
  441. package/dist/lib/ui/auth-menu.d.ts +2 -76
  442. package/dist/lib/ui/auth-menu.d.ts.map +1 -1
  443. package/dist/lib/ui/auth-menu.js +3 -349
  444. package/dist/lib/ui/confirm.js +0 -1
  445. package/dist/lib/ui/copy.d.ts +2 -0
  446. package/dist/lib/ui/copy.d.ts.map +1 -1
  447. package/dist/lib/ui/copy.js +2 -0
  448. package/dist/lib/ui/copy.js.map +1 -1
  449. package/dist/lib/ui/display-width.js +0 -1
  450. package/dist/lib/ui/format.js +0 -1
  451. package/dist/lib/ui/index.d.ts +10 -0
  452. package/dist/lib/ui/index.d.ts.map +1 -0
  453. package/dist/lib/ui/index.js +9 -0
  454. package/dist/lib/ui/runtime.js +0 -1
  455. package/dist/lib/ui/select.js +0 -1
  456. package/dist/lib/ui/theme.js +0 -1
  457. package/dist/lib/ui/ui-copy.d.ts +159 -0
  458. package/dist/lib/ui/ui-copy.d.ts.map +1 -0
  459. package/dist/lib/ui/ui-copy.js +163 -0
  460. package/dist/lib/unified-settings.js +0 -1
  461. package/dist/lib/update-notice.js +0 -1
  462. package/dist/lib/usage/index.js +0 -1
  463. package/dist/lib/usage/ledger.js +0 -1
  464. package/dist/lib/usage/pricing.js +0 -1
  465. package/dist/lib/usage/redaction.js +0 -1
  466. package/dist/lib/usage/types.js +0 -1
  467. package/dist/lib/utils.js +0 -1
  468. package/package.json +8 -8
  469. package/scripts/postinstall.js +34 -265
  470. package/scripts/preuninstall.js +2 -2
@@ -0,0 +1,163 @@
1
+ import { AUTH_REDIRECT } from "../auth/auth.js";
2
+ export const UI_COPY = {
3
+ mainMenu: {
4
+ title: "Accounts Dashboard",
5
+ searchSubtitlePrefix: "Search:",
6
+ quickStart: "Quick Actions",
7
+ addAccount: "Add New Account",
8
+ checkAccounts: "Run Health Check",
9
+ bestAccount: "Pick Best Account",
10
+ fixIssues: "Auto-Repair Issues",
11
+ settings: "Settings",
12
+ moreChecks: "Advanced Checks",
13
+ refreshChecks: "Refresh All Accounts",
14
+ checkFlagged: "Check Problem Accounts",
15
+ accounts: "Saved Accounts",
16
+ loadingLimits: "Fetching account limits...",
17
+ noSearchMatches: "No accounts match your search",
18
+ dangerZone: "Danger Zone",
19
+ removeAllAccounts: "Delete All Accounts",
20
+ helpCompact: "↑↓ Move | Enter Select | / Search | 1-9 Switch | Q Back",
21
+ helpDetailed: "Arrow keys move, Enter selects, / searches, 1-9 switches account, Q goes back",
22
+ },
23
+ accountDetails: {
24
+ back: "Back",
25
+ enable: "Enable Account",
26
+ disable: "Disable Account",
27
+ setCurrent: "Set As Current",
28
+ refresh: "Re-Login",
29
+ remove: "Delete Account",
30
+ help: "↑↓ Move | Enter Select | S Use | R Sign In | D Delete | Q Back",
31
+ },
32
+ oauth: {
33
+ chooseModeTitle: "Get Started",
34
+ chooseModeSubtitle: "Choose how you want to continue.",
35
+ signInHeading: "Sign in",
36
+ restoreHeading: "Recover saved accounts",
37
+ openBrowser: "Open Browser (Easy)",
38
+ manualMode: "Manual / Incognito",
39
+ restoreSavedBackup: "Restore Saved Backup",
40
+ loadLastBackup: "Load Last Saved Backup (Recommended)",
41
+ chooseBackupManually: "Choose Backup Manually",
42
+ back: "Back",
43
+ chooseModeHelp: "↑↓ Move | Enter Select | 1 Easy | 2 Manual | Q Back",
44
+ chooseModeHelpWithBackup: "↑↓ Move | Enter Select | 1 Easy | 2 Manual | 3 Backup | Q Back",
45
+ restoreBackupTitle: "Restore Saved Backup",
46
+ restoreBackupSubtitle: "Choose how you want to recover saved accounts.",
47
+ restoreBackupLatestHint: "Fastest way to recover your saved accounts.",
48
+ restoreBackupHelp: "↑↓ Move | Enter Select | 1 Latest | 2 Manual | Q Back",
49
+ manualBackupTitle: "Choose Backup",
50
+ manualBackupSubtitle: "Pick a saved backup to restore.",
51
+ manualBackupHelp: "↑↓ Move | Enter Select | Q Back",
52
+ loadLastBackupHint: (fileName, accountCount, savedAt) => `${fileName} | ${accountCount} account${accountCount === 1 ? "" : "s"} | saved ${savedAt}`,
53
+ manualBackupHint: (accountCount, savedAt) => `${accountCount} account${accountCount === 1 ? "" : "s"} | saved ${savedAt}`,
54
+ restoreBackupConfirm: (fileName, accountCount) => `Load ${fileName} (${accountCount} account${accountCount === 1 ? "" : "s"})?`,
55
+ restoreBackupLoaded: (fileName, accountCount) => `Loaded ${fileName} (${accountCount} account${accountCount === 1 ? "" : "s"}).`,
56
+ restoreBackupSyncWarning: "Backup loaded locally, but Codex auth sync did not complete. Multi-auth routing will still use the restored account pool.",
57
+ goTo: "Go to:",
58
+ copyOk: "Login link copied.",
59
+ copyFail: "Could not copy login link.",
60
+ pastePrompt: "Paste callback URL or code here (Q to cancel):",
61
+ browserOpened: "Browser opened.",
62
+ browserOpenFail: "Could not open browser. Use this link:",
63
+ waitingCallback: `Waiting for login callback on ${AUTH_REDIRECT.host}:${AUTH_REDIRECT.port}...`,
64
+ callbackBypassed: "Manual mode active. Paste the callback URL manually.",
65
+ callbackUnavailable: "Callback listener unavailable. Paste the callback URL manually.",
66
+ callbackMissed: "No callback received. Paste manually.",
67
+ cancelled: "Sign-in cancelled.",
68
+ cancelledBackToMenu: "Sign-in cancelled. Going back to menu.",
69
+ callbackInvalid: "That callback URL is missing the code or state parameter. Paste the full URL you were redirected to (it should contain both code= and state=).",
70
+ callbackStateMismatch: "OAuth state mismatch. That callback URL was generated for a different login attempt. Restart login and paste the callback URL from this attempt.",
71
+ },
72
+ returnFlow: {
73
+ continuePrompt: "Press Enter to go back.",
74
+ actionFailedPrompt: "Action failed. Press Enter to go back.",
75
+ autoReturn: (seconds) => `Returning in ${seconds}s... Press any key to pause.`,
76
+ paused: "Paused. Press any key to continue.",
77
+ working: "Running...",
78
+ done: "Done.",
79
+ failed: "Failed.",
80
+ },
81
+ settings: {
82
+ title: "Settings",
83
+ subtitle: "Customize menu, behavior, backend, and experiments",
84
+ help: "↑↓ Move | Enter Select | Q Back",
85
+ sectionTitle: "Basic",
86
+ advancedTitle: "Advanced",
87
+ exitTitle: "Back",
88
+ accountList: "Account List View",
89
+ summaryFields: "Summary Line",
90
+ behavior: "Menu Behavior",
91
+ theme: "Color Theme",
92
+ experimental: "Experimental",
93
+ experimentalTitle: "Experimental",
94
+ experimentalSubtitle: "Preview sync and backup actions before they become stable",
95
+ experimentalHelpMenu: "Enter Select | 1 Sync | 2 Backup | 3 Guard | [ - Down | ] + Up | S Save | Q Back",
96
+ experimentalHelpPreview: "Enter Select | A Apply | Q Back",
97
+ experimentalHelpStatus: "Enter Select | Q Back",
98
+ experimentalSync: "Sync Accounts to oc-chatgpt-multi-auth",
99
+ experimentalApplySync: "Apply Sync",
100
+ experimentalBackup: "Save Pool Backup",
101
+ experimentalBackupPrompt: "Backup file name (.json): ",
102
+ experimentalRefreshGuard: "Enable Refresh Guard",
103
+ experimentalRefreshInterval: "Refresh Guard Interval",
104
+ experimentalDecreaseInterval: "Decrease Refresh Interval",
105
+ experimentalIncreaseInterval: "Increase Refresh Interval",
106
+ backend: "Backend Controls",
107
+ back: "Back",
108
+ previewHeading: "Live Preview",
109
+ displayHeading: "Options",
110
+ resetDefault: "Reset to Default",
111
+ saveAndBack: "Save and Back",
112
+ backNoSave: "Back Without Saving",
113
+ accountListTitle: "Account List View",
114
+ accountListSubtitle: "Choose row details and optional smart sorting",
115
+ accountListHelp: "Enter Toggle | Number Toggle | M Sort | L Layout | S Save | Q Back (No Save)",
116
+ summaryTitle: "Account Details Row",
117
+ summarySubtitle: "Choose and order detail fields",
118
+ summaryHelp: "Enter Toggle | 1-3 Toggle | [ ] Reorder | S Save | Q Back (No Save)",
119
+ behaviorTitle: "Return Behavior",
120
+ behaviorSubtitle: "Control how result screens return",
121
+ behaviorHelp: "Enter Select | 1-3 Delay | P Pause | L AutoFetch | F Status | T TTL | S Save | Q Back (No Save)",
122
+ themeTitle: "Color Theme",
123
+ themeSubtitle: "Pick base color and accent",
124
+ themeHelp: "Enter Select | 1-2 Base | S Save | Q Back (No Save)",
125
+ backendTitle: "Backend Controls",
126
+ backendSubtitle: "Tune sync, retry, and limit behavior",
127
+ backendHelp: "Enter Open | 1-4 Category | S Save | R Reset | Q Back (No Save)",
128
+ backendCategoriesHeading: "Categories",
129
+ backendCategoryTitle: "Backend Category",
130
+ backendCategoryHelp: "Enter Toggle/Adjust | +/- or [ ] Number | 1-9 Toggle | R Reset | Q Back",
131
+ backendToggleHeading: "Switches",
132
+ backendNumberHeading: "Numbers",
133
+ backendDecrease: "Decrease Focused Value",
134
+ backendIncrease: "Increase Focused Value",
135
+ backendResetCategory: "Reset Category",
136
+ backendBackToCategories: "Back to Categories",
137
+ baseTheme: "Base Color",
138
+ accentColor: "Accent Color",
139
+ actionTiming: "Auto Return Delay",
140
+ moveUp: "Move Focused Field Up",
141
+ moveDown: "Move Focused Field Down",
142
+ },
143
+ fallback: {
144
+ addAnotherTip: "Tip: Use private mode or sign out before adding another account.",
145
+ addAnotherQuestion: (count) => `Add another account? (${count} added) (y/n): `,
146
+ selectModePrompt: "(a) add, (c) check, (b) best, fi(x), (s) settings, (d) deep, (g) problem, (f) fresh, (q) back [a/c/b/x/s/d/g/f/q]: ",
147
+ invalidModePrompt: "Use one of: a, c, b, x, s, d, g, f, q.",
148
+ },
149
+ };
150
+ /**
151
+ * Builds the "Check Problem Accounts" label, appending the flagged count when greater than zero.
152
+ *
153
+ * This function is pure and has no side effects, is safe for concurrent use, performs no filesystem
154
+ * access (including Windows-specific behavior), and does not perform any token redaction.
155
+ *
156
+ * @param flaggedCount - The number of flagged accounts to show; if greater than zero the count is appended in parentheses.
157
+ * @returns The resulting label string: the base label when `flaggedCount` is 0 or less, otherwise the base label followed by ` (count)`.
158
+ */
159
+ export function formatCheckFlaggedLabel(flaggedCount) {
160
+ return flaggedCount > 0
161
+ ? `${UI_COPY.mainMenu.checkFlagged} (${flaggedCount})`
162
+ : UI_COPY.mainMenu.checkFlagged;
163
+ }
@@ -549,4 +549,3 @@ export async function saveUnifiedDashboardSettings(dashboardDisplaySettings) {
549
549
  }
550
550
  });
551
551
  }
552
- //# sourceMappingURL=unified-settings.js.map
@@ -312,4 +312,3 @@ export function clearUpdateCache() {
312
312
  }
313
313
  });
314
314
  }
315
- //# sourceMappingURL=update-notice.js.map
@@ -2,4 +2,3 @@ export * from "./types.js";
2
2
  export * from "./pricing.js";
3
3
  export * from "./redaction.js";
4
4
  export * from "./ledger.js";
5
- //# sourceMappingURL=index.js.map
@@ -491,4 +491,3 @@ export async function rotateUsageLedger(options = {}) {
491
491
  export function resetUsageLedgerQueueForTests() {
492
492
  appendQueue = Promise.resolve();
493
493
  }
494
- //# sourceMappingURL=ledger.js.map
@@ -64,4 +64,3 @@ export function estimateUsageCostUsd(model, tokens) {
64
64
  export function listUsageModelPricing() {
65
65
  return structuredClone(MODEL_PRICING);
66
66
  }
67
- //# sourceMappingURL=pricing.js.map
@@ -127,4 +127,3 @@ export function normalizeUsageLedgerRow(input) {
127
127
  export function usageRowToJsonLine(row) {
128
128
  return `${JSON.stringify(row)}\n`;
129
129
  }
130
- //# sourceMappingURL=redaction.js.map
@@ -1,2 +1 @@
1
1
  export {};
2
- //# sourceMappingURL=types.js.map
package/dist/lib/utils.js CHANGED
@@ -62,4 +62,3 @@ export function toStringValue(value) {
62
62
  export function sleep(ms) {
63
63
  return new Promise((resolve) => setTimeout(resolve, ms));
64
64
  }
65
- //# sourceMappingURL=utils.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codex-multi-auth",
3
- "version": "2.3.0-beta.0",
3
+ "version": "2.3.0-beta.2",
4
4
  "description": "Codex CLI multi-account OAuth manager with account switching, health checks, runtime rotation, diagnostics, and recovery tools for @openai/codex",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -79,6 +79,7 @@
79
79
  },
80
80
  "scripts": {
81
81
  "build": "tsc && node scripts/copy-oauth-success.js",
82
+ "generate:schema": "npm run build && node scripts/generate-config-schema.mjs",
82
83
  "typecheck": "tsc --noEmit",
83
84
  "typecheck:scripts": "tsc -p tsconfig.scripts.json",
84
85
  "lint": "npm run lint:ts && npm run lint:scripts",
@@ -152,19 +153,18 @@
152
153
  ]
153
154
  },
154
155
  "engines": {
155
- "node": ">=18.0.0"
156
- },
157
- "peerDependencies": {
158
- "typescript": "^5"
156
+ "node": ">=18.17.0"
159
157
  },
160
158
  "devDependencies": {
161
159
  "@fast-check/vitest": "^0.2.4",
162
- "@types/node": "^25.3.0",
160
+ "@types/node": "^20.19.42",
163
161
  "@typescript-eslint/eslint-plugin": "^8.56.0",
164
162
  "@typescript-eslint/parser": "^8.56.0",
165
163
  "@vitest/coverage-v8": "^4.1.8",
166
164
  "@vitest/ui": "^4.1.8",
167
165
  "eslint": "^10.0.0",
166
+ "eslint-import-resolver-typescript": "^4.4.5",
167
+ "eslint-plugin-import-x": "^4.16.2",
168
168
  "fast-check": "^4.5.3",
169
169
  "husky": "^9.1.7",
170
170
  "lint-staged": "^16.2.7",
@@ -176,12 +176,12 @@
176
176
  "@codex-ai/plugin": "file:vendor/codex-ai-plugin",
177
177
  "@codex-ai/sdk": "file:vendor/codex-ai-sdk",
178
178
  "@openauthjs/openauth": "^0.4.3",
179
- "hono": "4.12.18",
179
+ "hono": "4.12.21",
180
180
  "undici": "6.25.0",
181
181
  "zod": "4.4.3"
182
182
  },
183
183
  "overrides": {
184
- "hono": "4.12.18",
184
+ "hono": "4.12.21",
185
185
  "flatted": "3.4.2",
186
186
  "minimatch": "10.2.4",
187
187
  "picomatch": "4.0.4",
@@ -2,10 +2,16 @@
2
2
 
3
3
  // @ts-check
4
4
 
5
- import { existsSync, readdirSync } from "node:fs";
6
- import { homedir } from "node:os";
7
- import { join, resolve } from "node:path";
5
+ // Thin, CI-aware install notice (audit roadmap §4.5.4).
6
+ //
7
+ // All app detection, Codex app bind self-heal, and launcher routing that used
8
+ // to run here now run lazily on the first CLI invocation — see
9
+ // lib/runtime/first-run.ts (ensureFirstRunSetup). This script performs no
10
+ // detection and no filesystem mutation: it exits 0 silently in CI/non-TTY
11
+ // contexts and otherwise prints a short notice to stderr.
12
+
8
13
  import process from "node:process";
14
+ import { resolve } from "node:path";
9
15
  import { fileURLToPath } from "node:url";
10
16
 
11
17
  const TRUE_VALUES = new Set(["1", "true", "yes"]);
@@ -24,6 +30,11 @@ const CI_ENV_KEYS = [
24
30
  "BITBUCKET_BUILD_NUMBER",
25
31
  ];
26
32
 
33
+ export const INSTALL_NOTICE = [
34
+ "codex-multi-auth installed. Run `codex-multi-auth --help` to get started.",
35
+ "App integration (Codex app bind + launcher shortcuts) completes automatically on first run.",
36
+ ].join("\n");
37
+
27
38
  /**
28
39
  * @param {string | undefined} value
29
40
  */
@@ -35,15 +46,6 @@ export function readOptionalBoolean(value) {
35
46
  return null;
36
47
  }
37
48
 
38
- /**
39
- * @param {NodeJS.ProcessEnv} env
40
- */
41
- export function isGlobalNpmInstall(env = process.env) {
42
- const globalFlag = readOptionalBoolean(env.npm_config_global);
43
- if (globalFlag === true) return true;
44
- return (env.npm_config_location ?? "").trim().toLowerCase() === "global";
45
- }
46
-
47
49
  /**
48
50
  * @param {NodeJS.ProcessEnv} env
49
51
  * @param {string} key
@@ -64,263 +66,39 @@ export function isCiEnvironment(env = process.env) {
64
66
  }
65
67
 
66
68
  /**
67
- * @param {string} directory
68
- * @param {string} prefix
69
- */
70
- function directoryContainsEntryWithPrefix(directory, prefix) {
71
- try {
72
- return readdirSync(directory, { withFileTypes: true }).some((entry) =>
73
- entry.name.startsWith(prefix),
74
- );
75
- } catch {
76
- return false;
77
- }
78
- }
79
-
80
- /**
81
- * @param {{ env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform, home?: string }} [options]
82
- */
83
- export function hasCodexDesktopApp(options = {}) {
84
- const env = options.env ?? process.env;
85
- const platform = options.platform ?? process.platform;
86
- const home = options.home ?? homedir();
87
-
88
- if (platform === "win32") {
89
- const localAppData =
90
- (env.LOCALAPPDATA ?? "").trim() || join(home, "AppData", "Local");
91
- const programFiles =
92
- (env.ProgramFiles ?? env.ProgramW6432 ?? "").trim() || "C:\\Program Files";
93
- return (
94
- directoryContainsEntryWithPrefix(
95
- join(localAppData, "Packages"),
96
- "OpenAI.Codex_",
97
- ) ||
98
- directoryContainsEntryWithPrefix(
99
- join(programFiles, "WindowsApps"),
100
- "OpenAI.Codex_",
101
- )
102
- );
103
- }
104
-
105
- if (platform === "darwin") {
106
- return (
107
- existsSync("/Applications/Codex.app") ||
108
- existsSync(join(home, "Applications", "Codex.app"))
109
- );
110
- }
111
-
112
- return false;
113
- }
114
-
115
- /**
116
- * @param {{
117
- * env?: NodeJS.ProcessEnv,
118
- * platform?: NodeJS.Platform,
119
- * home?: string,
120
- * rotationEnabled: boolean,
121
- * appDetected?: boolean,
122
- * }} options
123
- */
124
- export function shouldAutoBindCodexAppOnInstall(options) {
125
- const env = options.env ?? process.env;
126
- if (isCiEnvironment(env)) return false;
127
-
128
- const bindOverride = readOptionalBoolean(env.CODEX_MULTI_AUTH_APP_BIND);
129
- if (bindOverride !== null) return bindOverride;
130
-
131
- const installOverride = readOptionalBoolean(
132
- env.CODEX_MULTI_AUTH_APP_BIND_INSTALL,
133
- );
134
- if (installOverride !== null) return installOverride;
135
-
136
- if (!isGlobalNpmInstall(env)) return false;
137
- if (!options.rotationEnabled) return false;
138
- return (
139
- options.appDetected ??
140
- hasCodexDesktopApp({
141
- env,
142
- platform: options.platform,
143
- home: options.home,
144
- })
145
- );
146
- }
147
-
148
- /**
149
- * @param {{
150
- * env?: NodeJS.ProcessEnv,
151
- * rotationEnabled: boolean,
152
- * }} options
153
- */
154
- export function shouldAutoInstallCodexAppLauncherOnInstall(options) {
155
- const env = options.env ?? process.env;
156
- if (isCiEnvironment(env)) return false;
157
-
158
- const installOverride = readOptionalBoolean(
159
- env.CODEX_MULTI_AUTH_APP_LAUNCHER_INSTALL,
160
- );
161
- if (installOverride !== null) return installOverride;
162
-
163
- if (!isGlobalNpmInstall(env)) return false;
164
- return options.rotationEnabled;
165
- }
166
-
167
- async function loadConfigModule() {
168
- try {
169
- return await import("../dist/lib/config.js");
170
- } catch (error) {
171
- if (
172
- error &&
173
- typeof error === "object" &&
174
- "code" in error &&
175
- error.code === "ERR_MODULE_NOT_FOUND"
176
- ) {
177
- return null;
178
- }
179
- throw error;
180
- }
181
- }
182
-
183
- async function loadAppBindModule() {
184
- try {
185
- return await import("../dist/lib/runtime/app-bind.js");
186
- } catch (error) {
187
- if (
188
- error &&
189
- typeof error === "object" &&
190
- "code" in error &&
191
- error.code === "ERR_MODULE_NOT_FOUND"
192
- ) {
193
- return null;
194
- }
195
- throw error;
196
- }
197
- }
198
-
199
- /**
200
- * @param {unknown} configModule
201
69
  * @param {NodeJS.ProcessEnv} [env]
70
+ * @param {boolean} [isTty]
202
71
  */
203
- export function resolveRotationEnabled(configModule, env = process.env) {
204
- const envOverride = readOptionalBoolean(
205
- env.CODEX_MULTI_AUTH_RUNTIME_ROTATION_PROXY,
206
- );
207
- if (envOverride !== null) return envOverride;
208
- if (
209
- !configModule ||
210
- typeof configModule.loadPluginConfig !== "function" ||
211
- typeof configModule.getCodexRuntimeRotationProxy !== "function"
212
- ) {
213
- return true;
214
- }
215
- return (
216
- configModule.getCodexRuntimeRotationProxy(configModule.loadPluginConfig()) ===
217
- true
218
- );
219
- }
220
-
221
- function defaultPostinstallLog(message) {
222
- console.error(`codex-multi-auth: ${message}`);
223
- }
224
-
225
- /**
226
- * @param {boolean} rotationEnabled
227
- */
228
- async function maybeBindCodexAppOnInstall(rotationEnabled) {
229
- const appBindModule = await loadAppBindModule();
230
- if (!appBindModule || typeof appBindModule.bindCodexAppRuntimeRotation !== "function") {
231
- return;
232
- }
233
-
234
- const currentStatus =
235
- typeof appBindModule.getAppBindStatus === "function"
236
- ? await appBindModule.getAppBindStatus().catch(() => null)
237
- : null;
238
- const appDetected = hasCodexDesktopApp() || currentStatus?.bound === true;
239
- if (!shouldAutoBindCodexAppOnInstall({ rotationEnabled, appDetected })) {
240
- return;
241
- }
242
-
243
- const result = await appBindModule.bindCodexAppRuntimeRotation();
244
- if (result?.message) {
245
- console.error(`codex-multi-auth: ${result.message}`);
246
- }
247
- }
248
-
249
- /**
250
- * @param {boolean} rotationEnabled
251
- * @param {(message: string) => void} [log]
252
- */
253
- export async function maybeInstallCodexAppLauncherOnInstall(
254
- rotationEnabled,
255
- log = defaultPostinstallLog,
72
+ export function shouldPrintInstallNotice(
73
+ env = process.env,
74
+ isTty = process.stderr.isTTY === true,
256
75
  ) {
257
- if (!shouldAutoInstallCodexAppLauncherOnInstall({ rotationEnabled })) {
258
- return;
259
- }
260
-
261
- try {
262
- const launcherModule = await import("./codex-app-launcher.js");
263
- if (typeof launcherModule.installCodexAppLauncher !== "function") {
264
- return;
265
- }
266
- await launcherModule.installCodexAppLauncher({
267
- log,
268
- });
269
- } catch (error) {
270
- log(
271
- `app launcher postinstall skipped: ${error instanceof Error ? error.message : String(error)}`,
272
- );
273
- }
76
+ if (isCiEnvironment(env)) return false;
77
+ return isTty === true;
274
78
  }
275
79
 
276
80
  /**
277
81
  * @param {{
278
- * loadConfigModule?: () => Promise<unknown>,
279
- * bindCodexApp?: (rotationEnabled: boolean) => Promise<void>,
280
- * installLauncher?: (rotationEnabled: boolean) => Promise<void>,
281
- * log?: (message: string) => void,
282
82
  * env?: NodeJS.ProcessEnv,
283
- * }} [deps]
83
+ * isTty?: boolean,
84
+ * log?: (message: string) => void,
85
+ * }} [options]
86
+ * @returns {number} always 0 — an install notice must never fail an install
284
87
  */
285
- export async function runPostinstallSelfHeal(deps = {}) {
286
- const loadConfig = deps.loadConfigModule ?? loadConfigModule;
287
- const bindCodexApp = deps.bindCodexApp ?? maybeBindCodexAppOnInstall;
288
- const log = deps.log ?? defaultPostinstallLog;
289
- const installLauncher =
290
- deps.installLauncher ??
291
- ((rotationEnabled) =>
292
- maybeInstallCodexAppLauncherOnInstall(rotationEnabled, log));
293
- const configModule = await loadConfig();
294
- const rotationEnabled = resolveRotationEnabled(configModule, deps.env);
295
-
88
+ export function runPostinstall(options = {}) {
296
89
  try {
297
- await bindCodexApp(rotationEnabled);
298
- } catch (error) {
299
- log(
300
- `app bind postinstall skipped: ${error instanceof Error ? error.message : String(error)}`,
301
- );
302
- }
303
-
304
- try {
305
- await installLauncher(rotationEnabled);
306
- } catch (error) {
307
- log(
308
- `app launcher postinstall skipped: ${error instanceof Error ? error.message : String(error)}`,
309
- );
90
+ const env = options.env ?? process.env;
91
+ const isTty = options.isTty ?? process.stderr.isTTY === true;
92
+ if (shouldPrintInstallNotice(env, isTty)) {
93
+ const log = options.log ?? ((message) => console.error(message));
94
+ log(INSTALL_NOTICE);
95
+ }
96
+ } catch {
97
+ // Best-effort notice only.
310
98
  }
311
99
  return 0;
312
100
  }
313
101
 
314
- async function main() {
315
- return runPostinstallSelfHeal();
316
- }
317
-
318
- function normalizePostinstallExitCode(exitCode) {
319
- return Number.isInteger(exitCode) && exitCode >= 0 && exitCode <= 255
320
- ? exitCode
321
- : 0;
322
- }
323
-
324
102
  const isDirectRun = (() => {
325
103
  try {
326
104
  return resolve(process.argv[1] ?? "") === fileURLToPath(import.meta.url);
@@ -330,14 +108,5 @@ const isDirectRun = (() => {
330
108
  })();
331
109
 
332
110
  if (isDirectRun) {
333
- main()
334
- .then((exitCode) => {
335
- process.exitCode = normalizePostinstallExitCode(exitCode);
336
- })
337
- .catch((error) => {
338
- defaultPostinstallLog(
339
- `postinstall self-heal skipped: ${error instanceof Error ? error.message : String(error)}`,
340
- );
341
- process.exitCode = 0;
342
- });
111
+ process.exitCode = runPostinstall();
343
112
  }
@@ -62,7 +62,7 @@ export async function runPreuninstallCleanup(deps = {}) {
62
62
  /** @type {"safe" | "uncertain"} */
63
63
  let bunLockState = "uncertain";
64
64
 
65
- // Unbind Codex app runtime rotation (reverses postinstall bind)
65
+ // Unbind Codex app runtime rotation (reverses install-time/first-run bind)
66
66
  try {
67
67
  if (deps.unbindCodexApp) {
68
68
  await deps.unbindCodexApp(dryRun);
@@ -85,7 +85,7 @@ export async function runPreuninstallCleanup(deps = {}) {
85
85
  );
86
86
  }
87
87
 
88
- // Remove OS-level launcher (reverses postinstall launcher install)
88
+ // Remove OS-level launcher (reverses install-time/first-run launcher install)
89
89
  try {
90
90
  if (deps.removeLauncher) {
91
91
  await deps.removeLauncher({ dryRun, log });