# 0.8.1 发版说明

> **发布方式：`latest` + `next`。** 上一次发版：**0.8.0**（2026-09-29，`next`，随后提前提升为 `latest`）。
> 这是一版**修稳定性**的补丁：桌面版装上它不会再把宿主带崩；终端侧的几处"残留"也一并清掉。

## 头等事：桌面版装了**不会再弄坏宿主**

0.8.0 在没有终端的进程里是**抛错**退出插件的。桌面版 Harness 的启动器是 Electron-as-Node（GUI 子系统，
没有 console），于是插件管理把它显示成"1 entry did not activate / 插件失败"，在桌面版上还会把 GUI 带崩。

0.8.1 起按"能不能画"分四种情形，只有真能画时才挂载：

| 情形 | 行为 |
|---|---|
| 本进程就是分离的 TUI Host | 照常服务（它的终端在随后接入的那个窗口里） |
| stdin 与 stdout 都是 TTY | 照常挂载 TUI |
| 桌面版启动器（Electron-as-Node / `app.asar` / `DeepSeek Harness.exe`） | **不挂载任何东西**（不取锁、不装定时器、不查更新），记**一行**说明，措辞是"此处不启用"而不是报错 |
| 其它没有终端的情形（管道 `… \| tee`、cron、服务） | 同上，文案换成"没有终端"。**退出码 0** |

需要"没终端就报错"的场合（脚本断言某个终端 profile 真能起来）在 profile 行加 `requireTerminal: true`
——那是唯一会抛错的路径，而且只在显式要求时。桌面版用户不需要这个插件：用应用本身或 `dsh web`；
想在终端里用它，用 npm 安装的 CLI（`npm i -g @deepseek-ai/dsh`）在真实终端/SSH 里跑 `dsh --profile tui`。

## 新增：宿主自带终端控件时，可以把这个 TUI 当子进程用

桌面版自己**不需要**它，但"宿主会开终端控件"（PTY 面板、xterm.js、GUI 里嵌的终端）是另一条路：
声明 `DSH_TUI_DISPLAY=stdio`（或 `--display stdio`），插件就不再要求 TTY——画面走 stdout、按键走 stdin、
面板尺寸由宿主用 `CSI 8 ; rows ; cols t` 报告（管道没有 `resize` 事件也没有 `SIGWINCH`）。协议、父进程
必须做的五件事、Node 最小示例与限制写进 [`display-mode.md`](display-mode.md)（这一版起随包发布）。

## 终端侧修掉的三处"残留"

1. **会卡住的"处理中"卡片**：渲染缓存把"活尾巴"（等待卡、流式缓冲、还没有回复的突发摘要）收进了
   最后一行的缓存条目，于是每一帧都把那一份**冻结在旧秒数**的副本重放出来。真实会话里攒到过四条
   （0s / 12s / 19s / 30s）夹在工具卡中间，`0s` 那条永远不动。现在缓存条目只包含它自己那行画的内容。
2. **退出后提示符旁的 `①—…“”·•Ⅰ` 与 `^[[25;1R`**：歧义字形探针打印的那行自己没有擦（调用方可能一帧
   都没画），而它的光标回答要一个往返才回来——慢链路上那时终端已经交还给 shell，tty 就把回答回显成了
   文本。现在探针自己擦行、归还终端前多留一个往返吞掉回答、并且不再对已经交还的终端探测；探针期间
   暂存 Host 的输出，避免擦除打在刚画好的帧上。
3. **极简视图**：单文件编辑卡不再重复自己的标题与 diffstat；失败的工具行补回状态球（`●`），与其它卡片行一致。

## 性能与渲染（0.8.0 之后陆续落地）

- 每行渲染缓存 + 逐行脏比较：5000 行会话的整帧重画从约 1050ms 降到约 22ms，按键帧从约 1040ms 降到约 13ms；
  多行帧用 `DEC 2026` 同步刷新，避免慢链路上一行行"落下来"的撕裂（这就是本插件存在的意义的那个不闪屏）。
- 歧义宽度字形（`①`–`⑩`、`—`、`“”`、CJK 标点…）改为**问终端**：接入时打印探针并用 `CSI 6n` 读回列号，
  答案随帧下发给绘制的 Host；终端不回答就退回按 locale 推断，`DSH_TUI_NO_GLYPH_PROBE=1` 可整体关掉探针。

## 上游兼容

| 通道 | 版本 | 表态 |
|---|---|---|
| `latest` / `next` | `0.2.0-rc.2` | `compatible`：**本版默认线**（干净树安装、`tsc` 0 错、套件 1086 项 1082 通过 / 0 失败 / 4 跳过、真机探针全过；桌面版基线） |
| 线内 | `0.2.0-rc.1` | `compatible`：typecheck + 套件 |
| 线内 | `0.1.7-rc.2` | `compatible`：完整探针 |
| 线内 | `0.1.7-rc.1` | `compatible`：typecheck + 套件 |
| 已摘 | `0.1.5-*` 及更早 | **`incompatible`**（明确表态，请求升级到 `0.1.7-rc` 或 `0.2.0-rc`） |

声明窗口：`>=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1`。CI 四条腿：`0.2.0-rc.2`（默认，完整探针）、
`0.1.7-rc.2`（完整）、`0.2.0-rc.1` 与 `0.1.7-rc.1`（typecheck + 套件）、外加 Windows leg（ConPTY 真机）
——两条腿新增**无 PTY** 的管道探针（`scripts/tui-stdio-probe.mjs`）。

## 安装 / 升级

```sh
dsh plugin --profile tui add dsh-ssh-tui@latest      # 0.8.1
```

装完退出再启动。`/status` 可确认当前版本；装不上先看 `/doctor`。

## 已知限制

- **0.1.5 及更早不再支持**（见上）。
- 桌面版**应用本身**仍然不能跑终端 profile（它的启动器没有 console）——这是上游的事，见
  [`docs/desktop.md`](https://github.com/cyjyyd/dsh-ssh-tui/blob/main/docs/desktop.md)。本版保证的是
  "装了它不会把宿主弄坏"，以及"宿主愿意开终端控件时能用"。
- 管道宿主**必须**自己报告尺寸变化（`CSI 8 ; rows ; cols t`），否则会停在启动时声明的 `COLUMNS`/`LINES`。
- 真实 Windows 上仍只能人工确认的两条：宿主那个控制台窗口确实是隐藏的；`%USERPROFILE%` 与 `$HOME`
  不一致的账户行为。
