dsh-ssh-tui 0.7.1 → 0.7.3

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 (106) hide show
  1. package/README.en.md +92 -8
  2. package/README.md +64 -8
  3. package/cordis.patch.yml +15 -0
  4. package/docs/terminals.md +113 -0
  5. package/lib/approval-cache.js +12 -9
  6. package/lib/approval-cache.js.map +1 -1
  7. package/lib/color-depth.js +10 -4
  8. package/lib/color-depth.js.map +1 -1
  9. package/lib/diag.js +76 -17
  10. package/lib/diag.js.map +1 -1
  11. package/lib/dialogs.js.map +1 -1
  12. package/lib/display-sock.js +304 -29
  13. package/lib/display-sock.js.map +1 -1
  14. package/lib/doctor.js +71 -37
  15. package/lib/doctor.js.map +1 -1
  16. package/lib/dsh-compat.js +206 -88
  17. package/lib/dsh-compat.js.map +1 -1
  18. package/lib/footer.js +39 -9
  19. package/lib/footer.js.map +1 -1
  20. package/lib/gateway-protocol.js +202 -0
  21. package/lib/gateway-protocol.js.map +1 -0
  22. package/lib/i18n/en.js +79 -41
  23. package/lib/i18n/en.js.map +1 -1
  24. package/lib/i18n/index.js +13 -7
  25. package/lib/i18n/index.js.map +1 -1
  26. package/lib/i18n/zh.js +79 -41
  27. package/lib/i18n/zh.js.map +1 -1
  28. package/lib/index.js +132 -31
  29. package/lib/index.js.map +1 -1
  30. package/lib/job-label.js +99 -17
  31. package/lib/job-label.js.map +1 -1
  32. package/lib/paint.js +5 -2
  33. package/lib/paint.js.map +1 -1
  34. package/lib/picker.js +5 -3
  35. package/lib/picker.js.map +1 -1
  36. package/lib/plan.js +269 -17
  37. package/lib/plan.js.map +1 -1
  38. package/lib/platform.js +373 -0
  39. package/lib/platform.js.map +1 -0
  40. package/lib/preset-authoring.js +10 -14
  41. package/lib/preset-authoring.js.map +1 -1
  42. package/lib/preset-compat.js +100 -0
  43. package/lib/preset-compat.js.map +1 -0
  44. package/lib/preset-picker.js +5 -1
  45. package/lib/preset-picker.js.map +1 -1
  46. package/lib/preset-rows.js +83 -13
  47. package/lib/preset-rows.js.map +1 -1
  48. package/lib/provider-catalog.js +7 -4
  49. package/lib/provider-catalog.js.map +1 -1
  50. package/lib/route-memory.js +11 -4
  51. package/lib/route-memory.js.map +1 -1
  52. package/lib/session-index.js +5 -0
  53. package/lib/session-index.js.map +1 -1
  54. package/lib/session-list.js +18 -1
  55. package/lib/session-list.js.map +1 -1
  56. package/lib/session-lock.js +79 -24
  57. package/lib/session-lock.js.map +1 -1
  58. package/lib/session-route.js +334 -0
  59. package/lib/session-route.js.map +1 -0
  60. package/lib/settings-routes.js +10 -0
  61. package/lib/settings-routes.js.map +1 -0
  62. package/lib/settings-subagent.js +10 -0
  63. package/lib/settings-subagent.js.map +1 -0
  64. package/lib/subagent-model.js +84 -6
  65. package/lib/subagent-model.js.map +1 -1
  66. package/lib/supergrok-token.js +4 -0
  67. package/lib/supergrok-token.js.map +1 -1
  68. package/lib/term-text.js +7 -4
  69. package/lib/term-text.js.map +1 -1
  70. package/lib/terminal-caps.js +358 -0
  71. package/lib/terminal-caps.js.map +1 -0
  72. package/lib/tool-present.js +46 -14
  73. package/lib/tool-present.js.map +1 -1
  74. package/lib/tui.js +1949 -371
  75. package/lib/tui.js.map +1 -1
  76. package/lib/types/color-depth.d.ts +3 -3
  77. package/lib/types/diag.d.ts +18 -1
  78. package/lib/types/dialogs.d.ts +4 -0
  79. package/lib/types/display-sock.d.ts +94 -2
  80. package/lib/types/doctor.d.ts +8 -1
  81. package/lib/types/dsh-compat.d.ts +141 -44
  82. package/lib/types/footer.d.ts +21 -5
  83. package/lib/types/gateway-protocol.d.ts +88 -0
  84. package/lib/types/i18n/index.d.ts +18 -12
  85. package/lib/types/index.d.ts +45 -0
  86. package/lib/types/job-label.d.ts +38 -7
  87. package/lib/types/picker.d.ts +3 -0
  88. package/lib/types/plan.d.ts +94 -4
  89. package/lib/types/platform.d.ts +215 -0
  90. package/lib/types/preset-authoring.d.ts +8 -14
  91. package/lib/types/preset-compat.d.ts +58 -0
  92. package/lib/types/preset-picker.d.ts +1 -1
  93. package/lib/types/preset-rows.d.ts +51 -9
  94. package/lib/types/route-memory.d.ts +17 -22
  95. package/lib/types/session-list.d.ts +5 -0
  96. package/lib/types/session-lock.d.ts +9 -0
  97. package/lib/types/session-route.d.ts +191 -0
  98. package/lib/types/settings-routes.d.ts +16 -0
  99. package/lib/types/settings-subagent.d.ts +24 -0
  100. package/lib/types/subagent-model.d.ts +60 -7
  101. package/lib/types/term-text.d.ts +3 -2
  102. package/lib/types/terminal-caps.d.ts +105 -0
  103. package/lib/types/tool-present.d.ts +2 -17
  104. package/lib/types/transcript-types.d.ts +44 -1
  105. package/lib/types/tui.d.ts +333 -9
  106. package/package.json +82 -55
package/README.en.md CHANGED
@@ -14,6 +14,9 @@ If you mostly work over SSH — a jump host, a test box, a keyboard-only
14
14
  session — start here. A local desktop terminal with themes and layout
15
15
  you already like can stay as it is.
16
16
 
