dsh-fs-allowlist:白名单目录无审批写入

DSH(DeepSeek Harness)默认采用沙盒机制,Agent 在非工作区目录进行写入时,常陷入“拒绝访问 → 升级重试 → 手动审批”的循环。dsh-fs-allowlist 插件旨在解决这一痛点,通过拦截写操作,允许对配置的白名单目录进行免审批访问,同时提供设置界面和 Bash 命令的自动批准功能。

核心功能

该插件主要解决两类写入场景的审批问题:

  1. 文件工具(write/edit):包装了 ctx.fs.checkedTarget 沙盒拦截器。当目标路径位于白名单根目录下时,请求会直接通过,无需触发人工审批流程。
  2. Bash 命令:利用 tools/pre-execute 监听命令文本,结合 approval/request 答案机制。若 Bash 命令文本或升级理由中包含白名单路径(支持递归匹配),系统将自动批准该次执行,不再弹出审批窗口。

安装与启用

使用官方命令安装插件到 web 配置文件:

dsh plugin --profile web add "github:wzn16/dsh-fs-allowlist#main"

安装后,需重启 DSH Desktop 才能生效。修改源码目录后同样需要重启。

配置与用法

1. 设置界面管理

推荐使用图形界面配置。在 DSH Desktop 中进入设置,找到“Plugins”选项卡下的“Directory Allowlist”,添加需要免审批写入的目录路径。

2. 配置文件编辑

也可以直接编辑配置文件 $DSH_HOME/fs-allowlist.json。文件格式如下:

{
  "extraWritableRoots": [
    "/Users/you/ObsidianVault"
  ],
  "bashAutoApprove": true
}
  • extraWritableRoots:定义白名单目录。
  • bashAutoApprove:控制是否自动批准 Bash 命令,默认为 true。

配置支持热重载,界面修改即时生效,手动修改配置文件通常在 3 秒内被识别。

工作原理

写入层

DSH 的写入操作默认经过 dsh-fs-sandbox 挂载的 ctx.fs.checkedTarget 拦截器。本插件挂载在该拦截器之上:
- 命中白名单:使用 realpath(解析后的绝对路径)检查目标是否在白名单根目录下,命中则放行。
- 未命中:委托给原始拦截器,维持原有的拒绝/审批逻辑。

Bash 层

Bash 运行在 Seatbelt 进程沙盒中,插件无法扩展其配置。因此采用启发式匹配:
1. 在 tools/pre-execute 阶段记录命令文本。
2. 在审批请求阶段,解析命令文本和理由,展开 ~ 符号。
3. 递归检查是否包含白名单路径。若匹配,自动回复 allowed-once。

注意事项

  1. 许可证:采用 MIT 许可证。
  2. Bash 启发式限制:自动批准依赖于命令文本和理由中包含白名单路径。若两者均不匹配,系统会回退到人工审批(这是安全机制)。
  3. 内部依赖风险:插件依赖 DSH 内部的 ctx.fs.checkedTarget 接口(seam)。若 DSH 进行版本升级并重构了该接口,插件行为可能退化,表现为透明(等同于未安装)。
  4. 安全风险:白名单项意味着 Agent 可无询问写入,请务必保持列表精简。
  5. 配置缺失处理:若配置文件缺失、内容为空或格式无效,插件行为等同于卸载,不会破坏现有会话。

参考资料

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

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

小夜