codex-multi-auth 0.1.0

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 (327) hide show
  1. package/LICENSE +1 -0
  2. package/README.md +162 -0
  3. package/assets/opencode-logo-ornate-dark.svg +18 -0
  4. package/assets/readme-hero.svg +31 -0
  5. package/config/README.md +87 -0
  6. package/config/minimal-opencode.json +13 -0
  7. package/config/opencode-legacy.json +571 -0
  8. package/config/opencode-modern.json +239 -0
  9. package/dist/index.d.ts +45 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +3160 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/lib/accounts/rate-limits.d.ts +22 -0
  14. package/dist/lib/accounts/rate-limits.d.ts.map +1 -0
  15. package/dist/lib/accounts/rate-limits.js +63 -0
  16. package/dist/lib/accounts/rate-limits.js.map +1 -0
  17. package/dist/lib/accounts.d.ts +95 -0
  18. package/dist/lib/accounts.d.ts.map +1 -0
  19. package/dist/lib/accounts.js +668 -0
  20. package/dist/lib/accounts.js.map +1 -0
  21. package/dist/lib/audit.d.ts +45 -0
  22. package/dist/lib/audit.d.ts.map +1 -0
  23. package/dist/lib/audit.js +131 -0
  24. package/dist/lib/audit.js.map +1 -0
  25. package/dist/lib/auth/auth.d.ts +56 -0
  26. package/dist/lib/auth/auth.d.ts.map +1 -0
  27. package/dist/lib/auth/auth.js +214 -0
  28. package/dist/lib/auth/auth.js.map +1 -0
  29. package/dist/lib/auth/browser.d.ts +34 -0
  30. package/dist/lib/auth/browser.d.ts.map +1 -0
  31. package/dist/lib/auth/browser.js +185 -0
  32. package/dist/lib/auth/browser.js.map +1 -0
  33. package/dist/lib/auth/server.d.ts +24 -0
  34. package/dist/lib/auth/server.d.ts.map +1 -0
  35. package/dist/lib/auth/server.js +116 -0
  36. package/dist/lib/auth/server.js.map +1 -0
  37. package/dist/lib/auth/token-utils.d.ts +59 -0
  38. package/dist/lib/auth/token-utils.d.ts.map +1 -0
  39. package/dist/lib/auth/token-utils.js +331 -0
  40. package/dist/lib/auth/token-utils.js.map +1 -0
  41. package/dist/lib/auth-rate-limit.d.ts +20 -0
  42. package/dist/lib/auth-rate-limit.d.ts.map +1 -0
  43. package/dist/lib/auth-rate-limit.js +91 -0
  44. package/dist/lib/auth-rate-limit.js.map +1 -0
  45. package/dist/lib/auto-update-checker.d.ts +10 -0
  46. package/dist/lib/auto-update-checker.d.ts.map +1 -0
  47. package/dist/lib/auto-update-checker.js +216 -0
  48. package/dist/lib/auto-update-checker.js.map +1 -0
  49. package/dist/lib/capability-policy.d.ts +18 -0
  50. package/dist/lib/capability-policy.d.ts.map +1 -0
  51. package/dist/lib/capability-policy.js +150 -0
  52. package/dist/lib/capability-policy.js.map +1 -0
  53. package/dist/lib/circuit-breaker.d.ts +34 -0
  54. package/dist/lib/circuit-breaker.d.ts.map +1 -0
  55. package/dist/lib/circuit-breaker.js +124 -0
  56. package/dist/lib/circuit-breaker.js.map +1 -0
  57. package/dist/lib/cli.d.ts +64 -0
  58. package/dist/lib/cli.d.ts.map +1 -0
  59. package/dist/lib/cli.js +274 -0
  60. package/dist/lib/cli.js.map +1 -0
  61. package/dist/lib/codex-cli/observability.d.ts +22 -0
  62. package/dist/lib/codex-cli/observability.d.ts.map +1 -0
  63. package/dist/lib/codex-cli/observability.js +36 -0
  64. package/dist/lib/codex-cli/observability.js.map +1 -0
  65. package/dist/lib/codex-cli/state.d.ts +86 -0
  66. package/dist/lib/codex-cli/state.d.ts.map +1 -0
  67. package/dist/lib/codex-cli/state.js +470 -0
  68. package/dist/lib/codex-cli/state.js.map +1 -0
  69. package/dist/lib/codex-cli/sync.d.ts +27 -0
  70. package/dist/lib/codex-cli/sync.d.ts.map +1 -0
  71. package/dist/lib/codex-cli/sync.js +325 -0
  72. package/dist/lib/codex-cli/sync.js.map +1 -0
  73. package/dist/lib/codex-cli/writer.d.ts +12 -0
  74. package/dist/lib/codex-cli/writer.d.ts.map +1 -0
  75. package/dist/lib/codex-cli/writer.js +388 -0
  76. package/dist/lib/codex-cli/writer.js.map +1 -0
  77. package/dist/lib/codex-manager.d.ts +2 -0
  78. package/dist/lib/codex-manager.d.ts.map +1 -0
  79. package/dist/lib/codex-manager.js +4841 -0
  80. package/dist/lib/codex-manager.js.map +1 -0
  81. package/dist/lib/config.d.ts +269 -0
  82. package/dist/lib/config.d.ts.map +1 -0
  83. package/dist/lib/config.js +789 -0
  84. package/dist/lib/config.js.map +1 -0
  85. package/dist/lib/constants.d.ts +78 -0
  86. package/dist/lib/constants.d.ts.map +1 -0
  87. package/dist/lib/constants.js +78 -0
  88. package/dist/lib/constants.js.map +1 -0
  89. package/dist/lib/context-overflow.d.ts +27 -0
  90. package/dist/lib/context-overflow.d.ts.map +1 -0
  91. package/dist/lib/context-overflow.js +124 -0
  92. package/dist/lib/context-overflow.js.map +1 -0
  93. package/dist/lib/dashboard-settings.d.ts +90 -0
  94. package/dist/lib/dashboard-settings.d.ts.map +1 -0
  95. package/dist/lib/dashboard-settings.js +327 -0
  96. package/dist/lib/dashboard-settings.js.map +1 -0
  97. package/dist/lib/entitlement-cache.d.ts +41 -0
  98. package/dist/lib/entitlement-cache.d.ts.map +1 -0
  99. package/dist/lib/entitlement-cache.js +137 -0
  100. package/dist/lib/entitlement-cache.js.map +1 -0
  101. package/dist/lib/errors.d.ts +113 -0
  102. package/dist/lib/errors.d.ts.map +1 -0
  103. package/dist/lib/errors.js +103 -0
  104. package/dist/lib/errors.js.map +1 -0
  105. package/dist/lib/forecast.d.ts +42 -0
  106. package/dist/lib/forecast.d.ts.map +1 -0
  107. package/dist/lib/forecast.js +256 -0
  108. package/dist/lib/forecast.js.map +1 -0
  109. package/dist/lib/health.d.ts +33 -0
  110. package/dist/lib/health.d.ts.map +1 -0
  111. package/dist/lib/health.js +70 -0
  112. package/dist/lib/health.js.map +1 -0
  113. package/dist/lib/index.d.ts +32 -0
  114. package/dist/lib/index.d.ts.map +1 -0
  115. package/dist/lib/index.js +32 -0
  116. package/dist/lib/index.js.map +1 -0
  117. package/dist/lib/live-account-sync.d.ts +39 -0
  118. package/dist/lib/live-account-sync.d.ts.map +1 -0
  119. package/dist/lib/live-account-sync.js +196 -0
  120. package/dist/lib/live-account-sync.js.map +1 -0
  121. package/dist/lib/logger.d.ts +40 -0
  122. package/dist/lib/logger.d.ts.map +1 -0
  123. package/dist/lib/logger.js +364 -0
  124. package/dist/lib/logger.js.map +1 -0
  125. package/dist/lib/oauth-success.html +338 -0
  126. package/dist/lib/parallel-probe.d.ts +28 -0
  127. package/dist/lib/parallel-probe.d.ts.map +1 -0
  128. package/dist/lib/parallel-probe.js +97 -0
  129. package/dist/lib/parallel-probe.js.map +1 -0
  130. package/dist/lib/preemptive-quota-scheduler.d.ts +53 -0
  131. package/dist/lib/preemptive-quota-scheduler.d.ts.map +1 -0
  132. package/dist/lib/preemptive-quota-scheduler.js +220 -0
  133. package/dist/lib/preemptive-quota-scheduler.js.map +1 -0
  134. package/dist/lib/proactive-refresh.d.ts +66 -0
  135. package/dist/lib/proactive-refresh.d.ts.map +1 -0
  136. package/dist/lib/proactive-refresh.js +143 -0
  137. package/dist/lib/proactive-refresh.js.map +1 -0
  138. package/dist/lib/prompts/codex-opencode-bridge.d.ts +19 -0
  139. package/dist/lib/prompts/codex-opencode-bridge.d.ts.map +1 -0
  140. package/dist/lib/prompts/codex-opencode-bridge.js +169 -0
  141. package/dist/lib/prompts/codex-opencode-bridge.js.map +1 -0
  142. package/dist/lib/prompts/codex.d.ts +41 -0
  143. package/dist/lib/prompts/codex.d.ts.map +1 -0
  144. package/dist/lib/prompts/codex.js +383 -0
  145. package/dist/lib/prompts/codex.js.map +1 -0
  146. package/dist/lib/prompts/opencode-codex.d.ts +25 -0
  147. package/dist/lib/prompts/opencode-codex.d.ts.map +1 -0
  148. package/dist/lib/prompts/opencode-codex.js +270 -0
  149. package/dist/lib/prompts/opencode-codex.js.map +1 -0
  150. package/dist/lib/quota-cache.d.ts +68 -0
  151. package/dist/lib/quota-cache.d.ts.map +1 -0
  152. package/dist/lib/quota-cache.js +224 -0
  153. package/dist/lib/quota-cache.js.map +1 -0
  154. package/dist/lib/quota-probe.d.ts +49 -0
  155. package/dist/lib/quota-probe.d.ts.map +1 -0
  156. package/dist/lib/quota-probe.js +368 -0
  157. package/dist/lib/quota-probe.js.map +1 -0
  158. package/dist/lib/recovery/constants.d.ts +12 -0
  159. package/dist/lib/recovery/constants.d.ts.map +1 -0
  160. package/dist/lib/recovery/constants.js +31 -0
  161. package/dist/lib/recovery/constants.js.map +1 -0
  162. package/dist/lib/recovery/index.d.ts +12 -0
  163. package/dist/lib/recovery/index.d.ts.map +1 -0
  164. package/dist/lib/recovery/index.js +12 -0
  165. package/dist/lib/recovery/index.js.map +1 -0
  166. package/dist/lib/recovery/storage.d.ts +24 -0
  167. package/dist/lib/recovery/storage.d.ts.map +1 -0
  168. package/dist/lib/recovery/storage.js +362 -0
  169. package/dist/lib/recovery/storage.js.map +1 -0
  170. package/dist/lib/recovery/types.d.ts +116 -0
  171. package/dist/lib/recovery/types.d.ts.map +1 -0
  172. package/dist/lib/recovery/types.js +7 -0
  173. package/dist/lib/recovery/types.js.map +1 -0
  174. package/dist/lib/recovery.d.ts +31 -0
  175. package/dist/lib/recovery.d.ts.map +1 -0
  176. package/dist/lib/recovery.js +313 -0
  177. package/dist/lib/recovery.js.map +1 -0
  178. package/dist/lib/refresh-guardian.d.ts +31 -0
  179. package/dist/lib/refresh-guardian.d.ts.map +1 -0
  180. package/dist/lib/refresh-guardian.js +151 -0
  181. package/dist/lib/refresh-guardian.js.map +1 -0
  182. package/dist/lib/refresh-lease.d.ts +37 -0
  183. package/dist/lib/refresh-lease.d.ts.map +1 -0
  184. package/dist/lib/refresh-lease.js +335 -0
  185. package/dist/lib/refresh-lease.js.map +1 -0
  186. package/dist/lib/refresh-queue.d.ts +117 -0
  187. package/dist/lib/refresh-queue.d.ts.map +1 -0
  188. package/dist/lib/refresh-queue.js +297 -0
  189. package/dist/lib/refresh-queue.js.map +1 -0
  190. package/dist/lib/request/failure-policy.d.ts +42 -0
  191. package/dist/lib/request/failure-policy.d.ts.map +1 -0
  192. package/dist/lib/request/failure-policy.js +133 -0
  193. package/dist/lib/request/failure-policy.js.map +1 -0
  194. package/dist/lib/request/fetch-helpers.d.ts +152 -0
  195. package/dist/lib/request/fetch-helpers.d.ts.map +1 -0
  196. package/dist/lib/request/fetch-helpers.js +704 -0
  197. package/dist/lib/request/fetch-helpers.js.map +1 -0
  198. package/dist/lib/request/helpers/input-utils.d.ts +7 -0
  199. package/dist/lib/request/helpers/input-utils.d.ts.map +1 -0
  200. package/dist/lib/request/helpers/input-utils.js +214 -0
  201. package/dist/lib/request/helpers/input-utils.js.map +1 -0
  202. package/dist/lib/request/helpers/model-map.d.ts +28 -0
  203. package/dist/lib/request/helpers/model-map.d.ts.map +1 -0
  204. package/dist/lib/request/helpers/model-map.js +133 -0
  205. package/dist/lib/request/helpers/model-map.js.map +1 -0
  206. package/dist/lib/request/helpers/tool-utils.d.ts +29 -0
  207. package/dist/lib/request/helpers/tool-utils.d.ts.map +1 -0
  208. package/dist/lib/request/helpers/tool-utils.js +117 -0
  209. package/dist/lib/request/helpers/tool-utils.js.map +1 -0
  210. package/dist/lib/request/rate-limit-backoff.d.ts +17 -0
  211. package/dist/lib/request/rate-limit-backoff.d.ts.map +1 -0
  212. package/dist/lib/request/rate-limit-backoff.js +83 -0
  213. package/dist/lib/request/rate-limit-backoff.js.map +1 -0
  214. package/dist/lib/request/request-transformer.d.ts +107 -0
  215. package/dist/lib/request/request-transformer.d.ts.map +1 -0
  216. package/dist/lib/request/request-transformer.js +814 -0
  217. package/dist/lib/request/request-transformer.js.map +1 -0
  218. package/dist/lib/request/response-handler.d.ts +23 -0
  219. package/dist/lib/request/response-handler.d.ts.map +1 -0
  220. package/dist/lib/request/response-handler.js +155 -0
  221. package/dist/lib/request/response-handler.js.map +1 -0
  222. package/dist/lib/request/stream-failover.d.ts +21 -0
  223. package/dist/lib/request/stream-failover.d.ts.map +1 -0
  224. package/dist/lib/request/stream-failover.js +204 -0
  225. package/dist/lib/request/stream-failover.js.map +1 -0
  226. package/dist/lib/rotation.d.ts +146 -0
  227. package/dist/lib/rotation.d.ts.map +1 -0
  228. package/dist/lib/rotation.js +321 -0
  229. package/dist/lib/rotation.js.map +1 -0
  230. package/dist/lib/runtime-paths.d.ts +58 -0
  231. package/dist/lib/runtime-paths.d.ts.map +1 -0
  232. package/dist/lib/runtime-paths.js +164 -0
  233. package/dist/lib/runtime-paths.js.map +1 -0
  234. package/dist/lib/schemas.d.ts +435 -0
  235. package/dist/lib/schemas.d.ts.map +1 -0
  236. package/dist/lib/schemas.js +268 -0
  237. package/dist/lib/schemas.js.map +1 -0
  238. package/dist/lib/session-affinity.d.ts +23 -0
  239. package/dist/lib/session-affinity.d.ts.map +1 -0
  240. package/dist/lib/session-affinity.js +127 -0
  241. package/dist/lib/session-affinity.js.map +1 -0
  242. package/dist/lib/shutdown.d.ts +7 -0
  243. package/dist/lib/shutdown.d.ts.map +1 -0
  244. package/dist/lib/shutdown.js +43 -0
  245. package/dist/lib/shutdown.js.map +1 -0
  246. package/dist/lib/storage/migrations.d.ts +59 -0
  247. package/dist/lib/storage/migrations.d.ts.map +1 -0
  248. package/dist/lib/storage/migrations.js +41 -0
  249. package/dist/lib/storage/migrations.js.map +1 -0
  250. package/dist/lib/storage/paths.d.ts +51 -0
  251. package/dist/lib/storage/paths.d.ts.map +1 -0
  252. package/dist/lib/storage/paths.js +152 -0
  253. package/dist/lib/storage/paths.js.map +1 -0
  254. package/dist/lib/storage.d.ts +106 -0
  255. package/dist/lib/storage.d.ts.map +1 -0
  256. package/dist/lib/storage.js +896 -0
  257. package/dist/lib/storage.js.map +1 -0
  258. package/dist/lib/table-formatter.d.ts +32 -0
  259. package/dist/lib/table-formatter.d.ts.map +1 -0
  260. package/dist/lib/table-formatter.js +44 -0
  261. package/dist/lib/table-formatter.js.map +1 -0
  262. package/dist/lib/tools/hashline-tools.d.ts +51 -0
  263. package/dist/lib/tools/hashline-tools.d.ts.map +1 -0
  264. package/dist/lib/tools/hashline-tools.js +456 -0
  265. package/dist/lib/tools/hashline-tools.js.map +1 -0
  266. package/dist/lib/types.d.ts +130 -0
  267. package/dist/lib/types.d.ts.map +1 -0
  268. package/dist/lib/types.js +2 -0
  269. package/dist/lib/types.js.map +1 -0
  270. package/dist/lib/ui/ansi.d.ts +40 -0
  271. package/dist/lib/ui/ansi.d.ts.map +1 -0
  272. package/dist/lib/ui/ansi.js +68 -0
  273. package/dist/lib/ui/ansi.js.map +1 -0
  274. package/dist/lib/ui/auth-menu.d.ts +76 -0
  275. package/dist/lib/ui/auth-menu.d.ts.map +1 -0
  276. package/dist/lib/ui/auth-menu.js +590 -0
  277. package/dist/lib/ui/auth-menu.js.map +1 -0
  278. package/dist/lib/ui/confirm.d.ts +11 -0
  279. package/dist/lib/ui/confirm.d.ts.map +1 -0
  280. package/dist/lib/ui/confirm.js +29 -0
  281. package/dist/lib/ui/confirm.js.map +1 -0
  282. package/dist/lib/ui/copy.d.ts +123 -0
  283. package/dist/lib/ui/copy.d.ts.map +1 -0
  284. package/dist/lib/ui/copy.js +127 -0
  285. package/dist/lib/ui/copy.js.map +1 -0
  286. package/dist/lib/ui/format.d.ts +62 -0
  287. package/dist/lib/ui/format.d.ts.map +1 -0
  288. package/dist/lib/ui/format.js +205 -0
  289. package/dist/lib/ui/format.js.map +1 -0
  290. package/dist/lib/ui/runtime.d.ts +43 -0
  291. package/dist/lib/ui/runtime.d.ts.map +1 -0
  292. package/dist/lib/ui/runtime.js +69 -0
  293. package/dist/lib/ui/runtime.js.map +1 -0
  294. package/dist/lib/ui/select.d.ts +60 -0
  295. package/dist/lib/ui/select.d.ts.map +1 -0
  296. package/dist/lib/ui/select.js +467 -0
  297. package/dist/lib/ui/select.js.map +1 -0
  298. package/dist/lib/ui/theme.d.ts +56 -0
  299. package/dist/lib/ui/theme.d.ts.map +1 -0
  300. package/dist/lib/ui/theme.js +186 -0
  301. package/dist/lib/ui/theme.js.map +1 -0
  302. package/dist/lib/unified-settings.d.ts +71 -0
  303. package/dist/lib/unified-settings.d.ts.map +1 -0
  304. package/dist/lib/unified-settings.js +299 -0
  305. package/dist/lib/unified-settings.js.map +1 -0
  306. package/dist/lib/utils.d.ts +29 -0
  307. package/dist/lib/utils.d.ts.map +1 -0
  308. package/dist/lib/utils.js +54 -0
  309. package/dist/lib/utils.js.map +1 -0
  310. package/package.json +115 -0
  311. package/scripts/audit-dev-allowlist.js +128 -0
  312. package/scripts/bench-format/hashline-v2.mjs +642 -0
  313. package/scripts/bench-format/models.mjs +105 -0
  314. package/scripts/bench-format/opencode.mjs +205 -0
  315. package/scripts/bench-format/render.mjs +496 -0
  316. package/scripts/bench-format/stats.mjs +54 -0
  317. package/scripts/bench-format/tasks.mjs +151 -0
  318. package/scripts/benchmark-edit-formats.mjs +1161 -0
  319. package/scripts/benchmark-render-dashboard.mjs +49 -0
  320. package/scripts/codex-multi-auth.js +6 -0
  321. package/scripts/codex-routing.js +34 -0
  322. package/scripts/codex.js +122 -0
  323. package/scripts/copy-oauth-success.js +37 -0
  324. package/scripts/install-opencode-codex-auth.js +193 -0
  325. package/scripts/test-all-models.sh +7 -0
  326. package/scripts/test-model-matrix.js +424 -0
  327. package/scripts/validate-model-map.sh +7 -0
