前言¶
DeepSeek Harness(dsh)的插件管理是全局开关:一个 bundle 要么对所有工作区都启用,要么都关掉。插件一旦启用,它的工具 JSON schema 和系统提示词段会在每一轮请求里进入模型上下文,即使用户当前对话根本用不到那些能力。装了很多插件、或 preset 作用域并集很大时,这种「前缀税」会稳定占用输入 token。
下面介绍社区插件 dsh-workspace-gate(维护者 M1r0er,分类 admin-security)。它不改动「插件是否加载」,而是按目录(工作区)决定哪些插件组的工具 schema 与提示词段不再进入该目录下的请求,把「要不要让模型看见某个插件」从全局下沉到工作区。
这是什么¶
dsh-workspace-gate(界面名:工作区插件门控)是标准 DSH bundle,在插件照常加载的前提下,用 ctx.tools.restrict() 等收窄原语只减不加:在指定目录及其子目录(继承最近祖先配置)下,隐藏选定插件组的工具与同名系统提示词段。全局插件开关、sandbox、approval 策略它都不碰;配置异常时 fail-open,当作未配置、全放行。
生态上,DSH 主张「一切皆插件」;SkillHub 目录页 与 GitHub 仓库 是社区维护的入口,与 DeepSeek / 幻方无官方从属关系。
它解决什么问题、不做什么¶
典型场景包括:装了写作或搜索类插件但多数时间在写代码;离线项目不应把联网工具 schema 带进 prompt;同一台机器上学生区与教师区需要不同的工具可见面。本插件让你在不反复改全局 disabled、不触发整 profile 重载的前提下,按目录关掉「模型侧」的可见项。
| 会做 | 不会做 |
|---|---|
| 按目录(子目录继承)决定哪些工具/段不进 prompt | 不安装、卸载、升级其他插件 |
| 组级开关,可展开到单个工具名/段名 | 不改变其他插件的全局启用状态 |
| 按来源分档(第三方 / 自定义 / 官方 / 官方可选包) | 不能把全局已停用的插件「变出来」 |
| 自动归属推断 + 静态扫包 + 手工归属 | 不回溯已开会话里已发出的前缀 |
核心功能¶
- 工作区级收窄:配置单位是目录;给父目录配一次,子路径继承。
- 两类可见面:工具 schema 与系统提示词段(后者通过同名空文本段遮蔽)。
- 按来源分档展示:依据 bundle 的
availability;第三方档默认展开,官方档默认收起,便于批量勾选。 - 归属推断:段名命名空间、工具名前缀、静态扫包(第三方包递归扫
.js里name:定义),界面可手工矫正并写入全局assignments。 - 模型可调工具
workspace_gate:支持status/list/set(dir须为绝对路径)。 - 管理界面:插件管理页增加 「按工作区」 页签,显示当前目录、隐藏组数、约估每轮节省的 token,并提供「重新扫描」。
数据写在 profile 的 data/workspace-gate.json(示例路径 ~/.dsh/data/workspace-gate.json),主要字段为 overrides(按工作区的隐藏清单)与 assignments(全局手工归属)。
安装与启用¶
版本要求:engines.dsh = ^0.2.1-rc.2;更老的 DSH 会被插件管理器直接拒绝安装。npm 已发布,README 推荐能访问 registry 时使用固定版本安装。
方式 1 · 助手安装(需 Creator 等启用 plugin_manager 的预设)
在新会话中让助手执行安装 spec:
帮我安装这个 DSH 插件:github:M1r0er/dsh-workspace-gate
方式 2 · Web 插件页
在 DSH 插件 页安装入口填写 github:M1r0er/dsh-workspace-gate(或本地 bundle 绝对路径),按提示批准脚本后刷新;确认列表中出现 dsh-workspace-gate 且 工作区插件门控 为开启。
方式 3 · 命令行
# CLI(profile 非 Desktop 时)
dsh plugin --profile <your-profile> add github:M1r0er/dsh-workspace-gate
# 或从 npm(README 示例版本)
dsh plugin --profile <your-profile> add dsh-workspace-gate@0.1.1
注意:--profile 决定修改 ~/.dsh/profiles/<your-profile>;桌面 GUI 使用 desktop profile,装进 web 不会在桌面窗口出现。仅用 pnpm add 不会写入 dsh.profile.bundles,还需在 Web 插件页打开该 bundle,或在 package.json 的 dsh.profile.bundles 末尾加入 "dsh-workspace-gate",必要时重启 DSH。
若在插件管理页关闭「工作区插件门控」这一行,门控整体不生效,行为回到未安装时的 fail-open。
典型用法¶
给人用的流程:插件管理 → 「按工作区」→ 选择或添加目录 → 关闭不需要的插件组(可展开到单个工具/段)→ 保存。对新会话生效,已进行中的会话不会回溯已发送的前缀。
给模型用的 workspace_gate 示例(摘自 README):
workspace_gate(action:"status")
workspace_gate(action:"list")
workspace_gate(action:"set", dir:"D:\\Projects\\api", hide:["plugin:r18-novel"])
workspace_gate(action:"set", dir:"D:\\Projects", show:["tool:read"])
隐藏写法:plugin:<分组 id>,或 tool:<工具名> / section:<段名>。show 从当前目录的隐藏清单中移除对应项。
workspace_gate 未使用 deferLoading:在子会话中可能直接不可见,需以界面或 workspace-gate.json 配置为主。
适用场景与注意¶
适合:同一 profile 下多项目、多角色目录并存,希望省每轮 prompt token 而非卸载插件;需要比全局开关更细粒度,又不想为两个工作区来回改 disabled 触发 Loader 重载。
务必知晓:
- 不是「真·停用插件」:插件仍在进程内加载;省的是模型上下文里的 schema 与段,不是内存或启动成本。
- 只减不加:无法通过本插件给某目录「额外」启用全局已关的插件能力。
- 归属有硬边界:官方内置在
app.asar内无法静态扫包,动态注册且无包文件的工具可能落在「未归属」,需手工归类。 - 安全与信任:插件以当前 dsh 进程权限运行;安装前请阅读 源码与 MIT 许可证,自行评估是否纳入 admin-security 类管控流程。
README 在 desktop profile、DSH 0.2.0-rc.2 环境下记录了验证:对某目录隐藏 tool:read 与 section:free-search:engines 后新开子会话,对应工具与段不再出现在 agent 可见列表中;具体数字因 preset 并集与插件数量而异,不宜外推为通用节省比例。
结尾¶
dsh-workspace-gate 把插件对 prompt 的成本从「全局一律承担」改为「按工作区选择承担」:插件仍全部加载,但在你指定的目录下摘掉不该出现的工具 schema 与提示词段。需要安装说明与边界细节时,以仓库 README 为准。
- 目录页:https://www.skillhub.cn/plugins/M1r0er/dsh-workspace-gate
- GitHub:https://github.com/M1r0er/dsh-workspace-gate