前言¶
在 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 倉庫。