dsh plugin 能做什么、不能做什么?DeepSeek Harness 插件的能力与权限边界
dsh plugin 的能力边界由三层决定:安装期只看 allowBuilds 授权,启动期看它装进了哪个 profile,运行期看工具调用能否通过沙箱权限层与你的审批。 插件与 dsh 同进程运行,能力面很宽,但落地最后一公里始终握在权限层和你手里。
概览:一条 dsh plugin 授权命令,不等于它的全部权限
判断一个 DSH plugin「能做什么」,要按时间分三层看,混层是最常见的误判来源。 下表把三层各自决定什么列清楚(来源):
| 阶段 | 谁在把关 | 决定什么 |
|---|---|---|
| 安装期 | allowBuilds 白名单 | 该包代码能否在你的机器上、于安装时执行 |
| 启动期 | profile 与组合层 | 这个插件被加载进了哪套运行栈、拥有哪些注册项 |
| 运行期 | 沙箱权限层 + 审批 | 它注册的工具这次能不能真的落地执行 |
一句话概括三层的关系:安装期授权的是「代码可以跑」,运行期授权的是「这一次操作可以落地」,两者不能互相推导,也不该混着判断。想先弄清插件本身是什么,读《dsh plugin 是什么意思》。
能力面:DSH plugin 通过 ctx 能注册什么
插件是导出 apply 函数的模块,ctx 是它与宿主唯一的交互面——能力面就在这个面上(来源)。 官方给出的注册入口主要有这几类:
| 注册入口 | 注册出来的能力 | 典型插件形态 |
|---|---|---|
ctx.tools | 模型可调用的工具 | 工具类插件 |
ctx.command | 终端 / 界面命令 | 命令类插件 |
ctx.on | 事件监听 | 埋点、钩子类插件 |
ctx.llm | 模型提供商路由 | LLM 适配器插件 |
ctx.jobs | 后台任务 | 长时任务类插件 |
ctx.effect | 手动资源的处置器 | 连接、定时器、文件句柄 |
这张表也解释了「为什么插件权限等于 dsh 的权限」:官方文档在讲工具契约时明确,注册后的贡献是同进程的类型化贡献,不是序列化边界——插件代码就跑在 dsh 进程里(来源)。所以它的能力下限很高,真正的约束来自下面两层。
安装期边界:DSH plugin 的 allowBuilds 是不进沙箱的真实执行
GitHub 源码安装时要求你放行的 allowBuilds,官方定义是「授权该包的代码在你的机器上于安装时执行」——不在任何沙箱内(来源)。 判断与操作按四步:
- 先确认装的是什么形态 —— npm 预构建包发布时已构建好产物,装完即用,预期:不需要任何构建脚本授权,风险面最小;
- 只有 git 源码才要求放行 —— pnpm 10 起默认拒绝执行 git 依赖的构建脚本,首次
add会失败并打印需要放行的包名,预期:你拿到的是精确的包名,而不是一个模糊的范围; - 放行就等于给执行许可 —— 把包名写进 profile 的
pnpm-workspace.yaml:
allowBuilds:
dsh-hello-plugin: true
预期:重新 add 后脚本在安装时执行,此后的行为你无法预知也来不及拦;
4. 拿不准就别授权 —— 改装 npm 预构建版或 tarball,预期:装完即用,不需要任何构建授权。
这条边界最容易被误读成「安装时的临时动作」,实际它是真实执行:授权之前先审源码,或换来源更可靠的分发形态。
运行期边界:DSH plugin 工具调用要过权限层与审批
插件注册了工具,不等于工具能随便落地——每次调用都要过沙箱档位校验与人工审批(来源)。 按一次调用的顺序走四步:
- 插件声明权限策略扩展点 —— 官方建议权限判断不要写进工具本体,而是用
tools/pre-execute(放行 / 拒绝 / 追问)、ctx.tools.guard()(不可撤销的最终拒绝)、tools/execute(环绕派发,可加超时与重试)这些扩展点(来源)。预期:工具体保持纯粹,策略集中可查; - 调用携带权限档位参数 —— 需要放宽时,请求带
sandbox_permissions,并在justification里写明理由才能通过校验。预期:档位只允许朝更宽的方向变化,同级请求会被判为非法升级(讨论原文); - 权限策略要求审批时弹窗问你 —— 涉及审批的操作,Web UI 会在执行前弹窗征求同意,批准后才继续(来源)。预期:这是执行前最后一道人工闸口;
- 越权请求被拒 —— 档位不够又不满足升级条件时,调用被拦下。预期:任务表现为「停下来等答复」,而不是悄悄绕过。
记住两个推论:插件与模型都无法绕过审批;弹窗出现时看不清操作内容就别点允许,那是你手上唯一的否决机会。沙箱档位被反复拒绝的排查,见《沙箱权限升级被拒排查》。
三条容易混淆的 DSH plugin 边界
把边界划清,能避免「装了个插件就以为交出了电脑」或「以为审批能拦住一切」这两类相反的错误。 三条边界按「插件 / 工具 / profile / 审批」四个对象划分(来源)。
- 插件权限 ≠ 工具调用的权限:插件注册得再多,单次调用仍要过档位与审批;反过来,插件在
apply里跑的非工具代码是进程内代码,不经过工具审批链路。所以插件来源本身就是一道判断。 - 一个插件 ≠ 一套独立权限:profile 决定它被加载进哪套运行栈,同一个插件装进
web与headless是两个独立实例、各自组合。装错 profile 是「装完没反应」的常见原因。 - 审批是闸口不是审计:审批拦的是执行前,不是运行中的行为。要可控可审计,优先选带审批门控与审计日志的插件,装完再用下文方式核对。
怎么查一个 DSH plugin 的边界:三步核对
别只看插件描述,用三条命令与一个入口把它落到具体位置。 按顺序执行(来源):
- 确认它在当前 profile 里 ——
dsh plugin --profile web list。预期:看到包名与版本,说明它属于这套运行栈; - 确认它进了生效的组合层 ——
dsh --profile web --dump-config | grep -n "^# =="。预期:生效层里出现该插件的层,而不是只躺在依赖清单里; - 确认它注册了什么 —— 在终端里对照它加载时打印的注册项(工具名、命令名),或在会话里看工具列表。预期:注册项与插件描述对得上,多出意料之外的能力就该警惕;
- 核对来源与兼容状态 —— 打开 DSH Plugin Hub 的「设置 → 插件市场」,在插件详情里看来源是 npm 还是 GitHub、兼容的 DSH 版本与验证状态。预期:来源可溯、版本对口,再决定是否长期保留。
装的时候还会弹一次确认窗口,把将要执行的安装命令与来源摆在你面前。

