前言¶
在使用 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。