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,69 @@
1
+ import { createUiTheme, } from "./theme.js";
2
+ const DEFAULT_OPTIONS = {
3
+ v2Enabled: true,
4
+ colorProfile: "truecolor",
5
+ glyphMode: "ascii",
6
+ palette: "green",
7
+ accent: "green",
8
+ theme: createUiTheme({
9
+ profile: "truecolor",
10
+ glyphMode: "ascii",
11
+ palette: "green",
12
+ accent: "green",
13
+ }),
14
+ };
15
+ let runtimeOptions = { ...DEFAULT_OPTIONS };
16
+ /**
17
+ * Update UI runtime options and recompute the derived theme.
18
+ *
19
+ * Unspecified fields in `options` retain their current values; the exported `runtimeOptions`
20
+ * object is replaced with a new object containing the resolved fields and a newly created
21
+ * `theme` based on `colorProfile`, `glyphMode`, `palette`, and `accent`.
22
+ *
23
+ * Concurrency: callers should synchronize externally if multiple callers may update options
24
+ * concurrently (updates are a single replacement and may race). Filesystem: this function
25
+ * performs no filesystem operations and is unaffected by Windows filesystem semantics.
26
+ * Token handling: this function does not perform token redaction or logging—sensitive
27
+ * values should be redacted by the caller before passing them in.
28
+ *
29
+ * @param options - Partial runtime options (omit `theme`); any omitted fields keep their current values
30
+ * @returns The resolved `UiRuntimeOptions` including the recomputed `theme`
31
+ */
32
+ export function setUiRuntimeOptions(options) {
33
+ const v2Enabled = options.v2Enabled ?? runtimeOptions.v2Enabled;
34
+ const colorProfile = options.colorProfile ?? runtimeOptions.colorProfile;
35
+ const glyphMode = options.glyphMode ?? runtimeOptions.glyphMode;
36
+ const palette = options.palette ?? runtimeOptions.palette;
37
+ const accent = options.accent ?? runtimeOptions.accent;
38
+ runtimeOptions = {
39
+ v2Enabled,
40
+ colorProfile,
41
+ glyphMode,
42
+ palette,
43
+ accent,
44
+ theme: createUiTheme({ profile: colorProfile, glyphMode, palette, accent }),
45
+ };
46
+ return runtimeOptions;
47
+ }
48
+ /**
49
+ * Accesses the current UI runtime options.
50
+ *
51
+ * The returned object reflects the current in-memory runtime configuration; concurrent callers may observe updates made by others, so external synchronization is recommended when mutating options. This function performs no filesystem I/O (including on Windows) and the runtime options contain no sensitive tokens that require redaction.
52
+ *
53
+ * @returns The current UiRuntimeOptions object
54
+ */
55
+ export function getUiRuntimeOptions() {
56
+ return runtimeOptions;
57
+ }
58
+ /**
59
+ * Reset the UI runtime options to the default configuration.
60
+ *
61
+ * This replaces the global runtime options with a fresh shallow copy of DEFAULT_OPTIONS. Concurrent callers may observe the updated options immediately; callers that need isolation should clone the returned object. This operation performs no filesystem access (including on Windows). The runtime options contain only configuration fields and do not include sensitive tokens.
62
+ *
63
+ * @returns The new runtime options object set to the defaults
64
+ */
65
+ export function resetUiRuntimeOptions() {
66
+ runtimeOptions = { ...DEFAULT_OPTIONS };
67
+ return runtimeOptions;
68
+ }
69
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../lib/ui/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,aAAa,GAMb,MAAM,YAAY,CAAC;AAWpB,MAAM,eAAe,GAAqB;IACzC,SAAS,EAAE,IAAI;IACf,YAAY,EAAE,WAAW;IACzB,SAAS,EAAE,OAAO;IAClB,OAAO,EAAE,OAAO;IAChB,MAAM,EAAE,OAAO;IACf,KAAK,EAAE,aAAa,CAAC;QACpB,OAAO,EAAE,WAAW;QACpB,SAAS,EAAE,OAAO;QAClB,OAAO,EAAE,OAAO;QAChB,MAAM,EAAE,OAAO;KACf,CAAC;CACF,CAAC;AAEF,IAAI,cAAc,GAAqB,EAAE,GAAG,eAAe,EAAE,CAAC;AAE9D;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,mBAAmB,CAClC,OAAiD;IAEjD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,cAAc,CAAC,SAAS,CAAC;IAChE,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,cAAc,CAAC,YAAY,CAAC;IACzE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,cAAc,CAAC,SAAS,CAAC;IAChE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,cAAc,CAAC,OAAO,CAAC;IAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,cAAc,CAAC,MAAM,CAAC;IACvD,cAAc,GAAG;QAChB,SAAS;QACT,YAAY;QACZ,SAAS;QACT,OAAO;QACP,MAAM;QACN,KAAK,EAAE,aAAa,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;KAC3E,CAAC;IACF,OAAO,cAAc,CAAC;AACvB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB;IAClC,OAAO,cAAc,CAAC;AACvB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB;IACpC,cAAc,GAAG,EAAE,GAAG,eAAe,EAAE,CAAC;IACxC,OAAO,cAAc,CAAC;AACvB,CAAC"}
@@ -0,0 +1,60 @@
1
+ import type { UiTheme } from "./theme.js";
2
+ export interface MenuItem<T = string> {
3
+ label: string;
4
+ selectedLabel?: string;
5
+ value: T;
6
+ hint?: string;
7
+ disabled?: boolean;
8
+ hideUnavailableSuffix?: boolean;
9
+ separator?: boolean;
10
+ kind?: "heading";
11
+ color?: "red" | "green" | "yellow" | "cyan";
12
+ }
13
+ export interface SelectOptions<T = string> {
14
+ message: string;
15
+ subtitle?: string;
16
+ dynamicSubtitle?: () => string | undefined;
17
+ help?: string;
18
+ clearScreen?: boolean;
19
+ theme?: UiTheme;
20
+ selectedEmphasis?: "chip" | "minimal";
21
+ focusStyle?: "row-invert" | "chip";
22
+ showHintsForUnselected?: boolean;
23
+ refreshIntervalMs?: number;
24
+ initialCursor?: number;
25
+ allowEscape?: boolean;
26
+ onCursorChange?: (context: {
27
+ cursor: number;
28
+ items: MenuItem<T>[];
29
+ requestRerender: () => void;
30
+ }) => void;
31
+ onInput?: (input: string, context: {
32
+ cursor: number;
33
+ items: MenuItem<T>[];
34
+ requestRerender: () => void;
35
+ }) => T | null | undefined;
36
+ }
37
+ /**
38
+ * Present an interactive TTY menu, let the user navigate and choose an item.
39
+ *
40
+ * Mutates terminal state (raw mode, cursor visibility) and drives stdin/stdout until the
41
+ * prompt finishes. Emits ANSI control sequences; on Windows the result depends on the
42
+ * host terminal's ANSI support. Callers must not run this concurrently with other code
43
+ * that expects normal terminal stdin/stdout state and must redact any sensitive tokens
44
+ * in item labels/hints before calling.
45
+ *
46
+ * @param items - Menu items to display. Items with `disabled`, `separator`, or `kind === "heading"`
47
+ * are non-selectable. If exactly one selectable item exists its `value` is returned
48
+ * immediately.
49
+ * @param options - Configuration for the prompt (message, subtitle or `dynamicSubtitle`, theme,
50
+ * `focusStyle`, `initialCursor`, `allowEscape`, `onCursorChange`, `onInput`,
51
+ * `refreshIntervalMs`, `help`, `clearScreen`, and related display behavior).
52
+ * - `onInput` receives decoded hotkey input and may return a `T` to finish early
53
+ * or `undefined` to continue; it may call `requestRerender` via the provided context.
54
+ * - `onCursorChange` is invoked when the highlighted cursor changes and may request rerender.
55
+ * @returns The selected item's `value`, or `null` if the prompt was cancelled or could not be started.
56
+ *
57
+ * @throws If not running on a TTY, if `items` is empty, or if all menu items are non-selectable.
58
+ */
59
+ export declare function select<T>(items: MenuItem<T>[], options: SelectOptions<T>): Promise<T | null>;
60
+ //# sourceMappingURL=select.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../../lib/ui/select.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,WAAW,QAAQ,CAAC,CAAC,GAAG,MAAM;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,CAAC,CAAC;IACT,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;CAC5C;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,MAAM;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,UAAU,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC;IACnC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,CAChB,OAAO,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,eAAe,EAAE,MAAM,IAAI,CAAC;KAC5B,KACG,IAAI,CAAC;IACV,OAAO,CAAC,EAAE,CACT,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,eAAe,EAAE,MAAM,IAAI,CAAC;KAC5B,KACG,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;CAC1B;AAiHD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAiXlG"}
@@ -0,0 +1,467 @@
1
+ import { ANSI, isTTY, parseKey } from "./ansi.js";
2
+ const ESCAPE_TIMEOUT_MS = 50;
3
+ const ANSI_REGEX = /\x1b\[[0-9;]*m/g;
4
+ const ANSI_LEADING_REGEX = /^\x1b\[[0-9;]*m/;
5
+ function stripAnsi(input) {
6
+ return input.replace(ANSI_REGEX, "");
7
+ }
8
+ /**
9
+ * Truncates a string to at most a given number of visible characters while preserving ANSI SGR sequences.
10
+ *
11
+ * Preserves ANSI color/formatting codes in the returned string and appends "..." (or "." / shorter sequences)
12
+ * as a visible truncation suffix when the visible length exceeds `maxVisibleChars`.
13
+ *
14
+ * Concurrency: function is pure and safe for concurrent use. Filesystem: behavior is independent of OS (including Windows).
15
+ * Token handling: this function does not redact or interpret token semantics; it only preserves ANSI escape sequences.
16
+ *
17
+ * @param input - The input string which may contain ANSI SGR escape sequences.
18
+ * @param maxVisibleChars - Maximum number of visible (non-ANSI) characters to keep; values <= 0 yield an empty string.
19
+ * @returns The input string truncated so its visible character count does not exceed `maxVisibleChars`, with ANSI codes preserved and a truncation suffix appended when truncation occurred.
20
+ */
21
+ function truncateAnsi(input, maxVisibleChars) {
22
+ if (maxVisibleChars <= 0)
23
+ return "";
24
+ const visible = stripAnsi(input);
25
+ if (visible.length <= maxVisibleChars)
26
+ return input;
27
+ const suffix = maxVisibleChars >= 3 ? "..." : ".".repeat(maxVisibleChars);
28
+ const keep = Math.max(0, maxVisibleChars - suffix.length);
29
+ let kept = 0;
30
+ let index = 0;
31
+ let output = "";
32
+ while (index < input.length && kept < keep) {
33
+ if (input[index] === "\x1b") {
34
+ const match = input.slice(index).match(ANSI_LEADING_REGEX);
35
+ if (match) {
36
+ output += match[0];
37
+ index += match[0].length;
38
+ continue;
39
+ }
40
+ }
41
+ output += input[index];
42
+ index += 1;
43
+ kept += 1;
44
+ }
45
+ return output + suffix;
46
+ }
47
+ /**
48
+ * Map a MenuItem color to its ANSI SGR color code.
49
+ *
50
+ * No concurrency effects; does not access the filesystem on Windows or other platforms; performs no token redaction.
51
+ *
52
+ * @param color - The menu item color ("red", "green", "yellow", "cyan") or undefined/other for no color
53
+ * @returns The ANSI SGR code for `color`, or an empty string if no color is specified
54
+ */
55
+ function colorCode(color) {
56
+ switch (color) {
57
+ case "red":
58
+ return ANSI.red;
59
+ case "green":
60
+ return ANSI.green;
61
+ case "yellow":
62
+ return ANSI.yellow;
63
+ case "cyan":
64
+ return ANSI.cyan;
65
+ default:
66
+ return "";
67
+ }
68
+ }
69
+ /**
70
+ * Decode a raw stdin buffer into a single printable "hotkey" character or `null` when none is available.
71
+ *
72
+ * Recognizes common VT-style numpad/keypad escape sequences and otherwise yields the first printable ASCII character in the input. Safe to call concurrently; it performs no filesystem or external I/O and behaves the same on Windows. This function never returns control or non-printable bytes, reducing the risk of leaking raw control sequences or sensitive tokens.
73
+ *
74
+ * @param data - Raw input buffer from stdin (may contain escape sequences or control bytes)
75
+ * @returns The decoded single-character hotkey (for example, `"0"`, `"a"`, `"+"`) or `null` if no printable character is present
76
+ */
77
+ function decodeHotkeyInput(data) {
78
+ const input = data.toString("utf8");
79
+ // Common VT-style numpad sequences in raw mode.
80
+ const keypadMap = {
81
+ "\x1bOp": "0",
82
+ "\x1bOq": "1",
83
+ "\x1bOr": "2",
84
+ "\x1bOs": "3",
85
+ "\x1bOt": "4",
86
+ "\x1bOu": "5",
87
+ "\x1bOv": "6",
88
+ "\x1bOw": "7",
89
+ "\x1bOx": "8",
90
+ "\x1bOy": "9",
91
+ "\x1bOk": "+",
92
+ "\x1bOm": "-",
93
+ "\x1bOj": "*",
94
+ "\x1bOo": "/",
95
+ "\x1bOn": ".",
96
+ };
97
+ const mapped = keypadMap[input];
98
+ if (mapped)
99
+ return mapped;
100
+ // Fallback: strip control bytes and keep first printable ASCII char.
101
+ for (const ch of input) {
102
+ const code = ch.charCodeAt(0);
103
+ if (code >= 32 && code <= 126)
104
+ return ch;
105
+ }
106
+ return null;
107
+ }
108
+ /**
109
+ * Present an interactive TTY menu, let the user navigate and choose an item.
110
+ *
111
+ * Mutates terminal state (raw mode, cursor visibility) and drives stdin/stdout until the
112
+ * prompt finishes. Emits ANSI control sequences; on Windows the result depends on the
113
+ * host terminal's ANSI support. Callers must not run this concurrently with other code
114
+ * that expects normal terminal stdin/stdout state and must redact any sensitive tokens
115
+ * in item labels/hints before calling.
116
+ *
117
+ * @param items - Menu items to display. Items with `disabled`, `separator`, or `kind === "heading"`
118
+ * are non-selectable. If exactly one selectable item exists its `value` is returned
119
+ * immediately.
120
+ * @param options - Configuration for the prompt (message, subtitle or `dynamicSubtitle`, theme,
121
+ * `focusStyle`, `initialCursor`, `allowEscape`, `onCursorChange`, `onInput`,
122
+ * `refreshIntervalMs`, `help`, `clearScreen`, and related display behavior).
123
+ * - `onInput` receives decoded hotkey input and may return a `T` to finish early
124
+ * or `undefined` to continue; it may call `requestRerender` via the provided context.
125
+ * - `onCursorChange` is invoked when the highlighted cursor changes and may request rerender.
126
+ * @returns The selected item's `value`, or `null` if the prompt was cancelled or could not be started.
127
+ *
128
+ * @throws If not running on a TTY, if `items` is empty, or if all menu items are non-selectable.
129
+ */
130
+ export async function select(items, options) {
131
+ if (!isTTY()) {
132
+ throw new Error("Interactive select requires a TTY terminal");
133
+ }
134
+ if (items.length === 0) {
135
+ throw new Error("No menu items provided");
136
+ }
137
+ const isSelectable = (item) => !item.disabled && !item.separator && item.kind !== "heading";
138
+ const selectable = items.filter(isSelectable);
139
+ if (selectable.length === 0) {
140
+ throw new Error("All menu items are disabled");
141
+ }
142
+ if (selectable.length === 1) {
143
+ return selectable[0]?.value ?? null;
144
+ }
145
+ const { stdin, stdout } = process;
146
+ let cursor = items.findIndex(isSelectable);
147
+ if (typeof options.initialCursor === "number" && Number.isFinite(options.initialCursor)) {
148
+ const bounded = Math.max(0, Math.min(items.length - 1, Math.trunc(options.initialCursor)));
149
+ cursor = bounded;
150
+ }
151
+ if (cursor < 0 || !isSelectable(items[cursor])) {
152
+ cursor = items.findIndex(isSelectable);
153
+ }
154
+ if (cursor < 0)
155
+ cursor = 0;
156
+ let escapeTimeout = null;
157
+ let cleanedUp = false;
158
+ let renderedLines = 0;
159
+ let hasRendered = false;
160
+ let inputGuardUntil = 0;
161
+ const theme = options.theme;
162
+ let rerenderRequested = false;
163
+ const requestRerender = () => {
164
+ rerenderRequested = true;
165
+ };
166
+ const notifyCursorChange = () => {
167
+ if (!options.onCursorChange)
168
+ return;
169
+ rerenderRequested = false;
170
+ options.onCursorChange({
171
+ cursor,
172
+ items,
173
+ requestRerender,
174
+ });
175
+ };
176
+ const drainStdinBuffer = () => {
177
+ try {
178
+ let chunk;
179
+ do {
180
+ chunk = stdin.read();
181
+ } while (chunk !== null);
182
+ }
183
+ catch {
184
+ // best effort: ignore non-readable states
185
+ }
186
+ };
187
+ const codexColorCode = (color) => {
188
+ if (!theme) {
189
+ return colorCode(color);
190
+ }
191
+ switch (color) {
192
+ case "red":
193
+ return theme.colors.danger;
194
+ case "green":
195
+ return theme.colors.success;
196
+ case "yellow":
197
+ return theme.colors.warning;
198
+ case "cyan":
199
+ return theme.colors.accent;
200
+ default:
201
+ return theme.colors.heading;
202
+ }
203
+ };
204
+ const selectedLabelStart = () => {
205
+ if (!theme) {
206
+ return `${ANSI.bgGreen}${ANSI.black}${ANSI.bold}`;
207
+ }
208
+ return `${theme.colors.focusBg}${theme.colors.focusText}${ANSI.bold}`;
209
+ };
210
+ const render = () => {
211
+ const columns = stdout.columns ?? 80;
212
+ const rows = stdout.rows ?? 24;
213
+ const previousRenderedLines = renderedLines;
214
+ const subtitleText = options.dynamicSubtitle ? options.dynamicSubtitle() : options.subtitle;
215
+ const focusStyle = options.focusStyle ?? "row-invert";
216
+ let didFullClear = false;
217
+ if (options.clearScreen && !hasRendered) {
218
+ stdout.write(ANSI.clearScreen + ANSI.moveTo(1, 1));
219
+ didFullClear = true;
220
+ }
221
+ else if (previousRenderedLines > 0) {
222
+ stdout.write(ANSI.up(previousRenderedLines));
223
+ }
224
+ let linesWritten = 0;
225
+ const writeLine = (line) => {
226
+ stdout.write(`${ANSI.clearLine}${line}\n`);
227
+ linesWritten += 1;
228
+ };
229
+ const subtitleLines = subtitleText ? 2 : 0;
230
+ const fixedLines = 2 + subtitleLines + 2;
231
+ const maxVisibleItems = Math.max(1, Math.min(items.length, rows - fixedLines - 1));
232
+ let windowStart = 0;
233
+ let windowEnd = items.length;
234
+ if (items.length > maxVisibleItems) {
235
+ windowStart = cursor - Math.floor(maxVisibleItems / 2);
236
+ windowStart = Math.max(0, Math.min(windowStart, items.length - maxVisibleItems));
237
+ windowEnd = windowStart + maxVisibleItems;
238
+ }
239
+ const visibleItems = items.slice(windowStart, windowEnd);
240
+ const border = theme?.colors.border ?? ANSI.dim;
241
+ const muted = theme?.colors.muted ?? ANSI.dim;
242
+ const heading = theme?.colors.heading ?? ANSI.reset;
243
+ const reset = theme?.colors.reset ?? ANSI.reset;
244
+ const selectedGlyph = theme?.glyphs.selected ?? ">";
245
+ const unselectedGlyph = theme?.glyphs.unselected ?? "o";
246
+ const selectedGlyphColor = theme?.colors.success ?? ANSI.green;
247
+ const selectedChip = selectedLabelStart();
248
+ writeLine(`${border}+${reset} ${heading}${truncateAnsi(options.message, Math.max(1, columns - 4))}${reset}`);
249
+ if (subtitleText) {
250
+ writeLine(` ${muted}${truncateAnsi(subtitleText, Math.max(1, columns - 2))}${reset}`);
251
+ }
252
+ writeLine("");
253
+ for (let i = 0; i < visibleItems.length; i += 1) {
254
+ const itemIndex = windowStart + i;
255
+ const item = visibleItems[i];
256
+ if (!item)
257
+ continue;
258
+ if (item.separator) {
259
+ writeLine("");
260
+ continue;
261
+ }
262
+ if (item.kind === "heading") {
263
+ const heading = truncateAnsi(`${muted}${item.label}${reset}`, Math.max(1, columns - 2));
264
+ writeLine(` ${heading}`);
265
+ continue;
266
+ }
267
+ const selected = itemIndex === cursor;
268
+ if (selected) {
269
+ const selectedText = item.selectedLabel
270
+ ? stripAnsi(item.selectedLabel)
271
+ : item.disabled
272
+ ? item.hideUnavailableSuffix
273
+ ? stripAnsi(item.label)
274
+ : `${stripAnsi(item.label)} (unavailable)`
275
+ : stripAnsi(item.label);
276
+ if (focusStyle === "row-invert") {
277
+ const rowText = `${selectedGlyph} ${selectedText}`;
278
+ const focusedRow = theme
279
+ ? `${theme.colors.focusBg}${theme.colors.focusText}${ANSI.bold}${truncateAnsi(rowText, Math.max(1, columns - 2))}${reset}`
280
+ : `${ANSI.inverse}${truncateAnsi(rowText, Math.max(1, columns - 2))}${ANSI.reset}`;
281
+ writeLine(` ${focusedRow}`);
282
+ }
283
+ else {
284
+ const selectedLabel = `${selectedChip}${selectedText}${reset}`;
285
+ writeLine(` ${selectedGlyphColor}${selectedGlyph}${reset} ${truncateAnsi(selectedLabel, Math.max(1, columns - 4))}`);
286
+ }
287
+ if (item.hint) {
288
+ const detailLines = item.hint.split("\n").slice(0, 3);
289
+ for (const detailLine of detailLines) {
290
+ const detail = truncateAnsi(detailLine, Math.max(1, columns - 8));
291
+ writeLine(` ${muted}${detail}${reset}`);
292
+ }
293
+ }
294
+ }
295
+ else {
296
+ const itemColor = codexColorCode(item.color);
297
+ const labelText = item.disabled
298
+ ? item.hideUnavailableSuffix
299
+ ? `${muted}${item.label}${reset}`
300
+ : `${muted}${item.label} (unavailable)${reset}`
301
+ : `${itemColor}${item.label}${reset}`;
302
+ writeLine(` ${muted}${unselectedGlyph}${reset} ${truncateAnsi(labelText, Math.max(1, columns - 4))}`);
303
+ if (item.hint && (options.showHintsForUnselected ?? true)) {
304
+ const detailLines = item.hint.split("\n").slice(0, 2);
305
+ for (const detailLine of detailLines) {
306
+ const detail = truncateAnsi(`${muted}${detailLine}${reset}`, Math.max(1, columns - 8));
307
+ writeLine(` ${detail}`);
308
+ }
309
+ }
310
+ }
311
+ }
312
+ const windowHint = items.length > visibleItems.length ? ` (${windowStart + 1}-${windowEnd}/${items.length})` : "";
313
+ const backLabel = "Q Back";
314
+ const helpText = options.help ?? `↑↓ Move | Enter Select | ${backLabel}${windowHint}`;
315
+ writeLine(` ${muted}${truncateAnsi(helpText, Math.max(1, columns - 2))}${reset}`);
316
+ writeLine(`${border}+${reset}`);
317
+ if (!didFullClear && previousRenderedLines > linesWritten) {
318
+ const extra = previousRenderedLines - linesWritten;
319
+ for (let i = 0; i < extra; i += 1) {
320
+ writeLine("");
321
+ }
322
+ }
323
+ renderedLines = linesWritten;
324
+ hasRendered = true;
325
+ };
326
+ return new Promise((resolve) => {
327
+ const wasRaw = stdin.isRaw ?? false;
328
+ let refreshTimer = null;
329
+ const cleanup = () => {
330
+ if (cleanedUp)
331
+ return;
332
+ cleanedUp = true;
333
+ if (escapeTimeout) {
334
+ clearTimeout(escapeTimeout);
335
+ escapeTimeout = null;
336
+ }
337
+ try {
338
+ stdin.removeListener("data", onKey);
339
+ stdin.setRawMode(wasRaw);
340
+ stdin.pause();
341
+ if (refreshTimer) {
342
+ clearInterval(refreshTimer);
343
+ refreshTimer = null;
344
+ }
345
+ stdout.write(ANSI.show);
346
+ }
347
+ catch {
348
+ // best effort cleanup
349
+ }
350
+ process.removeListener("SIGINT", onSignal);
351
+ process.removeListener("SIGTERM", onSignal);
352
+ };
353
+ const finish = (value) => {
354
+ cleanup();
355
+ resolve(value);
356
+ };
357
+ const onSignal = () => finish(null);
358
+ const findNextSelectable = (from, direction) => {
359
+ if (items.length === 0)
360
+ return from;
361
+ let next = from;
362
+ do {
363
+ next = (next + direction + items.length) % items.length;
364
+ } while (items[next]?.disabled || items[next]?.separator || items[next]?.kind === "heading");
365
+ return next;
366
+ };
367
+ const onKey = (data) => {
368
+ if (escapeTimeout) {
369
+ clearTimeout(escapeTimeout);
370
+ escapeTimeout = null;
371
+ }
372
+ if (Date.now() < inputGuardUntil) {
373
+ const action = parseKey(data);
374
+ if (action === "enter" || action === "escape" || action === "escape-start") {
375
+ return;
376
+ }
377
+ }
378
+ const action = parseKey(data);
379
+ switch (action) {
380
+ case "up":
381
+ cursor = findNextSelectable(cursor, -1);
382
+ notifyCursorChange();
383
+ render();
384
+ return;
385
+ case "down":
386
+ cursor = findNextSelectable(cursor, 1);
387
+ notifyCursorChange();
388
+ render();
389
+ return;
390
+ case "home":
391
+ cursor = items.findIndex(isSelectable);
392
+ notifyCursorChange();
393
+ render();
394
+ return;
395
+ case "end": {
396
+ for (let i = items.length - 1; i >= 0; i -= 1) {
397
+ const item = items[i];
398
+ if (item && isSelectable(item)) {
399
+ cursor = i;
400
+ break;
401
+ }
402
+ }
403
+ notifyCursorChange();
404
+ render();
405
+ return;
406
+ }
407
+ case "enter":
408
+ finish(items[cursor]?.value ?? null);
409
+ return;
410
+ case "escape":
411
+ if (options.allowEscape !== false) {
412
+ finish(null);
413
+ }
414
+ return;
415
+ case "escape-start":
416
+ if (options.allowEscape !== false) {
417
+ escapeTimeout = setTimeout(() => finish(null), ESCAPE_TIMEOUT_MS);
418
+ }
419
+ return;
420
+ default:
421
+ if (options.onInput) {
422
+ const hotkey = decodeHotkeyInput(data);
423
+ if (hotkey) {
424
+ rerenderRequested = false;
425
+ const result = options.onInput(hotkey, {
426
+ cursor,
427
+ items,
428
+ requestRerender,
429
+ });
430
+ if (result !== undefined) {
431
+ finish(result);
432
+ return;
433
+ }
434
+ if (rerenderRequested) {
435
+ render();
436
+ }
437
+ }
438
+ }
439
+ return;
440
+ }
441
+ };
442
+ process.once("SIGINT", onSignal);
443
+ process.once("SIGTERM", onSignal);
444
+ try {
445
+ stdin.setRawMode(true);
446
+ }
447
+ catch {
448
+ cleanup();
449
+ resolve(null);
450
+ return;
451
+ }
452
+ stdin.resume();
453
+ drainStdinBuffer();
454
+ inputGuardUntil = Date.now() + 120;
455
+ stdout.write(ANSI.hide);
456
+ notifyCursorChange();
457
+ render();
458
+ if (options.dynamicSubtitle && (options.refreshIntervalMs ?? 0) > 0) {
459
+ const intervalMs = Math.max(80, Math.round(options.refreshIntervalMs ?? 0));
460
+ refreshTimer = setInterval(() => {
461
+ render();
462
+ }, intervalMs);
463
+ }
464
+ stdin.on("data", onKey);
465
+ });
466
+ }
467
+ //# sourceMappingURL=select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.js","sourceRoot":"","sources":["../../../lib/ui/select.ts"],"names":[],"mappings":"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"}