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,49 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { readFile, writeFile } from "node:fs/promises";
4
+ import { resolve } from "node:path";
5
+ import process from "node:process";
6
+ import { renderDashboardHtml } from "./bench-format/render.mjs";
7
+
8
+ function usage() {
9
+ console.log([
10
+ "Usage: node scripts/benchmark-render-dashboard.mjs --input=PATH [--output=PATH]",
11
+ "",
12
+ "Options:",
13
+ " --input=PATH Path to benchmark summary.json",
14
+ " --output=PATH Output HTML path (default: alongside input as dashboard.html)",
15
+ ].join("\n"));
16
+ }
17
+
18
+ function argValue(args, name) {
19
+ const prefix = `${name}=`;
20
+ const match = args.find((arg) => arg.startsWith(prefix));
21
+ return match ? match.slice(prefix.length) : undefined;
22
+ }
23
+
24
+ async function main() {
25
+ const args = process.argv.slice(2);
26
+ if (args.includes("--help") || args.includes("-h")) {
27
+ usage();
28
+ return;
29
+ }
30
+
31
+ const inputRaw = argValue(args, "--input");
32
+ if (!inputRaw) {
33
+ usage();
34
+ process.exitCode = 1;
35
+ return;
36
+ }
37
+ const inputPath = resolve(inputRaw);
38
+ const outputPath = resolve(argValue(args, "--output") ?? inputPath.replace(/summary\.json$/i, "dashboard.html"));
39
+
40
+ const summary = JSON.parse(await readFile(inputPath, "utf8"));
41
+ const html = renderDashboardHtml(summary);
42
+ await writeFile(outputPath, html, "utf8");
43
+ console.log(`Dashboard written: ${outputPath}`);
44
+ }
45
+
46
+ main().catch((error) => {
47
+ console.error(`Render failed: ${error instanceof Error ? error.message : String(error)}`);
48
+ process.exit(1);
49
+ });
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { runCodexMultiAuthCli } from "../dist/lib/codex-manager.js";
4
+
5
+ const exitCode = await runCodexMultiAuthCli(process.argv.slice(2));
6
+ process.exit(exitCode);
@@ -0,0 +1,34 @@
1
+ const AUTH_SUBCOMMANDS = new Set([
2
+ "login",
3
+ "list",
4
+ "status",
5
+ "switch",
6
+ "check",
7
+ "features",
8
+ "verify-flagged",
9
+ "forecast",
10
+ "report",
11
+ "fix",
12
+ "doctor",
13
+ ]);
14
+
15
+ export function normalizeAuthAlias(args) {
16
+ if (args.length >= 2 && args[0] === "multi" && args[1] === "auth") {
17
+ return ["auth", ...args.slice(2)];
18
+ }
19
+ if (args.length >= 1 && (args[0] === "multi-auth" || args[0] === "multiauth")) {
20
+ return ["auth", ...args.slice(1)];
21
+ }
22
+ return args;
23
+ }
24
+
25
+ export function shouldHandleMultiAuthAuth(args) {
26
+ if (args[0] !== "auth") return false;
27
+ if (args.length === 1) return true;
28
+ const subcommand = args[1];
29
+ if (typeof subcommand !== "string") return false;
30
+ if (subcommand.startsWith("-")) return true;
31
+ return AUTH_SUBCOMMANDS.has(subcommand);
32
+ }
33
+
34
+ export { AUTH_SUBCOMMANDS };
@@ -0,0 +1,122 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { spawn, spawnSync } from "node:child_process";
4
+ import { existsSync } from "node:fs";
5
+ import { createRequire } from "node:module";
6
+ import { dirname, join } from "node:path";
7
+ import process from "node:process";
8
+ import { fileURLToPath } from "node:url";
9
+ import { runCodexMultiAuthCli } from "../dist/lib/codex-manager.js";
10
+ import { normalizeAuthAlias, shouldHandleMultiAuthAuth } from "./codex-routing.js";
11
+
12
+ function resolveRealCodexBin() {
13
+ const override = (process.env.CODEX_MULTI_AUTH_REAL_CODEX_BIN ?? "").trim();
14
+ if (override.length > 0) {
15
+ if (existsSync(override)) return override;
16
+ console.error(
17
+ `CODEX_MULTI_AUTH_REAL_CODEX_BIN is set but missing: ${override}`,
18
+ );
19
+ return null;
20
+ }
21
+
22
+ try {
23
+ const require = createRequire(import.meta.url);
24
+ const resolved = require.resolve("@openai/codex/bin/codex.js");
25
+ if (existsSync(resolved)) return resolved;
26
+ } catch {
27
+ // Fall through to sibling lookup.
28
+ }
29
+
30
+ const searchRoots = [];
31
+ const scriptDir = dirname(fileURLToPath(import.meta.url));
32
+ searchRoots.push(join(scriptDir, "..", ".."));
33
+
34
+ const invokedScript = process.argv[1];
35
+ if (typeof invokedScript === "string" && invokedScript.length > 0) {
36
+ searchRoots.push(join(dirname(invokedScript), "..", ".."));
37
+ }
38
+
39
+ const npmPrefix = (process.env.npm_config_prefix ?? process.env.PREFIX ?? "").trim();
40
+ if (npmPrefix.length > 0) {
41
+ searchRoots.push(join(npmPrefix, "node_modules"));
42
+ searchRoots.push(join(npmPrefix, "lib", "node_modules"));
43
+ }
44
+
45
+ for (const root of searchRoots) {
46
+ const candidate = join(root, "@openai", "codex", "bin", "codex.js");
47
+ if (existsSync(candidate)) return candidate;
48
+ }
49
+
50
+ const npmCmd = process.platform === "win32" ? "npm.cmd" : "npm";
51
+ try {
52
+ const rootResult = spawnSync(npmCmd, ["root", "-g"], {
53
+ encoding: "utf8",
54
+ stdio: ["ignore", "pipe", "ignore"],
55
+ });
56
+ if (rootResult.status === 0) {
57
+ const globalRoot = rootResult.stdout.trim();
58
+ if (globalRoot.length > 0) {
59
+ const globalBin = join(globalRoot, "@openai", "codex", "bin", "codex.js");
60
+ if (existsSync(globalBin)) return globalBin;
61
+ }
62
+ }
63
+ } catch {
64
+ // Ignore and fall through to null.
65
+ }
66
+
67
+ return null;
68
+ }
69
+
70
+ function forwardToRealCodex(codexBin, args) {
71
+ return new Promise((resolve) => {
72
+ const child = spawn(process.execPath, [codexBin, ...args], {
73
+ stdio: "inherit",
74
+ env: process.env,
75
+ });
76
+
77
+ child.once("error", (error) => {
78
+ console.error(`Failed to launch real Codex CLI: ${String(error)}`);
79
+ resolve(1);
80
+ });
81
+
82
+ child.once("exit", (code, signal) => {
83
+ if (signal) {
84
+ const signalNumber = signal === "SIGINT" ? 130 : 1;
85
+ resolve(signalNumber);
86
+ return;
87
+ }
88
+ resolve(typeof code === "number" ? code : 1);
89
+ });
90
+ });
91
+ }
92
+
93
+ const rawArgs = process.argv.slice(2);
94
+ const normalizedArgs = normalizeAuthAlias(rawArgs);
95
+ const bypass = (process.env.CODEX_MULTI_AUTH_BYPASS ?? "").trim() === "1";
96
+
97
+ if (!bypass && shouldHandleMultiAuthAuth(normalizedArgs)) {
98
+ try {
99
+ const exitCode = await runCodexMultiAuthCli(normalizedArgs);
100
+ process.exit(exitCode);
101
+ } catch (error) {
102
+ console.error(
103
+ `codex-multi-auth runner failed: ${error instanceof Error ? error.message : String(error)}`,
104
+ );
105
+ process.exit(1);
106
+ }
107
+ }
108
+
109
+ const realCodexBin = resolveRealCodexBin();
110
+ if (!realCodexBin) {
111
+ console.error(
112
+ [
113
+ "Could not locate the official Codex CLI binary (@openai/codex).",
114
+ "Install it globally: npm install -g @openai/codex",
115
+ "Or set CODEX_MULTI_AUTH_REAL_CODEX_BIN to a full bin/codex.js path.",
116
+ ].join("\n"),
117
+ );
118
+ process.exit(1);
119
+ }
120
+
121
+ const forwardExitCode = await forwardToRealCodex(realCodexBin, rawArgs);
122
+ process.exit(forwardExitCode);
@@ -0,0 +1,37 @@
1
+ import { promises as fs } from "node:fs";
2
+ import { dirname, join, resolve } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = dirname(__filename);
7
+
8
+ function normalizePathForCompare(path) {
9
+ const resolved = resolve(path);
10
+ return process.platform === "win32" ? resolved.toLowerCase() : resolved;
11
+ }
12
+
13
+ function getDefaultPaths() {
14
+ const src = join(__dirname, "..", "lib", "oauth-success.html");
15
+ const dest = join(__dirname, "..", "dist", "lib", "oauth-success.html");
16
+ return { src, dest };
17
+ }
18
+
19
+ export async function copyOAuthSuccessHtml(options = {}) {
20
+ const defaults = getDefaultPaths();
21
+ const src = options.src ?? defaults.src;
22
+ const dest = options.dest ?? defaults.dest;
23
+
24
+ await fs.mkdir(dirname(dest), { recursive: true });
25
+ await fs.copyFile(src, dest);
26
+
27
+ return { src, dest };
28
+ }
29
+
30
+ const isDirectRun = (() => {
31
+ if (!process.argv[1]) return false;
32
+ return normalizePathForCompare(process.argv[1]) === normalizePathForCompare(__filename);
33
+ })();
34
+
35
+ if (isDirectRun) {
36
+ await copyOAuthSuccessHtml();
37
+ }
@@ -0,0 +1,193 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { existsSync } from "node:fs";
4
+ import { readFile, writeFile, mkdir, copyFile, rm } from "node:fs/promises";
5
+ import { fileURLToPath } from "node:url";
6
+ import { dirname, join, resolve } from "node:path";
7
+ import { homedir } from "node:os";
8
+
9
+ const PLUGIN_NAME = "codex-multi-auth";
10
+
11
+ const args = new Set(process.argv.slice(2));
12
+
13
+ if (args.has("--help") || args.has("-h")) {
14
+ console.log(`Usage: ${PLUGIN_NAME} [--modern|--legacy] [--dry-run] [--no-cache-clear]\n\n` +
15
+ "Default behavior:\n" +
16
+ " - Installs/updates global config at ~/.config/opencode/opencode.json\n" +
17
+ " - Uses modern config (variants) by default\n" +
18
+ " - Ensures plugin is unpinned (latest)\n" +
19
+ " - Clears OpenCode plugin cache\n\n" +
20
+ "Options:\n" +
21
+ " --modern Force modern config (default)\n" +
22
+ " --legacy Use legacy config (older OpenCode versions)\n" +
23
+ " --dry-run Show actions without writing\n" +
24
+ " --no-cache-clear Skip clearing OpenCode cache\n"
25
+ );
26
+ process.exit(0);
27
+ }
28
+
29
+ const useLegacy = args.has("--legacy");
30
+ const useModern = args.has("--modern") || !useLegacy;
31
+ const dryRun = args.has("--dry-run");
32
+ const skipCacheClear = args.has("--no-cache-clear");
33
+
34
+ const scriptDir = dirname(fileURLToPath(import.meta.url));
35
+ const repoRoot = resolve(scriptDir, "..");
36
+ const templatePath = join(
37
+ repoRoot,
38
+ "config",
39
+ useLegacy ? "opencode-legacy.json" : "opencode-modern.json"
40
+ );
41
+
42
+ const configDir = join(homedir(), ".config", "opencode");
43
+ const configPath = join(configDir, "opencode.json");
44
+ const cacheDir = join(homedir(), ".cache", "opencode");
45
+ const cacheNodeModules = join(cacheDir, "node_modules", PLUGIN_NAME);
46
+ const cacheBunLock = join(cacheDir, "bun.lock");
47
+ const cachePackageJson = join(cacheDir, "package.json");
48
+
49
+ function log(message) {
50
+ console.log(message);
51
+ }
52
+
53
+ function normalizePluginList(list) {
54
+ const entries = Array.isArray(list) ? list.filter(Boolean) : [];
55
+ const filtered = entries.filter((entry) => {
56
+ if (typeof entry !== "string") return true;
57
+ return entry !== PLUGIN_NAME && !entry.startsWith(`${PLUGIN_NAME}@`);
58
+ });
59
+ return [...filtered, PLUGIN_NAME];
60
+ }
61
+
62
+ function formatJson(obj) {
63
+ return `${JSON.stringify(obj, null, 2)}\n`;
64
+ }
65
+
66
+ async function readJson(filePath) {
67
+ const content = await readFile(filePath, "utf-8");
68
+ return JSON.parse(content);
69
+ }
70
+
71
+ async function backupConfig(sourcePath) {
72
+ const timestamp = new Date()
73
+ .toISOString()
74
+ .replace(/[:.]/g, "-")
75
+ .replace("T", "_")
76
+ .replace("Z", "");
77
+ const backupPath = `${sourcePath}.bak-${timestamp}`;
78
+ if (!dryRun) {
79
+ await copyFile(sourcePath, backupPath);
80
+ }
81
+ return backupPath;
82
+ }
83
+
84
+ async function removePluginFromCachePackage() {
85
+ if (!existsSync(cachePackageJson)) {
86
+ return;
87
+ }
88
+
89
+ let cacheData;
90
+ try {
91
+ cacheData = await readJson(cachePackageJson);
92
+ } catch (error) {
93
+ log(`Warning: Could not parse ${cachePackageJson} (${error}). Skipping.`);
94
+ return;
95
+ }
96
+
97
+ const sections = [
98
+ "dependencies",
99
+ "devDependencies",
100
+ "peerDependencies",
101
+ "optionalDependencies",
102
+ ];
103
+
104
+ let changed = false;
105
+ for (const section of sections) {
106
+ const deps = cacheData?.[section];
107
+ if (deps && typeof deps === "object" && PLUGIN_NAME in deps) {
108
+ delete deps[PLUGIN_NAME];
109
+ changed = true;
110
+ }
111
+ }
112
+
113
+ if (!changed) {
114
+ return;
115
+ }
116
+
117
+ if (dryRun) {
118
+ log(`[dry-run] Would update ${cachePackageJson} to remove ${PLUGIN_NAME}`);
119
+ return;
120
+ }
121
+
122
+ await writeFile(cachePackageJson, formatJson(cacheData), "utf-8");
123
+ }
124
+
125
+ async function clearCache() {
126
+ if (skipCacheClear) {
127
+ log("Skipping cache clear (--no-cache-clear).");
128
+ return;
129
+ }
130
+
131
+ if (dryRun) {
132
+ log(`[dry-run] Would remove ${cacheNodeModules}`);
133
+ log(`[dry-run] Would remove ${cacheBunLock}`);
134
+ } else {
135
+ await rm(cacheNodeModules, { recursive: true, force: true });
136
+ await rm(cacheBunLock, { force: true });
137
+ }
138
+
139
+ await removePluginFromCachePackage();
140
+ }
141
+
142
+ async function main() {
143
+ if (!existsSync(templatePath)) {
144
+ throw new Error(`Config template not found at ${templatePath}`);
145
+ }
146
+
147
+ const template = await readJson(templatePath);
148
+ template.plugin = [PLUGIN_NAME];
149
+
150
+ let nextConfig = template;
151
+ if (existsSync(configPath)) {
152
+ const backupPath = await backupConfig(configPath);
153
+ log(`${dryRun ? "[dry-run] Would create backup" : "Backup created"}: ${backupPath}`);
154
+
155
+ try {
156
+ const existing = await readJson(configPath);
157
+ const merged = { ...existing };
158
+ merged.plugin = normalizePluginList(existing.plugin);
159
+ const provider = (existing.provider && typeof existing.provider === "object")
160
+ ? { ...existing.provider }
161
+ : {};
162
+ provider.openai = template.provider.openai;
163
+ merged.provider = provider;
164
+ nextConfig = merged;
165
+ } catch (error) {
166
+ log(`Warning: Could not parse existing config (${error}). Replacing with template.`);
167
+ nextConfig = template;
168
+ }
169
+ } else {
170
+ log("No existing config found. Creating new global config.");
171
+ }
172
+
173
+ if (dryRun) {
174
+ log(`[dry-run] Would write ${configPath} using ${useLegacy ? "legacy" : "modern"} config`);
175
+ } else {
176
+ await mkdir(configDir, { recursive: true });
177
+ await writeFile(configPath, formatJson(nextConfig), "utf-8");
178
+ log(`Wrote ${configPath} (${useLegacy ? "legacy" : "modern"} config)`);
179
+ }
180
+
181
+ await clearCache();
182
+
183
+ log("\nDone. Restart OpenCode to (re)install the plugin.");
184
+ log("Example: opencode");
185
+ if (useLegacy) {
186
+ log("Note: Legacy config requires OpenCode v1.0.209 or older.");
187
+ }
188
+ }
189
+
190
+ main().catch((error) => {
191
+ console.error(`Installer failed: ${error instanceof Error ? error.message : error}`);
192
+ process.exit(1);
193
+ });
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+
3
+ set -euo pipefail
4
+
5
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
+ node "${SCRIPT_DIR}/test-model-matrix.js" "$@"
7
+