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,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
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"unified-settings.d.ts","sourceRoot":"","sources":["../../lib/unified-settings.ts"],"names":[],"mappings":"AAcA,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1C,eAAO,MAAM,wBAAwB,EAAG,CAAU,CAAC;AA2bnD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,IAAI,UAAU,GAAG,IAAI,CAQ/D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,CAAC,YAAY,EAAE,UAAU,GAAG,IAAI,CAO1E;AAED;;;;;;;;;GASG;AACH,wBAAsB,uBAAuB,CAAC,YAAY,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBrF;AAED;;;;;;;;GAQG;AACH,wBAAsB,4BAA4B,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAQ/E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,4BAA4B,CACjD,wBAAwB,EAAE,UAAU,GAClC,OAAO,CAAC,IAAI,CAAC,CAsBf"}
1
+ {"version":3,"file":"unified-settings.d.ts","sourceRoot":"","sources":["../../lib/unified-settings.ts"],"names":[],"mappings":"AAeA,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1C,eAAO,MAAM,wBAAwB,EAAG,CAAU,CAAC;AA2bnD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,IAAI,UAAU,GAAG,IAAI,CAQ/D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,CAAC,YAAY,EAAE,UAAU,GAAG,IAAI,CAO1E;AAED;;;;;;;;;GASG;AACH,wBAAsB,uBAAuB,CAAC,YAAY,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBrF;AAED;;;;;;;;GAQG;AACH,wBAAsB,4BAA4B,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAQ/E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,4BAA4B,CACjD,wBAAwB,EAAE,UAAU,GAClC,OAAO,CAAC,IAAI,CAAC,CAsBf"}
@@ -2,6 +2,7 @@ import { copyFileSync, existsSync, mkdirSync, renameSync, readFileSync, unlinkSy
2
2
  import { join } from "node:path";
3
3
  import { getCodexMultiAuthDir } from "./runtime-paths.js";
4
4
  import { sleep } from "./utils.js";
5
+ import { tempPathFor } from "./temp-path.js";
5
6
  export const UNIFIED_SETTINGS_VERSION = 1;
6
7
  const UNIFIED_SETTINGS_PATH = join(getCodexMultiAuthDir(), "settings.json");
7
8
  const UNIFIED_SETTINGS_BACKUP_PATH = `${UNIFIED_SETTINGS_PATH}.bak`;
@@ -341,7 +342,7 @@ async function writeSettingsRecordAsync(record, options) {
341
342
  await fs.mkdir(getCodexMultiAuthDir(), { recursive: true });
342
343
  const payload = normalizeForWrite(record);
343
344
  const data = `${JSON.stringify(payload, null, 2)}\n`;
344
- const tempPath = `${UNIFIED_SETTINGS_PATH}.${process.pid}.${Date.now()}.${Math.random().toString(36).slice(2, 8)}.tmp`;
345
+ const tempPath = tempPathFor(UNIFIED_SETTINGS_PATH);
345
346
  await trySnapshotUnifiedSettingsBackupAsync({
346
347
  skipBecauseBackupRead: options?.skipBackupSnapshot,
347
348
  });
@@ -549,4 +550,3 @@ export async function saveUnifiedDashboardSettings(dashboardDisplaySettings) {
549
550
  }
550
551
  });
551
552
  }
552
- //# sourceMappingURL=unified-settings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"update-notice.d.ts","sourceRoot":"","sources":["../../lib/update-notice.ts"],"names":[],"mappings":"AA0CA,MAAM,WAAW,iBAAiB;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;CACtB;AA+DD,wBAAgB,+BAA+B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAmBzE;AA0JD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAM1E;AAED,wBAAsB,eAAe,CACpC,KAAK,UAAQ,EACb,cAAc,SAA0B,GACtC,OAAO,CAAC,iBAAiB,CAAC,CAwC5B;AAED,wBAAsB,cAAc,CACnC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,GACzE,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAUvC"}
1
+ {"version":3,"file":"update-notice.d.ts","sourceRoot":"","sources":["../../lib/update-notice.ts"],"names":[],"mappings":"AA2CA,MAAM,WAAW,iBAAiB;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;CACtB;AA+DD,wBAAgB,+BAA+B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAmBzE;AA0JD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAM1E;AAED,wBAAsB,eAAe,CACpC,KAAK,UAAQ,EACb,cAAc,SAA0B,GACtC,OAAO,CAAC,iBAAiB,CAAC,CAwC5B;AAED,wBAAsB,cAAc,CACnC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,GACzE,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAUvC"}
@@ -3,6 +3,7 @@ import { dirname, join } from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
4
  import { createLogger } from "./logger.js";
5
5
  import { getCodexCacheDir } from "./runtime-paths.js";
6
+ import { tempPathFor } from "./temp-path.js";
6
7
  const log = createLogger("update-notice");
7
8
  const PACKAGE_NAME = "codex-multi-auth";
8
9
  const NPM_REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;
@@ -34,7 +35,7 @@ async function writeCacheContents(serialized) {
34
35
  if (!existsSync(CACHE_DIR)) {
35
36
  mkdirSync(CACHE_DIR, { recursive: true });
36
37
  }
37
- tempPath = `${CACHE_FILE}.${process.pid}.${Date.now()}.${Math.random().toString(36).slice(2, 8)}.tmp`;
38
+ tempPath = tempPathFor(CACHE_FILE);
38
39
  let lastError = null;
39
40
  for (let attempt = 0; attempt < 4; attempt++) {
40
41
  try {
@@ -312,4 +313,3 @@ export function clearUpdateCache() {
312
313
  }
313
314
  });
314
315
  }
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.1",
3
+ "version": "2.3.0-beta.3",
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,17 @@
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
- "@fast-check/vitest": "^0.2.4",
162
- "@types/node": "^25.3.0",
159
+ "@types/node": "^20.19.42",
163
160
  "@typescript-eslint/eslint-plugin": "^8.56.0",
164
161
  "@typescript-eslint/parser": "^8.56.0",
165
162
  "@vitest/coverage-v8": "^4.1.8",
166
163
  "@vitest/ui": "^4.1.8",
167
164
  "eslint": "^10.0.0",
165
+ "eslint-import-resolver-typescript": "^4.4.5",
166
+ "eslint-plugin-import-x": "^4.16.2",
168
167
  "fast-check": "^4.5.3",
169
168
  "husky": "^9.1.7",
170
169
  "lint-staged": "^16.2.7",
@@ -176,12 +175,12 @@
176
175
  "@codex-ai/plugin": "file:vendor/codex-ai-plugin",
177
176
  "@codex-ai/sdk": "file:vendor/codex-ai-sdk",
178
177
  "@openauthjs/openauth": "^0.4.3",
179
- "hono": "4.12.18",
178
+ "hono": "4.12.21",
180
179
  "undici": "6.25.0",
181
180
  "zod": "4.4.3"
182
181
  },
183
182
  "overrides": {
184
- "hono": "4.12.18",
183
+ "hono": "4.12.21",
185
184
  "flatted": "3.4.2",
186
185
  "minimatch": "10.2.4",
187
186
  "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 });