@@ -0,0 +1,274 @@
1
+ import { createInterface } from "node:readline/promises";
2
+ import { stdin as input, stdout as output } from "node:process";
3
+ import { showAuthMenu, showAccountDetails, isTTY, } from "./ui/auth-menu.js";
4
+ import { UI_COPY } from "./ui/copy.js";
5
+ /**
6
+ * Detect if running in OpenCode Desktop/TUI mode where readline prompts don't work.
7
+ * In TUI mode, stdin/stdout are controlled by the TUI renderer, so readline breaks.
8
+ * Exported for testing purposes.
9
+ */
10
+ export function isNonInteractiveMode() {
11
+ if (process.env.FORCE_INTERACTIVE_MODE === "1")
12
+ return false;
13
+ if (!input.isTTY || !output.isTTY)
14
+ return true;
15
+ if (process.env.OPENCODE_TUI === "1")
16
+ return true;
17
+ if (process.env.OPENCODE_DESKTOP === "1")
18
+ return true;
19
+ if (process.env.TERM_PROGRAM === "opencode")
20
+ return true;
21
+ if (process.env.ELECTRON_RUN_AS_NODE === "1")
22
+ return true;
23
+ return false;
24
+ }
25
+ export async function promptAddAnotherAccount(currentCount) {
26
+ if (isNonInteractiveMode()) {
27
+ return false;
28
+ }
29
+ const rl = createInterface({ input, output });
30
+ try {
31
+ console.log(`\n${UI_COPY.fallback.addAnotherTip}\n`);
32
+ const answer = await rl.question(UI_COPY.fallback.addAnotherQuestion(currentCount));
33
+ const normalized = answer.trim().toLowerCase();
34
+ return normalized === "y" || normalized === "yes";
35
+ }
36
+ finally {
37
+ rl.close();
38
+ }
39
+ }
40
+ function formatAccountLabel(account, index) {
41
+ const num = index + 1;
42
+ const label = account.accountLabel?.trim();
43
+ if (account.email?.trim()) {
44
+ return label ? `${num}. ${label} (${account.email})` : `${num}. ${account.email}`;
45
+ }
46
+ if (label) {
47
+ return `${num}. ${label}`;
48
+ }
49
+ if (account.accountId?.trim()) {
50
+ const suffix = account.accountId.length > 6 ? account.accountId.slice(-6) : account.accountId;
51
+ return `${num}. ${suffix}`;
52
+ }
53
+ return `${num}. Account`;
54
+ }
55
+ function resolveAccountSourceIndex(account) {
56
+ const sourceIndex = typeof account.sourceIndex === "number" && Number.isFinite(account.sourceIndex)
57
+ ? Math.max(0, Math.floor(account.sourceIndex))
58
+ : undefined;
59
+ if (typeof sourceIndex === "number")
60
+ return sourceIndex;
61
+ if (typeof account.index === "number" && Number.isFinite(account.index)) {
62
+ return Math.max(0, Math.floor(account.index));
63
+ }
64
+ return -1;
65
+ }
66
+ function warnUnresolvableAccountSelection(account) {
67
+ const label = account.email?.trim() || account.accountId?.trim() || `index ${account.index + 1}`;
68
+ console.log(`Unable to resolve saved account for action: ${label}`);
69
+ }
70
+ async function promptDeleteAllTypedConfirm() {
71
+ const rl = createInterface({ input, output });
72
+ try {
73
+ const answer = await rl.question("Type DELETE to remove all saved accounts: ");
74
+ return answer.trim() === "DELETE";
75
+ }
76
+ finally {
77
+ rl.close();
78
+ }
79
+ }
80
+ async function promptLoginModeFallback(existingAccounts) {
81
+ const rl = createInterface({ input, output });
82
+ try {
83
+ if (existingAccounts.length > 0) {
84
+ console.log(`\n${existingAccounts.length} account(s) saved:`);
85
+ for (const account of existingAccounts) {
86
+ console.log(` ${formatAccountLabel(account, account.index)}`);
87
+ }
88
+ console.log("");
89
+ }
90
+ while (true) {
91
+ const answer = await rl.question(UI_COPY.fallback.selectModePrompt);
92
+ const normalized = answer.trim().toLowerCase();
93
+ if (normalized === "a" || normalized === "add")
94
+ return { mode: "add" };
95
+ if (normalized === "b" || normalized === "p" || normalized === "forecast") {
96
+ return { mode: "forecast" };
97
+ }
98
+ if (normalized === "x" || normalized === "fix")
99
+ return { mode: "fix" };
100
+ if (normalized === "s" || normalized === "settings" || normalized === "configure") {
101
+ return { mode: "settings" };
102
+ }
103
+ if (normalized === "f" || normalized === "fresh" || normalized === "clear") {
104
+ return { mode: "fresh", deleteAll: true };
105
+ }
106
+ if (normalized === "c" || normalized === "check")
107
+ return { mode: "check" };
108
+ if (normalized === "d" || normalized === "deep") {
109
+ return { mode: "deep-check" };
110
+ }
111
+ if (normalized === "g" ||
112
+ normalized === "flagged" ||
113
+ normalized === "verify-flagged" ||
114
+ normalized === "verify") {
115
+ return { mode: "verify-flagged" };
116
+ }
117
+ if (normalized === "q" || normalized === "quit")
118
+ return { mode: "cancel" };
119
+ console.log(UI_COPY.fallback.invalidModePrompt);
120
+ }
121
+ }
122
+ finally {
123
+ rl.close();
124
+ }
125
+ }
126
+ export async function promptLoginMode(existingAccounts, options = {}) {
127
+ if (isNonInteractiveMode()) {
128
+ return { mode: "add" };
129
+ }
130
+ if (!isTTY()) {
131
+ return promptLoginModeFallback(existingAccounts);
132
+ }
133
+ while (true) {
134
+ const action = await showAuthMenu(existingAccounts, {
135
+ flaggedCount: options.flaggedCount ?? 0,
136
+ statusMessage: options.statusMessage,
137
+ });
138
+ switch (action.type) {
139
+ case "add":
140
+ return { mode: "add" };
141
+ case "forecast":
142
+ return { mode: "forecast" };
143
+ case "fix":
144
+ return { mode: "fix" };
145
+ case "settings":
146
+ return { mode: "settings" };
147
+ case "fresh":
148
+ if (!(await promptDeleteAllTypedConfirm())) {
149
+ console.log("\nDelete all cancelled.\n");
150
+ continue;
151
+ }
152
+ return { mode: "fresh", deleteAll: true };
153
+ case "check":
154
+ return { mode: "check" };
155
+ case "deep-check":
156
+ return { mode: "deep-check" };
157
+ case "verify-flagged":
158
+ return { mode: "verify-flagged" };
159
+ case "select-account": {
160
+ const accountAction = await showAccountDetails(action.account);
161
+ if (accountAction === "delete") {
162
+ const index = resolveAccountSourceIndex(action.account);
163
+ if (index >= 0)
164
+ return { mode: "manage", deleteAccountIndex: index };
165
+ warnUnresolvableAccountSelection(action.account);
166
+ continue;
167
+ }
168
+ if (accountAction === "set-current") {
169
+ const index = resolveAccountSourceIndex(action.account);
170
+ if (index >= 0)
171
+ return { mode: "manage", switchAccountIndex: index };
172
+ warnUnresolvableAccountSelection(action.account);
173
+ continue;
174
+ }
175
+ if (accountAction === "refresh") {
176
+ const index = resolveAccountSourceIndex(action.account);
177
+ if (index >= 0)
178
+ return { mode: "manage", refreshAccountIndex: index };
179
+ warnUnresolvableAccountSelection(action.account);
180
+ continue;
181
+ }
182
+ if (accountAction === "toggle") {
183
+ const index = resolveAccountSourceIndex(action.account);
184
+ if (index >= 0)
185
+ return { mode: "manage", toggleAccountIndex: index };
186
+ warnUnresolvableAccountSelection(action.account);
187
+ continue;
188
+ }
189
+ continue;
190
+ }
191
+ case "set-current-account": {
192
+ const index = resolveAccountSourceIndex(action.account);
193
+ if (index >= 0)
194
+ return { mode: "manage", switchAccountIndex: index };
195
+ warnUnresolvableAccountSelection(action.account);
196
+ continue;
197
+ }
198
+ case "refresh-account": {
199
+ const index = resolveAccountSourceIndex(action.account);
200
+ if (index >= 0)
201
+ return { mode: "manage", refreshAccountIndex: index };
202
+ warnUnresolvableAccountSelection(action.account);
203
+ continue;
204
+ }
205
+ case "toggle-account": {
206
+ const index = resolveAccountSourceIndex(action.account);
207
+ if (index >= 0)
208
+ return { mode: "manage", toggleAccountIndex: index };
209
+ warnUnresolvableAccountSelection(action.account);
210
+ continue;
211
+ }
212
+ case "delete-account": {
213
+ const index = resolveAccountSourceIndex(action.account);
214
+ if (index >= 0)
215
+ return { mode: "manage", deleteAccountIndex: index };
216
+ warnUnresolvableAccountSelection(action.account);
217
+ continue;
218
+ }
219
+ case "search":
220
+ // Search is handled in showAuthMenu; keep the main loop active.
221
+ continue;
222
+ case "delete-all":
223
+ if (!(await promptDeleteAllTypedConfirm())) {
224
+ console.log("\nDelete all cancelled.\n");
225
+ continue;
226
+ }
227
+ return { mode: "fresh", deleteAll: true };
228
+ case "cancel":
229
+ return { mode: "cancel" };
230
+ }
231
+ }
232
+ }
233
+ export async function promptAccountSelection(candidates, options = {}) {
234
+ if (candidates.length === 0)
235
+ return null;
236
+ const defaultIndex = typeof options.defaultIndex === "number" && Number.isFinite(options.defaultIndex)
237
+ ? Math.max(0, Math.min(options.defaultIndex, candidates.length - 1))
238
+ : 0;
239
+ if (isNonInteractiveMode()) {
240
+ return candidates[defaultIndex] ?? candidates[0] ?? null;
241
+ }
242
+ const rl = createInterface({ input, output });
243
+ try {
244
+ console.log(`\n${options.title ?? "Multiple workspaces detected for this account:"}`);
245
+ candidates.forEach((candidate, index) => {
246
+ const isDefault = candidate.isDefault ? " (default)" : "";
247
+ console.log(` ${index + 1}. ${candidate.label}${isDefault}`);
248
+ });
249
+ console.log("");
250
+ while (true) {
251
+ const answer = await rl.question(`Select workspace [${defaultIndex + 1}]: `);
252
+ const normalized = answer.trim().toLowerCase();
253
+ if (!normalized) {
254
+ return candidates[defaultIndex] ?? candidates[0] ?? null;
255
+ }
256
+ if (normalized === "q" || normalized === "quit") {
257
+ return candidates[defaultIndex] ?? candidates[0] ?? null;
258
+ }
259
+ const parsed = Number.parseInt(normalized, 10);
260
+ if (Number.isFinite(parsed)) {
261
+ const idx = parsed - 1;
262
+ if (idx >= 0 && idx < candidates.length) {
263
+ return candidates[idx] ?? null;
264
+ }
265
+ }
266
+ console.log(`Please enter a number between 1 and ${candidates.length}.`);
267
+ }
268
+ }
269
+ finally {
270
+ rl.close();
271
+ }
272
+ }
273
+ export { isTTY };
274
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../lib/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export interface CodexCliMetrics {
2
+ readAttempts: number;
3
+ readSuccesses: number;
4
+ readMisses: number;
5
+ readFailures: number;
6
+ legacySyncEnvUses: number;
7
+ reconcileAttempts: number;
8
+ reconcileChanges: number;
9
+ reconcileNoops: number;
10
+ reconcileFailures: number;
11
+ writeAttempts: number;
12
+ writeSuccesses: number;
13
+ writeFailures: number;
14
+ }
15
+ export declare function incrementCodexCliMetric(key: keyof CodexCliMetrics, delta?: number): void;
16
+ export declare function getCodexCliMetricsSnapshot(): CodexCliMetrics;
17
+ export declare function resetCodexCliMetricsForTests(): void;
18
+ export declare function makeAccountFingerprint(input: {
19
+ accountId?: string;
20
+ email?: string;
21
+ }): string | undefined;
22
+ //# sourceMappingURL=observability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.d.ts","sourceRoot":"","sources":["../../../lib/codex-cli/observability.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACtB;AAmBD,wBAAgB,uBAAuB,CACtC,GAAG,EAAE,MAAM,eAAe,EAC1B,KAAK,SAAI,GACP,IAAI,CAEN;AAED,wBAAgB,0BAA0B,IAAI,eAAe,CAE5D;AAED,wBAAgB,4BAA4B,IAAI,IAAI,CAEnD;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,MAAM,GAAG,SAAS,CASrB"}
@@ -0,0 +1,36 @@
1
+ import { createHash } from "node:crypto";
2
+ const DEFAULT_METRICS = {
3
+ readAttempts: 0,
4
+ readSuccesses: 0,
5
+ readMisses: 0,
6
+ readFailures: 0,
7
+ legacySyncEnvUses: 0,
8
+ reconcileAttempts: 0,
9
+ reconcileChanges: 0,
10
+ reconcileNoops: 0,
11
+ reconcileFailures: 0,
12
+ writeAttempts: 0,
13
+ writeSuccesses: 0,
14
+ writeFailures: 0,
15
+ };
16
+ let metrics = { ...DEFAULT_METRICS };
17
+ export function incrementCodexCliMetric(key, delta = 1) {
18
+ metrics[key] += delta;
19
+ }
20
+ export function getCodexCliMetricsSnapshot() {
21
+ return { ...metrics };
22
+ }
23
+ export function resetCodexCliMetricsForTests() {
24
+ metrics = { ...DEFAULT_METRICS };
25
+ }
26
+ export function makeAccountFingerprint(input) {
27
+ const raw = typeof input.accountId === "string" && input.accountId.trim().length > 0
28
+ ? input.accountId.trim()
29
+ : typeof input.email === "string" && input.email.trim().length > 0
30
+ ? input.email.trim().toLowerCase()
31
+ : "";
32
+ if (!raw)
33
+ return undefined;
34
+ return createHash("sha256").update(raw).digest("hex").slice(0, 12);
35
+ }
36
+ //# sourceMappingURL=observability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.js","sourceRoot":"","sources":["../../../lib/codex-cli/observability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAiBzC,MAAM,eAAe,GAAoB;IACxC,YAAY,EAAE,CAAC;IACf,aAAa,EAAE,CAAC;IAChB,UAAU,EAAE,CAAC;IACb,YAAY,EAAE,CAAC;IACf,iBAAiB,EAAE,CAAC;IACpB,iBAAiB,EAAE,CAAC;IACpB,gBAAgB,EAAE,CAAC;IACnB,cAAc,EAAE,CAAC;IACjB,iBAAiB,EAAE,CAAC;IACpB,aAAa,EAAE,CAAC;IAChB,cAAc,EAAE,CAAC;IACjB,aAAa,EAAE,CAAC;CAChB,CAAC;AAEF,IAAI,OAAO,GAAoB,EAAE,GAAG,eAAe,EAAE,CAAC;AAEtD,MAAM,UAAU,uBAAuB,CACtC,GAA0B,EAC1B,KAAK,GAAG,CAAC;IAET,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,0BAA0B;IACzC,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,4BAA4B;IAC3C,OAAO,GAAG,EAAE,GAAG,eAAe,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAGtC;IACA,MAAM,GAAG,GACR,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QACvE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE;QACxB,CAAC,CAAC,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YACjE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;YAClC,CAAC,CAAC,EAAE,CAAC;IACR,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACpE,CAAC"}
@@ -0,0 +1,86 @@
1
+ export interface CodexCliTokenCacheEntry {
2
+ accessToken: string;
3
+ expiresAt?: number;
4
+ refreshToken?: string;
5
+ accountId?: string;
6
+ }
7
+ export interface CodexCliAccountSnapshot extends CodexCliTokenCacheEntry {
8
+ email?: string;
9
+ isActive?: boolean;
10
+ }
11
+ export interface CodexCliState {
12
+ path: string;
13
+ accounts: CodexCliAccountSnapshot[];
14
+ activeAccountId?: string;
15
+ activeEmail?: string;
16
+ syncVersion?: number;
17
+ sourceUpdatedAtMs?: number;
18
+ }
19
+ /**
20
+ * Determines whether Codex CLI sync is enabled based on environment variables.
21
+ *
22
+ * Checks CODEX_MULTI_AUTH_SYNC_CODEX_CLI first (explicit "1" enables, "0" disables),
23
+ * then falls back to the legacy CODEX_AUTH_SYNC_CODEX_CLI (also "1"/"0"). If the
24
+ * legacy variable is used, a single warning is emitted and a metric is incremented.
25
+ *
26
+ * Concurrency: the function may perform a one-time side effect (emitting a legacy-use
27
+ * warning and incrementing a metric); that side effect is guarded to run at most once
28
+ * per process and is safe to call from concurrent contexts.
29
+ *
30
+ * Filesystem and tokens: this function does not access the filesystem and does not
31
+ * read or log any tokens (no token redaction is required here).
32
+ *
33
+ * @returns `true` if sync is enabled, `false` otherwise.
34
+ */
35
+ export declare function isCodexCliSyncEnabled(): boolean;
36
+ /**
37
+ * Resolves the filesystem path to the Codex CLI accounts file.
38
+ *
39
+ * If the environment variable CODEX_CLI_ACCOUNTS_PATH is set to a non-empty value it will be returned; otherwise the default is "$HOME/.codex/accounts.json".
40
+ *
41
+ * Concurrency: callers should treat the returned path as a location that may be concurrently read or written by other processes.
42
+ * Windows: returns a path using the platform path separators (may contain backslashes on Windows).
43
+ * Token redaction: this function only returns the file path; it does not read or expose token contents and callers must redact sensitive fields when logging the file contents.
44
+ *
45
+ * @returns The resolved path to the accounts JSON file, either the overridden value from CODEX_CLI_ACCOUNTS_PATH or the platform-specific "$HOME/.codex/accounts.json".
46
+ */
47
+ export declare function getCodexCliAccountsPath(): string;
48
+ /**
49
+ * Resolve the filesystem path for the Codex CLI auth JSON file, allowing an environment override.
50
+ *
51
+ * If the environment variable `CODEX_CLI_AUTH_PATH` is set to a non-empty value (after trimming) that value is returned;
52
+ * otherwise the default path is homedir/.codex/auth.json. The returned path may reference a file containing authentication tokens—
53
+ * treat it as sensitive (avoid logging full paths or file contents without redaction). The function returns a platform-native path
54
+ * (path separators follow the current OS); callers should handle concurrent access to the file when reading or writing.
55
+ *
56
+ * @returns The resolved path to the Codex CLI `auth.json` file.
57
+ */
58
+ export declare function getCodexCliAuthPath(): string;
59
+ /**
60
+ * Loads Codex CLI authentication state from disk, with an in-memory TTL cache and optional force refresh.
61
+ *
62
+ * Reads either the accounts JSON or the legacy auth JSON (whichever is present) and returns a normalized
63
+ * CodexCliState including tokens, active account, optional sync version, and source file modification time.
64
+ * Uses an in-memory cache valid for CACHE_TTL_MS; if `forceRefresh` is true the cache is bypassed.
65
+ *
66
+ * Concurrency: callers may race to read/update the in-memory cache; this function performs best-effort caching
67
+ * and does not provide external synchronization primitives.
68
+ *
69
+ * Windows filesystem notes: file modification timestamps (sourceUpdatedAtMs) are derived from fs.stat().mtimeMs
70
+ * and may have coarser resolution on some Windows filesystems.
71
+ *
72
+ * Token redaction: returned state may contain token values (accessToken, refreshToken); consumers should treat
73
+ * these values as sensitive and redact or avoid logging them.
74
+ *
75
+ * @param options - Optional settings.
76
+ * @param options.forceRefresh - If true, bypass the in-memory TTL cache and re-read files from disk.
77
+ * @returns The parsed CodexCliState when a valid accounts/auth payload is found, or `null` if sync is disabled,
78
+ * no valid payload exists, or a read/parse error occurred.
79
+ */
80
+ export declare function loadCodexCliState(options?: {
81
+ forceRefresh?: boolean;
82
+ }): Promise<CodexCliState | null>;
83
+ export declare function lookupCodexCliTokensByEmail(email: string | undefined): Promise<CodexCliTokenCacheEntry | null>;
84
+ export declare function clearCodexCliStateCache(): void;
85
+ export declare function __resetCodexCliWarningCacheForTests(): void;
86
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../lib/codex-cli/state.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,uBAAuB;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,uBAAwB,SAAQ,uBAAuB;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,uBAAuB,EAAE,CAAC;IACpC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAiID;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAgB/C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAIhD;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAI5C;AAwHD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,iBAAiB,CACtC,OAAO,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,GAClC,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAwI/B;AAED,wBAAsB,2BAA2B,CAChD,KAAK,EAAE,MAAM,GAAG,SAAS,GACvB,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAgBzC;AAED,wBAAgB,uBAAuB,IAAI,IAAI,CAI9C;AAED,wBAAgB,mCAAmC,IAAI,IAAI,CAE1D"}