17
+ A SuperGrok / X Premium subscription goes through the standalone plugin
18
+ [dsh-llm-xai-oauth](https://github.com/cyjyyd/dsh-llm-xai-oauth) (headless, web, or this TUI). It reuses a local grok-bridge token; no xAI API key.
19
+
17
20
  Listed on the [dshfind plugin directory](https://dshfind.com/en/plugins/cyjyyd/dsh-ssh-tui):
18
21
 
19
22
  [![dshfind](https://dshfind.com/api/card/cyjyyd/dsh-ssh-tui?lang=en)](https://dshfind.com/en/plugins/cyjyyd/dsh-ssh-tui?ref=badge)
@@ -79,7 +82,7 @@ pins the palette (truecolor / 256 / 8 / none).
79
82
  ## Requirements
80
83
 
81
84
  - Node.js >= 22.19
82
- - `@deepseek-ai/dsh` CLI: `npm i -g @deepseek-ai/dsh` (verified on `0.1.2-rc.1` and `0.1.5-rc.1`. `0.1.5-alpha.1` / `0.1.5-alpha.2` / `0.1.3-alpha.2` share the same handle API + `agent/assistant-stream` shims. `0.1.3-alpha.1` exists only as a GitHub tag and was never published to npm)
85
+ - `@deepseek-ai/dsh` CLI: `npm i -g @deepseek-ai/dsh` (CI covers `0.1.5-rc.1` / `0.1.5-rc.3` / `0.1.7-rc.1`: `0.1.5-rc.1` runs typecheck and the unit suite, the other two add the real-PTY probes. `0.1.5-alpha.1` / `0.1.5-alpha.2` / `0.1.3-alpha.2` share the same handle API + `agent/assistant-stream` shims as the 0.1.5-rc line. **`0.1.2-rc` and older are no longer supported** — if the install is refused, upgrade to `0.1.5-rc` or `0.1.7-rc` first. `0.1.3-alpha.1` exists only as a GitHub tag and was never published to npm)
83
86
  - pnpm (used by `dsh plugin` to manage profile dependencies)
84
87
 
85
88
  ## Install
@@ -89,11 +92,11 @@ The recommended install is the command at the top of this README:
89
92
  profile dependency, and appends this package to `dsh.profile.bundles`
90
93
  because the manifest declares `dsh.bundle`.
91
94
 
92
- Optional: reuse a SuperGrok / grok-bridge token already on the machine:
95
+ Optional: put a SuperGrok subscription on dsh (standalone plugin, this TUI is not required):
93
96
 
94
97
  ```sh
95
- dsh plugin --profile tui add dsh-llm-xai-oauth
96
- dsh plugin --profile headless add dsh-llm-xai-oauth
98
+ dsh plugin --profile tui add dsh-llm-xai-oauth@latest
99
+ dsh plugin --profile headless add dsh-llm-xai-oauth@latest
97
100
  ```
98
101
 
99
102
  SuperGrok access tokens last about an hour. The TUI refreshes a due token on open, and `/usage` force-refreshes once after HTTP 401. If dsh is not running overnight, install the companion refresher or the next session starts with 401:
@@ -246,14 +249,24 @@ On first launch (when no API key is configured) the TUI opens a setup wizard:
246
249
  1. choose a provider template, matching the official Models page:
247
250
  - DeepSeek official;
248
251
  - OpenCode Go (`opencode.ai/zen/go/v1`, Responses protocol);
252
+ - OpenCode Go · Completions (same gateway on its chat route; Zen's model list
253
+ does not publish which route a model speaks, so pick this row for one that
254
+ only answers `/chat/completions`);
249
255
  - Command Code (`api.commandcode.ai`, Completions protocol, with its own quota);
256
+ - Command Code · Responses (same gateway and key on its Responses route; the
257
+ gateway lists 55 of 71 models on both routes, 8 on Completions only, and the
258
+ Claude family on Messages only — pick the row that matches your model);
250
259
  - custom OpenAI-compatible gateway (Completions);
251
260
  - custom OpenAI Responses gateway;
252
261
  - Anthropic Messages-compatible gateway;
253
262
  2. for custom providers, enter a lowercase Provider ID (permanent), base URL,
254
263
  API key (masked while typing), and one or more model IDs — each step has a
255
264
  sensible template default. On the models step, press `Ctrl+F` to fetch the
256
- current model list straight from the provider endpoint;
265
+ current model list straight from the provider endpoint, then press Enter to
266
+ open a checklist of what was fetched (the template's models are pre-checked:
267
+ the listing offers candidates, it does not configure them all for you). When
268
+ more than one model is kept, a second step picks which one this session
269
+ should run; typing a model list instead skips both questions;
257
270
  3. confirm and save.
258
271
 
259
272
  The wizard sizes each model's context window automatically: the endpoint
@@ -288,6 +301,17 @@ dsh --profile tui
288
301
 
289
302
  `--provider <id> --model <id>` remains available as a temporary override.
290
303
 
304
+ **One gateway is one provider.** `llm-pi-ai` stores the wire protocol on the
305
+ provider entry (one protocol per route), so a gateway whose catalogue spans
306
+ protocols is kept as sibling rows — `command-code`,
307
+ `command-code-completions`, `command-code-messages`. `/provider`, `/model` and
308
+ `/submodel` present those as a single supplier: the model list is the union of
309
+ the rows, a pick is filed on the row that can actually speak its protocol
310
+ (taken from the gateway's own `supported_endpoints`, else from where the model
311
+ is already configured), and the remembered choice is keyed by the gateway's id
312
+ so the next `/provider` still shows one row. Command Code and OpenCode Go are
313
+ both such gateways.
314
+
291
315
  You can reopen the wizard at any time with:
292
316
 
293
317
  ```sh
@@ -316,8 +340,9 @@ You can reopen the wizard at any time with:
316
340
  line endings.
317
341
  - **Subagent route**: the identity row always carries `sub:<model>` — the route every child
318
342
  inherits — with the effort in parentheses when `/subeffort` set one, e.g.
319
- `sub:grok-4.5(xhigh)`. Only the model name is shown; the provider and the full route are
320
- in `/status`.
343
+ `sub:grok-4.5(xhigh)`. While the child is on the parent's own provider the chip keeps the
344
+ row's mute; only a `/submodel` pin onto a *different* provider colours it and prefixes the
345
+ provider (`sub:xai/grok-4.5`). The full route is in the header and `/status`.
321
346
 
322
347
  ## Usage
323
348
 
@@ -395,6 +420,44 @@ default. Both commands are remembered under `ssh-tui-subagent` in
395
420
  releases selected continuable children using the harness 0.1.1
396
421
  `drainContinuableChildren` capability.
397
422
 
423
+ ### Each session keeps its own route (`$DSH_HOME/tui-session-routes.json`)
424
+
425
+ The settings above are the **software-level default**: a new session starts
426
+ there. What a session actually ran on — the parent provider/model/effort plus
427
+ the subagent route, including a child pinned to another supplier — is recorded
428
+ separately, and `--resume` applies it automatically with one line saying so:
429
+
430
+ ```
431
+ Resumed on this session's recorded route: xai/grok-4.6 (xhigh) · subagent deepseek-official/deepseek-v4-flash
432
+ ```
433
+
434
+ This is what cross-provider children made necessary: under one global default,
435
+ session A can run its children on DeepSeek while session B runs them on xAI, and
436
+ a resume that only knew the software default would mix the two up. The rules:
437
+
438
+ - a **new session** is unaffected — it still starts from `settings.yaml`;
439
+ - on **resume** the record beats the default, but an explicit `--provider` /
440
+ `--model` flag still wins: that is what this launch asked for;
441
+ - a restored subagent route applies to **that session only** and is not written
442
+ back to `ssh-tui-subagent`, so one resume cannot change the default for every
443
+ later session;
444
+ - the record is written when a route settles (`/model`, `/provider`,
445
+ `/submodel`, `/subeffort`, `/setup`) and at the start of every turn, which
446
+ catches a preset or a hand-edited `settings.yaml`; nothing is written when
447
+ nothing changed;
448
+ - the newest 200 sessions are kept and older ones fall out; an unreadable file
449
+ reads as "no record" and the default applies;
450
+ - when the **recorded provider no longer exists** (removed or renamed), the whole
451
+ record is dropped and the launch falls back to the app-level defaults — model,
452
+ effort and subagent together — saying which supplier it fell back from. A
453
+ removed *child* pin is narrower: the parent route stays and the children fall
454
+ back to the app-level subagent setting. If not even the default can be routed
455
+ to, an error names it, lists what is available, and points at `/setup` and
456
+ `/provider`. Availability is judged permissively (the four built-ins, the
457
+ adapter list, a configured `llm-pi-ai` profile): calling a dead route alive
458
+ costs the harness's own error, calling a live one dead would silently lose the
459
+ session's route.
460
+
398
461
  Each subagent is its own collapsible card. One or many children start collapsed,
399
462
  so the parent transcript stays readable; `Enter`, click, empty-input `↑`/`↓`,
400
463
  and `Ctrl+R` expand or collapse them independently. Running cards show a spinner,
@@ -632,6 +695,15 @@ Find your symptom; each answer is what to do, not a change log.
632
695
  - **Whole-row backgrounds are too loud on a dark terminal** — `DSH_TUI_COLOR_DEPTH=none`
633
696
  drops them; diffs still read through `+`/`-`.
634
697
 
698
+ - **Terminal compatibility** — what each terminal is allowed and promised (Windows Terminal,
699
+ conhost, GNOME, XFCE, Konsole, xterm, tmux, screen, the Linux console) is tabulated in
700
+ [docs/terminals.md](docs/terminals.md); `/diag` prints the verdict it used, and
701
+ `DSH_TUI_TERM_CAPS` overrides it.
702
+
703
+ - **File permissions** — `env.sh`/`env.cmd` (API keys), `.credentials.yaml`, the SuperGrok token and the
704
+ lock/socket directories are `0600`/`0700` on POSIX, and on Windows a single-user ACL (`icacls` with
705
+ inheritance removed). That matters when `DSH_HOME` lives somewhere shared.
706
+
635
707
  ### Status line and quota
636
708
 
637
709
  - **The quota widget shows `░░░░░░░░ ?%`** — no reading has arrived yet (the API is slow or
@@ -644,11 +716,17 @@ Find your symptom; each answer is what to do, not a change log.
644
716
  its remaining share and reset time. Threshold alerts still fire on the tightest window.
645
717
  - **The model name has no provider prefix** — the status line shows the model alone
646
718
  (`provider/model` is truncated to the model); the full route is in the header and
647
- `/status`, and a `sub:` chip shows the child's model the same way.
719
+ `/status`, and a `sub:` chip shows the child's model the same way — unless `/submodel`
720
+ pinned another provider, which adds a `provider/` prefix and an accent.
648
721
  - **The subagent model is not what you want** — `/submodel` picks the model, `/subeffort`
649
722
  the reasoning effort, `/status` shows the current pair.
650
723
  - **No `tok/s`** — that turn had no measurable model tokens; a step with only a first-token
651
724
  time shows `首字 1.2s`.
725
+ - **The footer is stuck on "compacting" and `/compact` says one is already running** — the Host
726
+ exited mid-compaction, so the log has a `compaction/start` with no `end` and the resumed card
727
+ stays on "running" forever. Restart and resume the same session: the replay settles every such
728
+ compaction as interrupted, which frees the footer and the command again. Before 0.7.2 the same
729
+ restart still helps (the stale card is never written back to the log).
652
730
  - **The plan strip asked for leftover todos only once** — that is deliberate: one reminder
653
731
  per open list, so a turn end never spawns another turn forever. To see it again, complete
654
732
  the list and start a new one.
@@ -659,6 +737,12 @@ Find your symptom; each answer is what to do, not a change log.
659
737
  a subagent): the turn is cancelled by default and the Host stays, so
660
738
  `dsh --profile tui --resume` attaches to it; `/disconnect continue` lets it run to
661
739
  completion instead. Do not start a second Host.
740
+ **Windows keeps it too, by a different route**: there the Host is started through the OS
741
+ PowerShell's `Start-Process -WindowStyle Hidden`, so it has a hidden console of its own —
742
+ it neither dies with your window nor makes tool calls flash a console. The one exception
743
+ is a machine with no PowerShell: the launcher then falls back to a direct child, and
744
+ closing the window ends a running turn as well (the session itself is not damaged and
745
+ `--resume` rebuilds it from the log).
662
746
  - **After reconnecting there is an extra notice line, `^[[17;1R` flashes, and the link chip
663
747
  goes hollow** — upgrade; the automatic retry stays in raw mode and drops queued bytes, so
664
748
  those replies are no longer echoed.
package/README.md CHANGED
@@ -13,7 +13,7 @@ English: [README.en.md](README.en.md)
13
13
  如果你主要在 SSH 里写代码——公司跳板、测试机、只有键盘的会话——可以从这里开始。
14
14
  本机桌面终端若更在意主题和布局,也可以继续用你已经习惯的界面。
15
15
 
16
- SuperGrok / X Premium 订阅走配套插件 [dsh-llm-xai-oauth](https://github.com/cyjyyd/dsh-llm-xai-oauth),复用本机 grok-bridge token,不需要 xAI API Key。
16
+ 已经在付 SuperGrok / X Premium 的话,用独立插件 [dsh-llm-xai-oauth](https://github.com/cyjyyd/dsh-llm-xai-oauth) 把订阅接进 dsh(headless / web / 本 TUI 都能用),复用本机 grok-bridge token,不需要 xAI API Key。
17
17
 
18
18
  本插件已被 [dshfind 插件目录](https://dshfind.com/zh/plugins/cyjyyd/dsh-ssh-tui) 收录:
19
19
 
@@ -68,7 +68,8 @@ dsh --profile tui
68
68
  - 输入框下方两行底栏:第一行链路芯片 + 按宽度丢组的会话数字(轮次、入/出 token、速度);
69
69
  第二行只留一个活动词(运行中 / 工具 N / 子代理 N / 压缩中…),身份收到右侧(含 `目录:srv`;点击打印完整工作目录);
70
70
  身份里始终带 `sub:<子代理模型>`(如 `sub:grok-4.5(xhigh)`):`/submodel` 选模型、`/subeffort` 选档位(带括号后缀);
71
- 只显示模型名——提供商与完整路由在顶栏与 `/status`;
71
+ 子代理跟随主模型时它就是身份行的暗色;只有 `/submodel` 钉到**别的提供商**才变色并补上 `提供商/` 前缀
72
+ (如 `sub:xai/grok-4.5`)——完整路由在顶栏与 `/status`;
72
73
  - 恢复旧会话会切到该会话记录的工作目录;新建会话用启动时的当前目录;
73
74
  - 历史会话启动选择器:`dsh --profile tui --resume`(或 `resume`)先选会话再进入;
74
75
  - 终端窗口标题栏:运行中旋转图标 + `运行中 · 工具 N`,完成后 `✓ 已完成`,并响
@@ -97,7 +98,7 @@ dsh --profile tui
97
98
  ## 环境要求
98
99
 
99
100
  - Node.js ≥ 22.19
100
- - DeepSeek Harness CLI:`npm i -g @deepseek-ai/dsh`(已验证 `0.1.2-rc.1` 与 `0.1.5-rc.1`。`0.1.5-alpha.1` / `0.1.5-alpha.2` / `0.1.3-alpha.2` 走同一套 handle API + `agent/assistant-stream` 兼容层。`0.1.3-alpha.1` 只在 GitHub 有 tag,npm 未发布,无法本地装包验证)
101
+ - DeepSeek Harness CLI:`npm i -g @deepseek-ai/dsh`(CI 覆盖 `0.1.5-rc.1` / `0.1.5-rc.3` / `0.1.7-rc.1`:`0.1.5-rc.1` 跑 typecheck 与单元套件,另两条连真 PTY 探针一起跑。`0.1.5-alpha.1` / `0.1.5-alpha.2` / `0.1.3-alpha.2` 与 0.1.5-rc 线共用同一套 handle API + `agent/assistant-stream` 兼容层。**`0.1.2-rc` 及更早的线不再支持**,装不上请先升到 `0.1.5-rc` 或 `0.1.7-rc`。`0.1.3-alpha.1` 只在 GitHub 有 tag,npm 未发布,无法本地装包验证)
101
102
  - pnpm(`dsh plugin` 通过 pnpm 管理 profile 依赖)
102
103
  - 支持 ANSI 的终端(推荐 SSH 直连;Windows 用 PowerShell / Windows Terminal)
103
104
  - Windows:Host 与显示端之间的本地通道使用命名管道
@@ -110,11 +111,11 @@ dsh --profile tui
110
111
 
111
112
  推荐安装就是文首那条 `dsh plugin --profile tui add dsh-ssh-tui@latest`。CLI 会从 npm 拉包、写入 profile 依赖,并把本插件加入 `dsh.profile.bundles`(因为包内声明了 `dsh.bundle`)。
112
113
 
113
- 可选:本机已有 SuperGrok / grok-bridge token 时再装配套 OAuth:
114
+ 可选:把 SuperGrok 订阅接进 dsh(独立插件,不依赖本 TUI):
114
115
 
115
116
  ```bash
116
- dsh plugin --profile tui add dsh-llm-xai-oauth
117
- dsh plugin --profile headless add dsh-llm-xai-oauth
117
+ dsh plugin --profile tui add dsh-llm-xai-oauth@latest
118
+ dsh plugin --profile headless add dsh-llm-xai-oauth@latest
118
119
  ```
119
120
 
120
121
  SuperGrok 的 access token 大约 1 小时过期。TUI 打开时会刷新即将过期的 token,`/usage` 遇到 401 也会再刷一次。机器长时间不开 dsh 时,请另开刷新进程,否则一打开就是 401:
@@ -139,6 +140,11 @@ dsh --profile tui # 必须在真实终端 / SSH 会话里
139
140
  `--resume`);模型思考 / 回复 / 工具 / 子代理等忙碌状态则 **Host 留下**。
140
141
  重新 SSH 后同一条命令会优先接入那个进程(选择器标「可接入」),不要再开第二份 Host:
141
142
 
143
+ Windows 上也一样保活,但走的路不同:宿主由系统 PowerShell 的 `Start-Process -WindowStyle Hidden`
144
+ 拉起,因此有**自己的隐形控制台**(既不随用户的窗口关闭,也不会让工具调用闪窗)。唯一的例外是
145
+ 机器上找不到 PowerShell:那时回退成直接子进程,关窗会连带结束正在跑的回合(会话不坏,
146
+ `--resume` 从日志重建),**并且启动横幅下面会有一行提示**说明这一点。见 [docs/platform.md](docs/platform.md) 的《四种死法》。
147
+
142
148
  ```bash
143
149
  dsh --profile tui --resume # 选择器(活进程优先接入)
144
150
  dsh --profile tui --resume <session-id> # 有活进程则接入,否则从日志恢复
@@ -339,6 +345,14 @@ preset 保留它 `preset.yml` 里的名字不翻译。`/mode <id|名字>` 直接
339
345
  每个提供商上次的模型和思考强度会分开记住。`/setup` 只新增或更新当前这条
340
346
  API Key 提供商,不会冲掉其它路由。SuperGrok / X Premium 走本机 OAuth,不需要填 Key。
341
347
 
348
+ **一个网关就是一个提供商。** `llm-pi-ai` 把线路协议记在 provider 上(一条 route 只能
349
+ 一种协议),所以目录跨协议的网关在 `settings.yaml` 里本来会拆成 `command-code` /
350
+ `command-code-completions` / `command-code-messages` 这样的兄弟行。`/provider`、
351
+ `/model`、`/submodel` 把它们**当成一家**列出:模型列表取各行并集,选中后自动落到
352
+ 真正能发该协议的那一行(依据网关自己公布的 `supported_endpoints`;公布不了就沿用
353
+ 它已经配置在的那行),而记住你上次选择的键是网关注 id——所以下次打开仍然只有一行。
354
+ Command Code 与 OpenCode Go 都是这种网关。
355
+
342
356
  子代理默认跟随父会话的提供方,并尽量选同一家的轻量模型:按父会话所选模型名
343
357
  近似匹配,`flash` 结尾的优先——DeepSeek 用 `deepseek-v4-flash`,xAI 用
344
358
  `grok-4.5`。`/model` 或 `/provider` 换提供商(OAuth / API Key 都一样)时会
@@ -402,13 +416,43 @@ web 端与 TUI 共用同一份设置。`/model` 换提供商后**下一步请求
402
416
  每个提供商上次的模型和思考强度记在 `ssh-tui-routes` 里,切回 SuperGrok / 官方 / Go 时会预填。
403
417
  `/setup` 只更新当前这条提供商(模型列表会合并),不会删掉其它路由的 Key 和模型。
404
418
 
419
+ ### 会话自己的路由(`$DSH_HOME/tui-session-routes.json`)
420
+
421
+ 上面那份是**软件级默认值**:新会话从这里起步。而每个会话实际用过的路由(父会话的提供商/模型/强度,
422
+ 加上子代理那条——包括钉死到别的提供商的情况)会单独记在 `tui-session-routes.json` 里,
423
+ `--resume` 时**自动按记录恢复**,并在转录区打一行说明:
424
+
425
+ ```
426
+ 已按本会话记录恢复路由:xai/grok-4.6 (xhigh) · 子代理 deepseek-official/deepseek-v4-flash
427
+ ```
428
+
429
+ 这就是跨提供商子代理需要会话级存储的原因:同一个软件默认值下,A 会话可能让自己的子代理跑在
430
+ DeepSeek 上、B 会话跑在 xAI 上;只记软件级默认值的话,resume 之后两个会话会互相污染。
431
+ 规则:
432
+
433
+ - **新会话**不受影响,仍从 `settings.yaml` 的默认值起步;
434
+ - **resume** 时记录优先于默认值,但 **CLI 显式给的 `--provider` / `--model` 仍然最高**——
435
+ 那是这次启动的明确要求;
436
+ - 恢复的子代理路由**只作用于当前会话**,不会写回 `ssh-tui-subagent`(否则一次 resume 会改掉
437
+ 以后所有新会话的默认子代理);
438
+ - 记录在路由定下来时写(`/model`、`/provider`、`/submodel`、`/subeffort`、`/setup`)以及每轮开始时
439
+ (这样 preset 或手改 settings.yaml 换掉的模型也能被记住);没变化就不写;
440
+ - 只保留最近 200 个会话的记录,老的自然淘汰;文件坏了就当作没有记录,退回默认值。
441
+ - 记录里的**提供商已被删掉/改名**时:整条会话记录作废,回退到应用级默认(模型、强度、子代理一起回退),
442
+ 并在启动时说明从哪家退下来的;只有**子代理单独钉死的那家**不可用时,父路由照旧、子代理退回应用级设置。
443
+ 连默认提供商都不可用时会打一行错误:报出是哪家、列出可用的提供商,并指向 `/setup` 与 `/provider`。
444
+ 判断"可用"取宽松口径(内建四家 + 适配器列表 + 已配置的 `llm-pi-ai` 档案):误判成可用只是报一条
445
+ Harness 自己的错误,误判成不可用则会悄悄丢掉会话路由。
446
+
405
447
  对 OpenCode 和其他第三方提供商,`/model` 会先调用提供商的端点
406
448
  (`GET {baseURL}/models`)获取实时模型列表;端点不可达时回退到已配置的
407
449
  模型列表。若选中的模型尚未写入提供商配置,会自动追加到
408
450
  `llm-pi-ai.providers.<id>.models`,保证 Harness 可以正常调用。
409
451
 
410
452
  首次配置向导的自定义/OpenCode 提供商步骤中,输入模型 ID 前可按
411
- `Ctrl+F` 直接从端点拉取模型列表,免去手动输入。
453
+ `Ctrl+F` 直接从端点拉取模型列表,免去手动输入。拉完按回车打开**勾选列表**:
454
+ 模板模型默认勾上,端点列出的只是候选,不会替你全写进配置;勾了多个时再问一次
455
+ 「本次会话用哪个模型」。想直接手写模型 ID 列表,输入并回车即可跳过这两步。
412
456
 
413
457
  向导会尽量自动填好上下文窗口:先读端点 `/models` 的容量字段,查不到再按模型名
414
458
  去内置 pi-ai 目录匹配(会剥离提供商写进模型名的思考档位后缀 `-high` / `-low` /
@@ -558,6 +602,14 @@ npm run build
558
602
  - **标题栏 / 铃声不生效**:终端需支持 OSC 0 与 BEL;`DSH_TUI_NO_BELL=1` 可关闭铃声。
559
603
  - **深色终端下整行底色太抢眼**:`DSH_TUI_COLOR_DEPTH=none` 去掉底色,diff 仍用 `+`/`-` 区分。
560
604
 
605
+ - **终端兼容性**:每个终端允许发什么、承诺什么(Windows Terminal / conhost / GNOME / XFCE / Konsole /
606
+ xterm / tmux / screen / Linux 控制台)见 [docs/terminals.md](docs/terminals.md);
607
+ 判定依据写在 `/diag` 的「终端」一行,判定错了用 `DSH_TUI_TERM_CAPS` 覆盖。
608
+
609
+ - **文件权限**:`env.sh`/`env.cmd`(含 API Key)、`.credentials.yaml`、SuperGrok token、锁与套接字目录
610
+ 在 POSIX 上是 `0600`/`0700`,在 Windows 上是**只授权当前用户**的 ACL(`icacls` 去掉继承)。
611
+ `DSH_HOME` 放在共享目录时这一点尤其重要。
612
+
561
613
  ### 状态栏与额度
562
614
 
563
615
  - **额度条显示 `░░░░░░░░ ?%`**:**还没拿到读数**(接口慢或不通),不是 0%。TUI 每 15 秒重试一次,拿到后自动替换成
@@ -566,9 +618,13 @@ npm run build
566
618
  - **`5Hr` / `1Wk` / `1Mo` 是什么**:该数值所属的额度窗口。默认显示**最小窗口**(5 小时 → 周 → 月),
567
619
  `/quota` 列出全部窗口、剩余比例与重置时间。告警仍按"最紧的那个窗口"触发。
568
620
  - **状态栏模型名没有提供商前缀**:状态行只显示模型名(`provider/model` 会截断成模型名),完整路由在顶栏与 `/status`;
569
- `sub:` 子代理同理,只显示模型名。
621
+ `sub:` 子代理同样只显示模型名;只有钉到别的提供商时才补 `提供商/` 前缀并变色。
570
622
  - **看不到子代理模型 / 想换子代理**:`/submodel` 选模型、`/subeffort` 选思考档位,`/status` 查看当前值。
571
623
  - **没有 `tok/s`**:该轮没有可统计的模型 token;只有首字耗时时显示 `首字 1.2s`。
624
+ - **底栏一直显示「压缩中」,`/compact` 还说已有压缩在进行**:Host 在压缩过程中退出,日志里只剩
625
+ `compaction/start` 没有 `end`,恢复会话时那张卡片会一直停在"运行中"。重新启动(`--resume` 同一会话)
626
+ 即可:重放会把这类没有结束事件的压缩结算成「压缩被中断」,底栏随之恢复,`/compact` 也能再用。
627
+ 升级到 0.7.2 之前遇到时,重启同样有效(旧卡片不会写回日志)。
572
628
  - **计划条只提醒一次"补待办"**:有意如此——一条待办列表只问一次,避免每轮结束都开一个新回合。
573
629
  想再次触发,先把列表全部标成完成,再新开一列待办。
574
630
 
package/cordis.patch.yml CHANGED
@@ -25,3 +25,18 @@
25
25
  color: !!js ctx.sshTuiStartup.noColor !== true
26
26
  # Jump-host SSH: coalesce token ticks into one stdout write per frame.
27
27
  paintIntervalMs: !!js Number.parseInt(process.env.DSH_TUI_PAINT_MS ?? '160', 10) || 160
28
+
29
+ # The TUI's two auxiliary settings namespaces.
30
+ #
31
+ # From 0.1.7 a settings form is projected out of a loader entry's own Config
32
+ # schema, and a write may only address an entry id — so each namespace needs
33
+ # a row. The row ids ARE the namespaces, and they match the sections the
34
+ # 0.1.5 line registered and the host imports a pre-0.1.7 `settings.yaml`
35
+ # section into, so `/model` routes and a `/submodel` pin survive an upgrade.
36
+ # On 0.1.5 these rows only carry their schema: the plugin registers both
37
+ # sections itself.
38
+ - id: ssh-tui-routes
39
+ name: 'dsh-ssh-tui/settings-routes'
40
+
41
+ - id: ssh-tui-subagent
42
+ name: 'dsh-ssh-tui/settings-subagent'
@@ -0,0 +1,113 @@
1
+ # 终端兼容矩阵
2
+
3
+ > 这份文件回答一个问题:**这个 TUI 在你面前那块终端上,允许发什么、承诺什么。**
4
+ > 判定代码只有一处:`src/terminal-caps.ts`(`terminalCapabilities()`),
5
+ > 一张终端一个 fixture 的用例在 `tests/terminal-caps.test.mjs`,
6
+ > 端到端断言(每种终端真起一次 TUI,看它到底发了哪些转义序列)在 `scripts/tui-term-probe.mjs`。
7
+
8
+ ## 为什么需要它
9
+
10
+ "能发"和"该发"是两件事,判错了两个方向都有代价:
11
+
12
+ | 判错的方向 | 实际后果 |
13
+ |---|---|
14
+ | **不该发却发了**(过度承诺) | `?1000h` 在不能识别 SGR 坐标的终端上会**吞掉鼠标**;OSC 52 没人接时 `/copy` 看起来成功了,用户粘贴时才发现是空的 |
15
+ | **该发却没发**(欠承诺) | 在其实支持的终端上悄悄少掉鼠标/拖选、少掉备用屏恢复、多行粘贴被拆成多次提交 |
16
+
17
+ 所以规则是**按能力发**,而不是"保守全关"或"乐观全开":
18
+ 模式设置类(鼠标、括号粘贴、备用屏)发错了最多被忽略,**发漏了会真的少功能**,因此默认给基线;
19
+ 而**用户无法当场验证的承诺**(剪贴板、超链接)宁可不承诺,并在 `/copy` 之后明确说明。
20
+
21
+ ## 矩阵
22
+
23
+ `✓` = 启用 · `—` = 不启用 · `?` = 启用但**不承诺**(可能生效,取决于配置)
24
+
25
+ | 终端 | 识别依据 | 配色 | 鼠标(1000/1002/1006) | 括号粘贴 | 备用屏 | OSC 52 剪贴板 | OSC 8 超链接 | 标题 |
26
+ |---|---|---|---|---|---|---|---|---|
27
+ | **Windows Terminal** | `WT_SESSION` | truecolor | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
28
+ | **Windows 控制台(conhost)** | win32、无 `WT_SESSION`、`TERM` 为空 | 16 色(`TERM` 为空是正常的) | ✓ | — | ✓ | — | — | ✓ |
29
+ | **Git-Bash / MSYS2 / mintty** | win32 但 `TERM` 有名字(如 `xterm-256color`) | truecolor(`COLORTERM` 决定) | ✓ | ✓ | ✓ | ? | ✓ | ✓ |
30
+ | **GNOME Terminal** | `VTE_VERSION` 有值 | truecolor | ✓ | ✓ | ✓ | —(VTE 从未实现) | ✓ | ✓ |
31
+ | **XFCE Terminal / MATE / Tilix / Terminator** | 同上(同一套 VTE) | truecolor | ✓ | ✓ | ✓ | —(同上) | ✓ | ✓ |
32
+ | **旧 VTE(< 0.50)** | `VTE_VERSION` < 5000 | truecolor | ✓ | ✓ | ✓ | — | — | ✓ |
33
+ | **Konsole ≥ 24.12** | `KONSOLE_VERSION` ≥ 241200 | truecolor | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
34
+ | **旧 Konsole(< 24.12)** | `KONSOLE_VERSION` < 241200 | truecolor | ✓ | ✓ | ✓ | — | ✓ | ✓ |
35
+ | **xterm / rxvt / kitty / wezterm / alacritty** | `TERM` 含对应名字 | truecolor(`COLORTERM` 决定) | ✓ | ✓ | ✓ | ?(xterm 受 `allowWindowOps` 限制) | ✓ | ✓ |
36
+ | **tmux** | `TMUX` / `TERM=tmux*` | 256(设了 `COLORTERM=truecolor` 则真彩) | ✓ | ✓ | ✓ | ?(需 `set -g set-clipboard on`) | ✓ | ✓ |
37
+ | **screen** | `STY` / `TERM=screen*` | 256(同上) | ✓ | ✓ | ✓ | — | — | ✓ |
38
+ | **Linux 虚拟控制台(tty1)** | `TERM=linux` | 8 色 | — | — | —(保留滚动回看) | — | — | — |
39
+ | **`TERM=dumb`/未标注** | `TERM=dumb` | 无 | ✓(基线) | ✓ | ✓ | — | — | — |
40
+
41
+ 配色一列是**该终端在默认环境变量下的结果**:`COLORTERM=truecolor` 会把任何一行的真彩打开,`NO_COLOR` 会全部关掉
42
+ (判定在 `src/color-depth.ts`,与终端家族无关)。
43
+
44
+ 关于最后三行的取舍:
45
+
46
+ - **Linux 虚拟控制台**关掉备用屏,是因为在那里进备用屏等于让用户丢掉 `Shift+PgUp` 的滚动回看,
47
+ 而它本来也没有真正的备用屏;
48
+ - **`TERM=dumb` 与未知终端保留基线**:说自己是 dumb 的终端常常只是被包装层挡住了名字(CI 的 pty 也是如此),
49
+ 而它不认识的模式设置序列会被忽略——此时"少发"才是真正的损失。剪贴板与超链接则反过来不承诺;
50
+ - **VTE(GNOME / XFCE / …)没有 OSC 52**:上游 issue 至今未实现(GNOME/vte#125),
51
+ 而它是 Linux 桌面最常见的终端——所以这一格是 `—`,不是 `?`。Konsole 的写入支持要 **24.12** 才有。
52
+ - **`?` 的含义**:该终端*可能*生效但需要用户配置(xterm 的 `allowWindowOps`、tmux 的 `set-clipboard on`),
53
+ 所以仍然**照发**;而 `—` 的终端上一次会话只提醒一次,告诉你剪贴板可能没写进去。
54
+
55
+ ## 覆盖方式(用户可强制指定)
56
+
57
+ 自动判定错了就手动覆盖,两个环境变量都长期有效:
58
+
59
+ ```sh
60
+ # 单项开关:no-<能力> 或 <能力>=false;逗号/空格分隔
61
+ DSH_TUI_TERM_CAPS='no-mouse,osc52=false' dsh --profile tui
62
+
63
+ # 反过来:在判定为不支持的地方强行打开。两个真实场景:
64
+ # ① tmux 里配了 `set -g set-clipboard on`,OSC 52 其实能用 → 打开并取消提示;
65
+ # ② 老 conhost(无 VT 处理)反而要关掉,见下面「已知限制」。
66
+ DSH_TUI_TERM_CAPS='osc52' dsh --profile tui
67
+ DSH_TUI_TERM_CAPS='no-alternateScreen,no-mouse' dsh --profile tui # 无 VT 的旧控制台
68
+
69
+ # 先前的两个开关继续有效
70
+ DSH_TUI_NO_ALT_SCREEN=1 # 等价于 no-alternateScreen
71
+ DSH_TUI_OSC8=0 # 等价于 osc8=false
72
+ DSH_TUI_COLOR_DEPTH=none # 只影响配色(见 color-depth.ts)
73
+ ```
74
+
75
+ 可写的名字:`mouse`、`mouseSgr`、`mouseDrag`、`bracketedPaste`、`alternateScreen`、`osc52`、`osc8`、`title`。
76
+ `=` 两边的空格可有可无(`mouse = false` 等同 `mouse=false`);**看不懂的写法会被拒绝而不是猜**——
77
+ 写错的名字/取值不会生效,但会出现在 `/diag` 的「终端」行末尾,好过默默无效:
78
+
79
+ - 打开 `mouse`(或 `mouseSgr`)会连带打开 `mouseSgr` 与 `mouseDrag`:输入解析器只认 SGR 报告,
80
+ 只开 `?1000h` 会「吞掉鼠标却收不到事件」,比不开更糟;想只要点击不要拖拽就写 `mouse,no-mouseDrag`;
81
+ - 反过来,`no-mouseSgr`(或 `mouseSgr=false`)等于关掉鼠标——没有 SGR 就没有可用的事件;
82
+ - 提示只在 `osc52` 为假时出现,且每会话一次;`DSH_TUI_TERM_CAPS=osc52` 表示你确认终端支持,提示随之消失。
83
+
84
+ 判断依据写在 `/diag` 里,报障时直接贴那一行:
85
+
86
+ ```
87
+ 终端:gnome-terminal (VTE 7000)(vte)· 鼠标 是 · 括号粘贴 是 · 备用屏 是 · OSC52 是 · OSC8 是
88
+ ```
89
+
90
+ ## 键盘与输入
91
+
92
+ 键位这一侧不按终端分家:解析器同时吃传统 xterm 序列(`\x1b[H`、`\x1b[3~`、SS3 `\x1bO…`)
93
+ 与 kitty/CSI-u 编码(例如 `\x1b[99;6u` 是 Ctrl+Shift+C,kitty、wezterm、foot 等默认或可开启),
94
+ 粘贴走 `?2004h` 的括号标记(不支持的终端退化成逐行输入,见上表)。
95
+ Windows 与 Linux 的差异只在**改键**文件里:`/keys` 写出的键名与各终端实际发出的字节一一对应。
96
+
97
+ ## 已知限制
98
+
99
+ - **PowerShell / cmd.exe 的 `TERM` 为空**:那正是 conhost 的特征;Git-Bash / MSYS2 / mintty 会设 `TERM`,因此走 xterm 基线。
100
+ - **旧版 Windows 控制台(无 VT 处理)**:Windows 10 之前的 conhost 不认这些转义序列,
101
+ 用 `DSH_TUI_NO_ALT_SCREEN=1` 或 `DSH_TUI_TERM_CAPS=no-alternateScreen,no-mouse` 退到最朴素模式。
102
+ - **代码页不是 UTF-8 的 Windows 控制台**:框线与 emoji 会花。TUI 不改你的控制台代码页
103
+ (那是全局状态),请用 `chcp 65001` 或改用 Windows Terminal。
104
+ - **`/copy` 与拖选都依赖 OSC 52**:VTE 系(GNOME / XFCE / MATE / Tilix / Terminator)、conhost、screen、
105
+ Linux 控制台都不接收;Konsole 要 24.12+;xterm / tmux 需要自身配置。这些终端上 TUI 每会话提示一次,
106
+ 并建议用 **Shift+拖选**——鼠标被 TUI 捕获时,Shift 是各家终端保留原生选择的方式。
107
+ - **旧版 Windows 控制台的括号粘贴**:`?2004` 到 2022-11(Windows 11 22H2)才进 conhost,
108
+ 更早的 PowerShell/cmd 没有;粘贴仍然可用(多行 burst 会被当成一次粘贴),只是没有括号标记。
109
+ - **tmux / screen 里的鼠标**:需要 tmux `set -g mouse on`、screen 亦然;TUI 会照发,转发与否由它们决定。
110
+ - **不是 UTF-8 的 locale**:不做自动降级(本仓库没有 ASCII 回退渲染),见 `docs/platform.md` 的欠债清单。
111
+ - **`/diag` 的终端行来自 Host 的环境**:重新接入(reattach)后它描述的是 Host 启动时所处的终端。
112
+ 退出时的「离开备用屏」序列因此**无条件发出**——它落在没进过备用屏的终端上会被忽略,
113
+ 而漏发会把用户留在无法滚动的屏幕里。
@@ -25,19 +25,22 @@
25
25
  * the review result there depends entirely on a script the key cannot see.
26
26
  * @module dsh-ssh-tui/approval-cache
27
27
  */
28
+ import { createHash } from 'node:crypto';
28
29
  import { isOpaqueInterpreterCommand } from './auto-approval.js';
29
30
  /** How long one remembered verdict stays usable. */
30
31
  export const DEFAULT_VERDICT_TTL_MS = 10 * 60 * 1000;
31
32
  /** How many verdicts are remembered at once; the least recently used go first. */
32
33
  export const DEFAULT_VERDICT_CAPACITY = 32;
33
- /** FNV-1a: dependency-free, stable across restarts, and fine for a cache key. */
34
- function fnv1a(text) {
35
- let hash = 0x811c9dc5;
36
- for (let index = 0; index < text.length; index += 1) {
37
- hash ^= text.charCodeAt(index);
38
- hash = Math.imul(hash, 0x01000193) >>> 0;
39
- }
40
- return hash.toString(16).padStart(8, '0');
34
+ /**
35
+ * Identity digest for a reviewed request.
36
+ *
37
+ * A 32-bit FNV-1a used to be enough to *look* unique in a 32-slot map, but a
38
+ * collision here reuses someone else's verdict — `npm publish --tag next`
39
+ * answering as yesterday's `npm publish`. SHA-1 truncated to 16 hex is still
40
+ * short in the map and not a birthday problem at this capacity.
41
+ */
42
+ function identityDigest(text) {
43
+ return createHash('sha1').update(text).digest('hex').slice(0, 16);
41
44
  }
42
45
  /** Whitespace-insensitive form of a command, so spacing alone cannot miss. */
43
46
  export function canonicalCommand(command) {
@@ -64,7 +67,7 @@ export function cacheableShape(input) {
64
67
  * @returns a stable, collision-resistant digest.
65
68
  */
66
69
  export function verdictKey(input) {
67
- return fnv1a([
70
+ return identityDigest([
68
71
  input.toolName,
69
72
  canonicalCommand(input.command),
70
73
  input.args ?? '',
@@ -1 +1 @@
1
- {"version":3,"file":"approval-cache.js","sourceRoot":"","sources":["../src/approval-cache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"approval-cache.js","sourceRoot":"","sources":["../src/approval-cache.ts"],"names":[],"mappings":"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"}
@@ -16,10 +16,10 @@
16
16
  * Decide the palette from the environment.
17
17
  *
18
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
19
+ * Otherwise: no colour at all when `NO_COLOR` is set or `TERM` is `dumb`
20
+ * (or empty on POSIX); truecolor when `COLORTERM` says so; 256 for a
21
21
  * `*256color` terminal and for tmux/screen (their default palette is 256 and
22
- * they translate truecolor poorly); 8 for everything else.
22
+ * they translate truecolor poorly); 8 for Linux/VT consoles and everything else.
23
23
  * @param env - the environment to read (tests pass their own).
24
24
  * @returns the palette to paint with.
25
25
  */
@@ -46,9 +46,15 @@ export function colorDepth(env = process.env, platform = process.platform) {
46
46
  if (platform !== 'win32')
47
47
  return 'none';
48
48
  }
49
- else if (term === 'dumb' || term === 'linux' || term === 'vt100' || term === 'vt220') {
49
+ else if (term === 'dumb') {
50
50
  return 'none';
51
51
  }
52
+ else if (term === 'linux' || term === 'vt100' || term === 'vt220') {
53
+ // Linux virtual consoles (tty1 on a headless box) and classic VT
54
+ // emulators advertise these names and still paint the 8/16-colour
55
+ // palette. OSC 8 hyperlinks stay off (see osc8Enabled); colour does not.
56
+ return '8';
57
+ }
52
58
  const colorTerm = (env.COLORTERM ?? '').trim().toLowerCase();
53
59
  if (colorTerm === 'truecolor' || colorTerm === '24bit')
54
60
  return 'truecolor';
@@ -1 +1 @@
1
- {"version":3,"file":"color-depth.js","sourceRoot":"","sources":["../src/color-depth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"color-depth.js","sourceRoot":"","sources":["../src/color-depth.ts"],"names":[],"mappings":"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"}