前言¶
DeepSeek Harness(DSH)桌面版左側欄默認列出所有「全局面板」項,隨着插件增多會越來越長。想要精簡界面、只保留當前需要的功能,沒有現成入口。DSH 目前沒有公開的「隱藏某個側欄菜單項」的 API,只能通過數據層過濾來實現。
這是什麼¶
這是一個 DSH 客戶端插件:winjazw/dsh-sidebar-menu。它給 DSH 左側欄底部增加一個滑塊圖標,打開後列出所有全局面板,逐項勾選即可顯示/隱藏,選擇保存在本地,重啓後依然生效。
核心功能¶
逐項開關¶
面板每一行對應左側菜單的一項,點一下即可隱藏或恢復,左側菜單實時更新。
批量操作¶
- 全部隱藏:清空整列菜單(只保留「新會話」與工作區),一鍵把側欄收至最簡。
- 恢復:撤銷上一步,最多連撤 20 步;「全部隱藏」點錯了可以一步退回原來的選擇。
- 全部顯示:一鍵恢復所有項。
持久化與無障礙¶
- 選擇存儲在瀏覽器的
localStorage中,關閉應用後重新打開,設置依然存在。 - 使用
Esc關閉面板;每行使用role="switch"+aria-checked;入口按鈕帶aria-label。
狀態判斷¶
當沒有可隱藏項時,「全部隱藏」按鈕變灰;沒有隱藏項時,「全部顯示」變灰;撤銷棧爲空時「恢復」變灰。
安裝¶
這是一個 DSH 本地 bundle(@local/… 是官方模板沿用的本地包命名,不發佈到 npm)。
方式一:把目錄交給 DSH(推薦)¶
git clone https://github.com/Winjazw/dsh-sidebar-menu.git
然後在 DSH 會話裏讓它把這個目錄裝成 bundle,等價於調用插件管理工具:
{ "action": "install_bundle", "target": "/絕對路徑/dsh-sidebar-menu" }
裝完會熱加載,側欄底部出現滑塊圖標;沒出現就 ⌘R 重載一次。
方式二:手動放進 profile¶
# 1) 放進 profile 的 node_modules
ln -s "$PWD" ~/.dsh/profiles/<你的profile>/node_modules/@local/sidebar-menu
# 2) 在該 profile 的 package.json 裏登記:
# "dependencies": { "@local/sidebar-menu": "link:/絕對路徑/dsh-sidebar-menu" }
# "dsh": { "profile": { "bundles": [ … , "@local/sidebar-menu" ] } }
手動改完重啓 DSH。
使用¶
- 左側欄最底部(「Jev 統計」與頭像之間)多了個滑塊圖標,點它。
- 彈出「左側菜單設置」,逐項開關。
- 需要批量處理就用底部四個按鈕。
完成或Esc關閉。此時左側菜單已是最新狀態。
側欄摺疊成窄圖標欄時入口仍在,面板依舊居中彈出。
工作原理¶
DSH 目前沒有「隱藏某個側欄菜單項」的公開 API:sidebar.panellist 只接受 id / order / label,layout 服務也只有 selectPanel / toggleSidebar / openRightbar / closeRightbar。本插件走數據層過濾,一共三處:
| 環節 | 做法 |
|---|---|
| 菜單來源 | 包住 ctx.slots.entriesOfSlot('sidebar.panellist'),只對這一個 key 過濾掉被隱藏的 id,其餘原樣透傳;ctx.effect 在卸載時還原原實現 |
| 觸發重算 | 側欄靠 subscribe('sidebar.panellist') 重算清單。插件每次改動註冊一個 order: 1e9 的哨兵條目來觸發刷新,哨兵本身永遠被過濾,不會出現在菜單裏 |
| 入口與面板 | 入口註冊在 sidebar.footer.action,面板註冊在 shell.overlay(該層本身 click-through,面板根節點自己開 pointer-events:auto) |
| 樣式 | 注入一個 <style data-plugin-css>,顏色/圓角/焦點環全部取 --dsw-alias-*、--dsw-radius-* 等主題 token,跟隨明暗主題 |
Host 側(index.js)是空的:所有邏輯都在渲染進程,不改宿主任何文件。
兼容性¶
能保證:不兼容時被 DSH 安全拒絕,而不是裝成一個半壞的插件。
不能保證:所有 DSH 版本都能用——它依賴上表那三處內部面,而這些會隨版本演化。
| 依賴 | 缺失/變更時 |
|---|---|
engines.dsh + DSH 的 compatibility preflight |
不滿足就 disabling profile plugin …,插件不加載並打印原因 |
sidebar.footer.action / shell.overlay |
缺哪個跳過哪個(contribute() 內 try/catch),其餘照舊 |
entriesOfSlot 可被包住 |
包不住 → 面板顯示「當前版本不支持」,不隱藏、不報錯、不影響側欄 |
- 聲明:
engines.dsh: ">=0.2.0-rc.2"(不封上限,新版本仍會嘗試加載,靠能力探測降級) - 實測:
0.2.1-rc.2(macOS 桌面版) 0.1.x:會被拒絕加載(不是壞掉)。需要的話先做隔離環境實測,再把下限放寬
升級 DSH 後複查三步:底部圖標還在嗎 → 面板能列出項嗎(列出 = entriesOfSlot 還能用)→ 關一項菜單真的少了嗎。
若被拒絕加載,可在 profile 目錄的 compatibility.json 裏給這個包登記顯式豁免(informed grant)——這屬於用戶決策,插件不代勞。
已知限制¶
- 隻影響「全局面板」那一列菜單;不影響工作區裏的會話列表與底部狀態條。
- 「恢復」是撤銷上一步,不是「恢復默認」;撤銷歷史在內存裏,重開應用後清空(持久化的只有當前清單)。
- 若 DSH 換了左側菜單的數據來源,最壞表現是「面板能打開、但隱藏不生效」——側欄本身不會壞。
目錄結構¶
dsh-sidebar-menu/
├─ package.json # bundle 清單:dsh.bundle.patch / dsh.client / engines
├─ cordis.patch.yml # 插入一行插件 entry
├─ index.js # Host 半邊(有意爲空)
├─ client.js # 全部功能:過濾 + 哨兵 + 底部按鈕 + 面板 + 樣式
├─ locale/{zh,en}.json # 插件頁裏的標題與說明
├─ icon.svg
├─ docs/ # README 截圖
└─ LICENSE (MIT)
開發與自檢¶
node --check index.js
node --check client.js
node -e "JSON.parse(require('fs').readFileSync('package.json','utf8'))"
改完熱重載:DSH 裏 ⌘R。想直接看持久化真相:
strings ~/Library/Application\ Support/@deepseek-ai/dsh-desktop/Local\ Storage/leveldb/*.log \
| grep -A1 'dsh-sidebar-menu.hidden.v1'
適用場景與注意¶
適合經常需要精簡左側欄、只保留當前使用面板的開發者。插件以當前 DSH 進程權限運行,安裝前應檢查源碼與許可證。
小結¶
這個插件通過數據層過濾實現了左側菜單項的顯示/隱藏控制,支持逐項開關與批量操作,選擇持久化存儲,並適配主題與無障礙。適合希望在 DSH 中快速調整左側欄佈局的用戶。
- 目錄頁:https://www.skillhub.cn/plugins/Winjazw/dsh-sidebar-menu
- GitHub:https://github.com/Winjazw/dsh-sidebar-menu