dsh-workspace-gate:按工作区收窄插件在 prompt 里的可见面

前言

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 不安装、卸载、升级其他插件
组级开关,可展开到单个工具名/段名 不改变其他插件的全局启用状态
按来源分档(第三方 / 自定义 / 官方 / 官方可选包) 不能把全局已停用的插件「变出来」
自动归属推断 + 静态扫包 + 手工归属 不回溯已开会话里已发出的前缀

核心功能

  1. 工作区级收窄:配置单位是目录;给父目录配一次,子路径继承。
  2. 两类可见面:工具 schema 与系统提示词段(后者通过同名空文本段遮蔽)。
  3. 按来源分档展示:依据 bundle 的 availability;第三方档默认展开,官方档默认收起,便于批量勾选。
  4. 归属推断:段名命名空间、工具名前缀、静态扫包(第三方包递归扫 .js 里 name: 定义),界面可手工矫正并写入全局 assignments。
  5. 模型可调工具 workspace_gate:支持 status / list / set(dir 须为绝对路径)。
  6. 管理界面:插件管理页增加 「按工作区」 页签,显示当前目录、隐藏组数、约估每轮节省的 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 重载。

务必知晓:

  1. 不是「真·停用插件」:插件仍在进程内加载;省的是模型上下文里的 schema 与段,不是内存或启动成本。
  2. 只减不加:无法通过本插件给某目录「额外」启用全局已关的插件能力。
  3. 归属有硬边界:官方内置在 app.asar 内无法静态扫包,动态注册且无包文件的工具可能落在「未归属」,需手工归类。
  4. 安全与信任:插件以当前 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
羽毛球分组比赛记分
小程序二维码

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

Xiaoye