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,216 @@
1
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { createLogger } from "./logger.js";
4
+ import { getCodexCacheDir } from "./runtime-paths.js";
5
+ const log = createLogger("update-checker");
6
+ const PACKAGE_NAME = "codex-multi-auth";
7
+ const NPM_REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;
8
+ const CACHE_DIR = getCodexCacheDir();
9
+ const CACHE_FILE = join(CACHE_DIR, "update-check-cache.json");
10
+ const CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000;
11
+ const RETRYABLE_WRITE_ERRORS = new Set(["EBUSY", "EPERM"]);
12
+ function sleepSync(ms) {
13
+ const delay = Math.max(0, Math.floor(ms));
14
+ if (delay === 0)
15
+ return;
16
+ const lock = new Int32Array(new SharedArrayBuffer(4));
17
+ Atomics.wait(lock, 0, 0, delay);
18
+ }
19
+ function getCurrentVersion() {
20
+ try {
21
+ const packageJsonPath = join(import.meta.dirname ?? __dirname, "..", "package.json");
22
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf8"));
23
+ return packageJson.version;
24
+ }
25
+ catch {
26
+ return "0.0.0";
27
+ }
28
+ }
29
+ function loadCache() {
30
+ try {
31
+ if (!existsSync(CACHE_FILE))
32
+ return null;
33
+ const content = readFileSync(CACHE_FILE, "utf8");
34
+ return JSON.parse(content);
35
+ }
36
+ catch {
37
+ return null;
38
+ }
39
+ }
40
+ function saveCache(cache) {
41
+ try {
42
+ if (!existsSync(CACHE_DIR)) {
43
+ mkdirSync(CACHE_DIR, { recursive: true });
44
+ }
45
+ const serialized = JSON.stringify(cache, null, 2);
46
+ let lastError = null;
47
+ for (let attempt = 0; attempt < 4; attempt++) {
48
+ try {
49
+ writeFileSync(CACHE_FILE, serialized, "utf8");
50
+ return;
51
+ }
52
+ catch (error) {
53
+ const code = error.code ?? "";
54
+ lastError = error;
55
+ if (!RETRYABLE_WRITE_ERRORS.has(code) || attempt >= 3) {
56
+ throw error;
57
+ }
58
+ sleepSync(15 * (2 ** attempt));
59
+ }
60
+ }
61
+ if (lastError)
62
+ throw lastError;
63
+ }
64
+ catch (error) {
65
+ log.warn("Failed to save update cache", { error: error.message });
66
+ }
67
+ }
68
+ function parseSemver(version) {
69
+ const normalized = version.trim().replace(/^v/i, "");
70
+ const [withoutBuild] = normalized.split("+");
71
+ const [corePart = "0.0.0", prereleasePart] = (withoutBuild ?? "0.0.0").split("-", 2);
72
+ const [majorRaw = "0", minorRaw = "0", patchRaw = "0"] = corePart.split(".");
73
+ const toSafeInt = (value) => {
74
+ if (!/^\d+$/.test(value))
75
+ return 0;
76
+ const parsed = Number.parseInt(value, 10);
77
+ return Number.isFinite(parsed) ? parsed : 0;
78
+ };
79
+ return {
80
+ core: [toSafeInt(majorRaw), toSafeInt(minorRaw), toSafeInt(patchRaw)],
81
+ prerelease: prereleasePart && prereleasePart.trim().length > 0
82
+ ? prereleasePart.split(".").filter((segment) => segment.length > 0)
83
+ : [],
84
+ };
85
+ }
86
+ function comparePrerelease(current, latest) {
87
+ const maxLen = Math.max(current.length, latest.length);
88
+ for (let i = 0; i < maxLen; i++) {
89
+ const currentPart = current[i];
90
+ const latestPart = latest[i];
91
+ if (currentPart === undefined && latestPart === undefined)
92
+ return 0;
93
+ if (currentPart === undefined)
94
+ return 1;
95
+ if (latestPart === undefined)
96
+ return -1;
97
+ if (currentPart === latestPart)
98
+ continue;
99
+ const currentIsNumeric = /^\d+$/.test(currentPart);
100
+ const latestIsNumeric = /^\d+$/.test(latestPart);
101
+ if (currentIsNumeric && latestIsNumeric) {
102
+ const currentNum = Number.parseInt(currentPart, 10);
103
+ const latestNum = Number.parseInt(latestPart, 10);
104
+ if (latestNum > currentNum)
105
+ return 1;
106
+ if (latestNum < currentNum)
107
+ return -1;
108
+ continue;
109
+ }
110
+ if (currentIsNumeric && !latestIsNumeric)
111
+ return 1;
112
+ if (!currentIsNumeric && latestIsNumeric)
113
+ return -1;
114
+ const lexical = latestPart.localeCompare(currentPart, "en", { sensitivity: "case" });
115
+ if (lexical > 0)
116
+ return 1;
117
+ if (lexical < 0)
118
+ return -1;
119
+ }
120
+ return 0;
121
+ }
122
+ function compareVersions(current, latest) {
123
+ const parsedCurrent = parseSemver(current);
124
+ const parsedLatest = parseSemver(latest);
125
+ for (let i = 0; i < parsedCurrent.core.length; i++) {
126
+ const currentPart = parsedCurrent.core[i] ?? 0;
127
+ const latestPart = parsedLatest.core[i] ?? 0;
128
+ if (latestPart > currentPart)
129
+ return 1;
130
+ if (latestPart < currentPart)
131
+ return -1;
132
+ }
133
+ const currentHasPrerelease = parsedCurrent.prerelease.length > 0;
134
+ const latestHasPrerelease = parsedLatest.prerelease.length > 0;
135
+ if (!currentHasPrerelease && latestHasPrerelease) {
136
+ return -1;
137
+ }
138
+ if (currentHasPrerelease && !latestHasPrerelease) {
139
+ return 1;
140
+ }
141
+ return comparePrerelease(parsedCurrent.prerelease, parsedLatest.prerelease);
142
+ }
143
+ async function fetchLatestVersion() {
144
+ try {
145
+ const controller = new AbortController();
146
+ const timeout = setTimeout(() => controller.abort(), 5000);
147
+ const response = await fetch(NPM_REGISTRY_URL, {
148
+ signal: controller.signal,
149
+ headers: { Accept: "application/json" },
150
+ });
151
+ clearTimeout(timeout);
152
+ if (!response.ok) {
153
+ log.debug("Failed to fetch npm registry", { status: response.status });
154
+ return null;
155
+ }
156
+ const data = (await response.json());
157
+ return data.version ?? null;
158
+ }
159
+ catch (error) {
160
+ log.debug("Failed to check for updates", { error: error.message });
161
+ return null;
162
+ }
163
+ }
164
+ export async function checkForUpdates(force = false) {
165
+ const currentVersion = getCurrentVersion();
166
+ const cache = loadCache();
167
+ const now = Date.now();
168
+ if (!force && cache && now - cache.lastCheck < CHECK_INTERVAL_MS) {
169
+ const hasUpdate = cache.latestVersion ? compareVersions(currentVersion, cache.latestVersion) > 0 : false;
170
+ return {
171
+ hasUpdate,
172
+ currentVersion,
173
+ latestVersion: cache.latestVersion,
174
+ updateCommand: `npm update -g ${PACKAGE_NAME}`,
175
+ };
176
+ }
177
+ const latestVersion = await fetchLatestVersion();
178
+ saveCache({
179
+ lastCheck: now,
180
+ latestVersion,
181
+ currentVersion,
182
+ });
183
+ const hasUpdate = latestVersion ? compareVersions(currentVersion, latestVersion) > 0 : false;
184
+ return {
185
+ hasUpdate,
186
+ currentVersion,
187
+ latestVersion,
188
+ updateCommand: `npm update -g ${PACKAGE_NAME}`,
189
+ };
190
+ }
191
+ export async function checkAndNotify(showToast) {
192
+ try {
193
+ const result = await checkForUpdates();
194
+ if (result.hasUpdate && result.latestVersion) {
195
+ const message = `Update available: ${PACKAGE_NAME} v${result.latestVersion} (current: v${result.currentVersion})`;
196
+ log.info(message);
197
+ if (showToast) {
198
+ await showToast(`Plugin update available: v${result.latestVersion}. Run: ${result.updateCommand}`, "info");
199
+ }
200
+ }
201
+ }
202
+ catch (error) {
203
+ log.debug("Update check failed", { error: error.message });
204
+ }
205
+ }
206
+ export function clearUpdateCache() {
207
+ try {
208
+ if (existsSync(CACHE_FILE)) {
209
+ writeFileSync(CACHE_FILE, "{}", "utf8");
210
+ }
211
+ }
212
+ catch {
213
+ // Ignore errors
214
+ }
215
+ }
216
+ //# sourceMappingURL=auto-update-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-update-checker.js","sourceRoot":"","sources":["../../lib/auto-update-checker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export interface CapabilityPolicySnapshot {
2
+ successes: number;
3
+ failures: number;
4
+ unsupported: number;
5
+ lastSuccessAt?: number;
6
+ lastFailureAt?: number;
7
+ }
8
+ export declare class CapabilityPolicyStore {
9
+ private readonly entries;
10
+ recordSuccess(accountKey: string, model: string, now?: number): void;
11
+ recordFailure(accountKey: string, model: string, now?: number): void;
12
+ recordUnsupported(accountKey: string, model: string, now?: number): void;
13
+ getBoost(accountKey: string, model: string, now?: number): number;
14
+ getSnapshot(accountKey: string, model: string): CapabilityPolicySnapshot | null;
15
+ clearAccount(accountKey: string): number;
16
+ private evictIfNeeded;
17
+ }
18
+ //# sourceMappingURL=capability-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability-policy.d.ts","sourceRoot":"","sources":["../../lib/capability-policy.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,wBAAwB;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAmDD,qBAAa,qBAAqB;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;IAE9D,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,IAAI;IAexE,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,IAAI;IAexE,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,IAAI;IAe5E,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,MAAM;IAiBrE,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,wBAAwB,GAAG,IAAI;IAc/E,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAYxC,OAAO,CAAC,aAAa;CASrB"}
@@ -0,0 +1,150 @@
1
+ import { getNormalizedModel } from "./request/helpers/model-map.js";
2
+ const MAX_ENTRIES = 2048;
3
+ const PASSIVE_RECOVERY_PER_MIN = 0.5;
4
+ /**
5
+ * Produce a compact canonical token from a model identifier for use in storage keys.
6
+ *
7
+ * The function is side-effect-free and safe for concurrent use. It treats only forward slashes ("/") as segment separators,
8
+ * removes common trailing qualifiers (`-none`, `-minimal`, `-low`, `-medium`, `-high`, `-xhigh`) from the final segment,
9
+ * and does not access the filesystem. It does not further redact secrets; the resulting token may require encoding before
10
+ * use as a Windows filename.
11
+ *
12
+ * @param model - Optional model string which may include path-like segments and trailing qualifiers
13
+ * @returns The normalized model token, or `null` if `model` is missing or empty after trimming
14
+ */
15
+ function normalizeModel(model) {
16
+ if (!model)
17
+ return null;
18
+ const trimmedInput = model.trim();
19
+ if (!trimmedInput)
20
+ return null;
21
+ const withoutProvider = trimmedInput.includes("/")
22
+ ? (trimmedInput.split("/").pop() ?? trimmedInput)
23
+ : trimmedInput;
24
+ const mapped = getNormalizedModel(withoutProvider) ?? withoutProvider;
25
+ const trimmed = mapped.trim().toLowerCase();
26
+ if (!trimmed)
27
+ return null;
28
+ return trimmed.replace(/-(none|minimal|low|medium|high|xhigh)$/i, "");
29
+ }
30
+ /**
31
+ * Compose a storage key from an account key and a normalized model identifier.
32
+ *
33
+ * The function is pure and safe to call concurrently. It does not perform any
34
+ * secret/token redaction — do not pass sensitive values in `accountKey` or `model`.
35
+ * Note: the returned key includes a colon separator (`accountKey:normalizedModel`)
36
+ * and may not be suitable as a Windows filename without further encoding.
37
+ *
38
+ * @param accountKey - The account identifier used as the key prefix
39
+ * @param model - The model string to normalize and append; may be undefined
40
+ * @returns The combined key string, or `null` if `accountKey` is falsy or `model` cannot be normalized
41
+ */
42
+ function makeKey(accountKey, model) {
43
+ const normalized = normalizeModel(model);
44
+ if (!accountKey || !normalized)
45
+ return null;
46
+ return `${accountKey}:${normalized}`;
47
+ }
48
+ export class CapabilityPolicyStore {
49
+ entries = new Map();
50
+ recordSuccess(accountKey, model, now = Date.now()) {
51
+ const key = makeKey(accountKey, model);
52
+ if (!key)
53
+ return;
54
+ const existing = this.entries.get(key);
55
+ this.entries.set(key, {
56
+ successes: (existing?.successes ?? 0) + 1,
57
+ failures: Math.max(0, (existing?.failures ?? 0) - 1),
58
+ unsupported: Math.max(0, (existing?.unsupported ?? 0) - 1),
59
+ lastSuccessAt: now,
60
+ lastFailureAt: existing?.lastFailureAt,
61
+ updatedAt: now,
62
+ });
63
+ this.evictIfNeeded();
64
+ }
65
+ recordFailure(accountKey, model, now = Date.now()) {
66
+ const key = makeKey(accountKey, model);
67
+ if (!key)
68
+ return;
69
+ const existing = this.entries.get(key);
70
+ this.entries.set(key, {
71
+ successes: existing?.successes ?? 0,
72
+ failures: (existing?.failures ?? 0) + 1,
73
+ unsupported: existing?.unsupported ?? 0,
74
+ lastSuccessAt: existing?.lastSuccessAt,
75
+ lastFailureAt: now,
76
+ updatedAt: now,
77
+ });
78
+ this.evictIfNeeded();
79
+ }
80
+ recordUnsupported(accountKey, model, now = Date.now()) {
81
+ const key = makeKey(accountKey, model);
82
+ if (!key)
83
+ return;
84
+ const existing = this.entries.get(key);
85
+ this.entries.set(key, {
86
+ successes: existing?.successes ?? 0,
87
+ failures: (existing?.failures ?? 0) + 1,
88
+ unsupported: (existing?.unsupported ?? 0) + 1,
89
+ lastSuccessAt: existing?.lastSuccessAt,
90
+ lastFailureAt: now,
91
+ updatedAt: now,
92
+ });
93
+ this.evictIfNeeded();
94
+ }
95
+ getBoost(accountKey, model, now = Date.now()) {
96
+ const key = makeKey(accountKey, model);
97
+ if (!key)
98
+ return 0;
99
+ const entry = this.entries.get(key);
100
+ if (!entry)
101
+ return 0;
102
+ const minutesSinceUpdate = Math.max(0, (now - entry.updatedAt) / 60_000);
103
+ const recoveredFailures = Math.max(0, entry.failures - minutesSinceUpdate * PASSIVE_RECOVERY_PER_MIN);
104
+ const recoveredUnsupported = Math.max(0, entry.unsupported - minutesSinceUpdate * PASSIVE_RECOVERY_PER_MIN);
105
+ const successScore = Math.min(12, entry.successes * 2);
106
+ const failurePenalty = Math.min(18, recoveredFailures * 3);
107
+ const unsupportedPenalty = Math.min(24, recoveredUnsupported * 6);
108
+ const net = successScore - failurePenalty - unsupportedPenalty;
109
+ return Math.max(-30, Math.min(20, net));
110
+ }
111
+ getSnapshot(accountKey, model) {
112
+ const key = makeKey(accountKey, model);
113
+ if (!key)
114
+ return null;
115
+ const entry = this.entries.get(key);
116
+ if (!entry)
117
+ return null;
118
+ return {
119
+ successes: entry.successes,
120
+ failures: entry.failures,
121
+ unsupported: entry.unsupported,
122
+ lastSuccessAt: entry.lastSuccessAt,
123
+ lastFailureAt: entry.lastFailureAt,
124
+ };
125
+ }
126
+ clearAccount(accountKey) {
127
+ if (!accountKey)
128
+ return 0;
129
+ let removed = 0;
130
+ for (const key of this.entries.keys()) {
131
+ if (key.startsWith(`${accountKey}:`)) {
132
+ this.entries.delete(key);
133
+ removed += 1;
134
+ }
135
+ }
136
+ return removed;
137
+ }
138
+ evictIfNeeded() {
139
+ if (this.entries.size <= MAX_ENTRIES)
140
+ return;
141
+ const oldest = this.entries.entries().next().value;
142
+ if (!oldest)
143
+ return;
144
+ const [key] = oldest;
145
+ if (typeof key === "string") {
146
+ this.entries.delete(key);
147
+ }
148
+ }
149
+ }
150
+ //# sourceMappingURL=capability-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability-policy.js","sourceRoot":"","sources":["../../lib/capability-policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ export interface CircuitBreakerConfig {
2
+ failureThreshold: number;
3
+ failureWindowMs: number;
4
+ resetTimeoutMs: number;
5
+ halfOpenMaxAttempts: number;
6
+ }
7
+ export declare const DEFAULT_CIRCUIT_BREAKER_CONFIG: CircuitBreakerConfig;
8
+ export type CircuitState = "closed" | "open" | "half-open";
9
+ export declare class CircuitOpenError extends Error {
10
+ constructor(message?: string);
11
+ }
12
+ export declare class CircuitBreaker {
13
+ private state;
14
+ private failures;
15
+ private lastStateChange;
16
+ private halfOpenAttempts;
17
+ private config;
18
+ constructor(config?: Partial<CircuitBreakerConfig>);
19
+ canExecute(): boolean;
20
+ recordSuccess(): void;
21
+ recordFailure(): void;
22
+ getState(): CircuitState;
23
+ reset(): void;
24
+ getFailureCount(): number;
25
+ getTimeUntilReset(): number;
26
+ private pruneFailures;
27
+ private transitionToOpen;
28
+ private transitionToHalfOpen;
29
+ private resetToClosed;
30
+ }
31
+ export declare function getCircuitBreaker(key: string, config?: Partial<CircuitBreakerConfig>): CircuitBreaker;
32
+ export declare function resetAllCircuitBreakers(): void;
33
+ export declare function clearCircuitBreakers(): void;
34
+ //# sourceMappingURL=circuit-breaker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../../lib/circuit-breaker.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;CAC5B;AAED,eAAO,MAAM,8BAA8B,EAAE,oBAK5C,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAE3D,qBAAa,gBAAiB,SAAQ,KAAK;gBAC9B,OAAO,SAAoB;CAIvC;AAED,qBAAa,cAAc;IAC1B,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,MAAM,CAAuB;gBAEzB,MAAM,GAAE,OAAO,CAAC,oBAAoB,CAAM;IAItD,UAAU,IAAI,OAAO;IAsBrB,aAAa,IAAI,IAAI;IAYrB,aAAa,IAAI,IAAI;IAerB,QAAQ,IAAI,YAAY;IAIxB,KAAK,IAAI,IAAI;IAIb,eAAe,IAAI,MAAM;IAKzB,iBAAiB,IAAI,MAAM;IAM3B,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,aAAa;CAMrB;AAKD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,cAAc,CAYrG;AAED,wBAAgB,uBAAuB,IAAI,IAAI,CAI9C;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
@@ -0,0 +1,124 @@
1
+ export const DEFAULT_CIRCUIT_BREAKER_CONFIG = {
2
+ failureThreshold: 3,
3
+ failureWindowMs: 60_000,
4
+ resetTimeoutMs: 30_000,
5
+ halfOpenMaxAttempts: 1,
6
+ };
7
+ export class CircuitOpenError extends Error {
8
+ constructor(message = "Circuit is open") {
9
+ super(message);
10
+ this.name = "CircuitOpenError";
11
+ }
12
+ }
13
+ export class CircuitBreaker {
14
+ state = "closed";
15
+ failures = [];
16
+ lastStateChange = Date.now();
17
+ halfOpenAttempts = 0;
18
+ config;
19
+ constructor(config = {}) {
20
+ this.config = { ...DEFAULT_CIRCUIT_BREAKER_CONFIG, ...config };
21
+ }
22
+ canExecute() {
23
+ const now = Date.now();
24
+ if (this.state === "open") {
25
+ if (now - this.lastStateChange >= this.config.resetTimeoutMs) {
26
+ this.transitionToHalfOpen(now);
27
+ }
28
+ else {
29
+ throw new CircuitOpenError();
30
+ }
31
+ }
32
+ if (this.state === "half-open") {
33
+ if (this.halfOpenAttempts >= this.config.halfOpenMaxAttempts) {
34
+ throw new CircuitOpenError("Circuit is half-open");
35
+ }
36
+ this.halfOpenAttempts += 1;
37
+ return true;
38
+ }
39
+ return true;
40
+ }
41
+ recordSuccess() {
42
+ const now = Date.now();
43
+ if (this.state === "half-open") {
44
+ this.resetToClosed(now);
45
+ return;
46
+ }
47
+ if (this.state === "closed") {
48
+ this.pruneFailures(now);
49
+ }
50
+ }
51
+ recordFailure() {
52
+ const now = Date.now();
53
+ this.pruneFailures(now);
54
+ this.failures.push(now);
55
+ if (this.state === "half-open") {
56
+ this.transitionToOpen(now);
57
+ return;
58
+ }
59
+ if (this.state === "closed" && this.failures.length >= this.config.failureThreshold) {
60
+ this.transitionToOpen(now);
61
+ }
62
+ }
63
+ getState() {
64
+ return this.state;
65
+ }
66
+ reset() {
67
+ this.resetToClosed(Date.now());
68
+ }
69
+ getFailureCount() {
70
+ this.pruneFailures(Date.now());
71
+ return this.failures.length;
72
+ }
73
+ getTimeUntilReset() {
74
+ if (this.state !== "open")
75
+ return 0;
76
+ const elapsed = Date.now() - this.lastStateChange;
77
+ return Math.max(0, this.config.resetTimeoutMs - elapsed);
78
+ }
79
+ pruneFailures(now) {
80
+ const cutoff = now - this.config.failureWindowMs;
81
+ this.failures = this.failures.filter((timestamp) => timestamp >= cutoff);
82
+ }
83
+ transitionToOpen(now) {
84
+ this.state = "open";
85
+ this.lastStateChange = now;
86
+ this.halfOpenAttempts = 0;
87
+ }
88
+ transitionToHalfOpen(now) {
89
+ this.state = "half-open";
90
+ this.lastStateChange = now;
91
+ this.halfOpenAttempts = 0;
92
+ }
93
+ resetToClosed(now) {
94
+ this.state = "closed";
95
+ this.lastStateChange = now;
96
+ this.halfOpenAttempts = 0;
97
+ this.failures = [];
98
+ }
99
+ }
100
+ const MAX_CIRCUIT_BREAKERS = 100;
101
+ const circuitBreakers = new Map();
102
+ export function getCircuitBreaker(key, config) {
103
+ let breaker = circuitBreakers.get(key);
104
+ if (!breaker) {
105
+ if (circuitBreakers.size >= MAX_CIRCUIT_BREAKERS) {
106
+ const firstKey = circuitBreakers.keys().next().value;
107
+ // istanbul ignore next -- defensive: firstKey always exists when size >= MAX_CIRCUIT_BREAKERS
108
+ if (firstKey)
109
+ circuitBreakers.delete(firstKey);
110
+ }
111
+ breaker = new CircuitBreaker(config);
112
+ circuitBreakers.set(key, breaker);
113
+ }
114
+ return breaker;
115
+ }
116
+ export function resetAllCircuitBreakers() {
117
+ for (const breaker of circuitBreakers.values()) {
118
+ breaker.reset();
119
+ }
120
+ }
121
+ export function clearCircuitBreakers() {
122
+ circuitBreakers.clear();
123
+ }
124
+ //# sourceMappingURL=circuit-breaker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../lib/circuit-breaker.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,8BAA8B,GAAyB;IACnE,gBAAgB,EAAE,CAAC;IACnB,eAAe,EAAE,MAAM;IACvB,cAAc,EAAE,MAAM;IACtB,mBAAmB,EAAE,CAAC;CACtB,CAAC;AAIF,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAC1C,YAAY,OAAO,GAAG,iBAAiB;QACtC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IAChC,CAAC;CACD;AAED,MAAM,OAAO,cAAc;IAClB,KAAK,GAAiB,QAAQ,CAAC;IAC/B,QAAQ,GAAa,EAAE,CAAC;IACxB,eAAe,GAAW,IAAI,CAAC,GAAG,EAAE,CAAC;IACrC,gBAAgB,GAAW,CAAC,CAAC;IAC7B,MAAM,CAAuB;IAErC,YAAY,SAAwC,EAAE;QACrD,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,8BAA8B,EAAE,GAAG,MAAM,EAAE,CAAC;IAChE,CAAC;IAED,UAAU;QACT,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YAC3B,IAAI,GAAG,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;gBAC9D,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACP,MAAM,IAAI,gBAAgB,EAAE,CAAC;YAC9B,CAAC;QACF,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YAChC,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;gBAC9D,MAAM,IAAI,gBAAgB,CAAC,sBAAsB,CAAC,CAAC;YACpD,CAAC;YACD,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC;YAC3B,OAAO,IAAI,CAAC;QACb,CAAC;QAED,OAAO,IAAI,CAAC;IACb,CAAC;IAED,aAAa;QACZ,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YAChC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YACxB,OAAO;QACR,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACF,CAAC;IAED,aAAa;QACZ,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAExB,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YAChC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;YAC3B,OAAO;QACR,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;YACrF,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;IACF,CAAC;IAED,QAAQ;QACP,OAAO,IAAI,CAAC,KAAK,CAAC;IACnB,CAAC;IAED,KAAK;QACJ,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,eAAe;QACd,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,iBAAiB;QAChB,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM;YAAE,OAAO,CAAC,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC;QAClD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,GAAG,OAAO,CAAC,CAAC;IAC1D,CAAC;IAEO,aAAa,CAAC,GAAW;QAChC,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;QACjD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,IAAI,MAAM,CAAC,CAAC;IAC1E,CAAC;IAEO,gBAAgB,CAAC,GAAW;QACnC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;QACpB,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC;QAC3B,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;IAC3B,CAAC;IAEO,oBAAoB,CAAC,GAAW;QACvC,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC;QACzB,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC;QAC3B,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;IAC3B,CAAC;IAEO,aAAa,CAAC,GAAW;QAChC,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACtB,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC;QAC3B,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACpB,CAAC;CACD;AAED,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,eAAe,GAAG,IAAI,GAAG,EAA0B,CAAC;AAE1D,MAAM,UAAU,iBAAiB,CAAC,GAAW,EAAE,MAAsC;IACpF,IAAI,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,IAAI,eAAe,CAAC,IAAI,IAAI,oBAAoB,EAAE,CAAC;YAClD,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YACrD,8FAA8F;YAC9F,IAAI,QAAQ;gBAAE,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;QACrC,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,uBAAuB;IACtC,KAAK,MAAM,OAAO,IAAI,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC;QAChD,OAAO,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,oBAAoB;IACnC,eAAe,CAAC,KAAK,EAAE,CAAC;AACzB,CAAC"}
@@ -0,0 +1,64 @@
1
+ import type { AccountIdSource } from "./types.js";
2
+ import { isTTY, type AccountStatus } from "./ui/auth-menu.js";
3
+ /**
4
+ * Detect if running in OpenCode Desktop/TUI mode where readline prompts don't work.
5
+ * In TUI mode, stdin/stdout are controlled by the TUI renderer, so readline breaks.
6
+ * Exported for testing purposes.
7
+ */
8
+ export declare function isNonInteractiveMode(): boolean;
9
+ export declare function promptAddAnotherAccount(currentCount: number): Promise<boolean>;
10
+ export type LoginMode = "add" | "forecast" | "fix" | "settings" | "fresh" | "manage" | "check" | "deep-check" | "verify-flagged" | "cancel";
11
+ export interface ExistingAccountInfo {
12
+ accountId?: string;
13
+ accountLabel?: string;
14
+ email?: string;
15
+ index: number;
16
+ sourceIndex?: number;
17
+ quickSwitchNumber?: number;
18
+ addedAt?: number;
19
+ lastUsed?: number;
20
+ status?: AccountStatus;
21
+ quotaSummary?: string;
22
+ quota5hLeftPercent?: number;
23
+ quota5hResetAtMs?: number;
24
+ quota7dLeftPercent?: number;
25
+ quota7dResetAtMs?: number;
26
+ quotaRateLimited?: boolean;
27
+ isCurrentAccount?: boolean;
28
+ enabled?: boolean;
29
+ showStatusBadge?: boolean;
30
+ showCurrentBadge?: boolean;
31
+ showLastUsed?: boolean;
32
+ showQuotaCooldown?: boolean;
33
+ showHintsForUnselectedRows?: boolean;
34
+ highlightCurrentRow?: boolean;
35
+ focusStyle?: "row-invert" | "chip";
36
+ statuslineFields?: string[];
37
+ }
38
+ export interface LoginMenuOptions {
39
+ flaggedCount?: number;
40
+ statusMessage?: string | (() => string | undefined);
41
+ }
42
+ export interface LoginMenuResult {
43
+ mode: LoginMode;
44
+ deleteAccountIndex?: number;
45
+ refreshAccountIndex?: number;
46
+ toggleAccountIndex?: number;
47
+ switchAccountIndex?: number;
48
+ deleteAll?: boolean;
49
+ }
50
+ export declare function promptLoginMode(existingAccounts: ExistingAccountInfo[], options?: LoginMenuOptions): Promise<LoginMenuResult>;
51
+ export interface AccountSelectionCandidate {
52
+ accountId: string;
53
+ label: string;
54
+ source?: AccountIdSource;
55
+ isDefault?: boolean;
56
+ }
57
+ export interface AccountSelectionOptions {
58
+ defaultIndex?: number;
59
+ title?: string;
60
+ }
61
+ export declare function promptAccountSelection(candidates: AccountSelectionCandidate[], options?: AccountSelectionOptions): Promise<AccountSelectionCandidate | null>;
62
+ export { isTTY };
63
+ export type { AccountStatus };
64
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../lib/cli.ts"],"names":[],"mappings":"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"}