前言¶
在 DeepSeek Harness(DSH)桌面客戶端裏,右側邊欄會打開文件、終端、交付物、Guide 等標籤頁。瀏覽器裏中鍵點標籤即可關閉,是多數開發者已經養成的習慣;DSH 自帶標籤條只支持左鍵選中、右鍵菜單,以及標籤上的 × 關閉。中鍵按下時,dockkit 的 chip 處理邏輯會把它當成左鍵選中,無法直接關掉標籤。若你經常在邊欄裏開很多頁,每次挪到 × 上點一下,會比中鍵慢一截。下面介紹的插件 dsh-middle-click-tab-close 由社區維護者 icrefin 發佈,分類爲客戶端插件,在不動官方 UI 源碼的前提下,讓右側邊欄(含浮動窗標題區)支持與中鍵關閉瀏覽器標籤相同的手勢,並走與 × 相同的 ctx.sidebarRight.close(tabId) 關閉路徑。
這是什麼¶
dsh-middle-click-tab-close 是一個僅作用於 DSH Web 客戶端前端的 Cordis 插件:在文檔上註冊一個捕獲階段的 pointerdown 監聽,當檢測到鼠標中鍵(button === 1)且按壓發生在 [data-sidebar-right-session] 內時,解析被點的 [data-dockkit-tab],再調用官方側欄控制器關閉對應標籤。Host 側入口存在但無業務邏輯,只爲 Loader 攜帶 browser 半包;無配置項、無設置卡片、無額外路由或樣式。
維護與源碼:
- 目錄頁:https://www.skillhub.cn/plugins/icrefin/dsh-middle-click-tab-close
- 倉庫:https://github.com/icrefin/dsh-middle-click-tab-close
- 許可證:MIT(以倉庫 LICENSE 爲準)
爲什麼是插件而不是設置項¶
右側標籤條是隨客戶端發佈的 UI。dsh-client-ui-dockkit 繪製每個 chip 爲 role="tab",其 onPointerDown 僅跳過右鍵(button !== 2),中鍵仍會觸發選中。dsh-client-ui-sidebar-right 持有列布局、標籤註冊表以及文檔化的 ctx.sidebarRight.close(tabId)。沒有用戶級開關能單獨打開「中鍵關閉」,也沒有擴展 chip 行爲的插槽。要在不 fork、不 patch 官方 strip 的前提下增加手勢,只能在頁面裏觀察 chip DOM,並調用 UI 已在使用的關閉 API。這是插件形態的原因,而非可選偏好。
核心功能¶
手勢範圍¶
左鍵仍選中標籤;右鍵仍打開菜單;中鍵關閉標籤——對停靠在右側邊欄的標籤條上的 chip,以及對浮動窗標題條(data-dockkit-float-title)同樣生效。README 用示意說明:在「Report × | Guide | Terminal ×」這類標籤文字區域中鍵,效果與點該標籤的 × 一致。
關閉路徑與保護規則¶
處理流程(資料原文步驟摘要):
- 確認
button === 1且事件在[data-sidebar-right-session]內。 - 從按壓元素向上找最近的
[data-dockkit-tab],得到 layout tab id。 - 若 chip 未繪製
[data-dockkit-tab-close],則不處理——例如唯一停靠的 Guide 無關閉控件,插件拒絕中鍵,避免無效攔截。 - 調用
ctx.sidebarRight.close(tabId):資源清理、registerCloseHandler、最後一標籤摺疊列、佈局 undo 歷史等行爲與點 × 相同。 preventDefault()抑制 Chromium 中鍵自動滾動;stopPropagation()避免 dockkit 把中鍵當成選中。- 監聽註冊在
ctx.effect中,禁用或卸載插件時監聽一併移除。
浮動窗沒有 tab chip:中鍵落在標題區時,插件會觸發 kit 自帶的關閉按鈕路徑,等效於點關閉按鈕。
明確不做的事¶
- 不支持其他按鍵、手勢或快捷鍵關標籤。
- 不操作後臺 Session,只作用於當前前景列可見的 chip。
- 依賴 dockkit 的 DOM 標記(
data-dockkit-tab、data-dockkit-tab-close、data-sidebar-right-session);若未來 DSH 改名,手勢會靜默失效,不會誤關。 - 中鍵仍先被瀏覽器接收,關閉發生在
pointerdown,而非auxclick;無法變成與原生 chip 完全同層的內置行爲。
技術實現上,在 document 上捕獲監聽是爲了搶在 React 18 根容器委託的 onPointerDown 之前執行;倉庫含 test/react-delegation.spec.tsx 驗證中鍵不到達 chip 處理函數、左鍵仍正常。
環境與依賴¶
根據倉庫 package.json:
- Node:
>=22.17.0 - DSH:
>=0.2.1-rc.5 <0.2.2-0 - 當前包版本:
0.1.1(Release 徽章指向 v0.1.1) - 客戶端注入:
@deepseek-ai/dsh-client-ui-sidebar-right
安裝與啓用¶
官方 README 給出的方式是從本倉庫構建並打包,再在桌面客戶端裏安裝 .tgz,不是憑插件名拼接 CLI 的 dsh plugin add github:... 命令。步驟如下。
- 在克隆或解壓後的倉庫根目錄安裝依賴並校驗構建:
pnpm install
pnpm check # typecheck · build · vitest
pnpm pack # -> dist/dsh-middle-click-tab-close-0.1.0.tgz
說明:pnpm pack 輸出文件名在 README 示例中爲 dsh-middle-click-tab-close-0.1.0.tgz;安裝時使用 dist/ 下實際生成的 tgz 文件名即可。package.json 中 version 爲 0.1.1,打包產物版本以本地 pnpm pack 結果爲準。
- 在 DeepSeek Harness 桌面應用中打開 Settings → Plugins,安裝上述
dist/*.tgz,然後重啓應用。資料寫明:運行中的 profile 在啓動時纔算模塊解析圖,新 bundle 需下次啓動才能正確 import entry。Web 客戶端在重啓後還需刷新頁面。
插件無配置界面;安裝並重啓後即生效。
典型用法¶
- 啓動已安裝插件的 DSH 桌面客戶端並完成一次應用重啓與 Web 頁刷新。
- 在右側邊欄打開若干可關閉標籤(如 Report、Terminal 等帶 × 的頁)。
- 在標籤文字區域按下鼠標中鍵:標籤應關閉,且與該標籤註冊的 close handler 行爲一致。
- 對唯一 Guide 標籤中鍵:應無關閉效果(與無 × 的官方行爲一致)。
- 若有浮動側欄窗,在中鍵點擊標題欄區域:窗體應通過 kit 關閉按鈕同路徑關閉。
開發調試時,可用倉庫腳本在隔離 profile 中加載 bundle(不修改本機正式 profile):
scripts/dev-profile.sh boot 19498 # isolated DSH home under .dev-home/
scripts/dev-profile.sh url 19498 # prints the served bundle URL
scripts/dev-profile.sh remove
手勢在真實桌面 GUI 上的驗證 README 標明需人工確認;自動化測試覆蓋 jsdom 行爲與 React 委託順序,不含 live middle click。
適用場景與注意¶
適合誰: 長期在 DSH 右側邊欄切換文件、終端、交付物等標籤,且習慣瀏覽器式中鍵關標籤的客戶端用戶。插件星標在資料中爲 0,屬早期社區工具,使用前可自行瀏覽源碼與 CI 狀態。
權限與安全: 插件隨當前 DSH 進程與用戶 profile 加載,在瀏覽器上下文中監聽指針事件並調用官方 sidebarRight.close。安裝前應閱讀 GitHub 倉庫 源碼與 MIT 許可證,確認接受其 DOM 解析與事件攔截方式。
生態說明: DSH 採用「一切皆插件」的擴展思路;SkillHub 等社區目錄爲獨立站點,與 DeepSeek / 幻方無官方從屬關係,本文安裝步驟以倉庫 README 爲準。
結尾¶
dsh-middle-click-tab-close 用很小的 browser 半包補上了右側邊欄標籤的中鍵關閉,並刻意對齊官方 sidebarRight.close 而非模擬點擊 ×,以便 close handler 與佈局歷史與內置 UI 一致。若你需要這一手勢,可按 README 打包安裝並在重啓後試用。
- 插件目錄:https://www.skillhub.cn/plugins/icrefin/dsh-middle-click-tab-close
- 源碼與說明:https://github.com/icrefin/dsh-middle-click-tab-close