前言¶
在 DeepSeek Harness(DSH)裏跑 agent,一輪 turn 結束往往意味着交付彙報已經寫好。但若本輪寫過探針腳本、診斷 shell、或隨手備份,工作區裏會留下 probe-*.mjs、check*.sh、*.bak-* 等文件。框架層雖有 agent/turn-stopping 鉤子,現有消費者多記變更或寫記憶,並不自動清理;提示詞裏「交付前清臨時件」又只能依賴模型自覺。長期下來,沒人敢隨便刪這些遺骸。
dsh-turn-cleanup 把這條約定寫成代碼:在 turn 即將結束時檢查本輪臨時文件與超量備份,非空則通過 agent.steer(...) 或排入下一輪,逼模型在同一約束下處理——不是提醒,而是攔路。
這是什麼¶
dsh-turn-cleanup 是 DSH 工作流類插件,維護者爲 Leonlee114514,當前包版本爲 0.3.1(MIT)。它掛在 agent/turn-stopping(serial 模式,await 在 turn 邊界提交之前)上:發現未清場的臨時件或超量 .bak 副本時,向模型推送清單並讓其再走一步(或進入下一輪),直到處理完或你選擇關閉閘門。
生態上,DSH 強調「一切皆插件」;社區目錄 skillhub.cn 爲獨立站點,與 DeepSeek / 幻方無官方從屬關係。
核心功能¶
鉤子與閘門機制¶
turn-stopping 在 turnEnds 且 inbox.nextStep.length === 0 時串行派發。本插件在 listener 裏若判定需要清場,則調用 agent.steer(input),走 send(input, 'next-step', true),使 nextStep.length 變爲 1,同一個 turn 多跑一步。也可通過配置 steerMode: followup(默認)把清單排到 next-turn,本輪正常結束,下一輪開頭再清場——硬度略低,但 chat UI 不會因 steer 成爲最後一步而把交付彙報折進「過程」區。
每 (sessionId, turn) 只攔一次(tripped Set),避免模型每多一步就再被攔、turn 永遠無法結束。
三個檢出通道¶
通道 1 — 約定目錄(主機制)
臨時件一律放 <cwd>/.agent-tmp/(tmpDirName 可配)。turn 結束時目錄存在且非空即觸發。不進該目錄的不算本輪臨時件。
通道 2 — 本 turn 寫入追蹤
掛 fs/write-intent waterfall,按 session.id + turn 記錄寫入路徑;結束時只檢查這些路徑裏匹配臨時件特徵的條目(如 probe-*、tmp-*、scratch-*、check*、diag_*、bench*、*.bak-*,或位於 .agent-tmp/)。不掃全工作區;判定爲「本 turn 記錄 ∩ 模式匹配 ∩ 文件仍存在」。
通道 3 — 備份保留
按「同目錄 + 同原件名」把 .bak 及 .bak- / .bak. 後綴的備份聚成家族,默認只留最近 keep 份(默認 3)。mode: steer 只列超量清單;mode: prune 時插件可刪副本,並有原件存在、普通文件、保護路徑、每輪刪除上限等四道閘。只處理本輪碰過的家族。
通道 1 / 2 永遠不刪文件,只 steer;刪留由模型判斷。子會話(origin === "subagent" 或 delegationDepth > 0)整段跳過。
steer 文案與統計面板¶
攔截時推送結構化中文說明(臨時件列表、超量備份列表可分段)。超過 maxSteerPaths 會追加「還有 N 個」。
插件提供 Web 面板:設置頁 → 收尾清場 展示攔截次數、報出文件數、已清文件數、依從率及最近記錄;各 turn 末尾可有徽章。依從率在下一輪 turn 結束時對上一輪清單路徑再 stat 計算,避免跨輪虛高。
安裝與啓用¶
包帶 dsh.bundle,推薦走市場 / bundle 安裝。
在 DSH 內:
plugin_manager install_bundle → "dsh-turn-cleanup"
或命令行(將 <name> 換成你的 profile 名):
dsh plugin --profile <name> add dsh-turn-cleanup
包根 cordis.patch.yml 會自動應用,閘門默認開啓。改配置請在同一 profile 的 cordis.patch.yml 裏用同 id 覆蓋,不要另加一條 - insert(同 id 兩條會被 cordis 拒絕)。
不需要重啓 DSH;dsh-hmr 監聽配置與 package.json,十幾秒內可生效。驗證加載:
cordis_inspect_query → host / Config / listConfigs, name: dsh-turn-cleanup
status: "absent" 表示 fiber 已啓動、未 disabled(本插件故意不導出 Config schema)。inactive 則 import 失敗。
要求:dsh 引擎 >=0.2.1-rc.5,Node >=20。
典型用法與配置要點¶
約定用法:讓 agent 把本輪臨時產出寫入 .agent-tmp/,或在命名上符合 patterns;turn 結束若未清空,會自動收到清場指令。
更硬的同輪閘門:在 profile 的 cordis.patch.yml 中爲 turn-cleanup 設置 steerMode: steer(默認 followup)。
常用配置項(完整表見倉庫 README):
| 鍵 | 默認 | 說明 |
|---|---|---|
enabled |
true |
false 則不註冊 listener |
tmpDirName |
.agent-tmp |
約定目錄名 |
steerMode |
followup |
steer 爲同輪多一步 |
backupRetention.enabled |
true |
關閉則跳過通道 3 |
backupRetention.keep |
3 |
同原件保留備份份數 |
backupRetention.mode |
steer |
prune 爲插件自動刪超量備份 |
logFile |
"" |
可選落盤旁路日誌 |
可選 logFile 記錄每次攔截,行首爲實際交付方式(followup / steer / prune)。
適用場景與注意¶
適合:長期在同一工作區跑 DSH agent、希望 turn 邊界自動複覈臨時文件與 .bak 堆積、又不願全倉掃描誤傷存量文件的場景。
務必注意:
- 插件以當前 DSH 進程權限運行;
prune模式會不可逆刪除備份副本,啓用前請閱讀源碼與 MIT 許可證,並理解四道刪除閘。 - 不做
git status兜底;不碰.git、node_modules、.tmp-sessions、out/等保護路徑(清場指令也會提醒模型)。 - listener 僅
readdir/stat,避免在 turn 邊界拖慢每次結束。
結尾¶
dsh-turn-cleanup 把「收尾清場」從提示詞自覺變成 turn-stopping 上的可配置閘門:約定目錄、寫入追蹤、備份保留三條通道分工明確,默認只 steer、不擅自刪用戶文件。需要時可查閱 社區目錄頁 與 GitHub 倉庫 獲取最新 README 與 issue。