dsh-setting-manager:設置頁分區導航顯隱控制

前言

在使用 DeepSeek Harness(DSH)的 Web 界面進行開發時,設置頁面通常包含多個分區導航(如 General、Models、Plugins 等)。當分區數量較多時,導航欄會變得很長,頻繁切換分區需要點擊多次。

dsh-setting-manager 插件通過右鍵菜單的方式,提供了對設置分區導航的批量顯隱控制能力。它不修改渲染邏輯,僅通過 display:none 隱藏分區,同時將顯隱狀態持久化到本地文件,供不同瀏覽器會話複用。

功能說明

右鍵勾選菜單

在設置頁左側的分區導航上任意位置(含標題區)右鍵,會彈出一個浮層菜單。菜單按序列出所有設置分區,每行帶有勾選標記。點擊某一行即可立即切換該分區的顯示與隱藏狀態,並自動保存。菜單在點擊外部區域或按 Escape 鍵時關閉。

批量操作與提示

菜單底部提供了「顯示全部」和「隱藏全部」兩個按鈕,用於批量控制分區狀態,點擊後菜單不關閉。如果導航中沒有任何可見分區,菜單會即時顯示一行居中的提示(使用 DSH 警示色),提示用戶當前已全部隱藏;恢復任意分區後提示消失。

跨瀏覽器持久化

插件的顯隱狀態並非保存在內存中,而是落盤到 $DSH_HOME/dsh-setting-manager.json。這意味着在瀏覽器 A 中隱藏了某個分區,在瀏覽器 B 或刷新頁面後,該分區的隱藏狀態依然存在。狀態文件由 Host 端負責讀寫。

主題與自動適配

浮層的樣式完全遵循 DSH 的主題變量(如 --dsw-alias-*、--dsw-font-family、--dsw-elevation-*),在亮色和暗色主題間自動切換。此外,當 DSH 內部發生分區增減或語言切換時,插件會自動重新匹配標籤並應用之前的隱藏狀態。

Host 端 API 與安全

插件在 Host 端註冊了 /api/setting-manager 接口,提供 GET 和 POST 方法用於讀寫狀態。所有響應都包含安全頭(cache-control: no-store、x-content-type-options: nosniff 等)。請求需經過嚴格校驗:僅允許 Loopback(127.0.0.1、::1)訪問;禁止跨站請求(sec-fetch-site: cross-site);禁止非法 JSON 或過大請求體(超過 16 KB 返回 413);防止 DNS rebinding 攻擊。

安裝與啓用

插件通過 DSH 的包管理器安裝,默認安裝到當前 profile。執行以下命令即可完成安裝:

dsh plugin --profile web add github:coderHeJiyu/dsh-setting-manager

使用方法

1、打開 DSH web GUI,進入設置頁。
2、在左側分區導航欄的任意位置點擊右鍵。
3、在彈出的菜單中點擊行切換分區顯隱;或點擊底部按鈕進行批量操作。
4、刷新頁面或更換瀏覽器,之前的顯隱設置會自動加載。

技術細節

狀態文件結構

狀態文件位於 $DSH_HOME/dsh-setting-manager.json($DSH_HOME 默認爲 ~/.dsh)。

{
  "version": 1,
  "hidden": [
    "models"
  ]
}
  • hidden:數組,存儲被隱藏分區的 ID(對應 settings.section 的 options.id)。
  • 容錯機制:如果文件不存在、解析失敗或格式異常,系統會自動回退到默認狀態 { "version": 1, "hidden": [] }。
  • 寫入方式:採用原子寫入,先寫入 .tmp 文件再重命名覆蓋,防止文件損壞。

API 端點

Host 端在 webServer 下注冊 /api/setting-manager 路由。

GET 請求:獲取當前狀態。
POST 請求:更新當前狀態。
- 請求體格式:{ "hidden": ["section-id"] }
- 空請求體 {} 會被視爲清空隱藏列表。

安全校驗規則

插件通過 Host 端邏輯對請求進行嚴格校驗:
- 非 Loopback 訪問:IP 不在 127.0.0.0/8 或 ::1 範圍內,返回 403。
- Host 頭校驗:Host 頭非 Loopback 主機名,返回 403。
- CORS 校驗:缺少 Origin 或 Origin 不匹配當前源,返回 403。
- 內容校驗:非法 JSON 或 Content-Length 超限(16 KB),返回 400 或 413。
- 響應頭:所有響應均包含 no-store、nosniff、same-origin 和 no-referrer 安全頭。

限制與依賴

功能範圍

  • 插件僅控制 settings.section 的分區導航顯示,不涉及設置頁內部的子控件。
  • 右鍵菜單的觸發依賴導航按鈕的文本與分區標籤的匹配(基於多重集比對),對自定義分區或標籤缺失的情況可能無法識別。

依賴說明

  • 插件依賴 DSH 自帶的 @deepseek-ai/dsh-home-paths 和 @deepseek-ai/dsh-host-webserver。
  • @deepseek-ai/cordis 爲可選依賴,由宿主提供。

跨 Profile 共享

狀態文件是全局唯一的,不區分 profile。如果用戶在多個 profile 中安裝了此插件,它們將共享同一份顯隱列表。

結尾

dsh-setting-manager 解決了設置頁分區過多導致的導航繁瑣問題。它通過輕量級的右鍵菜單和持久化機制,提供了類似 VS Code “Hide View” 的體驗,同時保證了 Host 端的安全性。項目託管在 GitHub 上,許可證爲 MIT。

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

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

小夜