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 與內存門閘。

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

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

小夜