dsh-workspace-mgr:在受保护磁盘上拦截 AI 野生工作目录

前言

在 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/status
  • POST /api/workspace-mgr/scan
  • POST /api/workspace-mgr/mark { path, state },state = pending|confirmed|dismissed
  • POST /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、希望默认保护系统盘不被智能体随意建目录、又需要可审计、可还原清理的团队或个人。

注意:

  1. 插件以当前 DSH 进程权限运行,安装前请阅读源码与 MIT 许可证,并在可信环境启用。
  2. 受保护盘上的「新路径」拦截对 shell 字符串偏严格,复杂 one-liner 可能被误挡,宜把路径写进脚本文件再执行。
  3. SkillHub 为社区插件目录,与 DeepSeek / 幻方无官方从属关系;星标与版本以仓库为准(当前 package 版本 0.1.0)。

结尾

dsh-workspace-mgr 把「不可预测的野生工作目录」从事后打扫,改成闸门前置 + 会话 scratch + 账本与观测;清理走同盘回收站而非静默删文件。若要查阅简介与链接,可见 SkillHub 目录页 与 GitHub 仓库。

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

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

小夜