← 返回列表
未验证
智能体运行的每一条 rm 都会变成可恢复的移动到 macOS 废纸篓操作。
尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/9/3 · 已提供中文文档
DSH 插件:在每个 bash 会话中拦截 agent rm,并将目标移到 macOS 废纸篓
综合分
28.3
GitHub 分
28.3
用户评分
—
★ Stars
0
周下载量
—
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add NattoCB/dsh-safe-delete该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
信任档位:已验证本站已于 0 天前真实安装成功
- 是什么
- dsh 原生插件 · chat
- 装得上吗
- 本站已真实安装成功(非静态推断)
- 安全吗
- 本站尚未对该插件做风险分级(暂未覆盖,不等同于无风险)
- 还在维护吗
- 活跃:最近一次提交在 22 天前
档位由下列信号合成:本站实装验证(真实安装,当前最高到 L4)· 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。下方各区块是它的证据明细。 验证判据与等级说明 →
🟢实装验证通过· 2026/9/26
由本站实装验证器在真实 dsh 环境安装成功,非静态推断。
数据截至 2026/9/20(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动
README
由 DeepSeek 最新模型翻译生成dsh-safe-delete
智能体运行的每一条 rm 都会变成可恢复的移动到 macOS 废纸篓操作。
在工具注册表上设置一个全局守卫 —— ctx.tools.guard() —— 无需改动任何工具、提示词或核心代码
一个 DeepSeek Harness 宿主端插件,让智能体发出的 rm 命令变得可恢复:目标会被移动到 macOS 废纸篓而不是被删除,覆盖 GUI 会话、自动化运行、无头桥接以及子智能体。在设置 → 通用中的一个开关即可将其关闭 —— 关闭后,命令按 DSH 原生行为执行。
功能特性
- 可恢复删除 —— 处于命令位置的 rm 会被拦截并改写为 /usr/bin/trash -v;模型会收到一份确切移动了哪些内容的报告,因此不会有任何东西悄无声息地消失。
- 所有会话,一个守卫 —— 在 DSH 工具注册表上注册一次;GUI 聊天、定时自动化、无头桥接和子智能体全部覆盖,无需按会话逐一接线。
- 感知 Shell 的拦截 —— 保留引号的词法分析器可捕获复合命令(&&、||、;、|)中的 sudo rm、/bin/rm、带 env/nice 前缀的 rm、VAR=x rm 以及 xargs rm。
- 设计上故障安全 —— 可能隐藏 rm 的构造($(...)、反引号、子 shell、heredoc、eval、嵌套的 sh -c)会被拦截并给出指引,而不是被改写;移动失败会被报告,绝不会作为真正的删除重试。
- 运行时开关 —— 可在 Web GUI 中切换(设置 → 通用 → 安全删除),或通过 POST /safe-delete/config 切换;状态会持久化在 $DSH_HOME/storages/safe-delete.json 中,重启后依然保留。
工作原理
该插件在 DSH 工具注册表上安装一个守卫。每次 bash 工具调用在执行前都会被扫描:
flowchart LR
A["bash tool call"] --> B{"rm in commandposition?"}
B -- "no" --> C["native execution"]
B -- "yes" --> D{"switch on?"}
D -- "off" --> C
D -- "on" --> E{"safelyrewritable?"}
E -- "否:子 shell、eval、heredoc、反引号" --> F["拒绝并给出指引,不执行任何内容"]
E -- "是" --> G["运行 trash -v,拒绝原始命令,报告目标"]
被拦截的调用会被拒绝,并由守卫自身以 trash 方式重新执行,因此引号和 glob 都能保留:
[dsh-safe-delete] intercepted rm — the targets were MOVED TO TRASH (recoverable),
not deleted. Original command denied. Targets: build/ dist
trash: build/ → .Trash/build/
普通的非 rm 命令会原样通过;仅仅提及 rm 的命令(echo rm、grep "rm " log)会被忽略。rm 的标志(-f、-r 等)会被剥离而不是被遵循:trash 原生就能移动整个目录。
范围与限制
| | 已覆盖 | 未覆盖 |
|---|---|---|
| 命令 | rm、sudo rm、绝对路径 rm、xargs rm —— 简单和复合形式 | find -delete、unlink、git clean、各语言运行时自带的文件 API |
| 保证 | 在执行前于守卫层被拦截 | 该守卫是针对最常见破坏性动词的防误操作网,而非沙箱 |
sudo rm 会在 sudo 运行之前就被拦截,但回收需要 root 权限的文件仍可能失败 —— trash 的错误会原样报告。
安装
dsh plugin --profile web add github:NattoCB/dsh-safe-delete
重启 DSH web 进程 —— 宿主侧 bundle 及其补丁在进程启动时加载。启动时插件会记录一次 rm guard active。
配置
| 入口 | 方式 |
|---|---|
| Web GUI | Settings → General → Safe Delete —— 开关在下次 bash 调用时生效,无需重新加载 |
| HTTP | GET /safe-delete/config → { "enabled": bool };POST /safe-delete/config 携带 { "enabled": bool } |
| 文件 | $DSH_HOME/storages/safe-delete.json —— { "enabled": bool } |
默认:启用。 状态文件缺失或损坏也会解析为启用 —— 安装该插件即表达了希望拥有守卫的意图,而损坏的文件绝不会静默降低保护。
开发
npm test # node --test: lexer, rewrite matrix, guard contract, switch store/API
词法分析器/重写器以 exports._internals 导出,以便测试能够覆盖真实的代码路径(analyzeCommand、tokenize、splitSegments、makeGuard、ConfigStore、handleConfigRequest)。
许可证
MIT —— 属于 awesome-dsh-plugin 生态系统的一部分。