DeepSeek Harness 左側菜單顯示/隱藏開關

前言

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。

使用

  1. 左側欄最底部(「Jev 統計」與頭像之間)多了個滑塊圖標,點它。
  2. 彈出「左側菜單設置」,逐項開關。
  3. 需要批量處理就用底部四個按鈕。
  4. 完成 或 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
羽毛球分组比赛记分
小程序二维码

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

小夜