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,338 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width,initial-scale=1" />
6
+ <title>OpenAI Codex Sign-in Complete</title>
7
+ <style>
8
+ :root {
9
+ --bg: #040608;
10
+ --bg2: #0a1210;
11
+ --card: #0a0f0d;
12
+ --line: #1f3a2f;
13
+ --line-soft: #13261f;
14
+ --text: #e6f6ee;
15
+ --muted: #9ac3b1;
16
+ --green: #35d28a;
17
+ --green-strong: #13b06e;
18
+ --warn: #f2cc60;
19
+ }
20
+
21
+ * { box-sizing: border-box; }
22
+
23
+ html, body {
24
+ margin: 0;
25
+ width: 100%;
26
+ height: 100%;
27
+ font-family: Consolas, "Cascadia Mono", "SFMono-Regular", Menlo, Monaco, monospace;
28
+ background: radial-gradient(1300px 700px at 20% -10%, #0f2b21 0%, transparent 55%),
29
+ radial-gradient(1000px 560px at 100% 0%, #0a2019 0%, transparent 60%),
30
+ linear-gradient(180deg, var(--bg), var(--bg2));
31
+ color: var(--text);
32
+ overflow-x: hidden;
33
+ overflow-y: auto;
34
+ }
35
+
36
+ .grid {
37
+ position: fixed;
38
+ inset: 0;
39
+ background-image:
40
+ linear-gradient(to right, rgba(53, 210, 138, 0.06) 1px, transparent 1px),
41
+ linear-gradient(to bottom, rgba(53, 210, 138, 0.05) 1px, transparent 1px);
42
+ background-size: 28px 28px;
43
+ mask-image: radial-gradient(circle at center, black 35%, transparent 90%);
44
+ pointer-events: none;
45
+ animation: drift 16s linear infinite;
46
+ }
47
+
48
+ .scanline {
49
+ position: fixed;
50
+ inset: 0;
51
+ pointer-events: none;
52
+ background: linear-gradient(180deg, transparent 0%, rgba(53, 210, 138, 0.07) 48%, transparent 52%, transparent 100%);
53
+ animation: sweep 5s linear infinite;
54
+ opacity: 0.45;
55
+ }
56
+
57
+ @keyframes sweep {
58
+ 0% { transform: translateY(-100%); }
59
+ 100% { transform: translateY(100%); }
60
+ }
61
+
62
+ @keyframes drift {
63
+ from { transform: translateY(0); }
64
+ to { transform: translateY(28px); }
65
+ }
66
+
67
+ .wrap {
68
+ position: relative;
69
+ width: min(860px, calc(100vw - 32px));
70
+ margin: 24px auto;
71
+ top: 50%;
72
+ transform: translateY(-50%);
73
+ border: 1px solid var(--line);
74
+ border-radius: 14px;
75
+ background: linear-gradient(180deg, rgba(10, 16, 13, 0.94), rgba(6, 11, 9, 0.94));
76
+ box-shadow: 0 28px 80px rgba(0,0,0,0.58), 0 0 0 1px rgba(53,210,138,0.08) inset;
77
+ overflow: hidden;
78
+ animation: pop 380ms ease-out;
79
+ }
80
+
81
+ @keyframes pop {
82
+ from { opacity: 0; transform: translateY(-48%) scale(0.985); }
83
+ to { opacity: 1; transform: translateY(-50%) scale(1); }
84
+ }
85
+
86
+ .titlebar {
87
+ display: flex;
88
+ align-items: center;
89
+ gap: 12px;
90
+ padding: 12px 16px;
91
+ border-bottom: 1px solid var(--line-soft);
92
+ background: rgba(6, 12, 10, 0.9);
93
+ }
94
+
95
+ .lights { display: flex; gap: 6px; }
96
+ .dot {
97
+ width: 10px;
98
+ height: 10px;
99
+ border-radius: 999px;
100
+ background: #375a4a;
101
+ border: 1px solid #2b463b;
102
+ }
103
+ .dot.ok {
104
+ background: var(--green);
105
+ border-color: #1a6f46;
106
+ box-shadow: 0 0 8px rgba(53,210,138,0.65);
107
+ animation: blink 1.6s ease-in-out infinite;
108
+ }
109
+
110
+ @keyframes blink {
111
+ 0%, 100% { opacity: 1; }
112
+ 50% { opacity: 0.55; }
113
+ }
114
+
115
+ .bar-title {
116
+ font-size: 13px;
117
+ letter-spacing: 0.02em;
118
+ color: var(--muted);
119
+ white-space: nowrap;
120
+ overflow: hidden;
121
+ text-overflow: ellipsis;
122
+ }
123
+
124
+ .content {
125
+ padding: 20px;
126
+ display: grid;
127
+ grid-template-columns: 1.15fr 0.85fr;
128
+ gap: 16px;
129
+ }
130
+
131
+ .left {
132
+ border: 1px solid var(--line-soft);
133
+ border-radius: 10px;
134
+ padding: 18px;
135
+ background: rgba(8, 14, 11, 0.62);
136
+ }
137
+
138
+ .right {
139
+ border: 1px solid var(--line-soft);
140
+ border-radius: 10px;
141
+ padding: 16px;
142
+ background: rgba(8, 14, 11, 0.62);
143
+ }
144
+
145
+ .kicker {
146
+ color: var(--green);
147
+ font-size: 12px;
148
+ text-transform: uppercase;
149
+ letter-spacing: 0.11em;
150
+ margin-bottom: 10px;
151
+ }
152
+
153
+ h1 {
154
+ margin: 0 0 10px;
155
+ font-size: clamp(22px, 3.2vw, 29px);
156
+ line-height: 1.2;
157
+ letter-spacing: -0.02em;
158
+ }
159
+
160
+ .subtitle {
161
+ margin: 0 0 14px;
162
+ color: var(--muted);
163
+ font-size: 14px;
164
+ line-height: 1.5;
165
+ }
166
+
167
+ .badge {
168
+ display: inline-flex;
169
+ align-items: center;
170
+ gap: 8px;
171
+ margin: 0 0 14px;
172
+ padding: 7px 10px;
173
+ border-radius: 999px;
174
+ border: 1px solid rgba(53,210,138,0.4);
175
+ background: rgba(53,210,138,0.12);
176
+ color: #d9f9e9;
177
+ font-size: 12px;
178
+ font-weight: 700;
179
+ letter-spacing: 0.05em;
180
+ text-transform: uppercase;
181
+ }
182
+
183
+ .badge .pulse {
184
+ width: 8px;
185
+ height: 8px;
186
+ border-radius: 999px;
187
+ background: var(--green);
188
+ box-shadow: 0 0 9px rgba(53,210,138,0.85);
189
+ animation: ping 1.2s ease-out infinite;
190
+ }
191
+
192
+ @keyframes ping {
193
+ 0% { transform: scale(1); opacity: 1; }
194
+ 100% { transform: scale(1.8); opacity: 0.1; }
195
+ }
196
+
197
+ .steps {
198
+ margin: 0;
199
+ padding: 0;
200
+ list-style: none;
201
+ display: grid;
202
+ gap: 8px;
203
+ }
204
+
205
+ .steps li {
206
+ border: 1px solid var(--line-soft);
207
+ background: rgba(7, 12, 10, 0.72);
208
+ border-radius: 8px;
209
+ padding: 9px 10px;
210
+ color: #cde6db;
211
+ font-size: 13px;
212
+ display: flex;
213
+ align-items: center;
214
+ gap: 8px;
215
+ }
216
+
217
+ .steps li::before {
218
+ content: ">";
219
+ color: var(--green);
220
+ font-weight: 700;
221
+ }
222
+
223
+ .steps li:last-child::before { content: "*"; }
224
+
225
+ .terminal {
226
+ border: 1px solid var(--line-soft);
227
+ border-radius: 8px;
228
+ padding: 12px;
229
+ background: #060b09;
230
+ min-height: 180px;
231
+ }
232
+
233
+ .prompt {
234
+ color: #cde6db;
235
+ margin: 0;
236
+ font-size: 12px;
237
+ line-height: 1.65;
238
+ white-space: pre-wrap;
239
+ }
240
+
241
+ .prompt .ok { color: var(--green); }
242
+ .prompt .muted { color: var(--muted); }
243
+ .prompt .warn { color: var(--warn); }
244
+
245
+ .progress {
246
+ margin-top: 10px;
247
+ height: 8px;
248
+ border-radius: 999px;
249
+ background: #0b1a14;
250
+ border: 1px solid var(--line-soft);
251
+ overflow: hidden;
252
+ position: relative;
253
+ }
254
+
255
+ .progress span {
256
+ display: block;
257
+ width: 72%;
258
+ height: 100%;
259
+ background: linear-gradient(90deg, var(--green-strong), var(--green));
260
+ animation: load 1.8s ease-in-out infinite;
261
+ }
262
+
263
+ @keyframes load {
264
+ 0%, 100% { width: 62%; }
265
+ 50% { width: 88%; }
266
+ }
267
+
268
+ .footer {
269
+ border-top: 1px solid var(--line-soft);
270
+ padding: 11px 16px;
271
+ color: var(--muted);
272
+ font-size: 12px;
273
+ display: flex;
274
+ justify-content: space-between;
275
+ gap: 8px;
276
+ flex-wrap: wrap;
277
+ background: rgba(6, 11, 9, 0.9);
278
+ }
279
+
280
+ .footer strong { color: var(--text); font-weight: 700; }
281
+
282
+ @media (max-width: 840px) {
283
+ .content {
284
+ grid-template-columns: 1fr;
285
+ }
286
+ }
287
+ </style>
288
+ </head>
289
+ <body>
290
+ <div class="grid" aria-hidden="true"></div>
291
+ <div class="scanline" aria-hidden="true"></div>
292
+
293
+ <main class="wrap" role="main" aria-label="OAuth callback success">
294
+ <header class="titlebar">
295
+ <div class="lights">
296
+ <span class="dot"></span>
297
+ <span class="dot"></span>
298
+ <span class="dot ok"></span>
299
+ </div>
300
+ <div class="bar-title">OpenAI Codex - Callback Received</div>
301
+ </header>
302
+
303
+ <section class="content">
304
+ <article class="left">
305
+ <p class="kicker">OpenAI Codex</p>
306
+ <h1>Sign-in Complete</h1>
307
+ <p class="subtitle">Account connected. Return to terminal.</p>
308
+
309
+ <div class="badge"><span class="pulse"></span> Connected</div>
310
+
311
+ <ul class="steps" aria-label="Completion steps">
312
+ <li>Authorization code received</li>
313
+ <li>Token exchange complete</li>
314
+ <li>Credentials saved to local Codex auth storage</li>
315
+ <li>Session ready</li>
316
+ </ul>
317
+ </article>
318
+
319
+ <aside class="right" aria-label="Terminal status">
320
+ <div class="terminal">
321
+ <pre class="prompt"><span class="ok">[ok]</span> callback received on localhost:1455
322
+ <span class="ok">[ok]</span> secure token flow complete
323
+ <span class="ok">[ok]</span> account saved
324
+
325
+ <span class="muted">next:</span> return to terminal
326
+ <span class="warn">tip:</span> close this tab</pre>
327
+ <div class="progress" aria-hidden="true"><span></span></div>
328
+ </div>
329
+ </aside>
330
+ </section>
331
+
332
+ <footer class="footer">
333
+ <span>Status: <strong>Connected</strong></span>
334
+ <span>Back to terminal to continue.</span>
335
+ </footer>
336
+ </main>
337
+ </body>
338
+ </html>
@@ -0,0 +1,28 @@
1
+ import type { ManagedAccount, AccountManager } from "./accounts.js";
2
+ import type { ModelFamily } from "./prompts/codex.js";
3
+ export interface ProbeCandidate {
4
+ account: ManagedAccount;
5
+ controller: AbortController;
6
+ }
7
+ export interface ProbeResult<T> {
8
+ type: "success" | "failure";
9
+ account: ManagedAccount;
10
+ response?: T;
11
+ error?: Error;
12
+ }
13
+ export interface ParallelProbeOptions {
14
+ maxConcurrency: number;
15
+ timeoutMs: number;
16
+ }
17
+ /**
18
+ * Get top N candidates ranked by hybrid score WITHOUT mutating AccountManager state.
19
+ * Uses getAccountsSnapshot() and ranks by health + tokens + freshness.
20
+ */
21
+ export declare function getTopCandidates(accountManager: AccountManager, modelFamily: ModelFamily, model: string | null, maxCandidates: number): ManagedAccount[];
22
+ /**
23
+ * Probe accounts in parallel with first-success-wins racing.
24
+ * Immediately aborts losing candidates when a winner is found.
25
+ */
26
+ export declare function probeAccountsInParallel<T>(candidates: ProbeCandidate[], probeFn: (account: ManagedAccount, signal: AbortSignal) => Promise<T>, _options?: Partial<ParallelProbeOptions>): Promise<ProbeResult<T> | null>;
27
+ export declare function createProbeCandidates(accounts: ManagedAccount[]): ProbeCandidate[];
28
+ //# sourceMappingURL=parallel-probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel-probe.d.ts","sourceRoot":"","sources":["../../lib/parallel-probe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAWtD,MAAM,WAAW,cAAc;IAC9B,OAAO,EAAE,cAAc,CAAC;IACxB,UAAU,EAAE,eAAe,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW,CAAC,CAAC;IAC7B,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;IAC5B,OAAO,EAAE,cAAc,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,CAAC;IACb,KAAK,CAAC,EAAE,KAAK,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACpC,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC/B,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,aAAa,EAAE,MAAM,GACnB,cAAc,EAAE,CAuClB;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,CAAC,EAC9C,UAAU,EAAE,cAAc,EAAE,EAC5B,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,EACrE,QAAQ,GAAE,OAAO,CAAC,oBAAoB,CAAM,GAC1C,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CA8ChC;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAKlF"}
@@ -0,0 +1,97 @@
1
+ import { createLogger } from "./logger.js";
2
+ import { getHealthTracker, getTokenTracker, } from "./rotation.js";
3
+ import { clearExpiredRateLimits, isRateLimitedForFamily } from "./accounts/rate-limits.js";
4
+ const log = createLogger("parallel-probe");
5
+ /**
6
+ * Get top N candidates ranked by hybrid score WITHOUT mutating AccountManager state.
7
+ * Uses getAccountsSnapshot() and ranks by health + tokens + freshness.
8
+ */
9
+ export function getTopCandidates(accountManager, modelFamily, model, maxCandidates) {
10
+ const accounts = accountManager.getAccountsSnapshot();
11
+ if (accounts.length === 0)
12
+ return [];
13
+ const quotaKey = model ? `${modelFamily}:${model}` : modelFamily;
14
+ const healthTracker = getHealthTracker();
15
+ const tokenTracker = getTokenTracker();
16
+ const accountsWithMetrics = [];
17
+ for (const account of accounts) {
18
+ clearExpiredRateLimits(account);
19
+ const isRateLimited = isRateLimitedForFamily(account, modelFamily, model);
20
+ const isCoolingDown = account.coolingDownUntil !== undefined && account.coolingDownUntil > Date.now();
21
+ const isAvailable = !isRateLimited && !isCoolingDown;
22
+ accountsWithMetrics.push({
23
+ index: account.index,
24
+ isAvailable,
25
+ lastUsed: account.lastUsed,
26
+ account,
27
+ });
28
+ }
29
+ const available = accountsWithMetrics.filter((a) => a.isAvailable);
30
+ if (available.length === 0)
31
+ return [];
32
+ const now = Date.now();
33
+ const scored = available.map((a) => {
34
+ const health = healthTracker.getScore(a.index, quotaKey);
35
+ const tokens = tokenTracker.getTokens(a.index, quotaKey);
36
+ const hoursSinceUsed = (now - a.lastUsed) / (1000 * 60 * 60);
37
+ const score = health * 2 + tokens * 5 + hoursSinceUsed * 2.0;
38
+ return { ...a, score };
39
+ });
40
+ scored.sort((a, b) => b.score - a.score);
41
+ return scored.slice(0, maxCandidates).map((s) => s.account);
42
+ }
43
+ /**
44
+ * Probe accounts in parallel with first-success-wins racing.
45
+ * Immediately aborts losing candidates when a winner is found.
46
+ */
47
+ export async function probeAccountsInParallel(candidates, probeFn, _options = {}) {
48
+ if (candidates.length === 0) {
49
+ return null;
50
+ }
51
+ if (candidates.length === 1) {
52
+ const candidate = candidates[0];
53
+ if (!candidate)
54
+ return null;
55
+ const { account, controller } = candidate;
56
+ try {
57
+ const response = await probeFn(account, controller.signal);
58
+ return { type: "success", account, response };
59
+ }
60
+ catch (error) {
61
+ return { type: "failure", account, error: error };
62
+ }
63
+ }
64
+ log.debug(`Probing ${candidates.length} accounts in parallel`);
65
+ let winner = null;
66
+ let resolvedCount = 0;
67
+ return new Promise((resolve) => {
68
+ for (const { account, controller } of candidates) {
69
+ probeFn(account, controller.signal)
70
+ .then((response) => {
71
+ if (!winner) {
72
+ winner = { type: "success", account, response };
73
+ log.debug(`Parallel probe succeeded with account ${account.index + 1}`);
74
+ for (const c of candidates) {
75
+ if (c.account.index !== account.index) {
76
+ c.controller.abort();
77
+ }
78
+ }
79
+ resolve(winner);
80
+ }
81
+ })
82
+ .catch((_error) => {
83
+ resolvedCount++;
84
+ if (resolvedCount === candidates.length && !winner) {
85
+ resolve(null);
86
+ }
87
+ });
88
+ }
89
+ });
90
+ }
91
+ export function createProbeCandidates(accounts) {
92
+ return accounts.map((account) => ({
93
+ account,
94
+ controller: new AbortController(),
95
+ }));
96
+ }
97
+ //# sourceMappingURL=parallel-probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel-probe.js","sourceRoot":"","sources":["../../lib/parallel-probe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ export interface QuotaSchedulerWindow {
2
+ usedPercent?: number;
3
+ resetAtMs?: number;
4
+ }
5
+ export interface QuotaSchedulerSnapshot {
6
+ status: number;
7
+ primary: QuotaSchedulerWindow;
8
+ secondary: QuotaSchedulerWindow;
9
+ updatedAt: number;
10
+ }
11
+ export interface QuotaDeferralDecision {
12
+ defer: boolean;
13
+ waitMs: number;
14
+ reason?: "rate-limit" | "quota-near-exhaustion";
15
+ }
16
+ export interface QuotaSchedulerOptions {
17
+ enabled?: boolean;
18
+ remainingPercentThresholdPrimary?: number;
19
+ remainingPercentThresholdSecondary?: number;
20
+ usedPercentThreshold?: number;
21
+ maxDeferralMs?: number;
22
+ }
23
+ /**
24
+ * Create a quota snapshot from HTTP headers when quota signals are present.
25
+ *
26
+ * Parses primary and secondary used-percent and reset timestamps and produces a snapshot; returns `null` if no quota signals are present.
27
+ *
28
+ * Concurrency: pure and safe for concurrent calls.
29
+ * Filesystem: does not access the filesystem (no Windows-specific behavior).
30
+ * Token handling: does not log or persist header values; callers should redact sensitive headers before logging or storing.
31
+ *
32
+ * @param headers - HTTP headers to read quota signals from; may contain sensitive values
33
+ * @param status - HTTP status code associated with the snapshot
34
+ * @param now - Millisecond epoch used as the snapshot's `updatedAt` timestamp
35
+ * @returns A QuotaSchedulerSnapshot built from available header values, or `null` when no signals are present
36
+ */
37
+ export declare function readQuotaSchedulerSnapshot(headers: Headers, status: number, now?: number): QuotaSchedulerSnapshot | null;
38
+ export declare class PreemptiveQuotaScheduler {
39
+ private readonly snapshots;
40
+ private enabled;
41
+ private primaryRemainingPercentThreshold;
42
+ private secondaryRemainingPercentThreshold;
43
+ private maxDeferralMs;
44
+ private lastPruneAt;
45
+ constructor(options?: QuotaSchedulerOptions);
46
+ configure(options?: QuotaSchedulerOptions): void;
47
+ private maybePrune;
48
+ update(key: string, snapshot: QuotaSchedulerSnapshot): void;
49
+ markRateLimited(key: string, retryAfterMs: number, now?: number): void;
50
+ getDeferral(key: string, now?: number): QuotaDeferralDecision;
51
+ prune(now?: number): number;
52
+ }
53
+ //# sourceMappingURL=preemptive-quota-scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preemptive-quota-scheduler.d.ts","sourceRoot":"","sources":["../../lib/preemptive-quota-scheduler.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,oBAAoB,CAAC;IAC9B,SAAS,EAAE,oBAAoB,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACrC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,YAAY,GAAG,uBAAuB,CAAC;CAChD;AAED,MAAM,WAAW,qBAAqB;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gCAAgC,CAAC,EAAE,MAAM,CAAC;IAC1C,kCAAkC,CAAC,EAAE,MAAM,CAAC;IAC5C,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AA+ED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,sBAAsB,GAAG,IAAI,CAqB5H;AAED,qBAAa,wBAAwB;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6C;IACvE,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,gCAAgC,CAAS;IACjD,OAAO,CAAC,kCAAkC,CAAS;IACnD,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,WAAW,CAAK;gBAEZ,OAAO,GAAE,qBAA0B;IAQ/C,SAAS,CAAC,OAAO,GAAE,qBAA0B,GAAG,IAAI;IA2CpD,OAAO,CAAC,UAAU;IAMlB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,sBAAsB,GAAG,IAAI;IAM3D,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,IAAI;IAc1E,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,qBAAqB;IAyCjE,KAAK,CAAC,GAAG,SAAa,GAAG,MAAM;CAW/B"}