dsh-slots-manager:不碰上游,編排 DSH 界面槽位

前言

DeepSeek Harness(DSH)的 Web 界面裏,很多入口來自各插件往「槽位」裏註冊的條目:設置對話框左側的分區、左側欄的面板圖標、欄底動作按鈕等。插件一多,順序、顯隱、文案往往各管各的,改一處可能要動上游或改多個插件配置。

下面介紹社區插件 dsh-slots-manager(維護者 Yiklek,分類:工作流)。它在客戶端槽位註冊表上統一做顯示/隱藏、排序、改名,不需要修改 deepseek-harness 或其它插件源碼。

這是什麼

dsh-slots-manager 是 DSH Web 插件:編排其它插件貢獻到界面上的槽位條目——顯示/隱藏、排序、改名——而不動上游。

實現上分兩塊:

  • 槽位無關引擎:在 ctx.slots 對應的原型上打三個補丁,對每個納管槽位套用一份策略;
  • 槽位表(src/slots.ts):唯一寫明具體槽位的地方;加一個槽位 = 加一行。

當前版本(package.json 爲 0.1.0)納管三類槽位:

槽位 位置 隱藏 排序 改名
settings.section 「設置」對話框左側導航分區 ✅ ✅ ✅
sidebar.panellist 左側欄面板圖標按鈕 ✅ ✅ ✅
sidebar.footer.action 左側欄底部、Settings 旁的動作 ✅ ✅ ❌

sidebar.footer.action 不提供改名:該槽位註冊項不聲明 label,按鈕文案由組件通過 locale 渲染,改 label 無可見效果,因此 UI 不提供改名按鈕。

核心功能

管理面板與入口

兩個入口打開同一套編排面板:

  1. 設置對話框左側導航裏的 「設置編排」 分區(排在頂部附近,不可隱藏);
  2. 左側欄「插件」頁 → 本插件詳情頁(與 dsh-mnemon、dsh-context 等配置區相同位置:plugins.bundle.config,按包名 keyed)。

面板按組展示「設置頁」「左側邊欄」等,每組可 重置本槽位。

策略如何生效

引擎在 SlotRegistry.prototype 上打三個補丁,覆蓋註冊與讀取路徑(cordis 服務代理動態取方法,對所有插件立即生效):

補丁 攔截點 作用
register 註冊入口 記錄原值(order / label / registrant),不改寫,便於 reset 還原
entries 列表讀取方(如設置外殼導航) 過濾隱藏 + 讀時改寫 order/label(返回克隆)
entriesOfSlot 渲染器與側邊欄面板列表 過濾隱藏 + 原地替換 entry.options(保留對象身份,避免 StaleAuthorizationError)

策略經 DSH 標準 settings 命名空間 slots-manager 持久化;宿主半區把策略聲明爲本插件的 Config,客戶端經 remote.settings 讀寫,由 SettingsProvider 落盤。持久化文檔按槽位分組,例如:

{ "version": 1, "slots": { "settings.section": { "hidden": {}, "order": {}, "labels": {} } } }

分組不是裝飾:條目 id 只在單個槽位內唯一;扁平結構會導致隱藏一處誤傷另一槽位同名 id。

安裝與啓用

官方 CLI:

dsh plugin --profile web add dsh-slots-manager

或在 profile 倉庫裏用 file: 依賴,並在 package.json 的 dsh.profile.bundles 中加入 dsh-slots-manager,然後執行 pnpm install。用 file: 前需在本插件目錄執行 pnpm build(main/exports 指向 lib/ 構建產物)。

重啓 dsh web 後生效。

與 dsh-settings-manager 互斥:本插件是其替代品(同一套補丁機制,範圍更大)。兩者同時啓用會疊加兩套補丁;啓用前請先移除 dsh-settings-manager。本插件不讀取舊插件留下的配置,命名空間與文檔結構均爲新建,無自動遷移。

插件在當前 DSH 進程權限下運行;安裝前請自行查看 GitHub 倉庫 源碼與 MIT 許可證。

典型用法

  1. 安裝並重啓 dsh web 後,打開 設置 → 設置編排,或從左側欄 插件 頁進入 dsh-slots-manager 詳情配置區。
  2. 在對應槽位組內:對條目開關顯隱、拖拽或調整順序、在支持改名的槽位修改顯示名稱。
  3. 若改亂,對該組點 重置本槽位;策略會寫回 slots-manager 命名空間,刷新後仍保留(由 SettingsProvider 持久化)。

非納管槽位(如 conversation.*、plugins.*、shell.* 等)不會被本插件修改。

適用場景與注意

適合誰

  • 裝了多個 DSH Web 插件,想統一整理設置分區順序、隱藏不用的面板圖標、改設置裏分區標題;
  • 希望欄底動作(如部分插件的 insights 入口)與其它槽位在同一處管理顯隱,而不逐個改各插件開關(與插件自帶顯示開關不衝突,本插件價值在於統一位置)。

限制與說明(摘自上游 README)

  • 隱藏 sidebar.panellist 條目只隱藏入口;對應主面板仍可能通過其它路徑到達(側邊欄點擊走 selectPanel(id))。
  • 本插件分區 slots-manager 不可隱藏;Settings 入口在 sidebar.settings,即使隱藏所有面板圖標仍可進設置恢復。
  • 基礎設置分區先於第三方插件註冊,引擎在首次讀取時補記原值,不依賴插件加載順序。

開發構建(供貢獻者或 file: 依賴):pnpm install、pnpm typecheck、pnpm build;測試含單元、e2e 冒煙與 Playwright(見倉庫 README)。

結尾

dsh-slots-manager 用三個 SlotRegistry 補丁和一張可擴展槽位表,在不動上游的前提下集中管理設置分區、側欄面板與欄底動作的顯隱、順序與改名。社區目錄頁:skillhub.cn/plugins/Yiklek/dsh-slots-manager;源碼與詳細設計:github.com/Yiklek/dsh-slots-manager。

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

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

小夜