dsh-single-terminal 0.1.0 → 0.1.4

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 (40) hide show
  1. package/README.md +99 -20
  2. package/README.zh.md +82 -21
  3. package/lib/client.js +337 -3198
  4. package/lib/client.js.map +1 -1
  5. package/lib/types/client/controller.d.ts +3 -0
  6. package/lib/types/client/controller.d.ts.map +1 -1
  7. package/lib/types/client/controller.js +9 -1
  8. package/lib/types/client/drawer.d.ts +7 -2
  9. package/lib/types/client/drawer.d.ts.map +1 -1
  10. package/lib/types/client/drawer.js +27 -7
  11. package/lib/types/client/i18n.d.ts.map +1 -1
  12. package/lib/types/client/i18n.js +5 -3
  13. package/lib/types/client/plugin.d.ts +4 -2
  14. package/lib/types/client/plugin.d.ts.map +1 -1
  15. package/lib/types/client/plugin.js +8 -5
  16. package/lib/types/client/scope.d.ts +24 -0
  17. package/lib/types/client/scope.d.ts.map +1 -0
  18. package/lib/types/client/scope.js +26 -0
  19. package/lib/types/client/styles.d.ts +8 -0
  20. package/lib/types/client/styles.d.ts.map +1 -1
  21. package/lib/types/client/styles.js +99 -31
  22. package/lib/types/client/term.d.ts +3 -1
  23. package/lib/types/client/term.d.ts.map +1 -1
  24. package/lib/types/client/term.js +17 -30
  25. package/lib/types/client/theme.d.ts +13 -0
  26. package/lib/types/client/theme.d.ts.map +1 -0
  27. package/lib/types/client/theme.js +92 -0
  28. package/package.json +6 -2
  29. package/src/client/controller.ts +10 -1
  30. package/src/client/drawer.tsx +59 -20
  31. package/src/client/i18n.ts +5 -3
  32. package/src/client/plugin.tsx +9 -6
  33. package/src/client/scope.tsx +38 -0
  34. package/src/client/styles.ts +99 -31
  35. package/src/client/term.tsx +17 -30
  36. package/src/client/theme.ts +104 -0
  37. package/lib/types/client/toggle.d.ts +0 -9
  38. package/lib/types/client/toggle.d.ts.map +0 -1
  39. package/lib/types/client/toggle.js +0 -19
  40. package/src/client/toggle.tsx +0 -43
package/README.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # dsh-single-terminal
2
2
 
3
+ <p align="center">
4
+ <img src="assets/preview/1.png" alt="dsh-single-terminal preview" width="800" />
5
+ </p>
6
+
3
7
  **dsh-single-terminal** is a real-terminal drawer plugin for the DeepSeek
4
8
  Harness (DSH) host. It docks an interactive PTY terminal (xterm.js) to the
5
9
  bottom of the web app — type into it, Ctrl-C it, resize it, open as many tabs
@@ -13,30 +17,51 @@ as you need.
13
17
  from config; POSIX: `$SHELL` / bash / zsh / fish
14
18
  - **Two drawer modes** — *Docked* pushes the page content up (no occlusion),
15
19
  *Overlay* floats above it; drag the top edge to resize, the drawer remembers
16
- mode and height
20
+ mode and height. Both modes share the same frosted-glass style (translucent
21
+ background + `backdrop-filter` blur) — the mode only decides docking
22
+ behavior. Open/close slides with the host's
23
+ easing curve and honors `prefers-reduced-motion`.
24
+ - **Theme following** — the drawer and the terminal palette follow the host's
25
+ theme (light / dark / custom themes) live; no separate theme config.
17
26
  - **Keep-alive sessions** — terminals survive page refreshes and drawer
18
27
  close/reopen; on reconnect the recent output is replayed from a ring buffer.
19
28
  Opening the drawer with no terminal yet auto-creates one with the default
20
29
  shell.
30
+ - **Workspace-aware cwd** — when the current session belongs to a workspace,
31
+ new terminals (including the auto-created one) start in that workspace root
32
+ directory, no manual `cd` needed; with no session / no workspace the
33
+ `defaultCwd` rules apply.
21
34
  - **Bilingual UI** — follows the host interface language (中文 / English);
22
35
  `Alt+C` toggles the drawer
23
36
 
24
37
  [中文文档](README.zh.md)
25
38
 
39
+ ## Preview
40
+
41
+ Screenshot of the terminal drawer (dark theme following, frosted-glass style):
42
+ see [preview.md](preview.md).
43
+
26
44
  ## Features
