dsh-subagent-gate:在子智能体扩沙箱前向你确认

前言

在 DeepSeek Harness(DSH)里委派子智能体(subagent)时,宿主会把每个被委派的子会话的审批策略钉在 approval: "never" 上(见 @deepseek-ai/dsh-subagent 中的 captureDelegatedPolicyOverrides)。子智能体若要发起一次「放宽沙箱」的 escalation,请求会在任何人都未被询问之前就被拒绝;父会话可以走人工审批,子会话却不能。

若你希望「子树里仍有人在回路时,扩权限必须先问人」,需要在不改动沙箱模式、权限预设表和父会话默认行为的前提下,只把子会话那一个审批旋钮改回 ask,并把产生的审批请求转给你。dsh-subagent-gate 就是为这个缺口写的 Host 端插件:维护者为 00wz,在 SkillHub 目录中归类为 admin-security。

这是什么

dsh-subagent-gate 是一段仅运行在 DSH 宿主上的插件:无客户端 bundle、无 UI 文案、无远程方法。它只做两件事——对仍受「祖先在 ask 下」管辖的子智能体,把审批策略从 never 改回 ask;在 approval/request 链路上通过 human 阶段把确认卡片路由到你指定的会话视图。沙箱边界本身不改,普通工具调用(含被沙箱直接拒绝的调用)不会经过本插件。

工作原理概要

宿主事件大致如下:

agent/created ─────► Coverage ─────► Knobs   (child: never → ask)
approval/request ──► Coverage ─────► Pipeline ─────► Outcome ─────► Audit
                                        │
                                        └─ stages: human
                                                   rules / denylist / trust /
                                                   judge / autoapprove (planned)

要点如下:

  1. 只管「被管辖」的子会话。 祖先链上若有人运行在 ask 下,该子会话才被管理;danger-full-access / never 子树下的子会话不动,它们已继承全权限,没有可 escalation 的空间。
  2. 只动审批策略,不动沙箱。 门控的是「是否允许一次性放宽」;子智能体平时能触达的范围仍由沙箱决定。
  3. 仅挂钩 approval/request。 其它工具路径不进入本插件。
  4. 失败即拒绝(fail closed)。 拒绝、取消、超时、无应答方或内部错误一律 rejected;只有人工给出 allowed-once 才会 allow。
  5. 同时只展示一张卡片。 并发询问按 FIFO 串行;排队中的询问尚未开始计时。
  6. allowed-once。 一次确认只放行一次调用,不记忆;按会话放行叶子权限尚在路线图中。

安装

插件以 npm 包形式安装,请使用资料中的命令,不要对源码目录做 link: 安装(链接包会从 profile 外解析 @deepseek-ai/* 对等依赖导致加载失败)。

# npm
dsh plugin --profile <profile> add dsh-subagent-gate

# 或从打包产物安装
npm pack
dsh plugin --profile <profile> add ./dsh-subagent-gate-0.1.3.tgz

环境与兼容: package.json 标明 Node >=22.19,面向 DSH 0.2.x 编写,并在 0.2.2-rc.1 上测试;通过公开接缝挂载:agent/created、approval/request、approval.setPolicy、approval.overrideOf、systemPrompt.context、commands.register。

安装前请自行查看 GitHub 仓库 源码与 MIT 许可证。插件与 DSH 宿主同进程、同权限运行,属于 admin-security 类能力,只应在信任其代码的前提下安装。

配置

首次执行 on / off 会在 $DSH_HOME/dsh-subagent-gate/config.json 创建配置;文件不存在时使用默认值:

{
  "version": 1,
  "enabled": true,
  "forwardTo": "root",
  "directProbeMs": 5000,
  "humanTimeoutMs": 0,
  "onTimeout": "reject",
  "onNoAnswerer": "reject",
  "provenance": true,
  "promptSuffix": "",
  "audit": true,
  "stages": [{ "id": "human", "enabled": true, "order": 100 }]
}

常用字段含义:

键 含义
forwardTo 确认卡片的目标策略 id(见下表)
directProbeMs 一次性 auto 探测的预算;0 关闭探测
humanTimeoutMs 0 表示无限等待人工;否则按 onTimeout 处理超时
onTimeout / onNoAnswerer 默认 reject,也可设为 allow
provenance 在询问前加上 [subagent <id> · depth <n>] 等展示信息
promptSuffix 追加给模型侧的说明文本
audit 每次决策追加一行 JSONL 到 audit.jsonl

目标策略 forwardTo:

id 行为
root(默认) 最近的非 subagent 祖先——通常是你正在查看的会话,卡片始终可见
self 子智能体自己的会话(仅在该会话仍打开时可见)
auto 每个进程对 self 探测 directProbeMs 一次,再回落到 root 并固定
其它 id 在 target 注册表中查找;未知 id 回落 root

默认 root 是因为 stock Web UI 把审批卡片绑在当前打开的会话视图上;侧栏树里的 subagent 仍是另一套会话视图。

典型用法

开关与状态

在 DSH 会话中使用斜杠命令:

/subagent-gate status     # 模式、目标、超时、已武装的子会话、配置路径
/subagent-gate on|off     # 启用/禁用;off 会恢复被改过的子会话审批策略

启用后,当被管辖的子智能体因扩沙箱触发 approval/request,流水线进入 human 阶段,按 forwardTo 把卡片送到你的会话;你确认则单次 allowed-once 放行,否则 fail closed。

审计与排查

若 audit: true,可在 $DSH_HOME/dsh-subagent-gate/audit.jsonl 查看每次决策记录。status 可核对当前是否 armed、超时与转发目标是否与预期一致。

适用场景与限制

适合谁: 日常使用 DSH 委派 subagent、又希望「子智能体扩权限必须经过人」的团队或个人;与目录分类 admin-security 一致,本质是审批链路上的治理插件,而非 UI 或客户端增强。

已知限制(README 原文):

  1. 审批卡片绑定在你正在查看的会话上,因此默认 forwardTo: root。
  2. 本插件只处理 approval 询问。不经由 approval 就能绕过沙箱的调用(例如部分 MCP 在自有进程做 I/O 的工具)看不到;若要从每次工具执行前拦截,需要挂在 tools/pre-execute 等路径上的阶段,不在当前核心范围内。
  3. DSH 会给每个子会话追加一条与 never 策略绑定的委托说明;本插件改的是实际合同(允许在人工确认下 ask),上游若按策略条件化该文案会更一致——属兼容性说明,不影响门控逻辑本身。

路线图中还计划 rules、denylist、trust、judge、autoapprove 等 pipeline stage,当前核心仅 human 阶段可用。

结尾

dsh-subagent-gate 在不动沙箱与父会话默认行为的前提下,把受管辖子智能体的扩权审批从「永远不问」改回「先问人」,并把卡片路由到你正在看的根会话或其它策略目标。安装命令、配置字段与斜杠命令均以上述 README 为准。

SkillHub 为社区插件目录站点,与 DeepSeek / 幻方无官方从属关系;选用插件时请结合源码审阅与自身安全策略自行判断。

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

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

小夜