前言¶
DeepSeek Harness(DSH)在 workspace-write 下,Agent 可以直接改工作区里的文件。系统提权确认框里往往是英文路径和 $ % # 混在一起,扫一眼很难判断点「同意」后会删什么、改什么。全开全权时,误点一次就可能造成大面积删库或动到系统目录。
下面介绍社区插件 dsh-fileguard(维护者 Wldpm,分类 admin-security)。它在模型动手删、改文件之前多拦一道:要求用自然语言说明影响,再由你通过一次性 token 决定是否放行;同时用四档策略和硬限制保护盘根、系统目录等。这是软约束,不是操作系统级安全边界,但能把你从「看不懂就点同意」里拉出来。
这是什么¶
dsh-fileguard 是给 DeepSeek Harness 用的文件守卫插件。在全权模式下,对大部分危险删除与写入先拦截,逼模型讲清楚「动的是什么、有什么用、删改后会怎样」,再由你用 token(相当于钥匙)放行。模型自己产生的临时文件可走旁路台账,在窗口期内免审。
仓库:https://github.com/Wldpm/dsh-fileguard
社区目录页:https://www.skillhub.cn/plugins/Wldpm/dsh-fileguard
当前 package 版本为 0.2.1,许可证 MIT。
硬限制:四类永远不放行¶
无论档位、是否开发者模式,下面四类在规则范围内一律不放行(部分仅针对删除或写入):
| 类别 | 说明 |
|---|---|
| 盘根删除 | 如 C:\、D:\、U 盘盘根等;仅删除时生效,往盘根复制或列举不拦 |
| 系统目录删除 | C:\Windows、Program Files、ProgramData、$Recycle.Bin、Recovery 等 |
| 通配符删除/写入 | 如 Remove-Item *.log;只读如 Get-ChildItem *.txt 不受限 |
| 改插件自身配置 | 配置项值只能通过设置页或斜杠命令改;cordis.patch.yml、本插件 package.json 的模型写入会被拦,读不限 |
原生 shell 命令与 dsh-ops 的 ops_* 工具走同一套规则,例如 ops_remove 与 Remove-Item 判定一致。
四档策略¶
用斜杠命令或设置页切换档位:
| 档位 | 命令 | 删除 | 写入/改盘 | 盘根 | 系统目录·删 | 系统目录·改 |
|---|---|---|---|---|---|---|
| 纯白名单 | /guard-readonly |
拦死 | 拦死 | 拦死 | 拦死 | 拦死 |
| 高拦截 | /guard-high |
拦一次 | 拦一次 | 拦死 | 拦死 | 拦死 |
| 默认 | /guard-default |
拦一次 | 放行 | 拦死 | 拦死 | 拦一次 |
| 低守卫 | /guard-low |
放行 | 放行 | 拦死 | 拦死 | 拦一次 |
- 拦死:重试也不放行,提示中会说明不要再试。
- 拦一次:生成一次性 token;模型需从你处拿到 token 后重发才放行,且只覆盖该批目标。
- 放行:直接执行,模型无额外提示。
拦一次之后的流程¶
被拦后,模型会收到提示,大致需要:
- 说明要动的路径、用途及删改后果。
- 你在聊天框执行
/guard-gettoken取得 16 位 token(输出只进日志,模型上下文看不到)。 - 模型带 token 重发,例如在命令末尾加注释:
Remove-Item 'D:\work\old.log' # fg:<token>;ops_*无命令行时原样重发调用即可。
AI 临时文件免审¶
插件维护旁路台账(state/ai-created.json),记录模型通过 write/edit 或 Set-Content、Out-File 等写入过的路径。在 低守卫 / 默认 档下,删除台账上的路径可直接放行。
限制包括:目录路径不放行、通配符不放行、高拦截/纯白名单档不生效;默认窗口 8 小时,台账最多 5000 条。用 /guard-temp 循环切换 1→4→8→24→72→关,或 /guard-temp 12 设小时数,/guard-temp 0 关闭。
状态目录与配置¶
敏感状态在插件目录下 state/(tokens.json、ai-created.json)。对该目录的读写一律拦死,避免模型窥视 token 与台账。档位、窗口等写在 profile 配置层,设置页可改;直接改 cordis.patch.yml 或插件 package.json 的写入会被拦。
主要配置项(设置页「文件守卫」或 cordis.patch.yml):
| 字段 | 默认 | 说明 |
|---|---|---|
enabled |
true |
总开关 |
policy |
"default" |
low / default / high / readonly |
tempHours |
8 |
临时文件免审窗口(小时),0 关闭 |
devMode |
false |
开发者模式:普通删改与 state/、配置文件可放行并记日志,盘根与系统目录仍硬拦 |
protectedDirs |
见 README | 额外保护目录列表 |
斜杠命令汇总:/guard-low、/guard-default、/guard-high、/guard-readonly、/guard-temp [小时]、/guard-gettoken、/guard-dev [on|off]。
安装与启用¶
前提:插件目录需能解析 @deepseek-ai/schemastery;用 link: 安装时若不在 profile 的 node_modules 搜索路径下,可能要手动建 junction(见 README「依赖坑」)。
方式一,从本地目录安装:
dsh plugin --profile <profile名> add <本仓库绝对路径>
方式二,手动挂载:
- 将仓库放到例如
~/.dsh/plugins/dsh-fileguard。 - 在目标 profile 的
package.json增加dependencies里的"dsh-fileguard": "link:<仓库绝对路径>",并把"dsh-fileguard"写入dsh.profile.bundles。 - 在 profile 目录执行
pnpm install。 - 重启 DSH。
不要用 cordis.patch.yml 的 - insert: 硬塞插件,否则设置页与斜杠命令可能报配置被 home patch 覆盖。正确做法是用 bundles 登记;cordis.patch.yml 里最多保留开关,例如:
- id: dsh-fileguard
disabled: false
若加载报 Cannot find package '@deepseek-ai/schemastery',可在插件目录建 junction 指向 profile 的 node_modules\@deepseek-ai(PowerShell 示例见仓库 README)。
验证:重启后查看日志(默认 %TEMP%\dsh-fileguard.log),应出现 apply; tools=... 与 commands: /guard-low ... 两行;设置页左侧应有「文件守卫」。
已知边界(务必阅读)¶
插件以当前 DSH 进程权限运行,安装前应自行查看源码与 MIT 许可证。README 明确这是软约束:挡不住执意删文件的模型,例如 [System.IO.File]::Delete()、fs.rmSync、run_code 里拼 JS、write/edit 写非 state/非配置路径等绕过方式。它能做的是抬高门槛,让你有时间踩刹车;物理隔离需依赖 OS ACL 或更严格的 workspace-write 策略。
调试时可 /guard-dev on 临时放宽(盘根与系统目录仍拦),用完 /guard-dev off。
结尾¶
在全权模式下仍希望「先看懂再点头」,dsh-fileguard 用拦截、自然语言说明和 user-only 的 /guard-gettoken 把决定权还给你,并用档位与硬限制兜住盘根和系统目录。社区目录与 GitHub 仓库相互独立,与 DeepSeek / 幻方无官方从属关系;需要细节时以 README 为准。