前言¶
在 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 與內存門閘。