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.
- package/LICENSE +1 -0
- package/README.md +162 -0
- package/assets/opencode-logo-ornate-dark.svg +18 -0
- package/assets/readme-hero.svg +31 -0
- package/config/README.md +87 -0
- package/config/minimal-opencode.json +13 -0
- package/config/opencode-legacy.json +571 -0
- package/config/opencode-modern.json +239 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3160 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/accounts/rate-limits.d.ts +22 -0
- package/dist/lib/accounts/rate-limits.d.ts.map +1 -0
- package/dist/lib/accounts/rate-limits.js +63 -0
- package/dist/lib/accounts/rate-limits.js.map +1 -0
- package/dist/lib/accounts.d.ts +95 -0
- package/dist/lib/accounts.d.ts.map +1 -0
- package/dist/lib/accounts.js +668 -0
- package/dist/lib/accounts.js.map +1 -0
- package/dist/lib/audit.d.ts +45 -0
- package/dist/lib/audit.d.ts.map +1 -0
- package/dist/lib/audit.js +131 -0
- package/dist/lib/audit.js.map +1 -0
- package/dist/lib/auth/auth.d.ts +56 -0
- package/dist/lib/auth/auth.d.ts.map +1 -0
- package/dist/lib/auth/auth.js +214 -0
- package/dist/lib/auth/auth.js.map +1 -0
- package/dist/lib/auth/browser.d.ts +34 -0
- package/dist/lib/auth/browser.d.ts.map +1 -0
- package/dist/lib/auth/browser.js +185 -0
- package/dist/lib/auth/browser.js.map +1 -0
- package/dist/lib/auth/server.d.ts +24 -0
- package/dist/lib/auth/server.d.ts.map +1 -0
- package/dist/lib/auth/server.js +116 -0
- package/dist/lib/auth/server.js.map +1 -0
- package/dist/lib/auth/token-utils.d.ts +59 -0
- package/dist/lib/auth/token-utils.d.ts.map +1 -0
- package/dist/lib/auth/token-utils.js +331 -0
- package/dist/lib/auth/token-utils.js.map +1 -0
- package/dist/lib/auth-rate-limit.d.ts +20 -0
- package/dist/lib/auth-rate-limit.d.ts.map +1 -0
- package/dist/lib/auth-rate-limit.js +91 -0
- package/dist/lib/auth-rate-limit.js.map +1 -0
- package/dist/lib/auto-update-checker.d.ts +10 -0
- package/dist/lib/auto-update-checker.d.ts.map +1 -0
- package/dist/lib/auto-update-checker.js +216 -0
- package/dist/lib/auto-update-checker.js.map +1 -0
- package/dist/lib/capability-policy.d.ts +18 -0
- package/dist/lib/capability-policy.d.ts.map +1 -0
- package/dist/lib/capability-policy.js +150 -0
- package/dist/lib/capability-policy.js.map +1 -0
- package/dist/lib/circuit-breaker.d.ts +34 -0
- package/dist/lib/circuit-breaker.d.ts.map +1 -0
- package/dist/lib/circuit-breaker.js +124 -0
- package/dist/lib/circuit-breaker.js.map +1 -0
- package/dist/lib/cli.d.ts +64 -0
- package/dist/lib/cli.d.ts.map +1 -0
- package/dist/lib/cli.js +274 -0
- package/dist/lib/cli.js.map +1 -0
- package/dist/lib/codex-cli/observability.d.ts +22 -0
- package/dist/lib/codex-cli/observability.d.ts.map +1 -0
- package/dist/lib/codex-cli/observability.js +36 -0
- package/dist/lib/codex-cli/observability.js.map +1 -0
- package/dist/lib/codex-cli/state.d.ts +86 -0
- package/dist/lib/codex-cli/state.d.ts.map +1 -0
- package/dist/lib/codex-cli/state.js +470 -0
- package/dist/lib/codex-cli/state.js.map +1 -0
- package/dist/lib/codex-cli/sync.d.ts +27 -0
- package/dist/lib/codex-cli/sync.d.ts.map +1 -0
- package/dist/lib/codex-cli/sync.js +325 -0
- package/dist/lib/codex-cli/sync.js.map +1 -0
- package/dist/lib/codex-cli/writer.d.ts +12 -0
- package/dist/lib/codex-cli/writer.d.ts.map +1 -0
- package/dist/lib/codex-cli/writer.js +388 -0
- package/dist/lib/codex-cli/writer.js.map +1 -0
- package/dist/lib/codex-manager.d.ts +2 -0
- package/dist/lib/codex-manager.d.ts.map +1 -0
- package/dist/lib/codex-manager.js +4841 -0
- package/dist/lib/codex-manager.js.map +1 -0
- package/dist/lib/config.d.ts +269 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +789 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/constants.d.ts +78 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +78 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/context-overflow.d.ts +27 -0
- package/dist/lib/context-overflow.d.ts.map +1 -0
- package/dist/lib/context-overflow.js +124 -0
- package/dist/lib/context-overflow.js.map +1 -0
- package/dist/lib/dashboard-settings.d.ts +90 -0
- package/dist/lib/dashboard-settings.d.ts.map +1 -0
- package/dist/lib/dashboard-settings.js +327 -0
- package/dist/lib/dashboard-settings.js.map +1 -0
- package/dist/lib/entitlement-cache.d.ts +41 -0
- package/dist/lib/entitlement-cache.d.ts.map +1 -0
- package/dist/lib/entitlement-cache.js +137 -0
- package/dist/lib/entitlement-cache.js.map +1 -0
- package/dist/lib/errors.d.ts +113 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +103 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/forecast.d.ts +42 -0
- package/dist/lib/forecast.d.ts.map +1 -0
- package/dist/lib/forecast.js +256 -0
- package/dist/lib/forecast.js.map +1 -0
- package/dist/lib/health.d.ts +33 -0
- package/dist/lib/health.d.ts.map +1 -0
- package/dist/lib/health.js +70 -0
- package/dist/lib/health.js.map +1 -0
- package/dist/lib/index.d.ts +32 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +32 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/live-account-sync.d.ts +39 -0
- package/dist/lib/live-account-sync.d.ts.map +1 -0
- package/dist/lib/live-account-sync.js +196 -0
- package/dist/lib/live-account-sync.js.map +1 -0
- package/dist/lib/logger.d.ts +40 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +364 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/oauth-success.html +338 -0
- package/dist/lib/parallel-probe.d.ts +28 -0
- package/dist/lib/parallel-probe.d.ts.map +1 -0
- package/dist/lib/parallel-probe.js +97 -0
- package/dist/lib/parallel-probe.js.map +1 -0
- package/dist/lib/preemptive-quota-scheduler.d.ts +53 -0
- package/dist/lib/preemptive-quota-scheduler.d.ts.map +1 -0
- package/dist/lib/preemptive-quota-scheduler.js +220 -0
- package/dist/lib/preemptive-quota-scheduler.js.map +1 -0
- package/dist/lib/proactive-refresh.d.ts +66 -0
- package/dist/lib/proactive-refresh.d.ts.map +1 -0
- package/dist/lib/proactive-refresh.js +143 -0
- package/dist/lib/proactive-refresh.js.map +1 -0
- package/dist/lib/prompts/codex-opencode-bridge.d.ts +19 -0
- package/dist/lib/prompts/codex-opencode-bridge.d.ts.map +1 -0
- package/dist/lib/prompts/codex-opencode-bridge.js +169 -0
- package/dist/lib/prompts/codex-opencode-bridge.js.map +1 -0
- package/dist/lib/prompts/codex.d.ts +41 -0
- package/dist/lib/prompts/codex.d.ts.map +1 -0
- package/dist/lib/prompts/codex.js +383 -0
- package/dist/lib/prompts/codex.js.map +1 -0
- package/dist/lib/prompts/opencode-codex.d.ts +25 -0
- package/dist/lib/prompts/opencode-codex.d.ts.map +1 -0
- package/dist/lib/prompts/opencode-codex.js +270 -0
- package/dist/lib/prompts/opencode-codex.js.map +1 -0
- package/dist/lib/quota-cache.d.ts +68 -0
- package/dist/lib/quota-cache.d.ts.map +1 -0
- package/dist/lib/quota-cache.js +224 -0
- package/dist/lib/quota-cache.js.map +1 -0
- package/dist/lib/quota-probe.d.ts +49 -0
- package/dist/lib/quota-probe.d.ts.map +1 -0
- package/dist/lib/quota-probe.js +368 -0
- package/dist/lib/quota-probe.js.map +1 -0
- package/dist/lib/recovery/constants.d.ts +12 -0
- package/dist/lib/recovery/constants.d.ts.map +1 -0
- package/dist/lib/recovery/constants.js +31 -0
- package/dist/lib/recovery/constants.js.map +1 -0
- package/dist/lib/recovery/index.d.ts +12 -0
- package/dist/lib/recovery/index.d.ts.map +1 -0
- package/dist/lib/recovery/index.js +12 -0
- package/dist/lib/recovery/index.js.map +1 -0
- package/dist/lib/recovery/storage.d.ts +24 -0
- package/dist/lib/recovery/storage.d.ts.map +1 -0
- package/dist/lib/recovery/storage.js +362 -0
- package/dist/lib/recovery/storage.js.map +1 -0
- package/dist/lib/recovery/types.d.ts +116 -0
- package/dist/lib/recovery/types.d.ts.map +1 -0
- package/dist/lib/recovery/types.js +7 -0
- package/dist/lib/recovery/types.js.map +1 -0
- package/dist/lib/recovery.d.ts +31 -0
- package/dist/lib/recovery.d.ts.map +1 -0
- package/dist/lib/recovery.js +313 -0
- package/dist/lib/recovery.js.map +1 -0
- package/dist/lib/refresh-guardian.d.ts +31 -0
- package/dist/lib/refresh-guardian.d.ts.map +1 -0
- package/dist/lib/refresh-guardian.js +151 -0
- package/dist/lib/refresh-guardian.js.map +1 -0
- package/dist/lib/refresh-lease.d.ts +37 -0
- package/dist/lib/refresh-lease.d.ts.map +1 -0
- package/dist/lib/refresh-lease.js +335 -0
- package/dist/lib/refresh-lease.js.map +1 -0
- package/dist/lib/refresh-queue.d.ts +117 -0
- package/dist/lib/refresh-queue.d.ts.map +1 -0
- package/dist/lib/refresh-queue.js +297 -0
- package/dist/lib/refresh-queue.js.map +1 -0
- package/dist/lib/request/failure-policy.d.ts +42 -0
- package/dist/lib/request/failure-policy.d.ts.map +1 -0
- package/dist/lib/request/failure-policy.js +133 -0
- package/dist/lib/request/failure-policy.js.map +1 -0
- package/dist/lib/request/fetch-helpers.d.ts +152 -0
- package/dist/lib/request/fetch-helpers.d.ts.map +1 -0
- package/dist/lib/request/fetch-helpers.js +704 -0
- package/dist/lib/request/fetch-helpers.js.map +1 -0
- package/dist/lib/request/helpers/input-utils.d.ts +7 -0
- package/dist/lib/request/helpers/input-utils.d.ts.map +1 -0
- package/dist/lib/request/helpers/input-utils.js +214 -0
- package/dist/lib/request/helpers/input-utils.js.map +1 -0
- package/dist/lib/request/helpers/model-map.d.ts +28 -0
- package/dist/lib/request/helpers/model-map.d.ts.map +1 -0
- package/dist/lib/request/helpers/model-map.js +133 -0
- package/dist/lib/request/helpers/model-map.js.map +1 -0
- package/dist/lib/request/helpers/tool-utils.d.ts +29 -0
- package/dist/lib/request/helpers/tool-utils.d.ts.map +1 -0
- package/dist/lib/request/helpers/tool-utils.js +117 -0
- package/dist/lib/request/helpers/tool-utils.js.map +1 -0
- package/dist/lib/request/rate-limit-backoff.d.ts +17 -0
- package/dist/lib/request/rate-limit-backoff.d.ts.map +1 -0
- package/dist/lib/request/rate-limit-backoff.js +83 -0
- package/dist/lib/request/rate-limit-backoff.js.map +1 -0
- package/dist/lib/request/request-transformer.d.ts +107 -0
- package/dist/lib/request/request-transformer.d.ts.map +1 -0
- package/dist/lib/request/request-transformer.js +814 -0
- package/dist/lib/request/request-transformer.js.map +1 -0
- package/dist/lib/request/response-handler.d.ts +23 -0
- package/dist/lib/request/response-handler.d.ts.map +1 -0
- package/dist/lib/request/response-handler.js +155 -0
- package/dist/lib/request/response-handler.js.map +1 -0
- package/dist/lib/request/stream-failover.d.ts +21 -0
- package/dist/lib/request/stream-failover.d.ts.map +1 -0
- package/dist/lib/request/stream-failover.js +204 -0
- package/dist/lib/request/stream-failover.js.map +1 -0
- package/dist/lib/rotation.d.ts +146 -0
- package/dist/lib/rotation.d.ts.map +1 -0
- package/dist/lib/rotation.js +321 -0
- package/dist/lib/rotation.js.map +1 -0
- package/dist/lib/runtime-paths.d.ts +58 -0
- package/dist/lib/runtime-paths.d.ts.map +1 -0
- package/dist/lib/runtime-paths.js +164 -0
- package/dist/lib/runtime-paths.js.map +1 -0
- package/dist/lib/schemas.d.ts +435 -0
- package/dist/lib/schemas.d.ts.map +1 -0
- package/dist/lib/schemas.js +268 -0
- package/dist/lib/schemas.js.map +1 -0
- package/dist/lib/session-affinity.d.ts +23 -0
- package/dist/lib/session-affinity.d.ts.map +1 -0
- package/dist/lib/session-affinity.js +127 -0
- package/dist/lib/session-affinity.js.map +1 -0
- package/dist/lib/shutdown.d.ts +7 -0
- package/dist/lib/shutdown.d.ts.map +1 -0
- package/dist/lib/shutdown.js +43 -0
- package/dist/lib/shutdown.js.map +1 -0
- package/dist/lib/storage/migrations.d.ts +59 -0
- package/dist/lib/storage/migrations.d.ts.map +1 -0
- package/dist/lib/storage/migrations.js +41 -0
- package/dist/lib/storage/migrations.js.map +1 -0
- package/dist/lib/storage/paths.d.ts +51 -0
- package/dist/lib/storage/paths.d.ts.map +1 -0
- package/dist/lib/storage/paths.js +152 -0
- package/dist/lib/storage/paths.js.map +1 -0
- package/dist/lib/storage.d.ts +106 -0
- package/dist/lib/storage.d.ts.map +1 -0
- package/dist/lib/storage.js +896 -0
- package/dist/lib/storage.js.map +1 -0
- package/dist/lib/table-formatter.d.ts +32 -0
- package/dist/lib/table-formatter.d.ts.map +1 -0
- package/dist/lib/table-formatter.js +44 -0
- package/dist/lib/table-formatter.js.map +1 -0
- package/dist/lib/tools/hashline-tools.d.ts +51 -0
- package/dist/lib/tools/hashline-tools.d.ts.map +1 -0
- package/dist/lib/tools/hashline-tools.js +456 -0
- package/dist/lib/tools/hashline-tools.js.map +1 -0
- package/dist/lib/types.d.ts +130 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +2 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/lib/ui/ansi.d.ts +40 -0
- package/dist/lib/ui/ansi.d.ts.map +1 -0
- package/dist/lib/ui/ansi.js +68 -0
- package/dist/lib/ui/ansi.js.map +1 -0
- package/dist/lib/ui/auth-menu.d.ts +76 -0
- package/dist/lib/ui/auth-menu.d.ts.map +1 -0
- package/dist/lib/ui/auth-menu.js +590 -0
- package/dist/lib/ui/auth-menu.js.map +1 -0
- package/dist/lib/ui/confirm.d.ts +11 -0
- package/dist/lib/ui/confirm.d.ts.map +1 -0
- package/dist/lib/ui/confirm.js +29 -0
- package/dist/lib/ui/confirm.js.map +1 -0
- package/dist/lib/ui/copy.d.ts +123 -0
- package/dist/lib/ui/copy.d.ts.map +1 -0
- package/dist/lib/ui/copy.js +127 -0
- package/dist/lib/ui/copy.js.map +1 -0
- package/dist/lib/ui/format.d.ts +62 -0
- package/dist/lib/ui/format.d.ts.map +1 -0
- package/dist/lib/ui/format.js +205 -0
- package/dist/lib/ui/format.js.map +1 -0
- package/dist/lib/ui/runtime.d.ts +43 -0
- package/dist/lib/ui/runtime.d.ts.map +1 -0
- package/dist/lib/ui/runtime.js +69 -0
- package/dist/lib/ui/runtime.js.map +1 -0
- package/dist/lib/ui/select.d.ts +60 -0
- package/dist/lib/ui/select.d.ts.map +1 -0
- package/dist/lib/ui/select.js +467 -0
- package/dist/lib/ui/select.js.map +1 -0
- package/dist/lib/ui/theme.d.ts +56 -0
- package/dist/lib/ui/theme.d.ts.map +1 -0
- package/dist/lib/ui/theme.js +186 -0
- package/dist/lib/ui/theme.js.map +1 -0
- package/dist/lib/unified-settings.d.ts +71 -0
- package/dist/lib/unified-settings.d.ts.map +1 -0
- package/dist/lib/unified-settings.js +299 -0
- package/dist/lib/unified-settings.js.map +1 -0
- package/dist/lib/utils.d.ts +29 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +54 -0
- package/dist/lib/utils.js.map +1 -0
- package/package.json +115 -0
- package/scripts/audit-dev-allowlist.js +128 -0
- package/scripts/bench-format/hashline-v2.mjs +642 -0
- package/scripts/bench-format/models.mjs +105 -0
- package/scripts/bench-format/opencode.mjs +205 -0
- package/scripts/bench-format/render.mjs +496 -0
- package/scripts/bench-format/stats.mjs +54 -0
- package/scripts/bench-format/tasks.mjs +151 -0
- package/scripts/benchmark-edit-formats.mjs +1161 -0
- package/scripts/benchmark-render-dashboard.mjs +49 -0
- package/scripts/codex-multi-auth.js +6 -0
- package/scripts/codex-routing.js +34 -0
- package/scripts/codex.js +122 -0
- package/scripts/copy-oauth-success.js +37 -0
- package/scripts/install-opencode-codex-auth.js +193 -0
- package/scripts/test-all-models.sh +7 -0
- package/scripts/test-model-matrix.js +424 -0
- 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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"}
|