27
45
 
28
- - **Header entry** (`conversation.session.header.utilities`): a panel-bottom
29
- icon button in the session header's utilities row toggles
30
- the drawer. Hovering shows a bubble tooltip (the host `Tooltip` component)
31
- with the shortcut; `Alt+C` toggles from anywhere except while typing inside
32
- the terminal (there `Alt+C` is passed to the shell as `ESC c`).
46
+ - **Drawer-handle entry** (rendered inside the drawer in `shell.overlay`): a
47
+ `>_` prompt tab stuck to the drawer's top-right outer edge — the terminal's
48
+ entry button. It rides the drawer's own slide animation: expanded it sticks
49
+ to the terminal's top-right corner like a drawer handle; minimized it settles
50
+ at the page's bottom-right corner. Clicking toggles the drawer; `Alt+C`
51
+ toggles from anywhere except while typing inside the terminal (there `Alt+C`
52
+ is passed to the shell as `ESC c`).
53
+ - **Invisible session bridge** (`conversation.session.header.utilities`): a
54
+ `null`-rendering component that only syncs the current session's workspace
55
+ root into the controller (so new terminals start there); the header shows no
56
+ visible UI for this plugin.
33
57
  - **Drawer** (`shell.overlay`): a frame-level bottom drawer with
34
58
  - a tab strip — one PTY session per tab, independent shells, close button
35
59
  per tab (terminates the whole process tree; the pid is verified gone),
36
- - a `+` button (new tab with the default shell) and a `▸` menu
37
- (all shells found on this machine; unavailable ones are not listed),
60
+ - one `+` button whose dropdown lists all shells found on this machine
61
+ (unavailable ones are not listed), the default shell pinned first and
62
+ marked,
38
63
  - a mode switch (*Docked* / *Overlay*), a connection status dot and a
39
- collapse button,
64
+ minimize (`−`) button,
40
65
  - a drag handle on the top edge (pointer-capture drag, min 140px).
41
66
  - **Docked mode** pushes the app frame up with `padding-bottom` on the frame
42
67
  root element (no host hook exists for bottom docks); when the anchor cannot
@@ -65,10 +90,13 @@ profile `cordis.patch.yml`:
65
90
  args: []
66
91
  ```
67
92
 
68
- - `defaultShell` — shell used by the `+` button; when unavailable it falls
93
+ - `defaultShell` — shell preselected in the `+` dropdown (pinned first and
94
+ marked "Default"); when unavailable it falls
69
95
  back (`powershell` on Windows, `$SHELL`/`bash` on POSIX).
70
- - `defaultCwd` — `home` (default) starts in the user home; `workspace` is
71
- reserved (currently resolves to home); an absolute path must exist.
96
+ - `defaultCwd` — start directory when there is no workspace context: `home`
97
+ (default) starts in the user home; `workspace` is reserved (currently
98
+ resolves to home); an absolute path must exist. When the current session
99
+ belongs to a workspace the workspace root takes precedence (see above).
72
100
  - `customShells` — extra launchers; `command` may be an absolute path or a
73
101
  name resolved through `PATH` (with `PATHEXT` on Windows).
74
102
 
@@ -92,6 +120,35 @@ dsh --profile web # start (restart required for the host half to
92
120
  > `pnpm install` to compile it. The browser half inlines xterm.js entirely —
93
121
  > no runtime dependency there.
94
122
 
123
+ ## Publish
124
+
125
+ The build toolchain is **tsc + tsdown** (no vite): `tsc -b` type-checks and
126
+ emits declarations, while `tsdown` (Rolldown core) bundles the host half
127
+ (`lib/index.js`, ESM) and the browser half (`lib/client.js`, single-file CJS
128
+ `__ModuleLoader__` factory with auto banner wrapping). Dependency management
129
+ uses **pnpm 10** (the `pnpm-lock.yaml` is committed and CI installs with
130
+ `--frozen-lockfile`). Build artifacts are committed to git, so git installs
131
+ need no build:
132
+
133
+ ```sh
134
+ pnpm install # install per pnpm-lock.yaml
135
+ pnpm run build # clean lib → tsc -b (declarations) → tsdown (both halves)
136
+ pnpm run verify # simulate the host module table to check lib/client.js (optional)
137
+ pnpm run release # check + build + verify + npm version patch + push tags (triggers the publish workflow)
138
+ ```
139
+
140
+ ### Automated publishing (GitHub Actions)
141
+
142
+ Pushing a `v*` tag (`pnpm run release` bumps the patch version, rebuilds, and
143
+ tags/pushes automatically) triggers
144
+ [`.github/workflows/publish.yml`](.github/workflows/publish.yml) — a single
145
+ `release` job that: sets up Node 26 → `pnpm install --frozen-lockfile` →
146
+ `pnpm run check` → `pnpm run build` → `pnpm run verify` → `pnpm pack` →
147
+ creates a GitHub Release (auto-generated changelog, tarball attached) →
148
+ publishes to npm via **Trusted Publishing** (OIDC `--provenance`, no
149
+ `NPM_TOKEN` secret; the npm package must have this repository configured as a
150
+ Trusted Publisher).
151
+
95
152
  ## Development
96
153
 
97
154
  Requirements: **Node ≥ 22.19 (or ≥ 24) + pnpm 10** (the `packageManager` field
@@ -106,14 +163,22 @@ pnpm run verify # simulate the host seed table to check lib/client.js loa
106
163
  ```
