dsh-session-temp-reaper:會話臨時文件一鍵清理

前言

在 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 時刷新頁面即可。

典型用法

  1. 點擊輸入框左側清理按鈕,觸發掃描。
  2. 查看標記組:默認已勾選擬刪除項;要保留則取消勾選。
  3. 不確定時展開「未標記的文件 N 個」,手動勾選需要刪除的項。
  4. 點擊「刪除 N 個」,再點一次確認。
  5. 面板顯示「已刪除 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。

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

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

小夜