dsh-ssh-tui 0.8.1 → 0.8.2-rc.1
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/CHANGELOG.md +150 -0
- package/README.en.md +40 -8
- package/README.md +17 -1
- package/docs/release-notes-0.7.4.md +91 -0
- package/docs/release-notes-0.8.0.md +56 -0
- package/docs/release-notes-0.8.1.md +79 -0
- package/docs/release-notes-0.8.2-rc.1.md +159 -0
- package/docs/windows.md +13 -0
- package/lib/approval-state.js +148 -0
- package/lib/approval-state.js.map +1 -0
- package/lib/auth-failure.js +38 -0
- package/lib/auth-failure.js.map +1 -1
- package/lib/color-depth.js +26 -0
- package/lib/color-depth.js.map +1 -1
- package/lib/copy-text.js +30 -8
- package/lib/copy-text.js.map +1 -1
- package/lib/dialogs.js +81 -0
- package/lib/dialogs.js.map +1 -1
- package/lib/display-sock.js +138 -23
- package/lib/display-sock.js.map +1 -1
- package/lib/footer-accents.js +28 -0
- package/lib/footer-accents.js.map +1 -0
- package/lib/footer-budget.js +328 -0
- package/lib/footer-budget.js.map +1 -0
- package/lib/footer-format.js +433 -0
- package/lib/footer-format.js.map +1 -0
- package/lib/footer-layout.js +407 -0
- package/lib/footer-layout.js.map +1 -0
- package/lib/footer-meters.js +185 -0
- package/lib/footer-meters.js.map +1 -0
- package/lib/footer.js +19 -558
- package/lib/footer.js.map +1 -1
- package/lib/i18n/en.js +65 -5
- package/lib/i18n/en.js.map +1 -1
- package/lib/i18n/zh.js +67 -5
- package/lib/i18n/zh.js.map +1 -1
- package/lib/paint.js +53 -8
- package/lib/paint.js.map +1 -1
- package/lib/plan-projection.js +291 -0
- package/lib/plan-projection.js.map +1 -0
- package/lib/plan.js +50 -0
- package/lib/plan.js.map +1 -1
- package/lib/question-state.js +83 -0
- package/lib/question-state.js.map +1 -0
- package/lib/representation.js +283 -0
- package/lib/representation.js.map +1 -0
- package/lib/screen.js +105 -0
- package/lib/screen.js.map +1 -0
- package/lib/selection.js +5 -3
- package/lib/selection.js.map +1 -1
- package/lib/startup.js +49 -0
- package/lib/startup.js.map +1 -1
- package/lib/stats.js +101 -3
- package/lib/stats.js.map +1 -1
- package/lib/term-text.js +154 -55
- package/lib/term-text.js.map +1 -1
- package/lib/theme.js +20 -3
- package/lib/theme.js.map +1 -1
- package/lib/throughput.js +305 -0
- package/lib/throughput.js.map +1 -0
- package/lib/tool-present.js +57 -7
- package/lib/tool-present.js.map +1 -1
- package/lib/tui.js +3776 -1105
- package/lib/tui.js.map +1 -1
- package/lib/types/approval-state.d.ts +75 -0
- package/lib/types/auth-failure.d.ts +25 -0
- package/lib/types/color-depth.d.ts +21 -0
- package/lib/types/copy-text.d.ts +18 -1
- package/lib/types/dialogs.d.ts +111 -1
- package/lib/types/display-sock.d.ts +15 -0
- package/lib/types/footer-accents.d.ts +22 -0
- package/lib/types/footer-budget.d.ts +204 -0
- package/lib/types/footer-format.d.ts +221 -0
- package/lib/types/footer-layout.d.ts +292 -0
- package/lib/types/footer-meters.d.ts +151 -0
- package/lib/types/footer.d.ts +19 -269
- package/lib/types/paint.d.ts +48 -0
- package/lib/types/plan-projection.d.ts +162 -0
- package/lib/types/plan.d.ts +13 -0
- package/lib/types/question-state.d.ts +96 -0
- package/lib/types/representation.d.ts +498 -0
- package/lib/types/screen.d.ts +126 -0
- package/lib/types/startup.d.ts +24 -0
- package/lib/types/stats.d.ts +64 -1
- package/lib/types/term-text.d.ts +45 -1
- package/lib/types/throughput.d.ts +163 -0
- package/lib/types/tool-present.d.ts +41 -0
- package/lib/types/transcript-types.d.ts +63 -2
- package/lib/types/tui.d.ts +862 -11
- package/package.json +6 -2
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# CHANGELOG
|
|
2
|
+
|
|
3
|
+
面向用户的变更记录。每个版本的**发版说明**(含头等事、兼容矩阵与已知问题)在
|
|
4
|
+
`docs/release-notes-<version>.md`;本文件只记一行一条的变更,按版本倒序。
|
|
5
|
+
|
|
6
|
+
变更分类:**Added** / **Changed** / **Fixed** / **Removed** / **Docs** / **Internal**。
|
|
7
|
+
|
|
8
|
+
> 本文件随包发布(`package.json` → `files`),发版说明也在包里(`docs/release-notes-*.md`);
|
|
9
|
+
> 指向 `docs/decisions/`、`docs/plans/`、`docs/checkpoints.md` 的链接是**仓库内**文档,只有 GitHub 上可读。
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 0.8.2-rc.1 — 2026-10-03(候选版;本版本地已就位,未打 tag、未发布)
|
|
14
|
+
|
|
15
|
+
发版说明:[`docs/release-notes-0.8.2-rc.1.md`](release-notes-0.8.2-rc.1.md)。
|
|
16
|
+
|
|
17
|
+
B2("what deserves to exist")的六个阶段 B2.1 – B2.6 已完成并通过最终审计,本节汇总用户能看到的
|
|
18
|
+
部分。详细证据与冻结记录见 [`docs/checkpoints.md`](checkpoints.md) 与
|
|
19
|
+
[`docs/decisions/b2-architecture-decisions.md`](decisions/b2-architecture-decisions.md) §20。
|
|
20
|
+
|
|
21
|
+
### Added
|
|
22
|
+
|
|
23
|
+
- **报告是 Screen**:`/status`、`/help`、`/doctor`、`/subagents`、`/diag` 等报告不再写进转写、
|
|
24
|
+
不再改变历史窗口,翻页只重画正文区,Esc 回到原处。
|
|
25
|
+
- **计划 artifact 投影**:计划模式下的待办与评审从会话日志折叠出来;一份计划一行引用、一个 dock、
|
|
26
|
+
一个评审 Surface,resume 后身份一致。
|
|
27
|
+
- **工具卡片的审批状态**:卡片自己拥有 `waiting / approved / rejected / unknown`(以及来源:
|
|
28
|
+
live / policy / durable / inferred);不再有独立的审批行。
|
|
29
|
+
- **首启向导是 Screen**:9 步向导不再是"借工作区 composer 的对话框",中途 detach/reattach 不丢步骤,
|
|
30
|
+
也不再清空读者已经打了一半的草稿。
|
|
31
|
+
- **`npm run freeze`**:一条命令跑完 B2 的八条冻结不变量与七条退役路径扫描(CI 在 Linux 与
|
|
32
|
+
Windows 两条腿上各跑一次)。
|
|
33
|
+
- **`npm run bench`**:五个动作(流式 delta / 等待时钟 / 报告翻页 / 菜单移动 / 向导打字)的性能基线,
|
|
34
|
+
并断言这五个动作都不整屏重画。
|
|
35
|
+
|
|
36
|
+
### Changed
|
|
37
|
+
|
|
38
|
+
- **反馈分流**:控制面的确认去页脚(echo,最低优先级,直到下一次输入),警告/失败去身份行(notice),
|
|
39
|
+
只有会改变历史的事实才进转写([`docs/checkpoints.md`](checkpoints.md) B2.3b)。
|
|
40
|
+
- **`/copy` 语法**:`/copy` 或 `/copy reply` 复制模型最后一条回复(默认);`/copy highlight` 复制焦点卡片;
|
|
41
|
+
`/copy error` 复制最新的错误/诊断行。复制键保留"取不到焦点就退回回复"的语义。
|
|
42
|
+
- **工作区在方向键后的停留**:resume 进来不再从窗口中间开始滚动,直接停在最新内容。
|
|
43
|
+
|
|
44
|
+
### Fixed
|
|
45
|
+
|
|
46
|
+
- **工具卡内容有多行代码时会窜到输入区**。`bash` 的摘要就是命令行原文,所以 heredoc 会带着换行进入
|
|
47
|
+
卡片标题行;而单行裁剪器(`truncateToWidth`)保留 LF/CR,于是一"行"里含多个换行 —— 终端会因此换行,
|
|
48
|
+
而按绝对行号定位的帧随后把下面每一行都写错位,卡片内容落到输入框和页脚上,还会出现两段文字拼在同一行。
|
|
49
|
+
实测:31 行的一帧里有 11 行含裸换行;修复后为 0。
|
|
50
|
+
- **Windows Terminal 下输入法的预输入字符不再在处理中卡片那一行的最右边闪烁**。终端把 IME 预输入画在
|
|
51
|
+
光标处,而写一行会把光标留在该行文本末尾;跑一轮时实时区域每 tick 重画、且位于输入框上方,于是光标停在
|
|
52
|
+
处理中卡片上、预输入就闪在那里。现在除光标自己所在行外,每写一行都把光标交还输入框。
|
|
53
|
+
- **命令提示不再一直占着位置**:确认("已复制 412 字")与警告(命令失败)显示 6 秒后自动让位、恢复原来的
|
|
54
|
+
遥测行(提交仍会立即清掉);**"将在下个步骤生效"的排队提示例外** —— 它显示到那条消息真正被提交为止,
|
|
55
|
+
因为它是"你有话在排队"的唯一标记。
|
|
56
|
+
- **全新安装不再跳过配置向导**。前端拉起后台 Host 时永远带 `--resume=<id>`(连它刚生成的新 id 也带),
|
|
57
|
+
而首启判定把 `resume` 当成"这台机器配置过",于是**新机器永远不会自动出现向导**,也没有任何提示。
|
|
58
|
+
判定现在只看凭据存不存在。
|
|
59
|
+
- **裸 400 现在会说明它是什么**:网关拒收的是请求本身(不是 key),并给出这一族的上游记录与绕法
|
|
60
|
+
(`/effort off` 或换 messages 风味路线);**不自动重试**(实测这类失败成串出现,重发由读者决定)。
|
|
61
|
+
- 流式输出不再每个 tick 整屏重画(B2.2:live 区是投影,不是转写行)。
|
|
62
|
+
- 高亮的工具卡片不再把内容画进相邻卡片;处理中卡片遇到长内容不再折断成一行。
|
|
63
|
+
- 计划卡不再吃掉输入法的预输入字符(dock 高度不得超过工作区一半,光标行永远在屏)。
|
|
64
|
+
- resume 的历史回放不再逐帧重画(20k 事件从 51 帧 / 1.2 s 降到一次重建)。
|
|
65
|
+
- 部分命令执行后没有任何提示(页脚放不下的确认现在退到身份行显示)。
|
|
66
|
+
- 待办未收尾的提醒不再伪装成一条"计划转写引用"(B2 最终审计:`plan-row` → `plan-notice`)。
|
|
67
|
+
- **resume 进入时不再有一段黑屏(1–3 秒)**:前端先在备用屏打出"正在载入历史会话…",relay 接入时
|
|
68
|
+
宿主又写了一次 `?1049h` —— 终端已在备用屏时这个序列会**清屏**,而回放期间按 B2.4 不合成任何帧,
|
|
69
|
+
于是读者面对的是一块空白,直到日志重建完(实测 20k 事件:9.1 s 清屏、12.6 s 首帧,中间 3.5 s 全黑)。
|
|
70
|
+
这条"进屏"序列现在搭在第一帧上发出,与它要清出来的内容同一个 tick;没有东西要等的 reattach 行为不变。
|
|
71
|
+
(上一版试过相反的做法 —— 加载期间由宿主补画一行 —— 结果写进了 relay 的测速窗口,那版已回退。)
|
|
72
|
+
- **思考卡片的文字不再发白**:`reasoning` 角色是 `2;3`,只有属性 —— "暗"完全靠 faint,不实现 faint 的
|
|
73
|
+
终端(报告的 256 色终端)就退回**默认前景色**,与旁边的回复一样亮。四个调色板现在各自给出 muted 颜色
|
|
74
|
+
(default `90`,catppuccin / gruvbox 用各自 `md-muted` 的色,mono 仍然只用属性),属性保留给支持的终端。
|
|
75
|
+
- **状态行不再把"绘制节奏"当成"链路延迟"**:终端不回 `CSI 6n` 时(现场 `/diag`:Linux + xterm-256color
|
|
76
|
+
+ SSH,`探测 未知`),这一格显示的是**回退的绘制节奏** 160ms,读者无法分辨它和真实延迟。现在改为
|
|
77
|
+
`SSH ○○○○ 未测` / `n/a`;测到过的链路照旧显示测量值,绘制节奏仍留在 `/diag` 那一行(写明是"绘制")。
|
|
78
|
+
- **`q` / `Q` 真的能关掉报告**:`inspectClosesOn` 一直声明接受它们("全屏报告理应响应 q"),
|
|
79
|
+
但可打印字符的提示分支在它之前返回,于是这两个键只会打印"这是报告视图,按 Esc 返回"。
|
|
80
|
+
|
|
81
|
+
### Docs
|
|
82
|
+
|
|
83
|
+
- [`docs/release.md`](release.md) 新增"发布前人工门槛":Windows 实机清单、fresh-home 首启探针命令、
|
|
84
|
+
以及 `npm run freeze` / `npm run bench` 两条发版自检。
|
|
85
|
+
- [`docs/decisions/b2-architecture-decisions.md`](decisions/b2-architecture-decisions.md) §20 记录 B2 冻结:
|
|
86
|
+
八条不变量、七条退役路径、以及"表示的分类必须与它包裹的行一致"这条规则。
|
|
87
|
+
|
|
88
|
+
### Internal
|
|
89
|
+
|
|
90
|
+
- **链路验收补齐"带历史的 resume"**:`scripts/tui-rtt-probe.mjs` 现在有两个阶段——新会话(先慢后快的
|
|
91
|
+
链路)与**带历史的 resume**(探针自己写一份 20k 事件的持久化日志,回放期间不合成帧)。后者同时断言
|
|
92
|
+
三件事:读者画面上出现过加载行之后**不得再变空**、转写落地、chip 落在真实测量值而不是 `○○○○ 160ms`
|
|
93
|
+
占位。两条断言都做过变异校验(改回"接入即写"报 4 秒黑屏;关掉 RTT 应用报 chip 停在占位)。
|
|
94
|
+
- **`verify-batch.mjs` 不再把 SKIP 说成 PASS**:有步骤跳过时收尾为 `RESULT: INCOMPLETE`(exit 2),
|
|
95
|
+
与 `FAIL`(exit 1)分开;`link` 已加入验收步骤表(`--only link` 可单跑)。
|
|
96
|
+
- 表示管线:每条转写行都带 durability / class / destination;审计对未分类行、未知 destination、
|
|
97
|
+
live 源行与重复 primary 表示各自计数,四个数字都必须为 0。
|
|
98
|
+
- 退役并在 CI 上禁止复活:`dedicated` Surface 角色、onboarding 的对话框渲染路径、
|
|
99
|
+
`upsertPlanRow`(计划行的第二个写入者)、`ask_user_question` 的通用工具卡。
|
|
100
|
+
- **Windows 实机轮(2026-10-03)修掉五处探针缺陷,产品代码未改**:`verify-batch` 在 Windows 上
|
|
101
|
+
因 `spawn('npm')` 必然 `ENOENT`(改用 `$npm_execpath`);`tui-route-probe` 的 `/tmp` 字面量
|
|
102
|
+
(改 `os.tmpdir()`)与目录符号链接(Windows 改 junction);`footer-windows-probe` 补了**未测量
|
|
103
|
+
链路**档案并逐格断言时长槽(`未测` 而非 `160ms`);`tui-mock-probe` 的鼠标坐标改由真实终端网格
|
|
104
|
+
给出(此前从字节流解析 `ESC[<row>;1H`,ConPTY 下拼出伪行,拖选看起来偏了两格——**是探针缺陷,
|
|
105
|
+
不是选择缺陷**)。
|
|
106
|
+
- **新增 `scripts/tui-unmeasured-probe.mjs`**(管道父进程,进 `verify-batch` 与 CI):ConPTY 自己回
|
|
107
|
+
`CSI 6n`,所以"终端不回 DSR"这一格在 Windows 本机摸不到,而这个形状正是读者报过两次的那个。两条腿
|
|
108
|
+
分别断言 `SSH ○○○○ 未测`(绘制节奏只留在 `/diag`)与 `SSH ●●●● <n>ms`。
|
|
109
|
+
- **ConPTY 盲区改为显式 `SKIP:`**(不再是"读错就判红"):`tui-cut-probe` 的静默半场、
|
|
110
|
+
`tui-rtt-probe` 的慢链路半场、`tui-setup-probe`/`--line-mode` 的字节形状检查。SKIP 仍收尾
|
|
111
|
+
`INCOMPLETE`。真实 home 未配置时(会进配置向导)同样 `SKIP:` 而不是超时报红;
|
|
112
|
+
`verify-batch --home <dir>` 可把读 profile 的三步指向自建 home。
|
|
113
|
+
|
|
114
|
+
### 已知问题
|
|
115
|
+
|
|
116
|
+
- Windows / ConPTY **实机人工验收已完成**(2026-10-03,维护者逐条走过 12 项清单,结论见
|
|
117
|
+
[`docs/checkpoints.md`](checkpoints.md)「Windows 实机轮」):可自动化的部分由 `verify-batch --home
|
|
118
|
+
<dir>` 覆盖(12 PASS · 2 SKIP · 0 FAIL),**没有自动化、只能人眼的两目(输入法组合、多行中文粘贴)
|
|
119
|
+
已确认通过**。两处 `SKIP` 是覆盖边界、不是通过:ConPTY 自己回 `CSI 6n`,"慢链路"与"静默但没断连"
|
|
120
|
+
这两个形状它扮演不了(这两个形状在 Linux 腿上真跑)。
|
|
121
|
+
- fresh-home 首启有两条探针覆盖(`scripts/tui-setup-probe.mjs` 断言向导自动出现 + 第二次启动不再出现;
|
|
122
|
+
`scripts/probe-onboarding.mjs` 供工作区探针识别"这是首启"并 `SKIP:` 而不是误报),命令在
|
|
123
|
+
[`docs/release.md`](release.md)。只读 pnpm store 的沙箱建不出 home,那是环境限制,不是覆盖缺口。
|
|
124
|
+
- ~~`scripts/tui-drop-probe.mjs` 约 1/7 概率因自身的 `/status` 重试竞态误报~~ —— **本版已修**:
|
|
125
|
+
改为一次请求在飞、按每次请求的输出判定、并按"当前是否真有 Screen"决定关闭,连跑 20 次无失败。
|
|
126
|
+
- 打包:`npm pack --dry-run` 实测 **243 个文件 / 1.4 MB(tarball)/ 解包 4.2 MB**,CHANGELOG 随包发布;
|
|
127
|
+
无凭据、无 home、无 sqlite、无 scratch。
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## 0.8.1 — 2026-09-30(`latest` + `next`)
|
|
132
|
+
|
|
133
|
+
发版说明:[`docs/release-notes-0.8.1.md`](release-notes-0.8.1.md)。
|
|
134
|
+
|
|
135
|
+
### Fixed
|
|
136
|
+
|
|
137
|
+
- 没有终端的进程(桌面版 Electron-as-Node、管道、cron)不再抛错退出,而是保持惰性:不取锁、
|
|
138
|
+
不装定时器、不查更新,记一行说明,退出码 0。
|
|
139
|
+
|
|
140
|
+
### Added
|
|
141
|
+
|
|
142
|
+
- `DSH_TUI_DISPLAY=stdio`(或 `--display stdio`):宿主自带终端控件时可以把 TUI 当子进程用,
|
|
143
|
+
画面走 stdout、按键走 stdin、尺寸由 `CSI 8 ; rows ; cols t` 报告。
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## 0.8.0 — 2026-09-29(`next`,随后提升为 `latest`)
|
|
148
|
+
|
|
149
|
+
发版说明:[`docs/release-notes-0.8.0.md`](release-notes-0.8.0.md)。基线切到上游 `0.2.0-rc` 线
|
|
150
|
+
(桌面版 Harness 的基线),兼容窗口与 CI 腿随之上移。
|
package/README.en.md
CHANGED
|
@@ -47,7 +47,7 @@ dsh --profile tui
|
|
|
47
47
|
Current `dsh` requires `--profile` (`dsh plugin add …` errors without it).
|
|
48
48
|
Swap `tui` for another profile name.
|
|
49
49
|
|
|
50
|
-
**
|
|
50
|
+
**Which host line?** `0.8.1` is `latest` and supports the `0.2.0-rc` line (the desktop harness's baseline) as well as `0.1.7-rc`; older releases are refused by the launcher's version check. **0.1.5 and older hosts are no longer supported as of 0.8.0.**
|
|
51
51
|
|
|
52
52
|
**Updates must use `@latest`.** `dsh plugin` forwards the rest of the line to
|
|
53
53
|
pnpm in the profile directory. A bare `add dsh-ssh-tui` keeps the version
|
|
@@ -92,8 +92,13 @@ OSC 52 into your local clipboard; a tool card still expands on click; an SSH ses
|
|
|
92
92
|
into the local terminal and no longer warns that it cannot) · a reply is a selectable card too:
|
|
93
93
|
one `↑` on an empty input lands on the newest reply-or-card (marked `▶`, in screen order;
|
|
94
94
|
`Alt+4` selects the latest reply), `/copy` then takes that one as written rather than the
|
|
95
|
-
wrapped screen text, and `Enter` opens it full-screen · the
|
|
96
|
-
|
|
95
|
+
wrapped screen text, and `Enter` opens it full-screen · the status row answers five questions
|
|
96
|
+
in one order — link health, what is running, tokens per second, quota left, context used — and
|
|
97
|
+
degrades by dropping cells as the terminal narrows (`⚠` still opens `/doctor`; the install
|
|
98
|
+
warning outranks everything), and the row under it is *ordered* by priority and cut from the
|
|
99
|
+
right — `dir:… · search n/m · queued n · sub:…`, closed by `OpenCode-GO` or
|
|
100
|
+
`CommandCode-GOAT` on those two subscriptions, so a narrow terminal loses the least
|
|
101
|
+
load-bearing part first · the quota meter is on screen from the first frame and names
|
|
97
102
|
its window (`5Hr`/`1Wk`/`1Mo`, smallest window by default, `?%` with a 15-second retry until
|
|
98
103
|
a reading arrives) · `/mode` groups presets and filters with `/` · the compact view names
|
|
99
104
|
every changed file · tool diffs are line-level, emphasise only what changed, and go
|
|
@@ -117,6 +122,19 @@ suite and the real-PTY probes — not "no errors, so it probably works". Many te
|
|
|
117
122
|
stranded on the 0.1.5 line; few terminal UIs install on the 0.2.0-rc line at all, which is why the window is
|
|
118
123
|
maintained this tightly.
|
|
119
124
|
|
|
125
|
+
## A warning before the Desktop section
|
|
126
|
+
|
|
127
|
+
> ⚠ **Do not add this plugin to a Desktop (or `web`) profile.** It is not "installed but
|
|
128
|
+
> idle" — it crashes the application. The desktop host's command line belongs to the web
|
|
129
|
+
> app (it passes `--no-open`), and dsh does not arbitrate: every app plugin parses the
|
|
130
|
+
> same argv with *its own* grammar, and an unknown flag exits the process. From 0.8.2 the
|
|
131
|
+
> plugin's startup row declines a command line that is not its own (the desktop launcher,
|
|
132
|
+
> or a web app that has already taken over); 0.8.1 and earlier exited 1 with
|
|
133
|
+
> `error: unknown option '--no-open'`, and the app reported
|
|
134
|
+
> `dsh desktop host exited with 1` and died. If it is already in there, remove the four
|
|
135
|
+
> `ssh-tui-*` rows from `profiles\desktop\cordis.patch.yml` (or restore that file from a
|
|
136
|
+
> backup) and the application works again.
|
|
137
|
+
|
|
120
138
|
## Desktop Harness users, read this first
|
|
121
139
|
|
|
122
140
|
**The official desktop app (<https://www.deepseek.com/harness/>) does not need this plugin** — use its own UI
|
|
@@ -463,11 +481,14 @@ model, and sends unrecognized shapes (`npm publish`, interpreter `-c`/`-e`)
|
|
|
463
481
|
to the subagent-model reviewer (user message + args/reason/sandbox; English
|
|
464
482
|
UI uses the English reviewer; `authorization=yes` required). `/approval
|
|
465
483
|
status` also reports how many AI reviews ran this session.
|
|
466
|
-
The
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
`/status` prints the same figures
|
|
484
|
+
The status row shows context occupancy as a capacity meter over the routed
|
|
485
|
+
model's context window (DSH `contextPressure`, provider-agnostic); the bands are
|
|
486
|
+
the harness's own pressure levels, so 80% turns the meter yellow and 95% red —
|
|
487
|
+
exactly where compaction starts warning.
|
|
488
|
+
`/status` prints the same figures, plus everything the row gave up: turns,
|
|
489
|
+
steps, input/output/cached tokens, the session total (with the accounting it
|
|
490
|
+
came from), model time, tool time, cache hit and the exact last-step and
|
|
491
|
+
running `tokens/sec`. Warnings fire near 80%/95%; idle
|
|
471
492
|
auto-`/compact` starts near 72% so recovery is not left to a mid-turn
|
|
472
493
|
overflow. `/compact` shows a spinning compact card and footer until it
|
|
473
494
|
finishes, then the tokens recovered. `Tab` completes, `Enter` runs.
|
|
@@ -891,8 +912,19 @@ src/i18n/ zh/en UI catalogs
|
|
|
891
912
|
```sh
|
|
892
913
|
npm install
|
|
893
914
|
npm run build
|
|
915
|
+
npm test
|
|
894
916
|
```
|
|
895
917
|
|
|
918
|
+
Two commands that do not ask "is anything broken" but "is anything still held":
|
|
919
|
+
|
|
920
|
+
```sh
|
|
921
|
+
npm run freeze # the B2 freeze: eight invariants + seven retired paths (unclassified / live source rows / …)
|
|
922
|
+
npm run bench # the perf baseline: stream / wait / report paging / menu move / wizard typing, all incremental
|
|
923
|
+
```
|
|
924
|
+
|
|
925
|
+
The release rules — including the two things CI cannot cover (a Windows machine, and a
|
|
926
|
+
first-run home) — are in [docs/release.md](docs/release.md) (Chinese).
|
|
927
|
+
|
|
896
928
|
## Privacy
|
|
897
929
|
|
|
898
930
|
All sessions, credentials, and settings live under `$DSH_HOME` (default
|
package/README.md
CHANGED
|
@@ -196,7 +196,7 @@ docs/screenshots/slow-link.json
|
|
|
196
196
|
- reasoning 折叠与实时查看;
|
|
197
197
|
- plan / approval / ask-user-question;
|
|
198
198
|
- 子代理独立状态卡;
|
|
199
|
-
-
|
|
199
|
+
- 状态行按一眼扫读的顺序回答五个问题:链路健康、正在做什么、tok/s、额度余量、上下文占用(宽度不够时按优先级逐项收敛,窄屏更简洁而不是更拥挤);轮数 / 步数 / 模型时间 / 工具时间 / 缓存命中移出常驻行,仍可在 `/status` 与 `/diag` 查看;
|
|
200
200
|
- `/model`、`/mode`、`/submodel` 等 Harness 能力直接进入终端。
|
|
201
201
|
|
|
202
202
|
### Session continuity
|
|
@@ -295,6 +295,14 @@ dsh --profile tui
|
|
|
295
295
|
|
|
296
296
|
## 官方 Harness Desktop
|
|
297
297
|
|
|
298
|
+
> ⚠ **不要把本插件加进 Desktop(或 `web`)profile。** 这不是"装了没用",是**会让应用崩**:
|
|
299
|
+
> Desktop 的宿主命令行走的是 web app 的语法(它传 `--no-open`),而命令行在 dsh 里没有仲裁——profile 里每个 app
|
|
300
|
+
> 都会用**自己的**语法解析同一份 argv,遇到不认识的旗标直接退出进程。0.8.2 起本插件的 startup 行会在识别到
|
|
301
|
+
> "这条命令行不属于我"(Desktop 启动器,或 web app 已接管)时**不认领**它;0.8.1 及更早则会以
|
|
302
|
+
> `error: unknown option '--no-open'` 让宿主退出 1,应用随即报 `dsh desktop host exited with 1` 并崩。
|
|
303
|
+
> 万一已经加进去了:从 `profiles\desktop\cordis.patch.yml` 里删掉 `ssh-tui-startup` / `ssh-tui` /
|
|
304
|
+
> `ssh-tui-routes` / `ssh-tui-subagent` 四行(或从备份恢复该文件),应用立刻恢复。
|
|
305
|
+
|
|
298
306
|
官方 Desktop 是 GUI 应用,本身**不需要这个 TUI**。
|
|
299
307
|
|
|
300
308
|
Desktop 内部的 Harness Host 和真正的 console runtime 也不是一回事。
|
|
@@ -498,6 +506,13 @@ npm run build
|
|
|
498
506
|
npm test
|
|
499
507
|
```
|
|
500
508
|
|
|
509
|
+
两条不跑"有没有坏"、而跑"有没有守住"的命令:
|
|
510
|
+
|
|
511
|
+
```bash
|
|
512
|
+
npm run freeze # B2 冻结:八条不变量 + 七条退役路径(unclassified / live source rows / …)
|
|
513
|
+
npm run bench # 性能基线:流式 / 等待 / 报告翻页 / 菜单移动 / 向导打字,并断言都不整屏重画
|
|
514
|
+
```
|
|
515
|
+
|
|
501
516
|
真实终端、断线与平台行为由额外 probe 覆盖。
|
|
502
517
|
|
|
503
518
|
项目的目标不是让模拟测试代替终端,而是让:
|
|
@@ -522,6 +537,7 @@ cross-platform CI
|
|
|
522
537
|
| [remote-ops.md](docs/remote-ops.md) | SSH、断线、attach、Host 生命周期 |
|
|
523
538
|
| [desktop.md](docs/desktop.md) | 官方 Harness Desktop / no-TTY Host |
|
|
524
539
|
| [platform.md](docs/platform.md) | 平台生命周期设计与维护者约束 |
|
|
540
|
+
| [release.md](docs/release.md) | 发版流程(硬性规则)与发布前人工门槛 |
|
|
525
541
|
| [terminals.md](docs/terminals.md) | Terminal capability 与兼容矩阵 |
|
|
526
542
|
| [upstream-desktop-report.md](docs/upstream-desktop-report.md) | 可复现的上游 Desktop 问题记录 |
|
|
527
543
|
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# 0.7.4 发版说明(草稿)
|
|
2
|
+
|
|
3
|
+
> **状态:未发版。** 版本号、tag、GitHub Release、npm 都还没动(`docs/release.md` 第 1 条)。
|
|
4
|
+
> 本文件是发版时要粘进 GitHub Release 的正文草稿 + 当次核对清单,写完就不必临场回想。
|
|
5
|
+
> 上一次发版:**0.7.3**(2026-09-24,commit `e505768` / tag `v0.7.3` / npm `latest`+`next`)。
|
|
6
|
+
|
|
7
|
+
## 头等事
|
|
8
|
+
|
|
9
|
+
这一版是「把已经做出来的东西做对」:0.7.3 之后落的六个功能各自被真机与对抗式审查拧了一遍,
|
|
10
|
+
修掉了 8 个实际缺陷(含两个只有读代码才看得见的:现场思考卡被挤出焦点环、覆盖层里的复制
|
|
11
|
+
拿到的是另一份正文)。行为上最明显的变化是**回复变成了可选中的卡片**。
|
|
12
|
+
|
|
13
|
+
## 回复可以选中、可以复制(本版主线)
|
|
14
|
+
|
|
15
|
+
`/copy` 取的是"被选中的那一行",而可选列表里**从来没有回复**——所以只要按过一次 ↑/↓ 选中
|
|
16
|
+
任何卡片,`/copy` 就再也拿不到回复,最新回复只是"没有选中时"的兜底。现在:
|
|
17
|
+
|
|
18
|
+
- 空输入 `↑`/`↓` 在**回复与卡片**之间按屏幕顺序走,选中的那一行带 `▶` 标记;`Alt+4` 直接选中最新回复。
|
|
19
|
+
- `/copy`(或 `Ctrl+Shift+C`)复制的是**选中的那一条的原文**——不是折行后的屏幕文本;
|
|
20
|
+
复制后保留选中,连按两次拿到的是同一条。
|
|
21
|
+
- 在选中的回复上按 `Enter`:打开「回复全文」(可滚动、`Esc` 返回),长回复里的表格与代码块
|
|
22
|
+
不再被窗口宽度切碎。**覆盖层里也能复制**,取的是屏幕上那份正文,并在覆盖层底部回显「已复制 …」。
|
|
23
|
+
- 工具卡 / 子代理 / 改动卡的「全文」覆盖层里,复制键取的同样是**屏幕上那份正文**(工具全文、那份 diff、
|
|
24
|
+
子代理日志),不再是卡片摘要。
|
|
25
|
+
- **拖选**照旧:被选中回复第一行前面的 `▶` 是装饰,拖过它不会把标记复制进去。
|
|
26
|
+
|
|
27
|
+
## 底栏与链路
|
|
28
|
+
|
|
29
|
+
- 链路质量**在会话运行中持续重测**并按中位数读数:进会话那一瞬间的网络抖动不再把整场会话钉在最低档
|
|
30
|
+
(绘制节奏与每帧字节预算都跟着这档走)。
|
|
31
|
+
- 选择器把「可接入 / 已占用」两个词固定下来,并且**在首帧之前**就把"已经挂掉的窗口"判完——列表不会先
|
|
32
|
+
显示「已占用」再改口。判定走一次真实往返(光标探针),因为断掉的 SSH 链路会让 launcher 还连着显示通道。
|
|
33
|
+
- 接管(把别人的窗口接过来)现在**要确认**,`Esc` 是取消而不是退出。
|
|
34
|
+
|
|
35
|
+
## 空回合不再被误读为完成
|
|
36
|
+
|
|
37
|
+
上游网关偶尔只回思考、`finish_reason: stop`、正文为零(实测某网关 10/35 个回合如此),
|
|
38
|
+
宿主如实组装成"只有思考的助手消息",状态栏显示完成/空闲。现在转录里会补一行明确提示
|
|
39
|
+
(含 `finish_reason: stop` 与"按 Enter 继续"),回放/中断/报错的回合不提示。
|
|
40
|
+
|
|
41
|
+
## 上游兼容
|
|
42
|
+
|
|
43
|
+
- `dsh` 声明窗口:`>=0.1.7-rc.1 <0.1.8`(`next`)与本条线并行;`0.1.7-rc.2` 已按完整流程验过并声明
|
|
44
|
+
`compatible`(干净树安装、`tsc` 0 错、套件全绿、六个真 PTY 探针全过),CI 里单独一条腿。
|
|
45
|
+
- CI 现有 5 条腿:`0.1.7-rc.1`(默认,提交的 manifest)、`0.1.7-rc.2`、`0.1.5-rc.3`、`0.1.5-rc.1`
|
|
46
|
+
(只跑类型与单元)、`test-windows`(ConPTY 真机)。默认腿新增一条 **Reply copy probe**:真 PTY 跑一轮
|
|
47
|
+
脚本化模型,断言拖选复制、`/find` 高亮、以及**选中回复后按复制键拿到原文**。
|
|
48
|
+
|
|
49
|
+
## 发版核对清单(执行时逐条打勾)
|
|
50
|
+
|
|
51
|
+
```sh
|
|
52
|
+
# 0. 版本号(改这一处,然后重新生成锁)
|
|
53
|
+
# package.json "version": 0.7.4
|
|
54
|
+
npm install --package-lock-only --cache <可写目录> # 只重算锁,不动 node_modules
|
|
55
|
+
|
|
56
|
+
# 1. 门禁(本地)
|
|
57
|
+
npx tsc --noEmit -p tsconfig.json
|
|
58
|
+
node --test "tests/*.test.mjs" # 期望:1009 pass / 0 fail / 4 skip
|
|
59
|
+
node scripts/tui-mock-probe.mjs # 脚本化一轮:拖选 + 选中回复复制 + /find
|
|
60
|
+
node scripts/tui-mock-probe.mjs --busy # 窗口中途关闭
|
|
61
|
+
node scripts/probe-home.mjs --probe # boot/resize/diag/doctor/copy/preset/exit
|
|
62
|
+
node scripts/probe-home.mjs --probe --script tui-term-probe.mjs
|
|
63
|
+
node scripts/probe-home.mjs --probe --script tui-cut-probe.mjs
|
|
64
|
+
node scripts/probe-home.mjs --probe --script tui-rtt-probe.mjs
|
|
65
|
+
node scripts/probe-home.mjs --probe --script tui-drop-probe.mjs
|
|
66
|
+
npm pack --dry-run # 189 个文件、无 tgz 落盘
|
|
67
|
+
|
|
68
|
+
# 2. GitHub(先)
|
|
69
|
+
git commit -am "Release 0.7.4"
|
|
70
|
+
git push origin main
|
|
71
|
+
git tag -a v0.7.4 -m "0.7.4" && git push origin v0.7.4
|
|
72
|
+
# → 建 GitHub Release(正文用本文件"头等事"起的那几段 + 当日热度基线)
|
|
73
|
+
# → 等 CI 五条腿全 success(tag 与 main 都要看)
|
|
74
|
+
|
|
75
|
+
# 3. npm(CI 全绿之后;token 需先刷新)
|
|
76
|
+
npm whoami --registry https://registry.npmjs.org/ # 必须是登录态,否则不要往下走
|
|
77
|
+
npm publish --registry https://registry.npmjs.org/ --tag latest
|
|
78
|
+
npm dist-tag add dsh-ssh-tui@0.7.4 next # 0.7.3 时 latest 与 next 同值
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**注意**:本机 `~/.npmrc` 的默认 registry 是 npmmirror,发布必须显式
|
|
82
|
+
`--registry=https://registry.npmjs.org/`;`_authToken` 目前是过期状态(`npm whoami` → `E401` /
|
|
83
|
+
`ENEEDAUTH`),刷新之前不要执行第 3 步。
|
|
84
|
+
|
|
85
|
+
## 已知限制(写进 Release)
|
|
86
|
+
|
|
87
|
+
- 真实 Windows 上仍只能人工确认的两条:宿主控制台窗口确实隐藏;`%USERPROFILE%` 与 `$HOME` 不一致的账户行为。
|
|
88
|
+
- 纯问答会话(尚无任何卡片)或刚 `/clear` 时,空输入 `↑` 仍是**历史召回**而不是选中回复——这是刻意保留的;
|
|
89
|
+
那种会话用 `Alt+4` / `Ctrl+N` / `Ctrl+P` 选回复。选中后 `Enter` 正常打开全文。
|
|
90
|
+
- 把 `Ctrl+Shift+C` 折叠成 `Ctrl+C` 的老终端上,覆盖层里那个键等于关闭;请用 `ssh-tui.keys` 改绑 `copy`
|
|
91
|
+
(改绑后的键在覆盖层内同样生效)。
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# 0.8.0 发版说明
|
|
2
|
+
|
|
3
|
+
> **发布方式:只上 `next`,`latest` 保持 0.7.4。** 计划 2026-10-01 再把 `0.8.0` 提升为 `latest`。
|
|
4
|
+
> 上一次发版:**0.7.4**(2026-09-29,npm `latest` + `next`)。
|
|
5
|
+
|
|
6
|
+
## 头等事:跟上宿主的 0.2.0-rc 线,同时摘掉 0.1.5
|
|
7
|
+
|
|
8
|
+
上游把 `next` 指向 **0.2.0-rc.1**。这条线保留了 0.1.7 引入的两处结构(设置表单由 loader entry 自己的
|
|
9
|
+
`Config` 投影、终端 profile 在进程级组合代理),所以**插件源代码一行没改**就跑了:类型面 0 错、七条真机探针
|
|
10
|
+
全过。真正需要改的是三处"宿主代际判定"——它们原来用 `0.1.7` 前缀判断,把 `0.2.x` 读成了旧代,会让
|
|
11
|
+
profile 挂错行。现在统一读一个按版本元组比较的共用规则。
|
|
12
|
+
|
|
13
|
+
**0.1.5 这条线不再支持。** 还在 0.1.5 的用户会从商店读到明确的 `incompatible`(而不是沉默),
|
|
14
|
+
请先升级宿主到 `0.1.7-rc` 或 `0.2.0-rc` 再装这一版。
|
|
15
|
+
|
|
16
|
+
## 401/403 不再混为一谈,并可自动重试一次
|
|
17
|
+
|
|
18
|
+
宿主的 `llm/retry` **不重试 AUTH 类错误**,所以一次**提供商侧**的瞬时 403 会直接终结整轮,而屏幕上只有
|
|
19
|
+
`permission_error` 一行。实测过一次:同一会话 37 轮在同一条路由上成功,失败只有间隔 45 秒的两次,
|
|
20
|
+
随后同一把 key 打同一模型 200。
|
|
21
|
+
|
|
22
|
+
- 失败时补一行来源判断:`提供商拒绝了请求(HTTP 403)…{ENV} 已配置`(意思是**别改 key,重发即可**)
|
|
23
|
+
或 `本机没有可用的 {ENV}`(意思是先去配)。判据是真的解析一次凭据,不是猜。
|
|
24
|
+
- `/retryauth on|off`(**默认关**):只在"提供商拒绝 + 本机有凭据 + 这一轮还没重试过"时自动重发上一条
|
|
25
|
+
消息**一次**。默认关是因为重试会把整段上下文再发一遍,长会话很贵。
|
|
26
|
+
- 排查三步(三种错误信封、两条文件检查、一条直连 `curl`)写进 `docs/remote-ops.md` §4.8;
|
|
27
|
+
附带一个会误导人的坑:`GET /provider/v1/models` 是公开端点,带不带 key 都 200,不能用它验鉴权。
|
|
28
|
+
|
|
29
|
+
## 上游兼容
|
|
30
|
+
|
|
31
|
+
| 通道 | 版本 | 表态 |
|
|
32
|
+
|---|---|---|
|
|
33
|
+
| `latest` | `0.1.7-rc.2` | `compatible`:完整 CI 腿 |
|
|
34
|
+
| `next` | `0.2.0-rc.1` | `compatible`:本版默认线(干净树安装、`tsc` 0 错、套件 1021 通过 / 0 失败、七条真机探针) |
|
|
35
|
+
| 0.1.7 线 | `0.1.7-rc.1` | `compatible`:typecheck + 套件 |
|
|
36
|
+
| 已摘 | `0.1.3-alpha.*` / `0.1.5-*` | **`incompatible`**(明确表态,范围不再收;请求升级到 `0.1.7-rc` 或 `0.2.0-rc`) |
|
|
37
|
+
|
|
38
|
+
CI 四条腿:`0.2.0-rc.1`(默认,6 条探针)、`0.1.7-rc.2`(完整)、`0.1.7-rc.1`(类型+套件)、Windows(ConPTY 真机)。
|
|
39
|
+
验证细节见 [`docs/upstream-0.2.0.md`](upstream-0.2.0.md)。
|
|
40
|
+
|
|
41
|
+
## 安装 / 升级
|
|
42
|
+
|
|
43
|
+
```sh
|
|
44
|
+
dsh plugin --profile tui add dsh-ssh-tui@next # 0.8.0(宿主 0.2.0-rc 或 0.1.7-rc 都可以)
|
|
45
|
+
dsh plugin --profile tui add dsh-ssh-tui@latest # 0.7.4(仍是默认;10-01 之后 latest 会变成 0.8.0)
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
装完退出再启动。`/status` 可确认当前版本;装不上先看 `/doctor`。
|
|
49
|
+
|
|
50
|
+
## 已知限制
|
|
51
|
+
|
|
52
|
+
- **0.1.5 及更早不再支持**(见上)。
|
|
53
|
+
- 真实 Windows 上仍只能人工确认的两条:宿主那个控制台窗口确实是隐藏的;`%USERPROFILE%` 与 `$HOME`
|
|
54
|
+
不一致的账户行为。
|
|
55
|
+
- `/retryauth` 的重试会把整段上下文再发一遍(长会话成本由你决定是否开启);它只对"提供商侧鉴权失败"
|
|
56
|
+
生效,本机缺凭据时不会重试。
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# 0.8.1 发版说明
|
|
2
|
+
|
|
3
|
+
> **发布方式:`latest` + `next`。** 上一次发版:**0.8.0**(2026-09-29,`next`,随后提前提升为 `latest`)。
|
|
4
|
+
> 这是一版**修稳定性**的补丁:桌面版装上它不会再把宿主带崩;终端侧的几处"残留"也一并清掉。
|
|
5
|
+
|
|
6
|
+
## 头等事:桌面版装了**不会再弄坏宿主**
|
|
7
|
+
|
|
8
|
+
0.8.0 在没有终端的进程里是**抛错**退出插件的。桌面版 Harness 的启动器是 Electron-as-Node(GUI 子系统,
|
|
9
|
+
没有 console),于是插件管理把它显示成"1 entry did not activate / 插件失败",在桌面版上还会把 GUI 带崩。
|
|
10
|
+
|
|
11
|
+
0.8.1 起按"能不能画"分四种情形,只有真能画时才挂载:
|
|
12
|
+
|
|
13
|
+
| 情形 | 行为 |
|
|
14
|
+
|---|---|
|
|
15
|
+
| 本进程就是分离的 TUI Host | 照常服务(它的终端在随后接入的那个窗口里) |
|
|
16
|
+
| stdin 与 stdout 都是 TTY | 照常挂载 TUI |
|
|
17
|
+
| 桌面版启动器(Electron-as-Node / `app.asar` / `DeepSeek Harness.exe`) | **不挂载任何东西**(不取锁、不装定时器、不查更新),记**一行**说明,措辞是"此处不启用"而不是报错 |
|
|
18
|
+
| 其它没有终端的情形(管道 `… \| tee`、cron、服务) | 同上,文案换成"没有终端"。**退出码 0** |
|
|
19
|
+
|
|
20
|
+
需要"没终端就报错"的场合(脚本断言某个终端 profile 真能起来)在 profile 行加 `requireTerminal: true`
|
|
21
|
+
——那是唯一会抛错的路径,而且只在显式要求时。桌面版用户不需要这个插件:用应用本身或 `dsh web`;
|
|
22
|
+
想在终端里用它,用 npm 安装的 CLI(`npm i -g @deepseek-ai/dsh`)在真实终端/SSH 里跑 `dsh --profile tui`。
|
|
23
|
+
|
|
24
|
+
## 新增:宿主自带终端控件时,可以把这个 TUI 当子进程用
|
|
25
|
+
|
|
26
|
+
桌面版自己**不需要**它,但"宿主会开终端控件"(PTY 面板、xterm.js、GUI 里嵌的终端)是另一条路:
|
|
27
|
+
声明 `DSH_TUI_DISPLAY=stdio`(或 `--display stdio`),插件就不再要求 TTY——画面走 stdout、按键走 stdin、
|
|
28
|
+
面板尺寸由宿主用 `CSI 8 ; rows ; cols t` 报告(管道没有 `resize` 事件也没有 `SIGWINCH`)。协议、父进程
|
|
29
|
+
必须做的五件事、Node 最小示例与限制写进 [`display-mode.md`](display-mode.md)(这一版起随包发布)。
|
|
30
|
+
|
|
31
|
+
## 终端侧修掉的三处"残留"
|
|
32
|
+
|
|
33
|
+
1. **会卡住的"处理中"卡片**:渲染缓存把"活尾巴"(等待卡、流式缓冲、还没有回复的突发摘要)收进了
|
|
34
|
+
最后一行的缓存条目,于是每一帧都把那一份**冻结在旧秒数**的副本重放出来。真实会话里攒到过四条
|
|
35
|
+
(0s / 12s / 19s / 30s)夹在工具卡中间,`0s` 那条永远不动。现在缓存条目只包含它自己那行画的内容。
|
|
36
|
+
2. **退出后提示符旁的 `①—…“”·•Ⅰ` 与 `^[[25;1R`**:歧义字形探针打印的那行自己没有擦(调用方可能一帧
|
|
37
|
+
都没画),而它的光标回答要一个往返才回来——慢链路上那时终端已经交还给 shell,tty 就把回答回显成了
|
|
38
|
+
文本。现在探针自己擦行、归还终端前多留一个往返吞掉回答、并且不再对已经交还的终端探测;探针期间
|
|
39
|
+
暂存 Host 的输出,避免擦除打在刚画好的帧上。
|
|
40
|
+
3. **极简视图**:单文件编辑卡不再重复自己的标题与 diffstat;失败的工具行补回状态球(`●`),与其它卡片行一致。
|
|
41
|
+
|
|
42
|
+
## 性能与渲染(0.8.0 之后陆续落地)
|
|
43
|
+
|
|
44
|
+
- 每行渲染缓存 + 逐行脏比较:5000 行会话的整帧重画从约 1050ms 降到约 22ms,按键帧从约 1040ms 降到约 13ms;
|
|
45
|
+
多行帧用 `DEC 2026` 同步刷新,避免慢链路上一行行"落下来"的撕裂(这就是本插件存在的意义的那个不闪屏)。
|
|
46
|
+
- 歧义宽度字形(`①`–`⑩`、`—`、`“”`、CJK 标点…)改为**问终端**:接入时打印探针并用 `CSI 6n` 读回列号,
|
|
47
|
+
答案随帧下发给绘制的 Host;终端不回答就退回按 locale 推断,`DSH_TUI_NO_GLYPH_PROBE=1` 可整体关掉探针。
|
|
48
|
+
|
|
49
|
+
## 上游兼容
|
|
50
|
+
|
|
51
|
+
| 通道 | 版本 | 表态 |
|
|
52
|
+
|---|---|---|
|
|
53
|
+
| `latest` / `next` | `0.2.0-rc.2` | `compatible`:**本版默认线**(干净树安装、`tsc` 0 错、套件 1086 项 1082 通过 / 0 失败 / 4 跳过、真机探针全过;桌面版基线) |
|
|
54
|
+
| 线内 | `0.2.0-rc.1` | `compatible`:typecheck + 套件 |
|
|
55
|
+
| 线内 | `0.1.7-rc.2` | `compatible`:完整探针 |
|
|
56
|
+
| 线内 | `0.1.7-rc.1` | `compatible`:typecheck + 套件 |
|
|
57
|
+
| 已摘 | `0.1.5-*` 及更早 | **`incompatible`**(明确表态,请求升级到 `0.1.7-rc` 或 `0.2.0-rc`) |
|
|
58
|
+
|
|
59
|
+
声明窗口:`>=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1`。CI 四条腿:`0.2.0-rc.2`(默认,完整探针)、
|
|
60
|
+
`0.1.7-rc.2`(完整)、`0.2.0-rc.1` 与 `0.1.7-rc.1`(typecheck + 套件)、外加 Windows leg(ConPTY 真机)
|
|
61
|
+
——两条腿新增**无 PTY** 的管道探针(`scripts/tui-stdio-probe.mjs`)。
|
|
62
|
+
|
|
63
|
+
## 安装 / 升级
|
|
64
|
+
|
|
65
|
+
```sh
|
|
66
|
+
dsh plugin --profile tui add dsh-ssh-tui@latest # 0.8.1
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
装完退出再启动。`/status` 可确认当前版本;装不上先看 `/doctor`。
|
|
70
|
+
|
|
71
|
+
## 已知限制
|
|
72
|
+
|
|
73
|
+
- **0.1.5 及更早不再支持**(见上)。
|
|
74
|
+
- 桌面版**应用本身**仍然不能跑终端 profile(它的启动器没有 console)——这是上游的事,见
|
|
75
|
+
[`docs/desktop.md`](https://github.com/cyjyyd/dsh-ssh-tui/blob/main/docs/desktop.md)。本版保证的是
|
|
76
|
+
"装了它不会把宿主弄坏",以及"宿主愿意开终端控件时能用"。
|
|
77
|
+
- 管道宿主**必须**自己报告尺寸变化(`CSI 8 ; rows ; cols t`),否则会停在启动时声明的 `COLUMNS`/`LINES`。
|
|
78
|
+
- 真实 Windows 上仍只能人工确认的两条:宿主那个控制台窗口确实是隐藏的;`%USERPROFILE%` 与 `$HOME`
|
|
79
|
+
不一致的账户行为。
|