前言¶
在 DSH 裏用 AI 改代碼、跑腳本,一個回合往往同時留下兩類痕跡:對話裏的消息,以及工作區裏的文件。若只想「回到某一步重來」,只回退對話會留下改到一半的文件;隻手動還原文件,對話上下文仍停在錯誤分支。常見做法是開新會話或自己清理 out/、dist/ 等目錄,代價是丟上下文或容易誤刪。
下面介紹社區插件 dsh-any-rollback(維護者 xinstart-1):在當前對話窗口內回退到任意一條歷史用戶消息,並可選擇同時把文件還原到那一刻的狀態,包括渲染、ffmpeg、構建腳本等命令產出的文件,而不只是模型通過 write/edit 改過的源碼。插件分類爲「工作流」,可在 SkillHub 目錄頁 查看條目;SkillHub 爲社區目錄,與 DeepSeek / 幻方無官方從屬關係。DSH 本身遵循「一切皆插件」的擴展方式,本插件以 MIT 許可發佈,安裝前建議自行查看 GitHub 倉庫 源碼與許可證;插件在當前 DSH 進程權限下運行,備份與還原範圍與宿主可訪問的路徑一致。
這是什麼¶
dsh-any-rollback 是 DSH 的對話回退插件:不 fork 會話、不開新窗口,點消息旁的 ↶ 或使用 /rewind 等命令,即可把對話視圖撤回到指定用戶消息之前,並把輸入框填回被撤回的那句話;可選地依據插件自有的備份目錄,把工作區文件一併還原。會話日誌仍只追加、不刪除,回退僅改變界面上的對話視圖。
核心功能¶
按消息回退對話¶
每條用戶消息旁有 ↶ 按鈕。點擊後,該消息之後的內容從對話視圖上撤下,輸入框自動填回被撤回的用戶文本,改一改即可重新提問。
也可使用命令:
| 命令 | 作用 |
|---|---|
/rewind <序號> |
回退到第 N 條用戶消息之前 |
/rewind @<seq> |
按會話內序號回退 |
/undo |
取消上一次回退 |
同時還原工作區文件¶
回退時可選擇只退對話、只退文件,或兩者都退。文件還原只寫回插件真正備份過的內容,不猜測、不推斷。
追蹤命令產出的文件¶
多數工具只備份模型直接編輯的文件;本插件在每個回合邊界記錄一份工作區清單(路徑 → 大小 + mtime + sha256),對發生變化的文件按內容摘要緩存(相同字節不重複佔空間)。回退時逐文件判斷:有備份則還原字節;目標時刻不存在、現在卻有的文件移入隔離區;超大或未緩存且無法還原的,移入隔離區並提示需重新生成。隔離區只移動、從不刪除,去向記在 quarantine/index.json,可人工取回。
默認跳過 node_modules、dist、build、out 等目錄(可通過 artifactExclude 調整);點目錄(如 .output/)默認參與追蹤,固定跳過 .git、.dsh 等 VCS 與工具狀態目錄。
快照自動清理¶
備份會佔磁盤空間,插件支持按策略自動清理,也可查看狀態或手動執行:
| 命令 | 作用 |
|---|---|
/snapshot-auto-cleanup |
查看當前狀態 |
/snapshot-auto-cleanup on\|off |
啓用 / 停用自動清理 |
/snapshot-auto-cleanup max-age <天數> |
設置閒置天數上限 |
/snapshot-auto-cleanup run [--apply] |
預演,或真正執行清理 |
/snapshot-auto-cleanup run --current [--apply] |
只清理當前會話的備份 |
DSH 插件頁還提供獨立設置卡片,可開關文件備份、調整自動清理,無需手改配置文件。
配置項(節選)¶
| 鍵 | 默認值 | 說明 |
|---|---|---|
fileCheckpointingEnabled |
true |
是否記錄新的文件備份 |
maxFileBytes |
8388608(8 MiB) |
單文件備份上限,0 表示不限制 |
snapshotDir |
~/.dsh/rewind-snapshots/ |
備份存放根目錄 |
artifactTrackingEnabled |
true |
是否追蹤命令產出的文件 |
artifactMaxFileBytes |
67108864(64 MiB) |
命令產物單文件緩存上限 |
artifactExclude |
node_modules,dist,build,out,... |
追蹤時跳過的目錄 |
autoCleanupEnabled |
true |
自動清理開關 |
autoCleanupMaxAgeDays |
30 |
備份閒置多少天后可清理 |
完整說明見倉庫 README「配置項」一節。
數據存放位置¶
備份目錄與工作區分離,刪掉備份目錄只會丟失回退能力,不會動項目本身:
~/.dsh/rewind-snapshots/<會話ID>/
<消息序號>/ # 每條消息對應的文件備份
artifacts/
manifests/ # 每個回合邊界一份工作區清單
quarantine/ # 回退時移出的文件
quarantine/index.json
安裝與啓用¶
環境要求:DSH >=0.2.1-rc.1 <0.3.0-0;Node.js ^22.19.0 或 >=24.0.0。
從 Release 安裝(推薦)¶
在 profile 的 package.json 中加入依賴(版本以 Release 爲準,當前資料爲 v0.19.1-any.8):
"dependencies": {
"dsh-any-rollback": "https://github.com/xinstart-1/dsh-any-rollback/releases/download/v0.19.1-any.8/dsh-any-rollback-0.19.1-any.8.tgz"
}
在 profile 目錄執行安裝並重啓 DSH(Windows 示例,路徑中的 <profile> 換成你的 profile 名):
$node = "$env:USERPROFILE\.dsh\dsh-runtimes\dsh-primary-runtime\dependencies\node\bin\node.exe"
$pnpm = "$env:USERPROFILE\.dsh\dsh-runtimes\dsh-primary-runtime\dependencies\pnpm\bin\pnpm.mjs"
& $node $pnpm install --dir "$env:USERPROFILE\.dsh\profiles\<profile>" --prefer-offline
必須把 dsh-any-rollback 寫入該 profile 的 dsh.profile.bundles 數組,該數組纔是加載插件的開關。裝完後重啓 DSH;跑一個回合後,確認 ~/.dsh/rewind-snapshots/<會話ID>/artifacts/manifests/ 下出現清單,且用戶消息旁出現 ↶。
倉庫提供 node scripts/verify.mjs 校驗已裝包內關鍵文件的 SHA-256,期望值見 README「校驗安裝」表格。
卸載¶
從 dependencies 和 dsh.profile.bundles 移除 dsh-any-rollback 後重新安裝依賴;備份數據不會自動刪除,需手動刪除 ~/.dsh/rewind-snapshots/ 才能徹底清理。
典型用法¶
- 多輪試錯後,在某條用戶消息旁點 ↶,選擇同時回退對話與文件,從該步在同窗口繼續改 prompt 或任務。
- 生成視頻或構建產物跑了幾版,想回到較早一輪:回退後命令新建的文件會進隔離區,已備份的內容寫回工作區,無需手刪
out/裏一堆 mp4。 - 誤操作回退後,用
/undo撤銷上一次回退。 - 磁盤緊張時,先
/snapshot-auto-cleanup run預演,再run --apply執行清理。
適用場景與注意¶
適合:需要在同一 DSH 會話裏「原地」回到任意用戶消息,且希望文件狀態(含腳本/命令產物)與對話上下文一致的場景。
邊界(README 已寫明):
- 回退依賴已有備份;插件啓用前、或關閉備份期間的改動無法還原。
- 會話被 compact 之後,早於壓縮點的消息不再出現在回退列表。
- 超過
maxFileBytes/artifactMaxFileBytes的文件不緩存內容,跨上限的改動無法還原,回退時會提示並保持或移入隔離區,不再誤刪工作區文件。
設計取捨上:會話日誌只追加;回退移出的文件一律進隔離區、不直接刪除;只還原有備份的字節。
結尾¶
dsh-any-rollback 把「撤對話」和「還原工作區(含命令產物)」綁在同一次操作裏,適合在 DSH 里長對話、多輪跑腳本試錯的開發流程。目錄與說明: