dsh-turn-approval:为 DSH Web 审批卡片增加任务级授权

前言

DSH 的智能体工作流里,审批卡片负责控制高风险操作。默认权限保持 workspace-write + ask 时,Agent 每遇到一次高权限请求都会弹出审批。对于同一个任务内多次同类请求,重复确认会增加操作成本;但直接放开全局高权限,又容易超出当前任务需要的范围。

dsh-turn-approval 针对 DSH Web 的审批卡片增加一个任务级授权入口:点击「允许本次任务」后,当前 turn 内后续明确匹配的 danger-full-access 升级可以自动放行;turn/end 后授权消失。

这是什么

dsh-turn-approval 是 DeepSeek Harness(DSH)社区插件,仓库为 arrow949/dsh-turn-approval,License 为 MIT。

它为 DSH Web 审批卡片增加「允许本次任务」按钮,用于在单个 turn 内临时放行特定类型的高权限升级。它不改变 DSH 默认权限模型,也不把整个 session 切换为 full access

核心功能

默认情况下,DSH 权限保持 workspace-write + ask。当 Agent 请求 danger-full-access 时,审批卡片会提供三个选择:

[拒绝] [允许一次] [允许本次任务]
  • 拒绝:拒绝当前操作。
  • 允许一次:只放行当前操作。
  • 允许本次任务:当前 turn 内,后续明确匹配的 danger-full-access 请求自动放行;turn/end 后授权自动失效。

该插件的关键约束如下:

  • 授权仅保存在内存,不写入磁盘。
  • 授权绑定 session + turn,一个 session 的授权不影响另一个 session
  • 子代理使用独立 session,不继承该授权。
  • 只自动放行明确匹配的 danger-full-access 升级;workspace-write 和其他审批仍逐一询问。
  • grant 只能由审批卡片按钮建立,模型没有自行开启任务授权的入口。
  • 自动放行仍保留完整的审批事件记录。
  • 仅支持 DSH Web;headless profile 没有 UI 入口,任务授权端点不会注册。

安装与启用

从 GitHub 安装时,命令使用 <commit-sha> 占位符;已核实资料未提供具体 SHA,替换前请自行确认要固定的提交:

dsh plugin --profile web add github:arrow949/dsh-turn-approval#<commit-sha>

该包是已提交构建产物的纯 ESM JavaScript。从 GitHub 安装时不需要 prepare 脚本或 pnpm allowBuilds 权限。

安装后执行以下步骤:

1、重启 DSH Web。

2、在浏览器中硬刷新:

Ctrl+Shift+R

3、检查审批卡片是否出现第三个按钮「允许本次任务」。出现后表示插件已加载。

也可以查看当前 profile 是否挂载插件层:

dsh --profile web --dump-config

典型用法

1、正常使用 DSH,权限仍保持 workspace-write + ask

2、当 Agent 请求 danger-full-access 时,先阅读审批原因与命令。

3、如果当前任务内还需要多次同类高权限操作,点击「允许本次任务」。

4、当前任务内后续同类 danger-full-access 请求会按规则自动放行。

5、当前任务结束后,下一条消息会重新逐项询问。

如果端点返回非 2xx 或网络请求失败,卡片会明确提示失败并保持可重试;它不会假装授权已建立,也不会静默降级为「允许一次」。

安全边界

授权失效是 fail-closed 的。以下情况会使任务授权失效:

  • DSH 进程重启。
  • 插件卸载。
  • session 或 agent 被释放。

它不会把整个 session 切换为 full access。一个 session 的授权不影响另一个 session;子代理使用独立 session,不继承授权。

从触发入口看,grant 只能由审批卡片按钮建立。即使当前任务内已授权,插件也只会自动放行明确匹配的 danger-full-access 升级;workspace-write 和其他审批仍逐一询问。

自动放行仍保留完整的审批事件记录,后续排查时仍能看到相关审批事件。

实现与兼容性

该插件作为 DSH bundle 的一部分接入:package.json 声明 dsh.bundle.patchcordis.patch.yml 将插件加入 profile。client half 通过官方 conversation.composer chain 槽位以更高优先级渲染审批卡片。

它不修改任何 DSH 官方 bundle 文件。卸载后 Node half 与 client half 会一并移除,审批卡片回到 DSH 官方默认的两个按钮。

当前外观复用官方 ApprovalPanel 的内部 CSS 类名。若未来 DSH 改动该组件结构或 CSS module 类名,可能需要发布兼容更新。

卸载

卸载命令:

dsh plugin --profile web remove dsh-turn-approval

卸载后不会遗留对 DSH 官方文件的修改。

结尾

dsh-turn-approval 的价值在于把「允许一次」和「全局放开」之间拆出一个更小的粒度:当前 turn。它适合需要在 DSH Web 中减少重复审批、但不想扩大权限范围的场景。

GitHub 仓库:

https://github.com/arrow949/dsh-turn-approval
羽毛球分组比赛记分
小程序二维码

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

小夜