前言¶
在 DeepSeek Harness(DSH)里让智能体跑 shell 时,常见做法是临时 mkdir 一个工作目录放产物。路径往往不可预测,任务结束后也缺少统一记账,事后只能凭猜测去 C 盘或用户目录里找「多了什么」。DSH 自身缓存体量很小,真正占空间的是这类落点分散的目录。
dsh-workspace-mgr(工作區守衛)的定位是从源头上制止在受保护磁盘上新建产物路径,并为每个会话提供固定 scratch 落点;扫描与索引用于兜底和账本,而不是替代拦截。它不是全盘扫描清理工具,也不会在未经确认时自动删除文件。
这是什么¶
- 插件名称:
dsh-workspace-mgr(npm 包名同左) - 维护者:GitHub 用户 a0035s(package.json 作者字段为 ADEN)
- 分类:admin-security(SkillHub 目录分类)
- 许可证:MIT;要求 Node.js >= 20
- 解决的问题:拦截落在受保护磁盘(默认 C 盘)的新路径、按会话收纳 scratch、事后观测证据、同盘可还原回收站
社区目录页:https://www.skillhub.cn/plugins/a0035s/dsh-workspace-mgr
源码与文档:https://github.com/a0035s/dsh-workspace-mgr
核心机制(六层能力)¶
README 将能力归纳为多层配合,强度上以工具层硬拦为主,扫描只作补漏。
| 层 | 做法 | 强度 |
|---|---|---|
| 閘門 | tools/pre-execute 拦截受保护磁盘上不存在的新路径;已存在路径只读放行;deny 时给出本会话 scratch 路径 |
硬 |
| 收納 | 每会话 $DSH_HOME/scratch/<sessionId>/,含 .dsh-owner.json |
— |
| 提示 | systemPrompt 声明产物只能落 scratch,并注入当前会话真实路径 |
软 |
| 帳本 | 扫描 C 盘根一层 + %TEMP%\dsh-* + scratch 子目录建索引;只标记,不自动删 |
补漏 |
| 事後觀測 | 每次 shell/write 后对比扫描根新增项,记录会话、工具调用与时间 | 证据 |
| 臨時目錄重定向 | apply() 将 TEMP/TMP 指到 $DSH_HOME\cache\tmp |
硬 |
刻意不做:不改写工具参数、不搬文件(pre-execute 仅 allow/deny/cancel/ask);默认不自动删除(autoCleanScratch 默认 false);不碰工作区注册表、不删会话。
判定规则与白名单¶
- write / edit:目标在受保护磁盘且不在白名单 → 拒绝
- ops_bash / bash / pwsh / terminal_open:命令中出现受保护磁盘的不存在绝对路径 → 拒绝(视为新建意图);已存在 → 放行
- 白名单:会话 cwd、
$DSH_HOME、scratch 根、%TEMP%、C:\Windows、C:\Program Files*、配置项allowRoots
已知取舍:shell 命令字符串里只要出现受保护磁盘上尚不存在的绝对路径就会被挡,即使只是 node -e "…'C:\\x'…" 中的字面量。无法在字符串层面区分「要写」与「仅提及」,因此偏保守;绕法是把脚本写成文件再执行,避免在命令行里出现该路径。
回收站(recycle / restore / purge)¶
recycle 将目录 rename 到同一磁盘的 X:\_dsh-trash\<时间戳>-<名称>\:
_dsh-trash\<id>\
├─ manifest.json ← 原始路径、大小、文件数、时间、会话
└─ payload\ ← 原目录本体
同盘 rename 不复制大块数据;回收不等于释放空间,数据仍在 X:\_dsh-trash,要省空间需 purge。restore 搬回原位,原路径被占用时拒绝、不覆盖。purge 才真正删除,需 confirm: true(UI 二次确认)。每次 recycle / restore / purge 写入 $DSH_HOME/workspace-mgr/audit.jsonl。
回收前硬性拒绝:磁盘根、Windows / Program Files / ProgramData / Users / $Recycle.Bin、symlink/junction、$DSH_HOME 内部、scratch 根、临时目录等;且只回收索引中 state === 'confirmed' 的项。
索引与审计¶
- 索引:
$DSH_HOME/workspace-mgr/index.json,含firstSeen / lastScan / bytes / signature / state。状态:pending → confirmed(手动确认)→dismissed(排除)。索引损坏不影响磁盘上的实际文件。 - 审计:
$DSH_HOME/workspace-mgr/audit.jsonl,每次 recycle / restore / purge 一行。
侧栏提供面板与文件夹浏览,只读直到你确认标记项。
安装与启用¶
安装步骤以仓库 README 为准,无单独的 dsh plugin add github:… 一行命令。
# 1) 放进 profile
cp -r dsh-workspace-mgr <profile>/node_modules/ # 或用 junction / symlink
# 2) profile 的 package.json:dependencies 加 file: 路径,dsh.profile.bundles 加包名
# 3) 重启或 touch 一次 profile 的 cordis.patch.yml
也可使用 DSH 的 plugin_manager install_bundle(指向本插件目录)。若 profile 中已有 git 依赖且 pnpm 11 要求 allowBuilds,install_bundle 可能在重解析依赖图时失败,此时 README 建议改用手动拷贝方式。
在 profile 的 cordis.patch.yml 中配置插件(示例来自 README):
- id: workspace-mgr
name: 'dsh-workspace-mgr'
config:
gate: true
protectDrives: ['C']
# scratchRoot: 'E:\dsh\scratch'
autoCleanScratch: false
scratchTtlHours: 168
scanRoots: ['C:\']
scanDepth: 1
HTTP API(管理与 UI 对接)¶
GET /api/workspace-mgr/statusPOST /api/workspace-mgr/scanPOST /api/workspace-mgr/mark{ path, state },state=pending|confirmed|dismissedPOST /api/workspace-mgr/dry-run{ paths? }— 仅预览GET /api/workspace-mgr/trash— 列出各盘回收站项POST /api/workspace-mgr/recycle{ paths, confirm:true }POST /api/workspace-mgr/restore{ id }POST /api/workspace-mgr/purge{ id, confirm:true }
典型运维流程:启用 gate 与默认 protectDrives: ['C'] 后,智能体新建 C 盘路径会被拒并收到 scratch 路径;定期 scan + 在面板将可疑目录 mark 为 confirmed,再经 dry-run 预览后 recycle;需要恢复时用 restore,彻底删除用 purge 且带确认。
适用场景与注意¶
适合:在 Windows 上长期跑 DSH、希望默认保护系统盘不被智能体随意建目录、又需要可审计、可还原清理的团队或个人。
注意:
- 插件以当前 DSH 进程权限运行,安装前请阅读源码与 MIT 许可证,并在可信环境启用。
- 受保护盘上的「新路径」拦截对 shell 字符串偏严格,复杂 one-liner 可能被误挡,宜把路径写进脚本文件再执行。
- SkillHub 为社区插件目录,与 DeepSeek / 幻方无官方从属关系;星标与版本以仓库为准(当前 package 版本 0.1.0)。
结尾¶
dsh-workspace-mgr 把「不可预测的野生工作目录」从事后打扫,改成闸门前置 + 会话 scratch + 账本与观测;清理走同盘回收站而非静默删文件。若要查阅简介与链接,可见 SkillHub 目录页 与 GitHub 仓库。