前言¶
在 DSH(DeepSeek Harness)裏跑智能體會產生大量中間產物:調試腳本、命令重定向輸出、scratch 目錄裏的文件。若靠「按時間猜哪些是臨時」去掃盤,容易把別的會話的交付物、插件源碼一併列進來,甚至讓模型給出「可以刪」的結論——誤刪風險很高。維護者 liyolin 的插件 dsh-session-temp-reaper 改走另一條路:在聊天輸入框旁提供清理按鈕,由模型用工具登記臨時文件,面板分組展示,刪除需兩次確認,並在 Host 側對交付物與 profile 依賴做硬保護。
這是什麼¶
dsh-session-temp-reaper 是 DSH 社區插件(分類 admin-security),倉庫 github.com/liyolin/dsh-session-temp-reaper,目錄頁 skillhub.cn/plugins/liyolin/dsh-session-temp-reaper。當前 npm 包版本 0.1.0,許可證 MIT。
它解決的是:本會話裏寫過、命令寫出、以及落在臨時目錄裏的文件,如何安全地列清單、勾選刪除,而不是自動掃全盤猜歸屬。
設計要點:模型登記 + 啓發式僅作參考¶
早期若按時間窗推斷臨時文件,會把同一工作區裏別的會話或別的程序產出的文件算進來。現版改爲 模型主動登記:
- 插件註冊工具
mark_temp_files,模型在寫臨時腳本、調試產物、一次性中間文件時調用 - 系統提示中有
## Temporary files段提醒模型這麼做 - 面板分兩組:模型標記的(默認勾選刪除)和 未標記的(摺疊,默認保留,僅作參考)
啓發式掃描仍保留,但只負責填充「未標記」組,不再決定默認勾選。
核心功能¶
下面介紹界面與 Host 側已文檔化的能力(均以 README 爲準)。
界面與操作¶
- 輸入框左側按鈕,面板浮在輸入框上方;
Esc或點擊外部關閉 - 兩組清單:標記組默認勾選;未標記組摺疊且默認不勾
- 每行顯示類型、來源徽章(會話寫入 / 指令寫入 / 未確認歸屬 / 系統臨時 / 臨時目錄)、大小、時間和說明
- 交付物(
present出來的文件、可交付記錄)和「正在被 profile 使用的插件/依賴」即使被標記也不勾;另有已交付、正在使用提示 - 問模型:把當前清單塞進輸入框草稿並提交,讓模型說明用途與可否刪除——只問,不刪
- 全部保留 / 全部刪除 批量切換;刪除按鈕兩次點擊確認,5 秒後自動復位
- 中英雙語,跟隨 DSH 語言設置
模型側工具¶
模型在會話中登記臨時路徑:
mark_temp_files({
paths: ["scripts/probe.mjs", "out/report.tmp"], // 相對 cwd 或絕對路徑
note: "調試用的臨時腳本" // 可選,顯示在面板裏
})
返回 { marked, ignored }:marked 爲登記成功路徑;ignored 爲被拒路徑及原因(如 git、empty、outside-cwd)。標記寫入會話日誌(一條 tool/call),無額外狀態文件;同一會話重複標記同一路徑冪等。
不應標記:用戶要的交付文件、改過的既有源碼。標了也會被 present/依賴根保護擋住,但那是兜底,不是設計意圖。
會話 scratch 目錄¶
工具 session_temp_dir 返回並創建 <工作區>/.dsh-tmp/<會話id前8位>/。系統提示要求模型把 scratch 寫進該目錄;目錄內文件無需日誌提名也會出現在清單中。建議將 .dsh-tmp/ 加入工作區 .gitignore。
HTTP 接口(需 DSH Web 載體)¶
兩條 exact Fetch 路由,掛在 DSH 已認證的 /api 通道上:
| 路由 | 請求 | 響應 |
|---|---|---|
POST /api/session-temp-reaper/scan |
{ sessionId } |
{ cwd, items[], profileKnown } |
POST /api/session-temp-reaper/delete |
{ sessionId, paths[] } |
{ results[], removed } |
認證由 DSH connection 層負責;插件不自行實現認證。掃描結果在 Host 內存緩存 10 分鐘、上限 64 條;刪除只接受該會話最近一次掃描裏出現過的路徑。
安全邊界(摘要)¶
- 只刪掃描過的路徑;限定在會話 cwd、本會話 spill、或命令寫到 OS 臨時根下的文件
- 交付物與 profile 依賴目錄:Host 側拒刪(
protected),不依賴客戶端勾選 .git路徑永不列出、永不刪除- 插件從不自動刪除;刪除需用戶在面板二次確認
- 純 CLI 環境無 Web 載體時,按鈕不出現
安裝與啓用¶
DSH 生態是「一切皆插件」;社區目錄 skillhub.cn 爲獨立站點,與 DeepSeek / 幻方無官方從屬關係。安裝前請自行閱讀倉庫源碼與 MIT 許可證——插件以當前 DSH 進程權限運行。
假設 profile 在 ~/.dsh/profiles/desktop,從 GitHub 安裝:
cd ~/.dsh/profiles/desktop
npm install --save "github:liyolin/dsh-session-temp-reaper"
在同一 package.json 的 dsh.profile.bundles 數組中加入 "dsh-session-temp-reaper",然後重啓 DSH。
本地開發可用 npm install --save "link:<本項目絕對路徑>",同樣加入 bundles。若改 Host 側 index.js,需在 GUI 裏通過 plugin_manager 的 set_plugin 關開插件或重啓 DSH;只改 client.js 時刷新頁面即可。
典型用法¶
- 點擊輸入框左側清理按鈕,觸發掃描。
- 查看標記組:默認已勾選擬刪除項;要保留則取消勾選。
- 不確定時展開「未標記的文件 N 個」,手動勾選需要刪除的項。
- 點擊「刪除 N 個」,再點一次確認。
- 面板顯示「已刪除 X 個,失敗 Y 個」。
倉庫內行爲探針:
npm test # 等價於 node test/probe.mjs
適用場景與注意¶
適合:長期在 DSH Web 界面裏做智能體開發、調試命令與臨時腳本,希望在會話結束前可控清理中間文件,又需要交付物與依賴目錄不被誤刪的場景。
注意(README 已知限制):
- 模型未調用
mark_temp_files時,標記組爲空——此時僅未標記組可參考,默認不會誤刪 - 命令動態生成且未寫入
.dsh-tmp、日誌又未點名的文件不會列出 - 刪除不可恢復,無回收站
- 定位不到 profile 時,面板會警告「無法確認插件依賴」,此時不假裝依賴保護生效
結尾¶
dsh-session-temp-reaper 把「清理本會話臨時文件」做成輸入框旁的可審清單:模型登記爲主、啓發式爲輔,Host 側保護交付與依賴,刪除雙重確認。需要進一步瞭解可訪問目錄頁 skillhub.cn/plugins/liyolin/dsh-session-temp-reaper 與 GitHub 倉庫 github.com/liyolin/dsh-session-temp-reaper。