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。

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

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

小夜