107
164
 
108
165
  ```
109
- ├── src/host/ # Host half: index.ts (entry, ws route + config), hub.ts (session hub + frame protocol), shells.ts (registry + probing), types.ts
110
- ├── src/client/ # Browser half: plugin.tsx (slots), drawer.tsx, term.tsx, controller.ts, ws.ts, styles.ts, i18n.ts ...
111
- ├── lib/index.js # Host half build artifact (tsdown, ESM)
112
- ├── lib/client.js # Browser half build artifact (tsdown __ModuleLoader__ factory, xterm inlined)
113
- ├── scripts/verify-client.mjs # host-seed simulation check
114
- ├── scripts/gen-xterm-css.mjs # regenerates src/client/xterm-css.ts from the @xterm/xterm package
166
+ ├── src/ # Source
167
+ ├── host/ # Host half: index.ts (entry, ws route + config), hub.ts (session hub + frame protocol), shells.ts (registry + probing), types.ts
168
+ │ └── client/ # Browser half: plugin.tsx (slots), drawer.tsx (drawer + entry handle), term.tsx, controller.ts, ws.ts, styles.ts, theme.ts, scope.tsx (session bridge), i18n.ts ...
169
+ ├── lib/ # Build artifacts (committed: git installs need no build)
170
+ ├── index.js # Host half (tsdown, ESM)
171
+ ├── client.js # Browser half (tsdown __ModuleLoader__ factory, xterm inlined)
172
+ │ └── types/ # Type declarations (generated by tsc -b)
173
+ ├── assets/preview/ # Screenshots referenced by README / preview.md
174
+ ├── scripts/ # verify-client.mjs (host-seed simulation check), gen-xterm-css.mjs (regenerates src/client/xterm-css.ts)
175
+ ├── tsdown.config.ts # tsdown build config (node half + client bundle banner wrapper)
176
+ ├── tsconfig.json # solution: references tsconfig.host.json / tsconfig.client.json
115
177
  ├── cordis.patch.yml # Bundle patch: plugin row referenced by package name (no paths)
116
- └── package.json # dsh.bundle + dsh.client(web) manifests + peerDependencies
178
+ ├── package.json # dsh.bundle + dsh.client(web) manifests + peerDependencies
179
+ ├── README.md # This file (English)
180
+ ├── README.zh.md # 中文文档
181
+ └── preview.md # Screenshot preview (references assets/preview/*.png)
117
182
  ```
118
183
 
119
184
  ## Implementation notes
@@ -140,5 +205,19 @@ pnpm run verify # simulate the host seed table to check lib/client.js loa
140
205
  `taskkill /T /F` on the session pid — ConPTY closure alone can leave
141
206
  PowerShell (+PSReadLine) alive; POSIX kills the foreground process group
142
207
  (`kill(-pid)`).