与其事后靠命令逐条反查插件注册了什么,不如在安装那一步就用 Hub 把来源、版本与执行命令核对一遍——确认弹窗会把这几项列全。访问 https://dsh-plugin.org/zh/ 即可了解详情。
来源:构建一个工具(官方文档)、第一个插件(官方文档)、打包与安装插件(官方文档)、官方 Quickstart、Discussion #1149
常见问题
DSH plugin 装进 profile 后与 dsh 同进程运行,能注册模型可调用的工具与终端命令、监听事件、在 ctx.llm 上注册模型提供商路由、开后台任务。它做不到的是绕过宿主:工具能否真正落地,还要过沙箱权限层与你的审批,插件自己改不了这道闸。
DSH plugin 不会被整体关进沙箱,限制作用在哪一层要分清楚:插件模块本身跟 dsh 同进程加载,沙箱约束的是它注册的工具在运行时能否越出当前权限档位——档位不够时请求会被拦下并要求授权,而不是插件被关在笼子里。
给 DSH plugin 授权 allowBuilds,等于授权该包的代码在你的机器上于安装时执行,而且不在任何沙箱内——官方对它的定义就是这么写的。这跟运行期的权限档位不是一回事,所以只给审过源码、来源可信的包放行。
审批能拦住 DSH plugin 的越权操作:当某个操作在当前权限策略下需要审批时,Web UI 会在执行前弹窗征求你的同意,批准后才继续;插件侧还可以通过 tools/pre-execute 与 ctx.tools.guard() 追加自己的放行、拒绝或追问策略。审批是执行前最后一道人工闸口。
查一个 DSH plugin 注册了什么有三个入口逐层查:用 dsh --profile web --dump-config 看生效的组合层里有没有它;用 dsh plugin --profile web list 核对它确实装在当前 profile;在插件市场打开该插件详情页,核对来源、兼容版本与它声明的能力描述再做判断。
相关术语
- ctx
- ctx 是 DSH plugin 框架传给 apply 的上下文对象,也是插件访问框架能力的唯一入口:注册工具走 ctx.tools,注册事件走 ctx.on,交出清理函数走 ctx.effect,读取其他服务走 ctx.get。— DeepSeek Harness 官方文档 - 第一个插件
- allowBuilds
- allowBuilds 是 pnpm 的构建脚本白名单。在 DSH 语境下,官方把它定义为「授权该包的代码在你的机器上于安装时执行」,且不在任何沙箱内,因此只应放行来源可信、审过源码的包。— DeepSeek Harness 官方文档 - 打包与安装插件
- sandbox_permissions(沙箱权限档位)
- sandbox_permissions 是工具调用携带的权限档位参数,用于在工作区写入与完全访问等档位之间请求授权;它只允许朝更宽的方向变化,取值必须配上 justification 说明才能通过校验。— deepseek-harness Discussion #1149
- 工具审批(approval)
- 工具审批是执行前的人工确认环节:当操作在当前权限策略下需要审批时,Web UI 会先弹窗询问,用户确认后才执行。它是插件与模型都无法绕过的最后一道闸口。— DeepSeek Harness 官方文档 - Quickstart
来源
- DeepSeek Harness 官方文档 - 构建一个工具· deepseek-ai
- DeepSeek Harness 官方文档 - 第一个插件· deepseek-harness
- DeepSeek Harness 官方文档 - 打包与安装插件· deepseek-ai
- DeepSeek Harness 官方文档 - Quickstart· deepseek-harness
- deepseek-harness Discussion #1149:write / bash 调用必须提交 sandbox_permissions 与 justification· deepseek-ai(GitHub Discussions)