dsh-ssh-tui 0.7.0-rc.1 → 0.7.0-rc.2
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/README.en.md +1 -0
- package/README.md +6 -0
- package/docs/remote-ops.md +133 -0
- package/docs/screenshots/compare.png +0 -0
- package/docs/screenshots/headless.png +0 -0
- package/docs/screenshots/workspace.png +0 -0
- package/lib/attach.js +66 -7
- package/lib/attach.js.map +1 -1
- package/lib/color-depth.js +192 -0
- package/lib/color-depth.js.map +1 -0
- package/lib/copy-text.js +1 -0
- package/lib/copy-text.js.map +1 -1
- package/lib/dialogs.js +73 -1
- package/lib/dialogs.js.map +1 -1
- package/lib/display-sock.js +1 -1
- package/lib/display-sock.js.map +1 -1
- package/lib/footer.js +76 -6
- package/lib/footer.js.map +1 -1
- package/lib/i18n/en.js +23 -0
- package/lib/i18n/en.js.map +1 -1
- package/lib/i18n/zh.js +24 -1
- package/lib/i18n/zh.js.map +1 -1
- package/lib/index.js +4 -1
- package/lib/index.js.map +1 -1
- package/lib/keymap.js +172 -0
- package/lib/keymap.js.map +1 -0
- package/lib/line-diff.js +224 -0
- package/lib/line-diff.js.map +1 -0
- package/lib/line-mode.js +86 -0
- package/lib/line-mode.js.map +1 -0
- package/lib/paint.js +17 -2
- package/lib/paint.js.map +1 -1
- package/lib/plan.js +51 -8
- package/lib/plan.js.map +1 -1
- package/lib/preset-picker.js +105 -0
- package/lib/preset-picker.js.map +1 -0
- package/lib/selection.js +154 -0
- package/lib/selection.js.map +1 -0
- package/lib/term-text.js +106 -1
- package/lib/term-text.js.map +1 -1
- package/lib/tool-present.js +157 -21
- package/lib/tool-present.js.map +1 -1
- package/lib/tui.js +732 -81
- package/lib/tui.js.map +1 -1
- package/lib/types/attach.d.ts +29 -0
- package/lib/types/color-depth.d.ts +50 -0
- package/lib/types/dialogs.d.ts +30 -0
- package/lib/types/footer.d.ts +35 -0
- package/lib/types/keymap.d.ts +68 -0
- package/lib/types/line-diff.d.ts +107 -0
- package/lib/types/line-mode.d.ts +36 -0
- package/lib/types/paint.d.ts +9 -1
- package/lib/types/plan.d.ts +7 -0
- package/lib/types/preset-picker.d.ts +64 -0
- package/lib/types/selection.d.ts +81 -0
- package/lib/types/term-text.d.ts +29 -0
- package/lib/types/tool-present.d.ts +53 -3
- package/lib/types/transcript-types.d.ts +12 -2
- package/lib/types/tui.d.ts +138 -2
- package/package.json +2 -1
package/README.en.md
CHANGED
|
@@ -135,6 +135,7 @@ milliseconds; `0`/`off` restores the old behavior) and then exits, handing the
|
|
|
135
135
|
lock back — long enough for the old window to reattach, after which `--resume`
|
|
136
136
|
reopens the flushed log. A Host that never finishes its turn still falls back to
|
|
137
137
|
`DSH_TUI_DETACHED_IDLE_MS` (6h). Optional: wrap the TUI in tmux.
|
|
138
|
+
Copy-paste recipes for keeping a session reachable (tmux, screen, systemd --user, long turns) are in [`docs/remote-ops.md`](docs/remote-ops.md) (Chinese for now), together with what the `reconnected N times · away X` and `away …` transcript lines mean.
|
|
138
139
|
|
|
139
140
|
New sessions inherit the directory you launched from. Resuming a session
|
|
140
141
|
`chdir`s into that session's recorded working directory. The footer shows
|
package/README.md
CHANGED
|
@@ -160,8 +160,14 @@ Host 在后台跑完这一轮;审批和提问等接上后再弹。空闲断线
|
|
|
160
160
|
留下的 Host 持有该会话的内核写锁(`session.lock`),而 Web 端打开同一会话时正是被这把锁挡下的
|
|
161
161
|
(`resume failed for session … is already owned by an active write handle`)。所以它**跑完留下来的那一轮后最多再等 1 分钟**
|
|
162
162
|
(`DSH_TUI_IDLE_EXIT_MS`,或 settings.yaml 的 `ssh-tui.idleExit`,毫秒;设 `0`/`off` 恢复旧行为)
|
|
163
|
+
|
|
164
|
+
按键可改:`ssh-tui.keys`(动作 `pageUp` / `pageDown` / `toggleCard` / `copy` / `cancel`,如 `keys: { pageUp: ctrl+b }`)。
|
|
165
|
+
冲突或未知的名字**不会静默生效**:启动时提示,且该键保持默认或变成无操作。
|
|
166
|
+
纯行模式:`DSH_TUI_LINE_MODE=1`(或 `ssh-tui.lineMode: true`)——不画帧,逐事件追加纯文本行,
|
|
167
|
+
适合屏幕阅读器、`tee` 与录屏;代价是全屏交互(鼠标拖选、卡片展开、`/find` 高亮)不可用。
|
|
163
168
|
就自行退出并让出锁:这段时间够原窗口重连接入,之后 `--resume` 重新打开已落盘的日志。
|
|
164
169
|
完全没有显示器且一直空闲的兜底仍由 `DSH_TUI_DETACHED_IDLE_MS`(默认 6 小时)负责。可选:用 tmux 包一层。
|
|
170
|
+
常驻与接管的可复制配方(tmux / screen / systemd --user / 长任务)见 [`docs/remote-ops.md`](docs/remote-ops.md);重连后转录里的「已重连 N 次 · 断开 Xs」与「离开 …」两行的语义也在那里。
|
|
165
171
|
|
|
166
172
|
启动时若 npm 上有更新,会弹出选单(类似 Codex / Claude Code 首启):**现在更新 / 稍后 / 跳过此版本**。选「现在更新」会运行 `dsh plugin --profile tui add dsh-ssh-tui@latest`,完成后提示退出再启动。`DSH_TUI_NO_UPDATE_CHECK=1` 可关掉。`/status` 里也能看到当前插件版本、链路芯片、额度窗口,以及子代理模型是否与父路由同族。
|
|
167
173
|
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# 远程运维手册:断线、接管与常驻
|
|
2
|
+
|
|
3
|
+
这份文档回答一个问题:**在一条会断的 SSH 链路上,怎么让会话按你的预期活下来、又怎么把它接回来。**
|
|
4
|
+
它只描述当前实现的行为与可复制的配方;机制本身写在 README 的排障一节。
|
|
5
|
+
|
|
6
|
+
> 语言:本手册目前只有中文。README 的中英两版都指向这里,若要英文版请提 issue。
|
|
7
|
+
|
|
8
|
+
## 1. 断线时会发生什么
|
|
9
|
+
|
|
10
|
+
| 掉线时的状态 | 行为 |
|
|
11
|
+
|---|---|
|
|
12
|
+
| **空闲**(没有轮次在跑) | launcher 交还终端并退出,会话日志已落盘。回来 `--resume` 从日志恢复,**没有 Host 在等你** |
|
|
13
|
+
| **忙碌**(思考 / 回复 / 工具 / 子代理在跑),默认策略 `pause` | 取消当前轮次、flush 日志,**Host 留下**并持有会话写锁,等你回来接入 |
|
|
14
|
+
| **忙碌**,`/disconnect continue` | 不取消,Host 在后台把这一轮跑完;你回来时结果已经在转录里(可能还带着子代理的进度) |
|
|
15
|
+
| 你开了第二个窗口去接同一个会话 | 新窗口接管显示,旧窗口退出(`replaced`)。**不要为同一个会话起第二份 Host** |
|
|
16
|
+
|
|
17
|
+
会话写锁是内核锁:同一时刻只有一个写者。这是为什么"再开一个窗口"和"再起一份 Host"是两件不同的事——前者是接管,后者会失败(`already owned by an active write handle`)。
|
|
18
|
+
|
|
19
|
+
## 2. 三个时间旋钮
|
|
20
|
+
|
|
21
|
+
| 旋钮 | 默认 | 作用 |
|
|
22
|
+
|---|---|---|
|
|
23
|
+
| `DSH_TUI_IDLE_EXIT_MS`(或 settings.yaml 的 `ssh-tui.idleExit`) | `60000`(60s) | 忙碌掉线留下的 Host,在**轮次结束后**再等多久无人接入就自行退出并让出锁。`0`/`off` 恢复旧的"长时间保留"行为 |
|
|
24
|
+
| `DSH_TUI_DETACHED_IDLE_MS` | `21600000`(6h) | 完全没有显示器、且一直空闲的兜底上限;轮次在跑时会自动续期 |
|
|
25
|
+
| `/disconnect pause\|continue` | `pause` | 掉线时是否取消当前轮次(见上表) |
|
|
26
|
+
|
|
27
|
+
**推荐**:留在默认。60s 足够你重连;把它调大只在一种场景下有意义——你确定自己会离开很久、且希望**轮次继续跑完**,那就配 `/disconnect continue`,而不是无限期留住锁。
|
|
28
|
+
|
|
29
|
+
`DSH_TUI_NO_SESSION_LOCK=1` 会关掉锁,仅用于调试:两个 Host 同时写一个会话日志会互相覆盖。
|
|
30
|
+
|
|
31
|
+
## 3. 回来后你会看到什么
|
|
32
|
+
|
|
33
|
+
重连成功时,转录里会多出两行(都是 Host 侧写的,launcher 写不了——屏幕由 TUI 拥有并会立刻重绘):
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
已重连 1 次 · 断开 1m
|
|
37
|
+
离开 1m:自动审批 1 次放行 / 1 次拒绝 · 其中 1 次因无人确认被拒 · 1 条提问待回答
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
- **计数按 Host 计**:新起的 Host 从 1 开始,它确实不知道更早的 Host。
|
|
41
|
+
- **摘要是增量**:只统计这次离开期间发生的事,不重复会话的总量。
|
|
42
|
+
- 只有真发生过的部分才会出现;链路只是抖一下,就只有第一行。
|
|
43
|
+
- 断线期间到达的**未识别审批会被拒绝**并把理由写进转录(模型据此调整)。这是有意的:挂起的轮次会撞上 idle-exit 兜底,最后既没跑完也没人确认。
|
|
44
|
+
|
|
45
|
+
## 4. 配方
|
|
46
|
+
|
|
47
|
+
### 4.1 tmux(最省事)
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
tmux new -As dsh # 有就接入,没有就新建
|
|
51
|
+
# 会话里:
|
|
52
|
+
dsh --profile tui --resume # 选择器;活着的 Host 优先接入
|
|
53
|
+
# 断开终端:Ctrl-b d 下次 SSH 回来:tmux new -As dsh
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
tmux 保证的是**终端会话**不断;dsh 保证的是**会话日志与(忙碌时的)Host**不断。两者叠加,链路抖动就不再等于丢进度。
|
|
57
|
+
|
|
58
|
+
### 4.2 screen
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
screen -S dsh
|
|
62
|
+
dsh --profile tui --resume
|
|
63
|
+
# Ctrl-a d 断开;回来 screen -r dsh
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 4.3 systemd --user:登录即有 tmux
|
|
67
|
+
|
|
68
|
+
`~/.config/systemd/user/dsh-tui.service`:
|
|
69
|
+
|
|
70
|
+
```ini
|
|
71
|
+
[Unit]
|
|
72
|
+
Description=Persistent tmux session for the dsh TUI
|
|
73
|
+
After=default.target
|
|
74
|
+
|
|
75
|
+
[Service]
|
|
76
|
+
Type=forking
|
|
77
|
+
Environment=DSH_HOME=%h/.dsh
|
|
78
|
+
ExecStart=/usr/bin/tmux new-session -d -s dsh 'dsh --profile tui --resume'
|
|
79
|
+
ExecStop=/usr/bin/tmux kill-session -t dsh
|
|
80
|
+
Restart=no
|
|
81
|
+
|
|
82
|
+
[Install]
|
|
83
|
+
WantedBy=default.target
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
systemctl --user daemon-reload
|
|
88
|
+
systemctl --user enable --now dsh-tui.service
|
|
89
|
+
loginctl enable-linger "$USER" # 未登录时也保留(按需)
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
注意:unit 只是把 tmux 会话带起来,**dsh 的断线语义不变**——空闲掉线仍然会退出 Host,`--resume` 从日志恢复。不要把 `Restart=always` 配上:那会在你退出 `/exit` 后不断重开一个会话。
|
|
93
|
+
|
|
94
|
+
### 4.4 长任务跨休眠 / 跨通勤
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
/disconnect continue # 掉线不取消当前轮次
|
|
98
|
+
DSH_TUI_IDLE_EXIT_MS=600000 dsh --profile tui --resume
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
轮次在跑时 `DSH_TUI_DETACHED_IDLE_MS` 会自动续期,空闲后按 `DSH_TUI_IDLE_EXIT_MS` 退出并让锁——把上限设大是为了"回来还能接上",不是为了让 Host 常驻。
|
|
102
|
+
|
|
103
|
+
### 4.5 一次性任务:官方 headless
|
|
104
|
+
|
|
105
|
+
不需要交互、只要最后一条回复时,用官方 `dsh --profile headless "…"`:跑完把最终文本打到 stdout 就退出。思考、工具调用、子代理都在会话日志里,终端上看不到——这正是本 TUI 存在的理由(同一条任务的对照图见 README)。
|
|
106
|
+
|
|
107
|
+
### 4.6 纯行模式(屏幕阅读器与日志录制)
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
DSH_TUI_LINE_MODE=1 dsh --profile tui --resume # 每个事件追加若干纯文本行
|
|
111
|
+
DSH_TUI_LINE_MODE=1 ssh host 'dsh --profile tui --resume' | tee session.log
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
行模式**不画帧**:不进备用屏、不做绝对光标寻址、不用回车原地重绘、不出动画。每个事件按顺序追加一次,
|
|
115
|
+
多行内容(报告、diff、工具输出)按其自身结构展开,因此 `tee`、`script(1)`、屏幕阅读器都能完整读到。
|
|
116
|
+
状态符号(● ⚠ ✖、diff 的 `+`/`-`)仍然保留,语义不依赖颜色。全屏交互(鼠标拖选、卡片展开、
|
|
117
|
+
`/find` 高亮)在行模式下不可用——那是画帧的代价,需要时用普通模式。
|
|
118
|
+
|
|
119
|
+
## 5. 明确不做(以及为什么)
|
|
120
|
+
|
|
121
|
+
- **内置 `--daemon` 常驻模式**:Host 不是服务。它是"某个会话的写者",靠 idle-exit 把写锁交还;把它变成常驻服务会让 Web UI 与其它窗口长期打不开同一会话。
|
|
122
|
+
- **`detachedApproval = pause`(断线时挂起审批等用户回来)**:看似更"尊重用户",实际会与第 2 节的兜底打架——轮次停在一个没人能确认的审批上,直到 idle-exit 把它带走,结果既没执行也没拒绝。当前行为(拒绝 + 写清理由)让轮次能收尾,模型会在你回来前调整做法。
|
|
123
|
+
- **多窗口同屏 / 只读旁观**:锁语义与收益都未验证,不做。
|
|
124
|
+
|
|
125
|
+
## 6. 排障入口
|
|
126
|
+
|
|
127
|
+
- `/diag`:这条会话的通道、锁、Host 身份、判定链("会接入后台 Host,不要另开第二个窗口")。
|
|
128
|
+
- `/doctor`:profile 组合、依赖、兼容与 `dsh-scope` 副本数;`/doctor --fix` 修 profile 补丁(写前备份)。
|
|
129
|
+
- 真机验收脚本:`node scripts/tui-probe.mjs`(启动/缩放//diag//doctor//copy error//preset/鼠标模式/退出)、
|
|
130
|
+
`node scripts/tui-drop-probe.mjs`(杀掉窗口再接管,断言转录保留、可输入、无乱码)与
|
|
131
|
+
`node scripts/tui-mock-probe.mjs`(**合成临时 profile + 脚本化模型**,跑一个真实轮次后验证"拖选复制"
|
|
132
|
+
与 `/find` 高亮;不碰你的 profile、不花额度)、同一脚本的 `--busy`(**忙碌断线**:轮次在飞时杀掉窗口,
|
|
133
|
+
断言 Host 仍持有会话、重连窗口打出「已重连 N 次」);`node scripts/verify-batch.mjs --batch <批>` 一次跑完全部证据。
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/lib/attach.js
CHANGED
|
@@ -22,6 +22,30 @@ export const RECOVERY_BURST_LIMIT = 3;
|
|
|
22
22
|
export const HOST_START_TIMEOUT_MS = 15_000;
|
|
23
23
|
/** Pause between "is the old Host gone yet" checks while recovering. */
|
|
24
24
|
const RECOVERY_POLL_MS = 150;
|
|
25
|
+
/**
|
|
26
|
+
* Waits between the automatic re-attach attempts of one run.
|
|
27
|
+
*
|
|
28
|
+
* A single retry was not enough for a link that flaps for half a minute: the
|
|
29
|
+
* burst breaker cut the run at three tries inside ten seconds and told the user
|
|
30
|
+
* to come back later, when one more try would have caught the link. One run now
|
|
31
|
+
* backs off — 250ms, 500ms, 1s, 2s, 4s — and only then gives up; the breaker
|
|
32
|
+
* still stops *runs* from fighting each other, which is what it was for.
|
|
33
|
+
*/
|
|
34
|
+
export const RECOVERY_BACKOFF_MS = [250, 500, 1_000, 2_000, 4_000];
|
|
35
|
+
/**
|
|
36
|
+
* How long to wait before attempt `attempt` (0-based), with jitter.
|
|
37
|
+
*
|
|
38
|
+
* Two windows that drop together must not retry in lockstep, so each wait is
|
|
39
|
+
* taken from the upper half of its base: 0.5–1× the nominal delay.
|
|
40
|
+
* @param attempt - 0 for the first retry after the initial failure.
|
|
41
|
+
* @param random - injectable for tests.
|
|
42
|
+
* @returns milliseconds to wait.
|
|
43
|
+
*/
|
|
44
|
+
export function recoveryDelay(attempt, random = Math.random) {
|
|
45
|
+
const last = RECOVERY_BACKOFF_MS[RECOVERY_BACKOFF_MS.length - 1] ?? 4_000;
|
|
46
|
+
const base = RECOVERY_BACKOFF_MS[Math.max(0, Math.min(attempt, RECOVERY_BACKOFF_MS.length - 1))] ?? last;
|
|
47
|
+
return Math.round(base * (0.5 + random() * 0.5));
|
|
48
|
+
}
|
|
25
49
|
/** True when a relay error means the peer vanished rather than a real fault. */
|
|
26
50
|
export function attachPeerVanished(error, elapsedMs) {
|
|
27
51
|
if (elapsedMs >= ATTACH_RECOVERY_WINDOW_MS)
|
|
@@ -71,12 +95,9 @@ export function createAttacher(deps) {
|
|
|
71
95
|
await attachExisting(sessionId, spawned.sock, recover, { announce: true, seed });
|
|
72
96
|
};
|
|
73
97
|
/** Wait out a Host that was mid-dispose, then take the normal path again. */
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
if (deps.debug === true)
|
|
78
|
-
deps.report(deps.messages.recovering(sessionId));
|
|
79
|
-
// Between attempts the TTY is back in cooked mode: without this, a cursor
|
|
98
|
+
/** Let a Host that was mid-dispose finish before starting a fresh one. */
|
|
99
|
+
const waitOutLiveHost = async (sessionId) => {
|
|
100
|
+
// The TTY is back in cooked mode between attempts: without this, a cursor
|
|
80
101
|
// reply still owed to the relay that just ended is echoed as `^[[17;1R`
|
|
81
102
|
// for the whole (up to 3s) wait.
|
|
82
103
|
deps.quiet();
|
|
@@ -87,7 +108,45 @@ export function createAttacher(deps) {
|
|
|
87
108
|
break;
|
|
88
109
|
await new Promise(resolve => setTimeout(resolve, RECOVERY_POLL_MS));
|
|
89
110
|
}
|
|
90
|
-
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* Attach again, with the bounded backoff in {@link RECOVERY_BACKOFF_MS}.
|
|
114
|
+
*
|
|
115
|
+
* One run gets the whole schedule; the burst breaker counts *runs*, not
|
|
116
|
+
* attempts, so its guard against two windows fighting stays exactly as it
|
|
117
|
+
* was while a single flapping link is no longer cut short. A real fault (not
|
|
118
|
+
* a vanished peer) still ends the run on the spot: retrying it would only
|
|
119
|
+
* repeat the same failure.
|
|
120
|
+
*/
|
|
121
|
+
const recoverAttach = async (sessionId) => {
|
|
122
|
+
if (!recoveryAllowed())
|
|
123
|
+
throw new Error(deps.messages.flapping(sessionId));
|
|
124
|
+
const schedule = deps.backoff ?? RECOVERY_BACKOFF_MS;
|
|
125
|
+
const startedAt = now();
|
|
126
|
+
for (let attempt = 0; attempt < Math.max(1, schedule.length); attempt += 1) {
|
|
127
|
+
if (attempt > 0) {
|
|
128
|
+
const wait = recoveryDelay(attempt - 1, deps.random);
|
|
129
|
+
if (deps.debug === true)
|
|
130
|
+
deps.report(`${deps.messages.recovering(sessionId)} [${attempt + 1}/${schedule.length} +${wait}ms]`);
|
|
131
|
+
await new Promise(resolve => setTimeout(resolve, wait));
|
|
132
|
+
}
|
|
133
|
+
else if (deps.debug === true) {
|
|
134
|
+
deps.report(deps.messages.recovering(sessionId));
|
|
135
|
+
}
|
|
136
|
+
await waitOutLiveHost(sessionId);
|
|
137
|
+
const attemptStartedAt = now();
|
|
138
|
+
try {
|
|
139
|
+
await spawnHostAndRelay(sessionId, false);
|
|
140
|
+
if (attempt > 0)
|
|
141
|
+
deps.onReconnected?.({ attempts: attempt, elapsedMs: now() - startedAt });
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
if (!attachPeerVanished(error, now() - attemptStartedAt))
|
|
146
|
+
throw error;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
throw new Error(deps.messages.flapping(sessionId));
|
|
91
150
|
};
|
|
92
151
|
const attachExisting = async (sessionId, sock, recover = true, options = {}) => {
|
|
93
152
|
const announce = options.announce === true;
|
package/lib/attach.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attach.js","sourceRoot":"","sources":["../src/attach.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,oFAAoF;AACpF,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,CAAA;AAC9C,6EAA6E;AAC7E,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,CAAA;AAC5C,8EAA8E;AAC9E,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAA;AAC9C,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAA;AACrC,4EAA4E;AAC5E,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAA;AAC3C,wEAAwE;AACxE,MAAM,gBAAgB,GAAG,GAAG,CAAA;AAE5B,gFAAgF;AAChF,MAAM,UAAU,kBAAkB,CAAC,KAAc,EAAE,SAAiB;IAClE,IAAI,SAAS,IAAI,yBAAyB;QAAE,OAAO,KAAK,CAAA;IACxD,MAAM,IAAI,GAAI,KAA2C,EAAE,IAAI,CAAA;IAC/D,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IACpC,OAAO,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,sBAAsB,CAAA;AAChH,CAAC;
|
|
1
|
+
{"version":3,"file":"attach.js","sourceRoot":"","sources":["../src/attach.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How much colour the terminal can take, and what to do when it cannot take
|
|
3
|
+
* what a caller asked for.
|
|
4
|
+
*
|
|
5
|
+
* A truecolor pair (`38;2;…`) on an 8-colour terminal is not a cosmetic loss: a
|
|
6
|
+
* terminal that does not understand it either ignores the sequence or renders
|
|
7
|
+
* the row in the wrong colour, and the diff rows are the ones that suffer. The
|
|
8
|
+
* palette is downgraded here instead, by hue family rather than by nearest RGB
|
|
9
|
+
* distance — the diff colours are deliberately muted, and nearest-RGB maps them
|
|
10
|
+
* to grey, which throws away the only signal they carry. Status is never colour
|
|
11
|
+
* alone in this TUI (a `+`/`-`/`●`/`⚠`/`✖` is always present), so a downgraded
|
|
12
|
+
* palette stays readable.
|
|
13
|
+
* @module dsh-ssh-tui/color-depth
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Decide the palette from the environment.
|
|
17
|
+
*
|
|
18
|
+
* `DSH_TUI_COLOR_DEPTH` wins outright so a user can correct a wrong guess.
|
|
19
|
+
* Otherwise: no colour at all when `NO_COLOR` is set or `TERM` names a
|
|
20
|
+
* monochrome terminal; truecolor when `COLORTERM` says so; 256 for a
|
|
21
|
+
* `*256color` terminal and for tmux/screen (their default palette is 256 and
|
|
22
|
+
* they translate truecolor poorly); 8 for everything else.
|
|
23
|
+
* @param env - the environment to read (tests pass their own).
|
|
24
|
+
* @returns the palette to paint with.
|
|
25
|
+
*/
|
|
26
|
+
export function colorDepth(env = process.env) {
|
|
27
|
+
const forced = (env.DSH_TUI_COLOR_DEPTH ?? '').trim().toLowerCase();
|
|
28
|
+
if (forced === 'truecolor' || forced === '24bit' || forced === '16m')
|
|
29
|
+
return 'truecolor';
|
|
30
|
+
if (forced === '256' || forced === '256color')
|
|
31
|
+
return '256';
|
|
32
|
+
if (forced === '8' || forced === '8color' || forced === 'basic')
|
|
33
|
+
return '8';
|
|
34
|
+
if (forced === 'none' || forced === 'off' || forced === '0' || forced === 'no')
|
|
35
|
+
return 'none';
|
|
36
|
+
const noColor = (env.NO_COLOR ?? '').trim();
|
|
37
|
+
if (noColor !== '')
|
|
38
|
+
return 'none';
|
|
39
|
+
const term = (env.TERM ?? '').trim().toLowerCase();
|
|
40
|
+
if (term === '' || term === 'dumb' || term === 'linux' || term === 'vt100' || term === 'vt220')
|
|
41
|
+
return 'none';
|
|
42
|
+
const colorTerm = (env.COLORTERM ?? '').trim().toLowerCase();
|
|
43
|
+
if (colorTerm === 'truecolor' || colorTerm === '24bit')
|
|
44
|
+
return 'truecolor';
|
|
45
|
+
if (term.includes('256color'))
|
|
46
|
+
return '256';
|
|
47
|
+
if (term.startsWith('screen') || term.startsWith('tmux'))
|
|
48
|
+
return '256';
|
|
49
|
+
return '8';
|
|
50
|
+
}
|
|
51
|
+
/** The 16 standard colours, as the RGB a terminal roughly paints them with. */
|
|
52
|
+
const BASIC_RGB = [
|
|
53
|
+
[0, 0, 0], [205, 0, 0], [0, 205, 0], [205, 205, 0],
|
|
54
|
+
[0, 0, 238], [205, 0, 205], [0, 205, 205], [229, 229, 229],
|
|
55
|
+
[127, 127, 127], [255, 0, 0], [0, 255, 0], [255, 255, 0],
|
|
56
|
+
[92, 92, 255], [255, 0, 255], [0, 255, 255], [255, 255, 255],
|
|
57
|
+
];
|
|
58
|
+
/** SGR foreground for each of the 16 standard colours. */
|
|
59
|
+
const BASIC_SGR = [30, 31, 32, 33, 34, 35, 36, 37, 90, 91, 92, 93, 94, 95, 96, 97];
|
|
60
|
+
/** The xterm 256-colour cube index back to RGB. */
|
|
61
|
+
export function rgbFrom256(index) {
|
|
62
|
+
if (index < 16) {
|
|
63
|
+
const basic = BASIC_RGB[index] ?? BASIC_RGB[7] ?? [229, 229, 229];
|
|
64
|
+
return [basic[0], basic[1], basic[2]];
|
|
65
|
+
}
|
|
66
|
+
if (index < 232) {
|
|
67
|
+
const at = index - 16;
|
|
68
|
+
const steps = [0, 95, 135, 175, 215, 255];
|
|
69
|
+
return [steps[Math.floor(at / 36) % 6] ?? 0, steps[Math.floor(at / 6) % 6] ?? 0, steps[at % 6] ?? 0];
|
|
70
|
+
}
|
|
71
|
+
const grey = 8 + (index - 232) * 10;
|
|
72
|
+
return [grey, grey, grey];
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* The nearest standard colour, by hue family.
|
|
76
|
+
*
|
|
77
|
+
* Brightness picks the bright half of the palette; a colour whose channels are
|
|
78
|
+
* nearly equal becomes a grey. Everything else keeps its hue, so a muted green
|
|
79
|
+
* stays green instead of collapsing to grey the way nearest-RGB would leave it.
|
|
80
|
+
*/
|
|
81
|
+
export function basicSgrFor(r, g, b) {
|
|
82
|
+
const max = Math.max(r, g, b);
|
|
83
|
+
const min = Math.min(r, g, b);
|
|
84
|
+
// 204/255: the muted diff colours sit just under it and belong on the normal
|
|
85
|
+
// half of the palette, while a vivid primary (255) belongs on the bright half.
|
|
86
|
+
const bright = max > 204;
|
|
87
|
+
if (max - min < 24)
|
|
88
|
+
return bright ? 97 : 90;
|
|
89
|
+
// Hue family from the channels that share the maximum: yellow, cyan and
|
|
90
|
+
// magenta are the two-dominant-channel families.
|
|
91
|
+
if (r === max && g === max)
|
|
92
|
+
return bright ? 93 : 33;
|
|
93
|
+
if (g === max && b === max)
|
|
94
|
+
return bright ? 96 : 36;
|
|
95
|
+
if (r === max && b === max)
|
|
96
|
+
return bright ? 95 : 35;
|
|
97
|
+
if (r === max)
|
|
98
|
+
return bright ? 91 : 31;
|
|
99
|
+
if (g === max)
|
|
100
|
+
return bright ? 92 : 32;
|
|
101
|
+
if (b === max)
|
|
102
|
+
return bright ? 94 : 34;
|
|
103
|
+
return bright ? 97 : 90;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Rewrite one SGR parameter list for the palette in use.
|
|
107
|
+
*
|
|
108
|
+
* Attributes (bold, dim, italic, underline, reverse) always survive: they are
|
|
109
|
+
* what carries meaning when colour cannot. Colour parameters are dropped at
|
|
110
|
+
* `none`, mapped to the standard 16 at `8`, and mapped into the 256-cube at
|
|
111
|
+
* `256`.
|
|
112
|
+
* @param code - the parameter list, e.g. `1;38;2;77;107;253`.
|
|
113
|
+
* @param depth - the palette to rewrite for.
|
|
114
|
+
* @returns the parameter list to emit, possibly empty.
|
|
115
|
+
*/
|
|
116
|
+
export function downgradeSgr(code, depth) {
|
|
117
|
+
if (depth === 'truecolor')
|
|
118
|
+
return code;
|
|
119
|
+
const parts = code.split(';');
|
|
120
|
+
const out = [];
|
|
121
|
+
for (let index = 0; index < parts.length; index += 1) {
|
|
122
|
+
const part = parts[index] ?? '';
|
|
123
|
+
if (part === '38' || part === '48') {
|
|
124
|
+
const background = part === '48';
|
|
125
|
+
const mode = parts[index + 1];
|
|
126
|
+
if (mode === '2') {
|
|
127
|
+
const rgb = [
|
|
128
|
+
Number(parts[index + 2]), Number(parts[index + 3]), Number(parts[index + 4]),
|
|
129
|
+
];
|
|
130
|
+
index += 4;
|
|
131
|
+
if (depth === 'none' || rgb.some(channel => !Number.isFinite(channel)))
|
|
132
|
+
continue;
|
|
133
|
+
out.push(...paintColour(basicSgrFor(rgb[0], rgb[1], rgb[2]), background, depth));
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
if (mode === '5') {
|
|
137
|
+
const at = Number(parts[index + 2]);
|
|
138
|
+
index += 2;
|
|
139
|
+
if (depth === 'none' || !Number.isFinite(at))
|
|
140
|
+
continue;
|
|
141
|
+
if (depth === '256') {
|
|
142
|
+
out.push(String(background ? 48 : 38), '5', String(at));
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
const [r, g, b] = rgbFrom256(at);
|
|
146
|
+
out.push(...paintColour(basicSgrFor(r, g, b), background, depth));
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
// A malformed introducer takes its payload with it rather than leaving a
|
|
150
|
+
// stray parameter behind.
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
if (depth === 'none' && BASIC_COLOUR.has(part))
|
|
154
|
+
continue;
|
|
155
|
+
out.push(part);
|
|
156
|
+
}
|
|
157
|
+
return out.filter(part => part !== '').join(';');
|
|
158
|
+
}
|
|
159
|
+
/** Whether one parameter is a bare colour (and so goes at `none`). */
|
|
160
|
+
const BASIC_COLOUR = new Set([
|
|
161
|
+
...Array.from({ length: 8 }, (_unused, at) => String(30 + at)),
|
|
162
|
+
...Array.from({ length: 8 }, (_unused, at) => String(40 + at)),
|
|
163
|
+
...Array.from({ length: 8 }, (_unused, at) => String(90 + at)),
|
|
164
|
+
...Array.from({ length: 8 }, (_unused, at) => String(100 + at)),
|
|
165
|
+
]);
|
|
166
|
+
/** Foreground/background parameters for one standard colour at the given depth. */
|
|
167
|
+
function paintColour(sgr, background, depth) {
|
|
168
|
+
if (depth === '256') {
|
|
169
|
+
// The 256-cube index of a basic colour: the first 16 answer directly.
|
|
170
|
+
return [String(background ? 48 : 38), '5', String(sgrTo256(sgr))];
|
|
171
|
+
}
|
|
172
|
+
const basic = sgrToBasicIndex(sgr);
|
|
173
|
+
if (background) {
|
|
174
|
+
// 8-colour terminals have no bright backgrounds worth trusting; a dim
|
|
175
|
+
// background would fight the text. Drop it and let the attribute carry on.
|
|
176
|
+
return ['40'];
|
|
177
|
+
}
|
|
178
|
+
return [String(basic >= 8 ? 90 + (basic - 8) : 30 + basic)];
|
|
179
|
+
}
|
|
180
|
+
/** Standard SGR (30-37 / 90-97) to the 0-15 index. */
|
|
181
|
+
function sgrToBasicIndex(sgr) {
|
|
182
|
+
if (sgr >= 90 && sgr <= 97)
|
|
183
|
+
return sgr - 90 + 8;
|
|
184
|
+
if (sgr >= 30 && sgr <= 37)
|
|
185
|
+
return sgr - 30;
|
|
186
|
+
return 7;
|
|
187
|
+
}
|
|
188
|
+
/** The 0-15 index back to a 256-cube index (the cube starts with them). */
|
|
189
|
+
function sgrTo256(sgr) {
|
|
190
|
+
return sgrToBasicIndex(sgr);
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=color-depth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color-depth.js","sourceRoot":"","sources":["../src/color-depth.ts"],"names":[],"mappings":"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"}
|
package/lib/copy-text.js
CHANGED
package/lib/copy-text.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copy-text.js","sourceRoot":"","sources":["../src/copy-text.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,SAAS,QAAQ,CAAC,IAAY,EAAE,QAAQ,GAAG,MAAM;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IACzC,IAAI,OAAO,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,OAAO,CAAA;IAC9C,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAA;AAC3C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAuC;IACrE,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,EAAE,CAAA;IAChC,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,WAAW,CAAC;QACjB,KAAK,MAAM,CAAC;QACZ,KAAK,WAAW,CAAC;QACjB,KAAK,QAAQ,CAAC;QACd,KAAK,OAAO,CAAC;QACb,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC3B,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,KAAK,GAAG;gBACZ,GAAG,CAAC,OAAO,IAAI,EAAE;gBACjB,GAAG,CAAC,OAAO;gBACX,GAAG,CAAC,MAAM;aACX,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;YACpC,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACnC,CAAC;QACD,KAAK,MAAM;YACT,OAAO,QAAQ,CAAC;gBACd,GAAG,CAAC,YAAY,IAAI,EAAE;gBACtB,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;aAC/D,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAClD,KAAK,UAAU;YACb,OAAO,QAAQ,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAC5H,KAAK,MAAM;YACT,OAAO,QAAQ,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACzG,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC3B,KAAK,UAAU;YACb,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAClG,KAAK,YAAY;YACf,OAAO,QAAQ,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAC/G,KAAK,qBAAqB;YACxB,OAAO,EAAE,CAAA;QACX;YACE,OAAO,EAAE,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,IAAoB,EACpB,OAAsC;IAEtC,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,IAAI,SAAS,CAAC,CAAA;IACzD,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IAC9E,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QACnB,IAAI,GAAG,EAAE,IAAI,KAAK,WAAW,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACxD,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAA;QAC1D,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;AACtC,CAAC"}
|
|
1
|
+
{"version":3,"file":"copy-text.js","sourceRoot":"","sources":["../src/copy-text.ts"],"names":[],"mappings":"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"}
|
package/lib/dialogs.js
CHANGED
|
@@ -14,12 +14,82 @@ export function questionOptionIndex(key, optionCount) {
|
|
|
14
14
|
return undefined;
|
|
15
15
|
return index;
|
|
16
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* The option indexes the current filter leaves visible, in list order.
|
|
19
|
+
*
|
|
20
|
+
* An empty or absent filter keeps everything. The match is the same shape the
|
|
21
|
+
* pickers use: the label or the description, case-insensitively.
|
|
22
|
+
*/
|
|
23
|
+
export function visibleQuestionIndexes(dialog) {
|
|
24
|
+
const options = dialog.question.options ?? [];
|
|
25
|
+
const needle = (dialog.filter ?? '').trim().toLowerCase();
|
|
26
|
+
const all = options.map((_option, index) => index);
|
|
27
|
+
if (needle === '')
|
|
28
|
+
return all;
|
|
29
|
+
return all.filter(index => {
|
|
30
|
+
const option = options[index];
|
|
31
|
+
if (option === undefined)
|
|
32
|
+
return false;
|
|
33
|
+
return [option.label, option.description ?? '', dialog.matchKeys?.[index] ?? '']
|
|
34
|
+
.some(field => field.toLowerCase().includes(needle));
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/** Append a typed character to the filter (filter mode only). */
|
|
38
|
+
export function typeQuestionFilter(dialog, text) {
|
|
39
|
+
if (dialog.filtering !== true)
|
|
40
|
+
return false;
|
|
41
|
+
dialog.filter = `${dialog.filter ?? ''}${text}`;
|
|
42
|
+
clampCursorToVisible(dialog);
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
/** Remove the last character of the filter; the caller exits when it is empty. */
|
|
46
|
+
export function backspaceQuestionFilter(dialog) {
|
|
47
|
+
if (dialog.filtering !== true)
|
|
48
|
+
return false;
|
|
49
|
+
dialog.filter = (dialog.filter ?? '').slice(0, -1);
|
|
50
|
+
clampCursorToVisible(dialog);
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
/** Leave filter mode, keeping whatever was typed (Enter applies it). */
|
|
54
|
+
export function applyQuestionFilter(dialog) {
|
|
55
|
+
dialog.filtering = false;
|
|
56
|
+
}
|
|
57
|
+
/** Leave filter mode and show the whole list again (Esc clears it). */
|
|
58
|
+
export function clearQuestionFilter(dialog) {
|
|
59
|
+
dialog.filtering = false;
|
|
60
|
+
dialog.filter = '';
|
|
61
|
+
clampCursorToVisible(dialog);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Keep the highlight on a visible option after the filter changed: the cursor
|
|
65
|
+
* indexes the full list, and a filtered-out option would otherwise stay
|
|
66
|
+
* selected while invisible.
|
|
67
|
+
*/
|
|
68
|
+
function clampCursorToVisible(dialog) {
|
|
69
|
+
const visible = visibleQuestionIndexes(dialog);
|
|
70
|
+
if (visible.length === 0)
|
|
71
|
+
return;
|
|
72
|
+
if (visible.includes(dialog.cursor))
|
|
73
|
+
return;
|
|
74
|
+
dialog.cursor = visible[0] ?? dialog.cursor;
|
|
75
|
+
if (dialog.question.multiSelect !== true) {
|
|
76
|
+
dialog.selected.clear();
|
|
77
|
+
dialog.selected.add(dialog.cursor);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
17
80
|
/** Move the question highlight, clamped to its options. Returns false if not a question dialog. */
|
|
18
81
|
export function moveQuestionCursor(dialog, delta) {
|
|
19
82
|
const count = dialog.question.options?.length ?? 0;
|
|
20
83
|
if (count === 0)
|
|
21
84
|
return false;
|
|
22
|
-
|
|
85
|
+
const visible = visibleQuestionIndexes(dialog);
|
|
86
|
+
if (visible.length === 0)
|
|
87
|
+
return false;
|
|
88
|
+
const at = visible.indexOf(dialog.cursor);
|
|
89
|
+
const next = at === -1
|
|
90
|
+
? (delta >= 0 ? visible[0] : visible[visible.length - 1])
|
|
91
|
+
: visible[Math.max(0, Math.min(visible.length - 1, at + delta))];
|
|
92
|
+
dialog.cursor = next ?? dialog.cursor;
|
|
23
93
|
if (dialog.question.multiSelect !== true) {
|
|
24
94
|
dialog.selected.clear();
|
|
25
95
|
dialog.selected.add(dialog.cursor);
|
|
@@ -41,6 +111,8 @@ export function selectQuestionOption(dialog, index) {
|
|
|
41
111
|
}
|
|
42
112
|
/** Handle a hotkey: select its option and report whether it applied. */
|
|
43
113
|
export function selectQuestionOptionByKey(dialog, key) {
|
|
114
|
+
if (dialog.filtering === true)
|
|
115
|
+
return false;
|
|
44
116
|
const index = questionOptionIndex(key, dialog.question.options?.length ?? 0);
|
|
45
117
|
if (index === undefined)
|
|
46
118
|
return false;
|
package/lib/dialogs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dialogs.js","sourceRoot":"","sources":["../src/dialogs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dialogs.js","sourceRoot":"","sources":["../src/dialogs.ts"],"names":[],"mappings":"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"}
|