208
+ - **Theme following**: all plugin CSS consumes the host's semantic alias
209
+ tokens (`--dsw-alias-*`, defined on `body` and flipped by
210
+ `body[data-ds-dark-theme]`), so light / dark / custom themes apply without
211
+ plugin-side logic. The xterm palette is computed at runtime: alias token
212
+ values are read via a hidden probe element (`getComputedStyle`), the
213
+ background is re-composed with the frosted alpha, and a `MutationObserver`
214
+ on the body attribute re-applies the palette — theme switches (including
215
+ custom themes projected by the host's ThemePresenter) update live.
216
+ - **Renderer strategy**: xterm 5 ships DOM renderer only by default
217
+ (`allowTransparency` works there, while WebGL canvases are opaque). Both
218
+ modes share the frosted style, so the plugin stays on the DOM renderer with
219
+ a translucent terminal background under the frosted blur in every mode —
220
+ the WebGL addon was removed rather than swapped at runtime.
143
221
  - **The official `deepseek-harness` project is not modified**; all UI sits in
144
- existing slots (`shell.overlay`, `conversation.session.header.utilities`).
222
+ existing slots (`shell.overlay` for the drawer and its entry handle,
223
+ `conversation.session.header.utilities` for the invisible session bridge).
package/README.zh.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # dsh-single-terminal
2
2
 
3
+ <p align="center">
4
+ <img src="assets/preview/1.png" alt="dsh-single-terminal 预览" width="800" />
5
+ </p>
6
+
3
7
  **dsh-single-terminal** 是 DeepSeek Harness(DSH)宿主的真实终端抽屉插件。它在
4
8
  Web 应用底部挂一条交互式 PTY 终端(xterm.js)——可以正常敲命令、Ctrl-C、拖拽
5
9
  改大小、开任意多个标签。
@@ -9,26 +13,39 @@ Web 应用底部挂一条交互式 PTY 终端(xterm.js)——可以正常敲
9
13
  - **Shell 选择** —— Windows:PowerShell(默认)/ pwsh 7 / CMD / Git Bash / WSL
10
14
  (未安装的自动隐藏)+ config 自定义 shell;POSIX:`$SHELL` / bash / zsh / fish
11
15
  - **两种抽屉模式** —— *占高度* 把页面内容顶起(无遮挡),*浮层* 悬浮于内容之上;
12
- 顶边可拖拽调高度,模式与高度自动记忆
16
+ 顶边可拖拽调高度,模式与高度自动记忆。两种模式共用同一磨砂玻璃样式
17
+ (半透明背景 + `backdrop-filter` 高斯模糊)——模式只决定停靠行为。开合带
18
+ 滑入滑出动画(沿用宿主缓动曲线,尊重系统减动效设置)。
19
+ - **主题跟随** —— 抽屉与终端配色实时跟随宿主主题(浅色 / 深色 / 自定义主题),
20
+ 无需单独配置。
13
21
  - **会话保活** —— 终端在页面刷新、抽屉开合后继续存活;重连后从环形缓冲回放
14
22
  近期输出。打开抽屉时若还没有任何终端,会自动用默认 shell 新建一个。
23
+ - **工作区路径感知** —— 当前会话归属某个工作区时,新建终端(含自动新建)直接
24
+ 落在该工作区根目录,无需手动 `cd`;无会话 / 无工作区时回退 `defaultCwd` 规则。
15
25
  - **双语 UI** —— 跟随宿主界面语言(中文 / English);`Alt+C` 开关抽屉
16
26
 
17
27
  [English](README.md)
18
28
 
29
+ ## 预览
30
+
31
+ 终端抽屉截图(暗色主题跟随、磨砂玻璃样式):见 [preview.md](preview.md)。
32
+
19
33
  ## 功能
20
34
 
21
- - **会话头部入口**(`conversation.session.header.utilities`):会话头部
22
- utilities 区的「底部面板」(panel-bottom) 图标按钮,点击开合抽屉;悬停显示
23
- 宿主 `Tooltip`
24
- 气泡(含快捷键提示)。`Alt+C` 全局开合抽屉;焦点在终端输入区内时放行
25
- (`Alt+C` 作为 `ESC c` 发给 shell)。
35
+ - **抽屉把手入口**(渲染在 `shell.overlay` 的抽屉内部):`>_` 提示符小标签
36
+ 吸附在抽屉右上角外沿——即终端入口按钮。它随抽屉自身的滑动动画移动:
37
+ 展开时像抽屉把手一样吸附在终端右上角;最小化后落在页面右下角。点击开合
38
+ 抽屉;`Alt+C` 全局开合,焦点在终端输入区内时放行(`Alt+C` 作为 `ESC c`
39
+ 发给 shell)。
40
+ - **隐形会话桥**(`conversation.session.header.utilities`):渲染 null 的
41
+ 组件,只负责把当前会话的工作区根目录同步给 controller(新建终端落在该
42
+ 目录);会话头部不显示本插件任何可见 UI。
26
43
  - **抽屉**(`shell.overlay`):frame 级底部抽屉,包含
27
44
  - 标签条 —— 每标签一条独立 PTY 会话,可独立选择 shell;每标签有关闭按钮
28
45
  (终止整棵进程树,已实测 pid 消失);
29
- - `+` 按钮(默认 shell 新建标签)与 `▸` 菜单(列出本机探测到的全部 shell
30
- 不可用的不显示);
31
- - 模式切换(占高度 / 浮层)、连接状态点、收起按钮;
46
+ - 单一 `+` 按钮 —— 下拉列出本机探测到的全部 shell(不可用的不显示),
47
+ 默认 shell 置顶并标记;
48
+ - 模式切换(占高度 / 浮层)、连接状态点、最小化(`−`)按钮;
32
49
  - 顶边拖拽条(pointer capture 拖拽,最小 140px)。
33
50
  - **占高度模式** 通过对框架根元素设 `padding-bottom` 把内容顶起(宿主没有底部
34
51
  停靠钩子);找不到锚点元素时静默降级为浮层。
@@ -56,10 +73,11 @@ Schemastery `Config`(宿主 Plugins 设置页自动渲染),和 / 或 profi
56
73
  args: []
57
74
  ```
58
75
 
59
- - `defaultShell` —— `+` 按钮使用的 shell;不可用时自动回退(Windows 回退
60
- `powershell`,POSIX 回退 `$SHELL`/`bash`)。
61
- - `defaultCwd` —— `home`(默认)从用户主目录启动;`workspace` 预留(当前等同
62
- home);绝对路径必须存在。
76
+ - `defaultShell` —— `+` 下拉菜单中预选的 shell(置顶并标记「默认」);不可用
77
+ 时自动回退(Windows 回退 `powershell`,POSIX 回退 `$SHELL`/`bash`)。
78
+ - `defaultCwd` —— 无工作区上下文时的启动目录:`home`(默认)从用户主目录启动;
79
+ `workspace` 预留(当前等同 home);绝对路径必须存在。当前会话归属工作区时
80
+ 优先使用工作区根目录(见上)。
63
81
  - `customShells` —— 额外启动器;`command` 可为绝对路径或从 `PATH` 解析的名称
64
82
  (Windows 上叠加 `PATHEXT`)。
65
83
 
@@ -82,6 +100,31 @@ dsh --profile web # 启动(宿主半边需重启后生效)
82
100
  > `pnpm install` 时需要 C/C++ 工具链编译。浏览器半边完整内联 xterm.js,
83
101
  > 无运行时依赖。
84
102
 
103
+ ## 发布
104
+
105
+ 构建工具链为 **tsc + tsdown**(无 vite):`tsc -b` 负责类型检查并产出声明文件,
106
+ `tsdown`(Rolldown 内核)打包宿主半(`lib/index.js`,ESM)与浏览器半
107
+ (`lib/client.js`,单文件 CJS `__ModuleLoader__` 工厂,自动 banner 包裹)。
108
+ 依赖管理使用 **pnpm 10**(`pnpm-lock.yaml` 入库,CI 按 `--frozen-lockfile`
109
+ 安装)。构建产物随 git 提交,git 安装无需本地构建:
110
+
111
+ ```sh
112
+ pnpm install # 按 pnpm-lock.yaml 安装
113
+ pnpm run build # 清空 lib → tsc -b(声明)→ tsdown(双半产物)
114
+ pnpm run verify # 模拟宿主模块表检查 lib/client.js(可选)
115
+ pnpm run release # check + build + verify + npm version patch + 推送 tag(触发发布工作流)
116
+ ```
117
+
118
+ ### 自动发布(GitHub Actions)
119
+
120
+ 推送 `v*` tag(`pnpm run release` 会自动 bump 补丁版本、重建并打 tag 推送)会
121
+ 触发 [`.github/workflows/publish.yml`](.github/workflows/publish.yml)——单个
122
+ `release` job:Setup Node 26 → `pnpm install --frozen-lockfile` →
123
+ `pnpm run check` → `pnpm run build` → `pnpm run verify` → `pnpm pack` →
124
+ 创建 GitHub Release(自动生成 changelog,附带 tarball)→ 经 **Trusted
125
+ Publishing**(OIDC `--provenance`,无需 `NPM_TOKEN` secret)发布到 npm
126
+ (需先在 npmjs.com 把该包的本仓库配置为 Trusted Publisher)。
127
+
85
128
  ## 开发
86
129
 
87
130
  环境要求:**Node ≥ 22.19(或 ≥ 24)+ pnpm 10**(`packageManager` 固定 pnpm 版本)。
@@ -95,14 +138,22 @@ pnpm run verify # 模拟宿主 seed 表检查 lib/client.js 可加载
95
138
  ```
96
139
 
97
140
  ```
98
- ├── src/host/ # 宿主半边:index.ts(入口,ws 路由 + 配置)、hub.ts(会话 Hub + 帧协议)、shells.ts(注册表 + 探测)、types.ts
99
- ├── src/client/ # 浏览器半边:plugin.tsx(slots)、drawer.tsx、term.tsx、controller.tsws.ts、styles.ts、i18n.ts ...
100
- ├── lib/index.js # 宿主半边产物(tsdown,ESM)
101
- ├── lib/client.js # 浏览器半边产物(tsdown → __ModuleLoader__ 工厂,xterm 已内联)
102
- ├── scripts/verify-client.mjs # 宿主 seed 表模拟检查
103
- ├── scripts/gen-xterm-css.mjs # @xterm/xterm 包重新生成 src/client/xterm-css.ts
141
+ ├── src/ # 源码
142
+ ├── host/ # 宿主半边:index.ts(入口,ws 路由 + 配置)、hub.ts(会话 Hub + 帧协议)、shells.ts(注册表 + 探测)、types.ts
143
+ │ └── client/ # 浏览器半边:plugin.tsx(slots)、drawer.tsx(抽屉 + 入口把手)、term.tsx、controller.ts、ws.ts、styles.ts、theme.ts、scope.tsx(会话桥)、i18n.ts ...
144
+ ├── lib/ # 构建产物(入库:git 安装无需本地构建)
145
+ ├── index.js # 宿主半边(tsdown,ESM)
146
+ ├── client.js # 浏览器半边(tsdown __ModuleLoader__ 工厂,xterm 已内联)
147
+ │ └── types/ # 类型声明(tsc -b 生成)
148
+ ├── assets/preview/ # README / preview.md 引用的截图
149
+ ├── scripts/ # verify-client.mjs(宿主 seed 表模拟检查)、gen-xterm-css.mjs(重新生成 src/client/xterm-css.ts)
150
+ ├── tsdown.config.ts # tsdown 构建配置(node 半 + client bundle banner 包裹)
151
+ ├── tsconfig.json # solution:引用 tsconfig.host.json / tsconfig.client.json
104
152
  ├── cordis.patch.yml # Bundle patch:按包名引用的插件行(无路径)
105
- └── package.json # dsh.bundle + dsh.client(web) manifests + peerDependencies
153
+ ├── package.json # dsh.bundle + dsh.client(web) manifests + peerDependencies
154
+ ├── README.md # 英文文档
155
+ ├── README.zh.md # 本文件(中文)
156
+ └── preview.md # 截图预览(引用 assets/preview/*.png)
106
157
  ```
107
158
 
108
159
  ## 实现说明
@@ -125,5 +176,15 @@ pnpm run verify # 模拟宿主 seed 表检查 lib/client.js 可加载
125
176
  - **Windows 进程树**:关闭标签执行 `pty.kill()` 后追加 `taskkill /T /F` ——
126
177
  仅关 ConPTY 时 PowerShell(+PSReadLine)可能存活;POSIX 杀前台进程组
127
178
  (`kill(-pid)`)。
179
+ - **主题跟随**:插件 CSS 全部消费宿主语义 alias token(`--dsw-alias-*`,定义在
180
+ `body` 上,随 `body[data-ds-dark-theme]` 翻转),浅色 / 深色 / 自定义主题
181
+ 无需插件侧逻辑即可生效。xterm 调色板在运行时现算:经隐藏探针元素读取
182
+ alias token 的 computed 值,按磨砂 alpha 重组背景色,并用 `MutationObserver`
183
+ 监听 body 属性重新套用——主题切换(含宿主 ThemePresenter 投影的自定义主题)
184
+ 实时生效。
185
+ - **渲染器策略**:xterm 5 默认仅有 DOM 渲染器(`allowTransparency` 在此有效,
186
+ WebGL canvas 不支持 alpha)。两种模式共用磨砂样式,因此统一保持 DOM 渲染器 +
187
+ 半透明终端背景置于磨砂模糊之上——不做运行时渲染器切换,WebGL 插件已移除。
128
188
  - **不修改官方 `deepseek-harness` 项目**;全部 UI 落在既有插槽
129
- (`shell.overlay`、`conversation.session.header.utilities`)。
189
+ (抽屉与其入口把手在 `shell.overlay`,隐形会话桥在
190
+ `conversation.session.header.utilities`)。