前言¶
在 DeepSeek Harness(DSH)里用右侧栏跑 claude code、codebuddy 等全屏 TUI 时,常会碰到一种现象:切到「文件」「浏览器」等别的标签再回来,终端像整页重载一样闪一下,还伴随卡顿。根因往往不在 TUI 本身,而是官方右侧 terminal 标签类型没有声明 keepMounted——一切走,xterm 被卸掉,回来时重建并回放整屏快照。下面介绍社区客户端插件 dsh-terminal-keepalive(维护者 Tree005),它在运行时把指定标签种类的 keepMounted 打开,让官方 PTY、输出流和 xterm 在切换时只做显示/隐藏,而不是反复重建。
这是什么¶
dsh-terminal-keepalive 是一类 客户端(Cordis client)插件:针对 DSH 右侧栏 sidebarRightTabs 注册表,在配置的标签种类(默认只有 terminal)上强制 keepMounted: true。它不另开第二个 PTY、不替换官方 xterm 实现、不改 app.asar;可选的 WebGL 渲染器以内置 chunk(client.webgl.js)打包 @xterm/addon-webgl,无额外运行时依赖要装。项目托管于 GitHub:Tree005/dsh-terminal-keepalive;也可在 SkillHub 社区目录查看条目(与 DeepSeek / 幻方无官方从属关系,属「一切皆插件」生态里的第三方作品)。
它解决什么问题¶
DSH 右侧终端在切标签时会卸载标签体,返回时重新创建 xterm 并挂回宿主流,全屏 TUI 会重演整屏快照,表现为「重载 + 滞后」。本插件在运行时改写注册表里对应种类的 keepMounted,使 shell 进程、输出流和 xterm 实例在标签/会话切换间保持挂载,切换变成单纯的显隐。文档中还说明:关闭 keep-alive 内存门闸时会整类恢复 keepMounted = false 并 refresh();插件卸载会把各定义恢复为注册时的原样。
核心功能(已核实能力)¶
- 运行时 keepMounted:包装
sidebarRightTabs.register(幂等,避免 HMR 叠 wrapper),在kinds列表内的种类注册前强制keepMounted;对已注册定义经get(kind)再应用;订阅注册表事件与sidebarRight.openTabs以协调内存门闸。 - 设置页「终端常驻」:在 Settings → 终端常驻(独立左侧导航项;0.6.1 起不在插件详情页重复放卡片)集中配置 tab 种类、
maxOpenTabs、滚动与 WebGL 等,支持保存(立即生效、无需重启)与恢复默认。 - 在线调终端参数:在不重启 DSH 的情况下,经 DOM/React fiber 找到运行中的 xterm,可改
scrollback、smoothScrollDuration等。 - 可选 WebGL 渲染:默认开启(经 WebGL2 预检);无法使用 GPU 或上下文丢失时回退 DOM;可配置
maxWebgl、webglVisibleOnly以权衡流畅度与显存/上下文数量。 - 可观测性:若配置的种类在约 3 秒后仍未出现,会
console.warn一次,便于发现上游 API 变更。
安装与启用¶
安装后需完全退出并重启 DSH。本地目录安装是链接形式,改代码后下次启动生效。
从本机路径:
dsh plugin --profile desktop add "file:/path/to/dsh-terminal-keepalive"
从 GitHub(推荐 git 方式,部分网络对 codeload tarball 会 ECONNRESET):
dsh plugin --profile desktop add "git+https://github.com/Tree005/dsh-terminal-keepalive.git"
简写(可能受 codeload 网络影响):
dsh plugin --profile desktop add "github:Tree005/dsh-terminal-keepalive"
安装完成后同样需重启 DSH。
典型用法与配置¶
图形界面¶
打开 Settings → 终端常驻,按需选择要常驻的标签种类、开放标签上限、回滚行数、平滑滚动时长,以及实验性 WebGL 相关项;页面提供 WebGL 状态行(supported / attached / cap)。点 保存 立即生效;恢复默认 重置配置。
手动改 localStorage¶
配置存于 localStorage,键名 dsh-terminal-keepalive.config;首次运行会写入默认值。可在 DevTools 控制台查看或修改,例如:
DevTools → Console:
JSON.parse(localStorage.getItem('dsh-terminal-keepalive.config'))
localStorage.setItem('dsh-terminal-keepalive.config', JSON.stringify({
kinds: ['terminal', 'files', 'text'],
maxOpenTabs: 6,
scrollback: null,
smoothScrollDuration: 110,
webgl: true,
maxWebgl: null,
webglVisibleOnly: false
}))
随后 Ctrl/Cmd+R 重载页面或重启 DSH。
常用字段含义(与 README 一致):
| 字段 | 默认 | 含义 |
|---|---|---|
kinds |
["terminal"] |
要 keep-mounted 的标签种类;DSH 已知:terminal、files、text、browser、guide。空数组等于关闭插件效果。 |
maxOpenTabs |
6 |
内存门闸:全局打开的 kinds 标签数 ≤ 该值时保持挂载,超出则对该类全部关闭 keep-alive 直到数量回落;0 表示不限制。 |
scrollback |
null |
客户端 xterm 回滚上限;null 沿用 DSH 默认(文档提到默认约 1000)。 |
smoothScrollDuration |
110 |
滚轮平滑动画毫秒数;0 为即时跳转。 |
webgl |
true |
是否为运行中终端切换 GPU 渲染;失败自动回退 DOM。 |
maxWebgl |
null |
WebGL 上下文上限;空则跟 maxOpenTabs(最小 8)。 |
webglVisibleOnly |
false |
仅为当前可见终端挂 WebGL,省 GPU,切换时可能有轻微重初始化。 |
说明:keepMounted 在公开 API 上按种类布尔生效,无法区分「第 1 个」与「第 7 个」终端标签,故用 maxOpenTabs 在超限时整类关闭;若要逐实例精确上限,需上游 dockkit 能力配合。
适用场景与注意¶
适合谁:长期在 DSH 右侧栏跑交互式 CLI/TUI,且频繁在「终端 / 文件 / 文本 / 浏览器」等标签间切换的开发者;希望保留官方终端、Agent 终端工具与主题,只消除切回时的重建与卡顿。
注意:
- 插件在当前 DSH 进程权限下运行,安装前宜自行审阅仓库源码与许可证(仓库 README 带 CI 徽章;
package.json中版本为 0.6.6,以你实际安装包为准)。 maxOpenTabs与 WebGL 上下文会牵动内存与 GPU;多会话、多终端同时打开时可适当调低kinds范围或开启webglVisibleOnly。- 社区目录页:https://www.skillhub.cn/plugins/Tree005/dsh-terminal-keepalive;源码与文档:https://github.com/Tree005/dsh-terminal-keepalive。
结尾¶
经过上面的步骤,可以把右侧官方终端从「切走即卸载、回来即重建」改成「挂载保活、切换仅显隐」,并可选 WebGL 与滚动参数减轻切回与滚动时的 DOM 重绘成本。若你的主要痛点正是标签切换时的终端重载与全屏 TUI 卡顿,可按 README 安装并在 Settings → 终端常驻 里从默认 terminal 种类开始验证,再按需扩展 kinds 与内存门闸。