dsh-terminal-keepalive:切换标签时保持 DSH 右侧终端挂载

前言

在 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();插件卸载会把各定义恢复为注册时的原样。

核心功能(已核实能力)

  1. 运行时 keepMounted:包装 sidebarRightTabs.register(幂等,避免 HMR 叠 wrapper),在 kinds 列表内的种类注册前强制 keepMounted;对已注册定义经 get(kind) 再应用;订阅注册表事件与 sidebarRight.openTabs 以协调内存门闸。
  2. 设置页「终端常驻」:在 Settings → 终端常驻(独立左侧导航项;0.6.1 起不在插件详情页重复放卡片)集中配置 tab 种类、maxOpenTabs、滚动与 WebGL 等,支持保存(立即生效、无需重启)与恢复默认。
  3. 在线调终端参数:在不重启 DSH 的情况下,经 DOM/React fiber 找到运行中的 xterm,可改 scrollback、smoothScrollDuration 等。
  4. 可选 WebGL 渲染:默认开启(经 WebGL2 预检);无法使用 GPU 或上下文丢失时回退 DOM;可配置 maxWebgl、webglVisibleOnly 以权衡流畅度与显存/上下文数量。
  5. 可观测性:若配置的种类在约 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 终端工具与主题,只消除切回时的重建与卡顿。

注意:

结尾

经过上面的步骤,可以把右侧官方终端从「切走即卸载、回来即重建」改成「挂载保活、切换仅显隐」,并可选 WebGL 与滚动参数减轻切回与滚动时的 DOM 重绘成本。若你的主要痛点正是标签切换时的终端重载与全屏 TUI 卡顿,可按 README 安装并在 Settings → 终端常驻 里从默认 terminal 种类开始验证,再按需扩展 kinds 与内存门闸。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye